Merge pull request #22 from apache/bootstrap-ui

Struts Bootstrap based web UI and Java 11 compatibility.
diff --git a/.gitignore b/.gitignore
index 979f59a..463a2df 100644
--- a/.gitignore
+++ b/.gitignore
@@ -25,5 +25,7 @@
 velocity.log
 
 tomcat-base
-deployment/docker-compose/postgresql-data
-deployment/docker-compose/roller-data
\ No newline at end of file
+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/NOTICE.txt b/NOTICE.txt
index 490d7b4..9ef79e3 100644
--- a/NOTICE.txt
+++ b/NOTICE.txt
@@ -17,13 +17,8 @@
 * Code written by Dave Johnson for RSS and Atom in Action
     Copyright 2005 David M Johnson (For RSS and Atom In Action)
 
-* The Xinha WYSIWYG editor, which includes HTMLArea
-    htmlArea License (based on BSD license)
-    Copyright (c) 2002-2004, interactivetools.com, inc.
-    Copyright (c) 2003-2004 dynarch.com
-    All rights reserved.
-    http://trac.xinha.org/wiki/Licence
-    
+* The Summernote WYSIWYG editor, MIT license
+
 * Snippets of code from Spring Mobile
     Copyright (c) 2010-2014 Pivotal, Inc. All Rights Reserved. 
 
diff --git a/README.md b/README.md
index 0953102..92ea4cd 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,20 @@
     $ 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:
+
+    $ 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 afc1db6..e382560 100644
--- a/app/pom.xml
+++ b/app/pom.xml
@@ -33,7 +33,6 @@
     <packaging>war</packaging>
 
     <properties>
-
         <servlet.version>4.0.1</servlet.version>
         <jsp-api.version>2.2</jsp-api.version>
         <java-activation.version>1.2.0</java-activation.version>
@@ -181,20 +180,23 @@
         </dependency>
         
         <!-- explicitly adding newest asm lib to improve compatibility with latest JDKs -->
+
         <dependency>
             <groupId>org.ow2.asm</groupId>
             <artifactId>asm</artifactId>
-            <version>7.1</version>
+            <version>7.0</version>
         </dependency>
+
         <dependency>
             <groupId>org.ow2.asm</groupId>
             <artifactId>asm-commons</artifactId>
-            <version>7.1</version>
+            <version>7.0</version>
         </dependency>
+
         <dependency>
             <groupId>org.ow2.asm</groupId>
             <artifactId>asm-tree</artifactId>
-            <version>7.1</version>
+            <version>7.0</version>
         </dependency>
         
         <dependency>
@@ -222,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>
@@ -394,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>
@@ -424,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>
 
@@ -630,7 +661,7 @@
 
             <plugin>
                 <artifactId>maven-surefire-plugin</artifactId>
-                <version>2.17</version>
+                <version>2.22.0</version>
                 <configuration>
                     <systemProperties>
                         <property>
@@ -638,9 +669,6 @@
                             <value>${basedir}/target</value>
                         </property>
                     </systemProperties>
-                    <!--excludes>
-                        <exclude>**/??.java</exclude>
-                    </excludes-->
                 </configuration>
             </plugin>
 
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/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/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/Summernote.java b/app/src/main/java/org/apache/roller/weblogger/ui/core/plugins/Summernote.java
new file mode 100644
index 0000000..cfeb4cb
--- /dev/null
+++ b/app/src/main/java/org/apache/roller/weblogger/ui/core/plugins/Summernote.java
@@ -0,0 +1,42 @@
+/*
+ * 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.core.plugins;
+
+/**
+ * Summernote rich text editor
+ */
+public class Summernote implements WeblogEntryEditor {
+
+
+    public Summernote() {}
+    
+    
+    public String getId() {
+        return "editor-xinha.jsp";
+    }
+    
+    public String getName() {
+        return "editor.summernote.name";
+    }
+    
+    public String getJspPage() {
+        return "/WEB-INF/jsps/editor/EntryEditor.jsp";
+    }
+    
+}
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/plugins/XinhaEditor.java b/app/src/main/java/org/apache/roller/weblogger/ui/core/plugins/XinhaEditor.java
deleted file mode 100644
index 4d8d8c8..0000000
--- a/app/src/main/java/org/apache/roller/weblogger/ui/core/plugins/XinhaEditor.java
+++ /dev/null
@@ -1,43 +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.core.plugins;
-
-
-/**
- * A rich text WYSIWYG editor using Xinha.
- */
-public class XinhaEditor implements WeblogEntryEditor {
-    
-    
-    public XinhaEditor() {}
-    
-    
-    public String getId() {
-        return "editor-xinha.jsp";
-    }
-    
-    public String getName() {
-        return "editor.xinha.name";
-    }
-    
-    public String getJspPage() {
-        return "/WEB-INF/jsps/editor/EntryEditor.jsp";
-    }
-    
-}
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/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/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/org/apache/roller/weblogger/config/roller.properties b/app/src/main/resources/org/apache/roller/weblogger/config/roller.properties
index 64cb222..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=\
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 08f2051..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-1.5.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-1.5.1/README_TRANSLATORS.TXT b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/README_TRANSLATORS.TXT
deleted file mode 100644
index 5a2bc71..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/README_TRANSLATORS.TXT
+++ /dev/null
@@ -1,166 +0,0 @@
-Translating Xinha
-################################################################################
-
-Hello you multi-lingual person you, so you would like to help translate Xinha
-or create your own special translation to use?
-
-It's really easy!
-
-In the Xinha distribution you will find some files under the following directory
-
-   /lang/merged/*.js
-
-you can see that there is a file for every currently existing translation there
-and also one called "__new__.js".  You will also see there are other lang files 
-around the place, they are used only when not using a merged file, you don't need
-to touch them, just work on /lang/merged/*.js !
-
-If your language is there already, simply open that .js file in your favourite
-UTF-8 compliant text editor.
-
-If your language is not there, copy the __new__.js file and create a new one called
-[yourlanguagecode].js, for example if you are translating into Klingon, perhaps
-"kl.js" and then open it in your favourite UTF-8 compliant text editor.
-
-Please note that all translation is in UTF-8 Encoding, do not try to use other 
-character encodings (character sets), it's not going to end well.
-
-To actually test or use your translation, in your code right before you load 
-Xinha specify the language and file like this...
-
-    <!-- Set Language To Klingon -->
-    <script type="text/javascript>
-      _editor_lang              = 'kl';
-      _editor_lang_merged_file  = '/xinha/lang/merged/kl.js';
-    </script>
-    
-    <!-- And Load Xinha As Usual -->
-    <script type="text/javascript" src="../XinhaCore.js"></script>
-
-that's it, try out Xinha and your language file should provide the translations.
-
-When you have made your translation file and would like to submit it
-to Xinha for inclusion in a future distibution of Xinha, please just open a 
-ticket at http://trac.xinha.org/ and attach your new or improved language file, 
-be sure to let us know your details to add the the contributors list below!
-
-Tools
-################################################################################
-
-In the contrib directory there are a few scripts written in PHP to handle the 
-translation setup tasks.
-
-lc_parse_strings.php
---------------------------------------------------------------------------------
-
-This script goes through all the Xinha files, javascript, php, html, and pulls
-out the strings which should get translated.  These are written into lc_base.js
-translation files spread through the system, eg /lang/lc_base.js, 
-/modules/.../lang/lc_base.js, /plugins/.../lang/lc_base.js and so forth.
-
-lc_base.js files do not get committed to the Subversion repository they are 
-just temporary working files.
-
-lc_create_merged_file.php
---------------------------------------------------------------------------------
-
-This script takes all the lc_base.js files and the existing lang files for a given
-language and creates a merged language file, for example
-
-    php contrib/lc_create_merged_file.php fr /tmp/fr.js
-
-creates the French translation merged file /tmp/fr.js
-
-Note that existing merged files are not consulted during this process.
-
-Translators can then work on the merged file to do their translation work.
-
-To make things easy the `lang/merged/` directory contains pre-generated merged 
-language files of each language of the release, again these are not committed
-to the subversion repository.
-
-If you run this script without arguments it will give you some help showing how
-you can generate all the merged language files at once, this is done as part of
-the release process.
-
-lc_split_merged_file.php
---------------------------------------------------------------------------------
-
-This script takes a merged file and splits it into the constituent lang files
-these files are written into a temporary directory structure so that you can 
-use a diff/merge tool if you wish to compare them rather than actually copying 
-them into place.  For example,
-
-  php contrib/lc_split_merged_file.php /tmp/fr.js fr
-
-will create a directory structure (it will be printed at completion) in /tmp, 
-
-  /tmp/something-unique-here/lang/fr.js
-  /tmp/something-unique-here/modules/.../lang/fr.js
-  /tmp/something-unique-here/plugins/.../lang/fr.js
-  /tmp/something-unique-here/unsupported_plugins/.../lang/fr.js
-
-the directory and some instructions for easily "installing" the generated files
-is printed.
-
-Contributors
-################################################################################
-
-The following people are thanked for providing and updating translations!
-
-ch: Samuel Stone, http://stonemicro.com/
-cz: Jiri Löw, <jirilow@jirilow.com>
-da: Bjarke M. Lauridsen, http://www.detailx.dk, detailx@gmail.com
-da: rene, <rene@laerke.net>
-da: Steen Sønderup, <steen@soenderup.com>
-de: Broxx, <broxx@broxx.com>
-de: Holger Hees, <hhees@systemconcept.de>, http://www.systemconcept.de
-de: Mihai Bazon, http://dynarch.com/mishoo
-de: Raimund Meyer xinha@ray-of-light.org
-de: sven schomacker, http://www.hilope.de, mail@hilope.de
-de: Udo Schmal (gocher), http://www.schaffrath-neuemedien.de/, udo.schmal@t-online.de
-ee: Martin Raie, <albertvill@hot.ee>
-el: Dimitris Glezos, dimitris@glezos.com
-es: Derick Leony <dleony@gmail.com>
-es: michael Hauptmnn (mhauptma73) , http://www.azahost.com/, miguel@azalorea.com
-eu: Unkown
-fa: Unknown
-fi: Unknown
-fr: Kevin Huppert - Créabilis, http://www.creabilis.com, kevin.huppert@worldonline.fr
-he: Liron Newman, http://www.eesh.net, <plastish at ultinet dot org>
-he: Mihai Bazon, http://dynarch.com/mishoo
-hu: Miklós Somogyi, <somogyine@vnet.hu>
-it: Fabio Rotondo <fabio@rotondo.it>
-it: Mattia Landoni, http://www.webpresident.org/
-it: Udo Schmal (gocher), http://www.schaffrath-neuemedien.de/, udo.schmal@t-online.de
-ja: Unknown
-lt: Jaroslav Šatkevič, <jaro@akl.lt>
-lv: Mihai Bazon, http://dynarch.com/mishoo
-nb: Kim Steinhaug,  http://www.steinhaug.com/, http://www.easycms.no/, kim@easycms.no
-nb: Mihai Bazon, <mihai_bazon@yahoo.com>
-nb: Håvard Wigtil <havardw@extend.no>
-nb: ses<ses@online.no>
-nl: A.H van den Broek  http://www.kontaktfm.nl, tonbroek@kontaktfm.nl
-nl: Arthur Bogaart a.bogaart@onehippo.org
-nl: Holger Hees, <hhees@systemconcept.de>
-nl: Maarten Molenschot, maarten@nrgmm.nl
-nl: Michel Weegeerink (info@mmc-shop.nl), http://mmc-shop.nl
-nl: Mihai Bazon, http://dynarch.com/mishoo
-nl: Raimund Meyer xinha@ray-of-light.org
-nl: Udo Schmal (gocher), http://www.schaffrath-neuemedien.de/, udo.schmal@t-online.de
-pl: Krzysztof Kotowicz, http://www.web.eskot.pl, http://www.eskot.krakow.pl/portfolio/, koto@webworkers.pl, koto1sa@o2.pl
-pt_br: Cau guanabara (independent developer), caugb@ibest.com.br
-pt_br: Marcio Barbosa, <marcio@mpg.com.br>, http://www.mpg.com.br/
-ro: Mihai Bazon, http://dynarch.com/mishoo
-ru: Andrei Blagorazumov, a@fnr.ru
-ru: Helen Mitkina (zerok) <e.mitkina at gmail>
-ru: Yulya Shtyryakova, <yulya@vdcom.ru>
-sh: Ljuba Ranković, http://www.rankovic.net/ljubar
-si: Tomaz Kregar, x_tomo_x@email.si
-sr: Ljuba Ranković, http://www.rankovic.net/ljubar
-sv: Erik Dalén, <dalen@jpl.se>
-th: Suchin Prasongbundit, <suchin@joolsoft.com>
-tr: Serdar Domurcuk, <serdar.domurcuk@km.co.at>, http://www.km.co.at/
-vn: Nguyễn Đình Nam, <hncryptologist@yahoo.com>
-zh_cn: Dave Lo, dlo@interactivetools.com
-b5: Dave Lo, dlo@interactivetools.com
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/VERSION.TXT b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/VERSION.TXT
deleted file mode 100644
index 85cfd47..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/VERSION.TXT
+++ /dev/null
@@ -1 +0,0 @@
-xinha-1.5.1
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/Xinha.css b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/Xinha.css
deleted file mode 100644
index 5f378dc..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/Xinha.css
+++ /dev/null
@@ -1,392 +0,0 @@
-.htmlarea { background: #fff; }
-.htmlarea td { margin:0 !important;padding:0 !important; }
-
-.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;*/ padding:0;
-  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;
-  
-  /* Fix #1601 Incorrect sized status statusBar*/
-  box-sizing:border-box;
-  height:22px; /* 4px pad + 1x border additional to the 16px which was used above */
-}
-
-.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:1000;
-  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;
-}
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/XinhaCore.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/XinhaCore.js
deleted file mode 100644
index af6ce90..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/XinhaCore.js
+++ /dev/null
@@ -1,9671 +0,0 @@
- 
-  /*--------------------------------------:noTabs=true:tabSize=2:indentSize=2:--
-    --  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.
-    --
-    --  Developers - Coding Style: 
-    --         Before you are going to work on Xinha code, please see http://trac.xinha.org/wiki/Documentation/StyleGuide
-    --
-    --  $HeadURL: http://svn.xinha.org/trunk/XinhaCore.js $
-    --  $LastChangedDate: 2018-03-29 11:13:25 +1300 (Thu, 29 Mar 2018) $
-    --  $LastChangedRevision: 1433 $
-    --  $LastChangedBy: gogo $
-    --------------------------------------------------------------------------*/
-/*jslint regexp: false, rhino: false, browser: true, bitwise: false, forin: true, adsafe: false, evil: true, nomen: false, 
-glovar: false, debug: false, eqeqeq: false, passfail: false, sidebar: false, laxbreak: false, on: false, cap: true, 
-white: false, widget: false, undef: true, plusplus: false*/
-/*global  Dialog , _editor_css , _editor_icons, _editor_lang , _editor_skin , _editor_url, dumpValues, ActiveXObject, HTMLArea, _editor_lcbackend*/
-
-/** Information about the Xinha version 
- * @type Object
- */
-Xinha.version =
-{
-  'Release'   : 'Trunk',
-  'Head'      : '$HeadURL: http://svn.xinha.org/trunk/XinhaCore.js $'.replace(/^[^:]*:\s*(.*)\s*\$$/, '$1'),
-  'Date'      : '$LastChangedDate: 2018-03-29 11:13:25 +1300 (Thu, 29 Mar 2018) $'.replace(/^[^:]*:\s*([0-9\-]*) ([0-9:]*) ([+0-9]*) \((.*)\)\s*\$/, '$4 $2 $3'),
-  'Revision'  : '$LastChangedRevision: 1433 $'.replace(/^[^:]*:\s*(.*)\s*\$$/, '$1'),
-  'RevisionBy': '$LastChangedBy: gogo $'.replace(/^[^:]*:\s*(.*)\s*\$$/, '$1')
-};
-
-//must be here. it is called while converting _editor_url to absolute
-Xinha._resolveRelativeUrl = function( base, url )
-{
-  if(url.match(/^([^:]+\:)?\/\//))
-  {
-    return url;
-  }
-  else
-  {
-    var b = base.split("/");
-    if(b[b.length - 1] === "")
-    {
-      b.pop();
-    }
-    var p = url.split("/");
-    if(p[0] == ".")
-    {
-      p.shift();
-    }
-    while(p[0] == "..")
-    {
-      b.pop();
-      p.shift();
-    }
-    return b.join("/") + "/" + p.join("/");
-  }
-};
-
-// Automatically determine editor_url from our script src if it is not supplied
-if ( typeof _editor_url == 'undefined' || _editor_url == null)
-{
-  // Because of the way the DOM is loaded, this is guaranteed to always pull our script tag.
-  var scripts = document.getElementsByTagName('script');
-  var this_script = scripts[scripts.length - 1];
-  _editor_url = this_script.src.split('?')[0].split('/').slice(0, -1).join('/').replace(/\x2f*$/, '/');
-}
-
-if ( typeof _editor_url == "string" )
-{
-  // Leave exactly one backslash at the end of _editor_url
-  _editor_url = _editor_url.replace(/\x2f*$/, '/');
-  
-  // convert _editor_url to absolute
-  if(!_editor_url.match(/^([^:]+\:)?\//))
-  {
-    (function()
-    {
-      var tmpPath = window.location.toString().replace(/\?.*$/,'').split("/");
-      tmpPath.pop();
-      _editor_url = Xinha._resolveRelativeUrl(tmpPath.join("/"), _editor_url);
-    })();
-  }
-}
-
-// make sure we have a language
-if ( typeof _editor_lang == "string" )
-{
-  _editor_lang = _editor_lang.toLowerCase();
-}
-else
-{
-  _editor_lang = "en";
-}
-
-// skin stylesheet to load
-if ( typeof _editor_skin !== "string" )
-{
-  _editor_skin = "";
-}
-
-if ( typeof _editor_icons !== "string" )
-{
-  _editor_icons = "";
-}
-/**
-* The list of Xinha editors on the page. May be multiple editors.
-* You can access each editor object through this global variable.
-*
-* Example:<br />
-* <code>
-*	var html = __xinhas[0].getEditorContent(); // gives you the HTML of the first editor in the page
-* </code>
-*/
-var __xinhas = [];
-
-// browser identification
-/** Cache the user agent for the following checks
- * @type String
- * @private
- */
-Xinha.agt       = navigator.userAgent.toLowerCase();
-/** Browser is Microsoft Internet Explorer
- * 
- * WARNING Starting with Internet Explorer 11, this no longer detects as IE, but instead 
- *           detects as Gecko.  Oddly enough, it seems to work pretty much fine under
- *           Xinha's Gecko Engine, so I don't think we should change this to match IE11
- *           and continue to just pretend it is Gecko.
- * 
- *           https://blogs.msdn.microsoft.com/ieinternals/2013/09/21/internet-explorer-11s-many-user-agent-strings/
- *         
- * WARNING Starting with Microsoft Edge (what a silly name for a browser) this no longer 
- *          detects as Gecko but instead detects as Webkit.  I can't really see any obvious
- *          behavioural differences between using Gecko and using Webkit (you can force 
- *          this by, after loading XinhaCore.js but before configuring/initialising setting
- *             Xinha.is_webkit = false; Xinha.is_gecko = true;
- * 
- *          Quoting from Wikipedia:
- *              EdgeHTML is meant to be fully compatible with the WebKit layout engine 
- *              used by Safari, Chrome and other browsers. Microsoft has stated that 
- *              "any Edge-WebKit differences are bugs that we’re interested in fixing."[24]
- * 
- *          So I think that we best have it detect as Webkit, seems that should in theory
- *          be closest to the mark (vs Gecko).  Chrome also uses the Webkit Xinha module..
- * 
- *          It should be noted that the old InternetExplorer engine absolutely does not work
- *          with edge (and probably not with IE11 I expect but I have not tried).
- * 
- * @type Boolean 
- */
-Xinha.is_ie    = ((Xinha.agt.indexOf("msie") != -1) && (Xinha.agt.indexOf("opera") == -1));
-/** Version Number, if browser is Microsoft Internet Explorer
- * @type Float 
- */
-Xinha.ie_version= parseFloat(Xinha.agt.substring(Xinha.agt.indexOf("msie")+5));
-/** Browser is Opera
- * @type Boolean 
- */
-Xinha.is_opera  = (Xinha.agt.indexOf("opera") != -1);
-/** Version Number, if browser is Opera 
-  * @type Float 
-  */
-if(Xinha.is_opera && Xinha.agt.match(/opera[\/ ]([0-9.]+)/))
-{
-  Xinha.opera_version = parseFloat(RegExp.$1);
-}
-else
-{
-  Xinha.opera_version = 0;
-}
-/** Browserengine is KHTML (Konqueror, Safari)
- * @type Boolean 
- */
-Xinha.is_khtml  = (Xinha.agt.indexOf("khtml") != -1);
-/** Browser is WebKit
- * @type Boolean 
- */
-Xinha.is_webkit  = (Xinha.agt.indexOf("applewebkit") != -1);
-/** Webkit build number
- * @type Integer
- */
-Xinha.webkit_version = parseInt(navigator.appVersion.replace(/.*?AppleWebKit\/([\d]).*?/,'$1'), 10);
-
-/** Browser is Safari
- * @type Boolean 
- */
-Xinha.is_safari  = (Xinha.agt.indexOf("safari") != -1);
-
-/** Browser is Google Chrome
- * @type Boolean 
- */
-Xinha.is_chrome = (Xinha.agt.indexOf("chrome") != -1);
-
-/** OS is MacOS
- * @type Boolean 
- */
-Xinha.is_mac	   = (Xinha.agt.indexOf("mac") != -1);
-Xinha.is_ios	   = (Xinha.agt.indexOf("iphone") != -1) || (Xinha.agt.indexOf("ipad") != -1) ;
-
-/** Browser is Microsoft Internet Explorer Mac
- * @type Boolean 
- */
-Xinha.is_mac_ie = (Xinha.is_ie && Xinha.is_mac);
-/** Browser is Microsoft Internet Explorer Windows
- * @type Boolean 
- */
-Xinha.is_win_ie = (Xinha.is_ie && !Xinha.is_mac);
-/** Browser engine is Gecko (Mozilla), applies also to Safari and Opera which work
- *  largely similar.
- *@type Boolean 
- */
-Xinha.is_gecko  = (navigator.product == "Gecko") || Xinha.is_opera;
-/** Browser engine is really Gecko, i.e. Browser is Firefox (or Netscape, SeaMonkey, Flock, Songbird, Beonex, K-Meleon, Camino, Galeon, Kazehakase, Skipstone, or whatever derivate might exist out there...)
- * @type Boolean 
- */
-Xinha.is_real_gecko = (navigator.product == "Gecko" && !Xinha.is_webkit);
-
-/** Gecko version lower than 1.9
- * @type Boolean 
- */
-// http://trac.xinha.org/ticket/1620
-Xinha.is_ff2 = Xinha.is_real_gecko && navigator.productSub && parseInt(navigator.productSub.substr(0,10), 10) < 20071210;
-
-/** File is opened locally opened ("file://" protocol)
- * @type Boolean
- * @private
- */
-Xinha.isRunLocally = document.URL.toLowerCase().search(/^file:/) != -1;
-/** Editing is enabled by document.designMode (Gecko, Opera), as opposed to contenteditable (IE)
- * @type Boolean
- * @private
- */
-Xinha.is_designMode = (typeof document.designMode != 'undefined' && !Xinha.is_ie); // IE has designMode, but we're not using it
-
-/** Check if Xinha can run in the used browser, otherwise the textarea will be remain unchanged
- * @type Boolean
- * @private
- */
-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;
-};
-/** Cache result of checking for browser support
- * @type Boolean
- * @private
- */
-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.');
-}
-
-/** Creates a new Xinha object
- * @version $Rev: 1433 $ $LastChangedDate: 2018-03-29 11:13:25 +1300 (Thu, 29 Mar 2018) $
- * @constructor
- * @param {String|DomNode}   textarea the textarea to replace; can be either only the id or the DOM object as returned by document.getElementById()
- * @param {Xinha.Config} config optional if no Xinha.Config object is passed, the default config is used
- */
-function Xinha(textarea, config)
-{ 
-  if ( !Xinha.isSupportedBrowser )
-  {
-    return;
-  }
-  
-  if ( !textarea )
-  {
-    throw new Error ("Tried to create Xinha without textarea specified.");
-  }
-
-  if ( typeof config == "undefined" )
-  {
-		/** The configuration used in the editor
-		 * @type Xinha.Config
-		 */
-    this.config = new Xinha.Config();
-  }
-  else
-  {
-    this.config = config;
-  }
-
-  if ( typeof textarea != 'object' )
-  {
-    textarea = Xinha.getElementById('textarea', textarea);
-  }
-  /** This property references the original textarea, which is at the same time the editor in text mode
-   * @type DomNode textarea
-   */
-  this._textArea = textarea;
-  this._textArea.spellcheck = false;
-  Xinha.freeLater(this, '_textArea');
-  
-  // 
-  /** Before we modify anything, get the initial textarea size
-   * @private
-   * @type Object w,h 
-   */
-  this._initial_ta_size =
-  {
-    w: textarea.style.width  ? textarea.style.width  : ( textarea.offsetWidth  ? ( textarea.offsetWidth  + 'px' ) : ( textarea.cols + 'em') ),
-    h: textarea.style.height ? textarea.style.height : ( textarea.offsetHeight ? ( textarea.offsetHeight + 'px' ) : ( textarea.rows + 'em') )
-  };
-
-  if ( document.getElementById("loading_" + textarea.id) || this.config.showLoading )
-  {
-    if (!document.getElementById("loading_" + textarea.id))
-    {
-      Xinha.createLoadingMessage(textarea);
-    }
-    this.setLoadingMessage(Xinha._lc("Constructing object"));
-  }
-
-  /** the current editing mode
-  * @private 
-  * @type string "wysiwyg"|"text"
-  */
-  this._editMode = "wysiwyg";
-  /** this object holds the plugins used in the editor
-  * @private 
-  * @type Object
-  */
-  this.plugins = {};
-  /** periodically updates the toolbar
-  * @private 
-  * @type timeout
-  */
-  this._timerToolbar = null;
-  /** periodically takes a snapshot of the current editor content
-  * @private 
-  * @type timeout
-  */
-  this._timerUndo = null;
-  /** holds the undo snapshots
-  * @private 
-  * @type Array
-  */
-  this._undoQueue = [this.config.undoSteps];
-  /** the current position in the undo queue 
-  * @private 
-  * @type integer
-  */
-  this._undoPos = -1;
-  /** use our own undo implementation (true) or the browser's (false) 
-  * @private 
-  * @type Boolean
-  */
-  this._customUndo = true;
-  /** the document object of the page Xinha is embedded in
-  * @private 
-  * @type document
-  */
-  this._mdoc = document; // cache the document, we need it in plugins
-  /** doctype of the edited document (fullpage mode)
-  * @private 
-  * @type string
-  */
-  this.doctype = '';
-  /** running number that identifies the current editor
-  * @public 
-  * @type integer
-  */
-  this.__htmlarea_id_num = __xinhas.length;
-  __xinhas[this.__htmlarea_id_num] = this;
-	
-  /** holds the events for use with the notifyOn/notifyOf system
-  * @private 
-  * @type Object
-  */
-  this._notifyListeners = {};
-
-  // Panels
-  var panels = 
-  {
-    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 panels )
-  {
-    if(!panels[i].container) { continue; } // prevent iterating over wrong type
-    panels[i].div = panels[i].container; // legacy
-    panels[i].container.className = 'panels panels_' + i;
-    Xinha.freeLater(panels[i], 'container');
-    Xinha.freeLater(panels[i], 'div');
-  }
-  /** holds the panels
-  * @private 
-  * @type Array
-  */
-  // finally store the variable
-  this._panels = panels;
-	
-  // Init some properties that are defined later
-  /** The statusbar container
-   * @type DomNode statusbar div
-   */
-  this._statusBar = null;
-  /** The DOM path that is shown in the statusbar in wysiwyg mode
-   * @private
-   * @type DomNode
-   */
-  this._statusBarTree = null;
-  /** The message that is shown in the statusbar in text mode
-   * @private
-   * @type DomNode
-   */
-  this._statusBarTextMode = null;
-  /** Holds the items of the DOM path that is shown in the statusbar in wysiwyg mode
-   * @private
-   * @type Array tag names
-   */
-  this._statusBarItems = [];
-  /** Holds the parts (table cells) of the UI (toolbar, panels, statusbar)
-
-   * @type Object framework parts
-   */
-  this._framework = {};
-  /** Them whole thing (table)
-   * @private
-   * @type DomNode
-   */
-  this._htmlArea = null;
-  /** This is the actual editable area.<br />
-   *  Technically it's an iframe that's made editable using window.designMode = 'on', respectively document.body.contentEditable = true (IE).<br />
-   *  Use this property to get a grip on the iframe's window features<br />
-   *
-   * @type window
-   */
-  this._iframe = null;
-  /** The document object of the iframe.<br />
-  *   Use this property to perform DOM operations on the edited document
-  * @type document
-  */
-  this._doc = null;
-  /** The toolbar
-   *  @private
-   *  @type DomNode 
-   */
-  this._toolBar = this._toolbar = null; //._toolbar is for legacy, ._toolBar is better thanks.
-  /** Holds the botton objects
-   *  @private
-   *  @type Object
-   */
-  this._toolbarObjects = {};
-  
-  //hook in config.Events as as a "plugin"
-  this.plugins.Events = 
-  {
-    name: 'Events',
-    developer : 'The Xinha Core Developer Team',
-    instance: config.Events
-  };
-};
-// ray: What is this for? Do we need it?
-Xinha.onload = function() { };
-Xinha.init = function() { Xinha.onload(); };
-
-// cache some regexps
-/** Identifies HTML tag names
-* @type RegExp
-*/
-Xinha.RE_tagName  = /(<\/|<)\s*([^ \t\n>]+)/ig;
-/** Exracts DOCTYPE string from HTML
-* @type RegExp
-*/
-Xinha.RE_doctype  = /(<!doctype((.|\n)*?)>)\n?/i;
-/** Finds head section in HTML
-* @type RegExp
-*/
-Xinha.RE_head     = /<head>((.|\n)*?)<\/head>/i;
-/** Finds body section in HTML
-* @type RegExp
-*/
-Xinha.RE_body     = /<body[^>]*>((.|\n|\r|\t)*?)<\/body>/i;
-/** Special characters that need to be escaped when dynamically creating a RegExp from an arbtrary string
-* @private
-* @type RegExp
-*/
-Xinha.RE_Specials = /([\/\^$*+?.()|{}\[\]])/g;
-/** When dynamically creating a RegExp from an arbtrary string, some charactes that have special meanings in regular expressions have to be escaped.
-*   Run any string through this function to escape reserved characters.
-* @param {string} string the string to be escaped
-* @returns string
-*/
-Xinha.escapeStringForRegExp = function (string)
-{
-  return string.replace(Xinha.RE_Specials, '\\$1');
-};
-/** Identifies email addresses
-* @type RegExp
-*/
-Xinha.RE_email    = /^[_a-z\d\-\.]{3,}@[_a-z\d\-]{2,}(\.[_a-z\d\-]{2,})+$/i;
-/** Identifies URLs
-* @type RegExp
-*/
-Xinha.RE_url      = /(https?:\/\/)?(([a-z0-9_]+:[a-z0-9_]+@)?[a-z0-9_\-]{2,}(\.[a-z0-9_\-]{2,}){2,}(:[0-9]+)?(\/\S+)*)/i;
-
-/** This object records for known plugins where they can be found
- *  this is used by loadPlugin to avoid having to test multiple locations
- *  when we can reasonably know where the plugin is because it is
- *  part of the distribution.
- * 
- *  This becomes important because of CoRS and a problem with Amazon S3
- *  in which it does not poroduce a necessary header to Chrome if Chrome
- *  first requests a script as part of loading a <script> and then
- *  "pings" with XMLHTTPRequest, depending on that bit of a race-condition
- *  which one hits cache first things can go wonky.
- * 
- *  By avoiding the need to ping things in the distribution, we should
- *  not have that problem I think.
- */
-
-Xinha.pluginManifest = {
-  Abbreviation:         { url: _editor_url+'plugins/Abbreviation/Abbreviation.js' },
-  AboutBox:             { url: _editor_url+'modules/AboutBox/AboutBox.js' },
-  BackgroundImage:      { url: _editor_url+'unsupported_plugins/BackgroundImage/BackgroundImage.js' },
-  CharacterMap:         { url: _editor_url+'plugins/CharacterMap/CharacterMap.js' },
-  CharCounter:          { url: _editor_url+'plugins/CharCounter/CharCounter.js' },
-  ClientsideSpellcheck: { url: _editor_url+'unsupported_plugins/ClientsideSpellcheck/ClientsideSpellcheck.js' },
-  ColorPicker:          { url: _editor_url+'modules/ColorPicker/ColorPicker.js' },
-  ContextMenu:          { url: _editor_url+'plugins/ContextMenu/ContextMenu.js' },
-  CreateLink:           { url: _editor_url+'modules/CreateLink/link.js' },
-  CSSDropDowns:         { url: _editor_url+'plugins/CSSDropDowns/CSSDropDowns.js' },
-  CSSPicker:            { url: _editor_url+'plugins/CSSPicker/CSSPicker.js' },
-  DefinitionList:       { url: _editor_url+'plugins/DefinitionList/DefinitionList.js' },
-  Dialogs:              { url: _editor_url+'modules/Dialogs/dialog.js' },
-  DoubleClick:          { url: _editor_url+'unsupported_plugins/DoubleClick/DoubleClick.js' },
-  DynamicCSS:           { url: _editor_url+'plugins/DynamicCSS/DynamicCSS.js' },
-  EditTag:              { url: _editor_url+'plugins/EditTag/EditTag.js' },
-  EncodeOutput:         { url: _editor_url+'plugins/EncodeOutput/EncodeOutput.js' },
-  Equation:             { url: _editor_url+'plugins/Equation/Equation.js' },
-  ExtendedFileManager:  { url: _editor_url+'unsupported_plugins/ExtendedFileManager/ExtendedFileManager.js' },
-  FancySelects:         { url: _editor_url+'plugins/FancySelects/FancySelects.js' },
-  Filter:               { url: _editor_url+'unsupported_plugins/Filter/Filter.js' },
-  FindReplace:          { url: _editor_url+'plugins/FindReplace/FindReplace.js' },
-  FormOperations:       { url: _editor_url+'plugins/FormOperations/FormOperations.js' },
-  Forms:                { url: _editor_url+'plugins/Forms/Forms.js' },
-  FullPage:             { url: _editor_url+'plugins/FullPage/FullPage.js' },
-  FullScreen:           { url: _editor_url+'modules/FullScreen/full-screen.js' },
-  Gecko:                { url: _editor_url+'modules/Gecko/Gecko.js' },
-  GenericPlugin:        { url: _editor_url+'plugins/GenericPlugin/GenericPlugin.js' },
-  GetHtml:              { url: _editor_url+'plugins/GetHtml/GetHtml.js' },
-  HorizontalRule:       { url: _editor_url+'plugins/HorizontalRule/HorizontalRule.js' },
-  HtmlEntities:         { url: _editor_url+'plugins/HtmlEntities/HtmlEntities.js' },
-  HtmlTidy:             { url: _editor_url+'unsupported_plugins/HtmlTidy/HtmlTidy.js' },
-  ImageManager:         { url: _editor_url+'unsupported_plugins/ImageManager/ImageManager.js' },
-  InlineStyler:         { url: _editor_url+'modules/InlineStyler/InlineStyler.js' },
-  InsertAnchor:         { url: _editor_url+'plugins/InsertAnchor/InsertAnchor.js' },
-  InsertImage:          { url: _editor_url+'modules/InsertImage/insert_image.js' },
-  InsertMarquee:        { url: _editor_url+'unsupported_plugins/InsertMarquee/InsertMarquee.js' },
-  InsertNote:           { url: _editor_url+'plugins/InsertNote/InsertNote.js' },
-  InsertPagebreak:      { url: _editor_url+'plugins/InsertPagebreak/InsertPagebreak.js' },
-  InsertPicture:        { url: _editor_url+'unsupported_plugins/InsertPicture/InsertPicture.js' },
-  InsertSmiley:         { url: _editor_url+'plugins/InsertSmiley/InsertSmiley.js' },
-  InsertSnippet2:       { url: _editor_url+'plugins/InsertSnippet2/InsertSnippet2.js' },
-  InsertSnippet:        { url: _editor_url+'plugins/InsertSnippet/InsertSnippet.js' },
-  InsertTable:          { url: _editor_url+'modules/InsertTable/insert_table.js' },
-  InsertWords:          { url: _editor_url+'plugins/InsertWords/InsertWords.js' },
-  InternetExplorer:     { url: _editor_url+'modules/InternetExplorer/InternetExplorer.js' },
-  LangMarks:            { url: _editor_url+'plugins/LangMarks/LangMarks.js' },
-  Linker:               { url: _editor_url+'plugins/Linker/Linker.js' },
-  ListOperations:       { url: _editor_url+'plugins/ListOperations/ListOperations.js' },
-  ListType:             { url: _editor_url+'plugins/ListType/ListType.js' },
-  MootoolsFileManager:  { url: _editor_url+'plugins/MootoolsFileManager/MootoolsFileManager.js' },
-  NoteServer:           { url: _editor_url+'unsupported_plugins/NoteServer/NoteServer.js' },
-  Opera:                { url: _editor_url+'modules/Opera/Opera.js' },
-  PasteText:            { url: _editor_url+'plugins/PasteText/PasteText.js' },
-  PersistentStorage:    { url: _editor_url+'unsupported_plugins/PersistentStorage/PersistentStorage.js' },
-  PreserveScripts:      { url: _editor_url+'plugins/PreserveScripts/PreserveScripts.js' },
-  PreserveSelection:    { url: _editor_url+'plugins/PreserveSelection/PreserveSelection.js' },
-  PSFixed:              { url: _editor_url+'unsupported_plugins/PSFixed/PSFixed.js' },
-  PSLocal:              { url: _editor_url+'unsupported_plugins/PSLocal/PSLocal.js' },
-  PSServer:             { url: _editor_url+'unsupported_plugins/PSServer/PSServer.js' },
-  QuickTag:             { url: _editor_url+'plugins/QuickTag/QuickTag.js' },
-  SaveOnBlur:           { url: _editor_url+'plugins/SaveOnBlur/SaveOnBlur.js' },
-  SaveSubmit:           { url: _editor_url+'plugins/SaveSubmit/SaveSubmit.js' },
-  SetId:                { url: _editor_url+'plugins/SetId/SetId.js' },
-  SmartReplace:         { url: _editor_url+'plugins/SmartReplace/SmartReplace.js' },
-  SpellChecker:         { url: _editor_url+'unsupported_plugins/SpellChecker/SpellChecker.js' },
-  Stylist:              { url: _editor_url+'plugins/Stylist/Stylist.js' },
-  SuperClean:           { url: _editor_url+'plugins/SuperClean/SuperClean.js' },
-  TableOperations:      { url: _editor_url+'plugins/TableOperations/TableOperations.js' },
-  Template:             { url: _editor_url+'unsupported_plugins/Template/Template.js' },
-  UnFormat:             { url: _editor_url+'unsupported_plugins/UnFormat/UnFormat.js' },
-  UnsavedChanges:       { url: _editor_url+'plugins/UnsavedChanges/UnsavedChanges.js' },
-  WebKitResize:         { url: _editor_url+'plugins/WebKitResize/WebKitResize.js' },
-  WebKit:               { url: _editor_url+'modules/WebKit/WebKit.js' },
-  WysiwygWrap:          { url: _editor_url+'plugins/WysiwygWrap/WysiwygWrap.js' }
-};
-
-/**
- * This class creates an object that can be passed to the Xinha constructor as a parameter.
- * Set the object's properties as you need to configure the editor (toolbar etc.)
- * @version $Rev: 1433 $ $LastChangedDate: 2018-03-29 11:13:25 +1300 (Thu, 29 Mar 2018) $
- * @constructor
- */
-Xinha.Config = function()
-{
-  /** The svn revision number 
-   * @type Number
-   */
-  this.version = Xinha.version.Revision;
-  
- /** This property controls the width of the editor.<br />
-  *  Allowed values are 'auto', 'toolbar' or a numeric value followed by "px".<br />
-  *  <code>auto</code>: let Xinha choose the width to use.<br />
-  *  <code>toolbar</code>: compute the width size from the toolbar width.<br />
-  *  <code>numeric value</code>: forced width in pixels ('600px').<br />
-  * 
-  *  Default: <code>"auto"</code>
-  * @type String
-  */
-  this.width  = "auto";
- /** This property controls the height of the editor.<br />
-  *  Allowed values are 'auto' or a numeric value followed by px.<br />
-  *  <code>"auto"</code>: let Xinha choose the height to use.<br />
-  *  <code>numeric value</code>: forced height in pixels ('200px').<br />
-  *  Default: <code>"auto"</code> 
-  * @type String
-  */
-  this.height = "auto";
-
-  /** This property allows the user to drag-resize the iframe, if 
-   * the browser supports it.  Currently Chrome and Opera seem to work
-   * ok with this, while Firefox doesn't support the CSS resize for iframe
-   * 
-   * There is a Bugzilla bug about it...
-   *    https://bugzilla.mozilla.org/show_bug.cgi?id=680823
-   * 
-   * IE, and Edge don't support the css resize property at all.
-   * 
-   *  Safari 9.1.1 acts a bit weird, unusable
-   *  Safari 11.0.3 works ok but you can only increase the size
-   * 
-   * @type Boolean
-   */
-  
-  this.resizableEditor = false;
-  
- /** Specifies whether the toolbar should be included
-  *  in the size, or are extra to it.  If false then it's recommended
-  *  to have the size set as explicit pixel sizes (either in Xinha.Config or on your textarea)<br />
-  *
-  *  Default: <code>true</code>
-  *
-  *  @type Boolean
-  */
-  this.sizeIncludesBars = true;
- /**
-  * Specifies whether the panels should be included
-  * in the size, or are extra to it.  If false then it's recommended
-  * to have the size set as explicit pixel sizes (either in Xinha.Config or on your textarea)<br />
-  *  
-  *  Default: <code>true</code>
-  *
-  *  @type Boolean
-  */
-  this.sizeIncludesPanels = true;
-
- /**
-  * each of the panels has a dimension, for the left/right it's the width
-  * for the top/bottom it's the height.
-  *
-  * WARNING: PANEL DIMENSIONS MUST BE SPECIFIED AS PIXEL WIDTHS<br />
-  *Default values:  
-  *<pre>
-  *	  xinha_config.panel_dimensions =
-  *   {
-  *	    left:   '200px', // Width
-  *	    right:  '200px',
-  *	    top:    '100px', // Height
-  *	    bottom: '100px'
-  *	  }
-  *</pre>
-  *  @type Object
-  */
-  this.panel_dimensions =
-  {
-    left:   '200px', // Width
-    right:  '200px',
-    top:    '100px', // Height
-    bottom: '100px'
-  };
-
- /**  To make the iframe width narrower than the toolbar width, e.g. to maintain
-  *   the layout when editing a narrow column of text, set the next parameter (in pixels).<br />
-  *
-  *  Default: <code>true</code>
-  *
-  *  @type Integer|null
-  */
-  this.iframeWidth = null;
- 
- /** Enable creation of the status bar?<br />
-  *
-  *  Default: <code>true</code>
-  *
-  *  @type Boolean 
-  */
-  this.statusBar = true;
-
- /** Intercept ^V and use the Xinha paste command
-  *  If false, then passes ^V through to browser editor widget, which is the only way it works without problems in Mozilla<br />
-  *
-  *  Default: <code>false</code>
-  *
-  *  @type Boolean
-  */
-  this.htmlareaPaste = false;
-  
- /** <strong>Gecko only:</strong> Let the built-in routine for handling the <em>return</em> key decide if to enter <em>br</em> or <em>p</em> tags,
-  *  or use a custom implementation.<br />
-  *  For information about the rules applied by Gecko, <a href="http://www.mozilla.org/editor/rules.html">see Mozilla website</a> <br />
-  *  Possible values are <em>built-in</em> or <em>best</em><br />
-  *
-  *  Default: <code>"best"</code>
-  *
-  *  @type String
-  */
-  this.mozParaHandler = 'best'; 
-  
- /** This determines the method how the HTML output is generated.
-  *  There are two choices:
-  * 
-  *<table border="1">
-  *   <tr>
-  *       <td><em>DOMwalk</em></td>
-  *       <td>This is the classic and proven method. It recusively traverses the DOM tree 
-  *           and builds the HTML string "from scratch". Tends to be a bit slow, especially in IE.</td>
-  *   </tr>
-  *   <tr>
-  *       <td><em>TransformInnerHTML</em></td>
-  *       <td>This method uses the JavaScript innerHTML property and relies on Regular Expressions to produce
-  *            clean XHTML output. This method is much faster than the other one.</td>
-  *     </tr>
-  * </table>
-  *
-  *  Default: <code>"DOMwalk"</code>
-  *
-  * @type String
-  */
-  this.getHtmlMethod = 'DOMwalk';
-  
-  /** Maximum size of the undo queue<br />
-   *  Default: <code>20</code>
-   *  @type Integer
-   */
-  this.undoSteps = 20;
-
-  /** The time interval at which undo samples are taken<br />
-   *  Default: <code>500</code> (1/2 sec)
-   *  @type Integer milliseconds
-   */
-  this.undoTimeout = 500;
-
-  /** Set this to true if you want to explicitly right-justify when setting the text direction to right-to-left<br />
-   *  Default: <code>false</code>
-   *  @type Boolean
-   */
-  this.changeJustifyWithDirection = false;
-
-  /** If true then Xinha will retrieve the full HTML, starting with the &lt;HTML&gt; tag.<br />
-   *  Default: <code>false</code>
-   *  @type Boolean
-   */
-  this.fullPage = false;
-
-  /** Raw style definitions included in the edited document<br />
-   *  When a lot of inline style is used, perhaps it is wiser to use one or more external stylesheets.<br />
-   *  To set tags P in red, H1 in blue andn A not underlined, we may do the following
-   *<pre>
-   * xinha_config.pageStyle =
-   *  'p { color:red; }\n' +
-   *  'h1 { color:bleu; }\n' +
-   *  'a {text-decoration:none; }';
-   *</pre>
-   *  Default: <code>""</code> (empty)
-   *  @type String
-   */
-  this.pageStyle = "";
-
-  /** Array of external stylesheets to load. (Reference these absolutely)<br />
-   *  Example<br />
-   *  <pre>xinha_config.pageStyleSheets = ["/css/myPagesStyleSheet.css","/css/anotherOne.css"];</pre>
-   *  Default: <code>[]</code> (empty)
-   *  @type Array
-   */
-  this.pageStyleSheets = [];
-
-  // specify a base href for relative links
-  /** Specify a base href for relative links<br />
-   *  ATTENTION: this does not work as expected and needs t be changed, see Ticket #961 <br />
-   *  Default: <code>null</code>
-   *  @type String|null
-   */
-  this.baseHref = null;
-
-  /** If true, relative URLs (../) will be made absolute. 
-   * 
-   *  When the editor is in different directory depth as the edited page relative 
-   *   image sources will break the display of your images.
-   * 
-   *  This fixes an issue where Mozilla converts the urls of images and links that 
-   *   are on the same server to relative ones (../) when dragging them around in 
-   *   the editor (Ticket #448)<br />
-   * 
-   *  Note that setting to true will not expand directly relative paths
-   *   "foo/bar.html" will not be changed.  Only parental, self-referential or 
-   *   semi-absolute paths with parental or self-referential components will be 
-   *   adjusted, some examples of paths this will affect
-   * 
-   *     "/foo/bar/../foo.html" --> /foo/foo.html
-   *     "/foo/./foo.html"      --> /foo/foo.html
-   *     "./foo.html"       --> "foo.html"
-   *     "../foo.html"      --> "/foo.html" (assuming ../ ends up at the root or lower)
-   * 
-   *  You can also set this to the string 'all' and this will include non-parental
-   *   relative urls.  I think this is probably a bad idea as it may cause broken URLS
-   *   especially when combined with stripBaseHref or if you feed in such urls in your
-   *   html.
-   * 
-   *  Default: <code>true</code>
-   *  @type Boolean|String
-   */
-  this.expandRelativeUrl = true;
-    
- /**  We can strip the server part out of URL to make/leave them semi-absolute, reason for this
-   *  is that the browsers will prefix  the server to any relative links to make them absolute, 
-   *  which isn't what you want most the time.<br />
-   *  Default: <code>true</code>
-   *  @type Boolean
-   */
-  this.stripBaseHref = true;
-
-   /**  We can strip the url of the editor page from named links (eg &lt;a href="#top"&gt;...&lt;/a&gt;) and links 
-   *  that consist only of URL parameters (eg &lt;a href="?parameter=value"&gt;...&lt;/a&gt;)
-   *  reason for this is that browsers tend to prefixe location.href to any href that
-   *  that don't have a full url<br />
-   *  Default: <code>true</code>
-   *  @type Boolean
-   */
-  this.stripSelfNamedAnchors = true;
-
-  /** In URLs all characters above ASCII value 127 have to be encoded using % codes<br />
-   *  Default: <code>true</code>
-   *  @type Boolean
-   */
-  this.only7BitPrintablesInURLs = true;
-
- 
-  /** If you are putting the HTML written in Xinha into an email you might want it to be 7-bit
-   *  characters only.  This config option will convert all characters consuming
-   *  more than 7bits into UNICODE decimal entity references (actually it will convert anything
-   *  below <space> (chr 20) except cr, lf and tab and above <tilde> (~, chr 7E))<br />
-   *  Default: <code>false</code>
-   *  @type Boolean
-   */
-  this.sevenBitClean = false;
-
-
-  /** Sometimes we want to be able to replace some string in the html coming in and going out
-   *  so that in the editor we use the "internal" string, and outside and in the source view
-   *  we use the "external" string  this is useful for say making special codes for
-   *  your absolute links, your external string might be some special code, say "{server_url}"
-   *  an you say that the internal represenattion of that should be http://your.server/<br />
-   *  Example:  <code>{ 'html_string' : 'wysiwyg_string' }</code><br />
-   *  Default: <code>{}</code> (empty)
-   *  @type Object
-   */
-  this.specialReplacements = {}; //{ 'html_string' : 'wysiwyg_string' }
-  
-  /** When the user presses the Tab in the editor, Xinha will insert a span.
-   *  with the given class and contents.
-   * 
-   *  You can set tabSpanClass to false to disable this function, in which
-   *    case tabs will be disabled in Xinha (except for in lists if you load 
-   *    the ListOperations plugin.
-   */
-  
-  this.tabSpanClass    = 'xinha-tab';
-  this.tabSpanContents = '&nbsp;&nbsp;&nbsp;&nbsp;';
-  
-  /** A filter function for the HTML used inside the editor<br />
-   * Default: function (html) { return html }
-   * 
-   * @param {String} html The whole document's HTML content
-   * @return {String} The processed HTML 
-   */
-  this.inwardHtml = function (html) { return html; };
-  
-  /** A filter function for the generated HTML<br />
-   * Default: function (html) { return html }
-   * 
-   * @param {String} html The whole document's HTML content
-   * @return {String} The processed HTML 
-   */
-  this.outwardHtml = function (html) { return html; };
-  
-  /** This setting determines whether or not the editor will be automatically activated and focused when the page loads. 
-   *  If the page contains only a single editor, autofocus can be set to true to focus it. 
-   *  Alternatively, if the page contains multiple editors, autofocus may be set to the ID of the text area of the editor to be focused. 
-   *  For example, the following setting would focus the editor attached to the text area whose ID is "myTextArea": 
-   *  <code>xinha_config.autofocus = "myTextArea";</code>
-   *  Default: <code>false</code>
-   *  @type Boolean|String
-   */
-  this.autofocus = false;
-  
- /** Set to true if you want Word code to be cleaned upon Paste. This only works if 
-   * you use the toolbr button to paste, not ^V. This means that due to the restrictions
-   * regarding pasting, this actually has no real effect in Mozilla <br />
-   *  Default: <code>true</code>
-   *  @type Boolean
-   */
-  this.killWordOnPaste = true;
-
-  /** Enable the 'Target' field in the Make Link dialog. Note that the target attribute is invalid in (X)HTML strict<br />
-   *  Default: <code>true</code>
-   *  @type Boolean
-   */
-  this.makeLinkShowsTarget = true;
-
-  /** CharSet of the iframe, default is the charset of the document
-   *  @type String
-   */
-  this.charSet = (typeof document.characterSet != 'undefined') ? document.characterSet : document.charset;
-
- /** Whether the edited document should be rendered in Quirksmode or Standard Compliant (Strict) Mode.<br />
-   * This is commonly known as the "doctype switch"<br />
-   * for details read here http://www.quirksmode.org/css/quirksmode.html
-   *
-   * Possible values:<br />
-   *    true     :  Quirksmode is used<br />
-   *    false    :  Strict mode is used<br />
-   *    null (default):  the mode of the document Xinha is in is used
-   * @type Boolean|null
-   */
-  this.browserQuirksMode = null;
-
-  // URL-s
-  this.imgURL = "images/";
-  this.popupURL = "popups/";
-
-  /** RegExp allowing to remove certain HTML tags when rendering the HTML.<br />
-   *  Example: remove span and font tags
-   *  <code>
-   *    xinha_config.htmlRemoveTags = /span|font/;
-   *  </code>
-   *  Default: <code>null</code>
-   *  @type RegExp|null
-   */
-  this.htmlRemoveTags = null;
-
- /** Turning this on will turn all "linebreak" and "separator" items in your toolbar into soft-breaks,
-   * this means that if the items between that item and the next linebreak/separator can
-   * fit on the same line as that which came before then they will, otherwise they will
-   * float down to the next line.
-
-   * If you put a linebreak and separator next to each other, only the separator will
-   * take effect, this allows you to have one toolbar that works for both flowToolbars = true and false
-   * infact the toolbar below has been designed in this way, if flowToolbars is false then it will
-   * create explictly two lines (plus any others made by plugins) breaking at justifyleft, however if
-   * flowToolbars is false and your window is narrow enough then it will create more than one line
-   * even neater, if you resize the window the toolbars will reflow.  <br />
-   *  Default: <code>true</code>
-   *  @type Boolean
-   */
-  this.flowToolbars = true;
-  
-  /** Set to center or right to change button alignment in toolbar
-   *  @type String
-   */
-  this.toolbarAlign = "left";
-  
-  /** Set to true to display the font names in the toolbar font select list in their actual font.
-   *  Note that this doesn't work in IE, but doesn't hurt anything either.
-   *  Default: <code>false</code>
-   *  @type Boolean
-   */
-   this.showFontStylesInToolbar = false;
-  
-  /** Set to true if you want the loading panel to show at startup<br />
-   *  Default: <code>false</code>
-   *  @type Boolean
-   */
-  this.showLoading = false;
-  
-  /** Set to false if you want to allow JavaScript in the content, otherwise &lt;script&gt; tags are stripped out.<br />
-   *  This currently only affects the "DOMwalk" getHtmlMethod.<br />
-   *  Default: <code>true</code>
-   *  @type Boolean
-   */
-  this.stripScripts = true;
-
- /** See if the text just typed looks like a URL, or email address
-   * and link it appropriatly
-   * Note: Setting this option to false only affects Mozilla based browsers.
-   * In InternetExplorer this is native behaviour and cannot be turned off.<br />
-   *  Default: <code>true</code>
-   *  @type Boolean
-   */
-   this.convertUrlsToLinks = true;
-
- /** Set to true to hide media objects when a div-type dialog box is open, to prevent show-through
-  *  Default: <code>false</code>
-  *  @type Boolean
-  */
-  this.hideObjectsBehindDialogs = false;
-
- /** Size of color picker cells<br />
-   * Use number + "px"<br />
-   *  Default: <code>"6px"</code>
-   *  @type String
-   */
-  this.colorPickerCellSize = '6px';
- /** Granularity of color picker cells (number per column/row)<br />
-   *  Default: <code>18</code>
-   *  @type Integer
-   */
-  this.colorPickerGranularity = 18;
- /** Position of color picker from toolbar button<br />
-   *  Default: <code>"bottom,right"</code>
-   *  @type String
-   */
-  this.colorPickerPosition = 'bottom,right';
-  /** Set to true to show only websafe checkbox in picker<br />
-   *  Default: <code>false</code>
-   *  @type Boolean
-   */
-  this.colorPickerWebSafe = false;
- /** Number of recent colors to remember<br />
-   *  Default: <code>20</code>
-   *  @type Integer
-   */
-  this.colorPickerSaveColors = 20;
-
-  /** Start up the editor in fullscreen mode<br />
-   *  Default: <code>false</code>
-   *  @type Boolean
-   */
-  this.fullScreen = false;
-  
- /** You can tell the fullscreen mode to leave certain margins on each side.<br />
-   *  The value is an array with the values for <code>[top,right,bottom,left]</code> in that order<br />
-   *  Default: <code>[0,0,0,0]</code>
-   *  @type Array
-   */
-  this.fullScreenMargins = [0,0,0,0];
-  
-  
-  /** Specify the method that is being used to calculate the editor's size<br/>
-    * when we return from fullscreen mode.
-    *  There are two choices:
-    * 
-    * <table border="1">
-    *   <tr>
-    *       <td><em>initSize</em></td>
-    *       <td>Use the internal Xinha.initSize() method to calculate the editor's 
-    *       dimensions. This is suitable for most usecases.</td>
-    *   </tr>
-    *   <tr>
-    *       <td><em>restore</em></td>
-    *       <td>The editor's dimensions will be stored before going into fullscreen
-    *       mode and restored when we return to normal mode, taking a possible
-    *       window resize during fullscreen in account.</td>
-    *     </tr>
-    * </table>
-    *
-    * Default: <code>"initSize"</code>
-    * @type String
-    */
-  this.fullScreenSizeDownMethod = 'initSize';
-  
-  /** This array orders all buttons except plugin buttons in the toolbar. Plugin buttons typically look for one 
-   *  a certain button in the toolbar and place themselves next to it.
-   * Default value:
-   *<pre>
-   *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"]
-   * ];
-   *</pre>
-   * @type Array
-   */  
-  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"]),
-    ["separator","killword","clearfonts","removeformat","toggleborders","splitblock","lefttoright", "righttoleft"],
-    ["separator","htmlmode","showhelp","about"]
-  ];
-
-  /** The fontnames listed in the fontname dropdown
-   * Default value:
-   *<pre>
-   *xinha_config.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'
-   *};
-   *</pre>
-   * @type Object
-   */
-  this.fontname =
-  {
-    "&#8212; font &#8212;": "", // &#8212; is mdash
-    "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' 
-  };
-
-  /** The fontsizes listed in the fontsize dropdown
-   * Default value:
-   *<pre>
-   *xinha_config.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"
-   *};
-   *</pre>
-   * @type Object
-   */
-  this.fontsize =
-  {
-    "&#8212; size &#8212;": "", // &#8212; is mdash
-    "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"
-  };
-  /** The tags listed in the formatblock dropdown
-   * Default value:
-   *<pre>
-   *xinha_config.formatblock =
-   *{
-   *  "&#8212; format &#8212;": "", // &#8212; is mdash
-   *  "Heading 1": "h1",
-   *  "Heading 2": "h2",
-   *  "Heading 3": "h3",
-   *  "Heading 4": "h4",
-   *  "Heading 5": "h5",
-   *  "Heading 6": "h6",
-   *  "Normal"   : "p",
-   *  "Address"  : "address",
-   *  "Formatted": "pre"
-   *}
-   *</pre>
-   * @type Object
-   */
-  this.formatblock =
-  {
-    "&#8212; format &#8212;": "", // &#8212; is mdash
-    "Heading 1": "h1",
-    "Heading 2": "h2",
-    "Heading 3": "h3",
-    "Heading 4": "h4",
-    "Heading 5": "h5",
-    "Heading 6": "h6",
-    "Normal"   : "p",
-    "Address"  : "address",
-    "Formatted": "pre"
-  };
-
-  /** You can provide custom functions that will be used to determine which of the
-   * "formatblock" options is currently active and selected in the dropdown.
-   *
-   * Example:
-   * <pre>
-   * xinha_config.formatblockDetector['h5'] = function(xinha, currentElement)
-   * {
-   *   if (my_special_matching_logic(currentElement)) {
-   *     return true;
-   *   } else {
-   *     return false;
-   *   }
-   * };
-   * </pre>
-   *
-   * You probably don't want to mess with this, unless you are adding new, custom
-   * "formatblock" options which don't correspond to real HTML tags.  If you want
-   * to do that, you can use this configuration option to tell xinha how to detect
-   * when it is within your custom context.
-   *
-   * For more, see: http://www.coactivate.org/projects/xinha/custom-formatblock-options
-   */
-  this.formatblockDetector = {};
-
-  this.dialogOptions =
-  {
-    'centered' : true, //true: dialog is shown in the center the screen, false dialog is shown near the clicked toolbar button
-    'greyout':true, //true: when showing modal dialogs, the page behind the dialoge is greyed-out
-    'closeOnEscape':true
-  };
-  /** You can add functions to this object to be executed on specific events
-   * Example:
-   * <pre>
-   * xinha_config.Events.onKeyPress = function (event)
-   * {
-   *    //do something 
-   *    return false;
-   * }
-   * </pre>
-   * Note that <em>this</em> inside the function refers to the respective Xinha object
-   * The possible function names are documented at <a href="http://trac.xinha.org/wiki/Documentation/EventHooks">http://trac.xinha.org/wiki/Documentation/EventHooks</a>
-   */
-  this.Events = {};
-  
-  /** ??
-   * Default: <code>{}</code>
-   * @type Object
-   */
-  this.customSelects = {};
-
-  /** Switches on some debugging (only in execCommand() as far as I see at the moment)<br />
-   *
-   * Default: <code>false</code>
-   * @type Boolean
-   */
-  this.debug = false;
-
-  /** Paths to various resources loaded by Xinha during operation.
-   * 
-   * Note that the iframe_src is the document loaded in the iframe to start with
-   * due to modern security requirements, if you are using Xinha from
-   * an external server (CDN), special care needs be taken, javascript:'' 
-   * which is now the default seems to be ok, but if you have problems you could
-   * change this to an absolute path to a file on the server which has the page
-   * that is using Xinha (ie, /myserver/blank.html ), the contents should 
-   * just be a blank html page (see popups/blank.html)
-   * 
-   * @type Array
-   */
-  
-  this.URIs =
-  {
-   "iframe_src": 'javascript:\'\'',
-   "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"
-  };
-
-   /** The button list conains the definitions of the toolbar button. Normally, there's nothing to change here :) 
-   * <div style="white-space:pre">ADDING CUSTOM BUTTONS: please read below!
-   * format of the btnList elements is "ID: [ ToolTip, Icon, Enabled in text mode?, ACTION ]"
-   *    - ID: unique ID for the button.  If the button calls document.execCommand
-   *	    it's wise to give it the same name as the called command.
-   *    - ACTION: function that gets called when the button is clicked.
-   *              it has the following prototype:
-   *                 function(editor, buttonName)
-   *              - editor is the Xinha object that triggered the call
-   *              - buttonName is the ID of the clicked button
-   *              These 2 parameters makes it possible for you to use the same
-   *              handler for more Xinha objects or for more different buttons.
-   *    - ToolTip: tooltip, will be translated below
-   *    - Icon: path to an icon image file for the button
-   *            OR; you can use an 18x18 block of a larger image by supllying an array
-   *            that has three elemtents, the first is the larger image, the second is the column
-   *            the third is the row.  The ros and columns numbering starts at 0 but there is
-   *            a header row and header column which have numbering to make life easier.
-   *            See images/buttons_main.gif to see how it's done.
-   *    - Enabled in text mode: if false the button gets disabled for text-only mode; otherwise enabled all the time.</div>
-   * @type Object
-   */
-  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.execCommand("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"); } ]
-  };
-  
-  /** A hash of double click handlers for the given elements, each element may have one or more double click handlers
-   *  called in sequence.  The element may contain a class selector ( a.somethingSpecial )
-   *  
-   */
-   
-  this.dblclickList = 
-  {
-      "a": [function(e, target) {e.execCommand("createlink", false, target);}],
-    "img": [function(e, target) {e._insertImage(target);}]
-  };
-
- /**
-  * HTML class attribute to apply to the <body> tag within the editor's iframe.
-  * If it is not specified, no class will be set.
-  * 
-  *  Default: <code>null</code>
-  */
-  this.bodyClass = null;
-
- /**
-  * HTML ID attribute to apply to the <body> tag within the editor's iframe.
-  * If it is not specified, no ID will be set.
-  * 
-  *  Default: <code>null</code>
-  */
-  this.bodyID = null;
-  
-  /** A container for additional icons that may be swapped within one button (like fullscreen)
-   * @private
-   */
-  this.iconList = 
-  {
-    dialogCaption : _editor_url + 'images/xinha-small-icon.gif',
-    wysiwygmode : [_editor_url + 'images/ed_buttons_main.png',7,1]
-  };
-  // initialize tooltips from the I18N module and generate correct image path
-  for ( var i in this.btnList )
-  {
-    var btn = this.btnList[i];
-    // prevent iterating over wrong type
-    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]); //initialize tooltip
-  }
-};
-/** A plugin may require more than one icon for one button, this has to be registered in order to work with the iconsets (see FullScreen)
- * 
- * @param {String} id
- * @param {String|Array} icon definition like in registerButton
- */
-Xinha.Config.prototype.registerIcon = function (id, icon)
-{
-  this.iconList[id] = icon;
-};
-/** ADDING CUSTOM BUTTONS
-*   ---------------------
-*
-*
-* Example on how to add a custom button when you construct the Xinha:
-*
-*   var editor = new Xinha("your_text_area_id");
-*   var cfg = editor.config; // this is the default configuration
-*   cfg.btnList["my-hilite"] =
-*	[ "Highlight selection", // tooltip
-*	  "my_hilite.gif", // image
-*	  false // disabled in text mode
-*	  function(editor) { editor.surroundHTML('<span style="background:yellow">', '</span>'); }, // action
-*	];
-*   cfg.toolbar.push(["linebreak", "my-hilite"]); // add the new button to the toolbar
-*
-* An alternate (also more convenient and recommended) way to
-* accomplish this is to use the registerButton function below.
-*/
-/** Helper function: register a new button with the configuration.  It can be
- * called with all 5 arguments, or with only one (first one).  When called with
- * only one argument it must be an object with the following properties: id,
- * tooltip, image, textMode, action.<br />  
- * 
- * Examples:<br />
- *<pre>
- * config.registerButton("my-hilite", "Hilite text", "my-hilite.gif", false, function(editor) {...});
- * config.registerButton({
- *      id       : "my-hilite",      // the ID of your button
- *      tooltip  : "Hilite text",    // the tooltip
- *      image    : "my-hilite.gif",  // image to be displayed in the toolbar
- *      textMode : false,            // disabled in text mode
- *      action   : function(editor) { // called when the button is clicked
- *                   editor.surroundHTML('<span class="hilite">', '</span>');
- *                 },
- *      context  : "p" or [ "p", "h1" ]  // will be disabled if outside a <p> element (in array case, <p> or <h1>)
- *    });</pre>
- */
-Xinha.Config.prototype.registerButton = function(id, tooltip, image, textMode, action, context)
-{
-  if ( typeof id == "string" )
-  {
-    this.btnList[id] = [ tooltip, image, textMode, action, context ];
-  }
-  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(side, object)
-{
-  if ( !side )
-  {
-    side = 'right';
-  }
-  this.setLoadingMessage('Register ' + side + ' panel ');
-  var panel = this.addPanel(side);
-  if ( object )
-  {
-    object.drawPanelIn(panel);
-  }
-};
-
-/** The following helper function registers a dropdown box with the editor
- * configuration.  You still have to add it to the toolbar, same as with the
- * buttons.  Call it like this:
- *
- * FIXME: add example
- */
-Xinha.Config.prototype.registerDropdown = function(object)
-{
-  // check for existing id
-//  if ( typeof this.customSelects[object.id] != "undefined" )
-//  {
-    // alert("WARNING [Xinha.Config::registerDropdown]:\nA dropdown with the same ID already exists.");
-//  }
-//  if ( typeof this.btnList[object.id] != "undefined" )
-//  {
-    // alert("WARNING [Xinha.Config::registerDropdown]:\nA button with the same ID already exists.");
-//  }
-  this.customSelects[object.id] = object;
-};
-
-/** Call this function to remove some buttons/drop-down boxes from the toolbar.
- * Pass as the only parameter a string containing button/drop-down names
- * delimited by spaces.  Note that the string should also begin with a space
- * and end with a space.  Example:
- *
- *   config.hideSomeButtons(" fontname fontsize textindicator ");
- *
- * It's useful because it's easier to remove stuff from the defaul toolbar than
- * create a brand new toolbar ;-)
- */
-Xinha.Config.prototype.hideSomeButtons = function(remove)
-{
-  var toolbar = this.toolbar;
-  for ( var i = toolbar.length; --i >= 0; )
-  {
-    var line = toolbar[i];
-    for ( var j = line.length; --j >= 0; )
-    {
-      if ( remove.indexOf(" " + line[j] + " ") >= 0 )
-      {
-        var len = 1;
-        if ( /separator|space/.test(line[j + 1]) )
-        {
-          len = 2;
-        }
-        line.splice(j, len);
-      }
-    }
-  }
-};
-
-/** Helper Function: add buttons/drop-downs boxes with title or separator to the toolbar
- * if the buttons/drop-downs boxes doesn't allready exists.
- * id: button or selectbox (as array with separator or title)
- * where: button or selectbox (as array if the first is not found take the second and so on)
- * position:
- * -1 = insert button (id) one position before the button (where)
- * 0 = replace button (where) by button (id)
- * +1 = insert button (id) one position after button (where)
- *
- * cfg.addToolbarElement(["T[title]", "button_id", "separator"] , ["first_id","second_id"], -1);
-*/
-
-Xinha.Config.prototype.addToolbarElement = function(id, where, position)
-{
-  var toolbar = this.toolbar;
-  var a, i, j, o, sid;
-  var idIsArray = false;
-  var whereIsArray = false;
-  var whereLength = 0;
-  var whereJ = 0;
-  var whereI = 0;
-  var exists = false;
-  var found = false;
-  // check if id and where are arrys
-  if ( ( id && typeof id == "object" ) && ( id.constructor == Array ) )
-  {
-    idIsArray = true;
-  }
-  if ( ( where && typeof where == "object" ) && ( where.constructor == Array ) )
-  {
-    whereIsArray = true;
-    whereLength = where.length;
-	}
-
-  if ( idIsArray ) //find the button/select box in input array
-  {
-    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 < toolbar.length; ++i ) {
-    a = toolbar[i];
-    for ( j = 0; j < a.length; ++j ) {
-      // check if button/select box exists
-      if ( a[j] == sid ) {
-        return; // cancel to add elements if same button already exists
-      }
-    }
-  }
-  
-
-  for ( i = 0; !found && i < toolbar.length; ++i )
-  {
-    a = toolbar[i];
-    for ( j = 0; !found && j < a.length; ++j )
-    {
-      if ( whereIsArray )
-      {
-        for ( o = 0; o < whereLength; ++o )
-        {
-          if ( a[j] == where[o] )
-          {
-            if ( o === 0 )
-            {
-              found = true;
-              j--;
-              break;
-            }
-            else
-            {
-              whereI = i;
-              whereJ = j;
-              whereLength = o;
-            }
-          }
-        }
-      }
-      else
-      {
-        // find the position to insert
-        if ( a[j] == where )
-        { 
-          found = true;
-          break;
-        }
-      }
-    }
-  }
-
-  //if check found any other as the first button
-  if ( !found && whereIsArray )
-  { 
-    if ( where.length != whereLength )
-    {
-      j = whereJ;
-      a = toolbar[whereI];
-      found = true;
-    }
-  }
-  if ( found )
-  {
-    // replace the found button
-    if ( position === 0 )
-    {
-      if ( idIsArray)
-      {
-        a[j] = id[id.length-1];
-        for ( i = id.length-1; --i >= 0; )
-        {
-          a.splice(j, 0, id[i]);
-        }
-      }
-      else
-      {
-        a[j] = id;
-      }
-    }
-    else
-    { 
-      // insert before/after the found button
-      if ( position < 0 )
-      {
-        j = j + position + 1; //correct position before
-      }
-      else if ( position > 0 )
-      {
-        j = j + position; //correct posion after
-      }
-      if ( idIsArray )
-      {
-        for ( i = id.length; --i >= 0; )
-        {
-          a.splice(j, 0, id[i]);
-        }
-      }
-      else
-      {
-        a.splice(j, 0, id);
-      }
-    }
-  }
-  else
-  {
-    // no button found
-    toolbar[0].splice(0, 0, "separator");
-    if ( idIsArray)
-    {
-      for ( i = id.length; --i >= 0; )
-      {
-        toolbar[0].splice(0, 0, id[i]);
-      }
-    }
-    else
-    {
-      toolbar[0].splice(0, 0, id);
-    }
-  }
-};
-/** Alias of Xinha.Config.prototype.hideSomeButtons()
-* @type Function
-*/
-Xinha.Config.prototype.removeToolbarElement = Xinha.Config.prototype.hideSomeButtons;
-
-/** Helper function: replace all TEXTAREA-s in the document with Xinha-s. 
-* @param {Xinha.Config} optional config 
-*/
-Xinha.replaceAll = function(config)
-{
-  var tas = document.getElementsByTagName("textarea");
-  // @todo: weird syntax, doesnt help to read the code, doesnt obfuscate it and doesnt make it quicker, better rewrite this part
-  for ( var i = tas.length; i > 0; new Xinha(tas[--i], config).generate() )
-  {
-    // NOP
-  }
-};
-
-/** Helper function: replaces the TEXTAREA with the given ID with Xinha. 
-* @param {string} id id of the textarea to replace 
-* @param {Xinha.Config} optional config 
-*/
-Xinha.replace = function(id, config)
-{
-  var ta = Xinha.getElementById("textarea", id);
-  return ta ? new Xinha(ta, config).generate() : null;
-};
- 
-/** Creates the toolbar and appends it to the _htmlarea
-* @private
-* @returns {DomNode} toolbar
-*/
-Xinha.prototype._createToolbar = function ()
-{
-  this.setLoadingMessage(Xinha._lc('Create Toolbar'));
-  var editor = this;	// to access this in nested functions
-
-  var toolbar = document.createElement("div");
-  // ._toolbar is for legacy, ._toolBar is better thanks.
-  this._toolBar = this._toolbar = toolbar;
-  toolbar.className = "toolbar";  
-  toolbar.align = this.config.toolbarAlign;
-  
-  Xinha.freeLater(this, '_toolBar');
-  Xinha.freeLater(this, '_toolbar');
-  
-  var tb_row = null;
-  var tb_objects = {};
-  this._toolbarObjects = tb_objects;
-
-	this._createToolbar1(editor, toolbar, tb_objects);
-	
-	// IE8 is totally retarded, if you click on a toolbar element (eg button)
-	// and it doesn't have unselectable="on", then it defocuses the editor losing the selection
-	// so nothing works.  Particularly prevalent with TableOperations
-	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(toolbar);
-	
-	
-	this._htmlArea.appendChild(toolbar);      
-  
-  return toolbar;
-};
-
-/** FIXME : function never used, can probably be removed from source
-* @private
-* @deprecated
-*/
-Xinha.prototype._setConfig = function(config)
-{
-	this.config = config;
-};
-/** FIXME: How can this be used??
- * The only thing that used this seems to have been PersistentStorage, which is DOA
-* @private
-*/
-Xinha.prototype._rebuildToolbar = function()
-{
-	this._createToolbar1(this, this._toolbar, this._toolbarObjects);
-
-  // We only want ONE editor at a time to be active
-  if ( Xinha._currentlyActiveEditor )
-  {
-    if ( Xinha._currentlyActiveEditor == this )
-    {
-      this.activateEditor();
-    }
-  }
-  else
-  {
-    this.disableToolbar();
-  }
-};
-
-/**
- * Create a break element to add in the toolbar
- *
- * @return {DomNode} HTML element to add
- * @private
- */
-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;
-};
-
-
-/** separate from previous createToolBar to allow dynamic change of toolbar
- * @private
- * @return {DomNode} toolbar
- */
-Xinha.prototype._createToolbar1 = function (editor, toolbar, tb_objects)
-{
-  // We will clean out any existing toolbar elements.
-  while (toolbar.lastChild)
-  {
-    toolbar.removeChild(toolbar.lastChild);
-  }
-
-  var tb_row;
-  // This shouldn't be necessary, but IE seems to float outside of the container
-  // when we float toolbar sections, so we have to clear:both here as well
-  // as at the end (which we do have to do).
-  if ( editor.config.flowToolbars )
-  {
-    toolbar.appendChild(Xinha._createToolbarBreakingElement());
-  }
-
-  // creates a new line in the toolbar
-  function newLine()
-  {
-    if ( typeof tb_row != 'undefined' && tb_row.childNodes.length === 0)
-    {
-      return;
-    }
-
-    var table = document.createElement("table");
-    table.border = "0px";
-    table.cellSpacing = "0px";
-    table.cellPadding = "0px";
-    if ( editor.config.flowToolbars )
-    {
-      if ( Xinha.is_ie )
-      {
-        table.style.styleFloat = "left";
-      }
-      else
-      {
-        table.style.cssFloat = "left";
-      }
-    }
-
-    toolbar.appendChild(table);
-    // TBODY is required for IE, otherwise you don't see anything
-    // in the TABLE.
-    var tb_body = document.createElement("tbody");
-    table.appendChild(tb_body);
-    tb_row = document.createElement("tr");
-    tb_body.appendChild(tb_row);
-
-    table.className = 'toolbarRow'; // meh, kinda.
-  } // END of function: newLine
-
-  // init first line
-  newLine();
-
-  // updates the state of a toolbar element.  This function is member of
-  // a toolbar element object (unnamed objects created by createButton or
-  // createSelect functions below).
-  function setButtonStatus(id, newval)
-  {
-    var oldval = this[id];
-    var el = this.element;
-    if ( oldval != newval )
-    {
-      switch (id)
-      {
-        case "enabled":
-          if ( newval )
-          {
-            Xinha._removeClass(el, "buttonDisabled");
-            el.disabled = false;
-          }
-          else
-          {
-            Xinha._addClass(el, "buttonDisabled");
-            el.disabled = true;
-          }
-        break;
-        case "active":
-          if ( newval )
-          {
-            Xinha._addClass(el, "buttonPressed");
-          }
-          else
-          {
-            Xinha._removeClass(el, "buttonPressed");
-          }
-        break;
-      }
-      this[id] = newval;
-    }
-  } // END of function: setButtonStatus
-
-  // this function will handle creation of combo boxes.  Receives as
-  // parameter the name of a button as defined in the toolBar config.
-  // This function is called from createButton, above, if the given "txt"
-  // doesn't match a button.
-  function createSelect(txt)
-  {
-    var options = null;
-    var el = null;
-    var cmd = null;
-    var customSelects = editor.config.customSelects;
-    var context = null;
-    var tooltip = "";
-    switch (txt)
-    {
-      case "fontsize":
-      case "fontname":
-      case "formatblock":
-        // the following line retrieves the correct
-        // configuration option because the variable name
-        // inside the Config object is named the same as the
-        // button/select in the toolbar.  For instance, if txt
-        // == "formatblock" we retrieve config.formatblock (or
-        // a different way to write it in JS is
-        // config["formatblock"].
-        options = editor.config[txt];
-        cmd = txt;
-      break;
-      default:
-        // try to fetch it from the list of registered selects
-        cmd = txt;
-        var dropdown = customSelects[cmd];
-        if ( typeof dropdown != "undefined" )
-        {
-          options = dropdown.options;
-          context = dropdown.context;
-          if ( typeof dropdown.tooltip != "undefined" )
-          {
-            tooltip = dropdown.tooltip;
-          }
-        }
-        else
-        {
-          alert("ERROR [createSelect]:\nCan't find the requested dropdown definition");
-        }
-      break;
-    }
-    if ( options )
-    {
-      el = document.createElement("select");
-      el.title = tooltip;
-      el.style.width = 'auto';
-      el.name = txt;
-      var obj =
-      {
-        name	: txt, // field name
-        element : el,	// the UI element (SELECT)
-        enabled : true, // is it enabled?
-        text	: false, // enabled in text mode?
-        cmd	: cmd, // command ID
-        state	: setButtonStatus, // for changing state
-        context : context
-      };
-      
-      Xinha.freeLater(obj);
-      
-      tb_objects[txt] = obj;
-      
-      for ( var i in options )
-      {
-        // prevent iterating over wrong type
-        if ( typeof options[i] != 'string' )
-        {
-          continue;
-        }
-        var op = document.createElement("option");
-        op.innerHTML = Xinha._lc(i);
-        op.value = options[i];
-        if (txt =='fontname' && editor.config.showFontStylesInToolbar)
-        {
-          op.style.fontFamily = options[i];
-        }
-        el.appendChild(op);
-      }
-      Xinha._addEvent(el, "change", function () { editor._comboSelected(el, txt); } );
-    }
-    return el;
-  } // END of function: createSelect
-
-  // appends a new button to toolbar
-  function createButton(txt)
-  {
-    // the element that will be created
-    var el, btn, obj = null;
-    switch (txt)
-    {
-      case "separator":
-        if ( editor.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, // the button name (i.e. 'bold')
-          element : el, // the UI element (DIV)
-          enabled : true, // is it enabled?
-          active	: false, // is it pressed?
-          text	: false, // enabled in text mode?
-          cmd	: "textindicator", // the command ID
-          state	: setButtonStatus // for changing state
-        };
-      
-        Xinha.freeLater(obj);
-      
-        tb_objects[txt] = obj;
-      break;
-      default:
-        btn = editor.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";
-      // let's just pretend we have a button object, and
-      // assign all the needed information to it.
-      obj =
-      {
-        name : txt, // the button name (i.e. 'bold')
-        element : el, // the UI element (DIV)
-        enabled : true, // is it enabled?
-        active : false, // is it pressed?
-        text : btn[2], // enabled in text mode?
-        cmd	: btn[3], // the command ID
-        state	: setButtonStatus, // for changing state
-        context : btn[4] || null // enabled in a certain context?
-      };
-      Xinha.freeLater(el);
-      Xinha.freeLater(obj);
-
-      tb_objects[txt] = obj;
-
-      // prevent drag&drop of the icon to content area
-      el.ondrag = function() { return false; };
-
-      // handlers to emulate nice flat toolbar buttons
-      Xinha._addEvent(
-        el,
-        "mouseout",
-        function(ev)
-        {
-          if ( obj.enabled )
-          {
-            //Xinha._removeClass(el, "buttonHover");
-            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);
-          }
-        }
-      );
-
-      // when clicked, do the following:
-      Xinha._addEvent(
-        el,
-        "click",
-        function(ev)
-        {
-          ev = ev || window.event;
-          editor.btnClickEvent = {clientX : ev.clientX, clientY : ev.clientY};
-          if ( obj.enabled )
-          {
-            Xinha._removeClass(el, "buttonActive");
-            //Xinha._removeClass(el, "buttonHover");
-            if ( Xinha.is_gecko )
-            {
-              editor.activateEditor();
-            }
-            // We pass the event to the action so they can can use it to
-            // enhance the UI (e.g. respond to shift or ctrl-click)
-            obj.cmd(editor, obj.name, obj, ev);
-            Xinha._stopEvent(ev);
-          }
-        }
-      );
-
-      var i_contain = Xinha.makeBtnImg(btn[1]);
-      var img = i_contain.firstChild;
-      Xinha.freeLater(i_contain);
-      Xinha.freeLater(img);
-      
-      el.appendChild(i_contain);
-
-      obj.imgel = img;      
-      obj.swapImage = function(newimg)
-      {
-        if ( typeof newimg != 'string' )
-        {
-          img.src = newimg[0];
-          img.style.position = 'relative';
-          img.style.top  = newimg[2] ? ('-' + (18 * (newimg[2] + 1)) + 'px') : '-18px';
-          img.style.left = newimg[1] ? ('-' + (18 * (newimg[1] + 1)) + 'px') : '-18px';
-        }
-        else
-        {
-          obj.imgel.src = newimg;
-          img.style.top = '0px';
-          img.style.left = '0px';
-        }
-      };
-      
-    }
-    else if( !el )
-    {
-      el = createSelect(txt);
-    }
-
-    return el;
-  }
-
-  var first = true;
-  for ( var i = 0; i < this.config.toolbar.length; ++i )
-  {
-    if ( !first )
-    {
-      // createButton("linebreak");
-    }
-    else
-    {
-      first = false;
-    }
-    if ( this.config.toolbar[i] === null )
-    {
-      this.config.toolbar[i] = ['separator'];
-    }
-    var group = this.config.toolbar[i];
-
-    for ( var j = 0; j < group.length; ++j )
-    {
-      var code = group[j];
-      var tb_cell;
-      if ( /^([IT])\[(.*?)\]/.test(code) )
-      {
-        // special case, create text label
-        var l7ed = RegExp.$1 == "I"; // localized?
-        var label = RegExp.$2;
-        if ( l7ed )
-        {
-          label = Xinha._lc(label);
-        }
-        tb_cell = document.createElement("td");
-        tb_row.appendChild(tb_cell);
-        tb_cell.className = "label";
-        tb_cell.innerHTML = label;
-      }
-      else if ( typeof code != 'function' )
-      {
-        var tb_element = createButton(code);
-        if ( tb_element )
-        {
-          tb_cell = document.createElement("td");
-          tb_cell.className = 'toolbarElement';
-          tb_row.appendChild(tb_cell);
-          tb_cell.appendChild(tb_element);
-        }
-        else if ( tb_element === null )
-        {
-          alert("FIXME: Unknown toolbar item: " + code);
-        }
-      }
-    }
-  }
-
-  if ( editor.config.flowToolbars )
-  {
-    toolbar.appendChild(Xinha._createToolbarBreakingElement());
-  }
-
-  return toolbar;
-};
-
-/** creates a button (i.e. container element + image)
- * @private
- * @return {DomNode} conteainer element
- */
-Xinha.makeBtnImg = function(imgDef, doc)
-{
-  if ( !doc )
-  {
-    doc = document;
-  }
-
-  if ( !doc._xinhaImgCache )
-  {
-    doc._xinhaImgCache = {};
-    Xinha.freeLater(doc._xinhaImgCache);
-  }
-
-  var i_contain = null;
-  if ( Xinha.is_ie && ( ( !doc.compatMode ) || ( doc.compatMode && doc.compatMode == "BackCompat" ) ) )
-  {
-    i_contain = doc.createElement('span');
-    // IE10 Quirks :-/
-    i_contain.style.display = 'inline-block';
-  }
-  else
-  {
-    i_contain = doc.createElement('div');
-    i_contain.style.position = 'relative';
-  }
-
-  i_contain.style.overflow = 'hidden';
-  i_contain.style.width = "18px";
-  i_contain.style.height = "18px";
-  i_contain.className = 'buttonImageContainer';
-
-  var img = null;
-  if ( typeof imgDef == 'string' )
-  {
-    if ( doc._xinhaImgCache[imgDef] )
-    {
-      img = doc._xinhaImgCache[imgDef].cloneNode();
-    }
-    else
-    {
-      if (Xinha.ie_version < 7 && /\.png$/.test(imgDef[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="'+imgDef+'")';
-		img.unselectable = 'on';
-      }
-      else
-      {
-        img = doc.createElement("img");
-        img.src = imgDef;
-      }
-    }
-  }
-  else
-  {
-    if ( doc._xinhaImgCache[imgDef[0]] )
-    {
-      img = doc._xinhaImgCache[imgDef[0]].cloneNode();
-    }
-    else
-    {
-      if (Xinha.ie_version < 7 && /\.png$/.test(imgDef[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="'+imgDef[0]+'")';
-		img.unselectable = 'on';
-      }
-      else
-      {
-        img = doc.createElement("img");
-        img.src = imgDef[0];
-      }
-      img.style.position = 'relative';
-    }
-    // @todo: Using 18 dont let us use a theme with its own icon toolbar height
-    //        and width. Probably better to calculate this value 18
-    //        var sizeIcon = img.width / nb_elements_per_image;
-    img.style.top  = imgDef[2] ? ('-' + (18 * (imgDef[2] + 1)) + 'px') : '-18px';
-    img.style.left = imgDef[1] ? ('-' + (18 * (imgDef[1] + 1)) + 'px') : '-18px';
-  }
-  i_contain.appendChild(img);
-  return i_contain;
-};
-/** creates the status bar 
- * @private
- * @return {DomNode} status bar
- */
-Xinha.prototype._createStatusBar = function()
-{
-  // TODO: Move styling into separate stylesheet
-  this.setLoadingMessage(Xinha._lc('Create Statusbar'));
-  var statusBar = document.createElement("div");
-  statusBar.style.position = "relative";
-  statusBar.className = "statusBar";
-  statusBar.style.width = "100%";
-  Xinha.freeLater(this, '_statusBar');
-
-  var widgetContainer = document.createElement("div");
-  widgetContainer.className = "statusBarWidgetContainer";
-  widgetContainer.style.position = "absolute";
-  widgetContainer.style.right = "0";
-  widgetContainer.style.top = "0";
-  widgetContainer.style.padding = "3px 3px 3px 10px";
-  statusBar.appendChild(widgetContainer);
-
-  // statusbar.appendChild(document.createTextNode(Xinha._lc("Path") + ": "));
-  // creates a holder for the path view
-  var statusBarTree = document.createElement("span");
-  statusBarTree.className = "statusBarTree";
-  if(Xinha.is_ios)
-  {
-    statusBarTree.innerHTML = Xinha._lc("Touch here first to activate editor.");
-  }
-  else
-  {
-    statusBarTree.innerHTML = Xinha._lc("Path") + ": ";
-  }
-
-  this._statusBarTree = statusBarTree;
-  Xinha.freeLater(this, '_statusBarTree');
-  statusBar.appendChild(statusBarTree);
-  var statusBarTextMode = document.createElement("span");
-  statusBarTextMode.innerHTML = Xinha.htmlEncode(Xinha._lc("You are in TEXT MODE.  Use the [<>] button to switch back to WYSIWYG."));
-  statusBarTextMode.style.display = "none";
-
-  this._statusBarTextMode = statusBarTextMode;
-  Xinha.freeLater(this, '_statusBarTextMode');
-  statusBar.appendChild(statusBarTextMode);
-
-  statusBar.style.whiteSpace = "nowrap";
-
-  var self = this;
-  this.notifyOn("before_resize", function(evt, size) {
-    self._statusBar.style.width = null;
-  });
-  this.notifyOn("resize", function(evt, size) {
-    // HACK! IE6 doesn't update the width properly when resizing if it's 
-    // given in pixels, but does hide the overflow content correctly when 
-    // using 100% as the width. (FF, Safari and IE7 all require fixed
-    // pixel widths to do the overflow hiding correctly.)
-    if (Xinha.is_ie && Xinha.ie_version == 6)
-    {
-      self._statusBar.style.width = "100%";
-    } 
-    else
-    {
-      var width = size['width'];
-      
-      // ticket:1601 fixed here by 2px adjustment for borders
-      //    and by setting box-sizing on .htmlarea .statusBar in Xinha.css
-      self._statusBar.style.width = (width-2) + "px";
-    }
-  });
-
-  this.notifyOn("modechange", function(evt, mode) {
-    // Loop through all registered status bar items
-    // and show them only if they're turned on for
-    // the new mode.
-    for (var i in self._statusWidgets)
-    {
-      var widget = self._statusWidgets[i];
-      for (var index=0; index<widget.modes.length; index++)
-      {
-        if (widget.modes[index] == mode.mode)
-        {
-          var found = true;
-        }
-      }
-      if (typeof found == 'undefined')
-      {
-        widget.block.style.display = "none";  
-      }
-      else
-      {
-        widget.block.style.display = "";
-      }
-    }
-  });
-
-  if ( !this.config.statusBar )
-  {
-    // disable it...
-    statusBar.style.display = "none";
-  }
-  return statusBar;
-};
-
-/** Registers and inserts a new block for a widget in the status bar
- @param id unique string identifer for this block
- @param modes list of modes this block should be shown in
-
- @returns reference to HTML element inserted into the status bar
- */
-Xinha.prototype.registerStatusWidget = function(id, modes)
-{
-  modes = modes || ['wysiwyg'];
-  if (!this._statusWidgets)
-  {
-    this._statusWidgets = {};
-  }
-
-  var block = document.createElement("div");
-  block.className = "statusBarWidget";
-  block = this._statusBar.firstChild.appendChild(block);
-
-  var showWidget = false;
-  for (var i=0; i<modes.length; i++)
-  {
-    if (modes[i] == this._editMode)
-    {
-      showWidget = true;
-    }
-  }
-  block.style.display = showWidget == true ? "" : "none";
-
-  this._statusWidgets[id] = {block: block, modes: modes};
-  return block;
-};
-
-/** Creates the Xinha object and replaces the textarea with it. Loads required files.
- *  @returns {Boolean}
- */
-Xinha.prototype.generate = function ()
-{
-  if ( !Xinha.isSupportedBrowser )
-  {
-    return;
-  }
-  
-  var i;
-  var editor = this;  // we'll need "this" in some nested functions
-  var url;
-  var found = false;
-  var links = document.getElementsByTagName("link");
-
-  if (!document.getElementById("XinhaCoreDesign"))
-  {
-    _editor_css = (typeof _editor_css == "string") ? _editor_css : "Xinha.css";
-    for(i = 0; i<links.length; i++)
-    {
-      if ( ( links[i].rel == "stylesheet" ) && ( links[i].href == _editor_url + _editor_css ) )
-      {
-        found = true;
-      }
-    }
-    if ( !found )
-    {
-      Xinha.loadStyle(_editor_css,null,"XinhaCoreDesign",true);
-    }
-  }
-  
-  if ( _editor_skin !== "" && !document.getElementById("XinhaSkin"))
-  {
-    found = false;
-    for(i = 0; i<links.length; i++)
-    {
-      if ( ( links[i].rel == "stylesheet" ) && ( links[i].href == _editor_url + 'skins/' + _editor_skin + '/skin.css' ) )
-      {
-        found = true;
-      }
-    }
-    if ( !found )
-    {
-      Xinha.loadStyle('skins/' + _editor_skin + '/skin.css',null,"XinhaSkin");
-    }
-  }
-  var callback = function() { editor.generate(); };
-  // Now load a specific browser plugin which will implement the above for us.
-  if (Xinha.is_ie)
-  {
-    url = _editor_url + 'modules/InternetExplorer/InternetExplorer.js';
-    if ( !Xinha.loadPlugins([{plugin:"InternetExplorer",url:url}], callback ) )
-    {            
-      return false;
-    }
-    if (!this.plugins.InternetExplorer)
-    {
-      editor._browserSpecificPlugin = editor.registerPlugin('InternetExplorer');
-    }
-  }
-  else if (Xinha.is_webkit)
-  {
-    url = _editor_url + 'modules/WebKit/WebKit.js';
-    if ( !Xinha.loadPlugins([{plugin:"WebKit",url:url}], callback ) )
-    {
-      return false;
-    }
-    if (!this.plugins.Webkit)
-    {
-      editor._browserSpecificPlugin = editor.registerPlugin('WebKit');
-    }
-  }
-  else if (Xinha.is_opera)
-  {
-    url = _editor_url + 'modules/Opera/Opera.js';
-    if ( !Xinha.loadPlugins([{plugin:"Opera",url:url}], callback ) )
-    {            
-      return false;
-    }
-    if (!this.plugins.Opera)
-    {
-      editor._browserSpecificPlugin = editor.registerPlugin('Opera');
-    }
-  }
-  else if (Xinha.is_gecko)
-  {
-    url = _editor_url + 'modules/Gecko/Gecko.js';
-    if ( !Xinha.loadPlugins([{plugin:"Gecko",url:url}], callback ) )
-    {            
-      return false;
-    }
-    if (!this.plugins.Gecko) 
-    {
-      editor._browserSpecificPlugin = editor.registerPlugin('Gecko');
-    }
-  }
-
-  if ( typeof Dialog == 'undefined' && !Xinha._loadback( _editor_url + 'modules/Dialogs/dialog.js', callback, this ) )
-  {    
-    return false;
-  }
-
-  if ( typeof Xinha.Dialog == 'undefined' &&  !Xinha._loadback( _editor_url + 'modules/Dialogs/XinhaDialog.js' , callback, this ) )
-  {    
-    return false;
-  }
-  
-  url = _editor_url + 'modules/FullScreen/full-screen.js';
-  if ( !Xinha.loadPlugins([{plugin:"FullScreen",url:url}], callback ))
-  {
-    return false;
-  }
-  
-  url = _editor_url + 'modules/ColorPicker/ColorPicker.js';
-  if ( !Xinha.loadPlugins([{plugin:"ColorPicker",url:url}], callback ) )
-  {
-    return false;
-  }
-  else if ( typeof Xinha.getPluginConstructor('ColorPicker') != 'undefined' && !this.plugins.colorPicker)
-  {
-    editor.registerPlugin('ColorPicker');
-  }
-
-  var toolbar = editor.config.toolbar;
-  for ( i = toolbar.length; --i >= 0; )
-  {
-    for ( var j = toolbar[i].length; --j >= 0; )
-    {
-      switch (toolbar[i][j])
-      {
-        case "popupeditor":
-        case "fullscreen":
-          if (!this.plugins.FullScreen) 
-          {
-            editor.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}], callback ) )
-          {
-            return false;
-          }
-          else if ( typeof Xinha.getPluginConstructor('InsertImage') != 'undefined' && !this.plugins.InsertImage)
-          {
-            editor.registerPlugin('InsertImage');
-          }
-        break;
-        case "createlink":
-          url = _editor_url + 'modules/CreateLink/link.js';
-          if ( typeof Xinha.getPluginConstructor('Linker') == 'undefined' && !Xinha.loadPlugins([{plugin:"CreateLink",url:url}], callback ))
-          {
-            return false;
-          }
-          else if ( typeof Xinha.getPluginConstructor('CreateLink') != 'undefined' && !this.plugins.CreateLink) 
-          {
-            editor.registerPlugin('CreateLink');
-          }
-        break;
-        case "inserttable":
-          url = _editor_url + 'modules/InsertTable/insert_table.js';
-          if ( !Xinha.loadPlugins([{plugin:"InsertTable",url:url}], callback ) )
-          {
-            return false;
-          }
-          else if ( typeof Xinha.getPluginConstructor('InsertTable') != 'undefined' && !this.plugins.InsertTable)
-          {
-            editor.registerPlugin('InsertTable');
-          }
-        break;
-        case "about":
-          url = _editor_url + 'modules/AboutBox/AboutBox.js';
-          if ( !Xinha.loadPlugins([{plugin:"AboutBox",url:url}], callback ) )
-          {
-            return false;
-          }
-          else if ( typeof Xinha.getPluginConstructor('AboutBox') != 'undefined' && !this.plugins.AboutBox)
-          {
-            editor.registerPlugin('AboutBox');
-          }
-        break;
-      }
-    }
-  }
-
-  // If this is gecko, set up the paragraph handling now
-  if ( Xinha.is_gecko &&  editor.config.mozParaHandler != 'built-in' )
-  {
-    if (  !Xinha.loadPlugins([{plugin:"EnterParagraphs",url: _editor_url + 'modules/Gecko/paraHandlerBest.js'}], callback ) )
-    {
-      return false;
-    }
-    if (!this.plugins.EnterParagraphs) 
-    {
-      editor.registerPlugin('EnterParagraphs');
-    }
-  }
-  var getHtmlMethodPlugin = this.config.getHtmlMethod == 'TransformInnerHTML' ? _editor_url + 'modules/GetHtml/TransformInnerHTML.js' :  _editor_url + 'modules/GetHtml/DOMwalk.js';
-
-  if ( !Xinha.loadPlugins([{plugin:"GetHtmlImplementation",url:getHtmlMethodPlugin}], callback))
-  {
-    return false;
-  }
-  else if (!this.plugins.GetHtmlImplementation)
-  {
-    editor.registerPlugin('GetHtmlImplementation');
-  }
-  function getTextContent(node)
-  {
-    return node.textContent || node.text;
-  }
-  if (_editor_skin)
-  {
-    this.skinInfo = {};
-    var skinXML = Xinha._geturlcontent(_editor_url + 'skins/' + _editor_skin + '/skin.xml', true);
-    if (skinXML)
-    {
-      var meta = skinXML.getElementsByTagName('meta');
-      for (i=0;i<meta.length;i++)
-      {
-        this.skinInfo[meta[i].getAttribute('name')] = meta[i].getAttribute('value');
-      }
-      var recommendedIcons = skinXML.getElementsByTagName('recommendedIcons');
-      if (!_editor_icons && recommendedIcons.length && getTextContent(recommendedIcons[0]))
-      {
-        _editor_icons = getTextContent(recommendedIcons[0]);
-      }
-    }
-  }
-  if (_editor_icons) 
-  {
-    var iconsXML = Xinha._geturlcontent(_editor_url + 'iconsets/' + _editor_icons + '/iconset.xml', true);
-
-    if (iconsXML)
-    {
-      var icons = iconsXML.getElementsByTagName('icon');
-      var icon, id, path, type, x, y;
-
-      for (i=0;i<icons.length;i++)
-      {
-        icon = icons[i];
-        id = icon.getAttribute('id');
-        
-        if (icon.getElementsByTagName(_editor_lang).length)
-        {
-          icon = icon.getElementsByTagName(_editor_lang)[0];
-        }
-        else
-        {
-          icon = icon.getElementsByTagName('default')[0];
-        }
-        path = getTextContent(icon.getElementsByTagName('path')[0]);
-        path = (!/^\//.test(path) ? _editor_url : '') + path;
-        type = icon.getAttribute('type');
-        if (type == 'map')
-        {
-          x = parseInt(getTextContent(icon.getElementsByTagName('x')[0]), 10);
-          y = parseInt(getTextContent(icon.getElementsByTagName('y')[0]), 10);
-          if (this.config.btnList[id]) 
-          {
-            this.config.btnList[id][1] = [path, x, y];
-          }
-          if (this.config.iconList[id]) 
-          {
-            this.config.iconList[id] = [path, x, y];
-          }
-          
-        }
-        else
-        {
-          if (this.config.btnList[id]) 
-          {
-            this.config.btnList[id][1] = path;
-          }
-          if (this.config.iconList[id]) 
-          {
-            this.config.iconList[id] = path;
-          }
-        }
-      }
-    }
-  }
-  
-  // create the editor framework, yah, table layout I know, but much easier
-  // to get it working correctly this way, sorry about that, patches welcome.
-  
-  this.setLoadingMessage(Xinha._lc('Generate Xinha framework'));
-  
-  this._framework =
-  {
-    'table':   document.createElement('table'),
-    'tbody':   document.createElement('tbody'), // IE will not show the table if it doesn't have a tbody!
-    'tb_row':  document.createElement('tr'),
-    'tb_cell': document.createElement('td'), // Toolbar
-
-    'tp_row':  document.createElement('tr'),
-    'tp_cell': this._panels.top.container,   // top panel
-
-    'ler_row': document.createElement('tr'),
-    'lp_cell': this._panels.left.container,  // left panel
-    'ed_cell': document.createElement('td'), // editor
-    'rp_cell': this._panels.right.container, // right panel
-
-    'bp_row':  document.createElement('tr'),
-    'bp_cell': this._panels.bottom.container,// bottom panel
-
-    'sb_row':  document.createElement('tr'),
-    'sb_cell': document.createElement('td')  // status bar
-
-  };
-  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';
-
-  // Put the cells in the rows        set col & rowspans
-  // note that I've set all these so that all panels are showing
-  // but they will be redone in sizeEditor() depending on which
-  // panels are shown.  It's just here to clarify how the thing
-  // is put togethor.
-  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;
-
-  // Put the rows in the table body
-  fw.tbody.appendChild(fw.tb_row);  // Toolbar
-  fw.tbody.appendChild(fw.tp_row); // Left, Top, Right panels
-  fw.tbody.appendChild(fw.ler_row);  // Editor/Textarea
-  fw.tbody.appendChild(fw.bp_row);  // Bottom panel
-  fw.tbody.appendChild(fw.sb_row);  // Statusbar
-
-  // and body in the table
-  fw.table.appendChild(fw.tbody);
-
-  var xinha = fw.table;
-  this._htmlArea = xinha;
-  Xinha.freeLater(this, '_htmlArea');
-  xinha.className = "htmlarea";
-
-    // create the toolbar and put in the area
-  fw.tb_cell.appendChild( this._createToolbar() );
-
-    // create the IFRAME & add to container
-  var iframe = document.createElement("iframe");
-  iframe.src = this.popupURL(editor.config.URIs.iframe_src);
-  iframe.id = "XinhaIFrame_" + this._textArea.id;
-  fw.ed_cell.appendChild(iframe);
-  this._iframe = iframe;
-  this._iframe.className = 'xinha_iframe';
-  Xinha.freeLater(this, '_iframe');
-  
-    // creates & appends the status bar
-  var statusbar = this._createStatusBar();
-  this._statusBar = fw.sb_cell.appendChild(statusbar);
-
-
-  // insert Xinha before the textarea.
-  var textarea = this._textArea;
-  textarea.parentNode.insertBefore(xinha, textarea);
-  textarea.className = 'xinha_textarea';
-
-  // extract the textarea and insert it into the xinha framework
-  Xinha.removeFromParent(textarea);
-  fw.ed_cell.appendChild(textarea);
-
-  // if another editor is activated while this one is in text mode, toolbar is disabled   
-  Xinha.addDom0Event(
-  this._textArea,
-  'click',
-  function()
-  {
-  	if ( Xinha._currentlyActiveEditor != this)
-  	{
-  	  editor.updateToolbar();
-  	}
-    return true;
-  });
-  
-  // Set up event listeners for saving the iframe content to the textarea
-  if ( textarea.form )
-  {
-    // onsubmit get the Xinha content and update original textarea.
-    Xinha.prependDom0Event(
-      this._textArea.form,
-      'submit',
-      function()
-      {
-        editor.firePluginEvent('onBeforeSubmit');
-        editor._textArea.value = editor.outwardHtml(editor.getHTML());
-        editor.firePluginEvent('onBeforeSubmitTextArea');
-        return true;
-      }
-    );
-
-    var initialTAContent = textarea.value;
-
-    // onreset revert the Xinha content to the textarea content
-    Xinha.prependDom0Event(
-      this._textArea.form,
-      'reset',
-      function()
-      {
-        editor.setHTML(editor.inwardHtml(initialTAContent));
-        editor.updateToolbar();
-        return true;
-      }
-    );
-
-    // attach onsubmit handler to form.submit()
-    // note: catch error in IE if any form element has id="submit"
-    if ( !textarea.form.xinha_submit )
-    {
-      try 
-      {
-        textarea.form.xinha_submit = textarea.form.submit;
-        textarea.form.submit = function() 
-        {
-          this.onsubmit();
-          this.xinha_submit();
-        };
-      } catch(ex) {}
-    }
-  }
-
-  // add a handler for the "back/forward" case -- on body.unload we save
-  // the HTML content into the original textarea and restore it in its place.
-  // apparently this does not work in IE?
-  Xinha.prependDom0Event(
-    window,
-    'unload',
-    function()
-    {
-      editor.firePluginEvent('onBeforeUnload');
-      textarea.value = editor.outwardHtml(editor.getHTML());
-      if (!Xinha.is_ie)
-      {
-        xinha.parentNode.replaceChild(textarea,xinha);
-      }
-      return true;
-    }
-  );
-
-  // Hide textarea
-  textarea.style.display = "none";
-
-  // Initalize size
-  editor.initSize();
-  this.setLoadingMessage(Xinha._lc('Finishing'));
-  // Add an event to initialize the iframe once loaded.
-  editor._iframeLoadDone = false;
-  if (iframe.src == 'javascript:\'\'' || iframe.src == '' || Xinha.is_opera)
-  {
-    editor.initIframe();
-  }
-  // I suspect we no longer need this and can just use editor.initIframe (certainly 
-  // iframe.src is javascritp:'' by default.  But I will leave this for posterity
-  // just in case
-  else 
-  {
-    Xinha._addEvent(
-      this._iframe,
-      'load',
-      function(e)
-      {
-        if ( !editor._iframeLoadDone )
-        {
-          editor._iframeLoadDone = true;
-          editor.initIframe();
-        }
-        return true;
-      }
-    );
-  }
-};
-
-/**
- * Size the editor according to the INITIAL sizing information.
- * config.width
- *    The width may be set via three ways
- *    auto    = the width is inherited from the original textarea
- *    toolbar = the width is set to be the same size as the toolbar
- *    <set size> = the width is an explicit size (any CSS measurement, eg 100em should be fine)
- *
- * config.height
- *    auto    = the height is inherited from the original textarea
- *    <set size> = an explicit size measurement (again, CSS measurements)
- *
- * config.sizeIncludesBars
- *    true    = the tool & status bars will appear inside the width & height confines
- *    false   = the tool & status bars will appear outside the width & height confines
- *
- * @private
- */
-
-Xinha.prototype.initSize = function()
-{
-  this.setLoadingMessage(Xinha._lc('Init editor size'));
-  var editor = this;
-  var width = null;
-  var height = null;
-
-  switch ( this.config.width )
-  {
-    case 'auto':
-      width = this._initial_ta_size.w;
-    break;
-
-    case 'toolbar':
-      width = this._toolBar.offsetWidth + 'px';
-    break;
-
-    default :
-      // @todo: check if this is better :
-      // width = (parseInt(this.config.width, 10) == this.config.width)? this.config.width + 'px' : this.config.width;
-      width = /[^0-9]/.test(this.config.width) ? this.config.width : this.config.width + 'px';
-    break;
-  }
-      // @todo: check if this is better :
-      // height = (parseInt(this.config.height, 10) == this.config.height)? this.config.height + 'px' : this.config.height;
-  height = this.config.height == 'auto' ? this._initial_ta_size.h : /[^0-9]/.test(this.config.height) ? this.config.height : this.config.height + 'px';
-  
-  this.sizeEditor(width, height, this.config.sizeIncludesBars, this.config.sizeIncludesPanels);
-
-  // why can't we use the following line instead ?
-//  this.notifyOn('panel_change',this.sizeEditor);
-  this.notifyOn('panel_change',function() { editor.sizeEditor(); });
-};
-
-/** Get the overall size of the editor, including toolbars and panels
- *  (if they are being considered)
- *
- *  This is used by sizeEditor to get the size of the area excluding toolbars
- *  when it sets the _htmlArea.size attribute first explicitly and then
- *  adds in toolbars/panels later.
- *
- */
-
-Xinha.prototype.getOverallSize = function(useStylePxSize)
-{
-  // Originally when sizeEditor was adjusting for panel/toolbar
-  // size after having set _htmlArea.style.width/height it always
-  // used the offsetWidth/Height, even if it set a px width/height
-  // on the style just before.
-  //
-  // In the interests of not-fixing-whats-not-broke, we are only
-  // going to look at the style.width/height pixel size if 
-  // this is in resizing mode.  It actually works ok for 
-  // non-resizable editors too but I have not tested old ones.
-  //
-  // Note that if you use offsetWidth/Height for a resizable 
-  // editor during resize, it works OK but for some reason I don't
-  // quite understand the minimum size you can reach (in Chrome)
-  // is not as small as when you observe style.width/height
-  
-  if(typeof useStylePxSize == 'undefined')
-  {
-    useStylePxSize = this.config.resizableEditor;
-  }
-  
-  var size = { w: 0, h: 0, width: 0, height:0, offsetWidth: 0, offsetHeight: 0 };
-  
-  if(useStylePxSize && this._htmlArea.style.width.match(/px/))
-  {
-    size.w = parseInt(this._htmlArea.style.width.replace(/px/,''));
-  }
-  else
-  {
-    size.w = this._htmlArea.offsetWidth;
-  }
-  
-  if(useStylePxSize && this._htmlArea.style.height.match(/px/))
-  {
-    size.h = parseInt(this._htmlArea.style.height.replace(/px/,''));
-  }
-  else
-  {
-    size.h = this._htmlArea.offsetHeight;
-  }
-  
-  size.offsetHeight = size.h;
-  size.height       = this._htmlArea.style.height;
-  size.offsetWidth  = size.w;
-  size.width        = this._htmlArea.style.width;
-  
-  return size;
-};
-
-/**
- *  Size the editor to a specific size, or just refresh the size (when window resizes for example)
- *  @param {string} width optional width (CSS specification)
- *  @param {string} height optional height (CSS specification)
- *  @param {Boolean} includingBars optional to indicate if the size should include or exclude tool & status bars
- *  @param {Boolean} includingPanels optional to indicate if the size should include or exclude panels
- */
-Xinha.prototype.sizeEditor = function(width, height, includingBars, includingPanels)
-{
-  if (this._risizing) 
-  {
-    return;
-  }
-  this._risizing = true;
-  
-  var framework = this._framework;
-  
-  this.notifyOf('before_resize', {width:width, height:height});
-  this.firePluginEvent('onBeforeResize', width, height);
-  // We need to set the iframe & textarea to 100% height so that the htmlarea
-  // isn't "pushed out" when we get it's height, so we can change them later.
-  this._iframe.style.height   = '100%';
-  //here 100% can lead to an effect that the editor is considerably higher in text mode
-  this._textArea.style.height = '1px';
-  
-  this._iframe.style.width    = '0px';
-  this._textArea.style.width  = '0px';
-
-  if ( includingBars !== null )
-  {
-    this._htmlArea.sizeIncludesToolbars = includingBars;
-  }
-  if ( includingPanels !== null )
-  {
-    this._htmlArea.sizeIncludesPanels = includingPanels;
-  }
-
-  if ( width )
-  {
-    this._htmlArea.style.width = width;
-    if ( !this._htmlArea.sizeIncludesPanels )
-    {
-      // Need to add some for l & r panels
-      var rPanel = this._panels.right;
-      if ( rPanel.on && rPanel.panels.length && Xinha.hasDisplayedChildren(rPanel.div) )
-      {
-        this._htmlArea.style.width = (this.getOverallSize().offsetWidth + parseInt(this.config.panel_dimensions.right, 10)) + 'px';
-      }
-
-      var lPanel = this._panels.left;
-      if ( lPanel.on && lPanel.panels.length && Xinha.hasDisplayedChildren(lPanel.div) )
-      {
-        this._htmlArea.style.width = (this.getOverallSize().offsetWidth + parseInt(this.config.panel_dimensions.left, 10)) + 'px';
-      }
-    }
-  }
-
-  if ( height )
-  {
-    this._htmlArea.style.height = height;
-    if ( !this._htmlArea.sizeIncludesToolbars )
-    {
-      // Need to add some for toolbars
-      this._htmlArea.style.height = (this.getOverallSize().offsetHeight + this._toolbar.offsetHeight + this._statusBar.offsetHeight) + 'px';
-    }
-
-    if ( !this._htmlArea.sizeIncludesPanels )
-    {
-      // Need to add some for t & b panels
-      var tPanel = this._panels.top;
-      if ( tPanel.on && tPanel.panels.length && Xinha.hasDisplayedChildren(tPanel.div) )
-      {
-        this._htmlArea.style.height = (this.getOverallSize().offsetHeight + parseInt(this.config.panel_dimensions.top, 10)) + 'px';
-      }
-
-      var bPanel = this._panels.bottom;
-      if ( bPanel.on && bPanel.panels.length && Xinha.hasDisplayedChildren(bPanel.div) )
-      {
-        this._htmlArea.style.height = (this.getOverallSize().offsetHeight + parseInt(this.config.panel_dimensions.bottom, 10)) + 'px';
-      }
-    }
-  }
-
-  // At this point we have this._htmlArea.style.width & this._htmlArea.style.height
-  // which are the size for the OUTER editor area, including toolbars and panels
-  // now we size the INNER area and position stuff in the right places.
-  width  = this._htmlArea.offsetWidth;
-  height = this._htmlArea.offsetHeight;
-  
-  
-
-  // Set colspan for toolbar, and statusbar, rowspan for left & right panels, and insert panels to be displayed
-  // into thier rows
-  var panels = this._panels;
-  var editor = this;
-  var col_span = 1;
-
-  function panel_is_alive(pan)
-  {
-    if ( panels[pan].on && panels[pan].panels.length && Xinha.hasDisplayedChildren(panels[pan].container) )
-    {
-      panels[pan].container.style.display = '';
-      return true;
-    }
-    // Otherwise make sure it's been removed from the framework
-    else
-    {
-      panels[pan].container.style.display='none';
-      return false;
-    }
-  }
-
-  if ( panel_is_alive('left') )
-  {
-    col_span += 1;      
-  }
-
-//  if ( panel_is_alive('top') )
-//  {
-    // NOP
-//  }
-
-  if ( panel_is_alive('right') )
-  {
-    col_span += 1;
-  }
-
-//  if ( panel_is_alive('bottom') )
-//  {
-    // NOP
-//  }
-
-  framework.tb_cell.colSpan = col_span;
-  framework.tp_cell.colSpan = col_span;
-  framework.bp_cell.colSpan = col_span;
-  framework.sb_cell.colSpan = col_span;
-
-  // Put in the panel rows, top panel goes above editor row
-  if ( !framework.tp_row.childNodes.length )
-  {
-    Xinha.removeFromParent(framework.tp_row);
-  }
-  else
-  {
-    if ( !Xinha.hasParentNode(framework.tp_row) )
-    {
-      framework.tbody.insertBefore(framework.tp_row, framework.ler_row);
-    }
-  }
-
-  // bp goes after the editor
-  if ( !framework.bp_row.childNodes.length )
-  {
-    Xinha.removeFromParent(framework.bp_row);
-  }
-  else
-  {
-    if ( !Xinha.hasParentNode(framework.bp_row) )
-    {
-      framework.tbody.insertBefore(framework.bp_row, framework.ler_row.nextSibling);
-    }
-  }
-
-  // finally if the statusbar is on, insert it
-  if ( !this.config.statusBar )
-  {
-    Xinha.removeFromParent(framework.sb_row);
-  }
-  else
-  {
-    if ( !Xinha.hasParentNode(framework.sb_row) )
-    {
-      framework.table.appendChild(framework.sb_row);
-    }
-  }
-
-  // Size and set colspans, link up the framework
-  framework.lp_cell.style.width  = this.config.panel_dimensions.left;
-  framework.rp_cell.style.width  = this.config.panel_dimensions.right;
-  framework.tp_cell.style.height = this.config.panel_dimensions.top;
-  framework.bp_cell.style.height = this.config.panel_dimensions.bottom;
-  framework.tb_cell.style.height = this._toolBar.offsetHeight + 'px';
-  framework.sb_cell.style.height = this._statusBar.offsetHeight + 'px';
-
-  var edcellheight = height - this._toolBar.offsetHeight - this._statusBar.offsetHeight;
-  if ( panel_is_alive('top') )
-  {
-    edcellheight -= parseInt(this.config.panel_dimensions.top, 10);
-  }
-  if ( panel_is_alive('bottom') )
-  {
-    edcellheight -= parseInt(this.config.panel_dimensions.bottom, 10);
-  }
-  this._iframe.style.height = edcellheight + 'px';  
-  
-  var edcellwidth = width;
-  if ( panel_is_alive('left') )
-  {
-    edcellwidth -= parseInt(this.config.panel_dimensions.left, 10);
-  }
-  if ( panel_is_alive('right') )
-  {
-    edcellwidth -= parseInt(this.config.panel_dimensions.right, 10);    
-  }
-  var iframeWidth = this.config.iframeWidth ? parseInt(this.config.iframeWidth,10) : null; 
-  this._iframe.style.width = (iframeWidth && iframeWidth < edcellwidth) ? iframeWidth + "px": edcellwidth + "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;
-};
-/** FIXME: Never used, what is this for? 
-* @param {string} side 
-* @param {Object}
-*/
-Xinha.prototype.registerPanel = function(side, object)
-{
-  if ( !side )
-  {
-    side = 'right';
-  }
-  this.setLoadingMessage('Register ' + side + ' panel ');
-  var panel = this.addPanel(side);
-  if ( object )
-  {
-    object.drawPanelIn(panel);
-  }
-};
-/** Creates a panel in the panel container on the specified side
-* @param {String} side the panel container to which the new panel will be added<br />
-*									Possible values are: "right","left","top","bottom"
-* @returns {DomNode} Panel div
-*/
-Xinha.prototype.addPanel = function(side)
-{
-  var div = document.createElement('div');
-  div.side = side;
-  if ( side == 'left' || side == 'right' )
-  {
-    div.style.width  = this.config.panel_dimensions[side];
-    if (this._iframe) 
-    {
-      div.style.height = this._iframe.style.height;
-    }
-  }
-  Xinha.addClasses(div, 'panel');
-  this._panels[side].panels.push(div);
-  this._panels[side].div.appendChild(div);
-
-  this.notifyOf('panel_change', {'action':'add','panel':div});
-  this.firePluginEvent('onPanelChange','add',div);
-  return div;
-};
-/** Removes a panel
-* @param {DomNode} panel object as returned by Xinha.prototype.addPanel()
-*/
-Xinha.prototype.removePanel = function(panel)
-{
-  this._panels[panel.side].div.removeChild(panel);
-  var clean = [];
-  for ( var i = 0; i < this._panels[panel.side].panels.length; i++ )
-  {
-    if ( this._panels[panel.side].panels[i] != panel )
-    {
-      clean.push(this._panels[panel.side].panels[i]);
-    }
-  }
-  this._panels[panel.side].panels = clean;
-  this.notifyOf('panel_change', {'action':'remove','panel':panel});
-  this.firePluginEvent('onPanelChange','remove',panel);
-};
-/** Hides a panel
-* @param {DomNode} panel object as returned by Xinha.prototype.addPanel()
-*/
-Xinha.prototype.hidePanel = function(panel)
-{
-  if ( panel && panel.style.display != 'none' )
-  {
-    try { var pos = this.scrollPos(this._iframe.contentWindow); } catch(e) { }
-    panel.style.display = 'none';
-    this.notifyOf('panel_change', {'action':'hide','panel':panel});
-    this.firePluginEvent('onPanelChange','hide',panel);
-    try { this._iframe.contentWindow.scrollTo(pos.x,pos.y); } catch(e) { }
-  }
-};
-/** Shows a panel
-* @param {DomNode} panel object as returned by Xinha.prototype.addPanel()
-*/
-Xinha.prototype.showPanel = function(panel)
-{
-  if ( panel && panel.style.display == 'none' )
-  {
-    try { var pos = this.scrollPos(this._iframe.contentWindow); } catch(e) {}
-    panel.style.display = '';
-    this.notifyOf('panel_change', {'action':'show','panel':panel});
-    this.firePluginEvent('onPanelChange','show',panel);
-    try { this._iframe.contentWindow.scrollTo(pos.x,pos.y); } catch(e) { }
-  }
-};
-/** Hides the panel(s) on one or more sides
-* @param {Array} sides the sides on which the panels shall be hidden
-*/
-Xinha.prototype.hidePanels = function(sides)
-{
-  if ( typeof sides == 'undefined' )
-  {
-    sides = ['left','right','top','bottom'];
-  }
-
-  var reShow = [];
-  for ( var i = 0; i < sides.length;i++ )
-  {
-    if ( this._panels[sides[i]].on )
-    {
-      reShow.push(sides[i]);
-      this._panels[sides[i]].on = false;
-    }
-  }
-  this.notifyOf('panel_change', {'action':'multi_hide','sides':sides});
-  this.firePluginEvent('onPanelChange','multi_hide',sides);
-};
-/** Shows the panel(s) on one or more sides
-* @param {Array} sides the sides on which the panels shall be hidden
-*/
-Xinha.prototype.showPanels = function(sides)
-{
-  if ( typeof sides == 'undefined' )
-  {
-    sides = ['left','right','top','bottom'];
-  }
-
-  var reHide = [];
-  for ( var i = 0; i < sides.length; i++ )
-  {
-    if ( !this._panels[sides[i]].on )
-    {
-      reHide.push(sides[i]);
-      this._panels[sides[i]].on = true;
-    }
-  }
-  this.notifyOf('panel_change', {'action':'multi_show','sides':sides});
-  this.firePluginEvent('onPanelChange','multi_show',sides);
-};
-/** Returns an array containig all properties that are set in an object
-* @param {Object} obj
-* @returns {Array}
-*/
-Xinha.objectProperties = function(obj)
-{
-  var props = [];
-  for ( var x in obj )
-  {
-    props[props.length] = x;
-  }
-  return props;
-};
-
-/** Checks if editor is active
- *<br />
- * EDITOR ACTIVATION NOTES:<br />
- *  when a page has multiple Xinha editors, ONLY ONE should be activated at any time (this is mostly to
- *  work around a bug in Mozilla, but also makes some sense).  No editor should be activated or focused
- *  automatically until at least one editor has been activated through user action (by mouse-clicking in
- *  the editor).
- * @private
- * @returns {Boolean}
- */
-Xinha.prototype.editorIsActivated = function()
-{
-  try
-  {
-    return Xinha.is_designMode ? this._doc.designMode == 'on' : this._doc.body.contentEditable;
-  }
-  catch (ex)
-  {
-    return false;
-  }
-};
-/**  We need to know that at least one editor on the page has been activated
-*    this is because we will not focus any editor until an editor has been activated
-* @private
-* @type {Boolean}
-*/
-Xinha._someEditorHasBeenActivated = false;
-/**  Stores a reference to the currently active editor
-* @private
-* @type {Xinha}
-*/
-Xinha._currentlyActiveEditor      = null;
-/** Enables one editor for editing, e.g. by a click in the editing area or after it has been 
- *  deactivated programmatically before 
- * @private
- * @returns {Boolean}
- */
-Xinha.prototype.activateEditor = function()
-{
-  if (this.currentModal) 
-  {
-    return;
-  }
-  // We only want ONE editor at a time to be active
-  if ( Xinha._currentlyActiveEditor )
-  {
-    if ( Xinha._currentlyActiveEditor == this )
-    {
-      return true;
-    }
-    Xinha._currentlyActiveEditor.deactivateEditor();
-  }
-
-  if ( Xinha.is_designMode && this._doc.designMode != 'on' )
-  {
-    try
-    {
-      // cannot set design mode if no display
-      if ( this._iframe.style.display == 'none' )
-      {
-        this._iframe.style.display = '';
-        this._doc.designMode = 'on';
-        this._iframe.style.display = 'none';
-      }
-      else
-      {
-        this._doc.designMode = 'on';
-      }
-
-      // Opera loses some of it's event listeners when the designMode is set to on.
-	  // the true just shortcuts the method to only set some listeners.
-      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 editor = this;
-  this.enableToolbar();
-};
-/** Disables the editor 
- * @private
- */
-Xinha.prototype.deactivateEditor = function()
-{
-  // If the editor isn't active then the user shouldn't use the toolbar
-  this.disableToolbar();
-
-  if(Xinha.is_ios)
-  {
-    this._statusBarTree.innerHTML = Xinha._lc("Touch here first to activate editor.");
-  }
-  else
-  {
-    this._statusBarTree.innerHTML = Xinha._lc("Path") + ": ";
-  }
-
-  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 )
-  {
-    // We just deactivated an editor that wasn't marked as the currentlyActiveEditor
-
-    return; // I think this should really be an error, there shouldn't be a situation where
-            // an editor is deactivated without first being activated.  but it probably won't
-            // hurt anything.
-  }
-
-  Xinha._currentlyActiveEditor = false;
-};
-/** Creates the iframe (editable area)
- * @private
- */
-Xinha.prototype.initIframe = function()
-{
-  this.disableToolbar();
-  var doc = null;
-  var editor = this;
-
-  // It is possible that we need to wait a bit more for the iframe
-  //  browsers vary a bit on how they treat the iframe load events
-  //  so even though we should just be able to listen to load, maybe
-  //  that doesn't work quite right, just waiting a bit if it fails
-  //  and then trying again seems like a good idea.
-  if(typeof editor._iframeWaitingRetries == 'undefined' )    
-  {
-    editor._iframeWaitingRetries = 10;
-  }
- 
-  // For each retry we lengthen the delay, just so we don't spam the console
-  //  with messages really
-  var retryDelay = (625 / (editor._iframeWaitingRetries * editor._iframeWaitingRetries ) ) * 50;
-  editor._iframeWaitingRetries--;
-
-  try
-  {
-    if ( editor._iframe.contentDocument )
-    {
-      this._doc = editor._iframe.contentDocument;        
-    }
-    else
-    {
-      this._doc = editor._iframe.contentWindow.document;
-    }
-    doc = this._doc;
-    // try later
-    if ( !doc )
-    {
-      if( editor._iframeWaitingRetries > 0 )
-      {
-        Xinha.debugMsg("Still waiting for Iframe...");
-        editor.setLoadingMessage(Xinha._lc("Waiting for Iframe to load..."));
-        setTimeout(function() { editor.initIframe(); }, retryDelay);
-        return false;
-      }
-      else
-      {
-        // Give up
-        Xinha.debugMsg("Xinha: Unable to access the Iframe document object, this may be the result of a Cross-Origin restriction, very slow network, or some other issue.", 'warn');
-        Xinha.debugMsg("You may wish to try changing xinha_config.URIs.iframe_src from "+editor.config.URIs.iframe_src+" to a url of a blank page on your server (eg '/blank.html') and see if that helps.", 'warn');
-        editor.setLoadingMessage(Xinha._lc("Error Loading Xinha.  Developers, check the Error Console for information."));
-        return false;
-      }
-    }
-  }
-  catch(ex)
-  { // try later
-    if(editor._iframeWaitingRetries > 0)
-    {
-      Xinha.debugMsg("Still waiting for Iframe...");
-      editor.setLoadingMessage(Xinha._lc("Waiting for Iframe to load..."));
-      setTimeout(function() { editor.initIframe(); }, retryDelay);
-      return false;
-    }
-    else
-    {
-      Xinha.debugMsg(ex, 'warn');
-      Xinha.debugMsg("Xinha: Unable to access the Iframe document object, this may be the result of a Cross-Origin restriction, very slow network, or some other issue.", 'warn');
-      Xinha.debugMsg("You may wish to try changing xinha_config.URIs.iframe_src from "+editor.config.URIs.iframe_src+" to a url of a blank page on your server (eg '/blank.html') and see if that helps.", 'warn');
-      editor.setLoadingMessage(Xinha._lc("Error Loading Xinha.  Developers, check the Error Console for information."));
-      return false;
-    }
-  }
-  
-  Xinha.freeLater(this, '_doc');
-
-  doc.open("text/html","replace");
-  var html = '', doctype;
-  if ( editor.config.browserQuirksMode === false )
-  {
-    doctype = '<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">';
-  }
-  else if ( editor.config.browserQuirksMode === true )
-  {
-    doctype = '';
-  }
-  else
-  {
-    doctype = Xinha.getDoctype(document);
-  }
-  
-  if ( !editor.config.fullPage )
-  {
-    html += doctype + "\n";
-    html += "<html>\n";
-    html += "<head>\n";
-    html += "<meta http-equiv=\"Content-Type\" content=\"text/html; charset=" + editor.config.charSet + "\">\n";
-    if ( typeof editor.config.baseHref != 'undefined' && editor.config.baseHref !== null )
-    {
-      html += "<base href=\"" + editor.config.baseHref + "\"/>\n";
-    }
-    
-    html += Xinha.addCoreCSS();
-    
-    if ( typeof editor.config.pageStyleSheets !== 'undefined' )
-    {
-      for ( var i = 0; i < editor.config.pageStyleSheets.length; i++ )
-      {
-        if ( editor.config.pageStyleSheets[i].length > 0 )
-        {
-          html += "<link rel=\"stylesheet\" type=\"text/css\" href=\"" + editor.config.pageStyleSheets[i] + "\">";
-          //html += "<style> @import url('" + editor.config.pageStyleSheets[i] + "'); </style>\n";
-        }
-      }
-    }
-    
-    if ( editor.config.pageStyle )
-    {
-      html += "<style type=\"text/css\">\n" + editor.config.pageStyle + "\n</style>";
-    }
-    
-    html += "</head>\n";
-    html += "<body" + (editor.config.bodyID ? (" id=\"" + editor.config.bodyID + "\"") : '') + (editor.config.bodyClass ? (" class=\"" + editor.config.bodyClass + "\"") : '') + ">\n";
-    html +=   editor.inwardHtml(editor._textArea.value);
-    html += "</body>\n";
-    html += "</html>";
-  }
-  else
-  {
-    html = editor.inwardHtml(editor._textArea.value);
-    if ( html.match(Xinha.RE_doctype) )
-    {
-      editor.setDoctype(RegExp.$1);
-      //html = html.replace(Xinha.RE_doctype, "");
-    }
-    
-    //Fix Firefox problem with link elements not in right place (just before head)
-    var match = html.match(/<link\s+[\s\S]*?["']\s*\/?>/gi);
-    html = html.replace(/<link\s+[\s\S]*?["']\s*\/?>\s*/gi, '');
-    if (match)
-    {
-      html = html.replace(/<\/head>/i, match.join('\n') + "\n</head>");
-    }
-  }
-  doc.write(html);
-  doc.close();
-  if ( this.config.fullScreen )
-  {
-    this._fullScreen();
-  }
-  this.setEditorEvents();
-
-
-  // If this IFRAME had been configured for autofocus, we'll focus it now,
-  // since everything needed to do so is now fully loaded.
-  if ((typeof editor.config.autofocus != "undefined") && editor.config.autofocus !== false &&
-      ((editor.config.autofocus == editor._textArea.id) || editor.config.autofocus == true))
-  {
-    editor.activateEditor();
-    editor.focusEditor();
-  }
-};
-  
-/**
- * Delay a function until the document is ready for operations.
- * See ticket:547
- * @public
- * @param {Function} f  The function to call once the document is ready
- */
-Xinha.prototype.whenDocReady = function(f)
-{
-  var e = this;
-  if ( this._doc && this._doc.body )
-  {
-    f();
-  }
-  else
-  {
-    setTimeout(function() { e.whenDocReady(f); }, 50);
-  }
-};
-
-
-/** Switches editor mode between wysiwyg and text (HTML)
- * @param {String} mode optional "textmode" or "wysiwyg", if omitted, toggles between modes.
- */
-Xinha.prototype.setMode = function(mode)
-{
-  var html;
-  if ( typeof mode == "undefined" )
-  {
-    mode = this._editMode == "textmode" ? "wysiwyg" : "textmode";
-  }
-  switch ( mode )
-  {
-    case "textmode":
-      this.firePluginEvent('onBeforeMode', 'textmode');
-      this._toolbarObjects.htmlmode.swapImage(this.config.iconList.wysiwygmode); 
-      this.setCC("iframe");
-      html = this.outwardHtml(this.getHTML());
-      this.setHTML(html);
-
-      // Hide the iframe
-      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.notifyOf('modechange', {'mode':'text'});
-      this.firePluginEvent('onMode', 'textmode');
-      this.findCC("textarea");
-    break;
-
-    case "wysiwyg":
-      this.firePluginEvent('onBeforeMode', 'wysiwyg');
-      this._toolbarObjects.htmlmode.swapImage([this.imgURL('images/ed_buttons_main.png'),7,0]); 
-      this.setCC("textarea");
-      html = this.inwardHtml(this.getHTML());
-      this.deactivateEditor();
-      this.setHTML(html);
-      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.notifyOf('modechange', {'mode':'wysiwyg'});
-      this.firePluginEvent('onMode', 'wysiwyg');
-      this.findCC("iframe");
-    break;
-
-    default:
-      alert("Mode <" + mode + "> not defined!");
-      return false;
-  }
-  this._editMode = mode;
-};
-/** Sets the HTML in fullpage mode. Actually the whole iframe document is rewritten.
- * @private
- * @param {String} html
- */
-Xinha.prototype.setFullHTML = function(html)
-{
-  var save_multiline = RegExp.multiline;
-  RegExp.multiline = true;
-  if ( html.match(Xinha.RE_doctype) )
-  {
-    this.setDoctype(RegExp.$1);
-   // html = html.replace(Xinha.RE_doctype, "");
-  }
-  RegExp.multiline = save_multiline;
-  // disabled to save body attributes see #459
-  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
-  {
-    // FIXME - can we do this without rewriting the entire document
-    //  does the above not work for IE?
-    var reac = this.editorIsActivated();
-    if ( reac )
-    {
-      this.deactivateEditor();
-    }
-    var html_re = /<html>((.|\n)*?)<\/html>/i;
-    html = html.replace(html_re, "$1");
-    this._doc.open("text/html","replace");
-    this._doc.write(html);
-    this._doc.close();
-    if ( reac )
-    {
-      this.activateEditor();
-    }        
-    this.setEditorEvents();
-    return true;
-  }
-};
-/** Initialize some event handlers
- * @private
- */
-Xinha.prototype.setEditorEvents = function(resetting_events_for_opera)
-{
-  var editor=this;
-  var doc = this._doc;
-
-  editor.whenDocReady(
-    function()
-    {
-      if(!resetting_events_for_opera) {
-      // if we have multiple editors some bug in Mozilla makes some lose editing ability
-      if(!Xinha.is_ios)
-      {
-      Xinha._addEvents(
-        doc,
-        ["mousedown"],
-        function()
-        {
-          editor.activateEditor();
-          return true;
-        }
-      );
-      }
-      else
-      {         
-        Xinha._addEvents(
-          editor._statusBar,
-          ["click"],
-          function()
-          {           
-            editor.activateEditor();
-            editor.focusEditor();
-            return true;
-          }
-        );
-      }
-
-      if (Xinha.is_ie)
-      { // #1019 Cusor not jumping to editable part of window when clicked in IE, see also #1039
-        Xinha._addEvent(
-        editor._doc.getElementsByTagName("html")[0],
-        "click",
-          function()
-          {
-            if (editor._iframe.contentWindow.event.srcElement.tagName.toLowerCase() == 'html') // if  clicked below the text (=body), the text cursor does not appear, see #1019
-            {
-               var r = editor._doc.body.createTextRange();
-               r.collapse();
-               r.select();
-               //setTimeout (function () { r.collapse();  r.select();},100); // won't do without timeout, dunno why
-             }
-             return true;
-          }
-        );
-      }
-      }
-
-      // intercept some events; for updating the toolbar & keyboard handlers
-      Xinha._addEvents(
-        doc,
-        ["keydown", "keypress", "mousedown", "mouseup", "drag"],
-        function (event)
-        {
-          return editor._editorEvent(Xinha.is_ie ? editor._iframe.contentWindow.event : event);
-        }
-      );
-      
-      Xinha._addEvents(
-        doc, 
-        ["dblclick"],
-        function (event)
-        {
-          return editor._onDoubleClick(Xinha.is_ie ? editor._iframe.contentWindow.event : event);
-        }
-      );
-      
-      if(resetting_events_for_opera) return;
-
-      // FIXME - this needs to be cleaned up and use editor.firePluginEvent
-      //  I don't like both onGenerate and onGenerateOnce, we should only
-      //  have onGenerate and it should only be called when the editor is 
-      //  generated (once and only once)
-      // check if any plugins have registered refresh handlers
-      for ( var i in editor.plugins )
-      {
-        var plugin = editor.plugins[i].instance;
-        Xinha.refreshPlugin(plugin);
-      }
-
-      // specific editor initialization
-      if ( typeof editor._onGenerate == "function" )
-      {
-        editor._onGenerate();
-      }
-      
-      if(Xinha.hasAttribute(editor._textArea, 'onxinhaready'))
-      {               
-        (function() { eval(editor._textArea.getAttribute('onxinhaready')) }).call(editor.textArea);
-      }
-      
-      //ticket #1407 IE8 fires two resize events on one actual resize, seemingly causing an infinite loop (but not  when Xinha is in an frame/iframe) 
-      Xinha.addDom0Event(window, 'resize', function(e) 
-      {
-        if (Xinha.ie_version > 7 && !window.parent)
-        {
-          if (editor.execResize)
-          {
-            editor.sizeEditor(); 
-            editor.execResize = false;
-          }
-          else
-          {
-            editor.execResize = true;
-          }
-        }
-        else
-        {
-          editor.sizeEditor(); 
-        }
-      });      
-      
-      
-      if(typeof editor.config.resizableEditor != 'undefined' && editor.config.resizableEditor)
-      {
-        editor._iframe.style.resize = 'both';
-        var lastResize    = [0,0];
-        Xinha._addEvent(editor._iframe.contentWindow, 'resize', function(){
-          if(lastResize[0] == editor._iframe.style.width && lastResize[1] == editor._iframe.style.height)
-          {
-            return;
-          }
-          
-          lastResize = [ editor._iframe.style.width, editor._iframe.style.height ];          
-          editor.sizeEditor(editor._iframe.style.width, editor._iframe.style.height, false, false);
-        });
-      }
-      
-    
-      editor.removeLoadingMessage();
-    }
-  );
-};
-  
-/***************************************************
- *  Category: PLUGINS
- ***************************************************/
-/** Plugins may either reside in the golbal scope (not recommended) or in Xinha.plugins. 
- *  This function looks in both locations and is used to check the loading status and finally retrieve the plugin's constructor
- * @private
- * @type {Function|undefined}
- * @param {String} pluginName
- */
-Xinha.getPluginConstructor = function(pluginName)
-{
-  return Xinha.plugins[pluginName] || window[pluginName];
-};
-
-/** Create the specified plugin and register it with this Xinha
- *  return the plugin created to allow refresh when necessary.<br />
- *  <strong>This is only useful if Xinha is generated without using Xinha.makeEditors()</strong>
- */
-Xinha.prototype.registerPlugin = function()
-{
-  if (!Xinha.isSupportedBrowser)
-  {
-    return;
-  }
-  var plugin = arguments[0];
-
-  // We can only register plugins that have been succesfully loaded
-  if ( plugin === null || typeof plugin == 'undefined' || (typeof plugin == 'string' && Xinha.getPluginConstructor(plugin) == 'undefined') )
-  {
-    return false;
-  }
-  var args = [];
-  for ( var i = 1; i < arguments.length; ++i )
-  {
-    args.push(arguments[i]);
-  }
-  return this.registerPlugin2(plugin, args);
-};
-/** This is the variant of the function above where the plugin arguments are
- * already packed in an array.  Externally, it should be only used in the
- * full-screen editor code, in order to initialize plugins with the same
- * parameters as in the opener window.
- * @private
- */
-Xinha.prototype.registerPlugin2 = function(plugin, args)
-{
-  if ( typeof plugin == "string" && typeof Xinha.getPluginConstructor(plugin) == 'function' )
-  {
-    var pluginName = plugin;
-    plugin = Xinha.getPluginConstructor(plugin);
-  }
-  if ( typeof plugin == "undefined" )
-  {
-    /* FIXME: This should never happen. But why does it do? */
-    return false;
-  }
-  if (!plugin._pluginInfo) 
-  {
-    plugin._pluginInfo = 
-    {
-      name: pluginName
-    };
-  }
-  var obj;
-  if ( (typeof plugin == 'function') && (obj = new plugin(this, args)) )
-  {
-    var clone = {};
-    var info = plugin._pluginInfo;
-    for ( var i in info )
-    {
-      clone[i] = info[i];
-    }
-    clone.instance = obj;
-    clone.args = args;
-    this.plugins[plugin._pluginInfo.name] = clone;
-    return obj;
-  }
-  else
-  {
-    Xinha.debugMsg("Can't register plugin " + plugin.toString() + ".", 'warn');
-  }
-};
-
-
-/** Dynamically returns the directory from which the plugins are loaded<br />
- *  This could be overridden to change the dir<br />
- *  @TODO: Wouldn't this be better as a config option?
- * @private
- * @param {String} pluginName
- * @param {Boolean} return the directory for an unsupported plugin
- * @returns {String} path to plugin
- */
-Xinha.getPluginDir = function(plugin, forceUnsupported)
-{
-  if (Xinha.externalPlugins[plugin])
-  {
-    return Xinha.externalPlugins[plugin][0];
-  }
-  
-  // This is ued by multiStageLoader when it's trying to find a plugin
-  // after it's tried the normal directory, so as long as it's in the pluginManifest
-  // then this shouldn't be hit, but just incase we will respect this request
-  if (forceUnsupported)
-  {
-    return _editor_url + "unsupported_plugins/" + plugin ;
-  }
-  
-  // Just in case we fudge the pluginManifest for a given plugin
-  // pull the directory from there
-  if(typeof Xinha.pluginManifest[plugin] != 'undefined')
-  {
-    return Xinha.pluginManifest[plugin].url.replace(/\/[a-zA-Z0-9_-]+\.js$/, '');
-  }
-  
-  if (forceUnsupported ||
-      // If the plugin is fully loaded, it's supported status is already set.
-      (Xinha.getPluginConstructor(plugin) && (typeof Xinha.getPluginConstructor(plugin).supported != 'undefined') && !Xinha.getPluginConstructor(plugin).supported))
-  {
-    return _editor_url + "unsupported_plugins/" + plugin ;
-  }
-  return _editor_url + "plugins/" + plugin ;
-};
-/** Static function that loads the given plugin
- * @param {String} pluginName
- * @param {Function} callback function to be called when file is loaded
- * @param {String} plugin_file URL of the file to load
- * @returns {Boolean} true if plugin loaded, false otherwise
- */
-Xinha.loadPlugin = function(pluginName, callback, url)
-{
-  if (!Xinha.isSupportedBrowser) 
-  {
-    return;
-  }
-  Xinha.setLoadingMessage (Xinha._lc("Loading plugin $plugin", 'Xinha', {plugin: pluginName}));
-
-  // Might already be loaded
-  if ( typeof Xinha.getPluginConstructor(pluginName) != 'undefined' )
-  {
-    if ( callback )
-    {
-      callback(pluginName);
-    }
-    return true;
-  }
-  Xinha._pluginLoadStatus[pluginName] = 'loading';
-
-  /** This function will try to load a plugin in multiple passes.  It tries to
-   * load the plugin from either the plugin or unsupported directory, using
-   * both naming schemes in this order:
-   * 1. /plugins -> CurrentNamingScheme
-   * 2. /plugins -> old-naming-scheme
-   * 3. /unsupported -> CurrentNamingScheme
-   * 4. /unsupported -> old-naming-scheme
-   */
-  function multiStageLoader(stage,pluginName)
-  {
-    var nextstage, dir, file, success_message;
-    switch (stage)
-    {
-      case 'start':
-        nextstage = 'old_naming';
-        dir = Xinha.getPluginDir(pluginName);
-        file = pluginName + ".js";
-        break;
-      case 'old_naming':
-        nextstage = 'unsupported';
-        dir = Xinha.getPluginDir(pluginName);
-        file = pluginName.replace(/([a-z])([A-Z])([a-z])/g, function (str, l1, l2, l3) { return l1 + "-" + l2.toLowerCase() + l3; }).toLowerCase() + ".js";
-        success_message = 'You are using an obsolete naming scheme for the Xinha plugin '+pluginName+'. Please rename '+file+' to '+pluginName+'.js';
-        break;
-      case 'unsupported':
-        nextstage = 'unsupported_old_name';
-        dir = Xinha.getPluginDir(pluginName, true);
-        file = pluginName + ".js";
-        success_message = 'You are using the unsupported Xinha plugin '+pluginName+'. If you wish continued support, please see http://trac.xinha.org/wiki/Documentation/UnsupportedPlugins';
-        break;
-      case 'unsupported_old_name':
-        nextstage = '';
-        dir = Xinha.getPluginDir(pluginName, true);
-        file = pluginName.replace(/([a-z])([A-Z])([a-z])/g, function (str, l1, l2, l3) { return l1 + "-" + l2.toLowerCase() + l3; }).toLowerCase() + ".js";
-        success_message = 'You are using the unsupported Xinha plugin '+pluginName+'. If you wish continued support, please see http://trac.xinha.org/wiki/Documentation/UnsupportedPlugins';
-        break;
-      default:
-        Xinha._pluginLoadStatus[pluginName] = 'failed';
-        Xinha.debugMsg('Xinha was not able to find the plugin '+pluginName+'. Please make sure the plugin exists.', 'warn');
-        Xinha.debugMsg('If '+pluginName+' is located in unsupported_plugins you should also check unsupported_plugins/.htaccess for possible access restrictions.', 'warn');
-        
-        return;
-    }
-    var url = dir + "/" + file;
-
-    // This is a callback wrapper that allows us to set the plugin's status
-    // once it loads.
-    function statusCallback(pluginName)
-    {
-      Xinha.getPluginConstructor(pluginName).supported = stage.indexOf('unsupported') !== 0;
-      callback(pluginName);
-    }
-
-    // To speed things up, we start loading the script file before pinging it.
-    // If the load fails, we'll just clean up afterwards.
-    Xinha._loadback(url, statusCallback, this, pluginName); 
-
-    Xinha.ping(url,
-               // On success, we'll display a success message if there is one.
-               function()
-               {
-                 if (success_message) 
-                 {
-                   Xinha.debugMsg(success_message);
-                 }
-               },
-               // On failure, we'll clean up the failed load and try the next stage
-               function()
-               {
-                 Xinha.removeFromParent(document.getElementById(url));
-                 multiStageLoader(nextstage, pluginName);
-               });
-  }
-  
-  if(!url)
-  {
-    if (Xinha.externalPlugins[pluginName])
-    {
-      Xinha._loadback(Xinha.externalPlugins[pluginName][0]+Xinha.externalPlugins[pluginName][1], callback, this, pluginName);
-    }
-    else if(Xinha.pluginManifest[pluginName])
-    {
-      Xinha._loadback(Xinha.pluginManifest[pluginName].url, callback, this, pluginName);
-    }
-    else
-    {
-      var editor = this;
-      multiStageLoader('start',pluginName);
-    }
-  }
-  else
-  {
-    Xinha._loadback(url, callback, this, pluginName);
-  }
-  
-  return false;
-};
-/** Stores a status for each loading plugin that may be one of "loading","ready", or "failed"
- * @private
- * @type {Object} 
- */
-Xinha._pluginLoadStatus = {};
-/** Stores the paths to plugins that are not in the default location
- * @private
- * @type {Object}
- */
-Xinha.externalPlugins = {};
-/** The namespace for plugins
- * @private
- * @type {Object}
- */
-Xinha.plugins = {};
-
-/** Static function that loads the plugins (see xinha_plugins in NewbieGuide)
- * @param {Array} plugins
- * @param {Function} callbackIfNotReady function that is called repeatedly until all files are
- * @param {String} optional url URL of the plugin file; obviously plugins should contain only one item if url is given
- * @returns {Boolean} true if all plugins are loaded, false otherwise
- */
-Xinha.loadPlugins = function(plugins, callbackIfNotReady,url)
-{
-  if (!Xinha.isSupportedBrowser) 
-  {
-    return;
-  }
-  //Xinha.setLoadingMessage (Xinha._lc("Loading plugins"));
-  var m,i;
-  for (i=0;i<plugins.length;i++)
-  {
-    if (typeof plugins[i] == 'object')
-    {
-      m = plugins[i].url.match(/(.*)(\/[^\/]*)$/);
-      Xinha.externalPlugins[plugins[i].plugin] = [m[1],m[2]];
-      plugins[i] = plugins[i].plugin;
-    }
-  }
-  
-  // Rip the ones that are loaded and look for ones that have failed
-  var retVal = true;
-  var nuPlugins = Xinha.cloneObject(plugins);
-  for (i=0;i<nuPlugins.length;i++ )
-  {
-    var p = nuPlugins[i];
-    
-    if (p == 'FullScreen' && !Xinha.externalPlugins.FullScreen)
-    {
-      continue; //prevent trying to load FullScreen plugin from the plugins folder
-    } 
-   
-    if ( typeof Xinha._pluginLoadStatus[p] == 'undefined')
-    {
-      // Load it
-      Xinha.loadPlugin(p,
-        function(plugin)
-        {
-          Xinha.setLoadingMessage (Xinha._lc("Finishing"));
-
-          if ( typeof Xinha.getPluginConstructor(plugin) != 'undefined' )
-          {
-            Xinha._pluginLoadStatus[plugin] = 'ready';
-          }
-          else
-          {
-            Xinha._pluginLoadStatus[plugin] = 'failed';
-          }
-        }, url);
-      retVal = false;
-    }
-    else if ( Xinha._pluginLoadStatus[p] == 'loading')
-    {
-      retVal = false;
-    }
-  }
-  
-  // All done, just return
-  if ( retVal )
-  {
-    return true;
-  }
-
-  // Waiting on plugins to load, return false now and come back a bit later
-  // if we have to callback
-  if ( callbackIfNotReady )
-  {
-    setTimeout(function() 
-    { 
-      if ( Xinha.loadPlugins(plugins, callbackIfNotReady) ) 
-      { 
-        callbackIfNotReady(); 
-      } 
-    }, 50);
-  }
-  return retVal;
-};
-
-// 
-/** Refresh plugin by calling onGenerate or onGenerateOnce method.
- * @private
- * @param {PluginInstance} plugin
- */
-Xinha.refreshPlugin = function(plugin)
-{
-  if ( plugin && typeof plugin.onGenerate == "function" )
-  {
-    plugin.onGenerate();
-  }
-  if ( plugin && typeof plugin.onGenerateOnce == "function" )
-  {
-    //#1392: in fullpage mode this function is called recusively by setFullHTML() when it is used to set the editor content
-	// this is a temporary fix, that should better be handled by a better implemetation of setFullHTML
-	plugin._ongenerateOnce = plugin.onGenerateOnce;
-    delete(plugin.onGenerateOnce);
-	plugin._ongenerateOnce();
-	delete(plugin._ongenerateOnce);
-  }
-};
-
-/** Call a method of all plugins which define the method using the supplied arguments.<br /><br />
- *
- *  Example: <code>editor.firePluginEvent('onExecCommand', 'paste')</code><br />
- *           The plugin would then define a method<br />
- *           <code>PluginName.prototype.onExecCommand = function (cmdID, UI, param) {do something...}</code><br /><br />
- *           The following methodNames are currently available:<br />
- *  <table border="1">
- *    <tr>
- *       <th>methodName</th><th>Parameters</th>
- *     </tr>
- *     <tr>
- *       <td>onExecCommand</td><td> cmdID, UI, param</td>
- *     </tr>
- *     <tr>
- *       <td>onKeyPress</td><td>ev</td>
- *     </tr> 
- *     <tr>
- *       <td>onMouseDown</td><td>ev</td>
- *     </tr>
- * </table><br /><br />
- *  
- *  The browser specific plugin (if any) is called last.  The result of each call is 
- *  treated as boolean.  A true return means that the event will stop, no further plugins
- *  will get the event, a false return means the event will continue to fire.
- *
- *  @param {String} methodName
- *  @param {mixed} arguments to pass to the method, optional [2..n] 
- *  @returns {Boolean}
- */
-
-Xinha.prototype.firePluginEvent = function(methodName)
-{
-  // arguments is not a real array so we can't just .shift() it unfortunatly.
-  var argsArray = [ ];
-  for(var i = 1; i < arguments.length; i++)
-  {
-    argsArray[i-1] = arguments[i];
-  }
-  
-  for ( i in this.plugins )
-  {
-    var plugin = this.plugins[i].instance;
-    
-    if(i == 'Events')
-    {
-      // 'Events' is a dummy plugin for events passed into config.Events
-      //   so make sure we actually reference that config object in case
-      //   it had been overwritten entirely (ticket:1602)
-      plugin = this.config.Events;
-    }
-
-    // Skip the browser specific plugin
-    if (plugin == this._browserSpecificPlugin) 
-    {
-      continue;
-    }
-    if ( plugin && typeof plugin[methodName] == "function" )
-    {
-      var thisArg = (i == 'Events') ? this : plugin;
-      if ( plugin[methodName].apply(thisArg, argsArray) )
-      {
-        return true;
-      }
-    }
-  }
-  
-  // Now the browser speific
-  plugin = this._browserSpecificPlugin;
-  if ( plugin && typeof plugin[methodName] == "function" )
-  {
-    if ( plugin[methodName].apply(plugin, argsArray) )
-    {
-      return true;
-    }
-  }
-  return false;
-};
-/** Adds a stylesheet to the document
- * @param {String} style name of the stylesheet file
- * @param {String} plugin optional name of a plugin; if passed this function looks for the stylesheet file in the plugin directory 
- * @param {String} id optional a unique id for identifiing the created link element, e.g. for avoiding double loading 
- *                 or later removing it again
- */
-Xinha.loadStyle = function(style, plugin, id,prepend)
-{
-  var url = _editor_url || '';
-  if ( plugin )
-  {
-    url = Xinha.getPluginDir( plugin ) + "/";
-  }
-  url += style;
-  // @todo: would not it be better to check the first character instead of a regex ?
-  // if ( typeof style == 'string' && style.charAt(0) == '/' )
-  // {
-  //   url = style;
-  // }
-  if ( /^\//.test(style) )
-  {
-    url = style;
-  }
-  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 (prepend && head.getElementsByTagName('link')[0])
-  {
-    head.insertBefore(link,head.getElementsByTagName('link')[0]);
-  }
-  else
-  {
-    head.appendChild(link);
-  }
-  
-};
-
-/** Adds a script to the document
- *
- * Warning: Browsers may cause the script to load asynchronously.
- *
- * @param {String} style name of the javascript file
- * @param {String} plugin optional name of a plugin; if passed this function looks for the stylesheet file in the plugin directory 
- *
- */
-Xinha.loadScript = function(script, plugin, callback)
-{
-  var url = _editor_url || '';
-  if ( plugin )
-  {
-    url = Xinha.getPluginDir( plugin ) + "/";
-  }
-  url += script;
-  // @todo: would not it be better to check the first character instead of a regex ?
-  // if ( typeof style == 'string' && style.charAt(0) == '/' )
-  // {
-  //   url = style;
-  // }
-  if ( /^\//.test(script) )
-  {
-    url = script;
-  }
-  
-  Xinha._loadback(url, callback);
-  
-};
-
-/** Load one or more assets, sequentially, where an asset is a CSS file, or a javascript file.
- *  
- * Example Usage:
- *
- * Xinha.includeAssets( 'foo.css', 'bar.js', [ 'foo.css', 'MyPlugin' ], { type: 'text/css', url: 'foo.php', plugin: 'MyPlugin } );
- *
- * Alternative usage, use Xinha.includeAssets() to make a loader, then use loadScript, loadStyle and whenReady methods
- * on your loader object as and when you wish, you can chain the calls if you like.
- *
- * You may add any number of callbacks using .whenReady() multiple times.
- *
- *   var myAssetLoader = Xinha.includeAssets();
- *       myAssetLoader.loadScript('foo.js', 'MyPlugin')
- *                    .loadStyle('foo.css', 'MyPlugin')
- *                    .loadScriptOnce('bar.js', 'MyPlugin')
- *                    .loadScriptIf( true, 'narf.js', 'MyPlugin')
- *                    .loadScriptOnceIf( false, 'zort.js', 'MyPlugin')
- *                    .loadStyleIf( 1 > 0, 'flurp.css', 'MyPlugin')
- *                    .whenReady(function(){ doSomethingCool(); });
- * 
- */
-
-Xinha.includeAssets = function()
-{
-  var assetLoader = { pendingAssets: [ ], loaderRunning: false, loaderPaused: false, loadedAssets: [ ] };
-  
-  assetLoader.callbacks = [ ];
-  
-  assetLoader.isAlreadyLoaded = function(url, plugin)
-  {
-    for(var i = 0; i < this.loadedAssets.length; i++)
-    {
-      if(this.loadedAssets[i].url == url && this.loadedAssets[i].plugin == plugin)
-      {
-        if(!this.loaderRunning) this.loadNext();
-        return this; // Already done (or in process)
-      }
-    }
-    
-    for(var i = 0; i < this.pendingAssets.length; i++)
-    {
-      if(this.pendingAssets[i].url == url && this.pendingAssets[i].plugin == plugin)
-      {
-        if(!this.loaderRunning) this.loadNext();
-        return this; // Already pending
-      }
-    }
-    
-    return false;
-  };
-  
-  assetLoader.loadNext = function()
-  {  
-    var self = this;
-    this.loaderRunning = true;
-    
-    if(this.pendingAssets.length)
-    {
-      if(this.loaderPaused)
-      {
-        this.loaderRunning = false;
-        return;
-      }
-      var nxt = this.pendingAssets[0];
-      this.pendingAssets.splice(0,1); // Remove 1 element
-      switch(nxt.type)
-      {
-        case 'command/abort':
-          if((typeof nxt.condition != 'function' && nxt.condition) || (typeof nxt.condition == 'function' && nxt.condition()))
-          {
-            // Abort is in the context of the chained loader, we might have more things added
-            //  in our own list and those should continue to be executed
-            nxt.chainLoader.abort();
-          }
-          else
-          {
-            nxt.chainLoader.resume();
-          }
-          return this.loadNext();
-
-        case 'text/css':
-          this.loadedAssets.push(nxt);
-          Xinha.loadStyle(nxt.url, nxt.plugin);
-          return this.loadNext();
-        
-        case 'text/javascript':          
-          this.loadedAssets.push(nxt);
-          Xinha.loadScript(nxt.url, nxt.plugin, function() { self.loadNext(); });
-          return this;
-      }
-    }
-    else
-    {
-      this.loaderRunning = false;
-      this.runCallback();      
-      return this;
-    }
-  };
-  
-  assetLoader.loadScriptAlways = function(url, plugin)
-  {
-    if(!url) return this;
-    
-    var self = this;
-    
-    this.pendingAssets.push({ 'type': 'text/javascript', 'url': url, 'plugin': plugin });
-    if(!this.loaderRunning) this.loadNext();
-    
-    return this;
-  };
-  
-  assetLoader.loadScriptOnce = function(url, plugin)
-  {
-    if(this.isAlreadyLoaded(url, plugin)) 
-    {
-      return this;
-    }
-        
-    return this.loadScriptAlways(url, plugin);
-  }
-  
-  assetLoader.loadScript = function(url, plugin)
-  {
-    return this.loadScriptOnce(url, plugin);
-  };
-  
-  assetLoader.loadStyleAlways = function(url, plugin)
-  {
-    var self = this;
-    
-    this.pendingAssets.push({ 'type': 'text/css', 'url': url, 'plugin': plugin });
-    if(!this.loaderRunning) this.loadNext();
-    
-    return this;    
-  };
-  
-  assetLoader.loadStyleOnce = function(url, plugin)
-  {
-    if(this.isAlreadyLoaded(url, plugin)) 
-    {
-      return this;
-    }
-        
-    return this.loadStyleAlways(url, plugin);
-  };
-  
-  assetLoader.loadStyle = function(url, plugin)
-  {
-    return this.loadStyleOnce(url, plugin);
-  };
-  
-  assetLoader.whenReady = function(callback) 
-  {
-    this.callbacks.push(callback);    
-    if(!this.loaderRunning) this.loadNext();
-    
-    return this;    
-  };
-  
-  assetLoader.runCallback = function()
-  {
-    while(this.callbacks.length)
-    { 
-      var _callback = this.callbacks.splice(0,1);
-      _callback[0]();
-      _callback = null;
-    }
-    return this;
-  };
-  
-  assetLoader.loadScriptIf = function(condition, url, plugin)
-  {
-    if(condition) this.loadScript(url, plugin);
-    return this;
-  };
-  
-  assetLoader.loadScriptOnceIf = function(condition, url, plugin)
-  {
-    if(condition) this.loadScriptOnce(url, plugin);
-    return this;
-  };
-  
-  assetLoader.loadStyleIf = function(condition, url, plugin)
-  {
-    if(condition) this.loadStyle(url, plugin);
-    return this;
-  };
-    
-  assetLoader.abortIf = function(condition)
-  {
-    // We use a dummy asset to insert, and return a chainable loader which will be started 
-    //  only if the condition is met (evaluated after previous assets have been loaded)
-    // 
-    // Note that this means you can do
-    //  
-    //  myAssetLoader.loadScript('blah.js')
-    //               .abortIf(function(){ return true ; } )
-    //               .loadStyle('blah.css');
-    //
-    //  myAssetLoader.loadScript('foo.js');
-    //  
-    // and even though the first chain was aborted after loading blah.js and blah.css 
-    //   never gets loaded, foo.js still does get loaded because it's in a different 
-    //   chain of assets.
-    //
-    // For a  practical example, see loadLibrary where jQuery is tested after it loads
-    //  and if it doesn't then the chained (assuming jQuery) scripts are not loaded.
-    //
-    var waitAsset = { type: 'command/abort', condition: condition, url: null, plugin: null, chainLoader: Xinha.includeAssets() };
-    this.pendingAssets.push( waitAsset );
-    waitAsset.chainLoader.pause();
-    return waitAsset.chainLoader;
-  };
-  
-  assetLoader.pause = function() 
-  {
-    this.loaderPaused = true;
-  };
-  
-  assetLoader.resume = function() 
-  {
-    this.loaderPaused = false;
-    if(!this.loaderRunning) this.loadNext();
-  };
-  
-  assetLoader.abort = function()
-  {
-    this.pendingAssets = [ ];
-    this.callbacks     = [ ];
-    this.loaderPaused = false;
-    return this;
-  };
-  
-  for(var i = 0 ; i < arguments.length; i++)
-  {
-    if(typeof arguments[i] == 'string')
-    {
-      if(arguments[i].match(/\.css$/i))
-      {
-        assetLoader.loadStyle(arguments[i]);
-      }
-      else 
-      {
-        assetLoader.loadScript(arguments[i]);
-      }
-    }
-    else if(arguments[i].type)
-    {
-      if(arguments[i].type.match(/text\/css/i))
-      {
-        assetLoader.loadStyle(arguments[i].url, arguments[i].plugin);
-      }
-      else if(arguments[i].type.match(/text\/javascript/i))
-      {
-        assetLoader.loadScript(arguments[i].url, arguments[i].plugin);
-      }
-    }
-    else if(arguments[i].length >= 1)
-    {
-      if(arguments[i][0].match(/\.css$/i))
-      {
-        assetLoader.loadStyle(arguments[i][0], arguments[i][1]);
-      }
-      else 
-      {
-        assetLoader.loadScript(arguments[i][0], arguments[i][1]);
-      }
-    }
-  }
-  
-  return assetLoader;
-}
-
-Xinha._libraryAssetLoader = Xinha.includeAssets();
-Xinha.loadLibrary = function(libraryName, minVersion, maxVersion)
-{
-  switch(libraryName.toLowerCase())
-  {
-    case 'jquery':
-      if(typeof jQuery == 'undefined')
-      {
-        // jQuery can be problematic if it (jQuery itself) fails to load
-        //  due to old browsers, so we will return a chained loader which
-        //  aborts anything chained on it if jQuery doesn't come into 
-        //  existence properly.
-        return Xinha._libraryAssetLoader.loadScriptOnce('libraries/jquery-3.3.1.js')
-                                        .abortIf(function(){ return typeof jQuery == 'undefined'; });
-      }
-      break;
-      
-    case 'mootools':
-      if(typeof MooTools == 'undefined')
-      {
-        Xinha._libraryAssetLoader.loadScriptOnce('libraries/MooTools-Core-1.6.0.js')
-                                 .loadScriptOnce('libraries/MooTools-More-1.6.0.js');
-      }
-      break;
-      
-    default:
-      Xinha.debugMsg("Unknown library "+libraryName+", libraries need to be handled by Xinha.loadLibrary, add code there.", 'warn'); 
-      break;
-  }
-  
-  // We return the loader so that the callee can do whenReady() on it
-  //  if they want.
-  return Xinha._libraryAssetLoader;
-}
-
-/***************************************************
- *  Category: EDITOR UTILITIES
- ***************************************************/
-/** Utility function: Outputs the structure of the edited document */
-Xinha.prototype.debugTree = function()
-{
-  var ta = document.createElement("textarea");
-  ta.style.width = "100%";
-  ta.style.height = "20em";
-  ta.value = "";
-  function debug(indent, str)
-  {
-    for ( ; --indent >= 0; )
-    {
-      ta.value += " ";
-    }
-    ta.value += str + "\n";
-  }
-  function _dt(root, level)
-  {
-    var tag = root.tagName.toLowerCase(), i;
-    var ns = Xinha.is_ie ? root.scopeName : root.prefix;
-    debug(level, "- " + tag + " [" + ns + "]");
-    for ( i = root.firstChild; i; i = i.nextSibling )
-    {
-      if ( i.nodeType == 1 )
-      {
-        _dt(i, level + 2);
-      }
-    }
-  }
-  _dt(this._doc.body, 0);
-  document.body.appendChild(ta);
-};
-/** Extracts the textual content of a given node
- * @param {DomNode} el
- */
-
-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;
-};
-/** Cleans dirty HTML from MS word; always cleans the whole editor content
- *  @TODO: move this in a separate file
- *  @TODO: turn this into a static function that cleans a given string
- */
-Xinha.prototype._wordClean = function()
-{
-  var editor = this;
-  var stats =
-  {
-    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 stats_txt =
-  {
-    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 stats )
-    {
-      if ( stats_txt[i] )
-      {
-        txt += stats_txt[i] + stats[i] + "\n";
-      }
-    }
-    txt += "\nInitial document length: " + stats.orig_len + "\n";
-    txt += "Final document length: " + editor._doc.body.innerHTML.length + "\n";
-    txt += "Clean-up took " + ((new Date().getTime() - stats.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("class");
-        ++stats.mso_class;
-      }
-    }
-  }
-
-  function clearStyle(node)
-  {
-    var declarations = node.style.cssText.split(/\s*;\s*/);
-    for ( var i = declarations.length; --i >= 0; )
-    {
-      if ( /^mso|^tab-stops/i.test(declarations[i]) || /^margin\s*:\s*0..\s+0..\s+0../i.test(declarations[i]) )
-      {
-        ++stats.mso_style;
-        declarations.splice(i, 1);
-      }
-    }
-    node.style.cssText = declarations.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);
-      ++stats.mso_elmts;
-      return true;
-    }
-    return false;
-  }
-
-  function checkEmpty(el)
-  {
-    // @todo : check if this is quicker
-    //  if (!['A','SPAN','B','STRONG','I','EM','FONT'].contains(el.tagName) && !el.firstChild)
-    if ( /^(a|span|b|strong|i|em|font|div|p)$/i.test(el.tagName) && !el.firstChild)
-    {
-      Xinha.removeFromParent(el);
-      ++stats.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)))
-        {
-          // Nowadays, Word spits out tags like '<o:something />'.  Since the
-          // document being cleaned might be HTML4 and not XHTML, this tag is
-          // interpreted as '<o:something /="/">'.  For HTML tags without
-          // closing elements (e.g. IMG) these two forms are equivalent.  Since
-          // HTML does not recognize these tags, however, they end up as
-          // parents of elements that should be their siblings.  We reparent
-          // the children and remove them from the document.
-          for (var index=i.childNodes && i.childNodes.length-1; i.childNodes && i.childNodes.length && i.childNodes[index]; --index)
-          {
-            if (i.nextSibling)
-            {
-              i.parentNode.insertBefore(i.childNodes[index],i.nextSibling);
-            }
-            else
-            {
-              i.parentNode.appendChild(i.childNodes[index]);
-            }
-          }
-          Xinha.removeFromParent(i);
-          continue;
-        }
-        if (checkEmpty(i))
-        {
-          continue;
-        }
-        if (removeElements(i))
-        {
-          continue;
-        }
-      }
-      else if (i.nodeType == 8)
-      {
-        // 8 is a comment node, and can contain conditional comments, which
-        // will be interpreted by IE as if they were not comments.
-        if (/(\s*\[\s*if\s*(([gl]te?|!)\s*)?(IE|mso)\s*(\d+(\.\d+)?\s*)?\]>)/.test(i.nodeValue))
-        {
-          // We strip all conditional comments directly from the tree.
-          Xinha.removeFromParent(i);
-          ++stats.cond_comm;
-        }
-      }
-    }
-    return true;
-  }
-  parseTree(this._doc.body);
-  // showStats();
-  // this.debugTree();
-  // this.setHTML(this.getHTML());
-  // this.setHTML(this.getInnerHTML());
-  // this.forceRedraw();
-  this.updateToolbar();
-};
-
-/** Removes &lt;font&gt; tags; always cleans the whole editor content
- *  @TODO: move this in a separate file
- *  @TODO: turn this into a static function that cleans a given string
- */
-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');
-};
-
-/** Sometimes the display has to be refreshed to make DOM changes visible (?) (Gecko bug?)  */
-Xinha.prototype.forceRedraw = function()
-{
-  this._doc.body.style.visibility = "hidden";
-  this._doc.body.style.visibility = "";
-  // this._doc.body.innerHTML = this.getInnerHTML();
-};
-
-/** Focuses the iframe window. 
- * @returns {document} a reference to the editor document
- */
-Xinha.prototype.focusEditor = function()
-{
-  switch (this._editMode)
-  {
-    // notice the try { ... } catch block to avoid some rare exceptions in FireFox
-    // (perhaps also in other Gecko browsers). Manual focus by user is required in
-    // case of an error. Somebody has an idea?
-    case "wysiwyg" :
-      try
-      {
-        // We don't want to focus the field unless at least one field has been activated.
-        if ( Xinha._someEditorHasBeenActivated )
-        {
-          this.activateEditor(); // Ensure *this* editor is activated
-          this._iframe.contentWindow.focus(); // and focus it
-        }
-      } catch (ex) {}
-    break;
-    case "textmode":
-      try
-      {
-        this._textArea.focus();
-      } catch (e) {}
-    break;
-    default:
-      alert("ERROR: mode " + this._editMode + " is not defined");
-  }
-  return this._doc;
-};
-
-/** Takes a snapshot of the current text (for undo)
- * @private
- */
-Xinha.prototype._undoTakeSnapshot = function()
-{
-  ++this._undoPos;
-  if ( this._undoPos >= this.config.undoSteps )
-  {
-    // remove the first element
-    this._undoQueue.shift();
-    --this._undoPos;
-  }
-  
-  var snapshotData = { 
-    'txt'        : null,
-    'caretInBody': false
-  };
-  
-  
-  // Caret preservation, when you hit undo, ideally put the caret back where it was.
-  // To accomplish this we figure out what NODE (Text Node typically) and offset into 
-  // it had the caret save this into the parent element of that node if it has one
-  // as an attribute, and attach a classname to be able to find it again
-  // then in the actual undo function we look for that class name after dropping 
-  // the HTML back into place, and reverse the process
-  
-  // Note that IE <11 does not support this, FF <3.6 won't either, 
-  // nor Safari <5.1, Chrome I dont' know it does currently I don't know how long ago
-  // Opera same, don't know how long but it works currently
-  // If a browser doesn't work with it, it won't cause a problem, it just won't 
-  // preserve the caret.
-  
-  try
-  {
-    // Insert a marker so we know where we are
-    var sel = this.getSelection();
-    var caretNode    = sel.focusNode;
-    if(caretNode)
-    {
-      var caretOffset  = sel.focusOffset
-      var rng = this.createRange(sel);
-      var caretParent   = this.getParentElement(sel);
-      
-      var caretRestorationData = false;
-      
-      switch(caretNode.nodeType)
-      {
-        case 3:  // TEXT
-        case 4:  // CDATA
-        case 8:  // COMMENT
-          // We need to record which child node the focus node is of the parent
-          //  default to the end
-          var whichChild = caretParent.childNodes.length-1;
-          for(var i = 0; i < caretParent.childNodes.length; i++)
-          {
-            if(caretParent.childNodes[i] == caretNode)
-            {
-              whichChild = i;
-            }
-          }
-          caretRestorationData = {
-            caretChild:   whichChild,
-            caretOffset:  caretOffset
-          };
-          break;
-        
-        case 1:
-          // Ehhhm, not sure.  This would be the case if the selection is an image, table whatever
-          //
-          // For example <p><img></p> with img selected you get caretNode = img, caretParent = p, 
-          // caretOffset = 0 (0th child of the p)
-          //
-          // I was going to make this handled so it would select the image again, but actually
-          // I think it works just fine without this, it feels natural-enough anyway.
-          break;
-      }
-      
-      if(caretRestorationData)
-      {
-        if(caretParent == this._doc.body)
-        {
-          // Body is tricky because it won't be included in the snapshot or restoration
-          // unless fullPage mode is being used, since there is only one body then we
-          // can record it in the snapshot data and we know where to put it in undo
-          snapshotData.caretInBody            = true;
-          snapshotData.caretRestorationData   = JSON.stringify(caretRestorationData);
-        }
-        else
-        {
-          // For other elements encode the caret data in the element itself
-          // so we can be sure we are looking at the right one when we find it
-          Xinha.addClass(caretParent, 'xinha-undo-caret');
-          caretParent.setAttribute('xinha-undo-caret', JSON.stringify(caretRestorationData));
-        }
-      }
-      
-      // Debug helper
-      //console.log({n: caretNode, p: caretOffset, r: rng, e: caretParent});
-    }
-  }
-  catch(e)
-  {
-    // Browser doesn't support something.  I'm not going to try and support
-    // very old browsers for this caret preservation feature
-    
-    // Old IE doesn't support
-    if(Xinha.is_gecko || Xinha.is_webkit)
-    {
-      Xinha.debugMsg('Caret preservation code for undo snapshot failed. If your browser is modern, developers need to check it out in XinhaCore.js (search for caret preservation).','warn');
-    }
-  }
-  
-  // use the faster method (getInnerHTML);
-  var take = true;
-  snapshotData.txt = this.getInnerHTML();
-  
-  // Find all carets we might have added (in theory, 0 or 1, but always a possibility of more)
-  var existingCarets = Xinha.getElementsByClassName(this._doc.body, 'xinha-undo-caret');
-  
-  // Remove them all
-  for(var i = 0; i < existingCarets.length; i++)
-  {
-    Xinha.removeClass(existingCarets[i], 'xinha-undo-caret');
-    existingCarets[i].removeAttribute('xinha-undo-caret');
-  }
-    
-  if ( this._undoPos > 0 )
-  {
-    take = (this._undoQueue[this._undoPos - 1].txt != snapshotData.txt);
-  }
-  if ( take )
-  {
-    this._undoQueue[this._undoPos] = snapshotData;
-  }
-  else
-  {
-    this._undoPos--;
-  }
-};
-/** Custom implementation of undo functionality
- * @private
- */
-Xinha.prototype.undo = function()
-{
-  if ( this._undoPos > 0 )
-  {
-    var snapshotData = this._undoQueue[--this._undoPos];
-    if ( snapshotData.txt )
-    {
-      this.setHTML(snapshotData.txt);
-      this._restoreCaretForUndoRedo(snapshotData);
-    }
-    else
-    {
-      ++this._undoPos;
-    }
-  }
-};
-
-/** Custom implementation of redo functionality
- * @private
- */
-Xinha.prototype.redo = function()
-{
-  if ( this._undoPos < this._undoQueue.length - 1 )
-  {
-    var snapshotData = this._undoQueue[++this._undoPos];
-    if ( snapshotData.txt )
-    {
-      this.setHTML(snapshotData.txt);
-      this._restoreCaretForUndoRedo(snapshotData);
-    }
-    else
-    {
-      --this._undoPos;
-    }
-  }
-};
-
-/** Used by undo and redo to restore a saved caret position.
- * 
- *  Undo and redo must have already set the html when they call this.
- * 
- * @private
- * @param mixed snapshotData as recorded by _undoTakeSnapshot
- */
-
-Xinha.prototype._restoreCaretForUndoRedo = function(snapshotData)
-{
-  // Caret restoration
-  try
-  {
-    // If the snapped caret was actually in the body as it's parent
-    //  (ie text with no containing element except body)
-    // push that data back into the body element so we can treat it as
-    // any other element
-    if(snapshotData.caretInBody)
-    {
-      Xinha.addClass(this._doc.body, 'xinha-undo-caret');
-      this._doc.body.setAttribute('xinha-undo-caret', snapshotData.caretRestorationData);
-    }
-    
-    // Find the caret data we might have recorded in the html
-    var caretParents = Xinha.getElementsByClassName(this._doc.body,'xinha-undo-caret');
-    
-    // Body itself may be the one
-    if(Xinha._hasClass(this._doc.body, 'xinha-undo-caret'))
-    {
-      caretParents[caretParents.length] = this._doc.body;
-    }
-            
-    // Just in case some bug happened and there was more than one caret saved
-    //  we will do them all to clear them, but there should only really be 0 or 1
-    for(var i = 0; i < caretParents.length; i++)
-    {
-      if(caretParents[i].getAttribute('xinha-undo-caret').length)
-      {
-        var caretRestorationData = JSON.parse(caretParents[i].getAttribute('xinha-undo-caret'));
-        
-        if(caretParents[i].childNodes.length > caretRestorationData.caretChild)
-        {
-          var rng = this.createRange();
-          rng.setStart(caretParents[i].childNodes[caretRestorationData.caretChild], caretRestorationData.caretOffset);
-          rng.collapse(true); // collapse to the start, although end would be ok I think, should be the same
-          
-          var sel = this.getSelection();
-          sel.removeAllRanges();
-          sel.addRange(rng);
-        }
-      }
-      
-      Xinha.removeClass(caretParents[i], 'xinha-undo-caret');
-      caretParents[i].removeAttribute('xinha-undo-caret');
-    }
-  }
-  catch(e)
-  {
-    // Browser doesn't support something, I'm not going to try and 
-    //  implement this on old browsers.
-    if(Xinha.is_gecko || Xinha.is_webkit)
-    {
-      Xinha.debugMsg('Caret restoration code for undo failed. If your browser is modern, developers should check it out in XinhaCore.js (search for caret restoration).','warn');
-    }
-  }
-}
-
-/** Disables (greys out) the buttons of the toolbar
- * @param {Array} except this array contains ids of toolbar objects that will not be disabled
- */
-Xinha.prototype.disableToolbar = function(except)
-{
-  if ( this._timerToolbar )
-  {
-    clearTimeout(this._timerToolbar);
-  }
-  if ( typeof except == 'undefined' )
-  {
-    except = [ ];
-  }
-  else if ( typeof except != 'object' )
-  {
-    except = [except];
-  }
-
-  for ( var i in this._toolbarObjects )
-  {
-    var btn = this._toolbarObjects[i];
-    if ( except.contains(i) )
-    {
-      continue;
-    }
-    // prevent iterating over wrong type
-    if ( typeof btn.state != 'function' )
-    {
-      continue;
-    }
-    btn.state("enabled", false);
-  }
-};
-/** Enables the toolbar again when disabled by disableToolbar() */
-Xinha.prototype.enableToolbar = function()
-{
-  this.updateToolbar();
-};
-
-/** Updates enabled/disable/active state of the toolbar elements, the statusbar and other things
- *  This function is called on every key stroke as well as by a timer on a regular basis.<br />
- *  Plugins have the opportunity to implement a prototype.onUpdateToolbar() method, which will also
- *  be called by this function.
- * @param {Boolean} noStatus private use Exempt updating of statusbar
- */
-// FIXME : this function needs to be splitted in more functions.
-// It is actually to heavy to be understable and very scary to manipulate
-Xinha.prototype.updateToolbar = function(noStatus)
-{
-  if (this.suspendUpdateToolbar)
-  {
-    return;
-  }
-  var doc = this._doc;
-  var text = (this._editMode == "textmode");
-  var ancestors = null;
-  if ( !text )
-  {
-    ancestors = this.getAllAncestors();
-    if ( this.config.statusBar && !noStatus )
-    {
-      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 = ancestors.length; --i >= 0; )
-      {
-        var el = ancestors[i];
-        if ( !el )
-        {
-          // hell knows why we get here; this
-          // could be a classic example of why
-          // it's good to check for conditions
-          // that are impossible to happen ;-)
-          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()
-          {
-            // TODO: add context menu here
-            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(0xbb)));
-        }
-        Xinha.freeLater(a);
-      }
-    }
-  }
-
-  for ( var cmd in this._toolbarObjects )
-  {
-    var btn = this._toolbarObjects[cmd];
-    var inContext = true;
-    // prevent iterating over wrong type
-    if ( typeof btn.state != 'function' )
-    {
-      continue;
-    }
-    if ( btn.context && !text )
-    {
-      var contexts = typeof btn.context == 'object' ? btn.context : [ btn.context ];
-      for(var context_i = 0; context_i < contexts.length; context_i++)
-      {
-        inContext = false;
-        var context = contexts[context_i];
-        var attrs = [];
-        if ( /(.*)\[(.*?)\]/.test(context) )
-        {
-          context = RegExp.$1;
-          attrs = RegExp.$2.split(",");
-        }
-        context = context.toLowerCase();
-        var match = (context == "*");
-        for ( var k = 0; k < ancestors.length; ++k )
-        {
-          if ( !ancestors[k] )
-          {
-            // the impossible really happens.
-            continue;
-          }
-          if ( match || ( ancestors[k].tagName.toLowerCase() == context ) )
-          {
-            inContext = true;
-            var contextSplit = null;
-            var att = null;
-            var comp = null;
-            var attVal = null;
-            for ( var ka = 0; ka < attrs.length; ++ka )
-            {
-              contextSplit = attrs[ka].match(/(.*)(==|!=|===|!==|>|>=|<|<=)(.*)/);
-              att = contextSplit[1];
-              comp = contextSplit[2];
-              attVal = contextSplit[3];
-
-              if (!eval(ancestors[k][att] + comp + attVal))
-              {
-                inContext = false;
-                break;
-              }
-            }
-            if ( inContext )
-            {
-              break;
-            }
-          }
-        }
-        
-        if(inContext) break;
-      }
-    }
-    btn.state("enabled", (!text || btn.text) && inContext);
-    if ( typeof cmd == "function" )
-    {
-      continue;
-    }
-    // look-it-up in the custom dropdown boxes
-    var dropdown = this.config.customSelects[cmd];
-    if ( ( !text || btn.text ) && ( typeof dropdown != "undefined" ) )
-    {
-      dropdown.refresh(this);
-      continue;
-    }
-    switch (cmd)
-    {
-      case "fontname":
-      case "fontsize":
-        if ( !text )
-        {
-          try
-          {
-            var value = ("" + doc.queryCommandValue(cmd)).toLowerCase();
-            if ( !value )
-            {
-              btn.element.selectedIndex = 0;
-              break;
-            }
-
-            // HACK -- retrieve the config option for this
-            // combo box.  We rely on the fact that the
-            // variable in config has the same name as
-            // button name in the toolbar.
-            var options = this.config[cmd];
-            var selectedValue = null;
-            for ( var j in options )
-            {
-            // FIXME: the following line is scary.
-              // console.log(j + ': ' + options[j].replace(/,\s*/g, ', ').substr(0, value.length).toLowerCase() + ' =? ' + value);
-              
-              if ( ( j.toLowerCase() == value ) || ( options[j].substr(0, value.length).toLowerCase() == value ) )
-              {
-                selectedValue = options[j];
-                break;
-              }
-              
-              // The fontname is troublesome, 'foo,bar' may become 'foo, bar' in the element
-              // and 'foo bar, foobar' may become '"foo bar", foobar'
-              
-              if(cmd == 'fontname')
-              {
-                var fixedOpt = options[j].replace(/,\s*/g, ', ');
-                fixedOpt= fixedOpt.replace(/(^|,\s)([a-z]+(\s[a-z]+)+)(,|$)/, '$1"$2"$4');
-                
-                // Debugging to work out why things are not matching!
-                // console.log(fixedOpt.substr(0, value.length).toLowerCase() + '=?' + value );
-                
-                if ( ( fixedOpt.substr(0, value.length).toLowerCase() == value ) )
-                {
-                  selectedValue = options[j];
-                  break;
-                }
-              }
-            }
-            
-            if(selectedValue != null)
-            {
-              // Find the selected value in the toolbar element
-              for(var i = 0; i < this._toolbarObjects[cmd].element.options.length; i++)
-              {
-                if(this._toolbarObjects[cmd].element.options[i].value == selectedValue)
-                {
-                  this._toolbarObjects[cmd].element.selectedIndex = i;
-                  break;
-                }
-              }
-            }
-            else
-            {
-              this._toolbarObjects[cmd].element.selectedIndex = 0;
-            }
-          } catch(ex) {}
-        }
-      break;
-
-      // It's better to search for the format block by tag name from the
-      //  current selection upwards, because IE has a tendancy to return
-      //  things like 'heading 1' for 'h1', which breaks things if you want
-      //  to call your heading blocks 'header 1'.  Stupid MS.
-      case "formatblock":
-        var blocks = [];
-        for ( var indexBlock in this.config.formatblock )
-        {
-	  var blockname = this.config.formatblock[indexBlock];
-          // prevent iterating over wrong type
-          if ( typeof blockname  == 'string' )
-          {
-            blocks[blocks.length] = this.config.formatblockDetector[blockname] || blockname;
-          }
-        }
-
-        var match = this._getFirstAncestorAndWhy(this.getSelection(), blocks);
-        var deepestAncestor = match[0];
-
-        if ( deepestAncestor )
-        {
-          // Find the selected value in the toolbar element
-          deepestAncestor = deepestAncestor.tagName.toLowerCase();
-          for(var i = 0; i < this._toolbarObjects[cmd].element.options.length; i++)
-          {
-            if(this._toolbarObjects[cmd].element.options[i].value == deepestAncestor)
-            {
-              this._toolbarObjects[cmd].element.selectedIndex = i;
-              break;
-            }
-          }
-        }
-        else
-        {
-          btn.element.selectedIndex = 0;
-        }
-      break;
-
-      case "textindicator":
-        if ( !text )
-        {
-          try
-          {
-            var style = btn.element.style;
-            style.backgroundColor = Xinha._makeColor(doc.queryCommandValue(Xinha.is_ie ? "backcolor" : "hilitecolor"));
-            if ( /transparent/i.test(style.backgroundColor) )
-            {
-              // Mozilla
-              style.backgroundColor = Xinha._makeColor(doc.queryCommandValue("backcolor"));
-            }
-            style.color = Xinha._makeColor(doc.queryCommandValue("forecolor"));
-            style.fontFamily = doc.queryCommandValue("fontname");
-            style.fontWeight = doc.queryCommandState("bold") ? "bold" : "normal";
-            style.fontStyle = doc.queryCommandState("italic") ? "italic" : "normal";
-          } catch (ex) {
-            // alert(e + "\n\n" + cmd);
-          }
-        }
-      break;
-
-      case "htmlmode":
-        btn.state("active", text);
-      break;
-
-      case "lefttoright":
-      case "righttoleft":
-        var eltBlock = this.getParentElement();
-        while ( eltBlock && !Xinha.isBlockElement(eltBlock) )
-        {
-          eltBlock = eltBlock.parentNode;
-        }
-        if ( eltBlock )
-        {
-          btn.state("active", (eltBlock.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;
-    }
-  }
-  // take undo snapshots
-  if ( this._customUndo && !this._timerUndo )
-  {
-    this._undoTakeSnapshot();
-    var editor = this;
-    this._timerUndo = setTimeout(function() { editor._timerUndo = null; }, this.config.undoTimeout);
-  }
-  this.firePluginEvent('onUpdateToolbar');
-};
-
-/** Returns a editor object referenced by the id or name of the textarea or the textarea node itself
- * For example to retrieve the HTML of an editor made out of the textarea with the id "myTextArea" you would do<br />
- * <code>
- *	 var editor = Xinha.getEditor("myTextArea");
- *   var html = editor.getEditorContent(); 
- * </code>
- * @returns {Xinha|null} 
- * @param {String|DomNode} ref id or name of the textarea or the textarea node itself
- */
-Xinha.getEditor = function(ref)
-{
-  for ( var i = __xinhas.length; i--; )
-  {
-    var editor = __xinhas[i];
-    if ( editor && ( editor._textArea.id == ref || editor._textArea.name == ref || editor._textArea == ref ) )
-    {
-      return editor;
-    }
-  }
-  return null;
-};
-/** Sometimes one wants to call a plugin method directly, e.g. from outside the editor.
- * This function returns the respective editor's instance of a plugin.
- * For example you might want to have a button to trigger SaveSubmit's save() method:<br />
- * <code>
- *	 &lt;button type="button" onclick="Xinha.getEditor('myTextArea').getPluginInstance('SaveSubmit').save();return false;"&gt;Save&lt;/button&gt;
- * </code>
- * @returns {PluginObject|null} 
- * @param {String} plugin name of the plugin
- */
-Xinha.prototype.getPluginInstance = function (plugin)
-{
-  if (this.plugins[plugin])
-  {
-    return this.plugins[plugin].instance;
-  }
-  else
-  {
-    return null;
-  }
-};
-
-/** If the given or current selection comprises or is enclosed by 
- *   one of the given tag names, return the deepest encloser.
- * 
- *  Example
- * 
- *    <ul> <li> [Caret Here] </li> </li>
- * 
- * editor.getElementIsOrEnclosingSelection(['ul','li'])
- * 
- * will return the list element
- * 
- */
-
-Xinha.prototype.getElementIsOrEnclosingSelection = function(types, sel)
-{
-  if(sel == null) 
-  {
-    sel = this.getSelection();
-  }
-  
-  var currentElement = this.activeElement(sel) ? this.activeElement(sel) : this.getParentElement(sel);
-  
-  
-  var typeMatched = false;
-  if(!(typeof currentElement.tagName == 'undefined'))
-  {
-    for(var i = 0; i < types.length; i++)
-    {
-      if(currentElement.tagName.toLowerCase().match(types[i].toLowerCase()))
-      {
-        typeMatched = true; 
-        break;
-      }
-    }
-  }
-  
-  // It wasn't the selected element, see if there is an ancestor
-  if(!typeMatched)
-  {
-    currentElement = null;
-    currentElement = this._getFirstAncestor(sel, types);
-  }
-  
-  return currentElement;
-};
-
-/** Returns an array with all the ancestor nodes of the selection or current cursor position.
-* @returns {Array}
-*/
-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;
-};
-
-/** Traverses the DOM upwards and returns the first element that is of one of the specified types
- *  @param {Selection} sel  Selection object as returned by getSelection
- *  @param {Array|String} types Array of matching criteria.  Each criteria is either a string containing the tag name, or a callback used to select the element.
- *  @returns {DomNode|null} 
- */
-Xinha.prototype._getFirstAncestor = function(sel, types)
-{
-  return this._getFirstAncestorAndWhy(sel, types)[0];
-};
-
-/** Traverses the DOM upwards and returns the first element that is one of the specified types,
- *  and which (of the specified types) the found element successfully matched.
- *  @param {Selection} sel  Selection object as returned by getSelection
- *  @param {Array|String} types Array of matching criteria.  Each criteria is either a string containing the tag name, or a callback used to select the element.
- *  @returns {Array} The array will look like [{DomNode|null}, {Integer|null}] -- that is, it always contains two elements.  The first element is the element that matched, or null if no match was found. The second is the numerical index that can be used to identify which element of the "types" was responsible for the match.  It will be null if no match was found.  It will also be null if the "types" argument was omitted. 
- */
-Xinha.prototype._getFirstAncestorAndWhy = function(sel, types)
-{
-  var prnt = this.activeElement(sel);
-  if ( prnt === null )
-  {
-    // Hmm, I think Xinha.getParentElement() would do the job better?? - James
-    try
-    {
-      prnt = (Xinha.is_ie ? this.createRange(sel).parentElement() : this.createRange(sel).commonAncestorContainer);
-    }
-    catch(ex)
-    {
-      return [null, null];
-    }
-  }
-
-  if ( typeof types == 'string' )
-  {
-    types = [types];
-  }
-  return this._getFirstAncestorForNodeAndWhy(prnt, types);
-};
- 
-Xinha.prototype._getFirstAncestorForNodeAndWhy = function(node, types) {
-  var prnt = node.parentNode;
-
-  while ( prnt )
-  {
-    if ( prnt.nodeType == 1 )
-    {
-      if ( types === null )
-      {
-	return [prnt, null];
-      }
-      for (var index=0; index<types.length; ++index) {
-        if (typeof types[index] == 'string' && types[index] == prnt.tagName.toLowerCase()){
-          // Criteria is a tag name.  It matches
-	  return [prnt, index];
-      }
-        else if (typeof types[index] == 'function' && types[index](this, prnt)) {
-          // Criteria is a callback.  It matches
-	  return [prnt, index];
-        }
-      }
-
-      if ( prnt.tagName.toLowerCase() == 'body' )
-      {
-        break;
-      }
-      if ( prnt.tagName.toLowerCase() == 'table' )
-      {
-        break;
-      }
-    }
-    prnt = prnt.parentNode;
-  }
-
-  return [null, null];
-};
-
-/** Traverses the DOM upwards and returns the first element that is a block level element
- *  @param {Selection} sel  Selection object as returned by getSelection
- *  @returns {DomNode|null} 
- */
-Xinha.prototype._getAncestorBlock = function(sel)
-{
-  // Scan upwards to find a block level element that we can change or apply to
-  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':
-        // Block Element
-        return prnt;
-
-      case 'body':
-      case 'noframes':
-      case 'dd':
-      case 'li':
-      case 'th':
-      case 'td':
-      case 'noscript' :
-        // Halting element (stop searching)
-        return null;
-
-      default:
-        // Keep lookin
-        break;
-    }
-  }
-
-  return null;
-};
-
-/** What's this? does nothing, has to be removed
- * 
- * @deprecated
- */
-Xinha.prototype._createImplicitBlock = function(type)
-{
-  // expand it until we reach a block element in either direction
-  // then wrap the selection in a block and return
-  var sel = this.getSelection();
-  if ( Xinha.is_ie )
-  {
-    sel.empty();
-  }
-  else
-  {
-    sel.collapseToStart();
-  }
-
-  var rng = this.createRange(sel);
-
-  // Expand UP
-
-  // Expand DN
-};
-
-
-
-/**
- *  Call this function to surround the existing HTML code in the selection with
- *  your tags.  FIXME: buggy! Don't use this 
- * @todo: when will it be deprecated ? Can it be removed already ?
- * @private (tagged private to not further promote use of this function)
- * @deprecated
- */
-Xinha.prototype.surroundHTML = function(startTag, endTag)
-{
-  var html = this.getSelectedHTML();
-  // the following also deletes the selection
-  this.insertHTML(startTag + html + endTag);
-};
-
-/** Return true if we have some selection
- *  @returns {Boolean} 
- */
-Xinha.prototype.hasSelectedText = function()
-{
-  // FIXME: come _on_ mishoo, you can do better than this ;-)
-  return this.getSelectedHTML() !== '';
-};
-
-/***************************************************
- *  Category: EVENT HANDLERS
- ***************************************************/
-
-/** onChange handler for dropdowns in toolbar 
- *  @private
- *  @param {DomNode} el Reference to the SELECT object
- *  @param {String} txt  The name of the select field, as in config.toolbar
- *  @returns {DomNode|null} 
- */
-Xinha.prototype._comboSelected = function(el, txt)
-{
-  this.focusEditor();
-  var value = el.options[el.selectedIndex].value;
-  switch (txt)
-  {
-    case "fontname":
-    case "fontsize":
-      this.execCommand(txt, false, value);
-    break;
-    case "formatblock":
-      // Mozilla inserts an empty tag (<>) if no parameter is passed  
-      if ( !value )
-      {
-      	this.updateToolbar();
-      	break;
-      }
-      if( !Xinha.is_gecko || value !== 'blockquote' )
-      {
-        value = "<" + value + ">";
-      }
-      this.execCommand(txt, false, value);
-    break;
-    default:
-      // try to look it up in the registered dropdowns
-      var dropdown = this.config.customSelects[txt];
-      if ( typeof dropdown != "undefined" )
-      {
-        dropdown.action(this, value, el, txt);
-      }
-      else
-      {
-        alert("FIXME: combo box " + txt + " not implemented");
-      }
-    break;
-  }
-};
-
-/** Open a popup to select the hilitecolor or forecolor
- * @private
- * @param {String} cmdID The commande ID (hilitecolor or forecolor)
- */
-Xinha.prototype._colorSelector = function(cmdID)
-{
-  var editor = this;	// for nested functions
-
-  // backcolor only works with useCSS/styleWithCSS (see mozilla bug #279330 & Midas doc)
-  // and its also nicer as <font>
-  if ( Xinha.is_gecko )
-  {
-    try
-    {
-     editor._doc.execCommand('useCSS', false, false); // useCSS deprecated & replaced by styleWithCSS 
-     editor._doc.execCommand('styleWithCSS', false, true); 
-
-    } catch (ex) {}
-  }
-  
-  var btn = editor._toolbarObjects[cmdID].element;
-  var initcolor;
-  if ( cmdID == 'hilitecolor' )
-  {
-    if ( Xinha.is_ie )
-    {
-      cmdID = 'backcolor';
-      initcolor = Xinha._colorToRgb(editor._doc.queryCommandValue("backcolor"));
-    }
-    else
-    {
-      initcolor = Xinha._colorToRgb(editor._doc.queryCommandValue("hilitecolor"));
-    }
-  }
-  else
-  {
-  	initcolor = Xinha._colorToRgb(editor._doc.queryCommandValue("forecolor"));
-  }
-  var cback = function(color) { editor._doc.execCommand(cmdID, false, color); };
-  if ( Xinha.is_ie )
-  {
-    var range = editor.createRange(editor.getSelection());
-    cback = function(color)
-    {
-      range.select();
-      editor._doc.execCommand(cmdID, false, color);
-    };
-  }
-  var picker = new Xinha.colorPicker(
-  {
-  	cellsize:editor.config.colorPickerCellSize,
-  	callback:cback,
-  	granularity:editor.config.colorPickerGranularity,
-  	websafe:editor.config.colorPickerWebSafe,
-  	savecolors:editor.config.colorPickerSaveColors
-  });
-  picker.open(editor.config.colorPickerPosition, btn, initcolor);
-};
-
-/** This is a wrapper for the browser's execCommand function that handles things like 
- *  formatting, inserting elements, etc.<br />
- *  It intercepts some commands and replaces them with our own implementation.<br />
- *  It provides a hook for the "firePluginEvent" system ("onExecCommand").<br /><br />
- *  For reference see:<br />
- *     <a href="http://www.mozilla.org/editor/midas-spec.html">Mozilla implementation</a><br />
- *     <a href="http://msdn.microsoft.com/workshop/author/dhtml/reference/methods/execcommand.asp">MS implementation</a>
- *
- *  @see Xinha#firePluginEvent
- *  @param {String} cmdID command to be executed as defined in the browsers implemantations or Xinha custom
- *  @param {Boolean} UI for compatibility with the execCommand syntax; false in most (all) cases
- *  @param {Mixed} param Some commands require parameters
- *  @returns {Boolean} always false 
- */
-Xinha.prototype.execCommand = function(cmdID, UI, param)
-{
-  var editor = this;	// for nested functions
-  this.focusEditor();
-  cmdID = cmdID.toLowerCase();
-  
-  // See if any plugins want to do something special
-  if(this.firePluginEvent('onExecCommand', cmdID, UI, param))
-  {
-    this.updateToolbar();
-    return false;
-  }
-
-  switch (cmdID)
-  {
-    case "htmlmode":
-      this.setMode();
-    break;
-
-    case "hilitecolor":
-    case "forecolor":
-      this._colorSelector(cmdID);
-    break;
-
-    case "createlink":
-      this._createLink();
-    break;
-
-    case "undo":
-    case "redo":
-      if (this._customUndo)
-      {
-        this[cmdID]();
-      }
-      else
-      {
-        this._doc.execCommand(cmdID, UI, param);
-      }
-    break;
-
-    case "inserttable":
-      this._insertTable();
-    break;
-
-    case "insertimage":
-      this._insertImage();
-    break;
-
-    case "showhelp":
-      this._popupDialog(editor.config.URIs.help, null, this);
-    break;
-
-    case "killword":
-      this._wordClean();
-    break;
-
-    case "cut":
-    case "copy":
-    case "paste":
-      this._doc.execCommand(cmdID, UI, param);
-      if ( this.config.killWordOnPaste )
-      {
-        this._wordClean();
-      }
-    break;
-    case "lefttoright":
-    case "righttoleft":
-      if (this.config.changeJustifyWithDirection) 
-      {
-        this._doc.execCommand((cmdID == "righttoleft") ? "justifyright" : "justifyleft", UI, param);
-      }
-      var dir = (cmdID == "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' :
-      cmdID.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(cmdID, UI, param);
-      }
-    break;
-    
-    default:
-      try
-      {
-        this._doc.execCommand(cmdID, UI, param);
-      }
-      catch(ex)
-      {
-        if ( this.config.debug )
-        {
-          alert(ex + "\n\nby execCommand(" + cmdID + ");");
-        }
-      }
-    break;
-  }
-
-  this.updateToolbar();
-  return false;
-};
-
-/** A generic event handler for things that happen in the IFRAME's document.<br />
- *  It provides two hooks for the "firePluginEvent" system:<br />
- *   "onKeyPress"<br />
- *   "onMouseDown"
- *  @see Xinha#firePluginEvent
- *  @param {Event} ev
- */
-Xinha.prototype._editorEvent = function(ev)
-{
-  var editor = this;
-
-  //call events of textarea
-  if ( typeof editor._textArea['on'+ev.type] == "function" )
-  {
-    editor._textArea['on'+ev.type](ev);
-  }
-  
-
-  var isShortCut = this.isShortCut(ev);
-  
-  // Order of priority is something like...
-  // Keydown Cancels
-  //   KeyPress Cancels
-  //      ShortCut Cancels 
-  //         (built in shortcuts)
-  //         KeyUp
-  
-  if(ev.type == 'keydown')
-  {
-    if(editor.firePluginEvent('onKeyDown', ev))
-    {
-      return false;
-    }
-    
-    // If this is a shortcut, fire it as a keypress but when the key down
-    //  happens, this is because some browsers (various versions and platform combinations even!) 
-    //  fire press and some do not, so we can only rely on keydown here
-    //  we will suppress an actual shortcut press a bit further down to avoid duplicates
-    if(isShortCut)
-    {
-      if(editor.firePluginEvent('onKeyPress', ev))
-      {
-        return false;
-      }
-      
-      // Also we have a special onShortCut which only fires for them
-      if(editor.firePluginEvent('onShortCut', ev, isShortCut))
-      {
-        return false;
-      }
-      
-      this._shortCuts(ev);
-    }
-  }
-  
-  // Shortcuts were fired as a keydown masquerading as a keypress already
-  // so don't fire them again on an actual keypress.  Additionally
-  // browsers differ slightly in what they call a keypress, to be sure we 
-  // issue keyress on a standard set of things we pass off to isKeyPressEvent
-  // to do some more indepth checking, it will a boolean, some keypress will
-  // be invalid and skiped, some keydown will be repeated as a keypress because
-  // that browser wouldn't normally issue a keypress.  Sigh.
-  if(!isShortCut && this.isKeyPressEvent(ev))
-  {
-    if(editor.firePluginEvent('onKeyPress', ev))
-    {
-      return false;
-    }
-  }
-  
-  // At last, something we can rely on!
-  if(ev.type == 'keyup')
-  {
-    if(editor.firePluginEvent('onKeyUp', ev))
-    {
-      return false;
-    }
-  }
-
-  if ( ev.type == 'mousedown' )
-  {
-    if(editor.firePluginEvent('onMouseDown', ev))
-    {
-      return false;
-    }
-  }
-
-  if ( ev.type == 'mouseup' )
-  {
-    if(editor.firePluginEvent('onMouseUp', ev))
-    {
-      return false;
-    }
-  }
-  
-  // update the toolbar state after some time
-  if ( editor._timerToolbar )
-  {
-    clearTimeout(editor._timerToolbar);
-  }
-  if (!this.suspendUpdateToolbar)
-  {
-  editor._timerToolbar = setTimeout(
-    function()
-    {
-      editor.updateToolbar();
-      editor._timerToolbar = null;
-    },
-    250);
-  }
-};
-
-/** Handle double click events.
- *  See dblclickList in the config.
- */
- 
-Xinha.prototype._onDoubleClick = function(ev)
-{
-  var editor=this;
-  var target = Xinha.is_ie ? ev.srcElement : ev.target;
-  var tag = target.tagName;
-  var className = target.className;
-  if (tag) {
-    tag = tag.toLowerCase();
-    if (className && (this.config.dblclickList[tag+"."+className] != undefined))
-      this.config.dblclickList[tag+"."+className][0](editor, target);
-    else if (this.config.dblclickList[tag] != undefined)
-      this.config.dblclickList[tag][0](editor, target);
-  };
-};
-
-/** Handles ctrl + key shortcuts 
- *  @TODO: make this mor flexible
- *  @private
- *  @param {Event} ev
- */
-Xinha.prototype._shortCuts = function (ev)
-{
-  var key = this.getKey(ev).toLowerCase();
-  var cmd = null;
-  var value = null;
-  switch (key)
-  {
-    // simple key commands follow
-
-    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";
-    value = "p";
-    break;
-
-    case '0': cmd = "killword"; break;
-
-    // headings
-    case '1':
-    case '2':
-    case '3':
-    case '4':
-    case '5':
-    case '6':
-    cmd = "formatblock";
-    value = "h" + key;
-    break;
-  }
-  if ( cmd )
-  {
-    // execute simple command
-    this.execCommand(cmd, false, value);
-    Xinha._stopEvent(ev);
-  }
-};
-/** Changes the type of a given node
- *  @param {DomNode} el The element to convert
- *  @param {String} newTagName The type the element will be converted to
- *  @returns {DomNode} A reference to the new element
- */
-Xinha.prototype.convertNode = function(el, newTagName)
-{
-  var newel = this._doc.createElement(newTagName);
-  while ( el.firstChild )
-  {
-    newel.appendChild(el.firstChild);
-  }
-  return newel;
-};
-
-/** Scrolls the editor iframe to a given element or to the cursor
- *  @param {DomNode} e optional The element to scroll to; if ommitted, element the element the cursor is in
- */
-Xinha.prototype.scrollToElement = function(e)
-{
-  if(!e)
-  {
-    e = this.getParentElement();
-    if(!e)
-    {
-      return;
-    }
-  }
-  
-  // This was at one time limited to Gecko only, but I see no reason for it to be. - James
-  var position = Xinha.getElementTopLeft(e);  
-  this._iframe.contentWindow.scrollTo(position.left, position.top);
-};
-
-/** Scroll the viewport so that the given element is viewable
- *  if it is not already so.
- */
-
-Xinha.prototype.scrollElementIntoViewport = function(e)
-{
-  if(!e)
-  {
-    e = this.getParentElement();
-    if(!e)
-    {
-      return;
-    }
-  }
-  
-  // This was at one time limited to Gecko only, but I see no reason for it to be. - James
-  var position = Xinha.getElementTopLeft(e);  
-  var currentScroll = this.scrollPos(this._iframe.contentWindow);
-  var currentSize   = Xinha.viewportSize(this._iframe.contentWindow);
-  
-  var canSeeX = [currentScroll.x, currentScroll.x + (currentSize.x*0.9)];
-  var canSeeY = [currentScroll.y, currentScroll.y + (currentSize.y*0.9)];
-  if(   canSeeX[0] <= position.left
-    &&  canSeeX[1] >= position.left
-    &&  canSeeY[0] <= position.top
-    &&  canSeeY[1] >= position.top
-  )
-  {
-    // The item is in the viewport, no scroll
-    return;
-  }
-  
-  this._iframe.contentWindow.scrollTo(position.left, Math.min(position.top,position.top-(currentSize.y*0.1)));
-};
-
-/** Get the edited HTML
- *  
- *  @public
- *  @returns {String} HTML content
- */
-Xinha.prototype.getEditorContent = function()
-{
-  return this.outwardHtml(this.getHTML());
-};
-
-/** Completely change the HTML inside the editor
- *
- *  @public
- *  @param {String} html new content
- */
-Xinha.prototype.setEditorContent = function(html)
-{
-  this.setHTML(this.inwardHtml(html));
-};
-/** Saves the contents of all Xinhas to their respective textareas
- *  @public 
- */
-Xinha.updateTextareas = function()
-{
-  var e;
-  for (var i=0;i<__xinhas.length;i++)
-  {
-    e = __xinhas[i];
-    e._textArea.value = e.getEditorContent();
-  }
-}
-/** Get the raw edited HTML, should not be used without Xinha.prototype.outwardHtml()
- *  
- *  @private
- *  @returns {String} HTML content
- */
-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;
-};
-
-/** Performs various transformations of the HTML used internally, complement to Xinha.prototype.inwardHtml()  
- *  Plugins can provide their own, additional transformations by defining a plugin.prototype.outwardHtml() implematation,
- *  which is called by this function
- *
- *  @private
- *  @see Xinha#inwardHtml
- *  @param {String} html
- *  @returns {String} HTML content
- */
-Xinha.prototype.outwardHtml = function(html)
-{
-  for ( var i in this.plugins )
-  {
-    var plugin = this.plugins[i].instance;    
-    if ( plugin && typeof plugin.outwardHtml == "function" )
-    {
-      html = plugin.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");
-  
-  // remove disabling of inline event handle inside Xinha iframe
-  html = html.replace(/(<[^>]*on(click|mouse(over|out|up|down))=['"])if\(window\.parent &amp;&amp; window\.parent\.Xinha\)\{return false\}/gi,'$1');
-
-  // Figure out what our server name is, and how it's referenced
-  var serverBase = location.href.replace(/(https?:\/\/[^\/]*)\/.*/, '$1') + '/';
-
-  // IE puts this in can't figure out why
-  //  leaving this in the core instead of InternetExplorer 
-  //  because it might be something we are doing so could present itself
-  //  in other browsers - James 
-  html = html.replace(/https?:\/\/null\//g, serverBase);
-
-  // Make semi-absolute links to be truely absolute
-  //  we do this just to standardize so that special replacements knows what
-  //  to expect
-  html = html.replace(/((href|src|background)=[\'\"])\/+/ig, '$1' + serverBase);
-
-  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; });
-  }
-
-  //prevent execution of JavaScript (Ticket #685)
-  html = html.replace(/(<script[^>]*((type=[\"\']text\/)|(language=[\"\'])))(freezescript)/gi,"$1javascript");
-
-  // If in fullPage mode, strip the coreCSS
-  if(this.config.fullPage)
-  {
-    html = Xinha.stripCoreCSS(html);
-  }
-
-  if (typeof this.config.outwardHtml == 'function' )
-  {
-    html = this.config.outwardHtml(html);
-  }
-
-  return html;
-};
-
-/** Performs various transformations of the HTML to be edited 
- *  Plugins can provide their own, additional transformations by defining a plugin.prototype.inwardHtml() implematation,
- *  which is called by this function
- *  
- *  @private
- *  @see Xinha#outwardHtml
- *  @param {String} html  
- *  @returns {String} transformed HTML
- */
-Xinha.prototype.inwardHtml = function(html)
-{  
-  for ( var i in this.plugins )
-  {
-    var plugin = this.plugins[i].instance;    
-    if ( plugin && typeof plugin.inwardHtml == "function" )
-    {
-      html = plugin.inwardHtml(html);
-    }    
-  }
-    
-  // Both IE and Gecko use strike instead of del (#523)
-  html = html.replace(/<(\/?)del(\s|>|\/)/ig, "<$1strike$2");
-
-  // disable inline event handle inside Xinha iframe but only if they are not empty attributes
-  html = html.replace(/(<[^>]*on(click|mouse(over|out|up|down))=')([^']+')/gi,'$1if(window.parent &amp;&amp; window.parent.Xinha){return false}$4');
-  html = html.replace(/(<[^>]*on(click|mouse(over|out|up|down))=")([^"]+")/gi,'$1if(window.parent &amp;&amp; window.parent.Xinha){return false}$4');
-  
-  html = this.inwardSpecialReplacements(html);
-
-  html = html.replace(/(<script)(?![^>]*((type=[\"\']text\/)|(language=[\"\']))javascript[\"\'])/gi,'$1 type="text/javascript"');
-  html = html.replace(/(<script[^>]*((type=[\"\']text\/)|(language=[\"\'])))(javascript)/gi,"$1freezescript");
-
-  // For IE's sake, make any URLs that are semi-absolute (="/....") to be
-  // truely absolute
-  var nullRE = new RegExp('((href|src|background)=[\'"])/+', 'gi');
-  html = html.replace(nullRE, '$1' + location.href.replace(/(https?:\/\/[^\/]*)\/.*/, '$1') + '/');
-
-  html = this.fixRelativeLinks(html);
-  
-  // If in fullPage mode, add the coreCSS
-  if(this.config.fullPage)
-  {
-    html = Xinha.addCoreCSS(html);
-  }
-
-  if (typeof this.config.inwardHtml == 'function' )
-  {
-    html = this.config.inwardHtml(html);
-  }
-
-  return html;
-};
-/** Apply the replacements defined in Xinha.Config.specialReplacements
- *  
- *  @private
- *  @see Xinha#inwardSpecialReplacements
- *  @param {String} html
- *  @returns {String}  transformed HTML
- */
-Xinha.prototype.outwardSpecialReplacements = function(html)
-{
-  for ( var i in this.config.specialReplacements )
-  {
-    var from = this.config.specialReplacements[i];
-    var to   = i; // why are declaring a new variable here ? Seems to be better to just do : for (var to in config)
-    // prevent iterating over wrong type
-    if ( typeof from.replace != 'function' || typeof to.replace != 'function' )
-    {
-      continue;
-    } 
-    // alert('out : ' + from + '=>' + to);
-    var reg = new RegExp(Xinha.escapeStringForRegExp(from), 'g');
-    html = html.replace(reg, to.replace(/\$/g, '$$$$'));
-    //html = html.replace(from, to);
-  }
-  return html;
-};
-/** Apply the replacements defined in Xinha.Config.specialReplacements
- *  
- *  @private
- *  @see Xinha#outwardSpecialReplacements
- *  @param {String} html
- *  @returns {String}  transformed HTML
- */
-Xinha.prototype.inwardSpecialReplacements = function(html)
-{
-  // alert("inward");
-  for ( var i in this.config.specialReplacements )
-  {
-    var from = i; // why are declaring a new variable here ? Seems to be better to just do : for (var from in config)
-    var to   = this.config.specialReplacements[i];
-    // prevent iterating over wrong type
-    if ( typeof from.replace != 'function' || typeof to.replace != 'function' )
-    {
-      continue;
-    }
-    // alert('in : ' + from + '=>' + to);
-    //
-    // html = html.replace(reg, to);
-    // html = html.replace(from, to);
-    var reg = new RegExp(Xinha.escapeStringForRegExp(from), 'g');
-    html = html.replace(reg, to.replace(/\$/g, '$$$$')); // IE uses doubled dollar signs to escape backrefs, also beware that IE also implements $& $_ and $' like perl.
-  }
-  return html;
-};
-/** Transforms the paths in src & href attributes
- *  
- *  @private
- *  @see Xinha.Config#expandRelativeUrl
- *  @see Xinha.Config#stripSelfNamedAnchors
- *  @see Xinha.Config#stripBaseHref
- *  @see Xinha.Config#baseHref
- *  @param {String} html 
- *  @returns {String} transformed HTML
- */
-Xinha.prototype.fixRelativeLinks = function(html)
-{
-
-  if ( typeof this.config.stripSelfNamedAnchors != 'undefined' && this.config.stripSelfNamedAnchors )
-  {
-    var stripRe = new RegExp("((href|src|background)=\")("+Xinha.escapeStringForRegExp(window.unescape(document.location.href.replace(/&/g,'&amp;'))) + ')([#?][^\'" ]*)', 'g');
-    html = html.replace(stripRe, '$1$4');
-  }
-
-  if ( typeof this.config.stripBaseHref != 'undefined' && this.config.stripBaseHref )
-  {
-    var baseRe = null;
-    if ( typeof this.config.baseHref != 'undefined' && this.config.baseHref !== null )
-    {
-      baseRe = new RegExp( "((href|src|background|action)=\")(" + Xinha.escapeStringForRegExp(this.config.baseHref.replace(/([^\/]\/)(?=.+\.)[^\/]*$/, "$1")) + ")", 'g' );
-	  html = html.replace(baseRe, '$1');
-    }
-    baseRe = new RegExp( "((href|src|background|action)=\")(" +  Xinha.escapeStringForRegExp(document.location.href.replace( /^(https?:\/\/[^\/]*)(.*)/, '$1' )) + ")", 'g' );
-    html = html.replace(baseRe, '$1');
-  }
-
-  // Rewrite 2018 expandRelativeUrl
-  //  note that this must be done AFTER stripBaseHref otherwise we can get
-  //  absolute urls, which won't be expanded
-  if ( typeof this.config.expandRelativeUrl != 'undefined' && this.config.expandRelativeUrl ) 
-  {
-    if(html == null) return '';
-    
-    // These are the regexes for matching the urls globally
-    var url_regexp_global = [ 
-     /(src|href|background|action)(=")([^"]+?)((?:(?:#|\?).*)?")/gi,
-     /(src|href|background|action)(=')([^']+?)((?:(?:#|\?).*)?')/gi
-    ];
-    
-    // And singly (you can not change a regex flag after creation)
-    var url_regexp_single = [ 
-     /(src|href|background|action)(=")([^"]+?)((?:(?:#|\?).*)?")/i,
-     /(src|href|background|action)(=')([^']+?)((?:(?:#|\?).*)?')/i
-    ];
-    
-    // Find a list of urls in the document to inspect
-    //  we want urls that include a relative component
-    //
-    //  that is ./,  ../, or start with a basename
-    //   (dirname or filename)
-    //
-    //  excluded are urls with a protocol (http://...)
-    //               urls with a same-protocol (//...)
-    //
-    
-    var candidates = [ ];
-    
-    for(var i = 0; i < url_regexp_global.length ; i++)
-    {
-
-            
-      var all_urls   =  html.match(url_regexp_global[i]);
-      if(!all_urls) continue;
-      
-      for(var j = 0; j < all_urls.length; j++)
-      {
-        if(all_urls[j].match(/=["']([a-z]+:)?\/\//)) continue; // Exclude: '//...' and 'https://'
-        if(! (this.config.expandRelativeUrl == 'all'))
-        {
-          // If there is no parental or self-referential path component
-          if(all_urls[j].match(/=["'][a-z0-9_-]/i))    continue; // Exclude: 'relativedir/foo.html'
-        }
-        if(
-             ( !all_urls[j].match(/=["']\//)       ) // Starts with something other than a slash
-          || ( all_urls[j].match(/=["']\.{1,2}\//) ) // Starts with a ./ or ../
-          || ( all_urls[j].match(/\/\.{1,2}\//   ) ) // Includes a ./ or ../
-          || ( all_urls[j].match(/\/{2,}/   )      ) // Includes repeated /, we will clean these up too
-        )
-        {
-          // We have to run the match again to get the parts
-          candidates[candidates.length] =  all_urls[j].match(url_regexp_single[i]);
-        }
-      }
-    }
-          
-    // Get our PATH for the page that is doing the editing something like /foo/bar/xinha.php
-    var ourpath = document.location.pathname;
-    
-    // Remove our basename --> /foo/bar/
-    ourpath = ourpath.replace(/\/[^/]+$/, '/');
-    
-    // For each of the candidate urls, fix them
-    for(var i = 0; i < candidates.length; i++)
-    {
-      var src = candidates[i];
-      
-      var lastHtml = html;
-      
-      // Add the relative url to our path if it is not semi-absolute
-      var fixedUrl = (!src[3].match(/^\//)) ? ourpath + src[3] : src[3];
-      
-      // Remove any /./ components
-      fixedUrl = fixedUrl.replace(/\/\.\//g, '/');
-      
-      // Reduce any multiple slash
-      fixedUrl = fixedUrl.replace(/\/{2,}/g, '/');
-      
-      // Remove any /[something]/../ components
-      //  (this makes /foo/../bar become /bar correctly
-      //  repeat this until either there are no more /../
-      //  or there has been no further change
-      var lastFixedUrl;
-      do
-      {
-        lastFixedUrl = fixedUrl;
-        fixedUrl = fixedUrl.replace(/\/[^/]+\/\.\.\//g, '/');          
-      } while( lastFixedUrl != fixedUrl );
-      
-      // Now if we have any /../ left, they should be invalid, so kill those
-      fixedUrl = fixedUrl.replace('/../', '/');
-      
-      // And that's all
-      html = html.replace( src[0], src[1]+src[2]+fixedUrl+src[4]);  
-    }
-  }
-  
-  return html;
-};
-
-/** retrieve the HTML (fastest version, but uses innerHTML)
- *  
- *  @private
- *  @returns {String} HTML content
- */
-Xinha.prototype.getInnerHTML = function()
-{
-  if ( !this._doc.body )
-  {
-    return '';
-  }
-  var html = "";
-  switch ( this._editMode )
-  {
-    case "wysiwyg":
-      if ( !this.config.fullPage )
-      {
-        // return this._doc.body.innerHTML;
-        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;
-};
-
-/** Completely change the HTML inside
- *
- *  @private
- *  @param {String} html new content, should have been run through inwardHtml() first
- */
-Xinha.prototype.setHTML = function(html)
-{
-  if ( !this.config.fullPage )
-  {
-    this._doc.body.innerHTML = html;
-  }
-  else
-  {
-    this.setFullHTML(html);
-  }
-  this._textArea.value = html;
-};
-
-/** sets the given doctype (useful only when config.fullPage is true)
- *  
- *  @private
- *  @param {String} doctype
- */
-Xinha.prototype.setDoctype = function(doctype)
-{
-  this.doctype = doctype;
-};
-
-/***************************************************
- *  Category: UTILITY FUNCTIONS
- ***************************************************/
-
-/** Variable used to pass the object to the popup editor window.
- *  @FIXME: Is this in use?
- *  @deprecated 
- *  @private
- *  @type {Object}
- */
-Xinha._object = null;
-
-/** Arrays are identified as "object" in typeof calls. Adding this tag to the Array prototype allows to distinguish between the two
- */
-Array.prototype.isArray = true;
-/** RegExps are identified as "object" in typeof calls. Adding this tag to the RegExp prototype allows to distinguish between the two
- */
-RegExp.prototype.isRegExp = true;
-/** function that returns a clone of the given object
- *  
- *  @private
- *  @param {Object} obj
- *  @returns {Object} cloned object
- */
-Xinha.cloneObject = function(obj)
-{
-  if ( !obj )
-  {
-    return null;
-  }
-  var newObj = obj.isArray ? [] : {};
-
-  // check for function and RegExp objects (as usual, IE is fucked up)
-  if ( obj.constructor.toString().match( /\s*function Function\(/ ) || typeof obj == 'function' )
-  {
-    newObj = obj; // just copy reference to it
-  }
-  else if (  obj.isRegExp )
-  {
-    newObj = eval( obj.toString() ); //see no way without eval
-  }
-  else
-  {
-    for ( var n in obj )
-    {
-      var node = obj[n];
-      if ( typeof node == 'object' )
-      {
-        newObj[n] = Xinha.cloneObject(node);
-      }
-      else
-      {
-        newObj[n] = node;
-      }
-    }
-  }
-
-  return newObj;
-};
-
-
-/** Extend one class from another, that is, make a sub class.
- *  This manner of doing it was probably first devised by Kevin Lindsey
- *
- *  http://kevlindev.com/tutorials/javascript/inheritance/index.htm
- *
- *  It has subsequently been used in one form or another by various toolkits 
- *  such as the YUI.
- *
- *  I make no claim as to understanding it really, but it works.
- * 
- *  Example Usage:
- *  {{{
- *  -------------------------------------------------------------------------
- 
-    // =========  MAKING THE INITIAL SUPER CLASS ===========
-    
-        document.write("<h1>Superclass Creation And Test</h1>");
-    
-        function Vehicle(name, sound)
-        {    
-          this.name  = name;
-          this.sound = sound
-        }
-      
-        Vehicle.prototype.pressHorn = function()
-        {
-          document.write(this.name + ': ' + this.sound + '<br/>');
-        }
-        
-        var Bedford  = new Vehicle('Bedford Van', 'Honk Honk');
-        Bedford.pressHorn(); // Vehicle::pressHorn() is defined
-    
-    
-    // ========= MAKING A SUBCLASS OF A SUPER CLASS =========
-    
-        document.write("<h1>Subclass Creation And Test</h1>");
-        
-        // Make the sub class constructor first
-        Car = function(name)
-        {
-          // This is how we call the parent's constructor, note that
-          // we are using Car.parent.... not "this", we can't use this.
-          Car.parentConstructor.call(this, name, 'Toot Toot');
-        }
-        
-        // Remember the subclass comes first, then the base class, you are extending
-        // Car with the methods and properties of Vehicle.
-        Xinha.extend(Car, Vehicle);
-        
-        var MazdaMx5 = new Car('Mazda MX5');  
-        MazdaMx5.pressHorn(); // Car::pressHorn() is inherited from Vehicle::pressHorn()
-    
-    // =========  ADDING METHODS TO THE SUB CLASS ===========
-
-        document.write("<h1>Add Method to Sub Class And Test</h1>");
-        
-        Car.prototype.isACar = function()
-        {
-          document.write(this.name + ": Car::isACar() is implemented, this is a car! <br/>");
-          this.pressHorn();
-        }
-       
-        MazdaMx5.isACar(); // Car::isACar() is defined as above
-        try      { Bedford.isACar(); } // Vehicle::isACar() is not defined, will throw this exception
-        catch(e) { document.write("Bedford: Vehicle::onGettingCutOff() not implemented, this is not a car!<br/>"); }
-    
-    // =========  EXTENDING A METHOD (CALLING MASKED PARENT METHODS) ===========
-    
-        document.write("<h1>Extend/Override Inherited Method in Sub Class And Test</h1>");
-        
-        Car.prototype.pressHorn = function()
-        { 
-          document.write(this.name + ': I am going to press the horn... <br/>');
-          Car.superClass.pressHorn.call(this);        
-        }
-        MazdaMx5.pressHorn(); // Car::pressHorn()
-        Bedford.pressHorn();  // Vehicle::pressHorn()
-        
-    // =========  MODIFYING THE SUPERCLASS AFTER SUBCLASSING ===========
-    
-        document.write("<h1>Add New Method to Superclass And Test In Subclass</h1>");  
-        
-        Vehicle.prototype.startUp = function() { document.write(this.name + ": Vroooom <br/>"); }  
-        MazdaMx5.startUp(); // Cars get the prototype'd startUp() also.
-        
- *  -------------------------------------------------------------------------
- *  }}}  
- *
- *  @param subclass_constructor (optional)  Constructor function for the subclass
- *  @param superclass Constructor function for the superclass 
- */
-
-Xinha.extend = function(subClass, baseClass) {
-   function inheritance() {}
-   inheritance.prototype = baseClass.prototype;
-
-   subClass.prototype = new inheritance();
-   subClass.prototype.constructor = subClass;
-   subClass.parentConstructor = baseClass;
-   subClass.superClass = baseClass.prototype;
-}
-
-/** Event Flushing
- *  To try and work around memory leaks in the rather broken
- *  garbage collector in IE, Xinha.flushEvents can be called
- *  onunload, it will remove any event listeners (that were added
- *  through _addEvent(s)) and clear any DOM-0 events.
- *  @private
- *
- */
-Xinha.flushEvents = function()
-{
-  var x = 0;
-  // @todo : check if Array.prototype.pop exists for every supported browsers
-  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)
-    {
-      // Do Nothing
-    }
-    e = Xinha._eventFlushers.pop();
-  }
-  
-  /* 
-    // This code is very agressive, and incredibly slow in IE, so I've disabled it.
-    
-    if(document.all)
-    {
-      for(var i = 0; i < document.all.length; i++)
-      {
-        for(var j in document.all[i])
-        {
-          if(/^on/.test(j) && typeof document.all[i][j] == 'function')
-          {
-            document.all[i][j] = null;
-            x++;
-          }
-        }
-      }
-    }
-  */
-  
-  // alert('Flushed ' + x + ' events.');
-};
- /** Holds the events to be flushed
-  * @type Array
-  */
-Xinha._eventFlushers = [];
-
-if ( document.addEventListener )
-{
- /** adds an event listener for the specified element and event type
- *  
- *  @public
- *  @see   Xinha#_addEvents
- *  @see   Xinha#addDom0Event
- *  @see   Xinha#prependDom0Event
- *  @param {DomNode}  el the DOM element the event should be attached to 
- *  @param {String}   evname the name of the event to listen for (without leading "on")
- *  @param {function} func the function to be called when the event is fired
- */
-  Xinha._addEvent = function(el, evname, func)
-  {
-    el.addEventListener(evname, func, false);
-    Xinha._eventFlushers.push([el, evname, func]);
-  };
- 
- /** removes an event listener previously added
- *  
- *  @public
- *  @see   Xinha#_removeEvents
- *  @param {DomNode}  el the DOM element the event should be removed from 
- *  @param {String}   evname the name of the event the listener should be removed from (without leading "on")
- *  @param {function} func the function to be removed
- */
-  Xinha._removeEvent = function(el, evname, func)
-  {
-    el.removeEventListener(evname, func, false);
-  };
- 
- /** stops bubbling of the event, if no further listeners should be triggered
- *  
- *  @public
- *  @param {event} ev the event to be stopped
- */
-  Xinha._stopEvent = function(ev)
-  {
-    if(ev.preventDefault)
-    {  
-      ev.preventDefault();
-    }
-    // IE9 now supports addEventListener, but does not support preventDefault.  Sigh
-    else
-    {
-      ev.returnValue = false;
-    }
-    
-    if(ev.stopPropagation)
-    {
-      ev.stopPropagation();
-    }
-    // IE9 now supports addEventListener, but does not support stopPropagation.  Sigh
-    else
-    {
-      ev.cancelBubble = true;
-    }
-  };
-}
- /** same as above, for IE
- *  
- */
-else if ( document.attachEvent )
-{
-  Xinha._addEvent = function(el, evname, func)
-  {
-    el.attachEvent("on" + evname, func);
-    Xinha._eventFlushers.push([el, evname, func]);
-  };
-  Xinha._removeEvent = function(el, evname, func)
-  {
-    el.detachEvent("on" + evname, func);
-  };
-  Xinha._stopEvent = function(ev)
-  {
-    try
-    {
-      ev.cancelBubble = true;
-      ev.returnValue = false;
-    }
-    catch (ex)
-    {
-      // Perhaps we could try here to stop the window.event
-      // window.event.cancelBubble = true;
-      // window.event.returnValue = false;
-    }
-  };
-}
-else
-{
-  Xinha._addEvent = function(el, evname, func)
-  {
-    alert('_addEvent is not supported');
-  };
-  Xinha._removeEvent = function(el, evname, func)
-  {
-    alert('_removeEvent is not supported');
-  };
-  Xinha._stopEvent = function(ev)
-  {
-    alert('_stopEvent is not supported');
-  };
-}
- /** add several events at once to one element
- *  
- *  @public
- *  @see Xinha#_addEvent
- *  @param {DomNode}  el the DOM element the event should be attached to 
- *  @param {Array}    evs the names of the event to listen for (without leading "on")
- *  @param {function} func the function to be called when the event is fired
- */
-Xinha._addEvents = function(el, evs, func)
-{
-  for ( var i = evs.length; --i >= 0; )
-  {
-    Xinha._addEvent(el, evs[i], func);
-  }
-};
- /** remove several events at once to from element
- *  
- *  @public
- *  @see Xinha#_removeEvent
- *  @param {DomNode}  el the DOM element the events should be remove from
- *  @param {Array}    evs the names of the events the listener should be removed from (without leading "on")
- *  @param {function} func the function to be removed
- */
-Xinha._removeEvents = function(el, evs, func)
-{
-  for ( var i = evs.length; --i >= 0; )
-  {
-    Xinha._removeEvent(el, evs[i], func);
-  }
-};
-
-/** Adds a function that is executed in the moment the DOM is ready, but as opposed to window.onload before images etc. have been loaded
-*   http://dean.edwards.name/weblog/2006/06/again/
-*   IE part from jQuery
-*  @public
-*  @author Dean Edwards/Matthias Miller/ John Resig / Diego Perini
-*  @param {Function}  func the function to be executed
-*  @param {Window}    scope the window that is listened to
-*/
-Xinha.addOnloadHandler = function (func, scope)
-{
- scope = scope ? scope : window;
-
- var init = function ()
- {
-   // quit if this function has already been called
-   if (arguments.callee.done) 
-   {
-     return;
-   }
-   // flag this function so we don't do the same thing twice
-   arguments.callee.done = true;
-   // kill the timer
-   if (Xinha.onloadTimer)
-   {
-     clearInterval(Xinha.onloadTimer);
-   }
-
-   func();
- };
-  if (Xinha.is_ie)
-  {
-    // ensure firing before onload,
-    // maybe late but safe also for iframes
-    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 {
-        // If IE is used, use the trick by Diego Perini
-        // http://javascript.nwbox.com/IEContentLoaded/
-        document.documentElement.doScroll("left");
-      } catch( error ) {
-        setTimeout( arguments.callee, 0 );
-        return;
-      }
-      // and execute any waiting functions
-      init();
-    })();
-  }
- else if (/applewebkit|KHTML/i.test(navigator.userAgent) ) /* Safari/WebKit/KHTML */
- {
-   Xinha.onloadTimer = scope.setInterval(function()
-   {
-     if (/loaded|complete/.test(scope.document.readyState))
-     {
-       init(); // call the onload handler
-     }
-   }, 10);
- }
- else /* for Mozilla/Opera9 */
- {
-   scope.document.addEventListener("DOMContentLoaded", init, false);
-
- }
- Xinha._addEvent(scope, 'load', init); // incase anything went wrong
-};
-
-/**
- * Adds a standard "DOM-0" event listener to an element.
- * The DOM-0 events are those applied directly as attributes to
- * an element - eg element.onclick = stuff;
- *
- * By using this function instead of simply overwriting any existing
- * DOM-0 event by the same name on the element it will trigger as well
- * as the existing ones.  Handlers are triggered one after the other
- * in the order they are added.
- *
- * Remember to return true/false from your handler, this will determine
- * whether subsequent handlers will be triggered (ie that the event will
- * continue or be canceled).
- *  
- *  @public
- *  @see Xinha#_addEvent
- *  @see Xinha#prependDom0Event
- *  @param {DomNode}  el the DOM element the event should be attached to 
- *  @param {String}   ev the name of the event to listen for (without leading "on")
- *  @param {function} fn the function to be called when the event is fired
- */
-
-Xinha.addDom0Event = function(el, ev, fn)
-{
-  Xinha._prepareForDom0Events(el, ev);
-  el._xinha_dom0Events[ev].unshift(fn);
-};
-
-
-/** See addDom0Event, the difference is that handlers registered using
- *  prependDom0Event will be triggered before existing DOM-0 events of the
- *  same name on the same element.
- *  
- *  @public
- *  @see Xinha#_addEvent
- *  @see Xinha#addDom0Event
- *  @param {DomNode}  the DOM element the event should be attached to 
- *  @param {String}   the name of the event to listen for (without leading "on")
- *  @param {function} the function to be called when the event is fired
- */
-
-Xinha.prependDom0Event = function(el, ev, fn)
-{
-  Xinha._prepareForDom0Events(el, ev);
-  el._xinha_dom0Events[ev].push(fn);
-};
-
-Xinha.getEvent = function(ev)
-{
-  return ev || window.event;
-};
-/**
- * Prepares an element to receive more than one DOM-0 event handler
- * when handlers are added via addDom0Event and prependDom0Event.
- *
- * @private
- */
-Xinha._prepareForDom0Events = function(el, ev)
-{
-  // Create a structure to hold our lists of event handlers
-  if ( typeof el._xinha_dom0Events == 'undefined' )
-  {
-    el._xinha_dom0Events = {};
-    Xinha.freeLater(el, '_xinha_dom0Events');
-  }
-
-  // Create a list of handlers for this event type
-  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]);
-    }
-
-    // Make the actual event handler, which runs through
-    // each of the handlers in the list and executes them
-    // in the correct context.
-    el['on'+ev] = function(event)
-    {
-      var a = el._xinha_dom0Events[ev];
-      // call previous submit methods if they were there.
-      var allOK = true;
-      for ( var i = a.length; --i >= 0; )
-      {
-        // We want the handler to be a member of the form, not the array, so that "this" will work correctly
-        el._xinha_tempEventHandler = a[i];
-        if ( el._xinha_tempEventHandler(event) === false )
-        {
-          el._xinha_tempEventHandler = null;
-          allOK = false;
-          break;
-        }
-        el._xinha_tempEventHandler = null;
-      }
-      return allOK;
-    };
-
-    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);
-    }
-  }
-};
-
-/** List of tag names that are defined as block level elements in HTML
- *  
- *  @private
- *  @see Xinha#isBlockElement
- *  @type {String}
- */
-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 ";
-
-/** Checks if one element is in the list of elements that are defined as block level elements in HTML
- *  
- *  @param {DomNode}  el The DOM element to check
- *  @returns {Boolean}
- */
-Xinha.isBlockElement = function(el)
-{
-  return el && el.nodeType == 1 && (Xinha._blockTags.indexOf(" " + el.tagName.toLowerCase() + " ") != -1);
-};
-/** List of tag names that are allowed to contain a paragraph
- *  
- *  @private
- *  @see Xinha#isParaContainer
- *  @type {String}
- */
-Xinha._paraContainerTags = " body td th caption fieldset div ";
-/** Checks if one element is in the list of elements that are allowed to contain a paragraph in HTML
- *  
- *  @param {DomNode}  el The DOM element to check
- *  @returns {Boolean}
- */
-Xinha.isParaContainer = function(el)
-{
-  return el && el.nodeType == 1 && (Xinha._paraContainerTags.indexOf(" " + el.tagName.toLowerCase() + " ") != -1);
-};
-
-
-/** These are all the tags for which the end tag is not optional or  forbidden, taken from the list at:
- *   http: www.w3.org/TR/REC-html40/index/elements.html
- *  
- *  @private
- *  @see Xinha#needsClosingTag
- *  @type String
- */
-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 ";
-
-/** Checks if one element is in the list of elements for which the end tag is not optional or  forbidden in HTML
- *  
- *  @param {DomNode}  el The DOM element to check
- *  @returns {Boolean}
- */
-Xinha.needsClosingTag = function(el)
-{
-  return el && el.nodeType == 1 && (Xinha._closingTags.indexOf(" " + el.tagName.toLowerCase() + " ") != -1);
-};
-
-/** Performs HTML encoding of some given string (converts HTML special characters to entities)
- *  
- *  @param {String}  str The unencoded input
- *  @returns {String} The encoded output
- */
-Xinha.htmlEncode = function(str)
-{
-  if (!str)
-  {
-    return '';
-  }  if ( typeof str.replace == 'undefined' )
-  {
-    str = str.toString();
-  }
-  // we don't need regexp for that, but.. so be it for now.
-  str = str.replace(/&/ig, "&amp;");
-  str = str.replace(/</ig, "&lt;");
-  str = str.replace(/>/ig, "&gt;");
-  str = str.replace(/\xA0/g, "&nbsp;"); // Decimal 160, non-breaking-space
-  str = str.replace(/\x22/g, "&quot;");
-  // \x22 means '"' -- we use hex reprezentation so that we don't disturb
-  // JS compressors (well, at least mine fails.. ;)
-  return str;
-};
-
-/** Strips host-part of URL which is added by browsers to links relative to server root
- *  
- *  @param {String}  string 
- *  @returns {String} 
- */
-Xinha.prototype.stripBaseURL = function(string)
-{
-  if ( this.config.baseHref === null || !this.config.stripBaseHref )
-  {
-    return string;
-  }
-  var baseurl = this.config.baseHref.replace(/^(https?:\/\/[^\/]+)(.*)$/, '$1');
-  var basere = new RegExp(baseurl);
-  return string.replace(basere, "");
-};
-
-if (typeof String.prototype.trim != 'function')
-{
-  /** Removes whitespace from beginning and end of a string. Custom implementation for JS engines that don't support it natively
-   *  
-   *  @returns {String} 
-   */
-  String.prototype.trim = function()
-  {
-    return this.replace(/^\s+/, '').replace(/\s+$/, '');
-  };
-}
-
-/** Creates a rgb-style rgb(r,g,b) color from a (24bit) number
- *  
- *  @param {Integer}
- *  @returns {String} rgb(r,g,b) color definition
- */
-Xinha._makeColor = function(v)
-{
-  if ( typeof v != "number" )
-  {
-    // already in rgb (hopefully); IE doesn't get here.
-    return v;
-  }
-  // IE sends number; convert to rgb.
-  var r = v & 0xFF;
-  var g = (v >> 8) & 0xFF;
-  var b = (v >> 16) & 0xFF;
-  return "rgb(" + r + "," + g + "," + b + ")";
-};
-
-/** Returns hexadecimal color representation from a number or a rgb-style color.
- *  
- *  @param {String|Integer} v rgb(r,g,b) or 24bit color definition
- *  @returns {String} #RRGGBB color definition
- */
-Xinha._colorToRgb = function(v)
-{
-  if ( !v )
-  {
-    return '';
-  }
-  var r,g,b;
-  // @todo: why declaring this function here ? This needs to be a public methode of the object Xinha._colorToRgb
-  // returns the hex representation of one byte (2 digits)
-  function hex(d)
-  {
-    return (d < 16) ? ("0" + d.toString(16)) : d.toString(16);
-  }
-
-  if ( typeof v == "number" )
-  {
-    // we're talking to IE here
-    r = v & 0xFF;
-    g = (v >> 8) & 0xFF;
-    b = (v >> 16) & 0xFF;
-    return "#" + hex(r) + hex(g) + hex(b);
-  }
-
-  if ( v.substr(0, 3) == "rgb" )
-  {
-    // in rgb(...) form -- Mozilla
-    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);
-    }
-    // doesn't match RE?!  maybe uses percentages or float numbers
-    // -- FIXME: not yet implemented.
-    return null;
-  }
-
-  if ( v.substr(0, 1) == "#" )
-  {
-    // already hex rgb (hopefully :D )
-    return v;
-  }
-
-  // if everything else fails ;)
-  return null;
-};
-
-/** Modal popup dialogs
- *  
- *  @param {String} url URL to the popup dialog
- *  @param {Function} action A function that receives one value; this function will get called 
- *                    after the dialog is closed, with the return value of the dialog.
- *  @param {Mixed} init A variable that is passed to the popup window to pass arbitrary data
- */
-Xinha.prototype._popupDialog = function(url, action, init)
-{
-  Dialog(this.popupURL(url), action, init);
-};
-
-/** Creates a path in the form _editor_url + "plugins/" + plugin + "/img/" + file
- *  
- *  @deprecated
- *  @param {String} file Name of the image
- *  @param {String} plugin optional If omitted, simply _editor_url + file is returned 
- *  @returns {String}
- */
-Xinha.prototype.imgURL = function(file, plugin)
-{
-  if ( typeof plugin == "undefined" )
-  {
-    return _editor_url + file;
-  }
-  else
-  {
-    return Xinha.getPluginDir(plugin) + "/img/" + file;
-  }
-};
-/** Creates a path
- *  
- *  @deprecated
- *  @param {String} file Name of the popup
- *  @returns {String}
- */
-Xinha.prototype.popupURL = function(file)
-{
-  var url = "";
-  if ( file.match(/^plugin:\/\/(.*?)\/(.*)/) )
-  {
-    var plugin = RegExp.$1;
-    var popup = RegExp.$2;
-    if ( !/\.(html?|php)$/.test(popup) )
-    {
-      popup += ".html";
-    }
-    url = Xinha.getPluginDir(plugin) + "/popups/" + popup;
-  }
-  else if ( file.match(/^\/.*?/) || file.match(/^[a-z]+?:/))
-  {
-    url = file;
-  }
-  else
-  {
-    url = _editor_url + this.config.popupURL + file;
-  }
-  return url;
-};
-
-
-
-/** FIX: Internet Explorer returns an item having the _name_ equal to the given
- * id, even if it's not having any id.  This way it can return a different form
- * field, even if it's not a textarea.  This workarounds the problem by
- * specifically looking to search only elements having a certain tag name.
- * @param {String} tag The tag name to limit the return to
- * @param {String} id
- * @returns {DomNode}
- */
-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;
-};
-
-
-/** Use some CSS trickery to toggle borders on tables 
- *	@returns {Boolean} always true
- */
-
-Xinha.prototype._toggleBorders = function()
-{
-  var tables = this._doc.getElementsByTagName('TABLE');
-  if ( tables.length !== 0 )
-  {
-   if ( !this.borders )
-   {    
-    this.borders = true;
-   }
-   else
-   {
-     this.borders = false;
-   }
-
-   for ( var i=0; i < tables.length; i++ )
-   {
-     if ( this.borders )
-     {
-        Xinha._addClass(tables[i], 'htmtableborders');
-     }
-     else
-     {
-       Xinha._removeClass(tables[i], 'htmtableborders');
-     }
-   }
-  }
-  return true;
-};
-/** Adds the styles for table borders to the iframe during generation
- *  
- *  @private
- *  @see Xinha#stripCoreCSS
- *  @param {String} html optional  
- *  @returns {String} html HTML with added styles or only styles if html omitted
- */
-Xinha.addCoreCSS = function(html)
-{
-    var coreCSS = "<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>' + coreCSS);      
-    }
-    else if ( html)
-    {
-      return coreCSS + html;
-    }
-    else
-    {
-      return coreCSS;
-    }
-};
-/** Allows plugins to add a stylesheet for internal use to the edited document that won't appear in the HTML output
- *  
- *  @see Xinha#stripCoreCSS
- *  @param {String} stylesheet URL of the styleshett to be added
- */
-Xinha.prototype.addEditorStylesheet = function (stylesheet)
-{
-    var style = this._doc.createElement("link");
-    style.rel = 'stylesheet';
-    style.type = 'text/css';
-    style.title = 'XinhaInternalCSS';
-    style.href = stylesheet;
-    this._doc.getElementsByTagName("HEAD")[0].appendChild(style);
-};
-/** Remove internal styles
- *  
- *  @private
- *  @see Xinha#addCoreCSS
- *  @param {String} html 
- *  @returns {String} 
- */
-Xinha.stripCoreCSS = function(html)
-{
-  return html.replace(/<style[^>]+title="XinhaInternalCSS"(.|\n)*?<\/style>/ig, '').replace(/<link[^>]+title="XinhaInternalCSS"(.|\n)*?>/ig, ''); 
-};
-/** Removes one CSS class (that is one of possible more parts 
- *   separated by spaces) from a given element
- *  
- *  @see Xinha#_removeClasses
- *  @param {DomNode}  el The DOM element the class will be removed from
- *  @param {String}   className The class to be removed
- */
-Xinha._removeClass = function(el, className)
-{
-  if ( ! ( el && el.className ) )
-  {
-    return;
-  }
-  var cls = el.className.split(" ");
-  var ar = [];
-  for ( var i = cls.length; i > 0; )
-  {
-    if ( cls[--i] != className )
-    {
-      ar[ar.length] = cls[i];
-    }
-  }
-  el.className = ar.join(" ");
-};
-/** Adds one CSS class  to a given element (that is, it expands its className property by the given string,
- *  separated by a space)
- *  
- *  @see Xinha#addClasses
- *  @param {DomNode}  el The DOM element the class will be added to
- *  @param {String}   className The class to be added
- */
-Xinha._addClass = function(el, className)
-{
-  // remove the class first, if already there
-  Xinha._removeClass(el, className);
-  el.className += " " + className;
-};
-
-/** Adds CSS classes  to a given element (that is, it expands its className property by the given string,
- *  separated by a space, thereby checking that no class is doubly added)
- *  
- *  @see Xinha#addClass
- *  @param {DomNode}  el The DOM element the classes will be added to
- *  @param {String}   classes The classes to be added
- */
-Xinha.addClasses = function(el, classes)
-{
-  if ( el !== null )
-  {
-    var thiers = el.className.trim().split(' ');
-    var ours   = classes.split(' ');
-    for ( var x = 0; x < ours.length; x++ )
-    {
-      var exists = false;
-      for ( var i = 0; exists === false && i < thiers.length; i++ )
-      {
-        if ( thiers[i] == ours[x] )
-        {
-          exists = true;
-        }
-      }
-      if ( exists === false )
-      {
-        thiers[thiers.length] = ours[x];
-      }
-    }
-    el.className = thiers.join(' ').trim();
-  }
-};
-
-/** Removes CSS classes (that is one or more of possibly several parts 
- *   separated by spaces) from a given element
- *  
- *  @see Xinha#_removeClasses
- *  @param {DomNode}  el The DOM element the class will be removed from
- *  @param {String}   className The class to be removed
- */
-Xinha.removeClasses = function(el, classes)
-{
-  var existing    = el.className.trim().split();
-  var new_classes = [];
-  var remove      = classes.trim().split();
-
-  for ( var i = 0; i < existing.length; i++ )
-  {
-    var found = false;
-    for ( var x = 0; x < remove.length && !found; x++ )
-    {
-      if ( existing[i] == remove[x] )
-      {
-        found = true;
-      }
-    }
-    if ( !found )
-    {
-      new_classes[new_classes.length] = existing[i];
-    }
-  }
-  return new_classes.join(' ');
-};
-
-/** Alias of Xinha._addClass()
- *  @see Xinha#_addClass
- */
-Xinha.addClass       = Xinha._addClass;
-/** Alias of Xinha.Xinha._removeClass()
- *  @see Xinha#_removeClass
- */
-Xinha.removeClass    = Xinha._removeClass;
-/** Alias of Xinha.addClasses()
- *  @see Xinha#addClasses
- */
-Xinha._addClasses    = Xinha.addClasses;
-/** Alias of Xinha.removeClasses()
- *  @see Xinha#removeClasses
- */
-Xinha._removeClasses = Xinha.removeClasses;
-
-/** Checks if one element has set the given className
- *  
- *  @param {DomNode}  el The DOM element to check
- *  @param {String}   className The class to be looked for
- *  @returns {Boolean}
- */
-Xinha._hasClass = function(el, className)
-{
-  if ( ! ( el && el.className ) )
-  {
-    return false;
-  }
-  var cls = el.className.split(" ");
-  for ( var i = cls.length; i > 0; )
-  {
-    if ( cls[--i] == className )
-    {
-      return true;
-    }
-  }
-  return false;
-};
-
-/**
- * Use XMLHTTPRequest to post some data back to the server and do something
- * with the response (asyncronously!), this is used by such things as the tidy
- * functions
- * @param {String} url The address for the HTTPRequest
- * @param {Object} data The data to be passed to the server like {name:"value"}
- * @param {Function} success A function that is called when an answer is
- *                           received from the server with the responseText as argument.
- * @param {Function} failure A function that is called when we fail to receive
- *                           an answer from the server. We pass it the request object.
- */
- 
-/** mod_security (an apache module which scans incoming requests for potential hack attempts)
- *  has a rule which triggers when it gets an incoming Content-Type with a charset
- *  see ticket:1028 to try and work around this, if we get a failure in a postback
- *  then Xinha._postback_send_charset will be set to false and the request tried again (once)
- *  @type Boolean
- *  @private
- */ 
-// 
-// 
-// 
-Xinha._postback_send_charset = true;
-/** Use XMLHTTPRequest to send some some data to the server and do something
- *  with the getback (asyncronously!)
- * @param {String} url The address for the HTTPRequest
- * @param {Function} success A function that is called when an answer is
- *                           received from the server with the responseText as argument.
- * @param {Function} failure A function that is called when we fail to receive
- *                           an answer from the server. We pass it the request object.
- */
-Xinha._postback = function(url, data, success, failure)
-{
-  var req = null;
-  req = Xinha.getXMLHTTPRequestObject();
-
-  var content = '';
-  if (typeof data == 'string')
-  {
-    content = data;
-  }
-  else if(typeof data == "object")
-  {
-    for ( var i in data )
-    {
-      content += (content.length ? '&' : '') + i + '=' + encodeURIComponent(data[i]);
-    }
-  }
-
-  function callBack()
-  {
-    if ( req.readyState == 4 )
-    {
-      if ( ((req.status / 100) == 2) || Xinha.isRunLocally && req.status === 0 )
-      {
-        if ( typeof success == 'function' )
-        {
-          success(req.responseText, req);
-        }
-      }
-      else if(Xinha._postback_send_charset)
-      {        
-        Xinha._postback_send_charset = false;
-        Xinha._postback(url,data,success, failure);
-      }
-      else if (typeof failure == 'function')
-      {
-        failure(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(content);
-};
-
-/** Use XMLHTTPRequest to receive some data from the server and do something
- * with the it (asyncronously!)
- * @param {String} url The address for the HTTPRequest
- * @param {Function} success A function that is called when an answer is
- *                           received from the server with the responseText as argument.
- * @param {Function} failure A function that is called when we fail to receive
- *                           an answer from the server. We pass it the request object.
- */
-Xinha._getback = function(url, success, failure)
-{
-  var req = null;
-  req = Xinha.getXMLHTTPRequestObject();
-
-  function callBack()
-  {
-    if ( req.readyState == 4 )
-    {
-      if ( ((req.status / 100) == 2) || Xinha.isRunLocally && req.status === 0 )
-      {
-        success(req.responseText, req);
-      }
-      else if (typeof failure == 'function')
-      {
-        failure(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, successHandler, failHandler)
-{
-  var req = null;
-  req = Xinha.getXMLHTTPRequestObject();
-
-  function callBack()
-  {
-    if ( req.readyState == 4 )
-    {
-      if ( ((req.status / 100) == 2) || Xinha.isRunLocally && req.status === 0 )
-      {
-        if (successHandler) 
-        {
-          successHandler(req);
-        }
-      }
-      else
-      {
-        if (failHandler) 
-        {
-          failHandler(req);
-        }
-      }
-    }
-  }
-
-  // Opera seems to have some problems mixing HEAD requests with GET requests.
-  // The GET is slower, so it's a net slowdown for Opera, but it keeps things
-  // from breaking.
-  var method = 'GET';
-  req.onreadystatechange = callBack;
-  req.open(method, url, true);
-  req.send(null);
-};
-
-/** Use XMLHTTPRequest to receive some data from the server syncronously
- *  @param {String} url The address for the HTTPRequest
- */
-Xinha._geturlcontent = function(url, returnXML)
-{
-  var req = null;
-  req = Xinha.getXMLHTTPRequestObject();
-
-  // Synchronous!
-  req.open('GET', url, false);
-  req.send(null);
-  if ( ((req.status / 100) == 2) || Xinha.isRunLocally && req.status === 0 )
-  {
-    return (returnXML) ? req.responseXML : req.responseText;
-  }
-  else
-  {
-    return '';
-  }
-};
-
-
-/** Use XMLHTTPRequest to send some some data to the server and return the result synchronously
- *
- * @param {String} url The address for the HTTPRequest
- * @param data the data to send, streing or array
- */
-Xinha._posturlcontent = function(url, data, returnXML)
-{
-  var req = null;
-  req = Xinha.getXMLHTTPRequestObject();
-
-  var content = '';
-  if (typeof data == 'string')
-  {
-    content = data;
-  }
-  else if(typeof data == "object")
-  {
-    for ( var i in data )
-    {
-      content += (content.length ? '&' : '') + i + '=' + encodeURIComponent(data[i]);
-    }
-  }
-
-  req.open('POST', url, false);    
-  req.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded'+(Xinha._postback_send_charset ? '; charset=UTF-8' : ''));
-  req.send(content);
-  
-  if ( ((req.status / 100) == 2) || Xinha.isRunLocally && req.status === 0 )
-  {
-    return (returnXML) ? req.responseXML : req.responseText;
-  }
-  else
-  {
-    return '';
-  }
-  
-};
-// Unless somebody already has, make a little function to debug things
-
-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 )
-{
-  /** Walks through an array and checks if the specified item exists in it
-  * @param {String} needle The string to search for
-  * @returns {Boolean} True if item found, false otherwise 
-  */
-  Array.prototype.contains = function(needle)
-  {
-    var haystack = this;
-    for ( var i = 0; i < haystack.length; i++ )
-    {
-      if ( needle == haystack[i] )
-      {
-        return true;
-      }
-    }
-    return false;
-  };
-}
-
-if ( !Array.prototype.indexOf )
-{
-  /** Walks through an array and, if the specified item exists in it, returns the position
-  * @param {String} needle The string to search for
-  * @returns {Integer|-1} Index position if item found, -1 otherwise (same as built in js)
-  */
-  Array.prototype.indexOf = function(needle)
-  {
-    var haystack = this;
-    for ( var i = 0; i < haystack.length; i++ )
-    {
-      if ( needle == haystack[i] )
-      {
-        return i;
-      }
-    }
-    return -1;
-  };
-}
-if ( !Array.prototype.append )
-{
-  /** Adds an item to an array
-   * @param {Mixed} a Item to add
-   * @returns {Array} The array including the newly added item
-   */
-  Array.prototype.append  = function(a)
-  {
-    for ( var i = 0; i < a.length; i++ )
-    {
-      this.push(a[i]);
-    }
-    return this;
-  };
-}
-/** Executes a provided function once per array element.
- *  Custom implementation for JS engines that don't support it natively
- * @source http://developer.mozilla.org/En/Core_JavaScript_1.5_Reference/Global_Objects/Array/ForEach
- * @param {Function} fn Function to execute for each element
- * @param {Object} thisObject Object to use as this when executing callback. 
- */
-if (!Array.prototype.forEach)
-{
-  Array.prototype.forEach = function(fn /*, thisObject*/)
-  {
-    var len = this.length;
-    if (typeof fn != "function")
-    {
-      throw new TypeError();
-    }
-
-    var thisObject = arguments[1];
-    for (var i = 0; i < len; i++)
-    {
-      if (i in this)
-      {
-        fn.call(thisObject, this[i], i, this);
-      }
-    }
-  };
-}
-/** Returns all elements within a given class name inside an element
- * @type Array
- * @param {DomNode|document} el wherein to search
- * @param {Object} className
- */
-Xinha.getElementsByClassName = function(el,className)
-{
-  if (el.getElementsByClassName)
-  {
-    return Array.prototype.slice.call(el.getElementsByClassName(className));
-  }
-  else
-  {
-    var els = el.getElementsByTagName('*');
-    var result = [];
-    var classNames;
-    for (var i=0;i<els.length;i++)
-    {
-      classNames = els[i].className.split(' ');
-      if (classNames.contains(className)) 
-      {
-        result.push(els[i]);
-      }
-    }
-    return result;
-  }
-};
-
-/** Returns true if all elements of <em>a2</em> are also contained in <em>a1</em> (at least I think this is what it does)
-* @param {Array} a1
-* @param {Array} a2
-* @returns {Boolean}
-*/
-Xinha.arrayContainsArray = function(a1, a2)
-{
-  var all_found = true;
-  for ( var x = 0; x < a2.length; x++ )
-  {
-    var found = false;
-    for ( var i = 0; i < a1.length; i++ )
-    {
-      if ( a1[i] == a2[x] )
-      {
-        found = true;
-        break;
-      }
-    }
-    if ( !found )
-    {
-      all_found = false;
-      break;
-    }
-  }
-  return all_found;
-};
-/** Walks through an array and applies a filter function to each item
-* @param {Array} a1 The array to filter
-* @param {Function} filterfn If this function returns true, the item is added to the new array
-* @returns {Array} Filtered array
-*/
-Xinha.arrayFilter = function(a1, filterfn)
-{
-  var new_a = [ ];
-  for ( var x = 0; x < a1.length; x++ )
-  {
-    if ( filterfn(a1[x]) )
-    {
-      new_a[new_a.length] = a1[x];
-    }
-  }
-  return new_a;
-};
-/** Converts a Collection object to an array 
-* @param {Collection} collection The array to filter
-* @returns {Array} Array containing the item of collection
-*/
-Xinha.collectionToArray = function(collection)
-{
-  try
-  {
-    return collection.length ? Array.prototype.slice.call(collection) : []; //Collection to Array
-  }
-  catch(e)
-  {
-    // In certain implementations (*cough* IE), you can't call slice on a
-    // collection.  We'll fallback to using the simple, non-native iterative
-    // approach.
-  }
-
-  var array = [ ];
-  for ( var i = 0; i < collection.length; i++ )
-  {
-    array.push(collection.item(i));
-  }
-  return array;
-};
-
-/** Index for Xinha.uniq function 
-*	@private
-*/
-Xinha.uniq_count = 0;
-/** Returns a string that is unique on the page
-*	@param {String} prefix This string is prefixed to a running number
-*   @returns {String}
-*/
-Xinha.uniq = function(prefix)
-{
-  return prefix + Xinha.uniq_count++;
-};
-
-// New language handling functions
-
-/** Load a language file.
- *  This function should not be used directly, Xinha._lc will use it when necessary.
- *  @private
- *  @param {String} context Case sensitive context name, eg 'Xinha', 'TableOperations', ...
- *  @returns {Object}
- */
-Xinha._loadlang = function(context,url)
-{
-  var lang;
-  
-  if ( typeof _editor_lcbackend == "string" )
-  {
-    //use backend
-    url = _editor_lcbackend;
-    url = url.replace(/%lang%/, _editor_lang);
-    url = url.replace(/%context%/, context);
-  }
-  else if (!url)
-  {
-    //use internal files
-    if ( context != 'Xinha')
-    {
-      url = Xinha.getPluginDir(context)+"/lang/"+_editor_lang+".js";
-    }
-    else
-    {
-      Xinha.setLoadingMessage("Loading language");
-      url = _editor_url+"lang/"+_editor_lang+".js";
-    }
-  }
-
-  var langData = Xinha._geturlcontent(url);
-  if ( langData !== "" )
-  {
-    try
-    {
-      eval('lang = ' + langData);
-    }
-    catch(ex)
-    {
-      alert('Error reading Language-File ('+url+'):\n'+Error.toString());
-      lang = {};
-    }
-  }
-  else
-  {
-    Xinha.debugMsg("Unable to read Language File '"+url+"' or file blank, either does not exist (which is probably ok) or permissions issue (which is probably not ok).", 'info');
-    lang = {};
-  }
-
-  return lang;
-};
-
-/** Return a localised string.
- * @param {String} string English language string. It can also contain variables in the form "Some text with $variable=replaced text$". 
- *                  This replaces $variable in "Some text with $variable" with "replaced text"
- * @param {String} context   Case sensitive context name, eg 'Xinha' (default), 'TableOperations'...
- * @param {Object} replace   Replace $variables in String, eg {foo: 'replaceText'} ($foo in string will be replaced by replaceText)
- */
-Xinha._lc = function(string, context, replace)
-{
-  var url,ret;
-  if (typeof context == 'object' && context.url && context.context)
-  {
-    url = context.url + _editor_lang + ".js";
-    context = context.context;
-  }
-
-  var m = null;
-  if (typeof string == 'string') 
-  {
-    m = string.match(/\$(.*?)=(.*?)\$/g);
-  }
-  if (m) 
-  {
-    if (!replace) 
-    {
-      replace = {};
-    }
-    for (var i = 0;i<m.length;i++)
-    {
-      var n = m[i].match(/\$(.*?)=(.*?)\$/);
-      replace[n[1]] = n[2];
-      string = string.replace(n[0],'$'+n[1]);
-    }
-  }
-  if ( _editor_lang == "en" )
-  {
-    if ( typeof string == 'object' && string.string )
-    {
-      ret = string.string;
-    }
-    else
-    {
-      ret = string;
-    }
-  }
-  else
-  {
-    
-    if ( typeof Xinha._lc_catalog == 'undefined' )
-    {
-      Xinha._lc_catalog = [ ];
-    }
-
-    if ( typeof context == 'undefined' )
-    {
-      context = 'Xinha';
-    }
-
-    // By default we will try and load a merged language file so that the user
-    //  is not loading quite so many javascript files just for language data
-    if ( typeof _editor_lang_merged_file == 'undefined' || _editor_lang_merged_file === true )
-    {
-      _editor_lang_merged_file = _editor_url + 'lang/merged/' + _editor_lang+'.js';
-    }
-    
-    // Allow to provide an explicitly merged translation file for testing translations 
-    // (and for easy using a merged translation set)    
-    if ( typeof _editor_lang_merged_file == 'string' )
-    {
-      // Note that if this fails to load (doesn't exist)
-      //  then we will get an empty object
-      Xinha._lc_catalog = Xinha._loadlang(null, _editor_lang_merged_file);
-      _editor_lang_merged_file = null;
-      
-      // Resolve the __NEW_TRANSLATIONS__ section by pushing it's translations
-      //  back one level into the catalog proper
-      if(typeof Xinha._lc_catalog['__NEW_TRANSLATIONS__'])
-      {
-        for(var moduleName in Xinha._lc_catalog['__NEW_TRANSLATIONS__'])
-        {
-          for(var englishString in Xinha._lc_catalog['__NEW_TRANSLATIONS__'][moduleName])
-          {
-            var translatedString = Xinha._lc_catalog['__NEW_TRANSLATIONS__'][moduleName][englishString];
-            if(translatedString.match(/<<([A-Za-z0-9_]+)(:.*)?>>/))
-            {
-              var linkedModule = RegExp.$1;
-              if(typeof Xinha._lc_catalog[linkedModule] != 'undefined' && typeof Xinha._lc_catalog[linkedModule][englishString] == 'string')
-              {
-                translatedString = Xinha._lc_catalog[linkedModule][englishString];
-              }
-              else
-              {
-                translatedString = '';
-              }
-            }
-            
-            if(translatedString.length)
-            {
-              if(typeof Xinha._lc_catalog[moduleName] == 'undefined')
-              {
-                Xinha._lc_catalog[moduleName] = { };
-              }
-              Xinha._lc_catalog[moduleName][englishString] = translatedString;
-            }
-          }
-        }
-      }
-    }
-    
-    if ( typeof Xinha._lc_catalog[context] == 'undefined' )
-    {
-      Xinha._lc_catalog[context] = Xinha._loadlang(context,url);
-    }
-
-    var key;
-    if ( typeof string == 'object' && string.key )
-    {
-      key = string.key;
-    }
-    else if ( typeof string == 'object' && string.string )
-    {
-      key = string.string;
-    }
-    else
-    {
-      key = string;
-    }
-
-    if ( typeof Xinha._lc_catalog[context][key] == 'undefined' )
-    {
-      if ( context=='Xinha' )
-      {
-        // Indicate it's untranslated
-        if ( typeof string == 'object' && string.string )
-        {
-          ret = string.string;
-        }
-        else
-        {
-          ret = string;
-        }
-      }
-      else 
-      {
-        // See if the Xinha context has it, if so use that as it must be 
-        //  something more global probably
-        if(typeof Xinha._lc_catalog['Xinha'][key] != 'undefined')
-        {
-          return  Xinha._lc(string, 'Xinha', replace);
-        }
-        
-        // See if we have it in our OBSOLETE, if so use that
-        //  it might be that this means we obsoleted something mistakenly
-        //  because lc_parse_strings.php didn't find it
-        else if( typeof Xinha._lc_catalog[context]['__OBSOLETE__'] != 'undefined'
-         && typeof Xinha._lc_catalog[context]['__OBSOLETE__'][key] != 'undefined' )
-        {
-          ret = Xinha._lc_catalog[context]['__OBSOLETE__'][key];
-          Xinha.debugMsg("Using a translation which is marked __OBSOLETE__, likely lc_parse_strings.php did not pick something up that it should have. " + context + ": " + key, 'warn');
-        }
-        
-        // If string is not found and context is not Xinha, fall back to Xinha
-        //  now and it will do some funky stuff (above) I'm not sure exactly
-        //  what the purpose of it (passing an object as string) was
-        else 
-        {
-          return Xinha._lc(string, 'Xinha', replace);
-        }
-      }
-    }
-    else
-    {
-      ret = Xinha._lc_catalog[context][key];
-    }
-  }
-
-  if ( typeof string == 'object' && string.replace )
-  {
-    replace = string.replace;
-  }
-  if ( typeof replace != "undefined" )
-  {
-    for ( i in replace )
-    {
-      ret = ret.replace('$'+i, replace[i]);
-    }
-  }
-
-  return ret;
-};
-/** Walks through the children of a given element and checks if any of the are visible (= not display:none)
- * @param {DomNode} el 
- * @returns {Boolean} 
- */
-Xinha.hasDisplayedChildren = function(el)
-{
-  var children = el.childNodes;
-  for ( var i = 0; i < children.length; i++ )
-  {
-    if ( children[i].tagName )
-    {
-      if ( children[i].style.display != 'none' )
-      {
-        return true;
-      }
-    }
-  }
-  return false;
-};
-
-/** Load a javascript file by inserting it in the HEAD tag and eventually call a function when loaded
- *
- *  Note that this method cannot be abstracted into browser specific files
- *  because this method LOADS the browser specific files.  Hopefully it should work for most
- *  browsers as it is.
- *
- * @param {String} url               Source url of the file to load
- * @param {Object} callback optional Callback function to launch once ready 
- * @param {Object} scope    optional Application scope for the callback function
- * @param {Object} bonus    optional Arbitrary object send as a param to the callback function
- */
-Xinha._loadback = function(url, callback, scope, bonus)
-{  
-  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 ( callback )
-  {
-    s[t] = function()
-    {      
-      if (Xinha.is_ie && (!/loaded|complete/.test(window.event.srcElement.readyState)))
-      {
-        return;
-      }
-      
-      callback.call(scope ? scope : this, bonus);
-      s[t] = null;
-    };
-  }
-  document.getElementsByTagName("head")[0].appendChild(s);
-  return false;
-};
-
-/** Xinha's main loading function (see NewbieGuide)
- * @param {Array} editor_names
- * @param {Xinha.Config} default_config
- * @param {Array} plugin_names
- * @returns {Object} An object that contains references to all created editors indexed by the IDs of the textareas 
- */
-Xinha.makeEditors = function(editor_names, default_config, plugin_names)
-{
-  if (!Xinha.isSupportedBrowser) 
-  {
-    return;
-  }
-  
-  if ( typeof default_config == 'function' )
-  {
-    default_config = default_config();
-  }
-
-  var editors = {};
-  var textarea;
-  for ( var x = 0; x < editor_names.length; x++ )
-  {
-    if ( typeof editor_names[x] == 'string' ) // the regular case, an id of a textarea
-    {
-      textarea = Xinha.getElementById('textarea', editor_names[x] );
-      if (!textarea) // the id may be specified for a textarea that is maybe on another page; we simply skip it and go on
-      {
-        editor_names[x] = null;
-        continue;
-      }
-    }
-	 // make it possible to pass a reference instead of an id, for example from  document.getElementsByTagName('textarea')
-    else if ( typeof editor_names[x] == 'object' && editor_names[x].tagName && editor_names[x].tagName.toLowerCase() == 'textarea' )
-    {
-      textarea =  editor_names[x];
-      if ( !textarea.id ) // we'd like to have the textarea have an id
-      {
-        textarea.id = 'xinha_id_' + x;
-      } 
-    }
-    var editor = new Xinha(textarea, Xinha.cloneObject(default_config));
-    editor.registerPlugins(plugin_names);
-    editors[textarea.id] = editor;
-  }
-  return editors;
-};
-/** Another main loading function (see NewbieGuide)
- * @param {Object} editors As returned by Xinha.makeEditors()
- */
-Xinha.startEditors = function(editors)
-{
-  if (!Xinha.isSupportedBrowser) 
-  {
-    return;
-  }
-  
-  for ( var i in editors )
-  {
-    if ( editors[i].generate )
-    {
-      editors[i].generate();
-    }
-  }
-};
-/** Registers the loaded plugins with the editor
- * @private
- * @param {Array} plugin_names
- */
-Xinha.prototype.registerPlugins = function(plugin_names)
-{
-  if (!Xinha.isSupportedBrowser) 
-  {
-    return;
-  }
-  
-  if ( plugin_names )
-  {
-    for ( var i = 0; i < plugin_names.length; i++ )
-    {
-      this.setLoadingMessage(Xinha._lc('Register plugin $plugin', 'Xinha', {'plugin': plugin_names[i]}));
-      this.registerPlugin(plugin_names[i]);
-    }
-  }
-};
-
-/** Utility function to base64_encode some arbitrary data, uses the builtin btoa() if it exists (Moz) 
-*  @param {String} input
-*  @returns {String}
-*/
-Xinha.base64_encode = function(input)
-{
-  var keyStr = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=";
-  var output = "";
-  var chr1, chr2, chr3;
-  var enc1, enc2, enc3, enc4;
-  var i = 0;
-
-  do
-  {
-    chr1 = input.charCodeAt(i++);
-    chr2 = input.charCodeAt(i++);
-    chr3 = input.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;
-    }
-
-    output = output + keyStr.charAt(enc1) + keyStr.charAt(enc2) + keyStr.charAt(enc3) + keyStr.charAt(enc4);
-  } while ( i < input.length );
-
-  return output;
-};
-
-/** Utility function to base64_decode some arbitrary data, uses the builtin atob() if it exists (Moz)
- *  @param {String} input
- *  @returns {String}
- */
-Xinha.base64_decode = function(input)
-{
-  var keyStr = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=";
-  var output = "";
-  var chr1, chr2, chr3;
-  var enc1, enc2, enc3, enc4;
-  var i = 0;
-
-  // remove all characters that are not A-Z, a-z, 0-9, +, /, or =
-  input = input.replace(/[^A-Za-z0-9\+\/\=]/g, "");
-
-  do
-  {
-    enc1 = keyStr.indexOf(input.charAt(i++));
-    enc2 = keyStr.indexOf(input.charAt(i++));
-    enc3 = keyStr.indexOf(input.charAt(i++));
-    enc4 = keyStr.indexOf(input.charAt(i++));
-
-    chr1 = (enc1 << 2) | (enc2 >> 4);
-    chr2 = ((enc2 & 15) << 4) | (enc3 >> 2);
-    chr3 = ((enc3 & 3) << 6) | enc4;
-
-    output = output + String.fromCharCode(chr1);
-
-    if ( enc3 != 64 )
-    {
-      output = output + String.fromCharCode(chr2);
-    }
-    if ( enc4 != 64 )
-    {
-      output = output + String.fromCharCode(chr3);
-    }
-  } while ( i < input.length );
-
-  return output;
-};
-/** Removes a node from the DOM
- *  @param {DomNode} el The element to be removed
- *  @returns {DomNode} The removed element
- */
-Xinha.removeFromParent = function(el)
-{
-  if ( !el.parentNode )
-  {
-    return;
-  }
-  var pN = el.parentNode;
-  return pN.removeChild(el);
-};
-/** Checks if some element has a parent node
- *  @param {DomNode} el 
- *  @returns {Boolean}
- */
-Xinha.hasParentNode = function(el)
-{
-  if ( el.parentNode )
-  {
-    // When you remove an element from the parent in IE it makes the parent
-    // of the element a document fragment.  Moz doesn't.
-    if ( el.parentNode.nodeType == 11 )
-    {
-      return false;
-    }
-    return true;
-  }
-
-  return false;
-};
-/** Determines if a given element has a given attribute.  IE<8 doesn't support it nativly */
-Xinha.hasAttribute = function(el,at)
-{
-  if(typeof el.hasAttribute == 'undefined')
-  {
-    var node = el.getAttributeNode(at);
-    return !!(node && (node.specified || node.nodeValue));
-  }
-  
-  return el.hasAttribute(at);
-}
-
-/** Detect the size of visible area
- *  @param {Window} scope optional When calling from a popup window, pass its window object to get the values of the popup
- *  @returns {Object} Object with Integer properties x and y
- */
-Xinha.viewportSize = function(scope)
-{
-  scope = (scope) ? scope : window;
-  var x,y;
-  if (scope.innerHeight) // all except Explorer
-  {
-    x = scope.innerWidth;
-    y = scope.innerHeight;
-  }
-  else if (scope.document.documentElement && scope.document.documentElement.clientHeight)
-  // Explorer 6 Strict Mode
-  {
-    x = scope.document.documentElement.clientWidth;
-    y = scope.document.documentElement.clientHeight;
-  }
-  else if (scope.document.body) // other Explorers
-  {
-    x = scope.document.body.clientWidth;
-    y = scope.document.body.clientHeight;
-  }
-  return {'x':x,'y':y};
-};
-/** Detect the size of the whole document
- *  @param {Window} scope optional When calling from a popup window, pass its window object to get the values of the popup
- *  @returns {Object} Object with Integer properties x and y
- */
-Xinha.pageSize = function(scope)
-{
-  scope = (scope) ? scope : window;
-  var x,y;
- 
-  var test1 = scope.document.body.scrollHeight; //IE Quirks
-  var test2 = scope.document.documentElement.scrollHeight; // IE Standard + Moz Here quirksmode.org errs! 
-
-  if (test1 > test2) 
-  {
-    x = scope.document.body.scrollWidth;
-    y = scope.document.body.scrollHeight;
-  }
-  else
-  {
-    x = scope.document.documentElement.scrollWidth;
-    y = scope.document.documentElement.scrollHeight;
-  }  
-  return {'x':x,'y':y};
-};
-/** Detect the current scroll position
- *  @param {Window} scope optional When calling from a popup window, pass its window object to get the values of the popup
- *  @returns {Object} Object with Integer properties x and y
- */
-Xinha.prototype.scrollPos = function(scope)
-{
-  scope = (scope) ? scope : window;
-  var x,y;
-  if (typeof scope.pageYOffset != 'undefined') // all except Explorer
-  {
-    x = scope.pageXOffset;
-    y = scope.pageYOffset;
-  }
-  else if (scope.document.documentElement && typeof document.documentElement.scrollTop != 'undefined')
-    // Explorer 6 Strict
-  {
-    x = scope.document.documentElement.scrollLeft;
-    y = scope.document.documentElement.scrollTop;
-  }
-  else if (scope.document.body) // all other Explorers
-  {
-    x = scope.document.body.scrollLeft;
-    y = scope.document.body.scrollTop;
-  }
-  return {'x':x,'y':y};
-};
-
-/** Calculate the top and left pixel position of an element in the DOM.
- *  @param  {DomNode} element HTML Element
- *  @returns {Object} Object with Integer properties top and left
- */
- 
-Xinha.getElementTopLeft = function(element) 
-{
-  var curleft = 0;
-  var curtop =  0;
-  if (element.offsetParent) 
-  {
-    curleft = element.offsetLeft;
-    curtop = element.offsetTop;
-    while (element = element.offsetParent) 
-    {
-      curleft += element.offsetLeft;
-      curtop += element.offsetTop;
-    }
-  }
-  return { top:curtop, left:curleft };
-};
-/** Find left pixel position of an element in the DOM.
- *  @param  {DomNode} element HTML Element
- *  @returns {Integer} 
- */
-Xinha.findPosX = function(obj)
-{
-  var curleft = 0;
-  if ( obj.offsetParent )
-  {
-    return Xinha.getElementTopLeft(obj).left;
-  }
-  else if ( obj.x )
-  {
-    curleft += obj.x;
-  }
-  return curleft;
-};
-/** Find top pixel position of an element in the DOM.
- *  @param  {DomNode} element HTML Element
- *  @returns {Integer} 
- */
-Xinha.findPosY = function(obj)
-{
-  var curtop = 0;
-  if ( obj.offsetParent )
-  {
-    return Xinha.getElementTopLeft(obj).top;    
-  }
-  else if ( obj.y )
-  {
-    curtop += obj.y;
-  }
-  return curtop;
-};
-
-Xinha.createLoadingMessages = function(xinha_editors)
-{
-  if ( Xinha.loadingMessages || !Xinha.isSupportedBrowser ) 
-  {
-    return;
-  }
-  Xinha.loadingMessages = [];
-  
-  for (var i=0;i<xinha_editors.length;i++)
-  {
-    var e = typeof xinha_editors[i] == 'string' ? document.getElementById(xinha_editors[i]) : xinha_editors[i];
-    if (!e)
-    {
-      continue;
-    }
-    
-    Xinha.loadingMessages.push(Xinha.createLoadingMessage(e));
-  }
-};
-
-Xinha.createLoadingMessage = function(textarea,text)
-{ 
-  if ( document.getElementById("loading_" + textarea.id) || !Xinha.isSupportedBrowser)
-  {
-    return;
-  }
-  // Create and show the main loading message and the sub loading message for details of loading actions
-  // global element
-  var loading_message = document.createElement("div");
-  loading_message.id = "loading_" + textarea.id;
-  loading_message.className = "loading";
-  
-  loading_message.style.left = (Xinha.findPosX(textarea) + textarea.offsetWidth / 2) - 106 +  'px';
-  loading_message.style.top = (Xinha.findPosY(textarea) + textarea.offsetHeight / 2) - 50 +  'px';
-  // main static message
-  var loading_main = document.createElement("div");
-  loading_main.className = "loading_main";
-  loading_main.id = "loading_main_" + textarea.id;
-  loading_main.appendChild(document.createTextNode(Xinha._lc("Loading in progress. Please wait!")));
-  // sub dynamic message
-  var loading_sub = document.createElement("div");
-  loading_sub.className = "loading_sub";
-  loading_sub.id = "loading_sub_" + textarea.id;
-  text = text ? text : Xinha._lc("Loading Core");
-  loading_sub.appendChild(document.createTextNode(text));
-  loading_message.appendChild(loading_main);
-  loading_message.appendChild(loading_sub);
-  document.body.appendChild(loading_message);
-  
-  Xinha.freeLater(loading_message);
-  Xinha.freeLater(loading_main);
-  Xinha.freeLater(loading_sub);
-  
-  return loading_sub;
-};
-
-Xinha.prototype.setLoadingMessage = function(subMessage, mainMessage)
-{
-  if ( !document.getElementById("loading_sub_" + this._textArea.id) )
-  {
-    return;
-  }
-  document.getElementById("loading_main_" + this._textArea.id).innerHTML = mainMessage ? mainMessage : Xinha._lc("Loading in progress. Please wait!");
-  document.getElementById("loading_sub_" + this._textArea.id).innerHTML = subMessage;
-};
-
-Xinha.setLoadingMessage = function(string)
-{
-  if (!Xinha.loadingMessages) 
-  {
-    return;
-  }
-  for ( var i = 0; i < Xinha.loadingMessages.length; i++ )
-  {
-    Xinha.loadingMessages[i].innerHTML = string;
-  }
-};
-
-Xinha.prototype.removeLoadingMessage = function()
-{
-  if (document.getElementById("loading_" + this._textArea.id) )
-  {
-   document.body.removeChild(document.getElementById("loading_" + this._textArea.id));
-  }
-};
-
-Xinha.removeLoadingMessages = function(xinha_editors)
-{
-  for (var i=0;i< xinha_editors.length;i++)
-  {
-     if (!document.getElementById(xinha_editors[i])) 
-     {
-       continue;
-     }
-     var main = document.getElementById("loading_" + document.getElementById(xinha_editors[i]).id);
-     main.parentNode.removeChild(main);
-  }
-  Xinha.loadingMessages = null;
-};
-
-/** List of objects that have to be trated on page unload in order to work around the broken 
- * Garbage Collector in IE
- * @private
- * @see Xinha#freeLater
- * @see Xinha#free
- * @see Xinha#collectGarbageForIE
- */
-Xinha.toFree = [];
-/** Adds objects to Xinha.toFree 
- * @param {Object} object The object to free memory
- * @param (String} prop optional  The property to release
- * @private
- * @see Xinha#toFree
- * @see Xinha#free
- * @see Xinha#collectGarbageForIE
- */
-Xinha.freeLater = function(obj,prop)
-{
-  Xinha.toFree.push({o:obj,p:prop});
-};
-
-/** Release memory properties from object
- * @param {Object} object The object to free memory
- * @param (String} prop optional The property to release
- * @private
- * @see Xinha#collectGarbageForIE
- * @see Xinha#free
- */
-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 ) // if src (also lowsrc, and maybe dynsrc ) is set to null, a file named "null" is requested from the server (see #1001)
-    {
-      try { obj[prop] = null; } catch(x) {}
-    }
-  }
-};
-
-/** IE's Garbage Collector is broken very badly.  We will do our best to 
- *   do it's job for it, but we can't be perfect. Takes all objects from Xinha.free and releases sets the null
- * @private
- * @see Xinha#toFree
- * @see Xinha#free
- */
-
-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;
-  }
-};
-
-
-// The following methods may be over-ridden or extended by the browser specific
-// javascript files.
-
-
-/** Insert a node at the current selection point. 
- * @param {DomNode} toBeInserted
- */
-
-Xinha.prototype.insertNodeAtSelection = function(toBeInserted) { Xinha.notImplemented("insertNodeAtSelection"); };
-
-/** Get the parent element of the supplied or current selection. 
- *  @param {Selection} sel optional selection as returned by getSelection
- *  @returns {DomNode}
- */
-  
-Xinha.prototype.getParentElement      = function(sel) { Xinha.notImplemented("getParentElement"); };
-
-/**
- * Returns the selected element, if any.  That is,
- * the element that you have last selected in the "path"
- * at the bottom of the editor, or a "control" (eg image)
- *
- * @returns {DomNode|null}
- */
- 
-Xinha.prototype.activeElement         = function(sel) { Xinha.notImplemented("activeElement"); };
-
-/** 
- * Determines if the given selection is empty (collapsed).
- * @param {Selection} sel Selection object as returned by getSelection
- * @returns {Boolean}
- */
- 
-Xinha.prototype.selectionEmpty        = function(sel) { Xinha.notImplemented("selectionEmpty"); };
-/** 
- * Returns a range object to be stored 
- * and later restored with Xinha.prototype.restoreSelection()
- * @returns {Range}
- */
-
-Xinha.prototype.saveSelection = function() { Xinha.notImplemented("saveSelection"); };
-
-/** Restores a selection previously stored
- * @param {Range} savedSelection Range object as returned by Xinha.prototype.restoreSelection()
- */
-Xinha.prototype.restoreSelection = function(savedSelection)  { Xinha.notImplemented("restoreSelection"); };
-
-/**
- * Selects the contents of the given node.  If the node is a "control" type element, (image, form input, table)
- * the node itself is selected for manipulation.
- *
- * @param {DomNode} node 
- * @param {Integer} pos  Set to a numeric position inside the node to collapse the cursor here if possible. 
- */
-Xinha.prototype.selectNodeContents    = function(node,pos) { Xinha.notImplemented("selectNodeContents"); };
-
-/** Insert HTML at the current position, deleting the selection if any. 
- *  
- *  @param {String} html
- */
- 
-Xinha.prototype.insertHTML            = function(html) { Xinha.notImplemented("insertHTML"); };
-
-/** Get the HTML of the current selection.  HTML returned has not been passed through outwardHTML.
- *
- * @returns {String}
- */
-Xinha.prototype.getSelectedHTML       = function() { Xinha.notImplemented("getSelectedHTML"); };
-
-/** Get a Selection object of the current selection.  Note that selection objects are browser specific.
- *
- * @returns {Selection}
- */
- 
-Xinha.prototype.getSelection          = function() { Xinha.notImplemented("getSelection"); };
-
-/** Create a Range object from the given selection.  Note that range objects are browser specific.
- *  @see Xinha#getSelection
- *  @param {Selection} sel Selection object 
- *  @returns {Range}
- */
-Xinha.prototype.createRange           = function(sel) { Xinha.notImplemented("createRange"); };
-
-/** Different browsers have subtle differences in what they call a "keypress", we try and
- *  standardise them here.  For example, Firefox calls Tab a keypress (with keyCode 9)
- *  while WebKit does not record a keypress for the Tab key.
- * 
- *  Webkit does record a keydown for tab, but typically not a keyup as it's caused a 
- *  defocus by then, and there is no keypress.
- *  
- *  For the sake of Xinha, we will define keyPress something like...
- * 
- *   "Adding Characters"
- *      letters, numbers, space, punctuation, symbols, tab, enter
- * 
- *   "Deleting Characters"
- *      delete, backspace
- * 
- *   "Shortcuts and Other Useful Things"
- *      esc, ctrl-a, ctrl-b...
- * 
- * Note that in the interests of performance, we are not too strict about removing things
- *   that should not be keypresses if they don't happen frequently, like for example,
- *   Function Keys **might** get passed as onKeyPress, depending on browser, since it's
- *   rare and plugins probably won't be looking for them anyway, there's no sense
- *   wasting cycles looking for them.
- * 
- * If you are looking for something that is not "officially" a keypress as defined above
- *   use onKeyDown and you will get notifications for EVERY key down, even if it's for
- *   example a modifier like shift (eg ctrl-shift-a would give three keydowns), which is 
- *   why keypress is a better idea if you can do that.
- * 
- * Note also that you can listen to onShortCut to only hear about those if you want, 
- *   it gets a second argument of the shortcut key already decoded for you.
- * 
- * A useful key Tester is here:
- *    https://dvcs.w3.org/hg/d4e/raw-file/tip/key-event-test.html
- * 
- * A useful reference of DOM3 key names is here:
- *    https://developer.mozilla.org/en-US/docs/Web/API/KeyboardEvent/key/Key_Values
- * 
- * @param KeyboardEvent
- * @return boolean
- */
-
-Xinha.prototype.isKeyPressEvent = function(keyEvent)
-{
-  if(typeof Xinha.DOM3NotAKeyPress == 'undefined')
-  {
-    // The following regular expressions match KeyboardEvent.key for keys which should NOT be 
-    //  regarded as a keypress
-    //
-    // Note that we don't actually test them all, currently only modifier, navigation and editing
-    // are actually tested and excluded, the others wont' happen frequently enough to bother
-    // with testing.  It's not typically a big deal if keys slip-through the net and issue 
-    // a keypress as plugins will likely just skip it as an unknown key.
-    //
-    // See:   https://developer.mozilla.org/en-US/docs/Web/API/KeyboardEvent/key/Key_Values
-    
-    Xinha.DOM3NotAKeyPress = {
-      'modifier'    : /^(Alt|CapsLock|Control|F[0-9]+|FnLock|Hyper|Meta|NumLock|ScrollLock|Shift|Super|Symbol|OS|Scroll)/,
-      'navigation'  : /^(Arrow|Page|End|Home|Left|Right|Up|Down)/,
-      'editing'     : /^(Insert)/,
-      'ui'          : /^(Accept|Again|Attn|Cancel|ContextMenu|Execute|Find|Finish|Help|Pause|Play|Props|Select|Zoom|Pause|Apps)/,
-      'device'      : /^(Brightness|Eject|LoghOff|Power|Print|Hibernate|Standby|WakeUp)/,
-      'ime'         : /^(AllCandidates|Alphanumeric|CodeInput|Compose|Convert|Dead|FinalMode|Group|ModeChange|NextCandidate|NonConvert|PreviousCandidate|Process|SingleCandidate|Multi|Nonconvert|AltGraph)/,
-      'korean'      : /^(Hangul|Hanja|Junja)/,
-      'japanese'    : /^(Eisu|Hanakaku|Hirigana|Kana|Kanji|Katakana|Romanji|Zenkaku|RomanCharacters|HalfWidth|FullWidth)/,
-      'function'    : /^(F[0-9]+|Soft[0-9]+)/,
-      'phone'       : /^(AppSwitch|Call|Camera|EndCall|GoBack|GoHome|HeadsetHook|LastNumber|Notification|Manner|Voice|Exit|MozHomeScreen)/,
-      'multimedia'  : /^(Channel|Media|FastFwd)/,
-      'audio'       : /^(Audio|Microphone|Volume)/,
-      'tv'          : /^(TV|Live)/,
-      'media'       : /^(AVR|Color|ClosedCaption|Dummer|DisplaySwap|DVR|Exit|Favorite|Guide|Info|InstantReplay|Link|List|Live|Lock|Media|Navigate|Next|OnDemand|Pairing|PinP|Play|Random|RcLow|Record|RfBypass|ScanChannels|ScreenMode|Settings|SplitScreen|STBInput|Subtitle|Teletext|VideoMode|Wink|ZoomToggle|Zoom)/,
-      'speech'      : /^(Speech)/,
-      'document'    : /^(Close|New|Open|Print|Save|Spellcheck|Mail)/,
-      'application' : /^(Launch|MediaSelect|SelectMedia)/
-    };
-  }
-
-  if(keyEvent.type == 'keypress')
-  {
-    // Detect some things that might come in as a press and should not be a press
-    
-    //  DOM3 Keys
-    
-    if(typeof keyEvent.key != 'undefined')
-    {
-      if(keyEvent.key == 'Unidentified')
-      {
-        // Some old Gecko versions called Shift-tab Unidentified !
-        if(typeof keyEvent.keyCode != 'undefined' && keyEvent.keyCode == 9) return true;
-        return false;
-      }
-
-      // Modifier keys
-      if(Xinha.DOM3NotAKeyPress.modifier.test(keyEvent.key))   return false;
-         
-      // Navigation Keys
-      if(Xinha.DOM3NotAKeyPress.navigation.test(keyEvent.key)) return false;
-                
-      // Editing Keys
-      if(Xinha.DOM3NotAKeyPress.editing.test(keyEvent.key))    return false;
-           
-    }
-    // Old DOM3 (only Safari and old Chrome)
-    /* I could not find anything reported as a press that should not be in Safari 9.1 and that 
-     * is as far back as I can easily test, my thought is that dropping straight through to the 
-     * legacy keys should work fine so I have disabled this
-     */ 
-    else if( 0 && typeof keyEvent.keyIdentifier != 'undefined' && keyEvent.keyIdentifier.length)
-    {
-      var kI = parseInt(keyEvent.keyIdentifier.replace(/^U\+/,''),16);
-      
-    }
-    // Legacy Keys
-    else 
-    {
-      if(keyEvent.charCode == 0)
-      {
-        if((keyEvent.keyCode >= 37 && keyEvent.keyCode <= 40)) return false; // Arrows
-           
-        if(   keyEvent.keyCode == 45 // Insert
-          ||  keyEvent.keyCode == 36 // Home
-          ||  keyEvent.keyCode == 35 // End
-          ||  keyEvent.keyCode == 33 // Page Up
-          ||  keyEvent.keyCode == 34 // Page Dn
-          ||  keyEvent.keyCode == 19 // Pause/Break
-          ||  keyEvent.keyCode == 17 // Control
-          ||  keyEvent.keyCode == 18 // Alt
-          ||  keyEvent.keyCode == 20 // CapsLock
-          ||  keyEvent.keyCode == 91 // OS
-          ||  keyEvent.keyCode == 93 // ContextMenu          
-        ) return false;
-        
-        if( keyEvent.keyCode >= 112 && keyEvent <= 123 ) return false; // F1 through F12
-        if( keyEvent.keyCode == 0) return false; // Other things (like "LaunchApp1")
-      }
-    }
-   
-    // If it wasn't a bad thing we skiped, then a keypress is a keypress
-    return true;
-  }
-  else if(keyEvent.type == 'keydown')
-  {
-    // Now we get into browser specifics, we want to return true 
-    //  if the keydown event is for a key which should be reported as a press
-    //  and is NOT reported as  a press (otherwise press would fire twice for it)
-    return this.isKeyDownThatShouldGetButDoesNotGetAKeyPressEvent(keyEvent);
-  }
-};
-
-/** Due to browser differences, some keys which Xinha prefers to call a keyPress
- *   do not get an actual keypress event.  This browser specific function 
- *   overridden in the browser's engine (eg modules/WebKit/WebKit.js) as required
- *   takes a keydown event type and tells us if we should treat it as a 
- *   keypress event type.
- *
- *  To be clear, the keys we are interested here are
- *        Escape, Tab, Backspace, Delete, Enter
- *   these are "non printable" characters which we still want to regard generally
- *   as a keypress.  
- * 
- *  If the browser does not report these as a keypress
- *   ( https://dvcs.w3.org/hg/d4e/raw-file/tip/key-event-test.html )
- *   then this function must return true for such keydown events as it is
- *   given.
- * 
- * @param KeyboardEvent
- * @return boolean
- */
-
-Xinha.prototype.isKeyDownThatShouldGetButDoesNotGetAKeyPressEvent = function(keyEvent)
-{
-  return false;
-};
-
-/** Determines if the given key event object represents a combination of CTRL-<key>,
- *  which for Xinha is a shortcut.  Note that CTRL-ALT-<key> is not a shortcut.
- *
- *  @param    {Event} keyEvent
- *  @returns  {mixed} Either the key representing the short cut (eg ctrl-b gives 'b'), or false
- */
- 
-Xinha.prototype.isShortCut = function(keyEvent)
-{
-  if(keyEvent.ctrlKey && !keyEvent.altKey && this.getKey(keyEvent).length == 1)
-  {
-    return this.getKey(keyEvent);
-  }
-  
-  return false;
-};
-
-/** Return the character (as a string) of a keyEvent  - ie, press the 'a' key and
- *  this method will return 'a', press SHIFT-a and it will return 'A'.
- * 
- *  @param   {Event} keyEvent
- *  @returns {String}
- */
-                                   
-Xinha.prototype.getKey = function(keyEvent) { Xinha.notImplemented("getKey"); };
-
-/** Return the HTML string of the given Element, including the Element.
- * 
- * @param {DomNode} element HTML Element
- * @returns {String}
- */
- 
-Xinha.getOuterHTML = function(element) { Xinha.notImplemented("getOuterHTML"); };
-
-/** Get a new XMLHTTPRequest Object ready to be used. 
- *
- * @returns {XMLHTTPRequest}
- */
-
-Xinha.getXMLHTTPRequestObject = function() 
-{
-  try
-  {    
-    if (typeof XMLHttpRequest != "undefined" && typeof XMLHttpRequest.constructor == 'function' ) // Safari's XMLHttpRequest is typeof object
-    {
-  	  return new XMLHttpRequest();
-    }
-  	else if (typeof ActiveXObject == "function")
-  	{
-  	  return new ActiveXObject("Microsoft.XMLHTTP");
-  	}
-  }
-  catch(e)
-  {
-    Xinha.notImplemented('getXMLHTTPRequestObject');
-  }
-};
- 
-// Compatability - all these names are deprecated and will be removed in a future version
-/** Alias of activeElement()
- * @see Xinha#activeElement
- * @deprecated
- * @returns {DomNode|null}
- */
-Xinha.prototype._activeElement  = function(sel) { return this.activeElement(sel); };
-/** Alias of selectionEmpty()
- * @see Xinha#selectionEmpty
- * @deprecated
- * @param {Selection} sel Selection object as returned by getSelection
- * @returns {Boolean}
- */
-Xinha.prototype._selectionEmpty = function(sel) { return this.selectionEmpty(sel); };
-/** Alias of getSelection()
- * @see Xinha#getSelection
- * @deprecated
- * @returns {Selection}
- */
-Xinha.prototype._getSelection   = function() { return this.getSelection(); };
-/** Alias of createRange()
- * @see Xinha#createRange
- * @deprecated
- * @param {Selection} sel Selection object
- * @returns {Range}
- */
-Xinha.prototype._createRange    = function(sel) { return this.createRange(sel); };
-HTMLArea = Xinha;
-
-//what is this for? Do we need it?
-Xinha.init();
-
-if ( Xinha.ie_version < 8 )
-{
-  Xinha.addDom0Event(window,'unload',Xinha.collectGarbageForIE);
-}
-/** Print some message to Firebug, Webkit, Opera, or IE8 console
- * 
- * @param {String} text
- * @param {String} level one of 'warn', 'info', or empty 
- */
-Xinha.debugMsg = function(text, level)
-{
-  if (typeof console != 'undefined' && typeof console.log == 'function') 
-  {
-    if (level && level == 'warn' && typeof console.warn == 'function') 
-    {
-      console.warn(text);
-    }
-    else 
-      if (level && level == '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(methodName) 
-{
-  throw new Error("Method Not Implemented", "Part of Xinha has tried to call the " + methodName + " method which has not been implemented.");
-};
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/XinhaEasy.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/XinhaEasy.js
deleted file mode 100755
index 8837aa0..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/XinhaEasy.js
+++ /dev/null
@@ -1,767 +0,0 @@
-/* This script is used to provide a super-simple loading method for Xinha
- *
- * For just "defaults", you can be as simple as
- * 
- * <script src="XinhaEasy.js"></script>
- * 
- * And it will convert all textareas on the page.
- * 
- * See examples/Newbie.html for a complete configuration example
- * 
- */
-
-_editor_url   = typeof _editor_url   != 'undefined' ? _editor_url  : null;
-_editor_lang  = typeof _editor_lang  != 'undefined' ? _editor_lang : 'en';
-_editor_skin  = typeof _editor_skin  != 'undefined' ? _editor_skin : 'silva';
-_editor_icons = typeof _editor_icons != 'undefined' ? _editor_icons : null;
-_editor_css   = typeof _editor_css   != 'undefined' ? _editor_css : null;
-
-xinha_init    = null;
-xinha_editors = null;
-xinha_config  = null;
-xinha_toolbar = null;
-xinha_plugins = null;
-
-// Auto detect _editor_url if it's not set.
-(function() // wrap this in an ad-hoc function to avoid unecessary pollution of global namespace
-{
-  // Because of the way the DOM is loaded, this is guaranteed to always pull our script tag.
-  var scripts = document.getElementsByTagName('script');
-  var this_script = scripts[scripts.length - 1];
-
-  var xinha_options = null;
-  
-  // We can grab the script innerHTML and execute that to cut down on script
-  // tags.  Thanks John Resig!
-  // http://ejohn.org/blog/degrading-script-tags/  
-  if (this_script.innerHTML.replace(/\s+/, '')) 
-  {
-    try // DEBUGGING: Comment out this line and the catch(e) below
-    {
-      eval(this_script.innerHTML);
-      
-      
-      // Because the setup options might reference _editor_url, we treat that first...
-      // Chop off any query string.  Chop the filename off of the URL 
-      // Leave exactly one backslash at the end of _editor_url
-      _editor_url = xinha_options._editor_url || this_script.src.split('?')[0].split('/').slice(0, -1).join('/').replace(/\x2f*$/, '/');
-      
-      // then reload the options...
-      xinha_options = eval(this_script.innerHTML);
-      delete xinha_options.editor_url;
-    }
-    catch(e) // DEBUGGING: Comment out this line and the try below
-    {      
-      if(typeof console != 'undefined' && typeof console.log == 'function')
-      {
-        var warn = typeof console.error == 'function' ? function(w){console.error(w);} : function(w){console.log(w);};
-        warn(e);
-        warn("Xinha: There is a problem loading your configuration data.");
-        warn("Xinha: Check for common problems like a missing comma after a configuration section, or semicolons instead of commas after configuration sections.");
-        warn("Xinha: If you get really stuck, comment the try and catch lines around here and the native error might be more useful.");        
-        warn("Xinha: Default configuration is being used.");
-      }
-      else
-      {
-        throw e;
-      }
-      xinha_options = null;      
-    }
-  }
-  
-  if(_editor_url == null)
-  {
-    _editor_url = this_script.src.split('?')[0].split('/').slice(0, -1).join('/');
-  }
-  
-  // Default values
-  if(xinha_options != null)
-  {
-    for(var i in xinha_options)
-    {
-      if(xinha_options[i] !== null)
-      {
-        window[i] = xinha_options[i];
-      }
-    }
-  }
-})()
-
-_editor_url = _editor_url.replace(/\x2f*$/, '/');
-
-// It may be that we already have the XinhaCore.js loaded, if so, we don't need this stuff 
-// and setting it would override the proper stuff.
-if(typeof Xinha == 'undefined')
-{
-  var Xinha = {};
-
-  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); // Safari lies!
-  Xinha.isRunLocally = document.URL.toLowerCase().search(/^file:/) != -1;
-  Xinha.is_designMode = (typeof document.designMode != 'undefined' && !Xinha.is_ie); // IE has designMode, but we're not using it
-  Xinha.isSupportedBrowser = Xinha.is_gecko || (Xinha.is_opera && Xinha.opera_version >= 9.1) || Xinha.ie_version >= 5.5 || Xinha.is_safari;
-
-  Xinha.loadPlugins = function(plugins, callbackIfNotReady)
-  {
-    if ( !Xinha.isSupportedBrowser ) return;
-    
-    Xinha.loadStyle(typeof _editor_css == "string" ? _editor_css : "Xinha.css","XinhaCoreDesign");
-    Xinha.createLoadingMessages(xinha_editors);
-    var loadingMessages = Xinha.loadingMessages;
-    Xinha._loadback(_editor_url + "XinhaCore.js",function () {
-  //    Xinha.removeLoadingMessages(xinha_editors);  
-  //    Xinha.createLoadingMessages(xinha_editors);  
-      callbackIfNotReady() 
-    });
-    return false;
-  }
-
-  Xinha._loadback = function(Url, Callback, Scope, Bonus)
-  {  
-    var T = !Xinha.is_ie ? "onload" : 'onreadystatechange';
-    var S = document.createElement("script");
-    S.type = "text/javascript";
-    S.src = Url;
-    if ( Callback )
-    {
-      S[T] = function()
-      {      
-        if ( Xinha.is_ie && ( ! ( /loaded|complete/.test(window.event.srcElement.readyState) ) ) )
-        {
-          return;
-        }
-        
-        Callback.call(Scope ? Scope : this, Bonus);
-        S[T] = null;
-      };
-    }
-    document.getElementsByTagName("head")[0].appendChild(S);
-  };
-
-  Xinha.getElementTopLeft = function(element) 
-  {
-    var curleft = 0;
-    var curtop = 0;
-    if (element.offsetParent) 
-    {
-      curleft = element.offsetLeft
-      curtop = element.offsetTop
-      while (element = element.offsetParent) 
-      {
-        curleft += element.offsetLeft
-        curtop += element.offsetTop
-      }
-    }
-    return { top:curtop, left:curleft };
-  }
-
-  // find X position of an element
-  Xinha.findPosX = function(obj)
-  {
-    var curleft = 0;
-    if ( obj.offsetParent )
-    {
-      return Xinha.getElementTopLeft(obj).left;    
-    }
-    else if ( obj.x )
-    {
-      curleft += obj.x;
-    }
-    return curleft;
-  };
-
-  // find Y position of an element
-  Xinha.findPosY = function(obj)
-  {
-    var curtop = 0;
-    if ( obj.offsetParent )
-    {
-      return Xinha.getElementTopLeft(obj).top;    
-    }
-    else if ( obj.y )
-    {
-      curtop += obj.y;
-    }
-    return curtop;
-  };
-
-  Xinha.createLoadingMessages = function(xinha_editors)
-  {
-    if ( Xinha.loadingMessages || !Xinha.isSupportedBrowser ) 
-    {
-      return;
-    }
-    Xinha.loadingMessages = [];
-    
-    for (var i=0;i<xinha_editors.length;i++)
-    {
-      var e = typeof xinha_editors[i] == 'string' ? document.getElementById(xinha_editors[i]) : xinha_editors[i];
-      if (!e)
-      {
-        continue;
-      }
-      Xinha.loadingMessages.push(Xinha.createLoadingMessage(e));
-    }
-  }
-
-  Xinha.createLoadingMessage = function(textarea,text)
-  { 
-    if ( document.getElementById("loading_" + textarea.id) || !Xinha.isSupportedBrowser)
-    {
-      return;
-    }
-    // Create and show the main loading message and the sub loading message for details of loading actions
-    // global element
-    var loading_message = document.createElement("div");
-    loading_message.id = "loading_" + textarea.id;
-    loading_message.className = "loading";
-    
-    loading_message.style.left = (Xinha.findPosX(textarea) + textarea.offsetWidth / 2) - 106 +  'px';
-    loading_message.style.top = (Xinha.findPosY(textarea) + textarea.offsetHeight / 2) - 50 +  'px';
-    // main static message
-    var loading_main = document.createElement("div");
-    loading_main.className = "loading_main";
-    loading_main.id = "loading_main_" + textarea.id;
-    loading_main.appendChild(document.createTextNode(Xinha._lc("Loading in progress. Please wait!")));
-    // sub dynamic message
-    var loading_sub = document.createElement("div");
-    loading_sub.className = "loading_sub";
-    loading_sub.id = "loading_sub_" + textarea.id;
-    text = text ? text : Xinha._lc("Loading Core");
-    loading_sub.appendChild(document.createTextNode(text));
-    loading_message.appendChild(loading_main);
-    loading_message.appendChild(loading_sub);
-    document.body.appendChild(loading_message);
-    
-    return loading_sub;
-  }
-
-  Xinha.loadStyle = function(style, id)
-  {
-    var url = _editor_url || '';
-    
-    url += style;
-  
-    var head = document.getElementsByTagName("head")[0];
-    var link = document.createElement("link");
-    link.rel = "stylesheet";
-    link.href = url;
-    if (id) link.id = id;
-    head.appendChild(link);
-  };
-
-  Xinha._lc = function(string) {return string;}
-
-  Xinha._addEvent = function(el, evname, func) 
-  {
-    if ( document.addEventListener )
-    {
-      el.addEventListener(evname, func, true);
-    }
-    else
-    {
-      el.attachEvent("on" + evname, func);
-    }
-  }
-
-  Xinha.addOnloadHandler = function (func)
-  {
-    // Dean Edwards/Matthias Miller/John Resig 
-    // http://dean.edwards.name/weblog/2006/06/again/
-    // IE part from jQuery
-    
-    
-    var init = function ()
-    {
-      // quit if this function has already been called
-      if (arguments.callee.done) return;
-      // flag this function so we don't do the same thing twice
-      arguments.callee.done = true;
-      // kill the timer
-      if (Xinha.onloadTimer) clearInterval(Xinha.onloadTimer);
-      
-      func.call();
-    }
-    if (Xinha.is_ie)
-    {
-      // ensure firing before onload,
-      // maybe late but safe also for iframes
-      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 {
-          // If IE is used, use the trick by Diego Perini
-          // http://javascript.nwbox.com/IEContentLoaded/
-          document.documentElement.doScroll("left");
-        } catch( error ) {
-          setTimeout( arguments.callee, 0 );
-          return;
-        }
-        // and execute any waiting functions
-        init();
-      })();
-    }
-    else if (/WebKit/i.test(navigator.userAgent))
-    {
-      Xinha.onloadTimer = setInterval(function()
-      {
-        if (/loaded|complete/.test(document.readyState))
-        {
-          init(); // call the onload handler
-        }
-      }, 10);
-    }
-    else /* for Mozilla/Opera9 */
-    {
-      document.addEventListener("DOMContentLoaded", init, false);  
-    }
-  }
-}
-
-xinha_init = xinha_init ? xinha_init : function()
-{
-  // IE7 support for querySelectorAll. Supports multiple / grouped selectors
-  // and the attribute selector with a "for" attribute. http://www.codecouch.com/
-  // http://www.codecouch.com/2012/05/adding-document-queryselectorall-support-to-ie-7/
-  // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-  if (!document.querySelectorAll) 
-  {
-    (function(d, s) {
-      d=document, s=d.createStyleSheet();
-      d.querySelectorAll = function(r, c, i, j, a) {
-        a=d.all, c=[], r = r.replace(/\[for\b/gi, '[htmlFor').split(',');
-        for (i=r.length; i--;) {
-          s.addRule(r[i], 'k:v');
-          for (j=a.length; j--;) a[j].currentStyle.k && c.push(a[j]);
-          s.removeRule(0);
-        }
-        return c;
-      }
-    })();
-  }
-
-  if (!document.querySelector) 
-  {
-    document.querySelector = function(selectors) {
-      var elements = document.querySelectorAll(selectors);
-      return (elements.length) ? elements[0] : null;
-    };
-  }
-  // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-
-
-   /** STEP 1 ***************************************************************
-   * First, specify the textareas that shall be turned into Xinhas. 
-   * For each one add the respective id to the xinha_editors array.
-   * I you want add more than on textarea, keep in mind that these 
-   * values are comma seperated BUT there is no comma after the last value.
-   * If you are going to use this configuration on several pages with different
-   * textarea ids, you can add them all. The ones that are not found on the
-   * current page will just be skipped.
-   ************************************************************************/
-
-  if(xinha_editors == null)
-  {
-    // BY default, change all textareas into Xinha
-    xinha_editors = 'textarea';
-  }
-  
-  if(typeof xinha_editors == 'string')
-  {
-    // A raw ID like we used to do
-    if(document.getElementById(xinha_editors))
-    {
-      xinha_editors = [ document.getElementById(xinha_editors) ];
-    }
-    
-    // Must be a selector, this is not supported for IE7 or lower!
-    else
-    {
-      var selected = document.querySelectorAll(xinha_editors);
-      xinha_editors = [ ];
-      for(var i = 0; i < selected.length; i++)
-      {
-        xinha_editors.push(selected[i]);
-      }
-    }
-  }
-  
-  /** STEP 2 ***************************************************************
-   * Now, what are the plugins you will be using in the editors on this
-   * page.  List all the plugins you will need, even if not all the editors
-   * will use all the plugins.
-   *
-   * The list of plugins below is a good starting point, but if you prefer
-   * a simpler editor to start with then you can use the following 
-   * 
-   * xinha_plugins = xinha_plugins ? xinha_plugins : [ ];
-   *
-   * which will load no extra plugins at all.
-   ************************************************************************/
-
-  function parse_plugins(xinha_plugins)
-  {
-    var remove_plugins = [ ];
-        
-    if(xinha_plugins === null)
-    {
-      xinha_plugins = 'common';
-    }
-    
-    if(typeof xinha_plugins == 'string')
-    {
-      xinha_plugins = [ xinha_plugins ];
-    }
-    
-    var load_plugins = xinha_plugins;
-    xinha_plugins = [ ];
-    for(var i = 0; i < load_plugins.length; i++)
-    {
-      // In case of { from: '/path/to/plugins', load: ['MootoolsFileManager'] }
-      if(typeof load_plugins[i] == 'object' && typeof load_plugins[i].from == 'string')
-      {
-        // Resolve the "load" into a list of plugins
-        var externs = parse_plugins(load_plugins[i].load);
-        
-        // MPush them into plugins as external plugin objects
-        for(var ii = 0; ii < externs.length; ii++)
-        {
-          // In case you want to specify a non-default plugin file naming
-          if(externs[ii].match(/\//))
-          {
-            xinha_plugins.push({ url: load_plugins[i].from + '/' + externs[ii] , plugin: externs[ii].replace(/.*\/([^.]+)\..*$/, '$1') });
-          }
-          else
-          {
-            xinha_plugins.push({ url: load_plugins[i].from + '/' + externs[ii] + '/' + externs[ii] + '.js', plugin: externs[ii]});
-          }
-        }
-        continue;
-      }
-      
-      // External plugin definition
-      if(typeof load_plugins[i] == 'object' && typeof load_plugins[i].url == 'string')
-      {
-        xinha_plugins.push(load_plugins[i]);
-        continue;
-      }
-      
-      // In case of [ 'Plugin1', ['Plugin1', 'Plugin3'] ]
-      if(typeof load_plugins[i] != 'string')
-      {
-        Array.prototype.push.apply(load_plugins, load_plugins[i]); 
-        continue;
-      }
-      
-      // Provide some simple plugin defintion shortcuts
-      switch(load_plugins[i])
-      {
-        case 'loaded':
-        {
-          Array.prototype.push.apply(xinha_plugins,  ['CharacterMap', 'ContextMenu', 'FancySelects', 'SmartReplace', 'SuperClean', 'TableOperations', 'ListOperations', 'PreserveScripts', 'PreserveSelection', 'WebKitResize', 'Stylist', 'UnsavedChanges','QuickTag', 'PasteText', 'MootoolsFileManager', 'ListType', 'Linker', 'LangMarks', 'InsertWords', 'InsertSnppet2', 'InsertSmiley','InsertPagebreak', 'InsertNote', 'InsertAnchor', 'HtmlEntities', 'HorizontalRule', 'FindReplace', 'DefinitionList', 'CharCounter','Abbreviation'] );
-        }
-        break;
-        
-        case 'minimal':
-        {
-          Array.prototype.push.apply(xinha_plugins, [ 'FancySelects', 'ListOperations', 'PreserveSelection', 'WebKitResize' ]);
-        } 
-        break;
-        
-        case 'common':
-        {
-          Array.prototype.push.apply(xinha_plugins, [ 'CharacterMap', 'ContextMenu', 'FancySelects', 'SmartReplace', 'SuperClean', 'TableOperations', 'ListOperations', 'PreserveScripts', 'PreserveSelection', 'WebKitResize' ]);
-
-          
-        } 
-        break;
-        
-        default:
-          if(load_plugins[i].match(/^!/))
-          {
-            Array.prototype.push.apply(remove_plugins, parse_plugins(load_plugins[i].replace(/^!/, '')));
-          }
-          else
-          {
-            xinha_plugins.push(load_plugins[i]);
-          }
-          break;
-      }
-    }
-    
-    // Strip out the remove plugins, and duplicates
-    var return_plugins = [ ];
-    for(var i = 0; i < xinha_plugins.length; i++)
-    {
-      var OK = true;
-      
-      if(OK) for(var j = 0; j < remove_plugins.length; j++)
-      {
-        if(remove_plugins[j] == xinha_plugins[i]) { OK = false; break; }
-      }
-      
-      if(OK) for(var j = 0; j < return_plugins.length; j++)
-      {
-        if(return_plugins[j] == xinha_plugins[i]) { OK = false; break; }
-      }
-      
-      if(OK)
-      {
-        return_plugins.push(xinha_plugins[i]);
-      }
-    }
-    xinha_plugins = return_plugins;
-    
-    return xinha_plugins;
-  }
-  
-  xinha_plugins = parse_plugins(xinha_plugins);
-  
-  
-         // THIS BIT OF JAVASCRIPT LOADS THE PLUGINS, NO TOUCHING  :)
-         if(!Xinha.loadPlugins(xinha_plugins, xinha_init)) return;
-
-
-  /** STEP 3 ***************************************************************
-   * We create a default configuration to be used by all the editors.
-   * If you wish to configure some of the editors differently this will be
-   * done in step 5.
-   *
-   * If you want to modify the default config you might do something like this.
-   *
-   *   xinha_config = new Xinha.Config();
-   *   xinha_config.width  = '640px';
-   *   xinha_config.height = '420px';
-   *
-   *
-   * For a list of the available configuration options, see:
-   * http://trac.xinha.org/wiki/Documentation/ConfigVariablesList
-   *
-   *************************************************************************/
-
-  var new_config      = new Xinha.Config();
-  if(typeof xinha_config == 'function')
-  {
-    // If it doesn't return an object, that should still be fine
-    //  due to references and such
-    var returned_config = xinha_config(new_config);
-    if(typeof returned_config == 'object')
-    {
-      new_config = returned_config;
-    }     
-  }
-  xinha_config = new_config;
-
-  Xinha.Config.prototype.setToolbar = function(xinha_toolbar)
-  {
-    var xinha_config = this;
-    if(typeof xinha_toolbar == 'string' || xinha_toolbar === null)
-    {
-      switch(xinha_toolbar)
-      {         
-        case 'minimal+fonts':
-          xinha_config.toolbar = [
-              ["popupeditor"],
-              ["separator","formatblock","fontname","fontsize","bold","italic","underline","strikethrough","superscript"],
-              ["separator","forecolor","hilitecolor"],
-              ["separator","justifyleft","justifycenter","justifyright"],
-              ["separator","insertorderedlist","insertunorderedlist","outdent","indent"],
-              ["separator","createlink","insertimage"],
-            ];
-        break;
-        
-        case 'minimal':
-            xinha_config.toolbar = [
-              ["popupeditor"],
-              ["separator","bold","italic","underline","strikethrough","superscript"],
-              ["separator","forecolor","hilitecolor"],
-              ["separator","justifyleft","justifycenter","justifyright"],
-              ["separator","insertorderedlist","insertunorderedlist","outdent","indent"],
-              ["separator","createlink","insertimage"],
-            ];
-          break;     
-          
-        case 'supermini':
-          xinha_config.toolbar = [
-              
-              ["separator","bold","italic","underline","strikethrough","superscript"],
-              
-            ];
-          break;
-      }
-    }
-    else if(typeof xinha_toolbar == 'object')
-    {
-      xinha_config.toolbar = xinha_toolbar;
-    }
-  }
-
-  // Alias because I know I wil; type this differently
-  Xinha.Config.prototype.setToolBar = Xinha.Config.prototype.setToolbar;
-  
-  xinha_config.setToolbar(xinha_toolbar);
-
-  if(typeof xinha_stylesheet == 'string' && xinha_stylesheet.length )
-  {
-    xinha_config.pageStyleSheets = [ xinha_stylesheet ];
-  }
-  else if(typeof xinha_stylesheet == 'object')
-  {
-    xinha_config.pageStyleSheets = xinha_stylesheet ;
-  }
-   
-
-  /** STEP 4 ***************************************************************
-   * We first create editors for the textareas.
-   *
-   * You can do this in two ways, either
-   *
-   *   xinha_editors   = Xinha.makeEditors(xinha_editors, xinha_config, xinha_plugins);
-   *
-   * if you want all the editor objects to use the same set of plugins, OR;
-   *
-   *   xinha_editors = Xinha.makeEditors(xinha_editors, xinha_config);
-   *   xinha_editors.myTextArea.registerPlugins(['Stylist']);
-   *   xinha_editors.anotherOne.registerPlugins(['CSS','SuperClean']);
-   *
-   * if you want to use a different set of plugins for one or more of the
-   * editors.
-   ************************************************************************/
-
-  if(typeof xinha_plugins_specific == 'function')
-  {
-    xinha_editors   = Xinha.makeEditors(xinha_editors, xinha_config);
-    
-    // To make it clearer for people provide a "remove" function on the array
-    PluginsArray = function(arr)
-    {
-      PluginsArray.parentConstructor.call(this);
-      for(var i = 0; i < arr.length; i++) this.push(arr[i]);
-    };
-    
-    // Note important, extending must happen before adding more functions 
-    // to the prototype.
-    Xinha.extend(PluginsArray, Array);
-    
-    PluginsArray.prototype.remove = function(p)
-    {
-      if(typeof p == 'object')
-      {
-        for(var i = 0; i < p.length; i++)
-        {
-          this.remove(p[i]);
-        }
-        
-        return this;
-      }
-      
-      var idx = -1;
-      for(var i = 0; i < this.length; i++)
-      {
-        
-        if(p == this[i]) { idx = i; break; }        
-        
-      }
-      
-      if(idx >= 0)
-      {
-        this.splice(idx, 1);
-      }
-      
-      return this;
-    };
-    
-    PluginsArray.prototype.only    = function(p)
-    {
-      // Enpty ourself
-      if(this.length)
-      {
-        this.splice(0,this.length);
-      }
-      
-      // Add them in
-      if(typeof p == 'string')
-      {
-        p = [ p ];
-      }
-      
-      for(var i = 0; i < p.length; i++)
-      {
-        this.push(p[i]);
-      }
-    }
-    
-    for(var i in xinha_editors)
-    {
-      var specific_plugins = new PluginsArray(xinha_plugins);
-      var plugins_returned = xinha_plugins_specific(specific_plugins, xinha_editors[i]._textArea, xinha_editors[i]);
-      
-      // Note that if they don't return anything, it will probably still work
-      // due to references and such
-      if(typeof plugins_returned == 'object')
-      {
-        specific_plugins = plugins_returned;
-      }
-      xinha_editors[i].registerPlugins(parse_plugins(specific_plugins));
-    }
-  }
-  else
-  {
-    xinha_editors   = Xinha.makeEditors(xinha_editors, xinha_config, xinha_plugins);
-  }
-  
-
-  /** STEP 5 ***************************************************************
-   * If you want to change the configuration variables of any of the
-   * editors,  this is the place to do that, for example you might want to
-   * change the width and height of one of the editors, like this...
-   *
-   *   xinha_editors.myTextArea.config.width  = '640px';
-   *   xinha_editors.myTextArea.config.height = '480px';
-   *
-   ************************************************************************/
-  
-  if(typeof xinha_config_specific == 'function')
-  {
-    for(var i in xinha_editors)
-    {
-      var returned_config =  xinha_config_specific(xinha_editors[i].config, xinha_editors[i]._textArea, xinha_editors[i]);
-      
-      // If the function doesn't return an object, it will stil work probably 
-      // as xinha_config.XXX in the function will be working on a reference
-      if(typeof returned_config == 'object')
-      {
-        xinha_editors[i].config = returned_config;
-      }
-    }
-  }
-  
-  
-  /** STEP 6 ***************************************************************
-   * Finally we "start" the editors, this turns the textareas into
-   * Xinha editors.
-   ************************************************************************/
-
-  Xinha.startEditors(xinha_editors);
-}
-
-Xinha.addOnloadHandler(xinha_init); // this executes the xinha_init function on page load
-                                     // and does not interfere with window.onload properties set by other scripts
-
-
-
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/XinhaLoader.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/XinhaLoader.js
deleted file mode 100755
index ac83ad7..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/XinhaLoader.js
+++ /dev/null
@@ -1,283 +0,0 @@
-var Xinha = {};
-
-// Auto detect _editor_url if it's not set.
-if (!window._editor_url) 
-{
-  (function() // wrap this in an ad-hoc function to avoid unecessary pollution of global namespace
-  {
-    // Because of the way the DOM is loaded, this is guaranteed to always pull our script tag.
-    var scripts = document.getElementsByTagName('script');
-    var this_script = scripts[scripts.length - 1];
-  
-    // We'll allow two ways to specify arguments.  We'll accept them in the
-    // argument of the script, or we'll accept them embedded into our script tag.
-    var args = this_script.src.split('?');
-    args = args.length == 2 ? args[1].split('&') : '';
-    for (var index = 0; index < args.length; ++index) 
-    {
-      var arg = args[index].split('=');
-      if (arg.length == 2) 
-      {
-        switch (arg[0])
-        {
-          case 'lang':
-          case 'icons':
-          case 'skin':
-          case 'url':
-            window['_editor_' + arg[0]] = arg[1];
-            break;
-        }
-      }
-    }
-    
-    // We can grab the script innerHTML and execute that to cut down on script
-    // tags.  Thanks John Resig!
-    // http://ejohn.org/blog/degrading-script-tags/
-    if (this_script.innerHTML.replace(/\s+/, '')) 
-    {
-      eval(this_script.innerHTML);
-    }
-    
-    // Default values
-    _editor_lang = window._editor_lang || 'en';
-    
-    // Chop off any query string.  Chop the filename off of the URL.
-    _editor_url = window._editor_url || this_script.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); // Safari lies!
-Xinha.isRunLocally = document.URL.toLowerCase().search(/^file:/) != -1;
-Xinha.is_designMode = (typeof document.designMode != 'undefined' && !Xinha.is_ie); // IE has designMode, but we're not using it
-Xinha.isSupportedBrowser = Xinha.is_gecko || (Xinha.is_opera && Xinha.opera_version >= 9.1) || Xinha.ie_version >= 5.5 || Xinha.is_safari;
-
-Xinha.loadPlugins = function(plugins, callbackIfNotReady)
-{
-  if ( !Xinha.isSupportedBrowser ) return;
-  
-  Xinha.loadStyle(typeof _editor_css == "string" ? _editor_css : "Xinha.css","XinhaCoreDesign");
-  Xinha.createLoadingMessages(xinha_editors);
-  var loadingMessages = Xinha.loadingMessages;
-  Xinha._loadback(_editor_url + "XinhaCore.js",function () {
-    Xinha.removeLoadingMessages(xinha_editors);  
-    Xinha.createLoadingMessages(xinha_editors);  
-    callbackIfNotReady() 
-  });
-  return false;
-}
-
-Xinha._loadback = function(Url, Callback, Scope, Bonus)
-{  
-  var T = !Xinha.is_ie ? "onload" : 'onreadystatechange';
-  var S = document.createElement("script");
-  S.type = "text/javascript";
-  S.src = Url;
-  if ( Callback )
-  {
-    S[T] = function()
-    {      
-      if ( Xinha.is_ie && ( ! ( /loaded|complete/.test(window.event.srcElement.readyState) ) ) )
-      {
-        return;
-      }
-      
-      Callback.call(Scope ? Scope : this, Bonus);
-      S[T] = null;
-    };
-  }
-  document.getElementsByTagName("head")[0].appendChild(S);
-};
-
-Xinha.getElementTopLeft = function(element) 
-{
-  var curleft = 0;
-  var curtop = 0;
-  if (element.offsetParent) 
-  {
-    curleft = element.offsetLeft
-    curtop = element.offsetTop
-    while (element = element.offsetParent) 
-    {
-      curleft += element.offsetLeft
-      curtop += element.offsetTop
-    }
-  }
-  return { top:curtop, left:curleft };
-}
-
-// find X position of an element
-Xinha.findPosX = function(obj)
-{
-  var curleft = 0;
-  if ( obj.offsetParent )
-  {
-    return Xinha.getElementTopLeft(obj).left;    
-  }
-  else if ( obj.x )
-  {
-    curleft += obj.x;
-  }
-  return curleft;
-};
-
-// find Y position of an element
-Xinha.findPosY = function(obj)
-{
-  var curtop = 0;
-  if ( obj.offsetParent )
-  {
-    return Xinha.getElementTopLeft(obj).top;    
-  }
-  else if ( obj.y )
-  {
-    curtop += obj.y;
-  }
-  return curtop;
-};
-
-Xinha.createLoadingMessages = function(xinha_editors)
-{
-  if ( Xinha.loadingMessages || !Xinha.isSupportedBrowser ) 
-  {
-    return;
-  }
-  Xinha.loadingMessages = [];
-  
-  for (var i=0;i<xinha_editors.length;i++)
-  {
-    if (!document.getElementById(xinha_editors[i]))
-    {
-	  continue;
-    }
-    Xinha.loadingMessages.push(Xinha.createLoadingMessage(document.getElementById(xinha_editors[i])));
-  }
-}
-
-Xinha.createLoadingMessage = function(textarea,text)
-{ 
-  if ( document.getElementById("loading_" + textarea.id) || !Xinha.isSupportedBrowser)
-  {
-    return;
-  }
-  // Create and show the main loading message and the sub loading message for details of loading actions
-  // global element
-  var loading_message = document.createElement("div");
-  loading_message.id = "loading_" + textarea.id;
-  loading_message.className = "loading";
-  
-  loading_message.style.left = (Xinha.findPosX(textarea) + textarea.offsetWidth / 2) - 106 +  'px';
-  loading_message.style.top = (Xinha.findPosY(textarea) + textarea.offsetHeight / 2) - 50 +  'px';
-  // main static message
-  var loading_main = document.createElement("div");
-  loading_main.className = "loading_main";
-  loading_main.id = "loading_main_" + textarea.id;
-  loading_main.appendChild(document.createTextNode(Xinha._lc("Loading in progress. Please wait!")));
-  // sub dynamic message
-  var loading_sub = document.createElement("div");
-  loading_sub.className = "loading_sub";
-  loading_sub.id = "loading_sub_" + textarea.id;
-  text = text ? text : Xinha._lc("Loading Core");
-  loading_sub.appendChild(document.createTextNode(text));
-  loading_message.appendChild(loading_main);
-  loading_message.appendChild(loading_sub);
-  document.body.appendChild(loading_message);
-  
-  return loading_sub;
-}
-
-Xinha.loadStyle = function(style, id)
-{
-  var url = _editor_url || '';
-  
-  url += style;
- 
-  var head = document.getElementsByTagName("head")[0];
-  var link = document.createElement("link");
-  link.rel = "stylesheet";
-  link.href = url;
-  if (id) link.id = id;
-  head.appendChild(link);
-};
-Xinha._lc = function(string) {return string;}
-
-Xinha._addEvent = function(el, evname, func) 
-{
-  if ( document.addEventListener )
-  {
-    el.addEventListener(evname, func, true);
-  }
-  else
-  {
-    el.attachEvent("on" + evname, func);
-  }
-}
-Xinha.addOnloadHandler = function (func)
-{
-  // Dean Edwards/Matthias Miller/John Resig 
-  // http://dean.edwards.name/weblog/2006/06/again/
-  // IE part from jQuery
-  
-  
-  var init = function ()
-  {
-    // quit if this function has already been called
-    if (arguments.callee.done) return;
-    // flag this function so we don't do the same thing twice
-    arguments.callee.done = true;
-    // kill the timer
-    if (Xinha.onloadTimer) clearInterval(Xinha.onloadTimer);
-    
-    func.call();
-  }
-  if (Xinha.is_ie)
-  {
-    // ensure firing before onload,
-    // maybe late but safe also for iframes
-    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 {
-        // If IE is used, use the trick by Diego Perini
-        // http://javascript.nwbox.com/IEContentLoaded/
-        document.documentElement.doScroll("left");
-      } catch( error ) {
-        setTimeout( arguments.callee, 0 );
-        return;
-      }
-      // and execute any waiting functions
-      init();
-    })();
-  }
-  else if (/WebKit/i.test(navigator.userAgent))
-  {
-    Xinha.onloadTimer = setInterval(function()
-    {
-      if (/loaded|complete/.test(document.readyState))
-      {
-        init(); // call the onload handler
-      }
-    }, 10);
-  }
-  else /* for Mozilla/Opera9 */
-  {
-    document.addEventListener("DOMContentLoaded", init, false);  
-  }
-}
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/XinhaLoader_readme.txt b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/XinhaLoader_readme.txt
deleted file mode 100644
index 9a4a2c4..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.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-1.5.1/compression_readme.txt b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/compression_readme.txt
deleted file mode 100644
index 8011f52..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/compression_readme.txt
+++ /dev/null
@@ -1,10 +0,0 @@
-You can use the contrib/compress.php to batch-convert the current Xinha snapshot.

-

-Make sure you have PHP installed on your machine. To use this script, open it in a text editor, comment out the die() command at the top and run via "php compress.php" from the command-line.

- 

-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-1.5.1/examples/CustomPlugins.html b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/examples/CustomPlugins.html
deleted file mode 100644
index ceebea2..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/examples/CustomPlugins.html
+++ /dev/null
@@ -1,113 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
-<html>
-<head>
-  <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
-  <title>Custom Plugins Xinha Loading Example</title>
-
-  <script src="../XinhaEasy.js" type="text/javascript">
-    
-    // The following options are, optional...
-    xinha_options = 
-    {
-      // Specify language and skin
-      _editor_lang:   'en',         // Language to use
-      _editor_skin:   'silva',      // Name of the skin to use (see skins directory for available skins)
-      
-      // Simply a CSS selector to pick the textarea(s) you want, eg 'textarea'
-      //  converts all textarea, or textarea.my-xinha,textarea.your-xinha 
-      //  would convert only those textareas with the my-xinha or your-xinha 
-      //  classes on them
-      xinha_editors:  'textarea',   
-
-      // Plugins can be a default set - 'common', 'minimal', 'loaded'
-      //   xinha_plugins: 'minimal'
-      //
-      // or you can specify the plugins you want exactly
-      //   xinha_plugins: [ 'Linker', 'Stylist' ]
-      //
-      // or you can do both to add extras to the set
-      //   xinha_pass_to_php_backend: ['minimal', 'Linker' ]
-      xinha_plugins:  [ 'minimal', { from: '/examples/custom_plugins', load: 'StatusBarMessage' } ],
-      
-      // The default toolbar can be one of the pre-defined toolbars, 
-      //   'default', 'minimal', 'minimal+fonts', 'supermini'
-      //   xinha_toolbar: 'minimal+fonts'
-      //
-      // or you an specify a toolbar structure completely
-      //   xinha_toolbar: [ ["popupeditor"],["separator","bold","italic","underline","strikethrough","superscript"] ]
-      xinha_toolbar:  'minimal+fonts',
-      
-      // To specify a stylesheet to load inside the editor (to style the contents
-      //  the user is editing), simply specify the path to it here, note that in
-      //  this example we use _editor_url to referenec the Xinha directory
-      //  you would probably reference it absolutely.
-      //
-      // Note as with all these options, it's optional, leave it out if you 
-      //  don't want to load a stylesheet in the editor
-      xinha_stylesheet: _editor_url + 'examples/files/stylist.css', 
-      
-      // This is where you set the other default configuration globally
-      xinha_config:            function(xinha_config) 
-      {
-
-      },
-      
-      // Here is where you can customise configs for each editor area
-      xinha_config_specific:   function(xinha_config, textarea)
-      {
-
-      },
-      
-      // Here you can limit the plugins to certain editor areas
-      //   note that you only can use the plugins you specified 
-      //   above in xinha_plugins, you just don't have to use all of 
-      //   them but that controls what code gets loaded this contols
-      //   which editors get them
-      xinha_plugins_specific:  function(xinha_plugins, textarea)
-      {
-
-      }
-    }
-
-  </script>
-
-
-</head>
-
-<body>
-  <h1>Custom Plugins Newbie Guide Example</h1>
-  <p> This example shows how you can load custom plugins which are outside of the Xinha standard plugins location. </p>
-  
-  <p> You can do this even if you use Xinha from a CDN and have your custom plugins locally. </p>
-  
-  <p>Click into the editor and look in the status bar, on the right you will see the message printed by this (silly) custom plugin which has been loaded from /examples/custom_plugins.</p>
-
-  
-  <div>
-    <form onsubmit="alert(this.myTextArea.value); return false;" style="">
-    
-      <textarea id="firstOne" name="firstOne" style="width:100%;height:10em;">
-      &lt;p&gt;Lorem ipsum dolor sit amet, consectetuer adipiscing elit.
-      Aliquam et tellus vitae justo varius placerat. Suspendisse iaculis
-      velit semper dolor. Donec gravida tincidunt mi. Curabitur tristique
-      ante elementum turpis. Aliquam nisl. Nulla posuere neque non
-      tellus. Morbi vel nibh. Cum sociis natoque penatibus et magnis dis
-      parturient montes, nascetur ridiculus mus. Nam nec wisi. In wisi.
-      Curabitur pharetra bibendum lectus.&lt;/p&gt;
-      </textarea>
-
-      <input type="submit" value="SUBMIT" />
-    </form>
-  </div>
-      
-    
-  <p>You can see in the source of this page how we do this, simply by specifying...</p>
-  
-  <pre>
-    xinha_plugins:  [ 'minimal', { from: '/examples/custom_plugins', load: 'StatusBarMessage' } ]
-  </pre>
-  
-  <p>... as an option to Xinha, which says, to load the standard 'minimal' plugins and also, from '/examples/custom_plugins' directory, load 'StatusBarMessage' plugin, you could of course <tt>load: ['StatusBarMessage', 'AnotherCustom' ]</tt> to load more than one thing from the same directory.</p>
-  
-</body>
-</html>
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/examples/ExtendedDemo.html b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/examples/ExtendedDemo.html
deleted file mode 100644
index 0c30370..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/examples/ExtendedDemo.html
+++ /dev/null
@@ -1,16 +0,0 @@
-<html>

-<head><title>Xinha Extended Example</title></head>

-  <!--------------------------------------:noTabs=true:tabSize=2:indentSize=2:--

-    --  Xinha example frameset.

-    --

-    --  $HeadURL: http://svn.xinha.org/trunk/examples/ExtendedDemo.html $

-    --  $LastChangedDate: 2008-10-13 06:42:42 +1300 (Mon, 13 Oct 2008) $

-    --  $LastChangedRevision: 1084 $

-    --  $LastChangedBy: ray $

-    --------------------------------------------------------------------------->

-

-  <frameset cols="240,*">

-    <frame src="files/ext_example-menu.php" name="menu" id="menu">

-    <frame src="about:blank" name="body" id="body">

-  </frameset>

-</html>

diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/examples/Newbie.html b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/examples/Newbie.html
deleted file mode 100644
index eeb043e..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/examples/Newbie.html
+++ /dev/null
@@ -1,158 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
-<html>
-<head>
-  <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
-  <title>Standard Xinha Loading Example (Newbie Guide)</title>
-
-  <script src="../XinhaEasy.js" type="text/javascript">
-    
-    // The following options are, optional...
-    xinha_options = 
-    {
-      // Specify language and skin
-      _editor_lang:   'en',         // Language to use
-      _editor_skin:   'silva',      // Name of the skin to use (see skins directory for available skins)
-      
-      // Simply a CSS selector to pick the textarea(s) you want, eg 'textarea'
-      //  converts all textarea, or textarea.my-xinha,textarea.your-xinha 
-      //  would convert only those textareas with the my-xinha or your-xinha 
-      //  classes on them
-      xinha_editors:  'textarea',   
-
-      // Plugins can be a default set - 'common', 'minimal', 'loaded'
-      //   xinha_plugins: 'minimal'
-      //
-      // or you can specify the plugins you want exactly
-      //   xinha_plugins: [ 'Linker', 'Stylist' ]
-      //
-      // or you can do both to add extras to the set
-      //   xinha_pass_to_php_backend: ['minimal', 'Linker' ]
-      xinha_plugins:  [ 'minimal', 'CharCounter', 'Stylist', 'TableOperations', 'FancySelects'],
-      
-      // The default toolbar can be one of the pre-defined toolbars, 
-      //   'default', 'minimal', 'minimal+fonts', 'supermini'
-      //   xinha_toolbar: 'minimal+fonts'
-      //
-      // or you an specify a toolbar structure completely
-      //   xinha_toolbar: [ ["popupeditor"],["separator","bold","italic","underline","strikethrough","superscript"] ]
-      xinha_toolbar:  'minimal+fonts',
-      
-      // To specify a stylesheet to load inside the editor (to style the contents
-      //  the user is editing), simply specify the path to it here, note that in
-      //  this example we use _editor_url to referenec the Xinha directory
-      //  you would probably reference it absolutely.
-      //
-      // Note as with all these options, it's optional, leave it out if you 
-      //  don't want to load a stylesheet in the editor
-      xinha_stylesheet: _editor_url + 'examples/files/stylist.css', 
-      
-      // This is where you set the other default configuration globally
-      xinha_config:            function(xinha_config) 
-      {
-        // For example if you are using the stylist plugin you might load your styles here
-        if(typeof xinha_config.stylistLoadStylesheet == 'function')
-        {
-          xinha_config.stylistLoadStylesheet(_editor_url + "examples/files/stylist.css");
-        }
-      },
-      
-      // Here is where you can customise configs for each editor area
-      xinha_config_specific:   function(xinha_config, textarea)
-      {
-        // For example, we remove the format drop down from this textarea
-        if(textarea.id == 'anotherOne')
-        {        
-          xinha_config.hideSomeButtons(" formatblock ");
-        }
-        
-        // And for this mini one we will use the "supermini" toolbar
-        // and also allow the user to resize if their browser supports that
-        // (basically, Chrome and Safari)
-        if(textarea.id == 'miniOne')
-        {
-          xinha_config.resizableEditor = true;
-          xinha_config.setToolbar('supermini');
-        }
-      },
-      
-      // Here you can limit the plugins to certain editor areas
-      //   note that you only can use the plugins you specified 
-      //   above in xinha_plugins, you just don't have to use all of 
-      //   them but that controls what code gets loaded this contols
-      //   which editors get them
-      xinha_plugins_specific:  function(xinha_plugins, textarea)
-      {
-        // For example we do not want the Stylist for the 'anotherOne'
-        if(textarea.id == 'anotherOne')
-        {
-          xinha_plugins.remove('CharCounter');
-          //  For more thane one plugin use an array...
-          //  xinha_plugins.remove( ['CharCounter','SomethingElse'] );
-        }
-        
-        // And for the 'miniOne' we only want CharCounter        
-        if(textarea.id == 'miniOne')
-        {
-          xinha_plugins.only('CharCounter');
-          //  For more thane one plugin use an array...
-          //  xinha_plugins.only( ['CharCounter','SomethingElse'] );
-        }
-      }
-    }
-
-  </script>
-
-
-</head>
-
-<body>
-  <h1>Newbie Guide Example</h1>
-  <p> This example shows how a more complete usage of Xinha may look, view the source of this page and in the &lt;head&gt; section you will find all the code, mostly it's just comments! </p>
-  
-  <p>We can see below that some Xinha areas have been created, with different sizes, different toolbars and different plugins.</p>
-  
-  <div>
-    <form onsubmit="alert(this.myTextArea.value); return false;" style="">
-    
-      <textarea id="firstOne" name="firstOne" style="width:100%;height:10em;">
-      &lt;p&gt;Lorem ipsum dolor sit amet, consectetuer adipiscing elit.
-      Aliquam et tellus vitae justo varius placerat. Suspendisse iaculis
-      velit semper dolor. Donec gravida tincidunt mi. Curabitur tristique
-      ante elementum turpis. Aliquam nisl. Nulla posuere neque non
-      tellus. Morbi vel nibh. Cum sociis natoque penatibus et magnis dis
-      parturient montes, nascetur ridiculus mus. Nam nec wisi. In wisi.
-      Curabitur pharetra bibendum lectus.&lt;/p&gt;
-      </textarea>
-
-      <!-- Notice that margin/padding on the textarea will not necessarily
-           work as expected, so we use a wrapping div to give the margin. -->
-           
-      <div style="margin-top:10px;">
-        <textarea id="anotherOne" name="anotherOne" rows="25" cols="80">
-        &lt;p&gt;Lorem ipsum dolor sit amet, consectetuer adipiscing elit.
-        Aliquam et tellus vitae justo varius placerat. Suspendisse iaculis
-        velit semper dolor. Donec gravida tincidunt mi. Curabitur tristique
-        ante elementum turpis. Aliquam nisl. Nulla posuere neque non
-        tellus. Morbi vel nibh. Cum sociis natoque penatibus et magnis dis
-        parturient montes, nascetur ridiculus mus. Nam nec wisi. In wisi.
-        Curabitur pharetra bibendum lectus.&lt;/p&gt;
-        </textarea>
-      </div>
-
-      <div style="margin-top:10px;">
-        <textarea id="miniOne" name="miniOne" style="height:150px;width:320px;">
-        &lt;p&gt;Lorem ipsum dolor sit amet, consectetuer adipiscing elit.
-        Aliquam et tellus vitae justo varius placerat. Suspendisse iaculis
-        velit semper dolor. Donec gravida tincidunt mi. Curabitur tristique
-        ante elementum turpis. Aliquam nisl. Nulla posuere neque non
-        tellus. Morbi vel nibh. Cum sociis natoque penatibus et magnis dis
-        parturient montes, nascetur ridiculus mus. Nam nec wisi. In wisi.
-        Curabitur pharetra bibendum lectus.&lt;/p&gt;
-        </textarea>
-      </div>
-      <input type="submit" value="SUBMIT" />
-    </form>
-  </div>
-      
-</body>
-</html>
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/examples/Old_Newbie_Guide/Newbie.html b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/examples/Old_Newbie_Guide/Newbie.html
deleted file mode 100644
index ed1b377..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/examples/Old_Newbie_Guide/Newbie.html
+++ /dev/null
@@ -1,23 +0,0 @@
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//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>Xinha Newbie Guide</title>
-  <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
-  
-  <script type="text/javascript" src="../../XinhaLoader.js?lang=en&skin=silva"></script>
-  <script type="text/javascript">
-    _editor_icons = "Tango" // You can pass arguments via the script URL or embed them here.
-  </script>
-  <script type="text/javascript" src="XinhaConfig.js"></script>
-</head>
-<body>
-
-<form action="">
-<div>
-<textarea id="myTextArea" name="myTextArea" rows="25" cols="50" style="width: 100%"></textarea>
-</div>
-</form>
-
-</body>
-</html>
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/examples/Old_Newbie_Guide/XinhaConfig.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/examples/Old_Newbie_Guide/XinhaConfig.js
deleted file mode 100644
index 4e76be0..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/examples/Old_Newbie_Guide/XinhaConfig.js
+++ /dev/null
@@ -1,136 +0,0 @@
-xinha_editors = null;
-xinha_init    = null;
-xinha_config  = null;
-xinha_plugins = null;
-
-// This contains the names of textareas we will make into Xinha editors
-xinha_init = xinha_init ? xinha_init : function()
-{
-   /** STEP 1 ***************************************************************
-   * First, specify the textareas that shall be turned into Xinhas. 
-   * For each one add the respective id to the xinha_editors array.
-   * I you want add more than on textarea, keep in mind that these 
-   * values are comma seperated BUT there is no comma after the last value.
-   * If you are going to use this configuration on several pages with different
-   * textarea ids, you can add them all. The ones that are not found on the
-   * current page will just be skipped.
-   ************************************************************************/
-
-  xinha_editors = xinha_editors ? xinha_editors :
-  [
-    'myTextArea', 'anotherOne'
-  ];
-  
-  /** STEP 2 ***************************************************************
-   * Now, what are the plugins you will be using in the editors on this
-   * page.  List all the plugins you will need, even if not all the editors
-   * will use all the plugins.
-   *
-   * The list of plugins below is a good starting point, but if you prefer
-   * a simpler editor to start with then you can use the following 
-   * 
-   * xinha_plugins = xinha_plugins ? xinha_plugins : [ ];
-   *
-   * which will load no extra plugins at all.
-   ************************************************************************/
-
-  xinha_plugins = xinha_plugins ? xinha_plugins :
-  [
-   'CharacterMap',
-   'ContextMenu',
-   'FancySelects',
-   'SmartReplace',
-   'Stylist',
-   'Linker',
-   'SuperClean',
-   'TableOperations',
-   'ListOperations',
-   'WebKitResize'
-  ];
-  
-         // THIS BIT OF JAVASCRIPT LOADS THE PLUGINS, NO TOUCHING  :)
-         if(!Xinha.loadPlugins(xinha_plugins, xinha_init)) return;
-
-
-  /** STEP 3 ***************************************************************
-   * We create a default configuration to be used by all the editors.
-   * If you wish to configure some of the editors differently this will be
-   * done in step 5.
-   *
-   * If you want to modify the default config you might do something like this.
-   *
-   *   xinha_config = new Xinha.Config();
-   *   xinha_config.width  = '640px';
-   *   xinha_config.height = '420px';
-   *
-   *
-   * For a list of the available configuration options, see:
-   * http://trac.xinha.org/wiki/Documentation/ConfigVariablesList
-   *
-   *************************************************************************/
-
-   xinha_config = xinha_config ? xinha_config() : new Xinha.Config();
-        
-  //this is the standard toolbar, feel free to remove buttons as you like
-  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"]
-  ];
-
-   // To adjust the styling inside the editor, we can load an external stylesheet like this
-   // NOTE : YOU MUST GIVE AN ABSOLUTE URL
-   xinha_config.pageStyleSheets = [ _editor_url + "examples/files/full_example.css" ];
-   //if you're using Stylist, import a stylesheet like this
-   xinha_config.stylistLoadStylesheet(_editor_url + "examples/files/stylist.css");
-
-
-  /** STEP 4 ***************************************************************
-   * We first create editors for the textareas.
-   *
-   * You can do this in two ways, either
-   *
-   *   xinha_editors   = Xinha.makeEditors(xinha_editors, xinha_config, xinha_plugins);
-   *
-   * if you want all the editor objects to use the same set of plugins, OR;
-   *
-   *   xinha_editors = Xinha.makeEditors(xinha_editors, xinha_config);
-   *   xinha_editors.myTextArea.registerPlugins(['Stylist']);
-   *   xinha_editors.anotherOne.registerPlugins(['CSS','SuperClean']);
-   *
-   * if you want to use a different set of plugins for one or more of the
-   * editors.
-   ************************************************************************/
-
-  xinha_editors   = Xinha.makeEditors(xinha_editors, xinha_config, xinha_plugins);
-
-  /** STEP 5 ***************************************************************
-   * If you want to change the configuration variables of any of the
-   * editors,  this is the place to do that, for example you might want to
-   * change the width and height of one of the editors, like this...
-   *
-   *   xinha_editors.myTextArea.config.width  = '640px';
-   *   xinha_editors.myTextArea.config.height = '480px';
-   *
-   ************************************************************************/
-
-
-  /** STEP 6 ***************************************************************
-   * Finally we "start" the editors, this turns the textareas into
-   * Xinha editors.
-   ************************************************************************/
-
-  Xinha.startEditors(xinha_editors);
-}
-
-Xinha.addOnloadHandler(xinha_init); // this executes the xinha_init function on page load
-                                     // and does not interfere with window.onload properties set by other scripts
-
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/examples/Old_Newbie_Guide/simple_example.html b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/examples/Old_Newbie_Guide/simple_example.html
deleted file mode 100644
index 6126ba1..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/examples/Old_Newbie_Guide/simple_example.html
+++ /dev/null
@@ -1,61 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
-<html>
-<head>
-<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
-<title>Simple example of Xinha</title>
-<script type="text/javascript">
-  var _editor_url  = document.location.href.replace(/examples\/Old_Newbie_Guide\/simple_example\.html.*/, '')
-  var _editor_lang = "en";
-</script>
-<!-- Load up the actual editor core -->
-<script type="text/javascript" src="../../XinhaCore.js"></script>
-<script type="text/javascript">
-
-var xinha_plugins =
-[
- 'Linker', 'ContextMenu', 'FancySelects', 'TableOperations', 'ListOperations', 'PreserveSelection', 'PreserveScripts', 'WebKitResize'
-];
-
-var xinha_editors =
-[
-  'myTextArea'
-];
-
-function xinha_init()
-{
-  if(!Xinha.loadPlugins(xinha_plugins, xinha_init)) return;
-
-  var xinha_config = new Xinha.Config();
-  
-  xinha_editors = Xinha.makeEditors(xinha_editors, xinha_config, xinha_plugins);
-
-  Xinha.startEditors(xinha_editors);
-}
-Xinha.addOnloadHandler(xinha_init);
-</script>
-
-</head>
-
-<body>
-<div>
-<form onsubmit="alert(this.myTextArea.value); return false;" style="">
-
-<textarea id="myTextArea" name="myTextArea" rows="25" cols="80">
-&lt;p&gt;Lorem ipsum dolor sit amet, consectetuer adipiscing elit.
-Aliquam et tellus vitae justo varius placerat. Suspendisse iaculis
-velit semper dolor. Donec gravida tincidunt mi. Curabitur tristique
-ante elementum turpis. Aliquam nisl. Nulla posuere neque non
-tellus. Morbi vel nibh. Cum sociis natoque penatibus et magnis dis
-parturient montes, nascetur ridiculus mus. Nam nec wisi. In wisi.
-Curabitur pharetra bibendum lectus.&lt;/p&gt;
-
-</textarea>
-<input type="submit" value="SUBMIT" />
-</form>
-</div>
-
-  <!-- This script is used to show the rendering mode (Quirks, Standards, Almost Standards) --> 
-  <script type="text/javascript" src="render-mode-developer-help.js"></script>
-      
-</body>
-</html>
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/examples/OneLine.html b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/examples/OneLine.html
deleted file mode 100644
index c66c7fb..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/examples/OneLine.html
+++ /dev/null
@@ -1,40 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
-<html>
-<head>
-  <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
-  <title>Example of Easy Loading Xinha With No Configuration</title>
-
-  <script src="../XinhaEasy.js" type="text/javascript"></script>
-</head>
-
-<body>
-
-<p>
-  This demonstration shows how you only need to add one single line to your page to enable Xinha for the textareas on it, the only code added is...
-</p>
-
-<pre>
-  &lt;script src="/path/to/xinha/XinhaEasy.js" type="text/javascript"&gt;&lt;/script&gt;
-</pre>
-
-<p>and that will cause all the textareas to be converted into Xinha areas with default options and commonly useful plugins.</p>
-
-<div>
-<form onsubmit="alert(this.myTextArea.value); return false;" style="">
-
-<textarea id="myTextArea" name="myTextArea" rows="25" cols="80">
-&lt;p&gt;Lorem ipsum dolor sit amet, consectetuer adipiscing elit.
-Aliquam et tellus vitae justo varius placerat. Suspendisse iaculis
-velit semper dolor. Donec gravida tincidunt mi. Curabitur tristique
-ante elementum turpis. Aliquam nisl. Nulla posuere neque non
-tellus. Morbi vel nibh. Cum sociis natoque penatibus et magnis dis
-parturient montes, nascetur ridiculus mus. Nam nec wisi. In wisi.
-Curabitur pharetra bibendum lectus.&lt;/p&gt;
-
-</textarea>
-<input type="submit" value="SUBMIT" />
-</form>
-</div>
-      
-</body>
-</html>
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/examples/UsingPhpPlugins.php b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/examples/UsingPhpPlugins.php
deleted file mode 100644
index 28db596..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/examples/UsingPhpPlugins.php
+++ /dev/null
@@ -1,148 +0,0 @@
-<?php require_once('require-password.php'); ?>
-<!DOCTYPE html>
-<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
-<head>
-
-  <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
-  <title>Example of Xinha</title>
-  <link rel="stylesheet" href="files/full_example.css" />
-
-  <script src="//s3-us-west-1.amazonaws.com/xinha/xinha-1.5/XinhaEasy.js" type="text/javascript">
-    
-    // The following options are, optional...
-    xinha_options = 
-    {
-      // Specify language and skin
-      _editor_lang:   'en',         // Language to use
-      _editor_skin:   'silva',      // Name of the skin to use (see skins directory for available skins)
-      
-      // Simply a CSS selector to pick the textarea(s) you want, eg 'textarea'
-      //  converts all textarea, or textarea.my-xinha,textarea.your-xinha 
-      //  would convert only those textareas with the my-xinha or your-xinha 
-      //  classes on them
-      xinha_editors:  'textarea',   
-
-      // Plugins can be a default set - 'common', 'minimal', 'loaded'
-      //   xinha_plugins: 'minimal'
-      //
-      // or you can specify the plugins you want exactly
-      //   xinha_plugins: [ 'Linker', 'Stylist' ]
-      //
-      // or you can do both to add extras to the set
-      //   xinha_pass_to_php_backend: ['minimal', 'Linker' ]
-      xinha_plugins:  
-      [ 
-        'minimal', // Load the standard minimal set from Xinha's norma plugins
-        
-        // Since this example might be using Xinha from a CMS, we 
-        //  make sure to load our PHP plugins from our local plugins
-        //  directory on our own server, not the CMS server (which wouldn't
-        //  support PHP).
-        { 
-           from: '../plugins',      // From our local plugins directory
-           load:['MootoolsFileManager', 'Linker'] // Load these plugins
-        } 
-      ],
-      
-      // The default toolbar can be one of the pre-defined toolbars, 
-      //   'default', 'minimal', 'minimal+fonts', 'supermini'
-      //   xinha_toolbar: 'minimal+fonts'
-      //
-      // or you an specify a toolbar structure completely
-      //   xinha_toolbar: [ ["popupeditor"],["separator","bold","italic","underline","strikethrough","superscript"] ]
-      xinha_toolbar:  'minimal+fonts',
-      
-      // To specify a stylesheet to load inside the editor (to style the contents
-      //  the user is editing), simply specify the path to it here.
-      //
-      // Note as with all these options, it's optional, leave it out if you 
-      //  don't want to load a stylesheet in the editor
-      xinha_stylesheet: null, 
-      
-      // This is where you set the other default configuration globally
-      xinha_config:            function(xinha_config) 
-      {
-        
-        // Configure the File Manager
-        with (xinha_config.MootoolsFileManager)
-        { 
-          <?php 
-            require_once('../contrib/php-xinha.php');
-            xinha_pass_to_php_backend
-            (       
-              array
-              (
-                'images_dir' => getcwd() . '/images',
-                'images_url' => preg_replace('/\/examples.*/', '', $_SERVER['REQUEST_URI']) . '/examples/images',
-                'images_allow_upload' => true,
-                'images_allow_delete' => true,
-                'images_allow_download' => true,
-                'images_use_hspace_vspace' => false,
-                
-                'files_dir' => getcwd() . '/images',
-                'files_url' => preg_replace('/\/examples.*/', '', $_SERVER['REQUEST_URI']) . '/examples/images',
-                'files_allow_upload' => true,
-                'max_files_upload_size' => '4M',
-              )
-            )
-          ?>
-        }
-      
-        // Configure the Linker
-        with (xinha_config.Linker)
-        { 
-          <?php 
-            require_once('../contrib/php-xinha.php');
-            xinha_pass_to_php_backend
-            (       
-              array
-              (
-                'dir' => getcwd(),
-                'url' => '/examples',                
-              )
-            )
-          ?>
-        }
-        
-      },
-      
-      // Here is where you can customise configs for each editor area
-      //  See the Newbie.html example for usage
-      xinha_config_specific:   function(xinha_config, textarea)
-      {
-
-      },
-      
-      // Here you can limit the plugins to certain editor areas
-      //  See the Newbie.html example for usage
-      xinha_plugins_specific:  function(xinha_plugins, textarea)
-      {
-
-      }
-    }
-
-  </script>
-  
-</head>
-
-<body>
-  <h1> Demonstration of MootoolsFileManager and Linker with Xinha integration </h1>
-  <p>  MootoolsFileManager (for uploading Images and Files) and Linker (for browsing files on the server and making a link to them) plugins require PHP configuration to be passed in a secure way, this example shows you how to do this!  View the source, all the code is in the head.</p>
-  
-  <form action="javascript:void(0);" id="editors_here" onsubmit="alert(this.myTextArea.value);">
-     <div>
-    <textarea id="myTextArea" name="myTextArea" style="width:100%;height:320px;">
-&lt;p&gt;Lorem ipsum dolor sit amet, consectetuer adipiscing elit.
-Aliquam et tellus vitae justo varius placerat. Suspendisse iaculis
-velit semper dolor. Donec gravida tincidunt mi. Curabitur tristique
-ante elementum turpis. Aliquam nisl. Nulla posuere neque non
-tellus. Morbi vel nibh. Cum sociis natoque penatibus et magnis dis
-parturient montes, nascetur ridiculus mus. Nam nec wisi. In wisi.
-Curabitur pharetra bibendum lectus.&lt;/p&gt;
-</textarea>
-    <input type="submit" /> <input type="reset" />
-    </div>
-  </form>
-
-</body>
-</html>
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/examples/custom_plugins/StatusBarMessage/StatusBarMessage.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/examples/custom_plugins/StatusBarMessage/StatusBarMessage.js
deleted file mode 100644
index f386c17..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/examples/custom_plugins/StatusBarMessage/StatusBarMessage.js
+++ /dev/null
@@ -1,29 +0,0 @@
-// A sily little demo plugin that puts a message in the status bar

-

-function StatusBarMessage(editor) {

-  this.editor = editor;

-}

-

-StatusBarMessage._pluginInfo = {

-  name          : "StatusBarMessage",

-  version       : "0.1",

-  developer     : "James Sleeman",

-  license       : "htmlArea"

-};

-

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

-  return Xinha._lc(string, "StatusBarMessage");

-};

-

-StatusBarMessage.prototype.onGenerateOnce = function() {

-  var self = this;

-  if (this.message==null) {

-      var message = self.editor.registerStatusWidget('StatusBarMessage', ['wysiwyg']);

-      this.message = message;

-  }

-};

-

-StatusBarMessage.prototype.onUpdateToolbar = function() {

-  this.message.innerHTML = this._lc("Hello World, This Is The Custom Plugin Speaking");

-};

-

diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/examples/files/Extended.html b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/examples/files/Extended.html
deleted file mode 100644
index f9c22ea..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/examples/files/Extended.html
+++ /dev/null
@@ -1,320 +0,0 @@
-<html>

-

-<head>

-  <title>Settings</title>

-  <link rel="stylesheet" type="text/css" href="../../popups/popup.css" />

-  <script type="text/javascript">

-

-function getAbsolutePos(el) {

-  var r = { x: el.offsetLeft, y: el.offsetTop };

-  if (el.offsetParent) {

-    var tmp = getAbsolutePos(el.offsetParent);

-    r.x += tmp.x;

-    r.y += tmp.y;

-  }

-  return r;

-};

-

-function getSelectedValue(el) {

-  if(!el)

-    return "";

-  return el[el.selectedIndex].value;

-}

-

-function setSelectedValue(el, val) {

-  if(!el)

-    return "";

-  var ops = el.getElementsByTagName("option");

-  for (var i = ops.length; --i >= 0;) {

-    var op = ops[i];

-    op.selected = (op.value == val);

-  }

-  el.value = val;

-}

-

-function getCheckedValue(el) {

-  if(!el)

-    return "";

-  var radioLength = el.length;

-  if(radioLength == undefined)

-    if(el.checked)

-      return el.value;

-    else

-      return "false";

-  for(var i = 0; i < radioLength; i++) {

-    if(el[i].checked) {

-      return el[i].value;

-    }

-  }

-  return "";

-}

-

-function setCheckedValue(el, val) {

-  if(!el)

-    return;

-  var radioLength = el.length;

-  if(radioLength == undefined) {

-    el.checked = (el.value == val.toString());

-    return;

-  }

-  for(var i = 0; i < radioLength; i++) {

-    el[i].checked = false;

-    if(el[i].value == val.toString()) {

-      el[i].checked = true;

-    }

-  }

-}

-

-function __dlg_onclose() {

-  opener.Dialog._return(null);

-};

-

-// closes the dialog and passes the return info upper.

-function __dlg_close(val) {

-  opener.Dialog._return(val);

-  window.close();

-};

-

-function __dlg_close_on_esc(ev) {

-  ev || (ev = window.event);

-  if (ev.keyCode == 27) {

-    window.close();

-    return false;

-  }

-  return true;

-};

-

-function __dlg_init(bottom) {

-  var body = document.body;

-  var body_height = 0;

-  if (typeof bottom == "undefined") {

-    var div = document.createElement("div");

-    body.appendChild(div);

-    var pos = getAbsolutePos(div);

-    body_height = pos.y;

-  } else {

-    var pos = getAbsolutePos(bottom);

-    body_height = pos.y + bottom.offsetHeight;

-  }

-  if (!window.dialogArguments && opener.Dialog._arguments)

-  {

-    window.dialogArguments = opener.Dialog._arguments;

-  }

-  if (!document.all) {

-   if(window.sizeToContent)

-   {

-    window.sizeToContent();

-    window.sizeToContent();  // for reasons beyond understanding,

-          // only if we call it twice we get the

-          // correct size.

-    }

-    window.addEventListener("unload", __dlg_onclose, true);

-    window.innerWidth = body.offsetWidth + 5;

-    window.innerHeight = body_height + 2;

-    // center on parent

-    var x = opener.screenX + (opener.outerWidth - window.outerWidth) / 2;

-    var y = opener.screenY + (opener.outerHeight - window.outerHeight) / 2;

-    window.moveTo(x, y);

-  } else {

-    // window.dialogHeight = body.offsetHeight + 50 + "px";

-    // window.dialogWidth = body.offsetWidth + "px";

-    window.resizeTo(body.offsetWidth, body_height);

-    var ch = body.clientHeight;

-    var cw = body.clientWidth;

-    window.resizeBy(body.offsetWidth - cw, body_height - ch);

-    var W = body.offsetWidth;

-    var H = 2 * body_height - ch;

-    var x = (screen.availWidth - W) / 2;

-    var y = (screen.availHeight - H) / 2;

-    window.moveTo(x, y);

-  }

-  document.body.onkeypress = __dlg_close_on_esc;

-};

-

-function placeFocus() {

-var bFound = false;

-  // for each form

-  for (f=0; f < document.forms.length; f++) {

-    // for each element in each form

-    for(i=0; i < document.forms[f].length; i++) {

-      // if it's not a hidden element

-      if (document.forms[f][i].type != "hidden") {

-        // and it's not disabled

-        if (document.forms[f][i].disabled != true) {

-            // set the focus to it

-            document.forms[f][i].focus();

-            var bFound = true;

-        }

-      }

-      // if found in this element, stop looking

-      if (bFound == true)

-        break;

-    }

-    // if found in this form, stop looking

-    if (bFound == true)

-      break;

-  }

-}

-

-function Init() {

-  __dlg_init();

-  var param = window.dialogArguments;

-  if(param) {

-    var el;

-    for (var field in param) {

-      //alert(field + '="' + param[field] + '"');

-      el = document.getElementById(field);

-      if (el.tagName.toLowerCase()=="input"){

-        if ((el.type.toLowerCase()=="radio") || (el.type.toLowerCase()=="checkbox")){

-          setCheckedValue(el, param[field]);

-        } else {

-          el.value = param[field];

-        }

-      } else if (el.tagName.toLowerCase()=="select"){

-        setSelectedValue(el, param[field]);

-      } else if (el.tagName.toLowerCase()=="textarea"){

-        el.value = param[field];

-      }

-    }

-  }

-  placeFocus();

-};

-

-// pass data back to the calling window

-function onOK() {

-  var param = new Object();

-  var el = document.getElementsByTagName('input');

-  for (var i=0; i<el.length;i++){

-    if ((el[i].type.toLowerCase()=="radio") || (el[i].type.toLowerCase()=="checkbox")){

-      if (getCheckedValue(el[i])!=''){

-        param[el[i].id] = getCheckedValue(el[i]);

-      }

-    } else {

-      param[el[i].id] = el[i].value;

-    }

-  }

-  el = document.getElementsByTagName('select');

-  for (var i=0; i<el.length;i++){

-    param[el[i].id] = getSelectedValue(el[i]);

-  }

-  el = document.getElementsByTagName('textarea');

-  for (var i=0; i<el.length;i++){

-    param[el[i].id] = el[i].value;

-  }

-  __dlg_close(param);

-  return false;

-};

-

-function onCancel() {

-  __dlg_close(null);

-  return false;

-};

-

-</script>

-

-<style type="text/css">

-  label { width: 16em; float: left; padding: 2px 5px; text-align: right; }

-  br { clear: both; }

-</style>

-

-</head>

-

-<body class="dialog" onload="Init(); window.resizeTo(420, 820);">

-<div class="title">Settings</div>

-  <form action="" method="get">

-  <fieldset>

-    <legend>Xinha options</legend>

-    <label for="width">Editor width:</label>

-    <input type="text" name="width" id="width" title="Allowed values are 'auto', 'toolbar' or a numeric value followed by 'px'." /><br />

-    <label for="height">Editor height:</label>

-    <input type="text" name="height" id="height" title="Allowed values are 'auto' or a numeric value followed by 'px'." /><br />

-    <label for="sizeIncludesBars">Size includes bars</label>

-    <input type="checkbox" name="sizeIncludesBars" id="sizeIncludesBars" value="true" title="Specifies whether the toolbar should be included in the size, or are extra to it." /><br />

-    <label for="sizeIncludesPanels">Size includes panels</label>

-    <input type="checkbox" name="sizeIncludesPanels" id="sizeIncludesPanels" value="true" title="Specifies whether the panels should be included in the size, or are extra to it." /><br />

-    <label for="statusBar">Status Bar</label>

-    <input type="checkbox" name="statusBar" id="statusBar" value="true" title="Enable creation of the status bar?" /><br />

-    <label for="htmlareaPaste">Htmlarea Paste</label>

-    <input type="checkbox" name="htmlareaPaste" id="htmlareaPaste" value="true" title="Intercept ^V and use the Xinha paste command" /><br />

-    <label for="mozParaHandler">Mozilla Parameter Handler:</label>

-    <select name="mozParaHandler" id="mozParaHandler" title="Gecko only: Let the built-in routine for handling the return key decide if to enter br or p tags or use a custom implementation.">

-    <option value="built-in">built-in</option>

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

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

-    </select><br />

-    <label for="getHtmlMethod">GetHtml Method:</label>

-    <select name="getHtmlMethod" id="getHtmlMethod" title="This determines the method how the HTML output is generated.">

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

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

-    </select><br />

-    <label for="undoSteps">Undo steps:</label>

-    <input type="text" name="undoSteps" id="undoSteps" title="Maximum size of the undo queue."  /><br />

-    <label for="undoTimeout">Undo Timeout:</label>

-    <input type="text" name="undoTimeout" id="undoTimeout" title="The time interval at which undo samples are taken, default: 500 (1/2 sec)."  /><br />

-    <label for="changeJustifyWithDirection">change justify with direction</label>

-    <input type="checkbox" name="changeJustifyWithDirection" id="changeJustifyWithDirection" value="true" title="Set this to true if you want to explicitly right-justify when setting the text direction to right-to-left" /><br />

-    <label for="fullPage">full Page</label>

-    <input type="checkbox" name="fullPage" id="fullPage" value="true" title="If true then Xinha will retrieve the full HTML, starting with the HTML-tag." /><br />

-    <label for="pageStyle">Page style:</label>

-    <textarea name="pageStyle" id="pageStyle" title="Raw style definitions included in the edited document"></textarea>

-<!--    pageStyleSheets -->

-    <label for="baseHref">Base href:</label>

-    <input type="text" name="baseHref" id="baseHref" title="specify a base href for relative links" /><br />

-    <label for="expandRelativeUrl">expand relative Url</label>

-    <input type="checkbox" name="expandRelativeUrl" id="expandRelativeUrl" value="true" title="If true, relative URLs (../) will be made absolute"/><br />

-    <label for="stripBaseHref">Strip base href</label>

-    <input type="checkbox" name="stripBaseHref" id="stripBaseHref" value="true" title="We can strip the server part out of URL to make/leave them semi-absolute" /><br />

-    <label for="stripSelfNamedAnchors">Strip self named anchors</label>

-    <input type="checkbox" name="stripSelfNamedAnchors" id="stripSelfNamedAnchors" value="true" title="We can strip the url of the editor page from named links" /><br />

-    <label for="only7BitPrintablesInURLs">only 7bit printables in URLs</label>

-    <input type="checkbox" name="only7BitPrintablesInURLs" id="only7BitPrintablesInURLs" value="true" title="In URLs all characters above ASCII value 127 have to be encoded using % codes" /><br />

-    <label for="sevenBitClean">7bit Clean</label>

-    <input type="checkbox" name="sevenBitClean" id="sevenBitClean" value="true" title="If you are putting the HTML written in Xinha into an email you might want it to be 7-bit characters only." /><br />

-    <label for="killWordOnPaste">kill Word on paste</label>

-    <input type="checkbox" name="killWordOnPaste" id="killWordOnPaste" value="true" title="Set to true if you want Word code to be cleaned upon Paste." /><br />

-    <label for="makeLinkShowsTarget">make Link Shows Target</label>

-    <input type="checkbox" name="makeLinkShowsTarget" id="makeLinkShowsTarget" value="true" title="Enable the 'Target' field in the Make Link dialog." /><br />

-    <label for="flowToolbars">flow toolbars</label>

-    <input type="checkbox" name="flowToolbars" id="flowToolbars" value="true" /><br />

-    <label for="stripScripts">strip Scripts</label>

-    <input type="checkbox" name="stripScripts" id="stripScripts" value="true" title="Set to false if you want to allow JavaScript in the content" /><br />

-    <label for="showLoading">show loading</label>

-    <input type="checkbox" name="showLoading" id="showLoading" value="true" /><br />

-  </fieldset>

-

-  <fieldset id="CharacterMapOptions" class="options">

-    <legend>CharacterMap options</legend>

-    <label for="CharacterMapMode">Mode :</label>

-    <select id="CharacterMapMode" name="CharacterMapMode">

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

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

-    </select>

-  </fieldset>

-

-  <fieldset id="ListTypeOptions" class="options">

-    <legend>ListType options</legend>

-    <label class="ListTypeMode">Mode :</label>

-    <select id="ListTypeMode" name="ListTypeMode">

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

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

-    </select>

-  </fieldset>

-

-  <fieldset id="CharCounterOptions" class="options">

-    <legend>CharCounter options</legend>

-    <label for="showChar">show Char :</label>

-    <input type="checkbox" name="showChar" id="showChar" value="true" /><br />

-    <label for="showWord">show Word :</label>

-    <input type="checkbox" name="showWord" id="showWord" value="true" /><br />

-    <label for="showHtml">show Html :</label>

-    <input type="checkbox" name="showHtml" id="showHtml" value="true" /><br />

-  </fieldset>

-  <br />

-

-  <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>

diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/examples/files/custom.css b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/examples/files/custom.css
deleted file mode 100644
index 48cbfe7..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/examples/files/custom.css
+++ /dev/null
@@ -1,40 +0,0 @@
-  /*--------------------------------------:noTabs=true:tabSize=2:indentSize=2:--
-    --  CSS plugin example CSS file.  This file is used by full_example.js
-    --  when the CSS plugin is included in an auto-generated example.
-    --  @TODO Make this CSS more useful.
-    --
-    --  $HeadURL:http://svn.xinha.webfactional.com/trunk/examples/files/custom.css $
-    --  $LastChangedDate:2008-02-04 01:43:21 +0100 (Mo, 04 Feb 2008) $
-    --  $LastChangedRevision:962 $
-    --  $LastChangedBy:ray $
-    --------------------------------------------------------------------------*/
-
-body { background-color: #234; color: #dd8; font-family: tahoma; font-size: 12px; }
-
-a:link, a:visited { color: #8cf; }
-a:hover { color: #ff8; }
-
-h1 { background-color: #456; color: #ff8; padding: 2px 5px; border: 1px solid; border-color: #678 #012 #012 #678; }
-
-/* syntax highlighting (used by the first combo defined for the CSS plugin) */
-
-pre { margin: 0px 1em; padding: 5px 1em; background-color: #000; border: 1px dotted #02d; border-left: 2px solid #04f; }
-.code { color: #f5deb3; }
-.string { color: #00ffff; }
-.comment { color: #8fbc8f; }
-.variable-name { color: #fa8072; }
-.type { color: #90ee90; font-weight: bold; }
-.reference { color: #ee82ee; }
-.preprocessor { color: #faf; }
-.keyword { color: #ffffff; font-weight: bold; }
-.function-name { color: #ace; }
-.html-tag { font-weight: bold; }
-.html-helper-italic { font-style: italic; }
-.warning { color: #ffa500; font-weight: bold; }
-.html-helper-bold { font-weight: bold; }
-
-/* info combo */
-
-.quote { font-style: italic; color: #ee9; }
-.highlight { background-color: yellow; color: #000; }
-.deprecated { text-decoration: line-through; color: #aaa; }
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/examples/files/dynamic.css b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/examples/files/dynamic.css
deleted file mode 100644
index 497de62..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/examples/files/dynamic.css
+++ /dev/null
@@ -1,56 +0,0 @@
-  /*--------------------------------------:noTabs=true:tabSize=2:indentSize=2:--
-    --  DynamicCSS plugin example CSS file.  Used by full_example.js
-    --  when the DynamicCSS plugin is included in an auto-generated example.
-    --  @TODO Make this CSS more useful.
-    --
-    --  $HeadURL:http://svn.xinha.webfactional.com/trunk/examples/files/dynamic.css $
-    --  $LastChangedDate:2008-02-04 01:43:21 +0100 (Mo, 04 Feb 2008) $
-    --  $LastChangedRevision:962 $
-    --  $LastChangedBy:ray $
-    --------------------------------------------------------------------------*/
-
-p {
-  FONT-FAMILY: Arial, Helvetica;
-  FONT-SIZE: 9pt;
-  FONT-WEIGHT: normal;
-  COLOR: #000000;
-}
-
-p.p1 {
-  FONT-FAMILY: Arial, Helvetica;
-  FONT-SIZE: 11pt;
-  FONT-WEIGHT: normal;
-  COLOR: #000000;
-}
-
-p.p2 {
-  FONT-FAMILY: Arial, Helvetica;
-  FONT-SIZE: 13pt;
-  FONT-WEIGHT: normal;
-  COLOR: #000000;
-}
-
-div {
-  FONT-FAMILY: Arial, Helvetica;
-  FONT-SIZE: 9pt;
-  FONT-WEIGHT: bold;
-  COLOR: #000000;
-}
-
-div.div1 {
-  FONT-FAMILY: Arial, Helvetica;
-  FONT-SIZE: 11pt;
-  FONT-WEIGHT: bold;
-  COLOR: #000000;
-}
-
-div.div2 {
-  FONT-FAMILY: Arial, Helvetica;
-  FONT-SIZE: 13pt;
-  FONT-WEIGHT: bold;
-  COLOR: #000000;
-}
-
-.quote { font-style: italic; color: #ee9; }
-.highlight { background-color: yellow; color: #000; }
-.deprecated { text-decoration: line-through; color: #aaa; }
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/examples/files/ext_example-body.php b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/examples/files/ext_example-body.php
deleted file mode 100644
index 4cb6f8c..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/examples/files/ext_example-body.php
+++ /dev/null
@@ -1,256 +0,0 @@
-<?php 

-  switch(@$_REQUEST['DocType'])

-  {

-    

-    case 'quirks':

-      break;

-      

-   case 'almost':

-      echo '<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">';

-      break;

-    

-    case 'standards':

-    default:

-      echo '<!DOCTYPE html>';

-      break;

-      

-  }

-?>

-<html>

-<head>

-

-  <!-- ---------------------------------------------------------------------

-    --  $HeadURL: http://svn.xinha.org/branches/MootoolsFileManager-Update/examples/files/ext_example-body.html $

-    --  $LastChangedDate: 2008-10-13 06:42:42 +1300 (Mon, 13 Oct 2008) $

-    --  $LastChangedRevision: 1084 $

-    --  $LastChangedBy: ray $

-    ------------------------------------------------------------------------ -->

-

-  <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />

-  <title>Example of Xinha</title>

-  <link rel="stylesheet" type="text/css" href="full_example.css" />

-

-  <script type="text/javascript">

-    function showError( sMsg, sUrl, sLine){

-      document.getElementById('errors').value += 'Error: ' + sMsg + '\n' +

-                                                 'Source File: ' + sUrl + '\n' +

-                                                 'Line: ' + sLine + '\n';

-      return false;

-    }

-    // You must set _editor_url to the URL (including trailing slash) where

-    // where xinha is installed, it's highly recommended to use an absolute URL

-    //  eg: _editor_url = "/path/to/xinha/";

-    // You may try a relative URL if you wish]

-    //  eg: _editor_url = "../";

-    // in this example we do a little regular expression to find the absolute path.

-    _editor_url  = document.location.href.replace(/examples\/files\/ext_example-body\.php.*/, '')

-    //moved _editor_lang & _editor_skin to init function because of error thrown when frame document not ready

-  </script>

-

-  <!-- Load up the actual editor core -->

-  <script type="text/javascript" src="../../XinhaCore.js"></script>

-

-  <script type="text/javascript">

-    xinha_editors = null;

-    xinha_init    = null;

-    xinha_config  = null;

-    xinha_plugins = null;

-

-    xinha_init = xinha_init ? xinha_init : function() {

-      window.onerror = showError;

-      document.onerror = showError;

-

-      var f = top.frames["menu"].document.forms["fsettings"];

-      _editor_lang = f.lang[f.lang.selectedIndex].value; // the language we need to use in the editor.

-      _editor_skin = f.skin[f.skin.selectedIndex].value; // the skin we use in the editor

-      _editor_icons = f.icons[f.icons.selectedIndex].value;

-      

-// What are the plugins you will be using in the editors on this page.

-// List all the plugins you will need, even if not all the editors will use all the plugins.

-      xinha_plugins = [ ];

-      for(var x = 0; x < f.plugins.length; x++) {

-        if(f.plugins[x].checked) xinha_plugins.push(f.plugins[x].value);

-      }

-

-      // THIS BIT OF JAVASCRIPT LOADS THE PLUGINS, NO TOUCHING  :)

-      if(!Xinha.loadPlugins(xinha_plugins, xinha_init)) return;

-

-// What are the names of the textareas you will be turning into editors?

-      var num = 1;

-      num = parseInt(f.num.value);

-      if(isNaN(num)) {

-        num = 1;

-        f.num.value = 1;

-      }

-      var dest = document.getElementById("editors_here");

-      var lipsum = window.parent.menu.document.getElementById('myTextarea0').value;

-

-      xinha_editors = [ ]

-      for(var x = 0; x < num; x++) {

-        var ta = 'myTextarea' + x;

-        xinha_editors.push(ta);

-

-        var div = document.createElement('div');

-        div.className = 'area_holder';

-

-        var txta = document.createElement('textarea');

-        txta.id   = ta;

-        txta.name = ta;

-        txta.value = lipsum;

-        txta.style.width="100%";

-        txta.style.height="420px";

-

-        div.appendChild(txta);

-        dest.appendChild(div);

-      }

-

-// Create a default configuration to be used by all the editors.

-      settings = top.frames["menu"].settings;

-      xinha_config = new Xinha.Config();

-      xinha_config.width = settings.width;

-      xinha_config.height = settings.height;

-      xinha_config.sizeIncludesBars = settings.sizeIncludesBars;

-      xinha_config.sizeIncludesPanels = settings.sizeIncludesPanels;

-      xinha_config.statusBar = settings.statusBar;

-      xinha_config.htmlareaPaste = settings.htmlareaPaste;

-      xinha_config.mozParaHandler = settings.mozParaHandler;

-      xinha_config.getHtmlMethod = settings.getHtmlMethod;

-      xinha_config.undoSteps = settings.undoSteps;

-      xinha_config.undoTimeout = settings.undoTimeout;

-      xinha_config.changeJustifyWithDirection = settings.changeJustifyWithDirection;

-      xinha_config.fullPage = settings.fullPage;

-      xinha_config.pageStyle = settings.pageStyle;

-      xinha_config.baseHref = settings.baseHref;

-      xinha_config.expandRelativeUrl = settings.expandRelativeUrl;

-      xinha_config.stripBaseHref = settings.stripBaseHref;

-      xinha_config.stripSelfNamedAnchors = settings.stripSelfNamedAnchors;

-      xinha_config.only7BitPrintablesInURLs = settings.only7BitPrintablesInURLs;

-      xinha_config.sevenBitClean = settings.sevenBitClean;

-      xinha_config.killWordOnPaste = settings.killWordOnPaste;

-      xinha_config.makeLinkShowsTarget = settings.makeLinkShowsTarget;

-      xinha_config.flowToolbars = settings.flowToolbars;

-      xinha_config.stripScripts = settings.stripScripts;

-      xinha_config.flowToolbars = settings.flowToolbars;

-      xinha_config.showLoading = settings.showLoading;

-      xinha_config.pageStyleSheets = ["full_example.css"];

-

-// Create a default configuration for the plugins

-      if (typeof CharCounter != 'undefined') {

-        xinha_config.CharCounter.showChar = settings.showChar;

-        xinha_config.CharCounter.showWord = settings.showWord;

-        xinha_config.CharCounter.showHtml = settings.showHtml;

-      }

-

-      if(typeof CharacterMap != 'undefined') xinha_config.CharacterMap.mode = settings.CharacterMapMode;

-      if(typeof ListType != 'undefined') xinha_config.ListType.mode = settings.ListTypeMode;

-      if(typeof CSSDropDowns != 'undefined') xinha_config.pageStyle = xinha_config.pageStyle + "\n" + "@import url(custom.css);";

-      if(typeof DynamicCSS != 'undefined') xinha_config.pageStyle = "@import url(dynamic.css);";

-      if(typeof Filter != 'undefined') xinha_config.Filters = ["Word", "Paragraph"];

-

-      if(typeof Stylist != 'undefined') {

-        // We can load an external stylesheet like this - NOTE : YOU MUST GIVE AN ABSOLUTE URL

-        //  otherwise it won't work!

-        xinha_config.stylistLoadStylesheet(document.location.href.replace(/[^\/]*\.html/, 'stylist.css'));

-

-        // Or we can load styles directly

-        xinha_config.stylistLoadStyles('p.red_text { color:red }');

-

-        // If you want to provide "friendly" names you can do so like

-        // (you can do this for stylistLoadStylesheet as well)

-        xinha_config.stylistLoadStyles('p.pink_text { color:pink }', {'p.pink_text' : 'Pretty Pink'});

-      }

-

-      if(typeof InsertWords != 'undefined') {

-        // Register the keyword/replacement list

-        var keywrds1 = new Object();

-        var keywrds2 = new Object();

-

-        keywrds1['-- Dropdown Label --'] = '';

-        keywrds1['onekey'] = 'onevalue';

-        keywrds1['twokey'] = 'twovalue';

-        keywrds1['threekey'] = 'threevalue';

-

-        keywrds2['-- Insert Keyword --'] = '';

-        keywrds2['Username'] = '%user%';

-        keywrds2['Last login date'] = '%last_login%';

-        xinha_config.InsertWords = {

-          combos : [ { options: keywrds1, context: "body" },

-                     { options: keywrds2, context: "li" } ]

-        }

-      }

-

-

-      if(typeof MootoolsFileManager != 'undefined')

-      {

-        with (xinha_config.MootoolsFileManager)

-        { 

-          <?php 

-            require_once('../../contrib/php-xinha.php');

-            xinha_pass_to_php_backend

-            (       

-              array

-              (

-                'images_dir' => getcwd() . '/../images',

-                'images_url' => preg_replace('/\/examples.*/', '', $_SERVER['REQUEST_URI']) . '/examples/images',

-                'images_allow_upload' => false,

-                'images_allow_delete' => false,

-                'images_allow_download' => true,

-                'images_use_hspace_vspace' => false,

-                

-                'files_dir' => getcwd() . '/../images',

-                'files_url' => preg_replace('/\/examples.*/', '', $_SERVER['REQUEST_URI']) . '/examples/images',

-                'files_allow_upload' => false,

-                'max_files_upload_size' => '4M',

-              )

-            )

-          ?>

-        }

-        

-      }

-// First create editors for the textareas.

-// You can do this in two ways, either

-//   xinha_editors   = Xinha.makeEditors(xinha_editors, xinha_config, xinha_plugins);

-// if you want all the editor objects to use the same set of plugins, OR;

-//   xinha_editors = Xinha.makeEditors(xinha_editors, xinha_config);

-//   xinha_editors['myTextarea0'].registerPlugins(['Stylist']);

-//   xinha_editors['myTextarea1'].registerPlugins(['CSS','SuperClean']);

-// if you want to use a different set of plugins for one or more of the editors.

-      xinha_editors = Xinha.makeEditors(xinha_editors, xinha_config, xinha_plugins);

-

-// If you want to change the configuration variables of any of the editors,

-// this is the place to do that, for example you might want to

-// change the width and height of one of the editors, like this...

-//   xinha_editors['myTextarea0'].config.width  = '640px';

-//   xinha_editors['myTextarea0'].config.height = '480px';

-

-// Finally we "start" the editors, this turns the textareas into Xinha editors.

-      Xinha.startEditors(xinha_editors);

-    }

-

-// javascript submit handler

-// this shows how to create a javascript submit button that works with the htmleditor.

-    submitHandler = function(formname) {

-      var form = document.getElementById(formname);

-      // in order for the submit to work both of these methods have to be called.

-      form.onsubmit();

-      window.parent.menu.document.getElementById('myTextarea0').value = document.getElementById('myTextarea0').value;

-      form.submit();

-      return true;

-    }

-

-    window.onload = xinha_init;

-//    window.onunload = Xinha.collectGarbageForIE;

-  </script>

-</head>

-

-<body>

-  <form id="to_submit" name="to_submit" method="post" action="ext_example-dest.php">

-  <div id="editors_here"></div>

-  <button type="button" onclick="submitHandler('to_submit');">Submit</button>

-  <textarea id="errors" name="errors" style="width:100%; height:100px; background:silver;"></textarea><!-- style="display:none;" -->

-  </form>

-  

-  <!-- This script is used to show the rendering mode (Quirks, Standards, Almost Standards) --> 

-  <script type="text/javascript" src="../render-mode-developer-help.js"></script>

-</body>

-</html>

diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/examples/files/ext_example-dest.php b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/examples/files/ext_example-dest.php
deleted file mode 100644
index cbc1eed..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/examples/files/ext_example-dest.php
+++ /dev/null
@@ -1,23 +0,0 @@
-<html>
-<head>
-  <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
-  <title>Example of Xinha</title>
-  <link rel="stylesheet" href="full_example.css" />
-</head>
-<body>
-<?php
-if (get_magic_quotes_gpc()) {
-  $_REQUEST = array_map('stripslashes',$_REQUEST);
-}
-// or in php.ini
-//; Magic quotes for incoming GET/POST/Cookie data.
-//magic_quotes_gpc = Off
-  foreach($_REQUEST as $key=>$value){
-    if(substr($key,0,10) == 'myTextarea') {
-      echo '<h3 style="border-bottom:1px solid black;">'.$key.'(source):</h3><xmp style="border:1px solid black; width: 100%; height: 200px; overflow: auto;">'.$value.'</xmp><br/>';
-      echo '<h3 style="border-bottom:1px solid black;">'.$key.'(preview):</h3>'.$value;
-    }
-  }
-?>
-</body>
-</html>
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/examples/files/ext_example-menu.php b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/examples/files/ext_example-menu.php
deleted file mode 100644
index 54678e5..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/examples/files/ext_example-menu.php
+++ /dev/null
@@ -1,473 +0,0 @@
-<?php
-  $LocalPluginPath = dirname(dirname(dirname(__FILE__))).DIRECTORY_SEPARATOR.'plugins';
-  $LocalSkinPath = dirname(dirname(dirname(__File__))).DIRECTORY_SEPARATOR.'skins';
-?>
-<html>
-<head>
-
-  <!--------------------------------------:noTabs=true:tabSize=2:indentSize=2:--
-    --  Xinha example menu.  This file is used by full_example.html within a
-    --  frame to provide a menu for generating example editors using
-    --  full_example-body.html, and full_example.js.
-    --
-    --  $HeadURL: http://svn.xinha.org/trunk/examples/files/ext_example-menu.php $
-    --  $LastChangedDate: 2018-02-19 22:14:05 +1300 (Mon, 19 Feb 2018) $
-    --  $LastChangedRevision: 1406 $
-    --  $LastChangedBy: gogo $
-    --------------------------------------------------------------------------->
-
-  <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
-  <title>Example of Xinha</title>
-  <link rel="stylesheet" href="full_example.css" />
-  <style type="text/css">
-    h1 {font: bold 22px "Staccato222 BT", cursive;}
-    form, p {margin: 0px; padding: 0px;}
-    label { display:block;}
-  </style>
-  <script language="JavaScript" type="text/javascript">
-  var settings = null;
-  settings = {
-    width: "auto",
-    height: "auto",
-    sizeIncludesBars: true,
-    sizeIncludesPanels: true,
-    statusBar: true,
-    htmlareaPaste: false,
-    mozParaHandler: "best",
-    getHtmlMethod: "DOMwalk",
-    undoSteps: 20,
-    undoTimeout: 500,
-    changeJustifyWithDirection: false,
-    fullPage: false,
-    pageStyle: "",
-    baseHref: null,
-    expandRelativeUrl: true,
-    stripBaseHref: true,
-    stripSelfNamedAnchors: true,
-    only7BitPrintablesInURLs: true,
-    sevenBitClean: false,
-    killWordOnPaste: true,
-    makeLinkShowsTarget: true,
-    flowToolbars: true,
-    stripScripts: false,
-    CharacterMapMode: "popup",
-    ListTypeMode: "toolbar",
-    showLoading: false,
-    showChar: true,
-    showWord: true,
-    showHtml: true
-  };
-
-
-    function getCookieVal (offset) {
-      var endstr = document.cookie.indexOf (";", offset);
-      if (endstr == -1)
-        endstr = document.cookie.length;
-      return unescape(document.cookie.substring(offset, endstr));
-    }
-
-    function getCookie (name) {
-      var arg = name + "=";
-      var alen = arg.length;
-      var clen = document.cookie.length;
-      var i = 0;
-      while (i < clen) {
-        var j = i + alen;
-        if (document.cookie.substring(i, j) == arg)
-          return getCookieVal (j);
-        i = document.cookie.indexOf(" ", i) + 1;
-        if (i == 0) break;
-      }
-      return null;
-    }
-
-    function setCookie (name, value) {
-      var argv = setCookie.arguments;
-      var argc = setCookie.arguments.length;
-      var expires = (argc > 2) ? argv[2] : null;
-      var path = (argc > 3) ? argv[3] : null;
-      var domain = (argc > 4) ? argv[4] : null;
-      var secure = (argc > 5) ? argv[5] : false;
-      document.cookie = name + "=" + escape (value) +
-        ((expires == null) ? "" : ("; expires=" + expires.toGMTString())) +
-        ((path == null) ? "" : ("; path=" + path)) +
-        ((domain == null) ? "" : ("; domain=" + domain)) +
-        ((secure == true) ? "; secure" : "");
-    }
-
-  function _onResize() {
-    var sHeight;
-    if (window.innerHeight) sHeight = window.innerHeight;
-    else if (document.body && document.body.offsetHeight) sHeight = document.body.offsetHeight;
-    else return;
-    if (sHeight>300) {
-      sHeight = sHeight - 285;
-    } else {
-      sHeight = 30
-    }
-    var div = document.getElementById("div_plugins");
-    div.style.height = sHeight + "px";
-  }
-
-function Dialog(url, action, init) {
-	if (typeof init == "undefined") {
-		init = window;	// pass this window object by default
-	}
-	if (typeof window.showModalDialog == 'function')
-	{
-		Dialog._return = action;
-		var r = window.showModalDialog(url, init, "dialogheight=10;dialogheight=10;scroll=yes;resizable=yes");
-	}
-	else
-	{
-		Dialog._geckoOpenModal(url, action, init);
-	}
-};
-
-Dialog._parentEvent = function(ev) {
-  setTimeout( function() { if (Dialog._modal && !Dialog._modal.closed) { Dialog._modal.focus() } }, 50);
-  if (Dialog._modal && !Dialog._modal.closed) {
-    agt = navigator.userAgent.toLowerCase();
-    is_ie = ((agt.indexOf("msie") != -1) && (agt.indexOf("opera") == -1));
-    if (is_ie) {
-      ev.cancelBubble = true;
-      ev.returnValue = false;
-    } else {
-      ev.preventDefault();
-      ev.stopPropagation();
-    }
-  }
-};
-
-
-// should be a function, the return handler of the currently opened dialog.
-Dialog._return = null;
-
-// constant, the currently opened dialog
-Dialog._modal = null;
-
-// the dialog will read it's args from this variable
-Dialog._arguments = null;
-
-Dialog._geckoOpenModal = function(url, action, init) {
-  var dlg = window.open(url, "hadialog",
-            "toolbar=no,menubar=no,personalbar=no,width=10,height=10," +
-            "scrollbars=no,resizable=yes,modal=yes,dependable=yes");
-  Dialog._modal = dlg;
-  Dialog._arguments = init;
-
-  // capture some window's events
-  function capwin(w) {
-//		Xinha._addEvent(w, "click", Dialog._parentEvent);
-//		Xinha._addEvent(w, "mousedown", Dialog._parentEvent);
-//		Xinha._addEvent(w, "focus", Dialog._parentEvent);
-  };
-  // release the captured events
-  function relwin(w) {
-//		Xinha._removeEvent(w, "click", Dialog._parentEvent);
-//		Xinha._removeEvent(w, "mousedown", Dialog._parentEvent);
-//		Xinha._removeEvent(w, "focus", Dialog._parentEvent);
-  };
-  capwin(window);
-  // capture other frames
-  for (var i = 0; i < window.frames.length; capwin(window.frames[i++]));
-  // make up a function to be called when the Dialog ends.
-  Dialog._return = function (val) {
-    if (val && action) {
-      action(val);
-    }
-    relwin(window);
-    // capture other frames
-    for (var i = 0; i < window.frames.length; relwin(window.frames[i++]));
-    Dialog._modal = null;
-  };
-};
-
-  function fExtended () {
-    Dialog("Extended.html", function(param) {
-      if(param) {
-        settings.width = param["width"];
-        settings.height = param["height"];
-        settings.sizeIncludesBars = (param["sizeIncludesBars"]=="true");
-        settings.sizeIncludesPanels = (param["sizeIncludesPanels"]=="true");
-        settings.statusBar = (param["statusBar"]=="true");
-        settings.htmlareaPaste = (param["htmlareaPaste"]=="true");
-        settings.mozParaHandler = param["mozParaHandler"];
-        settings.getHtmlMethod = param["getHtmlMethod"];
-        settings.undoSteps = param["undoSteps"];
-        settings.undoTimeout = param["undoTimeout"];
-        settings.changeJustifyWithDirection = (param["changeJustifyWithDirection"]=="true");
-        settings.fullPage = (param["fullPage"]=="true");
-        settings.pageStyle = param["pageStyle"];
-        settings.baseHref = param["baseHref"];
-        settings.expandRelativeUrl = (param["expandRelativeUrl"]=="true");
-        settings.stripBaseHref = (param["stripBaseHref"]=="true");
-        settings.stripSelfNamedAnchors = (param["stripSelfNamedAnchors"]=="true");
-        settings.only7BitPrintablesInURLs = (param["only7BitPrintablesInURLs"]=="true");
-        settings.sevenBitClean = (param["sevenBitClean"]=="true");
-        settings.killWordOnPaste = (param["killWordOnPaste"]=="true");
-        settings.makeLinkShowsTarget = (param["makeLinkShowsTarget"]=="true");
-        settings.flowToolbars = (param["flowToolbars"]=="true");
-        settings.stripScripts = (param["stripScripts"]=="true");
-        settings.CharacterMapMode = param["CharacterMapMode"];
-        settings.ListTypeMode = param["ListTypeMode"];
-        settings.showLoading = (param["showLoading"]=="true");
-        settings.showChar = (param["showChar"]=="true");
-        settings.showWord = (param["showWord"]=="true");
-        settings.showHtml = (param["showHtml"]=="true");
-      }
-    }, settings );
-  }
-
-  function init(){
-    var co = getCookie('co_ext_Xinha');
-    if(co!=null){
-      var co_values;
-      var co_entries = co.split('###');
-      for (var i in co_entries) {
-        co_values = co_entries[i].split('=');
-        if(co_values[0]=='plugins') {
-          for(var x = 0; x < document.forms[0].plugins.length; x++) {
-            if(co_values[1].indexOf(document.forms[0].plugins[x].value)!=-1) {
-              document.forms[0].plugins[x].checked = true;
-            }
-          }
-        } else if(co_values[0]!='') {
-          document.getElementById(co_values[0]).value = co_values[1];
-        }
-      }
-    }
-    _onResize();
-  };
-
-  window.onresize = _onResize;
-  window.onload = init;
-  </script>
-</head>
-
-<body>
-  <form action="ext_example-body.php" target="body" name="fsettings" id="fsettings">
-  <h1>Xinha Example</h1>
-    <fieldset>
-      <legend>Settings</legend>
-        <label>
-          Number of Editors: <input type="text" name="num" id="num" value="1" style="width:25;" maxlength="2"/>
-        </label>
-        <label>
-          Language:
-          <select name="lang" id="lang">
-          <option value="en">English</option>
-          <option value="en">--- By Name ---</option>
-<option value="ch">Chinese (ch)</option>
-<option value="cz">Czech</option>
-<option value="da">Danish</option>
-<option value="de">German</option>
-<option value="ee">Ewe</option>
-<option value="el">Greek</option>
-<option value="es">Spanish</option>
-<option value="eu">Basque</option>
-<option value="fa">Persian (Farsi)</option>
-<option value="fi">Finnish</option>
-<option value="fr_ca">French (Canada)</option>
-<option value="fr">French</option>
-<option value="zn_ch">Chinese (zn_ch)</option>
-<option value="he">Hebrew</option>
-<option value="hu">Hungarian</option>
-<option value="it">Italian</option>
-<option value="ja">Japanese</option>
-<option value="lt">Lithuanian</option>
-<option value="lv">Latvian</option>
-<option value="nb">Norwegian</option>
-<option value="nl">Dutch</option>
-<option value="pl">Polish</option>
-<option value="pt_br">Portuguese (Brazil)</option>
-<option value="ro">Romanian</option>
-<option value="ru">Russian</option>
-<option value="sh">Serbo-Croatian</option>
-<option value="si">Slovenian</option>
-<option value="sr">Serbian</option>
-<option value="vn">Swedish</option>
-<option value="th">Thai</option>
-<option value="tr">Turkish</option>
-<option value="vn">Vietnamese</option>
-
-          <option value="en">--- By Code ---</option>
-<option value="ch">ch</option>
-<option value="cz">cz</option>
-<option value="da">da</option>
-<option value="de">de</option>
-<option value="ee">ee</option>
-<option value="el">el</option>
-<option value="es">es</option>
-<option value="eu">eu</option>
-<option value="fa">fa</option>
-<option value="fi">fi</option>
-<option value="fr_ca">fr_ca</option>
-<option value="fr">fr</option>
-<option value="zn_ch">zn_ch</option>
-<option value="he">he</option>
-<option value="hu">hu</option>
-<option value="it">it</option>
-<option value="ja">ja</option>
-<option value="lt">lt</option>
-<option value="lv">lv</option>
-<option value="nb">nb</option>
-<option value="nl">nl</option>
-<option value="pl">pl</option>
-<option value="pt_br">pt_br</option>
-<option value="ro">ro</option>
-<option value="ru">ru</option>
-<option value="sh">sh</option>
-<option value="si">si</option>
-<option value="sr">sr</option>
-<option value="sv">sv</option>
-<option value="th">th</option>
-<option value="tr">tr</option>
-<option value="vn">vn</option>
-          </select>
-        </label>
-        <label>
-          Skin:
-          <select name="skin" id="skin">
-          <option value="">-- no skin --</option>
-<?php
-  $d = @dir($LocalSkinPath);
-  while (false !== ($entry = $d->read()))  //not a dot file or directory
-  { if(substr($entry,0,1) != '.')
-    { echo '<option value="' . $entry . '"> ' . $entry . '</option>'."\n";
-    }
-  }
-  $d->close();
-?>
-          </select>
-        </label>
-        <label>
-          Mode:
-          <select name="DocType">
-            <option value="standards">Standards</option>
-            <option value="almost">Almost Standards</option>
-            <option value="quirks">Quirks</option>
-            
-          </select>
-        </label>
-        <label>
-          Icons:
-            <select name="icons">
-              <option value="">Default/Skin</option>
-              <option value="Classic">Classic</option>
-              <option value="Crystal">Crystal</option>
-              <option value="Tango">Tango</option>
-            </select>
-        </label>
-        <center><input type="button" value="extended Settings" onClick="fExtended();" /></center>
-
-    </fieldset>
-    <fieldset>
-      <legend>Plugins</legend>
-      <div id="div_plugins" style="width:100%; overflow:auto">
-<?php
-  $d = @dir($LocalPluginPath);
-  $dir_array = array();
-  while (false !== ($entry = $d->read()))  //not a dot file or directory
-  { if(substr($entry,0,1) != '.')
-    { $dir_array[] = $entry;
-    }
-  }
-  $d->close();
-  sort($dir_array);
-  foreach ($dir_array as $entry)
-  { echo '<label><input type="checkbox" name="plugins" id="plugins" value="' . $entry . '"> ' . $entry . '</label>'."\n";
-  }
-
-?>
-      </div>
-    </fieldset>
-    <center><button type="submit">reload editor</button></center>
-
-        <textarea id="myTextarea0" style="display:none">
-          <p>Lorem ipsum dolor sit amet, consectetuer adipiscing elit.
-          Aliquam et tellus vitae justo varius placerat. Suspendisse iaculis
-          velit semper dolor. Donec gravida tincidunt mi. Curabitur tristique
-          ante elementum turpis. Aliquam nisl. Nulla posuere neque non
-          tellus. Morbi vel nibh. Cum sociis natoque penatibus et magnis dis
-          parturient montes, nascetur ridiculus mus. Nam nec wisi. In wisi.
-          Curabitur pharetra bibendum lectus. </p>
-<ul>
-  <li><a href="http://test.com/john%27s">test</a></li>
-  <li><a href="/absolute/test.html">test</a></li>
-  <li><a href="/test.html">test</a></li>
-  <li><a href="test.html">test</a></li>
-  <li><a href="../test.html">test</a></li>
-  <li></li>
-  <li><a href="/absolute/test.html">test</a></li>
-  <li><a href="/absolute/./test.html">test</a></li>
-  <li><a href="/absolute/./../test.html">test</a></li>
-  <li><a href="/absolute/.///./../test.html">test</a></li>
-  <li></li>
-  <li><a href="relative/test.html">test</a></li>
-  <li><a href="relative/./test.html">test</a></li>
-  <li><a href="relative/./../test.html">test</a></li>
-  <li><a href="relative/.///./../test.html">test</a></li>
-  <li></li>
-  <li><a href="../test.html">test</a></li>
-  <li><a href=".././test.html">test</a></li>
-  <li><a href=".././../test.html">test</a></li>
-  <li><a href=".././//./../test.html">test</a></li>
-  <li></li>
-  <li><a href="./relative/test.html">test</a></li>
-  <li><a href="./relative/./test.html">test</a></li>
-  <li><a href="./relative/./../test.html">test</a></li>
-  <li><a href="./relative/.///./../test.html">test</a></li>
-  <li></li>
-  <li><a href="./relative/test.html?.///./../../../abc/def">test</a></li>
-  <li><a href="./relative/./test.html#123/45/../../..///./ddd">test</a></li>
-  <li><a href="./relative/./../test.html?.///./../../../abc/def">test</a></li>
-  <li><a href="./relative/.///./../test.html#123/45/../../..///./ddd">test</a></li>
-  <li></li>
-  <li><a href="../../../../../../../../../../.././relative/test.html?.///./../../../abc/def">test</a></li>
-  <li><a href="../../.././relative/./test.html#123/45/../../..///./ddd">test</a></li>
-  <li><a href="../../../.././relative/./../test.html?.///./../../../abc/def">test</a></li>
-  <li><a href="../../../.././relative/.///./../test.html#123/45/../../..///./ddd">test</a></li>
-  
-</ul>
-          <ul>
-            <li> Phasellus et massa sed diam viverra semper.  </li>
-            <li> Mauris tincidunt felis in odio.              </li>
-            <li> Nulla placerat nunc ut pede.                 </li>
-            <li> Vivamus ultrices mi sit amet urna.           </li>
-            <li> Quisque sed augue quis nunc laoreet volutpat.</li>
-            <li> Nunc sit amet metus in tortor semper mattis. </li>
-          </ul>
-        </textarea>
-
-  </form>
-  <script type="text/javascript">
-    top.frames["body"].location.href = document.location.href.replace(/ext_example-menu\.php.*/, 'ext_example-body.php')
-    var _oldSubmitHandler = null;
-    if (document.forms[0].onsubmit != null) {
-      _oldSubmitHandler = document.forms[0].onsubmit;
-    }
-    function frame_onSubmit(){
-      var thenewdate = new Date ();
-      thenewdate.setTime(thenewdate.getTime() + (5*24*60*60*1000));
-      var co_value = 'skin=' + document.getElementById('skin').options[document.getElementById('skin').selectedIndex].value + '###' +
-                     'lang=' + document.getElementById('lang').options[document.getElementById('lang').selectedIndex].value + '###' +
-                     'num=' + document.getElementById('num').value + '###';
-      var s_value='';
-      for(var x = 0; x < document.forms[0].plugins.length; x++) {
-        if(document.forms[0].plugins[x].checked)
-          s_value += document.forms[0].plugins[x].value + '/';
-      }
-      if(s_value!='') {
-        co_value += 'plugins=' + s_value + '###'
-      }
-      setCookie('co_ext_Xinha', co_value, thenewdate);
-      if (_oldSubmitHandler != null) {
-        _oldSubmitHandler();
-      }
-    }
-    document.forms[0].onsubmit = frame_onSubmit;
-  </script>
-
-</body>
-</html>
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/examples/files/full_example.css b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/examples/files/full_example.css
deleted file mode 100644
index 2bd258e..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/examples/files/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-1.5.1/examples/files/stylist.css b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/examples/files/stylist.css
deleted file mode 100644
index 19fb621..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/examples/files/stylist.css
+++ /dev/null
@@ -1,33 +0,0 @@
-  /*--------------------------------------:noTabs=true:tabSize=2:indentSize=2:--
-    --  Stylist plugin example CSS file.  Used by full_example.js
-    --  when the Stylist plugin is included in an auto-generated example.
-    --
-    --  $HeadURL:http://svn.xinha.webfactional.com/trunk/examples/files/stylist.css $
-    --  $LastChangedDate:2008-02-04 01:43:21 +0100 (Mo, 04 Feb 2008) $
-    --  $LastChangedRevision:962 $
-    --  $LastChangedBy:ray $
-    --------------------------------------------------------------------------*/
-
-.bluetext
-{
-  color:blue;
-}
-
-p.blue_paragraph
-{
-  color:darkblue;
-}
-
-li.green_list_item
-{
-  color:green;
-}
-
-h1.webdings_lvl_1
-{
-  font-family:webdings;
-}
-
-img.polaroid { border:1px solid black; background-color:white; padding:10px; padding-bottom:30px; }
-
-li.light_blue_list_item { color:#97b0f4; }
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/examples/index.html b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/examples/index.html
deleted file mode 100644
index e76dd4d..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/examples/index.html
+++ /dev/null
@@ -1,27 +0,0 @@
-<html>
-  <body>
-    <h1>Xinha Examples</h1>
-    <p>These are the current examples for using Xinha, these demonstrate "the way" to use Xinha.</p>
-    <ul>
-      <li><a href="OneLine.html">One Line To Xinha (Zero Configuration)</a></li>
-      <li><a href="Newbie.html">Xinha Complete Example (Best For Newbies)</a></li> 
-      <li><a href="UsingPhpPlugins.php">Image Uploading and Link Browsing Demo (Requires PHP)</a></li>      
-      <li><a href="CustomPlugins.html">Custom Plugins Example</a></li>      
-    </ul>
-    
-    <h2>Experimenting and Testing</h2>
-    <p>These examples are mostly for testing out the plugins and used during development of Xinha, they don't necessarily follow "the way" to use Xinha in your own code.</p>
-    
-    <ul>
-      <li><a href="ExtendedDemo.html">Extended Demo (Requires PHP)</a></li>            
-      <li><a href="testbed.php">General Testbed</a></li>
-    </ul>
-    
-    <h2>Old Style Examples</h2>
-    <p>These examples follow some older initialisation styles for Xinha, they still work fine and you can do it this way if you like (or have existing code that does), but it's probably easier to use the first three examples above to base your work on.</p>
-    <ul>
-      <li><a href="Old_Newbie_Guide/simple_example.html">Simple Demo</a> (Lower Level Initialisation Example)</li>
-      <li><a href="Old_Newbie_Guide/Newbie.html">Old Newbie Guide Example</a> (Better to see Easy Example above)</li>
-    </ul>
-  </body>
-</html>
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/examples/render-mode-developer-help.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/examples/render-mode-developer-help.js
deleted file mode 100644
index 1f63220..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/examples/render-mode-developer-help.js
+++ /dev/null
@@ -1,87 +0,0 @@
-/** Load this javascript at the bottom of the page to output some information about what 
- *   rendering mode is being used by the browser (based on doctype detection).
- */
-
-window.setTimeout(function(){
-  if(typeof document.doctype == 'undefined' || document.doctype == null) return;
-  var doctypeHelp = '\
-  <fieldset style="margin-top:20px;">\
-    <legend style="font-weight:bold;">Browser Rendering Mode</legend>\
-    <p>Assuming that your browser is fairly modern, this page is being rendered in </p>\
-    <blockquote>\
-      <p>';
-  
-        doctypeHelp += '' + document.compatMode + ' - ';
-        if(document.compatMode == 'BackCompat')
-        {
-          doctypeHelp += ('Quirks Mode');
-        }
-        else
-        {
-          function get_doctype()
-          {
-              var doctype = 
-              '<!DOCTYPE ' + 
-              document.doctype.name +
-              (document.doctype.publicId?' PUBLIC "' +  document.doctype.publicId + '"':'') +
-              (document.doctype.systemId?' "' + document.doctype.systemId + '"':'') + '>';
-              return doctype;
-          }
-          
-          var doctypeString = get_doctype();              
-          
-          
-          switch(doctypeString)
-          {
-            case '<!DOCTYPE html>':
-            case '<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">':
-            case '<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN">':
-            case '<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/html4/strict.dtd">':
-            case '<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">':
-            case '<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML Basic 1.0//EN" "http://www.w3.org/TR/xhtml-basic/xhtml-basic10.dtd">':
-            case '<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">':
-            case '<!DOCTYPE HTML PUBLIC "ISO/IEC 15445:2000//DTD HTML//EN">':
-            case '<!DOCTYPE HTML PUBLIC "ISO/IEC 15445:2000//DTD HyperText Markup Language//EN">':
-            case '<!DOCTYPE HTML PUBLIC "ISO/IEC 15445:1999//DTD HTML//EN">':
-            case '<!DOCTYPE HTML PUBLIC "ISO/IEC 15445:1999//DTD HyperText Markup Language//EN">':
-              doctypeHelp += ('Standards Mode<br/>'+Xinha.htmlEncode(doctypeString));              
-              break;
-              
-            case '<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">':
-            case '<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">':
-            case '<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/1999/REC-html401-19991224/loose.dtd">':
-            case '<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">':
-              doctypeHelp += ('Almost Standards Mode<br/>'+Xinha.htmlEncode(doctypeString));
-              break;
-            
-            default:
-              doctypeHelp += ('Either Standards Mode, or Almost Standards Mode<br/>'+Xinha.htmlEncode(doctypeString));
-              break;
-          }
-        }
-        doctypeHelp += ('\
-      </p>\
-    </blockquote>\
-    <p>\
-      To change the mode alter the doctype on this file, '+this.document.location.pathname+', to one of\
-    </p>\
-    <dl>\
-      <dt style="font-weight:bold;">Standards</dt>\
-        <dd style="margin-bottom:10px;">&lt;!DOCTYPE html&gt;</dd>\
-        \
-      <dt style="font-weight:bold;">Almost Standards</dt>\
-        <dd style="margin-bottom:10px;">&lt;!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd"&gt;</dd>\
-        \
-      <dt style="font-weight:bold;">Quirks</dt>\
-        <dd style="margin-bottom:10px;">(No Doctype at all)</dd>\
-    </dl>\
-    <p style="border:2px solid red;text-align:center;margin:10px;padding:10px;">This information is provided by render-mode-developer-help.js, remove that script from your page to remove this help text.</p>\
-  </fieldset>');
-  document.getElementById('doctypeHelpText').innerHTML = doctypeHelp;
-}, 500);
-
-// Because adding the above to the document after it's loaded will quite possibly
-// introduce a vertical scrollbar, of which Xinha won't be aware, we would have 
-// to issue a sizeEditors
-document.write('<div id="doctypeHelpText" style="height:2000px"></div>');
-        
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/examples/require-password.php b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/examples/require-password.php
deleted file mode 100644
index e1c4f16..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/examples/require-password.php
+++ /dev/null
@@ -1,271 +0,0 @@
-<?php 
-  
-  /** This file can be included as the first line of a PHP demo to require that the user provides a password
-   *   in order to access that particular demo.  The user will be instructed on how to create the required
-   *   "password.php" file, which contains a simple md5 hashed version of their password. 
-   *
-   *  DO NOT CHECK IN YOUR password.php!
-   *
-   *  @author James Sleeman, with the Javascript MD5 from webtoolkit.info
-   */
-  
-  if(!file_exists(dirname(__FILE__) . '/password.php'))
-  {
-    ?>
-    <script type="text/javascript">
-     /**
-      *
-      *  MD5 (Message-Digest Algorithm)
-      *  http://www.webtoolkit.info/
-      *
-      **/
-      
-      var MD5 = function (string) {
-      
-        function RotateLeft(lValue, iShiftBits) {
-          return (lValue<<iShiftBits) | (lValue>>>(32-iShiftBits));
-        }
-      
-        function AddUnsigned(lX,lY) {
-          var lX4,lY4,lX8,lY8,lResult;
-          lX8 = (lX & 0x80000000);
-          lY8 = (lY & 0x80000000);
-          lX4 = (lX & 0x40000000);
-          lY4 = (lY & 0x40000000);
-          lResult = (lX & 0x3FFFFFFF)+(lY & 0x3FFFFFFF);
-          if (lX4 & lY4) {
-            return (lResult ^ 0x80000000 ^ lX8 ^ lY8);
-          }
-          if (lX4 | lY4) {
-            if (lResult & 0x40000000) {
-              return (lResult ^ 0xC0000000 ^ lX8 ^ lY8);
-            } else {
-              return (lResult ^ 0x40000000 ^ lX8 ^ lY8);
-            }
-          } else {
-            return (lResult ^ lX8 ^ lY8);
-          }
-        }
-      
-        function F(x,y,z) { return (x & y) | ((~x) & z); }
-        function G(x,y,z) { return (x & z) | (y & (~z)); }
-        function H(x,y,z) { return (x ^ y ^ z); }
-        function I(x,y,z) { return (y ^ (x | (~z))); }
-      
-        function FF(a,b,c,d,x,s,ac) {
-          a = AddUnsigned(a, AddUnsigned(AddUnsigned(F(b, c, d), x), ac));
-          return AddUnsigned(RotateLeft(a, s), b);
-        };
-      
-        function GG(a,b,c,d,x,s,ac) {
-          a = AddUnsigned(a, AddUnsigned(AddUnsigned(G(b, c, d), x), ac));
-          return AddUnsigned(RotateLeft(a, s), b);
-        };
-      
-        function HH(a,b,c,d,x,s,ac) {
-          a = AddUnsigned(a, AddUnsigned(AddUnsigned(H(b, c, d), x), ac));
-          return AddUnsigned(RotateLeft(a, s), b);
-        };
-      
-        function II(a,b,c,d,x,s,ac) {
-          a = AddUnsigned(a, AddUnsigned(AddUnsigned(I(b, c, d), x), ac));
-          return AddUnsigned(RotateLeft(a, s), b);
-        };
-      
-        function ConvertToWordArray(string) {
-          var lWordCount;
-          var lMessageLength = string.length;
-          var lNumberOfWords_temp1=lMessageLength + 8;
-          var lNumberOfWords_temp2=(lNumberOfWords_temp1-(lNumberOfWords_temp1 % 64))/64;
-          var lNumberOfWords = (lNumberOfWords_temp2+1)*16;
-          var lWordArray=Array(lNumberOfWords-1);
-          var lBytePosition = 0;
-          var lByteCount = 0;
-          while ( lByteCount < lMessageLength ) {
-            lWordCount = (lByteCount-(lByteCount % 4))/4;
-            lBytePosition = (lByteCount % 4)*8;
-            lWordArray[lWordCount] = (lWordArray[lWordCount] | (string.charCodeAt(lByteCount)<<lBytePosition));
-            lByteCount++;
-          }
-          lWordCount = (lByteCount-(lByteCount % 4))/4;
-          lBytePosition = (lByteCount % 4)*8;
-          lWordArray[lWordCount] = lWordArray[lWordCount] | (0x80<<lBytePosition);
-          lWordArray[lNumberOfWords-2] = lMessageLength<<3;
-          lWordArray[lNumberOfWords-1] = lMessageLength>>>29;
-          return lWordArray;
-        };
-      
-        function WordToHex(lValue) {
-          var WordToHexValue="",WordToHexValue_temp="",lByte,lCount;
-          for (lCount = 0;lCount<=3;lCount++) {
-            lByte = (lValue>>>(lCount*8)) & 255;
-            WordToHexValue_temp = "0" + lByte.toString(16);
-            WordToHexValue = WordToHexValue + WordToHexValue_temp.substr(WordToHexValue_temp.length-2,2);
-          }
-          return WordToHexValue;
-        };
-      
-        function Utf8Encode(string) {
-          string = string.replace(/\r\n/g,"\n");
-          var utftext = "";
-      
-          for (var n = 0; n < string.length; n++) {
-      
-            var c = string.charCodeAt(n);
-      
-            if (c < 128) {
-              utftext += String.fromCharCode(c);
-            }
-            else if((c > 127) && (c < 2048)) {
-              utftext += String.fromCharCode((c >> 6) | 192);
-              utftext += String.fromCharCode((c & 63) | 128);
-            }
-            else {
-              utftext += String.fromCharCode((c >> 12) | 224);
-              utftext += String.fromCharCode(((c >> 6) & 63) | 128);
-              utftext += String.fromCharCode((c & 63) | 128);
-            }
-      
-          }
-      
-          return utftext;
-        };
-      
-        var x=Array();
-        var k,AA,BB,CC,DD,a,b,c,d;
-        var S11=7, S12=12, S13=17, S14=22;
-        var S21=5, S22=9 , S23=14, S24=20;
-        var S31=4, S32=11, S33=16, S34=23;
-        var S41=6, S42=10, S43=15, S44=21;
-      
-        string = Utf8Encode(string);
-      
-        x = ConvertToWordArray(string);
-      
-        a = 0x67452301; b = 0xEFCDAB89; c = 0x98BADCFE; d = 0x10325476;
-      
-        for (k=0;k<x.length;k+=16) {
-          AA=a; BB=b; CC=c; DD=d;
-          a=FF(a,b,c,d,x[k+0], S11,0xD76AA478);
-          d=FF(d,a,b,c,x[k+1], S12,0xE8C7B756);
-          c=FF(c,d,a,b,x[k+2], S13,0x242070DB);
-          b=FF(b,c,d,a,x[k+3], S14,0xC1BDCEEE);
-          a=FF(a,b,c,d,x[k+4], S11,0xF57C0FAF);
-          d=FF(d,a,b,c,x[k+5], S12,0x4787C62A);
-          c=FF(c,d,a,b,x[k+6], S13,0xA8304613);
-          b=FF(b,c,d,a,x[k+7], S14,0xFD469501);
-          a=FF(a,b,c,d,x[k+8], S11,0x698098D8);
-          d=FF(d,a,b,c,x[k+9], S12,0x8B44F7AF);
-          c=FF(c,d,a,b,x[k+10],S13,0xFFFF5BB1);
-          b=FF(b,c,d,a,x[k+11],S14,0x895CD7BE);
-          a=FF(a,b,c,d,x[k+12],S11,0x6B901122);
-          d=FF(d,a,b,c,x[k+13],S12,0xFD987193);
-          c=FF(c,d,a,b,x[k+14],S13,0xA679438E);
-          b=FF(b,c,d,a,x[k+15],S14,0x49B40821);
-          a=GG(a,b,c,d,x[k+1], S21,0xF61E2562);
-          d=GG(d,a,b,c,x[k+6], S22,0xC040B340);
-          c=GG(c,d,a,b,x[k+11],S23,0x265E5A51);
-          b=GG(b,c,d,a,x[k+0], S24,0xE9B6C7AA);
-          a=GG(a,b,c,d,x[k+5], S21,0xD62F105D);
-          d=GG(d,a,b,c,x[k+10],S22,0x2441453);
-          c=GG(c,d,a,b,x[k+15],S23,0xD8A1E681);
-          b=GG(b,c,d,a,x[k+4], S24,0xE7D3FBC8);
-          a=GG(a,b,c,d,x[k+9], S21,0x21E1CDE6);
-          d=GG(d,a,b,c,x[k+14],S22,0xC33707D6);
-          c=GG(c,d,a,b,x[k+3], S23,0xF4D50D87);
-          b=GG(b,c,d,a,x[k+8], S24,0x455A14ED);
-          a=GG(a,b,c,d,x[k+13],S21,0xA9E3E905);
-          d=GG(d,a,b,c,x[k+2], S22,0xFCEFA3F8);
-          c=GG(c,d,a,b,x[k+7], S23,0x676F02D9);
-          b=GG(b,c,d,a,x[k+12],S24,0x8D2A4C8A);
-          a=HH(a,b,c,d,x[k+5], S31,0xFFFA3942);
-          d=HH(d,a,b,c,x[k+8], S32,0x8771F681);
-          c=HH(c,d,a,b,x[k+11],S33,0x6D9D6122);
-          b=HH(b,c,d,a,x[k+14],S34,0xFDE5380C);
-          a=HH(a,b,c,d,x[k+1], S31,0xA4BEEA44);
-          d=HH(d,a,b,c,x[k+4], S32,0x4BDECFA9);
-          c=HH(c,d,a,b,x[k+7], S33,0xF6BB4B60);
-          b=HH(b,c,d,a,x[k+10],S34,0xBEBFBC70);
-          a=HH(a,b,c,d,x[k+13],S31,0x289B7EC6);
-          d=HH(d,a,b,c,x[k+0], S32,0xEAA127FA);
-          c=HH(c,d,a,b,x[k+3], S33,0xD4EF3085);
-          b=HH(b,c,d,a,x[k+6], S34,0x4881D05);
-          a=HH(a,b,c,d,x[k+9], S31,0xD9D4D039);
-          d=HH(d,a,b,c,x[k+12],S32,0xE6DB99E5);
-          c=HH(c,d,a,b,x[k+15],S33,0x1FA27CF8);
-          b=HH(b,c,d,a,x[k+2], S34,0xC4AC5665);
-          a=II(a,b,c,d,x[k+0], S41,0xF4292244);
-          d=II(d,a,b,c,x[k+7], S42,0x432AFF97);
-          c=II(c,d,a,b,x[k+14],S43,0xAB9423A7);
-          b=II(b,c,d,a,x[k+5], S44,0xFC93A039);
-          a=II(a,b,c,d,x[k+12],S41,0x655B59C3);
-          d=II(d,a,b,c,x[k+3], S42,0x8F0CCC92);
-          c=II(c,d,a,b,x[k+10],S43,0xFFEFF47D);
-          b=II(b,c,d,a,x[k+1], S44,0x85845DD1);
-          a=II(a,b,c,d,x[k+8], S41,0x6FA87E4F);
-          d=II(d,a,b,c,x[k+15],S42,0xFE2CE6E0);
-          c=II(c,d,a,b,x[k+6], S43,0xA3014314);
-          b=II(b,c,d,a,x[k+13],S44,0x4E0811A1);
-          a=II(a,b,c,d,x[k+4], S41,0xF7537E82);
-          d=II(d,a,b,c,x[k+11],S42,0xBD3AF235);
-          c=II(c,d,a,b,x[k+2], S43,0x2AD7D2BB);
-          b=II(b,c,d,a,x[k+9], S44,0xEB86D391);
-          a=AddUnsigned(a,AA);
-          b=AddUnsigned(b,BB);
-          c=AddUnsigned(c,CC);
-          d=AddUnsigned(d,DD);
-        }
-      
-        var temp = WordToHex(a)+WordToHex(b)+WordToHex(c)+WordToHex(d);
-      
-        return temp.toLowerCase();
-      }
-    </script>
-    
-    <h1>Demo Disabled</h1>
-    <p>For security, to enable the demo you need to set a password, a simple 2 step process...</p>
-    <p>First, enter your choice of password: <input type="password" name="password" onkeyup="document.getElementById('code').value = '&lt;'+'?php return \'' + MD5(this.value) + '\'; ?'+'&gt;';" /> </p>
-    
-    <p> And now, create a file as below: </p>
-    <p style="margin-bottom:2px;"><strong>Save As: <?php echo dirname( __FILE__ ) . '/password.php' ?></strong></p>
-    <input type="text" id="code" style="width:100%; border:1px solid black; padding:3px; background-color:#EFEFEF;" />    
-    
-    <p> Once you have created/uploaded the file, reload the page and you should be prompted for the password.</p>
-    <?php
-    exit;
-  }
-  else
-  {
-    session_start();
-    if(!isset($_SESSION[__FILE__ .':Authed']))
-    {
-      if(isset($_REQUEST['password']))
-      {
-        if(md5($_REQUEST['password']) === include(dirname(__FILE__).'/password.php'))
-        {
-          $_SESSION[__FILE__.':Authed'] = TRUE;          
-        }
-        else
-        {
-          die("Password Not Correct");
-        }
-      }
-      else
-      {
-        ?>
-        <h1>Password Required</h1>
-        <p>Accessing this demo requires you specify your Xinha Demo Password.</p>
-        <p>If you have forgotten your password, then you can delete the file <?php echo dirname(__FILE__) . '/password.php' ?> and refresh this page.</p>
-        <form method="post">
-        <p>
-          <strong>Password:</strong>
-          <input type="password" name="password" />
-          <input type="submit" />
-        </p>  
-        </form>
-        <?php
-        exit;
-      }      
-    }
-  }
-?>
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/examples/testbed.php b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/examples/testbed.php
deleted file mode 100644
index bbd44a4..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/examples/testbed.php
+++ /dev/null
@@ -1,159 +0,0 @@
-<?php require_once('require-password.php'); ?>
-<?php 
-  switch(@$_REQUEST['DocType'])
-  {
-    
-    case 'quirks':
-      break;
-      
-   case 'almost':
-      echo '<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">';
-      break;
-    
-    case 'standards':
-    default:
-      echo '<!DOCTYPE html>';
-      break;
-      
-  }
-?>
-<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
-<head>
-
-  <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
-  <title>Example of Xinha</title>
-  <link rel="stylesheet" href="files/full_example.css" />
-
-  <script src="../XinhaEasy.js" type="text/javascript">
-    
-    // The following options are, optional...
-    xinha_options = 
-    {
-      // Specify language and skin
-      _editor_lang:   'en',         // Language to use
-      _editor_skin:   'silva',      // Name of the skin to use (see skins directory for available skins)
-      
-      // Simply a CSS selector to pick the textarea(s) you want, eg 'textarea' converts all textarea,
-      // or textarea.my-xinha,textarea.your-xinha would convert only those textareas with the
-      // my-xinha or your-xinha classes on them
-      xinha_editors:  'textarea',   
-
-      // Plugins can be one of the simple pre-defined sets, common, minimal and loaded
-      //   xinha_plugins: 'minimal'
-      //
-      // or you can specify the plugins you want exactly
-      //   xinha_plugins: [ 'Linker', 'Stylist' ]
-      //
-      // or you can do both to add extras to the set
-      //   xinha_pass_to_php_backend: ['minimal', 'Linker' ]
-      xinha_plugins:  [ 'common', 'MootoolsFileManager', 'Linker' ],
-      
-      // Toolbar can be one of the pre-defined toolbars, 'default', 'minimal', 'minimal+fonts'
-      //   xinha_toolbar: 'minimal+fonts'
-      //
-      // or you an specify a toolbar structure completely
-      //   xinha_toolbar: [ ["popupeditor"],["separator","bold","italic","underline","strikethrough","superscript"] ]
-    //  xinha_toolbar:  'minimal+fonts',
-      
-      // This is where you set the default configuration which apply globally
-      xinha_config:            function(xinha_config) 
-      {
-        xinha_config.CharacterMap.mode = 'panel';
-        xinha_config.ContextMenu.customHooks = { 'a': [ ['Label', function() { alert('Action'); }, 'Tooltip', '/xinha/images/ed_copy.gif' ] ] }
-       
-        /*
-          // We can load an external stylesheet like this - NOTE : YOU MUST GIVE AN ABSOLUTE URL
-          //  otherwise it won't work!
-          xinha_config.stylistLoadStylesheet(document.location.href.replace(/[^\/]*\.html/, 'files/stylist.css'));
-
-          // Or we can load styles directly
-          xinha_config.stylistLoadStyles('p.red_text { color:red }');
-
-          // If you want to provide "friendly" names you can do so like
-          // (you can do this for stylistLoadStylesheet as well)
-          xinha_config.stylistLoadStyles('p.pink_text { color:pink }', {'p.pink_text' : 'Pretty Pink'});
-       */
-
-        // Configure the File Manager
-        with (xinha_config.MootoolsFileManager)
-        { 
-          <?php 
-            require_once('../contrib/php-xinha.php');
-            xinha_pass_to_php_backend
-            (       
-              array
-              (
-                'images_dir' => getcwd() . '/images',
-                'images_url' => preg_replace('/\/examples.*/', '', $_SERVER['REQUEST_URI']) . '/examples/images',
-                'images_allow_upload' => true,
-                'images_allow_delete' => true,
-                'images_allow_download' => true,
-                'images_use_hspace_vspace' => false,
-                
-                'files_dir' => getcwd() . '/images',
-                'files_url' => preg_replace('/\/examples.*/', '', $_SERVER['REQUEST_URI']) . '/examples/images',
-                'files_allow_upload' => true,
-                'max_files_upload_size' => '4M',
-              )
-            )
-          ?>
-        }
-      
-        // Configure the Linker
-        with (xinha_config.Linker)
-        { 
-          <?php 
-            require_once('../contrib/php-xinha.php');
-            xinha_pass_to_php_backend
-            (       
-              array
-              (
-                'dir' => getcwd(),
-                'url' => '/examples',                
-              )
-            )
-          ?>
-        }
-        
-      }
-    }
-
-  </script>
-  
-</head>
-
-<body>
-  
-  <form action="javascript:void(0);" id="editors_here" onsubmit="alert(this.myTextArea.value);">
-     <div>
-    <textarea id="myTextArea" name="myTextArea" style="width:100%;height:320px;">
-&lt;p&gt;Lorem ipsum dolor sit amet, consectetuer adipiscing elit.
-Aliquam et tellus vitae justo varius placerat. Suspendisse iaculis
-velit semper dolor. Donec gravida tincidunt mi. Curabitur tristique
-ante elementum turpis. Aliquam nisl. Nulla posuere neque non
-tellus. Morbi vel nibh. Cum sociis natoque penatibus et magnis dis
-parturient montes, nascetur ridiculus mus. Nam nec wisi. In wisi.
-Curabitur pharetra bibendum lectus.&lt;/p&gt;
-<a href="../../foo.html">../../foo.html</a><br/>
-<a href="./foo.html">./foo.html</a><br/>
-<a href="foo/bar/../foo.html">foo/bar/../foo.html</a><br/>
-<a href="/foo/bar/../foo.html">/foo/bar/../foo.html</a><br/>
-<a href="/foo//bar/foo.html">/foo//bar/foo.html</a><br/>
-<a href="../../../../../foo.html">../../../../../foo.html</a><br/>
-<a href="http://foo/foo.html">http://foo/foo.html</a><br/>
-
-</textarea>
-    <input type="submit" /> <input type="reset" />
-    </div>
-  </form>
-
-  <ul>
-    <li><a href="<?php echo basename(__FILE__) ?>?DocType=standards">Test Standards Mode</a></li>
-    <li><a href="<?php echo basename(__FILE__) ?>?DocType=almost">Test Almost Standards Mode</a></li>
-    <li><a href="<?php echo basename(__FILE__) ?>?DocType=quirks">Test Quirks Mode</a></li>
-  </ul>
-  
-  <!-- This script is used to show the rendering mode (Quirks, Standards, Almost Standards) --> 
-  <script type="text/javascript" src="render-mode-developer-help.js"></script>
-</body>
-</html>
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/htmlarea.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/htmlarea.js
deleted file mode 100644
index f1f7de8..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/htmlarea.js
+++ /dev/null
@@ -1,23 +0,0 @@
- 
-  /*--------------------------------------:noTabs=true:tabSize=2:indentSize=2:--
-    --  COMPATABILITY FILE
-    --  htmlarea.js is now XinhaCore.js  
-    --
-    --  $HeadURL:http://svn.xinha.webfactional.com/trunk/htmlarea.js $
-    --  $LastChangedDate:2007-01-15 15:28:57 +0100 (Mo, 15 Jan 2007) $
-    --  $LastChangedRevision:659 $
-    --  $LastChangedBy:gogo $
-    --------------------------------------------------------------------------*/
-    
-if ( typeof _editor_url == "string" )
-{
-  // Leave exactly one backslash at the end of _editor_url
-  _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>');
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/iconsets/Classic/de/bold.gif b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/iconsets/Classic/de/bold.gif
deleted file mode 100644
index 21d286f..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/iconsets/Classic/de/bold.gif
+++ /dev/null
Binary files differ
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/iconsets/Classic/de/italic.gif b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/iconsets/Classic/de/italic.gif
deleted file mode 100644
index 0bf7947..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/iconsets/Classic/de/italic.gif
+++ /dev/null
Binary files differ
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/iconsets/Classic/de/underline.gif b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/iconsets/Classic/de/underline.gif
deleted file mode 100644
index 0545489..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/iconsets/Classic/de/underline.gif
+++ /dev/null
Binary files differ
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/iconsets/Classic/ed_buttons_main.gif b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/iconsets/Classic/ed_buttons_main.gif
deleted file mode 100644
index bc1962b..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/iconsets/Classic/ed_buttons_main.gif
+++ /dev/null
Binary files differ
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/iconsets/Classic/ed_charmap.gif b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/iconsets/Classic/ed_charmap.gif
deleted file mode 100644
index 289aa7c..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/iconsets/Classic/ed_charmap.gif
+++ /dev/null
Binary files differ
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/iconsets/Classic/ed_selectall.gif b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/iconsets/Classic/ed_selectall.gif
deleted file mode 100644
index 9acf0a0..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/iconsets/Classic/ed_selectall.gif
+++ /dev/null
Binary files differ
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/iconsets/Classic/fr/bold.gif b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/iconsets/Classic/fr/bold.gif
deleted file mode 100644
index 8a0f657..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/iconsets/Classic/fr/bold.gif
+++ /dev/null
Binary files differ
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/iconsets/Classic/fr/strikethrough.gif b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/iconsets/Classic/fr/strikethrough.gif
deleted file mode 100644
index 5707aef..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/iconsets/Classic/fr/strikethrough.gif
+++ /dev/null
Binary files differ
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/iconsets/Classic/fr/underline.gif b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/iconsets/Classic/fr/underline.gif
deleted file mode 100644
index 4ecaf22..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/iconsets/Classic/fr/underline.gif
+++ /dev/null
Binary files differ
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/iconsets/Classic/iconset.xml b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/iconsets/Classic/iconset.xml
deleted file mode 100644
index 10b9b8c..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/iconsets/Classic/iconset.xml
+++ /dev/null
@@ -1,263 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<iconset>
-<!--TODO: Add metas -->
-  <icons>
-    <icon id="bold">
-      <default type="map">
-        <path>iconsets/Classic/ed_buttons_main.gif</path>
-        <x>3</x>
-        <y>2</y>
-      </default>
-      <de type="string">
-        <path>iconsets/Classic/de/bold.gif</path>
-      </de>
-      <fr type="string">
-        <path>iconsets/Classic/fr/bold.gif</path>
-      </fr>
-    </icon>
-    <icon id="italic">
-      <default type="map">
-        <path>iconsets/Classic/ed_buttons_main.gif</path>
-        <x>2</x>
-        <y>2</y>
-      </default>
-      <de type="string">
-        <path>iconsets/Classic/de/italic.gif</path>
-      </de>
-    </icon>
-    <icon id="underline">
-      <default type="map">
-        <path>iconsets/Classic/ed_buttons_main.gif</path>
-        <x>2</x>
-        <y>0</y>
-      </default>
-      <fr type="string">
-        <path>iconsets/Classic/fr/underline.gif</path>
-      </fr>
-      <de type="string">
-        <path>iconsets/Classic/de/underline.gif</path>
-      </de>
-    </icon>
-    <icon id="strikethrough">
-      <default type="map">
-        <path>iconsets/Classic/ed_buttons_main.gif</path>
-        <x>3</x>
-        <y>0</y>
-      </default>
-      <fr type="string">
-        <path>iconsets/Classic/fr/strikethrough.gif</path>
-      </fr>
-    </icon>
-    <icon id="subscript">
-      <default type="map">
-        <path>iconsets/Classic/ed_buttons_main.gif</path>
-        <x>3</x>
-        <y>1</y>
-      </default>
-    </icon>
-    <icon id="superscript">
-      <default type="map">
-        <path>iconsets/Classic/ed_buttons_main.gif</path>
-        <x>2</x>
-        <y>1</y>
-      </default>
-    </icon>
-    <icon id="undo">
-      <default type="map">
-        <path>iconsets/Classic/ed_buttons_main.gif</path>
-        <x>4</x>
-        <y>2</y>
-      </default>
-    </icon>
-    <icon id="redo">
-      <default type="map">
-        <path>iconsets/Classic/ed_buttons_main.gif</path>
-        <x>5</x>
-        <y>2</y>
-      </default>
-    </icon>
-    <icon id="cut">
-      <default type="map">
-        <path>iconsets/Classic/ed_buttons_main.gif</path>
-        <x>5</x>
-        <y>0</y>
-      </default>
-    </icon>
-    <icon id="copy">
-      <default type="map">
-        <path>iconsets/Classic/ed_buttons_main.gif</path>
-        <x>4</x>
-        <y>0</y>
-      </default>
-    </icon>
-    <icon id="paste">
-      <default type="map">
-        <path>iconsets/Classic/ed_buttons_main.gif</path>
-        <x>4</x>
-        <y>1</y>
-      </default>
-    </icon>
-    <icon id="forecolor">
-      <default type="map">
-        <path>iconsets/Classic/ed_buttons_main.gif</path>
-        <x>3</x>
-        <y>3</y>
-      </default>
-    </icon>
-    <icon id="hilitecolor">
-      <default type="map">
-        <path>iconsets/Classic/ed_buttons_main.gif</path>
-        <x>2</x>
-        <y>3</y>
-      </default>
-    </icon>
-    <icon id="indent">
-      <default type="map">
-        <path>iconsets/Classic/ed_buttons_main.gif</path>
-        <x>0</x>
-        <y>2</y>
-      </default>
-    </icon>
-    <icon id="outdent">
-      <default type="map">
-        <path>iconsets/Classic/ed_buttons_main.gif</path>
-        <x>1</x>
-        <y>2</y>
-      </default>
-    </icon>
-    <icon id="insertimage">
-      <default type="map">
-        <path>iconsets/Classic/ed_buttons_main.gif</path>
-        <x>6</x>
-        <y>3</y>
-      </default>
-    </icon>
-    <icon id="insertorderedlist">
-      <default type="map">
-        <path>iconsets/Classic/ed_buttons_main.gif</path>
-        <x>0</x>
-        <y>3</y>
-      </default>
-    </icon>
-    <icon id="insertunorderedlist">
-      <default type="map">
-        <path>iconsets/Classic/ed_buttons_main.gif</path>
-        <x>1</x>
-        <y>3</y>
-      </default>
-    </icon>
-    <icon id="justifyleft">
-      <default type="map">
-        <path>iconsets/Classic/ed_buttons_main.gif</path>
-        <x>0</x>
-        <y>0</y>
-      </default>
-    </icon>
-    <icon id="justifyfull">
-      <default type="map">
-        <path>iconsets/Classic/ed_buttons_main.gif</path>
-        <x>0</x>
-        <y>1</y>
-      </default>
-    </icon>
-    <icon id="justifycenter">
-      <default type="map">
-        <path>iconsets/Classic/ed_buttons_main.gif</path>
-        <x>1</x>
-        <y>1</y>
-      </default>
-    </icon>
-    <icon id="justifyright">
-      <default type="map">
-        <path>iconsets/Classic/ed_buttons_main.gif</path>
-        <x>1</x>
-        <y>0</y>
-      </default>
-    </icon>
-    <icon id="createlink">
-      <default type="map">
-        <path>iconsets/Classic/ed_buttons_main.gif</path>
-        <x>6</x>
-        <y>1</y>
-      </default>
-    </icon>
-    <icon id="lefttoright">
-      <default type="map">
-        <path>iconsets/Classic/ed_buttons_main.gif</path>
-        <x>0</x>
-        <y>4</y>
-      </default>
-    </icon>
-    <icon id="righttoleft">
-      <default type="map">
-        <path>iconsets/Classic/ed_buttons_main.gif</path>
-        <x>1</x>
-        <y>4</y>
-      </default>
-    </icon>
-    <icon id="print">
-      <default type="map">
-        <path>iconsets/Classic/ed_buttons_main.gif</path>
-        <x>8</x>
-        <y>1</y>
-      </default>
-    </icon>
-    <icon id="saveas">
-      <default type="map">
-        <path>iconsets/Classic/ed_buttons_main.gif</path>
-        <x>9</x>
-        <y>1</y>
-      </default>
-    </icon>
-    <icon id="removeformat">
-      <default type="map">
-        <path>iconsets/Classic/ed_buttons_main.gif</path>
-        <x>4</x>
-        <y>4</y>
-      </default>
-    </icon>
-    <icon id="about">
-      <default type="map">
-        <path>iconsets/Classic/ed_buttons_main.gif</path>
-        <x>8</x>
-        <y>2</y>
-      </default>
-    </icon>
-    <icon id="showhelp">
-      <default type="map">
-        <path>iconsets/Classic/ed_buttons_main.gif</path>
-        <x>9</x>
-        <y>2</y>
-      </default>
-    </icon>
-    <icon id="fullscreen">
-      <default type="map">
-        <path>iconsets/Classic/ed_buttons_main.gif</path>
-        <x>8</x>
-        <y>0</y>
-      </default>
-    </icon>
-    <icon id="fullscreenrestore">
-      <default type="map">
-        <path>iconsets/Classic/ed_buttons_main.gif</path>
-        <x>9</x>
-        <y>0</y>
-      </default>
-    </icon>
-    <icon id="selectall">
-      <default type="simple">
-        <path>iconsets/Classic/ed_selectall.gif</path>
-      </default>
-    </icon>
-    <icon id="insertcharacter">
-      <default type="simple">
-        <path>iconsets/Classic/ed_charmap.gif</path>
-      </default>
-    </icon>
-    <icon id="smartreplace">
-      <default type="simple">
-        <path>plugins/SmartReplace/img.gif</path>
-      </default>
-    </icon>
-  </icons>
-</iconset>
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/iconsets/Crystal/LICENSE b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/iconsets/Crystal/LICENSE
deleted file mode 100644
index ca2dca4..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/iconsets/Crystal/LICENSE
+++ /dev/null
@@ -1,121 +0,0 @@
-License
-
-The Crystal Project are released under LGPL.
-
-GNU General Public License.
-
-   0.
-
-      This License Agreement applies to any software library or other program which contains a notice placed by the copyright holder or other authorized party saying it may be distributed under the terms of this Lesser General Public License (also called "this License"). Each licensee is addressed as "you".
-
-      A "library" means a collection of software functions and/or data prepared so as to be conveniently linked with application programs (which use some of those functions and data) to form executables.
-
-      The "Library", below, refers to any such software library or work which has been distributed under these terms. A "work based on the Library" means either the Library or any derivative work under copyright law: that is to say, a work containing the Library or a portion of it, either verbatim or with modifications and/or translated straightforwardly into another language. (Hereinafter, translation is included without limitation in the term "modification".)
-
-      "Source code" for a work means the preferred form of the work for making modifications to it. For a library, complete source code means all the source code for all modules it contains, plus any associated interface definition files, plus the scripts used to control compilation and installation of the library.
-
-      Activities other than copying, distribution and modification are not covered by this License; they are outside its scope. The act of running a program using the Library is not restricted, and output from such a program is covered only if its contents constitute a work based on the Library (independent of the use of the Library in a tool for writing it). Whether that is true depends on what the Library does and what the program that uses the Library does.
-   1.
-
-      You may copy and distribute verbatim copies of the Library's complete source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice and disclaimer of warranty; keep intact all the notices that refer to this License and to the absence of any warranty; and distribute a copy of this License along with the Library.
-
-      You may charge a fee for the physical act of transferring a copy, and you may at your option offer warranty protection in exchange for a fee.
-   2.
-
-      You may modify your copy or copies of the Library or any portion of it, thus forming a work based on the Library, and copy and distribute such modifications or work under the terms of Section 1 above, provided that you also meet all of these conditions:
-         1. The modified work must itself be a software library.
-         2. You must cause the files modified to carry prominent notices stating that you changed the files and the date of any change.
-         3. You must cause the whole of the work to be licensed at no charge to all third parties under the terms of this License.
-         4. If a facility in the modified Library refers to a function or a table of data to be supplied by an application program that uses the facility, other than as an argument passed when the facility is invoked, then you must make a good faith effort to ensure that, in the event an application does not supply such function or table, the facility still operates, and performs whatever part of its purpose remains meaningful.
-
-      (For example, a function in a library to compute square roots has a purpose that is entirely well-defined independent of the application. Therefore, Subsection 2d requires that any application-supplied function or table used by this function must be optional: if the application does not supply it, the square root function must still compute square roots.)
-
-      These requirements apply to the modified work as a whole. If identifiable sections of that work are not derived from the Library, and can be reasonably considered independent and separate works in themselves, then this License, and its terms, do not apply to those sections when you distribute them as separate works. But when you distribute the same sections as part of a whole which is a work based on the Library, the distribution of the whole must be on the terms of this License, whose permissions for other licensees extend to the entire whole, and thus to each and every part regardless of who wrote it.
-
-      Thus, it is not the intent of this section to claim rights or contest your rights to work written entirely by you; rather, the intent is to exercise the right to control the distribution of derivative or collective works based on the Library.
-
-      In addition, mere aggregation of another work not based on the Library with the Library (or with a work based on the Library) on a volume of a storage or distribution medium does not bring the other work under the scope of this License.
-   3.
-
-      You may opt to apply the terms of the ordinary GNU General Public License instead of this License to a given copy of the Library. To do this, you must alter all the notices that refer to this License, so that they refer to the ordinary GNU General Public License, version 2, instead of to this License. (If a newer version than version 2 of the ordinary GNU General Public License has appeared, then you can specify that version instead if you wish.) Do not make any other change in these notices.
-
-      Once this change is made in a given copy, it is irreversible for that copy, so the ordinary GNU General Public License applies to all subsequent copies and derivative works made from that copy.
-
-      This option is useful when you wish to copy part of the code of the Library into a program that is not a library.
-   4.
-
-      You may copy and distribute the Library (or a portion or derivative of it, under Section 2) in object code or executable form under the terms of Sections 1 and 2 above provided that you accompany it with the complete corresponding machine-readable source code, which must be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange.
-
-      If distribution of object code is made by offering access to copy from a designated place, then offering equivalent access to copy the source code from the same place satisfies the requirement to distribute the source code, even though third parties are not compelled to copy the source along with the object code.
-   5.
-
-      A program that contains no derivative of any portion of the Library, but is designed to work with the Library by being compiled or linked with it, is called a "work that uses the Library". Such a work, in isolation, is not a derivative work of the Library, and therefore falls outside the scope of this License.
-      However, linking a "work that uses the Library" with the Library creates an executable that is a derivative of the Library (because it contains portions of the Library), rather than a "work that uses the library". The executable is therefore covered by this License. Section 6 states terms for distribution of such executables.
-
-      When a "work that uses the Library" uses material from a header file that is part of the Library, the object code for the work may be a derivative work of the Library even though the source code is not. Whether this is true is especially significant if the work can be linked without the Library, or if the work is itself a library. The threshold for this to be true is not precisely defined by law.
-
-      If such an object file uses only numerical parameters, data structure layouts and accessors, and small macros and small inline functions (ten lines or less in length), then the use of the object file is unrestricted, regardless of whether it is legally a derivative work. (Executables containing this object code plus portions of the Library will still fall under Section 6.)
-
-      Otherwise, if the work is a derivative of the Library, you may distribute the object code for the work under the terms of Section 6. Any executables containing that work also fall under Section 6, whether or not they are linked directly with the Library itself.
-   6.
-
-      As an exception to the Sections above, you may also combine or link a "work that uses the Library" with the Library to produce a work containing portions of the Library, and distribute that work under terms of your choice, provided that the terms permit modification of the work for the customer's own use and reverse engineering for debugging such modifications.
-
-      You must give prominent notice with each copy of the work that the Library is used in it and that the Library and its use are covered by this License. You must supply a copy of this License. If the work during execution displays copyright notices, you must include the copyright notice for the Library among them, as well as a reference directing the user to the copy of this License. Also, you must do one of these things:
-         1. Accompany the work with the complete corresponding machine-readable source code for the Library including whatever changes were used in the work (which must be distributed under Sections 1 and 2 above); and, if the work is an executable linked with the Library, with the complete machine-readable "work that uses the Library", as object code and/or source code, so that the user can modify the Library and then relink to produce a modified executable containing the modified Library. (It is understood that the user who changes the contents of definitions files in the Library will not necessarily be able to recompile the application to use the modified definitions.) .
-         2. Use a suitable shared library mechanism for linking with the Library. A suitable mechanism is one that (1) uses at run time a copy of the library already present on the user's computer system, rather than copying library functions into the executable, and (2) will operate properly with a modified version of the library, if the user installs one, as long as the modified version is interface-compatible with the version that the work was made with.
-         3. Accompany the work with a written offer, valid for at least three years, to give the same user the materials specified in Subsection 6a, above, for a charge no more than the cost of performing this distribution.
-         4. If distribution of the work is made by offering access to copy from a designated place, offer equivalent access to copy the above specified materials from the same place.
-         5. Verify that the user has already received a copy of these materials or that you have already sent this user a copy.
-
-      For an executable, the required form of the "work that uses the Library" must include any data and utility programs needed for reproducing the executable from it. However, as a special exception, the materials to be distributed need not include anything that is normally distributed (in either source or binary form) with the major components (compiler, kernel, and so on) of the operating system on which the executable runs, unless that component itself accompanies the executable.
-
-      It may happen that this requirement contradicts the license restrictions of other proprietary libraries that do not normally accompany the operating system. Such a contradiction means you cannot use both them and the Library together in an executable that you distribute.
-   7.
-
-      You may place library facilities that are a work based on the Library side-by-side in a single library together with other library facilities not covered by this License, and distribute such a combined library, provided that the separate distribution of the work based on the Library and of the other library facilities is otherwise permitted, and provided that you do these two things:
-         1.
-
-            Accompany the combined library with a copy of the same work based on the Library, uncombined with any other library facilities. This must be distributed under the terms of the Sections above.
-         2.
-
-            Give prominent notice with the combined library of the fact that part of it is a work based on the Library, and explaining where to find the accompanying uncombined form of the same work.
-   8.
-
-      You may not copy, modify, sublicense, link with, or distribute the Library except as expressly provided under this License. Any attempt otherwise to copy, modify, sublicense, link with, or distribute the Library is void, and will automatically terminate your rights under this License. However, parties who have received copies, or rights, from you under this License will not have their licenses terminated so long as such parties remain in full compliance.
-   9.
-
-      You are not required to accept this License, since you have not signed it. However, nothing else grants you permission to modify or distribute the Library or its derivative works. These actions are prohibited by law if you do not accept this License. Therefore, by modifying or distributing the Library (or any work based on the Library), you indicate your acceptance of this License to do so, and all its terms and conditions for copying, distributing or modifying the Library or works based on it.
-  10.
-
-      Each time you redistribute the Library (or any work based on the Library), the recipient automatically receives a license from the original licensor to copy, distribute, link with or modify the Library subject to these terms and conditions. You may not impose any further restrictions on the recipients' exercise of the rights granted herein. You are not responsible for enforcing compliance by third parties with this License.
-  11.
-
-      If, as a consequence of a court judgment or allegation of patent infringement or for any other reason (not limited to patent issues), conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot distribute so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not distribute the Library at all. For example, if a patent license would not permit royalty-free redistribution of the Library by all those who receive copies directly or indirectly through you, then the only way you could satisfy both it and this License would be to refrain entirely from distribution of the Library.
-
-      If any portion of this section is held invalid or unenforceable under any particular circumstance, the balance of the section is intended to apply, and the section as a whole is intended to apply in other circumstances.
-
-      It is not the purpose of this section to induce you to infringe any patents or other property right claims or to contest validity of any such claims; this section has the sole purpose of protecting the integrity of the free software distribution system which is implemented by public license practices. Many people have made generous contributions to the wide range of software distributed through that system in reliance on consistent application of that system; it is up to the author/donor to decide if he or she is willing to distribute software through any other system and a licensee cannot impose that choice.
-
-      This section is intended to make thoroughly clear what is believed to be a consequence of the rest of this License.
-  12.
-
-      If the distribution and/or use of the Library is restricted in certain countries either by patents or by copyrighted interfaces, the original copyright holder who places the Library under this License may add an explicit geographical distribution limitation excluding those countries, so that distribution is permitted only in or among countries not thus excluded. In such case, this License incorporates the limitation as if written in the body of this License.
-  13.
-
-      The Free Software Foundation may publish revised and/or new versions of the Lesser General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns.
-
-      Each version is given a distinguishing version number. If the Library specifies a version number of this License which applies to it and "any later version", you have the option of following the terms and conditions either of that version or of any later version published by the Free Software Foundation. If the Library does not specify a license version number, you may choose any version ever published by the Free Software Foundation.
-  14.
-
-      If you wish to incorporate parts of the Library into other free programs whose distribution conditions are incompatible with these, write to the author to ask for permission. For software which is copyrighted by the Free Software Foundation, write to the Free Software Foundation; we sometimes make exceptions for this. Our decision will be guided by the two goals of preserving the free status of all derivatives of our free software and of promoting the sharing and reuse of software generally.
-
-No Warranty
-
-  15.
-
-      Because the library is licensed free of charge, there is no warranty for the library, to the extent permitted by applicable law. Except when otherwise stated in writing the copyright holders and/or other parties provide the library "as is" without warranty of any kind, either expressed or implied, including, but not limited to, the implied warranties of merchantability and fitness for a particular purpose. The entire risk as to the quality and performance of the library is with you. Should the library prove defective, you assume the cost of all necessary servicing, repair or correction.
-  16.
-
-      In no event unless required by applicable law or agreed to in writing will any copyright holder, or any other party who may modify and/or redistribute the library as permitted above, be liable to you for damages, including any general, special, incidental or consequential damages arising out of the use or inability to use the library (including but not limited to loss of data or data being rendered inaccurate or losses sustained by you or third parties or a failure of the library to operate with any other software), even if such holder or other party has been advised of the possibility of such damages.
-
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/iconsets/Crystal/README b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/iconsets/Crystal/README
deleted file mode 100644
index a55ebed..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/iconsets/Crystal/README
+++ /dev/null
@@ -1,3 +0,0 @@
-These icons are from everaldo.com, in particular from the Open Office Crystal Icons set
-
-The Crystal Project are released under LGPL.
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/iconsets/Crystal/ed_buttons_main.png b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/iconsets/Crystal/ed_buttons_main.png
deleted file mode 100644
index 40bd054..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/iconsets/Crystal/ed_buttons_main.png
+++ /dev/null
Binary files differ
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/iconsets/Crystal/iconset.xml b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/iconsets/Crystal/iconset.xml
deleted file mode 100644
index 6833d32..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/iconsets/Crystal/iconset.xml
+++ /dev/null
@@ -1,234 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<iconset>
-<!--TODO: Add metas -->
-  <icons>
-    <icon id="bold">
-      <default type="map">
-        <path>iconsets/Crystal/ed_buttons_main.png</path>
-        <x>3</x>
-        <y>2</y>
-      </default>
-      <!--<de type="string">
-        <path>iconsets/Crystal/de/bold_de.gif</path>
-      </de>-->
-    </icon>
-    <icon id="italic">
-      <default type="map">
-        <path>iconsets/Crystal/ed_buttons_main.png</path>
-        <x>2</x>
-        <y>2</y>
-      </default>
-    </icon>
-    <icon id="underline">
-      <default type="map">
-        <path>iconsets/Crystal/ed_buttons_main.png</path>
-        <x>2</x>
-        <y>0</y>
-      </default>
-    </icon>
-    <icon id="strikethrough">
-      <default type="map">
-        <path>iconsets/Crystal/ed_buttons_main.png</path>
-        <x>3</x>
-        <y>0</y>
-      </default>
-    </icon>
-    <icon id="subscript">
-      <default type="map">
-        <path>iconsets/Crystal/ed_buttons_main.png</path>
-        <x>3</x>
-        <y>1</y>
-      </default>
-    </icon>
-    <icon id="superscript">
-      <default type="map">
-        <path>iconsets/Crystal/ed_buttons_main.png</path>
-        <x>2</x>
-        <y>1</y>
-      </default>
-    </icon>
-    <icon id="undo">
-      <default type="map">
-        <path>iconsets/Crystal/ed_buttons_main.png</path>
-        <x>4</x>
-        <y>2</y>
-      </default>
-    </icon>
-    <icon id="redo">
-      <default type="map">
-        <path>iconsets/Crystal/ed_buttons_main.png</path>
-        <x>5</x>
-        <y>2</y>
-      </default>
-    </icon>
-    <icon id="cut">
-      <default type="map">
-        <path>iconsets/Crystal/ed_buttons_main.png</path>
-        <x>5</x>
-        <y>0</y>
-      </default>
-    </icon>
-    <icon id="copy">
-      <default type="map">
-        <path>iconsets/Crystal/ed_buttons_main.png</path>
-        <x>4</x>
-        <y>0</y>
-      </default>
-    </icon>
-    <icon id="paste">
-      <default type="map">
-        <path>iconsets/Crystal/ed_buttons_main.png</path>
-        <x>4</x>
-        <y>1</y>
-      </default>
-    </icon>
-    <icon id="forecolor">
-      <default type="map">
-        <path>iconsets/Crystal/ed_buttons_main.png</path>
-        <x>3</x>
-        <y>3</y>
-      </default>
-    </icon>
-    <icon id="hilitecolor">
-      <default type="map">
-        <path>iconsets/Crystal/ed_buttons_main.png</path>
-        <x>2</x>
-        <y>3</y>
-      </default>
-    </icon>
-    <icon id="indent">
-      <default type="map">
-        <path>iconsets/Crystal/ed_buttons_main.png</path>
-        <x>0</x>
-        <y>2</y>
-      </default>
-    </icon>
-    <icon id="outdent">
-      <default type="map">
-        <path>iconsets/Crystal/ed_buttons_main.png</path>
-        <x>1</x>
-        <y>2</y>
-      </default>
-    </icon>
-    <icon id="insertimage">
-      <default type="map">
-        <path>iconsets/Crystal/ed_buttons_main.png</path>
-        <x>6</x>
-        <y>3</y>
-      </default>
-    </icon>
-    <icon id="insertorderedlist">
-      <default type="map">
-        <path>iconsets/Crystal/ed_buttons_main.png</path>
-        <x>0</x>
-        <y>3</y>
-      </default>
-    </icon>
-    <icon id="insertunorderedlist">
-      <default type="map">
-        <path>iconsets/Crystal/ed_buttons_main.png</path>
-        <x>1</x>
-        <y>3</y>
-      </default>
-    </icon>
-    <icon id="justifyleft">
-      <default type="map">
-        <path>iconsets/Crystal/ed_buttons_main.png</path>
-        <x>0</x>
-        <y>0</y>
-      </default>
-    </icon>
-    <icon id="justifyfull">
-      <default type="map">
-        <path>iconsets/Crystal/ed_buttons_main.png</path>
-        <x>0</x>
-        <y>1</y>
-      </default>
-    </icon>
-    <icon id="justifycenter">
-      <default type="map">
-        <path>iconsets/Crystal/ed_buttons_main.png</path>
-        <x>1</x>
-        <y>1</y>
-      </default>
-    </icon>
-    <icon id="justifyright">
-      <default type="map">
-        <path>iconsets/Crystal/ed_buttons_main.png</path>
-        <x>1</x>
-        <y>0</y>
-      </default>
-    </icon>
-    <icon id="createlink">
-      <default type="map">
-        <path>iconsets/Crystal/ed_buttons_main.png</path>
-        <x>6</x>
-        <y>1</y>
-      </default>
-    </icon>
-    <icon id="lefttoright">
-      <default type="map">
-        <path>iconsets/Crystal/ed_buttons_main.png</path>
-        <x>0</x>
-        <y>4</y>
-      </default>
-    </icon>
-    <icon id="righttoleft">
-      <default type="map">
-        <path>iconsets/Crystal/ed_buttons_main.png</path>
-        <x>1</x>
-        <y>4</y>
-      </default>
-    </icon>
-    <icon id="print">
-      <default type="map">
-        <path>iconsets/Crystal/ed_buttons_main.png</path>
-        <x>8</x>
-        <y>1</y>
-      </default>
-    </icon>
-    <icon id="saveas">
-      <default type="map">
-        <path>iconsets/Crystal/ed_buttons_main.png</path>
-        <x>9</x>
-        <y>1</y>
-      </default>
-    </icon>
-    <icon id="removeformat">
-      <default type="map">
-        <path>iconsets/Crystal/ed_buttons_main.png</path>
-        <x>4</x>
-        <y>4</y>
-      </default>
-    </icon>
-    <icon id="about">
-      <default type="map">
-        <path>iconsets/Crystal/ed_buttons_main.png</path>
-        <x>8</x>
-        <y>2</y>
-      </default>
-    </icon>
-    <icon id="showhelp">
-      <default type="map">
-        <path>iconsets/Crystal/ed_buttons_main.png</path>
-        <x>9</x>
-        <y>2</y>
-      </default>
-    </icon>
-    <icon id="fullscreen">
-      <default type="map">
-        <path>iconsets/Crystal/ed_buttons_main.png</path>
-        <x>8</x>
-        <y>0</y>
-      </default>
-    </icon>
-    <icon id="fullscreenrestore">
-      <default type="map">
-        <path>iconsets/Crystal/ed_buttons_main.png</path>
-        <x>9</x>
-        <y>0</y>
-      </default>
-    </icon>
-
-  </icons>
-</iconset>
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/iconsets/Tango/README b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/iconsets/Tango/README
deleted file mode 100644
index a098e59..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/iconsets/Tango/README
+++ /dev/null
@@ -1,3 +0,0 @@
-These icons are from the Tango Desktop Project.  The icons are released to the Public Domain. From http://tango.freedesktop.org:
-
-The Tango Desktop Project exists to help create a consistent graphical user interface experience for free and Open Source software.
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/iconsets/Tango/ed_buttons_main.png b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/iconsets/Tango/ed_buttons_main.png
deleted file mode 100644
index 7f73f65..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/iconsets/Tango/ed_buttons_main.png
+++ /dev/null
Binary files differ
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/iconsets/Tango/iconset.xml b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/iconsets/Tango/iconset.xml
deleted file mode 100644
index cc4ee75..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/iconsets/Tango/iconset.xml
+++ /dev/null
@@ -1,233 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<iconset>
-<!--TODO: Add metas -->
-  <icons>
-    <icon id="bold">
-      <default type="map">
-        <path>iconsets/Tango/ed_buttons_main.png</path>
-        <x>3</x>
-        <y>2</y>
-      </default>
-      <!--<de type="string">
-        <path>iconsets/Tango/de/bold_de.gif</path>
-      </de>-->
-    </icon>
-    <icon id="italic">
-      <default type="map">
-        <path>iconsets/Tango/ed_buttons_main.png</path>
-        <x>2</x>
-        <y>2</y>
-      </default>
-    </icon>
-    <icon id="underline">
-      <default type="map">
-        <path>iconsets/Tango/ed_buttons_main.png</path>
-        <x>2</x>
-        <y>0</y>
-      </default>
-    </icon>
-    <icon id="strikethrough">
-      <default type="map">
-        <path>iconsets/Tango/ed_buttons_main.png</path>
-        <x>3</x>
-        <y>0</y>
-      </default>
-    </icon>
-    <icon id="subscript">
-      <default type="map">
-        <path>iconsets/Tango/ed_buttons_main.png</path>
-        <x>3</x>
-        <y>1</y>
-      </default>
-    </icon>
-    <icon id="superscript">
-      <default type="map">
-        <path>iconsets/Tango/ed_buttons_main.png</path>
-        <x>2</x>
-        <y>1</y>
-      </default>
-    </icon>
-    <icon id="undo">
-      <default type="map">
-        <path>iconsets/Tango/ed_buttons_main.png</path>
-        <x>4</x>
-        <y>2</y>
-      </default>
-    </icon>
-    <icon id="redo">
-      <default type="map">
-        <path>iconsets/Tango/ed_buttons_main.png</path>
-        <x>5</x>
-        <y>2</y>
-      </default>
-    </icon>
-    <icon id="cut">
-      <default type="map">
-        <path>iconsets/Tango/ed_buttons_main.png</path>
-        <x>5</x>
-        <y>0</y>
-      </default>
-    </icon>
-    <icon id="copy">
-      <default type="map">
-        <path>iconsets/Tango/ed_buttons_main.png</path>
-        <x>4</x>
-        <y>0</y>
-      </default>
-    </icon>
-    <icon id="paste">
-      <default type="map">
-        <path>iconsets/Tango/ed_buttons_main.png</path>
-        <x>4</x>
-        <y>1</y>
-      </default>
-    </icon>
-    <icon id="forecolor">
-      <default type="map">
-        <path>iconsets/Tango/ed_buttons_main.png</path>
-        <x>3</x>
-        <y>3</y>
-      </default>
-    </icon>
-    <icon id="hilitecolor">
-      <default type="map">
-        <path>iconsets/Tango/ed_buttons_main.png</path>
-        <x>2</x>
-        <y>3</y>
-      </default>
-    </icon>
-    <icon id="indent">
-      <default type="map">
-        <path>iconsets/Tango/ed_buttons_main.png</path>
-        <x>0</x>
-        <y>2</y>
-      </default>
-    </icon>
-    <icon id="outdent">
-      <default type="map">
-        <path>iconsets/Tango/ed_buttons_main.png</path>
-        <x>1</x>
-        <y>2</y>
-      </default>
-    </icon>
-    <icon id="insertimage">
-      <default type="map">
-        <path>iconsets/Tango/ed_buttons_main.png</path>
-        <x>6</x>
-        <y>3</y>
-      </default>
-    </icon>
-    <icon id="insertorderedlist">
-      <default type="map">
-        <path>iconsets/Tango/ed_buttons_main.png</path>
-        <x>0</x>
-        <y>3</y>
-      </default>
-    </icon>
-    <icon id="insertunorderedlist">
-      <default type="map">
-        <path>iconsets/Tango/ed_buttons_main.png</path>
-        <x>1</x>
-        <y>3</y>
-      </default>
-    </icon>
-    <icon id="justifyleft">
-      <default type="map">
-        <path>iconsets/Tango/ed_buttons_main.png</path>
-        <x>0</x>
-        <y>0</y>
-      </default>
-    </icon>
-    <icon id="justifyfull">
-      <default type="map">
-        <path>iconsets/Tango/ed_buttons_main.png</path>
-        <x>0</x>
-        <y>1</y>
-      </default>
-    </icon>
-    <icon id="justifycenter">
-      <default type="map">
-        <path>iconsets/Tango/ed_buttons_main.png</path>
-        <x>1</x>
-        <y>1</y>
-      </default>
-    </icon>
-    <icon id="justifyright">
-      <default type="map">
-        <path>iconsets/Tango/ed_buttons_main.png</path>
-        <x>1</x>
-        <y>0</y>
-      </default>
-    </icon>
-    <icon id="createlink">
-      <default type="map">
-        <path>iconsets/Tango/ed_buttons_main.png</path>
-        <x>6</x>
-        <y>1</y>
-      </default>
-    </icon>
-    <icon id="lefttoright">
-      <default type="map">
-        <path>iconsets/Tango/ed_buttons_main.png</path>
-        <x>0</x>
-        <y>4</y>
-      </default>
-    </icon>
-    <icon id="righttoleft">
-      <default type="map">
-        <path>iconsets/Tango/ed_buttons_main.png</path>
-        <x>1</x>
-        <y>4</y>
-      </default>
-    </icon>
-    <icon id="print">
-      <default type="map">
-        <path>iconsets/Tango/ed_buttons_main.png</path>
-        <x>8</x>
-        <y>1</y>
-      </default>
-    </icon>
-    <icon id="saveas">
-      <default type="map">
-        <path>iconsets/Tango/ed_buttons_main.png</path>
-        <x>9</x>
-        <y>1</y>
-      </default>
-    </icon>
-    <icon id="removeformat">
-      <default type="map">
-        <path>iconsets/Tango/ed_buttons_main.png</path>
-        <x>4</x>
-        <y>4</y>
-      </default>
-    </icon>
-    <icon id="about">
-      <default type="map">
-        <path>iconsets/Tango/ed_buttons_main.png</path>
-        <x>8</x>
-        <y>2</y>
-      </default>
-    </icon>
-    <icon id="showhelp">
-      <default type="map">
-        <path>iconsets/Tango/ed_buttons_main.png</path>
-        <x>9</x>
-        <y>2</y>
-      </default>
-    </icon>
-    <icon id="fullscreen">
-      <default type="map">
-        <path>iconsets/Tango/ed_buttons_main.png</path>
-        <x>8</x>
-        <y>0</y>
-      </default>
-    </icon>
-    <icon id="fullscreenrestore">
-      <default type="map">
-        <path>iconsets/Tango/ed_buttons_main.png</path>
-        <x>9</x>
-        <y>0</y>
-      </default>
-    </icon>
-  </icons>
-</iconset>
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/images/de/bold.gif b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/images/de/bold.gif
deleted file mode 100644
index 21d286f..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/images/de/bold.gif
+++ /dev/null
Binary files differ
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/images/de/italic.gif b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/images/de/italic.gif
deleted file mode 100644
index 0bf7947..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/images/de/italic.gif
+++ /dev/null
Binary files differ
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/images/de/underline.gif b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/images/de/underline.gif
deleted file mode 100644
index 0545489..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/images/de/underline.gif
+++ /dev/null
Binary files differ
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/images/ed_about.gif b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/images/ed_about.gif
deleted file mode 100644
index 0f28d40..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/images/ed_about.gif
+++ /dev/null
Binary files differ
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/images/ed_align.gif b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/images/ed_align.gif
deleted file mode 100644
index 6c60d50..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/images/ed_align.gif
+++ /dev/null
Binary files differ
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/images/ed_align_center.gif b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/images/ed_align_center.gif
deleted file mode 100644
index 75845b7..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/images/ed_align_center.gif
+++ /dev/null
Binary files differ
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/images/ed_align_justify.gif b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/images/ed_align_justify.gif
deleted file mode 100644
index 568c595..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/images/ed_align_justify.gif
+++ /dev/null
Binary files differ
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/images/ed_align_left.gif b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/images/ed_align_left.gif
deleted file mode 100644
index 8320a2a..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/images/ed_align_left.gif
+++ /dev/null
Binary files differ
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/images/ed_align_right.gif b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/images/ed_align_right.gif
deleted file mode 100644
index bc6f651..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/images/ed_align_right.gif
+++ /dev/null
Binary files differ
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/images/ed_blank.gif b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/images/ed_blank.gif
deleted file mode 100644
index 1ea396b..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/images/ed_blank.gif
+++ /dev/null
Binary files differ
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/images/ed_buttons_main.gif b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/images/ed_buttons_main.gif
deleted file mode 100644
index bc1962b..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/images/ed_buttons_main.gif
+++ /dev/null
Binary files differ
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/images/ed_buttons_main.png b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/images/ed_buttons_main.png
deleted file mode 100644
index 7f73f65..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/images/ed_buttons_main.png
+++ /dev/null
Binary files differ
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/images/ed_charmap.gif b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/images/ed_charmap.gif
deleted file mode 100644
index 289aa7c..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/images/ed_charmap.gif
+++ /dev/null
Binary files differ
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/images/ed_clearfonts.gif b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/images/ed_clearfonts.gif
deleted file mode 100644
index 38c52a8..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/images/ed_clearfonts.gif
+++ /dev/null
Binary files differ
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/images/ed_color_bg.gif b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/images/ed_color_bg.gif
deleted file mode 100644
index 899f133..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/images/ed_color_bg.gif
+++ /dev/null
Binary files differ
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/images/ed_color_fg.gif b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/images/ed_color_fg.gif
deleted file mode 100644
index 292ab87..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/images/ed_color_fg.gif
+++ /dev/null
Binary files differ
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/images/ed_copy.gif b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/images/ed_copy.gif
deleted file mode 100644
index 0e440eb..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/images/ed_copy.gif
+++ /dev/null
Binary files differ
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/images/ed_custom.gif b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/images/ed_custom.gif
deleted file mode 100644
index 1444030..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/images/ed_custom.gif
+++ /dev/null
Binary files differ
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/images/ed_cut.gif b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/images/ed_cut.gif
deleted file mode 100644
index 23fbf80..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/images/ed_cut.gif
+++ /dev/null
Binary files differ
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/images/ed_delete.gif b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/images/ed_delete.gif
deleted file mode 100644
index aff568e..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/images/ed_delete.gif
+++ /dev/null
Binary files differ
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/images/ed_format_bold.gif b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/images/ed_format_bold.gif
deleted file mode 100644
index 78686d1..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/images/ed_format_bold.gif
+++ /dev/null
Binary files differ
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/images/ed_format_italic.gif b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/images/ed_format_italic.gif
deleted file mode 100644
index 2d3baf2..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/images/ed_format_italic.gif
+++ /dev/null
Binary files differ
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/images/ed_format_strike.gif b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/images/ed_format_strike.gif
deleted file mode 100644
index a5b1429..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/images/ed_format_strike.gif
+++ /dev/null
Binary files differ
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/images/ed_format_sub.gif b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/images/ed_format_sub.gif
deleted file mode 100644
index 6c77d74..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/images/ed_format_sub.gif
+++ /dev/null
Binary files differ
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/images/ed_format_sup.gif b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/images/ed_format_sup.gif
deleted file mode 100644
index 4ecb9a1..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/images/ed_format_sup.gif
+++ /dev/null
Binary files differ
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/images/ed_format_underline.gif b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/images/ed_format_underline.gif
deleted file mode 100644
index 4bc47a1..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/images/ed_format_underline.gif
+++ /dev/null
Binary files differ
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/images/ed_help.gif b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/images/ed_help.gif
deleted file mode 100644
index d5f7d63..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/images/ed_help.gif
+++ /dev/null
Binary files differ
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/images/ed_hr.gif b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/images/ed_hr.gif
deleted file mode 100644
index ec5c778..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/images/ed_hr.gif
+++ /dev/null
Binary files differ
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/images/ed_html.gif b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/images/ed_html.gif
deleted file mode 100644
index 026da4e..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/images/ed_html.gif
+++ /dev/null
Binary files differ
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/images/ed_image.gif b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/images/ed_image.gif
deleted file mode 100644
index 1af79c3..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/images/ed_image.gif
+++ /dev/null
Binary files differ
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/images/ed_indent_less.gif b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/images/ed_indent_less.gif
deleted file mode 100644
index 7dda02a..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/images/ed_indent_less.gif
+++ /dev/null
Binary files differ
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/images/ed_indent_more.gif b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/images/ed_indent_more.gif
deleted file mode 100644
index c34b47e..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/images/ed_indent_more.gif
+++ /dev/null
Binary files differ
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/images/ed_killword.gif b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/images/ed_killword.gif
deleted file mode 100644
index fd934a7..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/images/ed_killword.gif
+++ /dev/null
Binary files differ
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/images/ed_left_to_right.gif b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/images/ed_left_to_right.gif
deleted file mode 100644
index 5e95ea5..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/images/ed_left_to_right.gif
+++ /dev/null
Binary files differ
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/images/ed_link.gif b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/images/ed_link.gif
deleted file mode 100644
index 76fd537..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/images/ed_link.gif
+++ /dev/null
Binary files differ
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/images/ed_list_bullet.gif b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/images/ed_list_bullet.gif
deleted file mode 100644
index e37e84b..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/images/ed_list_bullet.gif
+++ /dev/null
Binary files differ
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/images/ed_list_num.gif b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/images/ed_list_num.gif
deleted file mode 100644
index 630cbfd..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/images/ed_list_num.gif
+++ /dev/null
Binary files differ
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/images/ed_overwrite.gif b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/images/ed_overwrite.gif
deleted file mode 100644
index e7a8914..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/images/ed_overwrite.gif
+++ /dev/null
Binary files differ
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/images/ed_paste.gif b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/images/ed_paste.gif
deleted file mode 100644
index 81b53a0..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/images/ed_paste.gif
+++ /dev/null
Binary files differ
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/images/ed_print.gif b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/images/ed_print.gif
deleted file mode 100644
index fb2bf80..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/images/ed_print.gif
+++ /dev/null
Binary files differ
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/images/ed_redo.gif b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/images/ed_redo.gif
deleted file mode 100644
index 3d73dfc..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/images/ed_redo.gif
+++ /dev/null
Binary files differ
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/images/ed_right_to_left.gif b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/images/ed_right_to_left.gif
deleted file mode 100644
index 9b255bd..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/images/ed_right_to_left.gif
+++ /dev/null
Binary files differ
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/images/ed_rmformat.gif b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/images/ed_rmformat.gif
deleted file mode 100644
index 09f102a..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/images/ed_rmformat.gif
+++ /dev/null
Binary files differ
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/images/ed_save.gif b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/images/ed_save.gif
deleted file mode 100644
index 82262d0..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/images/ed_save.gif
+++ /dev/null
Binary files differ
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/images/ed_save.png b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/images/ed_save.png
deleted file mode 100644
index 881fe5d..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/images/ed_save.png
+++ /dev/null
Binary files differ
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/images/ed_saveas.gif b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/images/ed_saveas.gif
deleted file mode 100644
index 4edd988..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/images/ed_saveas.gif
+++ /dev/null
Binary files differ
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/images/ed_selectall.gif b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/images/ed_selectall.gif
deleted file mode 100644
index 9acf0a0..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/images/ed_selectall.gif
+++ /dev/null
Binary files differ
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/images/ed_show_border.gif b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/images/ed_show_border.gif
deleted file mode 100644
index 42849b7..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/images/ed_show_border.gif
+++ /dev/null
Binary files differ
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/images/ed_splitblock.gif b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/images/ed_splitblock.gif
deleted file mode 100644
index 1f1582b..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/images/ed_splitblock.gif
+++ /dev/null
Binary files differ
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/images/ed_splitcel.gif b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/images/ed_splitcel.gif
deleted file mode 100644
index a6e5ab5..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/images/ed_splitcel.gif
+++ /dev/null
Binary files differ
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/images/ed_undo.gif b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/images/ed_undo.gif
deleted file mode 100644
index 319242f..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/images/ed_undo.gif
+++ /dev/null
Binary files differ
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/images/ed_word_cleaner.gif b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/images/ed_word_cleaner.gif
deleted file mode 100644
index d9b0759..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/images/ed_word_cleaner.gif
+++ /dev/null
Binary files differ
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/images/fr/bold.gif b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/images/fr/bold.gif
deleted file mode 100644
index 8a0f657..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/images/fr/bold.gif
+++ /dev/null
Binary files differ
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/images/fr/strikethrough.gif b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/images/fr/strikethrough.gif
deleted file mode 100644
index 5707aef..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/images/fr/strikethrough.gif
+++ /dev/null
Binary files differ
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/images/fr/underline.gif b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/images/fr/underline.gif
deleted file mode 100644
index 4ecaf22..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/images/fr/underline.gif
+++ /dev/null
Binary files differ
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/images/fullscreen_maximize.gif b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/images/fullscreen_maximize.gif
deleted file mode 100644
index 211c1c5..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/images/fullscreen_maximize.gif
+++ /dev/null
Binary files differ
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/images/fullscreen_minimize.gif b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/images/fullscreen_minimize.gif
deleted file mode 100644
index f679e5a..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/images/fullscreen_minimize.gif
+++ /dev/null
Binary files differ
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/images/insert_table.gif b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/images/insert_table.gif
deleted file mode 100644
index a8f4253..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/images/insert_table.gif
+++ /dev/null
Binary files differ
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/images/insertfilelink.gif b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/images/insertfilelink.gif
deleted file mode 100644
index 099f04d..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/images/insertfilelink.gif
+++ /dev/null
Binary files differ
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/images/insertmacro.png b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/images/insertmacro.png
deleted file mode 100644
index 3c874be..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/images/insertmacro.png
+++ /dev/null
Binary files differ
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/images/tango/16x16/actions/document-new.png b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/images/tango/16x16/actions/document-new.png
deleted file mode 100644
index 4c3efdd..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/images/tango/16x16/actions/document-new.png
+++ /dev/null
Binary files differ
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/images/tango/16x16/actions/document-open.png b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/images/tango/16x16/actions/document-open.png
deleted file mode 100644
index 69dd8d4..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/images/tango/16x16/actions/document-open.png
+++ /dev/null
Binary files differ
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/images/tango/16x16/actions/document-print.png b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/images/tango/16x16/actions/document-print.png
deleted file mode 100644
index 35c37bd..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/images/tango/16x16/actions/document-print.png
+++ /dev/null
Binary files differ
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/images/tango/16x16/actions/document-save.png b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/images/tango/16x16/actions/document-save.png
deleted file mode 100644
index 22ff495..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/images/tango/16x16/actions/document-save.png
+++ /dev/null
Binary files differ
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/images/tango/16x16/actions/edit-copy.png b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/images/tango/16x16/actions/edit-copy.png
deleted file mode 100644
index 8dd48c4..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/images/tango/16x16/actions/edit-copy.png
+++ /dev/null
Binary files differ
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/images/tango/16x16/actions/edit-redo.png b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/images/tango/16x16/actions/edit-redo.png
deleted file mode 100644
index c3b0df0..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/images/tango/16x16/actions/edit-redo.png
+++ /dev/null
Binary files differ
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/images/tango/16x16/actions/edit-select-all.png b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/images/tango/16x16/actions/edit-select-all.png
deleted file mode 100644
index f4b0b19..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/images/tango/16x16/actions/edit-select-all.png
+++ /dev/null
Binary files differ
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/images/tango/16x16/actions/edit-undo.png b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/images/tango/16x16/actions/edit-undo.png
deleted file mode 100644
index 8b0fef9..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/images/tango/16x16/actions/edit-undo.png
+++ /dev/null
Binary files differ
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/images/tango/16x16/actions/folder-new.png b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/images/tango/16x16/actions/folder-new.png
deleted file mode 100644
index 628f4d5..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/images/tango/16x16/actions/folder-new.png
+++ /dev/null
Binary files differ
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/images/tango/16x16/actions/format-direction-left-to-right.png b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/images/tango/16x16/actions/format-direction-left-to-right.png
deleted file mode 100755
index a880812..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/images/tango/16x16/actions/format-direction-left-to-right.png
+++ /dev/null
Binary files differ
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/images/tango/16x16/actions/format-direction-right-to-left.png b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/images/tango/16x16/actions/format-direction-right-to-left.png
deleted file mode 100755
index 9a2b7b4..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/images/tango/16x16/actions/format-direction-right-to-left.png
+++ /dev/null
Binary files differ
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/images/tango/16x16/actions/format-indent-less.png b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/images/tango/16x16/actions/format-indent-less.png
deleted file mode 100644
index 1787a7f..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/images/tango/16x16/actions/format-indent-less.png
+++ /dev/null
Binary files differ
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/images/tango/16x16/actions/format-indent-more.png b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/images/tango/16x16/actions/format-indent-more.png
deleted file mode 100644
index 6bad6bb..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/images/tango/16x16/actions/format-indent-more.png
+++ /dev/null
Binary files differ
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/images/tango/16x16/actions/format-justify-center.png b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/images/tango/16x16/actions/format-justify-center.png
deleted file mode 100644
index 207dc4c..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/images/tango/16x16/actions/format-justify-center.png
+++ /dev/null
Binary files differ
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/images/tango/16x16/actions/format-justify-fill.png b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/images/tango/16x16/actions/format-justify-fill.png
deleted file mode 100644
index 663cbad..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/images/tango/16x16/actions/format-justify-fill.png
+++ /dev/null
Binary files differ
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/images/tango/16x16/actions/format-justify-left.png b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/images/tango/16x16/actions/format-justify-left.png
deleted file mode 100644
index d9b40a7..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/images/tango/16x16/actions/format-justify-left.png
+++ /dev/null
Binary files differ
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/images/tango/16x16/actions/format-justify-right.png b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/images/tango/16x16/actions/format-justify-right.png
deleted file mode 100644
index c301307..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/images/tango/16x16/actions/format-justify-right.png
+++ /dev/null
Binary files differ
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/images/tango/16x16/actions/format-text-background-color.png b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/images/tango/16x16/actions/format-text-background-color.png
deleted file mode 100644
index 857b047..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/images/tango/16x16/actions/format-text-background-color.png
+++ /dev/null
Binary files differ
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/images/tango/16x16/actions/format-text-bold.png b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/images/tango/16x16/actions/format-text-bold.png
deleted file mode 100644
index c9cb630..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/images/tango/16x16/actions/format-text-bold.png
+++ /dev/null
Binary files differ
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/images/tango/16x16/actions/format-text-color.png b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/images/tango/16x16/actions/format-text-color.png
deleted file mode 100644
index 7362e3e..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/images/tango/16x16/actions/format-text-color.png
+++ /dev/null
Binary files differ
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/images/tango/16x16/actions/format-text-italic.png b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/images/tango/16x16/actions/format-text-italic.png
deleted file mode 100644
index 977ea82..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/images/tango/16x16/actions/format-text-italic.png
+++ /dev/null
Binary files differ
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/images/tango/16x16/actions/format-text-strikethrough.png b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/images/tango/16x16/actions/format-text-strikethrough.png
deleted file mode 100644
index ccee76e..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/images/tango/16x16/actions/format-text-strikethrough.png
+++ /dev/null
Binary files differ
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/images/tango/16x16/actions/format-text-subscript.png b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/images/tango/16x16/actions/format-text-subscript.png
deleted file mode 100644
index da1d9e1..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/images/tango/16x16/actions/format-text-subscript.png
+++ /dev/null
Binary files differ
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/images/tango/16x16/actions/format-text-superscript.png b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/images/tango/16x16/actions/format-text-superscript.png
deleted file mode 100644
index ea87557..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/images/tango/16x16/actions/format-text-superscript.png
+++ /dev/null
Binary files differ
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/images/tango/16x16/actions/format-text-underline.png b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/images/tango/16x16/actions/format-text-underline.png
deleted file mode 100644
index 0c48721..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/images/tango/16x16/actions/format-text-underline.png
+++ /dev/null
Binary files differ
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/images/tango/16x16/actions/go-up.png b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/images/tango/16x16/actions/go-up.png
deleted file mode 100644
index fa9a7d7..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/images/tango/16x16/actions/go-up.png
+++ /dev/null
Binary files differ
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/images/tango/16x16/actions/insert-link.png b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/images/tango/16x16/actions/insert-link.png
deleted file mode 100755
index d6b2ab8..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/images/tango/16x16/actions/insert-link.png
+++ /dev/null
Binary files differ
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/images/tango/16x16/actions/insert-table.png b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/images/tango/16x16/actions/insert-table.png
deleted file mode 100755
index 80d24eb..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/images/tango/16x16/actions/insert-table.png
+++ /dev/null
Binary files differ
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/images/tango/16x16/actions/toggle-borders.png b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/images/tango/16x16/actions/toggle-borders.png
deleted file mode 100755
index a86679f..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/images/tango/16x16/actions/toggle-borders.png
+++ /dev/null
Binary files differ
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/images/tango/16x16/actions/view-fullscreen.png b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/images/tango/16x16/actions/view-fullscreen.png
deleted file mode 100644
index ffdabd4..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/images/tango/16x16/actions/view-fullscreen.png
+++ /dev/null
Binary files differ
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/images/tango/16x16/actions/view-restore.png b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/images/tango/16x16/actions/view-restore.png
deleted file mode 100644
index 1997ce2..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/images/tango/16x16/actions/view-restore.png
+++ /dev/null
Binary files differ
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/images/tango/16x16/apps/accessories-character-map.png b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/images/tango/16x16/apps/accessories-character-map.png
deleted file mode 100644
index 5dd1124..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/images/tango/16x16/apps/accessories-character-map.png
+++ /dev/null
Binary files differ
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/images/tango/16x16/apps/help-browser.png b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/images/tango/16x16/apps/help-browser.png
deleted file mode 100644
index f25fc3f..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/images/tango/16x16/apps/help-browser.png
+++ /dev/null
Binary files differ
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/images/tango/16x16/mimetypes/image-x-generic.png b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/images/tango/16x16/mimetypes/image-x-generic.png
deleted file mode 100644
index 68da502..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/images/tango/16x16/mimetypes/image-x-generic.png
+++ /dev/null
Binary files differ
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/images/tango/16x16/places/user-trash.png b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/images/tango/16x16/places/user-trash.png
deleted file mode 100644
index 0e0953c..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/images/tango/16x16/places/user-trash.png
+++ /dev/null
Binary files differ
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/images/tango/32x32/apps/internet-web-browser.png b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/images/tango/32x32/apps/internet-web-browser.png
deleted file mode 100644
index 10d2ed4..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/images/tango/32x32/apps/internet-web-browser.png
+++ /dev/null
Binary files differ
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/images/tango/32x32/mimetypes/text-html.png b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/images/tango/32x32/mimetypes/text-html.png
deleted file mode 100644
index a896697..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/images/tango/32x32/mimetypes/text-html.png
+++ /dev/null
Binary files differ
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/images/tango/32x32/mimetypes/text-x-generic.png b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/images/tango/32x32/mimetypes/text-x-generic.png
deleted file mode 100644
index 928a679..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/images/tango/32x32/mimetypes/text-x-generic.png
+++ /dev/null
Binary files differ
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/images/tango/32x32/mimetypes/x-office-document.png b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/images/tango/32x32/mimetypes/x-office-document.png
deleted file mode 100644
index daf84b2..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/images/tango/32x32/mimetypes/x-office-document.png
+++ /dev/null
Binary files differ
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/images/tango/32x32/places/folder.png b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/images/tango/32x32/places/folder.png
deleted file mode 100644
index 0171b09..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/images/tango/32x32/places/folder.png
+++ /dev/null
Binary files differ
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/images/tango/32x32/places/network-server.png b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/images/tango/32x32/places/network-server.png
deleted file mode 100644
index 1d38e4f..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/images/tango/32x32/places/network-server.png
+++ /dev/null
Binary files differ
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/images/tango/COPYING b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/images/tango/COPYING
deleted file mode 100644
index e709d0c..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/images/tango/COPYING
+++ /dev/null
@@ -1,67 +0,0 @@
-Creative Commons Attribution-ShareAlike 2.5 License Agreement
-
-CREATIVE COMMONS CORPORATION IS NOT A LAW FIRM AND DOES NOT PROVIDE LEGAL SERVICES. DISTRIBUTION OF THIS LICENSE DOES NOT CREATE AN ATTORNEY-CLIENT RELATIONSHIP. CREATIVE COMMONS PROVIDES THIS INFORMATION ON AN "AS-IS" BASIS. CREATIVE COMMONS MAKES NO WARRANTIES REGARDING THE INFORMATION PROVIDED, AND DISCLAIMS LIABILITY FOR DAMAGES RESULTING FROM ITS USE.
-
-License
-
-THE WORK (AS DEFINED BELOW) IS PROVIDED UNDER THE TERMS OF THIS CREATIVE COMMONS PUBLIC LICENSE ("CCPL" OR "LICENSE"). THE WORK IS PROTECTED BY COPYRIGHT AND/OR OTHER APPLICABLE LAW. ANY USE OF THE WORK OTHER THAN AS AUTHORIZED UNDER THIS LICENSE OR COPYRIGHT LAW IS PROHIBITED.
-
-BY EXERCISING ANY RIGHTS TO THE WORK PROVIDED HERE, YOU ACCEPT AND AGREE TO BE BOUND BY THE TERMS OF THIS LICENSE. THE LICENSOR GRANTS YOU THE RIGHTS CONTAINED HERE IN CONSIDERATION OF YOUR ACCEPTANCE OF SUCH TERMS AND CONDITIONS.
-
-1. Definitions
-
-   1. "Collective Work" means a work, such as a periodical issue, anthology or encyclopedia, in which the Work in its entirety in unmodified form, along with a number of other contributions, constituting separate and independent works in themselves, are assembled into a collective whole. A work that constitutes a Collective Work will not be considered a Derivative Work (as defined below) for the purposes of this License.
-   2. "Derivative Work" means a work based upon the Work or upon the Work and other pre-existing works, such as a translation, musical arrangement, dramatization, fictionalization, motion picture version, sound recording, art reproduction, abridgment, condensation, or any other form in which the Work may be recast, transformed, or adapted, except that a work that constitutes a Collective Work will not be considered a Derivative Work for the purpose of this License. For the avoidance of doubt, where the Work is a musical composition or sound recording, the synchronization of the Work in timed-relation with a moving image ("synching") will be considered a Derivative Work for the purpose of this License.
-   3. "Licensor" means the individual or entity that offers the Work under the terms of this License.
-   4. "Original Author" means the individual or entity who created the Work.
-   5. "Work" means the copyrightable work of authorship offered under the terms of this License.
-   6. "You" means an individual or entity exercising rights under this License who has not previously violated the terms of this License with respect to the Work, or who has received express permission from the Licensor to exercise rights under this License despite a previous violation.
-   7. "License Elements" means the following high-level license attributes as selected by Licensor and indicated in the title of this License: Attribution, ShareAlike.
-
-2. Fair Use Rights. Nothing in this license is intended to reduce, limit, or restrict any rights arising from fair use, first sale or other limitations on the exclusive rights of the copyright owner under copyright law or other applicable laws.
-
-3. License Grant. Subject to the terms and conditions of this License, Licensor hereby grants You a worldwide, royalty-free, non-exclusive, perpetual (for the duration of the applicable copyright) license to exercise the rights in the Work as stated below:
-
-   1. to reproduce the Work, to incorporate the Work into one or more Collective Works, and to reproduce the Work as incorporated in the Collective Works;
-   2. to create and reproduce Derivative Works;
-   3. to distribute copies or phonorecords of, display publicly, perform publicly, and perform publicly by means of a digital audio transmission the Work including as incorporated in Collective Works;
-   4. to distribute copies or phonorecords of, display publicly, perform publicly, and perform publicly by means of a digital audio transmission Derivative Works.
-   5.
-
-      For the avoidance of doubt, where the work is a musical composition:
-         1. Performance Royalties Under Blanket Licenses. Licensor waives the exclusive right to collect, whether individually or via a performance rights society (e.g. ASCAP, BMI, SESAC), royalties for the public performance or public digital performance (e.g. webcast) of the Work.
-         2. Mechanical Rights and Statutory Royalties. Licensor waives the exclusive right to collect, whether individually or via a music rights society or designated agent (e.g. Harry Fox Agency), royalties for any phonorecord You create from the Work ("cover version") and distribute, subject to the compulsory license created by 17 USC Section 115 of the US Copyright Act (or the equivalent in other jurisdictions).
-   6. Webcasting Rights and Statutory Royalties. For the avoidance of doubt, where the Work is a sound recording, Licensor waives the exclusive right to collect, whether individually or via a performance-rights society (e.g. SoundExchange), royalties for the public digital performance (e.g. webcast) of the Work, subject to the compulsory license created by 17 USC Section 114 of the US Copyright Act (or the equivalent in other jurisdictions).
-
-The above rights may be exercised in all media and formats whether now known or hereafter devised. The above rights include the right to make such modifications as are technically necessary to exercise the rights in other media and formats. All rights not expressly granted by Licensor are hereby reserved.
-
-4. Restrictions.The license granted in Section 3 above is expressly made subject to and limited by the following restrictions:
-
-   1. You may distribute, publicly display, publicly perform, or publicly digitally perform the Work only under the terms of this License, and You must include a copy of, or the Uniform Resource Identifier for, this License with every copy or phonorecord of the Work You distribute, publicly display, publicly perform, or publicly digitally perform. You may not offer or impose any terms on the Work that alter or restrict the terms of this License or the recipients' exercise of the rights granted hereunder. You may not sublicense the Work. You must keep intact all notices that refer to this License and to the disclaimer of warranties. You may not distribute, publicly display, publicly perform, or publicly digitally perform the Work with any technological measures that control access or use of the Work in a manner inconsistent with the terms of this License Agreement. The above applies to the Work as incorporated in a Collective Work, but this does not require the Collective Work apart from the Work itself to be made subject to the terms of this License. If You create a Collective Work, upon notice from any Licensor You must, to the extent practicable, remove from the Collective Work any credit as required by clause 4(c), as requested. If You create a Derivative Work, upon notice from any Licensor You must, to the extent practicable, remove from the Derivative Work any credit as required by clause 4(c), as requested.
-   2. You may distribute, publicly display, publicly perform, or publicly digitally perform a Derivative Work only under the terms of this License, a later version of this License with the same License Elements as this License, or a Creative Commons iCommons license that contains the same License Elements as this License (e.g. Attribution-ShareAlike 2.5 Japan). You must include a copy of, or the Uniform Resource Identifier for, this License or other license specified in the previous sentence with every copy or phonorecord of each Derivative Work You distribute, publicly display, publicly perform, or publicly digitally perform. You may not offer or impose any terms on the Derivative Works that alter or restrict the terms of this License or the recipients' exercise of the rights granted hereunder, and You must keep intact all notices that refer to this License and to the disclaimer of warranties. You may not distribute, publicly display, publicly perform, or publicly digitally perform the Derivative Work with any technological measures that control access or use of the Work in a manner inconsistent with the terms of this License Agreement. The above applies to the Derivative Work as incorporated in a Collective Work, but this does not require the Collective Work apart from the Derivative Work itself to be made subject to the terms of this License.
-   3. If you distribute, publicly display, publicly perform, or publicly digitally perform the Work or any Derivative Works or Collective Works, You must keep intact all copyright notices for the Work and provide, reasonable to the medium or means You are utilizing: (i) the name of the Original Author (or pseudonym, if applicable) if supplied, and/or (ii) if the Original Author and/or Licensor designate another party or parties (e.g. a sponsor institute, publishing entity, journal) for attribution in Licensor's copyright notice, terms of service or by other reasonable means, the name of such party or parties; the title of the Work if supplied; to the extent reasonably practicable, the Uniform Resource Identifier, if any, that Licensor specifies to be associated with the Work, unless such URI does not refer to the copyright notice or licensing information for the Work; and in the case of a Derivative Work, a credit identifying the use of the Work in the Derivative Work (e.g., "French translation of the Work by Original Author," or "Screenplay based on original Work by Original Author"). Such credit may be implemented in any reasonable manner; provided, however, that in the case of a Derivative Work or Collective Work, at a minimum such credit will appear where any other comparable authorship credit appears and in a manner at least as prominent as such other comparable authorship credit.
-
-5. Representations, Warranties and Disclaimer
-
-UNLESS OTHERWISE AGREED TO BY THE PARTIES IN WRITING, LICENSOR OFFERS THE WORK AS-IS AND MAKES NO REPRESENTATIONS OR WARRANTIES OF ANY KIND CONCERNING THE MATERIALS, EXPRESS, IMPLIED, STATUTORY OR OTHERWISE, INCLUDING, WITHOUT LIMITATION, WARRANTIES OF TITLE, MERCHANTIBILITY, FITNESS FOR A PARTICULAR PURPOSE, NONINFRINGEMENT, OR THE ABSENCE OF LATENT OR OTHER DEFECTS, ACCURACY, OR THE PRESENCE OF ABSENCE OF ERRORS, WHETHER OR NOT DISCOVERABLE. SOME JURISDICTIONS DO NOT ALLOW THE EXCLUSION OF IMPLIED WARRANTIES, SO SUCH EXCLUSION MAY NOT APPLY TO YOU.
-
-6. Limitation on Liability. EXCEPT TO THE EXTENT REQUIRED BY APPLICABLE LAW, IN NO EVENT WILL LICENSOR BE LIABLE TO YOU ON ANY LEGAL THEORY FOR ANY SPECIAL, INCIDENTAL, CONSEQUENTIAL, PUNITIVE OR EXEMPLARY DAMAGES ARISING OUT OF THIS LICENSE OR THE USE OF THE WORK, EVEN IF LICENSOR HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
-
-7. Termination
-
-   1. This License and the rights granted hereunder will terminate automatically upon any breach by You of the terms of this License. Individuals or entities who have received Derivative Works or Collective Works from You under this License, however, will not have their licenses terminated provided such individuals or entities remain in full compliance with those licenses. Sections 1, 2, 5, 6, 7, and 8 will survive any termination of this License.
-   2. Subject to the above terms and conditions, the license granted here is perpetual (for the duration of the applicable copyright in the Work). Notwithstanding the above, Licensor reserves the right to release the Work under different license terms or to stop distributing the Work at any time; provided, however that any such election will not serve to withdraw this License (or any other license that has been, or is required to be, granted under the terms of this License), and this License will continue in full force and effect unless terminated as stated above.
-
-8. Miscellaneous
-
-   1. Each time You distribute or publicly digitally perform the Work or a Collective Work, the Licensor offers to the recipient a license to the Work on the same terms and conditions as the license granted to You under this License.
-   2. Each time You distribute or publicly digitally perform a Derivative Work, Licensor offers to the recipient a license to the original Work on the same terms and conditions as the license granted to You under this License.
-   3. If any provision of this License is invalid or unenforceable under applicable law, it shall not affect the validity or enforceability of the remainder of the terms of this License, and without further action by the parties to this agreement, such provision shall be reformed to the minimum extent necessary to make such provision valid and enforceable.
-   4. No term or provision of this License shall be deemed waived and no breach consented to unless such waiver or consent shall be in writing and signed by the party to be charged with such waiver or consent.
-   5. This License constitutes the entire agreement between the parties with respect to the Work licensed here. There are no understandings, agreements or representations with respect to the Work not specified here. Licensor shall not be bound by any additional provisions that may appear in any communication from You. This License may not be modified without the mutual written agreement of the Licensor and You.
-
-Creative Commons is not a party to this License, and makes no warranty whatsoever in connection with the Work. Creative Commons will not be liable to You or any party on any legal theory for any damages whatsoever, including without limitation any general, special, incidental or consequential damages arising in connection to this license. Notwithstanding the foregoing two (2) sentences, if Creative Commons has expressly identified itself as the Licensor hereunder, it shall have all rights and obligations of Licensor.
-
-Except for the limited purpose of indicating to the public that the Work is licensed under the CCPL, neither party will use the trademark "Creative Commons" or any related trademark or logo of Creative Commons without the prior written consent of Creative Commons. Any permitted use will be in compliance with Creative Commons' then-current trademark usage guidelines, as may be published on its website or otherwise made available upon request from time to time.
-
-Creative Commons may be contacted at http://creativecommons.org/.
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/images/tidy.gif b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/images/tidy.gif
deleted file mode 100644
index a881c64..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/images/tidy.gif
+++ /dev/null
Binary files differ
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/images/toggle_borders.gif b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/images/toggle_borders.gif
deleted file mode 100644
index 95bc5be..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/images/toggle_borders.gif
+++ /dev/null
Binary files differ
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/images/xinha-small-icon.gif b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/images/xinha-small-icon.gif
deleted file mode 100644
index 76a4970..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/images/xinha-small-icon.gif
+++ /dev/null
Binary files differ
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/images/xinha_logo.gif b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/images/xinha_logo.gif
deleted file mode 100644
index 346e313..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/images/xinha_logo.gif
+++ /dev/null
Binary files differ
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/lang/b5.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/lang/b5.js
deleted file mode 100644
index 1ca7a13..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/lang/b5.js
+++ /dev/null
@@ -1,39 +0,0 @@
-// I18N constants
-// LANG: "b5", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "About this editor": "關於 Xinha",
-    "Background Color": "背景顏色",
-    "Bold": "粗體",
-    "Bulleted List": "無序清單",
-    "Current style": "字體例子",
-    "Decrease Indent": "減小行前空白",
-    "Font Color": "文字顏色",
-    "Help using editor": "說明",
-    "Horizontal Rule": "水平線",
-    "Increase Indent": "加寬行前空白",
-    "Insert Table": "插入表格",
-    "Insert Web Link": "插入連結",
-    "Insert/Modify Image": "插入圖形",
-    "Italic": "斜體",
-    "Justify Center": "位置居中",
-    "Justify Full": "位置左右平等",
-    "Justify Left": "位置靠左",
-    "Justify Right": "位置靠右",
-    "Ordered List": "順序清單",
-    "Strikethrough": "刪除線",
-    "Subscript": "下標",
-    "Superscript": "上標",
-    "Toggle HTML Source": "切換HTML原始碼",
-    "Underline": "底線",
-    "__OBSOLETE__": {
-        "Enlarge Editor": "放大"
-    }
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/lang/ch.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/lang/ch.js
deleted file mode 100644
index e3c4e98..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/lang/ch.js
+++ /dev/null
@@ -1,62 +0,0 @@
-// I18N constants
-// LANG: "ch", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "About this editor": "關於 Xinha",
-    "Background Color": "背景顏色",
-    "Bold": "粗體",
-    "Bulleted List": "無序清單",
-    "Copy selection": "复制选项",
-    "Current style": "字體例子",
-    "Cut selection": "剪制选项",
-    "Decrease Indent": "伸排",
-    "Direction left to right": "从左到右",
-    "Direction right to left": "从右到左",
-    "Font Color": "文字顏色",
-    "Help using editor": "說明",
-    "Horizontal Rule": "水平線",
-    "Increase Indent": "縮排",
-    "Insert Table": "插入表格",
-    "Insert Web Link": "插入連結",
-    "Insert/Modify Image": "插入圖像",
-    "Italic": "斜體",
-    "Justify Center": "居中",
-    "Justify Full": "整齊",
-    "Justify Left": "靠左",
-    "Justify Right": "靠右",
-    "Ordered List": "順序清單",
-    "Paste from clipboard": "贴上",
-    "Path": "途徑",
-    "Redoes your last action": "重来",
-    "Strikethrough": "刪線",
-    "Subscript": "下標",
-    "Superscript": "上標",
-    "Toggle HTML Source": "切換HTML原始碼",
-    "Underline": "底線",
-    "Undoes your last action": "回原",
-    "You are in TEXT MODE.  Use the [<>] button to switch back to WYSIWYG.": "你在用純字編輯方式.  用 [<>] 按鈕轉回 所見即所得 編輯方式.",
-    "__OBSOLETE__": {
-        "Cancel": "取消",
-        "Enlarge Editor": "伸出編輯系統",
-        "Insert/Modify Link": "插入/改寫連結",
-        "New window (_blank)": "新窗户(_blank)",
-        "None (use implicit)": "無(use implicit)",
-        "OK": "好",
-        "Other": "其他",
-        "Same frame (_self)": "本匡 (_self)",
-        "Target:": "目標匡:",
-        "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.",
-        "The full screen mode is known to cause problems with Internet Explorer, due to browser bugs that we weren": "整頁式在Internet Explorer 上常出問題, 因為這是 Internet Explorer 的無名問題,我們無法解決。你可能看見一些垃圾,或遇到其他問題。我們已警告了你. 如果要轉到 正頁式 請按 好.",
-        "Title (tooltip):": "主題 (tooltip):",
-        "Top frame (_top)": "上匡 (_top)",
-        "URL:": "網址:",
-        "You must enter the URL where this link points to": "你必須輸入你要连结的網址"
-    }
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/lang/cz.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/lang/cz.js
deleted file mode 100644
index 1f41fea..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/lang/cz.js
+++ /dev/null
@@ -1,48 +0,0 @@
-// I18N constants
-// LANG: "cz", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "About this editor": "O této aplikaci",
-    "Background Color": "Barva pozadí",
-    "Bold": "Tučně",
-    "Bulleted List": "Odrážky",
-    "Copy selection": "Kopírovat",
-    "Current style": "Zvolený styl",
-    "Cut selection": "Vyjmout",
-    "Decrease Indent": "Předsadit",
-    "Font Color": "Barva písma",
-    "Help using editor": "Nápověda aplikace",
-    "Horizontal Rule": "Vodorovná čára",
-    "Increase Indent": "Odsadit",
-    "Insert Table": "Vložit tabulku",
-    "Insert Web Link": "Vložit odkaz",
-    "Insert/Modify Image": "Vložit obrázek",
-    "Italic": "Kurzíva",
-    "Justify Center": "Na střed",
-    "Justify Full": "Zarovnat do stran",
-    "Justify Left": "Zarovnat doleva",
-    "Justify Right": "Zarovnat doprava",
-    "Ordered List": "Seznam",
-    "Paste from clipboard": "Vložit",
-    "Path": "Cesta",
-    "Redoes your last action": "Opakuje poslední akci",
-    "Strikethrough": "Přeškrtnutí",
-    "Subscript": "Dolní index",
-    "Superscript": "Horní index",
-    "Toggle HTML Source": "Přepnout HTML",
-    "Underline": "Podtržení",
-    "Undoes your last action": "Vrátí poslední akci",
-    "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.",
-    "__OBSOLETE__": {
-        "Cancel": "Zrušit",
-        "Enlarge Editor": "Nové okno editoru",
-        "OK": "OK"
-    }
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/lang/da.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/lang/da.js
deleted file mode 100644
index 853e83f..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/lang/da.js
+++ /dev/null
@@ -1,160 +0,0 @@
-// I18N constants
-// LANG: "da", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "About this editor": "Om Xinha",
-    "Address": "Adresse",
-    "Background Color": "Baggrundsfarve",
-    "Bold": "Fed",
-    "Bulleted List": "Punktliste",
-    "Clean content pasted from Word": "Rens indhold kopieret fra Word",
-    "Clear Inline Font Specifications": "Fjern skrift valg",
-    "Clear MSOffice tags": "MSOffice filter",
-    "Close": "Luk",
-    "Constructing object": "Objekt registreres",
-    "Copy selection": "Kopier",
-    "Create Statusbar": "Opretter statuslinje",
-    "Create Toolbar": "Opretter værktøjslinje",
-    "Current style": "Anvendt stil",
-    "Cut selection": "Klip",
-    "Decrease Indent": "Formindsk indrykning",
-    "Direction left to right": "Tekst venstre mod højre",
-    "Direction right to left": "Tekst højre mod venstre",
-    "Finishing": "Afslutter",
-    "Font Color": "Skriftfarve",
-    "Formatted": "Formateret",
-    "Generate Xinha framework": "Xinha Framework genereres",
-    "Heading 1": "Overskrift 1",
-    "Heading 2": "Overskrift 2",
-    "Heading 3": "Overskrift 3",
-    "Heading 4": "Overskrift 4",
-    "Heading 5": "Overskrift 5",
-    "Heading 6": "Overskrift 6",
-    "Headings": "Overskrift 1 til 6",
-    "Help using editor": "Hjælp",
-    "Horizontal Rule": "Vandret streg",
-    "Increase Indent": "Forøg indrykning",
-    "Init editor size": "Størrelsen beregnes",
-    "Insert Table": "Indsæt tabel",
-    "Insert Web Link": "Indsæt hyperlink",
-    "Insert/Modify Image": "Indsæt/udskift billede",
-    "Insert/Overwrite": "Indsæt/Overskriv",
-    "Italic": "Kursiv",
-    "Justify Center": "Centrer",
-    "Justify Full": "Lige margener",
-    "Justify Left": "Venstrejuster",
-    "Justify Right": "Højrejuster",
-    "Keyboard shortcuts": "Tastaturgenveje",
-    "Loading in progress. Please wait!": "Editoren hentes ind. Vent venligst.",
-    "Loading plugin $plugin": "Plugin $plugin hentes",
-    "Normal": "Normal",
-    "Ordered List": "Ordnet liste",
-    "Paste from clipboard": "Indsæt",
-    "Path": "STi",
-    "Print document": "Udskriv dokument",
-    "Redoes your last action": "Gentag sidste ændring",
-    "Register plugin $plugin": "Plugin $plugin registreres",
-    "Remove formatting": "Fjern formatering",
-    "Save as": "Gem som",
-    "Select all": "Vælg alt",
-    "Set format to paragraph": "Formater afsnit",
-    "Split Block": "Del blok",
-    "Strikethrough": "Gennemstregning",
-    "Subscript": "Sænket skrift",
-    "Superscript": "Hævet skrift",
-    "The editor provides the following key combinations:": "Editoren kender følgende kombinationer:",
-    "Toggle Borders": "Tabelkanter til/fra",
-    "Toggle HTML Source": "HTML visning",
-    "Underline": "Understregning",
-    "Undoes your last action": "Fortryd sidste ændring",
-    "Would you like to clear font colours?": "Vil du fjerne skriftfarve valg",
-    "Would you like to clear font sizes?": "Vil du fjerne skriftstørrelse valg",
-    "Would you like to clear font typefaces?": "Vil du fjern skriftsnit valg",
-    "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.",
-    "insert linebreak": "Indsæt linjeskift",
-    "new paragraph": "Nyt afsnit",
-    "__OBSOLETE__": {
-        "&mdash; format &mdash;": "&mdash; Format &mdash;",
-        "Absbottom": "Bund",
-        "Absmiddle": "Centreret",
-        "Alignment:": "Justering:",
-        "Alternate text:": "Alternativ text:",
-        "Baseline": "Grundlinje",
-        "Border thickness:": "Kantbredde:",
-        "Bottom": "Tekstbund",
-        "Cancel": "Fortryd",
-        "Cell padding:": "Cellefyld:",
-        "Cell spacing:": "Celleafstand:",
-        "Click a color...": "Vælg farve",
-        "Color: ": "Farve: ",
-        "Cols:": "Søjler:",
-        "Em": "Geviert (Em)",
-        "Enlarge Editor": "Vis editor i popup",
-        "Enter the image URL here": "Angiv billedets URL",
-        "Fixed width columns": "Fast-bredde søjler",
-        "For browsers that don't support images": "for browsere der ikke understøtter billeder",
-        "Horizontal padding": "Vandret fyld",
-        "Horizontal:": "vandret:",
-        "Image Preview:": "Billede smugkig:",
-        "Image URL:": "Billede URL:",
-        "Insert Image": "Indsæt billede",
-        "Insert/Modify Link": "Indsæt/rediger hyperlink",
-        "Layout": "Layout",
-        "Leave empty for no border": "Tom hvis ingen kant",
-        "Left": "Venstre",
-        "Middle": "Midt",
-        "New window (_blank)": "Nyt vindue (_blank)",
-        "None (use implicit)": "ingen (implicit)",
-        "Not set": "Ubestemt",
-        "Number of columns": "Antal søjler",
-        "Number of rows": "Antal rækker",
-        "OK": "OK",
-        "Other": "Andet",
-        "Percent": "Procent",
-        "Pixels": "Pixel",
-        "Positioning of this image": "Placering af billedet",
-        "Positioning of this table": "Placering af tabel",
-        "Preview": "Smugkig",
-        "Preview the image in a new window": "Smugkig af billedet i et nyt vindue",
-        "Register bottom panel": "Registrerer nederste panel",
-        "Register left panel": "Registrerer venstre panel",
-        "Register right panel": "Registrerer højre panel",
-        "Register top panel": "Registrerer øverste panel",
-        "Right": "Højre",
-        "Rows:": "Rækker:",
-        "Same frame (_self)": "Samme ramme (_self)",
-        "Sample": "Eksempel",
-        "Space between adjacent cells": "Afstand mellem celler",
-        "Space between content and border in cell": "Luft mellem indhold og kanter",
-        "Spacing": "Afstand",
-        "Target:": "Placering:",
-        "Texttop": "Teksttop",
-        "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.",
-        "Title (tooltip):": "Titel (Tooltip):",
-        "Top": "Top",
-        "Top frame (_top)": "Topramme (_top)",
-        "URL:": "URL:",
-        "Vertical padding": "Lodret fyld",
-        "Vertical:": "lodret:",
-        "Web Safe: ": "Web Safe: ",
-        "Width of the table": "Tabelbredde",
-        "Width unit": "Breddeenhed",
-        "Width:": "Bredde:",
-        "You must enter a number of columns": "Du skal skrive antallet af søjler",
-        "You must enter a number of rows": "Du skal skrive antallet af rækker",
-        "You must enter the URL": "Du skal angive en URL",
-        "You must enter the URL where this link points to": "Du skal angive en mål-URL for linket",
-        "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.",
-        "button_bold": "de/bold.gif",
-        "button_italic": "de/italic.gif",
-        "button_underline": "de/underline.gif"
-    }
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/lang/de.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/lang/de.js
deleted file mode 100644
index 69c3843..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/lang/de.js
+++ /dev/null
@@ -1,157 +0,0 @@
-// I18N constants
-// LANG: "de", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "&#8212; format &#8212;": "&#8212; Format &#8212;",
-    "About this editor": "Über diesen Editor",
-    "Address": "Adresse",
-    "Background Color": "Hindergrundfarbe",
-    "Bold": "Fett",
-    "Bulleted List": "Aufzählungsliste",
-    "Clean content pasted from Word": "Von Word eingefügter Text bereinigen",
-    "Clear Inline Font Specifications": "Zeichensatz Formatierungen entfernen",
-    "Clear MSOffice tags": "MSOffice filter",
-    "Close": "Schließen",
-    "Constructing object": "Objekt wird generiert",
-    "Copy selection": "Kopieren",
-    "Create Statusbar": "Statusleiste wird generiert",
-    "Create Toolbar": "Werkzeugleiste wird generiert",
-    "Current style": "Derzeitiger Stil",
-    "Cut selection": "Ausschneiden",
-    "Decrease Indent": "Einzug verkleinern",
-    "Direction left to right": "Textrichtung von Links nach Rechts",
-    "Direction right to left": "Textrichtung von Rechts nach Links",
-    "Finishing": "Laden wird abgeschlossen",
-    "Font Color": "Schriftfarbe",
-    "Formatted": "Formatiert",
-    "Generate Xinha framework": "Xinha Framework wird generiert",
-    "Heading 1": "Überschrift 1",
-    "Heading 2": "Überschrift 2",
-    "Heading 3": "Überschrift 3",
-    "Heading 4": "Überschrift 4",
-    "Heading 5": "Überschrift 5",
-    "Heading 6": "Überschrift 6",
-    "Headings": "Überschrift Typ 1 bis 6",
-    "Help using editor": "Hilfe",
-    "Horizontal Rule": "Horizontale Linie",
-    "Increase Indent": "Einzug vergrößern",
-    "Init editor size": "Größe wird berechnet",
-    "Insert Table": "Tabelle einfügen",
-    "Insert Web Link": "Hyperlink einfügen",
-    "Insert/Modify Image": "Bild einfügen/verändern",
-    "Insert/Overwrite": "Einfügen/Überschreiben",
-    "Italic": "Kursiv",
-    "Justify Center": "Zentriert",
-    "Justify Full": "Blocksatz",
-    "Justify Left": "Linksbündig",
-    "Justify Right": "Rechtsbündig",
-    "Keyboard shortcuts": "Tastaturkürzel",
-    "Loading in progress. Please wait!": "Editor wird geladen. Bitte warten !",
-    "Loading plugin $plugin": "Plugin $plugin wird geladen",
-    "Normal": "Normal (Absatz)",
-    "Ordered List": "Nummerierte Liste",
-    "Paste from clipboard": "Einfügen aus der Zwischenablage",
-    "Path": "Pfad",
-    "Print document": "Dokument ausdrucken",
-    "Redoes your last action": "Wiederholen",
-    "Register plugin $plugin": "Plugin $plugin wird registriert",
-    "Remove formatting": "Formatierung entfernen",
-    "Save as": "speichern unter",
-    "Select all": "Alles markieren",
-    "Set format to paragraph": "Setze Formatierung auf Absatz",
-    "Split Block": "Block teilen",
-    "Strikethrough": "Durchgestrichen",
-    "Subscript": "Tiefgestellt",
-    "Superscript": "Hochgestellt",
-    "The editor provides the following key combinations:": "Der Editor unterstützt die folgenden kombinationen:",
-    "Toggle Borders": "Tabellenränder ein/ausblenden",
-    "Toggle HTML Source": "HTML Quelltext ein/ausschalten",
-    "Underline": "Unterstrichen",
-    "Undoes your last action": "Rückgängig",
-    "Would you like to clear font colours?": "Wollen sie Zeichensatzfarben entfernen",
-    "Would you like to clear font sizes?": "Wollen Sie Zeichensatzgrößen entfernen",
-    "Would you like to clear font typefaces?": "Wollen Sie Zeichensatztypen entfernen",
-    "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.",
-    "insert linebreak": "Harter Umbruch einfügen",
-    "new paragraph": "Neuer Absatz(Paragraph)",
-    "__OBSOLETE__": {
-        "Absbottom": "unten bündig",
-        "Absmiddle": "mittig",
-        "Alignment:": "Ausrichtung:",
-        "Alternate text:": "Alternativer Text:",
-        "Baseline": "Grundlinie",
-        "Border thickness:": "Randstärke:",
-        "Bottom": "unten",
-        "Cancel": "Abbrechen",
-        "Cell padding:": "Innenabstand:",
-        "Cell spacing:": "Zellenabstand:",
-        "Click a color...": "Farbe wählen",
-        "Color: ": "Farbe: ",
-        "Cols:": "Spalten:",
-        "Em": "Geviert",
-        "Enlarge Editor": "Editor vergrößern",
-        "Enter the image URL here": "Bitte geben sie hier die Bild URL ein",
-        "Fixed width columns": "Spalten mit fester Breite",
-        "For browsers that don't support images": "für Browser, die keine Bilder unterstützen",
-        "Horizontal padding": "horizontaler Inhaltsabstand",
-        "Horizontal:": "horizontal:",
-        "Image Preview:": "Bild Voransicht:",
-        "Image URL:": "Bild URL:",
-        "Insert Image": "Bild einfügen",
-        "Insert/Modify Link": "Verknüpfung hinzufügen/ändern",
-        "Layout": "Layout",
-        "Leave empty for no border": "leer lassen für keinen Rand",
-        "Left": "links",
-        "Middle": "zentriert",
-        "New window (_blank)": "Neues Fenster (_blank)",
-        "None (use implicit)": "k.A. (implizit)",
-        "Not set": "nicht eingestellt",
-        "Number of columns": "Spaltenanzahl",
-        "Number of rows": "Zeilenanzahl",
-        "OK": "OK",
-        "Other": "Anderes",
-        "Percent": "Prozent",
-        "Pixels": "Pixel",
-        "Positioning of this image": "Positionierung dieses Bildes",
-        "Positioning of this table": "Positionierung der Tabelle",
-        "Preview": "Voransicht",
-        "Preview the image in a new window": "Voransicht des Bildes in einem neuen Fenster",
-        "Register bottom panel": "Unteres Panel wird generiert",
-        "Register left panel": "Linkes Panel wird generiert",
-        "Register right panel": "Rechtes Panel wird generiert",
-        "Register top panel": "Oberes Panel wird generiert",
-        "Right": "rechts",
-        "Rows:": "Zeilen:",
-        "Same frame (_self)": "Selber Rahmen (_self)",
-        "Sample": "Beispiel",
-        "Space between adjacent cells": "Raum zwischen angrenzenden Zellen",
-        "Space between content and border in cell": "Raum zwischen Inhalt und Rand der Zelle",
-        "Spacing": "Abstand",
-        "Target:": "Ziel:",
-        "Texttop": "oben bündig",
-        "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).",
-        "Title (tooltip):": "Titel (Tooltip):",
-        "Top": "oben",
-        "Top frame (_top)": "Oberster Rahmen (_top)",
-        "URL:": "URL:",
-        "Vertical padding": "vertikaler Inhaltsabstand",
-        "Vertical:": "vertikal:",
-        "Web Safe: ": "Web Safe: ",
-        "Width of the table": "Tabellenbreite",
-        "Width unit": "Größeneinheit",
-        "Width:": "Breite:",
-        "You must enter a number of columns": "Bitte geben Sie die Anzahl der Spalten an",
-        "You must enter a number of rows": "Bitte geben Sie die Anzahl der Zeilen an",
-        "You must enter the URL": "Bitte geben Sie die URL ein",
-        "You must enter the URL where this link points to": "Sie müssen eine Ziel-URL angeben für die Verknüpfung angeben",
-        "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."
-    }
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/lang/ee.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/lang/ee.js
deleted file mode 100644
index 0187434..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/lang/ee.js
+++ /dev/null
@@ -1,48 +0,0 @@
-// I18N constants
-// LANG: "ee", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "About this editor": "Teave toimeti kohta",
-    "Background Color": "Tausta värv",
-    "Bold": "Paks",
-    "Bulleted List": "Täpploend",
-    "Copy selection": "Kopeeri",
-    "Current style": "Kirjastiil",
-    "Cut selection": "Lõika",
-    "Decrease Indent": "Vähenda taanet",
-    "Font Color": "Fondi värv",
-    "Help using editor": "Spikker",
-    "Horizontal Rule": "Horisontaaljoon",
-    "Increase Indent": "Suurenda taanet",
-    "Insert Table": "Lisa tabel",
-    "Insert Web Link": "Lisa viit",
-    "Insert/Modify Image": "Lisa pilt",
-    "Italic": "Kursiiv",
-    "Justify Center": "Joonda keskele",
-    "Justify Full": "Rööpjoonda",
-    "Justify Left": "Joonda vasakule",
-    "Justify Right": "Joonda paremale",
-    "Ordered List": "Nummerdus",
-    "Paste from clipboard": "Kleebi",
-    "Path": "Path",
-    "Redoes your last action": "Tee uuesti",
-    "Strikethrough": "Läbikriipsutatud",
-    "Subscript": "Allindeks",
-    "Superscript": "Ülaindeks",
-    "Toggle HTML Source": "HTML/tavaline vaade",
-    "Underline": "Allakriipsutatud",
-    "Undoes your last action": "Võta tagasi",
-    "You are in TEXT MODE.  Use the [<>] button to switch back to WYSIWYG.": "Sa oled tekstireziimis.  Kasuta nuppu [<>] lülitamaks tagasi WYSIWIG reziimi.",
-    "__OBSOLETE__": {
-        "Cancel": "Loobu",
-        "Enlarge Editor": "Suurenda toimeti aken",
-        "OK": "OK"
-    }
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/lang/el.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/lang/el.js
deleted file mode 100644
index eb89b56..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/lang/el.js
+++ /dev/null
@@ -1,61 +0,0 @@
-// I18N constants
-// LANG: "el", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "About this editor": "Πληροφορίες",
-    "Background Color": "Χρώμα Φόντου",
-    "Bold": "Έντονα",
-    "Bulleted List": "Κουκκίδες",
-    "Copy selection": "Αντιγραφή",
-    "Current style": "Παρών στυλ",
-    "Cut selection": "Αποκοπή",
-    "Decrease Indent": "Μείωση Εσοχής",
-    "Direction left to right": "Κατεύθυνση αριστερά προς δεξιά",
-    "Direction right to left": "Κατεύθυνση από δεξιά προς τα αριστερά",
-    "Font Color": "Χρώμα Γραμματοσειράς",
-    "Help using editor": "Βοήθεια",
-    "Horizontal Rule": "Οριζόντια Γραμμή",
-    "Increase Indent": "Αύξηση Εσοχής",
-    "Insert Table": "Εισαγωγή Πίνακα",
-    "Insert Web Link": "Εισαγωγή Συνδέσμου",
-    "Insert/Modify Image": "Εισαγωγή/Τροποποίηση Εικόνας",
-    "Italic": "Πλάγια",
-    "Justify Center": "Στοίχιση Κέντρο",
-    "Justify Full": "Πλήρης Στοίχιση",
-    "Justify Left": "Στοίχιση Αριστερά",
-    "Justify Right": "Στοίχιση Δεξιά",
-    "Ordered List": "Αρίθμηση",
-    "Paste from clipboard": "Επικόλληση",
-    "Path": "Διαδρομή",
-    "Redoes your last action": "Επαναφορά από αναίρεση",
-    "Strikethrough": "Διαγραμμένα",
-    "Subscript": "Δείκτης",
-    "Superscript": "Δείκτης",
-    "Toggle HTML Source": "Εναλλαγή σε/από HTML",
-    "Underline": "Υπογραμμισμένα",
-    "Undoes your last action": "Αναίρεση τελευταίας ενέργειας",
-    "You are in TEXT MODE.  Use the [<>] button to switch back to WYSIWYG.": "Είστε σε TEXT MODE.  Χρησιμοποιήστε το κουμπί [<>] για να επανέρθετε στο WYSIWIG.",
-    "__OBSOLETE__": {
-        "Cancel": "Ακύρωση",
-        "Enlarge Editor": "Μεγένθυνση επεξεργαστή",
-        "Insert/Modify Link": "Εισαγωγή/Τροποποίηση σύνδεσμου",
-        "New window (_blank)": "Νέο παράθυρο (_blank)",
-        "None (use implicit)": "Κανένα (χρήση απόλυτου)",
-        "OK": "Εντάξει",
-        "Other": "Αλλο",
-        "Same frame (_self)": "Ίδιο frame (_self)",
-        "Target:": "Target:",
-        "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. Αν είστε σίγουροι, πατήστε ΟΚ.",
-        "Title (tooltip):": "Τίτλος (tooltip):",
-        "Top frame (_top)": "Πάνω frame (_top)",
-        "URL:": "URL:",
-        "You must enter the URL where this link points to": "Πρέπει να εισάγετε το URL που οδηγεί αυτός ο σύνδεσμος"
-    }
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/lang/es.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/lang/es.js
deleted file mode 100644
index 96b235f..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/lang/es.js
+++ /dev/null
@@ -1,159 +0,0 @@
-// I18N constants
-// LANG: "es", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "&#8212; font &#8212;": "&#8212; fuente &#8212;",
-    "&#8212; format &#8212;": "&#8212; formato &#8212;",
-    "&#8212; size &#8212;": "&#8212; tamaño &#8212;",
-    "About this editor": "Sobre este Editor",
-    "Address": "Dirección",
-    "Background Color": "Color de fondo",
-    "Bold": "Negrita",
-    "Bulleted List": "Lista no numerada",
-    "Clean content pasted from Word": "Limpiar el contenido pegado desde Word",
-    "Clear Inline Font Specifications": "Borrar las etiquetas de fuente",
-    "Clear MSOffice tags": "Borrar etiquetas de MSOffice",
-    "Close": "Cerrar",
-    "Constructing object": "Construyendo objeto",
-    "Copy selection": "Copiar",
-    "Create Statusbar": "Crear barra de estado",
-    "Create Toolbar": "Crear barra de herramientas",
-    "Current style": "Estilo actual",
-    "Cut selection": "Cortar",
-    "Decrease Indent": "Reducir sangría",
-    "Direction left to right": "Dirección de izquierda a derecha",
-    "Direction right to left": "Dirección de derecha a izquierda",
-    "Finishing": "Finalizando",
-    "Font Color": "Color de la fuente",
-    "Formatted": "Formateado",
-    "Generate Xinha framework": "Generar Xinha framework",
-    "Heading 1": "Cabecera 1",
-    "Heading 2": "Cabecera 2",
-    "Heading 3": "Cabecera 3",
-    "Heading 4": "Cabecera 4",
-    "Heading 5": "Cabecera 5",
-    "Heading 6": "Cabecera 6",
-    "Headings": "Cabeceras",
-    "Help using editor": "Ayuda",
-    "Horizontal Rule": "Regla horizontal",
-    "Increase Indent": "Aumentar sangría",
-    "Init editor size": "Iniciar el tamaño del editor",
-    "Insert Table": "Añadir una tabla",
-    "Insert Web Link": "Insertar enlace web",
-    "Insert/Modify Image": "Insertar/modificar imagen",
-    "Insert/Overwrite": "Insertar/Sobreescribir",
-    "Italic": "Cursiva",
-    "Justify Center": "Alinear al centro",
-    "Justify Full": "Justificar",
-    "Justify Left": "Alinear a la izquierda",
-    "Justify Right": "Alinear a la derecha",
-    "Keyboard shortcuts": "Atajos de teclado",
-    "Loading in progress. Please wait!": "Carga en proceso. Por favor espere.",
-    "Loading plugin $plugin": "Cargando el plugin $plugin",
-    "Normal": "Normal",
-    "Ordered List": "Lista numerada",
-    "Paste from clipboard": "Pegar desde el portapapeles",
-    "Path": "Ruta",
-    "Print document": "Imprimir documento",
-    "Redoes your last action": "Rehacer",
-    "Register plugin $plugin": "Registro de plugin $plugin",
-    "Remove formatting": "Borrar formato",
-    "Save as": "Guardar como",
-    "Select all": "Seleccionar todo",
-    "Set format to paragraph": "EStablecer el formato a parrafo",
-    "Split Block": "Dividir el bloque",
-    "Strikethrough": "Tachado",
-    "Subscript": "Subíndice",
-    "Superscript": "Superíndice",
-    "The editor provides the following key combinations:": "El editor proporciona las siguientes combinaciones:",
-    "Toggle Borders": "Añadir/Quitar bordes",
-    "Toggle HTML Source": "Ver HTML",
-    "Underline": "Subrayado",
-    "Undoes your last action": "Deshacer",
-    "Would you like to clear font colours?": "¿Desea eliminar las definiciones de color de fuente?",
-    "Would you like to clear font sizes?": "¿Desea eliminar las definiciones de tamaño de fuente?",
-    "Would you like to clear font typefaces?": "¿Desea eliminar las definiciaones de tipo de fuente?",
-    "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",
-    "insert linebreak": "Insertar salto de línea",
-    "new paragraph": "Nuevo parrafo",
-    "__OBSOLETE__": {
-        "Absbottom": "Inferior absoluto",
-        "Absmiddle": "Medio Absoluto",
-        "Alignment:": "Alineación:",
-        "Alternate text:": "Texto alternativo:",
-        "Baseline": "Línea base",
-        "Border thickness:": "Tamaño del borde:",
-        "Bottom": "Inferior",
-        "Cancel": "Cancelar",
-        "Cell padding:": "Relleno de celdas:",
-        "Cell spacing:": "Espaciado entre celdas:",
-        "Click a color...": "Seleccione un color...",
-        "Color: ": "Color: ",
-        "Cols:": "Columnas:",
-        "Em": "Em",
-        "Enlarge Editor": "Editor a pantalla completa",
-        "Enter the image URL here": "",
-        "Fixed width columns": "Columnas de ancho fijo",
-        "For browsers that don't support images": "Para navegadores que no soportan imágenes",
-        "Horizontal padding": "Relleno horizontal",
-        "Horizontal:": "horizontal:",
-        "Image Preview:": "Previsualización de la imagen:",
-        "Image URL:": "Imagen URL:",
-        "Insert Image": "Insertar una imagen",
-        "Insert/Modify Link": "Insertar/Modificar un enlace",
-        "Layout": "Distribución",
-        "Leave empty for no border": "Vacío si no desea ningún borde",
-        "Left": "Izquierda",
-        "Middle": "Medio",
-        "New window (_blank)": "Nueva ventana (_blank)",
-        "None (use implicit)": "Vacío ( usar implícito )",
-        "Not set": "No definido",
-        "Number of columns": "Número de columnas",
-        "Number of rows": "Número de filas",
-        "OK": "Aceptar",
-        "Other": "Otro",
-        "Percent": "Porcentaje",
-        "Pixels": "Pixels",
-        "Positioning of this image": "Posición de la imagen",
-        "Positioning of this table": "Posición de esta tabla",
-        "Preview": "Previsualizar",
-        "Preview the image in a new window": "Previsualizar en una nueva ventana",
-        "Register bottom panel": "Registar panel inferior",
-        "Register left panel": "Registrar panel izquierdo",
-        "Register right panel": "Registrar panel derecho",
-        "Register top panel": "Registar panel superior",
-        "Right": "Derecha",
-        "Rows:": "Filas:",
-        "Same frame (_self)": "Mismo marco (_self)",
-        "Sample": "Muestra",
-        "Space between adjacent cells": "Espaciado entre celdas adyacentes",
-        "Space between content and border in cell": "Escapcio entre el contenido y el borde de la celda",
-        "Spacing": "Espaciado",
-        "Target:": "Destino:",
-        "Texttop": "Texto Superior",
-        "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",
-        "Title (tooltip):": "Título (Tooltip):",
-        "Top": "Superior",
-        "Top frame (_top)": "Marco superior (_top)",
-        "URL:": "URL:",
-        "Vertical padding": "Relleno Vertical",
-        "Vertical:": "Vertical:",
-        "Web Safe: ": "Color web: ",
-        "Width of the table": "Ancho de la tabla",
-        "Width unit": "Unidad de anchura",
-        "Width:": "Ancho:",
-        "You must enter a number of columns": "Debe introducir un número de columnas",
-        "You must enter a number of rows": "Debe introducir un número de filas",
-        "You must enter the URL": "Debe introducir la URL",
-        "You must enter the URL where this link points to": "Debe introducir la URL a donde apunta este enlace",
-        "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"
-    }
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/lang/eu.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/lang/eu.js
deleted file mode 100644
index 3a962ae..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/lang/eu.js
+++ /dev/null
@@ -1,160 +0,0 @@
-// I18N constants
-// LANG: "eu", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "&#8212; format &#8212;": "&#8212; Formatua &#8212;",
-    "About this editor": "Editoreari buruz...",
-    "Address": "Helbidea",
-    "Background Color": "Atzeko kolorea",
-    "Bold": "Lodia",
-    "Bulleted List": "Zerrenda ez ordenatua",
-    "Clean content pasted from Word": "Word-etik itsatsitako edukia ezabatu",
-    "Clear Inline Font Specifications": "Ezabatu testuaren ezaugarriak",
-    "Clear MSOffice tags": "MSOffice etiketak ezabatu",
-    "Close": "Itxi",
-    "Constructing object": "Objektua eraikitzen",
-    "Copy selection": "Kopiatu hautaketa",
-    "Create Statusbar": "Egoera-barra sortu",
-    "Create Toolbar": "Tresna-barra sortu",
-    "Current style": "Uneko estiloa",
-    "Cut selection": "Ebaki hautaketa",
-    "Decrease Indent": "Koska handitu",
-    "Direction left to right": "Ezkerretik eskuinetarako norabidea",
-    "Direction right to left": "Eskuinetik ezkerretarako norabidea",
-    "Finishing": "Bukatzen",
-    "Font Color": "Testu-kolorea",
-    "Formatted": "Formateatua",
-    "Generate Xinha framework": "Xinha Framework sortzen",
-    "Heading 1": "Goiburua 1",
-    "Heading 2": "Goiburua 2",
-    "Heading 3": "Goiburua 3",
-    "Heading 4": "Goiburua 4",
-    "Heading 5": "Goiburua 5",
-    "Heading 6": "Goiburua 6",
-    "Headings": "Goiburuak",
-    "Help using editor": "Laguntza",
-    "Horizontal Rule": "Marra horizontala",
-    "Increase Indent": "Koska txikitu",
-    "Init editor size": "Editorearen hasierako neurria",
-    "Insert Table": "Taula txertatu",
-    "Insert Web Link": "Lotura txertatu",
-    "Insert/Modify Image": "Irudia txertatu",
-    "Insert/Overwrite": "Txertatu/Gainidatzi",
-    "Italic": "Etzana",
-    "Justify Center": "Zentratu",
-    "Justify Full": "Justifikatu",
-    "Justify Left": "Ezkerretara lerrokatu",
-    "Justify Right": "Eskuinetara lerrokatu",
-    "Keyboard shortcuts": "Laster-teklak",
-    "Loading in progress. Please wait!": "Kargatzen. Itxaron mesedez",
-    "Loading plugin $plugin": "$plugin plugina kargatzen",
-    "Normal": "Normala",
-    "Ordered List": "Zerrenda ordenatua",
-    "Paste from clipboard": "Itsatsi arbelean dagoena",
-    "Path": "Bidea",
-    "Print document": "Dokumentua inprimatu",
-    "Redoes your last action": "Berregin",
-    "Register plugin $plugin": "$plugin plugina erregistratu",
-    "Remove formatting": "Formatoa kendu",
-    "Save as": "Gorde honela:",
-    "Select all": "Dena aukeratu",
-    "Set format to paragraph": "Formatua ezarri paragrafoari",
-    "Split Block": "Blokea zatitu",
-    "Strikethrough": "Marratua",
-    "Subscript": "Azpindizea",
-    "Superscript": "Goi-indizea",
-    "The editor provides the following key combinations:": "Editoreak ondorengo tekla-konbinazioak eskaintzen ditu:",
-    "Toggle Borders": "Ertzak trukatu",
-    "Toggle HTML Source": "Ikusi dokumentua HTML-n",
-    "Underline": "Azpimarratua",
-    "Undoes your last action": "Desegin",
-    "Would you like to clear font colours?": "Letra-tipoen koloreak ezabatu nahi al dituzu?",
-    "Would you like to clear font sizes?": "Letra-tipoen neurriak ezabatu nahi al dituzu?",
-    "Would you like to clear font typefaces?": "Letra-tipoak ezabatu nahi al dituzu?",
-    "You are in TEXT MODE.  Use the [<>] button to switch back to WYSIWYG.": "TESTU eran ari zara. Erabil ezazu [<>] botoia WYSIWIG erara itzultzeko.",
-    "insert linebreak": "Lerro-jauzia txertatu",
-    "new paragraph": "Paragrafo berria",
-    "__OBSOLETE__": {
-        "Absbottom": "Irudiaren behekaldean",
-        "Absmiddle": "Irudiaren erdian",
-        "Alignment:": "Lerrokatzea:",
-        "Alternate text:": "Testu alternatiboa:",
-        "Baseline": "Irudiaren oinean",
-        "Border thickness:": "Ertzaren lodiera:",
-        "Bottom": "Behean",
-        "Cancel": "Utzi",
-        "Cell padding:": "Gelaxkaren betegarria:",
-        "Cell spacing:": "Gelaxka-tartea:",
-        "Click a color...": "Kolore bat aukeratu...",
-        "Color: ": "Kolorea: ",
-        "Cols:": "Zutabeak:",
-        "Em": "Em",
-        "Enlarge Editor": "Editorea handitu",
-        "Enter the image URL here": "Idatz ezazu irudiaren URL-a hemen",
-        "Fixed width columns": "Zabalera finkodun zutabeak",
-        "For browsers that don't support images": "Irudirik onartzen ez duten nabigatzaileentzat",
-        "Horizontal padding": "Betegarri horizontala",
-        "Horizontal:": "Horizontala:",
-        "Image Preview:": "Irudiaren aurrebista:",
-        "Image URL:": "Irudiaren URL-a:",
-        "Insert Image": "Irudia txertatu",
-        "Insert/Modify Link": "Lotura txertatu/aldatu",
-        "Layout": "Diseinua",
-        "Leave empty for no border": "Uztazu hutsik ertzik ez sortzeko",
-        "Left": "Ezkerretara",
-        "Middle": "Erdian",
-        "New window (_blank)": "Lehio berrian (_blank)",
-        "None (use implicit)": "Bat ere ez (implizituki erabili)",
-        "Not set": "Ez gaitua",
-        "Number of columns": "Zutabe-kopurua",
-        "Number of rows": "Lerro-kopurua",
-        "OK": "Ados",
-        "Other": "Beste bat",
-        "Percent": "Portzentaia",
-        "Pixels": "Pixelak",
-        "Positioning of this image": "Irudiaren kokapena",
-        "Positioning of this table": "Taula honen kokapena",
-        "Preview": "Aurrebista",
-        "Preview the image in a new window": "Aurreikusi irudia beste lehio batean",
-        "Register bottom panel": "Beheko panela erregistratu",
-        "Register left panel": "Ezker-panela erregistratu",
-        "Register right panel": "Eskuin-panela erregistratu",
-        "Register top panel": "Goiko panela erregistratu",
-        "Right": "Eskuinetara",
-        "Rows:": "Lerroak:",
-        "Same frame (_self)": "Frame berean (_self)",
-        "Sample": "Lagina",
-        "Space between adjacent cells": "Gelaxka auzokideen arteko tartea",
-        "Space between content and border in cell": "Gelaxkaren edukia eta ertzaren arteko tartea",
-        "Spacing": "Tartea",
-        "Target:": "Helburua:",
-        "Texttop": "Irudiaren goialdean",
-        "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.",
-        "Title (tooltip):": "Izenburua (argibidea):",
-        "Top": "Goian",
-        "Top frame (_top)": "Goiko frame-an (_top)",
-        "URL:": "URL-a:",
-        "Vertical padding": "Betegarri bertikala",
-        "Vertical:": "Bertikala:",
-        "Web Safe: ": "Web Safe: ",
-        "Width of the table": "Taularen zabalera",
-        "Width unit": "Zabalera-unitatea",
-        "Width:": "Zabalera:",
-        "You must enter a number of columns": "Zutabe-kopurua idatzi behar duzu",
-        "You must enter a number of rows": "Lerro-kopurua idatzi behar duzu",
-        "You must enter the URL": "URL-a idatzi behar duzu",
-        "You must enter the URL where this link points to": "Loturaren helburu den URL-a idatzi behar duzu",
-        "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.",
-        "button_bold": "de/bold.gif",
-        "button_italic": "de/italic.gif",
-        "button_underline": "de/underline.gif"
-    }
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/lang/fa.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/lang/fa.js
deleted file mode 100644
index 2f9f3b4..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/lang/fa.js
+++ /dev/null
@@ -1,157 +0,0 @@
-// I18N constants
-// LANG: "fa", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "&#8212; format &#8212;": "&#8212; قالب &#8212;",
-    "About this editor": "درباره این ویرایش گر",
-    "Address": "آدرس",
-    "Background Color": "رنگ پس زمینه",
-    "Bold": "ضخیم",
-    "Bulleted List": "فهرست گلوله ای",
-    "Clean content pasted from Word": "تمیز کردن محتوای چسبانده شده از Word",
-    "Clear Inline Font Specifications": "پاک کردن متن از مشخصات فونت",
-    "Clear MSOffice tags": "پاک کردن متن از برچسب های MSOffice",
-    "Close": "بستن",
-    "Constructing object": "ساختن شیء",
-    "Copy selection": "کپی انتخاب شده",
-    "Create Toolbar": "ساخت نوار ابزار",
-    "Current style": "شیوه کنونی",
-    "Cut selection": "بریدن انتخاب شده",
-    "Decrease Indent": "کاهش سر خط",
-    "Direction left to right": "جهت از چپ به راست",
-    "Direction right to left": "جهت از راست به چپ",
-    "ENTER": "ENTREE",
-    "Editor Help": "راهنمای ویرایشگر",
-    "Font Color": "رنگ فلم",
-    "Formatted": "قالب بندی شده",
-    "Heading 1": "تیتر 1",
-    "Heading 2": "تیتر 2",
-    "Heading 3": "تیتر 3",
-    "Heading 4": "تیتر 4",
-    "Heading 5": "تیتر 5",
-    "Heading 6": "تیتر 6",
-    "Headings": "عنوان گذاری",
-    "Help using editor": "راهنمای استفاده ویرایش گر",
-    "Horizontal Rule": "خط افقی",
-    "Increase Indent": "افزایش سر خط",
-    "Init editor size": "مقدار دهی اندازه ویرایشگر",
-    "Insert Table": "افزودن جدول",
-    "Insert Web Link": "افزودن لینک وب",
-    "Insert/Modify Image": "افزودن یا ویرایش تصویر",
-    "Insert/Overwrite": "افزودن/جانویسی",
-    "Italic": "مورب",
-    "Justify Center": "تراز در وسط",
-    "Justify Full": "تراز از چپ و راست",
-    "Justify Left": "تراز از چپ",
-    "Justify Right": "تراز در راست",
-    "Keyboard shortcuts": "میانبرهای صفحه کلید",
-    "Normal": "معمولی",
-    "Ordered List": "فهرست مرتب",
-    "Paste from clipboard": "چسباندن از تخته کار",
-    "Path": "مسیر",
-    "Print document": "چاپ سند",
-    "Redoes your last action": "انجام مجدد آخرین عمل",
-    "Register plugin $plugin": "ثبت پلاگین $plugin",
-    "Remove formatting": "حذف فرمت بندی",
-    "SHIFT-ENTER": "SHIFT+ENTREE",
-    "Save as": "ذخیره مانند...",
-    "Select all": "انتخاب همه",
-    "Set format to paragraph": "تغییر قالب به پاراگراف",
-    "Split Block": "بلاک جداسازی",
-    "Strikethrough": "رو خط",
-    "Subscript": "زیروند",
-    "Superscript": "بالاوند",
-    "The editor provides the following key combinations:": "ویرایشگر استفاده از کلید های گروهی زیر را مسیر می سازد :",
-    "Toggle Borders": "فعال/غیر فعال کردن لبه ها",
-    "Toggle HTML Source": "مشاهده یا عدم مشاهده متن در قالب HTML",
-    "Underline": "زیر خط",
-    "Undoes your last action": "برگرداندن آخرین عمل",
-    "Would you like to clear font colours?": "آیا تمایل دارید رنگ قلم را پاک کنید؟",
-    "Would you like to clear font sizes?": "آیا تمایل دارید اندازه قلم را پاک کنید",
-    "Would you like to clear font typefaces?": "آیا تمایل دارید ظاهر فلم را پاک کنید؟",
-    "You are in TEXT MODE.  Use the [<>] button to switch back to WYSIWYG.": "در مد متنی هستید.  از دکمه [<>] استفاده نمایید تا به مد WYSIWYG برگردید.",
-    "insert linebreak": "افزودن جدا کننده خط",
-    "new paragraph": "پاراگراف جدید",
-    "__OBSOLETE__": {
-        "Absbottom": "دقیقا پایین",
-        "Absmiddle": "دقیقا وسط",
-        "Alignment:": "تراز بندی",
-        "Alternate text:": "متن جایگزین",
-        "Baseline": "ابتدای خط",
-        "Border thickness:": "ضخامت لبه",
-        "Bottom": "پایین",
-        "Cancel": "انصراف",
-        "Cell padding:": "پر کننده سلول",
-        "Cell spacing:": "فاصله سلول ها",
-        "Cols:": "ستون ها",
-        "Constructing main object": "ساختن شیء اصلی",
-        "Create StatusBar": "ساخت نوار وضعیت",
-        "Em": "Em",
-        "Enlarge Editor": "بزرگ کردن ویرایش گر",
-        "Enter the image URL here": "URL تصویر را اینجا وارد کنید",
-        "Fixed width columns": "ستون های طول ثابت",
-        "For browsers that don't support images": "برای مرورگرهایی که از تصاویر پشتیبانی نمی کنند",
-        "Generate Xinha object": "تولید شیء Xinha",
-        "Horizontal padding": "پرکننده افقی",
-        "Horizontal:": "افقی",
-        "Image Preview:": "پیش نمایش تصویر",
-        "Image URL:": "URL تصویر",
-        "Init IFrame": "مقدار دهی IFrame",
-        "Insert Image": "افزودن تصویر",
-        "Insert/Modify Link": "افزودن / ویرایش لینک",
-        "Layout": "لایه",
-        "Leave empty for no border": "برای بدون لبه خالی رها کن",
-        "Left": "چپ",
-        "Loading in progress. Please wait !": "بارگذاری در حال انجام است. لطفا صبر کنید !",
-        "Middle": "وسط",
-        "New window (_blank)": "پنجره جدید (_blank)",
-        "None (use implicit)": "هیچکدام (استفاده از بدون شرط)",
-        "Not set": "تنظیم نشده",
-        "Number of columns": "تعداد ستون ها",
-        "Number of rows": "تعداد ردیف ها",
-        "OK": "بله",
-        "Other": "سایر",
-        "Percent": "درصد",
-        "Pixels": "پیکسل ها",
-        "Positioning of this image": "موقعیت یابی تصویر",
-        "Positioning of this table": "موقعیت یابی این جدول",
-        "Preview": "پیش نمایش",
-        "Preview the image in a new window": "پیش نمایش تصویر در پنجره ای جدید",
-        "Register panel bottom": "ثبت قاب پایین",
-        "Register panel left": "ثبت قاب چپ",
-        "Register panel right": "ثبت قاب راست",
-        "Register panel top": "ثبت قاب بالا",
-        "Right": "راست",
-        "Rows:": "ردیف ها",
-        "Same frame (_self)": "فریم یکسان (_self)",
-        "Space between adjacent cells": "فاصله بین سلول های همجوار",
-        "Space between content and border in cell": "فاصله بین محتوا و لبه در سلول",
-        "Spacing": "فاصله گذاری",
-        "Target:": "هدف",
-        "Texttop": "بالای متن",
-        "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 را در صفحه کلید بزنید.",
-        "Title (tooltip):": "عنوان (راهنمای یک خطی)",
-        "Top": "بالا",
-        "Top frame (_top)": "فریم بالایی (_top)",
-        "URL:": "URL:",
-        "Vertical padding": "پرکننده عمودی",
-        "Vertical:": "عمودی",
-        "Width of the table": "طول جدول",
-        "Width unit": "واحد طول",
-        "Width:": "طول",
-        "Xinha Help": "راهنمای Xinha",
-        "You must enter a number of columns": "باید تعداد ستون ها را وارد کنید",
-        "You must enter a number of rows": "باید تعداد ردیف ها را وارد کنید",
-        "You must enter the URL": "شما باید URL را وارد کنید",
-        "You must enter the URL where this link points to": "باید URLی که این لینک به آن اشاره دارد را وارد کنید",
-        "You need to select some text before creating a link": "باید قبل از ساخت لینک ، متنی را انتخاب نمایید",
-        "Your Document is not well formed. Check JavaScript console for details.": "سند شما بدرستی قالب بندی نشده است. برای اطلاعات بیشتر پایانه نمایش جاوااسکریپت را بررسی کنید."
-    }
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/lang/fi.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/lang/fi.js
deleted file mode 100644
index 77b29d3..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/lang/fi.js
+++ /dev/null
@@ -1,46 +0,0 @@
-// I18N constants
-// LANG: "fi", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "About this editor": "Tietoja editorista",
-    "Background Color": "Taustaväri",
-    "Bold": "Lihavoitu",
-    "Bulleted List": "Luettelomerkit",
-    "Copy selection": "Kopioi maalattu",
-    "Current style": "Nykyinen tyyli",
-    "Cut selection": "Leikkaa maalattu",
-    "Decrease Indent": "Pienennä sisennystä",
-    "Font Color": "Fontin väri",
-    "Help using editor": "Näytä ohje",
-    "Horizontal Rule": "Vaakaviiva",
-    "Increase Indent": "Lisää sisennystä",
-    "Insert Table": "Lisää taulukko",
-    "Insert Web Link": "Lisää linkki",
-    "Insert/Modify Image": "Lisää kuva",
-    "Italic": "Kursivoitu",
-    "Justify Center": "Keskitä",
-    "Justify Full": "Tasaa molemmat reunat",
-    "Justify Left": "Tasaa vasemmat reunat",
-    "Justify Right": "Tasaa oikeat reunat",
-    "Ordered List": "Numerointi",
-    "Paste from clipboard": "Liitä leikepyödältä",
-    "Redoes your last action": "Palauta viimeinen toiminto",
-    "Strikethrough": "Yliviivattu",
-    "Subscript": "Alaindeksi",
-    "Superscript": "Yläindeksi",
-    "Toggle HTML Source": "HTML-lähdekoodi vs WYSIWYG",
-    "Underline": "Alleviivattu",
-    "Undoes your last action": "Peruuta viimeinen toiminto",
-    "__OBSOLETE__": {
-        "Cancel": "Peruuta",
-        "Enlarge Editor": "Suurenna editori",
-        "OK": "Hyväksy"
-    }
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/lang/fr.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/lang/fr.js
deleted file mode 100644
index 3ea48f5..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/lang/fr.js
+++ /dev/null
@@ -1,158 +0,0 @@
-// I18N constants
-// LANG: "fr", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "&#8212; format &#8212;": "&#8212; Format &#8212;",
-    "About this editor": "A propos",
-    "Address": "Adresse",
-    "Background Color": "Surlignage",
-    "Bold": "Gras",
-    "Bulleted List": "Liste à puces",
-    "Clean content pasted from Word": "Nettoyage du contenu copié depuis Word",
-    "Clear Inline Font Specifications": "Supprimer paramètres inline de la police",
-    "Clear MSOffice tags": "Supprimer tags MSOffice",
-    "Close": "Fermer",
-    "Constructing object": "Construction de l'objet",
-    "Copy selection": "Copier la sélection",
-    "Create Statusbar": "Construction de la barre de status",
-    "Create Toolbar": "Construction de la barre d'icones",
-    "Current style": "Style courant",
-    "Cut selection": "Couper la sélection",
-    "Decrease Indent": "Diminuer le retrait",
-    "Direction left to right": "Direction de gauche à droite",
-    "Direction right to left": "Direction de droite à gauche",
-    "ENTER": "ENTREE",
-    "Editor Help": "Aide de l'éditeur",
-    "Finishing": "Chargement bientôt terminé",
-    "Font Color": "Couleur de police",
-    "Formatted": "Formaté",
-    "Generate Xinha framework": "Génération de Xinha",
-    "Heading 1": "Titre 1",
-    "Heading 2": "Titre 2",
-    "Heading 3": "Titre 3",
-    "Heading 4": "Titre 4",
-    "Heading 5": "Titre 5",
-    "Heading 6": "Titre 6",
-    "Headings": "Titres",
-    "Help using editor": "Aide",
-    "Horizontal Rule": "Ligne horizontale",
-    "Increase Indent": "Augmenter le retrait",
-    "Init editor size": "Initialisation de la taille d'édition",
-    "Insert Table": "Insérer un tableau",
-    "Insert Web Link": "Insérer un lien",
-    "Insert/Modify Image": "Insérer / Modifier une image",
-    "Insert/Overwrite": "Insertion / Remplacement",
-    "Italic": "Italique",
-    "Justify Center": "Centrer",
-    "Justify Full": "Justifier",
-    "Justify Left": "Aligner à gauche",
-    "Justify Right": "Aligner à droite",
-    "Keyboard shortcuts": "Raccourcis clavier",
-    "Loading in progress. Please wait!": "Chargement en cours. Veuillez patienter!",
-    "Loading plugin $plugin": "Chargement du plugin $plugin",
-    "Normal": "Normal",
-    "Ordered List": "Liste numérotée",
-    "Paste from clipboard": "Coller depuis le presse-papier",
-    "Path": "Chemin",
-    "Print document": "Imprimer document",
-    "Redoes your last action": "Répéter la dernière action",
-    "Register plugin $plugin": "Enregistrement du plugin $plugin",
-    "Remove formatting": "Supprimer mise en forme",
-    "SHIFT-ENTER": "SHIFT+ENTREE",
-    "Save as": "Enregistrer sous",
-    "Select all": "Tout sélectionner",
-    "Set format to paragraph": "Applique le format paragraphe",
-    "Split Block": "Séparer les blocs",
-    "Strikethrough": "Barré",
-    "Subscript": "Indice",
-    "Superscript": "Exposant",
-    "The editor provides the following key combinations:": "L'éditeur fournit les combinaisons de touches suivantes :",
-    "Toggle Borders": "Afficher / Masquer les bordures",
-    "Toggle HTML Source": "Afficher / Masquer code source",
-    "Underline": "Souligné",
-    "Undoes your last action": "Annuler la dernière action",
-    "Would you like to clear font colours?": "Voulez-vous supprimer les couleurs ?",
-    "Would you like to clear font sizes?": "Voulez-vous supprimer les tailles ?",
-    "Would you like to clear font typefaces?": "Voulez-vous supprimer les types ?",
-    "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.",
-    "insert linebreak": "Insère un saut de ligne",
-    "new paragraph": "Nouveau paragraphe",
-    "__OBSOLETE__": {
-        "Absbottom": "Absbottom",
-        "Absmiddle": "Absmiddle",
-        "Alignment:": "Alignement",
-        "Alternate text:": "Texte alternatif",
-        "Baseline": "Baseline",
-        "Border thickness:": "Epaisseur de bordure",
-        "Bottom": "Bas",
-        "Cancel": "Annuler",
-        "Cell padding:": "Marge interne",
-        "Cell spacing:": "Espacement",
-        "Cols:": "Colonnes",
-        "Em": "Em",
-        "Enlarge Editor": "Agrandir l'éditeur",
-        "Enter the image URL here": "Entrer l'URL de l'image ici",
-        "Fixed width columns": "Colonnes à taille fixe",
-        "For browsers that don't support images": "Pour les navigateurs qui ne supportent pas les images",
-        "Horizontal padding": "Marge horizontale interne",
-        "Horizontal:": "Horizontal",
-        "Image Preview:": "Prévisualisation",
-        "Image URL:": "URL image",
-        "Init IFrame": "Initialisation de l'iframe",
-        "Insert Image": "Insérer une image",
-        "Insert/Modify Link": "Insérer / Modifier un lien",
-        "Layout": "Mise en page",
-        "Leave empty for no border": "Laisser vide pour pas de bordure",
-        "Left": "Gauche",
-        "Middle": "Milieu",
-        "New window (_blank)": "Nouvelle fenêtre (_blank)",
-        "None (use implicit)": "Aucune (implicite)",
-        "Not set": "Indéfini",
-        "Number of columns": "Nombre de colonnes",
-        "Number of rows": "Nombre de lignes",
-        "OK": "OK",
-        "Other": "Autre",
-        "Percent": "Pourcent",
-        "Pixels": "Pixels",
-        "Positioning of this image": "Position de l'image",
-        "Positioning of this table": "Position du tableau",
-        "Preview": "Prévisualiser",
-        "Preview the image in a new window": "Prévisualiser l'image dans une nouvelle fenêtre",
-        "Register bottom panel": "Enregistrement du panneau supérieur",
-        "Register left panel": "Enregistrement du panneau gauche",
-        "Register right panel": "Enregistrement du panneau droit",
-        "Register top panel": "Enregistrement du panneau inférieur",
-        "Right": "Droite",
-        "Rows:": "Lignes",
-        "Same frame (_self)": "Même frame (_self)",
-        "Space between adjacent cells": "Espace entre les cellules adjacentes",
-        "Space between content and border in cell": "Espace entre le contenu et la bordure d'une cellule",
-        "Spacing": "Espacement",
-        "Target:": "Cible",
-        "Texttop": "Texttop",
-        "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.",
-        "Title (tooltip):": "Texte alternatif",
-        "Top": "Haut",
-        "Top frame (_top)": "Frame principale (_top)",
-        "URL:": "URL:",
-        "Vertical padding": "Marge verticale interne",
-        "Vertical:": "Vertical",
-        "Width of the table": "Largeur du tableau",
-        "Width unit": "Unités de largeur",
-        "Width:": "Largeur",
-        "Xinha Help": "Aide Xinha",
-        "You must enter a number of columns": "Vous devez entrer le nombre de colonnes",
-        "You must enter a number of rows": "Vous devez entrer le nombre de lignes",
-        "You must enter the URL": "Vous devez entrer l'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",
-        "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."
-    }
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/lang/he.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/lang/he.js
deleted file mode 100644
index 855def6..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/lang/he.js
+++ /dev/null
@@ -1,61 +0,0 @@
-// I18N constants
-// LANG: "he", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "About this editor": "אודות עורך זה",
-    "Background Color": "צבע רקע",
-    "Bold": "מודגש",
-    "Bulleted List": "רשימה לא ממוספרת",
-    "Copy selection": "העתק בחירה",
-    "Current style": "סגנון נוכחי",
-    "Cut selection": "גזור בחירה",
-    "Decrease Indent": "הקטן כניסה",
-    "Direction left to right": "כיוון משמאל לימין",
-    "Direction right to left": "כיוון מימין לשמאל",
-    "Font Color": "צבע גופן",
-    "Help using editor": "עזרה לשימוש בעורך",
-    "Horizontal Rule": "קו אנכי",
-    "Increase Indent": "הגדל כניסה",
-    "Insert Table": "הכנס טבלה",
-    "Insert Web Link": "הכנס היפר-קישור",
-    "Insert/Modify Image": "הכנס/שנה תמונה",
-    "Italic": "נטוי",
-    "Justify Center": "ישור למרכז",
-    "Justify Full": "ישור לשורה מלאה",
-    "Justify Left": " ישור לשמאל",
-    "Justify Right": "ישור לימין",
-    "Ordered List": "רשימה ממוספרת",
-    "Paste from clipboard": "הדבק מהלוח",
-    "Path": "נתיב עיצוב",
-    "Redoes your last action": "מבצע מחדש את הפעולה האחרונה שביטלת",
-    "Strikethrough": "קו אמצע",
-    "Subscript": "כתב עילי",
-    "Superscript": "כתב תחתי",
-    "Toggle HTML Source": "שנה מצב קוד HTML",
-    "Underline": "קו תחתי",
-    "Undoes your last action": "מבטל את פעולתך האחרונה",
-    "You are in TEXT MODE.  Use the [<>] button to switch back to WYSIWYG.": "אתה במצב טקסט נקי (קוד). השתמש בכפתור [<>] כדי לחזור למצב WYSIWYG (תצוגת עיצוב).",
-    "__OBSOLETE__": {
-        "Cancel": "ביטול",
-        "Enlarge Editor": "הגדל את העורך",
-        "Insert/Modify Link": "הוסף/שנה קישור",
-        "New window (_blank)": "חלון חדש (_blank)",
-        "None (use implicit)": "ללא (השתמש ב-frame הקיים)",
-        "OK": "אישור",
-        "Other": "אחר",
-        "Same frame (_self)": "אותו frame (_self)",
-        "Target:": "יעד:",
-        "The full screen mode is known to cause problems with Internet Explorer, due to browser bugs that we weren": "מצב מסך מלא יוצר בעיות בדפדפן Internet Explorer, עקב באגים בדפדפן לא יכולנו לפתור את זה.  את/ה עלול/ה לחוות תצוגת זבל,  בעיות בתפקוד העורך ו/או קריסה של הדפדפן.  אם המערכת שלך היא Windows 9x סביר להניח שתקבל/י ",
-        "Title (tooltip):": "כותרת (tooltip):",
-        "Top frame (_top)": "Frame עליון (_top)",
-        "URL:": "URL:",
-        "You must enter the URL where this link points to": "חובה לכתוב URL שאליו קישור זה מצביע"
-    }
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/lang/hu.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/lang/hu.js
deleted file mode 100644
index a5bea8f..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/lang/hu.js
+++ /dev/null
@@ -1,61 +0,0 @@
-// I18N constants
-// LANG: "hu", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "About this editor": "Névjegy",
-    "Background Color": "Háttérszín",
-    "Bold": "Félkövér",
-    "Bulleted List": "Számozatlan lista",
-    "Copy selection": "Másolás",
-    "Current style": "Aktuális stílus",
-    "Cut selection": "Kivágás",
-    "Decrease Indent": "Behúzás csökkentése",
-    "Direction left to right": "Irány balról jobbra",
-    "Direction right to left": "Irány jobbról balra",
-    "Font Color": "Karakterszín",
-    "Help using editor": "Súgó",
-    "Horizontal Rule": "Elválasztó vonal",
-    "Increase Indent": "Behúzás növelése",
-    "Insert Table": "Táblázat beszúrása",
-    "Insert Web Link": "Hiperhivatkozás beszúrása",
-    "Insert/Modify Image": "Kép beszúrása",
-    "Italic": "Dőlt",
-    "Justify Center": "Középre zárt",
-    "Justify Full": "Sorkizárt",
-    "Justify Left": "Balra zárt",
-    "Justify Right": "Jobbra zárt",
-    "Ordered List": "Számozott lista",
-    "Paste from clipboard": "Beillesztés",
-    "Path": "Hierarchia",
-    "Redoes your last action": "Újra végrehajtás",
-    "Strikethrough": "Áthúzott",
-    "Subscript": "Alsó index",
-    "Superscript": "Felső index",
-    "Toggle HTML Source": "HTML forrás be/ki",
-    "Underline": "Aláhúzott",
-    "Undoes your last action": "Visszavonás",
-    "You are in TEXT MODE.  Use the [<>] button to switch back to WYSIWYG.": "Forrás mód. Visszaváltás [<>] gomb",
-    "__OBSOLETE__": {
-        "Cancel": "Mégsem",
-        "Enlarge Editor": "Szerkesztő külön ablakban",
-        "Insert/Modify Link": "Hivatkozás Beszúrása/Módosítása",
-        "New window (_blank)": "Új ablak (_blank)",
-        "None (use implicit)": "Nincs (use implicit)",
-        "OK": "Rendben",
-        "Other": "Más",
-        "Same frame (_self)": "Ugyanabba a keretbe (_self)",
-        "Target:": "Cél:",
-        "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 ",
-        "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"
-    }
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/lang/it.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/lang/it.js
deleted file mode 100644
index f1cf15d..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/lang/it.js
+++ /dev/null
@@ -1,61 +0,0 @@
-// I18N constants
-// LANG: "it", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "About this editor": "Informazioni su Xinha",
-    "Background Color": "Colore sfondo",
-    "Bold": "Grassetto",
-    "Bulleted List": "Lista non numerata",
-    "Copy selection": "Copia",
-    "Current style": "Stile corrente",
-    "Cut selection": "Taglia",
-    "Decrease Indent": "Diminuisci indentazione",
-    "Direction left to right": "Testo da sx a dx",
-    "Direction right to left": "Testo da dx a sx",
-    "Font Color": "Colore font",
-    "Help using editor": "Aiuto",
-    "Horizontal Rule": "Righello orizzontale",
-    "Increase Indent": "Aumenta indentazione",
-    "Insert Table": "Inserisci tabella",
-    "Insert Web Link": "Inserisci link",
-    "Insert/Modify Image": "Inserisci/modifica Immagine",
-    "Italic": "Corsivo",
-    "Justify Center": "Centrato",
-    "Justify Full": "Giustificato",
-    "Justify Left": "Sinistra",
-    "Justify Right": "Destra",
-    "Ordered List": "Lista numerata",
-    "Paste from clipboard": "Incolla",
-    "Path": "Percorso",
-    "Redoes your last action": "Ripeti ultima azione",
-    "Strikethrough": "Barrato",
-    "Subscript": "Pedice",
-    "Superscript": "Apice",
-    "Toggle HTML Source": "Visualizza/nascondi sorgente HTML",
-    "Underline": "Sottolineato",
-    "Undoes your last action": "Annulla ultima azione",
-    "You are in TEXT MODE.  Use the [<>] button to switch back to WYSIWYG.": "Sei in MODALITA",
-    "__OBSOLETE__": {
-        "Cancel": "Annulla",
-        "Enlarge Editor": "Allarga editor",
-        "Insert/Modify Link": "Inserisci/modifica link",
-        "New window (_blank)": "Nuova finestra (_blank)",
-        "None (use implicit)": "Niente (usa implicito)",
-        "OK": "OK",
-        "Other": "Altro",
-        "Same frame (_self)": "Stessa frame (_self)",
-        "Target:": "Target:",
-        "The full screen mode is known to cause problems with Internet Explorer, due to browser bugs that we weren": "E",
-        "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"
-    }
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/lang/ja.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/lang/ja.js
deleted file mode 100644
index 1692901..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/lang/ja.js
+++ /dev/null
@@ -1,163 +0,0 @@
-// I18N constants
-// LANG: "ja", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "&#8212; font &#8212;": "&#8212; フォント &#8212;",
-    "&#8212; format &#8212;": "&#8212; 書式 &#8212;",
-    "&#8212; size &#8212;": "&#8212; サイズ &#8212;",
-    "About this editor": "バージョン情報",
-    "Address": "アドレス",
-    "Background Color": "背景色",
-    "Bold": "太字",
-    "Bulleted List": "記号付き箇条書き",
-    "Clean content pasted from Word": "Wordから貼り付けられた内容の清書",
-    "Clear Inline Font Specifications": "インラインフォント指定をクリア",
-    "Clear MSOffice tags": "MSOfficeタグをクリア",
-    "Close": "閉じる",
-    "Constructing object": "オブジェクト構築中",
-    "Copy selection": "コピー",
-    "Create Statusbar": "ステータスバーの作成",
-    "Create Toolbar": "ツールバーの作成",
-    "Current style": "現在のスタイル",
-    "Cut selection": "切り取り",
-    "Decrease Indent": "インデント解除",
-    "Direction left to right": "左から右へ",
-    "Direction right to left": "右から左へ",
-    "ENTER": "ENTER",
-    "Editor Help": "エディタのヘルプ",
-    "Finishing": "完了",
-    "Font Color": "文字色",
-    "Formatted": "整形済み",
-    "Generate Xinha framework": "Xinhaフレームワーク生成中",
-    "Heading 1": "見出し1",
-    "Heading 2": "見出し2",
-    "Heading 3": "見出し3",
-    "Heading 4": "見出し4",
-    "Heading 5": "見出し5",
-    "Heading 6": "見出し6",
-    "Headings": "見出し",
-    "Help using editor": "ヘルプ",
-    "Horizontal Rule": "水平線",
-    "Increase Indent": "インデント設定",
-    "Init editor size": "エディタサイズの初期化",
-    "Insert Table": "テーブルの挿入",
-    "Insert Web Link": "リンクの挿入",
-    "Insert/Modify Image": "画像の挿入/修正",
-    "Insert/Overwrite": "挿入/上書き",
-    "Italic": "斜体",
-    "Justify Center": "中央寄せ",
-    "Justify Full": "均等割付",
-    "Justify Left": "左寄せ",
-    "Justify Right": "右寄せ",
-    "Keyboard shortcuts": "キーボードショートカット",
-    "Loading in progress. Please wait!": "ロード中です。しばらくお待ちください",
-    "Loading plugin $plugin": "ロード中プラグイン $plugin",
-    "Normal": "標準",
-    "Ordered List": "番号付き箇条書き",
-    "Paste from clipboard": "貼り付け",
-    "Path": "パス",
-    "Print document": "印刷",
-    "Redoes your last action": "やり直し",
-    "Register plugin $plugin": "登録中プラグイン $plugin",
-    "Remove formatting": "書式削除",
-    "SHIFT-ENTER": "SHIFT+ENTER",
-    "Save as": "名前をつけて保存",
-    "Select all": "すべて選択",
-    "Set format to paragraph": "段落書式の設定",
-    "Split Block": "領域分割",
-    "Strikethrough": "打ち消し線",
-    "Subscript": "下付き添え字",
-    "Superscript": "上付き添え字",
-    "The editor provides the following key combinations:": "エディタは以下のキー操作を提供しています:",
-    "Toggle Borders": "境界線の切替",
-    "Toggle HTML Source": "HTML編集モードを切替",
-    "Underline": "下線",
-    "Undoes your last action": "元に戻す",
-    "Would you like to clear font colours?": "色をクリアしますか?",
-    "Would you like to clear font sizes?": "サイズをクリアしますか?",
-    "Would you like to clear font typefaces?": "フォント名をクリアしますか?",
-    "You are in TEXT MODE.  Use the [<>] button to switch back to WYSIWYG.": "テキストモードで操作しています。WYSIWYG編集に戻るには[<>]ボタンを使ってください。",
-    "insert linebreak": "段落内改行の挿入",
-    "new paragraph": "新規段落",
-    "__OBSOLETE__": {
-        "Absbottom": "下(絶対的)",
-        "Absmiddle": "中央(絶対的)",
-        "Alignment:": "行揃え:",
-        "Alternate text:": "代替テキスト:",
-        "Baseline": "ベースライン",
-        "Border thickness:": "境界線の太さ:",
-        "Bottom": "下",
-        "Cancel": "中止",
-        "Cell padding:": "セル余白:",
-        "Cell spacing:": "セル間隔:",
-        "Click a color...": "色をクリック...",
-        "Color: ": "色: ",
-        "Cols:": "列:",
-        "Em": "相対値(em)",
-        "Enlarge Editor": "エディタを最大化",
-        "Enter the image URL here": "画像のURLをここに入力します",
-        "Fixed width columns": "列の幅を固定",
-        "For browsers that don't support images": "画像表示をサポートしないブラウザに必要です",
-        "Horizontal padding": "水平余白",
-        "Horizontal:": "水平:",
-        "Image Preview:": "画像表示:",
-        "Image URL:": "画像URL:",
-        "Insert Image": "画像の挿入",
-        "Insert/Modify Link": "リンクの挿入/修正",
-        "Layout": "レイアウト",
-        "Leave empty for no border": "境界線がない場合は空のままにする",
-        "Left": "左",
-        "Middle": "中央",
-        "New window (_blank)": "新しいウィンドウ (_blank)",
-        "None (use implicit)": "なし (デフォルトに任せる)",
-        "Not set": "なし",
-        "Number of columns": "列数",
-        "Number of rows": "行数",
-        "OK": "OK",
-        "Other": "その他",
-        "Percent": "パーセント(%)",
-        "Pixels": "ピクセル(px)",
-        "Positioning of this image": "画像の配置",
-        "Positioning of this table": "このテーブルの配置",
-        "Preview": "表示",
-        "Preview the image in a new window": "ウィンドウで画像を表示",
-        "Register bottom panel": "登録 下パネル",
-        "Register left panel": "登録 左パネル",
-        "Register right panel": "登録 右パネル",
-        "Register top panel": "登録 上パネル",
-        "Right": "右",
-        "Rows:": "行:",
-        "Same frame (_self)": "自己フレーム内 (_self)",
-        "Sample": "サンプル",
-        "Space between adjacent cells": "隣接するセル間の距離",
-        "Space between content and border in cell": "セル内における内容と境界線との距離",
-        "Spacing": "間隔",
-        "Target:": "ターゲット:",
-        "Texttop": "テキスト上部",
-        "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キーを押して直接貼り付けてください。",
-        "Title (tooltip):": "タイトル:",
-        "Top": "上",
-        "Top frame (_top)": "最上位フレーム (_top)",
-        "URL:": "URL:",
-        "Vertical padding": "垂直余白",
-        "Vertical:": "垂直:",
-        "Web Safe: ": "Webセーフ: ",
-        "Width of the table": "テーブルの幅",
-        "Width unit": "幅の単位",
-        "Width:": "幅:",
-        "Xinha Help": "ヘルプ",
-        "You must enter a number of columns": "列数を入力してください",
-        "You must enter a number of rows": "行数を入力してください",
-        "You must enter the URL": "URLを入力する必要があります",
-        "You must enter the URL where this link points to": "このリンクが指し示すURLを入力してください",
-        "You need to select some text before creating a link": "リンクを作成するにはテキストを選択する必要があります",
-        "Your Document is not well formed. Check JavaScript console for details.": "この文書には構文的な問題があります。詳細はJavaScriptコンソールを参照してください。"
-    }
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/lang/lc_base.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/lang/lc_base.js
deleted file mode 100644
index ecc0386..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/lang/lc_base.js
+++ /dev/null
@@ -1,141 +0,0 @@
-// I18N constants
-//
-// LANG: "en", ENCODING: UTF-8
-// Author: Translator-Name, <email@example.com>
-//
-// Last revision: 2018-04-12
-// 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).
-//
-// (Please, remove information below)
-// 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.)
-
-{
-    "&#8212; font &#8212;": "",
-    "&#8212; format &#8212;": "",
-    "&#8212; size &#8212;": "",
-    "1 (8 pt)": "",
-    "2 (10 pt)": "",
-    "3 (12 pt)": "",
-    "4 (14 pt)": "",
-    "5 (18 pt)": "",
-    "6 (24 pt)": "",
-    "7 (36 pt)": "",
-    "About this editor": "",
-    "Address": "",
-    "Arial": "",
-    "Background Color": "",
-    "Bold": "",
-    "Bulleted List": "",
-    "CTRL-0 (zero)": "",
-    "CTRL-1 .. CTRL-6": "",
-    "CTRL-A": "",
-    "CTRL-B": "",
-    "CTRL-C": "",
-    "CTRL-E": "",
-    "CTRL-I": "",
-    "CTRL-J": "",
-    "CTRL-L": "",
-    "CTRL-N": "",
-    "CTRL-R": "",
-    "CTRL-S": "",
-    "CTRL-U": "",
-    "CTRL-V": "",
-    "CTRL-X": "",
-    "CTRL-Y": "",
-    "CTRL-Z": "",
-    "Clean content pasted from Word": "",
-    "Clear Inline Font Specifications": "",
-    "Clear MSOffice tags": "",
-    "Close": "",
-    "Constructing object": "",
-    "Copy selection": "",
-    "Courier New": "",
-    "Create Statusbar": "",
-    "Create Toolbar": "",
-    "Current style": "",
-    "Cut selection": "",
-    "Decrease Indent": "",
-    "Direction left to right": "",
-    "Direction right to left": "",
-    "ENTER": "",
-    "Editor Help": "",
-    "Error Loading Xinha.  Developers, check the Error Console for information.": "",
-    "Finishing": "",
-    "Font Color": "",
-    "Formatted": "",
-    "Generate Xinha framework": "",
-    "Georgia": "",
-    "Heading 1": "",
-    "Heading 2": "",
-    "Heading 3": "",
-    "Heading 4": "",
-    "Heading 5": "",
-    "Heading 6": "",
-    "Headings": "",
-    "Help using editor": "",
-    "Horizontal Rule": "",
-    "Impact": "",
-    "Increase Indent": "",
-    "Init editor size": "",
-    "Insert Table": "",
-    "Insert Web Link": "",
-    "Insert/Modify Image": "",
-    "Insert/Overwrite": "",
-    "Italic": "",
-    "Justify Center": "",
-    "Justify Full": "",
-    "Justify Left": "",
-    "Justify Right": "",
-    "Keyboard shortcuts": "",
-    "Loading Core": "",
-    "Loading in progress. Please wait!": "",
-    "Loading plugin $plugin": "",
-    "Loading plugins": "",
-    "MS Word Cleaner": "",
-    "Normal": "",
-    "Ordered List": "",
-    "Paste from clipboard": "",
-    "Path": "",
-    "Print document": "",
-    "Redoes your last action": "",
-    "Register plugin $plugin": "",
-    "Remove formatting": "",
-    "SHIFT-ENTER": "",
-    "Save as": "",
-    "Select Color": "",
-    "Select all": "",
-    "Set format to paragraph": "",
-    "Split Block": "",
-    "Strikethrough": "",
-    "Subscript": "",
-    "Superscript": "",
-    "Tahoma": "",
-    "The editor provides the following key combinations:": "",
-    "Times New Roman": "",
-    "Toggle Borders": "",
-    "Toggle HTML Source": "",
-    "Touch here first to activate editor.": "",
-    "Underline": "",
-    "Undoes your last action": "",
-    "Verdana": "",
-    "Waiting for Iframe to load...": "",
-    "WingDings": "",
-    "Would you like to clear font colours?": "",
-    "Would you like to clear font sizes?": "",
-    "Would you like to clear font typefaces?": "",
-    "Xinha": "",
-    "You are in TEXT MODE.  Use the [<>] button to switch back to WYSIWYG.": "",
-    "insert linebreak": "",
-    "new paragraph": ""
-}
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/lang/lt.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/lang/lt.js
deleted file mode 100644
index ad1b999..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/lang/lt.js
+++ /dev/null
@@ -1,59 +0,0 @@
-// I18N constants
-// LANG: "lt", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "About this editor": "Apie redaktorių",
-    "Background Color": "Fono spalva",
-    "Bold": "Paryškinti",
-    "Bulleted List": "Suženklintas sąrašas",
-    "Copy selection": "Kopijuoti",
-    "Current style": "Dabartinis stilius",
-    "Cut selection": "Iškirpti",
-    "Decrease Indent": "Sumažinti paraštę",
-    "Font Color": "Šrifto spalva",
-    "Help using editor": "Pagalba naudojant redaktorių",
-    "Horizontal Rule": "Horizontali linija",
-    "Increase Indent": "Padidinti paraštę",
-    "Insert Table": "Įterpti lentelę",
-    "Insert Web Link": "Įterpti nuorodą",
-    "Insert/Modify Image": "Įterpti paveiksliuką",
-    "Italic": "Kursyvas",
-    "Justify Center": "Lygiavimas pagal centrą",
-    "Justify Full": "Lygiuoti pastraipą",
-    "Justify Left": "Lygiavimas pagal kairę",
-    "Justify Right": "Lygiavimas pagal dešinę",
-    "Ordered List": "Numeruotas sąrašas",
-    "Paste from clipboard": "Įterpti",
-    "Path": "Kelias",
-    "Redoes your last action": "Pakartoja paskutinį atšauktą jūsų veiksmą",
-    "Strikethrough": "Perbraukti",
-    "Subscript": "Apatinis indeksas",
-    "Superscript": "Viršutinis indeksas",
-    "Toggle HTML Source": "Perjungti į HTML/WYSIWYG",
-    "Underline": "Pabraukti",
-    "Undoes your last action": "Atšaukia paskutini jūsų veiksmą",
-    "You are in TEXT MODE.  Use the [<>] button to switch back to WYSIWYG.": "Jūs esete teksto režime.  Naudokite [<>] mygtuką grįžimui į WYSIWYG.",
-    "__OBSOLETE__": {
-        "Cancel": "Atšaukti",
-        "Enlarge Editor": "Išplėstas redagavimo ekranas/Enlarge Editor",
-        "Insert/Modify Link": "Idėti/Modifikuoti",
-        "New window (_blank)": "Naujas langas (_blank)",
-        "None (use implicit)": "None (use implicit)",
-        "OK": "OK",
-        "Other": "Kitas",
-        "Same frame (_self)": "Same frame (_self)",
-        "Target:": "Target:",
-        "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",
-        "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"
-    }
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/lang/lv.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/lang/lv.js
deleted file mode 100644
index 1a51ab8..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/lang/lv.js
+++ /dev/null
@@ -1,48 +0,0 @@
-// I18N constants
-// LANG: "lv", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "About this editor": "Par ðo rediìçtâju",
-    "Background Color": "Fona krâsa",
-    "Bold": "Trekniem burtiem",
-    "Bulleted List": "Saraksts",
-    "Copy selection": "Kopçt iezîmçto",
-    "Current style": "Patreizçjais stils",
-    "Cut selection": "Izgriezt iezîmçto",
-    "Decrease Indent": "Samazinât atkâpi",
-    "Font Color": "Burtu krâsa",
-    "Help using editor": "Rediìçtâja palîgs",
-    "Horizontal Rule": "Horizontâla atdalîtâjsvîtra",
-    "Increase Indent": "Palielinât atkâpi",
-    "Insert Table": "Ievietot tabulu",
-    "Insert Web Link": "Ievietot hipersaiti",
-    "Insert/Modify Image": "Ievietot attçlu",
-    "Italic": "Kursîvâ",
-    "Justify Center": "Izlîdzinât centrâ",
-    "Justify Full": "Izlîdzinât pa visu lapu",
-    "Justify Left": "Izlîdzinât pa kreisi",
-    "Justify Right": "Izlîdzinât pa labi",
-    "Ordered List": "Numurçts saraksts",
-    "Paste from clipboard": "Ievietot iezîmçto",
-    "Path": "Ceïð",
-    "Redoes your last action": "Atkârtot pçdçjo darbîbu",
-    "Strikethrough": "Pârsvîtrots",
-    "Subscript": "Novietot zem rindas",
-    "Superscript": "Novietot virs rindas",
-    "Toggle HTML Source": "Skatît HTML kodu",
-    "Underline": "Pasvîtrots",
-    "Undoes your last action": "Atcelt pçdçjo darbîbu",
-    "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.",
-    "__OBSOLETE__": {
-        "Cancel": "Atcelt",
-        "Enlarge Editor": "Palielinât Rediìçtâju",
-        "OK": "Labi"
-    }
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/lang/merged/__new__.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/lang/merged/__new__.js
deleted file mode 100644
index f3673e9..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/lang/merged/__new__.js
+++ /dev/null
@@ -1,1503 +0,0 @@
-// Xinha Language Combined Translation File
-//
-// LANG: "NEW", ENCODING: UTF-8
-//
-// INSTRUCTIONS TO TRANSLATORS
-// ===========================================================================
-//
-// Your translation must be in UTF-8 Character Encoding.
-//
-// This is a JSON encoded file (plus comments), strings should be double-quote
-// only, do not use single quotes to surround strings - "hello", not 'hello'
-// do not have a trailing comma after the last entry in a section.
-//
-// Only full line comments are allowed (that a comments occupy entire lines).
-//
-// Search for the __NEW_TRANSLATIONS__ section below, this is where you will
-// want to focus, this section includes things that do not presently have a 
-// translation or for which the translation needs to be checked for accuracy.
-//
-// In the New Translations section a translation string is one of the following
-//
-//  "English String Here" : ""
-//     This means it is not translated yet, add your translation...
-//     "English String Here" : "Klingon String Here"
-//
-//  "English String Here" : "Translated String Here"
-//     This means that an existing translation for this string, in some other
-//     section has been found, and used.  Check that it is approprite for this
-//     section and if it is, that's fine leave it as is, otherwise change as
-//     appropriate.
-//
-//  "English String Here" : "<<AnotherSection>>"
-//     This means use the same translation for this string as <<AnotherSection>>
-//     this saves you re-tranlating strings.  If the Context of this section
-//     and the context of AnotherSection seem the same, that's fine leave it
-//     using that translation, but if this section needs a different translation, 
-//     you can provide it by replacing the link (<<AnotherSection>>) with that
-//     new translation.  For example - a "Table" in say "DataPlugin" is 
-//     perhaps translated differently to "Table" in "FurniturePlugin".
-//
-// TESTING YOUR TRANSLATION
-// ===========================================================================
-// Simply place your translation file on your webserver somewhere for example
-//
-//   /xinha/lang/merged/NEW.js
-//
-// and then tell Xinha where to get it (before loading XinhaCore.js) by 
-//
-//  _editor_lang              = 'NEW';
-//  _editor_lang_merged_file  = '/xinha/lang/merged/NEW.js';
-//
-// Xinha will load your new language definition.
-//
-// SUBMITTING YOUR TRANSLATION
-// ===========================================================================
-// Simply create a Ticket on the Xinha website and attach your translation 
-// file.
-//
-// The Xinha developers will take your file and use the 
-//     contrib/lc_split_merged_file.php
-// script to load it into the Xinha distribution.
-
-{
-    "__NEW_TRANSLATIONS__": {
-        "Abbreviation": {
-            "Abbreviation": "",
-            "Cancel": "",
-            "Delete": "",
-            "Expansion:": "",
-            "OK": ""
-        },
-        "AboutBox": {
-            "About this editor": "<<Xinha>>",
-            "Close": "<<Xinha>>"
-        },
-        "CharCounter": {
-            "... in progress": "",
-            "Chars": "",
-            "HTML": "",
-            "Words": ""
-        },
-        "CharacterMap": {
-            "Insert special character": ""
-        },
-        "ColorPicker": {
-            "Click a color...": "",
-            "Color: ": "",
-            "Sample": "",
-            "Web Safe: ": "",
-            "Close": "<<Xinha>>",
-            "OK": "<<Abbreviation>>"
-        },
-        "ContextMenu": {
-            "_Delete Row": "",
-            "_Image Properties...": "",
-            "_Modify Link...": "",
-            "_Remove Link...": "",
-            "_Table Properties...": "",
-            "C_ell Properties...": "",
-            "Chec_k Link...": "",
-            "Copy": "",
-            "Create a link": "",
-            "Current URL is": "",
-            "Cut": "",
-            "De_lete Column": "",
-            "Delete Cell": "",
-            "Delete the current column": "",
-            "Delete the current row": "",
-            "How did you get here? (Please report!)": "",
-            "I_nsert Row Before": "",
-            "In_sert Row After": "",
-            "Insert _Column Before": "",
-            "Insert a new column after the current one": "",
-            "Insert a new column before the current one": "",
-            "Insert a new row after the current one": "",
-            "Insert a new row before the current one": "",
-            "Insert a paragraph after the current node": "",
-            "Insert a paragraph before the current node": "",
-            "Insert C_olumn After": "",
-            "Insert Cell After": "",
-            "Insert Cell Before": "",
-            "Insert paragraph after": "",
-            "Insert paragraph before": "",
-            "Link points to:": "",
-            "Make lin_k...": "",
-            "Merge Cells": "",
-            "Opens this link in a new window": "",
-            "Paste": "",
-            "Please confirm that you want to remove this element:": "",
-            "Please confirm that you want to unlink this element.": "",
-            "Remove the $elem Element...": "",
-            "Remove this node from the document": "",
-            "Ro_w Properties...": "",
-            "Show the image properties dialog": "",
-            "Show the Table Cell Properties dialog": "",
-            "Show the Table Properties dialog": "",
-            "Show the Table Row Properties dialog": "",
-            "Unlink the current element": "",
-            "Justify Center": "<<Xinha>>",
-            "Justify Full": "<<Xinha>>",
-            "Justify Left": "<<Xinha>>",
-            "Justify Right": "<<Xinha>>"
-        },
-        "CreateLink": {
-            "Are you sure you wish to remove this link?": "",
-            "Insert/Modify Link": "",
-            "New window (_blank)": "",
-            "None (use implicit)": "",
-            "Other": "",
-            "Same frame (_self)": "",
-            "Target:": "",
-            "Title (tooltip):": "",
-            "Top frame (_top)": "",
-            "URL:": "",
-            "You need to select some text before creating a link": "",
-            "Cancel": "<<Abbreviation>>",
-            "OK": "<<Abbreviation>>"
-        },
-        "DefinitionList": {
-            "definition description": "",
-            "definition list": "",
-            "definition term": ""
-        },
-        "Dialogs": {
-            "Some Text Here": ""
-        },
-        "DynamicCSS": {
-            "Choose stylesheet": "",
-            "Default": "",
-            "Undefined": ""
-        },
-        "EditTag": {
-            "Edit HTML for selected text": "",
-            "Edit Tag By Peg": "",
-            "Tag Editor": "",
-            "Cancel": "<<Abbreviation>>",
-            "OK": "<<Abbreviation>>"
-        },
-        "Equation": {
-            "!=": "",
-            "!in": "",
-            "&gt;-": "",
-            "&gt;=": "",
-            "&lt;=": "",
-            "&lt;=&gt;": "",
-            "&lt;x&gt;": "",
-            "&nbsp; `!` &nbsp;": "",
-            "&nbsp; `.` &nbsp;": "",
-            "&nbsp; `0` &nbsp;": "",
-            "&nbsp; `2` &nbsp;": "",
-            "&nbsp; `3` &nbsp;": "",
-            "&nbsp; `4` &nbsp;": "",
-            "&nbsp; `5` &nbsp;": "",
-            "&nbsp; `6` &nbsp;": "",
-            "&nbsp; `7` &nbsp;": "",
-            "&nbsp; `8` &nbsp;": "",
-            "&nbsp; `9` &nbsp;": "",
-            "&nbsp; `e` &nbsp;": "",
-            "&nbsp;&nbsp;`1` &nbsp;": "",
-            "&nbsp;`+{::}`&nbsp;": "",
-            "&nbsp;`-:\\ `": "",
-            "&nbsp;`-{::}`&nbsp;": "",
-            "&nbsp;`C`&nbsp;": "",
-            "&nbsp;`cos`": "",
-            "&nbsp;`ln`&nbsp;": "",
-            "&nbsp;`pi` &nbsp;": "",
-            "&nbsp;`sin`": "",
-            "&nbsp;`tan`": "",
-            "&nbsp;`times`&nbsp;": "",
-            "&quot;text&quot;": "",
-            "'+formula+'": "",
-            "((n),(k))": "",
-            "(x+1)/(x-1)": "",
-            "*": "",
-            "**": "",
-            "+-": "",
-            "-&gt;": "",
-            "-&lt;": "",
-            "-:": "",
-            "-=": "",
-            "//": "",
-            "/_": "",
-            ":.": "",
-            "=&gt;": "",
-            "@": "",
-            "[[a,b],[c,d]]": "",
-            "\\\\": "",
-            "\\nClick in the box to use your keyboard or use the buttons\\n": "",
-            "^^": "",
-            "^^^": "",
-            "__|": "",
-            "_|_": "",
-            "`!=`": "",
-            "`!in`": "",
-            "`&and;`": "",
-            "`&cap;`": "",
-            "`&cup;`": "",
-            "`&gt;-`": "",
-            "`&gt;=`": "",
-            "`&lt;=&gt;`": "",
-            "`&lt;=`": "",
-            "`&lt;x&gt;`": "",
-            "`&or;`": "",
-            "`&quot;text&quot;`": "",
-            "`((n),(k))`": "",
-            "`(x+1)/(x-1)`": "",
-            "`**`": "",
-            "`*`": "",
-            "`+-`": "",
-            "`-&gt;`": "",
-            "`-&lt;`": "",
-            "`-:`": "",
-            "`-=`": "",
-            "`//`": "",
-            "`/_`": "",
-            "`:.`": "",
-            "`=&gt;`": "",
-            "`@`": "",
-            "`[[a,b],[c,d]]`": "",
-            "`\\\\`": "",
-            "`__|`": "",
-            "`_|_`": "",
-            "`AA`": "",
-            "`aleph`": "",
-            "`alpha`": "",
-            "`and`": "",
-            "`bara`": "",
-            "`bba`": "",
-            "`bbba`": "",
-            "`beta`": "",
-            "`CC`": "",
-            "`cca`": "",
-            "`chi`": "",
-            "`darr`": "",
-            "`ddota`": "",
-            "`del`": "",
-            "`Delta`": "",
-            "`delta`": "",
-            "`diamond`": "",
-            "`dota`": "",
-            "`dy/dx`": "",
-            "`EE`": "",
-            "`epsi`": "",
-            "`eta`": "",
-            "`fra`": "",
-            "`Gamma`": "",
-            "`gamma`": "",
-            "`grad`": "",
-            "`hArr`": "",
-            "`harr`": "",
-            "`hata`": "",
-            "`if`": "",
-            "`in`": "",
-            "`int`": "",
-            "`iota`": "",
-            "`kappa`": "",
-            "`Lambda`": "",
-            "`lambda`": "",
-            "`larr`": "",
-            "`lArr`": "",
-            "`lim_(x-&gt;oo)`": "",
-            "`log`": "",
-            "`mu`": "",
-            "`NN`": "",
-            "`nn`": "",
-            "`not`": "",
-            "`nu`": "",
-            "`o+`": "",
-            "`o.`": "",
-            "`O/`": "",
-            "`oint`": "",
-            "`Omega`": "",
-            "`omega`": "",
-            "`oo`": "",
-            "`or`": "",
-            "`ox`": "",
-            "`phi`": "",
-            "`Phi`": "",
-            "`Pi`": "",
-            "`pi`": "",
-            "`prod`": "",
-            "`prop`": "",
-            "`psi`": "",
-            "`Psi`": "",
-            "`QQ`": "",
-            "`quad`": "",
-            "`rArr`": "",
-            "`rho`": "",
-            "`root(n)(x)`": "",
-            "`RR`": "",
-            "`sfa`": "",
-            "`Sigma`": "",
-            "`sigma`": "",
-            "`sqrt(x)`": "",
-            "`square`": "",
-            "`stackrel(-&gt;)(+)`": "",
-            "`sub`": "",
-            "`sube`": "",
-            "`sum`": "",
-            "`sup`": "",
-            "`supe`": "",
-            "`tau`": "",
-            "`theta`": "",
-            "`Theta`": "",
-            "`TT`": "",
-            "`tta`": "",
-            "`uarr`": "",
-            "`ula`": "",
-            "`upsilon`": "",
-            "`uu`": "",
-            "`veca`": "",
-            "`vv`": "",
-            "`x_(mn)`": "",
-            "`xi`": "",
-            "`Xi`": "",
-            "`xx`": "",
-            "`zeta`": "",
-            "`ZZ`": "",
-            "`|-&gt;`": "",
-            "`|--`": "",
-            "`|==`": "",
-            "`|__`": "",
-            "`|~`": "",
-            "`~=`": "",
-            "`~|`": "",
-            "`~~`": "",
-            "AA": "",
-            "aleph": "",
-            "alpha": "",
-            "and": "",
-            "AsciiMath Formula Input": "",
-            "AsciiMathML Example": "",
-            "bara": "",
-            "Based on ASCIIMathML by": "",
-            "bba": "",
-            "bbba": "",
-            "beta": "",
-            "CC": "",
-            "cca": "",
-            "chi": "",
-            "darr": "",
-            "ddota": "",
-            "del": "",
-            "delta": "",
-            "Delta": "",
-            "diamond": "",
-            "dota": "",
-            "dy/dx": "",
-            "EE": "",
-            "epsi": "",
-            "eta": "",
-            "For more information on AsciiMathML visit this page:": "",
-            "Formula Editor": "",
-            "fra": "",
-            "gamma": "",
-            "Gamma": "",
-            "grad": "",
-            "hArr": "",
-            "harr": "",
-            "hata": "",
-            "if": "",
-            "in": "",
-            "Input": "",
-            "int": "",
-            "int_a^bf(x)dx": "",
-            "iota": "",
-            "kappa": "",
-            "lambda": "",
-            "Lambda": "",
-            "lArr": "",
-            "larr": "",
-            "lim_(x-&gt;oo)": "",
-            "mu": "",
-            "nn": "",
-            "NN": "",
-            "nnn": "",
-            "not": "",
-            "nu": "",
-            "o+": "",
-            "o.": "",
-            "O/": "",
-            "oint": "",
-            "Omega": "",
-            "omega": "",
-            "oo": "",
-            "or": "",
-            "ox": "",
-            "Phi": "",
-            "phi": "",
-            "pi": "",
-            "Pi": "",
-            "Preview": "",
-            "prod": "",
-            "prop": "",
-            "psi": "",
-            "Psi": "",
-            "QQ": "",
-            "quad": "",
-            "rArr": "",
-            "rho": "",
-            "root(n)(x)": "",
-            "RR": "",
-            "sfa": "",
-            "Sigma": "",
-            "sigma": "",
-            "sqrt(x)": "",
-            "square": "",
-            "stackrel(-&gt;)(+)": "",
-            "sub": "",
-            "sube": "",
-            "sum": "",
-            "sum_(n=1)^oo": "",
-            "sup": "",
-            "supe": "",
-            "tau": "",
-            "Theta": "",
-            "theta": "",
-            "TT": "",
-            "tta": "",
-            "uarr": "",
-            "ula": "",
-            "upsilon": "",
-            "uu": "",
-            "uuu": "",
-            "veca": "",
-            "vv": "",
-            "vvv": "",
-            "x^(m+n)": "",
-            "x_(mn)": "",
-            "Xi": "",
-            "xi": "",
-            "xx": "",
-            "zeta": "",
-            "ZZ": "",
-            "|-&gt;": "",
-            "|--": "",
-            "|==": "",
-            "|__": "",
-            "|~": "",
-            "~=": "",
-            "~|": "",
-            "~~": "",
-            "Cancel": "<<Abbreviation>>",
-            "OK": "<<Abbreviation>>"
-        },
-        "FancySelects": {
-            "'+opt.text+'": ""
-        },
-        "FindReplace": {
-            "';\r\n  var tagc = '": "",
-            "Case sensitive search": "",
-            "Clear": "",
-            "Done": "",
-            "Enter the text you want to find": "",
-            "Find and Replace": "",
-            "found item": "",
-            "found items": "",
-            "Highlight": "",
-            "Inform a replacement word": "",
-            "Next": "",
-            "not found": "",
-            "Options": "",
-            "Replace with:": "",
-            "replaced item": "",
-            "replaced items": "",
-            "Search for:": "",
-            "Substitute all occurrences": "",
-            "Substitute this occurrence?": "",
-            "Undo": "",
-            "Whole words only": ""
-        },
-        "FormOperations": {
-            "Enter the name for new option.": "",
-            "Form Editor": "",
-            "Insert a check box.": "",
-            "Insert a Form.": "",
-            "Insert a multi-line text field.": "",
-            "Insert a radio button.": "",
-            "Insert a select field.": "",
-            "Insert a submit/reset button.": "",
-            "Insert a text, password or hidden field.": "",
-            "Message Sent": "",
-            "Please Select...": ""
-        },
-        "Forms": {
-            "'onClick'=": "",
-            "Access Key:": "",
-            "Action URL:": "",
-            "Button Script": "",
-            "Checked": "",
-            "Columns:": "",
-            "Default text (optional)": "",
-            "Dimensions": "",
-            "Disabled": "",
-            "Encoding:": "",
-            "For Control:": "",
-            "Form": "",
-            "Form Element: FIELDSET": "",
-            "Form Element: INPUT": "",
-            "Form Element: LABEL": "",
-            "Form Element: SELECT": "",
-            "Form Element: TEXTAREA": "",
-            "Form handler script": "",
-            "Form Name:": "",
-            "Get": "",
-            "Hard": "",
-            "Height in number of rows": "",
-            "HTML-Form to CGI (default)": "",
-            "Image source": "",
-            "Image URL:": "",
-            "Initial Text:": "",
-            "Insert/Edit Form": "",
-            "Insert/Edit Form Element FIELDSET": "",
-            "Insert/Edit Form Element INPUT": "",
-            "Insert/Edit Form Element LABEL": "",
-            "Insert/Edit Form Element SELECT": "",
-            "Insert/Edit Form Element TEXTAREA": "",
-            "Javascript for button click": "",
-            "Label:": "",
-            "Legend:": "",
-            "Max length:": "",
-            "Maximum number of characters accepted": "",
-            "Method:": "",
-            "multipart Form Data (File-Upload)": "",
-            "Name": "",
-            "Name of the form input": "",
-            "Name of the form select": "",
-            "name of the textarea": "",
-            "Name/ID:": "",
-            "normal": "",
-            "nowrap": "",
-            "Off": "",
-            "Physical": "",
-            "Please enter a Label": "",
-            "Post": "",
-            "pre": "",
-            "Read Only": "",
-            "Rows:": "",
-            "Size of text box in characters": "",
-            "Size:": "",
-            "Soft": "",
-            "Tab Index:": "",
-            "Target Frame:": "",
-            "Text:": "",
-            "URL of image": "",
-            "Value of the form input": "",
-            "Value:": "",
-            "Virtual": "",
-            "Width in number of characters": "",
-            "Wrap Mode:": "",
-            "You must enter a Name": "",
-            "Cancel": "<<Abbreviation>>",
-            "OK": "<<Abbreviation>>",
-            "Options": "<<FindReplace>>"
-        },
-        "FullPage": {
-            "...": "",
-            "Alternate style-sheet:": "",
-            "Background color:": "",
-            "Character set:": "",
-            "cyrillic (ISO-8859-5)": "",
-            "cyrillic (KOI8-R)": "",
-            "cyrillic (WINDOWS-1251)": "",
-            "Description:": "",
-            "DOCTYPE:": "",
-            "Document properties": "",
-            "Document title:": "",
-            "Keywords:": "",
-            "Primary style-sheet:": "",
-            "Text color:": "",
-            "UTF-8 (recommended)": "",
-            "western (ISO-8859-1)": "",
-            "Cancel": "<<Abbreviation>>",
-            "OK": "<<Abbreviation>>"
-        },
-        "FullScreen": {
-            "Maximize/Minimize Editor": ""
-        },
-        "Gecko": {
-            "The Paste button does not work in this browser for security reasons. Press CTRL-V on your keyboard to paste directly.": ""
-        },
-        "HorizontalRule": {
-            "&#x00d7;": "",
-            "&nbsp;": "",
-            "Alignment:": "",
-            "Center": "",
-            "Color:": "",
-            "Height:": "",
-            "Insert/Edit Horizontal Rule": "",
-            "Insert/edit horizontal rule": "",
-            "Layout": "",
-            "Left": "",
-            "No shading": "",
-            "percent": "",
-            "pixels": "",
-            "Right": "",
-            "Style": "",
-            "Width:": "",
-            "Cancel": "<<Abbreviation>>",
-            "Horizontal Rule": "<<Xinha>>",
-            "OK": "<<Abbreviation>>"
-        },
-        "InlineStyler": {
-            "Background": "",
-            "Baseline": "",
-            "Border": "",
-            "Bottom": "",
-            "Char": "",
-            "Collapsed borders": "",
-            "CSS Style": "",
-            "FG Color": "",
-            "Float": "",
-            "Justify": "",
-            "Margin": "",
-            "Middle": "",
-            "None": "",
-            "Padding": "",
-            "Text align": "",
-            "Top": "",
-            "Vertical align": "",
-            "-": "<<Equation>>",
-            "Center": "<<HorizontalRule>>",
-            "Height": "<<HorizontalRule>>",
-            "Image URL": "<<Forms>>",
-            "Layout": "<<HorizontalRule>>",
-            "Left": "<<HorizontalRule>>",
-            "percent": "<<HorizontalRule>>",
-            "pixels": "<<HorizontalRule>>",
-            "Right": "<<HorizontalRule>>",
-            "Width": "<<HorizontalRule>>"
-        },
-        "InsertAnchor": {
-            "Anchor name": "",
-            "Insert Anchor": "",
-            "Cancel": "<<Abbreviation>>",
-            "Delete": "<<Abbreviation>>",
-            "OK": "<<Abbreviation>>"
-        },
-        "InsertImage": {
-            "Absbottom": "",
-            "Absmiddle": "",
-            "Alternate text:": "",
-            "Border thickness:": "",
-            "Enter the image URL here": "",
-            "For browsers that don't support images": "",
-            "Horizontal padding": "",
-            "Horizontal:": "",
-            "Image Preview:": "",
-            "Insert Image": "",
-            "Leave empty for no border": "",
-            "Not set": "",
-            "Positioning of this image": "",
-            "Preview the image in a new window": "",
-            "Spacing": "",
-            "Texttop": "",
-            "Vertical padding": "",
-            "Vertical:": "",
-            "You must enter the URL": "",
-            "Alignment:": "<<HorizontalRule>>",
-            "Baseline": "<<InlineStyler>>",
-            "Bottom": "<<InlineStyler>>",
-            "Cancel": "<<Abbreviation>>",
-            "Image URL:": "<<Forms>>",
-            "Layout": "<<HorizontalRule>>",
-            "Left": "<<HorizontalRule>>",
-            "Middle": "<<InlineStyler>>",
-            "OK": "<<Abbreviation>>",
-            "Preview": "<<Equation>>",
-            "Right": "<<HorizontalRule>>",
-            "Top": "<<InlineStyler>>"
-        },
-        "InsertNote": {
-            "Insert": "",
-            "Insert footnote": "",
-            "Insert Note": "",
-            "Cancel": "<<Abbreviation>>"
-        },
-        "InsertPagebreak": {
-            "Page break": "",
-            "Page Break": ""
-        },
-        "InsertSmiley": {
-            "Insert Smiley": ""
-        },
-        "InsertSnippet": {
-            "\\n  This is an information about something\\n": "",
-            "Hide preview": "",
-            "Insert as": "",
-            "Insert Snippet": "",
-            "InsertSnippet for Xinha": "",
-            "Link1": "",
-            "Link2": "",
-            "Link3": "",
-            "Link4": "",
-            "Link5": "",
-            "Show preview": "",
-            "This is an information about something": "",
-            "Variable": "",
-            "Cancel": "<<Abbreviation>>"
-        },
-        "InsertSnippet2": {
-            "All Categories": "",
-            "Filter": "",
-            "Insert as HTML": "",
-            "Insert as template variable": "",
-            "Only search word beginning": "",
-            "Cancel": "<<Abbreviation>>",
-            "HTML": "<<CharCounter>>",
-            "Insert Snippet": "<<InsertSnippet>>",
-            "InsertSnippet for Xinha": "<<InsertSnippet>>",
-            "Variable": "<<InsertSnippet>>"
-        },
-        "InsertTable": {
-            "Caption": "",
-            "Caption for the table": "",
-            "Cell padding:": "",
-            "Cell spacing:": "",
-            "Collapse borders:": "",
-            "Cols:": "",
-            "Em": "",
-            "Fixed width columns": "",
-            "Layou": "",
-            "Number of columns": "",
-            "Number of rows": "",
-            "Positioning of this table": "",
-            "Space between adjacent cells": "",
-            "Space between content and border in cell": "",
-            "Style of the border": "",
-            "Width of the table": "",
-            "Width unit": "",
-            "You must enter a number of columns": "",
-            "You must enter a number of rows": "",
-            "Absbottom": "<<InsertImage>>",
-            "Absmiddle": "<<InsertImage>>",
-            "Alignment:": "<<HorizontalRule>>",
-            "Baseline": "<<InlineStyler>>",
-            "Border": "<<InlineStyler>>",
-            "Border thickness:": "<<InsertImage>>",
-            "Bottom": "<<InlineStyler>>",
-            "Cancel": "<<Abbreviation>>",
-            "Insert Table": "<<Xinha>>",
-            "Layout": "<<HorizontalRule>>",
-            "Leave empty for no border": "<<InsertImage>>",
-            "Left": "<<HorizontalRule>>",
-            "Middle": "<<InlineStyler>>",
-            "Not set": "<<InsertImage>>",
-            "OK": "<<Abbreviation>>",
-            "Percent": "<<HorizontalRule>>",
-            "Pixels": "<<HorizontalRule>>",
-            "Right": "<<HorizontalRule>>",
-            "Rows:": "<<Forms>>",
-            "Spacing": "<<InsertImage>>",
-            "Texttop": "<<InsertImage>>",
-            "Top": "<<InlineStyler>>",
-            "Width:": "<<HorizontalRule>>"
-        },
-        "LangMarks": {
-            "&mdash; language &mdash;": "",
-            "', '": "",
-            "English": "",
-            "French": "",
-            "Greek": "",
-            "language select": "",
-            "Latin": ""
-        },
-        "Linker": {
-            "(px)": "",
-            "Anchor-Link": "",
-            "Anchor:": "",
-            "Email Address:": "",
-            "Email Link": "",
-            "Location Bar:": "",
-            "Menu Bar:": "",
-            "Message Template:": "",
-            "New Window": "",
-            "Ordinary Link": "",
-            "Popup Window": "",
-            "PopupWindow": "",
-            "Remove Link": "",
-            "Resizeable:": "",
-            "Same Window (jump out of frames)": "",
-            "Scrollbars:": "",
-            "Shows On Hover": "",
-            "Status Bar:": "",
-            "Subject:": "",
-            "Title:": "",
-            "Toolbar:": "",
-            "URL Link": "",
-            "You must select some text before making a new link.": "",
-            "Are you sure you wish to remove this link?": "<<CreateLink>>",
-            "Cancel": "<<Abbreviation>>",
-            "Insert/Modify Link": "<<CreateLink>>",
-            "Name:": "<<Forms>>",
-            "OK": "<<Abbreviation>>",
-            "Size:": "<<Forms>>",
-            "Target:": "<<CreateLink>>",
-            "URL:": "<<CreateLink>>"
-        },
-        "ListType": {
-            "Choose list style type (for ordered lists)": "",
-            "Decimal numbers": "",
-            "Lower greek letters": "",
-            "Lower latin letters": "",
-            "Lower roman numbers": "",
-            "Upper latin letters": "",
-            "Upper roman numbers": ""
-        },
-        "MootoolsFileManager": {
-            "Insert File Link": "",
-            "You must select some text before making a new link.": "<<Linker>>"
-        },
-        "Opera": {
-            "MARK": "",
-            "The Paste button does not work in Mozilla based web browsers (technical security reasons). Press CTRL-V on your keyboard to paste directly.": ""
-        },
-        "PasteText": {
-            "Insert text in new paragraph": "",
-            "Paste as Plain Text": "",
-            "Cancel": "<<Abbreviation>>",
-            "OK": "<<Abbreviation>>"
-        },
-        "PreserveScripts": {
-            "JavaScript": "",
-            "PHP": ""
-        },
-        "QuickTag": {
-            "',\r\n                           'cl': '": "",
-            "ATTRIBUTES": "",
-            "Colors": "",
-            "Enter the TAG you want to insert": "",
-            "No CSS class avaiable": "",
-            "Ok": "",
-            "OPTIONS": "",
-            "Quick Tag Editor": "",
-            "TAGs": "",
-            "There are some unclosed quote": "",
-            "This attribute already exists in the TAG": "",
-            "You have to select some text": "",
-            "Cancel": "<<Abbreviation>>"
-        },
-        "SaveSubmit": {
-            "in progress": "",
-            "Ready": "",
-            "Save": "",
-            "Saving...": ""
-        },
-        "SetId": {
-            "ID/Name:": "",
-            "Set Id and Name": "",
-            "Set Id/Name": "",
-            "Set ID/Name": "",
-            "Cancel": "<<Abbreviation>>",
-            "Delete": "<<Abbreviation>>",
-            "OK": "<<Abbreviation>>"
-        },
-        "SmartReplace": {
-            "ClosingDoubleQuotes": "",
-            "ClosingSingleQuote": "",
-            "Convert all quotes and dashes in the current document": "",
-            "Enable automatic replacements": "",
-            "OpeningDoubleQuotes": "",
-            "OpeningSingleQuote": "",
-            "SmartReplace": "",
-            "SmartReplace Settings": "",
-            "OK": "<<Abbreviation>>"
-        },
-        "Stylist": {
-            "Styles": ""
-        },
-        "SuperClean": {
-            "Clean bad HTML from Microsoft Word.": "",
-            "Clean Selection Only": "",
-            "Clean up HTML": "",
-            "Cleaning Scope": "",
-            "General tidy up and correction of some problems.": "",
-            "Please select from the following cleaning options...": "",
-            "Please stand by while cleaning in process...": "",
-            "Remove alignment (left/right/justify).": "",
-            "Remove all classes (CSS).": "",
-            "Remove All HTML Tags": "",
-            "Remove all styles (CSS).": "",
-            "Remove custom font sizes.": "",
-            "Remove custom text colors.": "",
-            "Remove custom typefaces (font \"styles\").": "",
-            "Remove emphasis and annotations.": "",
-            "Remove lang attributes.": "",
-            "Remove Paragraphs": "",
-            "Remove superscripts and subscripts.": "",
-            "Replace directional quote marks with non-directional quote marks.": "",
-            "Vigorously purge HTML from Microsoft Word.": "",
-            "Cancel": "<<Abbreviation>>",
-            "OK": "<<Abbreviation>>"
-        },
-        "TableOperations": {
-            "All four sides": "",
-            "Borders": "",
-            "Cell Properties": "",
-            "Cell properties": "",
-            "Cell Type:": "",
-            "Cells down": "",
-            "Cells to the right, and": "",
-            "Delete cell": "",
-            "Delete column": "",
-            "Delete row": "",
-            "Do Not Change": "",
-            "Frame and borders": "",
-            "Frames": "",
-            "Header (th)": "",
-            "Insert cell after": "",
-            "Insert cell before": "",
-            "Insert column after": "",
-            "Insert column before": "",
-            "Insert row after": "",
-            "Insert row before": "",
-            "Merge cells": "",
-            "Merge current cell with:": "",
-            "No rules": "",
-            "No sides": "",
-            "Normal (td)": "",
-            "Please click into some cell": "",
-            "Row Properties": "",
-            "Row properties": "",
-            "Rules will appear between all rows and columns": "",
-            "Rules will appear between columns only": "",
-            "Rules will appear between rows only": "",
-            "Spacing and padding": "",
-            "Split column": "",
-            "Split row": "",
-            "Summary": "",
-            "Table properties": "",
-            "Table Properties": "",
-            "The bottom side only": "",
-            "The left-hand side only": "",
-            "The right and left sides only": "",
-            "The right-hand side only": "",
-            "The top and bottom sides only": "",
-            "The top side only": "",
-            "Xinha cowardly refuses to delete the last cell in row.": "",
-            "Xinha cowardly refuses to delete the last column in table.": "",
-            "Xinha cowardly refuses to delete the last row in table.": "",
-            "Cancel": "<<Abbreviation>>",
-            "Caption": "<<InsertTable>>",
-            "Columns": "<<Forms>>",
-            "Description": "<<FullPage>>",
-            "Merge Cells": "<<ContextMenu>>",
-            "OK": "<<Abbreviation>>",
-            "Padding": "<<InlineStyler>>",
-            "pixels": "<<HorizontalRule>>",
-            "Rows": "<<Forms>>",
-            "Spacing": "<<InsertImage>>"
-        },
-        "UnsavedChanges": {
-            "You have unsaved changes in the editor": ""
-        },
-        "WebKit": {
-            "The Paste button does not work in this browser for security reasons. Press CTRL-V on your keyboard to paste directly.": "<<Gecko>>"
-        },
-        "Xinha": {
-            "&#8212; font &#8212;": "",
-            "&#8212; format &#8212;": "",
-            "&#8212; size &#8212;": "",
-            "1 (8 pt)": "",
-            "2 (10 pt)": "",
-            "3 (12 pt)": "",
-            "4 (14 pt)": "",
-            "5 (18 pt)": "",
-            "6 (24 pt)": "",
-            "7 (36 pt)": "",
-            "About this editor": "",
-            "Address": "",
-            "Arial": "",
-            "Background Color": "",
-            "Bold": "",
-            "Bulleted List": "",
-            "Clean content pasted from Word": "",
-            "Clear Inline Font Specifications": "",
-            "Clear MSOffice tags": "",
-            "Close": "",
-            "Constructing object": "",
-            "Copy selection": "",
-            "Courier New": "",
-            "Create Statusbar": "",
-            "Create Toolbar": "",
-            "CTRL-0 (zero)": "",
-            "CTRL-1 .. CTRL-6": "",
-            "CTRL-A": "",
-            "CTRL-B": "",
-            "CTRL-C": "",
-            "CTRL-E": "",
-            "CTRL-I": "",
-            "CTRL-J": "",
-            "CTRL-L": "",
-            "CTRL-N": "",
-            "CTRL-R": "",
-            "CTRL-S": "",
-            "CTRL-U": "",
-            "CTRL-V": "",
-            "CTRL-X": "",
-            "CTRL-Y": "",
-            "CTRL-Z": "",
-            "Current style": "",
-            "Cut selection": "",
-            "Decrease Indent": "",
-            "Direction left to right": "",
-            "Direction right to left": "",
-            "Editor Help": "",
-            "ENTER": "",
-            "Error Loading Xinha.  Developers, check the Error Console for information.": "",
-            "Finishing": "",
-            "Font Color": "",
-            "Formatted": "",
-            "Generate Xinha framework": "",
-            "Georgia": "",
-            "Heading 1": "",
-            "Heading 2": "",
-            "Heading 3": "",
-            "Heading 4": "",
-            "Heading 5": "",
-            "Heading 6": "",
-            "Headings": "",
-            "Help using editor": "",
-            "Horizontal Rule": "",
-            "Impact": "",
-            "Increase Indent": "",
-            "Init editor size": "",
-            "insert linebreak": "",
-            "Insert Table": "",
-            "Insert Web Link": "",
-            "Insert/Modify Image": "",
-            "Insert/Overwrite": "",
-            "Italic": "",
-            "Justify Center": "",
-            "Justify Full": "",
-            "Justify Left": "",
-            "Justify Right": "",
-            "Keyboard shortcuts": "",
-            "Loading Core": "",
-            "Loading in progress. Please wait!": "",
-            "Loading plugin $plugin": "",
-            "Loading plugins": "",
-            "MS Word Cleaner": "",
-            "new paragraph": "",
-            "Normal": "",
-            "Ordered List": "",
-            "Paste from clipboard": "",
-            "Path": "",
-            "Print document": "",
-            "Redoes your last action": "",
-            "Register plugin $plugin": "",
-            "Remove formatting": "",
-            "Save as": "",
-            "Select all": "",
-            "Select Color": "",
-            "Set format to paragraph": "",
-            "SHIFT-ENTER": "",
-            "Split Block": "",
-            "Strikethrough": "",
-            "Subscript": "",
-            "Superscript": "",
-            "Tahoma": "",
-            "The editor provides the following key combinations:": "",
-            "Times New Roman": "",
-            "Toggle Borders": "",
-            "Toggle HTML Source": "",
-            "Touch here first to activate editor.": "",
-            "Underline": "",
-            "Undoes your last action": "",
-            "Verdana": "",
-            "Waiting for Iframe to load...": "",
-            "WingDings": "",
-            "Would you like to clear font colours?": "",
-            "Would you like to clear font sizes?": "",
-            "Would you like to clear font typefaces?": "",
-            "Xinha": "",
-            "You are in TEXT MODE.  Use the [<>] button to switch back to WYSIWYG.": ""
-        },
-        "BackgroundImage": {
-            "__ TRANSLATOR NOTE __": "*** BACKGROUNDIMAGE IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***",
-            "Remove Current Background": "",
-            "Set Background": "",
-            "Set page background image": "",
-            "Set Page Background Image": "",
-            "Cancel": "<<Abbreviation>>"
-        },
-        "ClientsideSpellcheck": {
-            "__ TRANSLATOR NOTE __": "*** CLIENTSIDESPELLCHECK IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***",
-            "Spell Check using ieSpell": ""
-        },
-        "ExtendedFileManager": {
-            "__ TRANSLATOR NOTE __": "*** EXTENDEDFILEMANAGER IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***",
-            "10%": "",
-            "100%": "",
-            "200%": "",
-            "25%": "",
-            "50%": "",
-            "75%": "",
-            ">List View": "",
-            ">Thumbnail View": "",
-            "A:": "",
-            "Align": "",
-            "Alt": "",
-            "Border Color": "",
-            "Constrain Proportions": "",
-            "Crop": "",
-            "D:": "",
-            "Directory": "",
-            "Directory Up": "",
-            "Edit": "",
-            "File List": "",
-            "File Manager": "",
-            "Filename:": "",
-            "Filesize:": "",
-            "Flip Horizontal": "",
-            "Flip Image": "",
-            "Flip Vertical": "",
-            "Folder": "",
-            "GIF": "",
-            "GIF format is not supported, image editing not supported.": "",
-            "H:": "",
-            "Image Editor": "",
-            "Image Selection": "",
-            "Invalid base directory:": "",
-            "JPEG High": "",
-            "JPEG Low": "",
-            "JPEG Medium": "",
-            "Loading": "",
-            "Lock": "",
-            "Marker": "",
-            "Maximum folder size limit reached. Upload disabled.": "",
-            "Measure": "",
-            "New Folder": "",
-            "No Files Found": "",
-            "No Image Available": "",
-            "Please enter value": "",
-            "PNG": "",
-            "Preset": "",
-            "Quality:": "",
-            "Refresh": "",
-            "Rename": "",
-            "Resize": "",
-            "Rotate": "",
-            "Rotate 180 &deg;": "",
-            "Rotate 90 &deg; CCW": "",
-            "Rotate 90 &deg; CW": "",
-            "Rotate Image": "",
-            "Start X:": "",
-            "Start Y:": "",
-            "Target Window": "",
-            "Toggle marker color": "",
-            "Trash": "",
-            "Upload": "",
-            "W:": "",
-            "X:": "",
-            "Xinha Image Editor": "",
-            "Y:": "",
-            "Zoom": "",
-            "Absbottom": "<<InsertImage>>",
-            "Absmiddle": "<<InsertImage>>",
-            "Baseline": "<<InlineStyler>>",
-            "Border": "<<InlineStyler>>",
-            "Bottom": "<<InlineStyler>>",
-            "Cancel": "<<Abbreviation>>",
-            "Clear": "<<FindReplace>>",
-            "Color": "<<HorizontalRule>>",
-            "Copy": "<<ContextMenu>>",
-            "Cut": "<<ContextMenu>>",
-            "Height": "<<HorizontalRule>>",
-            "Height:": "<<HorizontalRule>>",
-            "Insert File Link": "<<MootoolsFileManager>>",
-            "Left": "<<HorizontalRule>>",
-            "Margin": "<<InlineStyler>>",
-            "Middle": "<<InlineStyler>>",
-            "New window (_blank)": "<<CreateLink>>",
-            "None (use implicit)": "<<CreateLink>>",
-            "Not set": "<<InsertImage>>",
-            "OK": "<<Abbreviation>>",
-            "Padding": "<<InlineStyler>>",
-            "Positioning of this image": "<<InsertImage>>",
-            "Preview": "<<Equation>>",
-            "Right": "<<HorizontalRule>>",
-            "Same frame (_self)": "<<CreateLink>>",
-            "Save": "<<SaveSubmit>>",
-            "Texttop": "<<InsertImage>>",
-            "Title (tooltip)": "<<CreateLink>>",
-            "Top": "<<InlineStyler>>",
-            "Top frame (_top)": "<<CreateLink>>",
-            "Width": "<<HorizontalRule>>",
-            "Width:": "<<HorizontalRule>>",
-            "You must select some text before making a new link.": "<<Linker>>"
-        },
-        "Filter": {
-            "__ TRANSLATOR NOTE __": "*** FILTER IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***",
-            "Filter": "<<InsertSnippet2>>"
-        },
-        "HtmlTidy": {
-            "__ TRANSLATOR NOTE __": "*** HTMLTIDY IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***",
-            "Auto-Tidy": "",
-            "Don't Tidy": "",
-            "HTML Tidy": "",
-            "Tidy failed.  Check your HTML for syntax errors.": ""
-        },
-        "ImageManager": {
-            "__ TRANSLATOR NOTE __": "*** IMAGEMANAGER IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***",
-            "Angle:": "",
-            "Flickr Picture List": "",
-            "Flickr Pictures": "",
-            "Flickr Selection": "",
-            "Flickr Username/Email": "",
-            "Folder Name:": "",
-            "Image Format": "",
-            "Image List": "",
-            "Keyword": "",
-            "No Images Found": "",
-            "No Photos Found": "",
-            "No Videos Found": "",
-            "This Server": "",
-            "YouTube Selection": "",
-            "YouTube Username": "",
-            "YouTube Video List": "",
-            "YouTube Videos": "",
-            "A:": "<<ExtendedFileManager>>",
-            "Absbottom": "<<InsertImage>>",
-            "Absmiddle": "<<InsertImage>>",
-            "Baseline": "<<InlineStyler>>",
-            "Bottom": "<<InlineStyler>>",
-            "Cancel": "<<Abbreviation>>",
-            "Clear": "<<FindReplace>>",
-            "Constrain Proportions": "<<ExtendedFileManager>>",
-            "Crop": "<<ExtendedFileManager>>",
-            "D:": "<<ExtendedFileManager>>",
-            "Directory": "<<ExtendedFileManager>>",
-            "Directory Up": "<<ExtendedFileManager>>",
-            "Edit": "<<ExtendedFileManager>>",
-            "Filename:": "<<ExtendedFileManager>>",
-            "Flip Horizontal": "<<ExtendedFileManager>>",
-            "Flip Image": "<<ExtendedFileManager>>",
-            "Flip Vertical": "<<ExtendedFileManager>>",
-            "GIF": "<<ExtendedFileManager>>",
-            "GIF format is not supported, image editing not supported.": "<<ExtendedFileManager>>",
-            "H:": "<<ExtendedFileManager>>",
-            "Height:": "<<HorizontalRule>>",
-            "Image Editor": "<<ExtendedFileManager>>",
-            "Image Selection": "<<ExtendedFileManager>>",
-            "Insert Image": "<<InsertImage>>",
-            "Invalid base directory:": "<<ExtendedFileManager>>",
-            "JPEG High": "<<ExtendedFileManager>>",
-            "JPEG Low": "<<ExtendedFileManager>>",
-            "JPEG Medium": "<<ExtendedFileManager>>",
-            "Left": "<<HorizontalRule>>",
-            "Lock": "<<ExtendedFileManager>>",
-            "Marker": "<<ExtendedFileManager>>",
-            "Measure": "<<ExtendedFileManager>>",
-            "Middle": "<<InlineStyler>>",
-            "New Folder": "<<ExtendedFileManager>>",
-            "No Image Available": "<<ExtendedFileManager>>",
-            "Not set": "<<InsertImage>>",
-            "OK": "<<Abbreviation>>",
-            "PNG": "<<ExtendedFileManager>>",
-            "Positioning of this image": "<<InsertImage>>",
-            "Quality:": "<<ExtendedFileManager>>",
-            "Refresh": "<<ExtendedFileManager>>",
-            "Resize": "<<ExtendedFileManager>>",
-            "Right": "<<HorizontalRule>>",
-            "Rotate": "<<ExtendedFileManager>>",
-            "Rotate 180 &deg;": "<<ExtendedFileManager>>",
-            "Rotate 90 &deg; CCW": "<<ExtendedFileManager>>",
-            "Rotate 90 &deg; CW": "<<ExtendedFileManager>>",
-            "Rotate Image": "<<ExtendedFileManager>>",
-            "Save": "<<SaveSubmit>>",
-            "Start X:": "<<ExtendedFileManager>>",
-            "Start Y:": "<<ExtendedFileManager>>",
-            "Texttop": "<<InsertImage>>",
-            "Top": "<<InlineStyler>>",
-            "Trash": "<<ExtendedFileManager>>",
-            "W:": "<<ExtendedFileManager>>",
-            "Width:": "<<HorizontalRule>>",
-            "X:": "<<ExtendedFileManager>>",
-            "Y:": "<<ExtendedFileManager>>"
-        },
-        "InsertMarquee": {
-            "__ TRANSLATOR NOTE __": "*** INSERTMARQUEE IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***",
-            "Alternate": "",
-            "Background-Color:": "",
-            "Behavior:": "",
-            "Continuous": "",
-            "Direction:": "",
-            "Insert scrolling marquee": "",
-            "Marquee Editor": "",
-            "Scroll Amount:": "",
-            "Scroll Delay:": "",
-            "Slide": "",
-            "Speed Control": "",
-            "Cancel": "<<Abbreviation>>",
-            "Height:": "<<HorizontalRule>>",
-            "Left": "<<HorizontalRule>>",
-            "Name": "<<Forms>>",
-            "Name/ID:": "<<Forms>>",
-            "OK": "<<Abbreviation>>",
-            "Right": "<<HorizontalRule>>",
-            "Text:": "<<Forms>>",
-            "Width:": "<<HorizontalRule>>"
-        },
-        "InsertPicture": {
-            "__ TRANSLATOR NOTE __": "*** INSERTPICTURE IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***",
-            "Leave empty for not defined": "",
-            " Open file in new window": "",
-            "Open file in new window": "",
-            "Upload file": "",
-            "Absbottom": "<<InsertImage>>",
-            "Absmiddle": "<<InsertImage>>",
-            "Alignment:": "<<HorizontalRule>>",
-            "Alternate text:": "<<InsertImage>>",
-            "Baseline": "<<InlineStyler>>",
-            "Border thickness:": "<<InsertImage>>",
-            "Bottom": "<<InlineStyler>>",
-            "Cancel": "<<Abbreviation>>",
-            "Enter the image URL here": "<<InsertImage>>",
-            "For browsers that don't support images": "<<InsertImage>>",
-            "Height:": "<<HorizontalRule>>",
-            "Horizontal padding": "<<InsertImage>>",
-            "Horizontal:": "<<InsertImage>>",
-            "Image Preview:": "<<InsertImage>>",
-            "Image URL:": "<<Forms>>",
-            "Insert Image": "<<InsertImage>>",
-            "Layout": "<<HorizontalRule>>",
-            "Leave empty for no border": "<<InsertImage>>",
-            "Left": "<<HorizontalRule>>",
-            "Middle": "<<InlineStyler>>",
-            "Not set": "<<InsertImage>>",
-            "OK": "<<Abbreviation>>",
-            "Positioning of this image": "<<InsertImage>>",
-            "Preview": "<<Equation>>",
-            "Preview the image in a new window": "<<InsertImage>>",
-            "Right": "<<HorizontalRule>>",
-            "Size": "<<Forms>>",
-            "Spacing": "<<InsertImage>>",
-            "Texttop": "<<InsertImage>>",
-            "Top": "<<InlineStyler>>",
-            "Vertical padding": "<<InsertImage>>",
-            "Vertical:": "<<InsertImage>>",
-            "Width:": "<<HorizontalRule>>"
-        },
-        "NoteServer": {
-            "__ TRANSLATOR NOTE __": "*** NOTESERVER IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***",
-            "120%": "",
-            "150%": "",
-            "80%": "",
-            "Add GUIDO Code in a textbox on the page": "",
-            "Add MIDI link to allow students to hear the music": "",
-            "Format": "",
-            "GUIDO Code": "",
-            "Guido code": "",
-            "Image in applet": "",
-            "Insert GUIDO Music Notation": "",
-            "MIDI File": "",
-            "Source Code": "",
-            "With Mozilla, the applet will not be visible in editor, but only in Web page after submitting.": "",
-            "Zoom :": "",
-            "100%": "<<ExtendedFileManager>>",
-            "Cancel": "<<Abbreviation>>",
-            "Image Preview": "<<InsertImage>>",
-            "OK": "<<Abbreviation>>",
-            "Options": "<<FindReplace>>",
-            "Preview": "<<Equation>>",
-            "Preview the image in a new window": "<<InsertImage>>",
-            "Zoom": "<<ExtendedFileManager>>"
-        },
-        "PSLocal": {
-            "__ TRANSLATOR NOTE __": "*** PSLOCAL IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***",
-            "Confirm": "",
-            "Enable": "",
-            "Enable Gears in order to use local document storage and configuration.": "",
-            "Enabling Local Storage": "",
-            "Install": "",
-            "Learn About Local Storage": "",
-            "This will reload the page, causing you to lose any unsaved work.  Press \"OK\" to reload.": "",
-            "Xinha uses Google Gears to enable local document storage.  With Gears installed, you can save drafts of your documents on your hard drive, configure Xinha to look the way you want, and carry this information wherever you use Xinha on the web.": "",
-            "Cancel": "<<Abbreviation>>"
-        },
-        "PSServer": {
-            "__ TRANSLATOR NOTE __": "*** PSSERVER IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***",
-            "File: ": "",
-            "Import": ""
-        },
-        "PersistentStorage": {
-            "__ TRANSLATOR NOTE __": "*** PERSISTENTSTORAGE IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***",
-            "Details": "",
-            "File Browser": "",
-            "Hello    There C ": "",
-            "Hello  There A ": "",
-            "Hello \" There B \"": "",
-            "Hello ' There D '": "",
-            "List of Places": "",
-            "New Document": "",
-            "Open": "",
-            "Open Document": "",
-            "Places": "",
-            "Please enter the name of the directory you'd like to create.": "",
-            "Save Document": "",
-            "This will erase any unsaved content.  If you're certain, please click OK to continue.": "",
-            "Web URL": "",
-            "Cancel": "<<Abbreviation>>",
-            "Confirm": "<<PSLocal>>",
-            "Copy": "<<ContextMenu>>",
-            "Delete": "<<Abbreviation>>",
-            "Directory Up": "<<ExtendedFileManager>>",
-            "File List": "<<ExtendedFileManager>>",
-            "File Manager": "<<ExtendedFileManager>>",
-            "Filename": "<<ExtendedFileManager>>",
-            "Insert": "<<InsertNote>>",
-            "Insert Image": "<<InsertImage>>",
-            "New Folder": "<<ExtendedFileManager>>",
-            "Save": "<<SaveSubmit>>",
-            "You must select some text before making a new link.": "<<Linker>>"
-        },
-        "SpellChecker": {
-            "__ TRANSLATOR NOTE __": "*** SPELLCHECKER IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***",
-            "Dictionary": "",
-            "Finished list of mispelled words": "",
-            "HTMLArea Spell Checker": "",
-            "I will open it in a new page.": "",
-            "Ignore": "",
-            "Ignore all": "",
-            "Info": "",
-            "Learn": "",
-            "No mispelled words found with the selected dictionary.": "",
-            "Original word": "",
-            "Please confirm that you want to open this link": "",
-            "Please wait.  Calling spell checker.": "",
-            "Please wait: changing dictionary to": "",
-            "pliz weit ;-)": "",
-            "Re-check": "",
-            "Replace": "",
-            "Replace all": "",
-            "Revert": "",
-            "Spell Checker": "",
-            "Spell-check": "",
-            "Suggestions": "",
-            "This will drop changes and quit spell checker.  Please confirm.": "",
-            "Cancel": "<<Abbreviation>>",
-            "OK": "<<Abbreviation>>",
-            "Replace with": "<<FindReplace>>"
-        },
-        "Template": {
-            "__ TRANSLATOR NOTE __": "*** TEMPLATE IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***",
-            "Insert template": "",
-            "Cancel": "<<Abbreviation>>"
-        },
-        "UnFormat": {
-            "__ TRANSLATOR NOTE __": "*** UNFORMAT IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***",
-            "All": "",
-            "All HTML:": "",
-            "Cleaning Area": "",
-            "Cleaning options": "",
-            "Formatting:": "",
-            "Page Cleaner": "",
-            "Select which types of formatting you would like to remove.": "",
-            "Selection": "",
-            "Cancel": "<<Abbreviation>>",
-            "OK": "<<Abbreviation>>"
-        }
-    }
-}
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/lang/merged/b5.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/lang/merged/b5.js
deleted file mode 100644
index fb4d374..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/lang/merged/b5.js
+++ /dev/null
@@ -1,1513 +0,0 @@
-// Xinha Language Combined Translation File
-//
-// LANG: "b5", ENCODING: UTF-8
-//
-// INSTRUCTIONS TO TRANSLATORS
-// ===========================================================================
-//
-// Your translation must be in UTF-8 Character Encoding.
-//
-// This is a JSON encoded file (plus comments), strings should be double-quote
-// only, do not use single quotes to surround strings - "hello", not 'hello'
-// do not have a trailing comma after the last entry in a section.
-//
-// Only full line comments are allowed (that a comments occupy entire lines).
-//
-// Search for the __NEW_TRANSLATIONS__ section below, this is where you will
-// want to focus, this section includes things that do not presently have a 
-// translation or for which the translation needs to be checked for accuracy.
-//
-// In the New Translations section a translation string is one of the following
-//
-//  "English String Here" : ""
-//     This means it is not translated yet, add your translation...
-//     "English String Here" : "Klingon String Here"
-//
-//  "English String Here" : "Translated String Here"
-//     This means that an existing translation for this string, in some other
-//     section has been found, and used.  Check that it is approprite for this
-//     section and if it is, that's fine leave it as is, otherwise change as
-//     appropriate.
-//
-//  "English String Here" : "<<AnotherSection>>"
-//     This means use the same translation for this string as <<AnotherSection>>
-//     this saves you re-tranlating strings.  If the Context of this section
-//     and the context of AnotherSection seem the same, that's fine leave it
-//     using that translation, but if this section needs a different translation, 
-//     you can provide it by replacing the link (<<AnotherSection>>) with that
-//     new translation.  For example - a "Table" in say "DataPlugin" is 
-//     perhaps translated differently to "Table" in "FurniturePlugin".
-//
-// TESTING YOUR TRANSLATION
-// ===========================================================================
-// Simply place your translation file on your webserver somewhere for example
-//
-//   /xinha/lang/merged/b5.js
-//
-// and then tell Xinha where to get it (before loading XinhaCore.js) by 
-//
-//  _editor_lang              = 'b5';
-//  _editor_lang_merged_file  = '/xinha/lang/merged/b5.js';
-//
-// Xinha will load your new language definition.
-//
-// SUBMITTING YOUR TRANSLATION
-// ===========================================================================
-// Simply create a Ticket on the Xinha website and attach your translation 
-// file.
-//
-// The Xinha developers will take your file and use the 
-//     contrib/lc_split_merged_file.php
-// script to load it into the Xinha distribution.
-
-{
-    "AboutBox": {
-        "About this editor": "關於 Xinha"
-    },
-    "ContextMenu": {
-        "Justify Center": "位置居中",
-        "Justify Full": "位置左右平等",
-        "Justify Left": "位置靠左",
-        "Justify Right": "位置靠右"
-    },
-    "HorizontalRule": {
-        "Horizontal Rule": "水平線"
-    },
-    "InsertTable": {
-        "Insert Table": "插入表格"
-    },
-    "Xinha": {
-        "About this editor": "關於 Xinha",
-        "Background Color": "背景顏色",
-        "Bold": "粗體",
-        "Bulleted List": "無序清單",
-        "Current style": "字體例子",
-        "Decrease Indent": "減小行前空白",
-        "Font Color": "文字顏色",
-        "Help using editor": "說明",
-        "Horizontal Rule": "水平線",
-        "Increase Indent": "加寬行前空白",
-        "Insert Table": "插入表格",
-        "Insert Web Link": "插入連結",
-        "Insert/Modify Image": "插入圖形",
-        "Italic": "斜體",
-        "Justify Center": "位置居中",
-        "Justify Full": "位置左右平等",
-        "Justify Left": "位置靠左",
-        "Justify Right": "位置靠右",
-        "Ordered List": "順序清單",
-        "Strikethrough": "刪除線",
-        "Subscript": "下標",
-        "Superscript": "上標",
-        "Toggle HTML Source": "切換HTML原始碼",
-        "Underline": "底線"
-    },
-    "__NEW_TRANSLATIONS__": {
-        "Abbreviation": {
-            "Abbreviation": "",
-            "Cancel": "",
-            "Delete": "",
-            "Expansion:": "",
-            "OK": ""
-        },
-        "AboutBox": {
-            "Close": "<<Xinha>>"
-        },
-        "CharCounter": {
-            "... in progress": "",
-            "Chars": "",
-            "HTML": "",
-            "Words": ""
-        },
-        "CharacterMap": {
-            "Insert special character": ""
-        },
-        "ColorPicker": {
-            "Click a color...": "",
-            "Color: ": "",
-            "Sample": "",
-            "Web Safe: ": "",
-            "Close": "<<Xinha>>",
-            "OK": "<<Abbreviation>>"
-        },
-        "ContextMenu": {
-            "_Delete Row": "",
-            "_Image Properties...": "",
-            "_Modify Link...": "",
-            "_Remove Link...": "",
-            "_Table Properties...": "",
-            "C_ell Properties...": "",
-            "Chec_k Link...": "",
-            "Copy": "",
-            "Create a link": "",
-            "Current URL is": "",
-            "Cut": "",
-            "De_lete Column": "",
-            "Delete Cell": "",
-            "Delete the current column": "",
-            "Delete the current row": "",
-            "How did you get here? (Please report!)": "",
-            "I_nsert Row Before": "",
-            "In_sert Row After": "",
-            "Insert _Column Before": "",
-            "Insert a new column after the current one": "",
-            "Insert a new column before the current one": "",
-            "Insert a new row after the current one": "",
-            "Insert a new row before the current one": "",
-            "Insert a paragraph after the current node": "",
-            "Insert a paragraph before the current node": "",
-            "Insert C_olumn After": "",
-            "Insert Cell After": "",
-            "Insert Cell Before": "",
-            "Insert paragraph after": "",
-            "Insert paragraph before": "",
-            "Link points to:": "",
-            "Make lin_k...": "",
-            "Merge Cells": "",
-            "Opens this link in a new window": "",
-            "Paste": "",
-            "Please confirm that you want to remove this element:": "",
-            "Please confirm that you want to unlink this element.": "",
-            "Remove the $elem Element...": "",
-            "Remove this node from the document": "",
-            "Ro_w Properties...": "",
-            "Show the image properties dialog": "",
-            "Show the Table Cell Properties dialog": "",
-            "Show the Table Properties dialog": "",
-            "Show the Table Row Properties dialog": "",
-            "Unlink the current element": ""
-        },
-        "CreateLink": {
-            "Are you sure you wish to remove this link?": "",
-            "Insert/Modify Link": "",
-            "New window (_blank)": "",
-            "None (use implicit)": "",
-            "Other": "",
-            "Same frame (_self)": "",
-            "Target:": "",
-            "Title (tooltip):": "",
-            "Top frame (_top)": "",
-            "URL:": "",
-            "You need to select some text before creating a link": "",
-            "Cancel": "<<Abbreviation>>",
-            "OK": "<<Abbreviation>>"
-        },
-        "DefinitionList": {
-            "definition description": "",
-            "definition list": "",
-            "definition term": ""
-        },
-        "Dialogs": {
-            "Some Text Here": ""
-        },
-        "DynamicCSS": {
-            "Choose stylesheet": "",
-            "Default": "",
-            "Undefined": ""
-        },
-        "EditTag": {
-            "Edit HTML for selected text": "",
-            "Edit Tag By Peg": "",
-            "Tag Editor": "",
-            "Cancel": "<<Abbreviation>>",
-            "OK": "<<Abbreviation>>"
-        },
-        "Equation": {
-            "!=": "",
-            "!in": "",
-            "&gt;-": "",
-            "&gt;=": "",
-            "&lt;=": "",
-            "&lt;=&gt;": "",
-            "&lt;x&gt;": "",
-            "&nbsp; `!` &nbsp;": "",
-            "&nbsp; `.` &nbsp;": "",
-            "&nbsp; `0` &nbsp;": "",
-            "&nbsp; `2` &nbsp;": "",
-            "&nbsp; `3` &nbsp;": "",
-            "&nbsp; `4` &nbsp;": "",
-            "&nbsp; `5` &nbsp;": "",
-            "&nbsp; `6` &nbsp;": "",
-            "&nbsp; `7` &nbsp;": "",
-            "&nbsp; `8` &nbsp;": "",
-            "&nbsp; `9` &nbsp;": "",
-            "&nbsp; `e` &nbsp;": "",
-            "&nbsp;&nbsp;`1` &nbsp;": "",
-            "&nbsp;`+{::}`&nbsp;": "",
-            "&nbsp;`-:\\ `": "",
-            "&nbsp;`-{::}`&nbsp;": "",
-            "&nbsp;`C`&nbsp;": "",
-            "&nbsp;`cos`": "",
-            "&nbsp;`ln`&nbsp;": "",
-            "&nbsp;`pi` &nbsp;": "",
-            "&nbsp;`sin`": "",
-            "&nbsp;`tan`": "",
-            "&nbsp;`times`&nbsp;": "",
-            "&quot;text&quot;": "",
-            "'+formula+'": "",
-            "((n),(k))": "",
-            "(x+1)/(x-1)": "",
-            "*": "",
-            "**": "",
-            "+-": "",
-            "-&gt;": "",
-            "-&lt;": "",
-            "-:": "",
-            "-=": "",
-            "//": "",
-            "/_": "",
-            ":.": "",
-            "=&gt;": "",
-            "@": "",
-            "[[a,b],[c,d]]": "",
-            "\\\\": "",
-            "\\nClick in the box to use your keyboard or use the buttons\\n": "",
-            "^^": "",
-            "^^^": "",
-            "__|": "",
-            "_|_": "",
-            "`!=`": "",
-            "`!in`": "",
-            "`&and;`": "",
-            "`&cap;`": "",
-            "`&cup;`": "",
-            "`&gt;-`": "",
-            "`&gt;=`": "",
-            "`&lt;=&gt;`": "",
-            "`&lt;=`": "",
-            "`&lt;x&gt;`": "",
-            "`&or;`": "",
-            "`&quot;text&quot;`": "",
-            "`((n),(k))`": "",
-            "`(x+1)/(x-1)`": "",
-            "`**`": "",
-            "`*`": "",
-            "`+-`": "",
-            "`-&gt;`": "",
-            "`-&lt;`": "",
-            "`-:`": "",
-            "`-=`": "",
-            "`//`": "",
-            "`/_`": "",
-            "`:.`": "",
-            "`=&gt;`": "",
-            "`@`": "",
-            "`[[a,b],[c,d]]`": "",
-            "`\\\\`": "",
-            "`__|`": "",
-            "`_|_`": "",
-            "`AA`": "",
-            "`aleph`": "",
-            "`alpha`": "",
-            "`and`": "",
-            "`bara`": "",
-            "`bba`": "",
-            "`bbba`": "",
-            "`beta`": "",
-            "`CC`": "",
-            "`cca`": "",
-            "`chi`": "",
-            "`darr`": "",
-            "`ddota`": "",
-            "`del`": "",
-            "`Delta`": "",
-            "`delta`": "",
-            "`diamond`": "",
-            "`dota`": "",
-            "`dy/dx`": "",
-            "`EE`": "",
-            "`epsi`": "",
-            "`eta`": "",
-            "`fra`": "",
-            "`Gamma`": "",
-            "`gamma`": "",
-            "`grad`": "",
-            "`hArr`": "",
-            "`harr`": "",
-            "`hata`": "",
-            "`if`": "",
-            "`in`": "",
-            "`int`": "",
-            "`iota`": "",
-            "`kappa`": "",
-            "`Lambda`": "",
-            "`lambda`": "",
-            "`larr`": "",
-            "`lArr`": "",
-            "`lim_(x-&gt;oo)`": "",
-            "`log`": "",
-            "`mu`": "",
-            "`NN`": "",
-            "`nn`": "",
-            "`not`": "",
-            "`nu`": "",
-            "`o+`": "",
-            "`o.`": "",
-            "`O/`": "",
-            "`oint`": "",
-            "`Omega`": "",
-            "`omega`": "",
-            "`oo`": "",
-            "`or`": "",
-            "`ox`": "",
-            "`phi`": "",
-            "`Phi`": "",
-            "`Pi`": "",
-            "`pi`": "",
-            "`prod`": "",
-            "`prop`": "",
-            "`psi`": "",
-            "`Psi`": "",
-            "`QQ`": "",
-            "`quad`": "",
-            "`rArr`": "",
-            "`rho`": "",
-            "`root(n)(x)`": "",
-            "`RR`": "",
-            "`sfa`": "",
-            "`Sigma`": "",
-            "`sigma`": "",
-            "`sqrt(x)`": "",
-            "`square`": "",
-            "`stackrel(-&gt;)(+)`": "",
-            "`sub`": "",
-            "`sube`": "",
-            "`sum`": "",
-            "`sup`": "",
-            "`supe`": "",
-            "`tau`": "",
-            "`theta`": "",
-            "`Theta`": "",
-            "`TT`": "",
-            "`tta`": "",
-            "`uarr`": "",
-            "`ula`": "",
-            "`upsilon`": "",
-            "`uu`": "",
-            "`veca`": "",
-            "`vv`": "",
-            "`x_(mn)`": "",
-            "`xi`": "",
-            "`Xi`": "",
-            "`xx`": "",
-            "`zeta`": "",
-            "`ZZ`": "",
-            "`|-&gt;`": "",
-            "`|--`": "",
-            "`|==`": "",
-            "`|__`": "",
-            "`|~`": "",
-            "`~=`": "",
-            "`~|`": "",
-            "`~~`": "",
-            "AA": "",
-            "aleph": "",
-            "alpha": "",
-            "and": "",
-            "AsciiMath Formula Input": "",
-            "AsciiMathML Example": "",
-            "bara": "",
-            "Based on ASCIIMathML by": "",
-            "bba": "",
-            "bbba": "",
-            "beta": "",
-            "CC": "",
-            "cca": "",
-            "chi": "",
-            "darr": "",
-            "ddota": "",
-            "del": "",
-            "delta": "",
-            "Delta": "",
-            "diamond": "",
-            "dota": "",
-            "dy/dx": "",
-            "EE": "",
-            "epsi": "",
-            "eta": "",
-            "For more information on AsciiMathML visit this page:": "",
-            "Formula Editor": "",
-            "fra": "",
-            "gamma": "",
-            "Gamma": "",
-            "grad": "",
-            "hArr": "",
-            "harr": "",
-            "hata": "",
-            "if": "",
-            "in": "",
-            "Input": "",
-            "int": "",
-            "int_a^bf(x)dx": "",
-            "iota": "",
-            "kappa": "",
-            "lambda": "",
-            "Lambda": "",
-            "lArr": "",
-            "larr": "",
-            "lim_(x-&gt;oo)": "",
-            "mu": "",
-            "nn": "",
-            "NN": "",
-            "nnn": "",
-            "not": "",
-            "nu": "",
-            "o+": "",
-            "o.": "",
-            "O/": "",
-            "oint": "",
-            "Omega": "",
-            "omega": "",
-            "oo": "",
-            "or": "",
-            "ox": "",
-            "Phi": "",
-            "phi": "",
-            "pi": "",
-            "Pi": "",
-            "Preview": "",
-            "prod": "",
-            "prop": "",
-            "psi": "",
-            "Psi": "",
-            "QQ": "",
-            "quad": "",
-            "rArr": "",
-            "rho": "",
-            "root(n)(x)": "",
-            "RR": "",
-            "sfa": "",
-            "Sigma": "",
-            "sigma": "",
-            "sqrt(x)": "",
-            "square": "",
-            "stackrel(-&gt;)(+)": "",
-            "sub": "",
-            "sube": "",
-            "sum": "",
-            "sum_(n=1)^oo": "",
-            "sup": "",
-            "supe": "",
-            "tau": "",
-            "Theta": "",
-            "theta": "",
-            "TT": "",
-            "tta": "",
-            "uarr": "",
-            "ula": "",
-            "upsilon": "",
-            "uu": "",
-            "uuu": "",
-            "veca": "",
-            "vv": "",
-            "vvv": "",
-            "x^(m+n)": "",
-            "x_(mn)": "",
-            "Xi": "",
-            "xi": "",
-            "xx": "",
-            "zeta": "",
-            "ZZ": "",
-            "|-&gt;": "",
-            "|--": "",
-            "|==": "",
-            "|__": "",
-            "|~": "",
-            "~=": "",
-            "~|": "",
-            "~~": "",
-            "Cancel": "<<Abbreviation>>",
-            "OK": "<<Abbreviation>>"
-        },
-        "FancySelects": {
-            "'+opt.text+'": ""
-        },
-        "FindReplace": {
-            "';\r\n  var tagc = '": "",
-            "Case sensitive search": "",
-            "Clear": "",
-            "Done": "",
-            "Enter the text you want to find": "",
-            "Find and Replace": "",
-            "found item": "",
-            "found items": "",
-            "Highlight": "",
-            "Inform a replacement word": "",
-            "Next": "",
-            "not found": "",
-            "Options": "",
-            "Replace with:": "",
-            "replaced item": "",
-            "replaced items": "",
-            "Search for:": "",
-            "Substitute all occurrences": "",
-            "Substitute this occurrence?": "",
-            "Undo": "",
-            "Whole words only": ""
-        },
-        "FormOperations": {
-            "Enter the name for new option.": "",
-            "Form Editor": "",
-            "Insert a check box.": "",
-            "Insert a Form.": "",
-            "Insert a multi-line text field.": "",
-            "Insert a radio button.": "",
-            "Insert a select field.": "",
-            "Insert a submit/reset button.": "",
-            "Insert a text, password or hidden field.": "",
-            "Message Sent": "",
-            "Please Select...": ""
-        },
-        "Forms": {
-            "'onClick'=": "",
-            "Access Key:": "",
-            "Action URL:": "",
-            "Button Script": "",
-            "Checked": "",
-            "Columns:": "",
-            "Default text (optional)": "",
-            "Dimensions": "",
-            "Disabled": "",
-            "Encoding:": "",
-            "For Control:": "",
-            "Form": "",
-            "Form Element: FIELDSET": "",
-            "Form Element: INPUT": "",
-            "Form Element: LABEL": "",
-            "Form Element: SELECT": "",
-            "Form Element: TEXTAREA": "",
-            "Form handler script": "",
-            "Form Name:": "",
-            "Get": "",
-            "Hard": "",
-            "Height in number of rows": "",
-            "HTML-Form to CGI (default)": "",
-            "Image source": "",
-            "Image URL:": "",
-            "Initial Text:": "",
-            "Insert/Edit Form": "",
-            "Insert/Edit Form Element FIELDSET": "",
-            "Insert/Edit Form Element INPUT": "",
-            "Insert/Edit Form Element LABEL": "",
-            "Insert/Edit Form Element SELECT": "",
-            "Insert/Edit Form Element TEXTAREA": "",
-            "Javascript for button click": "",
-            "Label:": "",
-            "Legend:": "",
-            "Max length:": "",
-            "Maximum number of characters accepted": "",
-            "Method:": "",
-            "multipart Form Data (File-Upload)": "",
-            "Name": "",
-            "Name of the form input": "",
-            "Name of the form select": "",
-            "name of the textarea": "",
-            "Name/ID:": "",
-            "normal": "",
-            "nowrap": "",
-            "Off": "",
-            "Physical": "",
-            "Please enter a Label": "",
-            "Post": "",
-            "pre": "",
-            "Read Only": "",
-            "Rows:": "",
-            "Size of text box in characters": "",
-            "Size:": "",
-            "Soft": "",
-            "Tab Index:": "",
-            "Target Frame:": "",
-            "Text:": "",
-            "URL of image": "",
-            "Value of the form input": "",
-            "Value:": "",
-            "Virtual": "",
-            "Width in number of characters": "",
-            "Wrap Mode:": "",
-            "You must enter a Name": "",
-            "Cancel": "<<Abbreviation>>",
-            "OK": "<<Abbreviation>>",
-            "Options": "<<FindReplace>>"
-        },
-        "FullPage": {
-            "...": "",
-            "Alternate style-sheet:": "",
-            "Background color:": "",
-            "Character set:": "",
-            "cyrillic (ISO-8859-5)": "",
-            "cyrillic (KOI8-R)": "",
-            "cyrillic (WINDOWS-1251)": "",
-            "Description:": "",
-            "DOCTYPE:": "",
-            "Document properties": "",
-            "Document title:": "",
-            "Keywords:": "",
-            "Primary style-sheet:": "",
-            "Text color:": "",
-            "UTF-8 (recommended)": "",
-            "western (ISO-8859-1)": "",
-            "Cancel": "<<Abbreviation>>",
-            "OK": "<<Abbreviation>>"
-        },
-        "FullScreen": {
-            "Maximize/Minimize Editor": ""
-        },
-        "Gecko": {
-            "The Paste button does not work in this browser for security reasons. Press CTRL-V on your keyboard to paste directly.": ""
-        },
-        "HorizontalRule": {
-            "&#x00d7;": "",
-            "&nbsp;": "",
-            "Alignment:": "",
-            "Center": "",
-            "Color:": "",
-            "Height:": "",
-            "Insert/Edit Horizontal Rule": "",
-            "Insert/edit horizontal rule": "",
-            "Layout": "",
-            "Left": "",
-            "No shading": "",
-            "percent": "",
-            "pixels": "",
-            "Right": "",
-            "Style": "",
-            "Width:": "",
-            "Cancel": "<<Abbreviation>>",
-            "OK": "<<Abbreviation>>"
-        },
-        "InlineStyler": {
-            "Background": "",
-            "Baseline": "",
-            "Border": "",
-            "Bottom": "",
-            "Char": "",
-            "Collapsed borders": "",
-            "CSS Style": "",
-            "FG Color": "",
-            "Float": "",
-            "Justify": "",
-            "Margin": "",
-            "Middle": "",
-            "None": "",
-            "Padding": "",
-            "Text align": "",
-            "Top": "",
-            "Vertical align": "",
-            "-": "<<Equation>>",
-            "Center": "<<HorizontalRule>>",
-            "Height": "<<HorizontalRule>>",
-            "Image URL": "<<Forms>>",
-            "Layout": "<<HorizontalRule>>",
-            "Left": "<<HorizontalRule>>",
-            "percent": "<<HorizontalRule>>",
-            "pixels": "<<HorizontalRule>>",
-            "Right": "<<HorizontalRule>>",
-            "Width": "<<HorizontalRule>>"
-        },
-        "InsertAnchor": {
-            "Anchor name": "",
-            "Insert Anchor": "",
-            "Cancel": "<<Abbreviation>>",
-            "Delete": "<<Abbreviation>>",
-            "OK": "<<Abbreviation>>"
-        },
-        "InsertImage": {
-            "Absbottom": "",
-            "Absmiddle": "",
-            "Alternate text:": "",
-            "Border thickness:": "",
-            "Enter the image URL here": "",
-            "For browsers that don't support images": "",
-            "Horizontal padding": "",
-            "Horizontal:": "",
-            "Image Preview:": "",
-            "Insert Image": "",
-            "Leave empty for no border": "",
-            "Not set": "",
-            "Positioning of this image": "",
-            "Preview the image in a new window": "",
-            "Spacing": "",
-            "Texttop": "",
-            "Vertical padding": "",
-            "Vertical:": "",
-            "You must enter the URL": "",
-            "Alignment:": "<<HorizontalRule>>",
-            "Baseline": "<<InlineStyler>>",
-            "Bottom": "<<InlineStyler>>",
-            "Cancel": "<<Abbreviation>>",
-            "Image URL:": "<<Forms>>",
-            "Layout": "<<HorizontalRule>>",
-            "Left": "<<HorizontalRule>>",
-            "Middle": "<<InlineStyler>>",
-            "OK": "<<Abbreviation>>",
-            "Preview": "<<Equation>>",
-            "Right": "<<HorizontalRule>>",
-            "Top": "<<InlineStyler>>"
-        },
-        "InsertNote": {
-            "Insert": "",
-            "Insert footnote": "",
-            "Insert Note": "",
-            "Cancel": "<<Abbreviation>>"
-        },
-        "InsertPagebreak": {
-            "Page break": "",
-            "Page Break": ""
-        },
-        "InsertSmiley": {
-            "Insert Smiley": ""
-        },
-        "InsertSnippet": {
-            "\\n  This is an information about something\\n": "",
-            "Hide preview": "",
-            "Insert as": "",
-            "Insert Snippet": "",
-            "InsertSnippet for Xinha": "",
-            "Link1": "",
-            "Link2": "",
-            "Link3": "",
-            "Link4": "",
-            "Link5": "",
-            "Show preview": "",
-            "This is an information about something": "",
-            "Variable": "",
-            "Cancel": "<<Abbreviation>>"
-        },
-        "InsertSnippet2": {
-            "All Categories": "",
-            "Filter": "",
-            "Insert as HTML": "",
-            "Insert as template variable": "",
-            "Only search word beginning": "",
-            "Cancel": "<<Abbreviation>>",
-            "HTML": "<<CharCounter>>",
-            "Insert Snippet": "<<InsertSnippet>>",
-            "InsertSnippet for Xinha": "<<InsertSnippet>>",
-            "Variable": "<<InsertSnippet>>"
-        },
-        "InsertTable": {
-            "Caption": "",
-            "Caption for the table": "",
-            "Cell padding:": "",
-            "Cell spacing:": "",
-            "Collapse borders:": "",
-            "Cols:": "",
-            "Em": "",
-            "Fixed width columns": "",
-            "Layou": "",
-            "Number of columns": "",
-            "Number of rows": "",
-            "Positioning of this table": "",
-            "Space between adjacent cells": "",
-            "Space between content and border in cell": "",
-            "Style of the border": "",
-            "Width of the table": "",
-            "Width unit": "",
-            "You must enter a number of columns": "",
-            "You must enter a number of rows": "",
-            "Absbottom": "<<InsertImage>>",
-            "Absmiddle": "<<InsertImage>>",
-            "Alignment:": "<<HorizontalRule>>",
-            "Baseline": "<<InlineStyler>>",
-            "Border": "<<InlineStyler>>",
-            "Border thickness:": "<<InsertImage>>",
-            "Bottom": "<<InlineStyler>>",
-            "Cancel": "<<Abbreviation>>",
-            "Layout": "<<HorizontalRule>>",
-            "Leave empty for no border": "<<InsertImage>>",
-            "Left": "<<HorizontalRule>>",
-            "Middle": "<<InlineStyler>>",
-            "Not set": "<<InsertImage>>",
-            "OK": "<<Abbreviation>>",
-            "Percent": "<<HorizontalRule>>",
-            "Pixels": "<<HorizontalRule>>",
-            "Right": "<<HorizontalRule>>",
-            "Rows:": "<<Forms>>",
-            "Spacing": "<<InsertImage>>",
-            "Texttop": "<<InsertImage>>",
-            "Top": "<<InlineStyler>>",
-            "Width:": "<<HorizontalRule>>"
-        },
-        "LangMarks": {
-            "&mdash; language &mdash;": "",
-            "', '": "",
-            "English": "",
-            "French": "",
-            "Greek": "",
-            "language select": "",
-            "Latin": ""
-        },
-        "Linker": {
-            "(px)": "",
-            "Anchor-Link": "",
-            "Anchor:": "",
-            "Email Address:": "",
-            "Email Link": "",
-            "Location Bar:": "",
-            "Menu Bar:": "",
-            "Message Template:": "",
-            "New Window": "",
-            "Ordinary Link": "",
-            "Popup Window": "",
-            "PopupWindow": "",
-            "Remove Link": "",
-            "Resizeable:": "",
-            "Same Window (jump out of frames)": "",
-            "Scrollbars:": "",
-            "Shows On Hover": "",
-            "Status Bar:": "",
-            "Subject:": "",
-            "Title:": "",
-            "Toolbar:": "",
-            "URL Link": "",
-            "You must select some text before making a new link.": "",
-            "Are you sure you wish to remove this link?": "<<CreateLink>>",
-            "Cancel": "<<Abbreviation>>",
-            "Insert/Modify Link": "<<CreateLink>>",
-            "Name:": "<<Forms>>",
-            "OK": "<<Abbreviation>>",
-            "Size:": "<<Forms>>",
-            "Target:": "<<CreateLink>>",
-            "URL:": "<<CreateLink>>"
-        },
-        "ListType": {
-            "Choose list style type (for ordered lists)": "",
-            "Decimal numbers": "",
-            "Lower greek letters": "",
-            "Lower latin letters": "",
-            "Lower roman numbers": "",
-            "Upper latin letters": "",
-            "Upper roman numbers": ""
-        },
-        "MootoolsFileManager": {
-            "Insert File Link": "",
-            "You must select some text before making a new link.": "<<Linker>>"
-        },
-        "Opera": {
-            "MARK": "",
-            "The Paste button does not work in Mozilla based web browsers (technical security reasons). Press CTRL-V on your keyboard to paste directly.": ""
-        },
-        "PasteText": {
-            "Insert text in new paragraph": "",
-            "Paste as Plain Text": "",
-            "Cancel": "<<Abbreviation>>",
-            "OK": "<<Abbreviation>>"
-        },
-        "PreserveScripts": {
-            "JavaScript": "",
-            "PHP": ""
-        },
-        "QuickTag": {
-            "',\r\n                           'cl': '": "",
-            "ATTRIBUTES": "",
-            "Colors": "",
-            "Enter the TAG you want to insert": "",
-            "No CSS class avaiable": "",
-            "Ok": "",
-            "OPTIONS": "",
-            "Quick Tag Editor": "",
-            "TAGs": "",
-            "There are some unclosed quote": "",
-            "This attribute already exists in the TAG": "",
-            "You have to select some text": "",
-            "Cancel": "<<Abbreviation>>"
-        },
-        "SaveSubmit": {
-            "in progress": "",
-            "Ready": "",
-            "Save": "",
-            "Saving...": ""
-        },
-        "SetId": {
-            "ID/Name:": "",
-            "Set Id and Name": "",
-            "Set Id/Name": "",
-            "Set ID/Name": "",
-            "Cancel": "<<Abbreviation>>",
-            "Delete": "<<Abbreviation>>",
-            "OK": "<<Abbreviation>>"
-        },
-        "SmartReplace": {
-            "ClosingDoubleQuotes": "",
-            "ClosingSingleQuote": "",
-            "Convert all quotes and dashes in the current document": "",
-            "Enable automatic replacements": "",
-            "OpeningDoubleQuotes": "",
-            "OpeningSingleQuote": "",
-            "SmartReplace": "",
-            "SmartReplace Settings": "",
-            "OK": "<<Abbreviation>>"
-        },
-        "Stylist": {
-            "Styles": ""
-        },
-        "SuperClean": {
-            "Clean bad HTML from Microsoft Word.": "",
-            "Clean Selection Only": "",
-            "Clean up HTML": "",
-            "Cleaning Scope": "",
-            "General tidy up and correction of some problems.": "",
-            "Please select from the following cleaning options...": "",
-            "Please stand by while cleaning in process...": "",
-            "Remove alignment (left/right/justify).": "",
-            "Remove all classes (CSS).": "",
-            "Remove All HTML Tags": "",
-            "Remove all styles (CSS).": "",
-            "Remove custom font sizes.": "",
-            "Remove custom text colors.": "",
-            "Remove custom typefaces (font \"styles\").": "",
-            "Remove emphasis and annotations.": "",
-            "Remove lang attributes.": "",
-            "Remove Paragraphs": "",
-            "Remove superscripts and subscripts.": "",
-            "Replace directional quote marks with non-directional quote marks.": "",
-            "Vigorously purge HTML from Microsoft Word.": "",
-            "Cancel": "<<Abbreviation>>",
-            "OK": "<<Abbreviation>>"
-        },
-        "TableOperations": {
-            "All four sides": "",
-            "Borders": "",
-            "Cell Properties": "",
-            "Cell properties": "",
-            "Cell Type:": "",
-            "Cells down": "",
-            "Cells to the right, and": "",
-            "Delete cell": "",
-            "Delete column": "",
-            "Delete row": "",
-            "Do Not Change": "",
-            "Frame and borders": "",
-            "Frames": "",
-            "Header (th)": "",
-            "Insert cell after": "",
-            "Insert cell before": "",
-            "Insert column after": "",
-            "Insert column before": "",
-            "Insert row after": "",
-            "Insert row before": "",
-            "Merge cells": "",
-            "Merge current cell with:": "",
-            "No rules": "",
-            "No sides": "",
-            "Normal (td)": "",
-            "Please click into some cell": "",
-            "Row Properties": "",
-            "Row properties": "",
-            "Rules will appear between all rows and columns": "",
-            "Rules will appear between columns only": "",
-            "Rules will appear between rows only": "",
-            "Spacing and padding": "",
-            "Split column": "",
-            "Split row": "",
-            "Summary": "",
-            "Table properties": "",
-            "Table Properties": "",
-            "The bottom side only": "",
-            "The left-hand side only": "",
-            "The right and left sides only": "",
-            "The right-hand side only": "",
-            "The top and bottom sides only": "",
-            "The top side only": "",
-            "Xinha cowardly refuses to delete the last cell in row.": "",
-            "Xinha cowardly refuses to delete the last column in table.": "",
-            "Xinha cowardly refuses to delete the last row in table.": "",
-            "Cancel": "<<Abbreviation>>",
-            "Caption": "<<InsertTable>>",
-            "Columns": "<<Forms>>",
-            "Description": "<<FullPage>>",
-            "Merge Cells": "<<ContextMenu>>",
-            "OK": "<<Abbreviation>>",
-            "Padding": "<<InlineStyler>>",
-            "pixels": "<<HorizontalRule>>",
-            "Rows": "<<Forms>>",
-            "Spacing": "<<InsertImage>>"
-        },
-        "UnsavedChanges": {
-            "You have unsaved changes in the editor": ""
-        },
-        "WebKit": {
-            "The Paste button does not work in this browser for security reasons. Press CTRL-V on your keyboard to paste directly.": "<<Gecko>>"
-        },
-        "Xinha": {
-            "&#8212; font &#8212;": "",
-            "&#8212; format &#8212;": "",
-            "&#8212; size &#8212;": "",
-            "1 (8 pt)": "",
-            "2 (10 pt)": "",
-            "3 (12 pt)": "",
-            "4 (14 pt)": "",
-            "5 (18 pt)": "",
-            "6 (24 pt)": "",
-            "7 (36 pt)": "",
-            "Address": "",
-            "Arial": "",
-            "Clean content pasted from Word": "",
-            "Clear Inline Font Specifications": "",
-            "Clear MSOffice tags": "",
-            "Close": "",
-            "Constructing object": "",
-            "Copy selection": "",
-            "Courier New": "",
-            "Create Statusbar": "",
-            "Create Toolbar": "",
-            "CTRL-0 (zero)": "",
-            "CTRL-1 .. CTRL-6": "",
-            "CTRL-A": "",
-            "CTRL-B": "",
-            "CTRL-C": "",
-            "CTRL-E": "",
-            "CTRL-I": "",
-            "CTRL-J": "",
-            "CTRL-L": "",
-            "CTRL-N": "",
-            "CTRL-R": "",
-            "CTRL-S": "",
-            "CTRL-U": "",
-            "CTRL-V": "",
-            "CTRL-X": "",
-            "CTRL-Y": "",
-            "CTRL-Z": "",
-            "Cut selection": "",
-            "Direction left to right": "",
-            "Direction right to left": "",
-            "Editor Help": "",
-            "ENTER": "",
-            "Error Loading Xinha.  Developers, check the Error Console for information.": "",
-            "Finishing": "",
-            "Formatted": "",
-            "Generate Xinha framework": "",
-            "Georgia": "",
-            "Heading 1": "",
-            "Heading 2": "",
-            "Heading 3": "",
-            "Heading 4": "",
-            "Heading 5": "",
-            "Heading 6": "",
-            "Headings": "",
-            "Impact": "",
-            "Init editor size": "",
-            "insert linebreak": "",
-            "Insert/Overwrite": "",
-            "Keyboard shortcuts": "",
-            "Loading Core": "",
-            "Loading in progress. Please wait!": "",
-            "Loading plugin $plugin": "",
-            "Loading plugins": "",
-            "MS Word Cleaner": "",
-            "new paragraph": "",
-            "Normal": "",
-            "Paste from clipboard": "",
-            "Path": "",
-            "Print document": "",
-            "Redoes your last action": "",
-            "Register plugin $plugin": "",
-            "Remove formatting": "",
-            "Save as": "",
-            "Select all": "",
-            "Select Color": "",
-            "Set format to paragraph": "",
-            "SHIFT-ENTER": "",
-            "Split Block": "",
-            "Tahoma": "",
-            "The editor provides the following key combinations:": "",
-            "Times New Roman": "",
-            "Toggle Borders": "",
-            "Touch here first to activate editor.": "",
-            "Undoes your last action": "",
-            "Verdana": "",
-            "Waiting for Iframe to load...": "",
-            "WingDings": "",
-            "Would you like to clear font colours?": "",
-            "Would you like to clear font sizes?": "",
-            "Would you like to clear font typefaces?": "",
-            "Xinha": "",
-            "You are in TEXT MODE.  Use the [<>] button to switch back to WYSIWYG.": ""
-        },
-        "BackgroundImage": {
-            "__ TRANSLATOR NOTE __": "*** BACKGROUNDIMAGE IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***",
-            "Remove Current Background": "",
-            "Set Background": "",
-            "Set page background image": "",
-            "Set Page Background Image": "",
-            "Cancel": "<<Abbreviation>>"
-        },
-        "ClientsideSpellcheck": {
-            "__ TRANSLATOR NOTE __": "*** CLIENTSIDESPELLCHECK IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***",
-            "Spell Check using ieSpell": ""
-        },
-        "ExtendedFileManager": {
-            "__ TRANSLATOR NOTE __": "*** EXTENDEDFILEMANAGER IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***",
-            "10%": "",
-            "100%": "",
-            "200%": "",
-            "25%": "",
-            "50%": "",
-            "75%": "",
-            ">List View": "",
-            ">Thumbnail View": "",
-            "A:": "",
-            "Align": "",
-            "Alt": "",
-            "Border Color": "",
-            "Constrain Proportions": "",
-            "Crop": "",
-            "D:": "",
-            "Directory": "",
-            "Directory Up": "",
-            "Edit": "",
-            "File List": "",
-            "File Manager": "",
-            "Filename:": "",
-            "Filesize:": "",
-            "Flip Horizontal": "",
-            "Flip Image": "",
-            "Flip Vertical": "",
-            "Folder": "",
-            "GIF": "",
-            "GIF format is not supported, image editing not supported.": "",
-            "H:": "",
-            "Image Editor": "",
-            "Image Selection": "",
-            "Invalid base directory:": "",
-            "JPEG High": "",
-            "JPEG Low": "",
-            "JPEG Medium": "",
-            "Loading": "",
-            "Lock": "",
-            "Marker": "",
-            "Maximum folder size limit reached. Upload disabled.": "",
-            "Measure": "",
-            "New Folder": "",
-            "No Files Found": "",
-            "No Image Available": "",
-            "Please enter value": "",
-            "PNG": "",
-            "Preset": "",
-            "Quality:": "",
-            "Refresh": "",
-            "Rename": "",
-            "Resize": "",
-            "Rotate": "",
-            "Rotate 180 &deg;": "",
-            "Rotate 90 &deg; CCW": "",
-            "Rotate 90 &deg; CW": "",
-            "Rotate Image": "",
-            "Start X:": "",
-            "Start Y:": "",
-            "Target Window": "",
-            "Toggle marker color": "",
-            "Trash": "",
-            "Upload": "",
-            "W:": "",
-            "X:": "",
-            "Xinha Image Editor": "",
-            "Y:": "",
-            "Zoom": "",
-            "Absbottom": "<<InsertImage>>",
-            "Absmiddle": "<<InsertImage>>",
-            "Baseline": "<<InlineStyler>>",
-            "Border": "<<InlineStyler>>",
-            "Bottom": "<<InlineStyler>>",
-            "Cancel": "<<Abbreviation>>",
-            "Clear": "<<FindReplace>>",
-            "Color": "<<HorizontalRule>>",
-            "Copy": "<<ContextMenu>>",
-            "Cut": "<<ContextMenu>>",
-            "Height": "<<HorizontalRule>>",
-            "Height:": "<<HorizontalRule>>",
-            "Insert File Link": "<<MootoolsFileManager>>",
-            "Left": "<<HorizontalRule>>",
-            "Margin": "<<InlineStyler>>",
-            "Middle": "<<InlineStyler>>",
-            "New window (_blank)": "<<CreateLink>>",
-            "None (use implicit)": "<<CreateLink>>",
-            "Not set": "<<InsertImage>>",
-            "OK": "<<Abbreviation>>",
-            "Padding": "<<InlineStyler>>",
-            "Positioning of this image": "<<InsertImage>>",
-            "Preview": "<<Equation>>",
-            "Right": "<<HorizontalRule>>",
-            "Same frame (_self)": "<<CreateLink>>",
-            "Save": "<<SaveSubmit>>",
-            "Texttop": "<<InsertImage>>",
-            "Title (tooltip)": "<<CreateLink>>",
-            "Top": "<<InlineStyler>>",
-            "Top frame (_top)": "<<CreateLink>>",
-            "Width": "<<HorizontalRule>>",
-            "Width:": "<<HorizontalRule>>",
-            "You must select some text before making a new link.": "<<Linker>>"
-        },
-        "Filter": {
-            "__ TRANSLATOR NOTE __": "*** FILTER IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***",
-            "Filter": "<<InsertSnippet2>>"
-        },
-        "HtmlTidy": {
-            "__ TRANSLATOR NOTE __": "*** HTMLTIDY IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***",
-            "Auto-Tidy": "",
-            "Don't Tidy": "",
-            "HTML Tidy": "",
-            "Tidy failed.  Check your HTML for syntax errors.": ""
-        },
-        "ImageManager": {
-            "__ TRANSLATOR NOTE __": "*** IMAGEMANAGER IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***",
-            "Angle:": "",
-            "Flickr Picture List": "",
-            "Flickr Pictures": "",
-            "Flickr Selection": "",
-            "Flickr Username/Email": "",
-            "Folder Name:": "",
-            "Image Format": "",
-            "Image List": "",
-            "Keyword": "",
-            "No Images Found": "",
-            "No Photos Found": "",
-            "No Videos Found": "",
-            "This Server": "",
-            "YouTube Selection": "",
-            "YouTube Username": "",
-            "YouTube Video List": "",
-            "YouTube Videos": "",
-            "A:": "<<ExtendedFileManager>>",
-            "Absbottom": "<<InsertImage>>",
-            "Absmiddle": "<<InsertImage>>",
-            "Baseline": "<<InlineStyler>>",
-            "Bottom": "<<InlineStyler>>",
-            "Cancel": "<<Abbreviation>>",
-            "Clear": "<<FindReplace>>",
-            "Constrain Proportions": "<<ExtendedFileManager>>",
-            "Crop": "<<ExtendedFileManager>>",
-            "D:": "<<ExtendedFileManager>>",
-            "Directory": "<<ExtendedFileManager>>",
-            "Directory Up": "<<ExtendedFileManager>>",
-            "Edit": "<<ExtendedFileManager>>",
-            "Filename:": "<<ExtendedFileManager>>",
-            "Flip Horizontal": "<<ExtendedFileManager>>",
-            "Flip Image": "<<ExtendedFileManager>>",
-            "Flip Vertical": "<<ExtendedFileManager>>",
-            "GIF": "<<ExtendedFileManager>>",
-            "GIF format is not supported, image editing not supported.": "<<ExtendedFileManager>>",
-            "H:": "<<ExtendedFileManager>>",
-            "Height:": "<<HorizontalRule>>",
-            "Image Editor": "<<ExtendedFileManager>>",
-            "Image Selection": "<<ExtendedFileManager>>",
-            "Insert Image": "<<InsertImage>>",
-            "Invalid base directory:": "<<ExtendedFileManager>>",
-            "JPEG High": "<<ExtendedFileManager>>",
-            "JPEG Low": "<<ExtendedFileManager>>",
-            "JPEG Medium": "<<ExtendedFileManager>>",
-            "Left": "<<HorizontalRule>>",
-            "Lock": "<<ExtendedFileManager>>",
-            "Marker": "<<ExtendedFileManager>>",
-            "Measure": "<<ExtendedFileManager>>",
-            "Middle": "<<InlineStyler>>",
-            "New Folder": "<<ExtendedFileManager>>",
-            "No Image Available": "<<ExtendedFileManager>>",
-            "Not set": "<<InsertImage>>",
-            "OK": "<<Abbreviation>>",
-            "PNG": "<<ExtendedFileManager>>",
-            "Positioning of this image": "<<InsertImage>>",
-            "Quality:": "<<ExtendedFileManager>>",
-            "Refresh": "<<ExtendedFileManager>>",
-            "Resize": "<<ExtendedFileManager>>",
-            "Right": "<<HorizontalRule>>",
-            "Rotate": "<<ExtendedFileManager>>",
-            "Rotate 180 &deg;": "<<ExtendedFileManager>>",
-            "Rotate 90 &deg; CCW": "<<ExtendedFileManager>>",
-            "Rotate 90 &deg; CW": "<<ExtendedFileManager>>",
-            "Rotate Image": "<<ExtendedFileManager>>",
-            "Save": "<<SaveSubmit>>",
-            "Start X:": "<<ExtendedFileManager>>",
-            "Start Y:": "<<ExtendedFileManager>>",
-            "Texttop": "<<InsertImage>>",
-            "Top": "<<InlineStyler>>",
-            "Trash": "<<ExtendedFileManager>>",
-            "W:": "<<ExtendedFileManager>>",
-            "Width:": "<<HorizontalRule>>",
-            "X:": "<<ExtendedFileManager>>",
-            "Y:": "<<ExtendedFileManager>>"
-        },
-        "InsertMarquee": {
-            "__ TRANSLATOR NOTE __": "*** INSERTMARQUEE IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***",
-            "Alternate": "",
-            "Background-Color:": "",
-            "Behavior:": "",
-            "Continuous": "",
-            "Direction:": "",
-            "Insert scrolling marquee": "",
-            "Marquee Editor": "",
-            "Scroll Amount:": "",
-            "Scroll Delay:": "",
-            "Slide": "",
-            "Speed Control": "",
-            "Cancel": "<<Abbreviation>>",
-            "Height:": "<<HorizontalRule>>",
-            "Left": "<<HorizontalRule>>",
-            "Name": "<<Forms>>",
-            "Name/ID:": "<<Forms>>",
-            "OK": "<<Abbreviation>>",
-            "Right": "<<HorizontalRule>>",
-            "Text:": "<<Forms>>",
-            "Width:": "<<HorizontalRule>>"
-        },
-        "InsertPicture": {
-            "__ TRANSLATOR NOTE __": "*** INSERTPICTURE IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***",
-            "Leave empty for not defined": "",
-            " Open file in new window": "",
-            "Open file in new window": "",
-            "Upload file": "",
-            "Absbottom": "<<InsertImage>>",
-            "Absmiddle": "<<InsertImage>>",
-            "Alignment:": "<<HorizontalRule>>",
-            "Alternate text:": "<<InsertImage>>",
-            "Baseline": "<<InlineStyler>>",
-            "Border thickness:": "<<InsertImage>>",
-            "Bottom": "<<InlineStyler>>",
-            "Cancel": "<<Abbreviation>>",
-            "Enter the image URL here": "<<InsertImage>>",
-            "For browsers that don't support images": "<<InsertImage>>",
-            "Height:": "<<HorizontalRule>>",
-            "Horizontal padding": "<<InsertImage>>",
-            "Horizontal:": "<<InsertImage>>",
-            "Image Preview:": "<<InsertImage>>",
-            "Image URL:": "<<Forms>>",
-            "Insert Image": "<<InsertImage>>",
-            "Layout": "<<HorizontalRule>>",
-            "Leave empty for no border": "<<InsertImage>>",
-            "Left": "<<HorizontalRule>>",
-            "Middle": "<<InlineStyler>>",
-            "Not set": "<<InsertImage>>",
-            "OK": "<<Abbreviation>>",
-            "Positioning of this image": "<<InsertImage>>",
-            "Preview": "<<Equation>>",
-            "Preview the image in a new window": "<<InsertImage>>",
-            "Right": "<<HorizontalRule>>",
-            "Size": "<<Forms>>",
-            "Spacing": "<<InsertImage>>",
-            "Texttop": "<<InsertImage>>",
-            "Top": "<<InlineStyler>>",
-            "Vertical padding": "<<InsertImage>>",
-            "Vertical:": "<<InsertImage>>",
-            "Width:": "<<HorizontalRule>>"
-        },
-        "NoteServer": {
-            "__ TRANSLATOR NOTE __": "*** NOTESERVER IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***",
-            "120%": "",
-            "150%": "",
-            "80%": "",
-            "Add GUIDO Code in a textbox on the page": "",
-            "Add MIDI link to allow students to hear the music": "",
-            "Format": "",
-            "GUIDO Code": "",
-            "Guido code": "",
-            "Image in applet": "",
-            "Insert GUIDO Music Notation": "",
-            "MIDI File": "",
-            "Source Code": "",
-            "With Mozilla, the applet will not be visible in editor, but only in Web page after submitting.": "",
-            "Zoom :": "",
-            "100%": "<<ExtendedFileManager>>",
-            "Cancel": "<<Abbreviation>>",
-            "Image Preview": "<<InsertImage>>",
-            "OK": "<<Abbreviation>>",
-            "Options": "<<FindReplace>>",
-            "Preview": "<<Equation>>",
-            "Preview the image in a new window": "<<InsertImage>>",
-            "Zoom": "<<ExtendedFileManager>>"
-        },
-        "PSLocal": {
-            "__ TRANSLATOR NOTE __": "*** PSLOCAL IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***",
-            "Confirm": "",
-            "Enable": "",
-            "Enable Gears in order to use local document storage and configuration.": "",
-            "Enabling Local Storage": "",
-            "Install": "",
-            "Learn About Local Storage": "",
-            "This will reload the page, causing you to lose any unsaved work.  Press \"OK\" to reload.": "",
-            "Xinha uses Google Gears to enable local document storage.  With Gears installed, you can save drafts of your documents on your hard drive, configure Xinha to look the way you want, and carry this information wherever you use Xinha on the web.": "",
-            "Cancel": "<<Abbreviation>>"
-        },
-        "PSServer": {
-            "__ TRANSLATOR NOTE __": "*** PSSERVER IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***",
-            "File: ": "",
-            "Import": ""
-        },
-        "PersistentStorage": {
-            "__ TRANSLATOR NOTE __": "*** PERSISTENTSTORAGE IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***",
-            "Details": "",
-            "File Browser": "",
-            "Hello    There C ": "",
-            "Hello  There A ": "",
-            "Hello \" There B \"": "",
-            "Hello ' There D '": "",
-            "List of Places": "",
-            "New Document": "",
-            "Open": "",
-            "Open Document": "",
-            "Places": "",
-            "Please enter the name of the directory you'd like to create.": "",
-            "Save Document": "",
-            "This will erase any unsaved content.  If you're certain, please click OK to continue.": "",
-            "Web URL": "",
-            "Cancel": "<<Abbreviation>>",
-            "Confirm": "<<PSLocal>>",
-            "Copy": "<<ContextMenu>>",
-            "Delete": "<<Abbreviation>>",
-            "Directory Up": "<<ExtendedFileManager>>",
-            "File List": "<<ExtendedFileManager>>",
-            "File Manager": "<<ExtendedFileManager>>",
-            "Filename": "<<ExtendedFileManager>>",
-            "Insert": "<<InsertNote>>",
-            "Insert Image": "<<InsertImage>>",
-            "New Folder": "<<ExtendedFileManager>>",
-            "Save": "<<SaveSubmit>>",
-            "You must select some text before making a new link.": "<<Linker>>"
-        },
-        "SpellChecker": {
-            "__ TRANSLATOR NOTE __": "*** SPELLCHECKER IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***",
-            "Dictionary": "",
-            "Finished list of mispelled words": "",
-            "HTMLArea Spell Checker": "",
-            "I will open it in a new page.": "",
-            "Ignore": "",
-            "Ignore all": "",
-            "Info": "",
-            "Learn": "",
-            "No mispelled words found with the selected dictionary.": "",
-            "Original word": "",
-            "Please confirm that you want to open this link": "",
-            "Please wait.  Calling spell checker.": "",
-            "Please wait: changing dictionary to": "",
-            "pliz weit ;-)": "",
-            "Re-check": "",
-            "Replace": "",
-            "Replace all": "",
-            "Revert": "",
-            "Spell Checker": "",
-            "Spell-check": "",
-            "Suggestions": "",
-            "This will drop changes and quit spell checker.  Please confirm.": "",
-            "Cancel": "<<Abbreviation>>",
-            "OK": "<<Abbreviation>>",
-            "Replace with": "<<FindReplace>>"
-        },
-        "Template": {
-            "__ TRANSLATOR NOTE __": "*** TEMPLATE IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***",
-            "Insert template": "",
-            "Cancel": "<<Abbreviation>>"
-        },
-        "UnFormat": {
-            "__ TRANSLATOR NOTE __": "*** UNFORMAT IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***",
-            "All": "",
-            "All HTML:": "",
-            "Cleaning Area": "",
-            "Cleaning options": "",
-            "Formatting:": "",
-            "Page Cleaner": "",
-            "Select which types of formatting you would like to remove.": "",
-            "Selection": "",
-            "Cancel": "<<Abbreviation>>",
-            "OK": "<<Abbreviation>>"
-        }
-    }
-}
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/lang/merged/ch.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/lang/merged/ch.js
deleted file mode 100644
index 041e9b0..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/lang/merged/ch.js
+++ /dev/null
@@ -1,1575 +0,0 @@
-// Xinha Language Combined Translation File
-//
-// LANG: "ch", ENCODING: UTF-8
-//
-// INSTRUCTIONS TO TRANSLATORS
-// ===========================================================================
-//
-// Your translation must be in UTF-8 Character Encoding.
-//
-// This is a JSON encoded file (plus comments), strings should be double-quote
-// only, do not use single quotes to surround strings - "hello", not 'hello'
-// do not have a trailing comma after the last entry in a section.
-//
-// Only full line comments are allowed (that a comments occupy entire lines).
-//
-// Search for the __NEW_TRANSLATIONS__ section below, this is where you will
-// want to focus, this section includes things that do not presently have a 
-// translation or for which the translation needs to be checked for accuracy.
-//
-// In the New Translations section a translation string is one of the following
-//
-//  "English String Here" : ""
-//     This means it is not translated yet, add your translation...
-//     "English String Here" : "Klingon String Here"
-//
-//  "English String Here" : "Translated String Here"
-//     This means that an existing translation for this string, in some other
-//     section has been found, and used.  Check that it is approprite for this
-//     section and if it is, that's fine leave it as is, otherwise change as
-//     appropriate.
-//
-//  "English String Here" : "<<AnotherSection>>"
-//     This means use the same translation for this string as <<AnotherSection>>
-//     this saves you re-tranlating strings.  If the Context of this section
-//     and the context of AnotherSection seem the same, that's fine leave it
-//     using that translation, but if this section needs a different translation, 
-//     you can provide it by replacing the link (<<AnotherSection>>) with that
-//     new translation.  For example - a "Table" in say "DataPlugin" is 
-//     perhaps translated differently to "Table" in "FurniturePlugin".
-//
-// TESTING YOUR TRANSLATION
-// ===========================================================================
-// Simply place your translation file on your webserver somewhere for example
-//
-//   /xinha/lang/merged/ch.js
-//
-// and then tell Xinha where to get it (before loading XinhaCore.js) by 
-//
-//  _editor_lang              = 'ch';
-//  _editor_lang_merged_file  = '/xinha/lang/merged/ch.js';
-//
-// Xinha will load your new language definition.
-//
-// SUBMITTING YOUR TRANSLATION
-// ===========================================================================
-// Simply create a Ticket on the Xinha website and attach your translation 
-// file.
-//
-// The Xinha developers will take your file and use the 
-//     contrib/lc_split_merged_file.php
-// script to load it into the Xinha distribution.
-
-{
-    "Abbreviation": {
-        "Cancel": "取消",
-        "OK": "好"
-    },
-    "AboutBox": {
-        "About this editor": "關於 Xinha"
-    },
-    "BackgroundImage": {
-        "Cancel": "取消"
-    },
-    "ColorPicker": {
-        "OK": "好"
-    },
-    "ContextMenu": {
-        "Justify Center": "居中",
-        "Justify Full": "整齊",
-        "Justify Left": "靠左",
-        "Justify Right": "靠右"
-    },
-    "CreateLink": {
-        "Cancel": "取消",
-        "Insert/Modify Link": "插入/改寫連結",
-        "New window (_blank)": "新窗户(_blank)",
-        "None (use implicit)": "無(use implicit)",
-        "OK": "好",
-        "Other": "其他",
-        "Same frame (_self)": "本匡 (_self)",
-        "Target:": "目標匡:",
-        "Title (tooltip):": "主題 (tooltip):",
-        "Top frame (_top)": "上匡 (_top)",
-        "URL:": "網址:"
-    },
-    "EditTag": {
-        "Cancel": "取消",
-        "OK": "好"
-    },
-    "Equation": {
-        "Cancel": "取消",
-        "OK": "好"
-    },
-    "ExtendedFileManager": {
-        "Cancel": "取消",
-        "New window (_blank)": "新窗户(_blank)",
-        "None (use implicit)": "無(use implicit)",
-        "OK": "好",
-        "Same frame (_self)": "本匡 (_self)",
-        "Title (tooltip)": "主題 (tooltip):",
-        "Top frame (_top)": "上匡 (_top)"
-    },
-    "Forms": {
-        "Cancel": "取消",
-        "OK": "好"
-    },
-    "FullPage": {
-        "Cancel": "取消",
-        "OK": "好"
-    },
-    "HorizontalRule": {
-        "Cancel": "取消",
-        "Horizontal Rule": "水平線",
-        "OK": "好"
-    },
-    "ImageManager": {
-        "Cancel": "取消",
-        "OK": "好"
-    },
-    "InsertAnchor": {
-        "Cancel": "取消",
-        "OK": "好"
-    },
-    "InsertImage": {
-        "Cancel": "取消",
-        "OK": "好"
-    },
-    "InsertMarquee": {
-        "Cancel": "取消",
-        "OK": "好"
-    },
-    "InsertNote": {
-        "Cancel": "取消"
-    },
-    "InsertPicture": {
-        "Cancel": "取消",
-        "OK": "好"
-    },
-    "InsertSnippet": {
-        "Cancel": "取消"
-    },
-    "InsertSnippet2": {
-        "Cancel": "取消"
-    },
-    "InsertTable": {
-        "Cancel": "取消",
-        "Insert Table": "插入表格",
-        "OK": "好"
-    },
-    "Linker": {
-        "Cancel": "取消",
-        "Insert/Modify Link": "插入/改寫連結",
-        "OK": "好",
-        "Target:": "目標匡:",
-        "URL:": "網址:"
-    },
-    "NoteServer": {
-        "Cancel": "取消",
-        "OK": "好"
-    },
-    "Opera": {
-        "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."
-    },
-    "PSLocal": {
-        "Cancel": "取消"
-    },
-    "PasteText": {
-        "Cancel": "取消",
-        "OK": "好"
-    },
-    "PersistentStorage": {
-        "Cancel": "取消"
-    },
-    "QuickTag": {
-        "Cancel": "取消"
-    },
-    "SetId": {
-        "Cancel": "取消",
-        "OK": "好"
-    },
-    "SmartReplace": {
-        "OK": "好"
-    },
-    "SpellChecker": {
-        "Cancel": "取消",
-        "OK": "好"
-    },
-    "SuperClean": {
-        "Cancel": "取消",
-        "OK": "好"
-    },
-    "TableOperations": {
-        "Cancel": "取消",
-        "OK": "好"
-    },
-    "Template": {
-        "Cancel": "取消"
-    },
-    "UnFormat": {
-        "Cancel": "取消",
-        "OK": "好"
-    },
-    "Xinha": {
-        "About this editor": "關於 Xinha",
-        "Background Color": "背景顏色",
-        "Bold": "粗體",
-        "Bulleted List": "無序清單",
-        "Copy selection": "复制选项",
-        "Current style": "字體例子",
-        "Cut selection": "剪制选项",
-        "Decrease Indent": "伸排",
-        "Direction left to right": "从左到右",
-        "Direction right to left": "从右到左",
-        "Font Color": "文字顏色",
-        "Help using editor": "說明",
-        "Horizontal Rule": "水平線",
-        "Increase Indent": "縮排",
-        "Insert Table": "插入表格",
-        "Insert Web Link": "插入連結",
-        "Insert/Modify Image": "插入圖像",
-        "Italic": "斜體",
-        "Justify Center": "居中",
-        "Justify Full": "整齊",
-        "Justify Left": "靠左",
-        "Justify Right": "靠右",
-        "Ordered List": "順序清單",
-        "Paste from clipboard": "贴上",
-        "Path": "途徑",
-        "Redoes your last action": "重来",
-        "Strikethrough": "刪線",
-        "Subscript": "下標",
-        "Superscript": "上標",
-        "Toggle HTML Source": "切換HTML原始碼",
-        "Underline": "底線",
-        "Undoes your last action": "回原",
-        "You are in TEXT MODE.  Use the [<>] button to switch back to WYSIWYG.": "你在用純字編輯方式.  用 [<>] 按鈕轉回 所見即所得 編輯方式."
-    },
-    "__NEW_TRANSLATIONS__": {
-        "Abbreviation": {
-            "Abbreviation": "",
-            "Delete": "",
-            "Expansion:": ""
-        },
-        "AboutBox": {
-            "Close": "<<Xinha>>"
-        },
-        "CharCounter": {
-            "... in progress": "",
-            "Chars": "",
-            "HTML": "",
-            "Words": ""
-        },
-        "CharacterMap": {
-            "Insert special character": ""
-        },
-        "ColorPicker": {
-            "Click a color...": "",
-            "Color: ": "",
-            "Sample": "",
-            "Web Safe: ": "",
-            "Close": "<<Xinha>>"
-        },
-        "ContextMenu": {
-            "_Delete Row": "",
-            "_Image Properties...": "",
-            "_Modify Link...": "",
-            "_Remove Link...": "",
-            "_Table Properties...": "",
-            "C_ell Properties...": "",
-            "Chec_k Link...": "",
-            "Copy": "",
-            "Create a link": "",
-            "Current URL is": "",
-            "Cut": "",
-            "De_lete Column": "",
-            "Delete Cell": "",
-            "Delete the current column": "",
-            "Delete the current row": "",
-            "How did you get here? (Please report!)": "",
-            "I_nsert Row Before": "",
-            "In_sert Row After": "",
-            "Insert _Column Before": "",
-            "Insert a new column after the current one": "",
-            "Insert a new column before the current one": "",
-            "Insert a new row after the current one": "",
-            "Insert a new row before the current one": "",
-            "Insert a paragraph after the current node": "",
-            "Insert a paragraph before the current node": "",
-            "Insert C_olumn After": "",
-            "Insert Cell After": "",
-            "Insert Cell Before": "",
-            "Insert paragraph after": "",
-            "Insert paragraph before": "",
-            "Link points to:": "",
-            "Make lin_k...": "",
-            "Merge Cells": "",
-            "Opens this link in a new window": "",
-            "Paste": "",
-            "Please confirm that you want to remove this element:": "",
-            "Please confirm that you want to unlink this element.": "",
-            "Remove the $elem Element...": "",
-            "Remove this node from the document": "",
-            "Ro_w Properties...": "",
-            "Show the image properties dialog": "",
-            "Show the Table Cell Properties dialog": "",
-            "Show the Table Properties dialog": "",
-            "Show the Table Row Properties dialog": "",
-            "Unlink the current element": ""
-        },
-        "CreateLink": {
-            "Are you sure you wish to remove this link?": "",
-            "You need to select some text before creating a link": ""
-        },
-        "DefinitionList": {
-            "definition description": "",
-            "definition list": "",
-            "definition term": ""
-        },
-        "Dialogs": {
-            "Some Text Here": ""
-        },
-        "DynamicCSS": {
-            "Choose stylesheet": "",
-            "Default": "",
-            "Undefined": ""
-        },
-        "EditTag": {
-            "Edit HTML for selected text": "",
-            "Edit Tag By Peg": "",
-            "Tag Editor": ""
-        },
-        "Equation": {
-            "!=": "",
-            "!in": "",
-            "&gt;-": "",
-            "&gt;=": "",
-            "&lt;=": "",
-            "&lt;=&gt;": "",
-            "&lt;x&gt;": "",
-            "&nbsp; `!` &nbsp;": "",
-            "&nbsp; `.` &nbsp;": "",
-            "&nbsp; `0` &nbsp;": "",
-            "&nbsp; `2` &nbsp;": "",
-            "&nbsp; `3` &nbsp;": "",
-            "&nbsp; `4` &nbsp;": "",
-            "&nbsp; `5` &nbsp;": "",
-            "&nbsp; `6` &nbsp;": "",
-            "&nbsp; `7` &nbsp;": "",
-            "&nbsp; `8` &nbsp;": "",
-            "&nbsp; `9` &nbsp;": "",
-            "&nbsp; `e` &nbsp;": "",
-            "&nbsp;&nbsp;`1` &nbsp;": "",
-            "&nbsp;`+{::}`&nbsp;": "",
-            "&nbsp;`-:\\ `": "",
-            "&nbsp;`-{::}`&nbsp;": "",
-            "&nbsp;`C`&nbsp;": "",
-            "&nbsp;`cos`": "",
-            "&nbsp;`ln`&nbsp;": "",
-            "&nbsp;`pi` &nbsp;": "",
-            "&nbsp;`sin`": "",
-            "&nbsp;`tan`": "",
-            "&nbsp;`times`&nbsp;": "",
-            "&quot;text&quot;": "",
-            "'+formula+'": "",
-            "((n),(k))": "",
-            "(x+1)/(x-1)": "",
-            "*": "",
-            "**": "",
-            "+-": "",
-            "-&gt;": "",
-            "-&lt;": "",
-            "-:": "",
-            "-=": "",
-            "//": "",
-            "/_": "",
-            ":.": "",
-            "=&gt;": "",
-            "@": "",
-            "[[a,b],[c,d]]": "",
-            "\\\\": "",
-            "\\nClick in the box to use your keyboard or use the buttons\\n": "",
-            "^^": "",
-            "^^^": "",
-            "__|": "",
-            "_|_": "",
-            "`!=`": "",
-            "`!in`": "",
-            "`&and;`": "",
-            "`&cap;`": "",
-            "`&cup;`": "",
-            "`&gt;-`": "",
-            "`&gt;=`": "",
-            "`&lt;=&gt;`": "",
-            "`&lt;=`": "",
-            "`&lt;x&gt;`": "",
-            "`&or;`": "",
-            "`&quot;text&quot;`": "",
-            "`((n),(k))`": "",
-            "`(x+1)/(x-1)`": "",
-            "`**`": "",
-            "`*`": "",
-            "`+-`": "",
-            "`-&gt;`": "",
-            "`-&lt;`": "",
-            "`-:`": "",
-            "`-=`": "",
-            "`//`": "",
-            "`/_`": "",
-            "`:.`": "",
-            "`=&gt;`": "",
-            "`@`": "",
-            "`[[a,b],[c,d]]`": "",
-            "`\\\\`": "",
-            "`__|`": "",
-            "`_|_`": "",
-            "`AA`": "",
-            "`aleph`": "",
-            "`alpha`": "",
-            "`and`": "",
-            "`bara`": "",
-            "`bba`": "",
-            "`bbba`": "",
-            "`beta`": "",
-            "`CC`": "",
-            "`cca`": "",
-            "`chi`": "",
-            "`darr`": "",
-            "`ddota`": "",
-            "`del`": "",
-            "`Delta`": "",
-            "`delta`": "",
-            "`diamond`": "",
-            "`dota`": "",
-            "`dy/dx`": "",
-            "`EE`": "",
-            "`epsi`": "",
-            "`eta`": "",
-            "`fra`": "",
-            "`Gamma`": "",
-            "`gamma`": "",
-            "`grad`": "",
-            "`harr`": "",
-            "`hArr`": "",
-            "`hata`": "",
-            "`if`": "",
-            "`in`": "",
-            "`int`": "",
-            "`iota`": "",
-            "`kappa`": "",
-            "`Lambda`": "",
-            "`lambda`": "",
-            "`lArr`": "",
-            "`larr`": "",
-            "`lim_(x-&gt;oo)`": "",
-            "`log`": "",
-            "`mu`": "",
-            "`NN`": "",
-            "`nn`": "",
-            "`not`": "",
-            "`nu`": "",
-            "`o+`": "",
-            "`o.`": "",
-            "`O/`": "",
-            "`oint`": "",
-            "`omega`": "",
-            "`Omega`": "",
-            "`oo`": "",
-            "`or`": "",
-            "`ox`": "",
-            "`phi`": "",
-            "`Phi`": "",
-            "`Pi`": "",
-            "`pi`": "",
-            "`prod`": "",
-            "`prop`": "",
-            "`Psi`": "",
-            "`psi`": "",
-            "`QQ`": "",
-            "`quad`": "",
-            "`rArr`": "",
-            "`rho`": "",
-            "`root(n)(x)`": "",
-            "`RR`": "",
-            "`sfa`": "",
-            "`Sigma`": "",
-            "`sigma`": "",
-            "`sqrt(x)`": "",
-            "`square`": "",
-            "`stackrel(-&gt;)(+)`": "",
-            "`sub`": "",
-            "`sube`": "",
-            "`sum`": "",
-            "`sup`": "",
-            "`supe`": "",
-            "`tau`": "",
-            "`Theta`": "",
-            "`theta`": "",
-            "`TT`": "",
-            "`tta`": "",
-            "`uarr`": "",
-            "`ula`": "",
-            "`upsilon`": "",
-            "`uu`": "",
-            "`veca`": "",
-            "`vv`": "",
-            "`x_(mn)`": "",
-            "`Xi`": "",
-            "`xi`": "",
-            "`xx`": "",
-            "`zeta`": "",
-            "`ZZ`": "",
-            "`|-&gt;`": "",
-            "`|--`": "",
-            "`|==`": "",
-            "`|__`": "",
-            "`|~`": "",
-            "`~=`": "",
-            "`~|`": "",
-            "`~~`": "",
-            "AA": "",
-            "aleph": "",
-            "alpha": "",
-            "and": "",
-            "AsciiMath Formula Input": "",
-            "AsciiMathML Example": "",
-            "bara": "",
-            "Based on ASCIIMathML by": "",
-            "bba": "",
-            "bbba": "",
-            "beta": "",
-            "CC": "",
-            "cca": "",
-            "chi": "",
-            "darr": "",
-            "ddota": "",
-            "del": "",
-            "delta": "",
-            "Delta": "",
-            "diamond": "",
-            "dota": "",
-            "dy/dx": "",
-            "EE": "",
-            "epsi": "",
-            "eta": "",
-            "For more information on AsciiMathML visit this page:": "",
-            "Formula Editor": "",
-            "fra": "",
-            "gamma": "",
-            "Gamma": "",
-            "grad": "",
-            "hArr": "",
-            "harr": "",
-            "hata": "",
-            "if": "",
-            "in": "",
-            "Input": "",
-            "int": "",
-            "int_a^bf(x)dx": "",
-            "iota": "",
-            "kappa": "",
-            "Lambda": "",
-            "lambda": "",
-            "larr": "",
-            "lArr": "",
-            "lim_(x-&gt;oo)": "",
-            "mu": "",
-            "NN": "",
-            "nn": "",
-            "nnn": "",
-            "not": "",
-            "nu": "",
-            "o+": "",
-            "o.": "",
-            "O/": "",
-            "oint": "",
-            "Omega": "",
-            "omega": "",
-            "oo": "",
-            "or": "",
-            "ox": "",
-            "phi": "",
-            "Phi": "",
-            "pi": "",
-            "Pi": "",
-            "Preview": "",
-            "prod": "",
-            "prop": "",
-            "psi": "",
-            "Psi": "",
-            "QQ": "",
-            "quad": "",
-            "rArr": "",
-            "rho": "",
-            "root(n)(x)": "",
-            "RR": "",
-            "sfa": "",
-            "sigma": "",
-            "Sigma": "",
-            "sqrt(x)": "",
-            "square": "",
-            "stackrel(-&gt;)(+)": "",
-            "sub": "",
-            "sube": "",
-            "sum": "",
-            "sum_(n=1)^oo": "",
-            "sup": "",
-            "supe": "",
-            "tau": "",
-            "Theta": "",
-            "theta": "",
-            "TT": "",
-            "tta": "",
-            "uarr": "",
-            "ula": "",
-            "upsilon": "",
-            "uu": "",
-            "uuu": "",
-            "veca": "",
-            "vv": "",
-            "vvv": "",
-            "x^(m+n)": "",
-            "x_(mn)": "",
-            "Xi": "",
-            "xi": "",
-            "xx": "",
-            "zeta": "",
-            "ZZ": "",
-            "|-&gt;": "",
-            "|--": "",
-            "|==": "",
-            "|__": "",
-            "|~": "",
-            "~=": "",
-            "~|": "",
-            "~~": ""
-        },
-        "FancySelects": {
-            "'+opt.text+'": ""
-        },
-        "FindReplace": {
-            "';\r\n  var tagc = '": "",
-            "Case sensitive search": "",
-            "Clear": "",
-            "Done": "",
-            "Enter the text you want to find": "",
-            "Find and Replace": "",
-            "found item": "",
-            "found items": "",
-            "Highlight": "",
-            "Inform a replacement word": "",
-            "Next": "",
-            "not found": "",
-            "Options": "",
-            "Replace with:": "",
-            "replaced item": "",
-            "replaced items": "",
-            "Search for:": "",
-            "Substitute all occurrences": "",
-            "Substitute this occurrence?": "",
-            "Undo": "",
-            "Whole words only": ""
-        },
-        "FormOperations": {
-            "Enter the name for new option.": "",
-            "Form Editor": "",
-            "Insert a check box.": "",
-            "Insert a Form.": "",
-            "Insert a multi-line text field.": "",
-            "Insert a radio button.": "",
-            "Insert a select field.": "",
-            "Insert a submit/reset button.": "",
-            "Insert a text, password or hidden field.": "",
-            "Message Sent": "",
-            "Please Select...": ""
-        },
-        "Forms": {
-            "'onClick'=": "",
-            "Access Key:": "",
-            "Action URL:": "",
-            "Button Script": "",
-            "Checked": "",
-            "Columns:": "",
-            "Default text (optional)": "",
-            "Dimensions": "",
-            "Disabled": "",
-            "Encoding:": "",
-            "For Control:": "",
-            "Form": "",
-            "Form Element: FIELDSET": "",
-            "Form Element: INPUT": "",
-            "Form Element: LABEL": "",
-            "Form Element: SELECT": "",
-            "Form Element: TEXTAREA": "",
-            "Form handler script": "",
-            "Form Name:": "",
-            "Get": "",
-            "Hard": "",
-            "Height in number of rows": "",
-            "HTML-Form to CGI (default)": "",
-            "Image source": "",
-            "Image URL:": "",
-            "Initial Text:": "",
-            "Insert/Edit Form": "",
-            "Insert/Edit Form Element FIELDSET": "",
-            "Insert/Edit Form Element INPUT": "",
-            "Insert/Edit Form Element LABEL": "",
-            "Insert/Edit Form Element SELECT": "",
-            "Insert/Edit Form Element TEXTAREA": "",
-            "Javascript for button click": "",
-            "Label:": "",
-            "Legend:": "",
-            "Max length:": "",
-            "Maximum number of characters accepted": "",
-            "Method:": "",
-            "multipart Form Data (File-Upload)": "",
-            "Name": "",
-            "Name of the form input": "",
-            "Name of the form select": "",
-            "name of the textarea": "",
-            "Name/ID:": "",
-            "normal": "",
-            "nowrap": "",
-            "Off": "",
-            "Physical": "",
-            "Please enter a Label": "",
-            "Post": "",
-            "pre": "",
-            "Read Only": "",
-            "Rows:": "",
-            "Size of text box in characters": "",
-            "Size:": "",
-            "Soft": "",
-            "Tab Index:": "",
-            "Target Frame:": "",
-            "Text:": "",
-            "URL of image": "",
-            "Value of the form input": "",
-            "Value:": "",
-            "Virtual": "",
-            "Width in number of characters": "",
-            "Wrap Mode:": "",
-            "You must enter a Name": "",
-            "Options": "<<FindReplace>>"
-        },
-        "FullPage": {
-            "...": "",
-            "Alternate style-sheet:": "",
-            "Background color:": "",
-            "Character set:": "",
-            "cyrillic (ISO-8859-5)": "",
-            "cyrillic (KOI8-R)": "",
-            "cyrillic (WINDOWS-1251)": "",
-            "Description:": "",
-            "DOCTYPE:": "",
-            "Document properties": "",
-            "Document title:": "",
-            "Keywords:": "",
-            "Primary style-sheet:": "",
-            "Text color:": "",
-            "UTF-8 (recommended)": "",
-            "western (ISO-8859-1)": ""
-        },
-        "FullScreen": {
-            "Maximize/Minimize Editor": ""
-        },
-        "Gecko": {
-            "The Paste button does not work in this browser for security reasons. Press CTRL-V on your keyboard to paste directly.": ""
-        },
-        "HorizontalRule": {
-            "&#x00d7;": "",
-            "&nbsp;": "",
-            "Alignment:": "",
-            "Center": "",
-            "Color:": "",
-            "Height:": "",
-            "Insert/edit horizontal rule": "",
-            "Insert/Edit Horizontal Rule": "",
-            "Layout": "",
-            "Left": "",
-            "No shading": "",
-            "percent": "",
-            "pixels": "",
-            "Right": "",
-            "Style": "",
-            "Width:": ""
-        },
-        "InlineStyler": {
-            "Background": "",
-            "Baseline": "",
-            "Border": "",
-            "Bottom": "",
-            "Char": "",
-            "Collapsed borders": "",
-            "CSS Style": "",
-            "FG Color": "",
-            "Float": "",
-            "Justify": "",
-            "Margin": "",
-            "Middle": "",
-            "None": "",
-            "Padding": "",
-            "Text align": "",
-            "Top": "",
-            "Vertical align": "",
-            "-": "<<Equation>>",
-            "Center": "<<HorizontalRule>>",
-            "Height": "<<HorizontalRule>>",
-            "Image URL": "<<Forms>>",
-            "Layout": "<<HorizontalRule>>",
-            "Left": "<<HorizontalRule>>",
-            "percent": "<<HorizontalRule>>",
-            "pixels": "<<HorizontalRule>>",
-            "Right": "<<HorizontalRule>>",
-            "Width": "<<HorizontalRule>>"
-        },
-        "InsertAnchor": {
-            "Anchor name": "",
-            "Insert Anchor": "",
-            "Delete": "<<Abbreviation>>"
-        },
-        "InsertImage": {
-            "Absbottom": "",
-            "Absmiddle": "",
-            "Alternate text:": "",
-            "Border thickness:": "",
-            "Enter the image URL here": "",
-            "For browsers that don't support images": "",
-            "Horizontal padding": "",
-            "Horizontal:": "",
-            "Image Preview:": "",
-            "Insert Image": "",
-            "Leave empty for no border": "",
-            "Not set": "",
-            "Positioning of this image": "",
-            "Preview the image in a new window": "",
-            "Spacing": "",
-            "Texttop": "",
-            "Vertical padding": "",
-            "Vertical:": "",
-            "You must enter the URL": "",
-            "Alignment:": "<<HorizontalRule>>",
-            "Baseline": "<<InlineStyler>>",
-            "Bottom": "<<InlineStyler>>",
-            "Image URL:": "<<Forms>>",
-            "Layout": "<<HorizontalRule>>",
-            "Left": "<<HorizontalRule>>",
-            "Middle": "<<InlineStyler>>",
-            "Preview": "<<Equation>>",
-            "Right": "<<HorizontalRule>>",
-            "Top": "<<InlineStyler>>"
-        },
-        "InsertNote": {
-            "Insert": "",
-            "Insert footnote": "",
-            "Insert Note": ""
-        },
-        "InsertPagebreak": {
-            "Page break": "",
-            "Page Break": ""
-        },
-        "InsertSmiley": {
-            "Insert Smiley": ""
-        },
-        "InsertSnippet": {
-            "\\n  This is an information about something\\n": "",
-            "Hide preview": "",
-            "Insert as": "",
-            "Insert Snippet": "",
-            "InsertSnippet for Xinha": "",
-            "Link1": "",
-            "Link2": "",
-            "Link3": "",
-            "Link4": "",
-            "Link5": "",
-            "Show preview": "",
-            "This is an information about something": "",
-            "Variable": ""
-        },
-        "InsertSnippet2": {
-            "All Categories": "",
-            "Filter": "",
-            "Insert as HTML": "",
-            "Insert as template variable": "",
-            "Only search word beginning": "",
-            "HTML": "<<CharCounter>>",
-            "Insert Snippet": "<<InsertSnippet>>",
-            "InsertSnippet for Xinha": "<<InsertSnippet>>",
-            "Variable": "<<InsertSnippet>>"
-        },
-        "InsertTable": {
-            "Caption": "",
-            "Caption for the table": "",
-            "Cell padding:": "",
-            "Cell spacing:": "",
-            "Collapse borders:": "",
-            "Cols:": "",
-            "Em": "",
-            "Fixed width columns": "",
-            "Layou": "",
-            "Number of columns": "",
-            "Number of rows": "",
-            "Positioning of this table": "",
-            "Space between adjacent cells": "",
-            "Space between content and border in cell": "",
-            "Style of the border": "",
-            "Width of the table": "",
-            "Width unit": "",
-            "You must enter a number of columns": "",
-            "You must enter a number of rows": "",
-            "Absbottom": "<<InsertImage>>",
-            "Absmiddle": "<<InsertImage>>",
-            "Alignment:": "<<HorizontalRule>>",
-            "Baseline": "<<InlineStyler>>",
-            "Border": "<<InlineStyler>>",
-            "Border thickness:": "<<InsertImage>>",
-            "Bottom": "<<InlineStyler>>",
-            "Layout": "<<HorizontalRule>>",
-            "Leave empty for no border": "<<InsertImage>>",
-            "Left": "<<HorizontalRule>>",
-            "Middle": "<<InlineStyler>>",
-            "Not set": "<<InsertImage>>",
-            "Percent": "<<HorizontalRule>>",
-            "Pixels": "<<HorizontalRule>>",
-            "Right": "<<HorizontalRule>>",
-            "Rows:": "<<Forms>>",
-            "Spacing": "<<InsertImage>>",
-            "Texttop": "<<InsertImage>>",
-            "Top": "<<InlineStyler>>",
-            "Width:": "<<HorizontalRule>>"
-        },
-        "LangMarks": {
-            "&mdash; language &mdash;": "",
-            "', '": "",
-            "English": "",
-            "French": "",
-            "Greek": "",
-            "language select": "",
-            "Latin": ""
-        },
-        "Linker": {
-            "(px)": "",
-            "Anchor-Link": "",
-            "Anchor:": "",
-            "Email Address:": "",
-            "Email Link": "",
-            "Location Bar:": "",
-            "Menu Bar:": "",
-            "Message Template:": "",
-            "New Window": "",
-            "Ordinary Link": "",
-            "Popup Window": "",
-            "PopupWindow": "",
-            "Remove Link": "",
-            "Resizeable:": "",
-            "Same Window (jump out of frames)": "",
-            "Scrollbars:": "",
-            "Shows On Hover": "",
-            "Status Bar:": "",
-            "Subject:": "",
-            "Title:": "",
-            "Toolbar:": "",
-            "URL Link": "",
-            "You must select some text before making a new link.": "",
-            "Are you sure you wish to remove this link?": "<<CreateLink>>",
-            "Name:": "<<Forms>>",
-            "Size:": "<<Forms>>"
-        },
-        "ListType": {
-            "Choose list style type (for ordered lists)": "",
-            "Decimal numbers": "",
-            "Lower greek letters": "",
-            "Lower latin letters": "",
-            "Lower roman numbers": "",
-            "Upper latin letters": "",
-            "Upper roman numbers": ""
-        },
-        "MootoolsFileManager": {
-            "Insert File Link": "",
-            "You must select some text before making a new link.": "<<Linker>>"
-        },
-        "Opera": {
-            "MARK": ""
-        },
-        "PasteText": {
-            "Insert text in new paragraph": "",
-            "Paste as Plain Text": ""
-        },
-        "PreserveScripts": {
-            "JavaScript": "",
-            "PHP": ""
-        },
-        "QuickTag": {
-            "',\r\n                           'cl': '": "",
-            "ATTRIBUTES": "",
-            "Colors": "",
-            "Enter the TAG you want to insert": "",
-            "No CSS class avaiable": "",
-            "Ok": "",
-            "OPTIONS": "",
-            "Quick Tag Editor": "",
-            "TAGs": "",
-            "There are some unclosed quote": "",
-            "This attribute already exists in the TAG": "",
-            "You have to select some text": ""
-        },
-        "SaveSubmit": {
-            "in progress": "",
-            "Ready": "",
-            "Save": "",
-            "Saving...": ""
-        },
-        "SetId": {
-            "ID/Name:": "",
-            "Set Id and Name": "",
-            "Set Id/Name": "",
-            "Set ID/Name": "",
-            "Delete": "<<Abbreviation>>"
-        },
-        "SmartReplace": {
-            "ClosingDoubleQuotes": "",
-            "ClosingSingleQuote": "",
-            "Convert all quotes and dashes in the current document": "",
-            "Enable automatic replacements": "",
-            "OpeningDoubleQuotes": "",
-            "OpeningSingleQuote": "",
-            "SmartReplace": "",
-            "SmartReplace Settings": ""
-        },
-        "Stylist": {
-            "Styles": ""
-        },
-        "SuperClean": {
-            "Clean bad HTML from Microsoft Word.": "",
-            "Clean Selection Only": "",
-            "Clean up HTML": "",
-            "Cleaning Scope": "",
-            "General tidy up and correction of some problems.": "",
-            "Please select from the following cleaning options...": "",
-            "Please stand by while cleaning in process...": "",
-            "Remove alignment (left/right/justify).": "",
-            "Remove all classes (CSS).": "",
-            "Remove All HTML Tags": "",
-            "Remove all styles (CSS).": "",
-            "Remove custom font sizes.": "",
-            "Remove custom text colors.": "",
-            "Remove custom typefaces (font \"styles\").": "",
-            "Remove emphasis and annotations.": "",
-            "Remove lang attributes.": "",
-            "Remove Paragraphs": "",
-            "Remove superscripts and subscripts.": "",
-            "Replace directional quote marks with non-directional quote marks.": "",
-            "Vigorously purge HTML from Microsoft Word.": ""
-        },
-        "TableOperations": {
-            "All four sides": "",
-            "Borders": "",
-            "Cell properties": "",
-            "Cell Properties": "",
-            "Cell Type:": "",
-            "Cells down": "",
-            "Cells to the right, and": "",
-            "Delete cell": "",
-            "Delete column": "",
-            "Delete row": "",
-            "Do Not Change": "",
-            "Frame and borders": "",
-            "Frames": "",
-            "Header (th)": "",
-            "Insert cell after": "",
-            "Insert cell before": "",
-            "Insert column after": "",
-            "Insert column before": "",
-            "Insert row after": "",
-            "Insert row before": "",
-            "Merge cells": "",
-            "Merge current cell with:": "",
-            "No rules": "",
-            "No sides": "",
-            "Normal (td)": "",
-            "Please click into some cell": "",
-            "Row properties": "",
-            "Row Properties": "",
-            "Rules will appear between all rows and columns": "",
-            "Rules will appear between columns only": "",
-            "Rules will appear between rows only": "",
-            "Spacing and padding": "",
-            "Split column": "",
-            "Split row": "",
-            "Summary": "",
-            "Table properties": "",
-            "Table Properties": "",
-            "The bottom side only": "",
-            "The left-hand side only": "",
-            "The right and left sides only": "",
-            "The right-hand side only": "",
-            "The top and bottom sides only": "",
-            "The top side only": "",
-            "Xinha cowardly refuses to delete the last cell in row.": "",
-            "Xinha cowardly refuses to delete the last column in table.": "",
-            "Xinha cowardly refuses to delete the last row in table.": "",
-            "Caption": "<<InsertTable>>",
-            "Columns": "<<Forms>>",
-            "Description": "<<FullPage>>",
-            "Merge Cells": "<<ContextMenu>>",
-            "Padding": "<<InlineStyler>>",
-            "pixels": "<<HorizontalRule>>",
-            "Rows": "<<Forms>>",
-            "Spacing": "<<InsertImage>>"
-        },
-        "UnsavedChanges": {
-            "You have unsaved changes in the editor": ""
-        },
-        "WebKit": {
-            "The Paste button does not work in this browser for security reasons. Press CTRL-V on your keyboard to paste directly.": "<<Gecko>>"
-        },
-        "Xinha": {
-            "&#8212; font &#8212;": "",
-            "&#8212; format &#8212;": "",
-            "&#8212; size &#8212;": "",
-            "1 (8 pt)": "",
-            "2 (10 pt)": "",
-            "3 (12 pt)": "",
-            "4 (14 pt)": "",
-            "5 (18 pt)": "",
-            "6 (24 pt)": "",
-            "7 (36 pt)": "",
-            "Address": "",
-            "Arial": "",
-            "Clean content pasted from Word": "",
-            "Clear Inline Font Specifications": "",
-            "Clear MSOffice tags": "",
-            "Close": "",
-            "Constructing object": "",
-            "Courier New": "",
-            "Create Statusbar": "",
-            "Create Toolbar": "",
-            "CTRL-0 (zero)": "",
-            "CTRL-1 .. CTRL-6": "",
-            "CTRL-A": "",
-            "CTRL-B": "",
-            "CTRL-C": "",
-            "CTRL-E": "",
-            "CTRL-I": "",
-            "CTRL-J": "",
-            "CTRL-L": "",
-            "CTRL-N": "",
-            "CTRL-R": "",
-            "CTRL-S": "",
-            "CTRL-U": "",
-            "CTRL-V": "",
-            "CTRL-X": "",
-            "CTRL-Y": "",
-            "CTRL-Z": "",
-            "Editor Help": "",
-            "ENTER": "",
-            "Error Loading Xinha.  Developers, check the Error Console for information.": "",
-            "Finishing": "",
-            "Formatted": "",
-            "Generate Xinha framework": "",
-            "Georgia": "",
-            "Heading 1": "",
-            "Heading 2": "",
-            "Heading 3": "",
-            "Heading 4": "",
-            "Heading 5": "",
-            "Heading 6": "",
-            "Headings": "",
-            "Impact": "",
-            "Init editor size": "",
-            "insert linebreak": "",
-            "Insert/Overwrite": "",
-            "Keyboard shortcuts": "",
-            "Loading Core": "",
-            "Loading in progress. Please wait!": "",
-            "Loading plugin $plugin": "",
-            "Loading plugins": "",
-            "MS Word Cleaner": "",
-            "new paragraph": "",
-            "Normal": "",
-            "Print document": "",
-            "Register plugin $plugin": "",
-            "Remove formatting": "",
-            "Save as": "",
-            "Select all": "",
-            "Select Color": "",
-            "Set format to paragraph": "",
-            "SHIFT-ENTER": "",
-            "Split Block": "",
-            "Tahoma": "",
-            "The editor provides the following key combinations:": "",
-            "Times New Roman": "",
-            "Toggle Borders": "",
-            "Touch here first to activate editor.": "",
-            "Verdana": "",
-            "Waiting for Iframe to load...": "",
-            "WingDings": "",
-            "Would you like to clear font colours?": "",
-            "Would you like to clear font sizes?": "",
-            "Would you like to clear font typefaces?": "",
-            "Xinha": ""
-        },
-        "BackgroundImage": {
-            "__ TRANSLATOR NOTE __": "*** BACKGROUNDIMAGE IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***",
-            "Remove Current Background": "",
-            "Set Background": "",
-            "Set page background image": "",
-            "Set Page Background Image": ""
-        },
-        "ClientsideSpellcheck": {
-            "__ TRANSLATOR NOTE __": "*** CLIENTSIDESPELLCHECK IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***",
-            "Spell Check using ieSpell": ""
-        },
-        "ExtendedFileManager": {
-            "__ TRANSLATOR NOTE __": "*** EXTENDEDFILEMANAGER IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***",
-            "10%": "",
-            "100%": "",
-            "200%": "",
-            "25%": "",
-            "50%": "",
-            "75%": "",
-            ">List View": "",
-            ">Thumbnail View": "",
-            "A:": "",
-            "Align": "",
-            "Alt": "",
-            "Border Color": "",
-            "Constrain Proportions": "",
-            "Crop": "",
-            "D:": "",
-            "Directory": "",
-            "Directory Up": "",
-            "Edit": "",
-            "File List": "",
-            "File Manager": "",
-            "Filename:": "",
-            "Filesize:": "",
-            "Flip Horizontal": "",
-            "Flip Image": "",
-            "Flip Vertical": "",
-            "Folder": "",
-            "GIF": "",
-            "GIF format is not supported, image editing not supported.": "",
-            "H:": "",
-            "Image Editor": "",
-            "Image Selection": "",
-            "Invalid base directory:": "",
-            "JPEG High": "",
-            "JPEG Low": "",
-            "JPEG Medium": "",
-            "Loading": "",
-            "Lock": "",
-            "Marker": "",
-            "Maximum folder size limit reached. Upload disabled.": "",
-            "Measure": "",
-            "New Folder": "",
-            "No Files Found": "",
-            "No Image Available": "",
-            "Please enter value": "",
-            "PNG": "",
-            "Preset": "",
-            "Quality:": "",
-            "Refresh": "",
-            "Rename": "",
-            "Resize": "",
-            "Rotate": "",
-            "Rotate 180 &deg;": "",
-            "Rotate 90 &deg; CCW": "",
-            "Rotate 90 &deg; CW": "",
-            "Rotate Image": "",
-            "Start X:": "",
-            "Start Y:": "",
-            "Target Window": "",
-            "Toggle marker color": "",
-            "Trash": "",
-            "Upload": "",
-            "W:": "",
-            "X:": "",
-            "Xinha Image Editor": "",
-            "Y:": "",
-            "Zoom": "",
-            "Absbottom": "<<InsertImage>>",
-            "Absmiddle": "<<InsertImage>>",
-            "Baseline": "<<InlineStyler>>",
-            "Border": "<<InlineStyler>>",
-            "Bottom": "<<InlineStyler>>",
-            "Clear": "<<FindReplace>>",
-            "Color": "<<HorizontalRule>>",
-            "Copy": "<<ContextMenu>>",
-            "Cut": "<<ContextMenu>>",
-            "Height": "<<HorizontalRule>>",
-            "Height:": "<<HorizontalRule>>",
-            "Insert File Link": "<<MootoolsFileManager>>",
-            "Left": "<<HorizontalRule>>",
-            "Margin": "<<InlineStyler>>",
-            "Middle": "<<InlineStyler>>",
-            "Not set": "<<InsertImage>>",
-            "Padding": "<<InlineStyler>>",
-            "Positioning of this image": "<<InsertImage>>",
-            "Preview": "<<Equation>>",
-            "Right": "<<HorizontalRule>>",
-            "Save": "<<SaveSubmit>>",
-            "Texttop": "<<InsertImage>>",
-            "Top": "<<InlineStyler>>",
-            "Width": "<<HorizontalRule>>",
-            "Width:": "<<HorizontalRule>>",
-            "You must select some text before making a new link.": "<<Linker>>"
-        },
-        "Filter": {
-            "__ TRANSLATOR NOTE __": "*** FILTER IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***",
-            "Filter": "<<InsertSnippet2>>"
-        },
-        "HtmlTidy": {
-            "__ TRANSLATOR NOTE __": "*** HTMLTIDY IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***",
-            "Auto-Tidy": "",
-            "Don't Tidy": "",
-            "HTML Tidy": "",
-            "Tidy failed.  Check your HTML for syntax errors.": ""
-        },
-        "ImageManager": {
-            "__ TRANSLATOR NOTE __": "*** IMAGEMANAGER IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***",
-            "Angle:": "",
-            "Flickr Picture List": "",
-            "Flickr Pictures": "",
-            "Flickr Selection": "",
-            "Flickr Username/Email": "",
-            "Folder Name:": "",
-            "Image Format": "",
-            "Image List": "",
-            "Keyword": "",
-            "No Images Found": "",
-            "No Photos Found": "",
-            "No Videos Found": "",
-            "This Server": "",
-            "YouTube Selection": "",
-            "YouTube Username": "",
-            "YouTube Video List": "",
-            "YouTube Videos": "",
-            "A:": "<<ExtendedFileManager>>",
-            "Absbottom": "<<InsertImage>>",
-            "Absmiddle": "<<InsertImage>>",
-            "Baseline": "<<InlineStyler>>",
-            "Bottom": "<<InlineStyler>>",
-            "Clear": "<<FindReplace>>",
-            "Constrain Proportions": "<<ExtendedFileManager>>",
-            "Crop": "<<ExtendedFileManager>>",
-            "D:": "<<ExtendedFileManager>>",
-            "Directory": "<<ExtendedFileManager>>",
-            "Directory Up": "<<ExtendedFileManager>>",
-            "Edit": "<<ExtendedFileManager>>",
-            "Filename:": "<<ExtendedFileManager>>",
-            "Flip Horizontal": "<<ExtendedFileManager>>",
-            "Flip Image": "<<ExtendedFileManager>>",
-            "Flip Vertical": "<<ExtendedFileManager>>",
-            "GIF": "<<ExtendedFileManager>>",
-            "GIF format is not supported, image editing not supported.": "<<ExtendedFileManager>>",
-            "H:": "<<ExtendedFileManager>>",
-            "Height:": "<<HorizontalRule>>",
-            "Image Editor": "<<ExtendedFileManager>>",
-            "Image Selection": "<<ExtendedFileManager>>",
-            "Insert Image": "<<InsertImage>>",
-            "Invalid base directory:": "<<ExtendedFileManager>>",
-            "JPEG High": "<<ExtendedFileManager>>",
-            "JPEG Low": "<<ExtendedFileManager>>",
-            "JPEG Medium": "<<ExtendedFileManager>>",
-            "Left": "<<HorizontalRule>>",
-            "Lock": "<<ExtendedFileManager>>",
-            "Marker": "<<ExtendedFileManager>>",
-            "Measure": "<<ExtendedFileManager>>",
-            "Middle": "<<InlineStyler>>",
-            "New Folder": "<<ExtendedFileManager>>",
-            "No Image Available": "<<ExtendedFileManager>>",
-            "Not set": "<<InsertImage>>",
-            "PNG": "<<ExtendedFileManager>>",
-            "Positioning of this image": "<<InsertImage>>",
-            "Quality:": "<<ExtendedFileManager>>",
-            "Refresh": "<<ExtendedFileManager>>",
-            "Resize": "<<ExtendedFileManager>>",
-            "Right": "<<HorizontalRule>>",
-            "Rotate": "<<ExtendedFileManager>>",
-            "Rotate 180 &deg;": "<<ExtendedFileManager>>",
-            "Rotate 90 &deg; CCW": "<<ExtendedFileManager>>",
-            "Rotate 90 &deg; CW": "<<ExtendedFileManager>>",
-            "Rotate Image": "<<ExtendedFileManager>>",
-            "Save": "<<SaveSubmit>>",
-            "Start X:": "<<ExtendedFileManager>>",
-            "Start Y:": "<<ExtendedFileManager>>",
-            "Texttop": "<<InsertImage>>",
-            "Top": "<<InlineStyler>>",
-            "Trash": "<<ExtendedFileManager>>",
-            "W:": "<<ExtendedFileManager>>",
-            "Width:": "<<HorizontalRule>>",
-            "X:": "<<ExtendedFileManager>>",
-            "Y:": "<<ExtendedFileManager>>"
-        },
-        "InsertMarquee": {
-            "__ TRANSLATOR NOTE __": "*** INSERTMARQUEE IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***",
-            "Alternate": "",
-            "Background-Color:": "",
-            "Behavior:": "",
-            "Continuous": "",
-            "Direction:": "",
-            "Insert scrolling marquee": "",
-            "Marquee Editor": "",
-            "Scroll Amount:": "",
-            "Scroll Delay:": "",
-            "Slide": "",
-            "Speed Control": "",
-            "Height:": "<<HorizontalRule>>",
-            "Left": "<<HorizontalRule>>",
-            "Name": "<<Forms>>",
-            "Name/ID:": "<<Forms>>",
-            "Right": "<<HorizontalRule>>",
-            "Text:": "<<Forms>>",
-            "Width:": "<<HorizontalRule>>"
-        },
-        "InsertPicture": {
-            "__ TRANSLATOR NOTE __": "*** INSERTPICTURE IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***",
-            "Leave empty for not defined": "",
-            "Open file in new window": "",
-            " Open file in new window": "",
-            "Upload file": "",
-            "Absbottom": "<<InsertImage>>",
-            "Absmiddle": "<<InsertImage>>",
-            "Alignment:": "<<HorizontalRule>>",
-            "Alternate text:": "<<InsertImage>>",
-            "Baseline": "<<InlineStyler>>",
-            "Border thickness:": "<<InsertImage>>",
-            "Bottom": "<<InlineStyler>>",
-            "Enter the image URL here": "<<InsertImage>>",
-            "For browsers that don't support images": "<<InsertImage>>",
-            "Height:": "<<HorizontalRule>>",
-            "Horizontal padding": "<<InsertImage>>",
-            "Horizontal:": "<<InsertImage>>",
-            "Image Preview:": "<<InsertImage>>",
-            "Image URL:": "<<Forms>>",
-            "Insert Image": "<<InsertImage>>",
-            "Layout": "<<HorizontalRule>>",
-            "Leave empty for no border": "<<InsertImage>>",
-            "Left": "<<HorizontalRule>>",
-            "Middle": "<<InlineStyler>>",
-            "Not set": "<<InsertImage>>",
-            "Positioning of this image": "<<InsertImage>>",
-            "Preview": "<<Equation>>",
-            "Preview the image in a new window": "<<InsertImage>>",
-            "Right": "<<HorizontalRule>>",
-            "Size": "<<Forms>>",
-            "Spacing": "<<InsertImage>>",
-            "Texttop": "<<InsertImage>>",
-            "Top": "<<InlineStyler>>",
-            "Vertical padding": "<<InsertImage>>",
-            "Vertical:": "<<InsertImage>>",
-            "Width:": "<<HorizontalRule>>"
-        },
-        "NoteServer": {
-            "__ TRANSLATOR NOTE __": "*** NOTESERVER IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***",
-            "120%": "",
-            "150%": "",
-            "80%": "",
-            "Add GUIDO Code in a textbox on the page": "",
-            "Add MIDI link to allow students to hear the music": "",
-            "Format": "",
-            "GUIDO Code": "",
-            "Guido code": "",
-            "Image in applet": "",
-            "Insert GUIDO Music Notation": "",
-            "MIDI File": "",
-            "Source Code": "",
-            "With Mozilla, the applet will not be visible in editor, but only in Web page after submitting.": "",
-            "Zoom :": "",
-            "100%": "<<ExtendedFileManager>>",
-            "Image Preview": "<<InsertImage>>",
-            "Options": "<<FindReplace>>",
-            "Preview": "<<Equation>>",
-            "Preview the image in a new window": "<<InsertImage>>",
-            "Zoom": "<<ExtendedFileManager>>"
-        },
-        "PSLocal": {
-            "__ TRANSLATOR NOTE __": "*** PSLOCAL IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***",
-            "Confirm": "",
-            "Enable": "",
-            "Enable Gears in order to use local document storage and configuration.": "",
-            "Enabling Local Storage": "",
-            "Install": "",
-            "Learn About Local Storage": "",
-            "This will reload the page, causing you to lose any unsaved work.  Press \"OK\" to reload.": "",
-            "Xinha uses Google Gears to enable local document storage.  With Gears installed, you can save drafts of your documents on your hard drive, configure Xinha to look the way you want, and carry this information wherever you use Xinha on the web.": ""
-        },
-        "PSServer": {
-            "__ TRANSLATOR NOTE __": "*** PSSERVER IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***",
-            "File: ": "",
-            "Import": ""
-        },
-        "PersistentStorage": {
-            "__ TRANSLATOR NOTE __": "*** PERSISTENTSTORAGE IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***",
-            "Details": "",
-            "File Browser": "",
-            "Hello    There C ": "",
-            "Hello  There A ": "",
-            "Hello \" There B \"": "",
-            "Hello ' There D '": "",
-            "List of Places": "",
-            "New Document": "",
-            "Open": "",
-            "Open Document": "",
-            "Places": "",
-            "Please enter the name of the directory you'd like to create.": "",
-            "Save Document": "",
-            "This will erase any unsaved content.  If you're certain, please click OK to continue.": "",
-            "Web URL": "",
-            "Confirm": "<<PSLocal>>",
-            "Copy": "<<ContextMenu>>",
-            "Delete": "<<Abbreviation>>",
-            "Directory Up": "<<ExtendedFileManager>>",
-            "File List": "<<ExtendedFileManager>>",
-            "File Manager": "<<ExtendedFileManager>>",
-            "Filename": "<<ExtendedFileManager>>",
-            "Insert": "<<InsertNote>>",
-            "Insert Image": "<<InsertImage>>",
-            "New Folder": "<<ExtendedFileManager>>",
-            "Save": "<<SaveSubmit>>",
-            "You must select some text before making a new link.": "<<Linker>>"
-        },
-        "SpellChecker": {
-            "__ TRANSLATOR NOTE __": "*** SPELLCHECKER IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***",
-            "Dictionary": "",
-            "Finished list of mispelled words": "",
-            "HTMLArea Spell Checker": "",
-            "I will open it in a new page.": "",
-            "Ignore": "",
-            "Ignore all": "",
-            "Info": "",
-            "Learn": "",
-            "No mispelled words found with the selected dictionary.": "",
-            "Original word": "",
-            "Please confirm that you want to open this link": "",
-            "Please wait.  Calling spell checker.": "",
-            "Please wait: changing dictionary to": "",
-            "pliz weit ;-)": "",
-            "Re-check": "",
-            "Replace": "",
-            "Replace all": "",
-            "Revert": "",
-            "Spell Checker": "",
-            "Spell-check": "",
-            "Suggestions": "",
-            "This will drop changes and quit spell checker.  Please confirm.": "",
-            "Replace with": "<<FindReplace>>"
-        },
-        "Template": {
-            "__ TRANSLATOR NOTE __": "*** TEMPLATE IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***",
-            "Insert template": ""
-        },
-        "UnFormat": {
-            "__ TRANSLATOR NOTE __": "*** UNFORMAT IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***",
-            "All": "",
-            "All HTML:": "",
-            "Cleaning Area": "",
-            "Cleaning options": "",
-            "Formatting:": "",
-            "Page Cleaner": "",
-            "Select which types of formatting you would like to remove.": "",
-            "Selection": ""
-        }
-    }
-}
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/lang/merged/cz.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/lang/merged/cz.js
deleted file mode 100644
index 15307c8..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/lang/merged/cz.js
+++ /dev/null
@@ -1,1577 +0,0 @@
-// Xinha Language Combined Translation File
-//
-// LANG: "cz", ENCODING: UTF-8
-//
-// INSTRUCTIONS TO TRANSLATORS
-// ===========================================================================
-//
-// Your translation must be in UTF-8 Character Encoding.
-//
-// This is a JSON encoded file (plus comments), strings should be double-quote
-// only, do not use single quotes to surround strings - "hello", not 'hello'
-// do not have a trailing comma after the last entry in a section.
-//
-// Only full line comments are allowed (that a comments occupy entire lines).
-//
-// Search for the __NEW_TRANSLATIONS__ section below, this is where you will
-// want to focus, this section includes things that do not presently have a 
-// translation or for which the translation needs to be checked for accuracy.
-//
-// In the New Translations section a translation string is one of the following
-//
-//  "English String Here" : ""
-//     This means it is not translated yet, add your translation...
-//     "English String Here" : "Klingon String Here"
-//
-//  "English String Here" : "Translated String Here"
-//     This means that an existing translation for this string, in some other
-//     section has been found, and used.  Check that it is approprite for this
-//     section and if it is, that's fine leave it as is, otherwise change as
-//     appropriate.
-//
-//  "English String Here" : "<<AnotherSection>>"
-//     This means use the same translation for this string as <<AnotherSection>>
-//     this saves you re-tranlating strings.  If the Context of this section
-//     and the context of AnotherSection seem the same, that's fine leave it
-//     using that translation, but if this section needs a different translation, 
-//     you can provide it by replacing the link (<<AnotherSection>>) with that
-//     new translation.  For example - a "Table" in say "DataPlugin" is 
-//     perhaps translated differently to "Table" in "FurniturePlugin".
-//
-// TESTING YOUR TRANSLATION
-// ===========================================================================
-// Simply place your translation file on your webserver somewhere for example
-//
-//   /xinha/lang/merged/cz.js
-//
-// and then tell Xinha where to get it (before loading XinhaCore.js) by 
-//
-//  _editor_lang              = 'cz';
-//  _editor_lang_merged_file  = '/xinha/lang/merged/cz.js';
-//
-// Xinha will load your new language definition.
-//
-// SUBMITTING YOUR TRANSLATION
-// ===========================================================================
-// Simply create a Ticket on the Xinha website and attach your translation 
-// file.
-//
-// The Xinha developers will take your file and use the 
-//     contrib/lc_split_merged_file.php
-// script to load it into the Xinha distribution.
-
-{
-    "Abbreviation": {
-        "Cancel": "Zrušit",
-        "OK": "OK"
-    },
-    "AboutBox": {
-        "About this editor": "O této aplikaci"
-    },
-    "BackgroundImage": {
-        "Cancel": "Zrušit"
-    },
-    "ColorPicker": {
-        "Color: ": "Barva",
-        "OK": "OK"
-    },
-    "ContextMenu": {
-        "Justify Center": "Na střed",
-        "Justify Full": "Zarovnat do stran",
-        "Justify Left": "Zarovnat doleva",
-        "Justify Right": "Zarovnat doprava"
-    },
-    "CreateLink": {
-        "Cancel": "Zrušit",
-        "OK": "OK"
-    },
-    "EditTag": {
-        "Cancel": "Zrušit",
-        "OK": "OK"
-    },
-    "Equation": {
-        "Cancel": "Zrušit",
-        "OK": "OK"
-    },
-    "ExtendedFileManager": {
-        "Align": "Zarovnání",
-        "Baseline": "Základní linka",
-        "Border": "Obrys",
-        "Bottom": "Dolů",
-        "Cancel": "Zrušit",
-        "Color": "Barva",
-        "Height": "Výška",
-        "Height:": "Výška",
-        "Left": "Vlevo",
-        "Margin": "Okraj",
-        "Middle": "Na střed",
-        "OK": "OK",
-        "Padding": "Odsazování",
-        "Right": "Vpravo",
-        "Top": "Nahoru",
-        "Width": "Šířka",
-        "Width:": "Šířka"
-    },
-    "FindReplace": {
-        "Replace with:": "Zaměnit za"
-    },
-    "Forms": {
-        "Cancel": "Zrušit",
-        "Image URL:": "Adresa obrázku",
-        "OK": "OK"
-    },
-    "FullPage": {
-        "Cancel": "Zrušit",
-        "Description:": "Popis",
-        "OK": "OK"
-    },
-    "HorizontalRule": {
-        "Cancel": "Zrušit",
-        "Center": "Na střed",
-        "Color:": "Barva",
-        "Height:": "Výška",
-        "Horizontal Rule": "Vodorovná čára",
-        "Layout": "Rozložení",
-        "Left": "Vlevo",
-        "OK": "OK",
-        "Right": "Vpravo",
-        "Width:": "Šířka",
-        "percent": "procent",
-        "pixels": "pixelů"
-    },
-    "ImageManager": {
-        "Baseline": "Základní linka",
-        "Bottom": "Dolů",
-        "Cancel": "Zrušit",
-        "Height:": "Výška",
-        "Left": "Vlevo",
-        "Middle": "Na střed",
-        "OK": "OK",
-        "Right": "Vpravo",
-        "Top": "Nahoru",
-        "Width:": "Šířka"
-    },
-    "InlineStyler": {
-        "Background": "Pozadí",
-        "Baseline": "Základní linka",
-        "Border": "Obrys",
-        "Bottom": "Dolů",
-        "Center": "Na střed",
-        "Char": "Znak",
-        "Collapsed borders": "Stlačené okraje",
-        "FG Color": "Barva popředí",
-        "Float": "Obtékání",
-        "Height": "Výška",
-        "Image URL": "Adresa obrázku",
-        "Justify": "Do stran",
-        "Layout": "Rozložení",
-        "Left": "Vlevo",
-        "Margin": "Okraj",
-        "Middle": "Na střed",
-        "None": "Žádné",
-        "Padding": "Odsazování",
-        "Right": "Vpravo",
-        "Text align": "Zarovnání textu",
-        "Top": "Nahoru",
-        "Vertical align": "Svislé zarovnání",
-        "Width": "Šířka",
-        "percent": "procent",
-        "pixels": "pixelů"
-    },
-    "InsertAnchor": {
-        "Cancel": "Zrušit",
-        "OK": "OK"
-    },
-    "InsertImage": {
-        "Baseline": "Základní linka",
-        "Bottom": "Dolů",
-        "Cancel": "Zrušit",
-        "Image URL:": "Adresa obrázku",
-        "Layout": "Rozložení",
-        "Left": "Vlevo",
-        "Middle": "Na střed",
-        "OK": "OK",
-        "Right": "Vpravo",
-        "Spacing": "Mezery",
-        "Top": "Nahoru"
-    },
-    "InsertMarquee": {
-        "Cancel": "Zrušit",
-        "Height:": "Výška",
-        "Left": "Vlevo",
-        "OK": "OK",
-        "Right": "Vpravo",
-        "Width:": "Šířka"
-    },
-    "InsertNote": {
-        "Cancel": "Zrušit"
-    },
-    "InsertPicture": {
-        "Baseline": "Základní linka",
-        "Bottom": "Dolů",
-        "Cancel": "Zrušit",
-        "Height:": "Výška",
-        "Image URL:": "Adresa obrázku",
-        "Layout": "Rozložení",
-        "Left": "Vlevo",
-        "Middle": "Na střed",
-        "OK": "OK",
-        "Right": "Vpravo",
-        "Spacing": "Mezery",
-        "Top": "Nahoru",
-        "Width:": "Šířka"
-    },
-    "InsertSnippet": {
-        "Cancel": "Zrušit"
-    },
-    "InsertSnippet2": {
-        "Cancel": "Zrušit"
-    },
-    "InsertTable": {
-        "Baseline": "Základní linka",
-        "Border": "Obrys",
-        "Bottom": "Dolů",
-        "Cancel": "Zrušit",
-        "Caption": "Titulek",
-        "Insert Table": "Vložit tabulku",
-        "Layout": "Rozložení",
-        "Left": "Vlevo",
-        "Middle": "Na střed",
-        "OK": "OK",
-        "Percent": "procent",
-        "Pixels": "pixelů",
-        "Right": "Vpravo",
-        "Spacing": "Mezery",
-        "Top": "Nahoru",
-        "Width:": "Šířka"
-    },
-    "Linker": {
-        "Cancel": "Zrušit",
-        "OK": "OK"
-    },
-    "NoteServer": {
-        "Cancel": "Zrušit",
-        "OK": "OK"
-    },
-    "PSLocal": {
-        "Cancel": "Zrušit"
-    },
-    "PasteText": {
-        "Cancel": "Zrušit",
-        "OK": "OK"
-    },
-    "PersistentStorage": {
-        "Cancel": "Zrušit"
-    },
-    "QuickTag": {
-        "Cancel": "Zrušit"
-    },
-    "SetId": {
-        "Cancel": "Zrušit",
-        "OK": "OK"
-    },
-    "SmartReplace": {
-        "OK": "OK"
-    },
-    "SpellChecker": {
-        "Cancel": "Zrušit",
-        "Dictionary": "Slovník",
-        "Finished list of mispelled words": "Dokončen seznam chybných slov",
-        "I will open it in a new page.": "Bude otevřen jej v nové stránce.",
-        "Ignore": "Ignorovat",
-        "Ignore all": "Ignorovat vše",
-        "No mispelled words found with the selected dictionary.": "Podle zvoleného slovníku nebyla nalezena žádná chybná slova.",
-        "OK": "OK",
-        "Original word": "Původní slovo",
-        "Please confirm that you want to open this link": "Prosím potvrďte otevření tohoto odkazu",
-        "Please wait.  Calling spell checker.": "Prosím čekejte. Komunikuace s kontrolou správnosti slov.",
-        "Please wait: changing dictionary to": "Prosím čekejte: změna adresáře na",
-        "Re-check": "Překontrolovat",
-        "Replace": "Zaměnit",
-        "Replace all": "Zaměnit všechno",
-        "Replace with": "Zaměnit za",
-        "Spell-check": "Kontrola správnosti slov",
-        "Suggestions": "Doporučení",
-        "This will drop changes and quit spell checker.  Please confirm.": "Změny budou zrušeny a kontrola správnosti slov ukončena. Prosím potvrďte."
-    },
-    "SuperClean": {
-        "Cancel": "Zrušit",
-        "OK": "OK"
-    },
-    "TableOperations": {
-        "All four sides": "Všechny čtyři strany",
-        "Borders": "Obrysy",
-        "Cancel": "Zrušit",
-        "Caption": "Titulek",
-        "Cell Properties": "Vlastnosti buňky",
-        "Cell properties": "Vlastnosti buňky",
-        "Delete cell": "Smazat buňku",
-        "Delete column": "Smazat sloupec",
-        "Delete row": "Smazat řádek",
-        "Description": "Popis",
-        "Frames": "Rámečky",
-        "Insert cell after": "Vložit buňku za",
-        "Insert cell before": "Vložit buňku před",
-        "Insert column after": "Vložit sloupec za",
-        "Insert column before": "Vložit sloupec před",
-        "Insert row after": "Smazat řádek pod",
-        "Insert row before": "Smazat řádek nad",
-        "Merge cells": "Spojit buňky",
-        "No rules": "Žádné čáry",
-        "No sides": "Žádné strany",
-        "OK": "OK",
-        "Padding": "Odsazování",
-        "Please click into some cell": "Prosím klikněte do některé buňky",
-        "Row Properties": "Vlastnosti řádku",
-        "Row properties": "Vlastnosti řádku",
-        "Rules will appear between all rows and columns": "Čáry mezi všemi řádky i sloupci",
-        "Rules will appear between columns only": "Čáry pouze mezi sloupci",
-        "Rules will appear between rows only": "Čáry pouze mezi řádky",
-        "Spacing": "Mezery",
-        "Spacing and padding": "Mezery a odsazování",
-        "Split column": "Rozdělit sloupec",
-        "Split row": "Rozdělit řádek",
-        "Summary": "Shrnutí",
-        "Table Properties": "Vlastnosti tabulky",
-        "Table properties": "Vlastnosti tabulky",
-        "The bottom side only": "Pouze spodní strana",
-        "The left-hand side only": "Pouze levá strana",
-        "The right and left sides only": "Pouze levá a pravá strana",
-        "The right-hand side only": "Pouze pravá strana",
-        "The top and bottom sides only": "Pouze horní a dolní strana",
-        "The top side only": "Pouze horní strana",
-        "Xinha cowardly refuses to delete the last cell in row.": "Xinha zbaběle odmítá smazat poslední buňku v řádku.",
-        "Xinha cowardly refuses to delete the last column in table.": "Xinha zbaběle odmítá smazat poslední sloupec v tabulce.",
-        "Xinha cowardly refuses to delete the last row in table.": "Xinha zbaběle odmítá smazat poslední řádek v tabulce.",
-        "pixels": "pixelů"
-    },
-    "Template": {
-        "Cancel": "Zrušit"
-    },
-    "UnFormat": {
-        "Cancel": "Zrušit",
-        "OK": "OK"
-    },
-    "Xinha": {
-        "About this editor": "O této aplikaci",
-        "Background Color": "Barva pozadí",
-        "Bold": "Tučně",
-        "Bulleted List": "Odrážky",
-        "Copy selection": "Kopírovat",
-        "Current style": "Zvolený styl",
-        "Cut selection": "Vyjmout",
-        "Decrease Indent": "Předsadit",
-        "Font Color": "Barva písma",
-        "Help using editor": "Nápověda aplikace",
-        "Horizontal Rule": "Vodorovná čára",
-        "Increase Indent": "Odsadit",
-        "Insert Table": "Vložit tabulku",
-        "Insert Web Link": "Vložit odkaz",
-        "Insert/Modify Image": "Vložit obrázek",
-        "Italic": "Kurzíva",
-        "Justify Center": "Na střed",
-        "Justify Full": "Zarovnat do stran",
-        "Justify Left": "Zarovnat doleva",
-        "Justify Right": "Zarovnat doprava",
-        "Ordered List": "Seznam",
-        "Paste from clipboard": "Vložit",
-        "Path": "Cesta",
-        "Redoes your last action": "Opakuje poslední akci",
-        "Strikethrough": "Přeškrtnutí",
-        "Subscript": "Dolní index",
-        "Superscript": "Horní index",
-        "Toggle HTML Source": "Přepnout HTML",
-        "Underline": "Podtržení",
-        "Undoes your last action": "Vrátí poslední akci",
-        "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."
-    },
-    "__NEW_TRANSLATIONS__": {
-        "Abbreviation": {
-            "Abbreviation": "",
-            "Delete": "",
-            "Expansion:": ""
-        },
-        "AboutBox": {
-            "Close": "<<Xinha>>"
-        },
-        "CharCounter": {
-            "... in progress": "",
-            "Chars": "",
-            "HTML": "",
-            "Words": ""
-        },
-        "CharacterMap": {
-            "Insert special character": ""
-        },
-        "ColorPicker": {
-            "Click a color...": "",
-            "Sample": "",
-            "Web Safe: ": "",
-            "Close": "<<Xinha>>"
-        },
-        "ContextMenu": {
-            "_Delete Row": "",
-            "_Image Properties...": "",
-            "_Modify Link...": "",
-            "_Remove Link...": "",
-            "_Table Properties...": "",
-            "C_ell Properties...": "",
-            "Chec_k Link...": "",
-            "Copy": "",
-            "Create a link": "",
-            "Current URL is": "",
-            "Cut": "",
-            "De_lete Column": "",
-            "Delete Cell": "",
-            "Delete the current column": "",
-            "Delete the current row": "",
-            "How did you get here? (Please report!)": "",
-            "I_nsert Row Before": "",
-            "In_sert Row After": "",
-            "Insert _Column Before": "",
-            "Insert a new column after the current one": "",
-            "Insert a new column before the current one": "",
-            "Insert a new row after the current one": "",
-            "Insert a new row before the current one": "",
-            "Insert a paragraph after the current node": "",
-            "Insert a paragraph before the current node": "",
-            "Insert C_olumn After": "",
-            "Insert Cell After": "",
-            "Insert Cell Before": "",
-            "Insert paragraph after": "",
-            "Insert paragraph before": "",
-            "Link points to:": "",
-            "Make lin_k...": "",
-            "Merge Cells": "",
-            "Opens this link in a new window": "",
-            "Paste": "",
-            "Please confirm that you want to remove this element:": "",
-            "Please confirm that you want to unlink this element.": "",
-            "Remove the $elem Element...": "",
-            "Remove this node from the document": "",
-            "Ro_w Properties...": "",
-            "Show the image properties dialog": "",
-            "Show the Table Cell Properties dialog": "",
-            "Show the Table Properties dialog": "",
-            "Show the Table Row Properties dialog": "",
-            "Unlink the current element": ""
-        },
-        "CreateLink": {
-            "Are you sure you wish to remove this link?": "",
-            "Insert/Modify Link": "",
-            "New window (_blank)": "",
-            "None (use implicit)": "",
-            "Other": "",
-            "Same frame (_self)": "",
-            "Target:": "",
-            "Title (tooltip):": "",
-            "Top frame (_top)": "",
-            "URL:": "",
-            "You need to select some text before creating a link": ""
-        },
-        "DefinitionList": {
-            "definition description": "",
-            "definition list": "",
-            "definition term": ""
-        },
-        "Dialogs": {
-            "Some Text Here": ""
-        },
-        "DynamicCSS": {
-            "Choose stylesheet": "",
-            "Default": "",
-            "Undefined": ""
-        },
-        "EditTag": {
-            "Edit HTML for selected text": "",
-            "Edit Tag By Peg": "",
-            "Tag Editor": ""
-        },
-        "Equation": {
-            "!=": "",
-            "!in": "",
-            "&gt;-": "",
-            "&gt;=": "",
-            "&lt;=": "",
-            "&lt;=&gt;": "",
-            "&lt;x&gt;": "",
-            "&nbsp; `!` &nbsp;": "",
-            "&nbsp; `.` &nbsp;": "",
-            "&nbsp; `0` &nbsp;": "",
-            "&nbsp; `2` &nbsp;": "",
-            "&nbsp; `3` &nbsp;": "",
-            "&nbsp; `4` &nbsp;": "",
-            "&nbsp; `5` &nbsp;": "",
-            "&nbsp; `6` &nbsp;": "",
-            "&nbsp; `7` &nbsp;": "",
-            "&nbsp; `8` &nbsp;": "",
-            "&nbsp; `9` &nbsp;": "",
-            "&nbsp; `e` &nbsp;": "",
-            "&nbsp;&nbsp;`1` &nbsp;": "",
-            "&nbsp;`+{::}`&nbsp;": "",
-            "&nbsp;`-:\\ `": "",
-            "&nbsp;`-{::}`&nbsp;": "",
-            "&nbsp;`C`&nbsp;": "",
-            "&nbsp;`cos`": "",
-            "&nbsp;`ln`&nbsp;": "",
-            "&nbsp;`pi` &nbsp;": "",
-            "&nbsp;`sin`": "",
-            "&nbsp;`tan`": "",
-            "&nbsp;`times`&nbsp;": "",
-            "&quot;text&quot;": "",
-            "'+formula+'": "",
-            "((n),(k))": "",
-            "(x+1)/(x-1)": "",
-            "*": "",
-            "**": "",
-            "+-": "",
-            "-&gt;": "",
-            "-&lt;": "",
-            "-:": "",
-            "-=": "",
-            "//": "",
-            "/_": "",
-            ":.": "",
-            "=&gt;": "",
-            "@": "",
-            "[[a,b],[c,d]]": "",
-            "\\\\": "",
-            "\\nClick in the box to use your keyboard or use the buttons\\n": "",
-            "^^": "",
-            "^^^": "",
-            "__|": "",
-            "_|_": "",
-            "`!=`": "",
-            "`!in`": "",
-            "`&and;`": "",
-            "`&cap;`": "",
-            "`&cup;`": "",
-            "`&gt;-`": "",
-            "`&gt;=`": "",
-            "`&lt;=&gt;`": "",
-            "`&lt;=`": "",
-            "`&lt;x&gt;`": "",
-            "`&or;`": "",
-            "`&quot;text&quot;`": "",
-            "`((n),(k))`": "",
-            "`(x+1)/(x-1)`": "",
-            "`**`": "",
-            "`*`": "",
-            "`+-`": "",
-            "`-&gt;`": "",
-            "`-&lt;`": "",
-            "`-:`": "",
-            "`-=`": "",
-            "`//`": "",
-            "`/_`": "",
-            "`:.`": "",
-            "`=&gt;`": "",
-            "`@`": "",
-            "`[[a,b],[c,d]]`": "",
-            "`\\\\`": "",
-            "`__|`": "",
-            "`_|_`": "",
-            "`AA`": "",
-            "`aleph`": "",
-            "`alpha`": "",
-            "`and`": "",
-            "`bara`": "",
-            "`bba`": "",
-            "`bbba`": "",
-            "`beta`": "",
-            "`CC`": "",
-            "`cca`": "",
-            "`chi`": "",
-            "`darr`": "",
-            "`ddota`": "",
-            "`del`": "",
-            "`Delta`": "",
-            "`delta`": "",
-            "`diamond`": "",
-            "`dota`": "",
-            "`dy/dx`": "",
-            "`EE`": "",
-            "`epsi`": "",
-            "`eta`": "",
-            "`fra`": "",
-            "`Gamma`": "",
-            "`gamma`": "",
-            "`grad`": "",
-            "`harr`": "",
-            "`hArr`": "",
-            "`hata`": "",
-            "`if`": "",
-            "`in`": "",
-            "`int`": "",
-            "`iota`": "",
-            "`kappa`": "",
-            "`Lambda`": "",
-            "`lambda`": "",
-            "`lArr`": "",
-            "`larr`": "",
-            "`lim_(x-&gt;oo)`": "",
-            "`log`": "",
-            "`mu`": "",
-            "`NN`": "",
-            "`nn`": "",
-            "`not`": "",
-            "`nu`": "",
-            "`o+`": "",
-            "`o.`": "",
-            "`O/`": "",
-            "`oint`": "",
-            "`omega`": "",
-            "`Omega`": "",
-            "`oo`": "",
-            "`or`": "",
-            "`ox`": "",
-            "`phi`": "",
-            "`Phi`": "",
-            "`Pi`": "",
-            "`pi`": "",
-            "`prod`": "",
-            "`prop`": "",
-            "`Psi`": "",
-            "`psi`": "",
-            "`QQ`": "",
-            "`quad`": "",
-            "`rArr`": "",
-            "`rho`": "",
-            "`root(n)(x)`": "",
-            "`RR`": "",
-            "`sfa`": "",
-            "`Sigma`": "",
-            "`sigma`": "",
-            "`sqrt(x)`": "",
-            "`square`": "",
-            "`stackrel(-&gt;)(+)`": "",
-            "`sub`": "",
-            "`sube`": "",
-            "`sum`": "",
-            "`sup`": "",
-            "`supe`": "",
-            "`tau`": "",
-            "`Theta`": "",
-            "`theta`": "",
-            "`TT`": "",
-            "`tta`": "",
-            "`uarr`": "",
-            "`ula`": "",
-            "`upsilon`": "",
-            "`uu`": "",
-            "`veca`": "",
-            "`vv`": "",
-            "`x_(mn)`": "",
-            "`Xi`": "",
-            "`xi`": "",
-            "`xx`": "",
-            "`zeta`": "",
-            "`ZZ`": "",
-            "`|-&gt;`": "",
-            "`|--`": "",
-            "`|==`": "",
-            "`|__`": "",
-            "`|~`": "",
-            "`~=`": "",
-            "`~|`": "",
-            "`~~`": "",
-            "AA": "",
-            "aleph": "",
-            "alpha": "",
-            "and": "",
-            "AsciiMath Formula Input": "",
-            "AsciiMathML Example": "",
-            "bara": "",
-            "Based on ASCIIMathML by": "",
-            "bba": "",
-            "bbba": "",
-            "beta": "",
-            "CC": "",
-            "cca": "",
-            "chi": "",
-            "darr": "",
-            "ddota": "",
-            "del": "",
-            "delta": "",
-            "Delta": "",
-            "diamond": "",
-            "dota": "",
-            "dy/dx": "",
-            "EE": "",
-            "epsi": "",
-            "eta": "",
-            "For more information on AsciiMathML visit this page:": "",
-            "Formula Editor": "",
-            "fra": "",
-            "gamma": "",
-            "Gamma": "",
-            "grad": "",
-            "hArr": "",
-            "harr": "",
-            "hata": "",
-            "if": "",
-            "in": "",
-            "Input": "",
-            "int": "",
-            "int_a^bf(x)dx": "",
-            "iota": "",
-            "kappa": "",
-            "Lambda": "",
-            "lambda": "",
-            "larr": "",
-            "lArr": "",
-            "lim_(x-&gt;oo)": "",
-            "mu": "",
-            "NN": "",
-            "nn": "",
-            "nnn": "",
-            "not": "",
-            "nu": "",
-            "o+": "",
-            "o.": "",
-            "O/": "",
-            "oint": "",
-            "Omega": "",
-            "omega": "",
-            "oo": "",
-            "or": "",
-            "ox": "",
-            "phi": "",
-            "Phi": "",
-            "pi": "",
-            "Pi": "",
-            "Preview": "",
-            "prod": "",
-            "prop": "",
-            "psi": "",
-            "Psi": "",
-            "QQ": "",
-            "quad": "",
-            "rArr": "",
-            "rho": "",
-            "root(n)(x)": "",
-            "RR": "",
-            "sfa": "",
-            "sigma": "",
-            "Sigma": "",
-            "sqrt(x)": "",
-            "square": "",
-            "stackrel(-&gt;)(+)": "",
-            "sub": "",
-            "sube": "",
-            "sum": "",
-            "sum_(n=1)^oo": "",
-            "sup": "",
-            "supe": "",
-            "tau": "",
-            "Theta": "",
-            "theta": "",
-            "TT": "",
-            "tta": "",
-            "uarr": "",
-            "ula": "",
-            "upsilon": "",
-            "uu": "",
-            "uuu": "",
-            "veca": "",
-            "vv": "",
-            "vvv": "",
-            "x^(m+n)": "",
-            "x_(mn)": "",
-            "Xi": "",
-            "xi": "",
-            "xx": "",
-            "zeta": "",
-            "ZZ": "",
-            "|-&gt;": "",
-            "|--": "",
-            "|==": "",
-            "|__": "",
-            "|~": "",
-            "~=": "",
-            "~|": "",
-            "~~": ""
-        },
-        "FancySelects": {
-            "'+opt.text+'": ""
-        },
-        "FindReplace": {
-            "';\r\n  var tagc = '": "",
-            "Case sensitive search": "",
-            "Clear": "",
-            "Done": "",
-            "Enter the text you want to find": "",
-            "Find and Replace": "",
-            "found item": "",
-            "found items": "",
-            "Highlight": "",
-            "Inform a replacement word": "",
-            "Next": "",
-            "not found": "",
-            "Options": "",
-            "replaced item": "",
-            "replaced items": "",
-            "Search for:": "",
-            "Substitute all occurrences": "",
-            "Substitute this occurrence?": "",
-            "Undo": "",
-            "Whole words only": ""
-        },
-        "FormOperations": {
-            "Enter the name for new option.": "",
-            "Form Editor": "",
-            "Insert a check box.": "",
-            "Insert a Form.": "",
-            "Insert a multi-line text field.": "",
-            "Insert a radio button.": "",
-            "Insert a select field.": "",
-            "Insert a submit/reset button.": "",
-            "Insert a text, password or hidden field.": "",
-            "Message Sent": "",
-            "Please Select...": ""
-        },
-        "Forms": {
-            "'onClick'=": "",
-            "Access Key:": "",
-            "Action URL:": "",
-            "Button Script": "",
-            "Checked": "",
-            "Columns:": "",
-            "Default text (optional)": "",
-            "Dimensions": "",
-            "Disabled": "",
-            "Encoding:": "",
-            "For Control:": "",
-            "Form": "",
-            "Form Element: FIELDSET": "",
-            "Form Element: INPUT": "",
-            "Form Element: LABEL": "",
-            "Form Element: SELECT": "",
-            "Form Element: TEXTAREA": "",
-            "Form handler script": "",
-            "Form Name:": "",
-            "Get": "",
-            "Hard": "",
-            "Height in number of rows": "",
-            "HTML-Form to CGI (default)": "",
-            "Image source": "",
-            "Initial Text:": "",
-            "Insert/Edit Form": "",
-            "Insert/Edit Form Element FIELDSET": "",
-            "Insert/Edit Form Element INPUT": "",
-            "Insert/Edit Form Element LABEL": "",
-            "Insert/Edit Form Element SELECT": "",
-            "Insert/Edit Form Element TEXTAREA": "",
-            "Javascript for button click": "",
-            "Label:": "",
-            "Legend:": "",
-            "Max length:": "",
-            "Maximum number of characters accepted": "",
-            "Method:": "",
-            "multipart Form Data (File-Upload)": "",
-            "Name": "",
-            "Name of the form input": "",
-            "Name of the form select": "",
-            "name of the textarea": "",
-            "Name/ID:": "",
-            "normal": "",
-            "nowrap": "",
-            "Off": "",
-            "Physical": "",
-            "Please enter a Label": "",
-            "Post": "",
-            "pre": "",
-            "Read Only": "",
-            "Rows:": "",
-            "Size of text box in characters": "",
-            "Size:": "",
-            "Soft": "",
-            "Tab Index:": "",
-            "Target Frame:": "",
-            "Text:": "",
-            "URL of image": "",
-            "Value of the form input": "",
-            "Value:": "",
-            "Virtual": "",
-            "Width in number of characters": "",
-            "Wrap Mode:": "",
-            "You must enter a Name": "",
-            "Options": "<<FindReplace>>"
-        },
-        "FullPage": {
-            "...": "",
-            "Alternate style-sheet:": "",
-            "Background color:": "",
-            "Character set:": "",
-            "cyrillic (ISO-8859-5)": "",
-            "cyrillic (KOI8-R)": "",
-            "cyrillic (WINDOWS-1251)": "",
-            "DOCTYPE:": "",
-            "Document properties": "",
-            "Document title:": "",
-            "Keywords:": "",
-            "Primary style-sheet:": "",
-            "Text color:": "",
-            "UTF-8 (recommended)": "",
-            "western (ISO-8859-1)": ""
-        },
-        "FullScreen": {
-            "Maximize/Minimize Editor": ""
-        },
-        "Gecko": {
-            "The Paste button does not work in this browser for security reasons. Press CTRL-V on your keyboard to paste directly.": ""
-        },
-        "HorizontalRule": {
-            "&#x00d7;": "",
-            "&nbsp;": "",
-            "Alignment:": "",
-            "Insert/edit horizontal rule": "",
-            "Insert/Edit Horizontal Rule": "",
-            "No shading": "",
-            "Style": ""
-        },
-        "InlineStyler": {
-            "CSS Style": "",
-            "-": "<<Equation>>"
-        },
-        "InsertAnchor": {
-            "Anchor name": "",
-            "Insert Anchor": "",
-            "Delete": "<<Abbreviation>>"
-        },
-        "InsertImage": {
-            "Absbottom": "",
-            "Absmiddle": "",
-            "Alternate text:": "",
-            "Border thickness:": "",
-            "Enter the image URL here": "",
-            "For browsers that don't support images": "",
-            "Horizontal padding": "",
-            "Horizontal:": "",
-            "Image Preview:": "",
-            "Insert Image": "",
-            "Leave empty for no border": "",
-            "Not set": "",
-            "Positioning of this image": "",
-            "Preview the image in a new window": "",
-            "Texttop": "",
-            "Vertical padding": "",
-            "Vertical:": "",
-            "You must enter the URL": "",
-            "Alignment:": "<<HorizontalRule>>",
-            "Preview": "<<Equation>>"
-        },
-        "InsertNote": {
-            "Insert": "",
-            "Insert footnote": "",
-            "Insert Note": ""
-        },
-        "InsertPagebreak": {
-            "Page break": "",
-            "Page Break": ""
-        },
-        "InsertSmiley": {
-            "Insert Smiley": ""
-        },
-        "InsertSnippet": {
-            "\\n  This is an information about something\\n": "",
-            "Hide preview": "",
-            "Insert as": "",
-            "Insert Snippet": "",
-            "InsertSnippet for Xinha": "",
-            "Link1": "",
-            "Link2": "",
-            "Link3": "",
-            "Link4": "",
-            "Link5": "",
-            "Show preview": "",
-            "This is an information about something": "",
-            "Variable": ""
-        },
-        "InsertSnippet2": {
-            "All Categories": "",
-            "Filter": "",
-            "Insert as HTML": "",
-            "Insert as template variable": "",
-            "Only search word beginning": "",
-            "HTML": "<<CharCounter>>",
-            "Insert Snippet": "<<InsertSnippet>>",
-            "InsertSnippet for Xinha": "<<InsertSnippet>>",
-            "Variable": "<<InsertSnippet>>"
-        },
-        "InsertTable": {
-            "Caption for the table": "",
-            "Cell padding:": "",
-            "Cell spacing:": "",
-            "Collapse borders:": "",
-            "Cols:": "",
-            "Em": "",
-            "Fixed width columns": "",
-            "Layou": "",
-            "Number of columns": "",
-            "Number of rows": "",
-            "Positioning of this table": "",
-            "Space between adjacent cells": "",
-            "Space between content and border in cell": "",
-            "Style of the border": "",
-            "Width of the table": "",
-            "Width unit": "",
-            "You must enter a number of columns": "",
-            "You must enter a number of rows": "",
-            "Absbottom": "<<InsertImage>>",
-            "Absmiddle": "<<InsertImage>>",
-            "Alignment:": "<<HorizontalRule>>",
-            "Border thickness:": "<<InsertImage>>",
-            "Leave empty for no border": "<<InsertImage>>",
-            "Not set": "<<InsertImage>>",
-            "Rows:": "<<Forms>>",
-            "Texttop": "<<InsertImage>>"
-        },
-        "LangMarks": {
-            "&mdash; language &mdash;": "",
-            "', '": "",
-            "English": "",
-            "French": "",
-            "Greek": "",
-            "language select": "",
-            "Latin": ""
-        },
-        "Linker": {
-            "(px)": "",
-            "Anchor-Link": "",
-            "Anchor:": "",
-            "Email Address:": "",
-            "Email Link": "",
-            "Location Bar:": "",
-            "Menu Bar:": "",
-            "Message Template:": "",
-            "New Window": "",
-            "Ordinary Link": "",
-            "Popup Window": "",
-            "PopupWindow": "",
-            "Remove Link": "",
-            "Resizeable:": "",
-            "Same Window (jump out of frames)": "",
-            "Scrollbars:": "",
-            "Shows On Hover": "",
-            "Status Bar:": "",
-            "Subject:": "",
-            "Title:": "",
-            "Toolbar:": "",
-            "URL Link": "",
-            "You must select some text before making a new link.": "",
-            "Are you sure you wish to remove this link?": "<<CreateLink>>",
-            "Insert/Modify Link": "<<CreateLink>>",
-            "Name:": "<<Forms>>",
-            "Size:": "<<Forms>>",
-            "Target:": "<<CreateLink>>",
-            "URL:": "<<CreateLink>>"
-        },
-        "ListType": {
-            "Choose list style type (for ordered lists)": "",
-            "Decimal numbers": "",
-            "Lower greek letters": "",
-            "Lower latin letters": "",
-            "Lower roman numbers": "",
-            "Upper latin letters": "",
-            "Upper roman numbers": ""
-        },
-        "MootoolsFileManager": {
-            "Insert File Link": "",
-            "You must select some text before making a new link.": "<<Linker>>"
-        },
-        "Opera": {
-            "MARK": "",
-            "The Paste button does not work in Mozilla based web browsers (technical security reasons). Press CTRL-V on your keyboard to paste directly.": ""
-        },
-        "PasteText": {
-            "Insert text in new paragraph": "",
-            "Paste as Plain Text": ""
-        },
-        "PreserveScripts": {
-            "JavaScript": "",
-            "PHP": ""
-        },
-        "QuickTag": {
-            "',\r\n                           'cl': '": "",
-            "ATTRIBUTES": "",
-            "Colors": "",
-            "Enter the TAG you want to insert": "",
-            "No CSS class avaiable": "",
-            "Ok": "",
-            "OPTIONS": "",
-            "Quick Tag Editor": "",
-            "TAGs": "",
-            "There are some unclosed quote": "",
-            "This attribute already exists in the TAG": "",
-            "You have to select some text": ""
-        },
-        "SaveSubmit": {
-            "in progress": "",
-            "Ready": "",
-            "Save": "",
-            "Saving...": ""
-        },
-        "SetId": {
-            "ID/Name:": "",
-            "Set Id and Name": "",
-            "Set Id/Name": "",
-            "Set ID/Name": "",
-            "Delete": "<<Abbreviation>>"
-        },
-        "SmartReplace": {
-            "ClosingDoubleQuotes": "",
-            "ClosingSingleQuote": "",
-            "Convert all quotes and dashes in the current document": "",
-            "Enable automatic replacements": "",
-            "OpeningDoubleQuotes": "",
-            "OpeningSingleQuote": "",
-            "SmartReplace": "",
-            "SmartReplace Settings": ""
-        },
-        "Stylist": {
-            "Styles": ""
-        },
-        "SuperClean": {
-            "Clean bad HTML from Microsoft Word.": "",
-            "Clean Selection Only": "",
-            "Clean up HTML": "",
-            "Cleaning Scope": "",
-            "General tidy up and correction of some problems.": "",
-            "Please select from the following cleaning options...": "",
-            "Please stand by while cleaning in process...": "",
-            "Remove alignment (left/right/justify).": "",
-            "Remove all classes (CSS).": "",
-            "Remove All HTML Tags": "",
-            "Remove all styles (CSS).": "",
-            "Remove custom font sizes.": "",
-            "Remove custom text colors.": "",
-            "Remove custom typefaces (font \"styles\").": "",
-            "Remove emphasis and annotations.": "",
-            "Remove lang attributes.": "",
-            "Remove Paragraphs": "",
-            "Remove superscripts and subscripts.": "",
-            "Replace directional quote marks with non-directional quote marks.": "",
-            "Vigorously purge HTML from Microsoft Word.": ""
-        },
-        "TableOperations": {
-            "Cell Type:": "",
-            "Cells down": "",
-            "Cells to the right, and": "",
-            "Do Not Change": "",
-            "Frame and borders": "",
-            "Header (th)": "",
-            "Merge current cell with:": "",
-            "Normal (td)": "",
-            "Columns": "<<Forms>>",
-            "Merge Cells": "<<ContextMenu>>",
-            "Rows": "<<Forms>>"
-        },
-        "UnsavedChanges": {
-            "You have unsaved changes in the editor": ""
-        },
-        "WebKit": {
-            "The Paste button does not work in this browser for security reasons. Press CTRL-V on your keyboard to paste directly.": "<<Gecko>>"
-        },
-        "Xinha": {
-            "&#8212; font &#8212;": "",
-            "&#8212; format &#8212;": "",
-            "&#8212; size &#8212;": "",
-            "1 (8 pt)": "",
-            "2 (10 pt)": "",
-            "3 (12 pt)": "",
-            "4 (14 pt)": "",
-            "5 (18 pt)": "",
-            "6 (24 pt)": "",
-            "7 (36 pt)": "",
-            "Address": "",
-            "Arial": "",
-            "Clean content pasted from Word": "",
-            "Clear Inline Font Specifications": "",
-            "Clear MSOffice tags": "",
-            "Close": "",
-            "Constructing object": "",
-            "Courier New": "",
-            "Create Statusbar": "",
-            "Create Toolbar": "",
-            "CTRL-0 (zero)": "",
-            "CTRL-1 .. CTRL-6": "",
-            "CTRL-A": "",
-            "CTRL-B": "",
-            "CTRL-C": "",
-            "CTRL-E": "",
-            "CTRL-I": "",
-            "CTRL-J": "",
-            "CTRL-L": "",
-            "CTRL-N": "",
-            "CTRL-R": "",
-            "CTRL-S": "",
-            "CTRL-U": "",
-            "CTRL-V": "",
-            "CTRL-X": "",
-            "CTRL-Y": "",
-            "CTRL-Z": "",
-            "Direction left to right": "",
-            "Direction right to left": "",
-            "Editor Help": "",
-            "ENTER": "",
-            "Error Loading Xinha.  Developers, check the Error Console for information.": "",
-            "Finishing": "",
-            "Formatted": "",
-            "Generate Xinha framework": "",
-            "Georgia": "",
-            "Heading 1": "",
-            "Heading 2": "",
-            "Heading 3": "",
-            "Heading 4": "",
-            "Heading 5": "",
-            "Heading 6": "",
-            "Headings": "",
-            "Impact": "",
-            "Init editor size": "",
-            "insert linebreak": "",
-            "Insert/Overwrite": "",
-            "Keyboard shortcuts": "",
-            "Loading Core": "",
-            "Loading in progress. Please wait!": "",
-            "Loading plugin $plugin": "",
-            "Loading plugins": "",
-            "MS Word Cleaner": "",
-            "new paragraph": "",
-            "Normal": "",
-            "Print document": "",
-            "Register plugin $plugin": "",
-            "Remove formatting": "",
-            "Save as": "",
-            "Select all": "",
-            "Select Color": "",
-            "Set format to paragraph": "",
-            "SHIFT-ENTER": "",
-            "Split Block": "",
-            "Tahoma": "",
-            "The editor provides the following key combinations:": "",
-            "Times New Roman": "",
-            "Toggle Borders": "",
-            "Touch here first to activate editor.": "",
-            "Verdana": "",
-            "Waiting for Iframe to load...": "",
-            "WingDings": "",
-            "Would you like to clear font colours?": "",
-            "Would you like to clear font sizes?": "",
-            "Would you like to clear font typefaces?": "",
-            "Xinha": ""
-        },
-        "BackgroundImage": {
-            "__ TRANSLATOR NOTE __": "*** BACKGROUNDIMAGE IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***",
-            "Remove Current Background": "",
-            "Set Background": "",
-            "Set page background image": "",
-            "Set Page Background Image": ""
-        },
-        "ClientsideSpellcheck": {
-            "__ TRANSLATOR NOTE __": "*** CLIENTSIDESPELLCHECK IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***",
-            "Spell Check using ieSpell": ""
-        },
-        "ExtendedFileManager": {
-            "__ TRANSLATOR NOTE __": "*** EXTENDEDFILEMANAGER IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***",
-            "10%": "",
-            "100%": "",
-            "200%": "",
-            "25%": "",
-            "50%": "",
-            "75%": "",
-            ">List View": "",
-            ">Thumbnail View": "",
-            "A:": "",
-            "Alt": "",
-            "Border Color": "",
-            "Constrain Proportions": "",
-            "Crop": "",
-            "D:": "",
-            "Directory": "",
-            "Directory Up": "",
-            "Edit": "",
-            "File List": "",
-            "File Manager": "",
-            "Filename:": "",
-            "Filesize:": "",
-            "Flip Horizontal": "",
-            "Flip Image": "",
-            "Flip Vertical": "",
-            "Folder": "",
-            "GIF": "",
-            "GIF format is not supported, image editing not supported.": "",
-            "H:": "",
-            "Image Editor": "",
-            "Image Selection": "",
-            "Invalid base directory:": "",
-            "JPEG High": "",
-            "JPEG Low": "",
-            "JPEG Medium": "",
-            "Loading": "",
-            "Lock": "",
-            "Marker": "",
-            "Maximum folder size limit reached. Upload disabled.": "",
-            "Measure": "",
-            "New Folder": "",
-            "No Files Found": "",
-            "No Image Available": "",
-            "Please enter value": "",
-            "PNG": "",
-            "Preset": "",
-            "Quality:": "",
-            "Refresh": "",
-            "Rename": "",
-            "Resize": "",
-            "Rotate": "",
-            "Rotate 180 &deg;": "",
-            "Rotate 90 &deg; CCW": "",
-            "Rotate 90 &deg; CW": "",
-            "Rotate Image": "",
-            "Start X:": "",
-            "Start Y:": "",
-            "Target Window": "",
-            "Toggle marker color": "",
-            "Trash": "",
-            "Upload": "",
-            "W:": "",
-            "X:": "",
-            "Xinha Image Editor": "",
-            "Y:": "",
-            "Zoom": "",
-            "Absbottom": "<<InsertImage>>",
-            "Absmiddle": "<<InsertImage>>",
-            "Clear": "<<FindReplace>>",
-            "Copy": "<<ContextMenu>>",
-            "Cut": "<<ContextMenu>>",
-            "Insert File Link": "<<MootoolsFileManager>>",
-            "New window (_blank)": "<<CreateLink>>",
-            "None (use implicit)": "<<CreateLink>>",
-            "Not set": "<<InsertImage>>",
-            "Positioning of this image": "<<InsertImage>>",
-            "Preview": "<<Equation>>",
-            "Same frame (_self)": "<<CreateLink>>",
-            "Save": "<<SaveSubmit>>",
-            "Texttop": "<<InsertImage>>",
-            "Title (tooltip)": "<<CreateLink>>",
-            "Top frame (_top)": "<<CreateLink>>",
-            "You must select some text before making a new link.": "<<Linker>>"
-        },
-        "Filter": {
-            "__ TRANSLATOR NOTE __": "*** FILTER IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***",
-            "Filter": "<<InsertSnippet2>>"
-        },
-        "HtmlTidy": {
-            "__ TRANSLATOR NOTE __": "*** HTMLTIDY IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***",
-            "Auto-Tidy": "",
-            "Don't Tidy": "",
-            "HTML Tidy": "",
-            "Tidy failed.  Check your HTML for syntax errors.": ""
-        },
-        "ImageManager": {
-            "__ TRANSLATOR NOTE __": "*** IMAGEMANAGER IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***",
-            "Angle:": "",
-            "Flickr Picture List": "",
-            "Flickr Pictures": "",
-            "Flickr Selection": "",
-            "Flickr Username/Email": "",
-            "Folder Name:": "",
-            "Image Format": "",
-            "Image List": "",
-            "Keyword": "",
-            "No Images Found": "",
-            "No Photos Found": "",
-            "No Videos Found": "",
-            "This Server": "",
-            "YouTube Selection": "",
-            "YouTube Username": "",
-            "YouTube Video List": "",
-            "YouTube Videos": "",
-            "A:": "<<ExtendedFileManager>>",
-            "Absbottom": "<<InsertImage>>",
-            "Absmiddle": "<<InsertImage>>",
-            "Clear": "<<FindReplace>>",
-            "Constrain Proportions": "<<ExtendedFileManager>>",
-            "Crop": "<<ExtendedFileManager>>",
-            "D:": "<<ExtendedFileManager>>",
-            "Directory": "<<ExtendedFileManager>>",
-            "Directory Up": "<<ExtendedFileManager>>",
-            "Edit": "<<ExtendedFileManager>>",
-            "Filename:": "<<ExtendedFileManager>>",
-            "Flip Horizontal": "<<ExtendedFileManager>>",
-            "Flip Image": "<<ExtendedFileManager>>",
-            "Flip Vertical": "<<ExtendedFileManager>>",
-            "GIF": "<<ExtendedFileManager>>",
-            "GIF format is not supported, image editing not supported.": "<<ExtendedFileManager>>",
-            "H:": "<<ExtendedFileManager>>",
-            "Image Editor": "<<ExtendedFileManager>>",
-            "Image Selection": "<<ExtendedFileManager>>",
-            "Insert Image": "<<InsertImage>>",
-            "Invalid base directory:": "<<ExtendedFileManager>>",
-            "JPEG High": "<<ExtendedFileManager>>",
-            "JPEG Low": "<<ExtendedFileManager>>",
-            "JPEG Medium": "<<ExtendedFileManager>>",
-            "Lock": "<<ExtendedFileManager>>",
-            "Marker": "<<ExtendedFileManager>>",
-            "Measure": "<<ExtendedFileManager>>",
-            "New Folder": "<<ExtendedFileManager>>",
-            "No Image Available": "<<ExtendedFileManager>>",
-            "Not set": "<<InsertImage>>",
-            "PNG": "<<ExtendedFileManager>>",
-            "Positioning of this image": "<<InsertImage>>",
-            "Quality:": "<<ExtendedFileManager>>",
-            "Refresh": "<<ExtendedFileManager>>",
-            "Resize": "<<ExtendedFileManager>>",
-            "Rotate": "<<ExtendedFileManager>>",
-            "Rotate 180 &deg;": "<<ExtendedFileManager>>",
-            "Rotate 90 &deg; CCW": "<<ExtendedFileManager>>",
-            "Rotate 90 &deg; CW": "<<ExtendedFileManager>>",
-            "Rotate Image": "<<ExtendedFileManager>>",
-            "Save": "<<SaveSubmit>>",
-            "Start X:": "<<ExtendedFileManager>>",
-            "Start Y:": "<<ExtendedFileManager>>",
-            "Texttop": "<<InsertImage>>",
-            "Trash": "<<ExtendedFileManager>>",
-            "W:": "<<ExtendedFileManager>>",
-            "X:": "<<ExtendedFileManager>>",
-            "Y:": "<<ExtendedFileManager>>"
-        },
-        "InsertMarquee": {
-            "__ TRANSLATOR NOTE __": "*** INSERTMARQUEE IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***",
-            "Alternate": "",
-            "Background-Color:": "",
-            "Behavior:": "",
-            "Continuous": "",
-            "Direction:": "",
-            "Insert scrolling marquee": "",
-            "Marquee Editor": "",
-            "Scroll Amount:": "",
-            "Scroll Delay:": "",
-            "Slide": "",
-            "Speed Control": "",
-            "Name": "<<Forms>>",
-            "Name/ID:": "<<Forms>>",
-            "Text:": "<<Forms>>"
-        },
-        "InsertPicture": {
-            "__ TRANSLATOR NOTE __": "*** INSERTPICTURE IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***",
-            "Leave empty for not defined": "",
-            " Open file in new window": "",
-            "Open file in new window": "",
-            "Upload file": "",
-            "Absbottom": "<<InsertImage>>",
-            "Absmiddle": "<<InsertImage>>",
-            "Alignment:": "<<HorizontalRule>>",
-            "Alternate text:": "<<InsertImage>>",
-            "Border thickness:": "<<InsertImage>>",
-            "Enter the image URL here": "<<InsertImage>>",
-            "For browsers that don't support images": "<<InsertImage>>",
-            "Horizontal padding": "<<InsertImage>>",
-            "Horizontal:": "<<InsertImage>>",
-            "Image Preview:": "<<InsertImage>>",
-            "Insert Image": "<<InsertImage>>",
-            "Leave empty for no border": "<<InsertImage>>",
-            "Not set": "<<InsertImage>>",
-            "Positioning of this image": "<<InsertImage>>",
-            "Preview": "<<Equation>>",
-            "Preview the image in a new window": "<<InsertImage>>",
-            "Size": "<<Forms>>",
-            "Texttop": "<<InsertImage>>",
-            "Vertical padding": "<<InsertImage>>",
-            "Vertical:": "<<InsertImage>>"
-        },
-        "NoteServer": {
-            "__ TRANSLATOR NOTE __": "*** NOTESERVER IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***",
-            "120%": "",
-            "150%": "",
-            "80%": "",
-            "Add GUIDO Code in a textbox on the page": "",
-            "Add MIDI link to allow students to hear the music": "",
-            "Format": "",
-            "GUIDO Code": "",
-            "Guido code": "",
-            "Image in applet": "",
-            "Insert GUIDO Music Notation": "",
-            "MIDI File": "",
-            "Source Code": "",
-            "With Mozilla, the applet will not be visible in editor, but only in Web page after submitting.": "",
-            "Zoom :": "",
-            "100%": "<<ExtendedFileManager>>",
-            "Image Preview": "<<InsertImage>>",
-            "Options": "<<FindReplace>>",
-            "Preview": "<<Equation>>",
-            "Preview the image in a new window": "<<InsertImage>>",
-            "Zoom": "<<ExtendedFileManager>>"
-        },
-        "PSLocal": {
-            "__ TRANSLATOR NOTE __": "*** PSLOCAL IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***",
-            "Confirm": "",
-            "Enable": "",
-            "Enable Gears in order to use local document storage and configuration.": "",
-            "Enabling Local Storage": "",
-            "Install": "",
-            "Learn About Local Storage": "",
-            "This will reload the page, causing you to lose any unsaved work.  Press \"OK\" to reload.": "",
-            "Xinha uses Google Gears to enable local document storage.  With Gears installed, you can save drafts of your documents on your hard drive, configure Xinha to look the way you want, and carry this information wherever you use Xinha on the web.": ""
-        },
-        "PSServer": {
-            "__ TRANSLATOR NOTE __": "*** PSSERVER IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***",
-            "File: ": "",
-            "Import": ""
-        },
-        "PersistentStorage": {
-            "__ TRANSLATOR NOTE __": "*** PERSISTENTSTORAGE IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***",
-            "Details": "",
-            "File Browser": "",
-            "Hello    There C ": "",
-            "Hello  There A ": "",
-            "Hello \" There B \"": "",
-            "Hello ' There D '": "",
-            "List of Places": "",
-            "New Document": "",
-            "Open": "",
-            "Open Document": "",
-            "Places": "",
-            "Please enter the name of the directory you'd like to create.": "",
-            "Save Document": "",
-            "This will erase any unsaved content.  If you're certain, please click OK to continue.": "",
-            "Web URL": "",
-            "Confirm": "<<PSLocal>>",
-            "Copy": "<<ContextMenu>>",
-            "Delete": "<<Abbreviation>>",
-            "Directory Up": "<<ExtendedFileManager>>",
-            "File List": "<<ExtendedFileManager>>",
-            "File Manager": "<<ExtendedFileManager>>",
-            "Filename": "<<ExtendedFileManager>>",
-            "Insert": "<<InsertNote>>",
-            "Insert Image": "<<InsertImage>>",
-            "New Folder": "<<ExtendedFileManager>>",
-            "Save": "<<SaveSubmit>>",
-            "You must select some text before making a new link.": "<<Linker>>"
-        },
-        "SpellChecker": {
-            "__ TRANSLATOR NOTE __": "*** SPELLCHECKER IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***",
-            "HTMLArea Spell Checker": "",
-            "Info": "",
-            "Learn": "",
-            "pliz weit ;-)": "",
-            "Revert": "",
-            "Spell Checker": ""
-        },
-        "Template": {
-            "__ TRANSLATOR NOTE __": "*** TEMPLATE IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***",
-            "Insert template": ""
-        },
-        "UnFormat": {
-            "__ TRANSLATOR NOTE __": "*** UNFORMAT IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***",
-            "All": "",
-            "All HTML:": "",
-            "Cleaning Area": "",
-            "Cleaning options": "",
-            "Formatting:": "",
-            "Page Cleaner": "",
-            "Select which types of formatting you would like to remove.": "",
-            "Selection": ""
-        }
-    }
-}
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/lang/merged/da.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/lang/merged/da.js
deleted file mode 100644
index d0cf9bf..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/lang/merged/da.js
+++ /dev/null
@@ -1,1577 +0,0 @@
-// Xinha Language Combined Translation File
-//
-// LANG: "da", ENCODING: UTF-8
-//
-// INSTRUCTIONS TO TRANSLATORS
-// ===========================================================================
-//
-// Your translation must be in UTF-8 Character Encoding.
-//
-// This is a JSON encoded file (plus comments), strings should be double-quote
-// only, do not use single quotes to surround strings - "hello", not 'hello'
-// do not have a trailing comma after the last entry in a section.
-//
-// Only full line comments are allowed (that a comments occupy entire lines).
-//
-// Search for the __NEW_TRANSLATIONS__ section below, this is where you will
-// want to focus, this section includes things that do not presently have a 
-// translation or for which the translation needs to be checked for accuracy.
-//
-// In the New Translations section a translation string is one of the following
-//
-//  "English String Here" : ""
-//     This means it is not translated yet, add your translation...
-//     "English String Here" : "Klingon String Here"
-//
-//  "English String Here" : "Translated String Here"
-//     This means that an existing translation for this string, in some other
-//     section has been found, and used.  Check that it is approprite for this
-//     section and if it is, that's fine leave it as is, otherwise change as
-//     appropriate.
-//
-//  "English String Here" : "<<AnotherSection>>"
-//     This means use the same translation for this string as <<AnotherSection>>
-//     this saves you re-tranlating strings.  If the Context of this section
-//     and the context of AnotherSection seem the same, that's fine leave it
-//     using that translation, but if this section needs a different translation, 
-//     you can provide it by replacing the link (<<AnotherSection>>) with that
-//     new translation.  For example - a "Table" in say "DataPlugin" is 
-//     perhaps translated differently to "Table" in "FurniturePlugin".
-//
-// TESTING YOUR TRANSLATION
-// ===========================================================================
-// Simply place your translation file on your webserver somewhere for example
-//
-//   /xinha/lang/merged/da.js
-//
-// and then tell Xinha where to get it (before loading XinhaCore.js) by 
-//
-//  _editor_lang              = 'da';
-//  _editor_lang_merged_file  = '/xinha/lang/merged/da.js';
-//
-// Xinha will load your new language definition.
-//
-// SUBMITTING YOUR TRANSLATION
-// ===========================================================================
-// Simply create a Ticket on the Xinha website and attach your translation 
-// file.
-//
-// The Xinha developers will take your file and use the 
-//     contrib/lc_split_merged_file.php
-// script to load it into the Xinha distribution.
-
-{
-    "Abbreviation": {
-        "Cancel": "Annuller",
-        "OK": "OK"
-    },
-    "AboutBox": {
-        "About this editor": "Om Xinha",
-        "Close": "Luk"
-    },
-    "BackgroundImage": {
-        "Cancel": "Annuller"
-    },
-    "ColorPicker": {
-        "Click a color...": "Vælg farve",
-        "Close": "Luk",
-        "Color: ": "Farve: ",
-        "OK": "OK",
-        "Sample": "Eksempel",
-        "Web Safe: ": "Web Safe: "
-    },
-    "ContextMenu": {
-        "Copy": "Kopier",
-        "Cut": "Klip",
-        "Justify Center": "Centrer",
-        "Justify Full": "Lige margener",
-        "Justify Left": "Venstrejuster",
-        "Justify Right": "Højrejuster",
-        "Paste": "Sæt ind"
-    },
-    "CreateLink": {
-        "Cancel": "Annuller",
-        "Insert/Modify Link": "Indsæt/rediger hyperlink",
-        "New window (_blank)": "Nyt vindue (_blank)",
-        "None (use implicit)": "ingen (implicit)",
-        "OK": "OK",
-        "Other": "Andet",
-        "Same frame (_self)": "Samme ramme (_self)",
-        "Target:": "Placering:",
-        "Title (tooltip):": "Titel (Tooltip):",
-        "Top frame (_top)": "Topramme (_top)",
-        "URL:": "URL:"
-    },
-    "EditTag": {
-        "Cancel": "Annuller",
-        "OK": "OK"
-    },
-    "Equation": {
-        "Cancel": "Annuller",
-        "OK": "OK",
-        "Preview": "Smugkig"
-    },
-    "ExtendedFileManager": {
-        "Absbottom": "Bund",
-        "Absmiddle": "Centreret",
-        "Align": "Placering",
-        "Alt": "Alt",
-        "Baseline": "Grundlinje",
-        "Border": "Ramme",
-        "Border Color": "Rammefarve",
-        "Bottom": "Tekstbund",
-        "Cancel": "Annuller",
-        "Clear": "Fortryd",
-        "Color": "Farve",
-        "Constrain Proportions": "Korrekt størrelsesforhold",
-        "Copy": "Kopier",
-        "Crop": "Beskær",
-        "Cut": "Klip",
-        "Directory": "Mappe",
-        "Directory Up": "Mappe op",
-        "Edit": "Rediger",
-        "File Manager": "Fil Manager",
-        "Filename:": "Filnavn:",
-        "Filesize:": "Filstørrelse:",
-        "Flip Horizontal": "Vend vandret",
-        "Flip Image": "Vend billede",
-        "Flip Vertical": "Vend lodret",
-        "GIF format is not supported, image editing not supported.": "GIF-Format ikke understøttet - kan ikke redigeres.",
-        "Height": "Højde",
-        "Height:": "Højde:",
-        "Insert File Link": "Indsæt fil-link",
-        "Invalid base directory:": "Ugyldig base mappe:",
-        "JPEG High": "JPEG høj",
-        "JPEG Low": "JPEG lav",
-        "JPEG Medium": "JPEG mellem",
-        "Left": "Venstre",
-        "Loading": "Henter",
-        "Lock": "Lås",
-        "Margin": "Margen",
-        "Marker": "Markør",
-        "Measure": "Målebånd",
-        "Middle": "Midt",
-        "New Folder": "Ny mappe",
-        "New window (_blank)": "Nyt vindue (_blank)",
-        "No Files Found": "Ingen filer fundet",
-        "No Image Available": "Ingen billeder tilgængelig",
-        "None (use implicit)": "ingen (implicit)",
-        "Not set": "Ubestemt",
-        "OK": "OK",
-        "Padding": "Spaltefyld",
-        "Positioning of this image": "Billedets position",
-        "Preview": "Smugkig",
-        "Quality:": "Kvalitet",
-        "Refresh": "Opdater",
-        "Rename": "Omdøb",
-        "Resize": "Ændre størrelse",
-        "Right": "Højre",
-        "Rotate": "Rotere",
-        "Rotate Image": "Drej billede",
-        "Same frame (_self)": "Samme ramme (_self)",
-        "Save": "Gem",
-        "Start X:": "Start X",
-        "Start Y:": "Start Y",
-        "Target Window": "Mål",
-        "Texttop": "Teksttop",
-        "Title (tooltip)": "Titel (Tooltip)",
-        "Toggle marker color": "Skift markørfarve",
-        "Top": "Top",
-        "Top frame (_top)": "Topramme (_top)",
-        "Trash": "Papirkurv",
-        "Upload": "Upload",
-        "W:": "W:",
-        "Width": "Bredde",
-        "Width:": "Bredde:",
-        "You must select some text before making a new link.": "Vælg venligst noget tekst før du laver et nyt link."
-    },
-    "FindReplace": {
-        "Clear": "Fortryd",
-        "Replace with:": "Erstat med"
-    },
-    "Forms": {
-        "Cancel": "Annuller",
-        "Image URL:": "Billede URL:",
-        "Name": "Navn",
-        "OK": "OK",
-        "Rows:": "Rækker:",
-        "Size:": "Størrelse"
-    },
-    "FullPage": {
-        "Cancel": "Annuller",
-        "Description:": "Beskrivelse:",
-        "OK": "OK"
-    },
-    "HorizontalRule": {
-        "Alignment:": "Justering:",
-        "Cancel": "Annuller",
-        "Center": "Centrer",
-        "Color:": "Farve",
-        "Height:": "Højde:",
-        "Horizontal Rule": "Vandret streg",
-        "Layout": "Layout",
-        "Left": "Venstre",
-        "OK": "OK",
-        "Right": "Højre",
-        "Width:": "Bredde:",
-        "percent": "procent",
-        "pixels": "pixel"
-    },
-    "HtmlTidy": {
-        "Tidy failed.  Check your HTML for syntax errors.": "Tidy mislykkedes. Tjek din HTML for syntaksfejl."
-    },
-    "ImageManager": {
-        "Absbottom": "Bund",
-        "Absmiddle": "Centreret",
-        "Angle:": "Vinkel:",
-        "Baseline": "Grundlinje",
-        "Bottom": "Tekstbund",
-        "Cancel": "Annuller",
-        "Clear": "Fortryd",
-        "Constrain Proportions": "Korrekt størrelsesforhold",
-        "Crop": "Beskær",
-        "Directory": "Mappe",
-        "Directory Up": "Mappe op",
-        "Edit": "Rediger",
-        "Filename:": "Filnavn:",
-        "Flip Horizontal": "Vend vandret",
-        "Flip Image": "Vend billede",
-        "Flip Vertical": "Vend lodret",
-        "Folder Name:": "Mappenavn",
-        "GIF format is not supported, image editing not supported.": "GIF-Format ikke understøttet - kan ikke redigeres.",
-        "Height:": "Højde:",
-        "Image Format": "Billedformat:",
-        "Insert Image": "Indsæt billede",
-        "Invalid base directory:": "Ugyldig base mappe:",
-        "JPEG High": "JPEG høj",
-        "JPEG Low": "JPEG lav",
-        "JPEG Medium": "JPEG mellem",
-        "Left": "Venstre",
-        "Lock": "Lås",
-        "Marker": "Markør",
-        "Measure": "Målebånd",
-        "Middle": "Midt",
-        "New Folder": "Ny mappe",
-        "No Image Available": "Ingen billeder tilgængelig",
-        "Not set": "Ubestemt",
-        "OK": "OK",
-        "Positioning of this image": "Billedets position",
-        "Quality:": "Kvalitet",
-        "Refresh": "Opdater",
-        "Resize": "Ændre størrelse",
-        "Right": "Højre",
-        "Rotate": "Rotere",
-        "Rotate Image": "Drej billede",
-        "Save": "Gem",
-        "Start X:": "Start X",
-        "Start Y:": "Start Y",
-        "Texttop": "Teksttop",
-        "Top": "Top",
-        "Trash": "Papirkurv",
-        "W:": "W:",
-        "Width:": "Bredde:"
-    },
-    "InlineStyler": {
-        "Background": "Baggrund",
-        "Baseline": "Grundlinje",
-        "Border": "Ramme",
-        "Bottom": "Tekstbund",
-        "Center": "Centrer",
-        "Char": "Plads",
-        "Collapsed borders": "Sammensmelt rammer",
-        "FG Color": "Font farve",
-        "Float": "Justering",
-        "Height": "Højde",
-        "Image URL": "Billede URL",
-        "Justify": "Lige margener",
-        "Layout": "Layout",
-        "Left": "Venstre",
-        "Margin": "Margen",
-        "Middle": "Midt",
-        "None": "Ingen",
-        "Padding": "Margen",
-        "Right": "Højre",
-        "Text align": "Tekst",
-        "Top": "Top",
-        "Vertical align": "Vertikal placering",
-        "Width": "Bredde",
-        "percent": "procent",
-        "pixels": "pixel"
-    },
-    "InsertAnchor": {
-        "Cancel": "Annuller",
-        "OK": "OK"
-    },
-    "InsertImage": {
-        "Absbottom": "Bund",
-        "Absmiddle": "Centreret",
-        "Alignment:": "Justering:",
-        "Alternate text:": "Alternativ text:",
-        "Baseline": "Grundlinje",
-        "Border thickness:": "Kantbredde:",
-        "Bottom": "Tekstbund",
-        "Cancel": "Annuller",
-        "Enter the image URL here": "Angiv billedets URL",
-        "For browsers that don't support images": "for browsere der ikke understøtter billeder",
-        "Horizontal padding": "Vandret fyld",
-        "Horizontal:": "vandret:",
-        "Image Preview:": "Billede smugkig:",
-        "Image URL:": "Billede URL:",
-        "Insert Image": "Indsæt billede",
-        "Layout": "Layout",
-        "Leave empty for no border": "Tom hvis ingen kant",
-        "Left": "Venstre",
-        "Middle": "Midt",
-        "Not set": "Ubestemt",
-        "OK": "OK",
-        "Positioning of this image": "Billedets position",
-        "Preview": "Smugkig",
-        "Preview the image in a new window": "Smugkig af billedet i et nyt vindue",
-        "Right": "Højre",
-        "Spacing": "Afstand",
-        "Texttop": "Teksttop",
-        "Top": "Top",
-        "Vertical padding": "Lodret fyld",
-        "Vertical:": "lodret:",
-        "You must enter the URL": "Du skal angive en URL"
-    },
-    "InsertMarquee": {
-        "Cancel": "Annuller",
-        "Height:": "Højde:",
-        "Left": "Venstre",
-        "Name": "Navn",
-        "OK": "OK",
-        "Right": "Højre",
-        "Width:": "Bredde:"
-    },
-    "InsertNote": {
-        "Cancel": "Annuller"
-    },
-    "InsertPicture": {
-        "Absbottom": "Bund",
-        "Absmiddle": "Centreret",
-        "Alignment:": "Justering:",
-        "Alternate text:": "Alternativ text:",
-        "Baseline": "Grundlinje",
-        "Border thickness:": "Kantbredde:",
-        "Bottom": "Tekstbund",
-        "Cancel": "Annuller",
-        "Enter the image URL here": "Angiv billedets URL",
-        "For browsers that don't support images": "for browsere der ikke understøtter billeder",
-        "Height:": "Højde:",
-        "Horizontal padding": "Vandret fyld",
-        "Horizontal:": "vandret:",
-        "Image Preview:": "Billede smugkig:",
-        "Image URL:": "Billede URL:",
-        "Insert Image": "Indsæt billede",
-        "Layout": "Layout",
-        "Leave empty for no border": "Tom hvis ingen kant",
-        "Left": "Venstre",
-        "Middle": "Midt",
-        "Not set": "Ubestemt",
-        "OK": "OK",
-        "Positioning of this image": "Billedets position",
-        "Preview": "Smugkig",
-        "Preview the image in a new window": "Smugkig af billedet i et nyt vindue",
-        "Right": "Højre",
-        "Size": "Størrelse",
-        "Spacing": "Afstand",
-        "Texttop": "Teksttop",
-        "Top": "Top",
-        "Vertical padding": "Lodret fyld",
-        "Vertical:": "lodret:",
-        "Width:": "Bredde:"
-    },
-    "InsertSnippet": {
-        "Cancel": "Annuller"
-    },
-    "InsertSnippet2": {
-        "Cancel": "Annuller"
-    },
-    "InsertTable": {
-        "Absbottom": "Bund",
-        "Absmiddle": "Centreret",
-        "Alignment:": "Justering:",
-        "Baseline": "Grundlinje",
-        "Border": "Ramme",
-        "Border thickness:": "Kantbredde:",
-        "Bottom": "Tekstbund",
-        "Cancel": "Annuller",
-        "Caption": "Titel",
-        "Cell padding:": "Cellefyld:",
-        "Cell spacing:": "Celleafstand:",
-        "Cols:": "Søjler:",
-        "Em": "Geviert (Em)",
-        "Fixed width columns": "Fast-bredde søjler",
-        "Insert Table": "Indsæt tabel",
-        "Layout": "Layout",
-        "Leave empty for no border": "Tom hvis ingen kant",
-        "Left": "Venstre",
-        "Middle": "Midt",
-        "Not set": "Ubestemt",
-        "Number of columns": "Antal søjler",
-        "Number of rows": "Antal rækker",
-        "OK": "OK",
-        "Percent": "Procent",
-        "Pixels": "Pixel",
-        "Positioning of this table": "Placering af tabel",
-        "Right": "Højre",
-        "Rows:": "Rækker:",
-        "Space between adjacent cells": "Afstand mellem celler",
-        "Space between content and border in cell": "Luft mellem indhold og kanter",
-        "Spacing": "Afstand",
-        "Texttop": "Teksttop",
-        "Top": "Top",
-        "Width of the table": "Tabelbredde",
-        "Width unit": "Breddeenhed",
-        "Width:": "Bredde:",
-        "You must enter a number of columns": "Du skal skrive antallet af søjler",
-        "You must enter a number of rows": "Du skal skrive antallet af rækker"
-    },
-    "Linker": {
-        "Cancel": "Annuller",
-        "Insert/Modify Link": "Indsæt/rediger hyperlink",
-        "Name:": "Navn",
-        "OK": "OK",
-        "Size:": "Størrelse",
-        "Target:": "Placering:",
-        "URL:": "URL:",
-        "You must select some text before making a new link.": "Vælg venligst noget tekst før du laver et nyt link."
-    },
-    "MootoolsFileManager": {
-        "Insert File Link": "Indsæt fil-link",
-        "You must select some text before making a new link.": "Vælg venligst noget tekst før du laver et nyt link."
-    },
-    "NoteServer": {
-        "Cancel": "Annuller",
-        "Image Preview": "Billede smugkig:",
-        "OK": "OK",
-        "Preview": "Smugkig",
-        "Preview the image in a new window": "Smugkig af billedet i et nyt vindue"
-    },
-    "Opera": {
-        "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."
-    },
-    "PSLocal": {
-        "Cancel": "Annuller"
-    },
-    "PasteText": {
-        "Cancel": "Annuller",
-        "OK": "OK"
-    },
-    "PersistentStorage": {
-        "Cancel": "Annuller",
-        "Copy": "Kopier",
-        "Directory Up": "Mappe op",
-        "File Manager": "Fil Manager",
-        "Filename": "Filnavn:",
-        "Insert Image": "Indsæt billede",
-        "New Folder": "Ny mappe",
-        "Save": "Gem",
-        "You must select some text before making a new link.": "Vælg venligst noget tekst før du laver et nyt link."
-    },
-    "QuickTag": {
-        "Cancel": "Annuller"
-    },
-    "SaveSubmit": {
-        "Save": "Gem"
-    },
-    "SetId": {
-        "Cancel": "Annuller",
-        "OK": "OK"
-    },
-    "SmartReplace": {
-        "OK": "OK"
-    },
-    "SpellChecker": {
-        "Cancel": "Ann uler",
-        "Dictionary": "Ordbog",
-        "Finished list of mispelled words": "Listen med stavefejl er gennemgået",
-        "I will open it in a new page.": "Jeg vil åbne det i en ny side.",
-        "Ignore": "Ignorer",
-        "Ignore all": "Ignorer alle",
-        "No mispelled words found with the selected dictionary.": "Der blev ikke fundet nogle stavefejl med den valgte ordbog.",
-        "OK": "OK",
-        "Original word": "Oprindeligt ord",
-        "Please confirm that you want to open this link": "Vil du følge dette link?",
-        "Please wait.  Calling spell checker.": "Vent venligst.  Henter stavekontrol.",
-        "Please wait: changing dictionary to": "Vent venligst: skifter ordbog til",
-        "Re-check": "Tjek igen",
-        "Replace": "Erstat",
-        "Replace all": "Erstat alle",
-        "Replace with": "Erstat med",
-        "Spell-check": "Stavekontrol",
-        "Suggestions": "Forslag",
-        "This will drop changes and quit spell checker.  Please confirm.": "Alle dine ændringer vil gå tabt, vil du fortsætte?"
-    },
-    "SuperClean": {
-        "Cancel": "Annuller",
-        "Clean up HTML": "Rengør HTML",
-        "General tidy up and correction of some problems.": "Generel oprydning og rettelse af diverse problemer.",
-        "OK": "OK",
-        "Please select from the following cleaning options...": "Vælg et eller flere af følgende rengøringsværktøjer...",
-        "Remove custom font sizes.": "Slet skriftstørrelser.",
-        "Remove custom text colors.": "Slet tekstfarver.",
-        "Remove custom typefaces (font \"styles\").": "Slet skriftsnit (font \"styles\").",
-        "Remove lang attributes.": "Slet lang attributter.",
-        "Replace directional quote marks with non-directional quote marks.": "Erstat directional anførselstegn med ikke-directional anførselstegn"
-    },
-    "TableOperations": {
-        "All four sides": "Alle fire sider",
-        "Borders": "Kanter",
-        "Cancel": "Fortryd",
-        "Caption": "Titel",
-        "Cell Properties": "Celle egenskaber",
-        "Cell properties": "Celle egenskaber",
-        "Delete cell": "Slet celle",
-        "Delete column": "Slet kollonne",
-        "Delete row": "Slet række",
-        "Description": "Beskrivelse",
-        "Frames": "Udvendig",
-        "Insert cell after": "Indsæt celle efter",
-        "Insert cell before": "Indsæt celle før",
-        "Insert column after": "Indsæt kolonne efter",
-        "Insert column before": "Indsæt kolonne før",
-        "Insert row after": "Indsæt række efter",
-        "Insert row before": "Indsæt række før",
-        "Merge cells": "Sammensæt celler",
-        "No rules": "Ingen rammer",
-        "No sides": "Ingen sider",
-        "OK": "OK",
-        "Padding": "Margen",
-        "Please click into some cell": "Klik på en celle",
-        "Row Properties": "Række egenskaber",
-        "Row properties": "Række egenskaber",
-        "Rows": "Rækker:",
-        "Rules will appear between all rows and columns": "Rammer mellem rækker og kolonner",
-        "Rules will appear between columns only": "Kun rammer mellem kolonner",
-        "Rules will appear between rows only": "Kun rammer mellem rækker",
-        "Spacing": "Afstand",
-        "Spacing and padding": "Afstand og margen",
-        "Split column": "Opdel kolonne",
-        "Split row": "Opdel række",
-        "Summary": "Beskrivelse",
-        "Table Properties": "Tabel egenskaber",
-        "Table properties": "Tabel egenskaber",
-        "The bottom side only": "Kun i bunden",
-        "The left-hand side only": "Kun i højre side",
-        "The right and left sides only": "Kun i siderne",
-        "The right-hand side only": "Kun i venstre side",
-        "The top and bottom sides only": "Kun i top og bund",
-        "The top side only": "Kun i toppen",
-        "Xinha cowardly refuses to delete the last cell in row.": "Du kan ikke slette den sidste celle i en række.",
-        "Xinha cowardly refuses to delete the last column in table.": "Du kan ikke slette den sidste kolonne i en tabel.",
-        "Xinha cowardly refuses to delete the last row in table.": "Du kan ikke slette den sidste række i en tabel.",
-        "pixels": "pixel"
-    },
-    "Template": {
-        "Cancel": "Annuller"
-    },
-    "UnFormat": {
-        "Cancel": "Annuller",
-        "OK": "OK"
-    },
-    "Xinha": {
-        "About this editor": "Om Xinha",
-        "Address": "Adresse",
-        "Background Color": "Baggrundsfarve",
-        "Bold": "Fed",
-        "Bulleted List": "Punktliste",
-        "Clean content pasted from Word": "Rens indhold kopieret fra Word",
-        "Clear Inline Font Specifications": "Fjern skrift valg",
-        "Clear MSOffice tags": "MSOffice filter",
-        "Close": "Luk",
-        "Constructing object": "Objekt registreres",
-        "Copy selection": "Kopier",
-        "Create Statusbar": "Opretter statuslinje",
-        "Create Toolbar": "Opretter værktøjslinje",
-        "Current style": "Anvendt stil",
-        "Cut selection": "Klip",
-        "Decrease Indent": "Formindsk indrykning",
-        "Direction left to right": "Tekst venstre mod højre",
-        "Direction right to left": "Tekst højre mod venstre",
-        "Finishing": "Afslutter",
-        "Font Color": "Skriftfarve",
-        "Formatted": "Formateret",
-        "Generate Xinha framework": "Xinha Framework genereres",
-        "Heading 1": "Overskrift 1",
-        "Heading 2": "Overskrift 2",
-        "Heading 3": "Overskrift 3",
-        "Heading 4": "Overskrift 4",
-        "Heading 5": "Overskrift 5",
-        "Heading 6": "Overskrift 6",
-        "Headings": "Overskrift 1 til 6",
-        "Help using editor": "Hjælp",
-        "Horizontal Rule": "Vandret streg",
-        "Increase Indent": "Forøg indrykning",
-        "Init editor size": "Størrelsen beregnes",
-        "Insert Table": "Indsæt tabel",
-        "Insert Web Link": "Indsæt hyperlink",
-        "Insert/Modify Image": "Indsæt/udskift billede",
-        "Insert/Overwrite": "Indsæt/Overskriv",
-        "Italic": "Kursiv",
-        "Justify Center": "Centrer",
-        "Justify Full": "Lige margener",
-        "Justify Left": "Venstrejuster",
-        "Justify Right": "Højrejuster",
-        "Keyboard shortcuts": "Tastaturgenveje",
-        "Loading in progress. Please wait!": "Editoren hentes ind. Vent venligst.",
-        "Loading plugin $plugin": "Plugin $plugin hentes",
-        "Normal": "Normal",
-        "Ordered List": "Ordnet liste",
-        "Paste from clipboard": "Indsæt",
-        "Path": "STi",
-        "Print document": "Udskriv dokument",
-        "Redoes your last action": "Gentag sidste ændring",
-        "Register plugin $plugin": "Plugin $plugin registreres",
-        "Remove formatting": "Fjern formatering",
-        "Save as": "Gem som",
-        "Select all": "Vælg alt",
-        "Set format to paragraph": "Formater afsnit",
-        "Split Block": "Del blok",
-        "Strikethrough": "Gennemstregning",
-        "Subscript": "Sænket skrift",
-        "Superscript": "Hævet skrift",
-        "The editor provides the following key combinations:": "Editoren kender følgende kombinationer:",
-        "Toggle Borders": "Tabelkanter til/fra",
-        "Toggle HTML Source": "HTML visning",
-        "Underline": "Understregning",
-        "Undoes your last action": "Fortryd sidste ændring",
-        "Would you like to clear font colours?": "Vil du fjerne skriftfarve valg",
-        "Would you like to clear font sizes?": "Vil du fjerne skriftstørrelse valg",
-        "Would you like to clear font typefaces?": "Vil du fjern skriftsnit valg",
-        "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.",
-        "insert linebreak": "Indsæt linjeskift",
-        "new paragraph": "Nyt afsnit"
-    },
-    "__NEW_TRANSLATIONS__": {
-        "Abbreviation": {
-            "Abbreviation": "",
-            "Delete": "",
-            "Expansion:": ""
-        },
-        "CharCounter": {
-            "... in progress": "",
-            "Chars": "",
-            "HTML": "",
-            "Words": ""
-        },
-        "CharacterMap": {
-            "Insert special character": ""
-        },
-        "ContextMenu": {
-            "_Delete Row": "",
-            "_Image Properties...": "",
-            "_Modify Link...": "",
-            "_Remove Link...": "",
-            "_Table Properties...": "",
-            "C_ell Properties...": "",
-            "Chec_k Link...": "",
-            "Create a link": "",
-            "Current URL is": "",
-            "De_lete Column": "",
-            "Delete Cell": "",
-            "Delete the current column": "",
-            "Delete the current row": "",
-            "How did you get here? (Please report!)": "",
-            "I_nsert Row Before": "",
-            "In_sert Row After": "",
-            "Insert _Column Before": "",
-            "Insert a new column after the current one": "",
-            "Insert a new column before the current one": "",
-            "Insert a new row after the current one": "",
-            "Insert a new row before the current one": "",
-            "Insert a paragraph after the current node": "",
-            "Insert a paragraph before the current node": "",
-            "Insert C_olumn After": "",
-            "Insert Cell After": "",
-            "Insert Cell Before": "",
-            "Insert paragraph after": "",
-            "Insert paragraph before": "",
-            "Link points to:": "",
-            "Make lin_k...": "",
-            "Merge Cells": "",
-            "Opens this link in a new window": "",
-            "Please confirm that you want to remove this element:": "",
-            "Please confirm that you want to unlink this element.": "",
-            "Remove the $elem Element...": "",
-            "Remove this node from the document": "",
-            "Ro_w Properties...": "",
-            "Show the image properties dialog": "",
-            "Show the Table Cell Properties dialog": "",
-            "Show the Table Properties dialog": "",
-            "Show the Table Row Properties dialog": "",
-            "Unlink the current element": ""
-        },
-        "CreateLink": {
-            "Are you sure you wish to remove this link?": "",
-            "You need to select some text before creating a link": ""
-        },
-        "DefinitionList": {
-            "definition description": "",
-            "definition list": "",
-            "definition term": ""
-        },
-        "Dialogs": {
-            "Some Text Here": ""
-        },
-        "DynamicCSS": {
-            "Choose stylesheet": "",
-            "Default": "",
-            "Undefined": ""
-        },
-        "EditTag": {
-            "Edit HTML for selected text": "",
-            "Edit Tag By Peg": "",
-            "Tag Editor": ""
-        },
-        "Equation": {
-            "!=": "",
-            "!in": "",
-            "&gt;-": "",
-            "&gt;=": "",
-            "&lt;=": "",
-            "&lt;=&gt;": "",
-            "&lt;x&gt;": "",
-            "&nbsp; `!` &nbsp;": "",
-            "&nbsp; `.` &nbsp;": "",
-            "&nbsp; `0` &nbsp;": "",
-            "&nbsp; `2` &nbsp;": "",
-            "&nbsp; `3` &nbsp;": "",
-            "&nbsp; `4` &nbsp;": "",
-            "&nbsp; `5` &nbsp;": "",
-            "&nbsp; `6` &nbsp;": "",
-            "&nbsp; `7` &nbsp;": "",
-            "&nbsp; `8` &nbsp;": "",
-            "&nbsp; `9` &nbsp;": "",
-            "&nbsp; `e` &nbsp;": "",
-            "&nbsp;&nbsp;`1` &nbsp;": "",
-            "&nbsp;`+{::}`&nbsp;": "",
-            "&nbsp;`-:\\ `": "",
-            "&nbsp;`-{::}`&nbsp;": "",
-            "&nbsp;`C`&nbsp;": "",
-            "&nbsp;`cos`": "",
-            "&nbsp;`ln`&nbsp;": "",
-            "&nbsp;`pi` &nbsp;": "",
-            "&nbsp;`sin`": "",
-            "&nbsp;`tan`": "",
-            "&nbsp;`times`&nbsp;": "",
-            "&quot;text&quot;": "",
-            "'+formula+'": "",
-            "((n),(k))": "",
-            "(x+1)/(x-1)": "",
-            "*": "",
-            "**": "",
-            "+-": "",
-            "-&gt;": "",
-            "-&lt;": "",
-            "-:": "",
-            "-=": "",
-            "//": "",
-            "/_": "",
-            ":.": "",
-            "=&gt;": "",
-            "@": "",
-            "[[a,b],[c,d]]": "",
-            "\\\\": "",
-            "\\nClick in the box to use your keyboard or use the buttons\\n": "",
-            "^^": "",
-            "^^^": "",
-            "__|": "",
-            "_|_": "",
-            "`!=`": "",
-            "`!in`": "",
-            "`&and;`": "",
-            "`&cap;`": "",
-            "`&cup;`": "",
-            "`&gt;-`": "",
-            "`&gt;=`": "",
-            "`&lt;=&gt;`": "",
-            "`&lt;=`": "",
-            "`&lt;x&gt;`": "",
-            "`&or;`": "",
-            "`&quot;text&quot;`": "",
-            "`((n),(k))`": "",
-            "`(x+1)/(x-1)`": "",
-            "`**`": "",
-            "`*`": "",
-            "`+-`": "",
-            "`-&gt;`": "",
-            "`-&lt;`": "",
-            "`-:`": "",
-            "`-=`": "",
-            "`//`": "",
-            "`/_`": "",
-            "`:.`": "",
-            "`=&gt;`": "",
-            "`@`": "",
-            "`[[a,b],[c,d]]`": "",
-            "`\\\\`": "",
-            "`__|`": "",
-            "`_|_`": "",
-            "`AA`": "",
-            "`aleph`": "",
-            "`alpha`": "",
-            "`and`": "",
-            "`bara`": "",
-            "`bba`": "",
-            "`bbba`": "",
-            "`beta`": "",
-            "`CC`": "",
-            "`cca`": "",
-            "`chi`": "",
-            "`darr`": "",
-            "`ddota`": "",
-            "`del`": "",
-            "`Delta`": "",
-            "`delta`": "",
-            "`diamond`": "",
-            "`dota`": "",
-            "`dy/dx`": "",
-            "`EE`": "",
-            "`epsi`": "",
-            "`eta`": "",
-            "`fra`": "",
-            "`Gamma`": "",
-            "`gamma`": "",
-            "`grad`": "",
-            "`harr`": "",
-            "`hArr`": "",
-            "`hata`": "",
-            "`if`": "",
-            "`in`": "",
-            "`int`": "",
-            "`iota`": "",
-            "`kappa`": "",
-            "`lambda`": "",
-            "`Lambda`": "",
-            "`lArr`": "",
-            "`larr`": "",
-            "`lim_(x-&gt;oo)`": "",
-            "`log`": "",
-            "`mu`": "",
-            "`NN`": "",
-            "`nn`": "",
-            "`not`": "",
-            "`nu`": "",
-            "`o+`": "",
-            "`o.`": "",
-            "`O/`": "",
-            "`oint`": "",
-            "`omega`": "",
-            "`Omega`": "",
-            "`oo`": "",
-            "`or`": "",
-            "`ox`": "",
-            "`Phi`": "",
-            "`phi`": "",
-            "`Pi`": "",
-            "`pi`": "",
-            "`prod`": "",
-            "`prop`": "",
-            "`Psi`": "",
-            "`psi`": "",
-            "`QQ`": "",
-            "`quad`": "",
-            "`rArr`": "",
-            "`rho`": "",
-            "`root(n)(x)`": "",
-            "`RR`": "",
-            "`sfa`": "",
-            "`sigma`": "",
-            "`Sigma`": "",
-            "`sqrt(x)`": "",
-            "`square`": "",
-            "`stackrel(-&gt;)(+)`": "",
-            "`sub`": "",
-            "`sube`": "",
-            "`sum`": "",
-            "`sup`": "",
-            "`supe`": "",
-            "`tau`": "",
-            "`Theta`": "",
-            "`theta`": "",
-            "`TT`": "",
-            "`tta`": "",
-            "`uarr`": "",
-            "`ula`": "",
-            "`upsilon`": "",
-            "`uu`": "",
-            "`veca`": "",
-            "`vv`": "",
-            "`x_(mn)`": "",
-            "`Xi`": "",
-            "`xi`": "",
-            "`xx`": "",
-            "`zeta`": "",
-            "`ZZ`": "",
-            "`|-&gt;`": "",
-            "`|--`": "",
-            "`|==`": "",
-            "`|__`": "",
-            "`|~`": "",
-            "`~=`": "",
-            "`~|`": "",
-            "`~~`": "",
-            "AA": "",
-            "aleph": "",
-            "alpha": "",
-            "and": "",
-            "AsciiMath Formula Input": "",
-            "AsciiMathML Example": "",
-            "bara": "",
-            "Based on ASCIIMathML by": "",
-            "bba": "",
-            "bbba": "",
-            "beta": "",
-            "CC": "",
-            "cca": "",
-            "chi": "",
-            "darr": "",
-            "ddota": "",
-            "del": "",
-            "Delta": "",
-            "delta": "",
-            "diamond": "",
-            "dota": "",
-            "dy/dx": "",
-            "EE": "",
-            "epsi": "",
-            "eta": "",
-            "For more information on AsciiMathML visit this page:": "",
-            "Formula Editor": "",
-            "fra": "",
-            "gamma": "",
-            "Gamma": "",
-            "grad": "",
-            "hArr": "",
-            "harr": "",
-            "hata": "",
-            "if": "",
-            "in": "",
-            "Input": "",
-            "int": "",
-            "int_a^bf(x)dx": "",
-            "iota": "",
-            "kappa": "",
-            "Lambda": "",
-            "lambda": "",
-            "larr": "",
-            "lArr": "",
-            "lim_(x-&gt;oo)": "",
-            "mu": "",
-            "NN": "",
-            "nn": "",
-            "nnn": "",
-            "not": "",
-            "nu": "",
-            "o+": "",
-            "o.": "",
-            "O/": "",
-            "oint": "",
-            "omega": "",
-            "Omega": "",
-            "oo": "",
-            "or": "",
-            "ox": "",
-            "Phi": "",
-            "phi": "",
-            "pi": "",
-            "Pi": "",
-            "prod": "",
-            "prop": "",
-            "psi": "",
-            "Psi": "",
-            "QQ": "",
-            "quad": "",
-            "rArr": "",
-            "rho": "",
-            "root(n)(x)": "",
-            "RR": "",
-            "sfa": "",
-            "sigma": "",
-            "Sigma": "",
-            "sqrt(x)": "",
-            "square": "",
-            "stackrel(-&gt;)(+)": "",
-            "sub": "",
-            "sube": "",
-            "sum": "",
-            "sum_(n=1)^oo": "",
-            "sup": "",
-            "supe": "",
-            "tau": "",
-            "Theta": "",
-            "theta": "",
-            "TT": "",
-            "tta": "",
-            "uarr": "",
-            "ula": "",
-            "upsilon": "",
-            "uu": "",
-            "uuu": "",
-            "veca": "",
-            "vv": "",
-            "vvv": "",
-            "x^(m+n)": "",
-            "x_(mn)": "",
-            "Xi": "",
-            "xi": "",
-            "xx": "",
-            "zeta": "",
-            "ZZ": "",
-            "|-&gt;": "",
-            "|--": "",
-            "|==": "",
-            "|__": "",
-            "|~": "",
-            "~=": "",
-            "~|": "",
-            "~~": ""
-        },
-        "FancySelects": {
-            "'+opt.text+'": ""
-        },
-        "FindReplace": {
-            "';\r\n  var tagc = '": "",
-            "Case sensitive search": "",
-            "Done": "",
-            "Enter the text you want to find": "",
-            "Find and Replace": "",
-            "found item": "",
-            "found items": "",
-            "Highlight": "",
-            "Inform a replacement word": "",
-            "Next": "",
-            "not found": "",
-            "Options": "",
-            "replaced item": "",
-            "replaced items": "",
-            "Search for:": "",
-            "Substitute all occurrences": "",
-            "Substitute this occurrence?": "",
-            "Undo": "",
-            "Whole words only": ""
-        },
-        "FormOperations": {
-            "Enter the name for new option.": "",
-            "Form Editor": "",
-            "Insert a check box.": "",
-            "Insert a Form.": "",
-            "Insert a multi-line text field.": "",
-            "Insert a radio button.": "",
-            "Insert a select field.": "",
-            "Insert a submit/reset button.": "",
-            "Insert a text, password or hidden field.": "",
-            "Message Sent": "",
-            "Please Select...": ""
-        },
-        "Forms": {
-            "'onClick'=": "",
-            "Access Key:": "",
-            "Action URL:": "",
-            "Button Script": "",
-            "Checked": "",
-            "Columns:": "",
-            "Default text (optional)": "",
-            "Dimensions": "",
-            "Disabled": "",
-            "Encoding:": "",
-            "For Control:": "",
-            "Form": "",
-            "Form Element: FIELDSET": "",
-            "Form Element: INPUT": "",
-            "Form Element: LABEL": "",
-            "Form Element: SELECT": "",
-            "Form Element: TEXTAREA": "",
-            "Form handler script": "",
-            "Form Name:": "",
-            "Get": "",
-            "Hard": "",
-            "Height in number of rows": "",
-            "HTML-Form to CGI (default)": "",
-            "Image source": "",
-            "Initial Text:": "",
-            "Insert/Edit Form": "",
-            "Insert/Edit Form Element FIELDSET": "",
-            "Insert/Edit Form Element INPUT": "",
-            "Insert/Edit Form Element LABEL": "",
-            "Insert/Edit Form Element SELECT": "",
-            "Insert/Edit Form Element TEXTAREA": "",
-            "Javascript for button click": "",
-            "Label:": "",
-            "Legend:": "",
-            "Max length:": "",
-            "Maximum number of characters accepted": "",
-            "Method:": "",
-            "multipart Form Data (File-Upload)": "",
-            "Name of the form input": "",
-            "Name of the form select": "",
-            "name of the textarea": "",
-            "Name/ID:": "",
-            "normal": "",
-            "nowrap": "",
-            "Off": "",
-            "Physical": "",
-            "Please enter a Label": "",
-            "Post": "",
-            "pre": "",
-            "Read Only": "",
-            "Size of text box in characters": "",
-            "Soft": "",
-            "Tab Index:": "",
-            "Target Frame:": "",
-            "Text:": "",
-            "URL of image": "",
-            "Value of the form input": "",
-            "Value:": "",
-            "Virtual": "",
-            "Width in number of characters": "",
-            "Wrap Mode:": "",
-            "You must enter a Name": "",
-            "Options": "<<FindReplace>>"
-        },
-        "FullPage": {
-            "...": "",
-            "Alternate style-sheet:": "",
-            "Background color:": "",
-            "Character set:": "",
-            "cyrillic (ISO-8859-5)": "",
-            "cyrillic (KOI8-R)": "",
-            "cyrillic (WINDOWS-1251)": "",
-            "DOCTYPE:": "",
-            "Document properties": "",
-            "Document title:": "",
-            "Keywords:": "",
-            "Primary style-sheet:": "",
-            "Text color:": "",
-            "UTF-8 (recommended)": "",
-            "western (ISO-8859-1)": ""
-        },
-        "FullScreen": {
-            "Maximize/Minimize Editor": ""
-        },
-        "Gecko": {
-            "The Paste button does not work in this browser for security reasons. Press CTRL-V on your keyboard to paste directly.": ""
-        },
-        "HorizontalRule": {
-            "&#x00d7;": "",
-            "&nbsp;": "",
-            "Insert/edit horizontal rule": "",
-            "Insert/Edit Horizontal Rule": "",
-            "No shading": "",
-            "Style": ""
-        },
-        "InlineStyler": {
-            "CSS Style": "",
-            "-": "<<Equation>>"
-        },
-        "InsertAnchor": {
-            "Anchor name": "",
-            "Insert Anchor": "",
-            "Delete": "<<Abbreviation>>"
-        },
-        "InsertNote": {
-            "Insert": "",
-            "Insert footnote": "",
-            "Insert Note": ""
-        },
-        "InsertPagebreak": {
-            "Page break": "",
-            "Page Break": ""
-        },
-        "InsertSmiley": {
-            "Insert Smiley": ""
-        },
-        "InsertSnippet": {
-            "\\n  This is an information about something\\n": "",
-            "Hide preview": "",
-            "Insert as": "",
-            "Insert Snippet": "",
-            "InsertSnippet for Xinha": "",
-            "Link1": "",
-            "Link2": "",
-            "Link3": "",
-            "Link4": "",
-            "Link5": "",
-            "Show preview": "",
-            "This is an information about something": "",
-            "Variable": ""
-        },
-        "InsertSnippet2": {
-            "All Categories": "",
-            "Filter": "",
-            "Insert as HTML": "",
-            "Insert as template variable": "",
-            "Only search word beginning": "",
-            "HTML": "<<CharCounter>>",
-            "Insert Snippet": "<<InsertSnippet>>",
-            "InsertSnippet for Xinha": "<<InsertSnippet>>",
-            "Variable": "<<InsertSnippet>>"
-        },
-        "InsertTable": {
-            "Caption for the table": "",
-            "Collapse borders:": "",
-            "Layou": "",
-            "Style of the border": ""
-        },
-        "LangMarks": {
-            "&mdash; language &mdash;": "",
-            "', '": "",
-            "English": "",
-            "French": "",
-            "Greek": "",
-            "language select": "",
-            "Latin": ""
-        },
-        "Linker": {
-            "(px)": "",
-            "Anchor-Link": "",
-            "Anchor:": "",
-            "Email Address:": "",
-            "Email Link": "",
-            "Location Bar:": "",
-            "Menu Bar:": "",
-            "Message Template:": "",
-            "New Window": "",
-            "Ordinary Link": "",
-            "Popup Window": "",
-            "PopupWindow": "",
-            "Remove Link": "",
-            "Resizeable:": "",
-            "Same Window (jump out of frames)": "",
-            "Scrollbars:": "",
-            "Shows On Hover": "",
-            "Status Bar:": "",
-            "Subject:": "",
-            "Title:": "",
-            "Toolbar:": "",
-            "URL Link": "",
-            "Are you sure you wish to remove this link?": "<<CreateLink>>"
-        },
-        "ListType": {
-            "Choose list style type (for ordered lists)": "",
-            "Decimal numbers": "",
-            "Lower greek letters": "",
-            "Lower latin letters": "",
-            "Lower roman numbers": "",
-            "Upper latin letters": "",
-            "Upper roman numbers": ""
-        },
-        "Opera": {
-            "MARK": ""
-        },
-        "PasteText": {
-            "Insert text in new paragraph": "",
-            "Paste as Plain Text": ""
-        },
-        "PreserveScripts": {
-            "JavaScript": "",
-            "PHP": ""
-        },
-        "QuickTag": {
-            "',\r\n                           'cl': '": "",
-            "ATTRIBUTES": "",
-            "Colors": "",
-            "Enter the TAG you want to insert": "",
-            "No CSS class avaiable": "",
-            "Ok": "",
-            "OPTIONS": "",
-            "Quick Tag Editor": "",
-            "TAGs": "",
-            "There are some unclosed quote": "",
-            "This attribute already exists in the TAG": "",
-            "You have to select some text": ""
-        },
-        "SaveSubmit": {
-            "in progress": "",
-            "Ready": "",
-            "Saving...": ""
-        },
-        "SetId": {
-            "ID/Name:": "",
-            "Set Id and Name": "",
-            "Set Id/Name": "",
-            "Set ID/Name": "",
-            "Delete": "<<Abbreviation>>"
-        },
-        "SmartReplace": {
-            "ClosingDoubleQuotes": "",
-            "ClosingSingleQuote": "",
-            "Convert all quotes and dashes in the current document": "",
-            "Enable automatic replacements": "",
-            "OpeningDoubleQuotes": "",
-            "OpeningSingleQuote": "",
-            "SmartReplace": "",
-            "SmartReplace Settings": ""
-        },
-        "Stylist": {
-            "Styles": ""
-        },
-        "SuperClean": {
-            "Clean bad HTML from Microsoft Word.": "",
-            "Clean Selection Only": "",
-            "Cleaning Scope": "",
-            "Please stand by while cleaning in process...": "",
-            "Remove alignment (left/right/justify).": "",
-            "Remove all classes (CSS).": "",
-            "Remove All HTML Tags": "",
-            "Remove all styles (CSS).": "",
-            "Remove emphasis and annotations.": "",
-            "Remove Paragraphs": "",
-            "Remove superscripts and subscripts.": "",
-            "Vigorously purge HTML from Microsoft Word.": ""
-        },
-        "TableOperations": {
-            "Cell Type:": "",
-            "Cells down": "",
-            "Cells to the right, and": "",
-            "Do Not Change": "",
-            "Frame and borders": "",
-            "Header (th)": "",
-            "Merge current cell with:": "",
-            "Normal (td)": "",
-            "Columns": "<<Forms>>",
-            "Merge Cells": "<<ContextMenu>>"
-        },
-        "UnsavedChanges": {
-            "You have unsaved changes in the editor": ""
-        },
-        "WebKit": {
-            "The Paste button does not work in this browser for security reasons. Press CTRL-V on your keyboard to paste directly.": "<<Gecko>>"
-        },
-        "Xinha": {
-            "&#8212; font &#8212;": "",
-            "&#8212; format &#8212;": "",
-            "&#8212; size &#8212;": "",
-            "1 (8 pt)": "",
-            "2 (10 pt)": "",
-            "3 (12 pt)": "",
-            "4 (14 pt)": "",
-            "5 (18 pt)": "",
-            "6 (24 pt)": "",
-            "7 (36 pt)": "",
-            "Arial": "",
-            "Courier New": "",
-            "CTRL-0 (zero)": "",
-            "CTRL-1 .. CTRL-6": "",
-            "CTRL-A": "",
-            "CTRL-B": "",
-            "CTRL-C": "",
-            "CTRL-E": "",
-            "CTRL-I": "",
-            "CTRL-J": "",
-            "CTRL-L": "",
-            "CTRL-N": "",
-            "CTRL-R": "",
-            "CTRL-S": "",
-            "CTRL-U": "",
-            "CTRL-V": "",
-            "CTRL-X": "",
-            "CTRL-Y": "",
-            "CTRL-Z": "",
-            "Editor Help": "",
-            "ENTER": "",
-            "Error Loading Xinha.  Developers, check the Error Console for information.": "",
-            "Georgia": "",
-            "Impact": "",
-            "Loading Core": "",
-            "Loading plugins": "",
-            "MS Word Cleaner": "",
-            "Select Color": "",
-            "SHIFT-ENTER": "",
-            "Tahoma": "",
-            "Times New Roman": "",
-            "Touch here first to activate editor.": "",
-            "Verdana": "",
-            "Waiting for Iframe to load...": "",
-            "WingDings": "",
-            "Xinha": ""
-        },
-        "BackgroundImage": {
-            "__ TRANSLATOR NOTE __": "*** BACKGROUNDIMAGE IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***",
-            "Remove Current Background": "",
-            "Set Background": "",
-            "Set page background image": "",
-            "Set Page Background Image": ""
-        },
-        "ClientsideSpellcheck": {
-            "__ TRANSLATOR NOTE __": "*** CLIENTSIDESPELLCHECK IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***",
-            "Spell Check using ieSpell": ""
-        },
-        "ExtendedFileManager": {
-            "__ TRANSLATOR NOTE __": "*** EXTENDEDFILEMANAGER IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***",
-            "10%": "",
-            "100%": "",
-            "200%": "",
-            "25%": "",
-            "50%": "",
-            "75%": "",
-            ">List View": "",
-            ">Thumbnail View": "",
-            "A:": "",
-            "D:": "",
-            "File List": "",
-            "Folder": "",
-            "GIF": "",
-            "H:": "",
-            "Image Editor": "",
-            "Image Selection": "",
-            "Maximum folder size limit reached. Upload disabled.": "",
-            "Please enter value": "",
-            "PNG": "",
-            "Preset": "",
-            "Rotate 180 &deg;": "",
-            "Rotate 90 &deg; CCW": "",
-            "Rotate 90 &deg; CW": "",
-            "X:": "",
-            "Xinha Image Editor": "",
-            "Y:": "",
-            "Zoom": ""
-        },
-        "Filter": {
-            "__ TRANSLATOR NOTE __": "*** FILTER IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***",
-            "Filter": "<<InsertSnippet2>>"
-        },
-        "HtmlTidy": {
-            "__ TRANSLATOR NOTE __": "*** HTMLTIDY IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***",
-            "Auto-Tidy": "",
-            "Don't Tidy": "",
-            "HTML Tidy": ""
-        },
-        "ImageManager": {
-            "__ TRANSLATOR NOTE __": "*** IMAGEMANAGER IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***",
-            "Flickr Picture List": "",
-            "Flickr Pictures": "",
-            "Flickr Selection": "",
-            "Flickr Username/Email": "",
-            "Image List": "",
-            "Keyword": "",
-            "No Images Found": "",
-            "No Photos Found": "",
-            "No Videos Found": "",
-            "This Server": "",
-            "YouTube Selection": "",
-            "YouTube Username": "",
-            "YouTube Video List": "",
-            "YouTube Videos": "",
-            "A:": "<<ExtendedFileManager>>",
-            "D:": "<<ExtendedFileManager>>",
-            "GIF": "<<ExtendedFileManager>>",
-            "H:": "<<ExtendedFileManager>>",
-            "Image Editor": "<<ExtendedFileManager>>",
-            "Image Selection": "<<ExtendedFileManager>>",
-            "PNG": "<<ExtendedFileManager>>",
-            "Rotate 180 &deg;": "<<ExtendedFileManager>>",
-            "Rotate 90 &deg; CCW": "<<ExtendedFileManager>>",
-            "Rotate 90 &deg; CW": "<<ExtendedFileManager>>",
-            "X:": "<<ExtendedFileManager>>",
-            "Y:": "<<ExtendedFileManager>>"
-        },
-        "InsertMarquee": {
-            "__ TRANSLATOR NOTE __": "*** INSERTMARQUEE IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***",
-            "Alternate": "",
-            "Background-Color:": "",
-            "Behavior:": "",
-            "Continuous": "",
-            "Direction:": "",
-            "Insert scrolling marquee": "",
-            "Marquee Editor": "",
-            "Scroll Amount:": "",
-            "Scroll Delay:": "",
-            "Slide": "",
-            "Speed Control": "",
-            "Name/ID:": "<<Forms>>",
-            "Text:": "<<Forms>>"
-        },
-        "InsertPicture": {
-            "__ TRANSLATOR NOTE __": "*** INSERTPICTURE IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***",
-            "Leave empty for not defined": "",
-            " Open file in new window": "",
-            "Open file in new window": "",
-            "Upload file": ""
-        },
-        "NoteServer": {
-            "__ TRANSLATOR NOTE __": "*** NOTESERVER IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***",
-            "120%": "",
-            "150%": "",
-            "80%": "",
-            "Add GUIDO Code in a textbox on the page": "",
-            "Add MIDI link to allow students to hear the music": "",
-            "Format": "",
-            "Guido code": "",
-            "GUIDO Code": "",
-            "Image in applet": "",
-            "Insert GUIDO Music Notation": "",
-            "MIDI File": "",
-            "Source Code": "",
-            "With Mozilla, the applet will not be visible in editor, but only in Web page after submitting.": "",
-            "Zoom :": "",
-            "100%": "<<ExtendedFileManager>>",
-            "Options": "<<FindReplace>>",
-            "Zoom": "<<ExtendedFileManager>>"
-        },
-        "PSLocal": {
-            "__ TRANSLATOR NOTE __": "*** PSLOCAL IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***",
-            "Confirm": "",
-            "Enable": "",
-            "Enable Gears in order to use local document storage and configuration.": "",
-            "Enabling Local Storage": "",
-            "Install": "",
-            "Learn About Local Storage": "",
-            "This will reload the page, causing you to lose any unsaved work.  Press \"OK\" to reload.": "",
-            "Xinha uses Google Gears to enable local document storage.  With Gears installed, you can save drafts of your documents on your hard drive, configure Xinha to look the way you want, and carry this information wherever you use Xinha on the web.": ""
-        },
-        "PSServer": {
-            "__ TRANSLATOR NOTE __": "*** PSSERVER IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***",
-            "File: ": "",
-            "Import": ""
-        },
-        "PersistentStorage": {
-            "__ TRANSLATOR NOTE __": "*** PERSISTENTSTORAGE IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***",
-            "Details": "",
-            "File Browser": "",
-            "Hello    There C ": "",
-            "Hello  There A ": "",
-            "Hello \" There B \"": "",
-            "Hello ' There D '": "",
-            "List of Places": "",
-            "New Document": "",
-            "Open": "",
-            "Open Document": "",
-            "Places": "",
-            "Please enter the name of the directory you'd like to create.": "",
-            "Save Document": "",
-            "This will erase any unsaved content.  If you're certain, please click OK to continue.": "",
-            "Web URL": "",
-            "Confirm": "<<PSLocal>>",
-            "Delete": "<<Abbreviation>>",
-            "File List": "<<ExtendedFileManager>>",
-            "Insert": "<<InsertNote>>"
-        },
-        "SpellChecker": {
-            "__ TRANSLATOR NOTE __": "*** SPELLCHECKER IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***",
-            "HTMLArea Spell Checker": "",
-            "Info": "",
-            "Learn": "",
-            "pliz weit ;-)": "",
-            "Revert": "",
-            "Spell Checker": ""
-        },
-        "Template": {
-            "__ TRANSLATOR NOTE __": "*** TEMPLATE IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***",
-            "Insert template": ""
-        },
-        "UnFormat": {
-            "__ TRANSLATOR NOTE __": "*** UNFORMAT IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***",
-            "All": "",
-            "All HTML:": "",
-            "Cleaning Area": "",
-            "Cleaning options": "",
-            "Formatting:": "",
-            "Page Cleaner": "",
-            "Select which types of formatting you would like to remove.": "",
-            "Selection": ""
-        }
-    }
-}
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/lang/merged/de.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/lang/merged/de.js
deleted file mode 100644
index 6c6b4d8..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/lang/merged/de.js
+++ /dev/null
@@ -1,1567 +0,0 @@
-// Xinha Language Combined Translation File
-//
-// LANG: "de", ENCODING: UTF-8
-//
-// INSTRUCTIONS TO TRANSLATORS
-// ===========================================================================
-//
-// Your translation must be in UTF-8 Character Encoding.
-//
-// This is a JSON encoded file (plus comments), strings should be double-quote
-// only, do not use single quotes to surround strings - "hello", not 'hello'
-// do not have a trailing comma after the last entry in a section.
-//
-// Only full line comments are allowed (that a comments occupy entire lines).
-//
-// Search for the __NEW_TRANSLATIONS__ section below, this is where you will
-// want to focus, this section includes things that do not presently have a 
-// translation or for which the translation needs to be checked for accuracy.
-//
-// In the New Translations section a translation string is one of the following
-//
-//  "English String Here" : ""
-//     This means it is not translated yet, add your translation...
-//     "English String Here" : "Klingon String Here"
-//
-//  "English String Here" : "Translated String Here"
-//     This means that an existing translation for this string, in some other
-//     section has been found, and used.  Check that it is approprite for this
-//     section and if it is, that's fine leave it as is, otherwise change as
-//     appropriate.
-//
-//  "English String Here" : "<<AnotherSection>>"
-//     This means use the same translation for this string as <<AnotherSection>>
-//     this saves you re-tranlating strings.  If the Context of this section
-//     and the context of AnotherSection seem the same, that's fine leave it
-//     using that translation, but if this section needs a different translation, 
-//     you can provide it by replacing the link (<<AnotherSection>>) with that
-//     new translation.  For example - a "Table" in say "DataPlugin" is 
-//     perhaps translated differently to "Table" in "FurniturePlugin".
-//
-// TESTING YOUR TRANSLATION
-// ===========================================================================
-// Simply place your translation file on your webserver somewhere for example
-//
-//   /xinha/lang/merged/de.js
-//
-// and then tell Xinha where to get it (before loading XinhaCore.js) by 
-//
-//  _editor_lang              = 'de';
-//  _editor_lang_merged_file  = '/xinha/lang/merged/de.js';
-//
-// Xinha will load your new language definition.
-//
-// SUBMITTING YOUR TRANSLATION
-// ===========================================================================
-// Simply create a Ticket on the Xinha website and attach your translation 
-// file.
-//
-// The Xinha developers will take your file and use the 
-//     contrib/lc_split_merged_file.php
-// script to load it into the Xinha distribution.
-
-{
-    "Abbreviation": {
-        "Abbreviation": "Abkürzung",
-        "Cancel": "Abbrechen",
-        "Delete": "Löschen",
-        "Expansion:": "Erklärung:",
-        "OK": "OK"
-    },
-    "AboutBox": {
-        "About this editor": "Über diesen Editor",
-        "Close": "Schließen"
-    },
-    "BackgroundImage": {
-        "Cancel": "Abbrechen",
-        "Remove Current Background": "Aktuellen Hintergrund entfernen",
-        "Set Page Background Image": "Seiten-Hintergrundbild setzen",
-        "Set page background image": "Seiten-Hintergrundbild setzen"
-    },
-    "CharCounter": {
-        "... in progress": "... in Bearbeitung",
-        "Chars": "Zeichen",
-        "HTML": "HTML",
-        "Words": "Worte"
-    },
-    "CharacterMap": {
-        "Insert special character": "Sonderzeichen einfügen"
-    },
-    "ClientsideSpellcheck": {
-        "Spell Check using ieSpell": "Englische Rechtschreibkontrolle mit ieSpell"
-    },
-    "ColorPicker": {
-        "Click a color...": "Farbe wählen",
-        "Close": "Schließen",
-        "Color: ": "Farbe: ",
-        "OK": "OK",
-        "Sample": "Beispiel",
-        "Web Safe: ": "Web Safe: "
-    },
-    "ContextMenu": {
-        "C_ell Properties...": "Zellenoptionen",
-        "Chec_k Link...": "Link testen",
-        "Copy": "Kopieren",
-        "Create a link": "Link erstellen",
-        "Current URL is": "Aktuelle URL ist",
-        "Cut": "Ausschneiden",
-        "De_lete Column": "Spalte löschen",
-        "Delete the current column": "Spalte löschen",
-        "Delete the current row": "Zeile löschen",
-        "How did you get here? (Please report!)": "Wie sind Sie denn hier hin gekommen? (Please report!)",
-        "I_nsert Row Before": "Zeile einfügen vor Position",
-        "In_sert Row After": "Zeile einügen nach Position",
-        "Insert C_olumn After": "Spalte einfügen nach Position",
-        "Insert _Column Before": "Spalte einfügen vor Position",
-        "Insert a new column after the current one": "Spalte einfügen nach der aktuellen Position",
-        "Insert a new column before the current one": "Spalte einfügen vor der aktuellen Position",
-        "Insert a new row after the current one": "Zeile einfügen nach der aktuellen Position",
-        "Insert a new row before the current one": "Zeile einfügen vor der aktuellen Position",
-        "Insert a paragraph after the current node": "Absatz einfügen hinter der aktuellen Position",
-        "Insert a paragraph before the current node": "Absatz einfügen vor der aktuellen Position",
-        "Insert paragraph after": "Absatz einfügen hinter Position",
-        "Insert paragraph before": "Absatz einfügen vor Position",
-        "Justify Center": "Zentriert",
-        "Justify Full": "Blocksatz",
-        "Justify Left": "Linksbündig",
-        "Justify Right": "Rechtsbündig",
-        "Link points to:": "Link zeigt auf:",
-        "Make lin_k...": "Link erstellen",
-        "Opens this link in a new window": "Diesen Link in neuem Fenster öffnen",
-        "Paste": "Einfügen",
-        "Please confirm that you want to remove this element:": "Wollen sie dieses Element wirklich entfernen?",
-        "Please confirm that you want to unlink this element.": "Wollen sie diesen Link wirklich entfernen?",
-        "Remove the $elem Element...": "Element $elem entfernen...",
-        "Remove this node from the document": "Dieses Element aus dem Dokument entfernen",
-        "Ro_w Properties...": "Zeilenoptionen",
-        "Show the Table Cell Properties dialog": "Zellenoptionen anzeigen",
-        "Show the Table Properties dialog": "Tabellenoptionen anzeigen",
-        "Show the Table Row Properties dialog": "Zeilenoptionen anzeigen",
-        "Show the image properties dialog": "Fenster für die Bildoptionen anzeigen",
-        "Unlink the current element": "Link auf Element entfernen",
-        "_Delete Row": "Zeile löschen",
-        "_Image Properties...": "Eigenschaften",
-        "_Modify Link...": "Link ändern",
-        "_Remove Link...": "Link entfernen",
-        "_Table Properties...": "Tabellenoptionen"
-    },
-    "CreateLink": {
-        "Are you sure you wish to remove this link?": "Wollen Sie diesen Link wirklich entfernen?",
-        "Cancel": "Abbrechen",
-        "Insert/Modify Link": "Verknüpfung hinzufügen/ändern",
-        "New window (_blank)": "Neues Fenster (_blank)",
-        "None (use implicit)": "k.A. (implizit)",
-        "OK": "OK",
-        "Other": "Anderes",
-        "Same frame (_self)": "Selber Rahmen (_self)",
-        "Target:": "Ziel:",
-        "Title (tooltip):": "Titel (Tooltip):",
-        "Top frame (_top)": "Oberster Rahmen (_top)",
-        "URL:": "URL:"
-    },
-    "DynamicCSS": {
-        "Choose stylesheet": "Wählen Sie einen StyleSheet aus",
-        "Default": "Standard",
-        "Undefined": "Nicht definiert"
-    },
-    "EditTag": {
-        "Cancel": "Abbrechen",
-        "Edit HTML for selected text": "HTML im ausgewählten Bereich bearbeiten",
-        "OK": "OK",
-        "Tag Editor": "HTML tag Editor"
-    },
-    "Equation": {
-        "AsciiMath Formula Input": "AsciiMath Formeleditor",
-        "Cancel": "Abbrechen",
-        "Formula Editor": "Formeleditor",
-        "Input": "Eingabe",
-        "OK": "OK",
-        "Preview": "Vorschau"
-    },
-    "ExtendedFileManager": {
-        "Absbottom": "unten bündig",
-        "Absmiddle": "mittig",
-        "Align": "Anordnung",
-        "Alt": "Alt",
-        "Baseline": "Grundlinie",
-        "Border": "Rahmen",
-        "Border Color": "Rahmenfarbe",
-        "Bottom": "unten",
-        "Cancel": "Abbrechen",
-        "Clear": "Löschen",
-        "Color": "Farbe",
-        "Constrain Proportions": "Proportionen beibehalten",
-        "Copy": "Kopieren",
-        "Crop": "Beschneiden",
-        "Cut": "Ausschneiden",
-        "Directory": "Verzeichnis",
-        "Directory Up": "Aufwärts",
-        "Edit": "Bearbeiten",
-        "File Manager": "Dateimanager",
-        "Filename:": "Dateiname:",
-        "Filesize:": "Dateigröße:",
-        "Flip Horizontal": "hor. spiegeln",
-        "Flip Image": "Bild spiegeln",
-        "Flip Vertical": "ver. spiegeln",
-        "GIF format is not supported, image editing not supported.": "GIF-Format nicht unterstützt, bearbeiten nicht möglich.",
-        "Height": "Höhe",
-        "Height:": "Höhe:",
-        "Insert File Link": "Dateilink einfügen",
-        "Invalid base directory:": "Ungültiges Basisverzeichnis:",
-        "JPEG High": "JPEG hoch",
-        "JPEG Low": "JPEG niedrig",
-        "JPEG Medium": "JPEG mittel",
-        "Left": "links",
-        "Loading": "Laden",
-        "Lock": "Feststellen",
-        "Margin": "Aussenabstand",
-        "Marker": "Rahmen",
-        "Measure": "Maße",
-        "Middle": "zentriert",
-        "New Folder": "Neues Verzeichnis erstellen",
-        "New window (_blank)": "Neues Fenster (_blank)",
-        "No Files Found": "Keine Dateien gefunden",
-        "No Image Available": "Kein Bild verfügbar",
-        "None (use implicit)": "k.A. (implizit)",
-        "Not set": "nicht eingestellt",
-        "OK": "OK",
-        "Padding": "Innenabstand",
-        "Positioning of this image": "Anordnung dieses Bildes",
-        "Preview": "Vorschau",
-        "Quality:": "Qualität",
-        "Refresh": "Aktualisieren",
-        "Rename": "Umbenennen",
-        "Resize": "Größe ändern",
-        "Right": "rechts",
-        "Rotate": "Drehen",
-        "Rotate Image": "Bild drehen",
-        "Same frame (_self)": "Selber Rahmen (_self)",
-        "Save": "Speichern",
-        "Start X:": "Start X",
-        "Start Y:": "Start Y",
-        "Target Window": "Zielfenster",
-        "Texttop": "oben bündig",
-        "Title (tooltip)": "Titel (Tooltip)",
-        "Toggle marker color": "Farbe der Markierung umschalten",
-        "Top": "oben",
-        "Top frame (_top)": "Oberster Rahmen (_top)",
-        "Trash": "Papierkorb",
-        "Upload": "Hochladen",
-        "W:": "W:",
-        "Width": "Breite",
-        "Width:": "Breite:",
-        "You must select some text before making a new link.": "Bitte zuerst Text markieren.",
-        "Zoom": "Zoom"
-    },
-    "Filter": {
-        "Filter": "Filter"
-    },
-    "FindReplace": {
-        "Case sensitive search": "Groß-/Kleinschreibung",
-        "Clear": "Nächstes ersetzen",
-        "Done": "Fertig",
-        "Enter the text you want to find": "Geben Sie einen Text ein den Sie finden möchten",
-        "Find and Replace": "Suchen und ersetzen",
-        "Highlight": "Hervorheben",
-        "Inform a replacement word": "Geben sie einen Text zum ersetzen ein",
-        "Next": "Nächster",
-        "Options": "Optionen",
-        "Replace with:": "Ersetzen durch:",
-        "Search for:": "Suchen nach:",
-        "Substitute all occurrences": "alle Treffer ersetzen",
-        "Substitute this occurrence?": "Treffer ersetzen?",
-        "Undo": "Rückgängig",
-        "Whole words only": "Ganze Wörter",
-        "found item": "Treffer",
-        "found items": "alle Treffer",
-        "not found": "kein Teffer",
-        "replaced item": "ersetzter Treffer",
-        "replaced items": "ersetzte Treffer"
-    },
-    "FormOperations": {
-        "Insert a Form.": "Email Form einfügen.",
-        "Insert a check box.": "Häkchenfeld einfügen",
-        "Insert a multi-line text field.": "Mehrzeiliges Textfeld einfügen.",
-        "Insert a radio button.": "Optionsfeld einfügen",
-        "Insert a select field.": "Auswahlfeld einfügen.",
-        "Insert a submit/reset button.": "Senden/zurücksetzen Schaltfläche",
-        "Insert a text, password or hidden field.": "Passwort oder unsichtbares Feld einfügen."
-    },
-    "Forms": {
-        "Cancel": "Abbrechen",
-        "Image URL:": "Bild URL:",
-        "Name": "Name",
-        "OK": "OK",
-        "Options": "Optionen",
-        "Rows:": "Zeilen:",
-        "Size:": "Größe:",
-        "Text:": "Text:"
-    },
-    "FullPage": {
-        "Alternate style-sheet:": "Alternativer Stylesheet:",
-        "Background color:": "Hintergrundfarbe:",
-        "Cancel": "Abbrechen",
-        "Character set:": "Zeichensatz",
-        "DOCTYPE:": "DOCTYPE:",
-        "Description:": "Beschreibung",
-        "Document properties": "Dokumenteigenschaften",
-        "Document title:": "Dokumenttitel:",
-        "Keywords:": "Schlüsselworte",
-        "OK": "OK",
-        "Primary style-sheet:": "Stylesheet:",
-        "Text color:": "Textfarbe:",
-        "UTF-8 (recommended)": "UTF-8 (empfohlen)"
-    },
-    "FullScreen": {
-        "Maximize/Minimize Editor": "Editor maximieren/verkleinern"
-    },
-    "HorizontalRule": {
-        "Alignment:": "Ausrichtung:",
-        "Cancel": "Abbrechen",
-        "Center": "zentriert",
-        "Color:": "Farbe",
-        "Height:": "Höhe:",
-        "Horizontal Rule": "Horizontale Linie",
-        "Insert/edit horizontal rule": "horizontale Linie einfügen/bearbeiten",
-        "Layout": "Gestaltung",
-        "Left": "links",
-        "No shading": "keine Schattierung",
-        "OK": "OK",
-        "Right": "rechts",
-        "Style": "Stil",
-        "Width:": "Breite:",
-        "percent": "Prozent",
-        "pixels": "Pixel"
-    },
-    "HtmlTidy": {
-        "HTML Tidy": "HTML Tidy",
-        "Tidy failed.  Check your HTML for syntax errors.": "Tidy fehlgeschlagen. Prüfen Sie den HTML Code nach Syntax-Fehlern."
-    },
-    "ImageManager": {
-        "Absbottom": "unten bündig",
-        "Absmiddle": "mittig",
-        "Angle:": "Winkel:",
-        "Baseline": "Grundlinie",
-        "Bottom": "unten",
-        "Cancel": "Abbrechen",
-        "Clear": "Entfernen",
-        "Constrain Proportions": "Proportional",
-        "Crop": "Beschneiden",
-        "Directory": "Ordner",
-        "Directory Up": "übergeordneter Ordner",
-        "Edit": "bearbeiten",
-        "Filename:": "Dateiname:",
-        "Flip Horizontal": "horizontal spiegeln",
-        "Flip Image": "Bild spiegeln",
-        "Flip Vertical": "vertikal spiegeln",
-        "Folder Name:": "Ordnername:",
-        "GIF format is not supported, image editing not supported.": "GIF Format wird nicht unterstützt, Bildbearbeitung wird nicht unterstützt.",
-        "Height:": "Höhe:",
-        "Image Format": "Bildformat:",
-        "Insert Image": "Bild einfügen",
-        "Invalid base directory:": "Ungültiges Startverzeichnis:",
-        "JPEG High": "JPEG hoch",
-        "JPEG Low": "JPEG niedrig",
-        "JPEG Medium": "JPEG mittel",
-        "Left": "links",
-        "Lock": "Sperren",
-        "Marker": "Marker",
-        "Measure": "Abmessungen",
-        "Middle": "zentriert",
-        "New Folder": "Neuer Ordner",
-        "No Image Available": "Kein Bild verfügbar",
-        "No Images Found": "Kein Bild gefunden",
-        "Not set": "nicht eingestellt",
-        "OK": "OK",
-        "Positioning of this image": "Anordnung dieses Bildes",
-        "Quality:": "Qualität",
-        "Refresh": "Aktualisieren",
-        "Resize": "Größe ändern",
-        "Right": "rechts",
-        "Rotate": "Drehen",
-        "Rotate Image": "Bild drehen",
-        "Save": "Speichern",
-        "Start X:": "Start X",
-        "Start Y:": "Start Y",
-        "Texttop": "oben bündig",
-        "Top": "oben",
-        "Trash": "Müll",
-        "W:": "B:",
-        "Width:": "Breite:"
-    },
-    "InlineStyler": {
-        "Background": "Hintergrund",
-        "Baseline": "Grundlinie",
-        "Border": "Rahmen",
-        "Bottom": "unten",
-        "Center": "zentriert",
-        "Char": "Zeichen",
-        "Collapsed borders": "Rahmen fallen zusammen",
-        "FG Color": "Vordergrundfarbe",
-        "Float": "Float",
-        "Height": "Höhe",
-        "Image URL": "Bild-URL",
-        "Justify": "Blocksatz",
-        "Layout": "Gestaltung",
-        "Left": "links",
-        "Margin": "Aussenabstand",
-        "Middle": "zentriert",
-        "None": "Keine",
-        "Padding": "Innenabstand",
-        "Right": "rechts",
-        "Text align": "Textausrichtung",
-        "Top": "oben",
-        "Vertical align": "Vertikale Ausrichtung",
-        "Width": "Breite",
-        "percent": "Prozent",
-        "pixels": "Pixel"
-    },
-    "InsertAnchor": {
-        "Anchor name": "Name (ID)",
-        "Cancel": "Abbrechen",
-        "Delete": "Löschen",
-        "Insert Anchor": "Anker einfügen",
-        "OK": "OK"
-    },
-    "InsertImage": {
-        "Absbottom": "unten bündig",
-        "Absmiddle": "mittig",
-        "Alignment:": "Ausrichtung:",
-        "Alternate text:": "Alternativer Text:",
-        "Baseline": "Grundlinie",
-        "Border thickness:": "Randstärke:",
-        "Bottom": "unten",
-        "Cancel": "Abbrechen",
-        "Enter the image URL here": "Bitte geben sie hier die Bild URL ein",
-        "For browsers that don't support images": "für Browser, die keine Bilder unterstützen",
-        "Horizontal padding": "horizontaler Inhaltsabstand",
-        "Horizontal:": "horizontal:",
-        "Image Preview:": "Bild Voransicht:",
-        "Image URL:": "Bild URL:",
-        "Insert Image": "Bild einfügen",
-        "Layout": "Gestaltung",
-        "Leave empty for no border": "leer lassen für keinen Rand",
-        "Left": "links",
-        "Middle": "zentriert",
-        "Not set": "nicht eingestellt",
-        "OK": "OK",
-        "Positioning of this image": "Anordnung dieses Bildes",
-        "Preview": "Vorschau",
-        "Preview the image in a new window": "Voransicht des Bildes in einem neuen Fenster",
-        "Right": "rechts",
-        "Spacing": "Abstand",
-        "Texttop": "oben bündig",
-        "Top": "oben",
-        "Vertical padding": "vertikaler Inhaltsabstand",
-        "Vertical:": "vertikal:",
-        "You must enter the URL": "Bitte geben Sie die URL ein"
-    },
-    "InsertMarquee": {
-        "Background-Color:": "Hintergrundfarbe:",
-        "Behavior:": "Bewegung:",
-        "Cancel": "Abbrechen",
-        "Direction:": "Ausrichtung:",
-        "Height:": "Höhe:",
-        "Insert scrolling marquee": "Marquee einfügen",
-        "Left": "links",
-        "Name": "Name",
-        "OK": "OK",
-        "Right": "rechts",
-        "Speed Control": "Geschwindigkeitseinstellungen",
-        "Text:": "Text:",
-        "Width:": "Breite:"
-    },
-    "InsertNote": {
-        "Cancel": "Abbrechen"
-    },
-    "InsertPagebreak": {
-        "Page break": "Neue Seite"
-    },
-    "InsertPicture": {
-        "Absbottom": "unten bündig",
-        "Absmiddle": "mittig",
-        "Alignment:": "Ausrichtung:",
-        "Alternate text:": "Alternativer Text:",
-        "Baseline": "Grundlinie",
-        "Border thickness:": "Randstärke:",
-        "Bottom": "unten",
-        "Cancel": "Abbrechen",
-        "Enter the image URL here": "Bitte geben sie hier die Bild URL ein",
-        "For browsers that don't support images": "für Browser, die keine Bilder unterstützen",
-        "Height:": "Höhe",
-        "Horizontal padding": "horizontaler Inhaltsabstand",
-        "Horizontal:": "horizontal:",
-        "Image Preview:": "Bild Voransicht:",
-        "Image URL:": "Bild URL:",
-        "Insert Image": "Bild einfügen",
-        "Layout": "Gestaltung",
-        "Leave empty for no border": "leer lassen für keinen Rand",
-        "Left": "links",
-        "Middle": "zentriert",
-        "Not set": "nicht eingestellt",
-        "OK": "OK",
-        "Open file in new window": "Datei in neuen Fenster anzeigen",
-        "Positioning of this image": "Anordnung dieses Bildes",
-        "Preview": "Vorschau",
-        "Preview the image in a new window": "Voransicht des Bildes in einem neuen Fenster",
-        "Right": "rechts",
-        "Size": "Größe",
-        "Spacing": "Abstand",
-        "Texttop": "oben bündig",
-        "Top": "oben",
-        "Upload file": "Datei hochladen",
-        "Vertical padding": "vertikaler Inhaltsabstand",
-        "Vertical:": "vertikal:",
-        "Width:": "Breite"
-    },
-    "InsertSmiley": {
-        "Insert Smiley": "Smiley einfügen"
-    },
-    "InsertSnippet": {
-        "Cancel": "Abbrechen",
-        "Hide preview": "Vorschau verbergen",
-        "Insert Snippet": "Snippet einfügen",
-        "Insert as": "Einfügen als",
-        "Show preview": "Vorschau zeigen",
-        "Variable": "Variable"
-    },
-    "InsertSnippet2": {
-        "All Categories": "Alle Kategorien",
-        "Cancel": "Abbrechen",
-        "Filter": "Filter",
-        "HTML": "HTML",
-        "Insert Snippet": "Snippet einfügen",
-        "Insert as HTML": "Als HTML einfügen",
-        "Insert as template variable": "Als Template-Variable einfügen",
-        "Only search word beginning": "Nur nach Wortanfang suchen",
-        "Variable": "Variable"
-    },
-    "InsertTable": {
-        "Absbottom": "unten bündig",
-        "Absmiddle": "mittig",
-        "Alignment:": "Ausrichtung:",
-        "Baseline": "Grundlinie",
-        "Border": "Rahmen",
-        "Border thickness:": "Randstärke:",
-        "Bottom": "unten",
-        "Cancel": "Abbrechen",
-        "Caption": "Überschrift",
-        "Cell padding:": "Innenabstand:",
-        "Cell spacing:": "Zellenabstand:",
-        "Cols:": "Spalten:",
-        "Em": "Geviert",
-        "Fixed width columns": "Spalten mit fester Breite",
-        "Insert Table": "Tabelle einfügen",
-        "Layout": "Gestaltung",
-        "Leave empty for no border": "leer lassen für keinen Rand",
-        "Left": "links",
-        "Middle": "zentriert",
-        "Not set": "nicht eingestellt",
-        "Number of columns": "Spaltenanzahl",
-        "Number of rows": "Zeilenanzahl",
-        "OK": "OK",
-        "Percent": "Prozent",
-        "Pixels": "Pixel",
-        "Positioning of this table": "Positionierung der Tabelle",
-        "Right": "rechts",
-        "Rows:": "Zeilen:",
-        "Space between adjacent cells": "Raum zwischen angrenzenden Zellen",
-        "Space between content and border in cell": "Raum zwischen Inhalt und Rand der Zelle",
-        "Spacing": "Abstand",
-        "Texttop": "oben bündig",
-        "Top": "oben",
-        "Width of the table": "Tabellenbreite",
-        "Width unit": "Größeneinheit",
-        "Width:": "Breite:",
-        "You must enter a number of columns": "Bitte geben Sie die Anzahl der Spalten an",
-        "You must enter a number of rows": "Bitte geben Sie die Anzahl der Zeilen an"
-    },
-    "LangMarks": {
-        "&mdash; language &mdash;": "&mdash; Sprache &mdash;",
-        "English": "englisch",
-        "French": "französisch",
-        "Greek": "griechisch",
-        "Latin": "lateinisch",
-        "language select": "Sprachauswahl"
-    },
-    "Linker": {
-        "Are you sure you wish to remove this link?": "Wollen Sie diesen Link wirklich entfernen?",
-        "Cancel": "Abbrechen",
-        "Email Address:": "Email Adresse",
-        "Email Link": "Email Link",
-        "Insert/Modify Link": "Verknüpfung hinzufügen/ändern",
-        "Message Template:": "Nachrichten Vorlage:",
-        "Name:": "Name:",
-        "New Window": "Neues Fenster",
-        "OK": "OK",
-        "Ordinary Link": "Standard Link",
-        "Popup Window": "Pop-Up Fenster",
-        "Remove Link": "Link entfernen",
-        "Same Window (jump out of frames)": "Selbes Fenster (ganzer Bereich)",
-        "Size:": "Größe:",
-        "Subject:": "Betreff:",
-        "Target:": "Ziel:",
-        "URL Link": "URL Adresse",
-        "URL:": "URL:",
-        "You must select some text before making a new link.": "Sie müssen einen Text markieren um einen Link zu erstellen"
-    },
-    "ListType": {
-        "Choose list style type (for ordered lists)": "Wählen Sie einen Typ für die Nummerierung aus",
-        "Decimal numbers": "Zahlen",
-        "Lower greek letters": "Griechisch",
-        "Lower latin letters": "Zeichen klein",
-        "Lower roman numbers": "Römisch klein",
-        "Upper latin letters": "Zeichen groß",
-        "Upper roman numbers": "Römisch groß"
-    },
-    "MootoolsFileManager": {
-        "Insert File Link": "Dateilink einfügen",
-        "You must select some text before making a new link.": "Sie müssen einen Text markieren um einen Link zu erstellen"
-    },
-    "NoteServer": {
-        "Add GUIDO Code in a textbox on the page": "GUIDO Code in einer Textbox auf der Seite anzeigen",
-        "Add MIDI link to allow students to hear the music": "MIDI-Link hinzufügen um Studenten das hören der Musik zu ermöglichen",
-        "Cancel": "Abbrechen",
-        "Format": "Format",
-        "Guido code": "Guido code",
-        "Image Preview": "Bild Voransicht",
-        "Image in applet": "Bild im Applet",
-        "Insert GUIDO Music Notation": "Einfügung einer GUIDO Musik-Tonfolge",
-        "MIDI File": "MIDI Datei",
-        "OK": "OK",
-        "Options": "Einstellungen",
-        "Preview": "Voransicht",
-        "Preview the image in a new window": "Voransicht des Bildes in einem neuen Fenster",
-        "Source Code": "Quell-Code",
-        "Zoom": "Zoom"
-    },
-    "Opera": {
-        "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)."
-    },
-    "PSLocal": {
-        "Cancel": "Abbrechen"
-    },
-    "PasteText": {
-        "Cancel": "Abbrechen",
-        "Insert text in new paragraph": "Neue Absätze eifügen",
-        "OK": "OK",
-        "Paste as Plain Text": "unformatierten Text einfügen"
-    },
-    "PersistentStorage": {
-        "Cancel": "Abbrechen",
-        "Copy": "Kopieren",
-        "Delete": "Löschen",
-        "Directory Up": "übergeordneter Ordner",
-        "File Manager": "Dateimanager",
-        "Filename": "Dateiname:",
-        "Insert Image": "Bild einfügen",
-        "New Folder": "Neuer Ordner",
-        "Save": "Speichern",
-        "You must select some text before making a new link.": "Sie müssen einen Text markieren um einen Link zu erstellen"
-    },
-    "QuickTag": {
-        "ATTRIBUTES": "ATTRIBUTES",
-        "Cancel": "Cancel",
-        "Colors": "Colors",
-        "Enter the TAG you want to insert": "Enter the TAG you want to insert",
-        "No CSS class avaiable": "No CSS classes avaiable",
-        "OPTIONS": "OPTIONS",
-        "Ok": "Ok",
-        "Quick Tag Editor": "Quick TAG Editor",
-        "TAGs": "TAGs",
-        "There are some unclosed quote": "There are some unclosed quote",
-        "This attribute already exists in the TAG": "This attribute already exists in the TAG",
-        "You have to select some text": "You have to select some text"
-    },
-    "SaveSubmit": {
-        "Ready": "Fertig",
-        "Save": "Speichern",
-        "Saving...": "Speichern...",
-        "in progress": "in Arbeit"
-    },
-    "SetId": {
-        "Cancel": "Abbrechen",
-        "Delete": "Löschen",
-        "OK": "OK",
-        "Set Id and Name": "Objekt ID und Name einfügen"
-    },
-    "SmartReplace": {
-        "ClosingDoubleQuotes": "“",
-        "ClosingSingleQuote": "‘",
-        "Convert all quotes and dashes in the current document": "Alle Anführungszeichen und Gedankenstriche umwandeln",
-        "Enable automatic replacements": "Automatische Ersetzung aktivieren",
-        "OK": "OK",
-        "OpeningDoubleQuotes": "„",
-        "OpeningSingleQuote": "‚",
-        "SmartReplace Settings": "SmartReplace Einstellungen"
-    },
-    "SpellChecker": {
-        "Cancel": "Abbrechen",
-        "Dictionary": "Woerterbuch",
-        "Finished list of mispelled words": "Liste der nicht bekannten Woerter",
-        "I will open it in a new page.": "Wird auf neuer Seite geoeffnet",
-        "Ignore": "Ignorieren",
-        "Ignore all": "Alle ignorieren",
-        "No mispelled words found with the selected dictionary.": "Keine falschen Woerter mit gewaehlten Woerterbuch gefunden",
-        "OK": "OK",
-        "Original word": "Original Wort",
-        "Please confirm that you want to open this link": "Wollen Sie diesen Link oeffnen",
-        "Please wait.  Calling spell checker.": "Bitte warten.  Woerterbuch wird durchsucht.",
-        "Please wait: changing dictionary to": "Bitte warten: Woerterbuch wechseln zu",
-        "Re-check": "Neuueberpruefung",
-        "Replace": "Ersetzen",
-        "Replace all": "Alle ersetzen",
-        "Replace with": "Ersetzen mit",
-        "Spell-check": "Ueberpruefung",
-        "Suggestions": "Vorschlag",
-        "This will drop changes and quit spell checker.  Please confirm.": "Aenderungen werden nicht uebernommen.  Bitte bestaettigen."
-    },
-    "Stylist": {
-        "Styles": "Stile"
-    },
-    "SuperClean": {
-        "Cancel": "Abbrechen",
-        "Clean up HTML": "HTML säubern",
-        "General tidy up and correction of some problems.": "Allgemeines aufräumen und Korrektur einiger Probleme.",
-        "OK": "OK",
-        "Please select from the following cleaning options...": "Bitte Optionen auswählen...",
-        "Please stand by while cleaning in process...": "Bitte warten Sie, während die Säuberung läuft...",
-        "Remove custom font sizes.": "Schriftgrößen entfernen (font size).",
-        "Remove custom text colors.": "Schriftfarben entfernen (font color).",
-        "Remove custom typefaces (font \"styles\").": "Schriftarten entfernen (font face).",
-        "Remove lang attributes.": "Sprachattribute entfernen."
-    },
-    "TableOperations": {
-        "All four sides": "Alle 4 Seiten",
-        "Borders": "Rahmen",
-        "Cancel": "Abbrechen",
-        "Caption": "Überschrift",
-        "Cell Properties": "Zellenoptionen",
-        "Cell properties": "Zellenoptionen",
-        "Delete cell": "Zelle löschen",
-        "Delete column": "Spalte löschen",
-        "Delete row": "Reihe loeschen",
-        "Description": "Beschreibung",
-        "Frames": "Rahmen",
-        "Insert cell after": "Zelle einfügen nach",
-        "Insert cell before": "Zelle einfügen vor",
-        "Insert column after": "Spalte einfügen nach",
-        "Insert column before": "Spalte einfügen vor",
-        "Insert row after": "Reihe einfügen nach",
-        "Insert row before": "Reihe einfügen vor",
-        "Merge cells": "Zellen zusammenfügen",
-        "No rules": "Keine Gitterlinien",
-        "No sides": "Keine Ränder",
-        "OK": "OK",
-        "Padding": "Innenabstand",
-        "Please click into some cell": "Bitte eine Zelle auswählen",
-        "Row Properties": "Zeilenoptionen",
-        "Row properties": "Reiheneinstellungen",
-        "Rows": "Zeilen:",
-        "Rules will appear between all rows and columns": "Linien zwischen Zeilen und Spalten",
-        "Rules will appear between columns only": "Linien zwischen Spalten",
-        "Rules will appear between rows only": "Linien zwischen  Zeilen",
-        "Spacing": "Abstand",
-        "Spacing and padding": "Abstände",
-        "Split column": "Spalte teilen",
-        "Split row": "Reihen aufteilen",
-        "Summary": "Zusammenfassung",
-        "Table Properties": "Tabellenoptionen",
-        "Table properties": "Tabellenoptionen",
-        "The bottom side only": "Nur untere Seite",
-        "The left-hand side only": "Nur linke Seite",
-        "The right and left sides only": "Nur linke und rechte Seite",
-        "The right-hand side only": "Nur rechte Seite",
-        "The top and bottom sides only": "Nur obere und untere Seite",
-        "The top side only": "Nur obere Seite",
-        "Xinha cowardly refuses to delete the last cell in row.": "Letzte Zelle in dieser Zeile kann nicht gelöscht werden",
-        "Xinha cowardly refuses to delete the last column in table.": "Letzte Spalte in dieser Tabelle kann nicht gelöscht werden",
-        "Xinha cowardly refuses to delete the last row in table.": "Letzte Reihe in dieser Tabelle kann nicht gelöscht werden",
-        "pixels": "Pixel"
-    },
-    "Template": {
-        "Cancel": "Abbrechen",
-        "Insert template": "Template einfügen"
-    },
-    "UnFormat": {
-        "All": "Alles",
-        "All HTML:": "Ganzes HTML:",
-        "Cancel": "Abbrechen",
-        "Cleaning Area": "Reinigungsbereich",
-        "Cleaning options": "Reinigungsoptionen",
-        "Formatting:": "Formatierung:",
-        "OK": "OK",
-        "Page Cleaner": "Seite bereinigen",
-        "Select which types of formatting you would like to remove.": "Wählen Sie aus welche Formatierungen Sie entfernen wollen.",
-        "Selection": "Ausgewählter Bereich"
-    },
-    "Xinha": {
-        "&#8212; format &#8212;": "&#8212; Format &#8212;",
-        "About this editor": "Über diesen Editor",
-        "Address": "Adresse",
-        "Background Color": "Hindergrundfarbe",
-        "Bold": "Fett",
-        "Bulleted List": "Aufzählungsliste",
-        "Clean content pasted from Word": "Von Word eingefügter Text bereinigen",
-        "Clear Inline Font Specifications": "Zeichensatz Formatierungen entfernen",
-        "Clear MSOffice tags": "MSOffice filter",
-        "Close": "Schließen",
-        "Constructing object": "Objekt wird generiert",
-        "Copy selection": "Kopieren",
-        "Create Statusbar": "Statusleiste wird generiert",
-        "Create Toolbar": "Werkzeugleiste wird generiert",
-        "Current style": "Derzeitiger Stil",
-        "Cut selection": "Ausschneiden",
-        "Decrease Indent": "Einzug verkleinern",
-        "Direction left to right": "Textrichtung von Links nach Rechts",
-        "Direction right to left": "Textrichtung von Rechts nach Links",
-        "Finishing": "Laden wird abgeschlossen",
-        "Font Color": "Schriftfarbe",
-        "Formatted": "Formatiert",
-        "Generate Xinha framework": "Xinha Framework wird generiert",
-        "Heading 1": "Überschrift 1",
-        "Heading 2": "Überschrift 2",
-        "Heading 3": "Überschrift 3",
-        "Heading 4": "Überschrift 4",
-        "Heading 5": "Überschrift 5",
-        "Heading 6": "Überschrift 6",
-        "Headings": "Überschrift Typ 1 bis 6",
-        "Help using editor": "Hilfe",
-        "Horizontal Rule": "Horizontale Linie",
-        "Increase Indent": "Einzug vergrößern",
-        "Init editor size": "Größe wird berechnet",
-        "Insert Table": "Tabelle einfügen",
-        "Insert Web Link": "Hyperlink einfügen",
-        "Insert/Modify Image": "Bild einfügen/verändern",
-        "Insert/Overwrite": "Einfügen/Überschreiben",
-        "Italic": "Kursiv",
-        "Justify Center": "Zentriert",
-        "Justify Full": "Blocksatz",
-        "Justify Left": "Linksbündig",
-        "Justify Right": "Rechtsbündig",
-        "Keyboard shortcuts": "Tastaturkürzel",
-        "Loading in progress. Please wait!": "Editor wird geladen. Bitte warten !",
-        "Loading plugin $plugin": "Plugin $plugin wird geladen",
-        "Normal": "Normal (Absatz)",
-        "Ordered List": "Nummerierte Liste",
-        "Paste from clipboard": "Einfügen aus der Zwischenablage",
-        "Path": "Pfad",
-        "Print document": "Dokument ausdrucken",
-        "Redoes your last action": "Wiederholen",
-        "Register plugin $plugin": "Plugin $plugin wird registriert",
-        "Remove formatting": "Formatierung entfernen",
-        "Save as": "speichern unter",
-        "Select all": "Alles markieren",
-        "Set format to paragraph": "Setze Formatierung auf Absatz",
-        "Split Block": "Block teilen",
-        "Strikethrough": "Durchgestrichen",
-        "Subscript": "Tiefgestellt",
-        "Superscript": "Hochgestellt",
-        "The editor provides the following key combinations:": "Der Editor unterstützt die folgenden kombinationen:",
-        "Toggle Borders": "Tabellenränder ein/ausblenden",
-        "Toggle HTML Source": "HTML Quelltext ein/ausschalten",
-        "Underline": "Unterstrichen",
-        "Undoes your last action": "Rückgängig",
-        "Would you like to clear font colours?": "Wollen sie Zeichensatzfarben entfernen",
-        "Would you like to clear font sizes?": "Wollen Sie Zeichensatzgrößen entfernen",
-        "Would you like to clear font typefaces?": "Wollen Sie Zeichensatztypen entfernen",
-        "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.",
-        "insert linebreak": "Harter Umbruch einfügen",
-        "new paragraph": "Neuer Absatz(Paragraph)"
-    },
-    "__NEW_TRANSLATIONS__": {
-        "ContextMenu": {
-            "Delete Cell": "",
-            "Insert Cell After": "",
-            "Insert Cell Before": "",
-            "Merge Cells": ""
-        },
-        "CreateLink": {
-            "You need to select some text before creating a link": ""
-        },
-        "DefinitionList": {
-            "definition description": "",
-            "definition list": "",
-            "definition term": ""
-        },
-        "Dialogs": {
-            "Some Text Here": ""
-        },
-        "EditTag": {
-            "Edit Tag By Peg": ""
-        },
-        "Equation": {
-            "!=": "",
-            "!in": "",
-            "&gt;-": "",
-            "&gt;=": "",
-            "&lt;=": "",
-            "&lt;=&gt;": "",
-            "&lt;x&gt;": "",
-            "&nbsp; `!` &nbsp;": "",
-            "&nbsp; `.` &nbsp;": "",
-            "&nbsp; `0` &nbsp;": "",
-            "&nbsp; `2` &nbsp;": "",
-            "&nbsp; `3` &nbsp;": "",
-            "&nbsp; `4` &nbsp;": "",
-            "&nbsp; `5` &nbsp;": "",
-            "&nbsp; `6` &nbsp;": "",
-            "&nbsp; `7` &nbsp;": "",
-            "&nbsp; `8` &nbsp;": "",
-            "&nbsp; `9` &nbsp;": "",
-            "&nbsp; `e` &nbsp;": "",
-            "&nbsp;&nbsp;`1` &nbsp;": "",
-            "&nbsp;`+{::}`&nbsp;": "",
-            "&nbsp;`-:\\ `": "",
-            "&nbsp;`-{::}`&nbsp;": "",
-            "&nbsp;`C`&nbsp;": "",
-            "&nbsp;`cos`": "",
-            "&nbsp;`ln`&nbsp;": "",
-            "&nbsp;`pi` &nbsp;": "",
-            "&nbsp;`sin`": "",
-            "&nbsp;`tan`": "",
-            "&nbsp;`times`&nbsp;": "",
-            "&quot;text&quot;": "",
-            "'+formula+'": "",
-            "((n),(k))": "",
-            "(x+1)/(x-1)": "",
-            "*": "",
-            "**": "",
-            "+-": "",
-            "-&gt;": "",
-            "-&lt;": "",
-            "-:": "",
-            "-=": "",
-            "//": "",
-            "/_": "",
-            ":.": "",
-            "=&gt;": "",
-            "@": "",
-            "[[a,b],[c,d]]": "",
-            "\\\\": "",
-            "\\nClick in the box to use your keyboard or use the buttons\\n": "",
-            "^^": "",
-            "^^^": "",
-            "__|": "",
-            "_|_": "",
-            "`!=`": "",
-            "`!in`": "",
-            "`&and;`": "",
-            "`&cap;`": "",
-            "`&cup;`": "",
-            "`&gt;-`": "",
-            "`&gt;=`": "",
-            "`&lt;=&gt;`": "",
-            "`&lt;=`": "",
-            "`&lt;x&gt;`": "",
-            "`&or;`": "",
-            "`&quot;text&quot;`": "",
-            "`((n),(k))`": "",
-            "`(x+1)/(x-1)`": "",
-            "`**`": "",
-            "`*`": "",
-            "`+-`": "",
-            "`-&gt;`": "",
-            "`-&lt;`": "",
-            "`-:`": "",
-            "`-=`": "",
-            "`//`": "",
-            "`/_`": "",
-            "`:.`": "",
-            "`=&gt;`": "",
-            "`@`": "",
-            "`[[a,b],[c,d]]`": "",
-            "`\\\\`": "",
-            "`__|`": "",
-            "`_|_`": "",
-            "`AA`": "",
-            "`aleph`": "",
-            "`alpha`": "",
-            "`and`": "",
-            "`bara`": "",
-            "`bba`": "",
-            "`bbba`": "",
-            "`beta`": "",
-            "`CC`": "",
-            "`cca`": "",
-            "`chi`": "",
-            "`darr`": "",
-            "`ddota`": "",
-            "`del`": "",
-            "`delta`": "",
-            "`Delta`": "",
-            "`diamond`": "",
-            "`dota`": "",
-            "`dy/dx`": "",
-            "`EE`": "",
-            "`epsi`": "",
-            "`eta`": "",
-            "`fra`": "",
-            "`gamma`": "",
-            "`Gamma`": "",
-            "`grad`": "",
-            "`harr`": "",
-            "`hArr`": "",
-            "`hata`": "",
-            "`if`": "",
-            "`in`": "",
-            "`int`": "",
-            "`iota`": "",
-            "`kappa`": "",
-            "`lambda`": "",
-            "`Lambda`": "",
-            "`larr`": "",
-            "`lArr`": "",
-            "`lim_(x-&gt;oo)`": "",
-            "`log`": "",
-            "`mu`": "",
-            "`NN`": "",
-            "`nn`": "",
-            "`not`": "",
-            "`nu`": "",
-            "`o+`": "",
-            "`o.`": "",
-            "`O/`": "",
-            "`oint`": "",
-            "`omega`": "",
-            "`Omega`": "",
-            "`oo`": "",
-            "`or`": "",
-            "`ox`": "",
-            "`phi`": "",
-            "`Phi`": "",
-            "`Pi`": "",
-            "`pi`": "",
-            "`prod`": "",
-            "`prop`": "",
-            "`psi`": "",
-            "`Psi`": "",
-            "`QQ`": "",
-            "`quad`": "",
-            "`rArr`": "",
-            "`rho`": "",
-            "`root(n)(x)`": "",
-            "`RR`": "",
-            "`sfa`": "",
-            "`Sigma`": "",
-            "`sigma`": "",
-            "`sqrt(x)`": "",
-            "`square`": "",
-            "`stackrel(-&gt;)(+)`": "",
-            "`sub`": "",
-            "`sube`": "",
-            "`sum`": "",
-            "`sup`": "",
-            "`supe`": "",
-            "`tau`": "",
-            "`theta`": "",
-            "`Theta`": "",
-            "`TT`": "",
-            "`tta`": "",
-            "`uarr`": "",
-            "`ula`": "",
-            "`upsilon`": "",
-            "`uu`": "",
-            "`veca`": "",
-            "`vv`": "",
-            "`x_(mn)`": "",
-            "`Xi`": "",
-            "`xi`": "",
-            "`xx`": "",
-            "`zeta`": "",
-            "`ZZ`": "",
-            "`|-&gt;`": "",
-            "`|--`": "",
-            "`|==`": "",
-            "`|__`": "",
-            "`|~`": "",
-            "`~=`": "",
-            "`~|`": "",
-            "`~~`": "",
-            "AA": "",
-            "aleph": "",
-            "alpha": "",
-            "and": "",
-            "AsciiMathML Example": "",
-            "bara": "",
-            "Based on ASCIIMathML by": "",
-            "bba": "",
-            "bbba": "",
-            "beta": "",
-            "CC": "",
-            "cca": "",
-            "chi": "",
-            "darr": "",
-            "ddota": "",
-            "del": "",
-            "delta": "",
-            "Delta": "",
-            "diamond": "",
-            "dota": "",
-            "dy/dx": "",
-            "EE": "",
-            "epsi": "",
-            "eta": "",
-            "For more information on AsciiMathML visit this page:": "",
-            "fra": "",
-            "gamma": "",
-            "Gamma": "",
-            "grad": "",
-            "harr": "",
-            "hArr": "",
-            "hata": "",
-            "if": "",
-            "in": "",
-            "int": "",
-            "int_a^bf(x)dx": "",
-            "iota": "",
-            "kappa": "",
-            "Lambda": "",
-            "lambda": "",
-            "lArr": "",
-            "larr": "",
-            "lim_(x-&gt;oo)": "",
-            "mu": "",
-            "NN": "",
-            "nn": "",
-            "nnn": "",
-            "not": "",
-            "nu": "",
-            "o+": "",
-            "o.": "",
-            "O/": "",
-            "oint": "",
-            "Omega": "",
-            "omega": "",
-            "oo": "",
-            "or": "",
-            "ox": "",
-            "phi": "",
-            "Phi": "",
-            "Pi": "",
-            "pi": "",
-            "prod": "",
-            "prop": "",
-            "psi": "",
-            "Psi": "",
-            "QQ": "",
-            "quad": "",
-            "rArr": "",
-            "rho": "",
-            "root(n)(x)": "",
-            "RR": "",
-            "sfa": "",
-            "Sigma": "",
-            "sigma": "",
-            "sqrt(x)": "",
-            "square": "",
-            "stackrel(-&gt;)(+)": "",
-            "sub": "",
-            "sube": "",
-            "sum": "",
-            "sum_(n=1)^oo": "",
-            "sup": "",
-            "supe": "",
-            "tau": "",
-            "theta": "",
-            "Theta": "",
-            "TT": "",
-            "tta": "",
-            "uarr": "",
-            "ula": "",
-            "upsilon": "",
-            "uu": "",
-            "uuu": "",
-            "veca": "",
-            "vv": "",
-            "vvv": "",
-            "x^(m+n)": "",
-            "x_(mn)": "",
-            "Xi": "",
-            "xi": "",
-            "xx": "",
-            "zeta": "",
-            "ZZ": "",
-            "|-&gt;": "",
-            "|--": "",
-            "|==": "",
-            "|__": "",
-            "|~": "",
-            "~=": "",
-            "~|": "",
-            "~~": ""
-        },
-        "FancySelects": {
-            "'+opt.text+'": ""
-        },
-        "FindReplace": {
-            "';\r\n  var tagc = '": ""
-        },
-        "FormOperations": {
-            "Enter the name for new option.": "",
-            "Form Editor": "",
-            "Message Sent": "",
-            "Please Select...": ""
-        },
-        "Forms": {
-            "'onClick'=": "",
-            "Access Key:": "",
-            "Action URL:": "",
-            "Button Script": "",
-            "Checked": "",
-            "Columns:": "",
-            "Default text (optional)": "",
-            "Dimensions": "",
-            "Disabled": "",
-            "Encoding:": "",
-            "For Control:": "",
-            "Form": "",
-            "Form Element: FIELDSET": "",
-            "Form Element: INPUT": "",
-            "Form Element: LABEL": "",
-            "Form Element: SELECT": "",
-            "Form Element: TEXTAREA": "",
-            "Form handler script": "",
-            "Form Name:": "",
-            "Get": "",
-            "Hard": "",
-            "Height in number of rows": "",
-            "HTML-Form to CGI (default)": "",
-            "Image source": "",
-            "Initial Text:": "",
-            "Insert/Edit Form": "",
-            "Insert/Edit Form Element FIELDSET": "",
-            "Insert/Edit Form Element INPUT": "",
-            "Insert/Edit Form Element LABEL": "",
-            "Insert/Edit Form Element SELECT": "",
-            "Insert/Edit Form Element TEXTAREA": "",
-            "Javascript for button click": "",
-            "Label:": "",
-            "Legend:": "",
-            "Max length:": "",
-            "Maximum number of characters accepted": "",
-            "Method:": "",
-            "multipart Form Data (File-Upload)": "",
-            "Name of the form input": "",
-            "Name of the form select": "",
-            "name of the textarea": "",
-            "Name/ID:": "",
-            "normal": "",
-            "nowrap": "",
-            "Off": "",
-            "Physical": "",
-            "Please enter a Label": "",
-            "Post": "",
-            "pre": "",
-            "Read Only": "",
-            "Size of text box in characters": "",
-            "Soft": "",
-            "Tab Index:": "",
-            "Target Frame:": "",
-            "URL of image": "",
-            "Value of the form input": "",
-            "Value:": "",
-            "Virtual": "",
-            "Width in number of characters": "",
-            "Wrap Mode:": "",
-            "You must enter a Name": ""
-        },
-        "FullPage": {
-            "...": "",
-            "cyrillic (ISO-8859-5)": "",
-            "cyrillic (KOI8-R)": "",
-            "cyrillic (WINDOWS-1251)": "",
-            "western (ISO-8859-1)": ""
-        },
-        "Gecko": {
-            "The Paste button does not work in this browser for security reasons. Press CTRL-V on your keyboard to paste directly.": ""
-        },
-        "HorizontalRule": {
-            "&#x00d7;": "",
-            "&nbsp;": "",
-            "Insert/Edit Horizontal Rule": ""
-        },
-        "InlineStyler": {
-            "CSS Style": "",
-            "-": "<<Equation>>"
-        },
-        "InsertNote": {
-            "Insert": "",
-            "Insert footnote": "",
-            "Insert Note": ""
-        },
-        "InsertPagebreak": {
-            "Page Break": ""
-        },
-        "InsertSnippet": {
-            "\\n  This is an information about something\\n": "",
-            "InsertSnippet for Xinha": "",
-            "Link1": "",
-            "Link2": "",
-            "Link3": "",
-            "Link4": "",
-            "Link5": "",
-            "This is an information about something": ""
-        },
-        "InsertSnippet2": {
-            "InsertSnippet for Xinha": "<<InsertSnippet>>"
-        },
-        "InsertTable": {
-            "Caption for the table": "",
-            "Collapse borders:": "",
-            "Layou": "",
-            "Style of the border": ""
-        },
-        "LangMarks": {
-            "', '": ""
-        },
-        "Linker": {
-            "(px)": "",
-            "Anchor-Link": "",
-            "Anchor:": "",
-            "Location Bar:": "",
-            "Menu Bar:": "",
-            "PopupWindow": "",
-            "Resizeable:": "",
-            "Scrollbars:": "",
-            "Shows On Hover": "",
-            "Status Bar:": "",
-            "Title:": "",
-            "Toolbar:": ""
-        },
-        "Opera": {
-            "MARK": ""
-        },
-        "PreserveScripts": {
-            "JavaScript": "",
-            "PHP": ""
-        },
-        "QuickTag": {
-            "',\r\n                           'cl': '": ""
-        },
-        "SetId": {
-            "ID/Name:": "",
-            "Set Id/Name": "",
-            "Set ID/Name": ""
-        },
-        "SmartReplace": {
-            "SmartReplace": ""
-        },
-        "SuperClean": {
-            "Clean bad HTML from Microsoft Word.": "",
-            "Clean Selection Only": "",
-            "Cleaning Scope": "",
-            "Remove alignment (left/right/justify).": "",
-            "Remove all classes (CSS).": "",
-            "Remove All HTML Tags": "",
-            "Remove all styles (CSS).": "",
-            "Remove emphasis and annotations.": "",
-            "Remove Paragraphs": "",
-            "Remove superscripts and subscripts.": "",
-            "Replace directional quote marks with non-directional quote marks.": "",
-            "Vigorously purge HTML from Microsoft Word.": ""
-        },
-        "TableOperations": {
-            "Cell Type:": "",
-            "Cells down": "",
-            "Cells to the right, and": "",
-            "Do Not Change": "",
-            "Frame and borders": "",
-            "Header (th)": "",
-            "Merge current cell with:": "",
-            "Normal (td)": "",
-            "Columns": "<<Forms>>",
-            "Merge Cells": "<<ContextMenu>>"
-        },
-        "UnsavedChanges": {
-            "You have unsaved changes in the editor": ""
-        },
-        "WebKit": {
-            "The Paste button does not work in this browser for security reasons. Press CTRL-V on your keyboard to paste directly.": "<<Gecko>>"
-        },
-        "Xinha": {
-            "&#8212; font &#8212;": "",
-            "&#8212; size &#8212;": "",
-            "1 (8 pt)": "",
-            "2 (10 pt)": "",
-            "3 (12 pt)": "",
-            "4 (14 pt)": "",
-            "5 (18 pt)": "",
-            "6 (24 pt)": "",
-            "7 (36 pt)": "",
-            "Arial": "",
-            "Courier New": "",
-            "CTRL-0 (zero)": "",
-            "CTRL-1 .. CTRL-6": "",
-            "CTRL-A": "",
-            "CTRL-B": "",
-            "CTRL-C": "",
-            "CTRL-E": "",
-            "CTRL-I": "",
-            "CTRL-J": "",
-            "CTRL-L": "",
-            "CTRL-N": "",
-            "CTRL-R": "",
-            "CTRL-S": "",
-            "CTRL-U": "",
-            "CTRL-V": "",
-            "CTRL-X": "",
-            "CTRL-Y": "",
-            "CTRL-Z": "",
-            "Editor Help": "",
-            "ENTER": "",
-            "Error Loading Xinha.  Developers, check the Error Console for information.": "",
-            "Georgia": "",
-            "Impact": "",
-            "Loading Core": "",
-            "Loading plugins": "",
-            "MS Word Cleaner": "",
-            "Select Color": "",
-            "SHIFT-ENTER": "",
-            "Tahoma": "",
-            "Times New Roman": "",
-            "Touch here first to activate editor.": "",
-            "Verdana": "",
-            "Waiting for Iframe to load...": "",
-            "WingDings": "",
-            "Xinha": ""
-        },
-        "BackgroundImage": {
-            "__ TRANSLATOR NOTE __": "*** BACKGROUNDIMAGE IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***",
-            "Set Background": ""
-        },
-        "ExtendedFileManager": {
-            "__ TRANSLATOR NOTE __": "*** EXTENDEDFILEMANAGER IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***",
-            "10%": "",
-            "100%": "",
-            "200%": "",
-            "25%": "",
-            "50%": "",
-            "75%": "",
-            ">List View": "",
-            ">Thumbnail View": "",
-            "A:": "",
-            "D:": "",
-            "File List": "",
-            "Folder": "",
-            "GIF": "",
-            "H:": "",
-            "Image Editor": "",
-            "Image Selection": "",
-            "Maximum folder size limit reached. Upload disabled.": "",
-            "Please enter value": "",
-            "PNG": "",
-            "Preset": "",
-            "Rotate 180 &deg;": "",
-            "Rotate 90 &deg; CCW": "",
-            "Rotate 90 &deg; CW": "",
-            "X:": "",
-            "Xinha Image Editor": "",
-            "Y:": ""
-        },
-        "HtmlTidy": {
-            "__ TRANSLATOR NOTE __": "*** HTMLTIDY IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***",
-            "Auto-Tidy": "",
-            "Don't Tidy": ""
-        },
-        "ImageManager": {
-            "__ TRANSLATOR NOTE __": "*** IMAGEMANAGER IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***",
-            "Flickr Picture List": "",
-            "Flickr Pictures": "",
-            "Flickr Selection": "",
-            "Flickr Username/Email": "",
-            "Image List": "",
-            "Keyword": "",
-            "No Photos Found": "",
-            "No Videos Found": "",
-            "This Server": "",
-            "YouTube Selection": "",
-            "YouTube Username": "",
-            "YouTube Video List": "",
-            "YouTube Videos": "",
-            "A:": "<<ExtendedFileManager>>",
-            "D:": "<<ExtendedFileManager>>",
-            "GIF": "<<ExtendedFileManager>>",
-            "H:": "<<ExtendedFileManager>>",
-            "Image Editor": "<<ExtendedFileManager>>",
-            "Image Selection": "<<ExtendedFileManager>>",
-            "PNG": "<<ExtendedFileManager>>",
-            "Rotate 180 &deg;": "<<ExtendedFileManager>>",
-            "Rotate 90 &deg; CCW": "<<ExtendedFileManager>>",
-            "Rotate 90 &deg; CW": "<<ExtendedFileManager>>",
-            "X:": "<<ExtendedFileManager>>",
-            "Y:": "<<ExtendedFileManager>>"
-        },
-        "InsertMarquee": {
-            "__ TRANSLATOR NOTE __": "*** INSERTMARQUEE IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***",
-            "Alternate": "",
-            "Continuous": "",
-            "Marquee Editor": "",
-            "Scroll Amount:": "",
-            "Scroll Delay:": "",
-            "Slide": "",
-            "Name/ID:": "<<Forms>>"
-        },
-        "InsertPicture": {
-            "__ TRANSLATOR NOTE __": "*** INSERTPICTURE IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***",
-            "Leave empty for not defined": "",
-            " Open file in new window": ""
-        },
-        "NoteServer": {
-            "__ TRANSLATOR NOTE __": "*** NOTESERVER IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***",
-            "120%": "",
-            "150%": "",
-            "80%": "",
-            "GUIDO Code": "",
-            "With Mozilla, the applet will not be visible in editor, but only in Web page after submitting.": "",
-            "Zoom :": "",
-            "100%": "<<ExtendedFileManager>>"
-        },
-        "PSLocal": {
-            "__ TRANSLATOR NOTE __": "*** PSLOCAL IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***",
-            "Confirm": "",
-            "Enable": "",
-            "Enable Gears in order to use local document storage and configuration.": "",
-            "Enabling Local Storage": "",
-            "Install": "",
-            "Learn About Local Storage": "",
-            "This will reload the page, causing you to lose any unsaved work.  Press \"OK\" to reload.": "",
-            "Xinha uses Google Gears to enable local document storage.  With Gears installed, you can save drafts of your documents on your hard drive, configure Xinha to look the way you want, and carry this information wherever you use Xinha on the web.": ""
-        },
-        "PSServer": {
-            "__ TRANSLATOR NOTE __": "*** PSSERVER IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***",
-            "File: ": "",
-            "Import": ""
-        },
-        "PersistentStorage": {
-            "__ TRANSLATOR NOTE __": "*** PERSISTENTSTORAGE IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***",
-            "Details": "",
-            "File Browser": "",
-            "Hello    There C ": "",
-            "Hello  There A ": "",
-            "Hello \" There B \"": "",
-            "Hello ' There D '": "",
-            "List of Places": "",
-            "New Document": "",
-            "Open": "",
-            "Open Document": "",
-            "Places": "",
-            "Please enter the name of the directory you'd like to create.": "",
-            "Save Document": "",
-            "This will erase any unsaved content.  If you're certain, please click OK to continue.": "",
-            "Web URL": "",
-            "Confirm": "<<PSLocal>>",
-            "File List": "<<ExtendedFileManager>>",
-            "Insert": "<<InsertNote>>"
-        },
-        "SpellChecker": {
-            "__ TRANSLATOR NOTE __": "*** SPELLCHECKER IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***",
-            "HTMLArea Spell Checker": "",
-            "Info": "",
-            "Learn": "",
-            "pliz weit ;-)": "",
-            "Revert": "",
-            "Spell Checker": ""
-        }
-    }
-}
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/lang/merged/ee.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/lang/merged/ee.js
deleted file mode 100644
index f9d0872..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/lang/merged/ee.js
+++ /dev/null
@@ -1,1573 +0,0 @@
-// Xinha Language Combined Translation File
-//
-// LANG: "ee", ENCODING: UTF-8
-//
-// INSTRUCTIONS TO TRANSLATORS
-// ===========================================================================
-//
-// Your translation must be in UTF-8 Character Encoding.
-//
-// This is a JSON encoded file (plus comments), strings should be double-quote
-// only, do not use single quotes to surround strings - "hello", not 'hello'
-// do not have a trailing comma after the last entry in a section.
-//
-// Only full line comments are allowed (that a comments occupy entire lines).
-//
-// Search for the __NEW_TRANSLATIONS__ section below, this is where you will
-// want to focus, this section includes things that do not presently have a 
-// translation or for which the translation needs to be checked for accuracy.
-//
-// In the New Translations section a translation string is one of the following
-//
-//  "English String Here" : ""
-//     This means it is not translated yet, add your translation...
-//     "English String Here" : "Klingon String Here"
-//
-//  "English String Here" : "Translated String Here"
-//     This means that an existing translation for this string, in some other
-//     section has been found, and used.  Check that it is approprite for this
-//     section and if it is, that's fine leave it as is, otherwise change as
-//     appropriate.
-//
-//  "English String Here" : "<<AnotherSection>>"
-//     This means use the same translation for this string as <<AnotherSection>>
-//     this saves you re-tranlating strings.  If the Context of this section
-//     and the context of AnotherSection seem the same, that's fine leave it
-//     using that translation, but if this section needs a different translation, 
-//     you can provide it by replacing the link (<<AnotherSection>>) with that
-//     new translation.  For example - a "Table" in say "DataPlugin" is 
-//     perhaps translated differently to "Table" in "FurniturePlugin".
-//
-// TESTING YOUR TRANSLATION
-// ===========================================================================
-// Simply place your translation file on your webserver somewhere for example
-//
-//   /xinha/lang/merged/ee.js
-//
-// and then tell Xinha where to get it (before loading XinhaCore.js) by 
-//
-//  _editor_lang              = 'ee';
-//  _editor_lang_merged_file  = '/xinha/lang/merged/ee.js';
-//
-// Xinha will load your new language definition.
-//
-// SUBMITTING YOUR TRANSLATION
-// ===========================================================================
-// Simply create a Ticket on the Xinha website and attach your translation 
-// file.
-//
-// The Xinha developers will take your file and use the 
-//     contrib/lc_split_merged_file.php
-// script to load it into the Xinha distribution.
-
-{
-    "Abbreviation": {
-        "Cancel": "Loobu",
-        "OK": "OK"
-    },
-    "AboutBox": {
-        "About this editor": "Teave toimeti kohta"
-    },
-    "BackgroundImage": {
-        "Cancel": "Loobu"
-    },
-    "ColorPicker": {
-        "OK": "OK"
-    },
-    "ContextMenu": {
-        "Justify Center": "Joonda keskele",
-        "Justify Full": "Rööpjoonda",
-        "Justify Left": "Joonda vasakule",
-        "Justify Right": "Joonda paremale"
-    },
-    "CreateLink": {
-        "Cancel": "Loobu",
-        "OK": "OK"
-    },
-    "EditTag": {
-        "Cancel": "Loobu",
-        "OK": "OK"
-    },
-    "Equation": {
-        "Cancel": "Loobu",
-        "OK": "OK"
-    },
-    "ExtendedFileManager": {
-        "Cancel": "Loobu",
-        "OK": "OK"
-    },
-    "Forms": {
-        "Cancel": "Loobu",
-        "OK": "OK"
-    },
-    "FullPage": {
-        "Cancel": "Loobu",
-        "OK": "OK"
-    },
-    "HorizontalRule": {
-        "Cancel": "Loobu",
-        "Horizontal Rule": "Horisontaaljoon",
-        "OK": "OK"
-    },
-    "ImageManager": {
-        "Cancel": "Loobu",
-        "OK": "OK"
-    },
-    "InsertAnchor": {
-        "Cancel": "Loobu",
-        "OK": "OK"
-    },
-    "InsertImage": {
-        "Cancel": "Loobu",
-        "OK": "OK"
-    },
-    "InsertMarquee": {
-        "Cancel": "Loobu",
-        "OK": "OK"
-    },
-    "InsertNote": {
-        "Cancel": "Loobu"
-    },
-    "InsertPicture": {
-        "Cancel": "Loobu",
-        "OK": "OK"
-    },
-    "InsertSnippet": {
-        "Cancel": "Loobu"
-    },
-    "InsertSnippet2": {
-        "Cancel": "Loobu"
-    },
-    "InsertTable": {
-        "Cancel": "Loobu",
-        "Insert Table": "Lisa tabel",
-        "OK": "OK"
-    },
-    "Linker": {
-        "Cancel": "Loobu",
-        "OK": "OK"
-    },
-    "NoteServer": {
-        "Cancel": "Loobu",
-        "OK": "OK"
-    },
-    "PSLocal": {
-        "Cancel": "Loobu"
-    },
-    "PasteText": {
-        "Cancel": "Loobu",
-        "OK": "OK"
-    },
-    "PersistentStorage": {
-        "Cancel": "Loobu"
-    },
-    "QuickTag": {
-        "Cancel": "Loobu"
-    },
-    "SetId": {
-        "Cancel": "Loobu",
-        "OK": "OK"
-    },
-    "SmartReplace": {
-        "OK": "OK"
-    },
-    "SpellChecker": {
-        "Cancel": "Loobu",
-        "OK": "OK"
-    },
-    "SuperClean": {
-        "Cancel": "Loobu",
-        "OK": "OK"
-    },
-    "TableOperations": {
-        "Cancel": "Loobu",
-        "OK": "OK"
-    },
-    "Template": {
-        "Cancel": "Loobu"
-    },
-    "UnFormat": {
-        "Cancel": "Loobu",
-        "OK": "OK"
-    },
-    "Xinha": {
-        "About this editor": "Teave toimeti kohta",
-        "Background Color": "Tausta värv",
-        "Bold": "Paks",
-        "Bulleted List": "Täpploend",
-        "Copy selection": "Kopeeri",
-        "Current style": "Kirjastiil",
-        "Cut selection": "Lõika",
-        "Decrease Indent": "Vähenda taanet",
-        "Font Color": "Fondi värv",
-        "Help using editor": "Spikker",
-        "Horizontal Rule": "Horisontaaljoon",
-        "Increase Indent": "Suurenda taanet",
-        "Insert Table": "Lisa tabel",
-        "Insert Web Link": "Lisa viit",
-        "Insert/Modify Image": "Lisa pilt",
-        "Italic": "Kursiiv",
-        "Justify Center": "Joonda keskele",
-        "Justify Full": "Rööpjoonda",
-        "Justify Left": "Joonda vasakule",
-        "Justify Right": "Joonda paremale",
-        "Ordered List": "Nummerdus",
-        "Paste from clipboard": "Kleebi",
-        "Path": "Path",
-        "Redoes your last action": "Tee uuesti",
-        "Strikethrough": "Läbikriipsutatud",
-        "Subscript": "Allindeks",
-        "Superscript": "Ülaindeks",
-        "Toggle HTML Source": "HTML/tavaline vaade",
-        "Underline": "Allakriipsutatud",
-        "Undoes your last action": "Võta tagasi",
-        "You are in TEXT MODE.  Use the [<>] button to switch back to WYSIWYG.": "Sa oled tekstireziimis.  Kasuta nuppu [<>] lülitamaks tagasi WYSIWIG reziimi."
-    },
-    "__NEW_TRANSLATIONS__": {
-        "Abbreviation": {
-            "Abbreviation": "",
-            "Delete": "",
-            "Expansion:": ""
-        },
-        "AboutBox": {
-            "Close": "<<Xinha>>"
-        },
-        "CharCounter": {
-            "... in progress": "",
-            "Chars": "",
-            "HTML": "",
-            "Words": ""
-        },
-        "CharacterMap": {
-            "Insert special character": ""
-        },
-        "ColorPicker": {
-            "Click a color...": "",
-            "Color: ": "",
-            "Sample": "",
-            "Web Safe: ": "",
-            "Close": "<<Xinha>>"
-        },
-        "ContextMenu": {
-            "_Delete Row": "",
-            "_Image Properties...": "",
-            "_Modify Link...": "",
-            "_Remove Link...": "",
-            "_Table Properties...": "",
-            "C_ell Properties...": "",
-            "Chec_k Link...": "",
-            "Copy": "",
-            "Create a link": "",
-            "Current URL is": "",
-            "Cut": "",
-            "De_lete Column": "",
-            "Delete Cell": "",
-            "Delete the current column": "",
-            "Delete the current row": "",
-            "How did you get here? (Please report!)": "",
-            "I_nsert Row Before": "",
-            "In_sert Row After": "",
-            "Insert _Column Before": "",
-            "Insert a new column after the current one": "",
-            "Insert a new column before the current one": "",
-            "Insert a new row after the current one": "",
-            "Insert a new row before the current one": "",
-            "Insert a paragraph after the current node": "",
-            "Insert a paragraph before the current node": "",
-            "Insert C_olumn After": "",
-            "Insert Cell After": "",
-            "Insert Cell Before": "",
-            "Insert paragraph after": "",
-            "Insert paragraph before": "",
-            "Link points to:": "",
-            "Make lin_k...": "",
-            "Merge Cells": "",
-            "Opens this link in a new window": "",
-            "Paste": "",
-            "Please confirm that you want to remove this element:": "",
-            "Please confirm that you want to unlink this element.": "",
-            "Remove the $elem Element...": "",
-            "Remove this node from the document": "",
-            "Ro_w Properties...": "",
-            "Show the image properties dialog": "",
-            "Show the Table Cell Properties dialog": "",
-            "Show the Table Properties dialog": "",
-            "Show the Table Row Properties dialog": "",
-            "Unlink the current element": ""
-        },
-        "CreateLink": {
-            "Are you sure you wish to remove this link?": "",
-            "Insert/Modify Link": "",
-            "New window (_blank)": "",
-            "None (use implicit)": "",
-            "Other": "",
-            "Same frame (_self)": "",
-            "Target:": "",
-            "Title (tooltip):": "",
-            "Top frame (_top)": "",
-            "URL:": "",
-            "You need to select some text before creating a link": ""
-        },
-        "DefinitionList": {
-            "definition description": "",
-            "definition list": "",
-            "definition term": ""
-        },
-        "Dialogs": {
-            "Some Text Here": ""
-        },
-        "DynamicCSS": {
-            "Choose stylesheet": "",
-            "Default": "",
-            "Undefined": ""
-        },
-        "EditTag": {
-            "Edit HTML for selected text": "",
-            "Edit Tag By Peg": "",
-            "Tag Editor": ""
-        },
-        "Equation": {
-            "!=": "",
-            "!in": "",
-            "&gt;-": "",
-            "&gt;=": "",
-            "&lt;=": "",
-            "&lt;=&gt;": "",
-            "&lt;x&gt;": "",
-            "&nbsp; `!` &nbsp;": "",
-            "&nbsp; `.` &nbsp;": "",
-            "&nbsp; `0` &nbsp;": "",
-            "&nbsp; `2` &nbsp;": "",
-            "&nbsp; `3` &nbsp;": "",
-            "&nbsp; `4` &nbsp;": "",
-            "&nbsp; `5` &nbsp;": "",
-            "&nbsp; `6` &nbsp;": "",
-            "&nbsp; `7` &nbsp;": "",
-            "&nbsp; `8` &nbsp;": "",
-            "&nbsp; `9` &nbsp;": "",
-            "&nbsp; `e` &nbsp;": "",
-            "&nbsp;&nbsp;`1` &nbsp;": "",
-            "&nbsp;`+{::}`&nbsp;": "",
-            "&nbsp;`-:\\ `": "",
-            "&nbsp;`-{::}`&nbsp;": "",
-            "&nbsp;`C`&nbsp;": "",
-            "&nbsp;`cos`": "",
-            "&nbsp;`ln`&nbsp;": "",
-            "&nbsp;`pi` &nbsp;": "",
-            "&nbsp;`sin`": "",
-            "&nbsp;`tan`": "",
-            "&nbsp;`times`&nbsp;": "",
-            "&quot;text&quot;": "",
-            "'+formula+'": "",
-            "((n),(k))": "",
-            "(x+1)/(x-1)": "",
-            "*": "",
-            "**": "",
-            "+-": "",
-            "-&gt;": "",
-            "-&lt;": "",
-            "-:": "",
-            "-=": "",
-            "//": "",
-            "/_": "",
-            ":.": "",
-            "=&gt;": "",
-            "@": "",
-            "[[a,b],[c,d]]": "",
-            "\\\\": "",
-            "\\nClick in the box to use your keyboard or use the buttons\\n": "",
-            "^^": "",
-            "^^^": "",
-            "__|": "",
-            "_|_": "",
-            "`!=`": "",
-            "`!in`": "",
-            "`&and;`": "",
-            "`&cap;`": "",
-            "`&cup;`": "",
-            "`&gt;-`": "",
-            "`&gt;=`": "",
-            "`&lt;=&gt;`": "",
-            "`&lt;=`": "",
-            "`&lt;x&gt;`": "",
-            "`&or;`": "",
-            "`&quot;text&quot;`": "",
-            "`((n),(k))`": "",
-            "`(x+1)/(x-1)`": "",
-            "`**`": "",
-            "`*`": "",
-            "`+-`": "",
-            "`-&gt;`": "",
-            "`-&lt;`": "",
-            "`-:`": "",
-            "`-=`": "",
-            "`//`": "",
-            "`/_`": "",
-            "`:.`": "",
-            "`=&gt;`": "",
-            "`@`": "",
-            "`[[a,b],[c,d]]`": "",
-            "`\\\\`": "",
-            "`__|`": "",
-            "`_|_`": "",
-            "`AA`": "",
-            "`aleph`": "",
-            "`alpha`": "",
-            "`and`": "",
-            "`bara`": "",
-            "`bba`": "",
-            "`bbba`": "",
-            "`beta`": "",
-            "`CC`": "",
-            "`cca`": "",
-            "`chi`": "",
-            "`darr`": "",
-            "`ddota`": "",
-            "`del`": "",
-            "`Delta`": "",
-            "`delta`": "",
-            "`diamond`": "",
-            "`dota`": "",
-            "`dy/dx`": "",
-            "`EE`": "",
-            "`epsi`": "",
-            "`eta`": "",
-            "`fra`": "",
-            "`Gamma`": "",
-            "`gamma`": "",
-            "`grad`": "",
-            "`harr`": "",
-            "`hArr`": "",
-            "`hata`": "",
-            "`if`": "",
-            "`in`": "",
-            "`int`": "",
-            "`iota`": "",
-            "`kappa`": "",
-            "`Lambda`": "",
-            "`lambda`": "",
-            "`lArr`": "",
-            "`larr`": "",
-            "`lim_(x-&gt;oo)`": "",
-            "`log`": "",
-            "`mu`": "",
-            "`NN`": "",
-            "`nn`": "",
-            "`not`": "",
-            "`nu`": "",
-            "`o+`": "",
-            "`o.`": "",
-            "`O/`": "",
-            "`oint`": "",
-            "`omega`": "",
-            "`Omega`": "",
-            "`oo`": "",
-            "`or`": "",
-            "`ox`": "",
-            "`phi`": "",
-            "`Phi`": "",
-            "`Pi`": "",
-            "`pi`": "",
-            "`prod`": "",
-            "`prop`": "",
-            "`Psi`": "",
-            "`psi`": "",
-            "`QQ`": "",
-            "`quad`": "",
-            "`rArr`": "",
-            "`rho`": "",
-            "`root(n)(x)`": "",
-            "`RR`": "",
-            "`sfa`": "",
-            "`Sigma`": "",
-            "`sigma`": "",
-            "`sqrt(x)`": "",
-            "`square`": "",
-            "`stackrel(-&gt;)(+)`": "",
-            "`sub`": "",
-            "`sube`": "",
-            "`sum`": "",
-            "`sup`": "",
-            "`supe`": "",
-            "`tau`": "",
-            "`Theta`": "",
-            "`theta`": "",
-            "`TT`": "",
-            "`tta`": "",
-            "`uarr`": "",
-            "`ula`": "",
-            "`upsilon`": "",
-            "`uu`": "",
-            "`veca`": "",
-            "`vv`": "",
-            "`x_(mn)`": "",
-            "`Xi`": "",
-            "`xi`": "",
-            "`xx`": "",
-            "`zeta`": "",
-            "`ZZ`": "",
-            "`|-&gt;`": "",
-            "`|--`": "",
-            "`|==`": "",
-            "`|__`": "",
-            "`|~`": "",
-            "`~=`": "",
-            "`~|`": "",
-            "`~~`": "",
-            "AA": "",
-            "aleph": "",
-            "alpha": "",
-            "and": "",
-            "AsciiMath Formula Input": "",
-            "AsciiMathML Example": "",
-            "bara": "",
-            "Based on ASCIIMathML by": "",
-            "bba": "",
-            "bbba": "",
-            "beta": "",
-            "CC": "",
-            "cca": "",
-            "chi": "",
-            "darr": "",
-            "ddota": "",
-            "del": "",
-            "delta": "",
-            "Delta": "",
-            "diamond": "",
-            "dota": "",
-            "dy/dx": "",
-            "EE": "",
-            "epsi": "",
-            "eta": "",
-            "For more information on AsciiMathML visit this page:": "",
-            "Formula Editor": "",
-            "fra": "",
-            "gamma": "",
-            "Gamma": "",
-            "grad": "",
-            "hArr": "",
-            "harr": "",
-            "hata": "",
-            "if": "",
-            "in": "",
-            "Input": "",
-            "int": "",
-            "int_a^bf(x)dx": "",
-            "iota": "",
-            "kappa": "",
-            "Lambda": "",
-            "lambda": "",
-            "larr": "",
-            "lArr": "",
-            "lim_(x-&gt;oo)": "",
-            "mu": "",
-            "NN": "",
-            "nn": "",
-            "nnn": "",
-            "not": "",
-            "nu": "",
-            "o+": "",
-            "o.": "",
-            "O/": "",
-            "oint": "",
-            "Omega": "",
-            "omega": "",
-            "oo": "",
-            "or": "",
-            "ox": "",
-            "phi": "",
-            "Phi": "",
-            "pi": "",
-            "Pi": "",
-            "Preview": "",
-            "prod": "",
-            "prop": "",
-            "psi": "",
-            "Psi": "",
-            "QQ": "",
-            "quad": "",
-            "rArr": "",
-            "rho": "",
-            "root(n)(x)": "",
-            "RR": "",
-            "sfa": "",
-            "sigma": "",
-            "Sigma": "",
-            "sqrt(x)": "",
-            "square": "",
-            "stackrel(-&gt;)(+)": "",
-            "sub": "",
-            "sube": "",
-            "sum": "",
-            "sum_(n=1)^oo": "",
-            "sup": "",
-            "supe": "",
-            "tau": "",
-            "Theta": "",
-            "theta": "",
-            "TT": "",
-            "tta": "",
-            "uarr": "",
-            "ula": "",
-            "upsilon": "",
-            "uu": "",
-            "uuu": "",
-            "veca": "",
-            "vv": "",
-            "vvv": "",
-            "x^(m+n)": "",
-            "x_(mn)": "",
-            "Xi": "",
-            "xi": "",
-            "xx": "",
-            "zeta": "",
-            "ZZ": "",
-            "|-&gt;": "",
-            "|--": "",
-            "|==": "",
-            "|__": "",
-            "|~": "",
-            "~=": "",
-            "~|": "",
-            "~~": ""
-        },
-        "FancySelects": {
-            "'+opt.text+'": ""
-        },
-        "FindReplace": {
-            "';\r\n  var tagc = '": "",
-            "Case sensitive search": "",
-            "Clear": "",
-            "Done": "",
-            "Enter the text you want to find": "",
-            "Find and Replace": "",
-            "found item": "",
-            "found items": "",
-            "Highlight": "",
-            "Inform a replacement word": "",
-            "Next": "",
-            "not found": "",
-            "Options": "",
-            "Replace with:": "",
-            "replaced item": "",
-            "replaced items": "",
-            "Search for:": "",
-            "Substitute all occurrences": "",
-            "Substitute this occurrence?": "",
-            "Undo": "",
-            "Whole words only": ""
-        },
-        "FormOperations": {
-            "Enter the name for new option.": "",
-            "Form Editor": "",
-            "Insert a check box.": "",
-            "Insert a Form.": "",
-            "Insert a multi-line text field.": "",
-            "Insert a radio button.": "",
-            "Insert a select field.": "",
-            "Insert a submit/reset button.": "",
-            "Insert a text, password or hidden field.": "",
-            "Message Sent": "",
-            "Please Select...": ""
-        },
-        "Forms": {
-            "'onClick'=": "",
-            "Access Key:": "",
-            "Action URL:": "",
-            "Button Script": "",
-            "Checked": "",
-            "Columns:": "",
-            "Default text (optional)": "",
-            "Dimensions": "",
-            "Disabled": "",
-            "Encoding:": "",
-            "For Control:": "",
-            "Form": "",
-            "Form Element: FIELDSET": "",
-            "Form Element: INPUT": "",
-            "Form Element: LABEL": "",
-            "Form Element: SELECT": "",
-            "Form Element: TEXTAREA": "",
-            "Form handler script": "",
-            "Form Name:": "",
-            "Get": "",
-            "Hard": "",
-            "Height in number of rows": "",
-            "HTML-Form to CGI (default)": "",
-            "Image source": "",
-            "Image URL:": "",
-            "Initial Text:": "",
-            "Insert/Edit Form": "",
-            "Insert/Edit Form Element FIELDSET": "",
-            "Insert/Edit Form Element INPUT": "",
-            "Insert/Edit Form Element LABEL": "",
-            "Insert/Edit Form Element SELECT": "",
-            "Insert/Edit Form Element TEXTAREA": "",
-            "Javascript for button click": "",
-            "Label:": "",
-            "Legend:": "",
-            "Max length:": "",
-            "Maximum number of characters accepted": "",
-            "Method:": "",
-            "multipart Form Data (File-Upload)": "",
-            "Name": "",
-            "Name of the form input": "",
-            "Name of the form select": "",
-            "name of the textarea": "",
-            "Name/ID:": "",
-            "normal": "",
-            "nowrap": "",
-            "Off": "",
-            "Physical": "",
-            "Please enter a Label": "",
-            "Post": "",
-            "pre": "",
-            "Read Only": "",
-            "Rows:": "",
-            "Size of text box in characters": "",
-            "Size:": "",
-            "Soft": "",
-            "Tab Index:": "",
-            "Target Frame:": "",
-            "Text:": "",
-            "URL of image": "",
-            "Value of the form input": "",
-            "Value:": "",
-            "Virtual": "",
-            "Width in number of characters": "",
-            "Wrap Mode:": "",
-            "You must enter a Name": "",
-            "Options": "<<FindReplace>>"
-        },
-        "FullPage": {
-            "...": "",
-            "Alternate style-sheet:": "",
-            "Background color:": "",
-            "Character set:": "",
-            "cyrillic (ISO-8859-5)": "",
-            "cyrillic (KOI8-R)": "",
-            "cyrillic (WINDOWS-1251)": "",
-            "Description:": "",
-            "DOCTYPE:": "",
-            "Document properties": "",
-            "Document title:": "",
-            "Keywords:": "",
-            "Primary style-sheet:": "",
-            "Text color:": "",
-            "UTF-8 (recommended)": "",
-            "western (ISO-8859-1)": ""
-        },
-        "FullScreen": {
-            "Maximize/Minimize Editor": ""
-        },
-        "Gecko": {
-            "The Paste button does not work in this browser for security reasons. Press CTRL-V on your keyboard to paste directly.": ""
-        },
-        "HorizontalRule": {
-            "&#x00d7;": "",
-            "&nbsp;": "",
-            "Alignment:": "",
-            "Center": "",
-            "Color:": "",
-            "Height:": "",
-            "Insert/edit horizontal rule": "",
-            "Insert/Edit Horizontal Rule": "",
-            "Layout": "",
-            "Left": "",
-            "No shading": "",
-            "percent": "",
-            "pixels": "",
-            "Right": "",
-            "Style": "",
-            "Width:": ""
-        },
-        "InlineStyler": {
-            "Background": "",
-            "Baseline": "",
-            "Border": "",
-            "Bottom": "",
-            "Char": "",
-            "Collapsed borders": "",
-            "CSS Style": "",
-            "FG Color": "",
-            "Float": "",
-            "Justify": "",
-            "Margin": "",
-            "Middle": "",
-            "None": "",
-            "Padding": "",
-            "Text align": "",
-            "Top": "",
-            "Vertical align": "",
-            "-": "<<Equation>>",
-            "Center": "<<HorizontalRule>>",
-            "Height": "<<HorizontalRule>>",
-            "Image URL": "<<Forms>>",
-            "Layout": "<<HorizontalRule>>",
-            "Left": "<<HorizontalRule>>",
-            "percent": "<<HorizontalRule>>",
-            "pixels": "<<HorizontalRule>>",
-            "Right": "<<HorizontalRule>>",
-            "Width": "<<HorizontalRule>>"
-        },
-        "InsertAnchor": {
-            "Anchor name": "",
-            "Insert Anchor": "",
-            "Delete": "<<Abbreviation>>"
-        },
-        "InsertImage": {
-            "Absbottom": "",
-            "Absmiddle": "",
-            "Alternate text:": "",
-            "Border thickness:": "",
-            "Enter the image URL here": "",
-            "For browsers that don't support images": "",
-            "Horizontal padding": "",
-            "Horizontal:": "",
-            "Image Preview:": "",
-            "Insert Image": "",
-            "Leave empty for no border": "",
-            "Not set": "",
-            "Positioning of this image": "",
-            "Preview the image in a new window": "",
-            "Spacing": "",
-            "Texttop": "",
-            "Vertical padding": "",
-            "Vertical:": "",
-            "You must enter the URL": "",
-            "Alignment:": "<<HorizontalRule>>",
-            "Baseline": "<<InlineStyler>>",
-            "Bottom": "<<InlineStyler>>",
-            "Image URL:": "<<Forms>>",
-            "Layout": "<<HorizontalRule>>",
-            "Left": "<<HorizontalRule>>",
-            "Middle": "<<InlineStyler>>",
-            "Preview": "<<Equation>>",
-            "Right": "<<HorizontalRule>>",
-            "Top": "<<InlineStyler>>"
-        },
-        "InsertNote": {
-            "Insert": "",
-            "Insert footnote": "",
-            "Insert Note": ""
-        },
-        "InsertPagebreak": {
-            "Page break": "",
-            "Page Break": ""
-        },
-        "InsertSmiley": {
-            "Insert Smiley": ""
-        },
-        "InsertSnippet": {
-            "\\n  This is an information about something\\n": "",
-            "Hide preview": "",
-            "Insert as": "",
-            "Insert Snippet": "",
-            "InsertSnippet for Xinha": "",
-            "Link1": "",
-            "Link2": "",
-            "Link3": "",
-            "Link4": "",
-            "Link5": "",
-            "Show preview": "",
-            "This is an information about something": "",
-            "Variable": ""
-        },
-        "InsertSnippet2": {
-            "All Categories": "",
-            "Filter": "",
-            "Insert as HTML": "",
-            "Insert as template variable": "",
-            "Only search word beginning": "",
-            "HTML": "<<CharCounter>>",
-            "Insert Snippet": "<<InsertSnippet>>",
-            "InsertSnippet for Xinha": "<<InsertSnippet>>",
-            "Variable": "<<InsertSnippet>>"
-        },
-        "InsertTable": {
-            "Caption": "",
-            "Caption for the table": "",
-            "Cell padding:": "",
-            "Cell spacing:": "",
-            "Collapse borders:": "",
-            "Cols:": "",
-            "Em": "",
-            "Fixed width columns": "",
-            "Layou": "",
-            "Number of columns": "",
-            "Number of rows": "",
-            "Positioning of this table": "",
-            "Space between adjacent cells": "",
-            "Space between content and border in cell": "",
-            "Style of the border": "",
-            "Width of the table": "",
-            "Width unit": "",
-            "You must enter a number of columns": "",
-            "You must enter a number of rows": "",
-            "Absbottom": "<<InsertImage>>",
-            "Absmiddle": "<<InsertImage>>",
-            "Alignment:": "<<HorizontalRule>>",
-            "Baseline": "<<InlineStyler>>",
-            "Border": "<<InlineStyler>>",
-            "Border thickness:": "<<InsertImage>>",
-            "Bottom": "<<InlineStyler>>",
-            "Layout": "<<HorizontalRule>>",
-            "Leave empty for no border": "<<InsertImage>>",
-            "Left": "<<HorizontalRule>>",
-            "Middle": "<<InlineStyler>>",
-            "Not set": "<<InsertImage>>",
-            "Percent": "<<HorizontalRule>>",
-            "Pixels": "<<HorizontalRule>>",
-            "Right": "<<HorizontalRule>>",
-            "Rows:": "<<Forms>>",
-            "Spacing": "<<InsertImage>>",
-            "Texttop": "<<InsertImage>>",
-            "Top": "<<InlineStyler>>",
-            "Width:": "<<HorizontalRule>>"
-        },
-        "LangMarks": {
-            "&mdash; language &mdash;": "",
-            "', '": "",
-            "English": "",
-            "French": "",
-            "Greek": "",
-            "language select": "",
-            "Latin": ""
-        },
-        "Linker": {
-            "(px)": "",
-            "Anchor-Link": "",
-            "Anchor:": "",
-            "Email Address:": "",
-            "Email Link": "",
-            "Location Bar:": "",
-            "Menu Bar:": "",
-            "Message Template:": "",
-            "New Window": "",
-            "Ordinary Link": "",
-            "Popup Window": "",
-            "PopupWindow": "",
-            "Remove Link": "",
-            "Resizeable:": "",
-            "Same Window (jump out of frames)": "",
-            "Scrollbars:": "",
-            "Shows On Hover": "",
-            "Status Bar:": "",
-            "Subject:": "",
-            "Title:": "",
-            "Toolbar:": "",
-            "URL Link": "",
-            "You must select some text before making a new link.": "",
-            "Are you sure you wish to remove this link?": "<<CreateLink>>",
-            "Insert/Modify Link": "<<CreateLink>>",
-            "Name:": "<<Forms>>",
-            "Size:": "<<Forms>>",
-            "Target:": "<<CreateLink>>",
-            "URL:": "<<CreateLink>>"
-        },
-        "ListType": {
-            "Choose list style type (for ordered lists)": "",
-            "Decimal numbers": "",
-            "Lower greek letters": "",
-            "Lower latin letters": "",
-            "Lower roman numbers": "",
-            "Upper latin letters": "",
-            "Upper roman numbers": ""
-        },
-        "MootoolsFileManager": {
-            "Insert File Link": "",
-            "You must select some text before making a new link.": "<<Linker>>"
-        },
-        "Opera": {
-            "MARK": "",
-            "The Paste button does not work in Mozilla based web browsers (technical security reasons). Press CTRL-V on your keyboard to paste directly.": ""
-        },
-        "PasteText": {
-            "Insert text in new paragraph": "",
-            "Paste as Plain Text": ""
-        },
-        "PreserveScripts": {
-            "JavaScript": "",
-            "PHP": ""
-        },
-        "QuickTag": {
-            "',\r\n                           'cl': '": "",
-            "ATTRIBUTES": "",
-            "Colors": "",
-            "Enter the TAG you want to insert": "",
-            "No CSS class avaiable": "",
-            "Ok": "",
-            "OPTIONS": "",
-            "Quick Tag Editor": "",
-            "TAGs": "",
-            "There are some unclosed quote": "",
-            "This attribute already exists in the TAG": "",
-            "You have to select some text": ""
-        },
-        "SaveSubmit": {
-            "in progress": "",
-            "Ready": "",
-            "Save": "",
-            "Saving...": ""
-        },
-        "SetId": {
-            "ID/Name:": "",
-            "Set Id and Name": "",
-            "Set Id/Name": "",
-            "Set ID/Name": "",
-            "Delete": "<<Abbreviation>>"
-        },
-        "SmartReplace": {
-            "ClosingDoubleQuotes": "",
-            "ClosingSingleQuote": "",
-            "Convert all quotes and dashes in the current document": "",
-            "Enable automatic replacements": "",
-            "OpeningDoubleQuotes": "",
-            "OpeningSingleQuote": "",
-            "SmartReplace": "",
-            "SmartReplace Settings": ""
-        },
-        "Stylist": {
-            "Styles": ""
-        },
-        "SuperClean": {
-            "Clean bad HTML from Microsoft Word.": "",
-            "Clean Selection Only": "",
-            "Clean up HTML": "",
-            "Cleaning Scope": "",
-            "General tidy up and correction of some problems.": "",
-            "Please select from the following cleaning options...": "",
-            "Please stand by while cleaning in process...": "",
-            "Remove alignment (left/right/justify).": "",
-            "Remove all classes (CSS).": "",
-            "Remove All HTML Tags": "",
-            "Remove all styles (CSS).": "",
-            "Remove custom font sizes.": "",
-            "Remove custom text colors.": "",
-            "Remove custom typefaces (font \"styles\").": "",
-            "Remove emphasis and annotations.": "",
-            "Remove lang attributes.": "",
-            "Remove Paragraphs": "",
-            "Remove superscripts and subscripts.": "",
-            "Replace directional quote marks with non-directional quote marks.": "",
-            "Vigorously purge HTML from Microsoft Word.": ""
-        },
-        "TableOperations": {
-            "All four sides": "",
-            "Borders": "",
-            "Cell properties": "",
-            "Cell Properties": "",
-            "Cell Type:": "",
-            "Cells down": "",
-            "Cells to the right, and": "",
-            "Delete cell": "",
-            "Delete column": "",
-            "Delete row": "",
-            "Do Not Change": "",
-            "Frame and borders": "",
-            "Frames": "",
-            "Header (th)": "",
-            "Insert cell after": "",
-            "Insert cell before": "",
-            "Insert column after": "",
-            "Insert column before": "",
-            "Insert row after": "",
-            "Insert row before": "",
-            "Merge cells": "",
-            "Merge current cell with:": "",
-            "No rules": "",
-            "No sides": "",
-            "Normal (td)": "",
-            "Please click into some cell": "",
-            "Row properties": "",
-            "Row Properties": "",
-            "Rules will appear between all rows and columns": "",
-            "Rules will appear between columns only": "",
-            "Rules will appear between rows only": "",
-            "Spacing and padding": "",
-            "Split column": "",
-            "Split row": "",
-            "Summary": "",
-            "Table properties": "",
-            "Table Properties": "",
-            "The bottom side only": "",
-            "The left-hand side only": "",
-            "The right and left sides only": "",
-            "The right-hand side only": "",
-            "The top and bottom sides only": "",
-            "The top side only": "",
-            "Xinha cowardly refuses to delete the last cell in row.": "",
-            "Xinha cowardly refuses to delete the last column in table.": "",
-            "Xinha cowardly refuses to delete the last row in table.": "",
-            "Caption": "<<InsertTable>>",
-            "Columns": "<<Forms>>",
-            "Description": "<<FullPage>>",
-            "Merge Cells": "<<ContextMenu>>",
-            "Padding": "<<InlineStyler>>",
-            "pixels": "<<HorizontalRule>>",
-            "Rows": "<<Forms>>",
-            "Spacing": "<<InsertImage>>"
-        },
-        "UnsavedChanges": {
-            "You have unsaved changes in the editor": ""
-        },
-        "WebKit": {
-            "The Paste button does not work in this browser for security reasons. Press CTRL-V on your keyboard to paste directly.": "<<Gecko>>"
-        },
-        "Xinha": {
-            "&#8212; font &#8212;": "",
-            "&#8212; format &#8212;": "",
-            "&#8212; size &#8212;": "",
-            "1 (8 pt)": "",
-            "2 (10 pt)": "",
-            "3 (12 pt)": "",
-            "4 (14 pt)": "",
-            "5 (18 pt)": "",
-            "6 (24 pt)": "",
-            "7 (36 pt)": "",
-            "Address": "",
-            "Arial": "",
-            "Clean content pasted from Word": "",
-            "Clear Inline Font Specifications": "",
-            "Clear MSOffice tags": "",
-            "Close": "",
-            "Constructing object": "",
-            "Courier New": "",
-            "Create Statusbar": "",
-            "Create Toolbar": "",
-            "CTRL-0 (zero)": "",
-            "CTRL-1 .. CTRL-6": "",
-            "CTRL-A": "",
-            "CTRL-B": "",
-            "CTRL-C": "",
-            "CTRL-E": "",
-            "CTRL-I": "",
-            "CTRL-J": "",
-            "CTRL-L": "",
-            "CTRL-N": "",
-            "CTRL-R": "",
-            "CTRL-S": "",
-            "CTRL-U": "",
-            "CTRL-V": "",
-            "CTRL-X": "",
-            "CTRL-Y": "",
-            "CTRL-Z": "",
-            "Direction left to right": "",
-            "Direction right to left": "",
-            "Editor Help": "",
-            "ENTER": "",
-            "Error Loading Xinha.  Developers, check the Error Console for information.": "",
-            "Finishing": "",
-            "Formatted": "",
-            "Generate Xinha framework": "",
-            "Georgia": "",
-            "Heading 1": "",
-            "Heading 2": "",
-            "Heading 3": "",
-            "Heading 4": "",
-            "Heading 5": "",
-            "Heading 6": "",
-            "Headings": "",
-            "Impact": "",
-            "Init editor size": "",
-            "insert linebreak": "",
-            "Insert/Overwrite": "",
-            "Keyboard shortcuts": "",
-            "Loading Core": "",
-            "Loading in progress. Please wait!": "",
-            "Loading plugin $plugin": "",
-            "Loading plugins": "",
-            "MS Word Cleaner": "",
-            "new paragraph": "",
-            "Normal": "",
-            "Print document": "",
-            "Register plugin $plugin": "",
-            "Remove formatting": "",
-            "Save as": "",
-            "Select all": "",
-            "Select Color": "",
-            "Set format to paragraph": "",
-            "SHIFT-ENTER": "",
-            "Split Block": "",
-            "Tahoma": "",
-            "The editor provides the following key combinations:": "",
-            "Times New Roman": "",
-            "Toggle Borders": "",
-            "Touch here first to activate editor.": "",
-            "Verdana": "",
-            "Waiting for Iframe to load...": "",
-            "WingDings": "",
-            "Would you like to clear font colours?": "",
-            "Would you like to clear font sizes?": "",
-            "Would you like to clear font typefaces?": "",
-            "Xinha": ""
-        },
-        "BackgroundImage": {
-            "__ TRANSLATOR NOTE __": "*** BACKGROUNDIMAGE IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***",
-            "Remove Current Background": "",
-            "Set Background": "",
-            "Set page background image": "",
-            "Set Page Background Image": ""
-        },
-        "ClientsideSpellcheck": {
-            "__ TRANSLATOR NOTE __": "*** CLIENTSIDESPELLCHECK IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***",
-            "Spell Check using ieSpell": ""
-        },
-        "ExtendedFileManager": {
-            "__ TRANSLATOR NOTE __": "*** EXTENDEDFILEMANAGER IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***",
-            "10%": "",
-            "100%": "",
-            "200%": "",
-            "25%": "",
-            "50%": "",
-            "75%": "",
-            ">List View": "",
-            ">Thumbnail View": "",
-            "A:": "",
-            "Align": "",
-            "Alt": "",
-            "Border Color": "",
-            "Constrain Proportions": "",
-            "Crop": "",
-            "D:": "",
-            "Directory": "",
-            "Directory Up": "",
-            "Edit": "",
-            "File List": "",
-            "File Manager": "",
-            "Filename:": "",
-            "Filesize:": "",
-            "Flip Horizontal": "",
-            "Flip Image": "",
-            "Flip Vertical": "",
-            "Folder": "",
-            "GIF": "",
-            "GIF format is not supported, image editing not supported.": "",
-            "H:": "",
-            "Image Editor": "",
-            "Image Selection": "",
-            "Invalid base directory:": "",
-            "JPEG High": "",
-            "JPEG Low": "",
-            "JPEG Medium": "",
-            "Loading": "",
-            "Lock": "",
-            "Marker": "",
-            "Maximum folder size limit reached. Upload disabled.": "",
-            "Measure": "",
-            "New Folder": "",
-            "No Files Found": "",
-            "No Image Available": "",
-            "Please enter value": "",
-            "PNG": "",
-            "Preset": "",
-            "Quality:": "",
-            "Refresh": "",
-            "Rename": "",
-            "Resize": "",
-            "Rotate": "",
-            "Rotate 180 &deg;": "",
-            "Rotate 90 &deg; CCW": "",
-            "Rotate 90 &deg; CW": "",
-            "Rotate Image": "",
-            "Start X:": "",
-            "Start Y:": "",
-            "Target Window": "",
-            "Toggle marker color": "",
-            "Trash": "",
-            "Upload": "",
-            "W:": "",
-            "X:": "",
-            "Xinha Image Editor": "",
-            "Y:": "",
-            "Zoom": "",
-            "Absbottom": "<<InsertImage>>",
-            "Absmiddle": "<<InsertImage>>",
-            "Baseline": "<<InlineStyler>>",
-            "Border": "<<InlineStyler>>",
-            "Bottom": "<<InlineStyler>>",
-            "Clear": "<<FindReplace>>",
-            "Color": "<<HorizontalRule>>",
-            "Copy": "<<ContextMenu>>",
-            "Cut": "<<ContextMenu>>",
-            "Height": "<<HorizontalRule>>",
-            "Height:": "<<HorizontalRule>>",
-            "Insert File Link": "<<MootoolsFileManager>>",
-            "Left": "<<HorizontalRule>>",
-            "Margin": "<<InlineStyler>>",
-            "Middle": "<<InlineStyler>>",
-            "New window (_blank)": "<<CreateLink>>",
-            "None (use implicit)": "<<CreateLink>>",
-            "Not set": "<<InsertImage>>",
-            "Padding": "<<InlineStyler>>",
-            "Positioning of this image": "<<InsertImage>>",
-            "Preview": "<<Equation>>",
-            "Right": "<<HorizontalRule>>",
-            "Same frame (_self)": "<<CreateLink>>",
-            "Save": "<<SaveSubmit>>",
-            "Texttop": "<<InsertImage>>",
-            "Title (tooltip)": "<<CreateLink>>",
-            "Top": "<<InlineStyler>>",
-            "Top frame (_top)": "<<CreateLink>>",
-            "Width": "<<HorizontalRule>>",
-            "Width:": "<<HorizontalRule>>",
-            "You must select some text before making a new link.": "<<Linker>>"
-        },
-        "Filter": {
-            "__ TRANSLATOR NOTE __": "*** FILTER IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***",
-            "Filter": "<<InsertSnippet2>>"
-        },
-        "HtmlTidy": {
-            "__ TRANSLATOR NOTE __": "*** HTMLTIDY IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***",
-            "Auto-Tidy": "",
-            "Don't Tidy": "",
-            "HTML Tidy": "",
-            "Tidy failed.  Check your HTML for syntax errors.": ""
-        },
-        "ImageManager": {
-            "__ TRANSLATOR NOTE __": "*** IMAGEMANAGER IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***",
-            "Angle:": "",
-            "Flickr Picture List": "",
-            "Flickr Pictures": "",
-            "Flickr Selection": "",
-            "Flickr Username/Email": "",
-            "Folder Name:": "",
-            "Image Format": "",
-            "Image List": "",
-            "Keyword": "",
-            "No Images Found": "",
-            "No Photos Found": "",
-            "No Videos Found": "",
-            "This Server": "",
-            "YouTube Selection": "",
-            "YouTube Username": "",
-            "YouTube Video List": "",
-            "YouTube Videos": "",
-            "A:": "<<ExtendedFileManager>>",
-            "Absbottom": "<<InsertImage>>",
-            "Absmiddle": "<<InsertImage>>",
-            "Baseline": "<<InlineStyler>>",
-            "Bottom": "<<InlineStyler>>",
-            "Clear": "<<FindReplace>>",
-            "Constrain Proportions": "<<ExtendedFileManager>>",
-            "Crop": "<<ExtendedFileManager>>",
-            "D:": "<<ExtendedFileManager>>",
-            "Directory": "<<ExtendedFileManager>>",
-            "Directory Up": "<<ExtendedFileManager>>",
-            "Edit": "<<ExtendedFileManager>>",
-            "Filename:": "<<ExtendedFileManager>>",
-            "Flip Horizontal": "<<ExtendedFileManager>>",
-            "Flip Image": "<<ExtendedFileManager>>",
-            "Flip Vertical": "<<ExtendedFileManager>>",
-            "GIF": "<<ExtendedFileManager>>",
-            "GIF format is not supported, image editing not supported.": "<<ExtendedFileManager>>",
-            "H:": "<<ExtendedFileManager>>",
-            "Height:": "<<HorizontalRule>>",
-            "Image Editor": "<<ExtendedFileManager>>",
-            "Image Selection": "<<ExtendedFileManager>>",
-            "Insert Image": "<<InsertImage>>",
-            "Invalid base directory:": "<<ExtendedFileManager>>",
-            "JPEG High": "<<ExtendedFileManager>>",
-            "JPEG Low": "<<ExtendedFileManager>>",
-            "JPEG Medium": "<<ExtendedFileManager>>",
-            "Left": "<<HorizontalRule>>",
-            "Lock": "<<ExtendedFileManager>>",
-            "Marker": "<<ExtendedFileManager>>",
-            "Measure": "<<ExtendedFileManager>>",
-            "Middle": "<<InlineStyler>>",
-            "New Folder": "<<ExtendedFileManager>>",
-            "No Image Available": "<<ExtendedFileManager>>",
-            "Not set": "<<InsertImage>>",
-            "PNG": "<<ExtendedFileManager>>",
-            "Positioning of this image": "<<InsertImage>>",
-            "Quality:": "<<ExtendedFileManager>>",
-            "Refresh": "<<ExtendedFileManager>>",
-            "Resize": "<<ExtendedFileManager>>",
-            "Right": "<<HorizontalRule>>",
-            "Rotate": "<<ExtendedFileManager>>",
-            "Rotate 180 &deg;": "<<ExtendedFileManager>>",
-            "Rotate 90 &deg; CCW": "<<ExtendedFileManager>>",
-            "Rotate 90 &deg; CW": "<<ExtendedFileManager>>",
-            "Rotate Image": "<<ExtendedFileManager>>",
-            "Save": "<<SaveSubmit>>",
-            "Start X:": "<<ExtendedFileManager>>",
-            "Start Y:": "<<ExtendedFileManager>>",
-            "Texttop": "<<InsertImage>>",
-            "Top": "<<InlineStyler>>",
-            "Trash": "<<ExtendedFileManager>>",
-            "W:": "<<ExtendedFileManager>>",
-            "Width:": "<<HorizontalRule>>",
-            "X:": "<<ExtendedFileManager>>",
-            "Y:": "<<ExtendedFileManager>>"
-        },
-        "InsertMarquee": {
-            "__ TRANSLATOR NOTE __": "*** INSERTMARQUEE IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***",
-            "Alternate": "",
-            "Background-Color:": "",
-            "Behavior:": "",
-            "Continuous": "",
-            "Direction:": "",
-            "Insert scrolling marquee": "",
-            "Marquee Editor": "",
-            "Scroll Amount:": "",
-            "Scroll Delay:": "",
-            "Slide": "",
-            "Speed Control": "",
-            "Height:": "<<HorizontalRule>>",
-            "Left": "<<HorizontalRule>>",
-            "Name": "<<Forms>>",
-            "Name/ID:": "<<Forms>>",
-            "Right": "<<HorizontalRule>>",
-            "Text:": "<<Forms>>",
-            "Width:": "<<HorizontalRule>>"
-        },
-        "InsertPicture": {
-            "__ TRANSLATOR NOTE __": "*** INSERTPICTURE IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***",
-            "Leave empty for not defined": "",
-            "Open file in new window": "",
-            " Open file in new window": "",
-            "Upload file": "",
-            "Absbottom": "<<InsertImage>>",
-            "Absmiddle": "<<InsertImage>>",
-            "Alignment:": "<<HorizontalRule>>",
-            "Alternate text:": "<<InsertImage>>",
-            "Baseline": "<<InlineStyler>>",
-            "Border thickness:": "<<InsertImage>>",
-            "Bottom": "<<InlineStyler>>",
-            "Enter the image URL here": "<<InsertImage>>",
-            "For browsers that don't support images": "<<InsertImage>>",
-            "Height:": "<<HorizontalRule>>",
-            "Horizontal padding": "<<InsertImage>>",
-            "Horizontal:": "<<InsertImage>>",
-            "Image Preview:": "<<InsertImage>>",
-            "Image URL:": "<<Forms>>",
-            "Insert Image": "<<InsertImage>>",
-            "Layout": "<<HorizontalRule>>",
-            "Leave empty for no border": "<<InsertImage>>",
-            "Left": "<<HorizontalRule>>",
-            "Middle": "<<InlineStyler>>",
-            "Not set": "<<InsertImage>>",
-            "Positioning of this image": "<<InsertImage>>",
-            "Preview": "<<Equation>>",
-            "Preview the image in a new window": "<<InsertImage>>",
-            "Right": "<<HorizontalRule>>",
-            "Size": "<<Forms>>",
-            "Spacing": "<<InsertImage>>",
-            "Texttop": "<<InsertImage>>",
-            "Top": "<<InlineStyler>>",
-            "Vertical padding": "<<InsertImage>>",
-            "Vertical:": "<<InsertImage>>",
-            "Width:": "<<HorizontalRule>>"
-        },
-        "NoteServer": {
-            "__ TRANSLATOR NOTE __": "*** NOTESERVER IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***",
-            "120%": "",
-            "150%": "",
-            "80%": "",
-            "Add GUIDO Code in a textbox on the page": "",
-            "Add MIDI link to allow students to hear the music": "",
-            "Format": "",
-            "GUIDO Code": "",
-            "Guido code": "",
-            "Image in applet": "",
-            "Insert GUIDO Music Notation": "",
-            "MIDI File": "",
-            "Source Code": "",
-            "With Mozilla, the applet will not be visible in editor, but only in Web page after submitting.": "",
-            "Zoom :": "",
-            "100%": "<<ExtendedFileManager>>",
-            "Image Preview": "<<InsertImage>>",
-            "Options": "<<FindReplace>>",
-            "Preview": "<<Equation>>",
-            "Preview the image in a new window": "<<InsertImage>>",
-            "Zoom": "<<ExtendedFileManager>>"
-        },
-        "PSLocal": {
-            "__ TRANSLATOR NOTE __": "*** PSLOCAL IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***",
-            "Confirm": "",
-            "Enable": "",
-            "Enable Gears in order to use local document storage and configuration.": "",
-            "Enabling Local Storage": "",
-            "Install": "",
-            "Learn About Local Storage": "",
-            "This will reload the page, causing you to lose any unsaved work.  Press \"OK\" to reload.": "",
-            "Xinha uses Google Gears to enable local document storage.  With Gears installed, you can save drafts of your documents on your hard drive, configure Xinha to look the way you want, and carry this information wherever you use Xinha on the web.": ""
-        },
-        "PSServer": {
-            "__ TRANSLATOR NOTE __": "*** PSSERVER IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***",
-            "File: ": "",
-            "Import": ""
-        },
-        "PersistentStorage": {
-            "__ TRANSLATOR NOTE __": "*** PERSISTENTSTORAGE IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***",
-            "Details": "",
-            "File Browser": "",
-            "Hello    There C ": "",
-            "Hello  There A ": "",
-            "Hello \" There B \"": "",
-            "Hello ' There D '": "",
-            "List of Places": "",
-            "New Document": "",
-            "Open": "",
-            "Open Document": "",
-            "Places": "",
-            "Please enter the name of the directory you'd like to create.": "",
-            "Save Document": "",
-            "This will erase any unsaved content.  If you're certain, please click OK to continue.": "",
-            "Web URL": "",
-            "Confirm": "<<PSLocal>>",
-            "Copy": "<<ContextMenu>>",
-            "Delete": "<<Abbreviation>>",
-            "Directory Up": "<<ExtendedFileManager>>",
-            "File List": "<<ExtendedFileManager>>",
-            "File Manager": "<<ExtendedFileManager>>",
-            "Filename": "<<ExtendedFileManager>>",
-            "Insert": "<<InsertNote>>",
-            "Insert Image": "<<InsertImage>>",
-            "New Folder": "<<ExtendedFileManager>>",
-            "Save": "<<SaveSubmit>>",
-            "You must select some text before making a new link.": "<<Linker>>"
-        },
-        "SpellChecker": {
-            "__ TRANSLATOR NOTE __": "*** SPELLCHECKER IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***",
-            "Dictionary": "",
-            "Finished list of mispelled words": "",
-            "HTMLArea Spell Checker": "",
-            "I will open it in a new page.": "",
-            "Ignore": "",
-            "Ignore all": "",
-            "Info": "",
-            "Learn": "",
-            "No mispelled words found with the selected dictionary.": "",
-            "Original word": "",
-            "Please confirm that you want to open this link": "",
-            "Please wait.  Calling spell checker.": "",
-            "Please wait: changing dictionary to": "",
-            "pliz weit ;-)": "",
-            "Re-check": "",
-            "Replace": "",
-            "Replace all": "",
-            "Revert": "",
-            "Spell Checker": "",
-            "Spell-check": "",
-            "Suggestions": "",
-            "This will drop changes and quit spell checker.  Please confirm.": "",
-            "Replace with": "<<FindReplace>>"
-        },
-        "Template": {
-            "__ TRANSLATOR NOTE __": "*** TEMPLATE IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***",
-            "Insert template": ""
-        },
-        "UnFormat": {
-            "__ TRANSLATOR NOTE __": "*** UNFORMAT IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***",
-            "All": "",
-            "All HTML:": "",
-            "Cleaning Area": "",
-            "Cleaning options": "",
-            "Formatting:": "",
-            "Page Cleaner": "",
-            "Select which types of formatting you would like to remove.": "",
-            "Selection": ""
-        }
-    }
-}
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/lang/merged/el.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/lang/merged/el.js
deleted file mode 100644
index 5ae6836..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/lang/merged/el.js
+++ /dev/null
@@ -1,1575 +0,0 @@
-// Xinha Language Combined Translation File
-//
-// LANG: "el", ENCODING: UTF-8
-//
-// INSTRUCTIONS TO TRANSLATORS
-// ===========================================================================
-//
-// Your translation must be in UTF-8 Character Encoding.
-//
-// This is a JSON encoded file (plus comments), strings should be double-quote
-// only, do not use single quotes to surround strings - "hello", not 'hello'
-// do not have a trailing comma after the last entry in a section.
-//
-// Only full line comments are allowed (that a comments occupy entire lines).
-//
-// Search for the __NEW_TRANSLATIONS__ section below, this is where you will
-// want to focus, this section includes things that do not presently have a 
-// translation or for which the translation needs to be checked for accuracy.
-//
-// In the New Translations section a translation string is one of the following
-//
-//  "English String Here" : ""
-//     This means it is not translated yet, add your translation...
-//     "English String Here" : "Klingon String Here"
-//
-//  "English String Here" : "Translated String Here"
-//     This means that an existing translation for this string, in some other
-//     section has been found, and used.  Check that it is approprite for this
-//     section and if it is, that's fine leave it as is, otherwise change as
-//     appropriate.
-//
-//  "English String Here" : "<<AnotherSection>>"
-//     This means use the same translation for this string as <<AnotherSection>>
-//     this saves you re-tranlating strings.  If the Context of this section
-//     and the context of AnotherSection seem the same, that's fine leave it
-//     using that translation, but if this section needs a different translation, 
-//     you can provide it by replacing the link (<<AnotherSection>>) with that
-//     new translation.  For example - a "Table" in say "DataPlugin" is 
-//     perhaps translated differently to "Table" in "FurniturePlugin".
-//
-// TESTING YOUR TRANSLATION
-// ===========================================================================
-// Simply place your translation file on your webserver somewhere for example
-//
-//   /xinha/lang/merged/el.js
-//
-// and then tell Xinha where to get it (before loading XinhaCore.js) by 
-//
-//  _editor_lang              = 'el';
-//  _editor_lang_merged_file  = '/xinha/lang/merged/el.js';
-//
-// Xinha will load your new language definition.
-//
-// SUBMITTING YOUR TRANSLATION
-// ===========================================================================
-// Simply create a Ticket on the Xinha website and attach your translation 
-// file.
-//
-// The Xinha developers will take your file and use the 
-//     contrib/lc_split_merged_file.php
-// script to load it into the Xinha distribution.
-
-{
-    "Abbreviation": {
-        "Cancel": "Ακύρωση",
-        "OK": "Εντάξει"
-    },
-    "AboutBox": {
-        "About this editor": "Πληροφορίες"
-    },
-    "BackgroundImage": {
-        "Cancel": "Ακύρωση"
-    },
-    "ColorPicker": {
-        "Color: ": "Χρώμα",
-        "OK": "Εντάξει"
-    },
-    "ContextMenu": {
-        "C_ell Properties...": "Ιδιότητες κελιού...",
-        "Chec_k Link...": "Έλεγχος συνδέσμων...",
-        "Copy": "Αντιγραφή",
-        "Create a link": "Δημιουργία συνδέσμου",
-        "Current URL is": "Το τρέχων URL είναι",
-        "Cut": "Αποκοπή",
-        "De_lete Column": "Διαγραφή στήλης",
-        "Delete the current column": "Διαγραφή επιλεγμένης στήλης",
-        "Delete the current row": "Διαγραφή επιλεγμένης γραμμής",
-        "How did you get here? (Please report!)": "Πώς ήρθατε μέχρι εδώ; (Παρακαλούμε αναφέρετε το!)",
-        "I_nsert Row Before": "Εισαγωγή γραμμής πριν",
-        "In_sert Row After": "Εισαγωγή γραμμής μετά",
-        "Insert C_olumn After": "Εισαγωγή στήλης μετά",
-        "Insert _Column Before": "Εισαγωγή στήλης πριν",
-        "Insert a new column after the current one": "Εισαγωγή νέας στήλης μετά την επιλεγμένη",
-        "Insert a new column before the current one": "Εισαγωγή νέας στήλης πριν την επιλεγμένη",
-        "Insert a new row after the current one": "Εισαγωγή μιας νέας γραμμής μετά την επιλεγμένη",
-        "Insert a new row before the current one": "Εισαγωγή μιας νέας γραμμής πριν την επιλεγμένη",
-        "Justify Center": "Στοίχηση Κέντρο",
-        "Justify Full": "Πλήρης Στοίχηση",
-        "Justify Left": "Στοίχηση Αριστερά",
-        "Justify Right": "Στοίχηση Δεξιά",
-        "Link points to:": "Το τρέχων URL είναι",
-        "Make lin_k...": "Δημιουργία συνδέσμου...",
-        "Opens this link in a new window": "Ανοίγει αυτό τον σύνδεσμο σε ένα νέο παράθυρο",
-        "Paste": "Επικόλληση",
-        "Please confirm that you want to unlink this element.": "Είστε βέβαιος πως θέλετε να αφαιρέσετε τον σύνδεσμο από αυτό το στοιχείο:",
-        "Ro_w Properties...": "Ιδιότητες γραμμής...",
-        "Show the Table Cell Properties dialog": "Ιδιότητες κελιού...",
-        "Show the Table Properties dialog": "Εμφάνιση διαλόγου με τις Ιδιότητες Πίνακα",
-        "Show the Table Row Properties dialog": "Ιδιότητες γραμμής...",
-        "Show the image properties dialog": "Ιδιότητες Εικόνας...",
-        "Unlink the current element": "Αφαίρεση συνδέσμου από το παρών στοιχείο",
-        "_Delete Row": "Διαγραφή γραμμής",
-        "_Image Properties...": "Ιδιότητες Εικόνας...",
-        "_Modify Link...": "Τροποποίηση συνδέσμου...",
-        "_Remove Link...": "Διαγραφή συνδέσμου...",
-        "_Table Properties...": "Ιδιότητες πίνακα..."
-    },
-    "CreateLink": {
-        "Cancel": "Ακύρωση",
-        "Insert/Modify Link": "Εισαγωγή/Τροποποίηση σύνδεσμου",
-        "New window (_blank)": "Νέο παράθυρο (_blank)",
-        "None (use implicit)": "Κανένα (χρήση απόλυτου)",
-        "OK": "Εντάξει",
-        "Other": "Αλλο",
-        "Same frame (_self)": "Ίδιο frame (_self)",
-        "Target:": "Target:",
-        "Title (tooltip):": "Τίτλος (tooltip):",
-        "Top frame (_top)": "Πάνω frame (_top)",
-        "URL:": "URL:"
-    },
-    "EditTag": {
-        "Cancel": "Ακύρωση",
-        "OK": "Εντάξει"
-    },
-    "Equation": {
-        "Cancel": "Ακύρωση",
-        "OK": "Εντάξει"
-    },
-    "ExtendedFileManager": {
-        "Align": "Στοίχηση",
-        "Baseline": "Baseline",
-        "Border": "Περίγραμμα",
-        "Bottom": "Κάτω μέρος",
-        "Cancel": "Ακύρωση",
-        "Color": "Χρώμα",
-        "Copy": "Αντιγραφή",
-        "Cut": "Αποκοπή",
-        "Height": "Ύψος",
-        "Height:": "Ύψος",
-        "Left": "Αριστερά",
-        "Margin": "Περιθώριο",
-        "Middle": "Κέντρο",
-        "New window (_blank)": "Νέο παράθυρο (_blank)",
-        "None (use implicit)": "Κανένα (χρήση απόλυτου)",
-        "OK": "Εντάξει",
-        "Padding": "Εσοχή",
-        "Right": "Δεξιά",
-        "Same frame (_self)": "Ίδιο frame (_self)",
-        "Title (tooltip)": "Τίτλος (tooltip):",
-        "Top": "Πάνω",
-        "Top frame (_top)": "Πάνω frame (_top)",
-        "Width": "Πλάτος",
-        "Width:": "Πλάτος"
-    },
-    "Forms": {
-        "Cancel": "Ακύρωση",
-        "Image URL:": "URL εικόνας",
-        "OK": "Εντάξει"
-    },
-    "FullPage": {
-        "Cancel": "Ακύρωση",
-        "Description:": "Περιγραφή",
-        "OK": "Εντάξει"
-    },
-    "HorizontalRule": {
-        "Cancel": "Ακύρωση",
-        "Center": "Κέντρο",
-        "Color:": "Χρώμα",
-        "Height:": "Ύψος",
-        "Horizontal Rule": "Οριζόντια Γραμμή",
-        "Layout": "Διάταξη",
-        "Left": "Αριστερά",
-        "OK": "Εντάξει",
-        "Right": "Δεξιά",
-        "Width:": "Πλάτος",
-        "percent": "τοις εκατόν",
-        "pixels": "pixels"
-    },
-    "ImageManager": {
-        "Baseline": "Baseline",
-        "Bottom": "Κάτω μέρος",
-        "Cancel": "Ακύρωση",
-        "Height:": "Ύψος",
-        "Left": "Αριστερά",
-        "Middle": "Κέντρο",
-        "OK": "Εντάξει",
-        "Right": "Δεξιά",
-        "Top": "Πάνω",
-        "Width:": "Πλάτος"
-    },
-    "InlineStyler": {
-        "Background": "Φόντο",
-        "Baseline": "Baseline",
-        "Border": "Περίγραμμα",
-        "Bottom": "Κάτω μέρος",
-        "Center": "Κέντρο",
-        "Char": "Χαρακτήρας",
-        "Collapsed borders": "Συμπτυγμένα περιγράμματα",
-        "FG Color": "Χρώμα αντικειμένων",
-        "Float": "Float",
-        "Height": "Ύψος",
-        "Image URL": "URL εικόνας",
-        "Justify": "Πλήρης στοίχηση",
-        "Layout": "Διάταξη",
-        "Left": "Αριστερά",
-        "Margin": "Περιθώριο",
-        "Middle": "Κέντρο",
-        "None": "Τίποτα",
-        "Padding": "Εσοχή",
-        "Right": "Δεξιά",
-        "Text align": "Στοίχηση κειμένου",
-        "Top": "Πάνω",
-        "Vertical align": "Κατακόρυφη στοίχηση",
-        "Width": "Πλάτος",
-        "percent": "τοις εκατόν",
-        "pixels": "pixels"
-    },
-    "InsertAnchor": {
-        "Cancel": "Ακύρωση",
-        "OK": "Εντάξει"
-    },
-    "InsertImage": {
-        "Baseline": "Baseline",
-        "Bottom": "Κάτω μέρος",
-        "Cancel": "Ακύρωση",
-        "Image URL:": "URL εικόνας",
-        "Layout": "Διάταξη",
-        "Left": "Αριστερά",
-        "Middle": "Κέντρο",
-        "OK": "Εντάξει",
-        "Right": "Δεξιά",
-        "Spacing": "Αποστάσεις",
-        "Top": "Πάνω"
-    },
-    "InsertMarquee": {
-        "Cancel": "Ακύρωση",
-        "Height:": "Ύψος",
-        "Left": "Αριστερά",
-        "OK": "Εντάξει",
-        "Right": "Δεξιά",
-        "Width:": "Πλάτος"
-    },
-    "InsertNote": {
-        "Cancel": "Ακύρωση"
-    },
-    "InsertPicture": {
-        "Baseline": "Baseline",
-        "Bottom": "Κάτω μέρος",
-        "Cancel": "Ακύρωση",
-        "Height:": "Ύψος",
-        "Image URL:": "URL εικόνας",
-        "Layout": "Διάταξη",
-        "Left": "Αριστερά",
-        "Middle": "Κέντρο",
-        "OK": "Εντάξει",
-        "Right": "Δεξιά",
-        "Spacing": "Αποστάσεις",
-        "Top": "Πάνω",
-        "Width:": "Πλάτος"
-    },
-    "InsertSnippet": {
-        "Cancel": "Ακύρωση"
-    },
-    "InsertSnippet2": {
-        "Cancel": "Ακύρωση"
-    },
-    "InsertTable": {
-        "Baseline": "Baseline",
-        "Border": "Περίγραμμα",
-        "Bottom": "Κάτω μέρος",
-        "Cancel": "Ακύρωση",
-        "Caption": "Λεζάντα",
-        "Insert Table": "Εισαγωγή Πίνακα",
-        "Layout": "Διάταξη",
-        "Left": "Αριστερά",
-        "Middle": "Κέντρο",
-        "OK": "Εντάξει",
-        "Percent": "τοις εκατόν",
-        "Pixels": "pixels",
-        "Right": "Δεξιά",
-        "Spacing": "Αποστάσεις",
-        "Top": "Πάνω",
-        "Width:": "Πλάτος"
-    },
-    "Linker": {
-        "Cancel": "Ακύρωση",
-        "Insert/Modify Link": "Εισαγωγή/Τροποποίηση σύνδεσμου",
-        "OK": "Εντάξει",
-        "Target:": "Target:",
-        "URL:": "URL:"
-    },
-    "NoteServer": {
-        "Cancel": "Ακύρωση",
-        "OK": "Εντάξει"
-    },
-    "PSLocal": {
-        "Cancel": "Ακύρωση"
-    },
-    "PasteText": {
-        "Cancel": "Ακύρωση",
-        "OK": "Εντάξει"
-    },
-    "PersistentStorage": {
-        "Cancel": "Ακύρωση",
-        "Copy": "Αντιγραφή"
-    },
-    "QuickTag": {
-        "Cancel": "Ακύρωση"
-    },
-    "SetId": {
-        "Cancel": "Ακύρωση",
-        "OK": "Εντάξει"
-    },
-    "SmartReplace": {
-        "OK": "Εντάξει"
-    },
-    "SpellChecker": {
-        "Cancel": "Ακύρωση",
-        "OK": "Εντάξει"
-    },
-    "SuperClean": {
-        "Cancel": "Ακύρωση",
-        "OK": "Εντάξει"
-    },
-    "TableOperations": {
-        "All four sides": "Και οι 4 πλευρές",
-        "Borders": "Περιγράμματα",
-        "Cancel": "Ακύρωση",
-        "Caption": "Λεζάντα",
-        "Cell Properties": "Ιδιότητες Κελιού",
-        "Cell properties": "Ιδιότητες κελιού",
-        "Delete cell": "Διαγραφή κελιού",
-        "Delete column": "Διαγραφή στήλης",
-        "Delete row": "Διαγραφή γραμμής",
-        "Description": "Περιγραφή",
-        "Frames": "Frames",
-        "Insert cell after": "Εισαγωγή κελιού μετά",
-        "Insert cell before": "Εισαγωγή κελιού πριν",
-        "Insert column after": "Εισαγωγή στήλης μετά",
-        "Insert column before": "Εισαγωγή στήλης πριν",
-        "Insert row after": "Εισαγωγή γραμμής πριν",
-        "Insert row before": "Εισαγωγή γραμμής μετά",
-        "Merge cells": "Συγχώνευση κελιών",
-        "No rules": "Χωρίς Γραμμές",
-        "No sides": "No sides",
-        "OK": "Εντάξει",
-        "Padding": "Εσοχή",
-        "Please click into some cell": "Κάντε κλικ μέσα σε κάποιο κελί",
-        "Row Properties": "Ιδιότητες Γραμμής",
-        "Row properties": "Ιδιότητες γραμμής",
-        "Rules will appear between all rows and columns": "Γραμμές θα εμφανίζονται μεταξύ όλων των γραμμών και στηλών",
-        "Rules will appear between columns only": "Γραμμές θα εμφανίζονται μόνο μεταξύ στηλών",
-        "Rules will appear between rows only": "Γραμμές θα εμφανίζονται μόνο μεταξύ γραμμών",
-        "Spacing": "Αποστάσεις",
-        "Spacing and padding": "Αποστάσεις και εσοχές",
-        "Split column": "Διαίρεση στήλης",
-        "Split row": "Διαίρεση γραμμής",
-        "Summary": "Σύνοψη",
-        "Table Properties": "Ιδιότητες πίνακα",
-        "Table properties": "Ιδιότητες πίνακα",
-        "The bottom side only": "Η κάτω πλευρά μόνο",
-        "The left-hand side only": "Η αριστερή πλευρά μόνο",
-        "The right and left sides only": "Οι δεξιές και αριστερές πλευρές μόνο",
-        "The right-hand side only": "Η δεξιά πλευρά μόνο",
-        "The top and bottom sides only": "Οι πάνω και κάτω πλευρές μόνο",
-        "The top side only": "Η πάνω πλευρά μόνο",
-        "Xinha cowardly refuses to delete the last cell in row.": "Δεν μπορεί να διαγραφεί το τελευταίο κελί σε μια γραμμή.",
-        "Xinha cowardly refuses to delete the last column in table.": "Δεν μπορεί να διαγραφεί η τελευταία στήλη σε ένα πίνακα.",
-        "Xinha cowardly refuses to delete the last row in table.": "Δεν μπορεί να διαγραφεί η τελευταία γραμμή σε ένα πίνακα.",
-        "pixels": "pixels"
-    },
-    "Template": {
-        "Cancel": "Ακύρωση"
-    },
-    "UnFormat": {
-        "Cancel": "Ακύρωση",
-        "OK": "Εντάξει"
-    },
-    "Xinha": {
-        "About this editor": "Πληροφορίες",
-        "Background Color": "Χρώμα Φόντου",
-        "Bold": "Έντονα",
-        "Bulleted List": "Κουκκίδες",
-        "Copy selection": "Αντιγραφή",
-        "Current style": "Παρών στυλ",
-        "Cut selection": "Αποκοπή",
-        "Decrease Indent": "Μείωση Εσοχής",
-        "Direction left to right": "Κατεύθυνση αριστερά προς δεξιά",
-        "Direction right to left": "Κατεύθυνση από δεξιά προς τα αριστερά",
-        "Font Color": "Χρώμα Γραμματοσειράς",
-        "Help using editor": "Βοήθεια",
-        "Horizontal Rule": "Οριζόντια Γραμμή",
-        "Increase Indent": "Αύξηση Εσοχής",
-        "Insert Table": "Εισαγωγή Πίνακα",
-        "Insert Web Link": "Εισαγωγή Συνδέσμου",
-        "Insert/Modify Image": "Εισαγωγή/Τροποποίηση Εικόνας",
-        "Italic": "Πλάγια",
-        "Justify Center": "Στοίχιση Κέντρο",
-        "Justify Full": "Πλήρης Στοίχιση",
-        "Justify Left": "Στοίχιση Αριστερά",
-        "Justify Right": "Στοίχιση Δεξιά",
-        "Ordered List": "Αρίθμηση",
-        "Paste from clipboard": "Επικόλληση",
-        "Path": "Διαδρομή",
-        "Redoes your last action": "Επαναφορά από αναίρεση",
-        "Strikethrough": "Διαγραμμένα",
-        "Subscript": "Δείκτης",
-        "Superscript": "Δείκτης",
-        "Toggle HTML Source": "Εναλλαγή σε/από HTML",
-        "Underline": "Υπογραμμισμένα",
-        "Undoes your last action": "Αναίρεση τελευταίας ενέργειας",
-        "You are in TEXT MODE.  Use the [<>] button to switch back to WYSIWYG.": "Είστε σε TEXT MODE.  Χρησιμοποιήστε το κουμπί [<>] για να επανέρθετε στο WYSIWIG."
-    },
-    "__NEW_TRANSLATIONS__": {
-        "Abbreviation": {
-            "Abbreviation": "",
-            "Delete": "",
-            "Expansion:": ""
-        },
-        "AboutBox": {
-            "Close": "<<Xinha>>"
-        },
-        "CharCounter": {
-            "... in progress": "",
-            "Chars": "",
-            "HTML": "",
-            "Words": ""
-        },
-        "CharacterMap": {
-            "Insert special character": ""
-        },
-        "ColorPicker": {
-            "Click a color...": "",
-            "Sample": "",
-            "Web Safe: ": "",
-            "Close": "<<Xinha>>"
-        },
-        "ContextMenu": {
-            "Delete Cell": "",
-            "Insert a paragraph after the current node": "",
-            "Insert a paragraph before the current node": "",
-            "Insert Cell After": "",
-            "Insert Cell Before": "",
-            "Insert paragraph after": "",
-            "Insert paragraph before": "",
-            "Merge Cells": "",
-            "Please confirm that you want to remove this element:": "",
-            "Remove the $elem Element...": "",
-            "Remove this node from the document": ""
-        },
-        "CreateLink": {
-            "Are you sure you wish to remove this link?": "",
-            "You need to select some text before creating a link": ""
-        },
-        "DefinitionList": {
-            "definition description": "",
-            "definition list": "",
-            "definition term": ""
-        },
-        "Dialogs": {
-            "Some Text Here": ""
-        },
-        "DynamicCSS": {
-            "Choose stylesheet": "",
-            "Default": "",
-            "Undefined": ""
-        },
-        "EditTag": {
-            "Edit HTML for selected text": "",
-            "Edit Tag By Peg": "",
-            "Tag Editor": ""
-        },
-        "Equation": {
-            "!=": "",
-            "!in": "",
-            "&gt;-": "",
-            "&gt;=": "",
-            "&lt;=": "",
-            "&lt;=&gt;": "",
-            "&lt;x&gt;": "",
-            "&nbsp; `!` &nbsp;": "",
-            "&nbsp; `.` &nbsp;": "",
-            "&nbsp; `0` &nbsp;": "",
-            "&nbsp; `2` &nbsp;": "",
-            "&nbsp; `3` &nbsp;": "",
-            "&nbsp; `4` &nbsp;": "",
-            "&nbsp; `5` &nbsp;": "",
-            "&nbsp; `6` &nbsp;": "",
-            "&nbsp; `7` &nbsp;": "",
-            "&nbsp; `8` &nbsp;": "",
-            "&nbsp; `9` &nbsp;": "",
-            "&nbsp; `e` &nbsp;": "",
-            "&nbsp;&nbsp;`1` &nbsp;": "",
-            "&nbsp;`+{::}`&nbsp;": "",
-            "&nbsp;`-:\\ `": "",
-            "&nbsp;`-{::}`&nbsp;": "",
-            "&nbsp;`C`&nbsp;": "",
-            "&nbsp;`cos`": "",
-            "&nbsp;`ln`&nbsp;": "",
-            "&nbsp;`pi` &nbsp;": "",
-            "&nbsp;`sin`": "",
-            "&nbsp;`tan`": "",
-            "&nbsp;`times`&nbsp;": "",
-            "&quot;text&quot;": "",
-            "'+formula+'": "",
-            "((n),(k))": "",
-            "(x+1)/(x-1)": "",
-            "*": "",
-            "**": "",
-            "+-": "",
-            "-&gt;": "",
-            "-&lt;": "",
-            "-:": "",
-            "-=": "",
-            "//": "",
-            "/_": "",
-            ":.": "",
-            "=&gt;": "",
-            "@": "",
-            "[[a,b],[c,d]]": "",
-            "\\\\": "",
-            "\\nClick in the box to use your keyboard or use the buttons\\n": "",
-            "^^": "",
-            "^^^": "",
-            "__|": "",
-            "_|_": "",
-            "`!=`": "",
-            "`!in`": "",
-            "`&and;`": "",
-            "`&cap;`": "",
-            "`&cup;`": "",
-            "`&gt;-`": "",
-            "`&gt;=`": "",
-            "`&lt;=&gt;`": "",
-            "`&lt;=`": "",
-            "`&lt;x&gt;`": "",
-            "`&or;`": "",
-            "`&quot;text&quot;`": "",
-            "`((n),(k))`": "",
-            "`(x+1)/(x-1)`": "",
-            "`**`": "",
-            "`*`": "",
-            "`+-`": "",
-            "`-&gt;`": "",
-            "`-&lt;`": "",
-            "`-:`": "",
-            "`-=`": "",
-            "`//`": "",
-            "`/_`": "",
-            "`:.`": "",
-            "`=&gt;`": "",
-            "`@`": "",
-            "`[[a,b],[c,d]]`": "",
-            "`\\\\`": "",
-            "`__|`": "",
-            "`_|_`": "",
-            "`AA`": "",
-            "`aleph`": "",
-            "`alpha`": "",
-            "`and`": "",
-            "`bara`": "",
-            "`bba`": "",
-            "`bbba`": "",
-            "`beta`": "",
-            "`CC`": "",
-            "`cca`": "",
-            "`chi`": "",
-            "`darr`": "",
-            "`ddota`": "",
-            "`del`": "",
-            "`Delta`": "",
-            "`delta`": "",
-            "`diamond`": "",
-            "`dota`": "",
-            "`dy/dx`": "",
-            "`EE`": "",
-            "`epsi`": "",
-            "`eta`": "",
-            "`fra`": "",
-            "`Gamma`": "",
-            "`gamma`": "",
-            "`grad`": "",
-            "`harr`": "",
-            "`hArr`": "",
-            "`hata`": "",
-            "`if`": "",
-            "`in`": "",
-            "`int`": "",
-            "`iota`": "",
-            "`kappa`": "",
-            "`Lambda`": "",
-            "`lambda`": "",
-            "`lArr`": "",
-            "`larr`": "",
-            "`lim_(x-&gt;oo)`": "",
-            "`log`": "",
-            "`mu`": "",
-            "`NN`": "",
-            "`nn`": "",
-            "`not`": "",
-            "`nu`": "",
-            "`o+`": "",
-            "`o.`": "",
-            "`O/`": "",
-            "`oint`": "",
-            "`omega`": "",
-            "`Omega`": "",
-            "`oo`": "",
-            "`or`": "",
-            "`ox`": "",
-            "`phi`": "",
-            "`Phi`": "",
-            "`Pi`": "",
-            "`pi`": "",
-            "`prod`": "",
-            "`prop`": "",
-            "`Psi`": "",
-            "`psi`": "",
-            "`QQ`": "",
-            "`quad`": "",
-            "`rArr`": "",
-            "`rho`": "",
-            "`root(n)(x)`": "",
-            "`RR`": "",
-            "`sfa`": "",
-            "`Sigma`": "",
-            "`sigma`": "",
-            "`sqrt(x)`": "",
-            "`square`": "",
-            "`stackrel(-&gt;)(+)`": "",
-            "`sub`": "",
-            "`sube`": "",
-            "`sum`": "",
-            "`sup`": "",
-            "`supe`": "",
-            "`tau`": "",
-            "`Theta`": "",
-            "`theta`": "",
-            "`TT`": "",
-            "`tta`": "",
-            "`uarr`": "",
-            "`ula`": "",
-            "`upsilon`": "",
-            "`uu`": "",
-            "`veca`": "",
-            "`vv`": "",
-            "`x_(mn)`": "",
-            "`Xi`": "",
-            "`xi`": "",
-            "`xx`": "",
-            "`zeta`": "",
-            "`ZZ`": "",
-            "`|-&gt;`": "",
-            "`|--`": "",
-            "`|==`": "",
-            "`|__`": "",
-            "`|~`": "",
-            "`~=`": "",
-            "`~|`": "",
-            "`~~`": "",
-            "AA": "",
-            "aleph": "",
-            "alpha": "",
-            "and": "",
-            "AsciiMath Formula Input": "",
-            "AsciiMathML Example": "",
-            "bara": "",
-            "Based on ASCIIMathML by": "",
-            "bba": "",
-            "bbba": "",
-            "beta": "",
-            "CC": "",
-            "cca": "",
-            "chi": "",
-            "darr": "",
-            "ddota": "",
-            "del": "",
-            "delta": "",
-            "Delta": "",
-            "diamond": "",
-            "dota": "",
-            "dy/dx": "",
-            "EE": "",
-            "epsi": "",
-            "eta": "",
-            "For more information on AsciiMathML visit this page:": "",
-            "Formula Editor": "",
-            "fra": "",
-            "gamma": "",
-            "Gamma": "",
-            "grad": "",
-            "hArr": "",
-            "harr": "",
-            "hata": "",
-            "if": "",
-            "in": "",
-            "Input": "",
-            "int": "",
-            "int_a^bf(x)dx": "",
-            "iota": "",
-            "kappa": "",
-            "Lambda": "",
-            "lambda": "",
-            "larr": "",
-            "lArr": "",
-            "lim_(x-&gt;oo)": "",
-            "mu": "",
-            "NN": "",
-            "nn": "",
-            "nnn": "",
-            "not": "",
-            "nu": "",
-            "o+": "",
-            "o.": "",
-            "O/": "",
-            "oint": "",
-            "Omega": "",
-            "omega": "",
-            "oo": "",
-            "or": "",
-            "ox": "",
-            "phi": "",
-            "Phi": "",
-            "pi": "",
-            "Pi": "",
-            "Preview": "",
-            "prod": "",
-            "prop": "",
-            "psi": "",
-            "Psi": "",
-            "QQ": "",
-            "quad": "",
-            "rArr": "",
-            "rho": "",
-            "root(n)(x)": "",
-            "RR": "",
-            "sfa": "",
-            "sigma": "",
-            "Sigma": "",
-            "sqrt(x)": "",
-            "square": "",
-            "stackrel(-&gt;)(+)": "",
-            "sub": "",
-            "sube": "",
-            "sum": "",
-            "sum_(n=1)^oo": "",
-            "sup": "",
-            "supe": "",
-            "tau": "",
-            "Theta": "",
-            "theta": "",
-            "TT": "",
-            "tta": "",
-            "uarr": "",
-            "ula": "",
-            "upsilon": "",
-            "uu": "",
-            "uuu": "",
-            "veca": "",
-            "vv": "",
-            "vvv": "",
-            "x^(m+n)": "",
-            "x_(mn)": "",
-            "Xi": "",
-            "xi": "",
-            "xx": "",
-            "zeta": "",
-            "ZZ": "",
-            "|-&gt;": "",
-            "|--": "",
-            "|==": "",
-            "|__": "",
-            "|~": "",
-            "~=": "",
-            "~|": "",
-            "~~": ""
-        },
-        "FancySelects": {
-            "'+opt.text+'": ""
-        },
-        "FindReplace": {
-            "';\r\n  var tagc = '": "",
-            "Case sensitive search": "",
-            "Clear": "",
-            "Done": "",
-            "Enter the text you want to find": "",
-            "Find and Replace": "",
-            "found item": "",
-            "found items": "",
-            "Highlight": "",
-            "Inform a replacement word": "",
-            "Next": "",
-            "not found": "",
-            "Options": "",
-            "Replace with:": "",
-            "replaced item": "",
-            "replaced items": "",
-            "Search for:": "",
-            "Substitute all occurrences": "",
-            "Substitute this occurrence?": "",
-            "Undo": "",
-            "Whole words only": ""
-        },
-        "FormOperations": {
-            "Enter the name for new option.": "",
-            "Form Editor": "",
-            "Insert a check box.": "",
-            "Insert a Form.": "",
-            "Insert a multi-line text field.": "",
-            "Insert a radio button.": "",
-            "Insert a select field.": "",
-            "Insert a submit/reset button.": "",
-            "Insert a text, password or hidden field.": "",
-            "Message Sent": "",
-            "Please Select...": ""
-        },
-        "Forms": {
-            "'onClick'=": "",
-            "Access Key:": "",
-            "Action URL:": "",
-            "Button Script": "",
-            "Checked": "",
-            "Columns:": "",
-            "Default text (optional)": "",
-            "Dimensions": "",
-            "Disabled": "",
-            "Encoding:": "",
-            "For Control:": "",
-            "Form": "",
-            "Form Element: FIELDSET": "",
-            "Form Element: INPUT": "",
-            "Form Element: LABEL": "",
-            "Form Element: SELECT": "",
-            "Form Element: TEXTAREA": "",
-            "Form handler script": "",
-            "Form Name:": "",
-            "Get": "",
-            "Hard": "",
-            "Height in number of rows": "",
-            "HTML-Form to CGI (default)": "",
-            "Image source": "",
-            "Initial Text:": "",
-            "Insert/Edit Form": "",
-            "Insert/Edit Form Element FIELDSET": "",
-            "Insert/Edit Form Element INPUT": "",
-            "Insert/Edit Form Element LABEL": "",
-            "Insert/Edit Form Element SELECT": "",
-            "Insert/Edit Form Element TEXTAREA": "",
-            "Javascript for button click": "",
-            "Label:": "",
-            "Legend:": "",
-            "Max length:": "",
-            "Maximum number of characters accepted": "",
-            "Method:": "",
-            "multipart Form Data (File-Upload)": "",
-            "Name": "",
-            "Name of the form input": "",
-            "Name of the form select": "",
-            "name of the textarea": "",
-            "Name/ID:": "",
-            "normal": "",
-            "nowrap": "",
-            "Off": "",
-            "Physical": "",
-            "Please enter a Label": "",
-            "Post": "",
-            "pre": "",
-            "Read Only": "",
-            "Rows:": "",
-            "Size of text box in characters": "",
-            "Size:": "",
-            "Soft": "",
-            "Tab Index:": "",
-            "Target Frame:": "",
-            "Text:": "",
-            "URL of image": "",
-            "Value of the form input": "",
-            "Value:": "",
-            "Virtual": "",
-            "Width in number of characters": "",
-            "Wrap Mode:": "",
-            "You must enter a Name": "",
-            "Options": "<<FindReplace>>"
-        },
-        "FullPage": {
-            "...": "",
-            "Alternate style-sheet:": "",
-            "Background color:": "",
-            "Character set:": "",
-            "cyrillic (ISO-8859-5)": "",
-            "cyrillic (KOI8-R)": "",
-            "cyrillic (WINDOWS-1251)": "",
-            "DOCTYPE:": "",
-            "Document properties": "",
-            "Document title:": "",
-            "Keywords:": "",
-            "Primary style-sheet:": "",
-            "Text color:": "",
-            "UTF-8 (recommended)": "",
-            "western (ISO-8859-1)": ""
-        },
-        "FullScreen": {
-            "Maximize/Minimize Editor": ""
-        },
-        "Gecko": {
-            "The Paste button does not work in this browser for security reasons. Press CTRL-V on your keyboard to paste directly.": ""
-        },
-        "HorizontalRule": {
-            "&#x00d7;": "",
-            "&nbsp;": "",
-            "Alignment:": "",
-            "Insert/edit horizontal rule": "",
-            "Insert/Edit Horizontal Rule": "",
-            "No shading": "",
-            "Style": ""
-        },
-        "InlineStyler": {
-            "CSS Style": "",
-            "-": "<<Equation>>"
-        },
-        "InsertAnchor": {
-            "Anchor name": "",
-            "Insert Anchor": "",
-            "Delete": "<<Abbreviation>>"
-        },
-        "InsertImage": {
-            "Absbottom": "",
-            "Absmiddle": "",
-            "Alternate text:": "",
-            "Border thickness:": "",
-            "Enter the image URL here": "",
-            "For browsers that don't support images": "",
-            "Horizontal padding": "",
-            "Horizontal:": "",
-            "Image Preview:": "",
-            "Insert Image": "",
-            "Leave empty for no border": "",
-            "Not set": "",
-            "Positioning of this image": "",
-            "Preview the image in a new window": "",
-            "Texttop": "",
-            "Vertical padding": "",
-            "Vertical:": "",
-            "You must enter the URL": "",
-            "Alignment:": "<<HorizontalRule>>",
-            "Preview": "<<Equation>>"
-        },
-        "InsertNote": {
-            "Insert": "",
-            "Insert footnote": "",
-            "Insert Note": ""
-        },
-        "InsertPagebreak": {
-            "Page break": "",
-            "Page Break": ""
-        },
-        "InsertSmiley": {
-            "Insert Smiley": ""
-        },
-        "InsertSnippet": {
-            "\\n  This is an information about something\\n": "",
-            "Hide preview": "",
-            "Insert as": "",
-            "Insert Snippet": "",
-            "InsertSnippet for Xinha": "",
-            "Link1": "",
-            "Link2": "",
-            "Link3": "",
-            "Link4": "",
-            "Link5": "",
-            "Show preview": "",
-            "This is an information about something": "",
-            "Variable": ""
-        },
-        "InsertSnippet2": {
-            "All Categories": "",
-            "Filter": "",
-            "Insert as HTML": "",
-            "Insert as template variable": "",
-            "Only search word beginning": "",
-            "HTML": "<<CharCounter>>",
-            "Insert Snippet": "<<InsertSnippet>>",
-            "InsertSnippet for Xinha": "<<InsertSnippet>>",
-            "Variable": "<<InsertSnippet>>"
-        },
-        "InsertTable": {
-            "Caption for the table": "",
-            "Cell padding:": "",
-            "Cell spacing:": "",
-            "Collapse borders:": "",
-            "Cols:": "",
-            "Em": "",
-            "Fixed width columns": "",
-            "Layou": "",
-            "Number of columns": "",
-            "Number of rows": "",
-            "Positioning of this table": "",
-            "Space between adjacent cells": "",
-            "Space between content and border in cell": "",
-            "Style of the border": "",
-            "Width of the table": "",
-            "Width unit": "",
-            "You must enter a number of columns": "",
-            "You must enter a number of rows": "",
-            "Absbottom": "<<InsertImage>>",
-            "Absmiddle": "<<InsertImage>>",
-            "Alignment:": "<<HorizontalRule>>",
-            "Border thickness:": "<<InsertImage>>",
-            "Leave empty for no border": "<<InsertImage>>",
-            "Not set": "<<InsertImage>>",
-            "Rows:": "<<Forms>>",
-            "Texttop": "<<InsertImage>>"
-        },
-        "LangMarks": {
-            "&mdash; language &mdash;": "",
-            "', '": "",
-            "English": "",
-            "French": "",
-            "Greek": "",
-            "language select": "",
-            "Latin": ""
-        },
-        "Linker": {
-            "(px)": "",
-            "Anchor-Link": "",
-            "Anchor:": "",
-            "Email Address:": "",
-            "Email Link": "",
-            "Location Bar:": "",
-            "Menu Bar:": "",
-            "Message Template:": "",
-            "New Window": "",
-            "Ordinary Link": "",
-            "Popup Window": "",
-            "PopupWindow": "",
-            "Remove Link": "",
-            "Resizeable:": "",
-            "Same Window (jump out of frames)": "",
-            "Scrollbars:": "",
-            "Shows On Hover": "",
-            "Status Bar:": "",
-            "Subject:": "",
-            "Title:": "",
-            "Toolbar:": "",
-            "URL Link": "",
-            "You must select some text before making a new link.": "",
-            "Are you sure you wish to remove this link?": "<<CreateLink>>",
-            "Name:": "<<Forms>>",
-            "Size:": "<<Forms>>"
-        },
-        "ListType": {
-            "Choose list style type (for ordered lists)": "",
-            "Decimal numbers": "",
-            "Lower greek letters": "",
-            "Lower latin letters": "",
-            "Lower roman numbers": "",
-            "Upper latin letters": "",
-            "Upper roman numbers": ""
-        },
-        "MootoolsFileManager": {
-            "Insert File Link": "",
-            "You must select some text before making a new link.": "<<Linker>>"
-        },
-        "Opera": {
-            "MARK": "",
-            "The Paste button does not work in Mozilla based web browsers (technical security reasons). Press CTRL-V on your keyboard to paste directly.": ""
-        },
-        "PasteText": {
-            "Insert text in new paragraph": "",
-            "Paste as Plain Text": ""
-        },
-        "PreserveScripts": {
-            "JavaScript": "",
-            "PHP": ""
-        },
-        "QuickTag": {
-            "',\r\n                           'cl': '": "",
-            "ATTRIBUTES": "",
-            "Colors": "",
-            "Enter the TAG you want to insert": "",
-            "No CSS class avaiable": "",
-            "Ok": "",
-            "OPTIONS": "",
-            "Quick Tag Editor": "",
-            "TAGs": "",
-            "There are some unclosed quote": "",
-            "This attribute already exists in the TAG": "",
-            "You have to select some text": ""
-        },
-        "SaveSubmit": {
-            "in progress": "",
-            "Ready": "",
-            "Save": "",
-            "Saving...": ""
-        },
-        "SetId": {
-            "ID/Name:": "",
-            "Set Id and Name": "",
-            "Set Id/Name": "",
-            "Set ID/Name": "",
-            "Delete": "<<Abbreviation>>"
-        },
-        "SmartReplace": {
-            "ClosingDoubleQuotes": "",
-            "ClosingSingleQuote": "",
-            "Convert all quotes and dashes in the current document": "",
-            "Enable automatic replacements": "",
-            "OpeningDoubleQuotes": "",
-            "OpeningSingleQuote": "",
-            "SmartReplace": "",
-            "SmartReplace Settings": ""
-        },
-        "Stylist": {
-            "Styles": ""
-        },
-        "SuperClean": {
-            "Clean bad HTML from Microsoft Word.": "",
-            "Clean Selection Only": "",
-            "Clean up HTML": "",
-            "Cleaning Scope": "",
-            "General tidy up and correction of some problems.": "",
-            "Please select from the following cleaning options...": "",
-            "Please stand by while cleaning in process...": "",
-            "Remove alignment (left/right/justify).": "",
-            "Remove all classes (CSS).": "",
-            "Remove All HTML Tags": "",
-            "Remove all styles (CSS).": "",
-            "Remove custom font sizes.": "",
-            "Remove custom text colors.": "",
-            "Remove custom typefaces (font \"styles\").": "",
-            "Remove emphasis and annotations.": "",
-            "Remove lang attributes.": "",
-            "Remove Paragraphs": "",
-            "Remove superscripts and subscripts.": "",
-            "Replace directional quote marks with non-directional quote marks.": "",
-            "Vigorously purge HTML from Microsoft Word.": ""
-        },
-        "TableOperations": {
-            "Cell Type:": "",
-            "Cells down": "",
-            "Cells to the right, and": "",
-            "Do Not Change": "",
-            "Frame and borders": "",
-            "Header (th)": "",
-            "Merge Cells": "",
-            "Merge current cell with:": "",
-            "Normal (td)": "",
-            "Columns": "<<Forms>>",
-            "Rows": "<<Forms>>"
-        },
-        "UnsavedChanges": {
-            "You have unsaved changes in the editor": ""
-        },
-        "WebKit": {
-            "The Paste button does not work in this browser for security reasons. Press CTRL-V on your keyboard to paste directly.": "<<Gecko>>"
-        },
-        "Xinha": {
-            "&#8212; font &#8212;": "",
-            "&#8212; format &#8212;": "",
-            "&#8212; size &#8212;": "",
-            "1 (8 pt)": "",
-            "2 (10 pt)": "",
-            "3 (12 pt)": "",
-            "4 (14 pt)": "",
-            "5 (18 pt)": "",
-            "6 (24 pt)": "",
-            "7 (36 pt)": "",
-            "Address": "",
-            "Arial": "",
-            "Clean content pasted from Word": "",
-            "Clear Inline Font Specifications": "",
-            "Clear MSOffice tags": "",
-            "Close": "",
-            "Constructing object": "",
-            "Courier New": "",
-            "Create Statusbar": "",
-            "Create Toolbar": "",
-            "CTRL-0 (zero)": "",
-            "CTRL-1 .. CTRL-6": "",
-            "CTRL-A": "",
-            "CTRL-B": "",
-            "CTRL-C": "",
-            "CTRL-E": "",
-            "CTRL-I": "",
-            "CTRL-J": "",
-            "CTRL-L": "",
-            "CTRL-N": "",
-            "CTRL-R": "",
-            "CTRL-S": "",
-            "CTRL-U": "",
-            "CTRL-V": "",
-            "CTRL-X": "",
-            "CTRL-Y": "",
-            "CTRL-Z": "",
-            "Editor Help": "",
-            "ENTER": "",
-            "Error Loading Xinha.  Developers, check the Error Console for information.": "",
-            "Finishing": "",
-            "Formatted": "",
-            "Generate Xinha framework": "",
-            "Georgia": "",
-            "Heading 1": "",
-            "Heading 2": "",
-            "Heading 3": "",
-            "Heading 4": "",
-            "Heading 5": "",
-            "Heading 6": "",
-            "Headings": "",
-            "Impact": "",
-            "Init editor size": "",
-            "insert linebreak": "",
-            "Insert/Overwrite": "",
-            "Keyboard shortcuts": "",
-            "Loading Core": "",
-            "Loading in progress. Please wait!": "",
-            "Loading plugin $plugin": "",
-            "Loading plugins": "",
-            "MS Word Cleaner": "",
-            "new paragraph": "",
-            "Normal": "",
-            "Print document": "",
-            "Register plugin $plugin": "",
-            "Remove formatting": "",
-            "Save as": "",
-            "Select all": "",
-            "Select Color": "",
-            "Set format to paragraph": "",
-            "SHIFT-ENTER": "",
-            "Split Block": "",
-            "Tahoma": "",
-            "The editor provides the following key combinations:": "",
-            "Times New Roman": "",
-            "Toggle Borders": "",
-            "Touch here first to activate editor.": "",
-            "Verdana": "",
-            "Waiting for Iframe to load...": "",
-            "WingDings": "",
-            "Would you like to clear font colours?": "",
-            "Would you like to clear font sizes?": "",
-            "Would you like to clear font typefaces?": "",
-            "Xinha": ""
-        },
-        "BackgroundImage": {
-            "__ TRANSLATOR NOTE __": "*** BACKGROUNDIMAGE IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***",
-            "Remove Current Background": "",
-            "Set Background": "",
-            "Set page background image": "",
-            "Set Page Background Image": ""
-        },
-        "ClientsideSpellcheck": {
-            "__ TRANSLATOR NOTE __": "*** CLIENTSIDESPELLCHECK IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***",
-            "Spell Check using ieSpell": ""
-        },
-        "ExtendedFileManager": {
-            "__ TRANSLATOR NOTE __": "*** EXTENDEDFILEMANAGER IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***",
-            "10%": "",
-            "100%": "",
-            "200%": "",
-            "25%": "",
-            "50%": "",
-            "75%": "",
-            ">List View": "",
-            ">Thumbnail View": "",
-            "A:": "",
-            "Alt": "",
-            "Border Color": "",
-            "Constrain Proportions": "",
-            "Crop": "",
-            "D:": "",
-            "Directory": "",
-            "Directory Up": "",
-            "Edit": "",
-            "File List": "",
-            "File Manager": "",
-            "Filename:": "",
-            "Filesize:": "",
-            "Flip Horizontal": "",
-            "Flip Image": "",
-            "Flip Vertical": "",
-            "Folder": "",
-            "GIF": "",
-            "GIF format is not supported, image editing not supported.": "",
-            "H:": "",
-            "Image Editor": "",
-            "Image Selection": "",
-            "Invalid base directory:": "",
-            "JPEG High": "",
-            "JPEG Low": "",
-            "JPEG Medium": "",
-            "Loading": "",
-            "Lock": "",
-            "Marker": "",
-            "Maximum folder size limit reached. Upload disabled.": "",
-            "Measure": "",
-            "New Folder": "",
-            "No Files Found": "",
-            "No Image Available": "",
-            "Please enter value": "",
-            "PNG": "",
-            "Preset": "",
-            "Quality:": "",
-            "Refresh": "",
-            "Rename": "",
-            "Resize": "",
-            "Rotate": "",
-            "Rotate 180 &deg;": "",
-            "Rotate 90 &deg; CCW": "",
-            "Rotate 90 &deg; CW": "",
-            "Rotate Image": "",
-            "Start X:": "",
-            "Start Y:": "",
-            "Target Window": "",
-            "Toggle marker color": "",
-            "Trash": "",
-            "Upload": "",
-            "W:": "",
-            "X:": "",
-            "Xinha Image Editor": "",
-            "Y:": "",
-            "Zoom": "",
-            "Absbottom": "<<InsertImage>>",
-            "Absmiddle": "<<InsertImage>>",
-            "Clear": "<<FindReplace>>",
-            "Insert File Link": "<<MootoolsFileManager>>",
-            "Not set": "<<InsertImage>>",
-            "Positioning of this image": "<<InsertImage>>",
-            "Preview": "<<Equation>>",
-            "Save": "<<SaveSubmit>>",
-            "Texttop": "<<InsertImage>>",
-            "You must select some text before making a new link.": "<<Linker>>"
-        },
-        "Filter": {
-            "__ TRANSLATOR NOTE __": "*** FILTER IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***",
-            "Filter": "<<InsertSnippet2>>"
-        },
-        "HtmlTidy": {
-            "__ TRANSLATOR NOTE __": "*** HTMLTIDY IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***",
-            "Auto-Tidy": "",
-            "Don't Tidy": "",
-            "HTML Tidy": "",
-            "Tidy failed.  Check your HTML for syntax errors.": ""
-        },
-        "ImageManager": {
-            "__ TRANSLATOR NOTE __": "*** IMAGEMANAGER IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***",
-            "Angle:": "",
-            "Flickr Picture List": "",
-            "Flickr Pictures": "",
-            "Flickr Selection": "",
-            "Flickr Username/Email": "",
-            "Folder Name:": "",
-            "Image Format": "",
-            "Image List": "",
-            "Keyword": "",
-            "No Images Found": "",
-            "No Photos Found": "",
-            "No Videos Found": "",
-            "This Server": "",
-            "YouTube Selection": "",
-            "YouTube Username": "",
-            "YouTube Video List": "",
-            "YouTube Videos": "",
-            "A:": "<<ExtendedFileManager>>",
-            "Absbottom": "<<InsertImage>>",
-            "Absmiddle": "<<InsertImage>>",
-            "Clear": "<<FindReplace>>",
-            "Constrain Proportions": "<<ExtendedFileManager>>",
-            "Crop": "<<ExtendedFileManager>>",
-            "D:": "<<ExtendedFileManager>>",
-            "Directory": "<<ExtendedFileManager>>",
-            "Directory Up": "<<ExtendedFileManager>>",
-            "Edit": "<<ExtendedFileManager>>",
-            "Filename:": "<<ExtendedFileManager>>",
-            "Flip Horizontal": "<<ExtendedFileManager>>",
-            "Flip Image": "<<ExtendedFileManager>>",
-            "Flip Vertical": "<<ExtendedFileManager>>",
-            "GIF": "<<ExtendedFileManager>>",
-            "GIF format is not supported, image editing not supported.": "<<ExtendedFileManager>>",
-            "H:": "<<ExtendedFileManager>>",
-            "Image Editor": "<<ExtendedFileManager>>",
-            "Image Selection": "<<ExtendedFileManager>>",
-            "Insert Image": "<<InsertImage>>",
-            "Invalid base directory:": "<<ExtendedFileManager>>",
-            "JPEG High": "<<ExtendedFileManager>>",
-            "JPEG Low": "<<ExtendedFileManager>>",
-            "JPEG Medium": "<<ExtendedFileManager>>",
-            "Lock": "<<ExtendedFileManager>>",
-            "Marker": "<<ExtendedFileManager>>",
-            "Measure": "<<ExtendedFileManager>>",
-            "New Folder": "<<ExtendedFileManager>>",
-            "No Image Available": "<<ExtendedFileManager>>",
-            "Not set": "<<InsertImage>>",
-            "PNG": "<<ExtendedFileManager>>",
-            "Positioning of this image": "<<InsertImage>>",
-            "Quality:": "<<ExtendedFileManager>>",
-            "Refresh": "<<ExtendedFileManager>>",
-            "Resize": "<<ExtendedFileManager>>",
-            "Rotate": "<<ExtendedFileManager>>",
-            "Rotate 180 &deg;": "<<ExtendedFileManager>>",
-            "Rotate 90 &deg; CCW": "<<ExtendedFileManager>>",
-            "Rotate 90 &deg; CW": "<<ExtendedFileManager>>",
-            "Rotate Image": "<<ExtendedFileManager>>",
-            "Save": "<<SaveSubmit>>",
-            "Start X:": "<<ExtendedFileManager>>",
-            "Start Y:": "<<ExtendedFileManager>>",
-            "Texttop": "<<InsertImage>>",
-            "Trash": "<<ExtendedFileManager>>",
-            "W:": "<<ExtendedFileManager>>",
-            "X:": "<<ExtendedFileManager>>",
-            "Y:": "<<ExtendedFileManager>>"
-        },
-        "InsertMarquee": {
-            "__ TRANSLATOR NOTE __": "*** INSERTMARQUEE IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***",
-            "Alternate": "",
-            "Background-Color:": "",
-            "Behavior:": "",
-            "Continuous": "",
-            "Direction:": "",
-            "Insert scrolling marquee": "",
-            "Marquee Editor": "",
-            "Scroll Amount:": "",
-            "Scroll Delay:": "",
-            "Slide": "",
-            "Speed Control": "",
-            "Name": "<<Forms>>",
-            "Name/ID:": "<<Forms>>",
-            "Text:": "<<Forms>>"
-        },
-        "InsertPicture": {
-            "__ TRANSLATOR NOTE __": "*** INSERTPICTURE IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***",
-            "Leave empty for not defined": "",
-            " Open file in new window": "",
-            "Open file in new window": "",
-            "Upload file": "",
-            "Absbottom": "<<InsertImage>>",
-            "Absmiddle": "<<InsertImage>>",
-            "Alignment:": "<<HorizontalRule>>",
-            "Alternate text:": "<<InsertImage>>",
-            "Border thickness:": "<<InsertImage>>",
-            "Enter the image URL here": "<<InsertImage>>",
-            "For browsers that don't support images": "<<InsertImage>>",
-            "Horizontal padding": "<<InsertImage>>",
-            "Horizontal:": "<<InsertImage>>",
-            "Image Preview:": "<<InsertImage>>",
-            "Insert Image": "<<InsertImage>>",
-            "Leave empty for no border": "<<InsertImage>>",
-            "Not set": "<<InsertImage>>",
-            "Positioning of this image": "<<InsertImage>>",
-            "Preview": "<<Equation>>",
-            "Preview the image in a new window": "<<InsertImage>>",
-            "Size": "<<Forms>>",
-            "Texttop": "<<InsertImage>>",
-            "Vertical padding": "<<InsertImage>>",
-            "Vertical:": "<<InsertImage>>"
-        },
-        "NoteServer": {
-            "__ TRANSLATOR NOTE __": "*** NOTESERVER IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***",
-            "120%": "",
-            "150%": "",
-            "80%": "",
-            "Add GUIDO Code in a textbox on the page": "",
-            "Add MIDI link to allow students to hear the music": "",
-            "Format": "",
-            "GUIDO Code": "",
-            "Guido code": "",
-            "Image in applet": "",
-            "Insert GUIDO Music Notation": "",
-            "MIDI File": "",
-            "Source Code": "",
-            "With Mozilla, the applet will not be visible in editor, but only in Web page after submitting.": "",
-            "Zoom :": "",
-            "100%": "<<ExtendedFileManager>>",
-            "Image Preview": "<<InsertImage>>",
-            "Options": "<<FindReplace>>",
-            "Preview": "<<Equation>>",
-            "Preview the image in a new window": "<<InsertImage>>",
-            "Zoom": "<<ExtendedFileManager>>"
-        },
-        "PSLocal": {
-            "__ TRANSLATOR NOTE __": "*** PSLOCAL IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***",
-            "Confirm": "",
-            "Enable": "",
-            "Enable Gears in order to use local document storage and configuration.": "",
-            "Enabling Local Storage": "",
-            "Install": "",
-            "Learn About Local Storage": "",
-            "This will reload the page, causing you to lose any unsaved work.  Press \"OK\" to reload.": "",
-            "Xinha uses Google Gears to enable local document storage.  With Gears installed, you can save drafts of your documents on your hard drive, configure Xinha to look the way you want, and carry this information wherever you use Xinha on the web.": ""
-        },
-        "PSServer": {
-            "__ TRANSLATOR NOTE __": "*** PSSERVER IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***",
-            "File: ": "",
-            "Import": ""
-        },
-        "PersistentStorage": {
-            "__ TRANSLATOR NOTE __": "*** PERSISTENTSTORAGE IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***",
-            "Details": "",
-            "File Browser": "",
-            "Hello    There C ": "",
-            "Hello  There A ": "",
-            "Hello \" There B \"": "",
-            "Hello ' There D '": "",
-            "List of Places": "",
-            "New Document": "",
-            "Open": "",
-            "Open Document": "",
-            "Places": "",
-            "Please enter the name of the directory you'd like to create.": "",
-            "Save Document": "",
-            "This will erase any unsaved content.  If you're certain, please click OK to continue.": "",
-            "Web URL": "",
-            "Confirm": "<<PSLocal>>",
-            "Delete": "<<Abbreviation>>",
-            "Directory Up": "<<ExtendedFileManager>>",
-            "File List": "<<ExtendedFileManager>>",
-            "File Manager": "<<ExtendedFileManager>>",
-            "Filename": "<<ExtendedFileManager>>",
-            "Insert": "<<InsertNote>>",
-            "Insert Image": "<<InsertImage>>",
-            "New Folder": "<<ExtendedFileManager>>",
-            "Save": "<<SaveSubmit>>",
-            "You must select some text before making a new link.": "<<Linker>>"
-        },
-        "SpellChecker": {
-            "__ TRANSLATOR NOTE __": "*** SPELLCHECKER IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***",
-            "Dictionary": "",
-            "Finished list of mispelled words": "",
-            "HTMLArea Spell Checker": "",
-            "I will open it in a new page.": "",
-            "Ignore": "",
-            "Ignore all": "",
-            "Info": "",
-            "Learn": "",
-            "No mispelled words found with the selected dictionary.": "",
-            "Original word": "",
-            "Please confirm that you want to open this link": "",
-            "Please wait.  Calling spell checker.": "",
-            "Please wait: changing dictionary to": "",
-            "pliz weit ;-)": "",
-            "Re-check": "",
-            "Replace": "",
-            "Replace all": "",
-            "Revert": "",
-            "Spell Checker": "",
-            "Spell-check": "",
-            "Suggestions": "",
-            "This will drop changes and quit spell checker.  Please confirm.": "",
-            "Replace with": "<<FindReplace>>"
-        },
-        "Template": {
-            "__ TRANSLATOR NOTE __": "*** TEMPLATE IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***",
-            "Insert template": ""
-        },
-        "UnFormat": {
-            "__ TRANSLATOR NOTE __": "*** UNFORMAT IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***",
-            "All": "",
-            "All HTML:": "",
-            "Cleaning Area": "",
-            "Cleaning options": "",
-            "Formatting:": "",
-            "Page Cleaner": "",
-            "Select which types of formatting you would like to remove.": "",
-            "Selection": ""
-        }
-    }
-}
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/lang/merged/es.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/lang/merged/es.js
deleted file mode 100644
index f9e6559..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/lang/merged/es.js
+++ /dev/null
@@ -1,1577 +0,0 @@
-// Xinha Language Combined Translation File
-//
-// LANG: "es", ENCODING: UTF-8
-//
-// INSTRUCTIONS TO TRANSLATORS
-// ===========================================================================
-//
-// Your translation must be in UTF-8 Character Encoding.
-//
-// This is a JSON encoded file (plus comments), strings should be double-quote
-// only, do not use single quotes to surround strings - "hello", not 'hello'
-// do not have a trailing comma after the last entry in a section.
-//
-// Only full line comments are allowed (that a comments occupy entire lines).
-//
-// Search for the __NEW_TRANSLATIONS__ section below, this is where you will
-// want to focus, this section includes things that do not presently have a 
-// translation or for which the translation needs to be checked for accuracy.
-//
-// In the New Translations section a translation string is one of the following
-//
-//  "English String Here" : ""
-//     This means it is not translated yet, add your translation...
-//     "English String Here" : "Klingon String Here"
-//
-//  "English String Here" : "Translated String Here"
-//     This means that an existing translation for this string, in some other
-//     section has been found, and used.  Check that it is approprite for this
-//     section and if it is, that's fine leave it as is, otherwise change as
-//     appropriate.
-//
-//  "English String Here" : "<<AnotherSection>>"
-//     This means use the same translation for this string as <<AnotherSection>>
-//     this saves you re-tranlating strings.  If the Context of this section
-//     and the context of AnotherSection seem the same, that's fine leave it
-//     using that translation, but if this section needs a different translation, 
-//     you can provide it by replacing the link (<<AnotherSection>>) with that
-//     new translation.  For example - a "Table" in say "DataPlugin" is 
-//     perhaps translated differently to "Table" in "FurniturePlugin".
-//
-// TESTING YOUR TRANSLATION
-// ===========================================================================
-// Simply place your translation file on your webserver somewhere for example
-//
-//   /xinha/lang/merged/es.js
-//
-// and then tell Xinha where to get it (before loading XinhaCore.js) by 
-//
-//  _editor_lang              = 'es';
-//  _editor_lang_merged_file  = '/xinha/lang/merged/es.js';
-//
-// Xinha will load your new language definition.
-//
-// SUBMITTING YOUR TRANSLATION
-// ===========================================================================
-// Simply create a Ticket on the Xinha website and attach your translation 
-// file.
-//
-// The Xinha developers will take your file and use the 
-//     contrib/lc_split_merged_file.php
-// script to load it into the Xinha distribution.
-
-{
-    "Abbreviation": {
-        "Abbreviation": "Abreviatura",
-        "Cancel": "Cancelar",
-        "Delete": "Suprimir",
-        "Expansion:": "Explicación",
-        "OK": "Aceptar"
-    },
-    "AboutBox": {
-        "About this editor": "Sobre este Editor",
-        "Close": "Cerrar"
-    },
-    "BackgroundImage": {
-        "Cancel": "Cancelar"
-    },
-    "ColorPicker": {
-        "Click a color...": "Seleccione un color...",
-        "Close": "Cerrar",
-        "Color: ": "Color: ",
-        "OK": "Aceptar",
-        "Sample": "Muestra",
-        "Web Safe: ": "Color web: "
-    },
-    "ContextMenu": {
-        "C_ell Properties...": "P_ropiedades de celda...",
-        "Chec_k Link...": "_Verificar hipervínculo...",
-        "Copy": "Copiar",
-        "Create a link": "Crear un hipervínculo",
-        "Current URL is": "La URL actual es",
-        "Cut": "Cortar",
-        "De_lete Column": "_Suprimir columna",
-        "Delete the current column": "Suprimir la columna actual",
-        "Delete the current row": "Suprimir la fila actual",
-        "How did you get here? (Please report!)": "¿Cómo ha llegado aquí? (¡Por favor reporte el error!)",
-        "I_nsert Row Before": "_Insertar fila delante",
-        "In_sert Row After": "I_nsertar fila detrás",
-        "Insert C_olumn After": "Insertar _columna detrás",
-        "Insert _Column Before": "Insert_ar columna delante",
-        "Insert a new column after the current one": "Insertar una columna nueva después de la actual",
-        "Insert a new column before the current one": "Insertar una columna nueva antes de la actual",
-        "Insert a new row after the current one": "Insertar una fila nueva después de la actual",
-        "Insert a new row before the current one": "Insertar una fila nueva antes de la actual",
-        "Insert a paragraph after the current node": "Insertar un párrafo después del nodo actual",
-        "Insert a paragraph before the current node": "Insertar un párrafo antes del nodo actual",
-        "Insert paragraph after": "Insertar párrafo detrás",
-        "Insert paragraph before": "Insertar párrafo delante",
-        "Justify Center": "Centrar",
-        "Justify Full": "Justificar",
-        "Justify Left": "Alinear a la izquierda",
-        "Justify Right": "Alinear a la derecha",
-        "Link points to:": "El hipervínculo apunta a:",
-        "Make lin_k...": "Convertir en _hipervínculo...",
-        "Opens this link in a new window": "Abre este hipervínculo en una ventana nueva",
-        "Paste": "Pegar",
-        "Please confirm that you want to remove this element:": "Por favor, confirme que desea suprimir este elemento:",
-        "Please confirm that you want to unlink this element.": "Por favor, confirme que desea suprimir el hipervínculo de este elemento.",
-        "Remove the $elem Element...": "Suprimir el elemento $elem...",
-        "Remove this node from the document": "Suprimir este nodo del documento",
-        "Ro_w Properties...": "Pr_opiedades de la fila...",
-        "Show the Table Cell Properties dialog": "Mostrar el diálogo Propiedades de la Celda",
-        "Show the Table Properties dialog": "Mostrar el diálogo Propiedades de la Tabla",
-        "Show the Table Row Properties dialog": "Mostrar el diálogo Propiedades de la Fila",
-        "Show the image properties dialog": "Mostrar el diálogo de propiedades de imagen",
-        "Unlink the current element": "Suprimir el hipervínculo del elemento actual",
-        "_Delete Row": "S_uprimir fila",
-        "_Image Properties...": "_Propiedades de imagen...",
-        "_Modify Link...": "_Modificar hipervínculo...",
-        "_Remove Link...": "_Suprimir hipervínculo...",
-        "_Table Properties...": "Propi_edades de la tabla..."
-    },
-    "CreateLink": {
-        "Cancel": "Cancelar",
-        "Insert/Modify Link": "Insertar/Modificar un enlace",
-        "New window (_blank)": "Nueva ventana (_blank)",
-        "None (use implicit)": "Vacío ( usar implícito )",
-        "OK": "Aceptar",
-        "Other": "Otro",
-        "Same frame (_self)": "Mismo marco (_self)",
-        "Target:": "Destino:",
-        "Title (tooltip):": "Título (Tooltip):",
-        "Top frame (_top)": "Marco superior (_top)",
-        "URL:": "URL:"
-    },
-    "EditTag": {
-        "Cancel": "Cancelar",
-        "Edit HTML for selected text": "Editar código HTML del texto seleccionado",
-        "OK": "Aceptar",
-        "Tag Editor": "Editor de Etiquetas"
-    },
-    "Equation": {
-        "Cancel": "Cancelar",
-        "OK": "Aceptar",
-        "Preview": "Previsualizar"
-    },
-    "ExtendedFileManager": {
-        "Absbottom": "Inferior absoluto",
-        "Absmiddle": "Medio Absoluto",
-        "Align": "Alinear",
-        "Baseline": "Línea base",
-        "Border": "Borde",
-        "Bottom": "Inferior",
-        "Cancel": "Cancelar",
-        "Clear": "Eliminar",
-        "Color": "Color",
-        "Constrain Proportions": "Proporcional",
-        "Copy": "Copiar",
-        "Crop": "Recortar",
-        "Cut": "Cortar",
-        "Directory": "Directorio",
-        "Directory Up": "Directorio superior",
-        "Edit": "editar",
-        "Filename:": "Nombre del fichero:",
-        "Flip Horizontal": "invertir horizontalmente",
-        "Flip Image": "invertir imagen",
-        "Flip Vertical": "invertir verticalmente",
-        "GIF format is not supported, image editing not supported.": "No hay soporte para imágenes en formato GIF.",
-        "Height": "Alto",
-        "Height:": "Alto:",
-        "Invalid base directory:": "Directorio de inicio inválido:",
-        "JPEG High": "JPEG alto",
-        "JPEG Low": "JPEG bajo",
-        "JPEG Medium": "JPEG medio",
-        "Left": "Izquierda",
-        "Loading": "Cargar",
-        "Lock": "Bloquear",
-        "Margin": "Margen",
-        "Marker": "Marcador",
-        "Measure": "Dimensiones",
-        "Middle": "Medio",
-        "New Folder": "Crear directorio",
-        "New window (_blank)": "Nueva ventana (_blank)",
-        "No Image Available": "No hay imagen",
-        "None (use implicit)": "Vacío ( usar implícito )",
-        "Not set": "No definido",
-        "OK": "Aceptar",
-        "Padding": "Relleno (Padding)",
-        "Positioning of this image": "Posición de la imagen",
-        "Preview": "Previsualizar",
-        "Quality:": "Calidad",
-        "Refresh": "Actualizar",
-        "Resize": "Cambiar tamaño",
-        "Right": "Derecha",
-        "Rotate": "Girar",
-        "Rotate Image": "Girar imagen",
-        "Same frame (_self)": "Mismo marco (_self)",
-        "Save": "Guardar",
-        "Start X:": "Inicio X",
-        "Start Y:": "Inicio Y",
-        "Texttop": "Texto Superior",
-        "Title (tooltip)": "Título (Tooltip):",
-        "Top": "Superior",
-        "Top frame (_top)": "Marco superior (_top)",
-        "Trash": "Basura",
-        "Upload": "Subir",
-        "W:": "B:",
-        "Width": "Ancho",
-        "Width:": "Ancho:"
-    },
-    "FindReplace": {
-        "Clear": "Eliminar"
-    },
-    "Forms": {
-        "Cancel": "Cancelar",
-        "Image URL:": "Imagen URL:",
-        "OK": "Aceptar",
-        "Rows:": "Filas:"
-    },
-    "FullPage": {
-        "Cancel": "Cancelar",
-        "Description:": "Descripción:",
-        "OK": "Aceptar"
-    },
-    "FullScreen": {
-        "Maximize/Minimize Editor": "Maximizar/Minimizar Editor"
-    },
-    "HorizontalRule": {
-        "Alignment:": "Alineación:",
-        "Cancel": "Cancelar",
-        "Center": "Centrar",
-        "Color:": "Color:",
-        "Height:": "Alto:",
-        "Horizontal Rule": "Regla horizontal",
-        "Layout": "Distribución",
-        "Left": "Izquierda",
-        "OK": "Aceptar",
-        "Right": "Derecha",
-        "Width:": "Ancho:",
-        "percent": "por ciento",
-        "pixels": "píxeles"
-    },
-    "ImageManager": {
-        "Absbottom": "Inferior absoluto",
-        "Absmiddle": "Medio Absoluto",
-        "Angle:": "Ángulo:",
-        "Baseline": "Línea base",
-        "Bottom": "Inferior",
-        "Cancel": "Cancelar",
-        "Clear": "Eliminar",
-        "Constrain Proportions": "Proporcional",
-        "Crop": "Recortar",
-        "Directory": "Directorio",
-        "Directory Up": "Directorio superior",
-        "Edit": "editar",
-        "Filename:": "Nombre del fichero:",
-        "Flip Horizontal": "invertir horizontalmente",
-        "Flip Image": "invertir imagen",
-        "Flip Vertical": "invertir verticalmente",
-        "Folder Name:": "Nombre del directorio:",
-        "GIF format is not supported, image editing not supported.": "No hay soporte para imágenes en formato GIF.",
-        "Height:": "Alto:",
-        "Image Format": "Formato:",
-        "Insert Image": "insertar imagen",
-        "Invalid base directory:": "Directorio de inicio inválido:",
-        "JPEG High": "JPEG alto",
-        "JPEG Low": "JPEG bajo",
-        "JPEG Medium": "JPEG medio",
-        "Left": "Izquierda",
-        "Lock": "Bloquear",
-        "Marker": "Marcador",
-        "Measure": "Dimensiones",
-        "Middle": "Medio",
-        "New Folder": "Crear directorio",
-        "No Image Available": "No hay imagen",
-        "No Images Found": "No se ha encontrado imagen",
-        "Not set": "No definido",
-        "OK": "Aceptar",
-        "Positioning of this image": "Posición de la imagen",
-        "Quality:": "Calidad",
-        "Refresh": "Actualizar",
-        "Resize": "Cambiar tamaño",
-        "Right": "Derecha",
-        "Rotate": "Girar",
-        "Rotate Image": "Girar imagen",
-        "Save": "Guardar",
-        "Start X:": "Inicio X",
-        "Start Y:": "Inicio Y",
-        "Texttop": "Texto Superior",
-        "Top": "Superior",
-        "Trash": "Basura",
-        "W:": "B:",
-        "Width:": "Ancho:"
-    },
-    "InlineStyler": {
-        "Background": "Fondo",
-        "Baseline": "Línea base",
-        "Border": "Borde",
-        "Bottom": "Inferior",
-        "Center": "Centrar",
-        "Char": "Carácter",
-        "Collapsed borders": "Bordes colapsados",
-        "FG Color": "Color Principal",
-        "Float": "Flotante",
-        "Height": "Alto",
-        "Image URL": "URL de la imágen",
-        "Justify": "Justificar",
-        "Layout": "Distribución",
-        "Left": "Izquierda",
-        "Margin": "Margen",
-        "Middle": "Medio",
-        "None": "Ninguno",
-        "Padding": "Relleno (Padding)",
-        "Right": "Derecha",
-        "Text align": "Alineación del texto",
-        "Top": "Superior",
-        "Vertical align": "Alineación vertical",
-        "Width": "Ancho",
-        "percent": "por ciento",
-        "pixels": "píxeles"
-    },
-    "InsertAnchor": {
-        "Cancel": "Cancelar",
-        "Delete": "Suprimir",
-        "OK": "Aceptar"
-    },
-    "InsertImage": {
-        "Absbottom": "Inferior absoluto",
-        "Absmiddle": "Medio Absoluto",
-        "Alignment:": "Alineación:",
-        "Alternate text:": "Texto alternativo:",
-        "Baseline": "Línea base",
-        "Border thickness:": "Tamaño del borde:",
-        "Bottom": "Inferior",
-        "Cancel": "Cancelar",
-        "For browsers that don't support images": "Para navegadores que no soportan imágenes",
-        "Horizontal padding": "Relleno horizontal",
-        "Horizontal:": "horizontal:",
-        "Image Preview:": "Previsualización de la imagen:",
-        "Image URL:": "Imagen URL:",
-        "Insert Image": "insertar imagen",
-        "Layout": "Distribución",
-        "Leave empty for no border": "Vacío si no desea ningún borde",
-        "Left": "Izquierda",
-        "Middle": "Medio",
-        "Not set": "No definido",
-        "OK": "Aceptar",
-        "Positioning of this image": "Posición de la imagen",
-        "Preview": "Previsualizar",
-        "Preview the image in a new window": "Previsualizar en una nueva ventana",
-        "Right": "Derecha",
-        "Spacing": "Espaciado",
-        "Texttop": "Texto Superior",
-        "Top": "Superior",
-        "Vertical padding": "Relleno Vertical",
-        "Vertical:": "Vertical:",
-        "You must enter the URL": "Debe introducir la URL"
-    },
-    "InsertMarquee": {
-        "Cancel": "Cancelar",
-        "Height:": "Alto:",
-        "Left": "Izquierda",
-        "OK": "Aceptar",
-        "Right": "Derecha",
-        "Width:": "Ancho:"
-    },
-    "InsertNote": {
-        "Cancel": "Cancelar"
-    },
-    "InsertPicture": {
-        "Absbottom": "Inferior absoluto",
-        "Absmiddle": "Medio Absoluto",
-        "Alignment:": "Alineación:",
-        "Alternate text:": "Texto alternativo:",
-        "Baseline": "Línea base",
-        "Border thickness:": "Tamaño del borde:",
-        "Bottom": "Inferior",
-        "Cancel": "Cancelar",
-        "For browsers that don't support images": "Para navegadores que no soportan imágenes",
-        "Height:": "Alto:",
-        "Horizontal padding": "Relleno horizontal",
-        "Horizontal:": "horizontal:",
-        "Image Preview:": "Previsualización de la imagen:",
-        "Image URL:": "Imagen URL:",
-        "Insert Image": "insertar imagen",
-        "Layout": "Distribución",
-        "Leave empty for no border": "Vacío si no desea ningún borde",
-        "Left": "Izquierda",
-        "Middle": "Medio",
-        "Not set": "No definido",
-        "OK": "Aceptar",
-        "Positioning of this image": "Posición de la imagen",
-        "Preview": "Previsualizar",
-        "Preview the image in a new window": "Previsualizar en una nueva ventana",
-        "Right": "Derecha",
-        "Spacing": "Espaciado",
-        "Texttop": "Texto Superior",
-        "Top": "Superior",
-        "Vertical padding": "Relleno Vertical",
-        "Vertical:": "Vertical:",
-        "Width:": "Ancho:"
-    },
-    "InsertSnippet": {
-        "Cancel": "Cancelar"
-    },
-    "InsertSnippet2": {
-        "Cancel": "Cancelar"
-    },
-    "InsertTable": {
-        "Absbottom": "Inferior absoluto",
-        "Absmiddle": "Medio Absoluto",
-        "Alignment:": "Alineación:",
-        "Baseline": "Línea base",
-        "Border": "Borde",
-        "Border thickness:": "Tamaño del borde:",
-        "Bottom": "Inferior",
-        "Cancel": "Cancelar",
-        "Caption": "Título",
-        "Cell padding:": "Relleno de celdas:",
-        "Cell spacing:": "Espaciado entre celdas:",
-        "Cols:": "Columnas:",
-        "Em": "Em",
-        "Fixed width columns": "Columnas de ancho fijo",
-        "Insert Table": "Añadir una tabla",
-        "Layout": "Distribución",
-        "Leave empty for no border": "Vacío si no desea ningún borde",
-        "Left": "Izquierda",
-        "Middle": "Medio",
-        "Not set": "No definido",
-        "Number of columns": "Número de columnas",
-        "Number of rows": "Número de filas",
-        "OK": "Aceptar",
-        "Percent": "Porcentaje",
-        "Pixels": "Pixels",
-        "Positioning of this table": "Posición de esta tabla",
-        "Right": "Derecha",
-        "Rows:": "Filas:",
-        "Space between adjacent cells": "Espaciado entre celdas adyacentes",
-        "Space between content and border in cell": "Escapcio entre el contenido y el borde de la celda",
-        "Spacing": "Espaciado",
-        "Texttop": "Texto Superior",
-        "Top": "Superior",
-        "Width of the table": "Ancho de la tabla",
-        "Width unit": "Unidad de anchura",
-        "Width:": "Ancho:",
-        "You must enter a number of columns": "Debe introducir un número de columnas",
-        "You must enter a number of rows": "Debe introducir un número de filas"
-    },
-    "LangMarks": {
-        "&mdash; language &mdash;": "&mdash; idioma &mdash;",
-        "English": "Inglés",
-        "French": "Francés",
-        "Greek": "Griego",
-        "Latin": "Latín",
-        "language select": "seleccionar idioma"
-    },
-    "Linker": {
-        "Cancel": "Cancelar",
-        "Insert/Modify Link": "Insertar/Modificar un enlace",
-        "OK": "Aceptar",
-        "Target:": "Destino:",
-        "URL:": "URL:"
-    },
-    "ListType": {
-        "Choose list style type (for ordered lists)": "Seleccionar estilo de lista (para listas ordenadas)",
-        "Decimal numbers": "Números",
-        "Lower greek letters": "Letras griegas minúsculas",
-        "Lower latin letters": "Letras minúsculas",
-        "Lower roman numbers": "Números romanos en minúsculas",
-        "Upper latin letters": "Letras mayúsculas",
-        "Upper roman numbers": "Números romanos en mayúsculas"
-    },
-    "NoteServer": {
-        "Cancel": "Cancelar",
-        "Image Preview": "Previsualización de la imagen:",
-        "OK": "Aceptar",
-        "Preview": "Previsualizar",
-        "Preview the image in a new window": "Previsualizar en una nueva ventana"
-    },
-    "Opera": {
-        "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"
-    },
-    "PSLocal": {
-        "Cancel": "Cancelar"
-    },
-    "PasteText": {
-        "Cancel": "Cancelar",
-        "OK": "Aceptar"
-    },
-    "PersistentStorage": {
-        "Cancel": "Cancelar",
-        "Copy": "Copiar",
-        "Delete": "Suprimir",
-        "Directory Up": "Directorio superior",
-        "Filename": "Nombre del fichero:",
-        "Insert Image": "insertar imagen",
-        "New Folder": "Crear directorio",
-        "Save": "Guardar"
-    },
-    "QuickTag": {
-        "Cancel": "Cancelar"
-    },
-    "SaveSubmit": {
-        "Save": "Guardar"
-    },
-    "SetId": {
-        "Cancel": "Cancelar",
-        "Delete": "Suprimir",
-        "OK": "Aceptar"
-    },
-    "SmartReplace": {
-        "OK": "Aceptar"
-    },
-    "SpellChecker": {
-        "Cancel": "Cancelar",
-        "OK": "Aceptar"
-    },
-    "SuperClean": {
-        "Cancel": "Cancelar",
-        "OK": "Aceptar"
-    },
-    "TableOperations": {
-        "All four sides": "Todos los cuatro lados",
-        "Borders": "Bordes",
-        "Cancel": "Cancelar",
-        "Caption": "Título",
-        "Cell Properties": "Propiedades de la Celda",
-        "Cell properties": "Propiedades de la celda",
-        "Delete cell": "Suprimir celda",
-        "Delete column": "Suprimir columna",
-        "Delete row": "Suprimir fila",
-        "Description": "Descripción",
-        "Frames": "Marcos",
-        "Insert cell after": "Insertar celda detrás",
-        "Insert cell before": "Insertar celda delante",
-        "Insert column after": "Insertar columna detrás",
-        "Insert column before": "Insertar columna delante",
-        "Insert row after": "Insertar fila detrás",
-        "Insert row before": "Insertar fila delante",
-        "Merge cells": "Unir celdas",
-        "No rules": "Ninguna regla",
-        "No sides": "Ningún lado",
-        "OK": "Aceptar",
-        "Padding": "Relleno (Padding)",
-        "Please click into some cell": "Por favor, haz clic en alguna celda",
-        "Row Properties": "Propiedades de la Fila",
-        "Row properties": "Propiedades de la fila",
-        "Rows": "Filas:",
-        "Rules will appear between all rows and columns": "Las líneas aparecerán entre todas las filas y columnas",
-        "Rules will appear between columns only": "Las líneas aparecerán solo entre las columnas",
-        "Rules will appear between rows only": "Las líneas aparecerán solo entre las filas",
-        "Spacing": "Espaciado",
-        "Spacing and padding": "Espaciado y Relleno",
-        "Split column": "Dividir columna",
-        "Split row": "Dividir fila",
-        "Summary": "Resumen",
-        "Table Properties": "Propiedades de la Tabla",
-        "Table properties": "Propiedades de la tabla",
-        "The bottom side only": "Solo el lado inferior",
-        "The left-hand side only": "Solo el lado izquierdo",
-        "The right and left sides only": "Solo los lados derecho e izquierdo",
-        "The right-hand side only": "Solo el lado derecho",
-        "The top and bottom sides only": "Solo los lados superior e inferior",
-        "The top side only": "Solo el lado superior",
-        "Xinha cowardly refuses to delete the last cell in row.": "Xinha se reusa cobardemente a eliminar la última celda en la fila.",
-        "Xinha cowardly refuses to delete the last column in table.": "Xinha se reusa cobardemente a eliminar la última columna en la tabla.",
-        "Xinha cowardly refuses to delete the last row in table.": "Xinha se reusa cobardemente a eliminar la última fila en la tabla.",
-        "pixels": "píxeles"
-    },
-    "Template": {
-        "Cancel": "Cancelar"
-    },
-    "UnFormat": {
-        "Cancel": "Cancelar",
-        "OK": "Aceptar"
-    },
-    "UnsavedChanges": {
-        "You have unsaved changes in the editor": "Usted no ha guardado sus modificaciones"
-    },
-    "Xinha": {
-        "&#8212; font &#8212;": "&#8212; fuente &#8212;",
-        "&#8212; format &#8212;": "&#8212; formato &#8212;",
-        "&#8212; size &#8212;": "&#8212; tamaño &#8212;",
-        "About this editor": "Sobre este Editor",
-        "Address": "Dirección",
-        "Background Color": "Color de fondo",
-        "Bold": "Negrita",
-        "Bulleted List": "Lista no numerada",
-        "Clean content pasted from Word": "Limpiar el contenido pegado desde Word",
-        "Clear Inline Font Specifications": "Borrar las etiquetas de fuente",
-        "Clear MSOffice tags": "Borrar etiquetas de MSOffice",
-        "Close": "Cerrar",
-        "Constructing object": "Construyendo objeto",
-        "Copy selection": "Copiar",
-        "Create Statusbar": "Crear barra de estado",
-        "Create Toolbar": "Crear barra de herramientas",
-        "Current style": "Estilo actual",
-        "Cut selection": "Cortar",
-        "Decrease Indent": "Reducir sangría",
-        "Direction left to right": "Dirección de izquierda a derecha",
-        "Direction right to left": "Dirección de derecha a izquierda",
-        "Finishing": "Finalizando",
-        "Font Color": "Color de la fuente",
-        "Formatted": "Formateado",
-        "Generate Xinha framework": "Generar Xinha framework",
-        "Heading 1": "Cabecera 1",
-        "Heading 2": "Cabecera 2",
-        "Heading 3": "Cabecera 3",
-        "Heading 4": "Cabecera 4",
-        "Heading 5": "Cabecera 5",
-        "Heading 6": "Cabecera 6",
-        "Headings": "Cabeceras",
-        "Help using editor": "Ayuda",
-        "Horizontal Rule": "Regla horizontal",
-        "Increase Indent": "Aumentar sangría",
-        "Init editor size": "Iniciar el tamaño del editor",
-        "Insert Table": "Añadir una tabla",
-        "Insert Web Link": "Insertar enlace web",
-        "Insert/Modify Image": "Insertar/modificar imagen",
-        "Insert/Overwrite": "Insertar/Sobreescribir",
-        "Italic": "Cursiva",
-        "Justify Center": "Alinear al centro",
-        "Justify Full": "Justificar",
-        "Justify Left": "Alinear a la izquierda",
-        "Justify Right": "Alinear a la derecha",
-        "Keyboard shortcuts": "Atajos de teclado",
-        "Loading in progress. Please wait!": "Carga en proceso. Por favor espere.",
-        "Loading plugin $plugin": "Cargando el plugin $plugin",
-        "Normal": "Normal",
-        "Ordered List": "Lista numerada",
-        "Paste from clipboard": "Pegar desde el portapapeles",
-        "Path": "Ruta",
-        "Print document": "Imprimir documento",
-        "Redoes your last action": "Rehacer",
-        "Register plugin $plugin": "Registro de plugin $plugin",
-        "Remove formatting": "Borrar formato",
-        "Save as": "Guardar como",
-        "Select all": "Seleccionar todo",
-        "Set format to paragraph": "EStablecer el formato a parrafo",
-        "Split Block": "Dividir el bloque",
-        "Strikethrough": "Tachado",
-        "Subscript": "Subíndice",
-        "Superscript": "Superíndice",
-        "The editor provides the following key combinations:": "El editor proporciona las siguientes combinaciones:",
-        "Toggle Borders": "Añadir/Quitar bordes",
-        "Toggle HTML Source": "Ver HTML",
-        "Underline": "Subrayado",
-        "Undoes your last action": "Deshacer",
-        "Would you like to clear font colours?": "¿Desea eliminar las definiciones de color de fuente?",
-        "Would you like to clear font sizes?": "¿Desea eliminar las definiciones de tamaño de fuente?",
-        "Would you like to clear font typefaces?": "¿Desea eliminar las definiciaones de tipo de fuente?",
-        "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",
-        "insert linebreak": "Insertar salto de línea",
-        "new paragraph": "Nuevo parrafo"
-    },
-    "__NEW_TRANSLATIONS__": {
-        "CharCounter": {
-            "... in progress": "",
-            "Chars": "",
-            "HTML": "",
-            "Words": ""
-        },
-        "CharacterMap": {
-            "Insert special character": ""
-        },
-        "ContextMenu": {
-            "Delete Cell": "",
-            "Insert Cell After": "",
-            "Insert Cell Before": "",
-            "Merge Cells": ""
-        },
-        "CreateLink": {
-            "Are you sure you wish to remove this link?": "",
-            "You need to select some text before creating a link": ""
-        },
-        "DefinitionList": {
-            "definition description": "",
-            "definition list": "",
-            "definition term": ""
-        },
-        "Dialogs": {
-            "Some Text Here": ""
-        },
-        "DynamicCSS": {
-            "Choose stylesheet": "",
-            "Default": "",
-            "Undefined": ""
-        },
-        "EditTag": {
-            "Edit Tag By Peg": ""
-        },
-        "Equation": {
-            "!=": "",
-            "!in": "",
-            "&gt;-": "",
-            "&gt;=": "",
-            "&lt;=": "",
-            "&lt;=&gt;": "",
-            "&lt;x&gt;": "",
-            "&nbsp; `!` &nbsp;": "",
-            "&nbsp; `.` &nbsp;": "",
-            "&nbsp; `0` &nbsp;": "",
-            "&nbsp; `2` &nbsp;": "",
-            "&nbsp; `3` &nbsp;": "",
-            "&nbsp; `4` &nbsp;": "",
-            "&nbsp; `5` &nbsp;": "",
-            "&nbsp; `6` &nbsp;": "",
-            "&nbsp; `7` &nbsp;": "",
-            "&nbsp; `8` &nbsp;": "",
-            "&nbsp; `9` &nbsp;": "",
-            "&nbsp; `e` &nbsp;": "",
-            "&nbsp;&nbsp;`1` &nbsp;": "",
-            "&nbsp;`+{::}`&nbsp;": "",
-            "&nbsp;`-:\\ `": "",
-            "&nbsp;`-{::}`&nbsp;": "",
-            "&nbsp;`C`&nbsp;": "",
-            "&nbsp;`cos`": "",
-            "&nbsp;`ln`&nbsp;": "",
-            "&nbsp;`pi` &nbsp;": "",
-            "&nbsp;`sin`": "",
-            "&nbsp;`tan`": "",
-            "&nbsp;`times`&nbsp;": "",
-            "&quot;text&quot;": "",
-            "'+formula+'": "",
-            "((n),(k))": "",
-            "(x+1)/(x-1)": "",
-            "*": "",
-            "**": "",
-            "+-": "",
-            "-&gt;": "",
-            "-&lt;": "",
-            "-:": "",
-            "-=": "",
-            "//": "",
-            "/_": "",
-            ":.": "",
-            "=&gt;": "",
-            "@": "",
-            "[[a,b],[c,d]]": "",
-            "\\\\": "",
-            "\\nClick in the box to use your keyboard or use the buttons\\n": "",
-            "^^": "",
-            "^^^": "",
-            "__|": "",
-            "_|_": "",
-            "`!=`": "",
-            "`!in`": "",
-            "`&and;`": "",
-            "`&cap;`": "",
-            "`&cup;`": "",
-            "`&gt;-`": "",
-            "`&gt;=`": "",
-            "`&lt;=&gt;`": "",
-            "`&lt;=`": "",
-            "`&lt;x&gt;`": "",
-            "`&or;`": "",
-            "`&quot;text&quot;`": "",
-            "`((n),(k))`": "",
-            "`(x+1)/(x-1)`": "",
-            "`**`": "",
-            "`*`": "",
-            "`+-`": "",
-            "`-&gt;`": "",
-            "`-&lt;`": "",
-            "`-:`": "",
-            "`-=`": "",
-            "`//`": "",
-            "`/_`": "",
-            "`:.`": "",
-            "`=&gt;`": "",
-            "`@`": "",
-            "`[[a,b],[c,d]]`": "",
-            "`\\\\`": "",
-            "`__|`": "",
-            "`_|_`": "",
-            "`AA`": "",
-            "`aleph`": "",
-            "`alpha`": "",
-            "`and`": "",
-            "`bara`": "",
-            "`bba`": "",
-            "`bbba`": "",
-            "`beta`": "",
-            "`CC`": "",
-            "`cca`": "",
-            "`chi`": "",
-            "`darr`": "",
-            "`ddota`": "",
-            "`del`": "",
-            "`Delta`": "",
-            "`delta`": "",
-            "`diamond`": "",
-            "`dota`": "",
-            "`dy/dx`": "",
-            "`EE`": "",
-            "`epsi`": "",
-            "`eta`": "",
-            "`fra`": "",
-            "`Gamma`": "",
-            "`gamma`": "",
-            "`grad`": "",
-            "`harr`": "",
-            "`hArr`": "",
-            "`hata`": "",
-            "`if`": "",
-            "`in`": "",
-            "`int`": "",
-            "`iota`": "",
-            "`kappa`": "",
-            "`lambda`": "",
-            "`Lambda`": "",
-            "`lArr`": "",
-            "`larr`": "",
-            "`lim_(x-&gt;oo)`": "",
-            "`log`": "",
-            "`mu`": "",
-            "`NN`": "",
-            "`nn`": "",
-            "`not`": "",
-            "`nu`": "",
-            "`o+`": "",
-            "`o.`": "",
-            "`O/`": "",
-            "`oint`": "",
-            "`omega`": "",
-            "`Omega`": "",
-            "`oo`": "",
-            "`or`": "",
-            "`ox`": "",
-            "`Phi`": "",
-            "`phi`": "",
-            "`Pi`": "",
-            "`pi`": "",
-            "`prod`": "",
-            "`prop`": "",
-            "`Psi`": "",
-            "`psi`": "",
-            "`QQ`": "",
-            "`quad`": "",
-            "`rArr`": "",
-            "`rho`": "",
-            "`root(n)(x)`": "",
-            "`RR`": "",
-            "`sfa`": "",
-            "`sigma`": "",
-            "`Sigma`": "",
-            "`sqrt(x)`": "",
-            "`square`": "",
-            "`stackrel(-&gt;)(+)`": "",
-            "`sub`": "",
-            "`sube`": "",
-            "`sum`": "",
-            "`sup`": "",
-            "`supe`": "",
-            "`tau`": "",
-            "`Theta`": "",
-            "`theta`": "",
-            "`TT`": "",
-            "`tta`": "",
-            "`uarr`": "",
-            "`ula`": "",
-            "`upsilon`": "",
-            "`uu`": "",
-            "`veca`": "",
-            "`vv`": "",
-            "`x_(mn)`": "",
-            "`Xi`": "",
-            "`xi`": "",
-            "`xx`": "",
-            "`zeta`": "",
-            "`ZZ`": "",
-            "`|-&gt;`": "",
-            "`|--`": "",
-            "`|==`": "",
-            "`|__`": "",
-            "`|~`": "",
-            "`~=`": "",
-            "`~|`": "",
-            "`~~`": "",
-            "AA": "",
-            "aleph": "",
-            "alpha": "",
-            "and": "",
-            "AsciiMath Formula Input": "",
-            "AsciiMathML Example": "",
-            "bara": "",
-            "Based on ASCIIMathML by": "",
-            "bba": "",
-            "bbba": "",
-            "beta": "",
-            "CC": "",
-            "cca": "",
-            "chi": "",
-            "darr": "",
-            "ddota": "",
-            "del": "",
-            "Delta": "",
-            "delta": "",
-            "diamond": "",
-            "dota": "",
-            "dy/dx": "",
-            "EE": "",
-            "epsi": "",
-            "eta": "",
-            "For more information on AsciiMathML visit this page:": "",
-            "Formula Editor": "",
-            "fra": "",
-            "gamma": "",
-            "Gamma": "",
-            "grad": "",
-            "hArr": "",
-            "harr": "",
-            "hata": "",
-            "if": "",
-            "in": "",
-            "Input": "",
-            "int": "",
-            "int_a^bf(x)dx": "",
-            "iota": "",
-            "kappa": "",
-            "Lambda": "",
-            "lambda": "",
-            "larr": "",
-            "lArr": "",
-            "lim_(x-&gt;oo)": "",
-            "mu": "",
-            "NN": "",
-            "nn": "",
-            "nnn": "",
-            "not": "",
-            "nu": "",
-            "o+": "",
-            "o.": "",
-            "O/": "",
-            "oint": "",
-            "omega": "",
-            "Omega": "",
-            "oo": "",
-            "or": "",
-            "ox": "",
-            "Phi": "",
-            "phi": "",
-            "pi": "",
-            "Pi": "",
-            "prod": "",
-            "prop": "",
-            "psi": "",
-            "Psi": "",
-            "QQ": "",
-            "quad": "",
-            "rArr": "",
-            "rho": "",
-            "root(n)(x)": "",
-            "RR": "",
-            "sfa": "",
-            "sigma": "",
-            "Sigma": "",
-            "sqrt(x)": "",
-            "square": "",
-            "stackrel(-&gt;)(+)": "",
-            "sub": "",
-            "sube": "",
-            "sum": "",
-            "sum_(n=1)^oo": "",
-            "sup": "",
-            "supe": "",
-            "tau": "",
-            "Theta": "",
-            "theta": "",
-            "TT": "",
-            "tta": "",
-            "uarr": "",
-            "ula": "",
-            "upsilon": "",
-            "uu": "",
-            "uuu": "",
-            "veca": "",
-            "vv": "",
-            "vvv": "",
-            "x^(m+n)": "",
-            "x_(mn)": "",
-            "Xi": "",
-            "xi": "",
-            "xx": "",
-            "zeta": "",
-            "ZZ": "",
-            "|-&gt;": "",
-            "|--": "",
-            "|==": "",
-            "|__": "",
-            "|~": "",
-            "~=": "",
-            "~|": "",
-            "~~": ""
-        },
-        "FancySelects": {
-            "'+opt.text+'": ""
-        },
-        "FindReplace": {
-            "';\r\n  var tagc = '": "",
-            "Case sensitive search": "",
-            "Done": "",
-            "Enter the text you want to find": "",
-            "Find and Replace": "",
-            "found item": "",
-            "found items": "",
-            "Highlight": "",
-            "Inform a replacement word": "",
-            "Next": "",
-            "not found": "",
-            "Options": "",
-            "Replace with:": "",
-            "replaced item": "",
-            "replaced items": "",
-            "Search for:": "",
-            "Substitute all occurrences": "",
-            "Substitute this occurrence?": "",
-            "Undo": "",
-            "Whole words only": ""
-        },
-        "FormOperations": {
-            "Enter the name for new option.": "",
-            "Form Editor": "",
-            "Insert a check box.": "",
-            "Insert a Form.": "",
-            "Insert a multi-line text field.": "",
-            "Insert a radio button.": "",
-            "Insert a select field.": "",
-            "Insert a submit/reset button.": "",
-            "Insert a text, password or hidden field.": "",
-            "Message Sent": "",
-            "Please Select...": ""
-        },
-        "Forms": {
-            "'onClick'=": "",
-            "Access Key:": "",
-            "Action URL:": "",
-            "Button Script": "",
-            "Checked": "",
-            "Columns:": "",
-            "Default text (optional)": "",
-            "Dimensions": "",
-            "Disabled": "",
-            "Encoding:": "",
-            "For Control:": "",
-            "Form": "",
-            "Form Element: FIELDSET": "",
-            "Form Element: INPUT": "",
-            "Form Element: LABEL": "",
-            "Form Element: SELECT": "",
-            "Form Element: TEXTAREA": "",
-            "Form handler script": "",
-            "Form Name:": "",
-            "Get": "",
-            "Hard": "",
-            "Height in number of rows": "",
-            "HTML-Form to CGI (default)": "",
-            "Image source": "",
-            "Initial Text:": "",
-            "Insert/Edit Form": "",
-            "Insert/Edit Form Element FIELDSET": "",
-            "Insert/Edit Form Element INPUT": "",
-            "Insert/Edit Form Element LABEL": "",
-            "Insert/Edit Form Element SELECT": "",
-            "Insert/Edit Form Element TEXTAREA": "",
-            "Javascript for button click": "",
-            "Label:": "",
-            "Legend:": "",
-            "Max length:": "",
-            "Maximum number of characters accepted": "",
-            "Method:": "",
-            "multipart Form Data (File-Upload)": "",
-            "Name": "",
-            "Name of the form input": "",
-            "Name of the form select": "",
-            "name of the textarea": "",
-            "Name/ID:": "",
-            "normal": "",
-            "nowrap": "",
-            "Off": "",
-            "Physical": "",
-            "Please enter a Label": "",
-            "Post": "",
-            "pre": "",
-            "Read Only": "",
-            "Size of text box in characters": "",
-            "Size:": "",
-            "Soft": "",
-            "Tab Index:": "",
-            "Target Frame:": "",
-            "Text:": "",
-            "URL of image": "",
-            "Value of the form input": "",
-            "Value:": "",
-            "Virtual": "",
-            "Width in number of characters": "",
-            "Wrap Mode:": "",
-            "You must enter a Name": "",
-            "Options": "<<FindReplace>>"
-        },
-        "FullPage": {
-            "...": "",
-            "Alternate style-sheet:": "",
-            "Background color:": "",
-            "Character set:": "",
-            "cyrillic (ISO-8859-5)": "",
-            "cyrillic (KOI8-R)": "",
-            "cyrillic (WINDOWS-1251)": "",
-            "DOCTYPE:": "",
-            "Document properties": "",
-            "Document title:": "",
-            "Keywords:": "",
-            "Primary style-sheet:": "",
-            "Text color:": "",
-            "UTF-8 (recommended)": "",
-            "western (ISO-8859-1)": ""
-        },
-        "Gecko": {
-            "The Paste button does not work in this browser for security reasons. Press CTRL-V on your keyboard to paste directly.": ""
-        },
-        "HorizontalRule": {
-            "&#x00d7;": "",
-            "&nbsp;": "",
-            "Insert/edit horizontal rule": "",
-            "Insert/Edit Horizontal Rule": "",
-            "No shading": "",
-            "Style": ""
-        },
-        "InlineStyler": {
-            "CSS Style": "",
-            "-": "<<Equation>>"
-        },
-        "InsertAnchor": {
-            "Anchor name": "",
-            "Insert Anchor": ""
-        },
-        "InsertImage": {
-            "Enter the image URL here": ""
-        },
-        "InsertNote": {
-            "Insert": "",
-            "Insert footnote": "",
-            "Insert Note": ""
-        },
-        "InsertPagebreak": {
-            "Page break": "",
-            "Page Break": ""
-        },
-        "InsertSmiley": {
-            "Insert Smiley": ""
-        },
-        "InsertSnippet": {
-            "\\n  This is an information about something\\n": "",
-            "Hide preview": "",
-            "Insert as": "",
-            "Insert Snippet": "",
-            "InsertSnippet for Xinha": "",
-            "Link1": "",
-            "Link2": "",
-            "Link3": "",
-            "Link4": "",
-            "Link5": "",
-            "Show preview": "",
-            "This is an information about something": "",
-            "Variable": ""
-        },
-        "InsertSnippet2": {
-            "All Categories": "",
-            "Filter": "",
-            "Insert as HTML": "",
-            "Insert as template variable": "",
-            "Only search word beginning": "",
-            "HTML": "<<CharCounter>>",
-            "Insert Snippet": "<<InsertSnippet>>",
-            "InsertSnippet for Xinha": "<<InsertSnippet>>",
-            "Variable": "<<InsertSnippet>>"
-        },
-        "InsertTable": {
-            "Caption for the table": "",
-            "Collapse borders:": "",
-            "Layou": "",
-            "Style of the border": ""
-        },
-        "LangMarks": {
-            "', '": ""
-        },
-        "Linker": {
-            "(px)": "",
-            "Anchor-Link": "",
-            "Anchor:": "",
-            "Email Address:": "",
-            "Email Link": "",
-            "Location Bar:": "",
-            "Menu Bar:": "",
-            "Message Template:": "",
-            "New Window": "",
-            "Ordinary Link": "",
-            "Popup Window": "",
-            "PopupWindow": "",
-            "Remove Link": "",
-            "Resizeable:": "",
-            "Same Window (jump out of frames)": "",
-            "Scrollbars:": "",
-            "Shows On Hover": "",
-            "Status Bar:": "",
-            "Subject:": "",
-            "Title:": "",
-            "Toolbar:": "",
-            "URL Link": "",
-            "You must select some text before making a new link.": "",
-            "Are you sure you wish to remove this link?": "<<CreateLink>>",
-            "Name:": "<<Forms>>",
-            "Size:": "<<Forms>>"
-        },
-        "MootoolsFileManager": {
-            "Insert File Link": "",
-            "You must select some text before making a new link.": "<<Linker>>"
-        },
-        "Opera": {
-            "MARK": ""
-        },
-        "PasteText": {
-            "Insert text in new paragraph": "",
-            "Paste as Plain Text": ""
-        },
-        "PreserveScripts": {
-            "JavaScript": "",
-            "PHP": ""
-        },
-        "QuickTag": {
-            "',\r\n                           'cl': '": "",
-            "ATTRIBUTES": "",
-            "Colors": "",
-            "Enter the TAG you want to insert": "",
-            "No CSS class avaiable": "",
-            "Ok": "",
-            "OPTIONS": "",
-            "Quick Tag Editor": "",
-            "TAGs": "",
-            "There are some unclosed quote": "",
-            "This attribute already exists in the TAG": "",
-            "You have to select some text": ""
-        },
-        "SaveSubmit": {
-            "in progress": "",
-            "Ready": "",
-            "Saving...": ""
-        },
-        "SetId": {
-            "ID/Name:": "",
-            "Set Id and Name": "",
-            "Set Id/Name": "",
-            "Set ID/Name": ""
-        },
-        "SmartReplace": {
-            "ClosingDoubleQuotes": "",
-            "ClosingSingleQuote": "",
-            "Convert all quotes and dashes in the current document": "",
-            "Enable automatic replacements": "",
-            "OpeningDoubleQuotes": "",
-            "OpeningSingleQuote": "",
-            "SmartReplace": "",
-            "SmartReplace Settings": ""
-        },
-        "Stylist": {
-            "Styles": ""
-        },
-        "SuperClean": {
-            "Clean bad HTML from Microsoft Word.": "",
-            "Clean Selection Only": "",
-            "Clean up HTML": "",
-            "Cleaning Scope": "",
-            "General tidy up and correction of some problems.": "",
-            "Please select from the following cleaning options...": "",
-            "Please stand by while cleaning in process...": "",
-            "Remove alignment (left/right/justify).": "",
-            "Remove all classes (CSS).": "",
-            "Remove All HTML Tags": "",
-            "Remove all styles (CSS).": "",
-            "Remove custom font sizes.": "",
-            "Remove custom text colors.": "",
-            "Remove custom typefaces (font \"styles\").": "",
-            "Remove emphasis and annotations.": "",
-            "Remove lang attributes.": "",
-            "Remove Paragraphs": "",
-            "Remove superscripts and subscripts.": "",
-            "Replace directional quote marks with non-directional quote marks.": "",
-            "Vigorously purge HTML from Microsoft Word.": ""
-        },
-        "TableOperations": {
-            "Cell Type:": "",
-            "Cells down": "",
-            "Cells to the right, and": "",
-            "Do Not Change": "",
-            "Frame and borders": "",
-            "Header (th)": "",
-            "Merge current cell with:": "",
-            "Normal (td)": "",
-            "Columns": "<<Forms>>",
-            "Merge Cells": "<<ContextMenu>>"
-        },
-        "WebKit": {
-            "The Paste button does not work in this browser for security reasons. Press CTRL-V on your keyboard to paste directly.": "<<Gecko>>"
-        },
-        "Xinha": {
-            "1 (8 pt)": "",
-            "2 (10 pt)": "",
-            "3 (12 pt)": "",
-            "4 (14 pt)": "",
-            "5 (18 pt)": "",
-            "6 (24 pt)": "",
-            "7 (36 pt)": "",
-            "Arial": "",
-            "Courier New": "",
-            "CTRL-0 (zero)": "",
-            "CTRL-1 .. CTRL-6": "",
-            "CTRL-A": "",
-            "CTRL-B": "",
-            "CTRL-C": "",
-            "CTRL-E": "",
-            "CTRL-I": "",
-            "CTRL-J": "",
-            "CTRL-L": "",
-            "CTRL-N": "",
-            "CTRL-R": "",
-            "CTRL-S": "",
-            "CTRL-U": "",
-            "CTRL-V": "",
-            "CTRL-X": "",
-            "CTRL-Y": "",
-            "CTRL-Z": "",
-            "Editor Help": "",
-            "ENTER": "",
-            "Error Loading Xinha.  Developers, check the Error Console for information.": "",
-            "Georgia": "",
-            "Impact": "",
-            "Loading Core": "",
-            "Loading plugins": "",
-            "MS Word Cleaner": "",
-            "Select Color": "",
-            "SHIFT-ENTER": "",
-            "Tahoma": "",
-            "Times New Roman": "",
-            "Touch here first to activate editor.": "",
-            "Verdana": "",
-            "Waiting for Iframe to load...": "",
-            "WingDings": "",
-            "Xinha": ""
-        },
-        "BackgroundImage": {
-            "__ TRANSLATOR NOTE __": "*** BACKGROUNDIMAGE IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***",
-            "Remove Current Background": "",
-            "Set Background": "",
-            "Set page background image": "",
-            "Set Page Background Image": ""
-        },
-        "ClientsideSpellcheck": {
-            "__ TRANSLATOR NOTE __": "*** CLIENTSIDESPELLCHECK IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***",
-            "Spell Check using ieSpell": ""
-        },
-        "ExtendedFileManager": {
-            "__ TRANSLATOR NOTE __": "*** EXTENDEDFILEMANAGER IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***",
-            "10%": "",
-            "100%": "",
-            "200%": "",
-            "25%": "",
-            "50%": "",
-            "75%": "",
-            ">List View": "",
-            ">Thumbnail View": "",
-            "A:": "",
-            "Alt": "",
-            "Border Color": "",
-            "D:": "",
-            "File List": "",
-            "File Manager": "",
-            "Filesize:": "",
-            "Folder": "",
-            "GIF": "",
-            "H:": "",
-            "Image Editor": "",
-            "Image Selection": "",
-            "Maximum folder size limit reached. Upload disabled.": "",
-            "No Files Found": "",
-            "Please enter value": "",
-            "PNG": "",
-            "Preset": "",
-            "Rename": "",
-            "Rotate 180 &deg;": "",
-            "Rotate 90 &deg; CCW": "",
-            "Rotate 90 &deg; CW": "",
-            "Target Window": "",
-            "Toggle marker color": "",
-            "X:": "",
-            "Xinha Image Editor": "",
-            "Y:": "",
-            "Zoom": "",
-            "Insert File Link": "<<MootoolsFileManager>>",
-            "You must select some text before making a new link.": "<<Linker>>"
-        },
-        "Filter": {
-            "__ TRANSLATOR NOTE __": "*** FILTER IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***",
-            "Filter": "<<InsertSnippet2>>"
-        },
-        "HtmlTidy": {
-            "__ TRANSLATOR NOTE __": "*** HTMLTIDY IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***",
-            "Auto-Tidy": "",
-            "Don't Tidy": "",
-            "HTML Tidy": "",
-            "Tidy failed.  Check your HTML for syntax errors.": ""
-        },
-        "ImageManager": {
-            "__ TRANSLATOR NOTE __": "*** IMAGEMANAGER IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***",
-            "Flickr Picture List": "",
-            "Flickr Pictures": "",
-            "Flickr Selection": "",
-            "Flickr Username/Email": "",
-            "Image List": "",
-            "Keyword": "",
-            "No Photos Found": "",
-            "No Videos Found": "",
-            "This Server": "",
-            "YouTube Selection": "",
-            "YouTube Username": "",
-            "YouTube Video List": "",
-            "YouTube Videos": "",
-            "A:": "<<ExtendedFileManager>>",
-            "D:": "<<ExtendedFileManager>>",
-            "GIF": "<<ExtendedFileManager>>",
-            "H:": "<<ExtendedFileManager>>",
-            "Image Editor": "<<ExtendedFileManager>>",
-            "Image Selection": "<<ExtendedFileManager>>",
-            "PNG": "<<ExtendedFileManager>>",
-            "Rotate 180 &deg;": "<<ExtendedFileManager>>",
-            "Rotate 90 &deg; CCW": "<<ExtendedFileManager>>",
-            "Rotate 90 &deg; CW": "<<ExtendedFileManager>>",
-            "X:": "<<ExtendedFileManager>>",
-            "Y:": "<<ExtendedFileManager>>"
-        },
-        "InsertMarquee": {
-            "__ TRANSLATOR NOTE __": "*** INSERTMARQUEE IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***",
-            "Alternate": "",
-            "Background-Color:": "",
-            "Behavior:": "",
-            "Continuous": "",
-            "Direction:": "",
-            "Insert scrolling marquee": "",
-            "Marquee Editor": "",
-            "Scroll Amount:": "",
-            "Scroll Delay:": "",
-            "Slide": "",
-            "Speed Control": "",
-            "Name": "<<Forms>>",
-            "Name/ID:": "<<Forms>>",
-            "Text:": "<<Forms>>"
-        },
-        "InsertPicture": {
-            "__ TRANSLATOR NOTE __": "*** INSERTPICTURE IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***",
-            "Enter the image URL here": "",
-            "Leave empty for not defined": "",
-            " Open file in new window": "",
-            "Open file in new window": "",
-            "Upload file": "",
-            "Size": "<<Forms>>"
-        },
-        "NoteServer": {
-            "__ TRANSLATOR NOTE __": "*** NOTESERVER IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***",
-            "120%": "",
-            "150%": "",
-            "80%": "",
-            "Add GUIDO Code in a textbox on the page": "",
-            "Add MIDI link to allow students to hear the music": "",
-            "Format": "",
-            "Guido code": "",
-            "GUIDO Code": "",
-            "Image in applet": "",
-            "Insert GUIDO Music Notation": "",
-            "MIDI File": "",
-            "Source Code": "",
-            "With Mozilla, the applet will not be visible in editor, but only in Web page after submitting.": "",
-            "Zoom :": "",
-            "100%": "<<ExtendedFileManager>>",
-            "Options": "<<FindReplace>>",
-            "Zoom": "<<ExtendedFileManager>>"
-        },
-        "PSLocal": {
-            "__ TRANSLATOR NOTE __": "*** PSLOCAL IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***",
-            "Confirm": "",
-            "Enable": "",
-            "Enable Gears in order to use local document storage and configuration.": "",
-            "Enabling Local Storage": "",
-            "Install": "",
-            "Learn About Local Storage": "",
-            "This will reload the page, causing you to lose any unsaved work.  Press \"OK\" to reload.": "",
-            "Xinha uses Google Gears to enable local document storage.  With Gears installed, you can save drafts of your documents on your hard drive, configure Xinha to look the way you want, and carry this information wherever you use Xinha on the web.": ""
-        },
-        "PSServer": {
-            "__ TRANSLATOR NOTE __": "*** PSSERVER IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***",
-            "File: ": "",
-            "Import": ""
-        },
-        "PersistentStorage": {
-            "__ TRANSLATOR NOTE __": "*** PERSISTENTSTORAGE IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***",
-            "Details": "",
-            "File Browser": "",
-            "Hello    There C ": "",
-            "Hello  There A ": "",
-            "Hello \" There B \"": "",
-            "Hello ' There D '": "",
-            "List of Places": "",
-            "New Document": "",
-            "Open": "",
-            "Open Document": "",
-            "Places": "",
-            "Please enter the name of the directory you'd like to create.": "",
-            "Save Document": "",
-            "This will erase any unsaved content.  If you're certain, please click OK to continue.": "",
-            "Web URL": "",
-            "Confirm": "<<PSLocal>>",
-            "File List": "<<ExtendedFileManager>>",
-            "File Manager": "<<ExtendedFileManager>>",
-            "Insert": "<<InsertNote>>",
-            "You must select some text before making a new link.": "<<Linker>>"
-        },
-        "SpellChecker": {
-            "__ TRANSLATOR NOTE __": "*** SPELLCHECKER IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***",
-            "Dictionary": "",
-            "Finished list of mispelled words": "",
-            "HTMLArea Spell Checker": "",
-            "I will open it in a new page.": "",
-            "Ignore": "",
-            "Ignore all": "",
-            "Info": "",
-            "Learn": "",
-            "No mispelled words found with the selected dictionary.": "",
-            "Original word": "",
-            "Please confirm that you want to open this link": "",
-            "Please wait.  Calling spell checker.": "",
-            "Please wait: changing dictionary to": "",
-            "pliz weit ;-)": "",
-            "Re-check": "",
-            "Replace": "",
-            "Replace all": "",
-            "Revert": "",
-            "Spell Checker": "",
-            "Spell-check": "",
-            "Suggestions": "",
-            "This will drop changes and quit spell checker.  Please confirm.": "",
-            "Replace with": "<<FindReplace>>"
-        },
-        "Template": {
-            "__ TRANSLATOR NOTE __": "*** TEMPLATE IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***",
-            "Insert template": ""
-        },
-        "UnFormat": {
-            "__ TRANSLATOR NOTE __": "*** UNFORMAT IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***",
-            "All": "",
-            "All HTML:": "",
-            "Cleaning Area": "",
-            "Cleaning options": "",
-            "Formatting:": "",
-            "Page Cleaner": "",
-            "Select which types of formatting you would like to remove.": "",
-            "Selection": ""
-        }
-    }
-}
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/lang/merged/eu.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/lang/merged/eu.js
deleted file mode 100644
index f6295ff..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/lang/merged/eu.js
+++ /dev/null
@@ -1,1571 +0,0 @@
-// Xinha Language Combined Translation File
-//
-// LANG: "eu", ENCODING: UTF-8
-//
-// INSTRUCTIONS TO TRANSLATORS
-// ===========================================================================
-//
-// Your translation must be in UTF-8 Character Encoding.
-//
-// This is a JSON encoded file (plus comments), strings should be double-quote
-// only, do not use single quotes to surround strings - "hello", not 'hello'
-// do not have a trailing comma after the last entry in a section.
-//
-// Only full line comments are allowed (that a comments occupy entire lines).
-//
-// Search for the __NEW_TRANSLATIONS__ section below, this is where you will
-// want to focus, this section includes things that do not presently have a 
-// translation or for which the translation needs to be checked for accuracy.
-//
-// In the New Translations section a translation string is one of the following
-//
-//  "English String Here" : ""
-//     This means it is not translated yet, add your translation...
-//     "English String Here" : "Klingon String Here"
-//
-//  "English String Here" : "Translated String Here"
-//     This means that an existing translation for this string, in some other
-//     section has been found, and used.  Check that it is approprite for this
-//     section and if it is, that's fine leave it as is, otherwise change as
-//     appropriate.
-//
-//  "English String Here" : "<<AnotherSection>>"
-//     This means use the same translation for this string as <<AnotherSection>>
-//     this saves you re-tranlating strings.  If the Context of this section
-//     and the context of AnotherSection seem the same, that's fine leave it
-//     using that translation, but if this section needs a different translation, 
-//     you can provide it by replacing the link (<<AnotherSection>>) with that
-//     new translation.  For example - a "Table" in say "DataPlugin" is 
-//     perhaps translated differently to "Table" in "FurniturePlugin".
-//
-// TESTING YOUR TRANSLATION
-// ===========================================================================
-// Simply place your translation file on your webserver somewhere for example
-//
-//   /xinha/lang/merged/eu.js
-//
-// and then tell Xinha where to get it (before loading XinhaCore.js) by 
-//
-//  _editor_lang              = 'eu';
-//  _editor_lang_merged_file  = '/xinha/lang/merged/eu.js';
-//
-// Xinha will load your new language definition.
-//
-// SUBMITTING YOUR TRANSLATION
-// ===========================================================================
-// Simply create a Ticket on the Xinha website and attach your translation 
-// file.
-//
-// The Xinha developers will take your file and use the 
-//     contrib/lc_split_merged_file.php
-// script to load it into the Xinha distribution.
-
-{
-    "Abbreviation": {
-        "Cancel": "Utzi",
-        "OK": "Ados"
-    },
-    "AboutBox": {
-        "About this editor": "Editoreari buruz...",
-        "Close": "Itxi"
-    },
-    "BackgroundImage": {
-        "Cancel": "Utzi"
-    },
-    "ColorPicker": {
-        "Click a color...": "Kolore bat aukeratu...",
-        "Close": "Itxi",
-        "Color: ": "Kolorea: ",
-        "OK": "Ados",
-        "Sample": "Lagina",
-        "Web Safe: ": "Web Safe: "
-    },
-    "ContextMenu": {
-        "Justify Center": "Zentratu",
-        "Justify Full": "Justifikatu",
-        "Justify Left": "Ezkerretara lerrokatu",
-        "Justify Right": "Eskuinetara lerrokatu"
-    },
-    "CreateLink": {
-        "Cancel": "Utzi",
-        "Insert/Modify Link": "Lotura txertatu/aldatu",
-        "New window (_blank)": "Lehio berrian (_blank)",
-        "None (use implicit)": "Bat ere ez (implizituki erabili)",
-        "OK": "Ados",
-        "Other": "Beste bat",
-        "Same frame (_self)": "Frame berean (_self)",
-        "Target:": "Helburua:",
-        "Title (tooltip):": "Izenburua (argibidea):",
-        "Top frame (_top)": "Goiko frame-an (_top)",
-        "URL:": "URL-a:"
-    },
-    "EditTag": {
-        "Cancel": "Utzi",
-        "OK": "Ados"
-    },
-    "Equation": {
-        "Cancel": "Utzi",
-        "OK": "Ados",
-        "Preview": "Aurrebista"
-    },
-    "ExtendedFileManager": {
-        "Absbottom": "Irudiaren behekaldean",
-        "Absmiddle": "Irudiaren erdian",
-        "Baseline": "Irudiaren oinean",
-        "Bottom": "Behean",
-        "Cancel": "Utzi",
-        "Left": "Ezkerretara",
-        "Middle": "Erdian",
-        "New window (_blank)": "Lehio berrian (_blank)",
-        "None (use implicit)": "Bat ere ez (implizituki erabili)",
-        "Not set": "Ez gaitua",
-        "OK": "Ados",
-        "Positioning of this image": "Irudiaren kokapena",
-        "Preview": "Aurrebista",
-        "Right": "Eskuinetara",
-        "Same frame (_self)": "Frame berean (_self)",
-        "Texttop": "Irudiaren goialdean",
-        "Title (tooltip)": "Izenburua (argibidea):",
-        "Top": "Goian",
-        "Top frame (_top)": "Goiko frame-an (_top)",
-        "Width": "Zabalera:",
-        "Width:": "Zabalera:"
-    },
-    "Forms": {
-        "Cancel": "Utzi",
-        "Image URL:": "Irudiaren URL-a:",
-        "OK": "Ados",
-        "Rows:": "Lerroak:"
-    },
-    "FullPage": {
-        "Cancel": "Utzi",
-        "OK": "Ados"
-    },
-    "HorizontalRule": {
-        "Alignment:": "Lerrokatzea:",
-        "Cancel": "Utzi",
-        "Horizontal Rule": "Marra horizontala",
-        "Layout": "Diseinua",
-        "Left": "Ezkerretara",
-        "OK": "Ados",
-        "Right": "Eskuinetara",
-        "Width:": "Zabalera:"
-    },
-    "ImageManager": {
-        "Absbottom": "Irudiaren behekaldean",
-        "Absmiddle": "Irudiaren erdian",
-        "Baseline": "Irudiaren oinean",
-        "Bottom": "Behean",
-        "Cancel": "Utzi",
-        "Insert Image": "Irudia txertatu",
-        "Left": "Ezkerretara",
-        "Middle": "Erdian",
-        "Not set": "Ez gaitua",
-        "OK": "Ados",
-        "Positioning of this image": "Irudiaren kokapena",
-        "Right": "Eskuinetara",
-        "Texttop": "Irudiaren goialdean",
-        "Top": "Goian",
-        "Width:": "Zabalera:"
-    },
-    "InlineStyler": {
-        "Baseline": "Irudiaren oinean",
-        "Bottom": "Behean",
-        "Image URL": "Irudiaren URL-a:",
-        "Layout": "Diseinua",
-        "Left": "Ezkerretara",
-        "Middle": "Erdian",
-        "Right": "Eskuinetara",
-        "Top": "Goian",
-        "Width": "Zabalera:"
-    },
-    "InsertAnchor": {
-        "Cancel": "Utzi",
-        "OK": "Ados"
-    },
-    "InsertImage": {
-        "Absbottom": "Irudiaren behekaldean",
-        "Absmiddle": "Irudiaren erdian",
-        "Alignment:": "Lerrokatzea:",
-        "Alternate text:": "Testu alternatiboa:",
-        "Baseline": "Irudiaren oinean",
-        "Border thickness:": "Ertzaren lodiera:",
-        "Bottom": "Behean",
-        "Cancel": "Utzi",
-        "Enter the image URL here": "Idatz ezazu irudiaren URL-a hemen",
-        "For browsers that don't support images": "Irudirik onartzen ez duten nabigatzaileentzat",
-        "Horizontal padding": "Betegarri horizontala",
-        "Horizontal:": "Horizontala:",
-        "Image Preview:": "Irudiaren aurrebista:",
-        "Image URL:": "Irudiaren URL-a:",
-        "Insert Image": "Irudia txertatu",
-        "Layout": "Diseinua",
-        "Leave empty for no border": "Uztazu hutsik ertzik ez sortzeko",
-        "Left": "Ezkerretara",
-        "Middle": "Erdian",
-        "Not set": "Ez gaitua",
-        "OK": "Ados",
-        "Positioning of this image": "Irudiaren kokapena",
-        "Preview": "Aurrebista",
-        "Preview the image in a new window": "Aurreikusi irudia beste lehio batean",
-        "Right": "Eskuinetara",
-        "Spacing": "Tartea",
-        "Texttop": "Irudiaren goialdean",
-        "Top": "Goian",
-        "Vertical padding": "Betegarri bertikala",
-        "Vertical:": "Bertikala:",
-        "You must enter the URL": "URL-a idatzi behar duzu"
-    },
-    "InsertMarquee": {
-        "Cancel": "Utzi",
-        "Left": "Ezkerretara",
-        "OK": "Ados",
-        "Right": "Eskuinetara",
-        "Width:": "Zabalera:"
-    },
-    "InsertNote": {
-        "Cancel": "Utzi"
-    },
-    "InsertPicture": {
-        "Absbottom": "Irudiaren behekaldean",
-        "Absmiddle": "Irudiaren erdian",
-        "Alignment:": "Lerrokatzea:",
-        "Alternate text:": "Testu alternatiboa:",
-        "Baseline": "Irudiaren oinean",
-        "Border thickness:": "Ertzaren lodiera:",
-        "Bottom": "Behean",
-        "Cancel": "Utzi",
-        "Enter the image URL here": "Idatz ezazu irudiaren URL-a hemen",
-        "For browsers that don't support images": "Irudirik onartzen ez duten nabigatzaileentzat",
-        "Horizontal padding": "Betegarri horizontala",
-        "Horizontal:": "Horizontala:",
-        "Image Preview:": "Irudiaren aurrebista:",
-        "Image URL:": "Irudiaren URL-a:",
-        "Insert Image": "Irudia txertatu",
-        "Layout": "Diseinua",
-        "Leave empty for no border": "Uztazu hutsik ertzik ez sortzeko",
-        "Left": "Ezkerretara",
-        "Middle": "Erdian",
-        "Not set": "Ez gaitua",
-        "OK": "Ados",
-        "Positioning of this image": "Irudiaren kokapena",
-        "Preview": "Aurrebista",
-        "Preview the image in a new window": "Aurreikusi irudia beste lehio batean",
-        "Right": "Eskuinetara",
-        "Spacing": "Tartea",
-        "Texttop": "Irudiaren goialdean",
-        "Top": "Goian",
-        "Vertical padding": "Betegarri bertikala",
-        "Vertical:": "Bertikala:",
-        "Width:": "Zabalera:"
-    },
-    "InsertSnippet": {
-        "Cancel": "Utzi"
-    },
-    "InsertSnippet2": {
-        "Cancel": "Utzi"
-    },
-    "InsertTable": {
-        "Absbottom": "Irudiaren behekaldean",
-        "Absmiddle": "Irudiaren erdian",
-        "Alignment:": "Lerrokatzea:",
-        "Baseline": "Irudiaren oinean",
-        "Border thickness:": "Ertzaren lodiera:",
-        "Bottom": "Behean",
-        "Cancel": "Utzi",
-        "Cell padding:": "Gelaxkaren betegarria:",
-        "Cell spacing:": "Gelaxka-tartea:",
-        "Cols:": "Zutabeak:",
-        "Em": "Em",
-        "Fixed width columns": "Zabalera finkodun zutabeak",
-        "Insert Table": "Taula txertatu",
-        "Layout": "Diseinua",
-        "Leave empty for no border": "Uztazu hutsik ertzik ez sortzeko",
-        "Left": "Ezkerretara",
-        "Middle": "Erdian",
-        "Not set": "Ez gaitua",
-        "Number of columns": "Zutabe-kopurua",
-        "Number of rows": "Lerro-kopurua",
-        "OK": "Ados",
-        "Percent": "Portzentaia",
-        "Pixels": "Pixelak",
-        "Positioning of this table": "Taula honen kokapena",
-        "Right": "Eskuinetara",
-        "Rows:": "Lerroak:",
-        "Space between adjacent cells": "Gelaxka auzokideen arteko tartea",
-        "Space between content and border in cell": "Gelaxkaren edukia eta ertzaren arteko tartea",
-        "Spacing": "Tartea",
-        "Texttop": "Irudiaren goialdean",
-        "Top": "Goian",
-        "Width of the table": "Taularen zabalera",
-        "Width unit": "Zabalera-unitatea",
-        "Width:": "Zabalera:",
-        "You must enter a number of columns": "Zutabe-kopurua idatzi behar duzu",
-        "You must enter a number of rows": "Lerro-kopurua idatzi behar duzu"
-    },
-    "Linker": {
-        "Cancel": "Utzi",
-        "Insert/Modify Link": "Lotura txertatu/aldatu",
-        "OK": "Ados",
-        "Target:": "Helburua:",
-        "URL:": "URL-a:"
-    },
-    "NoteServer": {
-        "Cancel": "Utzi",
-        "Image Preview": "Irudiaren aurrebista:",
-        "OK": "Ados",
-        "Preview": "Aurrebista",
-        "Preview the image in a new window": "Aurreikusi irudia beste lehio batean"
-    },
-    "Opera": {
-        "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."
-    },
-    "PSLocal": {
-        "Cancel": "Utzi"
-    },
-    "PasteText": {
-        "Cancel": "Utzi",
-        "OK": "Ados"
-    },
-    "PersistentStorage": {
-        "Cancel": "Utzi",
-        "Insert Image": "Irudia txertatu"
-    },
-    "QuickTag": {
-        "Cancel": "Utzi"
-    },
-    "SetId": {
-        "Cancel": "Utzi",
-        "OK": "Ados"
-    },
-    "SmartReplace": {
-        "OK": "Ados"
-    },
-    "SpellChecker": {
-        "Cancel": "Utzi",
-        "OK": "Ados"
-    },
-    "SuperClean": {
-        "Cancel": "Utzi",
-        "OK": "Ados"
-    },
-    "TableOperations": {
-        "Cancel": "Utzi",
-        "OK": "Ados",
-        "Rows": "Lerroak:",
-        "Spacing": "Tartea"
-    },
-    "Template": {
-        "Cancel": "Utzi"
-    },
-    "UnFormat": {
-        "Cancel": "Utzi",
-        "OK": "Ados"
-    },
-    "Xinha": {
-        "&#8212; format &#8212;": "&#8212; Formatua &#8212;",
-        "About this editor": "Editoreari buruz...",
-        "Address": "Helbidea",
-        "Background Color": "Atzeko kolorea",
-        "Bold": "Lodia",
-        "Bulleted List": "Zerrenda ez ordenatua",
-        "Clean content pasted from Word": "Word-etik itsatsitako edukia ezabatu",
-        "Clear Inline Font Specifications": "Ezabatu testuaren ezaugarriak",
-        "Clear MSOffice tags": "MSOffice etiketak ezabatu",
-        "Close": "Itxi",
-        "Constructing object": "Objektua eraikitzen",
-        "Copy selection": "Kopiatu hautaketa",
-        "Create Statusbar": "Egoera-barra sortu",
-        "Create Toolbar": "Tresna-barra sortu",
-        "Current style": "Uneko estiloa",
-        "Cut selection": "Ebaki hautaketa",
-        "Decrease Indent": "Koska handitu",
-        "Direction left to right": "Ezkerretik eskuinetarako norabidea",
-        "Direction right to left": "Eskuinetik ezkerretarako norabidea",
-        "Finishing": "Bukatzen",
-        "Font Color": "Testu-kolorea",
-        "Formatted": "Formateatua",
-        "Generate Xinha framework": "Xinha Framework sortzen",
-        "Heading 1": "Goiburua 1",
-        "Heading 2": "Goiburua 2",
-        "Heading 3": "Goiburua 3",
-        "Heading 4": "Goiburua 4",
-        "Heading 5": "Goiburua 5",
-        "Heading 6": "Goiburua 6",
-        "Headings": "Goiburuak",
-        "Help using editor": "Laguntza",
-        "Horizontal Rule": "Marra horizontala",
-        "Increase Indent": "Koska txikitu",
-        "Init editor size": "Editorearen hasierako neurria",
-        "Insert Table": "Taula txertatu",
-        "Insert Web Link": "Lotura txertatu",
-        "Insert/Modify Image": "Irudia txertatu",
-        "Insert/Overwrite": "Txertatu/Gainidatzi",
-        "Italic": "Etzana",
-        "Justify Center": "Zentratu",
-        "Justify Full": "Justifikatu",
-        "Justify Left": "Ezkerretara lerrokatu",
-        "Justify Right": "Eskuinetara lerrokatu",
-        "Keyboard shortcuts": "Laster-teklak",
-        "Loading in progress. Please wait!": "Kargatzen. Itxaron mesedez",
-        "Loading plugin $plugin": "$plugin plugina kargatzen",
-        "Normal": "Normala",
-        "Ordered List": "Zerrenda ordenatua",
-        "Paste from clipboard": "Itsatsi arbelean dagoena",
-        "Path": "Bidea",
-        "Print document": "Dokumentua inprimatu",
-        "Redoes your last action": "Berregin",
-        "Register plugin $plugin": "$plugin plugina erregistratu",
-        "Remove formatting": "Formatoa kendu",
-        "Save as": "Gorde honela:",
-        "Select all": "Dena aukeratu",
-        "Set format to paragraph": "Formatua ezarri paragrafoari",
-        "Split Block": "Blokea zatitu",
-        "Strikethrough": "Marratua",
-        "Subscript": "Azpindizea",
-        "Superscript": "Goi-indizea",
-        "The editor provides the following key combinations:": "Editoreak ondorengo tekla-konbinazioak eskaintzen ditu:",
-        "Toggle Borders": "Ertzak trukatu",
-        "Toggle HTML Source": "Ikusi dokumentua HTML-n",
-        "Underline": "Azpimarratua",
-        "Undoes your last action": "Desegin",
-        "Would you like to clear font colours?": "Letra-tipoen koloreak ezabatu nahi al dituzu?",
-        "Would you like to clear font sizes?": "Letra-tipoen neurriak ezabatu nahi al dituzu?",
-        "Would you like to clear font typefaces?": "Letra-tipoak ezabatu nahi al dituzu?",
-        "You are in TEXT MODE.  Use the [<>] button to switch back to WYSIWYG.": "TESTU eran ari zara. Erabil ezazu [<>] botoia WYSIWIG erara itzultzeko.",
-        "insert linebreak": "Lerro-jauzia txertatu",
-        "new paragraph": "Paragrafo berria"
-    },
-    "__NEW_TRANSLATIONS__": {
-        "Abbreviation": {
-            "Abbreviation": "",
-            "Delete": "",
-            "Expansion:": ""
-        },
-        "CharCounter": {
-            "... in progress": "",
-            "Chars": "",
-            "HTML": "",
-            "Words": ""
-        },
-        "CharacterMap": {
-            "Insert special character": ""
-        },
-        "ContextMenu": {
-            "_Delete Row": "",
-            "_Image Properties...": "",
-            "_Modify Link...": "",
-            "_Remove Link...": "",
-            "_Table Properties...": "",
-            "C_ell Properties...": "",
-            "Chec_k Link...": "",
-            "Copy": "",
-            "Create a link": "",
-            "Current URL is": "",
-            "Cut": "",
-            "De_lete Column": "",
-            "Delete Cell": "",
-            "Delete the current column": "",
-            "Delete the current row": "",
-            "How did you get here? (Please report!)": "",
-            "I_nsert Row Before": "",
-            "In_sert Row After": "",
-            "Insert _Column Before": "",
-            "Insert a new column after the current one": "",
-            "Insert a new column before the current one": "",
-            "Insert a new row after the current one": "",
-            "Insert a new row before the current one": "",
-            "Insert a paragraph after the current node": "",
-            "Insert a paragraph before the current node": "",
-            "Insert C_olumn After": "",
-            "Insert Cell After": "",
-            "Insert Cell Before": "",
-            "Insert paragraph after": "",
-            "Insert paragraph before": "",
-            "Link points to:": "",
-            "Make lin_k...": "",
-            "Merge Cells": "",
-            "Opens this link in a new window": "",
-            "Paste": "",
-            "Please confirm that you want to remove this element:": "",
-            "Please confirm that you want to unlink this element.": "",
-            "Remove the $elem Element...": "",
-            "Remove this node from the document": "",
-            "Ro_w Properties...": "",
-            "Show the image properties dialog": "",
-            "Show the Table Cell Properties dialog": "",
-            "Show the Table Properties dialog": "",
-            "Show the Table Row Properties dialog": "",
-            "Unlink the current element": ""
-        },
-        "CreateLink": {
-            "Are you sure you wish to remove this link?": "",
-            "You need to select some text before creating a link": ""
-        },
-        "DefinitionList": {
-            "definition description": "",
-            "definition list": "",
-            "definition term": ""
-        },
-        "Dialogs": {
-            "Some Text Here": ""
-        },
-        "DynamicCSS": {
-            "Choose stylesheet": "",
-            "Default": "",
-            "Undefined": ""
-        },
-        "EditTag": {
-            "Edit HTML for selected text": "",
-            "Edit Tag By Peg": "",
-            "Tag Editor": ""
-        },
-        "Equation": {
-            "!=": "",
-            "!in": "",
-            "&gt;-": "",
-            "&gt;=": "",
-            "&lt;=": "",
-            "&lt;=&gt;": "",
-            "&lt;x&gt;": "",
-            "&nbsp; `!` &nbsp;": "",
-            "&nbsp; `.` &nbsp;": "",
-            "&nbsp; `0` &nbsp;": "",
-            "&nbsp; `2` &nbsp;": "",
-            "&nbsp; `3` &nbsp;": "",
-            "&nbsp; `4` &nbsp;": "",
-            "&nbsp; `5` &nbsp;": "",
-            "&nbsp; `6` &nbsp;": "",
-            "&nbsp; `7` &nbsp;": "",
-            "&nbsp; `8` &nbsp;": "",
-            "&nbsp; `9` &nbsp;": "",
-            "&nbsp; `e` &nbsp;": "",
-            "&nbsp;&nbsp;`1` &nbsp;": "",
-            "&nbsp;`+{::}`&nbsp;": "",
-            "&nbsp;`-:\\ `": "",
-            "&nbsp;`-{::}`&nbsp;": "",
-            "&nbsp;`C`&nbsp;": "",
-            "&nbsp;`cos`": "",
-            "&nbsp;`ln`&nbsp;": "",
-            "&nbsp;`pi` &nbsp;": "",
-            "&nbsp;`sin`": "",
-            "&nbsp;`tan`": "",
-            "&nbsp;`times`&nbsp;": "",
-            "&quot;text&quot;": "",
-            "'+formula+'": "",
-            "((n),(k))": "",
-            "(x+1)/(x-1)": "",
-            "*": "",
-            "**": "",
-            "+-": "",
-            "-&gt;": "",
-            "-&lt;": "",
-            "-:": "",
-            "-=": "",
-            "//": "",
-            "/_": "",
-            ":.": "",
-            "=&gt;": "",
-            "@": "",
-            "[[a,b],[c,d]]": "",
-            "\\\\": "",
-            "\\nClick in the box to use your keyboard or use the buttons\\n": "",
-            "^^": "",
-            "^^^": "",
-            "__|": "",
-            "_|_": "",
-            "`!=`": "",
-            "`!in`": "",
-            "`&and;`": "",
-            "`&cap;`": "",
-            "`&cup;`": "",
-            "`&gt;-`": "",
-            "`&gt;=`": "",
-            "`&lt;=&gt;`": "",
-            "`&lt;=`": "",
-            "`&lt;x&gt;`": "",
-            "`&or;`": "",
-            "`&quot;text&quot;`": "",
-            "`((n),(k))`": "",
-            "`(x+1)/(x-1)`": "",
-            "`**`": "",
-            "`*`": "",
-            "`+-`": "",
-            "`-&gt;`": "",
-            "`-&lt;`": "",
-            "`-:`": "",
-            "`-=`": "",
-            "`//`": "",
-            "`/_`": "",
-            "`:.`": "",
-            "`=&gt;`": "",
-            "`@`": "",
-            "`[[a,b],[c,d]]`": "",
-            "`\\\\`": "",
-            "`__|`": "",
-            "`_|_`": "",
-            "`AA`": "",
-            "`aleph`": "",
-            "`alpha`": "",
-            "`and`": "",
-            "`bara`": "",
-            "`bba`": "",
-            "`bbba`": "",
-            "`beta`": "",
-            "`CC`": "",
-            "`cca`": "",
-            "`chi`": "",
-            "`darr`": "",
-            "`ddota`": "",
-            "`del`": "",
-            "`Delta`": "",
-            "`delta`": "",
-            "`diamond`": "",
-            "`dota`": "",
-            "`dy/dx`": "",
-            "`EE`": "",
-            "`epsi`": "",
-            "`eta`": "",
-            "`fra`": "",
-            "`Gamma`": "",
-            "`gamma`": "",
-            "`grad`": "",
-            "`harr`": "",
-            "`hArr`": "",
-            "`hata`": "",
-            "`if`": "",
-            "`in`": "",
-            "`int`": "",
-            "`iota`": "",
-            "`kappa`": "",
-            "`lambda`": "",
-            "`Lambda`": "",
-            "`lArr`": "",
-            "`larr`": "",
-            "`lim_(x-&gt;oo)`": "",
-            "`log`": "",
-            "`mu`": "",
-            "`NN`": "",
-            "`nn`": "",
-            "`not`": "",
-            "`nu`": "",
-            "`o+`": "",
-            "`o.`": "",
-            "`O/`": "",
-            "`oint`": "",
-            "`omega`": "",
-            "`Omega`": "",
-            "`oo`": "",
-            "`or`": "",
-            "`ox`": "",
-            "`Phi`": "",
-            "`phi`": "",
-            "`Pi`": "",
-            "`pi`": "",
-            "`prod`": "",
-            "`prop`": "",
-            "`Psi`": "",
-            "`psi`": "",
-            "`QQ`": "",
-            "`quad`": "",
-            "`rArr`": "",
-            "`rho`": "",
-            "`root(n)(x)`": "",
-            "`RR`": "",
-            "`sfa`": "",
-            "`sigma`": "",
-            "`Sigma`": "",
-            "`sqrt(x)`": "",
-            "`square`": "",
-            "`stackrel(-&gt;)(+)`": "",
-            "`sub`": "",
-            "`sube`": "",
-            "`sum`": "",
-            "`sup`": "",
-            "`supe`": "",
-            "`tau`": "",
-            "`Theta`": "",
-            "`theta`": "",
-            "`TT`": "",
-            "`tta`": "",
-            "`uarr`": "",
-            "`ula`": "",
-            "`upsilon`": "",
-            "`uu`": "",
-            "`veca`": "",
-            "`vv`": "",
-            "`x_(mn)`": "",
-            "`Xi`": "",
-            "`xi`": "",
-            "`xx`": "",
-            "`zeta`": "",
-            "`ZZ`": "",
-            "`|-&gt;`": "",
-            "`|--`": "",
-            "`|==`": "",
-            "`|__`": "",
-            "`|~`": "",
-            "`~=`": "",
-            "`~|`": "",
-            "`~~`": "",
-            "AA": "",
-            "aleph": "",
-            "alpha": "",
-            "and": "",
-            "AsciiMath Formula Input": "",
-            "AsciiMathML Example": "",
-            "bara": "",
-            "Based on ASCIIMathML by": "",
-            "bba": "",
-            "bbba": "",
-            "beta": "",
-            "CC": "",
-            "cca": "",
-            "chi": "",
-            "darr": "",
-            "ddota": "",
-            "del": "",
-            "Delta": "",
-            "delta": "",
-            "diamond": "",
-            "dota": "",
-            "dy/dx": "",
-            "EE": "",
-            "epsi": "",
-            "eta": "",
-            "For more information on AsciiMathML visit this page:": "",
-            "Formula Editor": "",
-            "fra": "",
-            "gamma": "",
-            "Gamma": "",
-            "grad": "",
-            "hArr": "",
-            "harr": "",
-            "hata": "",
-            "if": "",
-            "in": "",
-            "Input": "",
-            "int": "",
-            "int_a^bf(x)dx": "",
-            "iota": "",
-            "kappa": "",
-            "Lambda": "",
-            "lambda": "",
-            "larr": "",
-            "lArr": "",
-            "lim_(x-&gt;oo)": "",
-            "mu": "",
-            "NN": "",
-            "nn": "",
-            "nnn": "",
-            "not": "",
-            "nu": "",
-            "o+": "",
-            "o.": "",
-            "O/": "",
-            "oint": "",
-            "omega": "",
-            "Omega": "",
-            "oo": "",
-            "or": "",
-            "ox": "",
-            "Phi": "",
-            "phi": "",
-            "pi": "",
-            "Pi": "",
-            "prod": "",
-            "prop": "",
-            "psi": "",
-            "Psi": "",
-            "QQ": "",
-            "quad": "",
-            "rArr": "",
-            "rho": "",
-            "root(n)(x)": "",
-            "RR": "",
-            "sfa": "",
-            "sigma": "",
-            "Sigma": "",
-            "sqrt(x)": "",
-            "square": "",
-            "stackrel(-&gt;)(+)": "",
-            "sub": "",
-            "sube": "",
-            "sum": "",
-            "sum_(n=1)^oo": "",
-            "sup": "",
-            "supe": "",
-            "tau": "",
-            "Theta": "",
-            "theta": "",
-            "TT": "",
-            "tta": "",
-            "uarr": "",
-            "ula": "",
-            "upsilon": "",
-            "uu": "",
-            "uuu": "",
-            "veca": "",
-            "vv": "",
-            "vvv": "",
-            "x^(m+n)": "",
-            "x_(mn)": "",
-            "Xi": "",
-            "xi": "",
-            "xx": "",
-            "zeta": "",
-            "ZZ": "",
-            "|-&gt;": "",
-            "|--": "",
-            "|==": "",
-            "|__": "",
-            "|~": "",
-            "~=": "",
-            "~|": "",
-            "~~": ""
-        },
-        "FancySelects": {
-            "'+opt.text+'": ""
-        },
-        "FindReplace": {
-            "';\r\n  var tagc = '": "",
-            "Case sensitive search": "",
-            "Clear": "",
-            "Done": "",
-            "Enter the text you want to find": "",
-            "Find and Replace": "",
-            "found item": "",
-            "found items": "",
-            "Highlight": "",
-            "Inform a replacement word": "",
-            "Next": "",
-            "not found": "",
-            "Options": "",
-            "Replace with:": "",
-            "replaced item": "",
-            "replaced items": "",
-            "Search for:": "",
-            "Substitute all occurrences": "",
-            "Substitute this occurrence?": "",
-            "Undo": "",
-            "Whole words only": ""
-        },
-        "FormOperations": {
-            "Enter the name for new option.": "",
-            "Form Editor": "",
-            "Insert a check box.": "",
-            "Insert a Form.": "",
-            "Insert a multi-line text field.": "",
-            "Insert a radio button.": "",
-            "Insert a select field.": "",
-            "Insert a submit/reset button.": "",
-            "Insert a text, password or hidden field.": "",
-            "Message Sent": "",
-            "Please Select...": ""
-        },
-        "Forms": {
-            "'onClick'=": "",
-            "Access Key:": "",
-            "Action URL:": "",
-            "Button Script": "",
-            "Checked": "",
-            "Columns:": "",
-            "Default text (optional)": "",
-            "Dimensions": "",
-            "Disabled": "",
-            "Encoding:": "",
-            "For Control:": "",
-            "Form": "",
-            "Form Element: FIELDSET": "",
-            "Form Element: INPUT": "",
-            "Form Element: LABEL": "",
-            "Form Element: SELECT": "",
-            "Form Element: TEXTAREA": "",
-            "Form handler script": "",
-            "Form Name:": "",
-            "Get": "",
-            "Hard": "",
-            "Height in number of rows": "",
-            "HTML-Form to CGI (default)": "",
-            "Image source": "",
-            "Initial Text:": "",
-            "Insert/Edit Form": "",
-            "Insert/Edit Form Element FIELDSET": "",
-            "Insert/Edit Form Element INPUT": "",
-            "Insert/Edit Form Element LABEL": "",
-            "Insert/Edit Form Element SELECT": "",
-            "Insert/Edit Form Element TEXTAREA": "",
-            "Javascript for button click": "",
-            "Label:": "",
-            "Legend:": "",
-            "Max length:": "",
-            "Maximum number of characters accepted": "",
-            "Method:": "",
-            "multipart Form Data (File-Upload)": "",
-            "Name": "",
-            "Name of the form input": "",
-            "Name of the form select": "",
-            "name of the textarea": "",
-            "Name/ID:": "",
-            "normal": "",
-            "nowrap": "",
-            "Off": "",
-            "Physical": "",
-            "Please enter a Label": "",
-            "Post": "",
-            "pre": "",
-            "Read Only": "",
-            "Size of text box in characters": "",
-            "Size:": "",
-            "Soft": "",
-            "Tab Index:": "",
-            "Target Frame:": "",
-            "Text:": "",
-            "URL of image": "",
-            "Value of the form input": "",
-            "Value:": "",
-            "Virtual": "",
-            "Width in number of characters": "",
-            "Wrap Mode:": "",
-            "You must enter a Name": "",
-            "Options": "<<FindReplace>>"
-        },
-        "FullPage": {
-            "...": "",
-            "Alternate style-sheet:": "",
-            "Background color:": "",
-            "Character set:": "",
-            "cyrillic (ISO-8859-5)": "",
-            "cyrillic (KOI8-R)": "",
-            "cyrillic (WINDOWS-1251)": "",
-            "Description:": "",
-            "DOCTYPE:": "",
-            "Document properties": "",
-            "Document title:": "",
-            "Keywords:": "",
-            "Primary style-sheet:": "",
-            "Text color:": "",
-            "UTF-8 (recommended)": "",
-            "western (ISO-8859-1)": ""
-        },
-        "FullScreen": {
-            "Maximize/Minimize Editor": ""
-        },
-        "Gecko": {
-            "The Paste button does not work in this browser for security reasons. Press CTRL-V on your keyboard to paste directly.": ""
-        },
-        "HorizontalRule": {
-            "&#x00d7;": "",
-            "&nbsp;": "",
-            "Center": "",
-            "Color:": "",
-            "Height:": "",
-            "Insert/edit horizontal rule": "",
-            "Insert/Edit Horizontal Rule": "",
-            "No shading": "",
-            "percent": "",
-            "pixels": "",
-            "Style": ""
-        },
-        "InlineStyler": {
-            "Background": "",
-            "Border": "",
-            "Char": "",
-            "Collapsed borders": "",
-            "CSS Style": "",
-            "FG Color": "",
-            "Float": "",
-            "Justify": "",
-            "Margin": "",
-            "None": "",
-            "Padding": "",
-            "Text align": "",
-            "Vertical align": "",
-            "-": "<<Equation>>",
-            "Center": "<<HorizontalRule>>",
-            "Height": "<<HorizontalRule>>",
-            "percent": "<<HorizontalRule>>",
-            "pixels": "<<HorizontalRule>>"
-        },
-        "InsertAnchor": {
-            "Anchor name": "",
-            "Insert Anchor": "",
-            "Delete": "<<Abbreviation>>"
-        },
-        "InsertNote": {
-            "Insert": "",
-            "Insert footnote": "",
-            "Insert Note": ""
-        },
-        "InsertPagebreak": {
-            "Page break": "",
-            "Page Break": ""
-        },
-        "InsertSmiley": {
-            "Insert Smiley": ""
-        },
-        "InsertSnippet": {
-            "\\n  This is an information about something\\n": "",
-            "Hide preview": "",
-            "Insert as": "",
-            "Insert Snippet": "",
-            "InsertSnippet for Xinha": "",
-            "Link1": "",
-            "Link2": "",
-            "Link3": "",
-            "Link4": "",
-            "Link5": "",
-            "Show preview": "",
-            "This is an information about something": "",
-            "Variable": ""
-        },
-        "InsertSnippet2": {
-            "All Categories": "",
-            "Filter": "",
-            "Insert as HTML": "",
-            "Insert as template variable": "",
-            "Only search word beginning": "",
-            "HTML": "<<CharCounter>>",
-            "Insert Snippet": "<<InsertSnippet>>",
-            "InsertSnippet for Xinha": "<<InsertSnippet>>",
-            "Variable": "<<InsertSnippet>>"
-        },
-        "InsertTable": {
-            "Caption": "",
-            "Caption for the table": "",
-            "Collapse borders:": "",
-            "Layou": "",
-            "Style of the border": "",
-            "Border": "<<InlineStyler>>"
-        },
-        "LangMarks": {
-            "&mdash; language &mdash;": "",
-            "', '": "",
-            "English": "",
-            "French": "",
-            "Greek": "",
-            "language select": "",
-            "Latin": ""
-        },
-        "Linker": {
-            "(px)": "",
-            "Anchor-Link": "",
-            "Anchor:": "",
-            "Email Address:": "",
-            "Email Link": "",
-            "Location Bar:": "",
-            "Menu Bar:": "",
-            "Message Template:": "",
-            "New Window": "",
-            "Ordinary Link": "",
-            "Popup Window": "",
-            "PopupWindow": "",
-            "Remove Link": "",
-            "Resizeable:": "",
-            "Same Window (jump out of frames)": "",
-            "Scrollbars:": "",
-            "Shows On Hover": "",
-            "Status Bar:": "",
-            "Subject:": "",
-            "Title:": "",
-            "Toolbar:": "",
-            "URL Link": "",
-            "You must select some text before making a new link.": "",
-            "Are you sure you wish to remove this link?": "<<CreateLink>>",
-            "Name:": "<<Forms>>",
-            "Size:": "<<Forms>>"
-        },
-        "ListType": {
-            "Choose list style type (for ordered lists)": "",
-            "Decimal numbers": "",
-            "Lower greek letters": "",
-            "Lower latin letters": "",
-            "Lower roman numbers": "",
-            "Upper latin letters": "",
-            "Upper roman numbers": ""
-        },
-        "MootoolsFileManager": {
-            "Insert File Link": "",
-            "You must select some text before making a new link.": "<<Linker>>"
-        },
-        "Opera": {
-            "MARK": ""
-        },
-        "PasteText": {
-            "Insert text in new paragraph": "",
-            "Paste as Plain Text": ""
-        },
-        "PreserveScripts": {
-            "JavaScript": "",
-            "PHP": ""
-        },
-        "QuickTag": {
-            "',\r\n                           'cl': '": "",
-            "ATTRIBUTES": "",
-            "Colors": "",
-            "Enter the TAG you want to insert": "",
-            "No CSS class avaiable": "",
-            "Ok": "",
-            "OPTIONS": "",
-            "Quick Tag Editor": "",
-            "TAGs": "",
-            "There are some unclosed quote": "",
-            "This attribute already exists in the TAG": "",
-            "You have to select some text": ""
-        },
-        "SaveSubmit": {
-            "in progress": "",
-            "Ready": "",
-            "Save": "",
-            "Saving...": ""
-        },
-        "SetId": {
-            "ID/Name:": "",
-            "Set Id and Name": "",
-            "Set Id/Name": "",
-            "Set ID/Name": "",
-            "Delete": "<<Abbreviation>>"
-        },
-        "SmartReplace": {
-            "ClosingDoubleQuotes": "",
-            "ClosingSingleQuote": "",
-            "Convert all quotes and dashes in the current document": "",
-            "Enable automatic replacements": "",
-            "OpeningDoubleQuotes": "",
-            "OpeningSingleQuote": "",
-            "SmartReplace": "",
-            "SmartReplace Settings": ""
-        },
-        "Stylist": {
-            "Styles": ""
-        },
-        "SuperClean": {
-            "Clean bad HTML from Microsoft Word.": "",
-            "Clean Selection Only": "",
-            "Clean up HTML": "",
-            "Cleaning Scope": "",
-            "General tidy up and correction of some problems.": "",
-            "Please select from the following cleaning options...": "",
-            "Please stand by while cleaning in process...": "",
-            "Remove alignment (left/right/justify).": "",
-            "Remove all classes (CSS).": "",
-            "Remove All HTML Tags": "",
-            "Remove all styles (CSS).": "",
-            "Remove custom font sizes.": "",
-            "Remove custom text colors.": "",
-            "Remove custom typefaces (font \"styles\").": "",
-            "Remove emphasis and annotations.": "",
-            "Remove lang attributes.": "",
-            "Remove Paragraphs": "",
-            "Remove superscripts and subscripts.": "",
-            "Replace directional quote marks with non-directional quote marks.": "",
-            "Vigorously purge HTML from Microsoft Word.": ""
-        },
-        "TableOperations": {
-            "All four sides": "",
-            "Borders": "",
-            "Cell properties": "",
-            "Cell Properties": "",
-            "Cell Type:": "",
-            "Cells down": "",
-            "Cells to the right, and": "",
-            "Delete cell": "",
-            "Delete column": "",
-            "Delete row": "",
-            "Do Not Change": "",
-            "Frame and borders": "",
-            "Frames": "",
-            "Header (th)": "",
-            "Insert cell after": "",
-            "Insert cell before": "",
-            "Insert column after": "",
-            "Insert column before": "",
-            "Insert row after": "",
-            "Insert row before": "",
-            "Merge cells": "",
-            "Merge current cell with:": "",
-            "No rules": "",
-            "No sides": "",
-            "Normal (td)": "",
-            "Please click into some cell": "",
-            "Row properties": "",
-            "Row Properties": "",
-            "Rules will appear between all rows and columns": "",
-            "Rules will appear between columns only": "",
-            "Rules will appear between rows only": "",
-            "Spacing and padding": "",
-            "Split column": "",
-            "Split row": "",
-            "Summary": "",
-            "Table Properties": "",
-            "Table properties": "",
-            "The bottom side only": "",
-            "The left-hand side only": "",
-            "The right and left sides only": "",
-            "The right-hand side only": "",
-            "The top and bottom sides only": "",
-            "The top side only": "",
-            "Xinha cowardly refuses to delete the last cell in row.": "",
-            "Xinha cowardly refuses to delete the last column in table.": "",
-            "Xinha cowardly refuses to delete the last row in table.": "",
-            "Caption": "<<InsertTable>>",
-            "Columns": "<<Forms>>",
-            "Description": "<<FullPage>>",
-            "Merge Cells": "<<ContextMenu>>",
-            "Padding": "<<InlineStyler>>",
-            "pixels": "<<HorizontalRule>>"
-        },
-        "UnsavedChanges": {
-            "You have unsaved changes in the editor": ""
-        },
-        "WebKit": {
-            "The Paste button does not work in this browser for security reasons. Press CTRL-V on your keyboard to paste directly.": "<<Gecko>>"
-        },
-        "Xinha": {
-            "&#8212; font &#8212;": "",
-            "&#8212; size &#8212;": "",
-            "1 (8 pt)": "",
-            "2 (10 pt)": "",
-            "3 (12 pt)": "",
-            "4 (14 pt)": "",
-            "5 (18 pt)": "",
-            "6 (24 pt)": "",
-            "7 (36 pt)": "",
-            "Arial": "",
-            "Courier New": "",
-            "CTRL-0 (zero)": "",
-            "CTRL-1 .. CTRL-6": "",
-            "CTRL-A": "",
-            "CTRL-B": "",
-            "CTRL-C": "",
-            "CTRL-E": "",
-            "CTRL-I": "",
-            "CTRL-J": "",
-            "CTRL-L": "",
-            "CTRL-N": "",
-            "CTRL-R": "",
-            "CTRL-S": "",
-            "CTRL-U": "",
-            "CTRL-V": "",
-            "CTRL-X": "",
-            "CTRL-Y": "",
-            "CTRL-Z": "",
-            "Editor Help": "",
-            "ENTER": "",
-            "Error Loading Xinha.  Developers, check the Error Console for information.": "",
-            "Georgia": "",
-            "Impact": "",
-            "Loading Core": "",
-            "Loading plugins": "",
-            "MS Word Cleaner": "",
-            "Select Color": "",
-            "SHIFT-ENTER": "",
-            "Tahoma": "",
-            "Times New Roman": "",
-            "Touch here first to activate editor.": "",
-            "Verdana": "",
-            "Waiting for Iframe to load...": "",
-            "WingDings": "",
-            "Xinha": ""
-        },
-        "BackgroundImage": {
-            "__ TRANSLATOR NOTE __": "*** BACKGROUNDIMAGE IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***",
-            "Remove Current Background": "",
-            "Set Background": "",
-            "Set page background image": "",
-            "Set Page Background Image": ""
-        },
-        "ClientsideSpellcheck": {
-            "__ TRANSLATOR NOTE __": "*** CLIENTSIDESPELLCHECK IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***",
-            "Spell Check using ieSpell": ""
-        },
-        "ExtendedFileManager": {
-            "__ TRANSLATOR NOTE __": "*** EXTENDEDFILEMANAGER IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***",
-            "10%": "",
-            "100%": "",
-            "200%": "",
-            "25%": "",
-            "50%": "",
-            "75%": "",
-            ">List View": "",
-            ">Thumbnail View": "",
-            "A:": "",
-            "Align": "",
-            "Alt": "",
-            "Border Color": "",
-            "Constrain Proportions": "",
-            "Crop": "",
-            "D:": "",
-            "Directory": "",
-            "Directory Up": "",
-            "Edit": "",
-            "File List": "",
-            "File Manager": "",
-            "Filename:": "",
-            "Filesize:": "",
-            "Flip Horizontal": "",
-            "Flip Image": "",
-            "Flip Vertical": "",
-            "Folder": "",
-            "GIF": "",
-            "GIF format is not supported, image editing not supported.": "",
-            "H:": "",
-            "Image Editor": "",
-            "Image Selection": "",
-            "Invalid base directory:": "",
-            "JPEG High": "",
-            "JPEG Low": "",
-            "JPEG Medium": "",
-            "Loading": "",
-            "Lock": "",
-            "Marker": "",
-            "Maximum folder size limit reached. Upload disabled.": "",
-            "Measure": "",
-            "New Folder": "",
-            "No Files Found": "",
-            "No Image Available": "",
-            "Please enter value": "",
-            "PNG": "",
-            "Preset": "",
-            "Quality:": "",
-            "Refresh": "",
-            "Rename": "",
-            "Resize": "",
-            "Rotate": "",
-            "Rotate 180 &deg;": "",
-            "Rotate 90 &deg; CCW": "",
-            "Rotate 90 &deg; CW": "",
-            "Rotate Image": "",
-            "Start X:": "",
-            "Start Y:": "",
-            "Target Window": "",
-            "Toggle marker color": "",
-            "Trash": "",
-            "Upload": "",
-            "W:": "",
-            "X:": "",
-            "Xinha Image Editor": "",
-            "Y:": "",
-            "Zoom": "",
-            "Border": "<<InlineStyler>>",
-            "Clear": "<<FindReplace>>",
-            "Color": "<<HorizontalRule>>",
-            "Copy": "<<ContextMenu>>",
-            "Cut": "<<ContextMenu>>",
-            "Height": "<<HorizontalRule>>",
-            "Height:": "<<HorizontalRule>>",
-            "Insert File Link": "<<MootoolsFileManager>>",
-            "Margin": "<<InlineStyler>>",
-            "Padding": "<<InlineStyler>>",
-            "Save": "<<SaveSubmit>>",
-            "You must select some text before making a new link.": "<<Linker>>"
-        },
-        "Filter": {
-            "__ TRANSLATOR NOTE __": "*** FILTER IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***",
-            "Filter": "<<InsertSnippet2>>"
-        },
-        "HtmlTidy": {
-            "__ TRANSLATOR NOTE __": "*** HTMLTIDY IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***",
-            "Auto-Tidy": "",
-            "Don't Tidy": "",
-            "HTML Tidy": "",
-            "Tidy failed.  Check your HTML for syntax errors.": ""
-        },
-        "ImageManager": {
-            "__ TRANSLATOR NOTE __": "*** IMAGEMANAGER IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***",
-            "Angle:": "",
-            "Flickr Picture List": "",
-            "Flickr Pictures": "",
-            "Flickr Selection": "",
-            "Flickr Username/Email": "",
-            "Folder Name:": "",
-            "Image Format": "",
-            "Image List": "",
-            "Keyword": "",
-            "No Images Found": "",
-            "No Photos Found": "",
-            "No Videos Found": "",
-            "This Server": "",
-            "YouTube Selection": "",
-            "YouTube Username": "",
-            "YouTube Video List": "",
-            "YouTube Videos": "",
-            "A:": "<<ExtendedFileManager>>",
-            "Clear": "<<FindReplace>>",
-            "Constrain Proportions": "<<ExtendedFileManager>>",
-            "Crop": "<<ExtendedFileManager>>",
-            "D:": "<<ExtendedFileManager>>",
-            "Directory": "<<ExtendedFileManager>>",
-            "Directory Up": "<<ExtendedFileManager>>",
-            "Edit": "<<ExtendedFileManager>>",
-            "Filename:": "<<ExtendedFileManager>>",
-            "Flip Horizontal": "<<ExtendedFileManager>>",
-            "Flip Image": "<<ExtendedFileManager>>",
-            "Flip Vertical": "<<ExtendedFileManager>>",
-            "GIF": "<<ExtendedFileManager>>",
-            "GIF format is not supported, image editing not supported.": "<<ExtendedFileManager>>",
-            "H:": "<<ExtendedFileManager>>",
-            "Height:": "<<HorizontalRule>>",
-            "Image Editor": "<<ExtendedFileManager>>",
-            "Image Selection": "<<ExtendedFileManager>>",
-            "Invalid base directory:": "<<ExtendedFileManager>>",
-            "JPEG High": "<<ExtendedFileManager>>",
-            "JPEG Low": "<<ExtendedFileManager>>",
-            "JPEG Medium": "<<ExtendedFileManager>>",
-            "Lock": "<<ExtendedFileManager>>",
-            "Marker": "<<ExtendedFileManager>>",
-            "Measure": "<<ExtendedFileManager>>",
-            "New Folder": "<<ExtendedFileManager>>",
-            "No Image Available": "<<ExtendedFileManager>>",
-            "PNG": "<<ExtendedFileManager>>",
-            "Quality:": "<<ExtendedFileManager>>",
-            "Refresh": "<<ExtendedFileManager>>",
-            "Resize": "<<ExtendedFileManager>>",
-            "Rotate": "<<ExtendedFileManager>>",
-            "Rotate 180 &deg;": "<<ExtendedFileManager>>",
-            "Rotate 90 &deg; CCW": "<<ExtendedFileManager>>",
-            "Rotate 90 &deg; CW": "<<ExtendedFileManager>>",
-            "Rotate Image": "<<ExtendedFileManager>>",
-            "Save": "<<SaveSubmit>>",
-            "Start X:": "<<ExtendedFileManager>>",
-            "Start Y:": "<<ExtendedFileManager>>",
-            "Trash": "<<ExtendedFileManager>>",
-            "W:": "<<ExtendedFileManager>>",
-            "X:": "<<ExtendedFileManager>>",
-            "Y:": "<<ExtendedFileManager>>"
-        },
-        "InsertMarquee": {
-            "__ TRANSLATOR NOTE __": "*** INSERTMARQUEE IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***",
-            "Alternate": "",
-            "Background-Color:": "",
-            "Behavior:": "",
-            "Continuous": "",
-            "Direction:": "",
-            "Insert scrolling marquee": "",
-            "Marquee Editor": "",
-            "Scroll Amount:": "",
-            "Scroll Delay:": "",
-            "Slide": "",
-            "Speed Control": "",
-            "Height:": "<<HorizontalRule>>",
-            "Name": "<<Forms>>",
-            "Name/ID:": "<<Forms>>",
-            "Text:": "<<Forms>>"
-        },
-        "InsertPicture": {
-            "__ TRANSLATOR NOTE __": "*** INSERTPICTURE IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***",
-            "Leave empty for not defined": "",
-            " Open file in new window": "",
-            "Open file in new window": "",
-            "Upload file": "",
-            "Height:": "<<HorizontalRule>>",
-            "Size": "<<Forms>>"
-        },
-        "NoteServer": {
-            "__ TRANSLATOR NOTE __": "*** NOTESERVER IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***",
-            "120%": "",
-            "150%": "",
-            "80%": "",
-            "Add GUIDO Code in a textbox on the page": "",
-            "Add MIDI link to allow students to hear the music": "",
-            "Format": "",
-            "Guido code": "",
-            "GUIDO Code": "",
-            "Image in applet": "",
-            "Insert GUIDO Music Notation": "",
-            "MIDI File": "",
-            "Source Code": "",
-            "With Mozilla, the applet will not be visible in editor, but only in Web page after submitting.": "",
-            "Zoom :": "",
-            "100%": "<<ExtendedFileManager>>",
-            "Options": "<<FindReplace>>",
-            "Zoom": "<<ExtendedFileManager>>"
-        },
-        "PSLocal": {
-            "__ TRANSLATOR NOTE __": "*** PSLOCAL IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***",
-            "Confirm": "",
-            "Enable": "",
-            "Enable Gears in order to use local document storage and configuration.": "",
-            "Enabling Local Storage": "",
-            "Install": "",
-            "Learn About Local Storage": "",
-            "This will reload the page, causing you to lose any unsaved work.  Press \"OK\" to reload.": "",
-            "Xinha uses Google Gears to enable local document storage.  With Gears installed, you can save drafts of your documents on your hard drive, configure Xinha to look the way you want, and carry this information wherever you use Xinha on the web.": ""
-        },
-        "PSServer": {
-            "__ TRANSLATOR NOTE __": "*** PSSERVER IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***",
-            "File: ": "",
-            "Import": ""
-        },
-        "PersistentStorage": {
-            "__ TRANSLATOR NOTE __": "*** PERSISTENTSTORAGE IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***",
-            "Details": "",
-            "File Browser": "",
-            "Hello    There C ": "",
-            "Hello  There A ": "",
-            "Hello \" There B \"": "",
-            "Hello ' There D '": "",
-            "List of Places": "",
-            "New Document": "",
-            "Open": "",
-            "Open Document": "",
-            "Places": "",
-            "Please enter the name of the directory you'd like to create.": "",
-            "Save Document": "",
-            "This will erase any unsaved content.  If you're certain, please click OK to continue.": "",
-            "Web URL": "",
-            "Confirm": "<<PSLocal>>",
-            "Copy": "<<ContextMenu>>",
-            "Delete": "<<Abbreviation>>",
-            "Directory Up": "<<ExtendedFileManager>>",
-            "File List": "<<ExtendedFileManager>>",
-            "File Manager": "<<ExtendedFileManager>>",
-            "Filename": "<<ExtendedFileManager>>",
-            "Insert": "<<InsertNote>>",
-            "New Folder": "<<ExtendedFileManager>>",
-            "Save": "<<SaveSubmit>>",
-            "You must select some text before making a new link.": "<<Linker>>"
-        },
-        "SpellChecker": {
-            "__ TRANSLATOR NOTE __": "*** SPELLCHECKER IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***",
-            "Dictionary": "",
-            "Finished list of mispelled words": "",
-            "HTMLArea Spell Checker": "",
-            "I will open it in a new page.": "",
-            "Ignore": "",
-            "Ignore all": "",
-            "Info": "",
-            "Learn": "",
-            "No mispelled words found with the selected dictionary.": "",
-            "Original word": "",
-            "Please confirm that you want to open this link": "",
-            "Please wait.  Calling spell checker.": "",
-            "Please wait: changing dictionary to": "",
-            "pliz weit ;-)": "",
-            "Re-check": "",
-            "Replace": "",
-            "Replace all": "",
-            "Revert": "",
-            "Spell Checker": "",
-            "Spell-check": "",
-            "Suggestions": "",
-            "This will drop changes and quit spell checker.  Please confirm.": "",
-            "Replace with": "<<FindReplace>>"
-        },
-        "Template": {
-            "__ TRANSLATOR NOTE __": "*** TEMPLATE IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***",
-            "Insert template": ""
-        },
-        "UnFormat": {
-            "__ TRANSLATOR NOTE __": "*** UNFORMAT IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***",
-            "All": "",
-            "All HTML:": "",
-            "Cleaning Area": "",
-            "Cleaning options": "",
-            "Formatting:": "",
-            "Page Cleaner": "",
-            "Select which types of formatting you would like to remove.": "",
-            "Selection": ""
-        }
-    }
-}
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/lang/merged/fa.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/lang/merged/fa.js
deleted file mode 100644
index f882a77..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/lang/merged/fa.js
+++ /dev/null
@@ -1,1573 +0,0 @@
-// Xinha Language Combined Translation File
-//
-// LANG: "fa", ENCODING: UTF-8
-//
-// INSTRUCTIONS TO TRANSLATORS
-// ===========================================================================
-//
-// Your translation must be in UTF-8 Character Encoding.
-//
-// This is a JSON encoded file (plus comments), strings should be double-quote
-// only, do not use single quotes to surround strings - "hello", not 'hello'
-// do not have a trailing comma after the last entry in a section.
-//
-// Only full line comments are allowed (that a comments occupy entire lines).
-//
-// Search for the __NEW_TRANSLATIONS__ section below, this is where you will
-// want to focus, this section includes things that do not presently have a 
-// translation or for which the translation needs to be checked for accuracy.
-//
-// In the New Translations section a translation string is one of the following
-//
-//  "English String Here" : ""
-//     This means it is not translated yet, add your translation...
-//     "English String Here" : "Klingon String Here"
-//
-//  "English String Here" : "Translated String Here"
-//     This means that an existing translation for this string, in some other
-//     section has been found, and used.  Check that it is approprite for this
-//     section and if it is, that's fine leave it as is, otherwise change as
-//     appropriate.
-//
-//  "English String Here" : "<<AnotherSection>>"
-//     This means use the same translation for this string as <<AnotherSection>>
-//     this saves you re-tranlating strings.  If the Context of this section
-//     and the context of AnotherSection seem the same, that's fine leave it
-//     using that translation, but if this section needs a different translation, 
-//     you can provide it by replacing the link (<<AnotherSection>>) with that
-//     new translation.  For example - a "Table" in say "DataPlugin" is 
-//     perhaps translated differently to "Table" in "FurniturePlugin".
-//
-// TESTING YOUR TRANSLATION
-// ===========================================================================
-// Simply place your translation file on your webserver somewhere for example
-//
-//   /xinha/lang/merged/fa.js
-//
-// and then tell Xinha where to get it (before loading XinhaCore.js) by 
-//
-//  _editor_lang              = 'fa';
-//  _editor_lang_merged_file  = '/xinha/lang/merged/fa.js';
-//
-// Xinha will load your new language definition.
-//
-// SUBMITTING YOUR TRANSLATION
-// ===========================================================================
-// Simply create a Ticket on the Xinha website and attach your translation 
-// file.
-//
-// The Xinha developers will take your file and use the 
-//     contrib/lc_split_merged_file.php
-// script to load it into the Xinha distribution.
-
-{
-    "Abbreviation": {
-        "Cancel": "انصراف",
-        "OK": "بله"
-    },
-    "AboutBox": {
-        "About this editor": "درباره این ویرایش گر",
-        "Close": "بستن"
-    },
-    "BackgroundImage": {
-        "Cancel": "انصراف"
-    },
-    "ColorPicker": {
-        "Close": "بستن",
-        "OK": "بله"
-    },
-    "ContextMenu": {
-        "Justify Center": "تراز در وسط",
-        "Justify Full": "تراز از چپ و راست",
-        "Justify Left": "تراز از چپ",
-        "Justify Right": "تراز در راست"
-    },
-    "CreateLink": {
-        "Cancel": "انصراف",
-        "Insert/Modify Link": "افزودن / ویرایش لینک",
-        "New window (_blank)": "پنجره جدید (_blank)",
-        "None (use implicit)": "هیچکدام (استفاده از بدون شرط)",
-        "OK": "بله",
-        "Other": "سایر",
-        "Same frame (_self)": "فریم یکسان (_self)",
-        "Target:": "هدف",
-        "Title (tooltip):": "عنوان (راهنمای یک خطی)",
-        "Top frame (_top)": "فریم بالایی (_top)",
-        "URL:": "URL:",
-        "You need to select some text before creating a link": "باید قبل از ساخت لینک ، متنی را انتخاب نمایید"
-    },
-    "EditTag": {
-        "Cancel": "انصراف",
-        "OK": "بله"
-    },
-    "Equation": {
-        "Cancel": "انصراف",
-        "OK": "بله",
-        "Preview": "پیش نمایش"
-    },
-    "ExtendedFileManager": {
-        "Absbottom": "دقیقا پایین",
-        "Absmiddle": "دقیقا وسط",
-        "Baseline": "ابتدای خط",
-        "Bottom": "پایین",
-        "Cancel": "انصراف",
-        "Left": "چپ",
-        "Middle": "وسط",
-        "New window (_blank)": "پنجره جدید (_blank)",
-        "None (use implicit)": "هیچکدام (استفاده از بدون شرط)",
-        "Not set": "تنظیم نشده",
-        "OK": "بله",
-        "Positioning of this image": "موقعیت یابی تصویر",
-        "Preview": "پیش نمایش",
-        "Right": "راست",
-        "Same frame (_self)": "فریم یکسان (_self)",
-        "Texttop": "بالای متن",
-        "Title (tooltip)": "عنوان (راهنمای یک خطی)",
-        "Top": "بالا",
-        "Top frame (_top)": "فریم بالایی (_top)",
-        "Width": "طول",
-        "Width:": "طول"
-    },
-    "Forms": {
-        "Cancel": "انصراف",
-        "Image URL:": "URL تصویر",
-        "OK": "بله",
-        "Rows:": "ردیف ها"
-    },
-    "FullPage": {
-        "Cancel": "انصراف",
-        "OK": "بله"
-    },
-    "HorizontalRule": {
-        "Alignment:": "تراز بندی",
-        "Cancel": "انصراف",
-        "Horizontal Rule": "خط افقی",
-        "Layout": "لایه",
-        "Left": "چپ",
-        "OK": "بله",
-        "Right": "راست",
-        "Width:": "طول"
-    },
-    "ImageManager": {
-        "Absbottom": "دقیقا پایین",
-        "Absmiddle": "دقیقا وسط",
-        "Baseline": "ابتدای خط",
-        "Bottom": "پایین",
-        "Cancel": "انصراف",
-        "Insert Image": "افزودن تصویر",
-        "Left": "چپ",
-        "Middle": "وسط",
-        "Not set": "تنظیم نشده",
-        "OK": "بله",
-        "Positioning of this image": "موقعیت یابی تصویر",
-        "Right": "راست",
-        "Texttop": "بالای متن",
-        "Top": "بالا",
-        "Width:": "طول"
-    },
-    "InlineStyler": {
-        "Baseline": "ابتدای خط",
-        "Bottom": "پایین",
-        "Image URL": "URL تصویر",
-        "Layout": "لایه",
-        "Left": "چپ",
-        "Middle": "وسط",
-        "Right": "راست",
-        "Top": "بالا",
-        "Width": "طول"
-    },
-    "InsertAnchor": {
-        "Cancel": "انصراف",
-        "OK": "بله"
-    },
-    "InsertImage": {
-        "Absbottom": "دقیقا پایین",
-        "Absmiddle": "دقیقا وسط",
-        "Alignment:": "تراز بندی",
-        "Alternate text:": "متن جایگزین",
-        "Baseline": "ابتدای خط",
-        "Border thickness:": "ضخامت لبه",
-        "Bottom": "پایین",
-        "Cancel": "انصراف",
-        "Enter the image URL here": "URL تصویر را اینجا وارد کنید",
-        "For browsers that don't support images": "برای مرورگرهایی که از تصاویر پشتیبانی نمی کنند",
-        "Horizontal padding": "پرکننده افقی",
-        "Horizontal:": "افقی",
-        "Image Preview:": "پیش نمایش تصویر",
-        "Image URL:": "URL تصویر",
-        "Insert Image": "افزودن تصویر",
-        "Layout": "لایه",
-        "Leave empty for no border": "برای بدون لبه خالی رها کن",
-        "Left": "چپ",
-        "Middle": "وسط",
-        "Not set": "تنظیم نشده",
-        "OK": "بله",
-        "Positioning of this image": "موقعیت یابی تصویر",
-        "Preview": "پیش نمایش",
-        "Preview the image in a new window": "پیش نمایش تصویر در پنجره ای جدید",
-        "Right": "راست",
-        "Spacing": "فاصله گذاری",
-        "Texttop": "بالای متن",
-        "Top": "بالا",
-        "Vertical padding": "پرکننده عمودی",
-        "Vertical:": "عمودی",
-        "You must enter the URL": "شما باید URL را وارد کنید"
-    },
-    "InsertMarquee": {
-        "Cancel": "انصراف",
-        "Left": "چپ",
-        "OK": "بله",
-        "Right": "راست",
-        "Width:": "طول"
-    },
-    "InsertNote": {
-        "Cancel": "انصراف"
-    },
-    "InsertPicture": {
-        "Absbottom": "دقیقا پایین",
-        "Absmiddle": "دقیقا وسط",
-        "Alignment:": "تراز بندی",
-        "Alternate text:": "متن جایگزین",
-        "Baseline": "ابتدای خط",
-        "Border thickness:": "ضخامت لبه",
-        "Bottom": "پایین",
-        "Cancel": "انصراف",
-        "Enter the image URL here": "URL تصویر را اینجا وارد کنید",
-        "For browsers that don't support images": "برای مرورگرهایی که از تصاویر پشتیبانی نمی کنند",
-        "Horizontal padding": "پرکننده افقی",
-        "Horizontal:": "افقی",
-        "Image Preview:": "پیش نمایش تصویر",
-        "Image URL:": "URL تصویر",
-        "Insert Image": "افزودن تصویر",
-        "Layout": "لایه",
-        "Leave empty for no border": "برای بدون لبه خالی رها کن",
-        "Left": "چپ",
-        "Middle": "وسط",
-        "Not set": "تنظیم نشده",
-        "OK": "بله",
-        "Positioning of this image": "موقعیت یابی تصویر",
-        "Preview": "پیش نمایش",
-        "Preview the image in a new window": "پیش نمایش تصویر در پنجره ای جدید",
-        "Right": "راست",
-        "Spacing": "فاصله گذاری",
-        "Texttop": "بالای متن",
-        "Top": "بالا",
-        "Vertical padding": "پرکننده عمودی",
-        "Vertical:": "عمودی",
-        "Width:": "طول"
-    },
-    "InsertSnippet": {
-        "Cancel": "انصراف"
-    },
-    "InsertSnippet2": {
-        "Cancel": "انصراف"
-    },
-    "InsertTable": {
-        "Absbottom": "دقیقا پایین",
-        "Absmiddle": "دقیقا وسط",
-        "Alignment:": "تراز بندی",
-        "Baseline": "ابتدای خط",
-        "Border thickness:": "ضخامت لبه",
-        "Bottom": "پایین",
-        "Cancel": "انصراف",
-        "Cell padding:": "پر کننده سلول",
-        "Cell spacing:": "فاصله سلول ها",
-        "Cols:": "ستون ها",
-        "Em": "Em",
-        "Fixed width columns": "ستون های طول ثابت",
-        "Insert Table": "افزودن جدول",
-        "Layout": "لایه",
-        "Leave empty for no border": "برای بدون لبه خالی رها کن",
-        "Left": "چپ",
-        "Middle": "وسط",
-        "Not set": "تنظیم نشده",
-        "Number of columns": "تعداد ستون ها",
-        "Number of rows": "تعداد ردیف ها",
-        "OK": "بله",
-        "Percent": "درصد",
-        "Pixels": "پیکسل ها",
-        "Positioning of this table": "موقعیت یابی این جدول",
-        "Right": "راست",
-        "Rows:": "ردیف ها",
-        "Space between adjacent cells": "فاصله بین سلول های همجوار",
-        "Space between content and border in cell": "فاصله بین محتوا و لبه در سلول",
-        "Spacing": "فاصله گذاری",
-        "Texttop": "بالای متن",
-        "Top": "بالا",
-        "Width of the table": "طول جدول",
-        "Width unit": "واحد طول",
-        "Width:": "طول",
-        "You must enter a number of columns": "باید تعداد ستون ها را وارد کنید",
-        "You must enter a number of rows": "باید تعداد ردیف ها را وارد کنید"
-    },
-    "Linker": {
-        "Cancel": "انصراف",
-        "Insert/Modify Link": "افزودن / ویرایش لینک",
-        "OK": "بله",
-        "Target:": "هدف",
-        "URL:": "URL:"
-    },
-    "NoteServer": {
-        "Cancel": "انصراف",
-        "Image Preview": "پیش نمایش تصویر",
-        "OK": "بله",
-        "Preview": "پیش نمایش",
-        "Preview the image in a new window": "پیش نمایش تصویر در پنجره ای جدید"
-    },
-    "Opera": {
-        "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 را در صفحه کلید بزنید."
-    },
-    "PSLocal": {
-        "Cancel": "انصراف"
-    },
-    "PasteText": {
-        "Cancel": "انصراف",
-        "OK": "بله"
-    },
-    "PersistentStorage": {
-        "Cancel": "انصراف",
-        "Insert Image": "افزودن تصویر"
-    },
-    "QuickTag": {
-        "Cancel": "انصراف"
-    },
-    "SetId": {
-        "Cancel": "انصراف",
-        "OK": "بله"
-    },
-    "SmartReplace": {
-        "OK": "بله"
-    },
-    "SpellChecker": {
-        "Cancel": "انصراف",
-        "OK": "بله"
-    },
-    "SuperClean": {
-        "Cancel": "انصراف",
-        "OK": "بله"
-    },
-    "TableOperations": {
-        "Cancel": "انصراف",
-        "OK": "بله",
-        "Rows": "ردیف ها",
-        "Spacing": "فاصله گذاری"
-    },
-    "Template": {
-        "Cancel": "انصراف"
-    },
-    "UnFormat": {
-        "Cancel": "انصراف",
-        "OK": "بله"
-    },
-    "Xinha": {
-        "&#8212; format &#8212;": "&#8212; قالب &#8212;",
-        "About this editor": "درباره این ویرایش گر",
-        "Address": "آدرس",
-        "Background Color": "رنگ پس زمینه",
-        "Bold": "ضخیم",
-        "Bulleted List": "فهرست گلوله ای",
-        "Clean content pasted from Word": "تمیز کردن محتوای چسبانده شده از Word",
-        "Clear Inline Font Specifications": "پاک کردن متن از مشخصات فونت",
-        "Clear MSOffice tags": "پاک کردن متن از برچسب های MSOffice",
-        "Close": "بستن",
-        "Constructing object": "ساختن شیء",
-        "Copy selection": "کپی انتخاب شده",
-        "Create Toolbar": "ساخت نوار ابزار",
-        "Current style": "شیوه کنونی",
-        "Cut selection": "بریدن انتخاب شده",
-        "Decrease Indent": "کاهش سر خط",
-        "Direction left to right": "جهت از چپ به راست",
-        "Direction right to left": "جهت از راست به چپ",
-        "ENTER": "ENTREE",
-        "Editor Help": "راهنمای ویرایشگر",
-        "Font Color": "رنگ فلم",
-        "Formatted": "قالب بندی شده",
-        "Heading 1": "تیتر 1",
-        "Heading 2": "تیتر 2",
-        "Heading 3": "تیتر 3",
-        "Heading 4": "تیتر 4",
-        "Heading 5": "تیتر 5",
-        "Heading 6": "تیتر 6",
-        "Headings": "عنوان گذاری",
-        "Help using editor": "راهنمای استفاده ویرایش گر",
-        "Horizontal Rule": "خط افقی",
-        "Increase Indent": "افزایش سر خط",
-        "Init editor size": "مقدار دهی اندازه ویرایشگر",
-        "Insert Table": "افزودن جدول",
-        "Insert Web Link": "افزودن لینک وب",
-        "Insert/Modify Image": "افزودن یا ویرایش تصویر",
-        "Insert/Overwrite": "افزودن/جانویسی",
-        "Italic": "مورب",
-        "Justify Center": "تراز در وسط",
-        "Justify Full": "تراز از چپ و راست",
-        "Justify Left": "تراز از چپ",
-        "Justify Right": "تراز در راست",
-        "Keyboard shortcuts": "میانبرهای صفحه کلید",
-        "Normal": "معمولی",
-        "Ordered List": "فهرست مرتب",
-        "Paste from clipboard": "چسباندن از تخته کار",
-        "Path": "مسیر",
-        "Print document": "چاپ سند",
-        "Redoes your last action": "انجام مجدد آخرین عمل",
-        "Register plugin $plugin": "ثبت پلاگین $plugin",
-        "Remove formatting": "حذف فرمت بندی",
-        "SHIFT-ENTER": "SHIFT+ENTREE",
-        "Save as": "ذخیره مانند...",
-        "Select all": "انتخاب همه",
-        "Set format to paragraph": "تغییر قالب به پاراگراف",
-        "Split Block": "بلاک جداسازی",
-        "Strikethrough": "رو خط",
-        "Subscript": "زیروند",
-        "Superscript": "بالاوند",
-        "The editor provides the following key combinations:": "ویرایشگر استفاده از کلید های گروهی زیر را مسیر می سازد :",
-        "Toggle Borders": "فعال/غیر فعال کردن لبه ها",
-        "Toggle HTML Source": "مشاهده یا عدم مشاهده متن در قالب HTML",
-        "Underline": "زیر خط",
-        "Undoes your last action": "برگرداندن آخرین عمل",
-        "Would you like to clear font colours?": "آیا تمایل دارید رنگ قلم را پاک کنید؟",
-        "Would you like to clear font sizes?": "آیا تمایل دارید اندازه قلم را پاک کنید",
-        "Would you like to clear font typefaces?": "آیا تمایل دارید ظاهر فلم را پاک کنید؟",
-        "You are in TEXT MODE.  Use the [<>] button to switch back to WYSIWYG.": "در مد متنی هستید.  از دکمه [<>] استفاده نمایید تا به مد WYSIWYG برگردید.",
-        "insert linebreak": "افزودن جدا کننده خط",
-        "new paragraph": "پاراگراف جدید"
-    },
-    "__NEW_TRANSLATIONS__": {
-        "Abbreviation": {
-            "Abbreviation": "",
-            "Delete": "",
-            "Expansion:": ""
-        },
-        "CharCounter": {
-            "... in progress": "",
-            "Chars": "",
-            "HTML": "",
-            "Words": ""
-        },
-        "CharacterMap": {
-            "Insert special character": ""
-        },
-        "ColorPicker": {
-            "Click a color...": "",
-            "Color: ": "",
-            "Sample": "",
-            "Web Safe: ": ""
-        },
-        "ContextMenu": {
-            "_Delete Row": "",
-            "_Image Properties...": "",
-            "_Modify Link...": "",
-            "_Remove Link...": "",
-            "_Table Properties...": "",
-            "C_ell Properties...": "",
-            "Chec_k Link...": "",
-            "Copy": "",
-            "Create a link": "",
-            "Current URL is": "",
-            "Cut": "",
-            "De_lete Column": "",
-            "Delete Cell": "",
-            "Delete the current column": "",
-            "Delete the current row": "",
-            "How did you get here? (Please report!)": "",
-            "I_nsert Row Before": "",
-            "In_sert Row After": "",
-            "Insert _Column Before": "",
-            "Insert a new column after the current one": "",
-            "Insert a new column before the current one": "",
-            "Insert a new row after the current one": "",
-            "Insert a new row before the current one": "",
-            "Insert a paragraph after the current node": "",
-            "Insert a paragraph before the current node": "",
-            "Insert C_olumn After": "",
-            "Insert Cell After": "",
-            "Insert Cell Before": "",
-            "Insert paragraph after": "",
-            "Insert paragraph before": "",
-            "Link points to:": "",
-            "Make lin_k...": "",
-            "Merge Cells": "",
-            "Opens this link in a new window": "",
-            "Paste": "",
-            "Please confirm that you want to remove this element:": "",
-            "Please confirm that you want to unlink this element.": "",
-            "Remove the $elem Element...": "",
-            "Remove this node from the document": "",
-            "Ro_w Properties...": "",
-            "Show the image properties dialog": "",
-            "Show the Table Cell Properties dialog": "",
-            "Show the Table Properties dialog": "",
-            "Show the Table Row Properties dialog": "",
-            "Unlink the current element": ""
-        },
-        "CreateLink": {
-            "Are you sure you wish to remove this link?": ""
-        },
-        "DefinitionList": {
-            "definition description": "",
-            "definition list": "",
-            "definition term": ""
-        },
-        "Dialogs": {
-            "Some Text Here": ""
-        },
-        "DynamicCSS": {
-            "Choose stylesheet": "",
-            "Default": "",
-            "Undefined": ""
-        },
-        "EditTag": {
-            "Edit HTML for selected text": "",
-            "Edit Tag By Peg": "",
-            "Tag Editor": ""
-        },
-        "Equation": {
-            "!=": "",
-            "!in": "",
-            "&gt;-": "",
-            "&gt;=": "",
-            "&lt;=": "",
-            "&lt;=&gt;": "",
-            "&lt;x&gt;": "",
-            "&nbsp; `!` &nbsp;": "",
-            "&nbsp; `.` &nbsp;": "",
-            "&nbsp; `0` &nbsp;": "",
-            "&nbsp; `2` &nbsp;": "",
-            "&nbsp; `3` &nbsp;": "",
-            "&nbsp; `4` &nbsp;": "",
-            "&nbsp; `5` &nbsp;": "",
-            "&nbsp; `6` &nbsp;": "",
-            "&nbsp; `7` &nbsp;": "",
-            "&nbsp; `8` &nbsp;": "",
-            "&nbsp; `9` &nbsp;": "",
-            "&nbsp; `e` &nbsp;": "",
-            "&nbsp;&nbsp;`1` &nbsp;": "",
-            "&nbsp;`+{::}`&nbsp;": "",
-            "&nbsp;`-:\\ `": "",
-            "&nbsp;`-{::}`&nbsp;": "",
-            "&nbsp;`C`&nbsp;": "",
-            "&nbsp;`cos`": "",
-            "&nbsp;`ln`&nbsp;": "",
-            "&nbsp;`pi` &nbsp;": "",
-            "&nbsp;`sin`": "",
-            "&nbsp;`tan`": "",
-            "&nbsp;`times`&nbsp;": "",
-            "&quot;text&quot;": "",
-            "'+formula+'": "",
-            "((n),(k))": "",
-            "(x+1)/(x-1)": "",
-            "*": "",
-            "**": "",
-            "+-": "",
-            "-&gt;": "",
-            "-&lt;": "",
-            "-:": "",
-            "-=": "",
-            "//": "",
-            "/_": "",
-            ":.": "",
-            "=&gt;": "",
-            "@": "",
-            "[[a,b],[c,d]]": "",
-            "\\\\": "",
-            "\\nClick in the box to use your keyboard or use the buttons\\n": "",
-            "^^": "",
-            "^^^": "",
-            "__|": "",
-            "_|_": "",
-            "`!=`": "",
-            "`!in`": "",
-            "`&and;`": "",
-            "`&cap;`": "",
-            "`&cup;`": "",
-            "`&gt;-`": "",
-            "`&gt;=`": "",
-            "`&lt;=&gt;`": "",
-            "`&lt;=`": "",
-            "`&lt;x&gt;`": "",
-            "`&or;`": "",
-            "`&quot;text&quot;`": "",
-            "`((n),(k))`": "",
-            "`(x+1)/(x-1)`": "",
-            "`**`": "",
-            "`*`": "",
-            "`+-`": "",
-            "`-&gt;`": "",
-            "`-&lt;`": "",
-            "`-:`": "",
-            "`-=`": "",
-            "`//`": "",
-            "`/_`": "",
-            "`:.`": "",
-            "`=&gt;`": "",
-            "`@`": "",
-            "`[[a,b],[c,d]]`": "",
-            "`\\\\`": "",
-            "`__|`": "",
-            "`_|_`": "",
-            "`AA`": "",
-            "`aleph`": "",
-            "`alpha`": "",
-            "`and`": "",
-            "`bara`": "",
-            "`bba`": "",
-            "`bbba`": "",
-            "`beta`": "",
-            "`CC`": "",
-            "`cca`": "",
-            "`chi`": "",
-            "`darr`": "",
-            "`ddota`": "",
-            "`del`": "",
-            "`Delta`": "",
-            "`delta`": "",
-            "`diamond`": "",
-            "`dota`": "",
-            "`dy/dx`": "",
-            "`EE`": "",
-            "`epsi`": "",
-            "`eta`": "",
-            "`fra`": "",
-            "`Gamma`": "",
-            "`gamma`": "",
-            "`grad`": "",
-            "`harr`": "",
-            "`hArr`": "",
-            "`hata`": "",
-            "`if`": "",
-            "`in`": "",
-            "`int`": "",
-            "`iota`": "",
-            "`kappa`": "",
-            "`lambda`": "",
-            "`Lambda`": "",
-            "`lArr`": "",
-            "`larr`": "",
-            "`lim_(x-&gt;oo)`": "",
-            "`log`": "",
-            "`mu`": "",
-            "`NN`": "",
-            "`nn`": "",
-            "`not`": "",
-            "`nu`": "",
-            "`o+`": "",
-            "`o.`": "",
-            "`O/`": "",
-            "`oint`": "",
-            "`omega`": "",
-            "`Omega`": "",
-            "`oo`": "",
-            "`or`": "",
-            "`ox`": "",
-            "`Phi`": "",
-            "`phi`": "",
-            "`Pi`": "",
-            "`pi`": "",
-            "`prod`": "",
-            "`prop`": "",
-            "`Psi`": "",
-            "`psi`": "",
-            "`QQ`": "",
-            "`quad`": "",
-            "`rArr`": "",
-            "`rho`": "",
-            "`root(n)(x)`": "",
-            "`RR`": "",
-            "`sfa`": "",
-            "`sigma`": "",
-            "`Sigma`": "",
-            "`sqrt(x)`": "",
-            "`square`": "",
-            "`stackrel(-&gt;)(+)`": "",
-            "`sub`": "",
-            "`sube`": "",
-            "`sum`": "",
-            "`sup`": "",
-            "`supe`": "",
-            "`tau`": "",
-            "`Theta`": "",
-            "`theta`": "",
-            "`TT`": "",
-            "`tta`": "",
-            "`uarr`": "",
-            "`ula`": "",
-            "`upsilon`": "",
-            "`uu`": "",
-            "`veca`": "",
-            "`vv`": "",
-            "`x_(mn)`": "",
-            "`Xi`": "",
-            "`xi`": "",
-            "`xx`": "",
-            "`zeta`": "",
-            "`ZZ`": "",
-            "`|-&gt;`": "",
-            "`|--`": "",
-            "`|==`": "",
-            "`|__`": "",
-            "`|~`": "",
-            "`~=`": "",
-            "`~|`": "",
-            "`~~`": "",
-            "AA": "",
-            "aleph": "",
-            "alpha": "",
-            "and": "",
-            "AsciiMath Formula Input": "",
-            "AsciiMathML Example": "",
-            "bara": "",
-            "Based on ASCIIMathML by": "",
-            "bba": "",
-            "bbba": "",
-            "beta": "",
-            "CC": "",
-            "cca": "",
-            "chi": "",
-            "darr": "",
-            "ddota": "",
-            "del": "",
-            "Delta": "",
-            "delta": "",
-            "diamond": "",
-            "dota": "",
-            "dy/dx": "",
-            "EE": "",
-            "epsi": "",
-            "eta": "",
-            "For more information on AsciiMathML visit this page:": "",
-            "Formula Editor": "",
-            "fra": "",
-            "gamma": "",
-            "Gamma": "",
-            "grad": "",
-            "hArr": "",
-            "harr": "",
-            "hata": "",
-            "if": "",
-            "in": "",
-            "Input": "",
-            "int": "",
-            "int_a^bf(x)dx": "",
-            "iota": "",
-            "kappa": "",
-            "Lambda": "",
-            "lambda": "",
-            "larr": "",
-            "lArr": "",
-            "lim_(x-&gt;oo)": "",
-            "mu": "",
-            "NN": "",
-            "nn": "",
-            "nnn": "",
-            "not": "",
-            "nu": "",
-            "o+": "",
-            "o.": "",
-            "O/": "",
-            "oint": "",
-            "omega": "",
-            "Omega": "",
-            "oo": "",
-            "or": "",
-            "ox": "",
-            "Phi": "",
-            "phi": "",
-            "pi": "",
-            "Pi": "",
-            "prod": "",
-            "prop": "",
-            "psi": "",
-            "Psi": "",
-            "QQ": "",
-            "quad": "",
-            "rArr": "",
-            "rho": "",
-            "root(n)(x)": "",
-            "RR": "",
-            "sfa": "",
-            "sigma": "",
-            "Sigma": "",
-            "sqrt(x)": "",
-            "square": "",
-            "stackrel(-&gt;)(+)": "",
-            "sub": "",
-            "sube": "",
-            "sum": "",
-            "sum_(n=1)^oo": "",
-            "sup": "",
-            "supe": "",
-            "tau": "",
-            "Theta": "",
-            "theta": "",
-            "TT": "",
-            "tta": "",
-            "uarr": "",
-            "ula": "",
-            "upsilon": "",
-            "uu": "",
-            "uuu": "",
-            "veca": "",
-            "vv": "",
-            "vvv": "",
-            "x^(m+n)": "",
-            "x_(mn)": "",
-            "Xi": "",
-            "xi": "",
-            "xx": "",
-            "zeta": "",
-            "ZZ": "",
-            "|-&gt;": "",
-            "|--": "",
-            "|==": "",
-            "|__": "",
-            "|~": "",
-            "~=": "",
-            "~|": "",
-            "~~": ""
-        },
-        "FancySelects": {
-            "'+opt.text+'": ""
-        },
-        "FindReplace": {
-            "';\r\n  var tagc = '": "",
-            "Case sensitive search": "",
-            "Clear": "",
-            "Done": "",
-            "Enter the text you want to find": "",
-            "Find and Replace": "",
-            "found item": "",
-            "found items": "",
-            "Highlight": "",
-            "Inform a replacement word": "",
-            "Next": "",
-            "not found": "",
-            "Options": "",
-            "Replace with:": "",
-            "replaced item": "",
-            "replaced items": "",
-            "Search for:": "",
-            "Substitute all occurrences": "",
-            "Substitute this occurrence?": "",
-            "Undo": "",
-            "Whole words only": ""
-        },
-        "FormOperations": {
-            "Enter the name for new option.": "",
-            "Form Editor": "",
-            "Insert a check box.": "",
-            "Insert a Form.": "",
-            "Insert a multi-line text field.": "",
-            "Insert a radio button.": "",
-            "Insert a select field.": "",
-            "Insert a submit/reset button.": "",
-            "Insert a text, password or hidden field.": "",
-            "Message Sent": "",
-            "Please Select...": ""
-        },
-        "Forms": {
-            "'onClick'=": "",
-            "Access Key:": "",
-            "Action URL:": "",
-            "Button Script": "",
-            "Checked": "",
-            "Columns:": "",
-            "Default text (optional)": "",
-            "Dimensions": "",
-            "Disabled": "",
-            "Encoding:": "",
-            "For Control:": "",
-            "Form": "",
-            "Form Element: FIELDSET": "",
-            "Form Element: INPUT": "",
-            "Form Element: LABEL": "",
-            "Form Element: SELECT": "",
-            "Form Element: TEXTAREA": "",
-            "Form handler script": "",
-            "Form Name:": "",
-            "Get": "",
-            "Hard": "",
-            "Height in number of rows": "",
-            "HTML-Form to CGI (default)": "",
-            "Image source": "",
-            "Initial Text:": "",
-            "Insert/Edit Form": "",
-            "Insert/Edit Form Element FIELDSET": "",
-            "Insert/Edit Form Element INPUT": "",
-            "Insert/Edit Form Element LABEL": "",
-            "Insert/Edit Form Element SELECT": "",
-            "Insert/Edit Form Element TEXTAREA": "",
-            "Javascript for button click": "",
-            "Label:": "",
-            "Legend:": "",
-            "Max length:": "",
-            "Maximum number of characters accepted": "",
-            "Method:": "",
-            "multipart Form Data (File-Upload)": "",
-            "Name": "",
-            "Name of the form input": "",
-            "Name of the form select": "",
-            "name of the textarea": "",
-            "Name/ID:": "",
-            "normal": "",
-            "nowrap": "",
-            "Off": "",
-            "Physical": "",
-            "Please enter a Label": "",
-            "Post": "",
-            "pre": "",
-            "Read Only": "",
-            "Size of text box in characters": "",
-            "Size:": "",
-            "Soft": "",
-            "Tab Index:": "",
-            "Target Frame:": "",
-            "Text:": "",
-            "URL of image": "",
-            "Value of the form input": "",
-            "Value:": "",
-            "Virtual": "",
-            "Width in number of characters": "",
-            "Wrap Mode:": "",
-            "You must enter a Name": "",
-            "Options": "<<FindReplace>>"
-        },
-        "FullPage": {
-            "...": "",
-            "Alternate style-sheet:": "",
-            "Background color:": "",
-            "Character set:": "",
-            "cyrillic (ISO-8859-5)": "",
-            "cyrillic (KOI8-R)": "",
-            "cyrillic (WINDOWS-1251)": "",
-            "Description:": "",
-            "DOCTYPE:": "",
-            "Document properties": "",
-            "Document title:": "",
-            "Keywords:": "",
-            "Primary style-sheet:": "",
-            "Text color:": "",
-            "UTF-8 (recommended)": "",
-            "western (ISO-8859-1)": ""
-        },
-        "FullScreen": {
-            "Maximize/Minimize Editor": ""
-        },
-        "Gecko": {
-            "The Paste button does not work in this browser for security reasons. Press CTRL-V on your keyboard to paste directly.": ""
-        },
-        "HorizontalRule": {
-            "&#x00d7;": "",
-            "&nbsp;": "",
-            "Center": "",
-            "Color:": "",
-            "Height:": "",
-            "Insert/edit horizontal rule": "",
-            "Insert/Edit Horizontal Rule": "",
-            "No shading": "",
-            "percent": "",
-            "pixels": "",
-            "Style": ""
-        },
-        "InlineStyler": {
-            "Background": "",
-            "Border": "",
-            "Char": "",
-            "Collapsed borders": "",
-            "CSS Style": "",
-            "FG Color": "",
-            "Float": "",
-            "Justify": "",
-            "Margin": "",
-            "None": "",
-            "Padding": "",
-            "Text align": "",
-            "Vertical align": "",
-            "-": "<<Equation>>",
-            "Center": "<<HorizontalRule>>",
-            "Height": "<<HorizontalRule>>",
-            "percent": "<<HorizontalRule>>",
-            "pixels": "<<HorizontalRule>>"
-        },
-        "InsertAnchor": {
-            "Anchor name": "",
-            "Insert Anchor": "",
-            "Delete": "<<Abbreviation>>"
-        },
-        "InsertNote": {
-            "Insert": "",
-            "Insert footnote": "",
-            "Insert Note": ""
-        },
-        "InsertPagebreak": {
-            "Page break": "",
-            "Page Break": ""
-        },
-        "InsertSmiley": {
-            "Insert Smiley": ""
-        },
-        "InsertSnippet": {
-            "\\n  This is an information about something\\n": "",
-            "Hide preview": "",
-            "Insert as": "",
-            "Insert Snippet": "",
-            "InsertSnippet for Xinha": "",
-            "Link1": "",
-            "Link2": "",
-            "Link3": "",
-            "Link4": "",
-            "Link5": "",
-            "Show preview": "",
-            "This is an information about something": "",
-            "Variable": ""
-        },
-        "InsertSnippet2": {
-            "All Categories": "",
-            "Filter": "",
-            "Insert as HTML": "",
-            "Insert as template variable": "",
-            "Only search word beginning": "",
-            "HTML": "<<CharCounter>>",
-            "Insert Snippet": "<<InsertSnippet>>",
-            "InsertSnippet for Xinha": "<<InsertSnippet>>",
-            "Variable": "<<InsertSnippet>>"
-        },
-        "InsertTable": {
-            "Caption": "",
-            "Caption for the table": "",
-            "Collapse borders:": "",
-            "Layou": "",
-            "Style of the border": "",
-            "Border": "<<InlineStyler>>"
-        },
-        "LangMarks": {
-            "&mdash; language &mdash;": "",
-            "', '": "",
-            "English": "",
-            "French": "",
-            "Greek": "",
-            "language select": "",
-            "Latin": ""
-        },
-        "Linker": {
-            "(px)": "",
-            "Anchor-Link": "",
-            "Anchor:": "",
-            "Email Address:": "",
-            "Email Link": "",
-            "Location Bar:": "",
-            "Menu Bar:": "",
-            "Message Template:": "",
-            "New Window": "",
-            "Ordinary Link": "",
-            "Popup Window": "",
-            "PopupWindow": "",
-            "Remove Link": "",
-            "Resizeable:": "",
-            "Same Window (jump out of frames)": "",
-            "Scrollbars:": "",
-            "Shows On Hover": "",
-            "Status Bar:": "",
-            "Subject:": "",
-            "Title:": "",
-            "Toolbar:": "",
-            "URL Link": "",
-            "You must select some text before making a new link.": "",
-            "Are you sure you wish to remove this link?": "<<CreateLink>>",
-            "Name:": "<<Forms>>",
-            "Size:": "<<Forms>>"
-        },
-        "ListType": {
-            "Choose list style type (for ordered lists)": "",
-            "Decimal numbers": "",
-            "Lower greek letters": "",
-            "Lower latin letters": "",
-            "Lower roman numbers": "",
-            "Upper latin letters": "",
-            "Upper roman numbers": ""
-        },
-        "MootoolsFileManager": {
-            "Insert File Link": "",
-            "You must select some text before making a new link.": "<<Linker>>"
-        },
-        "Opera": {
-            "MARK": ""
-        },
-        "PasteText": {
-            "Insert text in new paragraph": "",
-            "Paste as Plain Text": ""
-        },
-        "PreserveScripts": {
-            "JavaScript": "",
-            "PHP": ""
-        },
-        "QuickTag": {
-            "',\r\n                           'cl': '": "",
-            "ATTRIBUTES": "",
-            "Colors": "",
-            "Enter the TAG you want to insert": "",
-            "No CSS class avaiable": "",
-            "Ok": "",
-            "OPTIONS": "",
-            "Quick Tag Editor": "",
-            "TAGs": "",
-            "There are some unclosed quote": "",
-            "This attribute already exists in the TAG": "",
-            "You have to select some text": ""
-        },
-        "SaveSubmit": {
-            "in progress": "",
-            "Ready": "",
-            "Save": "",
-            "Saving...": ""
-        },
-        "SetId": {
-            "ID/Name:": "",
-            "Set Id and Name": "",
-            "Set Id/Name": "",
-            "Set ID/Name": "",
-            "Delete": "<<Abbreviation>>"
-        },
-        "SmartReplace": {
-            "ClosingDoubleQuotes": "",
-            "ClosingSingleQuote": "",
-            "Convert all quotes and dashes in the current document": "",
-            "Enable automatic replacements": "",
-            "OpeningDoubleQuotes": "",
-            "OpeningSingleQuote": "",
-            "SmartReplace": "",
-            "SmartReplace Settings": ""
-        },
-        "Stylist": {
-            "Styles": ""
-        },
-        "SuperClean": {
-            "Clean bad HTML from Microsoft Word.": "",
-            "Clean Selection Only": "",
-            "Clean up HTML": "",
-            "Cleaning Scope": "",
-            "General tidy up and correction of some problems.": "",
-            "Please select from the following cleaning options...": "",
-            "Please stand by while cleaning in process...": "",
-            "Remove alignment (left/right/justify).": "",
-            "Remove all classes (CSS).": "",
-            "Remove All HTML Tags": "",
-            "Remove all styles (CSS).": "",
-            "Remove custom font sizes.": "",
-            "Remove custom text colors.": "",
-            "Remove custom typefaces (font \"styles\").": "",
-            "Remove emphasis and annotations.": "",
-            "Remove lang attributes.": "",
-            "Remove Paragraphs": "",
-            "Remove superscripts and subscripts.": "",
-            "Replace directional quote marks with non-directional quote marks.": "",
-            "Vigorously purge HTML from Microsoft Word.": ""
-        },
-        "TableOperations": {
-            "All four sides": "",
-            "Borders": "",
-            "Cell properties": "",
-            "Cell Properties": "",
-            "Cell Type:": "",
-            "Cells down": "",
-            "Cells to the right, and": "",
-            "Delete cell": "",
-            "Delete column": "",
-            "Delete row": "",
-            "Do Not Change": "",
-            "Frame and borders": "",
-            "Frames": "",
-            "Header (th)": "",
-            "Insert cell after": "",
-            "Insert cell before": "",
-            "Insert column after": "",
-            "Insert column before": "",
-            "Insert row after": "",
-            "Insert row before": "",
-            "Merge cells": "",
-            "Merge current cell with:": "",
-            "No rules": "",
-            "No sides": "",
-            "Normal (td)": "",
-            "Please click into some cell": "",
-            "Row properties": "",
-            "Row Properties": "",
-            "Rules will appear between all rows and columns": "",
-            "Rules will appear between columns only": "",
-            "Rules will appear between rows only": "",
-            "Spacing and padding": "",
-            "Split column": "",
-            "Split row": "",
-            "Summary": "",
-            "Table Properties": "",
-            "Table properties": "",
-            "The bottom side only": "",
-            "The left-hand side only": "",
-            "The right and left sides only": "",
-            "The right-hand side only": "",
-            "The top and bottom sides only": "",
-            "The top side only": "",
-            "Xinha cowardly refuses to delete the last cell in row.": "",
-            "Xinha cowardly refuses to delete the last column in table.": "",
-            "Xinha cowardly refuses to delete the last row in table.": "",
-            "Caption": "<<InsertTable>>",
-            "Columns": "<<Forms>>",
-            "Description": "<<FullPage>>",
-            "Merge Cells": "<<ContextMenu>>",
-            "Padding": "<<InlineStyler>>",
-            "pixels": "<<HorizontalRule>>"
-        },
-        "UnsavedChanges": {
-            "You have unsaved changes in the editor": ""
-        },
-        "WebKit": {
-            "The Paste button does not work in this browser for security reasons. Press CTRL-V on your keyboard to paste directly.": "<<Gecko>>"
-        },
-        "Xinha": {
-            "&#8212; font &#8212;": "",
-            "&#8212; size &#8212;": "",
-            "1 (8 pt)": "",
-            "2 (10 pt)": "",
-            "3 (12 pt)": "",
-            "4 (14 pt)": "",
-            "5 (18 pt)": "",
-            "6 (24 pt)": "",
-            "7 (36 pt)": "",
-            "Arial": "",
-            "Courier New": "",
-            "Create Statusbar": "",
-            "CTRL-0 (zero)": "",
-            "CTRL-1 .. CTRL-6": "",
-            "CTRL-A": "",
-            "CTRL-B": "",
-            "CTRL-C": "",
-            "CTRL-E": "",
-            "CTRL-I": "",
-            "CTRL-J": "",
-            "CTRL-L": "",
-            "CTRL-N": "",
-            "CTRL-R": "",
-            "CTRL-S": "",
-            "CTRL-U": "",
-            "CTRL-V": "",
-            "CTRL-X": "",
-            "CTRL-Y": "",
-            "CTRL-Z": "",
-            "Error Loading Xinha.  Developers, check the Error Console for information.": "",
-            "Finishing": "",
-            "Generate Xinha framework": "",
-            "Georgia": "",
-            "Impact": "",
-            "Loading Core": "",
-            "Loading in progress. Please wait!": "",
-            "Loading plugin $plugin": "",
-            "Loading plugins": "",
-            "MS Word Cleaner": "",
-            "Select Color": "",
-            "Tahoma": "",
-            "Times New Roman": "",
-            "Touch here first to activate editor.": "",
-            "Verdana": "",
-            "Waiting for Iframe to load...": "",
-            "WingDings": "",
-            "Xinha": ""
-        },
-        "BackgroundImage": {
-            "__ TRANSLATOR NOTE __": "*** BACKGROUNDIMAGE IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***",
-            "Remove Current Background": "",
-            "Set Background": "",
-            "Set page background image": "",
-            "Set Page Background Image": ""
-        },
-        "ClientsideSpellcheck": {
-            "__ TRANSLATOR NOTE __": "*** CLIENTSIDESPELLCHECK IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***",
-            "Spell Check using ieSpell": ""
-        },
-        "ExtendedFileManager": {
-            "__ TRANSLATOR NOTE __": "*** EXTENDEDFILEMANAGER IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***",
-            "10%": "",
-            "100%": "",
-            "200%": "",
-            "25%": "",
-            "50%": "",
-            "75%": "",
-            ">List View": "",
-            ">Thumbnail View": "",
-            "A:": "",
-            "Align": "",
-            "Alt": "",
-            "Border Color": "",
-            "Constrain Proportions": "",
-            "Crop": "",
-            "D:": "",
-            "Directory": "",
-            "Directory Up": "",
-            "Edit": "",
-            "File List": "",
-            "File Manager": "",
-            "Filename:": "",
-            "Filesize:": "",
-            "Flip Horizontal": "",
-            "Flip Image": "",
-            "Flip Vertical": "",
-            "Folder": "",
-            "GIF": "",
-            "GIF format is not supported, image editing not supported.": "",
-            "H:": "",
-            "Image Editor": "",
-            "Image Selection": "",
-            "Invalid base directory:": "",
-            "JPEG High": "",
-            "JPEG Low": "",
-            "JPEG Medium": "",
-            "Loading": "",
-            "Lock": "",
-            "Marker": "",
-            "Maximum folder size limit reached. Upload disabled.": "",
-            "Measure": "",
-            "New Folder": "",
-            "No Files Found": "",
-            "No Image Available": "",
-            "Please enter value": "",
-            "PNG": "",
-            "Preset": "",
-            "Quality:": "",
-            "Refresh": "",
-            "Rename": "",
-            "Resize": "",
-            "Rotate": "",
-            "Rotate 180 &deg;": "",
-            "Rotate 90 &deg; CCW": "",
-            "Rotate 90 &deg; CW": "",
-            "Rotate Image": "",
-            "Start X:": "",
-            "Start Y:": "",
-            "Target Window": "",
-            "Toggle marker color": "",
-            "Trash": "",
-            "Upload": "",
-            "W:": "",
-            "X:": "",
-            "Xinha Image Editor": "",
-            "Y:": "",
-            "Zoom": "",
-            "Border": "<<InlineStyler>>",
-            "Clear": "<<FindReplace>>",
-            "Color": "<<HorizontalRule>>",
-            "Copy": "<<ContextMenu>>",
-            "Cut": "<<ContextMenu>>",
-            "Height": "<<HorizontalRule>>",
-            "Height:": "<<HorizontalRule>>",
-            "Insert File Link": "<<MootoolsFileManager>>",
-            "Margin": "<<InlineStyler>>",
-            "Padding": "<<InlineStyler>>",
-            "Save": "<<SaveSubmit>>",
-            "You must select some text before making a new link.": "<<Linker>>"
-        },
-        "Filter": {
-            "__ TRANSLATOR NOTE __": "*** FILTER IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***",
-            "Filter": "<<InsertSnippet2>>"
-        },
-        "HtmlTidy": {
-            "__ TRANSLATOR NOTE __": "*** HTMLTIDY IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***",
-            "Auto-Tidy": "",
-            "Don't Tidy": "",
-            "HTML Tidy": "",
-            "Tidy failed.  Check your HTML for syntax errors.": ""
-        },
-        "ImageManager": {
-            "__ TRANSLATOR NOTE __": "*** IMAGEMANAGER IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***",
-            "Angle:": "",
-            "Flickr Picture List": "",
-            "Flickr Pictures": "",
-            "Flickr Selection": "",
-            "Flickr Username/Email": "",
-            "Folder Name:": "",
-            "Image Format": "",
-            "Image List": "",
-            "Keyword": "",
-            "No Images Found": "",
-            "No Photos Found": "",
-            "No Videos Found": "",
-            "This Server": "",
-            "YouTube Selection": "",
-            "YouTube Username": "",
-            "YouTube Video List": "",
-            "YouTube Videos": "",
-            "A:": "<<ExtendedFileManager>>",
-            "Clear": "<<FindReplace>>",
-            "Constrain Proportions": "<<ExtendedFileManager>>",
-            "Crop": "<<ExtendedFileManager>>",
-            "D:": "<<ExtendedFileManager>>",
-            "Directory": "<<ExtendedFileManager>>",
-            "Directory Up": "<<ExtendedFileManager>>",
-            "Edit": "<<ExtendedFileManager>>",
-            "Filename:": "<<ExtendedFileManager>>",
-            "Flip Horizontal": "<<ExtendedFileManager>>",
-            "Flip Image": "<<ExtendedFileManager>>",
-            "Flip Vertical": "<<ExtendedFileManager>>",
-            "GIF": "<<ExtendedFileManager>>",
-            "GIF format is not supported, image editing not supported.": "<<ExtendedFileManager>>",
-            "H:": "<<ExtendedFileManager>>",
-            "Height:": "<<HorizontalRule>>",
-            "Image Editor": "<<ExtendedFileManager>>",
-            "Image Selection": "<<ExtendedFileManager>>",
-            "Invalid base directory:": "<<ExtendedFileManager>>",
-            "JPEG High": "<<ExtendedFileManager>>",
-            "JPEG Low": "<<ExtendedFileManager>>",
-            "JPEG Medium": "<<ExtendedFileManager>>",
-            "Lock": "<<ExtendedFileManager>>",
-            "Marker": "<<ExtendedFileManager>>",
-            "Measure": "<<ExtendedFileManager>>",
-            "New Folder": "<<ExtendedFileManager>>",
-            "No Image Available": "<<ExtendedFileManager>>",
-            "PNG": "<<ExtendedFileManager>>",
-            "Quality:": "<<ExtendedFileManager>>",
-            "Refresh": "<<ExtendedFileManager>>",
-            "Resize": "<<ExtendedFileManager>>",
-            "Rotate": "<<ExtendedFileManager>>",
-            "Rotate 180 &deg;": "<<ExtendedFileManager>>",
-            "Rotate 90 &deg; CCW": "<<ExtendedFileManager>>",
-            "Rotate 90 &deg; CW": "<<ExtendedFileManager>>",
-            "Rotate Image": "<<ExtendedFileManager>>",
-            "Save": "<<SaveSubmit>>",
-            "Start X:": "<<ExtendedFileManager>>",
-            "Start Y:": "<<ExtendedFileManager>>",
-            "Trash": "<<ExtendedFileManager>>",
-            "W:": "<<ExtendedFileManager>>",
-            "X:": "<<ExtendedFileManager>>",
-            "Y:": "<<ExtendedFileManager>>"
-        },
-        "InsertMarquee": {
-            "__ TRANSLATOR NOTE __": "*** INSERTMARQUEE IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***",
-            "Alternate": "",
-            "Background-Color:": "",
-            "Behavior:": "",
-            "Continuous": "",
-            "Direction:": "",
-            "Insert scrolling marquee": "",
-            "Marquee Editor": "",
-            "Scroll Amount:": "",
-            "Scroll Delay:": "",
-            "Slide": "",
-            "Speed Control": "",
-            "Height:": "<<HorizontalRule>>",
-            "Name": "<<Forms>>",
-            "Name/ID:": "<<Forms>>",
-            "Text:": "<<Forms>>"
-        },
-        "InsertPicture": {
-            "__ TRANSLATOR NOTE __": "*** INSERTPICTURE IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***",
-            "Leave empty for not defined": "",
-            " Open file in new window": "",
-            "Open file in new window": "",
-            "Upload file": "",
-            "Height:": "<<HorizontalRule>>",
-            "Size": "<<Forms>>"
-        },
-        "NoteServer": {
-            "__ TRANSLATOR NOTE __": "*** NOTESERVER IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***",
-            "120%": "",
-            "150%": "",
-            "80%": "",
-            "Add GUIDO Code in a textbox on the page": "",
-            "Add MIDI link to allow students to hear the music": "",
-            "Format": "",
-            "Guido code": "",
-            "GUIDO Code": "",
-            "Image in applet": "",
-            "Insert GUIDO Music Notation": "",
-            "MIDI File": "",
-            "Source Code": "",
-            "With Mozilla, the applet will not be visible in editor, but only in Web page after submitting.": "",
-            "Zoom :": "",
-            "100%": "<<ExtendedFileManager>>",
-            "Options": "<<FindReplace>>",
-            "Zoom": "<<ExtendedFileManager>>"
-        },
-        "PSLocal": {
-            "__ TRANSLATOR NOTE __": "*** PSLOCAL IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***",
-            "Confirm": "",
-            "Enable": "",
-            "Enable Gears in order to use local document storage and configuration.": "",
-            "Enabling Local Storage": "",
-            "Install": "",
-            "Learn About Local Storage": "",
-            "This will reload the page, causing you to lose any unsaved work.  Press \"OK\" to reload.": "",
-            "Xinha uses Google Gears to enable local document storage.  With Gears installed, you can save drafts of your documents on your hard drive, configure Xinha to look the way you want, and carry this information wherever you use Xinha on the web.": ""
-        },
-        "PSServer": {
-            "__ TRANSLATOR NOTE __": "*** PSSERVER IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***",
-            "File: ": "",
-            "Import": ""
-        },
-        "PersistentStorage": {
-            "__ TRANSLATOR NOTE __": "*** PERSISTENTSTORAGE IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***",
-            "Details": "",
-            "File Browser": "",
-            "Hello    There C ": "",
-            "Hello  There A ": "",
-            "Hello \" There B \"": "",
-            "Hello ' There D '": "",
-            "List of Places": "",
-            "New Document": "",
-            "Open": "",
-            "Open Document": "",
-            "Places": "",
-            "Please enter the name of the directory you'd like to create.": "",
-            "Save Document": "",
-            "This will erase any unsaved content.  If you're certain, please click OK to continue.": "",
-            "Web URL": "",
-            "Confirm": "<<PSLocal>>",
-            "Copy": "<<ContextMenu>>",
-            "Delete": "<<Abbreviation>>",
-            "Directory Up": "<<ExtendedFileManager>>",
-            "File List": "<<ExtendedFileManager>>",
-            "File Manager": "<<ExtendedFileManager>>",
-            "Filename": "<<ExtendedFileManager>>",
-            "Insert": "<<InsertNote>>",
-            "New Folder": "<<ExtendedFileManager>>",
-            "Save": "<<SaveSubmit>>",
-            "You must select some text before making a new link.": "<<Linker>>"
-        },
-        "SpellChecker": {
-            "__ TRANSLATOR NOTE __": "*** SPELLCHECKER IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***",
-            "Dictionary": "",
-            "Finished list of mispelled words": "",
-            "HTMLArea Spell Checker": "",
-            "I will open it in a new page.": "",
-            "Ignore": "",
-            "Ignore all": "",
-            "Info": "",
-            "Learn": "",
-            "No mispelled words found with the selected dictionary.": "",
-            "Original word": "",
-            "Please confirm that you want to open this link": "",
-            "Please wait.  Calling spell checker.": "",
-            "Please wait: changing dictionary to": "",
-            "pliz weit ;-)": "",
-            "Re-check": "",
-            "Replace": "",
-            "Replace all": "",
-            "Revert": "",
-            "Spell Checker": "",
-            "Spell-check": "",
-            "Suggestions": "",
-            "This will drop changes and quit spell checker.  Please confirm.": "",
-            "Replace with": "<<FindReplace>>"
-        },
-        "Template": {
-            "__ TRANSLATOR NOTE __": "*** TEMPLATE IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***",
-            "Insert template": ""
-        },
-        "UnFormat": {
-            "__ TRANSLATOR NOTE __": "*** UNFORMAT IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***",
-            "All": "",
-            "All HTML:": "",
-            "Cleaning Area": "",
-            "Cleaning options": "",
-            "Formatting:": "",
-            "Page Cleaner": "",
-            "Select which types of formatting you would like to remove.": "",
-            "Selection": ""
-        }
-    }
-}
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/lang/merged/fi.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/lang/merged/fi.js
deleted file mode 100644
index ca95eab..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/lang/merged/fi.js
+++ /dev/null
@@ -1,1575 +0,0 @@
-// Xinha Language Combined Translation File
-//
-// LANG: "fi", ENCODING: UTF-8
-//
-// INSTRUCTIONS TO TRANSLATORS
-// ===========================================================================
-//
-// Your translation must be in UTF-8 Character Encoding.
-//
-// This is a JSON encoded file (plus comments), strings should be double-quote
-// only, do not use single quotes to surround strings - "hello", not 'hello'
-// do not have a trailing comma after the last entry in a section.
-//
-// Only full line comments are allowed (that a comments occupy entire lines).
-//
-// Search for the __NEW_TRANSLATIONS__ section below, this is where you will
-// want to focus, this section includes things that do not presently have a 
-// translation or for which the translation needs to be checked for accuracy.
-//
-// In the New Translations section a translation string is one of the following
-//
-//  "English String Here" : ""
-//     This means it is not translated yet, add your translation...
-//     "English String Here" : "Klingon String Here"
-//
-//  "English String Here" : "Translated String Here"
-//     This means that an existing translation for this string, in some other
-//     section has been found, and used.  Check that it is approprite for this
-//     section and if it is, that's fine leave it as is, otherwise change as
-//     appropriate.
-//
-//  "English String Here" : "<<AnotherSection>>"
-//     This means use the same translation for this string as <<AnotherSection>>
-//     this saves you re-tranlating strings.  If the Context of this section
-//     and the context of AnotherSection seem the same, that's fine leave it
-//     using that translation, but if this section needs a different translation, 
-//     you can provide it by replacing the link (<<AnotherSection>>) with that
-//     new translation.  For example - a "Table" in say "DataPlugin" is 
-//     perhaps translated differently to "Table" in "FurniturePlugin".
-//
-// TESTING YOUR TRANSLATION
-// ===========================================================================
-// Simply place your translation file on your webserver somewhere for example
-//
-//   /xinha/lang/merged/fi.js
-//
-// and then tell Xinha where to get it (before loading XinhaCore.js) by 
-//
-//  _editor_lang              = 'fi';
-//  _editor_lang_merged_file  = '/xinha/lang/merged/fi.js';
-//
-// Xinha will load your new language definition.
-//
-// SUBMITTING YOUR TRANSLATION
-// ===========================================================================
-// Simply create a Ticket on the Xinha website and attach your translation 
-// file.
-//
-// The Xinha developers will take your file and use the 
-//     contrib/lc_split_merged_file.php
-// script to load it into the Xinha distribution.
-
-{
-    "Abbreviation": {
-        "Cancel": "Peruuta",
-        "OK": "Hyväksy"
-    },
-    "AboutBox": {
-        "About this editor": "Tietoja editorista"
-    },
-    "BackgroundImage": {
-        "Cancel": "Peruuta"
-    },
-    "ColorPicker": {
-        "Color: ": "Väri",
-        "OK": "Hyväksy"
-    },
-    "ContextMenu": {
-        "Justify Center": "Keskitä",
-        "Justify Full": "Tasaa molemmat reunat",
-        "Justify Left": "Tasaa vasemmat reunat",
-        "Justify Right": "Tasaa oikeat reunat"
-    },
-    "CreateLink": {
-        "Cancel": "Peruuta",
-        "OK": "Hyväksy"
-    },
-    "EditTag": {
-        "Cancel": "Peruuta",
-        "OK": "Hyväksy"
-    },
-    "Equation": {
-        "Cancel": "Peruuta",
-        "OK": "Hyväksy"
-    },
-    "ExtendedFileManager": {
-        "Align": "Kohdistus",
-        "Baseline": "Takaraja",
-        "Border": "Reuna",
-        "Bottom": "Alle",
-        "Cancel": "Peruuta",
-        "Color": "Väri",
-        "Left": "Vasen",
-        "Margin": "Marginaali",
-        "Middle": "Keskelle",
-        "OK": "Hyväksy",
-        "Padding": "Palstantäyte",
-        "Right": "Oikea",
-        "Top": "Ylös",
-        "Width": "Leveys",
-        "Width:": "Leveys"
-    },
-    "Forms": {
-        "Cancel": "Peruuta",
-        "Image URL:": "Kuvan osoite",
-        "OK": "Hyväksy"
-    },
-    "FullPage": {
-        "Cancel": "Peruuta",
-        "Description:": "Kuvaus",
-        "OK": "Hyväksy"
-    },
-    "HorizontalRule": {
-        "Cancel": "Peruuta",
-        "Center": "Keskelle",
-        "Color:": "Väri",
-        "Horizontal Rule": "Vaakaviiva",
-        "Layout": "Sommittelu",
-        "Left": "Vasen",
-        "OK": "Hyväksy",
-        "Right": "Oikea",
-        "Width:": "Leveys",
-        "percent": "prosenttia",
-        "pixels": "pikseliä"
-    },
-    "ImageManager": {
-        "Baseline": "Takaraja",
-        "Bottom": "Alle",
-        "Cancel": "Peruuta",
-        "Left": "Vasen",
-        "Middle": "Keskelle",
-        "OK": "Hyväksy",
-        "Right": "Oikea",
-        "Top": "Ylös",
-        "Width:": "Leveys"
-    },
-    "InlineStyler": {
-        "Background": "Tausta",
-        "Baseline": "Takaraja",
-        "Border": "Reuna",
-        "Bottom": "Alle",
-        "Center": "Keskelle",
-        "Char": "Merkki",
-        "Collapsed borders": "Luhistetut reunat",
-        "FG Color": "FG Väri",
-        "Image URL": "Kuvan osoite",
-        "Layout": "Sommittelu",
-        "Left": "Vasen",
-        "Margin": "Marginaali",
-        "Middle": "Keskelle",
-        "Padding": "Palstantäyte",
-        "Right": "Oikea",
-        "Top": "Ylös",
-        "Vertical align": "Vertikaali kohdistus",
-        "Width": "Leveys",
-        "percent": "prosenttia",
-        "pixels": "pikseliä"
-    },
-    "InsertAnchor": {
-        "Cancel": "Peruuta",
-        "OK": "Hyväksy"
-    },
-    "InsertImage": {
-        "Baseline": "Takaraja",
-        "Bottom": "Alle",
-        "Cancel": "Peruuta",
-        "Image URL:": "Kuvan osoite",
-        "Layout": "Sommittelu",
-        "Left": "Vasen",
-        "Middle": "Keskelle",
-        "OK": "Hyväksy",
-        "Right": "Oikea",
-        "Spacing": "Palstatila",
-        "Top": "Ylös"
-    },
-    "InsertMarquee": {
-        "Cancel": "Peruuta",
-        "Left": "Vasen",
-        "OK": "Hyväksy",
-        "Right": "Oikea",
-        "Width:": "Leveys"
-    },
-    "InsertNote": {
-        "Cancel": "Peruuta"
-    },
-    "InsertPicture": {
-        "Baseline": "Takaraja",
-        "Bottom": "Alle",
-        "Cancel": "Peruuta",
-        "Image URL:": "Kuvan osoite",
-        "Layout": "Sommittelu",
-        "Left": "Vasen",
-        "Middle": "Keskelle",
-        "OK": "Hyväksy",
-        "Right": "Oikea",
-        "Spacing": "Palstatila",
-        "Top": "Ylös",
-        "Width:": "Leveys"
-    },
-    "InsertSnippet": {
-        "Cancel": "Peruuta"
-    },
-    "InsertSnippet2": {
-        "Cancel": "Peruuta"
-    },
-    "InsertTable": {
-        "Baseline": "Takaraja",
-        "Border": "Reuna",
-        "Bottom": "Alle",
-        "Cancel": "Peruuta",
-        "Caption": "Otsikko",
-        "Insert Table": "Lisää taulukko",
-        "Layout": "Sommittelu",
-        "Left": "Vasen",
-        "Middle": "Keskelle",
-        "OK": "Hyväksy",
-        "Percent": "prosenttia",
-        "Pixels": "pikseliä",
-        "Right": "Oikea",
-        "Spacing": "Palstatila",
-        "Top": "Ylös",
-        "Width:": "Leveys"
-    },
-    "Linker": {
-        "Cancel": "Peruuta",
-        "OK": "Hyväksy"
-    },
-    "NoteServer": {
-        "Cancel": "Peruuta",
-        "OK": "Hyväksy"
-    },
-    "PSLocal": {
-        "Cancel": "Peruuta"
-    },
-    "PasteText": {
-        "Cancel": "Peruuta",
-        "OK": "Hyväksy"
-    },
-    "PersistentStorage": {
-        "Cancel": "Peruuta"
-    },
-    "QuickTag": {
-        "Cancel": "Peruuta"
-    },
-    "SetId": {
-        "Cancel": "Peruuta",
-        "OK": "Hyväksy"
-    },
-    "SmartReplace": {
-        "OK": "Hyväksy"
-    },
-    "SpellChecker": {
-        "Cancel": "Peruuta",
-        "OK": "Hyväksy"
-    },
-    "SuperClean": {
-        "Cancel": "Peruuta",
-        "OK": "Hyväksy"
-    },
-    "TableOperations": {
-        "All four sides": "Kaikki neljä sivua",
-        "Borders": "Reunat",
-        "Cancel": "Peruuta",
-        "Caption": "Otsikko",
-        "Cell Properties": "Solun asetukset",
-        "Cell properties": "Solun asetukset",
-        "Delete cell": "Poista solu",
-        "Delete column": "Poista sarake",
-        "Delete row": "Poista rivi",
-        "Description": "Kuvaus",
-        "Frames": "Kehykset",
-        "Insert cell after": "Lisää solu perään",
-        "Insert cell before": "Lisää solu ennen",
-        "Insert column after": "Lisää sarake perään",
-        "Insert column before": "Lisää sarake ennen",
-        "Insert row after": "Lisää rivi alapuolelle",
-        "Insert row before": "Lisää rivi yläpuolelle",
-        "Merge cells": "Yhdistä solut",
-        "No rules": "Ei viivoja",
-        "No sides": "Ei sivuja",
-        "OK": "Hyväksy",
-        "Padding": "Palstantäyte",
-        "Row Properties": "Rivin asetukset",
-        "Row properties": "Rivin asetukset",
-        "Rules will appear between all rows and columns": "Viivat jokaisen rivin ja sarakkeen välillä",
-        "Rules will appear between columns only": "Viivat ainoastaan sarakkeiden välillä",
-        "Rules will appear between rows only": "Viivat ainoastaan rivien välillä",
-        "Spacing": "Palstatila",
-        "Split column": "Jaa sarake",
-        "Split row": "Jaa rivi",
-        "Summary": "Yhteenveto",
-        "Table Properties": "Taulukon asetukset",
-        "Table properties": "Taulukon asetukset",
-        "The bottom side only": "Ainoastaan alapuolelle",
-        "The left-hand side only": "Ainoastaan vasenreuna",
-        "The right and left sides only": "Oikea- ja vasenreuna",
-        "The right-hand side only": "Ainoastaan oikeareuna",
-        "The top and bottom sides only": "Ylä- ja alapuoli.",
-        "The top side only": "Ainoastaan yläpuoli",
-        "Xinha cowardly refuses to delete the last cell in row.": "Ei voida poistaa viimeistä solua rivistä.",
-        "Xinha cowardly refuses to delete the last column in table.": "Ei voida poistaa viimeistä saraketta taulusta.",
-        "Xinha cowardly refuses to delete the last row in table.": "Ei voida poistaa viimeistä riviä taulusta.",
-        "pixels": "pikseliä"
-    },
-    "Template": {
-        "Cancel": "Peruuta"
-    },
-    "UnFormat": {
-        "Cancel": "Peruuta",
-        "OK": "Hyväksy"
-    },
-    "Xinha": {
-        "About this editor": "Tietoja editorista",
-        "Background Color": "Taustaväri",
-        "Bold": "Lihavoitu",
-        "Bulleted List": "Luettelomerkit",
-        "Copy selection": "Kopioi maalattu",
-        "Current style": "Nykyinen tyyli",
-        "Cut selection": "Leikkaa maalattu",
-        "Decrease Indent": "Pienennä sisennystä",
-        "Font Color": "Fontin väri",
-        "Help using editor": "Näytä ohje",
-        "Horizontal Rule": "Vaakaviiva",
-        "Increase Indent": "Lisää sisennystä",
-        "Insert Table": "Lisää taulukko",
-        "Insert Web Link": "Lisää linkki",
-        "Insert/Modify Image": "Lisää kuva",
-        "Italic": "Kursivoitu",
-        "Justify Center": "Keskitä",
-        "Justify Full": "Tasaa molemmat reunat",
-        "Justify Left": "Tasaa vasemmat reunat",
-        "Justify Right": "Tasaa oikeat reunat",
-        "Ordered List": "Numerointi",
-        "Paste from clipboard": "Liitä leikepyödältä",
-        "Redoes your last action": "Palauta viimeinen toiminto",
-        "Strikethrough": "Yliviivattu",
-        "Subscript": "Alaindeksi",
-        "Superscript": "Yläindeksi",
-        "Toggle HTML Source": "HTML-lähdekoodi vs WYSIWYG",
-        "Underline": "Alleviivattu",
-        "Undoes your last action": "Peruuta viimeinen toiminto"
-    },
-    "__NEW_TRANSLATIONS__": {
-        "Abbreviation": {
-            "Abbreviation": "",
-            "Delete": "",
-            "Expansion:": ""
-        },
-        "AboutBox": {
-            "Close": "<<Xinha>>"
-        },
-        "CharCounter": {
-            "... in progress": "",
-            "Chars": "",
-            "HTML": "",
-            "Words": ""
-        },
-        "CharacterMap": {
-            "Insert special character": ""
-        },
-        "ColorPicker": {
-            "Click a color...": "",
-            "Sample": "",
-            "Web Safe: ": "",
-            "Close": "<<Xinha>>"
-        },
-        "ContextMenu": {
-            "_Delete Row": "",
-            "_Image Properties...": "",
-            "_Modify Link...": "",
-            "_Remove Link...": "",
-            "_Table Properties...": "",
-            "C_ell Properties...": "",
-            "Chec_k Link...": "",
-            "Copy": "",
-            "Create a link": "",
-            "Current URL is": "",
-            "Cut": "",
-            "De_lete Column": "",
-            "Delete Cell": "",
-            "Delete the current column": "",
-            "Delete the current row": "",
-            "How did you get here? (Please report!)": "",
-            "I_nsert Row Before": "",
-            "In_sert Row After": "",
-            "Insert _Column Before": "",
-            "Insert a new column after the current one": "",
-            "Insert a new column before the current one": "",
-            "Insert a new row after the current one": "",
-            "Insert a new row before the current one": "",
-            "Insert a paragraph after the current node": "",
-            "Insert a paragraph before the current node": "",
-            "Insert C_olumn After": "",
-            "Insert Cell After": "",
-            "Insert Cell Before": "",
-            "Insert paragraph after": "",
-            "Insert paragraph before": "",
-            "Link points to:": "",
-            "Make lin_k...": "",
-            "Merge Cells": "",
-            "Opens this link in a new window": "",
-            "Paste": "",
-            "Please confirm that you want to remove this element:": "",
-            "Please confirm that you want to unlink this element.": "",
-            "Remove the $elem Element...": "",
-            "Remove this node from the document": "",
-            "Ro_w Properties...": "",
-            "Show the image properties dialog": "",
-            "Show the Table Cell Properties dialog": "",
-            "Show the Table Properties dialog": "",
-            "Show the Table Row Properties dialog": "",
-            "Unlink the current element": ""
-        },
-        "CreateLink": {
-            "Are you sure you wish to remove this link?": "",
-            "Insert/Modify Link": "",
-            "New window (_blank)": "",
-            "None (use implicit)": "",
-            "Other": "",
-            "Same frame (_self)": "",
-            "Target:": "",
-            "Title (tooltip):": "",
-            "Top frame (_top)": "",
-            "URL:": "",
-            "You need to select some text before creating a link": ""
-        },
-        "DefinitionList": {
-            "definition description": "",
-            "definition list": "",
-            "definition term": ""
-        },
-        "Dialogs": {
-            "Some Text Here": ""
-        },
-        "DynamicCSS": {
-            "Choose stylesheet": "",
-            "Default": "",
-            "Undefined": ""
-        },
-        "EditTag": {
-            "Edit HTML for selected text": "",
-            "Edit Tag By Peg": "",
-            "Tag Editor": ""
-        },
-        "Equation": {
-            "!=": "",
-            "!in": "",
-            "&gt;-": "",
-            "&gt;=": "",
-            "&lt;=": "",
-            "&lt;=&gt;": "",
-            "&lt;x&gt;": "",
-            "&nbsp; `!` &nbsp;": "",
-            "&nbsp; `.` &nbsp;": "",
-            "&nbsp; `0` &nbsp;": "",
-            "&nbsp; `2` &nbsp;": "",
-            "&nbsp; `3` &nbsp;": "",
-            "&nbsp; `4` &nbsp;": "",
-            "&nbsp; `5` &nbsp;": "",
-            "&nbsp; `6` &nbsp;": "",
-            "&nbsp; `7` &nbsp;": "",
-            "&nbsp; `8` &nbsp;": "",
-            "&nbsp; `9` &nbsp;": "",
-            "&nbsp; `e` &nbsp;": "",
-            "&nbsp;&nbsp;`1` &nbsp;": "",
-            "&nbsp;`+{::}`&nbsp;": "",
-            "&nbsp;`-:\\ `": "",
-            "&nbsp;`-{::}`&nbsp;": "",
-            "&nbsp;`C`&nbsp;": "",
-            "&nbsp;`cos`": "",
-            "&nbsp;`ln`&nbsp;": "",
-            "&nbsp;`pi` &nbsp;": "",
-            "&nbsp;`sin`": "",
-            "&nbsp;`tan`": "",
-            "&nbsp;`times`&nbsp;": "",
-            "&quot;text&quot;": "",
-            "'+formula+'": "",
-            "((n),(k))": "",
-            "(x+1)/(x-1)": "",
-            "*": "",
-            "**": "",
-            "+-": "",
-            "-&gt;": "",
-            "-&lt;": "",
-            "-:": "",
-            "-=": "",
-            "//": "",
-            "/_": "",
-            ":.": "",
-            "=&gt;": "",
-            "@": "",
-            "[[a,b],[c,d]]": "",
-            "\\\\": "",
-            "\\nClick in the box to use your keyboard or use the buttons\\n": "",
-            "^^": "",
-            "^^^": "",
-            "__|": "",
-            "_|_": "",
-            "`!=`": "",
-            "`!in`": "",
-            "`&and;`": "",
-            "`&cap;`": "",
-            "`&cup;`": "",
-            "`&gt;-`": "",
-            "`&gt;=`": "",
-            "`&lt;=&gt;`": "",
-            "`&lt;=`": "",
-            "`&lt;x&gt;`": "",
-            "`&or;`": "",
-            "`&quot;text&quot;`": "",
-            "`((n),(k))`": "",
-            "`(x+1)/(x-1)`": "",
-            "`**`": "",
-            "`*`": "",
-            "`+-`": "",
-            "`-&gt;`": "",
-            "`-&lt;`": "",
-            "`-:`": "",
-            "`-=`": "",
-            "`//`": "",
-            "`/_`": "",
-            "`:.`": "",
-            "`=&gt;`": "",
-            "`@`": "",
-            "`[[a,b],[c,d]]`": "",
-            "`\\\\`": "",
-            "`__|`": "",
-            "`_|_`": "",
-            "`AA`": "",
-            "`aleph`": "",
-            "`alpha`": "",
-            "`and`": "",
-            "`bara`": "",
-            "`bba`": "",
-            "`bbba`": "",
-            "`beta`": "",
-            "`CC`": "",
-            "`cca`": "",
-            "`chi`": "",
-            "`darr`": "",
-            "`ddota`": "",
-            "`del`": "",
-            "`Delta`": "",
-            "`delta`": "",
-            "`diamond`": "",
-            "`dota`": "",
-            "`dy/dx`": "",
-            "`EE`": "",
-            "`epsi`": "",
-            "`eta`": "",
-            "`fra`": "",
-            "`Gamma`": "",
-            "`gamma`": "",
-            "`grad`": "",
-            "`harr`": "",
-            "`hArr`": "",
-            "`hata`": "",
-            "`if`": "",
-            "`in`": "",
-            "`int`": "",
-            "`iota`": "",
-            "`kappa`": "",
-            "`Lambda`": "",
-            "`lambda`": "",
-            "`lArr`": "",
-            "`larr`": "",
-            "`lim_(x-&gt;oo)`": "",
-            "`log`": "",
-            "`mu`": "",
-            "`NN`": "",
-            "`nn`": "",
-            "`not`": "",
-            "`nu`": "",
-            "`o+`": "",
-            "`o.`": "",
-            "`O/`": "",
-            "`oint`": "",
-            "`omega`": "",
-            "`Omega`": "",
-            "`oo`": "",
-            "`or`": "",
-            "`ox`": "",
-            "`phi`": "",
-            "`Phi`": "",
-            "`Pi`": "",
-            "`pi`": "",
-            "`prod`": "",
-            "`prop`": "",
-            "`Psi`": "",
-            "`psi`": "",
-            "`QQ`": "",
-            "`quad`": "",
-            "`rArr`": "",
-            "`rho`": "",
-            "`root(n)(x)`": "",
-            "`RR`": "",
-            "`sfa`": "",
-            "`Sigma`": "",
-            "`sigma`": "",
-            "`sqrt(x)`": "",
-            "`square`": "",
-            "`stackrel(-&gt;)(+)`": "",
-            "`sub`": "",
-            "`sube`": "",
-            "`sum`": "",
-            "`sup`": "",
-            "`supe`": "",
-            "`tau`": "",
-            "`Theta`": "",
-            "`theta`": "",
-            "`TT`": "",
-            "`tta`": "",
-            "`uarr`": "",
-            "`ula`": "",
-            "`upsilon`": "",
-            "`uu`": "",
-            "`veca`": "",
-            "`vv`": "",
-            "`x_(mn)`": "",
-            "`Xi`": "",
-            "`xi`": "",
-            "`xx`": "",
-            "`zeta`": "",
-            "`ZZ`": "",
-            "`|-&gt;`": "",
-            "`|--`": "",
-            "`|==`": "",
-            "`|__`": "",
-            "`|~`": "",
-            "`~=`": "",
-            "`~|`": "",
-            "`~~`": "",
-            "AA": "",
-            "aleph": "",
-            "alpha": "",
-            "and": "",
-            "AsciiMath Formula Input": "",
-            "AsciiMathML Example": "",
-            "bara": "",
-            "Based on ASCIIMathML by": "",
-            "bba": "",
-            "bbba": "",
-            "beta": "",
-            "CC": "",
-            "cca": "",
-            "chi": "",
-            "darr": "",
-            "ddota": "",
-            "del": "",
-            "delta": "",
-            "Delta": "",
-            "diamond": "",
-            "dota": "",
-            "dy/dx": "",
-            "EE": "",
-            "epsi": "",
-            "eta": "",
-            "For more information on AsciiMathML visit this page:": "",
-            "Formula Editor": "",
-            "fra": "",
-            "gamma": "",
-            "Gamma": "",
-            "grad": "",
-            "hArr": "",
-            "harr": "",
-            "hata": "",
-            "if": "",
-            "in": "",
-            "Input": "",
-            "int": "",
-            "int_a^bf(x)dx": "",
-            "iota": "",
-            "kappa": "",
-            "Lambda": "",
-            "lambda": "",
-            "larr": "",
-            "lArr": "",
-            "lim_(x-&gt;oo)": "",
-            "mu": "",
-            "NN": "",
-            "nn": "",
-            "nnn": "",
-            "not": "",
-            "nu": "",
-            "o+": "",
-            "o.": "",
-            "O/": "",
-            "oint": "",
-            "Omega": "",
-            "omega": "",
-            "oo": "",
-            "or": "",
-            "ox": "",
-            "phi": "",
-            "Phi": "",
-            "pi": "",
-            "Pi": "",
-            "Preview": "",
-            "prod": "",
-            "prop": "",
-            "psi": "",
-            "Psi": "",
-            "QQ": "",
-            "quad": "",
-            "rArr": "",
-            "rho": "",
-            "root(n)(x)": "",
-            "RR": "",
-            "sfa": "",
-            "sigma": "",
-            "Sigma": "",
-            "sqrt(x)": "",
-            "square": "",
-            "stackrel(-&gt;)(+)": "",
-            "sub": "",
-            "sube": "",
-            "sum": "",
-            "sum_(n=1)^oo": "",
-            "sup": "",
-            "supe": "",
-            "tau": "",
-            "Theta": "",
-            "theta": "",
-            "TT": "",
-            "tta": "",
-            "uarr": "",
-            "ula": "",
-            "upsilon": "",
-            "uu": "",
-            "uuu": "",
-            "veca": "",
-            "vv": "",
-            "vvv": "",
-            "x^(m+n)": "",
-            "x_(mn)": "",
-            "Xi": "",
-            "xi": "",
-            "xx": "",
-            "zeta": "",
-            "ZZ": "",
-            "|-&gt;": "",
-            "|--": "",
-            "|==": "",
-            "|__": "",
-            "|~": "",
-            "~=": "",
-            "~|": "",
-            "~~": ""
-        },
-        "FancySelects": {
-            "'+opt.text+'": ""
-        },
-        "FindReplace": {
-            "';\r\n  var tagc = '": "",
-            "Case sensitive search": "",
-            "Clear": "",
-            "Done": "",
-            "Enter the text you want to find": "",
-            "Find and Replace": "",
-            "found item": "",
-            "found items": "",
-            "Highlight": "",
-            "Inform a replacement word": "",
-            "Next": "",
-            "not found": "",
-            "Options": "",
-            "Replace with:": "",
-            "replaced item": "",
-            "replaced items": "",
-            "Search for:": "",
-            "Substitute all occurrences": "",
-            "Substitute this occurrence?": "",
-            "Undo": "",
-            "Whole words only": ""
-        },
-        "FormOperations": {
-            "Enter the name for new option.": "",
-            "Form Editor": "",
-            "Insert a check box.": "",
-            "Insert a Form.": "",
-            "Insert a multi-line text field.": "",
-            "Insert a radio button.": "",
-            "Insert a select field.": "",
-            "Insert a submit/reset button.": "",
-            "Insert a text, password or hidden field.": "",
-            "Message Sent": "",
-            "Please Select...": ""
-        },
-        "Forms": {
-            "'onClick'=": "",
-            "Access Key:": "",
-            "Action URL:": "",
-            "Button Script": "",
-            "Checked": "",
-            "Columns:": "",
-            "Default text (optional)": "",
-            "Dimensions": "",
-            "Disabled": "",
-            "Encoding:": "",
-            "For Control:": "",
-            "Form": "",
-            "Form Element: FIELDSET": "",
-            "Form Element: INPUT": "",
-            "Form Element: LABEL": "",
-            "Form Element: SELECT": "",
-            "Form Element: TEXTAREA": "",
-            "Form handler script": "",
-            "Form Name:": "",
-            "Get": "",
-            "Hard": "",
-            "Height in number of rows": "",
-            "HTML-Form to CGI (default)": "",
-            "Image source": "",
-            "Initial Text:": "",
-            "Insert/Edit Form": "",
-            "Insert/Edit Form Element FIELDSET": "",
-            "Insert/Edit Form Element INPUT": "",
-            "Insert/Edit Form Element LABEL": "",
-            "Insert/Edit Form Element SELECT": "",
-            "Insert/Edit Form Element TEXTAREA": "",
-            "Javascript for button click": "",
-            "Label:": "",
-            "Legend:": "",
-            "Max length:": "",
-            "Maximum number of characters accepted": "",
-            "Method:": "",
-            "multipart Form Data (File-Upload)": "",
-            "Name": "",
-            "Name of the form input": "",
-            "Name of the form select": "",
-            "name of the textarea": "",
-            "Name/ID:": "",
-            "normal": "",
-            "nowrap": "",
-            "Off": "",
-            "Physical": "",
-            "Please enter a Label": "",
-            "Post": "",
-            "pre": "",
-            "Read Only": "",
-            "Rows:": "",
-            "Size of text box in characters": "",
-            "Size:": "",
-            "Soft": "",
-            "Tab Index:": "",
-            "Target Frame:": "",
-            "Text:": "",
-            "URL of image": "",
-            "Value of the form input": "",
-            "Value:": "",
-            "Virtual": "",
-            "Width in number of characters": "",
-            "Wrap Mode:": "",
-            "You must enter a Name": "",
-            "Options": "<<FindReplace>>"
-        },
-        "FullPage": {
-            "...": "",
-            "Alternate style-sheet:": "",
-            "Background color:": "",
-            "Character set:": "",
-            "cyrillic (ISO-8859-5)": "",
-            "cyrillic (KOI8-R)": "",
-            "cyrillic (WINDOWS-1251)": "",
-            "DOCTYPE:": "",
-            "Document properties": "",
-            "Document title:": "",
-            "Keywords:": "",
-            "Primary style-sheet:": "",
-            "Text color:": "",
-            "UTF-8 (recommended)": "",
-            "western (ISO-8859-1)": ""
-        },
-        "FullScreen": {
-            "Maximize/Minimize Editor": ""
-        },
-        "Gecko": {
-            "The Paste button does not work in this browser for security reasons. Press CTRL-V on your keyboard to paste directly.": ""
-        },
-        "HorizontalRule": {
-            "&#x00d7;": "",
-            "&nbsp;": "",
-            "Alignment:": "",
-            "Height:": "",
-            "Insert/Edit Horizontal Rule": "",
-            "Insert/edit horizontal rule": "",
-            "No shading": "",
-            "Style": ""
-        },
-        "InlineStyler": {
-            "CSS Style": "",
-            "Float": "",
-            "Justify": "",
-            "None": "",
-            "Text align": "",
-            "-": "<<Equation>>",
-            "Height": "<<HorizontalRule>>"
-        },
-        "InsertAnchor": {
-            "Anchor name": "",
-            "Insert Anchor": "",
-            "Delete": "<<Abbreviation>>"
-        },
-        "InsertImage": {
-            "Absbottom": "",
-            "Absmiddle": "",
-            "Alternate text:": "",
-            "Border thickness:": "",
-            "Enter the image URL here": "",
-            "For browsers that don't support images": "",
-            "Horizontal padding": "",
-            "Horizontal:": "",
-            "Image Preview:": "",
-            "Insert Image": "",
-            "Leave empty for no border": "",
-            "Not set": "",
-            "Positioning of this image": "",
-            "Preview the image in a new window": "",
-            "Texttop": "",
-            "Vertical padding": "",
-            "Vertical:": "",
-            "You must enter the URL": "",
-            "Alignment:": "<<HorizontalRule>>",
-            "Preview": "<<Equation>>"
-        },
-        "InsertNote": {
-            "Insert": "",
-            "Insert footnote": "",
-            "Insert Note": ""
-        },
-        "InsertPagebreak": {
-            "Page break": "",
-            "Page Break": ""
-        },
-        "InsertSmiley": {
-            "Insert Smiley": ""
-        },
-        "InsertSnippet": {
-            "\\n  This is an information about something\\n": "",
-            "Hide preview": "",
-            "Insert as": "",
-            "Insert Snippet": "",
-            "InsertSnippet for Xinha": "",
-            "Link1": "",
-            "Link2": "",
-            "Link3": "",
-            "Link4": "",
-            "Link5": "",
-            "Show preview": "",
-            "This is an information about something": "",
-            "Variable": ""
-        },
-        "InsertSnippet2": {
-            "All Categories": "",
-            "Filter": "",
-            "Insert as HTML": "",
-            "Insert as template variable": "",
-            "Only search word beginning": "",
-            "HTML": "<<CharCounter>>",
-            "Insert Snippet": "<<InsertSnippet>>",
-            "InsertSnippet for Xinha": "<<InsertSnippet>>",
-            "Variable": "<<InsertSnippet>>"
-        },
-        "InsertTable": {
-            "Caption for the table": "",
-            "Cell padding:": "",
-            "Cell spacing:": "",
-            "Collapse borders:": "",
-            "Cols:": "",
-            "Em": "",
-            "Fixed width columns": "",
-            "Layou": "",
-            "Number of columns": "",
-            "Number of rows": "",
-            "Positioning of this table": "",
-            "Space between adjacent cells": "",
-            "Space between content and border in cell": "",
-            "Style of the border": "",
-            "Width of the table": "",
-            "Width unit": "",
-            "You must enter a number of columns": "",
-            "You must enter a number of rows": "",
-            "Absbottom": "<<InsertImage>>",
-            "Absmiddle": "<<InsertImage>>",
-            "Alignment:": "<<HorizontalRule>>",
-            "Border thickness:": "<<InsertImage>>",
-            "Leave empty for no border": "<<InsertImage>>",
-            "Not set": "<<InsertImage>>",
-            "Rows:": "<<Forms>>",
-            "Texttop": "<<InsertImage>>"
-        },
-        "LangMarks": {
-            "&mdash; language &mdash;": "",
-            "', '": "",
-            "English": "",
-            "French": "",
-            "Greek": "",
-            "language select": "",
-            "Latin": ""
-        },
-        "Linker": {
-            "(px)": "",
-            "Anchor-Link": "",
-            "Anchor:": "",
-            "Email Address:": "",
-            "Email Link": "",
-            "Location Bar:": "",
-            "Menu Bar:": "",
-            "Message Template:": "",
-            "New Window": "",
-            "Ordinary Link": "",
-            "Popup Window": "",
-            "PopupWindow": "",
-            "Remove Link": "",
-            "Resizeable:": "",
-            "Same Window (jump out of frames)": "",
-            "Scrollbars:": "",
-            "Shows On Hover": "",
-            "Status Bar:": "",
-            "Subject:": "",
-            "Title:": "",
-            "Toolbar:": "",
-            "URL Link": "",
-            "You must select some text before making a new link.": "",
-            "Are you sure you wish to remove this link?": "<<CreateLink>>",
-            "Insert/Modify Link": "<<CreateLink>>",
-            "Name:": "<<Forms>>",
-            "Size:": "<<Forms>>",
-            "Target:": "<<CreateLink>>",
-            "URL:": "<<CreateLink>>"
-        },
-        "ListType": {
-            "Choose list style type (for ordered lists)": "",
-            "Decimal numbers": "",
-            "Lower greek letters": "",
-            "Lower latin letters": "",
-            "Lower roman numbers": "",
-            "Upper latin letters": "",
-            "Upper roman numbers": ""
-        },
-        "MootoolsFileManager": {
-            "Insert File Link": "",
-            "You must select some text before making a new link.": "<<Linker>>"
-        },
-        "Opera": {
-            "MARK": "",
-            "The Paste button does not work in Mozilla based web browsers (technical security reasons). Press CTRL-V on your keyboard to paste directly.": ""
-        },
-        "PasteText": {
-            "Insert text in new paragraph": "",
-            "Paste as Plain Text": ""
-        },
-        "PreserveScripts": {
-            "JavaScript": "",
-            "PHP": ""
-        },
-        "QuickTag": {
-            "',\r\n                           'cl': '": "",
-            "ATTRIBUTES": "",
-            "Colors": "",
-            "Enter the TAG you want to insert": "",
-            "No CSS class avaiable": "",
-            "Ok": "",
-            "OPTIONS": "",
-            "Quick Tag Editor": "",
-            "TAGs": "",
-            "There are some unclosed quote": "",
-            "This attribute already exists in the TAG": "",
-            "You have to select some text": ""
-        },
-        "SaveSubmit": {
-            "in progress": "",
-            "Ready": "",
-            "Save": "",
-            "Saving...": ""
-        },
-        "SetId": {
-            "ID/Name:": "",
-            "Set Id and Name": "",
-            "Set Id/Name": "",
-            "Set ID/Name": "",
-            "Delete": "<<Abbreviation>>"
-        },
-        "SmartReplace": {
-            "ClosingDoubleQuotes": "",
-            "ClosingSingleQuote": "",
-            "Convert all quotes and dashes in the current document": "",
-            "Enable automatic replacements": "",
-            "OpeningDoubleQuotes": "",
-            "OpeningSingleQuote": "",
-            "SmartReplace": "",
-            "SmartReplace Settings": ""
-        },
-        "Stylist": {
-            "Styles": ""
-        },
-        "SuperClean": {
-            "Clean bad HTML from Microsoft Word.": "",
-            "Clean Selection Only": "",
-            "Clean up HTML": "",
-            "Cleaning Scope": "",
-            "General tidy up and correction of some problems.": "",
-            "Please select from the following cleaning options...": "",
-            "Please stand by while cleaning in process...": "",
-            "Remove alignment (left/right/justify).": "",
-            "Remove all classes (CSS).": "",
-            "Remove All HTML Tags": "",
-            "Remove all styles (CSS).": "",
-            "Remove custom font sizes.": "",
-            "Remove custom text colors.": "",
-            "Remove custom typefaces (font \"styles\").": "",
-            "Remove emphasis and annotations.": "",
-            "Remove lang attributes.": "",
-            "Remove Paragraphs": "",
-            "Remove superscripts and subscripts.": "",
-            "Replace directional quote marks with non-directional quote marks.": "",
-            "Vigorously purge HTML from Microsoft Word.": ""
-        },
-        "TableOperations": {
-            "Cell Type:": "",
-            "Cells down": "",
-            "Cells to the right, and": "",
-            "Do Not Change": "",
-            "Frame and borders": "",
-            "Header (th)": "",
-            "Merge current cell with:": "",
-            "Normal (td)": "",
-            "Please click into some cell": "",
-            "Spacing and padding": "",
-            "Columns": "<<Forms>>",
-            "Merge Cells": "<<ContextMenu>>",
-            "Rows": "<<Forms>>"
-        },
-        "UnsavedChanges": {
-            "You have unsaved changes in the editor": ""
-        },
-        "WebKit": {
-            "The Paste button does not work in this browser for security reasons. Press CTRL-V on your keyboard to paste directly.": "<<Gecko>>"
-        },
-        "Xinha": {
-            "&#8212; font &#8212;": "",
-            "&#8212; format &#8212;": "",
-            "&#8212; size &#8212;": "",
-            "1 (8 pt)": "",
-            "2 (10 pt)": "",
-            "3 (12 pt)": "",
-            "4 (14 pt)": "",
-            "5 (18 pt)": "",
-            "6 (24 pt)": "",
-            "7 (36 pt)": "",
-            "Address": "",
-            "Arial": "",
-            "Clean content pasted from Word": "",
-            "Clear Inline Font Specifications": "",
-            "Clear MSOffice tags": "",
-            "Close": "",
-            "Constructing object": "",
-            "Courier New": "",
-            "Create Statusbar": "",
-            "Create Toolbar": "",
-            "CTRL-0 (zero)": "",
-            "CTRL-1 .. CTRL-6": "",
-            "CTRL-A": "",
-            "CTRL-B": "",
-            "CTRL-C": "",
-            "CTRL-E": "",
-            "CTRL-I": "",
-            "CTRL-J": "",
-            "CTRL-L": "",
-            "CTRL-N": "",
-            "CTRL-R": "",
-            "CTRL-S": "",
-            "CTRL-U": "",
-            "CTRL-V": "",
-            "CTRL-X": "",
-            "CTRL-Y": "",
-            "CTRL-Z": "",
-            "Direction left to right": "",
-            "Direction right to left": "",
-            "Editor Help": "",
-            "ENTER": "",
-            "Error Loading Xinha.  Developers, check the Error Console for information.": "",
-            "Finishing": "",
-            "Formatted": "",
-            "Generate Xinha framework": "",
-            "Georgia": "",
-            "Heading 1": "",
-            "Heading 2": "",
-            "Heading 3": "",
-            "Heading 4": "",
-            "Heading 5": "",
-            "Heading 6": "",
-            "Headings": "",
-            "Impact": "",
-            "Init editor size": "",
-            "insert linebreak": "",
-            "Insert/Overwrite": "",
-            "Keyboard shortcuts": "",
-            "Loading Core": "",
-            "Loading in progress. Please wait!": "",
-            "Loading plugin $plugin": "",
-            "Loading plugins": "",
-            "MS Word Cleaner": "",
-            "new paragraph": "",
-            "Normal": "",
-            "Path": "",
-            "Print document": "",
-            "Register plugin $plugin": "",
-            "Remove formatting": "",
-            "Save as": "",
-            "Select all": "",
-            "Select Color": "",
-            "Set format to paragraph": "",
-            "SHIFT-ENTER": "",
-            "Split Block": "",
-            "Tahoma": "",
-            "The editor provides the following key combinations:": "",
-            "Times New Roman": "",
-            "Toggle Borders": "",
-            "Touch here first to activate editor.": "",
-            "Verdana": "",
-            "Waiting for Iframe to load...": "",
-            "WingDings": "",
-            "Would you like to clear font colours?": "",
-            "Would you like to clear font sizes?": "",
-            "Would you like to clear font typefaces?": "",
-            "Xinha": "",
-            "You are in TEXT MODE.  Use the [<>] button to switch back to WYSIWYG.": ""
-        },
-        "BackgroundImage": {
-            "__ TRANSLATOR NOTE __": "*** BACKGROUNDIMAGE IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***",
-            "Remove Current Background": "",
-            "Set Background": "",
-            "Set page background image": "",
-            "Set Page Background Image": ""
-        },
-        "ClientsideSpellcheck": {
-            "__ TRANSLATOR NOTE __": "*** CLIENTSIDESPELLCHECK IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***",
-            "Spell Check using ieSpell": ""
-        },
-        "ExtendedFileManager": {
-            "__ TRANSLATOR NOTE __": "*** EXTENDEDFILEMANAGER IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***",
-            "10%": "",
-            "100%": "",
-            "200%": "",
-            "25%": "",
-            "50%": "",
-            "75%": "",
-            ">List View": "",
-            ">Thumbnail View": "",
-            "A:": "",
-            "Alt": "",
-            "Border Color": "",
-            "Constrain Proportions": "",
-            "Crop": "",
-            "D:": "",
-            "Directory": "",
-            "Directory Up": "",
-            "Edit": "",
-            "File List": "",
-            "File Manager": "",
-            "Filename:": "",
-            "Filesize:": "",
-            "Flip Horizontal": "",
-            "Flip Image": "",
-            "Flip Vertical": "",
-            "Folder": "",
-            "GIF": "",
-            "GIF format is not supported, image editing not supported.": "",
-            "H:": "",
-            "Image Editor": "",
-            "Image Selection": "",
-            "Invalid base directory:": "",
-            "JPEG High": "",
-            "JPEG Low": "",
-            "JPEG Medium": "",
-            "Loading": "",
-            "Lock": "",
-            "Marker": "",
-            "Maximum folder size limit reached. Upload disabled.": "",
-            "Measure": "",
-            "New Folder": "",
-            "No Files Found": "",
-            "No Image Available": "",
-            "Please enter value": "",
-            "PNG": "",
-            "Preset": "",
-            "Quality:": "",
-            "Refresh": "",
-            "Rename": "",
-            "Resize": "",
-            "Rotate": "",
-            "Rotate 180 &deg;": "",
-            "Rotate 90 &deg; CCW": "",
-            "Rotate 90 &deg; CW": "",
-            "Rotate Image": "",
-            "Start X:": "",
-            "Start Y:": "",
-            "Target Window": "",
-            "Toggle marker color": "",
-            "Trash": "",
-            "Upload": "",
-            "W:": "",
-            "X:": "",
-            "Xinha Image Editor": "",
-            "Y:": "",
-            "Zoom": "",
-            "Absbottom": "<<InsertImage>>",
-            "Absmiddle": "<<InsertImage>>",
-            "Clear": "<<FindReplace>>",
-            "Copy": "<<ContextMenu>>",
-            "Cut": "<<ContextMenu>>",
-            "Height": "<<HorizontalRule>>",
-            "Height:": "<<HorizontalRule>>",
-            "Insert File Link": "<<MootoolsFileManager>>",
-            "New window (_blank)": "<<CreateLink>>",
-            "None (use implicit)": "<<CreateLink>>",
-            "Not set": "<<InsertImage>>",
-            "Positioning of this image": "<<InsertImage>>",
-            "Preview": "<<Equation>>",
-            "Same frame (_self)": "<<CreateLink>>",
-            "Save": "<<SaveSubmit>>",
-            "Texttop": "<<InsertImage>>",
-            "Title (tooltip)": "<<CreateLink>>",
-            "Top frame (_top)": "<<CreateLink>>",
-            "You must select some text before making a new link.": "<<Linker>>"
-        },
-        "Filter": {
-            "__ TRANSLATOR NOTE __": "*** FILTER IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***",
-            "Filter": "<<InsertSnippet2>>"
-        },
-        "HtmlTidy": {
-            "__ TRANSLATOR NOTE __": "*** HTMLTIDY IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***",
-            "Auto-Tidy": "",
-            "Don't Tidy": "",
-            "HTML Tidy": "",
-            "Tidy failed.  Check your HTML for syntax errors.": ""
-        },
-        "ImageManager": {
-            "__ TRANSLATOR NOTE __": "*** IMAGEMANAGER IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***",
-            "Angle:": "",
-            "Flickr Picture List": "",
-            "Flickr Pictures": "",
-            "Flickr Selection": "",
-            "Flickr Username/Email": "",
-            "Folder Name:": "",
-            "Image Format": "",
-            "Image List": "",
-            "Keyword": "",
-            "No Images Found": "",
-            "No Photos Found": "",
-            "No Videos Found": "",
-            "This Server": "",
-            "YouTube Selection": "",
-            "YouTube Username": "",
-            "YouTube Video List": "",
-            "YouTube Videos": "",
-            "A:": "<<ExtendedFileManager>>",
-            "Absbottom": "<<InsertImage>>",
-            "Absmiddle": "<<InsertImage>>",
-            "Clear": "<<FindReplace>>",
-            "Constrain Proportions": "<<ExtendedFileManager>>",
-            "Crop": "<<ExtendedFileManager>>",
-            "D:": "<<ExtendedFileManager>>",
-            "Directory": "<<ExtendedFileManager>>",
-            "Directory Up": "<<ExtendedFileManager>>",
-            "Edit": "<<ExtendedFileManager>>",
-            "Filename:": "<<ExtendedFileManager>>",
-            "Flip Horizontal": "<<ExtendedFileManager>>",
-            "Flip Image": "<<ExtendedFileManager>>",
-            "Flip Vertical": "<<ExtendedFileManager>>",
-            "GIF": "<<ExtendedFileManager>>",
-            "GIF format is not supported, image editing not supported.": "<<ExtendedFileManager>>",
-            "H:": "<<ExtendedFileManager>>",
-            "Height:": "<<HorizontalRule>>",
-            "Image Editor": "<<ExtendedFileManager>>",
-            "Image Selection": "<<ExtendedFileManager>>",
-            "Insert Image": "<<InsertImage>>",
-            "Invalid base directory:": "<<ExtendedFileManager>>",
-            "JPEG High": "<<ExtendedFileManager>>",
-            "JPEG Low": "<<ExtendedFileManager>>",
-            "JPEG Medium": "<<ExtendedFileManager>>",
-            "Lock": "<<ExtendedFileManager>>",
-            "Marker": "<<ExtendedFileManager>>",
-            "Measure": "<<ExtendedFileManager>>",
-            "New Folder": "<<ExtendedFileManager>>",
-            "No Image Available": "<<ExtendedFileManager>>",
-            "Not set": "<<InsertImage>>",
-            "PNG": "<<ExtendedFileManager>>",
-            "Positioning of this image": "<<InsertImage>>",
-            "Quality:": "<<ExtendedFileManager>>",
-            "Refresh": "<<ExtendedFileManager>>",
-            "Resize": "<<ExtendedFileManager>>",
-            "Rotate": "<<ExtendedFileManager>>",
-            "Rotate 180 &deg;": "<<ExtendedFileManager>>",
-            "Rotate 90 &deg; CCW": "<<ExtendedFileManager>>",
-            "Rotate 90 &deg; CW": "<<ExtendedFileManager>>",
-            "Rotate Image": "<<ExtendedFileManager>>",
-            "Save": "<<SaveSubmit>>",
-            "Start X:": "<<ExtendedFileManager>>",
-            "Start Y:": "<<ExtendedFileManager>>",
-            "Texttop": "<<InsertImage>>",
-            "Trash": "<<ExtendedFileManager>>",
-            "W:": "<<ExtendedFileManager>>",
-            "X:": "<<ExtendedFileManager>>",
-            "Y:": "<<ExtendedFileManager>>"
-        },
-        "InsertMarquee": {
-            "__ TRANSLATOR NOTE __": "*** INSERTMARQUEE IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***",
-            "Alternate": "",
-            "Background-Color:": "",
-            "Behavior:": "",
-            "Continuous": "",
-            "Direction:": "",
-            "Insert scrolling marquee": "",
-            "Marquee Editor": "",
-            "Scroll Amount:": "",
-            "Scroll Delay:": "",
-            "Slide": "",
-            "Speed Control": "",
-            "Height:": "<<HorizontalRule>>",
-            "Name": "<<Forms>>",
-            "Name/ID:": "<<Forms>>",
-            "Text:": "<<Forms>>"
-        },
-        "InsertPicture": {
-            "__ TRANSLATOR NOTE __": "*** INSERTPICTURE IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***",
-            "Leave empty for not defined": "",
-            "Open file in new window": "",
-            " Open file in new window": "",
-            "Upload file": "",
-            "Absbottom": "<<InsertImage>>",
-            "Absmiddle": "<<InsertImage>>",
-            "Alignment:": "<<HorizontalRule>>",
-            "Alternate text:": "<<InsertImage>>",
-            "Border thickness:": "<<InsertImage>>",
-            "Enter the image URL here": "<<InsertImage>>",
-            "For browsers that don't support images": "<<InsertImage>>",
-            "Height:": "<<HorizontalRule>>",
-            "Horizontal padding": "<<InsertImage>>",
-            "Horizontal:": "<<InsertImage>>",
-            "Image Preview:": "<<InsertImage>>",
-            "Insert Image": "<<InsertImage>>",
-            "Leave empty for no border": "<<InsertImage>>",
-            "Not set": "<<InsertImage>>",
-            "Positioning of this image": "<<InsertImage>>",
-            "Preview": "<<Equation>>",
-            "Preview the image in a new window": "<<InsertImage>>",
-            "Size": "<<Forms>>",
-            "Texttop": "<<InsertImage>>",
-            "Vertical padding": "<<InsertImage>>",
-            "Vertical:": "<<InsertImage>>"
-        },
-        "NoteServer": {
-            "__ TRANSLATOR NOTE __": "*** NOTESERVER IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***",
-            "120%": "",
-            "150%": "",
-            "80%": "",
-            "Add GUIDO Code in a textbox on the page": "",
-            "Add MIDI link to allow students to hear the music": "",
-            "Format": "",
-            "GUIDO Code": "",
-            "Guido code": "",
-            "Image in applet": "",
-            "Insert GUIDO Music Notation": "",
-            "MIDI File": "",
-            "Source Code": "",
-            "With Mozilla, the applet will not be visible in editor, but only in Web page after submitting.": "",
-            "Zoom :": "",
-            "100%": "<<ExtendedFileManager>>",
-            "Image Preview": "<<InsertImage>>",
-            "Options": "<<FindReplace>>",
-            "Preview": "<<Equation>>",
-            "Preview the image in a new window": "<<InsertImage>>",
-            "Zoom": "<<ExtendedFileManager>>"
-        },
-        "PSLocal": {
-            "__ TRANSLATOR NOTE __": "*** PSLOCAL IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***",
-            "Confirm": "",
-            "Enable": "",
-            "Enable Gears in order to use local document storage and configuration.": "",
-            "Enabling Local Storage": "",
-            "Install": "",
-            "Learn About Local Storage": "",
-            "This will reload the page, causing you to lose any unsaved work.  Press \"OK\" to reload.": "",
-            "Xinha uses Google Gears to enable local document storage.  With Gears installed, you can save drafts of your documents on your hard drive, configure Xinha to look the way you want, and carry this information wherever you use Xinha on the web.": ""
-        },
-        "PSServer": {
-            "__ TRANSLATOR NOTE __": "*** PSSERVER IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***",
-            "File: ": "",
-            "Import": ""
-        },
-        "PersistentStorage": {
-            "__ TRANSLATOR NOTE __": "*** PERSISTENTSTORAGE IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***",
-            "Details": "",
-            "File Browser": "",
-            "Hello    There C ": "",
-            "Hello  There A ": "",
-            "Hello \" There B \"": "",
-            "Hello ' There D '": "",
-            "List of Places": "",
-            "New Document": "",
-            "Open": "",
-            "Open Document": "",
-            "Places": "",
-            "Please enter the name of the directory you'd like to create.": "",
-            "Save Document": "",
-            "This will erase any unsaved content.  If you're certain, please click OK to continue.": "",
-            "Web URL": "",
-            "Confirm": "<<PSLocal>>",
-            "Copy": "<<ContextMenu>>",
-            "Delete": "<<Abbreviation>>",
-            "Directory Up": "<<ExtendedFileManager>>",
-            "File List": "<<ExtendedFileManager>>",
-            "File Manager": "<<ExtendedFileManager>>",
-            "Filename": "<<ExtendedFileManager>>",
-            "Insert": "<<InsertNote>>",
-            "Insert Image": "<<InsertImage>>",
-            "New Folder": "<<ExtendedFileManager>>",
-            "Save": "<<SaveSubmit>>",
-            "You must select some text before making a new link.": "<<Linker>>"
-        },
-        "SpellChecker": {
-            "__ TRANSLATOR NOTE __": "*** SPELLCHECKER IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***",
-            "Dictionary": "",
-            "Finished list of mispelled words": "",
-            "HTMLArea Spell Checker": "",
-            "I will open it in a new page.": "",
-            "Ignore": "",
-            "Ignore all": "",
-            "Info": "",
-            "Learn": "",
-            "No mispelled words found with the selected dictionary.": "",
-            "Original word": "",
-            "Please confirm that you want to open this link": "",
-            "Please wait.  Calling spell checker.": "",
-            "Please wait: changing dictionary to": "",
-            "pliz weit ;-)": "",
-            "Re-check": "",
-            "Replace": "",
-            "Replace all": "",
-            "Revert": "",
-            "Spell Checker": "",
-            "Spell-check": "",
-            "Suggestions": "",
-            "This will drop changes and quit spell checker.  Please confirm.": "",
-            "Replace with": "<<FindReplace>>"
-        },
-        "Template": {
-            "__ TRANSLATOR NOTE __": "*** TEMPLATE IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***",
-            "Insert template": ""
-        },
-        "UnFormat": {
-            "__ TRANSLATOR NOTE __": "*** UNFORMAT IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***",
-            "All": "",
-            "All HTML:": "",
-            "Cleaning Area": "",
-            "Cleaning options": "",
-            "Formatting:": "",
-            "Page Cleaner": "",
-            "Select which types of formatting you would like to remove.": "",
-            "Selection": ""
-        }
-    }
-}
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/lang/merged/fr.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/lang/merged/fr.js
deleted file mode 100644
index 99d978e..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/lang/merged/fr.js
+++ /dev/null
@@ -1,1570 +0,0 @@
-// Xinha Language Combined Translation File
-//
-// LANG: "fr", ENCODING: UTF-8
-//
-// INSTRUCTIONS TO TRANSLATORS
-// ===========================================================================
-//
-// Your translation must be in UTF-8 Character Encoding.
-//
-// This is a JSON encoded file (plus comments), strings should be double-quote
-// only, do not use single quotes to surround strings - "hello", not 'hello'
-// do not have a trailing comma after the last entry in a section.
-//
-// Only full line comments are allowed (that a comments occupy entire lines).
-//
-// Search for the __NEW_TRANSLATIONS__ section below, this is where you will
-// want to focus, this section includes things that do not presently have a 
-// translation or for which the translation needs to be checked for accuracy.
-//
-// In the New Translations section a translation string is one of the following
-//
-//  "English String Here" : ""
-//     This means it is not translated yet, add your translation...
-//     "English String Here" : "Klingon String Here"
-//
-//  "English String Here" : "Translated String Here"
-//     This means that an existing translation for this string, in some other
-//     section has been found, and used.  Check that it is approprite for this
-//     section and if it is, that's fine leave it as is, otherwise change as
-//     appropriate.
-//
-//  "English String Here" : "<<AnotherSection>>"
-//     This means use the same translation for this string as <<AnotherSection>>
-//     this saves you re-tranlating strings.  If the Context of this section
-//     and the context of AnotherSection seem the same, that's fine leave it
-//     using that translation, but if this section needs a different translation, 
-//     you can provide it by replacing the link (<<AnotherSection>>) with that
-//     new translation.  For example - a "Table" in say "DataPlugin" is 
-//     perhaps translated differently to "Table" in "FurniturePlugin".
-//
-// TESTING YOUR TRANSLATION
-// ===========================================================================
-// Simply place your translation file on your webserver somewhere for example
-//
-//   /xinha/lang/merged/fr.js
-//
-// and then tell Xinha where to get it (before loading XinhaCore.js) by 
-//
-//  _editor_lang              = 'fr';
-//  _editor_lang_merged_file  = '/xinha/lang/merged/fr.js';
-//
-// Xinha will load your new language definition.
-//
-// SUBMITTING YOUR TRANSLATION
-// ===========================================================================
-// Simply create a Ticket on the Xinha website and attach your translation 
-// file.
-//
-// The Xinha developers will take your file and use the 
-//     contrib/lc_split_merged_file.php
-// script to load it into the Xinha distribution.
-
-{
-    "Abbreviation": {
-        "Abbreviation": "Abréviation",
-        "Cancel": "Annuler",
-        "Delete": "Supprimer",
-        "Expansion:": "Explication",
-        "OK": "OK"
-    },
-    "AboutBox": {
-        "About this editor": "A propos",
-        "Close": "Fermer"
-    },
-    "BackgroundImage": {
-        "Cancel": "Annuler",
-        "Remove Current Background": "Supprimer le fond actuel",
-        "Set Page Background Image": "Définir l'Image de Fond",
-        "Set page background image": "Définir l'image de fond"
-    },
-    "CharCounter": {
-        "Chars": "Caractères",
-        "Words": "Mots"
-    },
-    "CharacterMap": {
-        "Insert special character": "Insérer un caractère spécial"
-    },
-    "ColorPicker": {
-        "Close": "Fermer",
-        "Color: ": "Couleur",
-        "OK": "OK"
-    },
-    "ContextMenu": {
-        "C_ell Properties...": "P_ropriétés de la cellule...",
-        "Chec_k Link...": "_Vérifier le lien...",
-        "Copy": "Copier",
-        "Create a link": "Créer un lien",
-        "Current URL is": "L'URL courante est",
-        "Cut": "Couper",
-        "De_lete Column": "_Supprimer la colonne",
-        "Delete the current column": "Supprimer cette colonne",
-        "Delete the current row": "Supprimer la rangée courante",
-        "How did you get here? (Please report!)": "Comment êtes-vous arrivé ici ? (Reportez le bug SVP !)",
-        "I_nsert Row Before": "Insérer une rangée a_vant",
-        "In_sert Row After": "Insér_er une rangée après",
-        "Insert C_olumn After": "Insérer une colonne après",
-        "Insert _Column Before": "I_nsérer une colonne avant",
-        "Insert a new column after the current one": "Insérer une nouvelle colonne après celle-ci",
-        "Insert a new column before the current one": "Insérer une nouvelle rangée avant celle-ci",
-        "Insert a new row after the current one": "Insérer une nouvelle rangée après celle-ci",
-        "Insert a new row before the current one": "Insérer une nouvelle rangée avant celle-ci",
-        "Insert a paragraph after the current node": "Insérer un paragraphe après le noeud courant",
-        "Insert a paragraph before the current node": "Insérer un paragraphe avant le noeud courant",
-        "Insert paragraph after": "Insérer un paragraphe après",
-        "Insert paragraph before": "Insérer un paragraphe avant",
-        "Justify Center": "Aligner au centre",
-        "Justify Full": "Justifier",
-        "Justify Left": "Aligner à gauche",
-        "Justify Right": "Aligner à droite",
-        "Link points to:": "Le lien pointe sur:",
-        "Make lin_k...": "Convertir en lien...",
-        "Opens this link in a new window": "Ouvrir ce lien dans une nouvelle fenêtre",
-        "Paste": "Coller",
-        "Please confirm that you want to remove this element:": "Confirmer la suppression de cet élément:",
-        "Please confirm that you want to unlink this element.": "Voulez-vous vraiment enlever le lien présent sur cet élément.",
-        "Remove the $elem Element...": "Supprimer Élément $elem...",
-        "Remove this node from the document": "Supprimer ce noeud du document",
-        "Ro_w Properties...": "Pr_opriétés de la rangée...",
-        "Show the Table Cell Properties dialog": "Afficher la boite de propriété des cellules",
-        "Show the Table Properties dialog": "Afficher la boite de propriété de tableau",
-        "Show the Table Row Properties dialog": "Afficher la boite de propriété des rangées",
-        "Show the image properties dialog": "Afficher le dialogue des propriétés d'image",
-        "Unlink the current element": "Enlever le lien sur cet élément",
-        "_Delete Row": "Suppr_imer une rangée",
-        "_Image Properties...": "_Propriétés de l'image...",
-        "_Modify Link...": "_Modifier le lien...",
-        "_Remove Link...": "_Supprimer le lien...",
-        "_Table Properties...": "Proprié_tés de la table..."
-    },
-    "CreateLink": {
-        "Are you sure you wish to remove this link?": "Confirmez-vous la suppression de ce lien ?",
-        "Cancel": "Annuler",
-        "Insert/Modify Link": "Insérer / Modifier un lien",
-        "New window (_blank)": "Nouvelle fenêtre (_blank)",
-        "None (use implicit)": "Aucune (implicite)",
-        "OK": "OK",
-        "Other": "Autre",
-        "Same frame (_self)": "Même frame (_self)",
-        "Target:": "Cible",
-        "Title (tooltip):": "Texte alternatif",
-        "Top frame (_top)": "Frame principale (_top)",
-        "URL:": "URL:",
-        "You need to select some text before creating a link": "Vous devez sélectionner du texte avant de créer un lien"
-    },
-    "DynamicCSS": {
-        "Choose stylesheet": "Choisir feuille de style",
-        "Default": "Défaut",
-        "Undefined": "Non défini"
-    },
-    "EditTag": {
-        "Cancel": "Annuler",
-        "Edit HTML for selected text": "Editer le code HTML du texte sélectionné",
-        "OK": "OK",
-        "Tag Editor": "Editeur de tag HTML"
-    },
-    "Equation": {
-        "Cancel": "Annuler",
-        "OK": "OK",
-        "Preview": "Aperçu "
-    },
-    "ExtendedFileManager": {
-        "Absbottom": "Absbottom",
-        "Absmiddle": "Absmiddle",
-        "Align": "Alignement",
-        "Alt": "Alt",
-        "Baseline": "Baseline",
-        "Border": "Bordure",
-        "Border Color": "Couleur de la bordure",
-        "Bottom": "Bas",
-        "Cancel": "Annuler",
-        "Clear": "Effacer",
-        "Color": "Couleur",
-        "Constrain Proportions": "Maintenir les proportions",
-        "Copy": "Copier",
-        "Crop": "Recadrer",
-        "Cut": "Couper",
-        "Directory": "Répertoire",
-        "Directory Up": "Remonter",
-        "Edit": "Modifier",
-        "File Manager": "Gestionnaire de fichiers",
-        "Filename:": "Nom du fichier:",
-        "Filesize:": "Taille du fichier:",
-        "Flip Horizontal": "Symétrie hor.",
-        "Flip Image": "Symétrie",
-        "Flip Vertical": "Symétrie ver.",
-        "GIF format is not supported, image editing not supported.": "Le format GIF n'est pas supporté, édition d'image impossible.",
-        "Height": "Hauteur",
-        "Height:": "Hauteur:",
-        "Insert File Link": "Insérer un lien vers fichier",
-        "Invalid base directory:": "Dossier racine invalide:",
-        "JPEG High": "JPEG haut",
-        "JPEG Low": "JPEG bas",
-        "JPEG Medium": "JPEG moyen",
-        "Left": "Gauche",
-        "Loading": "Chargement",
-        "Lock": "Verrouiller",
-        "Margin": "Marge",
-        "Marker": "Marqueur",
-        "Measure": "Règle",
-        "Middle": "Milieu",
-        "New Folder": "Nouveau dossier",
-        "New window (_blank)": "Nouvelle fenêtre (_blank)",
-        "No Files Found": "Aucun fichier",
-        "No Image Available": "Aucune image disponible",
-        "None (use implicit)": "Aucune (implicite)",
-        "Not set": "Indéfini",
-        "OK": "OK",
-        "Padding": "Marge intérieure",
-        "Positioning of this image": "Position de cette image",
-        "Preview": "Aperçu ",
-        "Quality:": "Qualité:",
-        "Refresh": "Actualiser",
-        "Rename": "Renommer",
-        "Resize": "Redimen.",
-        "Right": "Droite",
-        "Rotate": "Pivoter",
-        "Rotate Image": "Pivoter l'image",
-        "Same frame (_self)": "Même frame (_self)",
-        "Save": "Enregistrer",
-        "Start X:": "Départ X",
-        "Start Y:": "Départ Y",
-        "Target Window": "Fenêtre cible",
-        "Texttop": "Texttop",
-        "Title (tooltip)": "Tooltip",
-        "Toggle marker color": "Changer la couleur du marqueur",
-        "Top": "Haut",
-        "Top frame (_top)": "Frame principale (_top)",
-        "Trash": "Corbeille",
-        "Upload": "Envoyer",
-        "W:": "W:",
-        "Width": "Largeur",
-        "Width:": "Largeur:",
-        "You must select some text before making a new link.": "Vous devez sélectionner du texte avant de faire un nouveau lien.",
-        "Zoom": "Zoom"
-    },
-    "FindReplace": {
-        "Case sensitive search": "Recherche sensible à la casse",
-        "Clear": "Effacer",
-        "Done": "Fin",
-        "Enter the text you want to find": "Texte à trouver",
-        "Find and Replace": "Chercher et Remplacer",
-        "Highlight": "Surligner",
-        "Inform a replacement word": "Indiquez un mot de remplacement",
-        "Next": "Suivant",
-        "Options": "Options",
-        "Replace with:": "Remplacer par",
-        "Search for:": "Chercher",
-        "Substitute all occurrences": "Remplacer toutes les occurences",
-        "Substitute this occurrence?": "Remplacer cette occurrence ?",
-        "Undo": "Annuler",
-        "Whole words only": "Mots entiers seulement",
-        "found item": "élément trouvé",
-        "found items": "éléments trouvés",
-        "not found": "non trouvé",
-        "replaced item": "élément remplacé",
-        "replaced items": "éléments remplacés"
-    },
-    "FormOperations": {
-        "Insert a Form.": "Insérer un formulaire",
-        "Insert a check box.": "Insérer une case à cocher",
-        "Insert a multi-line text field.": "Insérer un champ texte à lignes multiples",
-        "Insert a radio button.": "Insérer un bouton radio",
-        "Insert a select field.": "Insérer une boite de sélection",
-        "Insert a submit/reset button.": "Insérer un bouton de soumission/annulation",
-        "Insert a text, password or hidden field.": "Insérer un texte, un mot de passe ou un champ invisible"
-    },
-    "Forms": {
-        "Cancel": "Annuler",
-        "Image URL:": "URL",
-        "Name": "Nom",
-        "Name/ID:": "Nom/ID",
-        "OK": "OK",
-        "Options": "Options",
-        "Rows:": "Lignes",
-        "Size:": "Taille",
-        "Text:": "Texte"
-    },
-    "FullPage": {
-        "Alternate style-sheet:": "Feuille CSS alternative",
-        "Background color:": "Couleur d'arrière plan",
-        "Cancel": "Annuler",
-        "Character set:": "Jeu de caractères",
-        "DOCTYPE:": "DOCTYPE",
-        "Description:": "Description",
-        "Document properties": "Propriétés du document",
-        "Document title:": "Titre du document",
-        "Keywords:": "Mots clés",
-        "OK": "OK",
-        "Primary style-sheet:": "Feuille CSS primaire",
-        "Text color:": "Couleur de texte",
-        "UTF-8 (recommended)": "UTF-8 (recommandé)"
-    },
-    "FullScreen": {
-        "Maximize/Minimize Editor": "Agrandir/Réduire l'éditeur"
-    },
-    "HorizontalRule": {
-        "Alignment:": "Alignement",
-        "Cancel": "Annuler",
-        "Center": "Centre",
-        "Color:": "Couleur",
-        "Height:": "Hauteur",
-        "Horizontal Rule": "Règle horizontale",
-        "Insert/edit horizontal rule": "Insérer une règle horizontale",
-        "Layout": "Layout",
-        "Left": "Gauche",
-        "No shading": "Pas d'ombre",
-        "OK": "OK",
-        "Right": "Droite",
-        "Style": "Style",
-        "Width:": "Largeur",
-        "percent": "pourcent",
-        "pixels": "pixels"
-    },
-    "HtmlTidy": {
-        "Auto-Tidy": "Tidy automatique",
-        "Don't Tidy": "Tidy non utilisé",
-        "HTML Tidy": "HTML Tidy",
-        "Tidy failed.  Check your HTML for syntax errors.": "Tidy a échoué. Vérifiez votre HTML for des erreurs de syntaxe"
-    },
-    "ImageManager": {
-        "Absbottom": "Absbottom",
-        "Absmiddle": "Absmiddle",
-        "Angle:": "Angle",
-        "Baseline": "Baseline",
-        "Bottom": "Bas",
-        "Cancel": "Annuler",
-        "Clear": "Effacer",
-        "Constrain Proportions": "Conserver les proportions",
-        "Crop": "Recadrer",
-        "Directory": "Répertoire",
-        "Directory Up": "Remonter",
-        "Edit": "Editer",
-        "Filename:": "Nom",
-        "Flip Horizontal": "Symétrie horizontale",
-        "Flip Image": "Symétrie",
-        "Flip Vertical": "Symétrie verticale",
-        "Folder Name:": "Nom du répertoire",
-        "GIF format is not supported, image editing not supported.": "Format GIF non supporté, édition d'image non supportée",
-        "Height:": "Hauteur",
-        "Image Format": "Format d'image",
-        "Insert Image": "Insérer une image",
-        "Invalid base directory:": "Répertoire de base invalide:",
-        "JPEG High": "JPEG haut",
-        "JPEG Low": "JPEG bas",
-        "JPEG Medium": "JPEG moyen",
-        "Left": "Gauche",
-        "Lock": "Cadenas",
-        "Marker": "Marqueur",
-        "Measure": "Mesure",
-        "Middle": "Milieu",
-        "New Folder": "Nouveau répertoire",
-        "No Image Available": "Aucune image disponible",
-        "No Images Found": "Aucune image trouvée",
-        "Not set": "Indéfini",
-        "OK": "OK",
-        "Positioning of this image": "Position de cette image",
-        "Quality:": "Qualité",
-        "Refresh": "Rafraîchir",
-        "Resize": "Retailler",
-        "Right": "Droite",
-        "Rotate": "Pivoter",
-        "Rotate Image": "Rotation",
-        "Save": "Sauver",
-        "Start X:": "Début X",
-        "Start Y:": "Début Y",
-        "Texttop": "Texttop",
-        "Top": "Haut",
-        "Trash": "Détruire",
-        "W:": "L:",
-        "Width:": "Largeur"
-    },
-    "InlineStyler": {
-        "Background": "Arrière plan",
-        "Baseline": "Baseline",
-        "Border": "Bordure",
-        "Bottom": "Bas",
-        "Center": "Centre",
-        "Char": "Charactère",
-        "Collapsed borders": "Bordure effondrés",
-        "FG Color": "Couleur de face",
-        "Float": "Flotteur",
-        "Height": "Hauteur",
-        "Image URL": "URL pour l'image",
-        "Justify": "Justifié",
-        "Layout": "Layout",
-        "Left": "Gauche",
-        "Margin": "Marge",
-        "Middle": "Milieu",
-        "None": "Aucun",
-        "Padding": "Remplissage",
-        "Right": "Droite",
-        "Text align": "Alignement",
-        "Top": "Haut",
-        "Vertical align": "Vertical",
-        "Width": "Largeur",
-        "percent": "pourcent",
-        "pixels": "pixels"
-    },
-    "InsertAnchor": {
-        "Anchor name": "Nom de l'ancre",
-        "Cancel": "Annuler",
-        "Delete": "Supprimer",
-        "Insert Anchor": "Insérer une ancre",
-        "OK": "OK"
-    },
-    "InsertImage": {
-        "Absbottom": "Absbottom",
-        "Absmiddle": "Absmiddle",
-        "Alignment:": "Alignement",
-        "Alternate text:": "Texte alternatif",
-        "Baseline": "Baseline",
-        "Border thickness:": "Epaisseur bordure",
-        "Bottom": "Bas",
-        "Cancel": "Annuler",
-        "Enter the image URL here": "Entrer l'URL de l'image ici",
-        "For browsers that don't support images": "Pour les navigateurs qui ne supportent pas les images",
-        "Horizontal padding": "Marge horizontale interne",
-        "Horizontal:": "Horizontal",
-        "Image Preview:": "Prévisualisation",
-        "Image URL:": "URL",
-        "Insert Image": "Insérer une image",
-        "Layout": "Layout",
-        "Leave empty for no border": "Laisser vide pour pas de bordure",
-        "Left": "Gauche",
-        "Middle": "Milieu",
-        "Not set": "Indéfini",
-        "OK": "OK",
-        "Positioning of this image": "Position de cette image",
-        "Preview": "Aperçu ",
-        "Preview the image in a new window": "Prévisualiser l'image dans une nouvelle fenêtre",
-        "Right": "Droite",
-        "Spacing": "Espacement",
-        "Texttop": "Texttop",
-        "Top": "Haut",
-        "Vertical padding": "Marge verticale interne",
-        "Vertical:": "Vertical",
-        "You must enter the URL": "Vous devez entrer l'URL"
-    },
-    "InsertMarquee": {
-        "Background-Color:": "Couleur de fond",
-        "Behavior:": "Comportement",
-        "Cancel": "Annuler",
-        "Direction:": "Direction",
-        "Height:": "Hauteur",
-        "Insert scrolling marquee": "Insérer marquee défilant",
-        "Left": "Gauche",
-        "Name": "Nom",
-        "Name/ID:": "Nom/ID",
-        "OK": "OK",
-        "Right": "Droite",
-        "Scroll Amount:": "Quantité de défilement",
-        "Scroll Delay:": "Délai du défilement",
-        "Speed Control": "Controle de vitesse",
-        "Text:": "Texte",
-        "Width:": "Largeur"
-    },
-    "InsertNote": {
-        "Cancel": "Annuler"
-    },
-    "InsertPagebreak": {
-        "Page break": "Séparateur de page"
-    },
-    "InsertPicture": {
-        "Absbottom": "Absbottom",
-        "Absmiddle": "Absmiddle",
-        "Alignment:": "Alignement",
-        "Alternate text:": "Texte alternatif",
-        "Baseline": "Baseline",
-        "Border thickness:": "Epaisseur bordure",
-        "Bottom": "Bas",
-        "Cancel": "Annuler",
-        "Enter the image URL here": "Entrer l'URL de l'image ici",
-        "For browsers that don't support images": "Pour les navigateurs qui ne supportent pas les images",
-        "Height:": "Hauteur",
-        "Horizontal padding": "Marge horizontale interne",
-        "Horizontal:": "Horizontal",
-        "Image Preview:": "Prévisualisation",
-        "Image URL:": "URL",
-        "Insert Image": "Insérer une image",
-        "Layout": "Layout",
-        "Leave empty for no border": "Laisser vide pour pas de bordure",
-        "Left": "Gauche",
-        "Middle": "Milieu",
-        "Not set": "Indéfini",
-        "OK": "OK",
-        "Open file in new window": "Ouvrir le fichier dans une nouvelle fenêtre",
-        "Positioning of this image": "Position de cette image",
-        "Preview": "Prévisualisation",
-        "Preview the image in a new window": "Prévisualiser l'image dans une nouvelle fenêtre",
-        "Right": "Droite",
-        "Size": "Taille",
-        "Spacing": "Espacement",
-        "Texttop": "Texttop",
-        "Top": "Haut",
-        "Upload file": "Télécharger",
-        "Vertical padding": "Marge verticale interne",
-        "Vertical:": "Vertical",
-        "Width:": "Largeur"
-    },
-    "InsertSmiley": {
-        "Insert Smiley": "Insérer un smiley"
-    },
-    "InsertSnippet": {
-        "Cancel": "Annuler"
-    },
-    "InsertSnippet2": {
-        "Cancel": "Annuler"
-    },
-    "InsertTable": {
-        "Absbottom": "Absbottom",
-        "Absmiddle": "Absmiddle",
-        "Alignment:": "Alignement",
-        "Baseline": "Baseline",
-        "Border": "Bordure",
-        "Border thickness:": "Epaisseur bordure",
-        "Bottom": "Bas",
-        "Cancel": "Annuler",
-        "Caption": "Étiquette",
-        "Cell padding:": "Marge interne",
-        "Cell spacing:": "Espacement",
-        "Cols:": "Colonnes",
-        "Em": "Em",
-        "Fixed width columns": "Colonnes à taille fixe",
-        "Insert Table": "Insérer un tableau",
-        "Layout": "Layout",
-        "Leave empty for no border": "Laisser vide pour pas de bordure",
-        "Left": "Gauche",
-        "Middle": "Milieu",
-        "Not set": "Indéfini",
-        "Number of columns": "Nombre de colonnes",
-        "Number of rows": "Nombre de lignes",
-        "OK": "OK",
-        "Percent": "Pourcent",
-        "Pixels": "Pixels",
-        "Positioning of this table": "Position du tableau",
-        "Right": "Droite",
-        "Rows:": "Lignes",
-        "Space between adjacent cells": "Espace entre les cellules adjacentes",
-        "Space between content and border in cell": "Espace entre le contenu et la bordure d'une cellule",
-        "Spacing": "Espacement",
-        "Texttop": "Texttop",
-        "Top": "Haut",
-        "Width of the table": "Largeur du tableau",
-        "Width unit": "Unités de largeur",
-        "Width:": "Largeur",
-        "You must enter a number of columns": "Vous devez entrer le nombre de colonnes",
-        "You must enter a number of rows": "Vous devez entrer le nombre de lignes"
-    },
-    "LangMarks": {
-        "&mdash; language &mdash;": "&mdash; Langue &mdash;",
-        "English": "anglais",
-        "French": "français",
-        "Greek": "grec",
-        "Latin": "latin",
-        "language select": "Sélection de la langue"
-    },
-    "Linker": {
-        "Are you sure you wish to remove this link?": "Confirmez-vous la suppression de ce lien ?",
-        "Cancel": "Annuler",
-        "Email Address:": "Adresse email",
-        "Email Link": "Lien email",
-        "Insert/Modify Link": "Insérer / Modifier un lien",
-        "Message Template:": "Message",
-        "Name:": "Nom",
-        "New Window": "Nouvelle fenêtre",
-        "OK": "OK",
-        "Ordinary Link": "Lien standard",
-        "Popup Window": "Fenêtre popup",
-        "Remove Link": "Supprimer",
-        "Same Window (jump out of frames)": "Même fenêtre (sort des frames)",
-        "Size:": "Taille",
-        "Subject:": "Sujet",
-        "Target:": "Cible",
-        "URL Link": "Lien URL",
-        "URL:": "URL:",
-        "You must select some text before making a new link.": "Vous devez sélectionner un texte avant de créer un nouveau lien"
-    },
-    "ListType": {
-        "Choose list style type (for ordered lists)": "Choisissez le style de liste (pour les listes ordonnées)",
-        "Decimal numbers": "Nombres décimaux",
-        "Lower greek letters": "Lettres grecques minuscule",
-        "Lower latin letters": "Lettres latines minuscule",
-        "Lower roman numbers": "Nombres romains minuscule",
-        "Upper latin letters": "Lettres latines majuscule",
-        "Upper roman numbers": "Nombres romains majuscule"
-    },
-    "MootoolsFileManager": {
-        "Insert File Link": "Insérer un lien vers fichier",
-        "You must select some text before making a new link.": "Vous devez sélectionner un texte avant de créer un nouveau lien"
-    },
-    "NoteServer": {
-        "Add GUIDO Code in a textbox on the page": "Ajouter le code source GUIDO dans un cadre",
-        "Add MIDI link to allow students to hear the music": "Ajouter un lien MIDI pour permettre aux étudiants d'écouter la partition",
-        "Cancel": "Annuler",
-        "Format": "Format",
-        "Guido code": "Code Guido",
-        "Image Preview": "Aperçu de l'image",
-        "Image in applet": "Image dans une applet",
-        "Insert GUIDO Music Notation": "Insérer une partition musicale GUIDO",
-        "MIDI File": "Fichier MIDI",
-        "OK": "OK",
-        "Options": "Options",
-        "Preview": "Aperçu ",
-        "Preview the image in a new window": "Prévisualiser l'image dans une nouvelle fenêtre",
-        "Source Code": "Code source",
-        "Zoom": "Zoom"
-    },
-    "Opera": {
-        "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."
-    },
-    "PSLocal": {
-        "Cancel": "Annuler"
-    },
-    "PasteText": {
-        "Cancel": "Annuler",
-        "OK": "OK",
-        "Paste as Plain Text": "Copier comme texte pur"
-    },
-    "PersistentStorage": {
-        "Cancel": "Annuler",
-        "Copy": "Copier",
-        "Delete": "Supprimer",
-        "Directory Up": "Remonter",
-        "File Manager": "Gestionnaire de fichiers",
-        "Filename": "Nom",
-        "Insert Image": "Insérer une image",
-        "New Folder": "Nouveau répertoire",
-        "Save": "Enregistrer",
-        "You must select some text before making a new link.": "Vous devez sélectionner un texte avant de créer un nouveau lien"
-    },
-    "QuickTag": {
-        "ATTRIBUTES": "ATTRIBUTS",
-        "Cancel": "Annuler",
-        "Colors": "Couleurs",
-        "Enter the TAG you want to insert": "Entrez la balise que vous voulez insérer",
-        "No CSS class avaiable": "Pas de classe CSS accessible",
-        "OPTIONS": "OPTIONS",
-        "Ok": "OK",
-        "Quick Tag Editor": "Editeur rapide de balise",
-        "TAGs": "Balises",
-        "There are some unclosed quote": "Il y a des apostrophes mal fermées",
-        "This attribute already exists in the TAG": "Cet attribute existe déjà sur cette balise",
-        "You have to select some text": "Vous devez sélectionner du texte"
-    },
-    "SaveSubmit": {
-        "Ready": "Prêt",
-        "Save": "Enregistrer",
-        "Saving...": "Enregistrement...",
-        "in progress": "en cours"
-    },
-    "SetId": {
-        "Cancel": "Annuler",
-        "Delete": "Supprimer",
-        "OK": "OK"
-    },
-    "SmartReplace": {
-        "ClosingDoubleQuotes": "«",
-        "Convert all quotes and dashes in the current document": "Convertir tous les guillemets et tirets dans le document actuel",
-        "Enable automatic replacements": "Activer le remplacement automatique",
-        "OK": "OK",
-        "OpeningDoubleQuotes": "»",
-        "SmartReplace Settings": "Paramètres SmartReplace"
-    },
-    "SpellChecker": {
-        "Cancel": "Annuler",
-        "Dictionary": "Dictionnaire",
-        "Finished list of mispelled words": "Liste des mots mal orthographiés",
-        "I will open it in a new page.": "Ouverture dans une nouvelle fenêtre",
-        "Ignore": "Ignorer",
-        "Ignore all": "Tout ignorer",
-        "No mispelled words found with the selected dictionary.": "Aucune erreur orthographique avec le dictionnaire sélectionné.",
-        "OK": "OK",
-        "Original word": "Mot original",
-        "Please confirm that you want to open this link": "Veuillez confirmer l'ouverture de ce lien",
-        "Please wait.  Calling spell checker.": "Veuillez patienter.  Appel du correcteur.",
-        "Please wait: changing dictionary to": "Veuillez patienter. Changement du dictionnaire vers",
-        "Re-check": "Vérifier encore",
-        "Replace": "Remplacer",
-        "Replace all": "Tout remplacer",
-        "Replace with": "Remplacer par",
-        "Revert": "Annuler",
-        "Spell-check": "Correction",
-        "Suggestions": "Suggestions",
-        "This will drop changes and quit spell checker.  Please confirm.": "Ceci fermera la fenêtre et annulera les modifications. Veuillez confirmer."
-    },
-    "Stylist": {
-        "Styles": "Styles"
-    },
-    "SuperClean": {
-        "Cancel": "Annuler",
-        "Clean up HTML": "Nettoyer le code HTML",
-        "General tidy up and correction of some problems.": "Nettoyage générique et correction des problèmes mineurs.",
-        "OK": "OK",
-        "Please select from the following cleaning options...": "Veuillez sélectionner une option de nettoyage.",
-        "Remove custom font sizes.": "Supprimer les tailles de polices personnalisées.",
-        "Remove custom text colors.": "Supprimer les couleurs de texte personalisées.",
-        "Remove custom typefaces (font \"styles\").": "Supprimer les polices personalisées (font \"styles\").",
-        "Remove lang attributes.": "Supprimer les attributs de langue."
-    },
-    "TableOperations": {
-        "All four sides": "Quatre cotés",
-        "Borders": "Bordures",
-        "Cancel": "Annuler",
-        "Caption": "Étiquette",
-        "Cell Properties": "Propriétés de cellule",
-        "Cell properties": "Cell properties",
-        "Delete cell": "Supprimer une cellule",
-        "Delete column": "Supprimer la colonne",
-        "Delete row": "Supprimer une rangée",
-        "Description": "Description",
-        "Frames": "Vues",
-        "Insert cell after": "Insérer une cellule après",
-        "Insert cell before": "Insérer une cellule avant",
-        "Insert column after": "Insérer une colonne après",
-        "Insert column before": "Insérer une colonne avant",
-        "Insert row after": "Insérer une rangée après",
-        "Insert row before": "Insérer une rangée avant",
-        "Merge cells": "Fusionner les cellules",
-        "No rules": "Aucune règle",
-        "No sides": "Aucun côté",
-        "OK": "OK",
-        "Padding": "Remplissage",
-        "Please click into some cell": "Cliquer sur une cellule",
-        "Row Properties": "Propriétés de rangée",
-        "Row properties": "Propriétés de rangée",
-        "Rows": "Lignes",
-        "Rules will appear between all rows and columns": "Règles entre les rangées et les cellules",
-        "Rules will appear between columns only": "Règles entre les colonnes seulement",
-        "Rules will appear between rows only": "Règles entre les rangées seulement",
-        "Spacing": "Espacement",
-        "Spacing and padding": "Espacement et remplissage",
-        "Split column": "Diviser une colonne",
-        "Split row": "Diviser la rangée",
-        "Summary": "Sommaire",
-        "Table Properties": "Propriétés de table",
-        "Table properties": "Propriétés de table",
-        "The bottom side only": "Côté du bas seulement",
-        "The left-hand side only": "Côté gauche seulement",
-        "The right and left sides only": "Côté gauche et droit seulement",
-        "The right-hand side only": "Côté droit seulement",
-        "The top and bottom sides only": "Côté haut et bas seulement",
-        "The top side only": "Côté haut seulement",
-        "Xinha cowardly refuses to delete the last cell in row.": "Il est impossible de supprimer la dernière cellule de la rangée.",
-        "Xinha cowardly refuses to delete the last column in table.": "Il est impossible de supprimer la dernière colonne de la table.",
-        "Xinha cowardly refuses to delete the last row in table.": "Il est impossible de supprimer la dernière rangée de la table",
-        "pixels": "pixels"
-    },
-    "Template": {
-        "Cancel": "Annulation",
-        "Insert template": "Insérer un template"
-    },
-    "UnFormat": {
-        "All": "Tout",
-        "All HTML:": "Tout le HTML",
-        "Cancel": "Annuler",
-        "Cleaning Area": "Zone de nettoyage",
-        "Cleaning options": "Options de nettoyage",
-        "Formatting:": "Format",
-        "OK": "OK",
-        "Page Cleaner": "Nettoyeur de page",
-        "Select which types of formatting you would like to remove.": "Sélectionnez quel type de formatage vous voulez supprimer.",
-        "Selection": "Sélection"
-    },
-    "UnsavedChanges": {
-        "You have unsaved changes in the editor": "Vous n'avez pas enregistré vos modifications"
-    },
-    "Xinha": {
-        "&#8212; format &#8212;": "&#8212; Format &#8212;",
-        "About this editor": "A propos",
-        "Address": "Adresse",
-        "Background Color": "Surlignage",
-        "Bold": "Gras",
-        "Bulleted List": "Liste à puces",
-        "Clean content pasted from Word": "Nettoyage du contenu copié depuis Word",
-        "Clear Inline Font Specifications": "Supprimer paramètres inline de la police",
-        "Clear MSOffice tags": "Supprimer tags MSOffice",
-        "Close": "Fermer",
-        "Constructing object": "Construction de l'objet",
-        "Copy selection": "Copier la sélection",
-        "Create Statusbar": "Construction de la barre de status",
-        "Create Toolbar": "Construction de la barre d'icones",
-        "Current style": "Style courant",
-        "Cut selection": "Couper la sélection",
-        "Decrease Indent": "Diminuer le retrait",
-        "Direction left to right": "Direction de gauche à droite",
-        "Direction right to left": "Direction de droite à gauche",
-        "ENTER": "ENTREE",
-        "Editor Help": "Aide de l'éditeur",
-        "Finishing": "Chargement bientôt terminé",
-        "Font Color": "Couleur de police",
-        "Formatted": "Formaté",
-        "Generate Xinha framework": "Génération de Xinha",
-        "Heading 1": "Titre 1",
-        "Heading 2": "Titre 2",
-        "Heading 3": "Titre 3",
-        "Heading 4": "Titre 4",
-        "Heading 5": "Titre 5",
-        "Heading 6": "Titre 6",
-        "Headings": "Titres",
-        "Help using editor": "Aide",
-        "Horizontal Rule": "Ligne horizontale",
-        "Increase Indent": "Augmenter le retrait",
-        "Init editor size": "Initialisation de la taille d'édition",
-        "Insert Table": "Insérer un tableau",
-        "Insert Web Link": "Insérer un lien",
-        "Insert/Modify Image": "Insérer / Modifier une image",
-        "Insert/Overwrite": "Insertion / Remplacement",
-        "Italic": "Italique",
-        "Justify Center": "Centrer",
-        "Justify Full": "Justifier",
-        "Justify Left": "Aligner à gauche",
-        "Justify Right": "Aligner à droite",
-        "Keyboard shortcuts": "Raccourcis clavier",
-        "Loading in progress. Please wait!": "Chargement en cours. Veuillez patienter!",
-        "Loading plugin $plugin": "Chargement du plugin $plugin",
-        "Normal": "Normal",
-        "Ordered List": "Liste numérotée",
-        "Paste from clipboard": "Coller depuis le presse-papier",
-        "Path": "Chemin",
-        "Print document": "Imprimer document",
-        "Redoes your last action": "Répéter la dernière action",
-        "Register plugin $plugin": "Enregistrement du plugin $plugin",
-        "Remove formatting": "Supprimer mise en forme",
-        "SHIFT-ENTER": "SHIFT+ENTREE",
-        "Save as": "Enregistrer sous",
-        "Select all": "Tout sélectionner",
-        "Set format to paragraph": "Applique le format paragraphe",
-        "Split Block": "Séparer les blocs",
-        "Strikethrough": "Barré",
-        "Subscript": "Indice",
-        "Superscript": "Exposant",
-        "The editor provides the following key combinations:": "L'éditeur fournit les combinaisons de touches suivantes :",
-        "Toggle Borders": "Afficher / Masquer les bordures",
-        "Toggle HTML Source": "Afficher / Masquer code source",
-        "Underline": "Souligné",
-        "Undoes your last action": "Annuler la dernière action",
-        "Would you like to clear font colours?": "Voulez-vous supprimer les couleurs ?",
-        "Would you like to clear font sizes?": "Voulez-vous supprimer les tailles ?",
-        "Would you like to clear font typefaces?": "Voulez-vous supprimer les types ?",
-        "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.",
-        "insert linebreak": "Insère un saut de ligne",
-        "new paragraph": "Nouveau paragraphe"
-    },
-    "__NEW_TRANSLATIONS__": {
-        "CharCounter": {
-            "... in progress": "",
-            "HTML": ""
-        },
-        "ColorPicker": {
-            "Click a color...": "",
-            "Sample": "",
-            "Web Safe: ": ""
-        },
-        "ContextMenu": {
-            "Delete Cell": "",
-            "Insert Cell After": "",
-            "Insert Cell Before": "",
-            "Merge Cells": ""
-        },
-        "DefinitionList": {
-            "definition description": "",
-            "definition list": "",
-            "definition term": ""
-        },
-        "Dialogs": {
-            "Some Text Here": ""
-        },
-        "EditTag": {
-            "Edit Tag By Peg": ""
-        },
-        "Equation": {
-            "!=": "",
-            "!in": "",
-            "&gt;-": "",
-            "&gt;=": "",
-            "&lt;=": "",
-            "&lt;=&gt;": "",
-            "&lt;x&gt;": "",
-            "&nbsp; `!` &nbsp;": "",
-            "&nbsp; `.` &nbsp;": "",
-            "&nbsp; `0` &nbsp;": "",
-            "&nbsp; `2` &nbsp;": "",
-            "&nbsp; `3` &nbsp;": "",
-            "&nbsp; `4` &nbsp;": "",
-            "&nbsp; `5` &nbsp;": "",
-            "&nbsp; `6` &nbsp;": "",
-            "&nbsp; `7` &nbsp;": "",
-            "&nbsp; `8` &nbsp;": "",
-            "&nbsp; `9` &nbsp;": "",
-            "&nbsp; `e` &nbsp;": "",
-            "&nbsp;&nbsp;`1` &nbsp;": "",
-            "&nbsp;`+{::}`&nbsp;": "",
-            "&nbsp;`-:\\ `": "",
-            "&nbsp;`-{::}`&nbsp;": "",
-            "&nbsp;`C`&nbsp;": "",
-            "&nbsp;`cos`": "",
-            "&nbsp;`ln`&nbsp;": "",
-            "&nbsp;`pi` &nbsp;": "",
-            "&nbsp;`sin`": "",
-            "&nbsp;`tan`": "",
-            "&nbsp;`times`&nbsp;": "",
-            "&quot;text&quot;": "",
-            "'+formula+'": "",
-            "((n),(k))": "",
-            "(x+1)/(x-1)": "",
-            "*": "",
-            "**": "",
-            "+-": "",
-            "-&gt;": "",
-            "-&lt;": "",
-            "-:": "",
-            "-=": "",
-            "//": "",
-            "/_": "",
-            ":.": "",
-            "=&gt;": "",
-            "@": "",
-            "[[a,b],[c,d]]": "",
-            "\\\\": "",
-            "\\nClick in the box to use your keyboard or use the buttons\\n": "",
-            "^^": "",
-            "^^^": "",
-            "__|": "",
-            "_|_": "",
-            "`!=`": "",
-            "`!in`": "",
-            "`&and;`": "",
-            "`&cap;`": "",
-            "`&cup;`": "",
-            "`&gt;-`": "",
-            "`&gt;=`": "",
-            "`&lt;=&gt;`": "",
-            "`&lt;=`": "",
-            "`&lt;x&gt;`": "",
-            "`&or;`": "",
-            "`&quot;text&quot;`": "",
-            "`((n),(k))`": "",
-            "`(x+1)/(x-1)`": "",
-            "`**`": "",
-            "`*`": "",
-            "`+-`": "",
-            "`-&gt;`": "",
-            "`-&lt;`": "",
-            "`-:`": "",
-            "`-=`": "",
-            "`//`": "",
-            "`/_`": "",
-            "`:.`": "",
-            "`=&gt;`": "",
-            "`@`": "",
-            "`[[a,b],[c,d]]`": "",
-            "`\\\\`": "",
-            "`__|`": "",
-            "`_|_`": "",
-            "`AA`": "",
-            "`aleph`": "",
-            "`alpha`": "",
-            "`and`": "",
-            "`bara`": "",
-            "`bba`": "",
-            "`bbba`": "",
-            "`beta`": "",
-            "`CC`": "",
-            "`cca`": "",
-            "`chi`": "",
-            "`darr`": "",
-            "`ddota`": "",
-            "`del`": "",
-            "`Delta`": "",
-            "`delta`": "",
-            "`diamond`": "",
-            "`dota`": "",
-            "`dy/dx`": "",
-            "`EE`": "",
-            "`epsi`": "",
-            "`eta`": "",
-            "`fra`": "",
-            "`Gamma`": "",
-            "`gamma`": "",
-            "`grad`": "",
-            "`harr`": "",
-            "`hArr`": "",
-            "`hata`": "",
-            "`if`": "",
-            "`in`": "",
-            "`int`": "",
-            "`iota`": "",
-            "`kappa`": "",
-            "`lambda`": "",
-            "`Lambda`": "",
-            "`lArr`": "",
-            "`larr`": "",
-            "`lim_(x-&gt;oo)`": "",
-            "`log`": "",
-            "`mu`": "",
-            "`NN`": "",
-            "`nn`": "",
-            "`not`": "",
-            "`nu`": "",
-            "`o+`": "",
-            "`o.`": "",
-            "`O/`": "",
-            "`oint`": "",
-            "`omega`": "",
-            "`Omega`": "",
-            "`oo`": "",
-            "`or`": "",
-            "`ox`": "",
-            "`Phi`": "",
-            "`phi`": "",
-            "`Pi`": "",
-            "`pi`": "",
-            "`prod`": "",
-            "`prop`": "",
-            "`Psi`": "",
-            "`psi`": "",
-            "`QQ`": "",
-            "`quad`": "",
-            "`rArr`": "",
-            "`rho`": "",
-            "`root(n)(x)`": "",
-            "`RR`": "",
-            "`sfa`": "",
-            "`sigma`": "",
-            "`Sigma`": "",
-            "`sqrt(x)`": "",
-            "`square`": "",
-            "`stackrel(-&gt;)(+)`": "",
-            "`sub`": "",
-            "`sube`": "",
-            "`sum`": "",
-            "`sup`": "",
-            "`supe`": "",
-            "`tau`": "",
-            "`Theta`": "",
-            "`theta`": "",
-            "`TT`": "",
-            "`tta`": "",
-            "`uarr`": "",
-            "`ula`": "",
-            "`upsilon`": "",
-            "`uu`": "",
-            "`veca`": "",
-            "`vv`": "",
-            "`x_(mn)`": "",
-            "`Xi`": "",
-            "`xi`": "",
-            "`xx`": "",
-            "`zeta`": "",
-            "`ZZ`": "",
-            "`|-&gt;`": "",
-            "`|--`": "",
-            "`|==`": "",
-            "`|__`": "",
-            "`|~`": "",
-            "`~=`": "",
-            "`~|`": "",
-            "`~~`": "",
-            "AA": "",
-            "aleph": "",
-            "alpha": "",
-            "and": "",
-            "AsciiMath Formula Input": "",
-            "AsciiMathML Example": "",
-            "bara": "",
-            "Based on ASCIIMathML by": "",
-            "bba": "",
-            "bbba": "",
-            "beta": "",
-            "CC": "",
-            "cca": "",
-            "chi": "",
-            "darr": "",
-            "ddota": "",
-            "del": "",
-            "Delta": "",
-            "delta": "",
-            "diamond": "",
-            "dota": "",
-            "dy/dx": "",
-            "EE": "",
-            "epsi": "",
-            "eta": "",
-            "For more information on AsciiMathML visit this page:": "",
-            "Formula Editor": "",
-            "fra": "",
-            "gamma": "",
-            "Gamma": "",
-            "grad": "",
-            "hArr": "",
-            "harr": "",
-            "hata": "",
-            "if": "",
-            "in": "",
-            "Input": "",
-            "int": "",
-            "int_a^bf(x)dx": "",
-            "iota": "",
-            "kappa": "",
-            "Lambda": "",
-            "lambda": "",
-            "larr": "",
-            "lArr": "",
-            "lim_(x-&gt;oo)": "",
-            "mu": "",
-            "NN": "",
-            "nn": "",
-            "nnn": "",
-            "not": "",
-            "nu": "",
-            "o+": "",
-            "o.": "",
-            "O/": "",
-            "oint": "",
-            "omega": "",
-            "Omega": "",
-            "oo": "",
-            "or": "",
-            "ox": "",
-            "Phi": "",
-            "phi": "",
-            "pi": "",
-            "Pi": "",
-            "prod": "",
-            "prop": "",
-            "psi": "",
-            "Psi": "",
-            "QQ": "",
-            "quad": "",
-            "rArr": "",
-            "rho": "",
-            "root(n)(x)": "",
-            "RR": "",
-            "sfa": "",
-            "sigma": "",
-            "Sigma": "",
-            "sqrt(x)": "",
-            "square": "",
-            "stackrel(-&gt;)(+)": "",
-            "sub": "",
-            "sube": "",
-            "sum": "",
-            "sum_(n=1)^oo": "",
-            "sup": "",
-            "supe": "",
-            "tau": "",
-            "Theta": "",
-            "theta": "",
-            "TT": "",
-            "tta": "",
-            "uarr": "",
-            "ula": "",
-            "upsilon": "",
-            "uu": "",
-            "uuu": "",
-            "veca": "",
-            "vv": "",
-            "vvv": "",
-            "x^(m+n)": "",
-            "x_(mn)": "",
-            "Xi": "",
-            "xi": "",
-            "xx": "",
-            "zeta": "",
-            "ZZ": "",
-            "|-&gt;": "",
-            "|--": "",
-            "|==": "",
-            "|__": "",
-            "|~": "",
-            "~=": "",
-            "~|": "",
-            "~~": ""
-        },
-        "FancySelects": {
-            "'+opt.text+'": ""
-        },
-        "FindReplace": {
-            "';\r\n  var tagc = '": ""
-        },
-        "FormOperations": {
-            "Enter the name for new option.": "",
-            "Form Editor": "",
-            "Message Sent": "",
-            "Please Select...": ""
-        },
-        "Forms": {
-            "'onClick'=": "",
-            "Access Key:": "",
-            "Action URL:": "",
-            "Button Script": "",
-            "Checked": "",
-            "Columns:": "",
-            "Default text (optional)": "",
-            "Dimensions": "",
-            "Disabled": "",
-            "Encoding:": "",
-            "For Control:": "",
-            "Form": "",
-            "Form Element: FIELDSET": "",
-            "Form Element: INPUT": "",
-            "Form Element: LABEL": "",
-            "Form Element: SELECT": "",
-            "Form Element: TEXTAREA": "",
-            "Form handler script": "",
-            "Form Name:": "",
-            "Get": "",
-            "Hard": "",
-            "Height in number of rows": "",
-            "HTML-Form to CGI (default)": "",
-            "Image source": "",
-            "Initial Text:": "",
-            "Insert/Edit Form": "",
-            "Insert/Edit Form Element FIELDSET": "",
-            "Insert/Edit Form Element INPUT": "",
-            "Insert/Edit Form Element LABEL": "",
-            "Insert/Edit Form Element SELECT": "",
-            "Insert/Edit Form Element TEXTAREA": "",
-            "Javascript for button click": "",
-            "Label:": "",
-            "Legend:": "",
-            "Max length:": "",
-            "Maximum number of characters accepted": "",
-            "Method:": "",
-            "multipart Form Data (File-Upload)": "",
-            "Name of the form input": "",
-            "Name of the form select": "",
-            "name of the textarea": "",
-            "normal": "",
-            "nowrap": "",
-            "Off": "",
-            "Physical": "",
-            "Please enter a Label": "",
-            "Post": "",
-            "pre": "",
-            "Read Only": "",
-            "Size of text box in characters": "",
-            "Soft": "",
-            "Tab Index:": "",
-            "Target Frame:": "",
-            "URL of image": "",
-            "Value of the form input": "",
-            "Value:": "",
-            "Virtual": "",
-            "Width in number of characters": "",
-            "Wrap Mode:": "",
-            "You must enter a Name": ""
-        },
-        "FullPage": {
-            "...": "",
-            "cyrillic (ISO-8859-5)": "",
-            "cyrillic (KOI8-R)": "",
-            "cyrillic (WINDOWS-1251)": "",
-            "western (ISO-8859-1)": ""
-        },
-        "Gecko": {
-            "The Paste button does not work in this browser for security reasons. Press CTRL-V on your keyboard to paste directly.": ""
-        },
-        "HorizontalRule": {
-            "&#x00d7;": "",
-            "&nbsp;": "",
-            "Insert/Edit Horizontal Rule": ""
-        },
-        "InlineStyler": {
-            "CSS Style": "",
-            "-": "<<Equation>>"
-        },
-        "InsertNote": {
-            "Insert": "",
-            "Insert footnote": "",
-            "Insert Note": ""
-        },
-        "InsertPagebreak": {
-            "Page Break": ""
-        },
-        "InsertSnippet": {
-            "\\n  This is an information about something\\n": "",
-            "Hide preview": "",
-            "Insert as": "",
-            "Insert Snippet": "",
-            "InsertSnippet for Xinha": "",
-            "Link1": "",
-            "Link2": "",
-            "Link3": "",
-            "Link4": "",
-            "Link5": "",
-            "Show preview": "",
-            "This is an information about something": "",
-            "Variable": ""
-        },
-        "InsertSnippet2": {
-            "All Categories": "",
-            "Filter": "",
-            "Insert as HTML": "",
-            "Insert as template variable": "",
-            "Only search word beginning": "",
-            "HTML": "<<CharCounter>>",
-            "Insert Snippet": "<<InsertSnippet>>",
-            "InsertSnippet for Xinha": "<<InsertSnippet>>",
-            "Variable": "<<InsertSnippet>>"
-        },
-        "InsertTable": {
-            "Caption for the table": "",
-            "Collapse borders:": "",
-            "Layou": "",
-            "Style of the border": ""
-        },
-        "LangMarks": {
-            "', '": ""
-        },
-        "Linker": {
-            "(px)": "",
-            "Anchor-Link": "",
-            "Anchor:": "",
-            "Location Bar:": "",
-            "Menu Bar:": "",
-            "PopupWindow": "",
-            "Resizeable:": "",
-            "Scrollbars:": "",
-            "Shows On Hover": "",
-            "Status Bar:": "",
-            "Title:": "",
-            "Toolbar:": ""
-        },
-        "Opera": {
-            "MARK": ""
-        },
-        "PasteText": {
-            "Insert text in new paragraph": ""
-        },
-        "PreserveScripts": {
-            "JavaScript": "",
-            "PHP": ""
-        },
-        "QuickTag": {
-            "',\r\n                           'cl': '": ""
-        },
-        "SetId": {
-            "ID/Name:": "",
-            "Set Id and Name": "",
-            "Set Id/Name": "",
-            "Set ID/Name": ""
-        },
-        "SmartReplace": {
-            "ClosingSingleQuote": "",
-            "OpeningSingleQuote": "",
-            "SmartReplace": ""
-        },
-        "SuperClean": {
-            "Clean bad HTML from Microsoft Word.": "",
-            "Clean Selection Only": "",
-            "Cleaning Scope": "",
-            "Please stand by while cleaning in process...": "",
-            "Remove alignment (left/right/justify).": "",
-            "Remove all classes (CSS).": "",
-            "Remove All HTML Tags": "",
-            "Remove all styles (CSS).": "",
-            "Remove emphasis and annotations.": "",
-            "Remove Paragraphs": "",
-            "Remove superscripts and subscripts.": "",
-            "Replace directional quote marks with non-directional quote marks.": "",
-            "Vigorously purge HTML from Microsoft Word.": ""
-        },
-        "TableOperations": {
-            "Cell Type:": "",
-            "Cells down": "",
-            "Cells to the right, and": "",
-            "Do Not Change": "",
-            "Frame and borders": "",
-            "Header (th)": "",
-            "Merge current cell with:": "",
-            "Normal (td)": "",
-            "Columns": "<<Forms>>",
-            "Merge Cells": "<<ContextMenu>>"
-        },
-        "WebKit": {
-            "The Paste button does not work in this browser for security reasons. Press CTRL-V on your keyboard to paste directly.": "<<Gecko>>"
-        },
-        "Xinha": {
-            "&#8212; font &#8212;": "",
-            "&#8212; size &#8212;": "",
-            "1 (8 pt)": "",
-            "2 (10 pt)": "",
-            "3 (12 pt)": "",
-            "4 (14 pt)": "",
-            "5 (18 pt)": "",
-            "6 (24 pt)": "",
-            "7 (36 pt)": "",
-            "Arial": "",
-            "Courier New": "",
-            "CTRL-0 (zero)": "",
-            "CTRL-1 .. CTRL-6": "",
-            "CTRL-A": "",
-            "CTRL-B": "",
-            "CTRL-C": "",
-            "CTRL-E": "",
-            "CTRL-I": "",
-            "CTRL-J": "",
-            "CTRL-L": "",
-            "CTRL-N": "",
-            "CTRL-R": "",
-            "CTRL-S": "",
-            "CTRL-U": "",
-            "CTRL-V": "",
-            "CTRL-X": "",
-            "CTRL-Y": "",
-            "CTRL-Z": "",
-            "Error Loading Xinha.  Developers, check the Error Console for information.": "",
-            "Georgia": "",
-            "Impact": "",
-            "Loading Core": "",
-            "Loading plugins": "",
-            "MS Word Cleaner": "",
-            "Select Color": "",
-            "Tahoma": "",
-            "Times New Roman": "",
-            "Touch here first to activate editor.": "",
-            "Verdana": "",
-            "Waiting for Iframe to load...": "",
-            "WingDings": "",
-            "Xinha": ""
-        },
-        "BackgroundImage": {
-            "__ TRANSLATOR NOTE __": "*** BACKGROUNDIMAGE IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***",
-            "Set Background": ""
-        },
-        "ClientsideSpellcheck": {
-            "__ TRANSLATOR NOTE __": "*** CLIENTSIDESPELLCHECK IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***",
-            "Spell Check using ieSpell": ""
-        },
-        "ExtendedFileManager": {
-            "__ TRANSLATOR NOTE __": "*** EXTENDEDFILEMANAGER IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***",
-            "10%": "",
-            "100%": "",
-            "200%": "",
-            "25%": "",
-            "50%": "",
-            "75%": "",
-            ">List View": "",
-            ">Thumbnail View": "",
-            "A:": "",
-            "D:": "",
-            "File List": "",
-            "Folder": "",
-            "GIF": "",
-            "H:": "",
-            "Image Editor": "",
-            "Image Selection": "",
-            "Maximum folder size limit reached. Upload disabled.": "",
-            "Please enter value": "",
-            "PNG": "",
-            "Preset": "",
-            "Rotate 180 &deg;": "",
-            "Rotate 90 &deg; CCW": "",
-            "Rotate 90 &deg; CW": "",
-            "X:": "",
-            "Xinha Image Editor": "",
-            "Y:": ""
-        },
-        "Filter": {
-            "__ TRANSLATOR NOTE __": "*** FILTER IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***",
-            "Filter": "<<InsertSnippet2>>"
-        },
-        "ImageManager": {
-            "__ TRANSLATOR NOTE __": "*** IMAGEMANAGER IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***",
-            "Flickr Picture List": "",
-            "Flickr Pictures": "",
-            "Flickr Selection": "",
-            "Flickr Username/Email": "",
-            "Image List": "",
-            "Keyword": "",
-            "No Photos Found": "",
-            "No Videos Found": "",
-            "This Server": "",
-            "YouTube Selection": "",
-            "YouTube Username": "",
-            "YouTube Video List": "",
-            "YouTube Videos": "",
-            "A:": "<<ExtendedFileManager>>",
-            "D:": "<<ExtendedFileManager>>",
-            "GIF": "<<ExtendedFileManager>>",
-            "H:": "<<ExtendedFileManager>>",
-            "Image Editor": "<<ExtendedFileManager>>",
-            "Image Selection": "<<ExtendedFileManager>>",
-            "PNG": "<<ExtendedFileManager>>",
-            "Rotate 180 &deg;": "<<ExtendedFileManager>>",
-            "Rotate 90 &deg; CCW": "<<ExtendedFileManager>>",
-            "Rotate 90 &deg; CW": "<<ExtendedFileManager>>",
-            "X:": "<<ExtendedFileManager>>",
-            "Y:": "<<ExtendedFileManager>>"
-        },
-        "InsertMarquee": {
-            "__ TRANSLATOR NOTE __": "*** INSERTMARQUEE IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***",
-            "Alternate": "",
-            "Continuous": "",
-            "Marquee Editor": "",
-            "Slide": ""
-        },
-        "InsertPicture": {
-            "__ TRANSLATOR NOTE __": "*** INSERTPICTURE IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***",
-            "Leave empty for not defined": "",
-            " Open file in new window": ""
-        },
-        "NoteServer": {
-            "__ TRANSLATOR NOTE __": "*** NOTESERVER IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***",
-            "120%": "",
-            "150%": "",
-            "80%": "",
-            "GUIDO Code": "",
-            "With Mozilla, the applet will not be visible in editor, but only in Web page after submitting.": "",
-            "Zoom :": "",
-            "100%": "<<ExtendedFileManager>>"
-        },
-        "PSLocal": {
-            "__ TRANSLATOR NOTE __": "*** PSLOCAL IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***",
-            "Confirm": "",
-            "Enable": "",
-            "Enable Gears in order to use local document storage and configuration.": "",
-            "Enabling Local Storage": "",
-            "Install": "",
-            "Learn About Local Storage": "",
-            "This will reload the page, causing you to lose any unsaved work.  Press \"OK\" to reload.": "",
-            "Xinha uses Google Gears to enable local document storage.  With Gears installed, you can save drafts of your documents on your hard drive, configure Xinha to look the way you want, and carry this information wherever you use Xinha on the web.": ""
-        },
-        "PSServer": {
-            "__ TRANSLATOR NOTE __": "*** PSSERVER IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***",
-            "File: ": "",
-            "Import": ""
-        },
-        "PersistentStorage": {
-            "__ TRANSLATOR NOTE __": "*** PERSISTENTSTORAGE IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***",
-            "Details": "",
-            "File Browser": "",
-            "Hello    There C ": "",
-            "Hello  There A ": "",
-            "Hello \" There B \"": "",
-            "Hello ' There D '": "",
-            "List of Places": "",
-            "New Document": "",
-            "Open": "",
-            "Open Document": "",
-            "Places": "",
-            "Please enter the name of the directory you'd like to create.": "",
-            "Save Document": "",
-            "This will erase any unsaved content.  If you're certain, please click OK to continue.": "",
-            "Web URL": "",
-            "Confirm": "<<PSLocal>>",
-            "File List": "<<ExtendedFileManager>>",
-            "Insert": "<<InsertNote>>"
-        },
-        "SpellChecker": {
-            "__ TRANSLATOR NOTE __": "*** SPELLCHECKER IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***",
-            "HTMLArea Spell Checker": "",
-            "Info": "",
-            "Learn": "",
-            "pliz weit ;-)": "",
-            "Spell Checker": ""
-        }
-    }
-}
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/lang/merged/fr_ca.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/lang/merged/fr_ca.js
deleted file mode 100644
index d05edc4..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/lang/merged/fr_ca.js
+++ /dev/null
@@ -1,1503 +0,0 @@
-// Xinha Language Combined Translation File
-//
-// LANG: "fr_ca", ENCODING: UTF-8
-//
-// INSTRUCTIONS TO TRANSLATORS
-// ===========================================================================
-//
-// Your translation must be in UTF-8 Character Encoding.
-//
-// This is a JSON encoded file (plus comments), strings should be double-quote
-// only, do not use single quotes to surround strings - "hello", not 'hello'
-// do not have a trailing comma after the last entry in a section.
-//
-// Only full line comments are allowed (that a comments occupy entire lines).
-//
-// Search for the __NEW_TRANSLATIONS__ section below, this is where you will
-// want to focus, this section includes things that do not presently have a 
-// translation or for which the translation needs to be checked for accuracy.
-//
-// In the New Translations section a translation string is one of the following
-//
-//  "English String Here" : ""
-//     This means it is not translated yet, add your translation...
-//     "English String Here" : "Klingon String Here"
-//
-//  "English String Here" : "Translated String Here"
-//     This means that an existing translation for this string, in some other
-//     section has been found, and used.  Check that it is approprite for this
-//     section and if it is, that's fine leave it as is, otherwise change as
-//     appropriate.
-//
-//  "English String Here" : "<<AnotherSection>>"
-//     This means use the same translation for this string as <<AnotherSection>>
-//     this saves you re-tranlating strings.  If the Context of this section
-//     and the context of AnotherSection seem the same, that's fine leave it
-//     using that translation, but if this section needs a different translation, 
-//     you can provide it by replacing the link (<<AnotherSection>>) with that
-//     new translation.  For example - a "Table" in say "DataPlugin" is 
-//     perhaps translated differently to "Table" in "FurniturePlugin".
-//
-// TESTING YOUR TRANSLATION
-// ===========================================================================
-// Simply place your translation file on your webserver somewhere for example
-//
-//   /xinha/lang/merged/fr_ca.js
-//
-// and then tell Xinha where to get it (before loading XinhaCore.js) by 
-//
-//  _editor_lang              = 'fr_ca';
-//  _editor_lang_merged_file  = '/xinha/lang/merged/fr_ca.js';
-//
-// Xinha will load your new language definition.
-//
-// SUBMITTING YOUR TRANSLATION
-// ===========================================================================
-// Simply create a Ticket on the Xinha website and attach your translation 
-// file.
-//
-// The Xinha developers will take your file and use the 
-//     contrib/lc_split_merged_file.php
-// script to load it into the Xinha distribution.
-
-{
-    "UnsavedChanges": {
-        "You have unsaved changes in the editor": "Tu n'as pas enregistré tes modifications"
-    },
-    "__NEW_TRANSLATIONS__": {
-        "Abbreviation": {
-            "Abbreviation": "",
-            "Cancel": "",
-            "Delete": "",
-            "Expansion:": "",
-            "OK": ""
-        },
-        "AboutBox": {
-            "About this editor": "<<Xinha>>",
-            "Close": "<<Xinha>>"
-        },
-        "CharCounter": {
-            "... in progress": "",
-            "Chars": "",
-            "HTML": "",
-            "Words": ""
-        },
-        "CharacterMap": {
-            "Insert special character": ""
-        },
-        "ColorPicker": {
-            "Click a color...": "",
-            "Color: ": "",
-            "Sample": "",
-            "Web Safe: ": "",
-            "Close": "<<Xinha>>",
-            "OK": "<<Abbreviation>>"
-        },
-        "ContextMenu": {
-            "_Delete Row": "",
-            "_Image Properties...": "",
-            "_Modify Link...": "",
-            "_Remove Link...": "",
-            "_Table Properties...": "",
-            "C_ell Properties...": "",
-            "Chec_k Link...": "",
-            "Copy": "",
-            "Create a link": "",
-            "Current URL is": "",
-            "Cut": "",
-            "De_lete Column": "",
-            "Delete Cell": "",
-            "Delete the current column": "",
-            "Delete the current row": "",
-            "How did you get here? (Please report!)": "",
-            "I_nsert Row Before": "",
-            "In_sert Row After": "",
-            "Insert _Column Before": "",
-            "Insert a new column after the current one": "",
-            "Insert a new column before the current one": "",
-            "Insert a new row after the current one": "",
-            "Insert a new row before the current one": "",
-            "Insert a paragraph after the current node": "",
-            "Insert a paragraph before the current node": "",
-            "Insert C_olumn After": "",
-            "Insert Cell After": "",
-            "Insert Cell Before": "",
-            "Insert paragraph after": "",
-            "Insert paragraph before": "",
-            "Link points to:": "",
-            "Make lin_k...": "",
-            "Merge Cells": "",
-            "Opens this link in a new window": "",
-            "Paste": "",
-            "Please confirm that you want to remove this element:": "",
-            "Please confirm that you want to unlink this element.": "",
-            "Remove the $elem Element...": "",
-            "Remove this node from the document": "",
-            "Ro_w Properties...": "",
-            "Show the image properties dialog": "",
-            "Show the Table Cell Properties dialog": "",
-            "Show the Table Properties dialog": "",
-            "Show the Table Row Properties dialog": "",
-            "Unlink the current element": "",
-            "Justify Center": "<<Xinha>>",
-            "Justify Full": "<<Xinha>>",
-            "Justify Left": "<<Xinha>>",
-            "Justify Right": "<<Xinha>>"
-        },
-        "CreateLink": {
-            "Are you sure you wish to remove this link?": "",
-            "Insert/Modify Link": "",
-            "New window (_blank)": "",
-            "None (use implicit)": "",
-            "Other": "",
-            "Same frame (_self)": "",
-            "Target:": "",
-            "Title (tooltip):": "",
-            "Top frame (_top)": "",
-            "URL:": "",
-            "You need to select some text before creating a link": "",
-            "Cancel": "<<Abbreviation>>",
-            "OK": "<<Abbreviation>>"
-        },
-        "DefinitionList": {
-            "definition description": "",
-            "definition list": "",
-            "definition term": ""
-        },
-        "Dialogs": {
-            "Some Text Here": ""
-        },
-        "DynamicCSS": {
-            "Choose stylesheet": "",
-            "Default": "",
-            "Undefined": ""
-        },
-        "EditTag": {
-            "Edit HTML for selected text": "",
-            "Edit Tag By Peg": "",
-            "Tag Editor": "",
-            "Cancel": "<<Abbreviation>>",
-            "OK": "<<Abbreviation>>"
-        },
-        "Equation": {
-            "!=": "",
-            "!in": "",
-            "&gt;-": "",
-            "&gt;=": "",
-            "&lt;=": "",
-            "&lt;=&gt;": "",
-            "&lt;x&gt;": "",
-            "&nbsp; `!` &nbsp;": "",
-            "&nbsp; `.` &nbsp;": "",
-            "&nbsp; `0` &nbsp;": "",
-            "&nbsp; `2` &nbsp;": "",
-            "&nbsp; `3` &nbsp;": "",
-            "&nbsp; `4` &nbsp;": "",
-            "&nbsp; `5` &nbsp;": "",
-            "&nbsp; `6` &nbsp;": "",
-            "&nbsp; `7` &nbsp;": "",
-            "&nbsp; `8` &nbsp;": "",
-            "&nbsp; `9` &nbsp;": "",
-            "&nbsp; `e` &nbsp;": "",
-            "&nbsp;&nbsp;`1` &nbsp;": "",
-            "&nbsp;`+{::}`&nbsp;": "",
-            "&nbsp;`-:\\ `": "",
-            "&nbsp;`-{::}`&nbsp;": "",
-            "&nbsp;`C`&nbsp;": "",
-            "&nbsp;`cos`": "",
-            "&nbsp;`ln`&nbsp;": "",
-            "&nbsp;`pi` &nbsp;": "",
-            "&nbsp;`sin`": "",
-            "&nbsp;`tan`": "",
-            "&nbsp;`times`&nbsp;": "",
-            "&quot;text&quot;": "",
-            "'+formula+'": "",
-            "((n),(k))": "",
-            "(x+1)/(x-1)": "",
-            "*": "",
-            "**": "",
-            "+-": "",
-            "-&gt;": "",
-            "-&lt;": "",
-            "-:": "",
-            "-=": "",
-            "//": "",
-            "/_": "",
-            ":.": "",
-            "=&gt;": "",
-            "@": "",
-            "[[a,b],[c,d]]": "",
-            "\\\\": "",
-            "\\nClick in the box to use your keyboard or use the buttons\\n": "",
-            "^^": "",
-            "^^^": "",
-            "__|": "",
-            "_|_": "",
-            "`!=`": "",
-            "`!in`": "",
-            "`&and;`": "",
-            "`&cap;`": "",
-            "`&cup;`": "",
-            "`&gt;-`": "",
-            "`&gt;=`": "",
-            "`&lt;=&gt;`": "",
-            "`&lt;=`": "",
-            "`&lt;x&gt;`": "",
-            "`&or;`": "",
-            "`&quot;text&quot;`": "",
-            "`((n),(k))`": "",
-            "`(x+1)/(x-1)`": "",
-            "`**`": "",
-            "`*`": "",
-            "`+-`": "",
-            "`-&gt;`": "",
-            "`-&lt;`": "",
-            "`-:`": "",
-            "`-=`": "",
-            "`//`": "",
-            "`/_`": "",
-            "`:.`": "",
-            "`=&gt;`": "",
-            "`@`": "",
-            "`[[a,b],[c,d]]`": "",
-            "`\\\\`": "",
-            "`__|`": "",
-            "`_|_`": "",
-            "`AA`": "",
-            "`aleph`": "",
-            "`alpha`": "",
-            "`and`": "",
-            "`bara`": "",
-            "`bba`": "",
-            "`bbba`": "",
-            "`beta`": "",
-            "`CC`": "",
-            "`cca`": "",
-            "`chi`": "",
-            "`darr`": "",
-            "`ddota`": "",
-            "`del`": "",
-            "`Delta`": "",
-            "`delta`": "",
-            "`diamond`": "",
-            "`dota`": "",
-            "`dy/dx`": "",
-            "`EE`": "",
-            "`epsi`": "",
-            "`eta`": "",
-            "`fra`": "",
-            "`Gamma`": "",
-            "`gamma`": "",
-            "`grad`": "",
-            "`hArr`": "",
-            "`harr`": "",
-            "`hata`": "",
-            "`if`": "",
-            "`in`": "",
-            "`int`": "",
-            "`iota`": "",
-            "`kappa`": "",
-            "`Lambda`": "",
-            "`lambda`": "",
-            "`larr`": "",
-            "`lArr`": "",
-            "`lim_(x-&gt;oo)`": "",
-            "`log`": "",
-            "`mu`": "",
-            "`NN`": "",
-            "`nn`": "",
-            "`not`": "",
-            "`nu`": "",
-            "`o+`": "",
-            "`o.`": "",
-            "`O/`": "",
-            "`oint`": "",
-            "`Omega`": "",
-            "`omega`": "",
-            "`oo`": "",
-            "`or`": "",
-            "`ox`": "",
-            "`phi`": "",
-            "`Phi`": "",
-            "`Pi`": "",
-            "`pi`": "",
-            "`prod`": "",
-            "`prop`": "",
-            "`psi`": "",
-            "`Psi`": "",
-            "`QQ`": "",
-            "`quad`": "",
-            "`rArr`": "",
-            "`rho`": "",
-            "`root(n)(x)`": "",
-            "`RR`": "",
-            "`sfa`": "",
-            "`Sigma`": "",
-            "`sigma`": "",
-            "`sqrt(x)`": "",
-            "`square`": "",
-            "`stackrel(-&gt;)(+)`": "",
-            "`sub`": "",
-            "`sube`": "",
-            "`sum`": "",
-            "`sup`": "",
-            "`supe`": "",
-            "`tau`": "",
-            "`theta`": "",
-            "`Theta`": "",
-            "`TT`": "",
-            "`tta`": "",
-            "`uarr`": "",
-            "`ula`": "",
-            "`upsilon`": "",
-            "`uu`": "",
-            "`veca`": "",
-            "`vv`": "",
-            "`x_(mn)`": "",
-            "`xi`": "",
-            "`Xi`": "",
-            "`xx`": "",
-            "`zeta`": "",
-            "`ZZ`": "",
-            "`|-&gt;`": "",
-            "`|--`": "",
-            "`|==`": "",
-            "`|__`": "",
-            "`|~`": "",
-            "`~=`": "",
-            "`~|`": "",
-            "`~~`": "",
-            "AA": "",
-            "aleph": "",
-            "alpha": "",
-            "and": "",
-            "AsciiMath Formula Input": "",
-            "AsciiMathML Example": "",
-            "bara": "",
-            "Based on ASCIIMathML by": "",
-            "bba": "",
-            "bbba": "",
-            "beta": "",
-            "CC": "",
-            "cca": "",
-            "chi": "",
-            "darr": "",
-            "ddota": "",
-            "del": "",
-            "delta": "",
-            "Delta": "",
-            "diamond": "",
-            "dota": "",
-            "dy/dx": "",
-            "EE": "",
-            "epsi": "",
-            "eta": "",
-            "For more information on AsciiMathML visit this page:": "",
-            "Formula Editor": "",
-            "fra": "",
-            "gamma": "",
-            "Gamma": "",
-            "grad": "",
-            "hArr": "",
-            "harr": "",
-            "hata": "",
-            "if": "",
-            "in": "",
-            "Input": "",
-            "int": "",
-            "int_a^bf(x)dx": "",
-            "iota": "",
-            "kappa": "",
-            "lambda": "",
-            "Lambda": "",
-            "lArr": "",
-            "larr": "",
-            "lim_(x-&gt;oo)": "",
-            "mu": "",
-            "nn": "",
-            "NN": "",
-            "nnn": "",
-            "not": "",
-            "nu": "",
-            "o+": "",
-            "o.": "",
-            "O/": "",
-            "oint": "",
-            "Omega": "",
-            "omega": "",
-            "oo": "",
-            "or": "",
-            "ox": "",
-            "Phi": "",
-            "phi": "",
-            "pi": "",
-            "Pi": "",
-            "Preview": "",
-            "prod": "",
-            "prop": "",
-            "psi": "",
-            "Psi": "",
-            "QQ": "",
-            "quad": "",
-            "rArr": "",
-            "rho": "",
-            "root(n)(x)": "",
-            "RR": "",
-            "sfa": "",
-            "Sigma": "",
-            "sigma": "",
-            "sqrt(x)": "",
-            "square": "",
-            "stackrel(-&gt;)(+)": "",
-            "sub": "",
-            "sube": "",
-            "sum": "",
-            "sum_(n=1)^oo": "",
-            "sup": "",
-            "supe": "",
-            "tau": "",
-            "Theta": "",
-            "theta": "",
-            "TT": "",
-            "tta": "",
-            "uarr": "",
-            "ula": "",
-            "upsilon": "",
-            "uu": "",
-            "uuu": "",
-            "veca": "",
-            "vv": "",
-            "vvv": "",
-            "x^(m+n)": "",
-            "x_(mn)": "",
-            "Xi": "",
-            "xi": "",
-            "xx": "",
-            "zeta": "",
-            "ZZ": "",
-            "|-&gt;": "",
-            "|--": "",
-            "|==": "",
-            "|__": "",
-            "|~": "",
-            "~=": "",
-            "~|": "",
-            "~~": "",
-            "Cancel": "<<Abbreviation>>",
-            "OK": "<<Abbreviation>>"
-        },
-        "FancySelects": {
-            "'+opt.text+'": ""
-        },
-        "FindReplace": {
-            "';\r\n  var tagc = '": "",
-            "Case sensitive search": "",
-            "Clear": "",
-            "Done": "",
-            "Enter the text you want to find": "",
-            "Find and Replace": "",
-            "found item": "",
-            "found items": "",
-            "Highlight": "",
-            "Inform a replacement word": "",
-            "Next": "",
-            "not found": "",
-            "Options": "",
-            "Replace with:": "",
-            "replaced item": "",
-            "replaced items": "",
-            "Search for:": "",
-            "Substitute all occurrences": "",
-            "Substitute this occurrence?": "",
-            "Undo": "",
-            "Whole words only": ""
-        },
-        "FormOperations": {
-            "Enter the name for new option.": "",
-            "Form Editor": "",
-            "Insert a check box.": "",
-            "Insert a Form.": "",
-            "Insert a multi-line text field.": "",
-            "Insert a radio button.": "",
-            "Insert a select field.": "",
-            "Insert a submit/reset button.": "",
-            "Insert a text, password or hidden field.": "",
-            "Message Sent": "",
-            "Please Select...": ""
-        },
-        "Forms": {
-            "'onClick'=": "",
-            "Access Key:": "",
-            "Action URL:": "",
-            "Button Script": "",
-            "Checked": "",
-            "Columns:": "",
-            "Default text (optional)": "",
-            "Dimensions": "",
-            "Disabled": "",
-            "Encoding:": "",
-            "For Control:": "",
-            "Form": "",
-            "Form Element: FIELDSET": "",
-            "Form Element: INPUT": "",
-            "Form Element: LABEL": "",
-            "Form Element: SELECT": "",
-            "Form Element: TEXTAREA": "",
-            "Form handler script": "",
-            "Form Name:": "",
-            "Get": "",
-            "Hard": "",
-            "Height in number of rows": "",
-            "HTML-Form to CGI (default)": "",
-            "Image source": "",
-            "Image URL:": "",
-            "Initial Text:": "",
-            "Insert/Edit Form": "",
-            "Insert/Edit Form Element FIELDSET": "",
-            "Insert/Edit Form Element INPUT": "",
-            "Insert/Edit Form Element LABEL": "",
-            "Insert/Edit Form Element SELECT": "",
-            "Insert/Edit Form Element TEXTAREA": "",
-            "Javascript for button click": "",
-            "Label:": "",
-            "Legend:": "",
-            "Max length:": "",
-            "Maximum number of characters accepted": "",
-            "Method:": "",
-            "multipart Form Data (File-Upload)": "",
-            "Name": "",
-            "Name of the form input": "",
-            "Name of the form select": "",
-            "name of the textarea": "",
-            "Name/ID:": "",
-            "normal": "",
-            "nowrap": "",
-            "Off": "",
-            "Physical": "",
-            "Please enter a Label": "",
-            "Post": "",
-            "pre": "",
-            "Read Only": "",
-            "Rows:": "",
-            "Size of text box in characters": "",
-            "Size:": "",
-            "Soft": "",
-            "Tab Index:": "",
-            "Target Frame:": "",
-            "Text:": "",
-            "URL of image": "",
-            "Value of the form input": "",
-            "Value:": "",
-            "Virtual": "",
-            "Width in number of characters": "",
-            "Wrap Mode:": "",
-            "You must enter a Name": "",
-            "Cancel": "<<Abbreviation>>",
-            "OK": "<<Abbreviation>>",
-            "Options": "<<FindReplace>>"
-        },
-        "FullPage": {
-            "...": "",
-            "Alternate style-sheet:": "",
-            "Background color:": "",
-            "Character set:": "",
-            "cyrillic (ISO-8859-5)": "",
-            "cyrillic (KOI8-R)": "",
-            "cyrillic (WINDOWS-1251)": "",
-            "Description:": "",
-            "DOCTYPE:": "",
-            "Document properties": "",
-            "Document title:": "",
-            "Keywords:": "",
-            "Primary style-sheet:": "",
-            "Text color:": "",
-            "UTF-8 (recommended)": "",
-            "western (ISO-8859-1)": "",
-            "Cancel": "<<Abbreviation>>",
-            "OK": "<<Abbreviation>>"
-        },
-        "FullScreen": {
-            "Maximize/Minimize Editor": ""
-        },
-        "Gecko": {
-            "The Paste button does not work in this browser for security reasons. Press CTRL-V on your keyboard to paste directly.": ""
-        },
-        "HorizontalRule": {
-            "&#x00d7;": "",
-            "&nbsp;": "",
-            "Alignment:": "",
-            "Center": "",
-            "Color:": "",
-            "Height:": "",
-            "Insert/Edit Horizontal Rule": "",
-            "Insert/edit horizontal rule": "",
-            "Layout": "",
-            "Left": "",
-            "No shading": "",
-            "percent": "",
-            "pixels": "",
-            "Right": "",
-            "Style": "",
-            "Width:": "",
-            "Cancel": "<<Abbreviation>>",
-            "Horizontal Rule": "<<Xinha>>",
-            "OK": "<<Abbreviation>>"
-        },
-        "InlineStyler": {
-            "Background": "",
-            "Baseline": "",
-            "Border": "",
-            "Bottom": "",
-            "Char": "",
-            "Collapsed borders": "",
-            "CSS Style": "",
-            "FG Color": "",
-            "Float": "",
-            "Justify": "",
-            "Margin": "",
-            "Middle": "",
-            "None": "",
-            "Padding": "",
-            "Text align": "",
-            "Top": "",
-            "Vertical align": "",
-            "-": "<<Equation>>",
-            "Center": "<<HorizontalRule>>",
-            "Height": "<<HorizontalRule>>",
-            "Image URL": "<<Forms>>",
-            "Layout": "<<HorizontalRule>>",
-            "Left": "<<HorizontalRule>>",
-            "percent": "<<HorizontalRule>>",
-            "pixels": "<<HorizontalRule>>",
-            "Right": "<<HorizontalRule>>",
-            "Width": "<<HorizontalRule>>"
-        },
-        "InsertAnchor": {
-            "Anchor name": "",
-            "Insert Anchor": "",
-            "Cancel": "<<Abbreviation>>",
-            "Delete": "<<Abbreviation>>",
-            "OK": "<<Abbreviation>>"
-        },
-        "InsertImage": {
-            "Absbottom": "",
-            "Absmiddle": "",
-            "Alternate text:": "",
-            "Border thickness:": "",
-            "Enter the image URL here": "",
-            "For browsers that don't support images": "",
-            "Horizontal padding": "",
-            "Horizontal:": "",
-            "Image Preview:": "",
-            "Insert Image": "",
-            "Leave empty for no border": "",
-            "Not set": "",
-            "Positioning of this image": "",
-            "Preview the image in a new window": "",
-            "Spacing": "",
-            "Texttop": "",
-            "Vertical padding": "",
-            "Vertical:": "",
-            "You must enter the URL": "",
-            "Alignment:": "<<HorizontalRule>>",
-            "Baseline": "<<InlineStyler>>",
-            "Bottom": "<<InlineStyler>>",
-            "Cancel": "<<Abbreviation>>",
-            "Image URL:": "<<Forms>>",
-            "Layout": "<<HorizontalRule>>",
-            "Left": "<<HorizontalRule>>",
-            "Middle": "<<InlineStyler>>",
-            "OK": "<<Abbreviation>>",
-            "Preview": "<<Equation>>",
-            "Right": "<<HorizontalRule>>",
-            "Top": "<<InlineStyler>>"
-        },
-        "InsertNote": {
-            "Insert": "",
-            "Insert footnote": "",
-            "Insert Note": "",
-            "Cancel": "<<Abbreviation>>"
-        },
-        "InsertPagebreak": {
-            "Page break": "",
-            "Page Break": ""
-        },
-        "InsertSmiley": {
-            "Insert Smiley": ""
-        },
-        "InsertSnippet": {
-            "\\n  This is an information about something\\n": "",
-            "Hide preview": "",
-            "Insert as": "",
-            "Insert Snippet": "",
-            "InsertSnippet for Xinha": "",
-            "Link1": "",
-            "Link2": "",
-            "Link3": "",
-            "Link4": "",
-            "Link5": "",
-            "Show preview": "",
-            "This is an information about something": "",
-            "Variable": "",
-            "Cancel": "<<Abbreviation>>"
-        },
-        "InsertSnippet2": {
-            "All Categories": "",
-            "Filter": "",
-            "Insert as HTML": "",
-            "Insert as template variable": "",
-            "Only search word beginning": "",
-            "Cancel": "<<Abbreviation>>",
-            "HTML": "<<CharCounter>>",
-            "Insert Snippet": "<<InsertSnippet>>",
-            "InsertSnippet for Xinha": "<<InsertSnippet>>",
-            "Variable": "<<InsertSnippet>>"
-        },
-        "InsertTable": {
-            "Caption": "",
-            "Caption for the table": "",
-            "Cell padding:": "",
-            "Cell spacing:": "",
-            "Collapse borders:": "",
-            "Cols:": "",
-            "Em": "",
-            "Fixed width columns": "",
-            "Layou": "",
-            "Number of columns": "",
-            "Number of rows": "",
-            "Positioning of this table": "",
-            "Space between adjacent cells": "",
-            "Space between content and border in cell": "",
-            "Style of the border": "",
-            "Width of the table": "",
-            "Width unit": "",
-            "You must enter a number of columns": "",
-            "You must enter a number of rows": "",
-            "Absbottom": "<<InsertImage>>",
-            "Absmiddle": "<<InsertImage>>",
-            "Alignment:": "<<HorizontalRule>>",
-            "Baseline": "<<InlineStyler>>",
-            "Border": "<<InlineStyler>>",
-            "Border thickness:": "<<InsertImage>>",
-            "Bottom": "<<InlineStyler>>",
-            "Cancel": "<<Abbreviation>>",
-            "Insert Table": "<<Xinha>>",
-            "Layout": "<<HorizontalRule>>",
-            "Leave empty for no border": "<<InsertImage>>",
-            "Left": "<<HorizontalRule>>",
-            "Middle": "<<InlineStyler>>",
-            "Not set": "<<InsertImage>>",
-            "OK": "<<Abbreviation>>",
-            "Percent": "<<HorizontalRule>>",
-            "Pixels": "<<HorizontalRule>>",
-            "Right": "<<HorizontalRule>>",
-            "Rows:": "<<Forms>>",
-            "Spacing": "<<InsertImage>>",
-            "Texttop": "<<InsertImage>>",
-            "Top": "<<InlineStyler>>",
-            "Width:": "<<HorizontalRule>>"
-        },
-        "LangMarks": {
-            "&mdash; language &mdash;": "",
-            "', '": "",
-            "English": "",
-            "French": "",
-            "Greek": "",
-            "language select": "",
-            "Latin": ""
-        },
-        "Linker": {
-            "(px)": "",
-            "Anchor-Link": "",
-            "Anchor:": "",
-            "Email Address:": "",
-            "Email Link": "",
-            "Location Bar:": "",
-            "Menu Bar:": "",
-            "Message Template:": "",
-            "New Window": "",
-            "Ordinary Link": "",
-            "Popup Window": "",
-            "PopupWindow": "",
-            "Remove Link": "",
-            "Resizeable:": "",
-            "Same Window (jump out of frames)": "",
-            "Scrollbars:": "",
-            "Shows On Hover": "",
-            "Status Bar:": "",
-            "Subject:": "",
-            "Title:": "",
-            "Toolbar:": "",
-            "URL Link": "",
-            "You must select some text before making a new link.": "",
-            "Are you sure you wish to remove this link?": "<<CreateLink>>",
-            "Cancel": "<<Abbreviation>>",
-            "Insert/Modify Link": "<<CreateLink>>",
-            "Name:": "<<Forms>>",
-            "OK": "<<Abbreviation>>",
-            "Size:": "<<Forms>>",
-            "Target:": "<<CreateLink>>",
-            "URL:": "<<CreateLink>>"
-        },
-        "ListType": {
-            "Choose list style type (for ordered lists)": "",
-            "Decimal numbers": "",
-            "Lower greek letters": "",
-            "Lower latin letters": "",
-            "Lower roman numbers": "",
-            "Upper latin letters": "",
-            "Upper roman numbers": ""
-        },
-        "MootoolsFileManager": {
-            "Insert File Link": "",
-            "You must select some text before making a new link.": "<<Linker>>"
-        },
-        "Opera": {
-            "MARK": "",
-            "The Paste button does not work in Mozilla based web browsers (technical security reasons). Press CTRL-V on your keyboard to paste directly.": ""
-        },
-        "PasteText": {
-            "Insert text in new paragraph": "",
-            "Paste as Plain Text": "",
-            "Cancel": "<<Abbreviation>>",
-            "OK": "<<Abbreviation>>"
-        },
-        "PreserveScripts": {
-            "JavaScript": "",
-            "PHP": ""
-        },
-        "QuickTag": {
-            "',\r\n                           'cl': '": "",
-            "ATTRIBUTES": "",
-            "Colors": "",
-            "Enter the TAG you want to insert": "",
-            "No CSS class avaiable": "",
-            "Ok": "",
-            "OPTIONS": "",
-            "Quick Tag Editor": "",
-            "TAGs": "",
-            "There are some unclosed quote": "",
-            "This attribute already exists in the TAG": "",
-            "You have to select some text": "",
-            "Cancel": "<<Abbreviation>>"
-        },
-        "SaveSubmit": {
-            "in progress": "",
-            "Ready": "",
-            "Save": "",
-            "Saving...": ""
-        },
-        "SetId": {
-            "ID/Name:": "",
-            "Set Id and Name": "",
-            "Set Id/Name": "",
-            "Set ID/Name": "",
-            "Cancel": "<<Abbreviation>>",
-            "Delete": "<<Abbreviation>>",
-            "OK": "<<Abbreviation>>"
-        },
-        "SmartReplace": {
-            "ClosingDoubleQuotes": "",
-            "ClosingSingleQuote": "",
-            "Convert all quotes and dashes in the current document": "",
-            "Enable automatic replacements": "",
-            "OpeningDoubleQuotes": "",
-            "OpeningSingleQuote": "",
-            "SmartReplace": "",
-            "SmartReplace Settings": "",
-            "OK": "<<Abbreviation>>"
-        },
-        "Stylist": {
-            "Styles": ""
-        },
-        "SuperClean": {
-            "Clean bad HTML from Microsoft Word.": "",
-            "Clean Selection Only": "",
-            "Clean up HTML": "",
-            "Cleaning Scope": "",
-            "General tidy up and correction of some problems.": "",
-            "Please select from the following cleaning options...": "",
-            "Please stand by while cleaning in process...": "",
-            "Remove alignment (left/right/justify).": "",
-            "Remove all classes (CSS).": "",
-            "Remove All HTML Tags": "",
-            "Remove all styles (CSS).": "",
-            "Remove custom font sizes.": "",
-            "Remove custom text colors.": "",
-            "Remove custom typefaces (font \"styles\").": "",
-            "Remove emphasis and annotations.": "",
-            "Remove lang attributes.": "",
-            "Remove Paragraphs": "",
-            "Remove superscripts and subscripts.": "",
-            "Replace directional quote marks with non-directional quote marks.": "",
-            "Vigorously purge HTML from Microsoft Word.": "",
-            "Cancel": "<<Abbreviation>>",
-            "OK": "<<Abbreviation>>"
-        },
-        "TableOperations": {
-            "All four sides": "",
-            "Borders": "",
-            "Cell Properties": "",
-            "Cell properties": "",
-            "Cell Type:": "",
-            "Cells down": "",
-            "Cells to the right, and": "",
-            "Delete cell": "",
-            "Delete column": "",
-            "Delete row": "",
-            "Do Not Change": "",
-            "Frame and borders": "",
-            "Frames": "",
-            "Header (th)": "",
-            "Insert cell after": "",
-            "Insert cell before": "",
-            "Insert column after": "",
-            "Insert column before": "",
-            "Insert row after": "",
-            "Insert row before": "",
-            "Merge cells": "",
-            "Merge current cell with:": "",
-            "No rules": "",
-            "No sides": "",
-            "Normal (td)": "",
-            "Please click into some cell": "",
-            "Row Properties": "",
-            "Row properties": "",
-            "Rules will appear between all rows and columns": "",
-            "Rules will appear between columns only": "",
-            "Rules will appear between rows only": "",
-            "Spacing and padding": "",
-            "Split column": "",
-            "Split row": "",
-            "Summary": "",
-            "Table properties": "",
-            "Table Properties": "",
-            "The bottom side only": "",
-            "The left-hand side only": "",
-            "The right and left sides only": "",
-            "The right-hand side only": "",
-            "The top and bottom sides only": "",
-            "The top side only": "",
-            "Xinha cowardly refuses to delete the last cell in row.": "",
-            "Xinha cowardly refuses to delete the last column in table.": "",
-            "Xinha cowardly refuses to delete the last row in table.": "",
-            "Cancel": "<<Abbreviation>>",
-            "Caption": "<<InsertTable>>",
-            "Columns": "<<Forms>>",
-            "Description": "<<FullPage>>",
-            "Merge Cells": "<<ContextMenu>>",
-            "OK": "<<Abbreviation>>",
-            "Padding": "<<InlineStyler>>",
-            "pixels": "<<HorizontalRule>>",
-            "Rows": "<<Forms>>",
-            "Spacing": "<<InsertImage>>"
-        },
-        "WebKit": {
-            "The Paste button does not work in this browser for security reasons. Press CTRL-V on your keyboard to paste directly.": "<<Gecko>>"
-        },
-        "Xinha": {
-            "&#8212; font &#8212;": "",
-            "&#8212; format &#8212;": "",
-            "&#8212; size &#8212;": "",
-            "1 (8 pt)": "",
-            "2 (10 pt)": "",
-            "3 (12 pt)": "",
-            "4 (14 pt)": "",
-            "5 (18 pt)": "",
-            "6 (24 pt)": "",
-            "7 (36 pt)": "",
-            "About this editor": "",
-            "Address": "",
-            "Arial": "",
-            "Background Color": "",
-            "Bold": "",
-            "Bulleted List": "",
-            "Clean content pasted from Word": "",
-            "Clear Inline Font Specifications": "",
-            "Clear MSOffice tags": "",
-            "Close": "",
-            "Constructing object": "",
-            "Copy selection": "",
-            "Courier New": "",
-            "Create Statusbar": "",
-            "Create Toolbar": "",
-            "CTRL-0 (zero)": "",
-            "CTRL-1 .. CTRL-6": "",
-            "CTRL-A": "",
-            "CTRL-B": "",
-            "CTRL-C": "",
-            "CTRL-E": "",
-            "CTRL-I": "",
-            "CTRL-J": "",
-            "CTRL-L": "",
-            "CTRL-N": "",
-            "CTRL-R": "",
-            "CTRL-S": "",
-            "CTRL-U": "",
-            "CTRL-V": "",
-            "CTRL-X": "",
-            "CTRL-Y": "",
-            "CTRL-Z": "",
-            "Current style": "",
-            "Cut selection": "",
-            "Decrease Indent": "",
-            "Direction left to right": "",
-            "Direction right to left": "",
-            "Editor Help": "",
-            "ENTER": "",
-            "Error Loading Xinha.  Developers, check the Error Console for information.": "",
-            "Finishing": "",
-            "Font Color": "",
-            "Formatted": "",
-            "Generate Xinha framework": "",
-            "Georgia": "",
-            "Heading 1": "",
-            "Heading 2": "",
-            "Heading 3": "",
-            "Heading 4": "",
-            "Heading 5": "",
-            "Heading 6": "",
-            "Headings": "",
-            "Help using editor": "",
-            "Horizontal Rule": "",
-            "Impact": "",
-            "Increase Indent": "",
-            "Init editor size": "",
-            "insert linebreak": "",
-            "Insert Table": "",
-            "Insert Web Link": "",
-            "Insert/Modify Image": "",
-            "Insert/Overwrite": "",
-            "Italic": "",
-            "Justify Center": "",
-            "Justify Full": "",
-            "Justify Left": "",
-            "Justify Right": "",
-            "Keyboard shortcuts": "",
-            "Loading Core": "",
-            "Loading in progress. Please wait!": "",
-            "Loading plugin $plugin": "",
-            "Loading plugins": "",
-            "MS Word Cleaner": "",
-            "new paragraph": "",
-            "Normal": "",
-            "Ordered List": "",
-            "Paste from clipboard": "",
-            "Path": "",
-            "Print document": "",
-            "Redoes your last action": "",
-            "Register plugin $plugin": "",
-            "Remove formatting": "",
-            "Save as": "",
-            "Select all": "",
-            "Select Color": "",
-            "Set format to paragraph": "",
-            "SHIFT-ENTER": "",
-            "Split Block": "",
-            "Strikethrough": "",
-            "Subscript": "",
-            "Superscript": "",
-            "Tahoma": "",
-            "The editor provides the following key combinations:": "",
-            "Times New Roman": "",
-            "Toggle Borders": "",
-            "Toggle HTML Source": "",
-            "Touch here first to activate editor.": "",
-            "Underline": "",
-            "Undoes your last action": "",
-            "Verdana": "",
-            "Waiting for Iframe to load...": "",
-            "WingDings": "",
-            "Would you like to clear font colours?": "",
-            "Would you like to clear font sizes?": "",
-            "Would you like to clear font typefaces?": "",
-            "Xinha": "",
-            "You are in TEXT MODE.  Use the [<>] button to switch back to WYSIWYG.": ""
-        },
-        "BackgroundImage": {
-            "__ TRANSLATOR NOTE __": "*** BACKGROUNDIMAGE IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***",
-            "Remove Current Background": "",
-            "Set Background": "",
-            "Set page background image": "",
-            "Set Page Background Image": "",
-            "Cancel": "<<Abbreviation>>"
-        },
-        "ClientsideSpellcheck": {
-            "__ TRANSLATOR NOTE __": "*** CLIENTSIDESPELLCHECK IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***",
-            "Spell Check using ieSpell": ""
-        },
-        "ExtendedFileManager": {
-            "__ TRANSLATOR NOTE __": "*** EXTENDEDFILEMANAGER IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***",
-            "10%": "",
-            "100%": "",
-            "200%": "",
-            "25%": "",
-            "50%": "",
-            "75%": "",
-            ">List View": "",
-            ">Thumbnail View": "",
-            "A:": "",
-            "Align": "",
-            "Alt": "",
-            "Border Color": "",
-            "Constrain Proportions": "",
-            "Crop": "",
-            "D:": "",
-            "Directory": "",
-            "Directory Up": "",
-            "Edit": "",
-            "File List": "",
-            "File Manager": "",
-            "Filename:": "",
-            "Filesize:": "",
-            "Flip Horizontal": "",
-            "Flip Image": "",
-            "Flip Vertical": "",
-            "Folder": "",
-            "GIF": "",
-            "GIF format is not supported, image editing not supported.": "",
-            "H:": "",
-            "Image Editor": "",
-            "Image Selection": "",
-            "Invalid base directory:": "",
-            "JPEG High": "",
-            "JPEG Low": "",
-            "JPEG Medium": "",
-            "Loading": "",
-            "Lock": "",
-            "Marker": "",
-            "Maximum folder size limit reached. Upload disabled.": "",
-            "Measure": "",
-            "New Folder": "",
-            "No Files Found": "",
-            "No Image Available": "",
-            "Please enter value": "",
-            "PNG": "",
-            "Preset": "",
-            "Quality:": "",
-            "Refresh": "",
-            "Rename": "",
-            "Resize": "",
-            "Rotate": "",
-            "Rotate 180 &deg;": "",
-            "Rotate 90 &deg; CCW": "",
-            "Rotate 90 &deg; CW": "",
-            "Rotate Image": "",
-            "Start X:": "",
-            "Start Y:": "",
-            "Target Window": "",
-            "Toggle marker color": "",
-            "Trash": "",
-            "Upload": "",
-            "W:": "",
-            "X:": "",
-            "Xinha Image Editor": "",
-            "Y:": "",
-            "Zoom": "",
-            "Absbottom": "<<InsertImage>>",
-            "Absmiddle": "<<InsertImage>>",
-            "Baseline": "<<InlineStyler>>",
-            "Border": "<<InlineStyler>>",
-            "Bottom": "<<InlineStyler>>",
-            "Cancel": "<<Abbreviation>>",
-            "Clear": "<<FindReplace>>",
-            "Color": "<<HorizontalRule>>",
-            "Copy": "<<ContextMenu>>",
-            "Cut": "<<ContextMenu>>",
-            "Height": "<<HorizontalRule>>",
-            "Height:": "<<HorizontalRule>>",
-            "Insert File Link": "<<MootoolsFileManager>>",
-            "Left": "<<HorizontalRule>>",
-            "Margin": "<<InlineStyler>>",
-            "Middle": "<<InlineStyler>>",
-            "New window (_blank)": "<<CreateLink>>",
-            "None (use implicit)": "<<CreateLink>>",
-            "Not set": "<<InsertImage>>",
-            "OK": "<<Abbreviation>>",
-            "Padding": "<<InlineStyler>>",
-            "Positioning of this image": "<<InsertImage>>",
-            "Preview": "<<Equation>>",
-            "Right": "<<HorizontalRule>>",
-            "Same frame (_self)": "<<CreateLink>>",
-            "Save": "<<SaveSubmit>>",
-            "Texttop": "<<InsertImage>>",
-            "Title (tooltip)": "<<CreateLink>>",
-            "Top": "<<InlineStyler>>",
-            "Top frame (_top)": "<<CreateLink>>",
-            "Width": "<<HorizontalRule>>",
-            "Width:": "<<HorizontalRule>>",
-            "You must select some text before making a new link.": "<<Linker>>"
-        },
-        "Filter": {
-            "__ TRANSLATOR NOTE __": "*** FILTER IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***",
-            "Filter": "<<InsertSnippet2>>"
-        },
-        "HtmlTidy": {
-            "__ TRANSLATOR NOTE __": "*** HTMLTIDY IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***",
-            "Auto-Tidy": "",
-            "Don't Tidy": "",
-            "HTML Tidy": "",
-            "Tidy failed.  Check your HTML for syntax errors.": ""
-        },
-        "ImageManager": {
-            "__ TRANSLATOR NOTE __": "*** IMAGEMANAGER IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***",
-            "Angle:": "",
-            "Flickr Picture List": "",
-            "Flickr Pictures": "",
-            "Flickr Selection": "",
-            "Flickr Username/Email": "",
-            "Folder Name:": "",
-            "Image Format": "",
-            "Image List": "",
-            "Keyword": "",
-            "No Images Found": "",
-            "No Photos Found": "",
-            "No Videos Found": "",
-            "This Server": "",
-            "YouTube Selection": "",
-            "YouTube Username": "",
-            "YouTube Video List": "",
-            "YouTube Videos": "",
-            "A:": "<<ExtendedFileManager>>",
-            "Absbottom": "<<InsertImage>>",
-            "Absmiddle": "<<InsertImage>>",
-            "Baseline": "<<InlineStyler>>",
-            "Bottom": "<<InlineStyler>>",
-            "Cancel": "<<Abbreviation>>",
-            "Clear": "<<FindReplace>>",
-            "Constrain Proportions": "<<ExtendedFileManager>>",
-            "Crop": "<<ExtendedFileManager>>",
-            "D:": "<<ExtendedFileManager>>",
-            "Directory": "<<ExtendedFileManager>>",
-            "Directory Up": "<<ExtendedFileManager>>",
-            "Edit": "<<ExtendedFileManager>>",
-            "Filename:": "<<ExtendedFileManager>>",
-            "Flip Horizontal": "<<ExtendedFileManager>>",
-            "Flip Image": "<<ExtendedFileManager>>",
-            "Flip Vertical": "<<ExtendedFileManager>>",
-            "GIF": "<<ExtendedFileManager>>",
-            "GIF format is not supported, image editing not supported.": "<<ExtendedFileManager>>",
-            "H:": "<<ExtendedFileManager>>",
-            "Height:": "<<HorizontalRule>>",
-            "Image Editor": "<<ExtendedFileManager>>",
-            "Image Selection": "<<ExtendedFileManager>>",
-            "Insert Image": "<<InsertImage>>",
-            "Invalid base directory:": "<<ExtendedFileManager>>",
-            "JPEG High": "<<ExtendedFileManager>>",
-            "JPEG Low": "<<ExtendedFileManager>>",
-            "JPEG Medium": "<<ExtendedFileManager>>",
-            "Left": "<<HorizontalRule>>",
-            "Lock": "<<ExtendedFileManager>>",
-            "Marker": "<<ExtendedFileManager>>",
-            "Measure": "<<ExtendedFileManager>>",
-            "Middle": "<<InlineStyler>>",
-            "New Folder": "<<ExtendedFileManager>>",
-            "No Image Available": "<<ExtendedFileManager>>",
-            "Not set": "<<InsertImage>>",
-            "OK": "<<Abbreviation>>",
-            "PNG": "<<ExtendedFileManager>>",
-            "Positioning of this image": "<<InsertImage>>",
-            "Quality:": "<<ExtendedFileManager>>",
-            "Refresh": "<<ExtendedFileManager>>",
-            "Resize": "<<ExtendedFileManager>>",
-            "Right": "<<HorizontalRule>>",
-            "Rotate": "<<ExtendedFileManager>>",
-            "Rotate 180 &deg;": "<<ExtendedFileManager>>",
-            "Rotate 90 &deg; CCW": "<<ExtendedFileManager>>",
-            "Rotate 90 &deg; CW": "<<ExtendedFileManager>>",
-            "Rotate Image": "<<ExtendedFileManager>>",
-            "Save": "<<SaveSubmit>>",
-            "Start X:": "<<ExtendedFileManager>>",
-            "Start Y:": "<<ExtendedFileManager>>",
-            "Texttop": "<<InsertImage>>",
-            "Top": "<<InlineStyler>>",
-            "Trash": "<<ExtendedFileManager>>",
-            "W:": "<<ExtendedFileManager>>",
-            "Width:": "<<HorizontalRule>>",
-            "X:": "<<ExtendedFileManager>>",
-            "Y:": "<<ExtendedFileManager>>"
-        },
-        "InsertMarquee": {
-            "__ TRANSLATOR NOTE __": "*** INSERTMARQUEE IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***",
-            "Alternate": "",
-            "Background-Color:": "",
-            "Behavior:": "",
-            "Continuous": "",
-            "Direction:": "",
-            "Insert scrolling marquee": "",
-            "Marquee Editor": "",
-            "Scroll Amount:": "",
-            "Scroll Delay:": "",
-            "Slide": "",
-            "Speed Control": "",
-            "Cancel": "<<Abbreviation>>",
-            "Height:": "<<HorizontalRule>>",
-            "Left": "<<HorizontalRule>>",
-            "Name": "<<Forms>>",
-            "Name/ID:": "<<Forms>>",
-            "OK": "<<Abbreviation>>",
-            "Right": "<<HorizontalRule>>",
-            "Text:": "<<Forms>>",
-            "Width:": "<<HorizontalRule>>"
-        },
-        "InsertPicture": {
-            "__ TRANSLATOR NOTE __": "*** INSERTPICTURE IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***",
-            "Leave empty for not defined": "",
-            " Open file in new window": "",
-            "Open file in new window": "",
-            "Upload file": "",
-            "Absbottom": "<<InsertImage>>",
-            "Absmiddle": "<<InsertImage>>",
-            "Alignment:": "<<HorizontalRule>>",
-            "Alternate text:": "<<InsertImage>>",
-            "Baseline": "<<InlineStyler>>",
-            "Border thickness:": "<<InsertImage>>",
-            "Bottom": "<<InlineStyler>>",
-            "Cancel": "<<Abbreviation>>",
-            "Enter the image URL here": "<<InsertImage>>",
-            "For browsers that don't support images": "<<InsertImage>>",
-            "Height:": "<<HorizontalRule>>",
-            "Horizontal padding": "<<InsertImage>>",
-            "Horizontal:": "<<InsertImage>>",
-            "Image Preview:": "<<InsertImage>>",
-            "Image URL:": "<<Forms>>",
-            "Insert Image": "<<InsertImage>>",
-            "Layout": "<<HorizontalRule>>",
-            "Leave empty for no border": "<<InsertImage>>",
-            "Left": "<<HorizontalRule>>",
-            "Middle": "<<InlineStyler>>",
-            "Not set": "<<InsertImage>>",
-            "OK": "<<Abbreviation>>",
-            "Positioning of this image": "<<InsertImage>>",
-            "Preview": "<<Equation>>",
-            "Preview the image in a new window": "<<InsertImage>>",
-            "Right": "<<HorizontalRule>>",
-            "Size": "<<Forms>>",
-            "Spacing": "<<InsertImage>>",
-            "Texttop": "<<InsertImage>>",
-            "Top": "<<InlineStyler>>",
-            "Vertical padding": "<<InsertImage>>",
-            "Vertical:": "<<InsertImage>>",
-            "Width:": "<<HorizontalRule>>"
-        },
-        "NoteServer": {
-            "__ TRANSLATOR NOTE __": "*** NOTESERVER IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***",
-            "120%": "",
-            "150%": "",
-            "80%": "",
-            "Add GUIDO Code in a textbox on the page": "",
-            "Add MIDI link to allow students to hear the music": "",
-            "Format": "",
-            "GUIDO Code": "",
-            "Guido code": "",
-            "Image in applet": "",
-            "Insert GUIDO Music Notation": "",
-            "MIDI File": "",
-            "Source Code": "",
-            "With Mozilla, the applet will not be visible in editor, but only in Web page after submitting.": "",
-            "Zoom :": "",
-            "100%": "<<ExtendedFileManager>>",
-            "Cancel": "<<Abbreviation>>",
-            "Image Preview": "<<InsertImage>>",
-            "OK": "<<Abbreviation>>",
-            "Options": "<<FindReplace>>",
-            "Preview": "<<Equation>>",
-            "Preview the image in a new window": "<<InsertImage>>",
-            "Zoom": "<<ExtendedFileManager>>"
-        },
-        "PSLocal": {
-            "__ TRANSLATOR NOTE __": "*** PSLOCAL IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***",
-            "Confirm": "",
-            "Enable": "",
-            "Enable Gears in order to use local document storage and configuration.": "",
-            "Enabling Local Storage": "",
-            "Install": "",
-            "Learn About Local Storage": "",
-            "This will reload the page, causing you to lose any unsaved work.  Press \"OK\" to reload.": "",
-            "Xinha uses Google Gears to enable local document storage.  With Gears installed, you can save drafts of your documents on your hard drive, configure Xinha to look the way you want, and carry this information wherever you use Xinha on the web.": "",
-            "Cancel": "<<Abbreviation>>"
-        },
-        "PSServer": {
-            "__ TRANSLATOR NOTE __": "*** PSSERVER IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***",
-            "File: ": "",
-            "Import": ""
-        },
-        "PersistentStorage": {
-            "__ TRANSLATOR NOTE __": "*** PERSISTENTSTORAGE IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***",
-            "Details": "",
-            "File Browser": "",
-            "Hello    There C ": "",
-            "Hello  There A ": "",
-            "Hello \" There B \"": "",
-            "Hello ' There D '": "",
-            "List of Places": "",
-            "New Document": "",
-            "Open": "",
-            "Open Document": "",
-            "Places": "",
-            "Please enter the name of the directory you'd like to create.": "",
-            "Save Document": "",
-            "This will erase any unsaved content.  If you're certain, please click OK to continue.": "",
-            "Web URL": "",
-            "Cancel": "<<Abbreviation>>",
-            "Confirm": "<<PSLocal>>",
-            "Copy": "<<ContextMenu>>",
-            "Delete": "<<Abbreviation>>",
-            "Directory Up": "<<ExtendedFileManager>>",
-            "File List": "<<ExtendedFileManager>>",
-            "File Manager": "<<ExtendedFileManager>>",
-            "Filename": "<<ExtendedFileManager>>",
-            "Insert": "<<InsertNote>>",
-            "Insert Image": "<<InsertImage>>",
-            "New Folder": "<<ExtendedFileManager>>",
-            "Save": "<<SaveSubmit>>",
-            "You must select some text before making a new link.": "<<Linker>>"
-        },
-        "SpellChecker": {
-            "__ TRANSLATOR NOTE __": "*** SPELLCHECKER IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***",
-            "Dictionary": "",
-            "Finished list of mispelled words": "",
-            "HTMLArea Spell Checker": "",
-            "I will open it in a new page.": "",
-            "Ignore": "",
-            "Ignore all": "",
-            "Info": "",
-            "Learn": "",
-            "No mispelled words found with the selected dictionary.": "",
-            "Original word": "",
-            "Please confirm that you want to open this link": "",
-            "Please wait.  Calling spell checker.": "",
-            "Please wait: changing dictionary to": "",
-            "pliz weit ;-)": "",
-            "Re-check": "",
-            "Replace": "",
-            "Replace all": "",
-            "Revert": "",
-            "Spell Checker": "",
-            "Spell-check": "",
-            "Suggestions": "",
-            "This will drop changes and quit spell checker.  Please confirm.": "",
-            "Cancel": "<<Abbreviation>>",
-            "OK": "<<Abbreviation>>",
-            "Replace with": "<<FindReplace>>"
-        },
-        "Template": {
-            "__ TRANSLATOR NOTE __": "*** TEMPLATE IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***",
-            "Insert template": "",
-            "Cancel": "<<Abbreviation>>"
-        },
-        "UnFormat": {
-            "__ TRANSLATOR NOTE __": "*** UNFORMAT IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***",
-            "All": "",
-            "All HTML:": "",
-            "Cleaning Area": "",
-            "Cleaning options": "",
-            "Formatting:": "",
-            "Page Cleaner": "",
-            "Select which types of formatting you would like to remove.": "",
-            "Selection": "",
-            "Cancel": "<<Abbreviation>>",
-            "OK": "<<Abbreviation>>"
-        }
-    }
-}
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/lang/merged/gb.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/lang/merged/gb.js
deleted file mode 100644
index 19686ec..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/lang/merged/gb.js
+++ /dev/null
@@ -1,1503 +0,0 @@
-// Xinha Language Combined Translation File
-//
-// LANG: "gb", ENCODING: UTF-8
-//
-// INSTRUCTIONS TO TRANSLATORS
-// ===========================================================================
-//
-// Your translation must be in UTF-8 Character Encoding.
-//
-// This is a JSON encoded file (plus comments), strings should be double-quote
-// only, do not use single quotes to surround strings - "hello", not 'hello'
-// do not have a trailing comma after the last entry in a section.
-//
-// Only full line comments are allowed (that a comments occupy entire lines).
-//
-// Search for the __NEW_TRANSLATIONS__ section below, this is where you will
-// want to focus, this section includes things that do not presently have a 
-// translation or for which the translation needs to be checked for accuracy.
-//
-// In the New Translations section a translation string is one of the following
-//
-//  "English String Here" : ""
-//     This means it is not translated yet, add your translation...
-//     "English String Here" : "Klingon String Here"
-//
-//  "English String Here" : "Translated String Here"
-//     This means that an existing translation for this string, in some other
-//     section has been found, and used.  Check that it is approprite for this
-//     section and if it is, that's fine leave it as is, otherwise change as
-//     appropriate.
-//
-//  "English String Here" : "<<AnotherSection>>"
-//     This means use the same translation for this string as <<AnotherSection>>
-//     this saves you re-tranlating strings.  If the Context of this section
-//     and the context of AnotherSection seem the same, that's fine leave it
-//     using that translation, but if this section needs a different translation, 
-//     you can provide it by replacing the link (<<AnotherSection>>) with that
-//     new translation.  For example - a "Table" in say "DataPlugin" is 
-//     perhaps translated differently to "Table" in "FurniturePlugin".
-//
-// TESTING YOUR TRANSLATION
-// ===========================================================================
-// Simply place your translation file on your webserver somewhere for example
-//
-//   /xinha/lang/merged/gb.js
-//
-// and then tell Xinha where to get it (before loading XinhaCore.js) by 
-//
-//  _editor_lang              = 'gb';
-//  _editor_lang_merged_file  = '/xinha/lang/merged/gb.js';
-//
-// Xinha will load your new language definition.
-//
-// SUBMITTING YOUR TRANSLATION
-// ===========================================================================
-// Simply create a Ticket on the Xinha website and attach your translation 
-// file.
-//
-// The Xinha developers will take your file and use the 
-//     contrib/lc_split_merged_file.php
-// script to load it into the Xinha distribution.
-
-{
-    "__NEW_TRANSLATIONS__": {
-        "Abbreviation": {
-            "Abbreviation": "",
-            "Cancel": "",
-            "Delete": "",
-            "Expansion:": "",
-            "OK": ""
-        },
-        "AboutBox": {
-            "About this editor": "<<Xinha>>",
-            "Close": "<<Xinha>>"
-        },
-        "CharCounter": {
-            "... in progress": "",
-            "Chars": "",
-            "HTML": "",
-            "Words": ""
-        },
-        "CharacterMap": {
-            "Insert special character": ""
-        },
-        "ColorPicker": {
-            "Click a color...": "",
-            "Color: ": "",
-            "Sample": "",
-            "Web Safe: ": "",
-            "Close": "<<Xinha>>",
-            "OK": "<<Abbreviation>>"
-        },
-        "ContextMenu": {
-            "_Delete Row": "",
-            "_Image Properties...": "",
-            "_Modify Link...": "",
-            "_Remove Link...": "",
-            "_Table Properties...": "",
-            "C_ell Properties...": "",
-            "Chec_k Link...": "",
-            "Copy": "",
-            "Create a link": "",
-            "Current URL is": "",
-            "Cut": "",
-            "De_lete Column": "",
-            "Delete Cell": "",
-            "Delete the current column": "",
-            "Delete the current row": "",
-            "How did you get here? (Please report!)": "",
-            "I_nsert Row Before": "",
-            "In_sert Row After": "",
-            "Insert _Column Before": "",
-            "Insert a new column after the current one": "",
-            "Insert a new column before the current one": "",
-            "Insert a new row after the current one": "",
-            "Insert a new row before the current one": "",
-            "Insert a paragraph after the current node": "",
-            "Insert a paragraph before the current node": "",
-            "Insert C_olumn After": "",
-            "Insert Cell After": "",
-            "Insert Cell Before": "",
-            "Insert paragraph after": "",
-            "Insert paragraph before": "",
-            "Link points to:": "",
-            "Make lin_k...": "",
-            "Merge Cells": "",
-            "Opens this link in a new window": "",
-            "Paste": "",
-            "Please confirm that you want to remove this element:": "",
-            "Please confirm that you want to unlink this element.": "",
-            "Remove the $elem Element...": "",
-            "Remove this node from the document": "",
-            "Ro_w Properties...": "",
-            "Show the image properties dialog": "",
-            "Show the Table Cell Properties dialog": "",
-            "Show the Table Properties dialog": "",
-            "Show the Table Row Properties dialog": "",
-            "Unlink the current element": "",
-            "Justify Center": "<<Xinha>>",
-            "Justify Full": "<<Xinha>>",
-            "Justify Left": "<<Xinha>>",
-            "Justify Right": "<<Xinha>>"
-        },
-        "CreateLink": {
-            "Are you sure you wish to remove this link?": "",
-            "Insert/Modify Link": "",
-            "New window (_blank)": "",
-            "None (use implicit)": "",
-            "Other": "",
-            "Same frame (_self)": "",
-            "Target:": "",
-            "Title (tooltip):": "",
-            "Top frame (_top)": "",
-            "URL:": "",
-            "You need to select some text before creating a link": "",
-            "Cancel": "<<Abbreviation>>",
-            "OK": "<<Abbreviation>>"
-        },
-        "DefinitionList": {
-            "definition description": "",
-            "definition list": "",
-            "definition term": ""
-        },
-        "Dialogs": {
-            "Some Text Here": ""
-        },
-        "DynamicCSS": {
-            "Choose stylesheet": "",
-            "Default": "",
-            "Undefined": ""
-        },
-        "EditTag": {
-            "Edit HTML for selected text": "",
-            "Edit Tag By Peg": "",
-            "Tag Editor": "",
-            "Cancel": "<<Abbreviation>>",
-            "OK": "<<Abbreviation>>"
-        },
-        "Equation": {
-            "!=": "",
-            "!in": "",
-            "&gt;-": "",
-            "&gt;=": "",
-            "&lt;=": "",
-            "&lt;=&gt;": "",
-            "&lt;x&gt;": "",
-            "&nbsp; `!` &nbsp;": "",
-            "&nbsp; `.` &nbsp;": "",
-            "&nbsp; `0` &nbsp;": "",
-            "&nbsp; `2` &nbsp;": "",
-            "&nbsp; `3` &nbsp;": "",
-            "&nbsp; `4` &nbsp;": "",
-            "&nbsp; `5` &nbsp;": "",
-            "&nbsp; `6` &nbsp;": "",
-            "&nbsp; `7` &nbsp;": "",
-            "&nbsp; `8` &nbsp;": "",
-            "&nbsp; `9` &nbsp;": "",
-            "&nbsp; `e` &nbsp;": "",
-            "&nbsp;&nbsp;`1` &nbsp;": "",
-            "&nbsp;`+{::}`&nbsp;": "",
-            "&nbsp;`-:\\ `": "",
-            "&nbsp;`-{::}`&nbsp;": "",
-            "&nbsp;`C`&nbsp;": "",
-            "&nbsp;`cos`": "",
-            "&nbsp;`ln`&nbsp;": "",
-            "&nbsp;`pi` &nbsp;": "",
-            "&nbsp;`sin`": "",
-            "&nbsp;`tan`": "",
-            "&nbsp;`times`&nbsp;": "",
-            "&quot;text&quot;": "",
-            "'+formula+'": "",
-            "((n),(k))": "",
-            "(x+1)/(x-1)": "",
-            "*": "",
-            "**": "",
-            "+-": "",
-            "-&gt;": "",
-            "-&lt;": "",
-            "-:": "",
-            "-=": "",
-            "//": "",
-            "/_": "",
-            ":.": "",
-            "=&gt;": "",
-            "@": "",
-            "[[a,b],[c,d]]": "",
-            "\\\\": "",
-            "\\nClick in the box to use your keyboard or use the buttons\\n": "",
-            "^^": "",
-            "^^^": "",
-            "__|": "",
-            "_|_": "",
-            "`!=`": "",
-            "`!in`": "",
-            "`&and;`": "",
-            "`&cap;`": "",
-            "`&cup;`": "",
-            "`&gt;-`": "",
-            "`&gt;=`": "",
-            "`&lt;=&gt;`": "",
-            "`&lt;=`": "",
-            "`&lt;x&gt;`": "",
-            "`&or;`": "",
-            "`&quot;text&quot;`": "",
-            "`((n),(k))`": "",
-            "`(x+1)/(x-1)`": "",
-            "`**`": "",
-            "`*`": "",
-            "`+-`": "",
-            "`-&gt;`": "",
-            "`-&lt;`": "",
-            "`-:`": "",
-            "`-=`": "",
-            "`//`": "",
-            "`/_`": "",
-            "`:.`": "",
-            "`=&gt;`": "",
-            "`@`": "",
-            "`[[a,b],[c,d]]`": "",
-            "`\\\\`": "",
-            "`__|`": "",
-            "`_|_`": "",
-            "`AA`": "",
-            "`aleph`": "",
-            "`alpha`": "",
-            "`and`": "",
-            "`bara`": "",
-            "`bba`": "",
-            "`bbba`": "",
-            "`beta`": "",
-            "`CC`": "",
-            "`cca`": "",
-            "`chi`": "",
-            "`darr`": "",
-            "`ddota`": "",
-            "`del`": "",
-            "`Delta`": "",
-            "`delta`": "",
-            "`diamond`": "",
-            "`dota`": "",
-            "`dy/dx`": "",
-            "`EE`": "",
-            "`epsi`": "",
-            "`eta`": "",
-            "`fra`": "",
-            "`Gamma`": "",
-            "`gamma`": "",
-            "`grad`": "",
-            "`hArr`": "",
-            "`harr`": "",
-            "`hata`": "",
-            "`if`": "",
-            "`in`": "",
-            "`int`": "",
-            "`iota`": "",
-            "`kappa`": "",
-            "`Lambda`": "",
-            "`lambda`": "",
-            "`larr`": "",
-            "`lArr`": "",
-            "`lim_(x-&gt;oo)`": "",
-            "`log`": "",
-            "`mu`": "",
-            "`NN`": "",
-            "`nn`": "",
-            "`not`": "",
-            "`nu`": "",
-            "`o+`": "",
-            "`o.`": "",
-            "`O/`": "",
-            "`oint`": "",
-            "`Omega`": "",
-            "`omega`": "",
-            "`oo`": "",
-            "`or`": "",
-            "`ox`": "",
-            "`phi`": "",
-            "`Phi`": "",
-            "`Pi`": "",
-            "`pi`": "",
-            "`prod`": "",
-            "`prop`": "",
-            "`psi`": "",
-            "`Psi`": "",
-            "`QQ`": "",
-            "`quad`": "",
-            "`rArr`": "",
-            "`rho`": "",
-            "`root(n)(x)`": "",
-            "`RR`": "",
-            "`sfa`": "",
-            "`Sigma`": "",
-            "`sigma`": "",
-            "`sqrt(x)`": "",
-            "`square`": "",
-            "`stackrel(-&gt;)(+)`": "",
-            "`sub`": "",
-            "`sube`": "",
-            "`sum`": "",
-            "`sup`": "",
-            "`supe`": "",
-            "`tau`": "",
-            "`theta`": "",
-            "`Theta`": "",
-            "`TT`": "",
-            "`tta`": "",
-            "`uarr`": "",
-            "`ula`": "",
-            "`upsilon`": "",
-            "`uu`": "",
-            "`veca`": "",
-            "`vv`": "",
-            "`x_(mn)`": "",
-            "`xi`": "",
-            "`Xi`": "",
-            "`xx`": "",
-            "`zeta`": "",
-            "`ZZ`": "",
-            "`|-&gt;`": "",
-            "`|--`": "",
-            "`|==`": "",
-            "`|__`": "",
-            "`|~`": "",
-            "`~=`": "",
-            "`~|`": "",
-            "`~~`": "",
-            "AA": "",
-            "aleph": "",
-            "alpha": "",
-            "and": "",
-            "AsciiMath Formula Input": "",
-            "AsciiMathML Example": "",
-            "bara": "",
-            "Based on ASCIIMathML by": "",
-            "bba": "",
-            "bbba": "",
-            "beta": "",
-            "CC": "",
-            "cca": "",
-            "chi": "",
-            "darr": "",
-            "ddota": "",
-            "del": "",
-            "delta": "",
-            "Delta": "",
-            "diamond": "",
-            "dota": "",
-            "dy/dx": "",
-            "EE": "",
-            "epsi": "",
-            "eta": "",
-            "For more information on AsciiMathML visit this page:": "",
-            "Formula Editor": "",
-            "fra": "",
-            "gamma": "",
-            "Gamma": "",
-            "grad": "",
-            "hArr": "",
-            "harr": "",
-            "hata": "",
-            "if": "",
-            "in": "",
-            "Input": "",
-            "int": "",
-            "int_a^bf(x)dx": "",
-            "iota": "",
-            "kappa": "",
-            "lambda": "",
-            "Lambda": "",
-            "lArr": "",
-            "larr": "",
-            "lim_(x-&gt;oo)": "",
-            "mu": "",
-            "nn": "",
-            "NN": "",
-            "nnn": "",
-            "not": "",
-            "nu": "",
-            "o+": "",
-            "o.": "",
-            "O/": "",
-            "oint": "",
-            "Omega": "",
-            "omega": "",
-            "oo": "",
-            "or": "",
-            "ox": "",
-            "Phi": "",
-            "phi": "",
-            "pi": "",
-            "Pi": "",
-            "Preview": "",
-            "prod": "",
-            "prop": "",
-            "psi": "",
-            "Psi": "",
-            "QQ": "",
-            "quad": "",
-            "rArr": "",
-            "rho": "",
-            "root(n)(x)": "",
-            "RR": "",
-            "sfa": "",
-            "Sigma": "",
-            "sigma": "",
-            "sqrt(x)": "",
-            "square": "",
-            "stackrel(-&gt;)(+)": "",
-            "sub": "",
-            "sube": "",
-            "sum": "",
-            "sum_(n=1)^oo": "",
-            "sup": "",
-            "supe": "",
-            "tau": "",
-            "Theta": "",
-            "theta": "",
-            "TT": "",
-            "tta": "",
-            "uarr": "",
-            "ula": "",
-            "upsilon": "",
-            "uu": "",
-            "uuu": "",
-            "veca": "",
-            "vv": "",
-            "vvv": "",
-            "x^(m+n)": "",
-            "x_(mn)": "",
-            "Xi": "",
-            "xi": "",
-            "xx": "",
-            "zeta": "",
-            "ZZ": "",
-            "|-&gt;": "",
-            "|--": "",
-            "|==": "",
-            "|__": "",
-            "|~": "",
-            "~=": "",
-            "~|": "",
-            "~~": "",
-            "Cancel": "<<Abbreviation>>",
-            "OK": "<<Abbreviation>>"
-        },
-        "FancySelects": {
-            "'+opt.text+'": ""
-        },
-        "FindReplace": {
-            "';\r\n  var tagc = '": "",
-            "Case sensitive search": "",
-            "Clear": "",
-            "Done": "",
-            "Enter the text you want to find": "",
-            "Find and Replace": "",
-            "found item": "",
-            "found items": "",
-            "Highlight": "",
-            "Inform a replacement word": "",
-            "Next": "",
-            "not found": "",
-            "Options": "",
-            "Replace with:": "",
-            "replaced item": "",
-            "replaced items": "",
-            "Search for:": "",
-            "Substitute all occurrences": "",
-            "Substitute this occurrence?": "",
-            "Undo": "",
-            "Whole words only": ""
-        },
-        "FormOperations": {
-            "Enter the name for new option.": "",
-            "Form Editor": "",
-            "Insert a check box.": "",
-            "Insert a Form.": "",
-            "Insert a multi-line text field.": "",
-            "Insert a radio button.": "",
-            "Insert a select field.": "",
-            "Insert a submit/reset button.": "",
-            "Insert a text, password or hidden field.": "",
-            "Message Sent": "",
-            "Please Select...": ""
-        },
-        "Forms": {
-            "'onClick'=": "",
-            "Access Key:": "",
-            "Action URL:": "",
-            "Button Script": "",
-            "Checked": "",
-            "Columns:": "",
-            "Default text (optional)": "",
-            "Dimensions": "",
-            "Disabled": "",
-            "Encoding:": "",
-            "For Control:": "",
-            "Form": "",
-            "Form Element: FIELDSET": "",
-            "Form Element: INPUT": "",
-            "Form Element: LABEL": "",
-            "Form Element: SELECT": "",
-            "Form Element: TEXTAREA": "",
-            "Form handler script": "",
-            "Form Name:": "",
-            "Get": "",
-            "Hard": "",
-            "Height in number of rows": "",
-            "HTML-Form to CGI (default)": "",
-            "Image source": "",
-            "Image URL:": "",
-            "Initial Text:": "",
-            "Insert/Edit Form": "",
-            "Insert/Edit Form Element FIELDSET": "",
-            "Insert/Edit Form Element INPUT": "",
-            "Insert/Edit Form Element LABEL": "",
-            "Insert/Edit Form Element SELECT": "",
-            "Insert/Edit Form Element TEXTAREA": "",
-            "Javascript for button click": "",
-            "Label:": "",
-            "Legend:": "",
-            "Max length:": "",
-            "Maximum number of characters accepted": "",
-            "Method:": "",
-            "multipart Form Data (File-Upload)": "",
-            "Name": "",
-            "Name of the form input": "",
-            "Name of the form select": "",
-            "name of the textarea": "",
-            "Name/ID:": "",
-            "normal": "",
-            "nowrap": "",
-            "Off": "",
-            "Physical": "",
-            "Please enter a Label": "",
-            "Post": "",
-            "pre": "",
-            "Read Only": "",
-            "Rows:": "",
-            "Size of text box in characters": "",
-            "Size:": "",
-            "Soft": "",
-            "Tab Index:": "",
-            "Target Frame:": "",
-            "Text:": "",
-            "URL of image": "",
-            "Value of the form input": "",
-            "Value:": "",
-            "Virtual": "",
-            "Width in number of characters": "",
-            "Wrap Mode:": "",
-            "You must enter a Name": "",
-            "Cancel": "<<Abbreviation>>",
-            "OK": "<<Abbreviation>>",
-            "Options": "<<FindReplace>>"
-        },
-        "FullPage": {
-            "...": "",
-            "Alternate style-sheet:": "",
-            "Background color:": "",
-            "Character set:": "",
-            "cyrillic (ISO-8859-5)": "",
-            "cyrillic (KOI8-R)": "",
-            "cyrillic (WINDOWS-1251)": "",
-            "Description:": "",
-            "DOCTYPE:": "",
-            "Document properties": "",
-            "Document title:": "",
-            "Keywords:": "",
-            "Primary style-sheet:": "",
-            "Text color:": "",
-            "UTF-8 (recommended)": "",
-            "western (ISO-8859-1)": "",
-            "Cancel": "<<Abbreviation>>",
-            "OK": "<<Abbreviation>>"
-        },
-        "FullScreen": {
-            "Maximize/Minimize Editor": ""
-        },
-        "Gecko": {
-            "The Paste button does not work in this browser for security reasons. Press CTRL-V on your keyboard to paste directly.": ""
-        },
-        "HorizontalRule": {
-            "&#x00d7;": "",
-            "&nbsp;": "",
-            "Alignment:": "",
-            "Center": "",
-            "Color:": "",
-            "Height:": "",
-            "Insert/Edit Horizontal Rule": "",
-            "Insert/edit horizontal rule": "",
-            "Layout": "",
-            "Left": "",
-            "No shading": "",
-            "percent": "",
-            "pixels": "",
-            "Right": "",
-            "Style": "",
-            "Width:": "",
-            "Cancel": "<<Abbreviation>>",
-            "Horizontal Rule": "<<Xinha>>",
-            "OK": "<<Abbreviation>>"
-        },
-        "InlineStyler": {
-            "Background": "",
-            "Baseline": "",
-            "Border": "",
-            "Bottom": "",
-            "Char": "",
-            "Collapsed borders": "",
-            "CSS Style": "",
-            "FG Color": "",
-            "Float": "",
-            "Justify": "",
-            "Margin": "",
-            "Middle": "",
-            "None": "",
-            "Padding": "",
-            "Text align": "",
-            "Top": "",
-            "Vertical align": "",
-            "-": "<<Equation>>",
-            "Center": "<<HorizontalRule>>",
-            "Height": "<<HorizontalRule>>",
-            "Image URL": "<<Forms>>",
-            "Layout": "<<HorizontalRule>>",
-            "Left": "<<HorizontalRule>>",
-            "percent": "<<HorizontalRule>>",
-            "pixels": "<<HorizontalRule>>",
-            "Right": "<<HorizontalRule>>",
-            "Width": "<<HorizontalRule>>"
-        },
-        "InsertAnchor": {
-            "Anchor name": "",
-            "Insert Anchor": "",
-            "Cancel": "<<Abbreviation>>",
-            "Delete": "<<Abbreviation>>",
-            "OK": "<<Abbreviation>>"
-        },
-        "InsertImage": {
-            "Absbottom": "",
-            "Absmiddle": "",
-            "Alternate text:": "",
-            "Border thickness:": "",
-            "Enter the image URL here": "",
-            "For browsers that don't support images": "",
-            "Horizontal padding": "",
-            "Horizontal:": "",
-            "Image Preview:": "",
-            "Insert Image": "",
-            "Leave empty for no border": "",
-            "Not set": "",
-            "Positioning of this image": "",
-            "Preview the image in a new window": "",
-            "Spacing": "",
-            "Texttop": "",
-            "Vertical padding": "",
-            "Vertical:": "",
-            "You must enter the URL": "",
-            "Alignment:": "<<HorizontalRule>>",
-            "Baseline": "<<InlineStyler>>",
-            "Bottom": "<<InlineStyler>>",
-            "Cancel": "<<Abbreviation>>",
-            "Image URL:": "<<Forms>>",
-            "Layout": "<<HorizontalRule>>",
-            "Left": "<<HorizontalRule>>",
-            "Middle": "<<InlineStyler>>",
-            "OK": "<<Abbreviation>>",
-            "Preview": "<<Equation>>",
-            "Right": "<<HorizontalRule>>",
-            "Top": "<<InlineStyler>>"
-        },
-        "InsertNote": {
-            "Insert": "",
-            "Insert footnote": "",
-            "Insert Note": "",
-            "Cancel": "<<Abbreviation>>"
-        },
-        "InsertPagebreak": {
-            "Page break": "",
-            "Page Break": ""
-        },
-        "InsertSmiley": {
-            "Insert Smiley": ""
-        },
-        "InsertSnippet": {
-            "\\n  This is an information about something\\n": "",
-            "Hide preview": "",
-            "Insert as": "",
-            "Insert Snippet": "",
-            "InsertSnippet for Xinha": "",
-            "Link1": "",
-            "Link2": "",
-            "Link3": "",
-            "Link4": "",
-            "Link5": "",
-            "Show preview": "",
-            "This is an information about something": "",
-            "Variable": "",
-            "Cancel": "<<Abbreviation>>"
-        },
-        "InsertSnippet2": {
-            "All Categories": "",
-            "Filter": "",
-            "Insert as HTML": "",
-            "Insert as template variable": "",
-            "Only search word beginning": "",
-            "Cancel": "<<Abbreviation>>",
-            "HTML": "<<CharCounter>>",
-            "Insert Snippet": "<<InsertSnippet>>",
-            "InsertSnippet for Xinha": "<<InsertSnippet>>",
-            "Variable": "<<InsertSnippet>>"
-        },
-        "InsertTable": {
-            "Caption": "",
-            "Caption for the table": "",
-            "Cell padding:": "",
-            "Cell spacing:": "",
-            "Collapse borders:": "",
-            "Cols:": "",
-            "Em": "",
-            "Fixed width columns": "",
-            "Layou": "",
-            "Number of columns": "",
-            "Number of rows": "",
-            "Positioning of this table": "",
-            "Space between adjacent cells": "",
-            "Space between content and border in cell": "",
-            "Style of the border": "",
-            "Width of the table": "",
-            "Width unit": "",
-            "You must enter a number of columns": "",
-            "You must enter a number of rows": "",
-            "Absbottom": "<<InsertImage>>",
-            "Absmiddle": "<<InsertImage>>",
-            "Alignment:": "<<HorizontalRule>>",
-            "Baseline": "<<InlineStyler>>",
-            "Border": "<<InlineStyler>>",
-            "Border thickness:": "<<InsertImage>>",
-            "Bottom": "<<InlineStyler>>",
-            "Cancel": "<<Abbreviation>>",
-            "Insert Table": "<<Xinha>>",
-            "Layout": "<<HorizontalRule>>",
-            "Leave empty for no border": "<<InsertImage>>",
-            "Left": "<<HorizontalRule>>",
-            "Middle": "<<InlineStyler>>",
-            "Not set": "<<InsertImage>>",
-            "OK": "<<Abbreviation>>",
-            "Percent": "<<HorizontalRule>>",
-            "Pixels": "<<HorizontalRule>>",
-            "Right": "<<HorizontalRule>>",
-            "Rows:": "<<Forms>>",
-            "Spacing": "<<InsertImage>>",
-            "Texttop": "<<InsertImage>>",
-            "Top": "<<InlineStyler>>",
-            "Width:": "<<HorizontalRule>>"
-        },
-        "LangMarks": {
-            "&mdash; language &mdash;": "",
-            "', '": "",
-            "English": "",
-            "French": "",
-            "Greek": "",
-            "language select": "",
-            "Latin": ""
-        },
-        "Linker": {
-            "(px)": "",
-            "Anchor-Link": "",
-            "Anchor:": "",
-            "Email Address:": "",
-            "Email Link": "",
-            "Location Bar:": "",
-            "Menu Bar:": "",
-            "Message Template:": "",
-            "New Window": "",
-            "Ordinary Link": "",
-            "Popup Window": "",
-            "PopupWindow": "",
-            "Remove Link": "",
-            "Resizeable:": "",
-            "Same Window (jump out of frames)": "",
-            "Scrollbars:": "",
-            "Shows On Hover": "",
-            "Status Bar:": "",
-            "Subject:": "",
-            "Title:": "",
-            "Toolbar:": "",
-            "URL Link": "",
-            "You must select some text before making a new link.": "",
-            "Are you sure you wish to remove this link?": "<<CreateLink>>",
-            "Cancel": "<<Abbreviation>>",
-            "Insert/Modify Link": "<<CreateLink>>",
-            "Name:": "<<Forms>>",
-            "OK": "<<Abbreviation>>",
-            "Size:": "<<Forms>>",
-            "Target:": "<<CreateLink>>",
-            "URL:": "<<CreateLink>>"
-        },
-        "ListType": {
-            "Choose list style type (for ordered lists)": "",
-            "Decimal numbers": "",
-            "Lower greek letters": "",
-            "Lower latin letters": "",
-            "Lower roman numbers": "",
-            "Upper latin letters": "",
-            "Upper roman numbers": ""
-        },
-        "MootoolsFileManager": {
-            "Insert File Link": "",
-            "You must select some text before making a new link.": "<<Linker>>"
-        },
-        "Opera": {
-            "MARK": "",
-            "The Paste button does not work in Mozilla based web browsers (technical security reasons). Press CTRL-V on your keyboard to paste directly.": ""
-        },
-        "PasteText": {
-            "Insert text in new paragraph": "",
-            "Paste as Plain Text": "",
-            "Cancel": "<<Abbreviation>>",
-            "OK": "<<Abbreviation>>"
-        },
-        "PreserveScripts": {
-            "JavaScript": "",
-            "PHP": ""
-        },
-        "QuickTag": {
-            "',\r\n                           'cl': '": "",
-            "ATTRIBUTES": "",
-            "Colors": "",
-            "Enter the TAG you want to insert": "",
-            "No CSS class avaiable": "",
-            "Ok": "",
-            "OPTIONS": "",
-            "Quick Tag Editor": "",
-            "TAGs": "",
-            "There are some unclosed quote": "",
-            "This attribute already exists in the TAG": "",
-            "You have to select some text": "",
-            "Cancel": "<<Abbreviation>>"
-        },
-        "SaveSubmit": {
-            "in progress": "",
-            "Ready": "",
-            "Save": "",
-            "Saving...": ""
-        },
-        "SetId": {
-            "ID/Name:": "",
-            "Set Id and Name": "",
-            "Set Id/Name": "",
-            "Set ID/Name": "",
-            "Cancel": "<<Abbreviation>>",
-            "Delete": "<<Abbreviation>>",
-            "OK": "<<Abbreviation>>"
-        },
-        "SmartReplace": {
-            "ClosingDoubleQuotes": "",
-            "ClosingSingleQuote": "",
-            "Convert all quotes and dashes in the current document": "",
-            "Enable automatic replacements": "",
-            "OpeningDoubleQuotes": "",
-            "OpeningSingleQuote": "",
-            "SmartReplace": "",
-            "SmartReplace Settings": "",
-            "OK": "<<Abbreviation>>"
-        },
-        "Stylist": {
-            "Styles": ""
-        },
-        "SuperClean": {
-            "Clean bad HTML from Microsoft Word.": "",
-            "Clean Selection Only": "",
-            "Clean up HTML": "",
-            "Cleaning Scope": "",
-            "General tidy up and correction of some problems.": "",
-            "Please select from the following cleaning options...": "",
-            "Please stand by while cleaning in process...": "",
-            "Remove alignment (left/right/justify).": "",
-            "Remove all classes (CSS).": "",
-            "Remove All HTML Tags": "",
-            "Remove all styles (CSS).": "",
-            "Remove custom font sizes.": "",
-            "Remove custom text colors.": "",
-            "Remove custom typefaces (font \"styles\").": "",
-            "Remove emphasis and annotations.": "",
-            "Remove lang attributes.": "",
-            "Remove Paragraphs": "",
-            "Remove superscripts and subscripts.": "",
-            "Replace directional quote marks with non-directional quote marks.": "",
-            "Vigorously purge HTML from Microsoft Word.": "",
-            "Cancel": "<<Abbreviation>>",
-            "OK": "<<Abbreviation>>"
-        },
-        "TableOperations": {
-            "All four sides": "",
-            "Borders": "",
-            "Cell Properties": "",
-            "Cell properties": "",
-            "Cell Type:": "",
-            "Cells down": "",
-            "Cells to the right, and": "",
-            "Delete cell": "",
-            "Delete column": "",
-            "Delete row": "",
-            "Do Not Change": "",
-            "Frame and borders": "",
-            "Frames": "",
-            "Header (th)": "",
-            "Insert cell after": "",
-            "Insert cell before": "",
-            "Insert column after": "",
-            "Insert column before": "",
-            "Insert row after": "",
-            "Insert row before": "",
-            "Merge cells": "",
-            "Merge current cell with:": "",
-            "No rules": "",
-            "No sides": "",
-            "Normal (td)": "",
-            "Please click into some cell": "",
-            "Row Properties": "",
-            "Row properties": "",
-            "Rules will appear between all rows and columns": "",
-            "Rules will appear between columns only": "",
-            "Rules will appear between rows only": "",
-            "Spacing and padding": "",
-            "Split column": "",
-            "Split row": "",
-            "Summary": "",
-            "Table properties": "",
-            "Table Properties": "",
-            "The bottom side only": "",
-            "The left-hand side only": "",
-            "The right and left sides only": "",
-            "The right-hand side only": "",
-            "The top and bottom sides only": "",
-            "The top side only": "",
-            "Xinha cowardly refuses to delete the last cell in row.": "",
-            "Xinha cowardly refuses to delete the last column in table.": "",
-            "Xinha cowardly refuses to delete the last row in table.": "",
-            "Cancel": "<<Abbreviation>>",
-            "Caption": "<<InsertTable>>",
-            "Columns": "<<Forms>>",
-            "Description": "<<FullPage>>",
-            "Merge Cells": "<<ContextMenu>>",
-            "OK": "<<Abbreviation>>",
-            "Padding": "<<InlineStyler>>",
-            "pixels": "<<HorizontalRule>>",
-            "Rows": "<<Forms>>",
-            "Spacing": "<<InsertImage>>"
-        },
-        "UnsavedChanges": {
-            "You have unsaved changes in the editor": ""
-        },
-        "WebKit": {
-            "The Paste button does not work in this browser for security reasons. Press CTRL-V on your keyboard to paste directly.": "<<Gecko>>"
-        },
-        "Xinha": {
-            "&#8212; font &#8212;": "",
-            "&#8212; format &#8212;": "",
-            "&#8212; size &#8212;": "",
-            "1 (8 pt)": "",
-            "2 (10 pt)": "",
-            "3 (12 pt)": "",
-            "4 (14 pt)": "",
-            "5 (18 pt)": "",
-            "6 (24 pt)": "",
-            "7 (36 pt)": "",
-            "About this editor": "",
-            "Address": "",
-            "Arial": "",
-            "Background Color": "",
-            "Bold": "",
-            "Bulleted List": "",
-            "Clean content pasted from Word": "",
-            "Clear Inline Font Specifications": "",
-            "Clear MSOffice tags": "",
-            "Close": "",
-            "Constructing object": "",
-            "Copy selection": "",
-            "Courier New": "",
-            "Create Statusbar": "",
-            "Create Toolbar": "",
-            "CTRL-0 (zero)": "",
-            "CTRL-1 .. CTRL-6": "",
-            "CTRL-A": "",
-            "CTRL-B": "",
-            "CTRL-C": "",
-            "CTRL-E": "",
-            "CTRL-I": "",
-            "CTRL-J": "",
-            "CTRL-L": "",
-            "CTRL-N": "",
-            "CTRL-R": "",
-            "CTRL-S": "",
-            "CTRL-U": "",
-            "CTRL-V": "",
-            "CTRL-X": "",
-            "CTRL-Y": "",
-            "CTRL-Z": "",
-            "Current style": "",
-            "Cut selection": "",
-            "Decrease Indent": "",
-            "Direction left to right": "",
-            "Direction right to left": "",
-            "Editor Help": "",
-            "ENTER": "",
-            "Error Loading Xinha.  Developers, check the Error Console for information.": "",
-            "Finishing": "",
-            "Font Color": "",
-            "Formatted": "",
-            "Generate Xinha framework": "",
-            "Georgia": "",
-            "Heading 1": "",
-            "Heading 2": "",
-            "Heading 3": "",
-            "Heading 4": "",
-            "Heading 5": "",
-            "Heading 6": "",
-            "Headings": "",
-            "Help using editor": "",
-            "Horizontal Rule": "",
-            "Impact": "",
-            "Increase Indent": "",
-            "Init editor size": "",
-            "insert linebreak": "",
-            "Insert Table": "",
-            "Insert Web Link": "",
-            "Insert/Modify Image": "",
-            "Insert/Overwrite": "",
-            "Italic": "",
-            "Justify Center": "",
-            "Justify Full": "",
-            "Justify Left": "",
-            "Justify Right": "",
-            "Keyboard shortcuts": "",
-            "Loading Core": "",
-            "Loading in progress. Please wait!": "",
-            "Loading plugin $plugin": "",
-            "Loading plugins": "",
-            "MS Word Cleaner": "",
-            "new paragraph": "",
-            "Normal": "",
-            "Ordered List": "",
-            "Paste from clipboard": "",
-            "Path": "",
-            "Print document": "",
-            "Redoes your last action": "",
-            "Register plugin $plugin": "",
-            "Remove formatting": "",
-            "Save as": "",
-            "Select all": "",
-            "Select Color": "",
-            "Set format to paragraph": "",
-            "SHIFT-ENTER": "",
-            "Split Block": "",
-            "Strikethrough": "",
-            "Subscript": "",
-            "Superscript": "",
-            "Tahoma": "",
-            "The editor provides the following key combinations:": "",
-            "Times New Roman": "",
-            "Toggle Borders": "",
-            "Toggle HTML Source": "",
-            "Touch here first to activate editor.": "",
-            "Underline": "",
-            "Undoes your last action": "",
-            "Verdana": "",
-            "Waiting for Iframe to load...": "",
-            "WingDings": "",
-            "Would you like to clear font colours?": "",
-            "Would you like to clear font sizes?": "",
-            "Would you like to clear font typefaces?": "",
-            "Xinha": "",
-            "You are in TEXT MODE.  Use the [<>] button to switch back to WYSIWYG.": ""
-        },
-        "BackgroundImage": {
-            "__ TRANSLATOR NOTE __": "*** BACKGROUNDIMAGE IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***",
-            "Remove Current Background": "",
-            "Set Background": "",
-            "Set page background image": "",
-            "Set Page Background Image": "",
-            "Cancel": "<<Abbreviation>>"
-        },
-        "ClientsideSpellcheck": {
-            "__ TRANSLATOR NOTE __": "*** CLIENTSIDESPELLCHECK IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***",
-            "Spell Check using ieSpell": ""
-        },
-        "ExtendedFileManager": {
-            "__ TRANSLATOR NOTE __": "*** EXTENDEDFILEMANAGER IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***",
-            "10%": "",
-            "100%": "",
-            "200%": "",
-            "25%": "",
-            "50%": "",
-            "75%": "",
-            ">List View": "",
-            ">Thumbnail View": "",
-            "A:": "",
-            "Align": "",
-            "Alt": "",
-            "Border Color": "",
-            "Constrain Proportions": "",
-            "Crop": "",
-            "D:": "",
-            "Directory": "",
-            "Directory Up": "",
-            "Edit": "",
-            "File List": "",
-            "File Manager": "",
-            "Filename:": "",
-            "Filesize:": "",
-            "Flip Horizontal": "",
-            "Flip Image": "",
-            "Flip Vertical": "",
-            "Folder": "",
-            "GIF": "",
-            "GIF format is not supported, image editing not supported.": "",
-            "H:": "",
-            "Image Editor": "",
-            "Image Selection": "",
-            "Invalid base directory:": "",
-            "JPEG High": "",
-            "JPEG Low": "",
-            "JPEG Medium": "",
-            "Loading": "",
-            "Lock": "",
-            "Marker": "",
-            "Maximum folder size limit reached. Upload disabled.": "",
-            "Measure": "",
-            "New Folder": "",
-            "No Files Found": "",
-            "No Image Available": "",
-            "Please enter value": "",
-            "PNG": "",
-            "Preset": "",
-            "Quality:": "",
-            "Refresh": "",
-            "Rename": "",
-            "Resize": "",
-            "Rotate": "",
-            "Rotate 180 &deg;": "",
-            "Rotate 90 &deg; CCW": "",
-            "Rotate 90 &deg; CW": "",
-            "Rotate Image": "",
-            "Start X:": "",
-            "Start Y:": "",
-            "Target Window": "",
-            "Toggle marker color": "",
-            "Trash": "",
-            "Upload": "",
-            "W:": "",
-            "X:": "",
-            "Xinha Image Editor": "",
-            "Y:": "",
-            "Zoom": "",
-            "Absbottom": "<<InsertImage>>",
-            "Absmiddle": "<<InsertImage>>",
-            "Baseline": "<<InlineStyler>>",
-            "Border": "<<InlineStyler>>",
-            "Bottom": "<<InlineStyler>>",
-            "Cancel": "<<Abbreviation>>",
-            "Clear": "<<FindReplace>>",
-            "Color": "<<HorizontalRule>>",
-            "Copy": "<<ContextMenu>>",
-            "Cut": "<<ContextMenu>>",
-            "Height": "<<HorizontalRule>>",
-            "Height:": "<<HorizontalRule>>",
-            "Insert File Link": "<<MootoolsFileManager>>",
-            "Left": "<<HorizontalRule>>",
-            "Margin": "<<InlineStyler>>",
-            "Middle": "<<InlineStyler>>",
-            "New window (_blank)": "<<CreateLink>>",
-            "None (use implicit)": "<<CreateLink>>",
-            "Not set": "<<InsertImage>>",
-            "OK": "<<Abbreviation>>",
-            "Padding": "<<InlineStyler>>",
-            "Positioning of this image": "<<InsertImage>>",
-            "Preview": "<<Equation>>",
-            "Right": "<<HorizontalRule>>",
-            "Same frame (_self)": "<<CreateLink>>",
-            "Save": "<<SaveSubmit>>",
-            "Texttop": "<<InsertImage>>",
-            "Title (tooltip)": "<<CreateLink>>",
-            "Top": "<<InlineStyler>>",
-            "Top frame (_top)": "<<CreateLink>>",
-            "Width": "<<HorizontalRule>>",
-            "Width:": "<<HorizontalRule>>",
-            "You must select some text before making a new link.": "<<Linker>>"
-        },
-        "Filter": {
-            "__ TRANSLATOR NOTE __": "*** FILTER IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***",
-            "Filter": "<<InsertSnippet2>>"
-        },
-        "HtmlTidy": {
-            "__ TRANSLATOR NOTE __": "*** HTMLTIDY IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***",
-            "Auto-Tidy": "",
-            "Don't Tidy": "",
-            "HTML Tidy": "",
-            "Tidy failed.  Check your HTML for syntax errors.": ""
-        },
-        "ImageManager": {
-            "__ TRANSLATOR NOTE __": "*** IMAGEMANAGER IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***",
-            "Angle:": "",
-            "Flickr Picture List": "",
-            "Flickr Pictures": "",
-            "Flickr Selection": "",
-            "Flickr Username/Email": "",
-            "Folder Name:": "",
-            "Image Format": "",
-            "Image List": "",
-            "Keyword": "",
-            "No Images Found": "",
-            "No Photos Found": "",
-            "No Videos Found": "",
-            "This Server": "",
-            "YouTube Selection": "",
-            "YouTube Username": "",
-            "YouTube Video List": "",
-            "YouTube Videos": "",
-            "A:": "<<ExtendedFileManager>>",
-            "Absbottom": "<<InsertImage>>",
-            "Absmiddle": "<<InsertImage>>",
-            "Baseline": "<<InlineStyler>>",
-            "Bottom": "<<InlineStyler>>",
-            "Cancel": "<<Abbreviation>>",
-            "Clear": "<<FindReplace>>",
-            "Constrain Proportions": "<<ExtendedFileManager>>",
-            "Crop": "<<ExtendedFileManager>>",
-            "D:": "<<ExtendedFileManager>>",
-            "Directory": "<<ExtendedFileManager>>",
-            "Directory Up": "<<ExtendedFileManager>>",
-            "Edit": "<<ExtendedFileManager>>",
-            "Filename:": "<<ExtendedFileManager>>",
-            "Flip Horizontal": "<<ExtendedFileManager>>",
-            "Flip Image": "<<ExtendedFileManager>>",
-            "Flip Vertical": "<<ExtendedFileManager>>",
-            "GIF": "<<ExtendedFileManager>>",
-            "GIF format is not supported, image editing not supported.": "<<ExtendedFileManager>>",
-            "H:": "<<ExtendedFileManager>>",
-            "Height:": "<<HorizontalRule>>",
-            "Image Editor": "<<ExtendedFileManager>>",
-            "Image Selection": "<<ExtendedFileManager>>",
-            "Insert Image": "<<InsertImage>>",
-            "Invalid base directory:": "<<ExtendedFileManager>>",
-            "JPEG High": "<<ExtendedFileManager>>",
-            "JPEG Low": "<<ExtendedFileManager>>",
-            "JPEG Medium": "<<ExtendedFileManager>>",
-            "Left": "<<HorizontalRule>>",
-            "Lock": "<<ExtendedFileManager>>",
-            "Marker": "<<ExtendedFileManager>>",
-            "Measure": "<<ExtendedFileManager>>",
-            "Middle": "<<InlineStyler>>",
-            "New Folder": "<<ExtendedFileManager>>",
-            "No Image Available": "<<ExtendedFileManager>>",
-            "Not set": "<<InsertImage>>",
-            "OK": "<<Abbreviation>>",
-            "PNG": "<<ExtendedFileManager>>",
-            "Positioning of this image": "<<InsertImage>>",
-            "Quality:": "<<ExtendedFileManager>>",
-            "Refresh": "<<ExtendedFileManager>>",
-            "Resize": "<<ExtendedFileManager>>",
-            "Right": "<<HorizontalRule>>",
-            "Rotate": "<<ExtendedFileManager>>",
-            "Rotate 180 &deg;": "<<ExtendedFileManager>>",
-            "Rotate 90 &deg; CCW": "<<ExtendedFileManager>>",
-            "Rotate 90 &deg; CW": "<<ExtendedFileManager>>",
-            "Rotate Image": "<<ExtendedFileManager>>",
-            "Save": "<<SaveSubmit>>",
-            "Start X:": "<<ExtendedFileManager>>",
-            "Start Y:": "<<ExtendedFileManager>>",
-            "Texttop": "<<InsertImage>>",
-            "Top": "<<InlineStyler>>",
-            "Trash": "<<ExtendedFileManager>>",
-            "W:": "<<ExtendedFileManager>>",
-            "Width:": "<<HorizontalRule>>",
-            "X:": "<<ExtendedFileManager>>",
-            "Y:": "<<ExtendedFileManager>>"
-        },
-        "InsertMarquee": {
-            "__ TRANSLATOR NOTE __": "*** INSERTMARQUEE IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***",
-            "Alternate": "",
-            "Background-Color:": "",
-            "Behavior:": "",
-            "Continuous": "",
-            "Direction:": "",
-            "Insert scrolling marquee": "",
-            "Marquee Editor": "",
-            "Scroll Amount:": "",
-            "Scroll Delay:": "",
-            "Slide": "",
-            "Speed Control": "",
-            "Cancel": "<<Abbreviation>>",
-            "Height:": "<<HorizontalRule>>",
-            "Left": "<<HorizontalRule>>",
-            "Name": "<<Forms>>",
-            "Name/ID:": "<<Forms>>",
-            "OK": "<<Abbreviation>>",
-            "Right": "<<HorizontalRule>>",
-            "Text:": "<<Forms>>",
-            "Width:": "<<HorizontalRule>>"
-        },
-        "InsertPicture": {
-            "__ TRANSLATOR NOTE __": "*** INSERTPICTURE IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***",
-            "Leave empty for not defined": "",
-            " Open file in new window": "",
-            "Open file in new window": "",
-            "Upload file": "",
-            "Absbottom": "<<InsertImage>>",
-            "Absmiddle": "<<InsertImage>>",
-            "Alignment:": "<<HorizontalRule>>",
-            "Alternate text:": "<<InsertImage>>",
-            "Baseline": "<<InlineStyler>>",
-            "Border thickness:": "<<InsertImage>>",
-            "Bottom": "<<InlineStyler>>",
-            "Cancel": "<<Abbreviation>>",
-            "Enter the image URL here": "<<InsertImage>>",
-            "For browsers that don't support images": "<<InsertImage>>",
-            "Height:": "<<HorizontalRule>>",
-            "Horizontal padding": "<<InsertImage>>",
-            "Horizontal:": "<<InsertImage>>",
-            "Image Preview:": "<<InsertImage>>",
-            "Image URL:": "<<Forms>>",
-            "Insert Image": "<<InsertImage>>",
-            "Layout": "<<HorizontalRule>>",
-            "Leave empty for no border": "<<InsertImage>>",
-            "Left": "<<HorizontalRule>>",
-            "Middle": "<<InlineStyler>>",
-            "Not set": "<<InsertImage>>",
-            "OK": "<<Abbreviation>>",
-            "Positioning of this image": "<<InsertImage>>",
-            "Preview": "<<Equation>>",
-            "Preview the image in a new window": "<<InsertImage>>",
-            "Right": "<<HorizontalRule>>",
-            "Size": "<<Forms>>",
-            "Spacing": "<<InsertImage>>",
-            "Texttop": "<<InsertImage>>",
-            "Top": "<<InlineStyler>>",
-            "Vertical padding": "<<InsertImage>>",
-            "Vertical:": "<<InsertImage>>",
-            "Width:": "<<HorizontalRule>>"
-        },
-        "NoteServer": {
-            "__ TRANSLATOR NOTE __": "*** NOTESERVER IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***",
-            "120%": "",
-            "150%": "",
-            "80%": "",
-            "Add GUIDO Code in a textbox on the page": "",
-            "Add MIDI link to allow students to hear the music": "",
-            "Format": "",
-            "GUIDO Code": "",
-            "Guido code": "",
-            "Image in applet": "",
-            "Insert GUIDO Music Notation": "",
-            "MIDI File": "",
-            "Source Code": "",
-            "With Mozilla, the applet will not be visible in editor, but only in Web page after submitting.": "",
-            "Zoom :": "",
-            "100%": "<<ExtendedFileManager>>",
-            "Cancel": "<<Abbreviation>>",
-            "Image Preview": "<<InsertImage>>",
-            "OK": "<<Abbreviation>>",
-            "Options": "<<FindReplace>>",
-            "Preview": "<<Equation>>",
-            "Preview the image in a new window": "<<InsertImage>>",
-            "Zoom": "<<ExtendedFileManager>>"
-        },
-        "PSLocal": {
-            "__ TRANSLATOR NOTE __": "*** PSLOCAL IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***",
-            "Confirm": "",
-            "Enable": "",
-            "Enable Gears in order to use local document storage and configuration.": "",
-            "Enabling Local Storage": "",
-            "Install": "",
-            "Learn About Local Storage": "",
-            "This will reload the page, causing you to lose any unsaved work.  Press \"OK\" to reload.": "",
-            "Xinha uses Google Gears to enable local document storage.  With Gears installed, you can save drafts of your documents on your hard drive, configure Xinha to look the way you want, and carry this information wherever you use Xinha on the web.": "",
-            "Cancel": "<<Abbreviation>>"
-        },
-        "PSServer": {
-            "__ TRANSLATOR NOTE __": "*** PSSERVER IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***",
-            "File: ": "",
-            "Import": ""
-        },
-        "PersistentStorage": {
-            "__ TRANSLATOR NOTE __": "*** PERSISTENTSTORAGE IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***",
-            "Details": "",
-            "File Browser": "",
-            "Hello    There C ": "",
-            "Hello  There A ": "",
-            "Hello \" There B \"": "",
-            "Hello ' There D '": "",
-            "List of Places": "",
-            "New Document": "",
-            "Open": "",
-            "Open Document": "",
-            "Places": "",
-            "Please enter the name of the directory you'd like to create.": "",
-            "Save Document": "",
-            "This will erase any unsaved content.  If you're certain, please click OK to continue.": "",
-            "Web URL": "",
-            "Cancel": "<<Abbreviation>>",
-            "Confirm": "<<PSLocal>>",
-            "Copy": "<<ContextMenu>>",
-            "Delete": "<<Abbreviation>>",
-            "Directory Up": "<<ExtendedFileManager>>",
-            "File List": "<<ExtendedFileManager>>",
-            "File Manager": "<<ExtendedFileManager>>",
-            "Filename": "<<ExtendedFileManager>>",
-            "Insert": "<<InsertNote>>",
-            "Insert Image": "<<InsertImage>>",
-            "New Folder": "<<ExtendedFileManager>>",
-            "Save": "<<SaveSubmit>>",
-            "You must select some text before making a new link.": "<<Linker>>"
-        },
-        "SpellChecker": {
-            "__ TRANSLATOR NOTE __": "*** SPELLCHECKER IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***",
-            "Dictionary": "",
-            "Finished list of mispelled words": "",
-            "HTMLArea Spell Checker": "",
-            "I will open it in a new page.": "",
-            "Ignore": "",
-            "Ignore all": "",
-            "Info": "",
-            "Learn": "",
-            "No mispelled words found with the selected dictionary.": "",
-            "Original word": "",
-            "Please confirm that you want to open this link": "",
-            "Please wait.  Calling spell checker.": "",
-            "Please wait: changing dictionary to": "",
-            "pliz weit ;-)": "",
-            "Re-check": "",
-            "Replace": "",
-            "Replace all": "",
-            "Revert": "",
-            "Spell Checker": "",
-            "Spell-check": "",
-            "Suggestions": "",
-            "This will drop changes and quit spell checker.  Please confirm.": "",
-            "Cancel": "<<Abbreviation>>",
-            "OK": "<<Abbreviation>>",
-            "Replace with": "<<FindReplace>>"
-        },
-        "Template": {
-            "__ TRANSLATOR NOTE __": "*** TEMPLATE IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***",
-            "Insert template": "",
-            "Cancel": "<<Abbreviation>>"
-        },
-        "UnFormat": {
-            "__ TRANSLATOR NOTE __": "*** UNFORMAT IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***",
-            "All": "",
-            "All HTML:": "",
-            "Cleaning Area": "",
-            "Cleaning options": "",
-            "Formatting:": "",
-            "Page Cleaner": "",
-            "Select which types of formatting you would like to remove.": "",
-            "Selection": "",
-            "Cancel": "<<Abbreviation>>",
-            "OK": "<<Abbreviation>>"
-        }
-    }
-}
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/lang/merged/he.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/lang/merged/he.js
deleted file mode 100644
index e9f00e0..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/lang/merged/he.js
+++ /dev/null
@@ -1,1577 +0,0 @@
-// Xinha Language Combined Translation File
-//
-// LANG: "he", ENCODING: UTF-8
-//
-// INSTRUCTIONS TO TRANSLATORS
-// ===========================================================================
-//
-// Your translation must be in UTF-8 Character Encoding.
-//
-// This is a JSON encoded file (plus comments), strings should be double-quote
-// only, do not use single quotes to surround strings - "hello", not 'hello'
-// do not have a trailing comma after the last entry in a section.
-//
-// Only full line comments are allowed (that a comments occupy entire lines).
-//
-// Search for the __NEW_TRANSLATIONS__ section below, this is where you will
-// want to focus, this section includes things that do not presently have a 
-// translation or for which the translation needs to be checked for accuracy.
-//
-// In the New Translations section a translation string is one of the following
-//
-//  "English String Here" : ""
-//     This means it is not translated yet, add your translation...
-//     "English String Here" : "Klingon String Here"
-//
-//  "English String Here" : "Translated String Here"
-//     This means that an existing translation for this string, in some other
-//     section has been found, and used.  Check that it is approprite for this
-//     section and if it is, that's fine leave it as is, otherwise change as
-//     appropriate.
-//
-//  "English String Here" : "<<AnotherSection>>"
-//     This means use the same translation for this string as <<AnotherSection>>
-//     this saves you re-tranlating strings.  If the Context of this section
-//     and the context of AnotherSection seem the same, that's fine leave it
-//     using that translation, but if this section needs a different translation, 
-//     you can provide it by replacing the link (<<AnotherSection>>) with that
-//     new translation.  For example - a "Table" in say "DataPlugin" is 
-//     perhaps translated differently to "Table" in "FurniturePlugin".
-//
-// TESTING YOUR TRANSLATION
-// ===========================================================================
-// Simply place your translation file on your webserver somewhere for example
-//
-//   /xinha/lang/merged/he.js
-//
-// and then tell Xinha where to get it (before loading XinhaCore.js) by 
-//
-//  _editor_lang              = 'he';
-//  _editor_lang_merged_file  = '/xinha/lang/merged/he.js';
-//
-// Xinha will load your new language definition.
-//
-// SUBMITTING YOUR TRANSLATION
-// ===========================================================================
-// Simply create a Ticket on the Xinha website and attach your translation 
-// file.
-//
-// The Xinha developers will take your file and use the 
-//     contrib/lc_split_merged_file.php
-// script to load it into the Xinha distribution.
-
-{
-    "Abbreviation": {
-        "Cancel": "ביטול",
-        "OK": "אישור"
-    },
-    "AboutBox": {
-        "About this editor": "אודות עורך זה"
-    },
-    "BackgroundImage": {
-        "Cancel": "ביטול"
-    },
-    "ColorPicker": {
-        "Color: ": "צבע",
-        "OK": "אישור"
-    },
-    "ContextMenu": {
-        "C_ell Properties...": "מאפייני ת_א...",
-        "Chec_k Link...": "בדו_ק קישור...",
-        "Copy": "העתק",
-        "Create a link": "יצירת קישור",
-        "Current URL is": "URL נוכחי הוא",
-        "Cut": "גזור",
-        "De_lete Column": "מח_ק טור",
-        "Delete the current column": "מחיקת את הטור הנוכחי",
-        "Delete the current row": "מחיקת את השורה הנוכחית",
-        "How did you get here? (Please report!)": "איך הגעת הנה? (אנא דווח!)",
-        "I_nsert Row Before": "ה_כנס שורה לפני",
-        "In_sert Row After": "הכנ_ס שורה אחרי",
-        "Insert C_olumn After": "הכנס ט_ור אחרי",
-        "Insert _Column Before": "הכנס _טור לפני",
-        "Insert a new column after the current one": "הוספת טור חדש אחרי הנוכחי",
-        "Insert a new column before the current one": "הוספת טור חדש לפני הנוכחי",
-        "Insert a new row after the current one": "הוספת שורה חדשה אחרי הנוכחית",
-        "Insert a new row before the current one": "הוספת שורה חדשה לפני הנוכחית",
-        "Justify Center": "ישור למרכז",
-        "Justify Full": "ישור לשורה מלאה",
-        "Justify Left": "ישור לשמאל",
-        "Justify Right": "ישור לימין",
-        "Link points to:": "הקישור מצביע אל:",
-        "Make lin_k...": "צור קי_שור...",
-        "Opens this link in a new window": "פתיחת קישור זה בחלון חדש",
-        "Paste": "הדבק",
-        "Please confirm that you want to remove this element:": "אנא אשר שברצונך להסיר את האלמנט הזה:",
-        "Please confirm that you want to unlink this element.": "אנא אשר שאתה רוצה לנתק את אלמנט זה.",
-        "Remove the $elem Element...": "הסר את אלמנט ה- $elem...",
-        "Remove this node from the document": "הסרה של node זה מהמסמך",
-        "Ro_w Properties...": "מאפייני _טור...",
-        "Show the Table Cell Properties dialog": "מציג את חלון הדו-שיח של מאפייני תא בטבלה",
-        "Show the Table Properties dialog": "מציג את חלון הדו-שיח של מאפייני טבלה",
-        "Show the Table Row Properties dialog": "מציג את חלון הדו-שיח של מאפייני שורה בטבלה",
-        "Show the image properties dialog": "מציג את חלון הדו-שיח של מאפייני תמונה",
-        "Unlink the current element": "ניתוק את האלמנט הנוכחי",
-        "_Delete Row": "_מחק שורה",
-        "_Image Properties...": "_מאפייני תמונה...",
-        "_Modify Link...": "_שנה קישור...",
-        "_Remove Link...": "_הסר קישור...",
-        "_Table Properties...": "מאפייני ט_בלה..."
-    },
-    "CreateLink": {
-        "Cancel": "ביטול",
-        "Insert/Modify Link": "הוסף/שנה קישור",
-        "New window (_blank)": "חלון חדש (_blank)",
-        "None (use implicit)": "ללא (השתמש ב-frame הקיים)",
-        "OK": "אישור",
-        "Other": "אחר",
-        "Same frame (_self)": "אותו frame (_self)",
-        "Target:": "יעד:",
-        "Title (tooltip):": "כותרת (tooltip):",
-        "Top frame (_top)": "Frame עליון (_top)",
-        "URL:": "URL:"
-    },
-    "EditTag": {
-        "Cancel": "ביטול",
-        "OK": "אישור"
-    },
-    "Equation": {
-        "Cancel": "ביטול",
-        "OK": "אישור"
-    },
-    "ExtendedFileManager": {
-        "Align": "ישור",
-        "Baseline": "קו בסיס",
-        "Border": "גבול",
-        "Bottom": "תחתון",
-        "Cancel": "ביטול",
-        "Color": "צבע",
-        "Copy": "העתק",
-        "Cut": "גזור",
-        "Height": "גובה",
-        "Height:": "גובה",
-        "Left": "שמאל",
-        "Margin": "שוליים",
-        "Middle": "אמצע",
-        "New window (_blank)": "חלון חדש (_blank)",
-        "None (use implicit)": "ללא (השתמש ב-frame הקיים)",
-        "OK": "אישור",
-        "Padding": "ריווח בשוליים",
-        "Right": "ימין",
-        "Same frame (_self)": "אותו frame (_self)",
-        "Title (tooltip)": "כותרת (tooltip):",
-        "Top": "עליון",
-        "Top frame (_top)": "Frame עליון (_top)",
-        "Width": "רוחב",
-        "Width:": "רוחב"
-    },
-    "FindReplace": {
-        "Replace with:": "החלף ב-"
-    },
-    "Forms": {
-        "Cancel": "ביטול",
-        "Image URL:": "URL התמונה",
-        "OK": "אישור"
-    },
-    "FullPage": {
-        "Alternate style-sheet:": "גיליון סגנון אחר:",
-        "Background color:": "צבע רקע:",
-        "Cancel": "ביטול",
-        "DOCTYPE:": "DOCTYPE:",
-        "Description:": "תיאור",
-        "Document properties": "מאפייני מסמך",
-        "Document title:": "כותרת מסמך:",
-        "OK": "אישור",
-        "Primary style-sheet:": "גיליון סגנון ראשי:",
-        "Text color:": "צבע טקסט:"
-    },
-    "HorizontalRule": {
-        "Cancel": "ביטול",
-        "Center": "מרכז",
-        "Color:": "צבע",
-        "Height:": "גובה",
-        "Horizontal Rule": "קו אנכי",
-        "Layout": "פריסה",
-        "Left": "שמאל",
-        "OK": "אישור",
-        "Right": "ימין",
-        "Width:": "רוחב",
-        "percent": "אחוז",
-        "pixels": "פיקסלים"
-    },
-    "ImageManager": {
-        "Baseline": "קו בסיס",
-        "Bottom": "תחתון",
-        "Cancel": "ביטול",
-        "Height:": "גובה",
-        "Left": "שמאל",
-        "Middle": "אמצע",
-        "OK": "אישור",
-        "Right": "ימין",
-        "Top": "עליון",
-        "Width:": "רוחב"
-    },
-    "InlineStyler": {
-        "Background": "רקע",
-        "Baseline": "קו בסיס",
-        "Border": "גבול",
-        "Bottom": "תחתון",
-        "Center": "מרכז",
-        "Char": "תו",
-        "Collapsed borders": "גבולות קורסים",
-        "FG Color": "צבע קידמה",
-        "Float": "מרחף",
-        "Height": "גובה",
-        "Image URL": "URL התמונה",
-        "Justify": "ישור",
-        "Layout": "פריסה",
-        "Left": "שמאל",
-        "Margin": "שוליים",
-        "Middle": "אמצע",
-        "None": "אין",
-        "Padding": "ריווח בשוליים",
-        "Right": "ימין",
-        "Text align": "ישור טקסט",
-        "Top": "עליון",
-        "Vertical align": "יישור אנכי",
-        "Width": "רוחב",
-        "percent": "אחוז",
-        "pixels": "פיקסלים"
-    },
-    "InsertAnchor": {
-        "Cancel": "ביטול",
-        "OK": "אישור"
-    },
-    "InsertImage": {
-        "Baseline": "קו בסיס",
-        "Bottom": "תחתון",
-        "Cancel": "ביטול",
-        "Image URL:": "URL התמונה",
-        "Layout": "פריסה",
-        "Left": "שמאל",
-        "Middle": "אמצע",
-        "OK": "אישור",
-        "Right": "ימין",
-        "Spacing": "ריווח",
-        "Top": "עליון"
-    },
-    "InsertMarquee": {
-        "Cancel": "ביטול",
-        "Height:": "גובה",
-        "Left": "שמאל",
-        "OK": "אישור",
-        "Right": "ימין",
-        "Width:": "רוחב"
-    },
-    "InsertNote": {
-        "Cancel": "ביטול"
-    },
-    "InsertPicture": {
-        "Baseline": "קו בסיס",
-        "Bottom": "תחתון",
-        "Cancel": "ביטול",
-        "Height:": "גובה",
-        "Image URL:": "URL התמונה",
-        "Layout": "פריסה",
-        "Left": "שמאל",
-        "Middle": "אמצע",
-        "OK": "אישור",
-        "Right": "ימין",
-        "Spacing": "ריווח",
-        "Top": "עליון",
-        "Width:": "רוחב"
-    },
-    "InsertSnippet": {
-        "Cancel": "ביטול"
-    },
-    "InsertSnippet2": {
-        "Cancel": "ביטול"
-    },
-    "InsertTable": {
-        "Baseline": "קו בסיס",
-        "Border": "גבול",
-        "Bottom": "תחתון",
-        "Cancel": "ביטול",
-        "Caption": "כותרת",
-        "Insert Table": "הכנס טבלה",
-        "Layout": "פריסה",
-        "Left": "שמאל",
-        "Middle": "אמצע",
-        "OK": "אישור",
-        "Percent": "אחוז",
-        "Pixels": "פיקסלים",
-        "Right": "ימין",
-        "Spacing": "ריווח",
-        "Top": "עליון",
-        "Width:": "רוחב"
-    },
-    "Linker": {
-        "Cancel": "ביטול",
-        "Insert/Modify Link": "הוסף/שנה קישור",
-        "OK": "אישור",
-        "Target:": "יעד:",
-        "URL:": "URL:"
-    },
-    "NoteServer": {
-        "Cancel": "ביטול",
-        "OK": "אישור"
-    },
-    "PSLocal": {
-        "Cancel": "ביטול"
-    },
-    "PasteText": {
-        "Cancel": "ביטול",
-        "OK": "אישור"
-    },
-    "PersistentStorage": {
-        "Cancel": "ביטול",
-        "Copy": "העתק"
-    },
-    "QuickTag": {
-        "Cancel": "ביטול"
-    },
-    "SetId": {
-        "Cancel": "ביטול",
-        "OK": "אישור"
-    },
-    "SmartReplace": {
-        "OK": "אישור"
-    },
-    "SpellChecker": {
-        "Cancel": "ביטול",
-        "Dictionary": "מילון",
-        "Finished list of mispelled words": "הסתיימה רשימת המילים המאויתות באופן שגוי",
-        "I will open it in a new page.": "אני אפתח את זה בחלון חדש.",
-        "Ignore": "התעלם",
-        "Ignore all": "התעלם מהכל",
-        "No mispelled words found with the selected dictionary.": "לא נמצאו מילים מאויתות באופן שגוי עם המילון הנבחר.",
-        "OK": "אישור",
-        "Original word": "המילה המקורית",
-        "Please confirm that you want to open this link": "אנא אשר שברצונך לפתוח קישור זה",
-        "Please wait.  Calling spell checker.": "אנא המתן.  קורא לבודק איות.",
-        "Please wait: changing dictionary to": "אנא המתן: מחליף מילון ל-",
-        "Re-check": "בדוק מחדש",
-        "Replace": "החלף",
-        "Replace all": "החלף הכל",
-        "Replace with": "החלף ב-",
-        "Revert": "החזר שינויים",
-        "Spell-check": "בדיקת איות",
-        "Suggestions": "הצעות",
-        "This will drop changes and quit spell checker.  Please confirm.": "זה יבטל את השינויים ויצא מבודק האיות.  אנא אשר."
-    },
-    "SuperClean": {
-        "Cancel": "ביטול",
-        "OK": "אישור"
-    },
-    "TableOperations": {
-        "All four sides": "כל ארבעת הצדדים",
-        "Borders": "גבולות",
-        "Cancel": "ביטול",
-        "Caption": "כותרת",
-        "Cell Properties": "מאפייני תא",
-        "Cell properties": "מאפייני תא",
-        "Delete cell": "מחק תא",
-        "Delete column": "מחק טור",
-        "Delete row": "מחק שורה",
-        "Description": "תיאור",
-        "Frames": "מסגרות",
-        "Insert cell after": "הכנס תא אחרי",
-        "Insert cell before": "הכנס תא לפני",
-        "Insert column after": "הכנס טור אחרי",
-        "Insert column before": "הכנס טור לפני",
-        "Insert row after": "הכנס שורה אחרי",
-        "Insert row before": "הכנס שורה לפני",
-        "Merge cells": "מזג תאים",
-        "No rules": "ללא קווים",
-        "No sides": "ללא צדדים",
-        "OK": "אישור",
-        "Padding": "ריווח בשוליים",
-        "Please click into some cell": "אנא לחץ על תא כלשהו",
-        "Row Properties": "מאפייני שורה",
-        "Row properties": "מאפייני שורה",
-        "Rules will appear between all rows and columns": "קווים יופיעו בין כל השורות והטורים",
-        "Rules will appear between columns only": "קווים יופיעו בין טורים בלבד",
-        "Rules will appear between rows only": "קווים יופיעו בין שורות בלבד",
-        "Spacing": "ריווח",
-        "Spacing and padding": "ריווח ושוליים",
-        "Split column": "פצל טור",
-        "Split row": "פצל שורה",
-        "Summary": "סיכום",
-        "Table Properties": "מאפייני טבלה",
-        "Table properties": "מאפייני טבלה",
-        "The bottom side only": "הצד התחתון בלבד",
-        "The left-hand side only": "הצד השמאלי בלבד",
-        "The right and left sides only": "הצדדים הימני והשמאלי בלבד",
-        "The right-hand side only": "הצד הימני בלבד",
-        "The top and bottom sides only": "הצדדים העליון והתחתון בלבד",
-        "The top side only": "הצד העליון בלבד",
-        "Xinha cowardly refuses to delete the last cell in row.": "Xinha מסרב בפחדנות למחוק את התא האחרון בשורה.",
-        "Xinha cowardly refuses to delete the last column in table.": "Xinha מסרב בפחדנות למחוק את הטור האחרון בטבלה.",
-        "Xinha cowardly refuses to delete the last row in table.": "Xinha מסרב בפחדנות למחוק את השורה האחרונה בטבלה.",
-        "pixels": "פיקסלים"
-    },
-    "Template": {
-        "Cancel": "ביטול"
-    },
-    "UnFormat": {
-        "Cancel": "ביטול",
-        "OK": "אישור"
-    },
-    "Xinha": {
-        "About this editor": "אודות עורך זה",
-        "Background Color": "צבע רקע",
-        "Bold": "מודגש",
-        "Bulleted List": "רשימה לא ממוספרת",
-        "Copy selection": "העתק בחירה",
-        "Current style": "סגנון נוכחי",
-        "Cut selection": "גזור בחירה",
-        "Decrease Indent": "הקטן כניסה",
-        "Direction left to right": "כיוון משמאל לימין",
-        "Direction right to left": "כיוון מימין לשמאל",
-        "Font Color": "צבע גופן",
-        "Help using editor": "עזרה לשימוש בעורך",
-        "Horizontal Rule": "קו אנכי",
-        "Increase Indent": "הגדל כניסה",
-        "Insert Table": "הכנס טבלה",
-        "Insert Web Link": "הכנס היפר-קישור",
-        "Insert/Modify Image": "הכנס/שנה תמונה",
-        "Italic": "נטוי",
-        "Justify Center": "ישור למרכז",
-        "Justify Full": "ישור לשורה מלאה",
-        "Justify Left": " ישור לשמאל",
-        "Justify Right": "ישור לימין",
-        "Ordered List": "רשימה ממוספרת",
-        "Paste from clipboard": "הדבק מהלוח",
-        "Path": "נתיב עיצוב",
-        "Redoes your last action": "מבצע מחדש את הפעולה האחרונה שביטלת",
-        "Strikethrough": "קו אמצע",
-        "Subscript": "כתב עילי",
-        "Superscript": "כתב תחתי",
-        "Toggle HTML Source": "שנה מצב קוד HTML",
-        "Underline": "קו תחתי",
-        "Undoes your last action": "מבטל את פעולתך האחרונה",
-        "You are in TEXT MODE.  Use the [<>] button to switch back to WYSIWYG.": "אתה במצב טקסט נקי (קוד). השתמש בכפתור [<>] כדי לחזור למצב WYSIWYG (תצוגת עיצוב)."
-    },
-    "__NEW_TRANSLATIONS__": {
-        "Abbreviation": {
-            "Abbreviation": "",
-            "Delete": "",
-            "Expansion:": ""
-        },
-        "AboutBox": {
-            "Close": "<<Xinha>>"
-        },
-        "CharCounter": {
-            "... in progress": "",
-            "Chars": "",
-            "HTML": "",
-            "Words": ""
-        },
-        "CharacterMap": {
-            "Insert special character": ""
-        },
-        "ColorPicker": {
-            "Click a color...": "",
-            "Sample": "",
-            "Web Safe: ": "",
-            "Close": "<<Xinha>>"
-        },
-        "ContextMenu": {
-            "Delete Cell": "",
-            "Insert a paragraph after the current node": "",
-            "Insert a paragraph before the current node": "",
-            "Insert Cell After": "",
-            "Insert Cell Before": "",
-            "Insert paragraph after": "",
-            "Insert paragraph before": "",
-            "Merge Cells": ""
-        },
-        "CreateLink": {
-            "Are you sure you wish to remove this link?": "",
-            "You need to select some text before creating a link": ""
-        },
-        "DefinitionList": {
-            "definition description": "",
-            "definition list": "",
-            "definition term": ""
-        },
-        "Dialogs": {
-            "Some Text Here": ""
-        },
-        "DynamicCSS": {
-            "Choose stylesheet": "",
-            "Default": "",
-            "Undefined": ""
-        },
-        "EditTag": {
-            "Edit HTML for selected text": "",
-            "Edit Tag By Peg": "",
-            "Tag Editor": ""
-        },
-        "Equation": {
-            "!=": "",
-            "!in": "",
-            "&gt;-": "",
-            "&gt;=": "",
-            "&lt;=": "",
-            "&lt;=&gt;": "",
-            "&lt;x&gt;": "",
-            "&nbsp; `!` &nbsp;": "",
-            "&nbsp; `.` &nbsp;": "",
-            "&nbsp; `0` &nbsp;": "",
-            "&nbsp; `2` &nbsp;": "",
-            "&nbsp; `3` &nbsp;": "",
-            "&nbsp; `4` &nbsp;": "",
-            "&nbsp; `5` &nbsp;": "",
-            "&nbsp; `6` &nbsp;": "",
-            "&nbsp; `7` &nbsp;": "",
-            "&nbsp; `8` &nbsp;": "",
-            "&nbsp; `9` &nbsp;": "",
-            "&nbsp; `e` &nbsp;": "",
-            "&nbsp;&nbsp;`1` &nbsp;": "",
-            "&nbsp;`+{::}`&nbsp;": "",
-            "&nbsp;`-:\\ `": "",
-            "&nbsp;`-{::}`&nbsp;": "",
-            "&nbsp;`C`&nbsp;": "",
-            "&nbsp;`cos`": "",
-            "&nbsp;`ln`&nbsp;": "",
-            "&nbsp;`pi` &nbsp;": "",
-            "&nbsp;`sin`": "",
-            "&nbsp;`tan`": "",
-            "&nbsp;`times`&nbsp;": "",
-            "&quot;text&quot;": "",
-            "'+formula+'": "",
-            "((n),(k))": "",
-            "(x+1)/(x-1)": "",
-            "*": "",
-            "**": "",
-            "+-": "",
-            "-&gt;": "",
-            "-&lt;": "",
-            "-:": "",
-            "-=": "",
-            "//": "",
-            "/_": "",
-            ":.": "",
-            "=&gt;": "",
-            "@": "",
-            "[[a,b],[c,d]]": "",
-            "\\\\": "",
-            "\\nClick in the box to use your keyboard or use the buttons\\n": "",
-            "^^": "",
-            "^^^": "",
-            "__|": "",
-            "_|_": "",
-            "`!=`": "",
-            "`!in`": "",
-            "`&and;`": "",
-            "`&cap;`": "",
-            "`&cup;`": "",
-            "`&gt;-`": "",
-            "`&gt;=`": "",
-            "`&lt;=&gt;`": "",
-            "`&lt;=`": "",
-            "`&lt;x&gt;`": "",
-            "`&or;`": "",
-            "`&quot;text&quot;`": "",
-            "`((n),(k))`": "",
-            "`(x+1)/(x-1)`": "",
-            "`**`": "",
-            "`*`": "",
-            "`+-`": "",
-            "`-&gt;`": "",
-            "`-&lt;`": "",
-            "`-:`": "",
-            "`-=`": "",
-            "`//`": "",
-            "`/_`": "",
-            "`:.`": "",
-            "`=&gt;`": "",
-            "`@`": "",
-            "`[[a,b],[c,d]]`": "",
-            "`\\\\`": "",
-            "`__|`": "",
-            "`_|_`": "",
-            "`AA`": "",
-            "`aleph`": "",
-            "`alpha`": "",
-            "`and`": "",
-            "`bara`": "",
-            "`bba`": "",
-            "`bbba`": "",
-            "`beta`": "",
-            "`CC`": "",
-            "`cca`": "",
-            "`chi`": "",
-            "`darr`": "",
-            "`ddota`": "",
-            "`del`": "",
-            "`Delta`": "",
-            "`delta`": "",
-            "`diamond`": "",
-            "`dota`": "",
-            "`dy/dx`": "",
-            "`EE`": "",
-            "`epsi`": "",
-            "`eta`": "",
-            "`fra`": "",
-            "`Gamma`": "",
-            "`gamma`": "",
-            "`grad`": "",
-            "`harr`": "",
-            "`hArr`": "",
-            "`hata`": "",
-            "`if`": "",
-            "`in`": "",
-            "`int`": "",
-            "`iota`": "",
-            "`kappa`": "",
-            "`Lambda`": "",
-            "`lambda`": "",
-            "`lArr`": "",
-            "`larr`": "",
-            "`lim_(x-&gt;oo)`": "",
-            "`log`": "",
-            "`mu`": "",
-            "`NN`": "",
-            "`nn`": "",
-            "`not`": "",
-            "`nu`": "",
-            "`o+`": "",
-            "`o.`": "",
-            "`O/`": "",
-            "`oint`": "",
-            "`omega`": "",
-            "`Omega`": "",
-            "`oo`": "",
-            "`or`": "",
-            "`ox`": "",
-            "`phi`": "",
-            "`Phi`": "",
-            "`Pi`": "",
-            "`pi`": "",
-            "`prod`": "",
-            "`prop`": "",
-            "`Psi`": "",
-            "`psi`": "",
-            "`QQ`": "",
-            "`quad`": "",
-            "`rArr`": "",
-            "`rho`": "",
-            "`root(n)(x)`": "",
-            "`RR`": "",
-            "`sfa`": "",
-            "`Sigma`": "",
-            "`sigma`": "",
-            "`sqrt(x)`": "",
-            "`square`": "",
-            "`stackrel(-&gt;)(+)`": "",
-            "`sub`": "",
-            "`sube`": "",
-            "`sum`": "",
-            "`sup`": "",
-            "`supe`": "",
-            "`tau`": "",
-            "`Theta`": "",
-            "`theta`": "",
-            "`TT`": "",
-            "`tta`": "",
-            "`uarr`": "",
-            "`ula`": "",
-            "`upsilon`": "",
-            "`uu`": "",
-            "`veca`": "",
-            "`vv`": "",
-            "`x_(mn)`": "",
-            "`Xi`": "",
-            "`xi`": "",
-            "`xx`": "",
-            "`zeta`": "",
-            "`ZZ`": "",
-            "`|-&gt;`": "",
-            "`|--`": "",
-            "`|==`": "",
-            "`|__`": "",
-            "`|~`": "",
-            "`~=`": "",
-            "`~|`": "",
-            "`~~`": "",
-            "AA": "",
-            "aleph": "",
-            "alpha": "",
-            "and": "",
-            "AsciiMath Formula Input": "",
-            "AsciiMathML Example": "",
-            "bara": "",
-            "Based on ASCIIMathML by": "",
-            "bba": "",
-            "bbba": "",
-            "beta": "",
-            "CC": "",
-            "cca": "",
-            "chi": "",
-            "darr": "",
-            "ddota": "",
-            "del": "",
-            "delta": "",
-            "Delta": "",
-            "diamond": "",
-            "dota": "",
-            "dy/dx": "",
-            "EE": "",
-            "epsi": "",
-            "eta": "",
-            "For more information on AsciiMathML visit this page:": "",
-            "Formula Editor": "",
-            "fra": "",
-            "gamma": "",
-            "Gamma": "",
-            "grad": "",
-            "hArr": "",
-            "harr": "",
-            "hata": "",
-            "if": "",
-            "in": "",
-            "Input": "",
-            "int": "",
-            "int_a^bf(x)dx": "",
-            "iota": "",
-            "kappa": "",
-            "Lambda": "",
-            "lambda": "",
-            "larr": "",
-            "lArr": "",
-            "lim_(x-&gt;oo)": "",
-            "mu": "",
-            "NN": "",
-            "nn": "",
-            "nnn": "",
-            "not": "",
-            "nu": "",
-            "o+": "",
-            "o.": "",
-            "O/": "",
-            "oint": "",
-            "Omega": "",
-            "omega": "",
-            "oo": "",
-            "or": "",
-            "ox": "",
-            "phi": "",
-            "Phi": "",
-            "pi": "",
-            "Pi": "",
-            "Preview": "",
-            "prod": "",
-            "prop": "",
-            "psi": "",
-            "Psi": "",
-            "QQ": "",
-            "quad": "",
-            "rArr": "",
-            "rho": "",
-            "root(n)(x)": "",
-            "RR": "",
-            "sfa": "",
-            "sigma": "",
-            "Sigma": "",
-            "sqrt(x)": "",
-            "square": "",
-            "stackrel(-&gt;)(+)": "",
-            "sub": "",
-            "sube": "",
-            "sum": "",
-            "sum_(n=1)^oo": "",
-            "sup": "",
-            "supe": "",
-            "tau": "",
-            "Theta": "",
-            "theta": "",
-            "TT": "",
-            "tta": "",
-            "uarr": "",
-            "ula": "",
-            "upsilon": "",
-            "uu": "",
-            "uuu": "",
-            "veca": "",
-            "vv": "",
-            "vvv": "",
-            "x^(m+n)": "",
-            "x_(mn)": "",
-            "Xi": "",
-            "xi": "",
-            "xx": "",
-            "zeta": "",
-            "ZZ": "",
-            "|-&gt;": "",
-            "|--": "",
-            "|==": "",
-            "|__": "",
-            "|~": "",
-            "~=": "",
-            "~|": "",
-            "~~": ""
-        },
-        "FancySelects": {
-            "'+opt.text+'": ""
-        },
-        "FindReplace": {
-            "';\r\n  var tagc = '": "",
-            "Case sensitive search": "",
-            "Clear": "",
-            "Done": "",
-            "Enter the text you want to find": "",
-            "Find and Replace": "",
-            "found item": "",
-            "found items": "",
-            "Highlight": "",
-            "Inform a replacement word": "",
-            "Next": "",
-            "not found": "",
-            "Options": "",
-            "replaced item": "",
-            "replaced items": "",
-            "Search for:": "",
-            "Substitute all occurrences": "",
-            "Substitute this occurrence?": "",
-            "Undo": "",
-            "Whole words only": ""
-        },
-        "FormOperations": {
-            "Enter the name for new option.": "",
-            "Form Editor": "",
-            "Insert a check box.": "",
-            "Insert a Form.": "",
-            "Insert a multi-line text field.": "",
-            "Insert a radio button.": "",
-            "Insert a select field.": "",
-            "Insert a submit/reset button.": "",
-            "Insert a text, password or hidden field.": "",
-            "Message Sent": "",
-            "Please Select...": ""
-        },
-        "Forms": {
-            "'onClick'=": "",
-            "Access Key:": "",
-            "Action URL:": "",
-            "Button Script": "",
-            "Checked": "",
-            "Columns:": "",
-            "Default text (optional)": "",
-            "Dimensions": "",
-            "Disabled": "",
-            "Encoding:": "",
-            "For Control:": "",
-            "Form": "",
-            "Form Element: FIELDSET": "",
-            "Form Element: INPUT": "",
-            "Form Element: LABEL": "",
-            "Form Element: SELECT": "",
-            "Form Element: TEXTAREA": "",
-            "Form handler script": "",
-            "Form Name:": "",
-            "Get": "",
-            "Hard": "",
-            "Height in number of rows": "",
-            "HTML-Form to CGI (default)": "",
-            "Image source": "",
-            "Initial Text:": "",
-            "Insert/Edit Form": "",
-            "Insert/Edit Form Element FIELDSET": "",
-            "Insert/Edit Form Element INPUT": "",
-            "Insert/Edit Form Element LABEL": "",
-            "Insert/Edit Form Element SELECT": "",
-            "Insert/Edit Form Element TEXTAREA": "",
-            "Javascript for button click": "",
-            "Label:": "",
-            "Legend:": "",
-            "Max length:": "",
-            "Maximum number of characters accepted": "",
-            "Method:": "",
-            "multipart Form Data (File-Upload)": "",
-            "Name": "",
-            "Name of the form input": "",
-            "Name of the form select": "",
-            "name of the textarea": "",
-            "Name/ID:": "",
-            "normal": "",
-            "nowrap": "",
-            "Off": "",
-            "Physical": "",
-            "Please enter a Label": "",
-            "Post": "",
-            "pre": "",
-            "Read Only": "",
-            "Rows:": "",
-            "Size of text box in characters": "",
-            "Size:": "",
-            "Soft": "",
-            "Tab Index:": "",
-            "Target Frame:": "",
-            "Text:": "",
-            "URL of image": "",
-            "Value of the form input": "",
-            "Value:": "",
-            "Virtual": "",
-            "Width in number of characters": "",
-            "Wrap Mode:": "",
-            "You must enter a Name": "",
-            "Options": "<<FindReplace>>"
-        },
-        "FullPage": {
-            "...": "",
-            "Character set:": "",
-            "cyrillic (ISO-8859-5)": "",
-            "cyrillic (KOI8-R)": "",
-            "cyrillic (WINDOWS-1251)": "",
-            "Keywords:": "",
-            "UTF-8 (recommended)": "",
-            "western (ISO-8859-1)": ""
-        },
-        "FullScreen": {
-            "Maximize/Minimize Editor": ""
-        },
-        "Gecko": {
-            "The Paste button does not work in this browser for security reasons. Press CTRL-V on your keyboard to paste directly.": ""
-        },
-        "HorizontalRule": {
-            "&#x00d7;": "",
-            "&nbsp;": "",
-            "Alignment:": "",
-            "Insert/edit horizontal rule": "",
-            "Insert/Edit Horizontal Rule": "",
-            "No shading": "",
-            "Style": ""
-        },
-        "InlineStyler": {
-            "CSS Style": "",
-            "-": "<<Equation>>"
-        },
-        "InsertAnchor": {
-            "Anchor name": "",
-            "Insert Anchor": "",
-            "Delete": "<<Abbreviation>>"
-        },
-        "InsertImage": {
-            "Absbottom": "",
-            "Absmiddle": "",
-            "Alternate text:": "",
-            "Border thickness:": "",
-            "Enter the image URL here": "",
-            "For browsers that don't support images": "",
-            "Horizontal padding": "",
-            "Horizontal:": "",
-            "Image Preview:": "",
-            "Insert Image": "",
-            "Leave empty for no border": "",
-            "Not set": "",
-            "Positioning of this image": "",
-            "Preview the image in a new window": "",
-            "Texttop": "",
-            "Vertical padding": "",
-            "Vertical:": "",
-            "You must enter the URL": "",
-            "Alignment:": "<<HorizontalRule>>",
-            "Preview": "<<Equation>>"
-        },
-        "InsertNote": {
-            "Insert": "",
-            "Insert footnote": "",
-            "Insert Note": ""
-        },
-        "InsertPagebreak": {
-            "Page break": "",
-            "Page Break": ""
-        },
-        "InsertSmiley": {
-            "Insert Smiley": ""
-        },
-        "InsertSnippet": {
-            "\\n  This is an information about something\\n": "",
-            "Hide preview": "",
-            "Insert as": "",
-            "Insert Snippet": "",
-            "InsertSnippet for Xinha": "",
-            "Link1": "",
-            "Link2": "",
-            "Link3": "",
-            "Link4": "",
-            "Link5": "",
-            "Show preview": "",
-            "This is an information about something": "",
-            "Variable": ""
-        },
-        "InsertSnippet2": {
-            "All Categories": "",
-            "Filter": "",
-            "Insert as HTML": "",
-            "Insert as template variable": "",
-            "Only search word beginning": "",
-            "HTML": "<<CharCounter>>",
-            "Insert Snippet": "<<InsertSnippet>>",
-            "InsertSnippet for Xinha": "<<InsertSnippet>>",
-            "Variable": "<<InsertSnippet>>"
-        },
-        "InsertTable": {
-            "Caption for the table": "",
-            "Cell padding:": "",
-            "Cell spacing:": "",
-            "Collapse borders:": "",
-            "Cols:": "",
-            "Em": "",
-            "Fixed width columns": "",
-            "Layou": "",
-            "Number of columns": "",
-            "Number of rows": "",
-            "Positioning of this table": "",
-            "Space between adjacent cells": "",
-            "Space between content and border in cell": "",
-            "Style of the border": "",
-            "Width of the table": "",
-            "Width unit": "",
-            "You must enter a number of columns": "",
-            "You must enter a number of rows": "",
-            "Absbottom": "<<InsertImage>>",
-            "Absmiddle": "<<InsertImage>>",
-            "Alignment:": "<<HorizontalRule>>",
-            "Border thickness:": "<<InsertImage>>",
-            "Leave empty for no border": "<<InsertImage>>",
-            "Not set": "<<InsertImage>>",
-            "Rows:": "<<Forms>>",
-            "Texttop": "<<InsertImage>>"
-        },
-        "LangMarks": {
-            "&mdash; language &mdash;": "",
-            "', '": "",
-            "English": "",
-            "French": "",
-            "Greek": "",
-            "language select": "",
-            "Latin": ""
-        },
-        "Linker": {
-            "(px)": "",
-            "Anchor-Link": "",
-            "Anchor:": "",
-            "Email Address:": "",
-            "Email Link": "",
-            "Location Bar:": "",
-            "Menu Bar:": "",
-            "Message Template:": "",
-            "New Window": "",
-            "Ordinary Link": "",
-            "Popup Window": "",
-            "PopupWindow": "",
-            "Remove Link": "",
-            "Resizeable:": "",
-            "Same Window (jump out of frames)": "",
-            "Scrollbars:": "",
-            "Shows On Hover": "",
-            "Status Bar:": "",
-            "Subject:": "",
-            "Title:": "",
-            "Toolbar:": "",
-            "URL Link": "",
-            "You must select some text before making a new link.": "",
-            "Are you sure you wish to remove this link?": "<<CreateLink>>",
-            "Name:": "<<Forms>>",
-            "Size:": "<<Forms>>"
-        },
-        "ListType": {
-            "Choose list style type (for ordered lists)": "",
-            "Decimal numbers": "",
-            "Lower greek letters": "",
-            "Lower latin letters": "",
-            "Lower roman numbers": "",
-            "Upper latin letters": "",
-            "Upper roman numbers": ""
-        },
-        "MootoolsFileManager": {
-            "Insert File Link": "",
-            "You must select some text before making a new link.": "<<Linker>>"
-        },
-        "Opera": {
-            "MARK": "",
-            "The Paste button does not work in Mozilla based web browsers (technical security reasons). Press CTRL-V on your keyboard to paste directly.": ""
-        },
-        "PasteText": {
-            "Insert text in new paragraph": "",
-            "Paste as Plain Text": ""
-        },
-        "PreserveScripts": {
-            "JavaScript": "",
-            "PHP": ""
-        },
-        "QuickTag": {
-            "',\r\n                           'cl': '": "",
-            "ATTRIBUTES": "",
-            "Colors": "",
-            "Enter the TAG you want to insert": "",
-            "No CSS class avaiable": "",
-            "Ok": "",
-            "OPTIONS": "",
-            "Quick Tag Editor": "",
-            "TAGs": "",
-            "There are some unclosed quote": "",
-            "This attribute already exists in the TAG": "",
-            "You have to select some text": ""
-        },
-        "SaveSubmit": {
-            "in progress": "",
-            "Ready": "",
-            "Save": "",
-            "Saving...": ""
-        },
-        "SetId": {
-            "ID/Name:": "",
-            "Set Id and Name": "",
-            "Set Id/Name": "",
-            "Set ID/Name": "",
-            "Delete": "<<Abbreviation>>"
-        },
-        "SmartReplace": {
-            "ClosingDoubleQuotes": "",
-            "ClosingSingleQuote": "",
-            "Convert all quotes and dashes in the current document": "",
-            "Enable automatic replacements": "",
-            "OpeningDoubleQuotes": "",
-            "OpeningSingleQuote": "",
-            "SmartReplace": "",
-            "SmartReplace Settings": ""
-        },
-        "Stylist": {
-            "Styles": ""
-        },
-        "SuperClean": {
-            "Clean bad HTML from Microsoft Word.": "",
-            "Clean Selection Only": "",
-            "Clean up HTML": "",
-            "Cleaning Scope": "",
-            "General tidy up and correction of some problems.": "",
-            "Please select from the following cleaning options...": "",
-            "Please stand by while cleaning in process...": "",
-            "Remove alignment (left/right/justify).": "",
-            "Remove all classes (CSS).": "",
-            "Remove All HTML Tags": "",
-            "Remove all styles (CSS).": "",
-            "Remove custom font sizes.": "",
-            "Remove custom text colors.": "",
-            "Remove custom typefaces (font \"styles\").": "",
-            "Remove emphasis and annotations.": "",
-            "Remove lang attributes.": "",
-            "Remove Paragraphs": "",
-            "Remove superscripts and subscripts.": "",
-            "Replace directional quote marks with non-directional quote marks.": "",
-            "Vigorously purge HTML from Microsoft Word.": ""
-        },
-        "TableOperations": {
-            "Cell Type:": "",
-            "Cells down": "",
-            "Cells to the right, and": "",
-            "Do Not Change": "",
-            "Frame and borders": "",
-            "Header (th)": "",
-            "Merge current cell with:": "",
-            "Normal (td)": "",
-            "Columns": "<<Forms>>",
-            "Merge Cells": "<<ContextMenu>>",
-            "Rows": "<<Forms>>"
-        },
-        "UnsavedChanges": {
-            "You have unsaved changes in the editor": ""
-        },
-        "WebKit": {
-            "The Paste button does not work in this browser for security reasons. Press CTRL-V on your keyboard to paste directly.": "<<Gecko>>"
-        },
-        "Xinha": {
-            "&#8212; font &#8212;": "",
-            "&#8212; format &#8212;": "",
-            "&#8212; size &#8212;": "",
-            "1 (8 pt)": "",
-            "2 (10 pt)": "",
-            "3 (12 pt)": "",
-            "4 (14 pt)": "",
-            "5 (18 pt)": "",
-            "6 (24 pt)": "",
-            "7 (36 pt)": "",
-            "Address": "",
-            "Arial": "",
-            "Clean content pasted from Word": "",
-            "Clear Inline Font Specifications": "",
-            "Clear MSOffice tags": "",
-            "Close": "",
-            "Constructing object": "",
-            "Courier New": "",
-            "Create Statusbar": "",
-            "Create Toolbar": "",
-            "CTRL-0 (zero)": "",
-            "CTRL-1 .. CTRL-6": "",
-            "CTRL-A": "",
-            "CTRL-B": "",
-            "CTRL-C": "",
-            "CTRL-E": "",
-            "CTRL-I": "",
-            "CTRL-J": "",
-            "CTRL-L": "",
-            "CTRL-N": "",
-            "CTRL-R": "",
-            "CTRL-S": "",
-            "CTRL-U": "",
-            "CTRL-V": "",
-            "CTRL-X": "",
-            "CTRL-Y": "",
-            "CTRL-Z": "",
-            "Editor Help": "",
-            "ENTER": "",
-            "Error Loading Xinha.  Developers, check the Error Console for information.": "",
-            "Finishing": "",
-            "Formatted": "",
-            "Generate Xinha framework": "",
-            "Georgia": "",
-            "Heading 1": "",
-            "Heading 2": "",
-            "Heading 3": "",
-            "Heading 4": "",
-            "Heading 5": "",
-            "Heading 6": "",
-            "Headings": "",
-            "Impact": "",
-            "Init editor size": "",
-            "insert linebreak": "",
-            "Insert/Overwrite": "",
-            "Keyboard shortcuts": "",
-            "Loading Core": "",
-            "Loading in progress. Please wait!": "",
-            "Loading plugin $plugin": "",
-            "Loading plugins": "",
-            "MS Word Cleaner": "",
-            "new paragraph": "",
-            "Normal": "",
-            "Print document": "",
-            "Register plugin $plugin": "",
-            "Remove formatting": "",
-            "Save as": "",
-            "Select all": "",
-            "Select Color": "",
-            "Set format to paragraph": "",
-            "SHIFT-ENTER": "",
-            "Split Block": "",
-            "Tahoma": "",
-            "The editor provides the following key combinations:": "",
-            "Times New Roman": "",
-            "Toggle Borders": "",
-            "Touch here first to activate editor.": "",
-            "Verdana": "",
-            "Waiting for Iframe to load...": "",
-            "WingDings": "",
-            "Would you like to clear font colours?": "",
-            "Would you like to clear font sizes?": "",
-            "Would you like to clear font typefaces?": "",
-            "Xinha": ""
-        },
-        "BackgroundImage": {
-            "__ TRANSLATOR NOTE __": "*** BACKGROUNDIMAGE IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***",
-            "Remove Current Background": "",
-            "Set Background": "",
-            "Set page background image": "",
-            "Set Page Background Image": ""
-        },
-        "ClientsideSpellcheck": {
-            "__ TRANSLATOR NOTE __": "*** CLIENTSIDESPELLCHECK IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***",
-            "Spell Check using ieSpell": ""
-        },
-        "ExtendedFileManager": {
-            "__ TRANSLATOR NOTE __": "*** EXTENDEDFILEMANAGER IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***",
-            "10%": "",
-            "100%": "",
-            "200%": "",
-            "25%": "",
-            "50%": "",
-            "75%": "",
-            ">List View": "",
-            ">Thumbnail View": "",
-            "A:": "",
-            "Alt": "",
-            "Border Color": "",
-            "Constrain Proportions": "",
-            "Crop": "",
-            "D:": "",
-            "Directory": "",
-            "Directory Up": "",
-            "Edit": "",
-            "File List": "",
-            "File Manager": "",
-            "Filename:": "",
-            "Filesize:": "",
-            "Flip Horizontal": "",
-            "Flip Image": "",
-            "Flip Vertical": "",
-            "Folder": "",
-            "GIF": "",
-            "GIF format is not supported, image editing not supported.": "",
-            "H:": "",
-            "Image Editor": "",
-            "Image Selection": "",
-            "Invalid base directory:": "",
-            "JPEG High": "",
-            "JPEG Low": "",
-            "JPEG Medium": "",
-            "Loading": "",
-            "Lock": "",
-            "Marker": "",
-            "Maximum folder size limit reached. Upload disabled.": "",
-            "Measure": "",
-            "New Folder": "",
-            "No Files Found": "",
-            "No Image Available": "",
-            "Please enter value": "",
-            "PNG": "",
-            "Preset": "",
-            "Quality:": "",
-            "Refresh": "",
-            "Rename": "",
-            "Resize": "",
-            "Rotate": "",
-            "Rotate 180 &deg;": "",
-            "Rotate 90 &deg; CCW": "",
-            "Rotate 90 &deg; CW": "",
-            "Rotate Image": "",
-            "Start X:": "",
-            "Start Y:": "",
-            "Target Window": "",
-            "Toggle marker color": "",
-            "Trash": "",
-            "Upload": "",
-            "W:": "",
-            "X:": "",
-            "Xinha Image Editor": "",
-            "Y:": "",
-            "Zoom": "",
-            "Absbottom": "<<InsertImage>>",
-            "Absmiddle": "<<InsertImage>>",
-            "Clear": "<<FindReplace>>",
-            "Insert File Link": "<<MootoolsFileManager>>",
-            "Not set": "<<InsertImage>>",
-            "Positioning of this image": "<<InsertImage>>",
-            "Preview": "<<Equation>>",
-            "Save": "<<SaveSubmit>>",
-            "Texttop": "<<InsertImage>>",
-            "You must select some text before making a new link.": "<<Linker>>"
-        },
-        "Filter": {
-            "__ TRANSLATOR NOTE __": "*** FILTER IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***",
-            "Filter": "<<InsertSnippet2>>"
-        },
-        "HtmlTidy": {
-            "__ TRANSLATOR NOTE __": "*** HTMLTIDY IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***",
-            "Auto-Tidy": "",
-            "Don't Tidy": "",
-            "HTML Tidy": "",
-            "Tidy failed.  Check your HTML for syntax errors.": ""
-        },
-        "ImageManager": {
-            "__ TRANSLATOR NOTE __": "*** IMAGEMANAGER IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***",
-            "Angle:": "",
-            "Flickr Picture List": "",
-            "Flickr Pictures": "",
-            "Flickr Selection": "",
-            "Flickr Username/Email": "",
-            "Folder Name:": "",
-            "Image Format": "",
-            "Image List": "",
-            "Keyword": "",
-            "No Images Found": "",
-            "No Photos Found": "",
-            "No Videos Found": "",
-            "This Server": "",
-            "YouTube Selection": "",
-            "YouTube Username": "",
-            "YouTube Video List": "",
-            "YouTube Videos": "",
-            "A:": "<<ExtendedFileManager>>",
-            "Absbottom": "<<InsertImage>>",
-            "Absmiddle": "<<InsertImage>>",
-            "Clear": "<<FindReplace>>",
-            "Constrain Proportions": "<<ExtendedFileManager>>",
-            "Crop": "<<ExtendedFileManager>>",
-            "D:": "<<ExtendedFileManager>>",
-            "Directory": "<<ExtendedFileManager>>",
-            "Directory Up": "<<ExtendedFileManager>>",
-            "Edit": "<<ExtendedFileManager>>",
-            "Filename:": "<<ExtendedFileManager>>",
-            "Flip Horizontal": "<<ExtendedFileManager>>",
-            "Flip Image": "<<ExtendedFileManager>>",
-            "Flip Vertical": "<<ExtendedFileManager>>",
-            "GIF": "<<ExtendedFileManager>>",
-            "GIF format is not supported, image editing not supported.": "<<ExtendedFileManager>>",
-            "H:": "<<ExtendedFileManager>>",
-            "Image Editor": "<<ExtendedFileManager>>",
-            "Image Selection": "<<ExtendedFileManager>>",
-            "Insert Image": "<<InsertImage>>",
-            "Invalid base directory:": "<<ExtendedFileManager>>",
-            "JPEG High": "<<ExtendedFileManager>>",
-            "JPEG Low": "<<ExtendedFileManager>>",
-            "JPEG Medium": "<<ExtendedFileManager>>",
-            "Lock": "<<ExtendedFileManager>>",
-            "Marker": "<<ExtendedFileManager>>",
-            "Measure": "<<ExtendedFileManager>>",
-            "New Folder": "<<ExtendedFileManager>>",
-            "No Image Available": "<<ExtendedFileManager>>",
-            "Not set": "<<InsertImage>>",
-            "PNG": "<<ExtendedFileManager>>",
-            "Positioning of this image": "<<InsertImage>>",
-            "Quality:": "<<ExtendedFileManager>>",
-            "Refresh": "<<ExtendedFileManager>>",
-            "Resize": "<<ExtendedFileManager>>",
-            "Rotate": "<<ExtendedFileManager>>",
-            "Rotate 180 &deg;": "<<ExtendedFileManager>>",
-            "Rotate 90 &deg; CCW": "<<ExtendedFileManager>>",
-            "Rotate 90 &deg; CW": "<<ExtendedFileManager>>",
-            "Rotate Image": "<<ExtendedFileManager>>",
-            "Save": "<<SaveSubmit>>",
-            "Start X:": "<<ExtendedFileManager>>",
-            "Start Y:": "<<ExtendedFileManager>>",
-            "Texttop": "<<InsertImage>>",
-            "Trash": "<<ExtendedFileManager>>",
-            "W:": "<<ExtendedFileManager>>",
-            "X:": "<<ExtendedFileManager>>",
-            "Y:": "<<ExtendedFileManager>>"
-        },
-        "InsertMarquee": {
-            "__ TRANSLATOR NOTE __": "*** INSERTMARQUEE IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***",
-            "Alternate": "",
-            "Background-Color:": "",
-            "Behavior:": "",
-            "Continuous": "",
-            "Direction:": "",
-            "Insert scrolling marquee": "",
-            "Marquee Editor": "",
-            "Scroll Amount:": "",
-            "Scroll Delay:": "",
-            "Slide": "",
-            "Speed Control": "",
-            "Name": "<<Forms>>",
-            "Name/ID:": "<<Forms>>",
-            "Text:": "<<Forms>>"
-        },
-        "InsertPicture": {
-            "__ TRANSLATOR NOTE __": "*** INSERTPICTURE IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***",
-            "Leave empty for not defined": "",
-            " Open file in new window": "",
-            "Open file in new window": "",
-            "Upload file": "",
-            "Absbottom": "<<InsertImage>>",
-            "Absmiddle": "<<InsertImage>>",
-            "Alignment:": "<<HorizontalRule>>",
-            "Alternate text:": "<<InsertImage>>",
-            "Border thickness:": "<<InsertImage>>",
-            "Enter the image URL here": "<<InsertImage>>",
-            "For browsers that don't support images": "<<InsertImage>>",
-            "Horizontal padding": "<<InsertImage>>",
-            "Horizontal:": "<<InsertImage>>",
-            "Image Preview:": "<<InsertImage>>",
-            "Insert Image": "<<InsertImage>>",
-            "Leave empty for no border": "<<InsertImage>>",
-            "Not set": "<<InsertImage>>",
-            "Positioning of this image": "<<InsertImage>>",
-            "Preview": "<<Equation>>",
-            "Preview the image in a new window": "<<InsertImage>>",
-            "Size": "<<Forms>>",
-            "Texttop": "<<InsertImage>>",
-            "Vertical padding": "<<InsertImage>>",
-            "Vertical:": "<<InsertImage>>"
-        },
-        "NoteServer": {
-            "__ TRANSLATOR NOTE __": "*** NOTESERVER IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***",
-            "120%": "",
-            "150%": "",
-            "80%": "",
-            "Add GUIDO Code in a textbox on the page": "",
-            "Add MIDI link to allow students to hear the music": "",
-            "Format": "",
-            "GUIDO Code": "",
-            "Guido code": "",
-            "Image in applet": "",
-            "Insert GUIDO Music Notation": "",
-            "MIDI File": "",
-            "Source Code": "",
-            "With Mozilla, the applet will not be visible in editor, but only in Web page after submitting.": "",
-            "Zoom :": "",
-            "100%": "<<ExtendedFileManager>>",
-            "Image Preview": "<<InsertImage>>",
-            "Options": "<<FindReplace>>",
-            "Preview": "<<Equation>>",
-            "Preview the image in a new window": "<<InsertImage>>",
-            "Zoom": "<<ExtendedFileManager>>"
-        },
-        "PSLocal": {
-            "__ TRANSLATOR NOTE __": "*** PSLOCAL IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***",
-            "Confirm": "",
-            "Enable": "",
-            "Enable Gears in order to use local document storage and configuration.": "",
-            "Enabling Local Storage": "",
-            "Install": "",
-            "Learn About Local Storage": "",
-            "This will reload the page, causing you to lose any unsaved work.  Press \"OK\" to reload.": "",
-            "Xinha uses Google Gears to enable local document storage.  With Gears installed, you can save drafts of your documents on your hard drive, configure Xinha to look the way you want, and carry this information wherever you use Xinha on the web.": ""
-        },
-        "PSServer": {
-            "__ TRANSLATOR NOTE __": "*** PSSERVER IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***",
-            "File: ": "",
-            "Import": ""
-        },
-        "PersistentStorage": {
-            "__ TRANSLATOR NOTE __": "*** PERSISTENTSTORAGE IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***",
-            "Details": "",
-            "File Browser": "",
-            "Hello    There C ": "",
-            "Hello  There A ": "",
-            "Hello \" There B \"": "",
-            "Hello ' There D '": "",
-            "List of Places": "",
-            "New Document": "",
-            "Open": "",
-            "Open Document": "",
-            "Places": "",
-            "Please enter the name of the directory you'd like to create.": "",
-            "Save Document": "",
-            "This will erase any unsaved content.  If you're certain, please click OK to continue.": "",
-            "Web URL": "",
-            "Confirm": "<<PSLocal>>",
-            "Delete": "<<Abbreviation>>",
-            "Directory Up": "<<ExtendedFileManager>>",
-            "File List": "<<ExtendedFileManager>>",
-            "File Manager": "<<ExtendedFileManager>>",
-            "Filename": "<<ExtendedFileManager>>",
-            "Insert": "<<InsertNote>>",
-            "Insert Image": "<<InsertImage>>",
-            "New Folder": "<<ExtendedFileManager>>",
-            "Save": "<<SaveSubmit>>",
-            "You must select some text before making a new link.": "<<Linker>>"
-        },
-        "SpellChecker": {
-            "__ TRANSLATOR NOTE __": "*** SPELLCHECKER IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***",
-            "HTMLArea Spell Checker": "",
-            "Info": "",
-            "Learn": "",
-            "pliz weit ;-)": "",
-            "Spell Checker": ""
-        },
-        "Template": {
-            "__ TRANSLATOR NOTE __": "*** TEMPLATE IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***",
-            "Insert template": ""
-        },
-        "UnFormat": {
-            "__ TRANSLATOR NOTE __": "*** UNFORMAT IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***",
-            "All": "",
-            "All HTML:": "",
-            "Cleaning Area": "",
-            "Cleaning options": "",
-            "Formatting:": "",
-            "Page Cleaner": "",
-            "Select which types of formatting you would like to remove.": "",
-            "Selection": ""
-        }
-    }
-}
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/lang/merged/hu.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/lang/merged/hu.js
deleted file mode 100644
index 6d78edd..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/lang/merged/hu.js
+++ /dev/null
@@ -1,1575 +0,0 @@
-// Xinha Language Combined Translation File
-//
-// LANG: "hu", ENCODING: UTF-8
-//
-// INSTRUCTIONS TO TRANSLATORS
-// ===========================================================================
-//
-// Your translation must be in UTF-8 Character Encoding.
-//
-// This is a JSON encoded file (plus comments), strings should be double-quote
-// only, do not use single quotes to surround strings - "hello", not 'hello'
-// do not have a trailing comma after the last entry in a section.
-//
-// Only full line comments are allowed (that a comments occupy entire lines).
-//
-// Search for the __NEW_TRANSLATIONS__ section below, this is where you will
-// want to focus, this section includes things that do not presently have a 
-// translation or for which the translation needs to be checked for accuracy.
-//
-// In the New Translations section a translation string is one of the following
-//
-//  "English String Here" : ""
-//     This means it is not translated yet, add your translation...
-//     "English String Here" : "Klingon String Here"
-//
-//  "English String Here" : "Translated String Here"
-//     This means that an existing translation for this string, in some other
-//     section has been found, and used.  Check that it is approprite for this
-//     section and if it is, that's fine leave it as is, otherwise change as
-//     appropriate.
-//
-//  "English String Here" : "<<AnotherSection>>"
-//     This means use the same translation for this string as <<AnotherSection>>
-//     this saves you re-tranlating strings.  If the Context of this section
-//     and the context of AnotherSection seem the same, that's fine leave it
-//     using that translation, but if this section needs a different translation, 
-//     you can provide it by replacing the link (<<AnotherSection>>) with that
-//     new translation.  For example - a "Table" in say "DataPlugin" is 
-//     perhaps translated differently to "Table" in "FurniturePlugin".
-//
-// TESTING YOUR TRANSLATION
-// ===========================================================================
-// Simply place your translation file on your webserver somewhere for example
-//
-//   /xinha/lang/merged/hu.js
-//
-// and then tell Xinha where to get it (before loading XinhaCore.js) by 
-//
-//  _editor_lang              = 'hu';
-//  _editor_lang_merged_file  = '/xinha/lang/merged/hu.js';
-//
-// Xinha will load your new language definition.
-//
-// SUBMITTING YOUR TRANSLATION
-// ===========================================================================
-// Simply create a Ticket on the Xinha website and attach your translation 
-// file.
-//
-// The Xinha developers will take your file and use the 
-//     contrib/lc_split_merged_file.php
-// script to load it into the Xinha distribution.
-
-{
-    "Abbreviation": {
-        "Cancel": "Mégsem",
-        "OK": "Rendben"
-    },
-    "AboutBox": {
-        "About this editor": "Névjegy"
-    },
-    "BackgroundImage": {
-        "Cancel": "Mégsem"
-    },
-    "ColorPicker": {
-        "OK": "Rendben"
-    },
-    "ContextMenu": {
-        "Justify Center": "Középre zárt",
-        "Justify Full": "Sorkizárt",
-        "Justify Left": "Balra zárt",
-        "Justify Right": "Jobbra zárt"
-    },
-    "CreateLink": {
-        "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)",
-        "OK": "Rendben",
-        "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:"
-    },
-    "EditTag": {
-        "Cancel": "Mégsem",
-        "OK": "Rendben"
-    },
-    "Equation": {
-        "Cancel": "Mégsem",
-        "OK": "Rendben"
-    },
-    "ExtendedFileManager": {
-        "Cancel": "Mégsem",
-        "New window (_blank)": "Új ablak (_blank)",
-        "None (use implicit)": "Nincs (use implicit)",
-        "OK": "Rendben",
-        "Same frame (_self)": "Ugyanabba a keretbe (_self)",
-        "Title (tooltip)": "Cím (tooltip):",
-        "Top frame (_top)": "Felső keret (_top)"
-    },
-    "FindReplace": {
-        "Replace with:": "Csere a következőre:"
-    },
-    "Forms": {
-        "Cancel": "Mégsem",
-        "OK": "Rendben"
-    },
-    "FullPage": {
-        "Cancel": "Mégsem",
-        "OK": "Rendben"
-    },
-    "HorizontalRule": {
-        "Cancel": "Mégsem",
-        "Horizontal Rule": "Elválasztó vonal",
-        "OK": "Rendben"
-    },
-    "ImageManager": {
-        "Cancel": "Mégsem",
-        "OK": "Rendben"
-    },
-    "InsertAnchor": {
-        "Cancel": "Mégsem",
-        "OK": "Rendben"
-    },
-    "InsertImage": {
-        "Cancel": "Mégsem",
-        "OK": "Rendben"
-    },
-    "InsertMarquee": {
-        "Cancel": "Mégsem",
-        "OK": "Rendben"
-    },
-    "InsertNote": {
-        "Cancel": "Mégsem"
-    },
-    "InsertPicture": {
-        "Cancel": "Mégsem",
-        "OK": "Rendben"
-    },
-    "InsertSnippet": {
-        "Cancel": "Mégsem"
-    },
-    "InsertSnippet2": {
-        "Cancel": "Mégsem"
-    },
-    "InsertTable": {
-        "Cancel": "Mégsem",
-        "Insert Table": "Táblázat beszúrása",
-        "OK": "Rendben"
-    },
-    "Linker": {
-        "Cancel": "Mégsem",
-        "Insert/Modify Link": "Hivatkozás Beszúrása/Módosítása",
-        "OK": "Rendben",
-        "Target:": "Cél:",
-        "URL:": "URL:"
-    },
-    "NoteServer": {
-        "Cancel": "Mégsem",
-        "OK": "Rendben"
-    },
-    "PSLocal": {
-        "Cancel": "Mégsem"
-    },
-    "PasteText": {
-        "Cancel": "Mégsem",
-        "OK": "Rendben"
-    },
-    "PersistentStorage": {
-        "Cancel": "Mégsem"
-    },
-    "QuickTag": {
-        "Cancel": "Mégsem"
-    },
-    "SetId": {
-        "Cancel": "Mégsem",
-        "OK": "Rendben"
-    },
-    "SmartReplace": {
-        "OK": "Rendben"
-    },
-    "SpellChecker": {
-        "Cancel": "Mégsem",
-        "Dictionary": "Szótár",
-        "Finished list of mispelled words": "A tévesztett szavak listájának vége",
-        "I will open it in a new page.": "Megnyitás új lapon",
-        "Ignore": "Elvetés",
-        "Ignore all": "Minden elvetése",
-        "No mispelled words found with the selected dictionary.": "A választott szótár szerint nincs tévesztett szó.",
-        "OK": "Rendben",
-        "Original word": "Eredeti szó",
-        "Please confirm that you want to open this link": "Megerősítés",
-        "Please wait.  Calling spell checker.": "Kis türelmet, a helyesírásellenőrző hívása folyamatban.",
-        "Please wait: changing dictionary to": "Kis türelmet, szótár cseréje",
-        "Re-check": "Újraellenőrzés",
-        "Replace": "Csere",
-        "Replace all": "Mind cseréje",
-        "Replace with": "Csere a következőre:",
-        "Spell-check": "Helyesírásellenőrzés",
-        "Suggestions": "Tippek",
-        "This will drop changes and quit spell checker.  Please confirm.": "Kilépés a változások eldobásával. Jóváhagyja?"
-    },
-    "SuperClean": {
-        "Cancel": "Mégsem",
-        "OK": "Rendben"
-    },
-    "TableOperations": {
-        "Cancel": "Mégsem",
-        "OK": "Rendben"
-    },
-    "Template": {
-        "Cancel": "Mégsem"
-    },
-    "UnFormat": {
-        "Cancel": "Mégsem",
-        "OK": "Rendben"
-    },
-    "Xinha": {
-        "About this editor": "Névjegy",
-        "Background Color": "Háttérszín",
-        "Bold": "Félkövér",
-        "Bulleted List": "Számozatlan lista",
-        "Copy selection": "Másolás",
-        "Current style": "Aktuális stílus",
-        "Cut selection": "Kivágás",
-        "Decrease Indent": "Behúzás csökkentése",
-        "Direction left to right": "Irány balról jobbra",
-        "Direction right to left": "Irány jobbról balra",
-        "Font Color": "Karakterszín",
-        "Help using editor": "Súgó",
-        "Horizontal Rule": "Elválasztó vonal",
-        "Increase Indent": "Behúzás növelése",
-        "Insert Table": "Táblázat beszúrása",
-        "Insert Web Link": "Hiperhivatkozás beszúrása",
-        "Insert/Modify Image": "Kép beszúrása",
-        "Italic": "Dőlt",
-        "Justify Center": "Középre zárt",
-        "Justify Full": "Sorkizárt",
-        "Justify Left": "Balra zárt",
-        "Justify Right": "Jobbra zárt",
-        "Ordered List": "Számozott lista",
-        "Paste from clipboard": "Beillesztés",
-        "Path": "Hierarchia",
-        "Redoes your last action": "Újra végrehajtás",
-        "Strikethrough": "Áthúzott",
-        "Subscript": "Alsó index",
-        "Superscript": "Felső index",
-        "Toggle HTML Source": "HTML forrás be/ki",
-        "Underline": "Aláhúzott",
-        "Undoes your last action": "Visszavonás",
-        "You are in TEXT MODE.  Use the [<>] button to switch back to WYSIWYG.": "Forrás mód. Visszaváltás [<>] gomb"
-    },
-    "__NEW_TRANSLATIONS__": {
-        "Abbreviation": {
-            "Abbreviation": "",
-            "Delete": "",
-            "Expansion:": ""
-        },
-        "AboutBox": {
-            "Close": "<<Xinha>>"
-        },
-        "CharCounter": {
-            "... in progress": "",
-            "Chars": "",
-            "HTML": "",
-            "Words": ""
-        },
-        "CharacterMap": {
-            "Insert special character": ""
-        },
-        "ColorPicker": {
-            "Click a color...": "",
-            "Color: ": "",
-            "Sample": "",
-            "Web Safe: ": "",
-            "Close": "<<Xinha>>"
-        },
-        "ContextMenu": {
-            "_Delete Row": "",
-            "_Image Properties...": "",
-            "_Modify Link...": "",
-            "_Remove Link...": "",
-            "_Table Properties...": "",
-            "C_ell Properties...": "",
-            "Chec_k Link...": "",
-            "Copy": "",
-            "Create a link": "",
-            "Current URL is": "",
-            "Cut": "",
-            "De_lete Column": "",
-            "Delete Cell": "",
-            "Delete the current column": "",
-            "Delete the current row": "",
-            "How did you get here? (Please report!)": "",
-            "I_nsert Row Before": "",
-            "In_sert Row After": "",
-            "Insert _Column Before": "",
-            "Insert a new column after the current one": "",
-            "Insert a new column before the current one": "",
-            "Insert a new row after the current one": "",
-            "Insert a new row before the current one": "",
-            "Insert a paragraph after the current node": "",
-            "Insert a paragraph before the current node": "",
-            "Insert C_olumn After": "",
-            "Insert Cell After": "",
-            "Insert Cell Before": "",
-            "Insert paragraph after": "",
-            "Insert paragraph before": "",
-            "Link points to:": "",
-            "Make lin_k...": "",
-            "Merge Cells": "",
-            "Opens this link in a new window": "",
-            "Paste": "",
-            "Please confirm that you want to remove this element:": "",
-            "Please confirm that you want to unlink this element.": "",
-            "Remove the $elem Element...": "",
-            "Remove this node from the document": "",
-            "Ro_w Properties...": "",
-            "Show the image properties dialog": "",
-            "Show the Table Cell Properties dialog": "",
-            "Show the Table Properties dialog": "",
-            "Show the Table Row Properties dialog": "",
-            "Unlink the current element": ""
-        },
-        "CreateLink": {
-            "Are you sure you wish to remove this link?": "",
-            "You need to select some text before creating a link": ""
-        },
-        "DefinitionList": {
-            "definition description": "",
-            "definition list": "",
-            "definition term": ""
-        },
-        "Dialogs": {
-            "Some Text Here": ""
-        },
-        "DynamicCSS": {
-            "Choose stylesheet": "",
-            "Default": "",
-            "Undefined": ""
-        },
-        "EditTag": {
-            "Edit HTML for selected text": "",
-            "Edit Tag By Peg": "",
-            "Tag Editor": ""
-        },
-        "Equation": {
-            "!=": "",
-            "!in": "",
-            "&gt;-": "",
-            "&gt;=": "",
-            "&lt;=": "",
-            "&lt;=&gt;": "",
-            "&lt;x&gt;": "",
-            "&nbsp; `!` &nbsp;": "",
-            "&nbsp; `.` &nbsp;": "",
-            "&nbsp; `0` &nbsp;": "",
-            "&nbsp; `2` &nbsp;": "",
-            "&nbsp; `3` &nbsp;": "",
-            "&nbsp; `4` &nbsp;": "",
-            "&nbsp; `5` &nbsp;": "",
-            "&nbsp; `6` &nbsp;": "",
-            "&nbsp; `7` &nbsp;": "",
-            "&nbsp; `8` &nbsp;": "",
-            "&nbsp; `9` &nbsp;": "",
-            "&nbsp; `e` &nbsp;": "",
-            "&nbsp;&nbsp;`1` &nbsp;": "",
-            "&nbsp;`+{::}`&nbsp;": "",
-            "&nbsp;`-:\\ `": "",
-            "&nbsp;`-{::}`&nbsp;": "",
-            "&nbsp;`C`&nbsp;": "",
-            "&nbsp;`cos`": "",
-            "&nbsp;`ln`&nbsp;": "",
-            "&nbsp;`pi` &nbsp;": "",
-            "&nbsp;`sin`": "",
-            "&nbsp;`tan`": "",
-            "&nbsp;`times`&nbsp;": "",
-            "&quot;text&quot;": "",
-            "'+formula+'": "",
-            "((n),(k))": "",
-            "(x+1)/(x-1)": "",
-            "*": "",
-            "**": "",
-            "+-": "",
-            "-&gt;": "",
-            "-&lt;": "",
-            "-:": "",
-            "-=": "",
-            "//": "",
-            "/_": "",
-            ":.": "",
-            "=&gt;": "",
-            "@": "",
-            "[[a,b],[c,d]]": "",
-            "\\\\": "",
-            "\\nClick in the box to use your keyboard or use the buttons\\n": "",
-            "^^": "",
-            "^^^": "",
-            "__|": "",
-            "_|_": "",
-            "`!=`": "",
-            "`!in`": "",
-            "`&and;`": "",
-            "`&cap;`": "",
-            "`&cup;`": "",
-            "`&gt;-`": "",
-            "`&gt;=`": "",
-            "`&lt;=&gt;`": "",
-            "`&lt;=`": "",
-            "`&lt;x&gt;`": "",
-            "`&or;`": "",
-            "`&quot;text&quot;`": "",
-            "`((n),(k))`": "",
-            "`(x+1)/(x-1)`": "",
-            "`**`": "",
-            "`*`": "",
-            "`+-`": "",
-            "`-&gt;`": "",
-            "`-&lt;`": "",
-            "`-:`": "",
-            "`-=`": "",
-            "`//`": "",
-            "`/_`": "",
-            "`:.`": "",
-            "`=&gt;`": "",
-            "`@`": "",
-            "`[[a,b],[c,d]]`": "",
-            "`\\\\`": "",
-            "`__|`": "",
-            "`_|_`": "",
-            "`AA`": "",
-            "`aleph`": "",
-            "`alpha`": "",
-            "`and`": "",
-            "`bara`": "",
-            "`bba`": "",
-            "`bbba`": "",
-            "`beta`": "",
-            "`CC`": "",
-            "`cca`": "",
-            "`chi`": "",
-            "`darr`": "",
-            "`ddota`": "",
-            "`del`": "",
-            "`Delta`": "",
-            "`delta`": "",
-            "`diamond`": "",
-            "`dota`": "",
-            "`dy/dx`": "",
-            "`EE`": "",
-            "`epsi`": "",
-            "`eta`": "",
-            "`fra`": "",
-            "`Gamma`": "",
-            "`gamma`": "",
-            "`grad`": "",
-            "`harr`": "",
-            "`hArr`": "",
-            "`hata`": "",
-            "`if`": "",
-            "`in`": "",
-            "`int`": "",
-            "`iota`": "",
-            "`kappa`": "",
-            "`Lambda`": "",
-            "`lambda`": "",
-            "`lArr`": "",
-            "`larr`": "",
-            "`lim_(x-&gt;oo)`": "",
-            "`log`": "",
-            "`mu`": "",
-            "`NN`": "",
-            "`nn`": "",
-            "`not`": "",
-            "`nu`": "",
-            "`o+`": "",
-            "`o.`": "",
-            "`O/`": "",
-            "`oint`": "",
-            "`omega`": "",
-            "`Omega`": "",
-            "`oo`": "",
-            "`or`": "",
-            "`ox`": "",
-            "`phi`": "",
-            "`Phi`": "",
-            "`Pi`": "",
-            "`pi`": "",
-            "`prod`": "",
-            "`prop`": "",
-            "`Psi`": "",
-            "`psi`": "",
-            "`QQ`": "",
-            "`quad`": "",
-            "`rArr`": "",
-            "`rho`": "",
-            "`root(n)(x)`": "",
-            "`RR`": "",
-            "`sfa`": "",
-            "`Sigma`": "",
-            "`sigma`": "",
-            "`sqrt(x)`": "",
-            "`square`": "",
-            "`stackrel(-&gt;)(+)`": "",
-            "`sub`": "",
-            "`sube`": "",
-            "`sum`": "",
-            "`sup`": "",
-            "`supe`": "",
-            "`tau`": "",
-            "`Theta`": "",
-            "`theta`": "",
-            "`TT`": "",
-            "`tta`": "",
-            "`uarr`": "",
-            "`ula`": "",
-            "`upsilon`": "",
-            "`uu`": "",
-            "`veca`": "",
-            "`vv`": "",
-            "`x_(mn)`": "",
-            "`Xi`": "",
-            "`xi`": "",
-            "`xx`": "",
-            "`zeta`": "",
-            "`ZZ`": "",
-            "`|-&gt;`": "",
-            "`|--`": "",
-            "`|==`": "",
-            "`|__`": "",
-            "`|~`": "",
-            "`~=`": "",
-            "`~|`": "",
-            "`~~`": "",
-            "AA": "",
-            "aleph": "",
-            "alpha": "",
-            "and": "",
-            "AsciiMath Formula Input": "",
-            "AsciiMathML Example": "",
-            "bara": "",
-            "Based on ASCIIMathML by": "",
-            "bba": "",
-            "bbba": "",
-            "beta": "",
-            "CC": "",
-            "cca": "",
-            "chi": "",
-            "darr": "",
-            "ddota": "",
-            "del": "",
-            "delta": "",
-            "Delta": "",
-            "diamond": "",
-            "dota": "",
-            "dy/dx": "",
-            "EE": "",
-            "epsi": "",
-            "eta": "",
-            "For more information on AsciiMathML visit this page:": "",
-            "Formula Editor": "",
-            "fra": "",
-            "gamma": "",
-            "Gamma": "",
-            "grad": "",
-            "hArr": "",
-            "harr": "",
-            "hata": "",
-            "if": "",
-            "in": "",
-            "Input": "",
-            "int": "",
-            "int_a^bf(x)dx": "",
-            "iota": "",
-            "kappa": "",
-            "Lambda": "",
-            "lambda": "",
-            "larr": "",
-            "lArr": "",
-            "lim_(x-&gt;oo)": "",
-            "mu": "",
-            "NN": "",
-            "nn": "",
-            "nnn": "",
-            "not": "",
-            "nu": "",
-            "o+": "",
-            "o.": "",
-            "O/": "",
-            "oint": "",
-            "Omega": "",
-            "omega": "",
-            "oo": "",
-            "or": "",
-            "ox": "",
-            "phi": "",
-            "Phi": "",
-            "pi": "",
-            "Pi": "",
-            "Preview": "",
-            "prod": "",
-            "prop": "",
-            "psi": "",
-            "Psi": "",
-            "QQ": "",
-            "quad": "",
-            "rArr": "",
-            "rho": "",
-            "root(n)(x)": "",
-            "RR": "",
-            "sfa": "",
-            "sigma": "",
-            "Sigma": "",
-            "sqrt(x)": "",
-            "square": "",
-            "stackrel(-&gt;)(+)": "",
-            "sub": "",
-            "sube": "",
-            "sum": "",
-            "sum_(n=1)^oo": "",
-            "sup": "",
-            "supe": "",
-            "tau": "",
-            "Theta": "",
-            "theta": "",
-            "TT": "",
-            "tta": "",
-            "uarr": "",
-            "ula": "",
-            "upsilon": "",
-            "uu": "",
-            "uuu": "",
-            "veca": "",
-            "vv": "",
-            "vvv": "",
-            "x^(m+n)": "",
-            "x_(mn)": "",
-            "Xi": "",
-            "xi": "",
-            "xx": "",
-            "zeta": "",
-            "ZZ": "",
-            "|-&gt;": "",
-            "|--": "",
-            "|==": "",
-            "|__": "",
-            "|~": "",
-            "~=": "",
-            "~|": "",
-            "~~": ""
-        },
-        "FancySelects": {
-            "'+opt.text+'": ""
-        },
-        "FindReplace": {
-            "';\r\n  var tagc = '": "",
-            "Case sensitive search": "",
-            "Clear": "",
-            "Done": "",
-            "Enter the text you want to find": "",
-            "Find and Replace": "",
-            "found item": "",
-            "found items": "",
-            "Highlight": "",
-            "Inform a replacement word": "",
-            "Next": "",
-            "not found": "",
-            "Options": "",
-            "replaced item": "",
-            "replaced items": "",
-            "Search for:": "",
-            "Substitute all occurrences": "",
-            "Substitute this occurrence?": "",
-            "Undo": "",
-            "Whole words only": ""
-        },
-        "FormOperations": {
-            "Enter the name for new option.": "",
-            "Form Editor": "",
-            "Insert a check box.": "",
-            "Insert a Form.": "",
-            "Insert a multi-line text field.": "",
-            "Insert a radio button.": "",
-            "Insert a select field.": "",
-            "Insert a submit/reset button.": "",
-            "Insert a text, password or hidden field.": "",
-            "Message Sent": "",
-            "Please Select...": ""
-        },
-        "Forms": {
-            "'onClick'=": "",
-            "Access Key:": "",
-            "Action URL:": "",
-            "Button Script": "",
-            "Checked": "",
-            "Columns:": "",
-            "Default text (optional)": "",
-            "Dimensions": "",
-            "Disabled": "",
-            "Encoding:": "",
-            "For Control:": "",
-            "Form": "",
-            "Form Element: FIELDSET": "",
-            "Form Element: INPUT": "",
-            "Form Element: LABEL": "",
-            "Form Element: SELECT": "",
-            "Form Element: TEXTAREA": "",
-            "Form handler script": "",
-            "Form Name:": "",
-            "Get": "",
-            "Hard": "",
-            "Height in number of rows": "",
-            "HTML-Form to CGI (default)": "",
-            "Image source": "",
-            "Image URL:": "",
-            "Initial Text:": "",
-            "Insert/Edit Form": "",
-            "Insert/Edit Form Element FIELDSET": "",
-            "Insert/Edit Form Element INPUT": "",
-            "Insert/Edit Form Element LABEL": "",
-            "Insert/Edit Form Element SELECT": "",
-            "Insert/Edit Form Element TEXTAREA": "",
-            "Javascript for button click": "",
-            "Label:": "",
-            "Legend:": "",
-            "Max length:": "",
-            "Maximum number of characters accepted": "",
-            "Method:": "",
-            "multipart Form Data (File-Upload)": "",
-            "Name": "",
-            "Name of the form input": "",
-            "Name of the form select": "",
-            "name of the textarea": "",
-            "Name/ID:": "",
-            "normal": "",
-            "nowrap": "",
-            "Off": "",
-            "Physical": "",
-            "Please enter a Label": "",
-            "Post": "",
-            "pre": "",
-            "Read Only": "",
-            "Rows:": "",
-            "Size of text box in characters": "",
-            "Size:": "",
-            "Soft": "",
-            "Tab Index:": "",
-            "Target Frame:": "",
-            "Text:": "",
-            "URL of image": "",
-            "Value of the form input": "",
-            "Value:": "",
-            "Virtual": "",
-            "Width in number of characters": "",
-            "Wrap Mode:": "",
-            "You must enter a Name": "",
-            "Options": "<<FindReplace>>"
-        },
-        "FullPage": {
-            "...": "",
-            "Alternate style-sheet:": "",
-            "Background color:": "",
-            "Character set:": "",
-            "cyrillic (ISO-8859-5)": "",
-            "cyrillic (KOI8-R)": "",
-            "cyrillic (WINDOWS-1251)": "",
-            "Description:": "",
-            "DOCTYPE:": "",
-            "Document properties": "",
-            "Document title:": "",
-            "Keywords:": "",
-            "Primary style-sheet:": "",
-            "Text color:": "",
-            "UTF-8 (recommended)": "",
-            "western (ISO-8859-1)": ""
-        },
-        "FullScreen": {
-            "Maximize/Minimize Editor": ""
-        },
-        "Gecko": {
-            "The Paste button does not work in this browser for security reasons. Press CTRL-V on your keyboard to paste directly.": ""
-        },
-        "HorizontalRule": {
-            "&#x00d7;": "",
-            "&nbsp;": "",
-            "Alignment:": "",
-            "Center": "",
-            "Color:": "",
-            "Height:": "",
-            "Insert/edit horizontal rule": "",
-            "Insert/Edit Horizontal Rule": "",
-            "Layout": "",
-            "Left": "",
-            "No shading": "",
-            "percent": "",
-            "pixels": "",
-            "Right": "",
-            "Style": "",
-            "Width:": ""
-        },
-        "InlineStyler": {
-            "Background": "",
-            "Baseline": "",
-            "Border": "",
-            "Bottom": "",
-            "Char": "",
-            "Collapsed borders": "",
-            "CSS Style": "",
-            "FG Color": "",
-            "Float": "",
-            "Justify": "",
-            "Margin": "",
-            "Middle": "",
-            "None": "",
-            "Padding": "",
-            "Text align": "",
-            "Top": "",
-            "Vertical align": "",
-            "-": "<<Equation>>",
-            "Center": "<<HorizontalRule>>",
-            "Height": "<<HorizontalRule>>",
-            "Image URL": "<<Forms>>",
-            "Layout": "<<HorizontalRule>>",
-            "Left": "<<HorizontalRule>>",
-            "percent": "<<HorizontalRule>>",
-            "pixels": "<<HorizontalRule>>",
-            "Right": "<<HorizontalRule>>",
-            "Width": "<<HorizontalRule>>"
-        },
-        "InsertAnchor": {
-            "Anchor name": "",
-            "Insert Anchor": "",
-            "Delete": "<<Abbreviation>>"
-        },
-        "InsertImage": {
-            "Absbottom": "",
-            "Absmiddle": "",
-            "Alternate text:": "",
-            "Border thickness:": "",
-            "Enter the image URL here": "",
-            "For browsers that don't support images": "",
-            "Horizontal padding": "",
-            "Horizontal:": "",
-            "Image Preview:": "",
-            "Insert Image": "",
-            "Leave empty for no border": "",
-            "Not set": "",
-            "Positioning of this image": "",
-            "Preview the image in a new window": "",
-            "Spacing": "",
-            "Texttop": "",
-            "Vertical padding": "",
-            "Vertical:": "",
-            "You must enter the URL": "",
-            "Alignment:": "<<HorizontalRule>>",
-            "Baseline": "<<InlineStyler>>",
-            "Bottom": "<<InlineStyler>>",
-            "Image URL:": "<<Forms>>",
-            "Layout": "<<HorizontalRule>>",
-            "Left": "<<HorizontalRule>>",
-            "Middle": "<<InlineStyler>>",
-            "Preview": "<<Equation>>",
-            "Right": "<<HorizontalRule>>",
-            "Top": "<<InlineStyler>>"
-        },
-        "InsertNote": {
-            "Insert": "",
-            "Insert footnote": "",
-            "Insert Note": ""
-        },
-        "InsertPagebreak": {
-            "Page break": "",
-            "Page Break": ""
-        },
-        "InsertSmiley": {
-            "Insert Smiley": ""
-        },
-        "InsertSnippet": {
-            "\\n  This is an information about something\\n": "",
-            "Hide preview": "",
-            "Insert as": "",
-            "Insert Snippet": "",
-            "InsertSnippet for Xinha": "",
-            "Link1": "",
-            "Link2": "",
-            "Link3": "",
-            "Link4": "",
-            "Link5": "",
-            "Show preview": "",
-            "This is an information about something": "",
-            "Variable": ""
-        },
-        "InsertSnippet2": {
-            "All Categories": "",
-            "Filter": "",
-            "Insert as HTML": "",
-            "Insert as template variable": "",
-            "Only search word beginning": "",
-            "HTML": "<<CharCounter>>",
-            "Insert Snippet": "<<InsertSnippet>>",
-            "InsertSnippet for Xinha": "<<InsertSnippet>>",
-            "Variable": "<<InsertSnippet>>"
-        },
-        "InsertTable": {
-            "Caption": "",
-            "Caption for the table": "",
-            "Cell padding:": "",
-            "Cell spacing:": "",
-            "Collapse borders:": "",
-            "Cols:": "",
-            "Em": "",
-            "Fixed width columns": "",
-            "Layou": "",
-            "Number of columns": "",
-            "Number of rows": "",
-            "Positioning of this table": "",
-            "Space between adjacent cells": "",
-            "Space between content and border in cell": "",
-            "Style of the border": "",
-            "Width of the table": "",
-            "Width unit": "",
-            "You must enter a number of columns": "",
-            "You must enter a number of rows": "",
-            "Absbottom": "<<InsertImage>>",
-            "Absmiddle": "<<InsertImage>>",
-            "Alignment:": "<<HorizontalRule>>",
-            "Baseline": "<<InlineStyler>>",
-            "Border": "<<InlineStyler>>",
-            "Border thickness:": "<<InsertImage>>",
-            "Bottom": "<<InlineStyler>>",
-            "Layout": "<<HorizontalRule>>",
-            "Leave empty for no border": "<<InsertImage>>",
-            "Left": "<<HorizontalRule>>",
-            "Middle": "<<InlineStyler>>",
-            "Not set": "<<InsertImage>>",
-            "Percent": "<<HorizontalRule>>",
-            "Pixels": "<<HorizontalRule>>",
-            "Right": "<<HorizontalRule>>",
-            "Rows:": "<<Forms>>",
-            "Spacing": "<<InsertImage>>",
-            "Texttop": "<<InsertImage>>",
-            "Top": "<<InlineStyler>>",
-            "Width:": "<<HorizontalRule>>"
-        },
-        "LangMarks": {
-            "&mdash; language &mdash;": "",
-            "', '": "",
-            "English": "",
-            "French": "",
-            "Greek": "",
-            "language select": "",
-            "Latin": ""
-        },
-        "Linker": {
-            "(px)": "",
-            "Anchor-Link": "",
-            "Anchor:": "",
-            "Email Address:": "",
-            "Email Link": "",
-            "Location Bar:": "",
-            "Menu Bar:": "",
-            "Message Template:": "",
-            "New Window": "",
-            "Ordinary Link": "",
-            "Popup Window": "",
-            "PopupWindow": "",
-            "Remove Link": "",
-            "Resizeable:": "",
-            "Same Window (jump out of frames)": "",
-            "Scrollbars:": "",
-            "Shows On Hover": "",
-            "Status Bar:": "",
-            "Subject:": "",
-            "Title:": "",
-            "Toolbar:": "",
-            "URL Link": "",
-            "You must select some text before making a new link.": "",
-            "Are you sure you wish to remove this link?": "<<CreateLink>>",
-            "Name:": "<<Forms>>",
-            "Size:": "<<Forms>>"
-        },
-        "ListType": {
-            "Choose list style type (for ordered lists)": "",
-            "Decimal numbers": "",
-            "Lower greek letters": "",
-            "Lower latin letters": "",
-            "Lower roman numbers": "",
-            "Upper latin letters": "",
-            "Upper roman numbers": ""
-        },
-        "MootoolsFileManager": {
-            "Insert File Link": "",
-            "You must select some text before making a new link.": "<<Linker>>"
-        },
-        "Opera": {
-            "MARK": "",
-            "The Paste button does not work in Mozilla based web browsers (technical security reasons). Press CTRL-V on your keyboard to paste directly.": ""
-        },
-        "PasteText": {
-            "Insert text in new paragraph": "",
-            "Paste as Plain Text": ""
-        },
-        "PreserveScripts": {
-            "JavaScript": "",
-            "PHP": ""
-        },
-        "QuickTag": {
-            "',\r\n                           'cl': '": "",
-            "ATTRIBUTES": "",
-            "Colors": "",
-            "Enter the TAG you want to insert": "",
-            "No CSS class avaiable": "",
-            "Ok": "",
-            "OPTIONS": "",
-            "Quick Tag Editor": "",
-            "TAGs": "",
-            "There are some unclosed quote": "",
-            "This attribute already exists in the TAG": "",
-            "You have to select some text": ""
-        },
-        "SaveSubmit": {
-            "in progress": "",
-            "Ready": "",
-            "Save": "",
-            "Saving...": ""
-        },
-        "SetId": {
-            "ID/Name:": "",
-            "Set Id and Name": "",
-            "Set Id/Name": "",
-            "Set ID/Name": "",
-            "Delete": "<<Abbreviation>>"
-        },
-        "SmartReplace": {
-            "ClosingDoubleQuotes": "",
-            "ClosingSingleQuote": "",
-            "Convert all quotes and dashes in the current document": "",
-            "Enable automatic replacements": "",
-            "OpeningDoubleQuotes": "",
-            "OpeningSingleQuote": "",
-            "SmartReplace": "",
-            "SmartReplace Settings": ""
-        },
-        "Stylist": {
-            "Styles": ""
-        },
-        "SuperClean": {
-            "Clean bad HTML from Microsoft Word.": "",
-            "Clean Selection Only": "",
-            "Clean up HTML": "",
-            "Cleaning Scope": "",
-            "General tidy up and correction of some problems.": "",
-            "Please select from the following cleaning options...": "",
-            "Please stand by while cleaning in process...": "",
-            "Remove alignment (left/right/justify).": "",
-            "Remove all classes (CSS).": "",
-            "Remove All HTML Tags": "",
-            "Remove all styles (CSS).": "",
-            "Remove custom font sizes.": "",
-            "Remove custom text colors.": "",
-            "Remove custom typefaces (font \"styles\").": "",
-            "Remove emphasis and annotations.": "",
-            "Remove lang attributes.": "",
-            "Remove Paragraphs": "",
-            "Remove superscripts and subscripts.": "",
-            "Replace directional quote marks with non-directional quote marks.": "",
-            "Vigorously purge HTML from Microsoft Word.": ""
-        },
-        "TableOperations": {
-            "All four sides": "",
-            "Borders": "",
-            "Cell properties": "",
-            "Cell Properties": "",
-            "Cell Type:": "",
-            "Cells down": "",
-            "Cells to the right, and": "",
-            "Delete cell": "",
-            "Delete column": "",
-            "Delete row": "",
-            "Do Not Change": "",
-            "Frame and borders": "",
-            "Frames": "",
-            "Header (th)": "",
-            "Insert cell after": "",
-            "Insert cell before": "",
-            "Insert column after": "",
-            "Insert column before": "",
-            "Insert row after": "",
-            "Insert row before": "",
-            "Merge cells": "",
-            "Merge current cell with:": "",
-            "No rules": "",
-            "No sides": "",
-            "Normal (td)": "",
-            "Please click into some cell": "",
-            "Row properties": "",
-            "Row Properties": "",
-            "Rules will appear between all rows and columns": "",
-            "Rules will appear between columns only": "",
-            "Rules will appear between rows only": "",
-            "Spacing and padding": "",
-            "Split column": "",
-            "Split row": "",
-            "Summary": "",
-            "Table properties": "",
-            "Table Properties": "",
-            "The bottom side only": "",
-            "The left-hand side only": "",
-            "The right and left sides only": "",
-            "The right-hand side only": "",
-            "The top and bottom sides only": "",
-            "The top side only": "",
-            "Xinha cowardly refuses to delete the last cell in row.": "",
-            "Xinha cowardly refuses to delete the last column in table.": "",
-            "Xinha cowardly refuses to delete the last row in table.": "",
-            "Caption": "<<InsertTable>>",
-            "Columns": "<<Forms>>",
-            "Description": "<<FullPage>>",
-            "Merge Cells": "<<ContextMenu>>",
-            "Padding": "<<InlineStyler>>",
-            "pixels": "<<HorizontalRule>>",
-            "Rows": "<<Forms>>",
-            "Spacing": "<<InsertImage>>"
-        },
-        "UnsavedChanges": {
-            "You have unsaved changes in the editor": ""
-        },
-        "WebKit": {
-            "The Paste button does not work in this browser for security reasons. Press CTRL-V on your keyboard to paste directly.": "<<Gecko>>"
-        },
-        "Xinha": {
-            "&#8212; font &#8212;": "",
-            "&#8212; format &#8212;": "",
-            "&#8212; size &#8212;": "",
-            "1 (8 pt)": "",
-            "2 (10 pt)": "",
-            "3 (12 pt)": "",
-            "4 (14 pt)": "",
-            "5 (18 pt)": "",
-            "6 (24 pt)": "",
-            "7 (36 pt)": "",
-            "Address": "",
-            "Arial": "",
-            "Clean content pasted from Word": "",
-            "Clear Inline Font Specifications": "",
-            "Clear MSOffice tags": "",
-            "Close": "",
-            "Constructing object": "",
-            "Courier New": "",
-            "Create Statusbar": "",
-            "Create Toolbar": "",
-            "CTRL-0 (zero)": "",
-            "CTRL-1 .. CTRL-6": "",
-            "CTRL-A": "",
-            "CTRL-B": "",
-            "CTRL-C": "",
-            "CTRL-E": "",
-            "CTRL-I": "",
-            "CTRL-J": "",
-            "CTRL-L": "",
-            "CTRL-N": "",
-            "CTRL-R": "",
-            "CTRL-S": "",
-            "CTRL-U": "",
-            "CTRL-V": "",
-            "CTRL-X": "",
-            "CTRL-Y": "",
-            "CTRL-Z": "",
-            "Editor Help": "",
-            "ENTER": "",
-            "Error Loading Xinha.  Developers, check the Error Console for information.": "",
-            "Finishing": "",
-            "Formatted": "",
-            "Generate Xinha framework": "",
-            "Georgia": "",
-            "Heading 1": "",
-            "Heading 2": "",
-            "Heading 3": "",
-            "Heading 4": "",
-            "Heading 5": "",
-            "Heading 6": "",
-            "Headings": "",
-            "Impact": "",
-            "Init editor size": "",
-            "insert linebreak": "",
-            "Insert/Overwrite": "",
-            "Keyboard shortcuts": "",
-            "Loading Core": "",
-            "Loading in progress. Please wait!": "",
-            "Loading plugin $plugin": "",
-            "Loading plugins": "",
-            "MS Word Cleaner": "",
-            "new paragraph": "",
-            "Normal": "",
-            "Print document": "",
-            "Register plugin $plugin": "",
-            "Remove formatting": "",
-            "Save as": "",
-            "Select all": "",
-            "Select Color": "",
-            "Set format to paragraph": "",
-            "SHIFT-ENTER": "",
-            "Split Block": "",
-            "Tahoma": "",
-            "The editor provides the following key combinations:": "",
-            "Times New Roman": "",
-            "Toggle Borders": "",
-            "Touch here first to activate editor.": "",
-            "Verdana": "",
-            "Waiting for Iframe to load...": "",
-            "WingDings": "",
-            "Would you like to clear font colours?": "",
-            "Would you like to clear font sizes?": "",
-            "Would you like to clear font typefaces?": "",
-            "Xinha": ""
-        },
-        "BackgroundImage": {
-            "__ TRANSLATOR NOTE __": "*** BACKGROUNDIMAGE IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***",
-            "Remove Current Background": "",
-            "Set Background": "",
-            "Set page background image": "",
-            "Set Page Background Image": ""
-        },
-        "ClientsideSpellcheck": {
-            "__ TRANSLATOR NOTE __": "*** CLIENTSIDESPELLCHECK IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***",
-            "Spell Check using ieSpell": ""
-        },
-        "ExtendedFileManager": {
-            "__ TRANSLATOR NOTE __": "*** EXTENDEDFILEMANAGER IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***",
-            "10%": "",
-            "100%": "",
-            "200%": "",
-            "25%": "",
-            "50%": "",
-            "75%": "",
-            ">List View": "",
-            ">Thumbnail View": "",
-            "A:": "",
-            "Align": "",
-            "Alt": "",
-            "Border Color": "",
-            "Constrain Proportions": "",
-            "Crop": "",
-            "D:": "",
-            "Directory": "",
-            "Directory Up": "",
-            "Edit": "",
-            "File List": "",
-            "File Manager": "",
-            "Filename:": "",
-            "Filesize:": "",
-            "Flip Horizontal": "",
-            "Flip Image": "",
-            "Flip Vertical": "",
-            "Folder": "",
-            "GIF": "",
-            "GIF format is not supported, image editing not supported.": "",
-            "H:": "",
-            "Image Editor": "",
-            "Image Selection": "",
-            "Invalid base directory:": "",
-            "JPEG High": "",
-            "JPEG Low": "",
-            "JPEG Medium": "",
-            "Loading": "",
-            "Lock": "",
-            "Marker": "",
-            "Maximum folder size limit reached. Upload disabled.": "",
-            "Measure": "",
-            "New Folder": "",
-            "No Files Found": "",
-            "No Image Available": "",
-            "Please enter value": "",
-            "PNG": "",
-            "Preset": "",
-            "Quality:": "",
-            "Refresh": "",
-            "Rename": "",
-            "Resize": "",
-            "Rotate": "",
-            "Rotate 180 &deg;": "",
-            "Rotate 90 &deg; CCW": "",
-            "Rotate 90 &deg; CW": "",
-            "Rotate Image": "",
-            "Start X:": "",
-            "Start Y:": "",
-            "Target Window": "",
-            "Toggle marker color": "",
-            "Trash": "",
-            "Upload": "",
-            "W:": "",
-            "X:": "",
-            "Xinha Image Editor": "",
-            "Y:": "",
-            "Zoom": "",
-            "Absbottom": "<<InsertImage>>",
-            "Absmiddle": "<<InsertImage>>",
-            "Baseline": "<<InlineStyler>>",
-            "Border": "<<InlineStyler>>",
-            "Bottom": "<<InlineStyler>>",
-            "Clear": "<<FindReplace>>",
-            "Color": "<<HorizontalRule>>",
-            "Copy": "<<ContextMenu>>",
-            "Cut": "<<ContextMenu>>",
-            "Height": "<<HorizontalRule>>",
-            "Height:": "<<HorizontalRule>>",
-            "Insert File Link": "<<MootoolsFileManager>>",
-            "Left": "<<HorizontalRule>>",
-            "Margin": "<<InlineStyler>>",
-            "Middle": "<<InlineStyler>>",
-            "Not set": "<<InsertImage>>",
-            "Padding": "<<InlineStyler>>",
-            "Positioning of this image": "<<InsertImage>>",
-            "Preview": "<<Equation>>",
-            "Right": "<<HorizontalRule>>",
-            "Save": "<<SaveSubmit>>",
-            "Texttop": "<<InsertImage>>",
-            "Top": "<<InlineStyler>>",
-            "Width": "<<HorizontalRule>>",
-            "Width:": "<<HorizontalRule>>",
-            "You must select some text before making a new link.": "<<Linker>>"
-        },
-        "Filter": {
-            "__ TRANSLATOR NOTE __": "*** FILTER IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***",
-            "Filter": "<<InsertSnippet2>>"
-        },
-        "HtmlTidy": {
-            "__ TRANSLATOR NOTE __": "*** HTMLTIDY IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***",
-            "Auto-Tidy": "",
-            "Don't Tidy": "",
-            "HTML Tidy": "",
-            "Tidy failed.  Check your HTML for syntax errors.": ""
-        },
-        "ImageManager": {
-            "__ TRANSLATOR NOTE __": "*** IMAGEMANAGER IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***",
-            "Angle:": "",
-            "Flickr Picture List": "",
-            "Flickr Pictures": "",
-            "Flickr Selection": "",
-            "Flickr Username/Email": "",
-            "Folder Name:": "",
-            "Image Format": "",
-            "Image List": "",
-            "Keyword": "",
-            "No Images Found": "",
-            "No Photos Found": "",
-            "No Videos Found": "",
-            "This Server": "",
-            "YouTube Selection": "",
-            "YouTube Username": "",
-            "YouTube Video List": "",
-            "YouTube Videos": "",
-            "A:": "<<ExtendedFileManager>>",
-            "Absbottom": "<<InsertImage>>",
-            "Absmiddle": "<<InsertImage>>",
-            "Baseline": "<<InlineStyler>>",
-            "Bottom": "<<InlineStyler>>",
-            "Clear": "<<FindReplace>>",
-            "Constrain Proportions": "<<ExtendedFileManager>>",
-            "Crop": "<<ExtendedFileManager>>",
-            "D:": "<<ExtendedFileManager>>",
-            "Directory": "<<ExtendedFileManager>>",
-            "Directory Up": "<<ExtendedFileManager>>",
-            "Edit": "<<ExtendedFileManager>>",
-            "Filename:": "<<ExtendedFileManager>>",
-            "Flip Horizontal": "<<ExtendedFileManager>>",
-            "Flip Image": "<<ExtendedFileManager>>",
-            "Flip Vertical": "<<ExtendedFileManager>>",
-            "GIF": "<<ExtendedFileManager>>",
-            "GIF format is not supported, image editing not supported.": "<<ExtendedFileManager>>",
-            "H:": "<<ExtendedFileManager>>",
-            "Height:": "<<HorizontalRule>>",
-            "Image Editor": "<<ExtendedFileManager>>",
-            "Image Selection": "<<ExtendedFileManager>>",
-            "Insert Image": "<<InsertImage>>",
-            "Invalid base directory:": "<<ExtendedFileManager>>",
-            "JPEG High": "<<ExtendedFileManager>>",
-            "JPEG Low": "<<ExtendedFileManager>>",
-            "JPEG Medium": "<<ExtendedFileManager>>",
-            "Left": "<<HorizontalRule>>",
-            "Lock": "<<ExtendedFileManager>>",
-            "Marker": "<<ExtendedFileManager>>",
-            "Measure": "<<ExtendedFileManager>>",
-            "Middle": "<<InlineStyler>>",
-            "New Folder": "<<ExtendedFileManager>>",
-            "No Image Available": "<<ExtendedFileManager>>",
-            "Not set": "<<InsertImage>>",
-            "PNG": "<<ExtendedFileManager>>",
-            "Positioning of this image": "<<InsertImage>>",
-            "Quality:": "<<ExtendedFileManager>>",
-            "Refresh": "<<ExtendedFileManager>>",
-            "Resize": "<<ExtendedFileManager>>",
-            "Right": "<<HorizontalRule>>",
-            "Rotate": "<<ExtendedFileManager>>",
-            "Rotate 180 &deg;": "<<ExtendedFileManager>>",
-            "Rotate 90 &deg; CCW": "<<ExtendedFileManager>>",
-            "Rotate 90 &deg; CW": "<<ExtendedFileManager>>",
-            "Rotate Image": "<<ExtendedFileManager>>",
-            "Save": "<<SaveSubmit>>",
-            "Start X:": "<<ExtendedFileManager>>",
-            "Start Y:": "<<ExtendedFileManager>>",
-            "Texttop": "<<InsertImage>>",
-            "Top": "<<InlineStyler>>",
-            "Trash": "<<ExtendedFileManager>>",
-            "W:": "<<ExtendedFileManager>>",
-            "Width:": "<<HorizontalRule>>",
-            "X:": "<<ExtendedFileManager>>",
-            "Y:": "<<ExtendedFileManager>>"
-        },
-        "InsertMarquee": {
-            "__ TRANSLATOR NOTE __": "*** INSERTMARQUEE IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***",
-            "Alternate": "",
-            "Background-Color:": "",
-            "Behavior:": "",
-            "Continuous": "",
-            "Direction:": "",
-            "Insert scrolling marquee": "",
-            "Marquee Editor": "",
-            "Scroll Amount:": "",
-            "Scroll Delay:": "",
-            "Slide": "",
-            "Speed Control": "",
-            "Height:": "<<HorizontalRule>>",
-            "Left": "<<HorizontalRule>>",
-            "Name": "<<Forms>>",
-            "Name/ID:": "<<Forms>>",
-            "Right": "<<HorizontalRule>>",
-            "Text:": "<<Forms>>",
-            "Width:": "<<HorizontalRule>>"
-        },
-        "InsertPicture": {
-            "__ TRANSLATOR NOTE __": "*** INSERTPICTURE IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***",
-            "Leave empty for not defined": "",
-            "Open file in new window": "",
-            " Open file in new window": "",
-            "Upload file": "",
-            "Absbottom": "<<InsertImage>>",
-            "Absmiddle": "<<InsertImage>>",
-            "Alignment:": "<<HorizontalRule>>",
-            "Alternate text:": "<<InsertImage>>",
-            "Baseline": "<<InlineStyler>>",
-            "Border thickness:": "<<InsertImage>>",
-            "Bottom": "<<InlineStyler>>",
-            "Enter the image URL here": "<<InsertImage>>",
-            "For browsers that don't support images": "<<InsertImage>>",
-            "Height:": "<<HorizontalRule>>",
-            "Horizontal padding": "<<InsertImage>>",
-            "Horizontal:": "<<InsertImage>>",
-            "Image Preview:": "<<InsertImage>>",
-            "Image URL:": "<<Forms>>",
-            "Insert Image": "<<InsertImage>>",
-            "Layout": "<<HorizontalRule>>",
-            "Leave empty for no border": "<<InsertImage>>",
-            "Left": "<<HorizontalRule>>",
-            "Middle": "<<InlineStyler>>",
-            "Not set": "<<InsertImage>>",
-            "Positioning of this image": "<<InsertImage>>",
-            "Preview": "<<Equation>>",
-            "Preview the image in a new window": "<<InsertImage>>",
-            "Right": "<<HorizontalRule>>",
-            "Size": "<<Forms>>",
-            "Spacing": "<<InsertImage>>",
-            "Texttop": "<<InsertImage>>",
-            "Top": "<<InlineStyler>>",
-            "Vertical padding": "<<InsertImage>>",
-            "Vertical:": "<<InsertImage>>",
-            "Width:": "<<HorizontalRule>>"
-        },
-        "NoteServer": {
-            "__ TRANSLATOR NOTE __": "*** NOTESERVER IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***",
-            "120%": "",
-            "150%": "",
-            "80%": "",
-            "Add GUIDO Code in a textbox on the page": "",
-            "Add MIDI link to allow students to hear the music": "",
-            "Format": "",
-            "GUIDO Code": "",
-            "Guido code": "",
-            "Image in applet": "",
-            "Insert GUIDO Music Notation": "",
-            "MIDI File": "",
-            "Source Code": "",
-            "With Mozilla, the applet will not be visible in editor, but only in Web page after submitting.": "",
-            "Zoom :": "",
-            "100%": "<<ExtendedFileManager>>",
-            "Image Preview": "<<InsertImage>>",
-            "Options": "<<FindReplace>>",
-            "Preview": "<<Equation>>",
-            "Preview the image in a new window": "<<InsertImage>>",
-            "Zoom": "<<ExtendedFileManager>>"
-        },
-        "PSLocal": {
-            "__ TRANSLATOR NOTE __": "*** PSLOCAL IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***",
-            "Confirm": "",
-            "Enable": "",
-            "Enable Gears in order to use local document storage and configuration.": "",
-            "Enabling Local Storage": "",
-            "Install": "",
-            "Learn About Local Storage": "",
-            "This will reload the page, causing you to lose any unsaved work.  Press \"OK\" to reload.": "",
-            "Xinha uses Google Gears to enable local document storage.  With Gears installed, you can save drafts of your documents on your hard drive, configure Xinha to look the way you want, and carry this information wherever you use Xinha on the web.": ""
-        },
-        "PSServer": {
-            "__ TRANSLATOR NOTE __": "*** PSSERVER IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***",
-            "File: ": "",
-            "Import": ""
-        },
-        "PersistentStorage": {
-            "__ TRANSLATOR NOTE __": "*** PERSISTENTSTORAGE IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***",
-            "Details": "",
-            "File Browser": "",
-            "Hello    There C ": "",
-            "Hello  There A ": "",
-            "Hello \" There B \"": "",
-            "Hello ' There D '": "",
-            "List of Places": "",
-            "New Document": "",
-            "Open": "",
-            "Open Document": "",
-            "Places": "",
-            "Please enter the name of the directory you'd like to create.": "",
-            "Save Document": "",
-            "This will erase any unsaved content.  If you're certain, please click OK to continue.": "",
-            "Web URL": "",
-            "Confirm": "<<PSLocal>>",
-            "Copy": "<<ContextMenu>>",
-            "Delete": "<<Abbreviation>>",
-            "Directory Up": "<<ExtendedFileManager>>",
-            "File List": "<<ExtendedFileManager>>",
-            "File Manager": "<<ExtendedFileManager>>",
-            "Filename": "<<ExtendedFileManager>>",
-            "Insert": "<<InsertNote>>",
-            "Insert Image": "<<InsertImage>>",
-            "New Folder": "<<ExtendedFileManager>>",
-            "Save": "<<SaveSubmit>>",
-            "You must select some text before making a new link.": "<<Linker>>"
-        },
-        "SpellChecker": {
-            "__ TRANSLATOR NOTE __": "*** SPELLCHECKER IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***",
-            "HTMLArea Spell Checker": "",
-            "Info": "",
-            "Learn": "",
-            "pliz weit ;-)": "",
-            "Revert": "",
-            "Spell Checker": ""
-        },
-        "Template": {
-            "__ TRANSLATOR NOTE __": "*** TEMPLATE IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***",
-            "Insert template": ""
-        },
-        "UnFormat": {
-            "__ TRANSLATOR NOTE __": "*** UNFORMAT IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***",
-            "All": "",
-            "All HTML:": "",
-            "Cleaning Area": "",
-            "Cleaning options": "",
-            "Formatting:": "",
-            "Page Cleaner": "",
-            "Select which types of formatting you would like to remove.": "",
-            "Selection": ""
-        }
-    }
-}
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/lang/merged/it.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/lang/merged/it.js
deleted file mode 100644
index 0bc14b2..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/lang/merged/it.js
+++ /dev/null
@@ -1,1572 +0,0 @@
-// Xinha Language Combined Translation File
-//
-// LANG: "it", ENCODING: UTF-8
-//
-// INSTRUCTIONS TO TRANSLATORS
-// ===========================================================================
-//
-// Your translation must be in UTF-8 Character Encoding.
-//
-// This is a JSON encoded file (plus comments), strings should be double-quote
-// only, do not use single quotes to surround strings - "hello", not 'hello'
-// do not have a trailing comma after the last entry in a section.
-//
-// Only full line comments are allowed (that a comments occupy entire lines).
-//
-// Search for the __NEW_TRANSLATIONS__ section below, this is where you will
-// want to focus, this section includes things that do not presently have a 
-// translation or for which the translation needs to be checked for accuracy.
-//
-// In the New Translations section a translation string is one of the following
-//
-//  "English String Here" : ""
-//     This means it is not translated yet, add your translation...
-//     "English String Here" : "Klingon String Here"
-//
-//  "English String Here" : "Translated String Here"
-//     This means that an existing translation for this string, in some other
-//     section has been found, and used.  Check that it is approprite for this
-//     section and if it is, that's fine leave it as is, otherwise change as
-//     appropriate.
-//
-//  "English String Here" : "<<AnotherSection>>"
-//     This means use the same translation for this string as <<AnotherSection>>
-//     this saves you re-tranlating strings.  If the Context of this section
-//     and the context of AnotherSection seem the same, that's fine leave it
-//     using that translation, but if this section needs a different translation, 
-//     you can provide it by replacing the link (<<AnotherSection>>) with that
-//     new translation.  For example - a "Table" in say "DataPlugin" is 
-//     perhaps translated differently to "Table" in "FurniturePlugin".
-//
-// TESTING YOUR TRANSLATION
-// ===========================================================================
-// Simply place your translation file on your webserver somewhere for example
-//
-//   /xinha/lang/merged/it.js
-//
-// and then tell Xinha where to get it (before loading XinhaCore.js) by 
-//
-//  _editor_lang              = 'it';
-//  _editor_lang_merged_file  = '/xinha/lang/merged/it.js';
-//
-// Xinha will load your new language definition.
-//
-// SUBMITTING YOUR TRANSLATION
-// ===========================================================================
-// Simply create a Ticket on the Xinha website and attach your translation 
-// file.
-//
-// The Xinha developers will take your file and use the 
-//     contrib/lc_split_merged_file.php
-// script to load it into the Xinha distribution.
-
-{
-    "Abbreviation": {
-        "Cancel": "Annullamento",
-        "OK": "OK"
-    },
-    "AboutBox": {
-        "About this editor": "Informazioni su Xinha"
-    },
-    "BackgroundImage": {
-        "Cancel": "Annullamento"
-    },
-    "CharacterMap": {
-        "Insert special character": "Inserisca il carattere speciale"
-    },
-    "ColorPicker": {
-        "Color: ": "Colore",
-        "OK": "OK"
-    },
-    "ContextMenu": {
-        "Justify Center": "Centrato",
-        "Justify Full": "Giustificato",
-        "Justify Left": "Sinistra",
-        "Justify Right": "Destra"
-    },
-    "CreateLink": {
-        "Cancel": "Annullamento",
-        "Insert/Modify Link": "Inserisci/modifica link",
-        "New window (_blank)": "Nuova finestra (_blank)",
-        "None (use implicit)": "Niente (usa implicito)",
-        "OK": "OK",
-        "Other": "Altro",
-        "Same frame (_self)": "Stessa frame (_self)",
-        "Target:": "Target:",
-        "Title (tooltip):": "Title (suggerimento):",
-        "Top frame (_top)": "Pagina intera (_top)",
-        "URL:": "URL:"
-    },
-    "EditTag": {
-        "Cancel": "Annullamento",
-        "OK": "OK"
-    },
-    "Equation": {
-        "Cancel": "Annullamento",
-        "OK": "OK"
-    },
-    "ExtendedFileManager": {
-        "Align": "Allinea",
-        "Baseline": "Allineamento",
-        "Border": "Bordo",
-        "Bottom": "Basso",
-        "Cancel": "Annullamento",
-        "Color": "Colore",
-        "Height": "Altezza",
-        "Height:": "Altezza",
-        "Left": "Sinistra",
-        "Margin": "Margine",
-        "Middle": "Centrale",
-        "New window (_blank)": "Nuova finestra (_blank)",
-        "None (use implicit)": "Niente (usa implicito)",
-        "OK": "OK",
-        "Padding": "Padding",
-        "Right": "Destra",
-        "Same frame (_self)": "Stessa frame (_self)",
-        "Title (tooltip)": "Title (suggerimento):",
-        "Top": "Alto",
-        "Top frame (_top)": "Pagina intera (_top)",
-        "Width": "Larghezza",
-        "Width:": "Larghezza"
-    },
-    "Forms": {
-        "Cancel": "Annullamento",
-        "Image URL:": "URL dell'Immagine",
-        "OK": "OK"
-    },
-    "FullPage": {
-        "Cancel": "Annullamento",
-        "Description:": "Descrizione",
-        "OK": "OK"
-    },
-    "HorizontalRule": {
-        "Cancel": "Annullamento",
-        "Center": "Centra",
-        "Color:": "Colore",
-        "Height:": "Altezza",
-        "Horizontal Rule": "Righello orizzontale",
-        "Layout": "Layout",
-        "Left": "Sinistra",
-        "OK": "OK",
-        "Right": "Destra",
-        "Width:": "Larghezza",
-        "percent": "percento",
-        "pixels": "pixels"
-    },
-    "ImageManager": {
-        "Baseline": "Allineamento",
-        "Bottom": "Basso",
-        "Cancel": "Annullamento",
-        "Height:": "Altezza",
-        "Left": "Sinistra",
-        "Middle": "Centrale",
-        "OK": "OK",
-        "Right": "Destra",
-        "Top": "Alto",
-        "Width:": "Larghezza"
-    },
-    "InlineStyler": {
-        "Background": "Sfondo",
-        "Baseline": "Allineamento",
-        "Border": "Bordo",
-        "Bottom": "Basso",
-        "Center": "Centra",
-        "Char": "Carattere",
-        "Collapsed borders": "Bordi chiusi",
-        "FG Color": "Colore Principale",
-        "Float": "Fluttuante",
-        "Height": "Altezza",
-        "Image URL": "URL dell'Immagine",
-        "Justify": "Justifica",
-        "Layout": "Layout",
-        "Left": "Sinistra",
-        "Margin": "Margine",
-        "Middle": "Centrale",
-        "None": "Nulla",
-        "Padding": "Padding",
-        "Right": "Destra",
-        "Text align": "Allineamento del Testo",
-        "Top": "Alto",
-        "Vertical align": "Allineamento verticale",
-        "Width": "Larghezza",
-        "percent": "percento",
-        "pixels": "pixels"
-    },
-    "InsertAnchor": {
-        "Cancel": "Annullamento",
-        "OK": "OK"
-    },
-    "InsertImage": {
-        "Baseline": "Allineamento",
-        "Bottom": "Basso",
-        "Cancel": "Annullamento",
-        "Image URL:": "URL dell'Immagine",
-        "Layout": "Layout",
-        "Left": "Sinistra",
-        "Middle": "Centrale",
-        "OK": "OK",
-        "Right": "Destra",
-        "Spacing": "Spaziatura",
-        "Top": "Alto"
-    },
-    "InsertMarquee": {
-        "Cancel": "Annullamento",
-        "Height:": "Altezza",
-        "Insert scrolling marquee": "Inserisca marquee",
-        "Left": "Sinistra",
-        "OK": "OK",
-        "Right": "Destra",
-        "Width:": "Larghezza"
-    },
-    "InsertNote": {
-        "Cancel": "Annullamento"
-    },
-    "InsertPicture": {
-        "Baseline": "Allineamento",
-        "Bottom": "Basso",
-        "Cancel": "Annullamento",
-        "Height:": "Altezza",
-        "Image URL:": "URL dell'Immagine",
-        "Layout": "Layout",
-        "Left": "Sinistra",
-        "Middle": "Centrale",
-        "OK": "OK",
-        "Right": "Destra",
-        "Spacing": "Spaziatura",
-        "Top": "Alto",
-        "Width:": "Larghezza"
-    },
-    "InsertSnippet": {
-        "Cancel": "Annullamento"
-    },
-    "InsertSnippet2": {
-        "Cancel": "Annullamento"
-    },
-    "InsertTable": {
-        "Baseline": "Allineamento",
-        "Border": "Bordo",
-        "Bottom": "Basso",
-        "Cancel": "Annullamento",
-        "Caption": "Titolo",
-        "Insert Table": "Inserisci tabella",
-        "Layout": "Layout",
-        "Left": "Sinistra",
-        "Middle": "Centrale",
-        "OK": "OK",
-        "Percent": "percento",
-        "Pixels": "pixels",
-        "Right": "Destra",
-        "Spacing": "Spaziatura",
-        "Top": "Alto",
-        "Width:": "Larghezza"
-    },
-    "Linker": {
-        "Cancel": "Annullamento",
-        "Insert/Modify Link": "Inserisci/modifica link",
-        "OK": "OK",
-        "Target:": "Target:",
-        "URL:": "URL:"
-    },
-    "NoteServer": {
-        "Cancel": "Annullamento",
-        "OK": "OK"
-    },
-    "PSLocal": {
-        "Cancel": "Annullamento"
-    },
-    "PasteText": {
-        "Cancel": "Annullamento",
-        "OK": "OK"
-    },
-    "PersistentStorage": {
-        "Cancel": "Annullamento"
-    },
-    "QuickTag": {
-        "Cancel": "Annullamento"
-    },
-    "SetId": {
-        "Cancel": "Annullamento",
-        "OK": "OK"
-    },
-    "SmartReplace": {
-        "OK": "OK"
-    },
-    "SpellChecker": {
-        "Cancel": "Annullamento",
-        "OK": "OK"
-    },
-    "SuperClean": {
-        "Cancel": "Annullamento",
-        "OK": "OK"
-    },
-    "TableOperations": {
-        "All four sides": "Tutti e quattro i lati",
-        "Borders": "Bordi",
-        "Cancel": "Annullamento",
-        "Caption": "Titolo",
-        "Cell Properties": "Proprietà della Cella",
-        "Cell properties": "Proprietà della cella",
-        "Delete cell": "Cancella cella",
-        "Delete column": "Cancella colonna",
-        "Delete row": "Cancella riga",
-        "Description": "Descrizione",
-        "Frames": "Frames",
-        "Insert cell after": "Inserisci cella dopo",
-        "Insert cell before": "Inserisci cella prima",
-        "Insert column after": "Inserisci colonna dopo",
-        "Insert column before": "Inserisci colonna prima",
-        "Insert row after": "Inserisci riga dopo",
-        "Insert row before": "Inserisci riga prima",
-        "Merge cells": "Unisci celle",
-        "No rules": "Nessun righello",
-        "No sides": "Nessun lato",
-        "OK": "OK",
-        "Padding": "Padding",
-        "Please click into some cell": "Per favore, clicca in una cella",
-        "Row Properties": "Proprietà della Riga",
-        "Row properties": "Proprietà della riga",
-        "Rules will appear between all rows and columns": "Le linee appariranno tra tutte le righe e colonne",
-        "Rules will appear between columns only": "Le linee appariranno solo tra le colonne",
-        "Rules will appear between rows only": "Le linee appariranno solo tra le righe",
-        "Spacing": "Spaziatura",
-        "Spacing and padding": "Spaziatura e Padding",
-        "Split column": "Dividi colonna",
-        "Split row": "Dividi riga",
-        "Summary": "Sommario",
-        "Table Properties": "Proprietà della Tabella",
-        "Table properties": "Proprietà della Tabella",
-        "The bottom side only": "Solo la parte inferiore",
-        "The left-hand side only": "Solo la parte sinistra",
-        "The right and left sides only": "Solo destra e sinistra",
-        "The right-hand side only": "Solo la parte destra",
-        "The top and bottom sides only": "Solo sopra e sotto",
-        "The top side only": "Solo la parte sopra",
-        "Xinha cowardly refuses to delete the last cell in row.": "Xinha si rifiuta codardamente di cancellare l'ultima cella nella riga.",
-        "Xinha cowardly refuses to delete the last column in table.": "Xinha si rifiuta codardamente di cancellare l'ultima colonna nella tabella.",
-        "Xinha cowardly refuses to delete the last row in table.": "Xinha si rifiuta codardamente di cancellare l'ultima riga nella tabella.",
-        "pixels": "pixels"
-    },
-    "Template": {
-        "Cancel": "Annullamento",
-        "Insert template": "Inserisca il template"
-    },
-    "UnFormat": {
-        "Cancel": "Annullamento",
-        "OK": "OK"
-    },
-    "Xinha": {
-        "About this editor": "Informazioni su Xinha",
-        "Background Color": "Colore sfondo",
-        "Bold": "Grassetto",
-        "Bulleted List": "Lista non numerata",
-        "Copy selection": "Copia",
-        "Current style": "Stile corrente",
-        "Cut selection": "Taglia",
-        "Decrease Indent": "Diminuisci indentazione",
-        "Direction left to right": "Testo da sx a dx",
-        "Direction right to left": "Testo da dx a sx",
-        "Font Color": "Colore font",
-        "Help using editor": "Aiuto",
-        "Horizontal Rule": "Righello orizzontale",
-        "Increase Indent": "Aumenta indentazione",
-        "Insert Table": "Inserisci tabella",
-        "Insert Web Link": "Inserisci link",
-        "Insert/Modify Image": "Inserisci/modifica Immagine",
-        "Italic": "Corsivo",
-        "Justify Center": "Centrato",
-        "Justify Full": "Giustificato",
-        "Justify Left": "Sinistra",
-        "Justify Right": "Destra",
-        "Ordered List": "Lista numerata",
-        "Paste from clipboard": "Incolla",
-        "Path": "Percorso",
-        "Redoes your last action": "Ripeti ultima azione",
-        "Strikethrough": "Barrato",
-        "Subscript": "Pedice",
-        "Superscript": "Apice",
-        "Toggle HTML Source": "Visualizza/nascondi sorgente HTML",
-        "Underline": "Sottolineato",
-        "Undoes your last action": "Annulla ultima azione",
-        "You are in TEXT MODE.  Use the [<>] button to switch back to WYSIWYG.": "Sei in MODALITA"
-    },
-    "__NEW_TRANSLATIONS__": {
-        "Abbreviation": {
-            "Abbreviation": "",
-            "Delete": "",
-            "Expansion:": ""
-        },
-        "AboutBox": {
-            "Close": "<<Xinha>>"
-        },
-        "CharCounter": {
-            "... in progress": "",
-            "Chars": "",
-            "HTML": "",
-            "Words": ""
-        },
-        "ColorPicker": {
-            "Click a color...": "",
-            "Sample": "",
-            "Web Safe: ": "",
-            "Close": "<<Xinha>>"
-        },
-        "ContextMenu": {
-            "_Delete Row": "",
-            "_Image Properties...": "",
-            "_Modify Link...": "",
-            "_Remove Link...": "",
-            "_Table Properties...": "",
-            "C_ell Properties...": "",
-            "Chec_k Link...": "",
-            "Copy": "",
-            "Create a link": "",
-            "Current URL is": "",
-            "Cut": "",
-            "De_lete Column": "",
-            "Delete Cell": "",
-            "Delete the current column": "",
-            "Delete the current row": "",
-            "How did you get here? (Please report!)": "",
-            "I_nsert Row Before": "",
-            "In_sert Row After": "",
-            "Insert _Column Before": "",
-            "Insert a new column after the current one": "",
-            "Insert a new column before the current one": "",
-            "Insert a new row after the current one": "",
-            "Insert a new row before the current one": "",
-            "Insert a paragraph after the current node": "",
-            "Insert a paragraph before the current node": "",
-            "Insert C_olumn After": "",
-            "Insert Cell After": "",
-            "Insert Cell Before": "",
-            "Insert paragraph after": "",
-            "Insert paragraph before": "",
-            "Link points to:": "",
-            "Make lin_k...": "",
-            "Merge Cells": "",
-            "Opens this link in a new window": "",
-            "Paste": "",
-            "Please confirm that you want to remove this element:": "",
-            "Please confirm that you want to unlink this element.": "",
-            "Remove the $elem Element...": "",
-            "Remove this node from the document": "",
-            "Ro_w Properties...": "",
-            "Show the image properties dialog": "",
-            "Show the Table Cell Properties dialog": "",
-            "Show the Table Properties dialog": "",
-            "Show the Table Row Properties dialog": "",
-            "Unlink the current element": ""
-        },
-        "CreateLink": {
-            "Are you sure you wish to remove this link?": "",
-            "You need to select some text before creating a link": ""
-        },
-        "DefinitionList": {
-            "definition description": "",
-            "definition list": "",
-            "definition term": ""
-        },
-        "Dialogs": {
-            "Some Text Here": ""
-        },
-        "DynamicCSS": {
-            "Choose stylesheet": "",
-            "Default": "",
-            "Undefined": ""
-        },
-        "EditTag": {
-            "Edit HTML for selected text": "",
-            "Edit Tag By Peg": "",
-            "Tag Editor": ""
-        },
-        "Equation": {
-            "!=": "",
-            "!in": "",
-            "&gt;-": "",
-            "&gt;=": "",
-            "&lt;=": "",
-            "&lt;=&gt;": "",
-            "&lt;x&gt;": "",
-            "&nbsp; `!` &nbsp;": "",
-            "&nbsp; `.` &nbsp;": "",
-            "&nbsp; `0` &nbsp;": "",
-            "&nbsp; `2` &nbsp;": "",
-            "&nbsp; `3` &nbsp;": "",
-            "&nbsp; `4` &nbsp;": "",
-            "&nbsp; `5` &nbsp;": "",
-            "&nbsp; `6` &nbsp;": "",
-            "&nbsp; `7` &nbsp;": "",
-            "&nbsp; `8` &nbsp;": "",
-            "&nbsp; `9` &nbsp;": "",
-            "&nbsp; `e` &nbsp;": "",
-            "&nbsp;&nbsp;`1` &nbsp;": "",
-            "&nbsp;`+{::}`&nbsp;": "",
-            "&nbsp;`-:\\ `": "",
-            "&nbsp;`-{::}`&nbsp;": "",
-            "&nbsp;`C`&nbsp;": "",
-            "&nbsp;`cos`": "",
-            "&nbsp;`ln`&nbsp;": "",
-            "&nbsp;`pi` &nbsp;": "",
-            "&nbsp;`sin`": "",
-            "&nbsp;`tan`": "",
-            "&nbsp;`times`&nbsp;": "",
-            "&quot;text&quot;": "",
-            "'+formula+'": "",
-            "((n),(k))": "",
-            "(x+1)/(x-1)": "",
-            "*": "",
-            "**": "",
-            "+-": "",
-            "-&gt;": "",
-            "-&lt;": "",
-            "-:": "",
-            "-=": "",
-            "//": "",
-            "/_": "",
-            ":.": "",
-            "=&gt;": "",
-            "@": "",
-            "[[a,b],[c,d]]": "",
-            "\\\\": "",
-            "\\nClick in the box to use your keyboard or use the buttons\\n": "",
-            "^^": "",
-            "^^^": "",
-            "__|": "",
-            "_|_": "",
-            "`!=`": "",
-            "`!in`": "",
-            "`&and;`": "",
-            "`&cap;`": "",
-            "`&cup;`": "",
-            "`&gt;-`": "",
-            "`&gt;=`": "",
-            "`&lt;=&gt;`": "",
-            "`&lt;=`": "",
-            "`&lt;x&gt;`": "",
-            "`&or;`": "",
-            "`&quot;text&quot;`": "",
-            "`((n),(k))`": "",
-            "`(x+1)/(x-1)`": "",
-            "`**`": "",
-            "`*`": "",
-            "`+-`": "",
-            "`-&gt;`": "",
-            "`-&lt;`": "",
-            "`-:`": "",
-            "`-=`": "",
-            "`//`": "",
-            "`/_`": "",
-            "`:.`": "",
-            "`=&gt;`": "",
-            "`@`": "",
-            "`[[a,b],[c,d]]`": "",
-            "`\\\\`": "",
-            "`__|`": "",
-            "`_|_`": "",
-            "`AA`": "",
-            "`aleph`": "",
-            "`alpha`": "",
-            "`and`": "",
-            "`bara`": "",
-            "`bba`": "",
-            "`bbba`": "",
-            "`beta`": "",
-            "`CC`": "",
-            "`cca`": "",
-            "`chi`": "",
-            "`darr`": "",
-            "`ddota`": "",
-            "`del`": "",
-            "`Delta`": "",
-            "`delta`": "",
-            "`diamond`": "",
-            "`dota`": "",
-            "`dy/dx`": "",
-            "`EE`": "",
-            "`epsi`": "",
-            "`eta`": "",
-            "`fra`": "",
-            "`Gamma`": "",
-            "`gamma`": "",
-            "`grad`": "",
-            "`harr`": "",
-            "`hArr`": "",
-            "`hata`": "",
-            "`if`": "",
-            "`in`": "",
-            "`int`": "",
-            "`iota`": "",
-            "`kappa`": "",
-            "`Lambda`": "",
-            "`lambda`": "",
-            "`lArr`": "",
-            "`larr`": "",
-            "`lim_(x-&gt;oo)`": "",
-            "`log`": "",
-            "`mu`": "",
-            "`NN`": "",
-            "`nn`": "",
-            "`not`": "",
-            "`nu`": "",
-            "`o+`": "",
-            "`o.`": "",
-            "`O/`": "",
-            "`oint`": "",
-            "`omega`": "",
-            "`Omega`": "",
-            "`oo`": "",
-            "`or`": "",
-            "`ox`": "",
-            "`phi`": "",
-            "`Phi`": "",
-            "`Pi`": "",
-            "`pi`": "",
-            "`prod`": "",
-            "`prop`": "",
-            "`Psi`": "",
-            "`psi`": "",
-            "`QQ`": "",
-            "`quad`": "",
-            "`rArr`": "",
-            "`rho`": "",
-            "`root(n)(x)`": "",
-            "`RR`": "",
-            "`sfa`": "",
-            "`Sigma`": "",
-            "`sigma`": "",
-            "`sqrt(x)`": "",
-            "`square`": "",
-            "`stackrel(-&gt;)(+)`": "",
-            "`sub`": "",
-            "`sube`": "",
-            "`sum`": "",
-            "`sup`": "",
-            "`supe`": "",
-            "`tau`": "",
-            "`Theta`": "",
-            "`theta`": "",
-            "`TT`": "",
-            "`tta`": "",
-            "`uarr`": "",
-            "`ula`": "",
-            "`upsilon`": "",
-            "`uu`": "",
-            "`veca`": "",
-            "`vv`": "",
-            "`x_(mn)`": "",
-            "`Xi`": "",
-            "`xi`": "",
-            "`xx`": "",
-            "`zeta`": "",
-            "`ZZ`": "",
-            "`|-&gt;`": "",
-            "`|--`": "",
-            "`|==`": "",
-            "`|__`": "",
-            "`|~`": "",
-            "`~=`": "",
-            "`~|`": "",
-            "`~~`": "",
-            "AA": "",
-            "aleph": "",
-            "alpha": "",
-            "and": "",
-            "AsciiMath Formula Input": "",
-            "AsciiMathML Example": "",
-            "bara": "",
-            "Based on ASCIIMathML by": "",
-            "bba": "",
-            "bbba": "",
-            "beta": "",
-            "CC": "",
-            "cca": "",
-            "chi": "",
-            "darr": "",
-            "ddota": "",
-            "del": "",
-            "delta": "",
-            "Delta": "",
-            "diamond": "",
-            "dota": "",
-            "dy/dx": "",
-            "EE": "",
-            "epsi": "",
-            "eta": "",
-            "For more information on AsciiMathML visit this page:": "",
-            "Formula Editor": "",
-            "fra": "",
-            "gamma": "",
-            "Gamma": "",
-            "grad": "",
-            "hArr": "",
-            "harr": "",
-            "hata": "",
-            "if": "",
-            "in": "",
-            "Input": "",
-            "int": "",
-            "int_a^bf(x)dx": "",
-            "iota": "",
-            "kappa": "",
-            "Lambda": "",
-            "lambda": "",
-            "larr": "",
-            "lArr": "",
-            "lim_(x-&gt;oo)": "",
-            "mu": "",
-            "NN": "",
-            "nn": "",
-            "nnn": "",
-            "not": "",
-            "nu": "",
-            "o+": "",
-            "o.": "",
-            "O/": "",
-            "oint": "",
-            "Omega": "",
-            "omega": "",
-            "oo": "",
-            "or": "",
-            "ox": "",
-            "phi": "",
-            "Phi": "",
-            "pi": "",
-            "Pi": "",
-            "Preview": "",
-            "prod": "",
-            "prop": "",
-            "psi": "",
-            "Psi": "",
-            "QQ": "",
-            "quad": "",
-            "rArr": "",
-            "rho": "",
-            "root(n)(x)": "",
-            "RR": "",
-            "sfa": "",
-            "sigma": "",
-            "Sigma": "",
-            "sqrt(x)": "",
-            "square": "",
-            "stackrel(-&gt;)(+)": "",
-            "sub": "",
-            "sube": "",
-            "sum": "",
-            "sum_(n=1)^oo": "",
-            "sup": "",
-            "supe": "",
-            "tau": "",
-            "Theta": "",
-            "theta": "",
-            "TT": "",
-            "tta": "",
-            "uarr": "",
-            "ula": "",
-            "upsilon": "",
-            "uu": "",
-            "uuu": "",
-            "veca": "",
-            "vv": "",
-            "vvv": "",
-            "x^(m+n)": "",
-            "x_(mn)": "",
-            "Xi": "",
-            "xi": "",
-            "xx": "",
-            "zeta": "",
-            "ZZ": "",
-            "|-&gt;": "",
-            "|--": "",
-            "|==": "",
-            "|__": "",
-            "|~": "",
-            "~=": "",
-            "~|": "",
-            "~~": ""
-        },
-        "FancySelects": {
-            "'+opt.text+'": ""
-        },
-        "FindReplace": {
-            "';\r\n  var tagc = '": "",
-            "Case sensitive search": "",
-            "Clear": "",
-            "Done": "",
-            "Enter the text you want to find": "",
-            "Find and Replace": "",
-            "found item": "",
-            "found items": "",
-            "Highlight": "",
-            "Inform a replacement word": "",
-            "Next": "",
-            "not found": "",
-            "Options": "",
-            "Replace with:": "",
-            "replaced item": "",
-            "replaced items": "",
-            "Search for:": "",
-            "Substitute all occurrences": "",
-            "Substitute this occurrence?": "",
-            "Undo": "",
-            "Whole words only": ""
-        },
-        "FormOperations": {
-            "Enter the name for new option.": "",
-            "Form Editor": "",
-            "Insert a check box.": "",
-            "Insert a Form.": "",
-            "Insert a multi-line text field.": "",
-            "Insert a radio button.": "",
-            "Insert a select field.": "",
-            "Insert a submit/reset button.": "",
-            "Insert a text, password or hidden field.": "",
-            "Message Sent": "",
-            "Please Select...": ""
-        },
-        "Forms": {
-            "'onClick'=": "",
-            "Access Key:": "",
-            "Action URL:": "",
-            "Button Script": "",
-            "Checked": "",
-            "Columns:": "",
-            "Default text (optional)": "",
-            "Dimensions": "",
-            "Disabled": "",
-            "Encoding:": "",
-            "For Control:": "",
-            "Form": "",
-            "Form Element: FIELDSET": "",
-            "Form Element: INPUT": "",
-            "Form Element: LABEL": "",
-            "Form Element: SELECT": "",
-            "Form Element: TEXTAREA": "",
-            "Form handler script": "",
-            "Form Name:": "",
-            "Get": "",
-            "Hard": "",
-            "Height in number of rows": "",
-            "HTML-Form to CGI (default)": "",
-            "Image source": "",
-            "Initial Text:": "",
-            "Insert/Edit Form": "",
-            "Insert/Edit Form Element FIELDSET": "",
-            "Insert/Edit Form Element INPUT": "",
-            "Insert/Edit Form Element LABEL": "",
-            "Insert/Edit Form Element SELECT": "",
-            "Insert/Edit Form Element TEXTAREA": "",
-            "Javascript for button click": "",
-            "Label:": "",
-            "Legend:": "",
-            "Max length:": "",
-            "Maximum number of characters accepted": "",
-            "Method:": "",
-            "multipart Form Data (File-Upload)": "",
-            "Name": "",
-            "Name of the form input": "",
-            "Name of the form select": "",
-            "name of the textarea": "",
-            "Name/ID:": "",
-            "normal": "",
-            "nowrap": "",
-            "Off": "",
-            "Physical": "",
-            "Please enter a Label": "",
-            "Post": "",
-            "pre": "",
-            "Read Only": "",
-            "Rows:": "",
-            "Size of text box in characters": "",
-            "Size:": "",
-            "Soft": "",
-            "Tab Index:": "",
-            "Target Frame:": "",
-            "Text:": "",
-            "URL of image": "",
-            "Value of the form input": "",
-            "Value:": "",
-            "Virtual": "",
-            "Width in number of characters": "",
-            "Wrap Mode:": "",
-            "You must enter a Name": "",
-            "Options": "<<FindReplace>>"
-        },
-        "FullPage": {
-            "...": "",
-            "Alternate style-sheet:": "",
-            "Background color:": "",
-            "Character set:": "",
-            "cyrillic (ISO-8859-5)": "",
-            "cyrillic (KOI8-R)": "",
-            "cyrillic (WINDOWS-1251)": "",
-            "DOCTYPE:": "",
-            "Document properties": "",
-            "Document title:": "",
-            "Keywords:": "",
-            "Primary style-sheet:": "",
-            "Text color:": "",
-            "UTF-8 (recommended)": "",
-            "western (ISO-8859-1)": ""
-        },
-        "FullScreen": {
-            "Maximize/Minimize Editor": ""
-        },
-        "Gecko": {
-            "The Paste button does not work in this browser for security reasons. Press CTRL-V on your keyboard to paste directly.": ""
-        },
-        "HorizontalRule": {
-            "&#x00d7;": "",
-            "&nbsp;": "",
-            "Alignment:": "",
-            "Insert/edit horizontal rule": "",
-            "Insert/Edit Horizontal Rule": "",
-            "No shading": "",
-            "Style": ""
-        },
-        "InlineStyler": {
-            "CSS Style": "",
-            "-": "<<Equation>>"
-        },
-        "InsertAnchor": {
-            "Anchor name": "",
-            "Insert Anchor": "",
-            "Delete": "<<Abbreviation>>"
-        },
-        "InsertImage": {
-            "Absbottom": "",
-            "Absmiddle": "",
-            "Alternate text:": "",
-            "Border thickness:": "",
-            "Enter the image URL here": "",
-            "For browsers that don't support images": "",
-            "Horizontal padding": "",
-            "Horizontal:": "",
-            "Image Preview:": "",
-            "Insert Image": "",
-            "Leave empty for no border": "",
-            "Not set": "",
-            "Positioning of this image": "",
-            "Preview the image in a new window": "",
-            "Texttop": "",
-            "Vertical padding": "",
-            "Vertical:": "",
-            "You must enter the URL": "",
-            "Alignment:": "<<HorizontalRule>>",
-            "Preview": "<<Equation>>"
-        },
-        "InsertNote": {
-            "Insert": "",
-            "Insert footnote": "",
-            "Insert Note": ""
-        },
-        "InsertPagebreak": {
-            "Page break": "",
-            "Page Break": ""
-        },
-        "InsertSmiley": {
-            "Insert Smiley": ""
-        },
-        "InsertSnippet": {
-            "\\n  This is an information about something\\n": "",
-            "Hide preview": "",
-            "Insert as": "",
-            "Insert Snippet": "",
-            "InsertSnippet for Xinha": "",
-            "Link1": "",
-            "Link2": "",
-            "Link3": "",
-            "Link4": "",
-            "Link5": "",
-            "Show preview": "",
-            "This is an information about something": "",
-            "Variable": ""
-        },
-        "InsertSnippet2": {
-            "All Categories": "",
-            "Filter": "",
-            "Insert as HTML": "",
-            "Insert as template variable": "",
-            "Only search word beginning": "",
-            "HTML": "<<CharCounter>>",
-            "Insert Snippet": "<<InsertSnippet>>",
-            "InsertSnippet for Xinha": "<<InsertSnippet>>",
-            "Variable": "<<InsertSnippet>>"
-        },
-        "InsertTable": {
-            "Caption for the table": "",
-            "Cell padding:": "",
-            "Cell spacing:": "",
-            "Collapse borders:": "",
-            "Cols:": "",
-            "Em": "",
-            "Fixed width columns": "",
-            "Layou": "",
-            "Number of columns": "",
-            "Number of rows": "",
-            "Positioning of this table": "",
-            "Space between adjacent cells": "",
-            "Space between content and border in cell": "",
-            "Style of the border": "",
-            "Width of the table": "",
-            "Width unit": "",
-            "You must enter a number of columns": "",
-            "You must enter a number of rows": "",
-            "Absbottom": "<<InsertImage>>",
-            "Absmiddle": "<<InsertImage>>",
-            "Alignment:": "<<HorizontalRule>>",
-            "Border thickness:": "<<InsertImage>>",
-            "Leave empty for no border": "<<InsertImage>>",
-            "Not set": "<<InsertImage>>",
-            "Rows:": "<<Forms>>",
-            "Texttop": "<<InsertImage>>"
-        },
-        "LangMarks": {
-            "&mdash; language &mdash;": "",
-            "', '": "",
-            "English": "",
-            "French": "",
-            "Greek": "",
-            "language select": "",
-            "Latin": ""
-        },
-        "Linker": {
-            "(px)": "",
-            "Anchor-Link": "",
-            "Anchor:": "",
-            "Email Address:": "",
-            "Email Link": "",
-            "Location Bar:": "",
-            "Menu Bar:": "",
-            "Message Template:": "",
-            "New Window": "",
-            "Ordinary Link": "",
-            "Popup Window": "",
-            "PopupWindow": "",
-            "Remove Link": "",
-            "Resizeable:": "",
-            "Same Window (jump out of frames)": "",
-            "Scrollbars:": "",
-            "Shows On Hover": "",
-            "Status Bar:": "",
-            "Subject:": "",
-            "Title:": "",
-            "Toolbar:": "",
-            "URL Link": "",
-            "You must select some text before making a new link.": "",
-            "Are you sure you wish to remove this link?": "<<CreateLink>>",
-            "Name:": "<<Forms>>",
-            "Size:": "<<Forms>>"
-        },
-        "ListType": {
-            "Choose list style type (for ordered lists)": "",
-            "Decimal numbers": "",
-            "Lower greek letters": "",
-            "Lower latin letters": "",
-            "Lower roman numbers": "",
-            "Upper latin letters": "",
-            "Upper roman numbers": ""
-        },
-        "MootoolsFileManager": {
-            "Insert File Link": "",
-            "You must select some text before making a new link.": "<<Linker>>"
-        },
-        "Opera": {
-            "MARK": "",
-            "The Paste button does not work in Mozilla based web browsers (technical security reasons). Press CTRL-V on your keyboard to paste directly.": ""
-        },
-        "PasteText": {
-            "Insert text in new paragraph": "",
-            "Paste as Plain Text": ""
-        },
-        "PreserveScripts": {
-            "JavaScript": "",
-            "PHP": ""
-        },
-        "QuickTag": {
-            "',\r\n                           'cl': '": "",
-            "ATTRIBUTES": "",
-            "Colors": "",
-            "Enter the TAG you want to insert": "",
-            "No CSS class avaiable": "",
-            "Ok": "",
-            "OPTIONS": "",
-            "Quick Tag Editor": "",
-            "TAGs": "",
-            "There are some unclosed quote": "",
-            "This attribute already exists in the TAG": "",
-            "You have to select some text": ""
-        },
-        "SaveSubmit": {
-            "in progress": "",
-            "Ready": "",
-            "Save": "",
-            "Saving...": ""
-        },
-        "SetId": {
-            "ID/Name:": "",
-            "Set Id and Name": "",
-            "Set Id/Name": "",
-            "Set ID/Name": "",
-            "Delete": "<<Abbreviation>>"
-        },
-        "SmartReplace": {
-            "ClosingDoubleQuotes": "",
-            "ClosingSingleQuote": "",
-            "Convert all quotes and dashes in the current document": "",
-            "Enable automatic replacements": "",
-            "OpeningDoubleQuotes": "",
-            "OpeningSingleQuote": "",
-            "SmartReplace": "",
-            "SmartReplace Settings": ""
-        },
-        "Stylist": {
-            "Styles": ""
-        },
-        "SuperClean": {
-            "Clean bad HTML from Microsoft Word.": "",
-            "Clean Selection Only": "",
-            "Clean up HTML": "",
-            "Cleaning Scope": "",
-            "General tidy up and correction of some problems.": "",
-            "Please select from the following cleaning options...": "",
-            "Please stand by while cleaning in process...": "",
-            "Remove alignment (left/right/justify).": "",
-            "Remove all classes (CSS).": "",
-            "Remove All HTML Tags": "",
-            "Remove all styles (CSS).": "",
-            "Remove custom font sizes.": "",
-            "Remove custom text colors.": "",
-            "Remove custom typefaces (font \"styles\").": "",
-            "Remove emphasis and annotations.": "",
-            "Remove lang attributes.": "",
-            "Remove Paragraphs": "",
-            "Remove superscripts and subscripts.": "",
-            "Replace directional quote marks with non-directional quote marks.": "",
-            "Vigorously purge HTML from Microsoft Word.": ""
-        },
-        "TableOperations": {
-            "Cell Type:": "",
-            "Cells down": "",
-            "Cells to the right, and": "",
-            "Do Not Change": "",
-            "Frame and borders": "",
-            "Header (th)": "",
-            "Merge current cell with:": "",
-            "Normal (td)": "",
-            "Columns": "<<Forms>>",
-            "Merge Cells": "<<ContextMenu>>",
-            "Rows": "<<Forms>>"
-        },
-        "UnsavedChanges": {
-            "You have unsaved changes in the editor": ""
-        },
-        "WebKit": {
-            "The Paste button does not work in this browser for security reasons. Press CTRL-V on your keyboard to paste directly.": "<<Gecko>>"
-        },
-        "Xinha": {
-            "&#8212; font &#8212;": "",
-            "&#8212; format &#8212;": "",
-            "&#8212; size &#8212;": "",
-            "1 (8 pt)": "",
-            "2 (10 pt)": "",
-            "3 (12 pt)": "",
-            "4 (14 pt)": "",
-            "5 (18 pt)": "",
-            "6 (24 pt)": "",
-            "7 (36 pt)": "",
-            "Address": "",
-            "Arial": "",
-            "Clean content pasted from Word": "",
-            "Clear Inline Font Specifications": "",
-            "Clear MSOffice tags": "",
-            "Close": "",
-            "Constructing object": "",
-            "Courier New": "",
-            "Create Statusbar": "",
-            "Create Toolbar": "",
-            "CTRL-0 (zero)": "",
-            "CTRL-1 .. CTRL-6": "",
-            "CTRL-A": "",
-            "CTRL-B": "",
-            "CTRL-C": "",
-            "CTRL-E": "",
-            "CTRL-I": "",
-            "CTRL-J": "",
-            "CTRL-L": "",
-            "CTRL-N": "",
-            "CTRL-R": "",
-            "CTRL-S": "",
-            "CTRL-U": "",
-            "CTRL-V": "",
-            "CTRL-X": "",
-            "CTRL-Y": "",
-            "CTRL-Z": "",
-            "Editor Help": "",
-            "ENTER": "",
-            "Error Loading Xinha.  Developers, check the Error Console for information.": "",
-            "Finishing": "",
-            "Formatted": "",
-            "Generate Xinha framework": "",
-            "Georgia": "",
-            "Heading 1": "",
-            "Heading 2": "",
-            "Heading 3": "",
-            "Heading 4": "",
-            "Heading 5": "",
-            "Heading 6": "",
-            "Headings": "",
-            "Impact": "",
-            "Init editor size": "",
-            "insert linebreak": "",
-            "Insert/Overwrite": "",
-            "Keyboard shortcuts": "",
-            "Loading Core": "",
-            "Loading in progress. Please wait!": "",
-            "Loading plugin $plugin": "",
-            "Loading plugins": "",
-            "MS Word Cleaner": "",
-            "new paragraph": "",
-            "Normal": "",
-            "Print document": "",
-            "Register plugin $plugin": "",
-            "Remove formatting": "",
-            "Save as": "",
-            "Select all": "",
-            "Select Color": "",
-            "Set format to paragraph": "",
-            "SHIFT-ENTER": "",
-            "Split Block": "",
-            "Tahoma": "",
-            "The editor provides the following key combinations:": "",
-            "Times New Roman": "",
-            "Toggle Borders": "",
-            "Touch here first to activate editor.": "",
-            "Verdana": "",
-            "Waiting for Iframe to load...": "",
-            "WingDings": "",
-            "Would you like to clear font colours?": "",
-            "Would you like to clear font sizes?": "",
-            "Would you like to clear font typefaces?": "",
-            "Xinha": ""
-        },
-        "BackgroundImage": {
-            "__ TRANSLATOR NOTE __": "*** BACKGROUNDIMAGE IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***",
-            "Remove Current Background": "",
-            "Set Background": "",
-            "Set page background image": "",
-            "Set Page Background Image": ""
-        },
-        "ClientsideSpellcheck": {
-            "__ TRANSLATOR NOTE __": "*** CLIENTSIDESPELLCHECK IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***",
-            "Spell Check using ieSpell": ""
-        },
-        "ExtendedFileManager": {
-            "__ TRANSLATOR NOTE __": "*** EXTENDEDFILEMANAGER IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***",
-            "10%": "",
-            "100%": "",
-            "200%": "",
-            "25%": "",
-            "50%": "",
-            "75%": "",
-            ">List View": "",
-            ">Thumbnail View": "",
-            "A:": "",
-            "Alt": "",
-            "Border Color": "",
-            "Constrain Proportions": "",
-            "Crop": "",
-            "D:": "",
-            "Directory": "",
-            "Directory Up": "",
-            "Edit": "",
-            "File List": "",
-            "File Manager": "",
-            "Filename:": "",
-            "Filesize:": "",
-            "Flip Horizontal": "",
-            "Flip Image": "",
-            "Flip Vertical": "",
-            "Folder": "",
-            "GIF": "",
-            "GIF format is not supported, image editing not supported.": "",
-            "H:": "",
-            "Image Editor": "",
-            "Image Selection": "",
-            "Invalid base directory:": "",
-            "JPEG High": "",
-            "JPEG Low": "",
-            "JPEG Medium": "",
-            "Loading": "",
-            "Lock": "",
-            "Marker": "",
-            "Maximum folder size limit reached. Upload disabled.": "",
-            "Measure": "",
-            "New Folder": "",
-            "No Files Found": "",
-            "No Image Available": "",
-            "Please enter value": "",
-            "PNG": "",
-            "Preset": "",
-            "Quality:": "",
-            "Refresh": "",
-            "Rename": "",
-            "Resize": "",
-            "Rotate": "",
-            "Rotate 180 &deg;": "",
-            "Rotate 90 &deg; CCW": "",
-            "Rotate 90 &deg; CW": "",
-            "Rotate Image": "",
-            "Start X:": "",
-            "Start Y:": "",
-            "Target Window": "",
-            "Toggle marker color": "",
-            "Trash": "",
-            "Upload": "",
-            "W:": "",
-            "X:": "",
-            "Xinha Image Editor": "",
-            "Y:": "",
-            "Zoom": "",
-            "Absbottom": "<<InsertImage>>",
-            "Absmiddle": "<<InsertImage>>",
-            "Clear": "<<FindReplace>>",
-            "Copy": "<<ContextMenu>>",
-            "Cut": "<<ContextMenu>>",
-            "Insert File Link": "<<MootoolsFileManager>>",
-            "Not set": "<<InsertImage>>",
-            "Positioning of this image": "<<InsertImage>>",
-            "Preview": "<<Equation>>",
-            "Save": "<<SaveSubmit>>",
-            "Texttop": "<<InsertImage>>",
-            "You must select some text before making a new link.": "<<Linker>>"
-        },
-        "Filter": {
-            "__ TRANSLATOR NOTE __": "*** FILTER IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***",
-            "Filter": "<<InsertSnippet2>>"
-        },
-        "HtmlTidy": {
-            "__ TRANSLATOR NOTE __": "*** HTMLTIDY IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***",
-            "Auto-Tidy": "",
-            "Don't Tidy": "",
-            "HTML Tidy": "",
-            "Tidy failed.  Check your HTML for syntax errors.": ""
-        },
-        "ImageManager": {
-            "__ TRANSLATOR NOTE __": "*** IMAGEMANAGER IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***",
-            "Angle:": "",
-            "Flickr Picture List": "",
-            "Flickr Pictures": "",
-            "Flickr Selection": "",
-            "Flickr Username/Email": "",
-            "Folder Name:": "",
-            "Image Format": "",
-            "Image List": "",
-            "Keyword": "",
-            "No Images Found": "",
-            "No Photos Found": "",
-            "No Videos Found": "",
-            "This Server": "",
-            "YouTube Selection": "",
-            "YouTube Username": "",
-            "YouTube Video List": "",
-            "YouTube Videos": "",
-            "A:": "<<ExtendedFileManager>>",
-            "Absbottom": "<<InsertImage>>",
-            "Absmiddle": "<<InsertImage>>",
-            "Clear": "<<FindReplace>>",
-            "Constrain Proportions": "<<ExtendedFileManager>>",
-            "Crop": "<<ExtendedFileManager>>",
-            "D:": "<<ExtendedFileManager>>",
-            "Directory": "<<ExtendedFileManager>>",
-            "Directory Up": "<<ExtendedFileManager>>",
-            "Edit": "<<ExtendedFileManager>>",
-            "Filename:": "<<ExtendedFileManager>>",
-            "Flip Horizontal": "<<ExtendedFileManager>>",
-            "Flip Image": "<<ExtendedFileManager>>",
-            "Flip Vertical": "<<ExtendedFileManager>>",
-            "GIF": "<<ExtendedFileManager>>",
-            "GIF format is not supported, image editing not supported.": "<<ExtendedFileManager>>",
-            "H:": "<<ExtendedFileManager>>",
-            "Image Editor": "<<ExtendedFileManager>>",
-            "Image Selection": "<<ExtendedFileManager>>",
-            "Insert Image": "<<InsertImage>>",
-            "Invalid base directory:": "<<ExtendedFileManager>>",
-            "JPEG High": "<<ExtendedFileManager>>",
-            "JPEG Low": "<<ExtendedFileManager>>",
-            "JPEG Medium": "<<ExtendedFileManager>>",
-            "Lock": "<<ExtendedFileManager>>",
-            "Marker": "<<ExtendedFileManager>>",
-            "Measure": "<<ExtendedFileManager>>",
-            "New Folder": "<<ExtendedFileManager>>",
-            "No Image Available": "<<ExtendedFileManager>>",
-            "Not set": "<<InsertImage>>",
-            "PNG": "<<ExtendedFileManager>>",
-            "Positioning of this image": "<<InsertImage>>",
-            "Quality:": "<<ExtendedFileManager>>",
-            "Refresh": "<<ExtendedFileManager>>",
-            "Resize": "<<ExtendedFileManager>>",
-            "Rotate": "<<ExtendedFileManager>>",
-            "Rotate 180 &deg;": "<<ExtendedFileManager>>",
-            "Rotate 90 &deg; CCW": "<<ExtendedFileManager>>",
-            "Rotate 90 &deg; CW": "<<ExtendedFileManager>>",
-            "Rotate Image": "<<ExtendedFileManager>>",
-            "Save": "<<SaveSubmit>>",
-            "Start X:": "<<ExtendedFileManager>>",
-            "Start Y:": "<<ExtendedFileManager>>",
-            "Texttop": "<<InsertImage>>",
-            "Trash": "<<ExtendedFileManager>>",
-            "W:": "<<ExtendedFileManager>>",
-            "X:": "<<ExtendedFileManager>>",
-            "Y:": "<<ExtendedFileManager>>"
-        },
-        "InsertMarquee": {
-            "__ TRANSLATOR NOTE __": "*** INSERTMARQUEE IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***",
-            "Alternate": "",
-            "Background-Color:": "",
-            "Behavior:": "",
-            "Continuous": "",
-            "Direction:": "",
-            "Marquee Editor": "",
-            "Scroll Amount:": "",
-            "Scroll Delay:": "",
-            "Slide": "",
-            "Speed Control": "",
-            "Name": "<<Forms>>",
-            "Name/ID:": "<<Forms>>",
-            "Text:": "<<Forms>>"
-        },
-        "InsertPicture": {
-            "__ TRANSLATOR NOTE __": "*** INSERTPICTURE IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***",
-            "Leave empty for not defined": "",
-            " Open file in new window": "",
-            "Open file in new window": "",
-            "Upload file": "",
-            "Absbottom": "<<InsertImage>>",
-            "Absmiddle": "<<InsertImage>>",
-            "Alignment:": "<<HorizontalRule>>",
-            "Alternate text:": "<<InsertImage>>",
-            "Border thickness:": "<<InsertImage>>",
-            "Enter the image URL here": "<<InsertImage>>",
-            "For browsers that don't support images": "<<InsertImage>>",
-            "Horizontal padding": "<<InsertImage>>",
-            "Horizontal:": "<<InsertImage>>",
-            "Image Preview:": "<<InsertImage>>",
-            "Insert Image": "<<InsertImage>>",
-            "Leave empty for no border": "<<InsertImage>>",
-            "Not set": "<<InsertImage>>",
-            "Positioning of this image": "<<InsertImage>>",
-            "Preview": "<<Equation>>",
-            "Preview the image in a new window": "<<InsertImage>>",
-            "Size": "<<Forms>>",
-            "Texttop": "<<InsertImage>>",
-            "Vertical padding": "<<InsertImage>>",
-            "Vertical:": "<<InsertImage>>"
-        },
-        "NoteServer": {
-            "__ TRANSLATOR NOTE __": "*** NOTESERVER IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***",
-            "120%": "",
-            "150%": "",
-            "80%": "",
-            "Add GUIDO Code in a textbox on the page": "",
-            "Add MIDI link to allow students to hear the music": "",
-            "Format": "",
-            "GUIDO Code": "",
-            "Guido code": "",
-            "Image in applet": "",
-            "Insert GUIDO Music Notation": "",
-            "MIDI File": "",
-            "Source Code": "",
-            "With Mozilla, the applet will not be visible in editor, but only in Web page after submitting.": "",
-            "Zoom :": "",
-            "100%": "<<ExtendedFileManager>>",
-            "Image Preview": "<<InsertImage>>",
-            "Options": "<<FindReplace>>",
-            "Preview": "<<Equation>>",
-            "Preview the image in a new window": "<<InsertImage>>",
-            "Zoom": "<<ExtendedFileManager>>"
-        },
-        "PSLocal": {
-            "__ TRANSLATOR NOTE __": "*** PSLOCAL IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***",
-            "Confirm": "",
-            "Enable": "",
-            "Enable Gears in order to use local document storage and configuration.": "",
-            "Enabling Local Storage": "",
-            "Install": "",
-            "Learn About Local Storage": "",
-            "This will reload the page, causing you to lose any unsaved work.  Press \"OK\" to reload.": "",
-            "Xinha uses Google Gears to enable local document storage.  With Gears installed, you can save drafts of your documents on your hard drive, configure Xinha to look the way you want, and carry this information wherever you use Xinha on the web.": ""
-        },
-        "PSServer": {
-            "__ TRANSLATOR NOTE __": "*** PSSERVER IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***",
-            "File: ": "",
-            "Import": ""
-        },
-        "PersistentStorage": {
-            "__ TRANSLATOR NOTE __": "*** PERSISTENTSTORAGE IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***",
-            "Details": "",
-            "File Browser": "",
-            "Hello    There C ": "",
-            "Hello  There A ": "",
-            "Hello \" There B \"": "",
-            "Hello ' There D '": "",
-            "List of Places": "",
-            "New Document": "",
-            "Open": "",
-            "Open Document": "",
-            "Places": "",
-            "Please enter the name of the directory you'd like to create.": "",
-            "Save Document": "",
-            "This will erase any unsaved content.  If you're certain, please click OK to continue.": "",
-            "Web URL": "",
-            "Confirm": "<<PSLocal>>",
-            "Copy": "<<ContextMenu>>",
-            "Delete": "<<Abbreviation>>",
-            "Directory Up": "<<ExtendedFileManager>>",
-            "File List": "<<ExtendedFileManager>>",
-            "File Manager": "<<ExtendedFileManager>>",
-            "Filename": "<<ExtendedFileManager>>",
-            "Insert": "<<InsertNote>>",
-            "Insert Image": "<<InsertImage>>",
-            "New Folder": "<<ExtendedFileManager>>",
-            "Save": "<<SaveSubmit>>",
-            "You must select some text before making a new link.": "<<Linker>>"
-        },
-        "SpellChecker": {
-            "__ TRANSLATOR NOTE __": "*** SPELLCHECKER IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***",
-            "Dictionary": "",
-            "Finished list of mispelled words": "",
-            "HTMLArea Spell Checker": "",
-            "I will open it in a new page.": "",
-            "Ignore": "",
-            "Ignore all": "",
-            "Info": "",
-            "Learn": "",
-            "No mispelled words found with the selected dictionary.": "",
-            "Original word": "",
-            "Please confirm that you want to open this link": "",
-            "Please wait.  Calling spell checker.": "",
-            "Please wait: changing dictionary to": "",
-            "pliz weit ;-)": "",
-            "Re-check": "",
-            "Replace": "",
-            "Replace all": "",
-            "Revert": "",
-            "Spell Checker": "",
-            "Spell-check": "",
-            "Suggestions": "",
-            "This will drop changes and quit spell checker.  Please confirm.": "",
-            "Replace with": "<<FindReplace>>"
-        },
-        "UnFormat": {
-            "__ TRANSLATOR NOTE __": "*** UNFORMAT IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***",
-            "All": "",
-            "All HTML:": "",
-            "Cleaning Area": "",
-            "Cleaning options": "",
-            "Formatting:": "",
-            "Page Cleaner": "",
-            "Select which types of formatting you would like to remove.": "",
-            "Selection": ""
-        }
-    }
-}
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/lang/merged/ja.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/lang/merged/ja.js
deleted file mode 100644
index 5112015..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/lang/merged/ja.js
+++ /dev/null
@@ -1,1561 +0,0 @@
-// Xinha Language Combined Translation File
-//
-// LANG: "ja", ENCODING: UTF-8
-//
-// INSTRUCTIONS TO TRANSLATORS
-// ===========================================================================
-//
-// Your translation must be in UTF-8 Character Encoding.
-//
-// This is a JSON encoded file (plus comments), strings should be double-quote
-// only, do not use single quotes to surround strings - "hello", not 'hello'
-// do not have a trailing comma after the last entry in a section.
-//
-// Only full line comments are allowed (that a comments occupy entire lines).
-//
-// Search for the __NEW_TRANSLATIONS__ section below, this is where you will
-// want to focus, this section includes things that do not presently have a 
-// translation or for which the translation needs to be checked for accuracy.
-//
-// In the New Translations section a translation string is one of the following
-//
-//  "English String Here" : ""
-//     This means it is not translated yet, add your translation...
-//     "English String Here" : "Klingon String Here"
-//
-//  "English String Here" : "Translated String Here"
-//     This means that an existing translation for this string, in some other
-//     section has been found, and used.  Check that it is approprite for this
-//     section and if it is, that's fine leave it as is, otherwise change as
-//     appropriate.
-//
-//  "English String Here" : "<<AnotherSection>>"
-//     This means use the same translation for this string as <<AnotherSection>>
-//     this saves you re-tranlating strings.  If the Context of this section
-//     and the context of AnotherSection seem the same, that's fine leave it
-//     using that translation, but if this section needs a different translation, 
-//     you can provide it by replacing the link (<<AnotherSection>>) with that
-//     new translation.  For example - a "Table" in say "DataPlugin" is 
-//     perhaps translated differently to "Table" in "FurniturePlugin".
-//
-// TESTING YOUR TRANSLATION
-// ===========================================================================
-// Simply place your translation file on your webserver somewhere for example
-//
-//   /xinha/lang/merged/ja.js
-//
-// and then tell Xinha where to get it (before loading XinhaCore.js) by 
-//
-//  _editor_lang              = 'ja';
-//  _editor_lang_merged_file  = '/xinha/lang/merged/ja.js';
-//
-// Xinha will load your new language definition.
-//
-// SUBMITTING YOUR TRANSLATION
-// ===========================================================================
-// Simply create a Ticket on the Xinha website and attach your translation 
-// file.
-//
-// The Xinha developers will take your file and use the 
-//     contrib/lc_split_merged_file.php
-// script to load it into the Xinha distribution.
-
-{
-    "Abbreviation": {
-        "Abbreviation": "略語",
-        "Cancel": "中止",
-        "Delete": "削除",
-        "Expansion:": "展開される語:",
-        "OK": "OK"
-    },
-    "AboutBox": {
-        "About this editor": "バージョン情報",
-        "Close": "閉じる"
-    },
-    "BackgroundImage": {
-        "Cancel": "中止",
-        "Remove Current Background": "現在の背景画像を除去",
-        "Set Page Background Image": "ページの背景画像を設定",
-        "Set page background image": "ページの背景画像を設定"
-    },
-    "CharCounter": {
-        "... in progress": "... 処理中",
-        "Chars": "文字数",
-        "Words": "単語数"
-    },
-    "CharacterMap": {
-        "Insert special character": "特殊文字を挿入"
-    },
-    "ClientsideSpellcheck": {
-        "Spell Check using ieSpell": "スペルチェックに ieSpell を使う"
-    },
-    "ColorPicker": {
-        "Click a color...": "色をクリック...",
-        "Close": "閉じる",
-        "Color: ": "色: ",
-        "OK": "OK",
-        "Sample": "サンプル",
-        "Web Safe: ": "Webセーフ: "
-    },
-    "ContextMenu": {
-        "C_ell Properties...": "セルのプロパティ(_E)...",
-        "Chec_k Link...": "リンクを確認(_K)...",
-        "Copy": "コピー",
-        "Create a link": "新たなリンクを作成します",
-        "Current URL is": "現在のURL",
-        "Cut": "切り取り",
-        "De_lete Column": "列の削除(_L)",
-        "Delete Cell": "セルの削除",
-        "Delete the current column": "選択中の列を削除します",
-        "Delete the current row": "選択中の行を削除します",
-        "How did you get here? (Please report!)": "どうやってここに来ましたか?(どうか報告を!)",
-        "I_nsert Row Before": "上に行を挿入(_N)",
-        "In_sert Row After": "下に行を挿入(_S)",
-        "Insert C_olumn After": "右に列を挿入(_O)",
-        "Insert Cell After": "後にセルを挿入",
-        "Insert Cell Before": "前にセルを挿入",
-        "Insert _Column Before": "左に列を挿入(_C)",
-        "Insert a new column after the current one": "選択中の列の右に一列挿入します",
-        "Insert a new column before the current one": "選択中の列の左に一列挿入します",
-        "Insert a new row after the current one": "選択中の行の下に一行挿入します",
-        "Insert a new row before the current one": "選択中の行の上に一行挿入します",
-        "Insert a paragraph after the current node": "選択中のノードの後に段落を挿入します",
-        "Insert a paragraph before the current node": "選択中のノードの手前に段落を挿入します",
-        "Insert paragraph after": "後に段落を挿入",
-        "Insert paragraph before": "前に段落を挿入",
-        "Justify Center": "中央寄せ",
-        "Justify Full": "均等割付",
-        "Justify Left": "左寄せ",
-        "Justify Right": "右寄せ",
-        "Link points to:": "リンク先:",
-        "Make lin_k...": "リンクの作成(_K)...",
-        "Merge Cells": "セルの結合",
-        "Opens this link in a new window": "このリンクを新しいウィンドウで開きます",
-        "Paste": "貼り付け",
-        "Please confirm that you want to remove this element:": "この要素を削除します。よろしいですか。:",
-        "Please confirm that you want to unlink this element.": "この要素のリンクを削除します。よろしいですか。",
-        "Remove the $elem Element...": "$elem 要素を削除 ...",
-        "Remove this node from the document": "ドキュメントからこのノードを削除します",
-        "Ro_w Properties...": "行のプロパティ(_W)...",
-        "Show the Table Cell Properties dialog": "テーブルセルのプロパティダイアログを表示します",
-        "Show the Table Properties dialog": "テーブルのプロパティダイアログを表示します",
-        "Show the Table Row Properties dialog": "テーブル行のプロパティダイアログを表示します",
-        "Show the image properties dialog": "この画像のプロパティダイアログを表示します",
-        "Unlink the current element": "この要素のリンクを解除",
-        "_Delete Row": "行の削除(_D)",
-        "_Image Properties...": "画像のプロパティ(_I)...",
-        "_Modify Link...": "リンクの修正(_M)...",
-        "_Remove Link...": "リンクの削除(_R)",
-        "_Table Properties...": "テーブルのプロパティ(_T)..."
-    },
-    "CreateLink": {
-        "Are you sure you wish to remove this link?": "本当にこのリンクを削除しますか?",
-        "Cancel": "中止",
-        "Insert/Modify Link": "リンクの挿入/修正",
-        "New window (_blank)": "新しいウィンドウ (_blank)",
-        "None (use implicit)": "なし (デフォルトに任せる)",
-        "OK": "OK",
-        "Other": "その他",
-        "Same frame (_self)": "自己フレーム内 (_self)",
-        "Target:": "ターゲット:",
-        "Title (tooltip):": "タイトル:",
-        "Top frame (_top)": "最上位フレーム (_top)",
-        "URL:": "URL:",
-        "You need to select some text before creating a link": "リンクを作成するにはテキストを選択する必要があります"
-    },
-    "DefinitionList": {
-        "definition description": "定義の説明",
-        "definition list": "定義リスト",
-        "definition term": "定義語"
-    },
-    "DynamicCSS": {
-        "Choose stylesheet": "スタイルシートの選択",
-        "Default": "なし",
-        "Undefined": "未定義"
-    },
-    "EditTag": {
-        "Cancel": "中止",
-        "Edit HTML for selected text": "選択中テキストのHTMLを編集します",
-        "OK": "OK",
-        "Tag Editor": "タグエディタ"
-    },
-    "Equation": {
-        "AsciiMath Formula Input": "AsciiMath 数式入力",
-        "Cancel": "中止",
-        "Formula Editor": "数式エディタ",
-        "Input": "入力",
-        "OK": "OK",
-        "Preview": "表示"
-    },
-    "ExtendedFileManager": {
-        "Absbottom": "下(絶対的)",
-        "Absmiddle": "中央(絶対的)",
-        "Align": "行揃え",
-        "Alt": "Alt",
-        "Baseline": "ベースライン",
-        "Border": "ボーダー",
-        "Border Color": "境界色:",
-        "Bottom": "下",
-        "Cancel": "中止",
-        "Clear": "クリア",
-        "Color": "色",
-        "Constrain Proportions": "縦横比を固定",
-        "Copy": "コピー",
-        "Crop": "切り抜き",
-        "Cut": "切り取り",
-        "Directory": "ディレクトリ",
-        "Directory Up": "親ディレクトリへ",
-        "Edit": "編集",
-        "File Manager": "ファイルマネージャ",
-        "Filename:": "ファイル名:",
-        "Flip Horizontal": "左右反転",
-        "Flip Image": "画像を反転",
-        "Flip Vertical": "上下反転",
-        "GIF format is not supported, image editing not supported.": "GIF形式はサポートされていないため、画像編集できません。",
-        "Height": "高さ",
-        "Height:": "高さ:",
-        "Insert File Link": "ファイルへのリンクを挿入",
-        "Invalid base directory:": "無効なディレクトリ:",
-        "JPEG High": "JPEG 高画質",
-        "JPEG Low": "JPEG 低画質",
-        "JPEG Medium": "JPEG 標準",
-        "Left": "左",
-        "Loading": "ロード中",
-        "Lock": "ロック",
-        "Margin": "間隔",
-        "Marker": "マーカー",
-        "Measure": "計測",
-        "Middle": "中央",
-        "New Folder": "新規フォルダ",
-        "New window (_blank)": "新しいウィンドウ (_blank)",
-        "No Files Found": "ファイルがありません",
-        "No Image Available": "画像がありません",
-        "None (use implicit)": "なし (デフォルトに任せる)",
-        "Not set": "なし",
-        "OK": "OK",
-        "Padding": "余白",
-        "Positioning of this image": "この画像の配置",
-        "Preview": "表示",
-        "Quality:": "画質:",
-        "Refresh": "更新",
-        "Rename": "名前の変更",
-        "Resize": "サイズ変更",
-        "Right": "右",
-        "Rotate": "回転",
-        "Rotate Image": "画像を回転",
-        "Same frame (_self)": "自己フレーム内 (_self)",
-        "Save": "保存",
-        "Start X:": "開始 X",
-        "Start Y:": "開始 Y",
-        "Target Window": "ターゲット",
-        "Texttop": "テキスト上部",
-        "Title (tooltip)": "タイトル",
-        "Top": "上",
-        "Top frame (_top)": "最上位フレーム (_top)",
-        "Trash": "削除",
-        "Upload": "アップロード",
-        "W:": "W:",
-        "Width": "幅",
-        "Width:": "幅:",
-        "You must select some text before making a new link.": "リンクを作成するにはテキストを選択する必要があります。",
-        "Zoom": "拡大率:"
-    },
-    "Filter": {
-        "Filter": "フィルター"
-    },
-    "FindReplace": {
-        "Case sensitive search": "大文字/小文字区別",
-        "Clear": "通常表示",
-        "Done": "終了",
-        "Enter the text you want to find": "検索したいテキストを入力します",
-        "Find and Replace": "検索/置換",
-        "Highlight": "強調表示",
-        "Inform a replacement word": "単語の置換を知らせる",
-        "Next": "次を検索",
-        "Options": "設定",
-        "Replace with:": "置換:",
-        "Search for:": "検索:",
-        "Substitute all occurrences": "すべて置換",
-        "Substitute this occurrence?": "置換しますか?",
-        "Undo": "元に戻す",
-        "Whole words only": "完全一致のみ",
-        "found item": "件が検索されました",
-        "found items": "件が検索されました",
-        "not found": "はありません",
-        "replaced item": "件が置換されました",
-        "replaced items": "件が置換されました"
-    },
-    "FormOperations": {
-        "Enter the name for new option.": "新しい選択肢に名前をつけてください。",
-        "Form Editor": "フォームエディタ",
-        "Insert a Form.": "フォームを挿入",
-        "Insert a check box.": "チェックボックスを挿入",
-        "Insert a multi-line text field.": "複数行テキストフィールドを挿入",
-        "Insert a radio button.": "ラジオボタンを挿入",
-        "Insert a select field.": "選択リストを挿入",
-        "Insert a submit/reset button.": "送信/リセットボタンを挿入",
-        "Insert a text, password or hidden field.": "テキスト/パスワード/非表示フィールドを挿入"
-    },
-    "Forms": {
-        "'onClick'=": "'onClick'=",
-        "Access Key:": "アクセスキー:",
-        "Action URL:": "アクションURL:",
-        "Button Script": "ボタンスクリプト",
-        "Cancel": "中止",
-        "Checked": "チェック済み",
-        "Columns:": "列数:",
-        "Default text (optional)": "テキスト初期値(オプション)",
-        "Dimensions": "大きさ",
-        "Disabled": "無効",
-        "Encoding:": "エンコード:",
-        "For Control:": "制御対象:",
-        "Form": "フォーム",
-        "Form Element: FIELDSET": "フォーム要素: FIELDSET",
-        "Form Element: INPUT": "フォーム要素: INPUT",
-        "Form Element: LABEL": "フォーム要素: LABEL",
-        "Form Element: SELECT": "フォーム要素: SELECT",
-        "Form Element: TEXTAREA": "フォーム要素: TEXTAREA",
-        "Form Name:": "フォーム名:",
-        "Form handler script": "フォーム処理スクリプト",
-        "Get": "GET",
-        "HTML-Form to CGI (default)": "HTMLフォームからCGIへ(デフォルト)",
-        "Hard": "ハード",
-        "Height in number of rows": "行数による高さ",
-        "Image URL:": "画像URL:",
-        "Image source": "画像ソース",
-        "Initial Text:": "初期テキスト:",
-        "Javascript for button click": "ボタンクリック時のJavaScritp",
-        "Label:": "ラベル:",
-        "Legend:": "グループ名:",
-        "Max length:": "最大長:",
-        "Maximum number of characters accepted": "入力可能な最大文字数",
-        "Method:": "メソッド:",
-        "Name": "名前",
-        "Name of the form input": "フォーム入力の名前",
-        "Name/ID:": "名前/ID:",
-        "OK": "OK",
-        "Off": "オフ",
-        "Options": "選択肢",
-        "Physical": "物理的",
-        "Please enter a Label": "ラベルを入力してください",
-        "Post": "POST",
-        "Read Only": "読み取り専用",
-        "Rows:": "行数:",
-        "Size of text box in characters": "文字数によるテキストボックスの大きさ",
-        "Size:": "サイズ:",
-        "Soft": "ソフト",
-        "Tab Index:": "タブ順序:",
-        "Target Frame:": "ターゲット:",
-        "Text:": "テキスト:",
-        "URL of image": "画像のURL",
-        "Value of the form input": "フォーム入力の値",
-        "Value:": "値:",
-        "Virtual": "仮想",
-        "Width in number of characters": "文字数による幅",
-        "Wrap Mode:": "折り返し:",
-        "You must enter a Name": "名前が必要です",
-        "multipart Form Data (File-Upload)": "マルチパート(ファイルアップロード用)",
-        "name of the textarea": "テキストエリアの名前",
-        "normal": "標準",
-        "nowrap": "折り返しなし",
-        "pre": "フォーマット済み"
-    },
-    "FullPage": {
-        "Alternate style-sheet:": "代替スタイルシート:",
-        "Background color:": "背景色:",
-        "Cancel": "中止",
-        "Character set:": "文字セット:",
-        "DOCTYPE:": "DOCTYPE:",
-        "Description:": "説明:",
-        "Document properties": "文書のプロパティ",
-        "Document title:": "文書の表題:",
-        "Keywords:": "キーワード:",
-        "OK": "OK",
-        "Primary style-sheet:": "優先スタイルシート:",
-        "Text color:": "文字色:",
-        "UTF-8 (recommended)": "UTF-8 (推奨)"
-    },
-    "FullScreen": {
-        "Maximize/Minimize Editor": "エディタの最大化/最小化"
-    },
-    "HorizontalRule": {
-        "Alignment:": "行揃え:",
-        "Cancel": "中止",
-        "Center": "中央",
-        "Color:": "色:",
-        "Height:": "高さ:",
-        "Horizontal Rule": "水平線",
-        "Insert/edit horizontal rule": "水平線の挿入/修正",
-        "Layout": "レイアウト",
-        "Left": "左",
-        "No shading": "影付けなし",
-        "OK": "OK",
-        "Right": "右",
-        "Style": "スタイル",
-        "Width:": "幅:",
-        "percent": "パーセント",
-        "pixels": "ピクセル"
-    },
-    "HtmlTidy": {
-        "Auto-Tidy": "自動適正化",
-        "Don't Tidy": "適正化しない",
-        "HTML Tidy": "HTML Tidy",
-        "Tidy failed.  Check your HTML for syntax errors.": "適正化に失敗しました。HTMLの文法エラーを確認してください。"
-    },
-    "ImageManager": {
-        "Absbottom": "下(絶対的)",
-        "Absmiddle": "中央(絶対的)",
-        "Angle:": "角度:",
-        "Baseline": "ベースライン",
-        "Bottom": "下",
-        "Cancel": "中止",
-        "Clear": "クリア",
-        "Constrain Proportions": "縦横比を固定",
-        "Crop": "切り抜き",
-        "Directory": "ディレクトリ",
-        "Directory Up": "親ディレクトリへ",
-        "Edit": "編集",
-        "Filename:": "ファイル名:",
-        "Flip Horizontal": "左右反転",
-        "Flip Image": "画像を反転",
-        "Flip Vertical": "上下反転",
-        "Folder Name:": "フォルダ名:",
-        "GIF format is not supported, image editing not supported.": "GIF形式はサポートされていないため、画像編集できません。",
-        "Height:": "高さ:",
-        "Image Format": "画像形式",
-        "Insert Image": "画像の挿入",
-        "Invalid base directory:": "無効なディレクトリ:",
-        "JPEG High": "JPEG 高画質",
-        "JPEG Low": "JPEG 低画質",
-        "JPEG Medium": "JPEG 標準",
-        "Left": "左",
-        "Lock": "ロック",
-        "Marker": "マーカー",
-        "Measure": "計測",
-        "Middle": "中央",
-        "New Folder": "新規フォルダ",
-        "No Image Available": "画像がありません",
-        "Not set": "なし",
-        "OK": "OK",
-        "Positioning of this image": "この画像の配置",
-        "Quality:": "画質:",
-        "Refresh": "更新",
-        "Resize": "サイズ変更",
-        "Right": "右",
-        "Rotate": "回転",
-        "Rotate Image": "画像を回転",
-        "Save": "保存",
-        "Start X:": "開始 X",
-        "Start Y:": "開始 Y",
-        "Texttop": "テキスト上部",
-        "Top": "上",
-        "Trash": "削除",
-        "W:": "W:",
-        "Width:": "幅:"
-    },
-    "InlineStyler": {
-        "Background": "背景",
-        "Baseline": "ベースライン",
-        "Border": "ボーダー",
-        "Bottom": "下",
-        "CSS Style": "CSSスタイル",
-        "Center": "中央",
-        "Char": "文字",
-        "Collapsed borders": "隣接境界線を重ねる",
-        "FG Color": "前景色",
-        "Float": "フロート",
-        "Height": "高さ",
-        "Image URL": "画像URL",
-        "Justify": "両端揃え",
-        "Layout": "レイアウト",
-        "Left": "左",
-        "Margin": "間隔",
-        "Middle": "中央",
-        "None": "なし",
-        "Padding": "余白",
-        "Right": "右",
-        "Text align": "水平位置",
-        "Top": "上",
-        "Vertical align": "垂直位置",
-        "Width": "幅",
-        "percent": "パーセント",
-        "pixels": "ピクセル"
-    },
-    "InsertAnchor": {
-        "Anchor name": "アンカーの名前",
-        "Cancel": "中止",
-        "Delete": "削除",
-        "Insert Anchor": "アンカーの挿入",
-        "OK": "OK"
-    },
-    "InsertImage": {
-        "Absbottom": "下(絶対的)",
-        "Absmiddle": "中央(絶対的)",
-        "Alignment:": "行揃え:",
-        "Alternate text:": "代替テキスト:",
-        "Baseline": "ベースライン",
-        "Border thickness:": "境界線の幅:",
-        "Bottom": "下",
-        "Cancel": "中止",
-        "Enter the image URL here": "画像のURLをここに入力します",
-        "For browsers that don't support images": "画像表示をサポートしないブラウザに必要です",
-        "Horizontal padding": "水平余白",
-        "Horizontal:": "水平:",
-        "Image Preview:": "画像プレビュー:",
-        "Image URL:": "画像URL:",
-        "Insert Image": "画像の挿入",
-        "Layout": "レイアウト",
-        "Leave empty for no border": "境界線がない場合は空のままにする",
-        "Left": "左",
-        "Middle": "中央",
-        "Not set": "なし",
-        "OK": "OK",
-        "Positioning of this image": "この画像の配置",
-        "Preview": "表示",
-        "Preview the image in a new window": "ウィンドウで画像を表示",
-        "Right": "右",
-        "Spacing": "間隔",
-        "Texttop": "テキスト上部",
-        "Top": "上",
-        "Vertical padding": "垂直余白",
-        "Vertical:": "垂直:",
-        "You must enter the URL": "URLを入力する必要があります"
-    },
-    "InsertMarquee": {
-        "Alternate": "折り返し",
-        "Background-Color:": "背景色:",
-        "Behavior:": "動作:",
-        "Cancel": "中止",
-        "Continuous": "左右連続",
-        "Direction:": "方向:",
-        "Height:": "高さ:",
-        "Insert scrolling marquee": "スクロールマーキーの挿入",
-        "Left": "左",
-        "Marquee Editor": "マーキーエディタ",
-        "Name": "名前",
-        "Name/ID:": "名前/ID",
-        "OK": "OK",
-        "Right": "右",
-        "Scroll Amount:": "スクロール量:",
-        "Scroll Delay:": "スクロール遅延:",
-        "Slide": "スライド",
-        "Speed Control": "速度調整",
-        "Text:": "テキスト:",
-        "Width:": "幅:"
-    },
-    "InsertNote": {
-        "Cancel": "中止"
-    },
-    "InsertPagebreak": {
-        "Page break": "改ページ"
-    },
-    "InsertPicture": {
-        "Absbottom": "下(絶対的)",
-        "Absmiddle": "中央(絶対的)",
-        "Alignment:": "行揃え:",
-        "Alternate text:": "代替テキスト:",
-        "Baseline": "ベースライン",
-        "Border thickness:": "境界線の幅:",
-        "Bottom": "下",
-        "Cancel": "中止",
-        "Enter the image URL here": "画像のURLをここに入力します",
-        "For browsers that don't support images": "画像表示をサポートしないブラウザに必要です",
-        "Height:": "高さ:",
-        "Horizontal padding": "水平余白",
-        "Horizontal:": "水平:",
-        "Image Preview:": "画像プレビュー:",
-        "Image URL:": "画像URL:",
-        "Insert Image": "画像の挿入",
-        "Layout": "レイアウト",
-        "Leave empty for no border": "境界線がない場合は空のままにする",
-        "Left": "左",
-        "Middle": "中央",
-        "Not set": "なし",
-        "OK": "OK",
-        "Open file in new window": "新しいウィンドウでファイルを開く",
-        "Positioning of this image": "この画像の配置",
-        "Preview": "表示",
-        "Preview the image in a new window": "ウィンドウで画像を表示",
-        "Right": "右",
-        "Size": "サイズ",
-        "Spacing": "間隔",
-        "Texttop": "テキスト上部",
-        "Top": "上",
-        "Upload file": "UPLOAD FILE",
-        "Vertical padding": "垂直余白",
-        "Vertical:": "垂直:",
-        "Width:": "幅:"
-    },
-    "InsertSmiley": {
-        "Insert Smiley": "スマイリーの挿入"
-    },
-    "InsertSnippet": {
-        "Cancel": "中止",
-        "Hide preview": "プレビュー非表示",
-        "Insert Snippet": "スニペットの挿入",
-        "Insert as": "形式を選んで挿入",
-        "Show preview": "プレビュー表示",
-        "Variable": "変数"
-    },
-    "InsertSnippet2": {
-        "Cancel": "中止",
-        "Filter": "フィルター",
-        "Insert Snippet": "スニペットの挿入",
-        "Variable": "変数"
-    },
-    "InsertTable": {
-        "Absbottom": "下(絶対的)",
-        "Absmiddle": "中央(絶対的)",
-        "Alignment:": "行揃え:",
-        "Baseline": "ベースライン",
-        "Border": "ボーダー",
-        "Border thickness:": "境界線の幅:",
-        "Bottom": "下",
-        "Cancel": "中止",
-        "Caption": "キャプション",
-        "Cell padding:": "セル余白:",
-        "Cell spacing:": "セル間隔:",
-        "Cols:": "列:",
-        "Em": "相対値(em)",
-        "Fixed width columns": "列の幅を固定",
-        "Insert Table": "テーブルの挿入",
-        "Layout": "レイアウト",
-        "Leave empty for no border": "境界線がない場合は空のままにする",
-        "Left": "左",
-        "Middle": "中央",
-        "Not set": "なし",
-        "Number of columns": "列数",
-        "Number of rows": "行数",
-        "OK": "OK",
-        "Percent": "パーセント(%)",
-        "Pixels": "ピクセル(px)",
-        "Positioning of this table": "このテーブルの配置",
-        "Right": "右",
-        "Rows:": "行数:",
-        "Space between adjacent cells": "隣接するセル間の距離",
-        "Space between content and border in cell": "セル内における内容と境界線との距離",
-        "Spacing": "間隔",
-        "Texttop": "テキスト上部",
-        "Top": "上",
-        "Width of the table": "テーブルの幅",
-        "Width unit": "幅の単位",
-        "Width:": "幅:",
-        "You must enter a number of columns": "列数を入力してください",
-        "You must enter a number of rows": "行数を入力してください"
-    },
-    "LangMarks": {
-        "&mdash; language &mdash;": "&mdash; 言語 &mdash;",
-        "English": "英語",
-        "French": "フランス語",
-        "Greek": "ギリシャ語",
-        "Latin": "ラテン語",
-        "language select": "言語の選択"
-    },
-    "Linker": {
-        "Are you sure you wish to remove this link?": "本当にこのリンクを削除しますか?",
-        "Cancel": "中止",
-        "Email Address:": "アドレス:",
-        "Email Link": "Eメールリンク",
-        "Insert/Modify Link": "リンクの挿入/修正",
-        "Location Bar:": "アドレスバー",
-        "Menu Bar:": "メニュー",
-        "Message Template:": "本文雛形:",
-        "Name:": "名前:",
-        "New Window": "新しいウィンドウ",
-        "OK": "OK",
-        "Ordinary Link": "標準リンク",
-        "Popup Window": "ポップアップウィンドウ",
-        "Remove Link": "リンク削除",
-        "Resizeable:": "リサイズ",
-        "Same Window (jump out of frames)": "同一ウィンドウ (フレーム最上位)",
-        "Scrollbars:": "スクロール",
-        "Size:": "サイズ:",
-        "Status Bar:": "ステータスバー",
-        "Subject:": "件名:",
-        "Target:": "ターゲット:",
-        "Toolbar:": "ツールバー",
-        "URL Link": "URLリンク",
-        "URL:": "URL:",
-        "You must select some text before making a new link.": "リンクを作成するにはテキストを選択する必要があります"
-    },
-    "ListType": {
-        "Choose list style type (for ordered lists)": "リスト形式の選択(順序付けリスト用)",
-        "Decimal numbers": "10進数",
-        "Lower greek letters": "ギリシャ文字(小文字)",
-        "Lower latin letters": "アルファベット(小文字)",
-        "Lower roman numbers": "ローマ数字(小文字)",
-        "Upper latin letters": "アルファベット(大文字)",
-        "Upper roman numbers": "ローマ数字(大文字)"
-    },
-    "MootoolsFileManager": {
-        "Insert File Link": "ファイルへのリンクを挿入",
-        "You must select some text before making a new link.": "リンクを作成するにはテキストを選択する必要があります"
-    },
-    "NoteServer": {
-        "Add GUIDO Code in a textbox on the page": "ページ内のテキストボックスにGUIDOコードを追加",
-        "Add MIDI link to allow students to hear the music": "MIDIへのリンクを追加し、楽曲を聴かせてもよい",
-        "Cancel": "中止",
-        "Format": "フォーマット",
-        "Guido code": "GUIDOコード",
-        "Image Preview": "画像プレビュー",
-        "Image in applet": "アプレット画像",
-        "Insert GUIDO Music Notation": "GUIDO Music Notationの挿入",
-        "MIDI File": "MIDIファイル",
-        "OK": "OK",
-        "Options": "オプション",
-        "Preview": "表示",
-        "Preview the image in a new window": "ウィンドウで画像を表示",
-        "Source Code": "ソースコード",
-        "With Mozilla, the applet will not be visible in editor, but only in Web page after submitting.": "Mozillaではエディタ内にアプレットは表示されませんが、送信後のWebページ内では有効です。",
-        "Zoom": "拡大率:"
-    },
-    "Opera": {
-        "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キーを押して直接貼り付けてください。"
-    },
-    "PSLocal": {
-        "Cancel": "中止"
-    },
-    "PasteText": {
-        "Cancel": "中止",
-        "OK": "OK",
-        "Paste as Plain Text": "プレーンテキストとして貼り付け"
-    },
-    "PersistentStorage": {
-        "Cancel": "中止",
-        "Copy": "コピー",
-        "Delete": "削除",
-        "Directory Up": "親ディレクトリへ",
-        "File Manager": "ファイルマネージャ",
-        "Filename": "ファイル名:",
-        "Insert Image": "画像の挿入",
-        "New Folder": "新規フォルダ",
-        "Save": "保存",
-        "You must select some text before making a new link.": "リンクを作成するにはテキストを選択する必要があります"
-    },
-    "QuickTag": {
-        "ATTRIBUTES": "属性",
-        "Cancel": "中止",
-        "Colors": "色",
-        "Enter the TAG you want to insert": "挿入したいタグを入力",
-        "No CSS class avaiable": "CSSクラスがありません",
-        "OPTIONS": "選択肢",
-        "Ok": "OK",
-        "Quick Tag Editor": "クイックタグエディタ",
-        "TAGs": "タグ",
-        "There are some unclosed quote": "閉じていない引用符があります",
-        "This attribute already exists in the TAG": "タグにはすでに同じ属性があります",
-        "You have to select some text": "テキストを選択しなければなりません"
-    },
-    "SaveSubmit": {
-        "Ready": "レディ",
-        "Save": "保存",
-        "Saving...": "保存中...",
-        "in progress": "処理中"
-    },
-    "SetId": {
-        "Cancel": "中止",
-        "Delete": "削除",
-        "ID/Name:": "ID/名前:",
-        "OK": "OK",
-        "Set ID/Name": "IDと名前の設定",
-        "Set Id and Name": "IDと名前の設定"
-    },
-    "SmartReplace": {
-        "ClosingDoubleQuotes": "“",
-        "ClosingSingleQuote": "‘",
-        "Convert all quotes and dashes in the current document": "文書内の引用符とダッシュをすべて変換",
-        "Enable automatic replacements": "自動置換の有効化",
-        "OK": "OK",
-        "OpeningDoubleQuotes": "„",
-        "OpeningSingleQuote": "‚",
-        "SmartReplace Settings": "SmartReplace設定"
-    },
-    "SpellChecker": {
-        "Cancel": "中止",
-        "Dictionary": "辞書",
-        "Finished list of mispelled words": "つづり間違単語の一覧",
-        "I will open it in a new page.": "新しいページで開きます。",
-        "Ignore": "無視",
-        "Ignore all": "すべて無視",
-        "Info": "情報",
-        "Learn": "学習",
-        "No mispelled words found with the selected dictionary.": "選択された辞書にはつづり間違い単語がありません。",
-        "OK": "OK",
-        "Original word": "元の単語",
-        "Please confirm that you want to open this link": "本当にこのリンクを開きますか",
-        "Please wait.  Calling spell checker.": "しばらくお待ちください。スペルチェッカーを呼び出しています。",
-        "Please wait: changing dictionary to": "しばらくお待ちください: 辞書を切り替えています",
-        "Re-check": "再チェック",
-        "Replace": "置換",
-        "Replace all": "すべて置換",
-        "Replace with": "これに置換",
-        "Revert": "戻す",
-        "Spell-check": "スペルチェック",
-        "Suggestions": "候補",
-        "This will drop changes and quit spell checker.  Please confirm.": "変更を破棄してスペルチェッカーを終了します。よろしいいですか。"
-    },
-    "Stylist": {
-        "Styles": "スタイル"
-    },
-    "SuperClean": {
-        "Cancel": "中止",
-        "Clean up HTML": "HTMLのクリーンナップ",
-        "General tidy up and correction of some problems.": "一般的な適正化といくつかの問題を修正します。",
-        "OK": "OK",
-        "Please select from the following cleaning options...": "以下のクリーンナップオプションを選択してください...",
-        "Remove custom font sizes.": "独自フォントサイズ設定の除去。",
-        "Remove custom text colors.": "独自文字色設定の除去。",
-        "Remove custom typefaces (font \"styles\").": "独自フォント名設定の除去 (font face)。",
-        "Remove lang attributes.": "言語属性の除去。",
-        "Replace directional quote marks with non-directional quote marks.": "方向つき引用符を方向なし引用符に置換。"
-    },
-    "TableOperations": {
-        "All four sides": "四辺すべて",
-        "Borders": "境界線",
-        "Cancel": "中止",
-        "Caption": "キャプション",
-        "Cell Properties": "セルプロパティ",
-        "Cell properties": "セルのプロパティ",
-        "Columns": "列数:",
-        "Delete cell": "セルの削除",
-        "Delete column": "列の削除",
-        "Delete row": "行の削除",
-        "Description": "説明",
-        "Frame and borders": "外枠と境界線",
-        "Frames": "外枠",
-        "Insert cell after": "次にセルを挿入",
-        "Insert cell before": "前にセルを挿入",
-        "Insert column after": "右に列を挿入",
-        "Insert column before": "左に列を挿入",
-        "Insert row after": "下に行を挿入",
-        "Insert row before": "上に行を挿入",
-        "Merge Cells": "セルの結合",
-        "Merge cells": "セルの結合",
-        "No rules": "区切りなし",
-        "No sides": "外枠なし",
-        "OK": "OK",
-        "Padding": "余白",
-        "Please click into some cell": "いずれかのセル内をクリックしてください",
-        "Row Properties": "行プロパティ",
-        "Row properties": "行のプロパティ",
-        "Rows": "行数:",
-        "Rules will appear between all rows and columns": "すべての行間と列間に線を引く",
-        "Rules will appear between columns only": "列の間にのみ線を引く",
-        "Rules will appear between rows only": "行の間にのみ線を引く",
-        "Spacing": "間隔",
-        "Spacing and padding": "間隔と余白",
-        "Split column": "列の分割",
-        "Split row": "行の分割",
-        "Summary": "要約",
-        "Table Properties": "テーブルのプロパティ",
-        "Table properties": "テーブルのプロパティ",
-        "The bottom side only": "下辺のみ",
-        "The left-hand side only": "左辺のみ",
-        "The right and left sides only": "左右辺のみ",
-        "The right-hand side only": "右辺のみ",
-        "The top and bottom sides only": "上下辺のみ",
-        "The top side only": "上辺のみ",
-        "Xinha cowardly refuses to delete the last cell in row.": "安全のために、行にひとつだけ残っている列の削除は拒否されます。",
-        "Xinha cowardly refuses to delete the last column in table.": "安全のために、テーブルにひとつだけ残っている列の削除は拒否されます。",
-        "Xinha cowardly refuses to delete the last row in table.": "安全のために、テーブルにひとつだけ残っている行の削除は拒否されます。",
-        "pixels": "ピクセル"
-    },
-    "Template": {
-        "Cancel": "中止",
-        "Insert template": "テンプレートの挿入"
-    },
-    "UnFormat": {
-        "All": "すべて",
-        "All HTML:": "全HTMLタグ:",
-        "Cancel": "中止",
-        "Cleaning Area": "クリーニング領域",
-        "Cleaning options": "クリーニングオプション",
-        "Formatting:": "書式指定タグ:",
-        "OK": "OK",
-        "Page Cleaner": "ページクリーナー",
-        "Select which types of formatting you would like to remove.": "削除する書式を選択してください。",
-        "Selection": "選択部分"
-    },
-    "Xinha": {
-        "&#8212; font &#8212;": "&#8212; フォント &#8212;",
-        "&#8212; format &#8212;": "&#8212; 書式 &#8212;",
-        "&#8212; size &#8212;": "&#8212; サイズ &#8212;",
-        "About this editor": "バージョン情報",
-        "Address": "アドレス",
-        "Background Color": "背景色",
-        "Bold": "太字",
-        "Bulleted List": "記号付き箇条書き",
-        "Clean content pasted from Word": "Wordから貼り付けられた内容の清書",
-        "Clear Inline Font Specifications": "インラインフォント指定をクリア",
-        "Clear MSOffice tags": "MSOfficeタグをクリア",
-        "Close": "閉じる",
-        "Constructing object": "オブジェクト構築中",
-        "Copy selection": "コピー",
-        "Create Statusbar": "ステータスバーの作成",
-        "Create Toolbar": "ツールバーの作成",
-        "Current style": "現在のスタイル",
-        "Cut selection": "切り取り",
-        "Decrease Indent": "インデント解除",
-        "Direction left to right": "左から右へ",
-        "Direction right to left": "右から左へ",
-        "ENTER": "ENTER",
-        "Editor Help": "エディタのヘルプ",
-        "Finishing": "完了",
-        "Font Color": "文字色",
-        "Formatted": "整形済み",
-        "Generate Xinha framework": "Xinhaフレームワーク生成中",
-        "Heading 1": "見出し1",
-        "Heading 2": "見出し2",
-        "Heading 3": "見出し3",
-        "Heading 4": "見出し4",
-        "Heading 5": "見出し5",
-        "Heading 6": "見出し6",
-        "Headings": "見出し",
-        "Help using editor": "ヘルプ",
-        "Horizontal Rule": "水平線",
-        "Increase Indent": "インデント設定",
-        "Init editor size": "エディタサイズの初期化",
-        "Insert Table": "テーブルの挿入",
-        "Insert Web Link": "リンクの挿入",
-        "Insert/Modify Image": "画像の挿入/修正",
-        "Insert/Overwrite": "挿入/上書き",
-        "Italic": "斜体",
-        "Justify Center": "中央寄せ",
-        "Justify Full": "均等割付",
-        "Justify Left": "左寄せ",
-        "Justify Right": "右寄せ",
-        "Keyboard shortcuts": "キーボードショートカット",
-        "Loading in progress. Please wait!": "ロード中です。しばらくお待ちください",
-        "Loading plugin $plugin": "ロード中プラグイン $plugin",
-        "Normal": "標準",
-        "Ordered List": "番号付き箇条書き",
-        "Paste from clipboard": "貼り付け",
-        "Path": "パス",
-        "Print document": "印刷",
-        "Redoes your last action": "やり直し",
-        "Register plugin $plugin": "登録中プラグイン $plugin",
-        "Remove formatting": "書式削除",
-        "SHIFT-ENTER": "SHIFT+ENTER",
-        "Save as": "名前をつけて保存",
-        "Select all": "すべて選択",
-        "Set format to paragraph": "段落書式の設定",
-        "Split Block": "領域分割",
-        "Strikethrough": "打ち消し線",
-        "Subscript": "下付き添え字",
-        "Superscript": "上付き添え字",
-        "The editor provides the following key combinations:": "エディタは以下のキー操作を提供しています:",
-        "Toggle Borders": "境界線の切替",
-        "Toggle HTML Source": "HTML編集モードを切替",
-        "Underline": "下線",
-        "Undoes your last action": "元に戻す",
-        "Would you like to clear font colours?": "色をクリアしますか?",
-        "Would you like to clear font sizes?": "サイズをクリアしますか?",
-        "Would you like to clear font typefaces?": "フォント名をクリアしますか?",
-        "You are in TEXT MODE.  Use the [<>] button to switch back to WYSIWYG.": "テキストモードで操作しています。WYSIWYG編集に戻るには[<>]ボタンを使ってください。",
-        "insert linebreak": "段落内改行の挿入",
-        "new paragraph": "新規段落"
-    },
-    "__NEW_TRANSLATIONS__": {
-        "CharCounter": {
-            "HTML": ""
-        },
-        "Dialogs": {
-            "Some Text Here": ""
-        },
-        "EditTag": {
-            "Edit Tag By Peg": ""
-        },
-        "Equation": {
-            "!=": "",
-            "!in": "",
-            "&gt;-": "",
-            "&gt;=": "",
-            "&lt;=": "",
-            "&lt;=&gt;": "",
-            "&lt;x&gt;": "",
-            "&nbsp; `!` &nbsp;": "",
-            "&nbsp; `.` &nbsp;": "",
-            "&nbsp; `0` &nbsp;": "",
-            "&nbsp; `2` &nbsp;": "",
-            "&nbsp; `3` &nbsp;": "",
-            "&nbsp; `4` &nbsp;": "",
-            "&nbsp; `5` &nbsp;": "",
-            "&nbsp; `6` &nbsp;": "",
-            "&nbsp; `7` &nbsp;": "",
-            "&nbsp; `8` &nbsp;": "",
-            "&nbsp; `9` &nbsp;": "",
-            "&nbsp; `e` &nbsp;": "",
-            "&nbsp;&nbsp;`1` &nbsp;": "",
-            "&nbsp;`+{::}`&nbsp;": "",
-            "&nbsp;`-:\\ `": "",
-            "&nbsp;`-{::}`&nbsp;": "",
-            "&nbsp;`C`&nbsp;": "",
-            "&nbsp;`cos`": "",
-            "&nbsp;`ln`&nbsp;": "",
-            "&nbsp;`pi` &nbsp;": "",
-            "&nbsp;`sin`": "",
-            "&nbsp;`tan`": "",
-            "&nbsp;`times`&nbsp;": "",
-            "&quot;text&quot;": "",
-            "'+formula+'": "",
-            "((n),(k))": "",
-            "(x+1)/(x-1)": "",
-            "*": "",
-            "**": "",
-            "+-": "",
-            "-&gt;": "",
-            "-&lt;": "",
-            "-:": "",
-            "-=": "",
-            "//": "",
-            "/_": "",
-            ":.": "",
-            "=&gt;": "",
-            "@": "",
-            "[[a,b],[c,d]]": "",
-            "\\\\": "",
-            "\\nClick in the box to use your keyboard or use the buttons\\n": "",
-            "^^": "",
-            "^^^": "",
-            "__|": "",
-            "_|_": "",
-            "`!=`": "",
-            "`!in`": "",
-            "`&and;`": "",
-            "`&cap;`": "",
-            "`&cup;`": "",
-            "`&gt;-`": "",
-            "`&gt;=`": "",
-            "`&lt;=&gt;`": "",
-            "`&lt;=`": "",
-            "`&lt;x&gt;`": "",
-            "`&or;`": "",
-            "`&quot;text&quot;`": "",
-            "`((n),(k))`": "",
-            "`(x+1)/(x-1)`": "",
-            "`**`": "",
-            "`*`": "",
-            "`+-`": "",
-            "`-&gt;`": "",
-            "`-&lt;`": "",
-            "`-:`": "",
-            "`-=`": "",
-            "`//`": "",
-            "`/_`": "",
-            "`:.`": "",
-            "`=&gt;`": "",
-            "`@`": "",
-            "`[[a,b],[c,d]]`": "",
-            "`\\\\`": "",
-            "`__|`": "",
-            "`_|_`": "",
-            "`AA`": "",
-            "`aleph`": "",
-            "`alpha`": "",
-            "`and`": "",
-            "`bara`": "",
-            "`bba`": "",
-            "`bbba`": "",
-            "`beta`": "",
-            "`CC`": "",
-            "`cca`": "",
-            "`chi`": "",
-            "`darr`": "",
-            "`ddota`": "",
-            "`del`": "",
-            "`delta`": "",
-            "`Delta`": "",
-            "`diamond`": "",
-            "`dota`": "",
-            "`dy/dx`": "",
-            "`EE`": "",
-            "`epsi`": "",
-            "`eta`": "",
-            "`fra`": "",
-            "`gamma`": "",
-            "`Gamma`": "",
-            "`grad`": "",
-            "`harr`": "",
-            "`hArr`": "",
-            "`hata`": "",
-            "`if`": "",
-            "`in`": "",
-            "`int`": "",
-            "`iota`": "",
-            "`kappa`": "",
-            "`lambda`": "",
-            "`Lambda`": "",
-            "`larr`": "",
-            "`lArr`": "",
-            "`lim_(x-&gt;oo)`": "",
-            "`log`": "",
-            "`mu`": "",
-            "`NN`": "",
-            "`nn`": "",
-            "`not`": "",
-            "`nu`": "",
-            "`o+`": "",
-            "`o.`": "",
-            "`O/`": "",
-            "`oint`": "",
-            "`omega`": "",
-            "`Omega`": "",
-            "`oo`": "",
-            "`or`": "",
-            "`ox`": "",
-            "`phi`": "",
-            "`Phi`": "",
-            "`Pi`": "",
-            "`pi`": "",
-            "`prod`": "",
-            "`prop`": "",
-            "`psi`": "",
-            "`Psi`": "",
-            "`QQ`": "",
-            "`quad`": "",
-            "`rArr`": "",
-            "`rho`": "",
-            "`root(n)(x)`": "",
-            "`RR`": "",
-            "`sfa`": "",
-            "`Sigma`": "",
-            "`sigma`": "",
-            "`sqrt(x)`": "",
-            "`square`": "",
-            "`stackrel(-&gt;)(+)`": "",
-            "`sub`": "",
-            "`sube`": "",
-            "`sum`": "",
-            "`sup`": "",
-            "`supe`": "",
-            "`tau`": "",
-            "`theta`": "",
-            "`Theta`": "",
-            "`TT`": "",
-            "`tta`": "",
-            "`uarr`": "",
-            "`ula`": "",
-            "`upsilon`": "",
-            "`uu`": "",
-            "`veca`": "",
-            "`vv`": "",
-            "`x_(mn)`": "",
-            "`Xi`": "",
-            "`xi`": "",
-            "`xx`": "",
-            "`zeta`": "",
-            "`ZZ`": "",
-            "`|-&gt;`": "",
-            "`|--`": "",
-            "`|==`": "",
-            "`|__`": "",
-            "`|~`": "",
-            "`~=`": "",
-            "`~|`": "",
-            "`~~`": "",
-            "AA": "",
-            "aleph": "",
-            "alpha": "",
-            "and": "",
-            "AsciiMathML Example": "",
-            "bara": "",
-            "Based on ASCIIMathML by": "",
-            "bba": "",
-            "bbba": "",
-            "beta": "",
-            "CC": "",
-            "cca": "",
-            "chi": "",
-            "darr": "",
-            "ddota": "",
-            "del": "",
-            "delta": "",
-            "Delta": "",
-            "diamond": "",
-            "dota": "",
-            "dy/dx": "",
-            "EE": "",
-            "epsi": "",
-            "eta": "",
-            "For more information on AsciiMathML visit this page:": "",
-            "fra": "",
-            "gamma": "",
-            "Gamma": "",
-            "grad": "",
-            "harr": "",
-            "hArr": "",
-            "hata": "",
-            "if": "",
-            "in": "",
-            "int": "",
-            "int_a^bf(x)dx": "",
-            "iota": "",
-            "kappa": "",
-            "Lambda": "",
-            "lambda": "",
-            "lArr": "",
-            "larr": "",
-            "lim_(x-&gt;oo)": "",
-            "mu": "",
-            "NN": "",
-            "nn": "",
-            "nnn": "",
-            "not": "",
-            "nu": "",
-            "o+": "",
-            "o.": "",
-            "O/": "",
-            "oint": "",
-            "Omega": "",
-            "omega": "",
-            "oo": "",
-            "or": "",
-            "ox": "",
-            "phi": "",
-            "Phi": "",
-            "Pi": "",
-            "pi": "",
-            "prod": "",
-            "prop": "",
-            "psi": "",
-            "Psi": "",
-            "QQ": "",
-            "quad": "",
-            "rArr": "",
-            "rho": "",
-            "root(n)(x)": "",
-            "RR": "",
-            "sfa": "",
-            "Sigma": "",
-            "sigma": "",
-            "sqrt(x)": "",
-            "square": "",
-            "stackrel(-&gt;)(+)": "",
-            "sub": "",
-            "sube": "",
-            "sum": "",
-            "sum_(n=1)^oo": "",
-            "sup": "",
-            "supe": "",
-            "tau": "",
-            "theta": "",
-            "Theta": "",
-            "TT": "",
-            "tta": "",
-            "uarr": "",
-            "ula": "",
-            "upsilon": "",
-            "uu": "",
-            "uuu": "",
-            "veca": "",
-            "vv": "",
-            "vvv": "",
-            "x^(m+n)": "",
-            "x_(mn)": "",
-            "Xi": "",
-            "xi": "",
-            "xx": "",
-            "zeta": "",
-            "ZZ": "",
-            "|-&gt;": "",
-            "|--": "",
-            "|==": "",
-            "|__": "",
-            "|~": "",
-            "~=": "",
-            "~|": "",
-            "~~": ""
-        },
-        "FancySelects": {
-            "'+opt.text+'": ""
-        },
-        "FindReplace": {
-            "';\r\n  var tagc = '": ""
-        },
-        "FormOperations": {
-            "Message Sent": "",
-            "Please Select...": ""
-        },
-        "Forms": {
-            "Insert/Edit Form": "",
-            "Insert/Edit Form Element FIELDSET": "",
-            "Insert/Edit Form Element INPUT": "",
-            "Insert/Edit Form Element LABEL": "",
-            "Insert/Edit Form Element SELECT": "",
-            "Insert/Edit Form Element TEXTAREA": "",
-            "Name of the form select": ""
-        },
-        "FullPage": {
-            "...": "",
-            "cyrillic (ISO-8859-5)": "",
-            "cyrillic (KOI8-R)": "",
-            "cyrillic (WINDOWS-1251)": "",
-            "western (ISO-8859-1)": ""
-        },
-        "Gecko": {
-            "The Paste button does not work in this browser for security reasons. Press CTRL-V on your keyboard to paste directly.": ""
-        },
-        "HorizontalRule": {
-            "&#x00d7;": "",
-            "&nbsp;": "",
-            "Insert/Edit Horizontal Rule": ""
-        },
-        "InlineStyler": {
-            "-": "<<Equation>>"
-        },
-        "InsertNote": {
-            "Insert": "",
-            "Insert footnote": "",
-            "Insert Note": ""
-        },
-        "InsertPagebreak": {
-            "Page Break": ""
-        },
-        "InsertSnippet": {
-            "\\n  This is an information about something\\n": "",
-            "InsertSnippet for Xinha": "",
-            "Link1": "",
-            "Link2": "",
-            "Link3": "",
-            "Link4": "",
-            "Link5": "",
-            "This is an information about something": ""
-        },
-        "InsertSnippet2": {
-            "All Categories": "",
-            "Insert as HTML": "",
-            "Insert as template variable": "",
-            "Only search word beginning": "",
-            "HTML": "<<CharCounter>>",
-            "InsertSnippet for Xinha": "<<InsertSnippet>>"
-        },
-        "InsertTable": {
-            "Caption for the table": "",
-            "Collapse borders:": "",
-            "Layou": "",
-            "Style of the border": ""
-        },
-        "LangMarks": {
-            "', '": ""
-        },
-        "Linker": {
-            "(px)": "",
-            "Anchor-Link": "",
-            "Anchor:": "",
-            "PopupWindow": "",
-            "Shows On Hover": "",
-            "Title:": ""
-        },
-        "Opera": {
-            "MARK": ""
-        },
-        "PasteText": {
-            "Insert text in new paragraph": ""
-        },
-        "PreserveScripts": {
-            "JavaScript": "",
-            "PHP": ""
-        },
-        "QuickTag": {
-            "',\r\n                           'cl': '": ""
-        },
-        "SetId": {
-            "Set Id/Name": ""
-        },
-        "SmartReplace": {
-            "SmartReplace": ""
-        },
-        "SuperClean": {
-            "Clean bad HTML from Microsoft Word.": "",
-            "Clean Selection Only": "",
-            "Cleaning Scope": "",
-            "Please stand by while cleaning in process...": "",
-            "Remove alignment (left/right/justify).": "",
-            "Remove all classes (CSS).": "",
-            "Remove All HTML Tags": "",
-            "Remove all styles (CSS).": "",
-            "Remove emphasis and annotations.": "",
-            "Remove Paragraphs": "",
-            "Remove superscripts and subscripts.": "",
-            "Vigorously purge HTML from Microsoft Word.": ""
-        },
-        "TableOperations": {
-            "Cell Type:": "",
-            "Cells down": "",
-            "Cells to the right, and": "",
-            "Do Not Change": "",
-            "Header (th)": "",
-            "Merge current cell with:": "",
-            "Normal (td)": ""
-        },
-        "UnsavedChanges": {
-            "You have unsaved changes in the editor": ""
-        },
-        "WebKit": {
-            "The Paste button does not work in this browser for security reasons. Press CTRL-V on your keyboard to paste directly.": "<<Gecko>>"
-        },
-        "Xinha": {
-            "1 (8 pt)": "",
-            "2 (10 pt)": "",
-            "3 (12 pt)": "",
-            "4 (14 pt)": "",
-            "5 (18 pt)": "",
-            "6 (24 pt)": "",
-            "7 (36 pt)": "",
-            "Arial": "",
-            "Courier New": "",
-            "CTRL-0 (zero)": "",
-            "CTRL-1 .. CTRL-6": "",
-            "CTRL-A": "",
-            "CTRL-B": "",
-            "CTRL-C": "",
-            "CTRL-E": "",
-            "CTRL-I": "",
-            "CTRL-J": "",
-            "CTRL-L": "",
-            "CTRL-N": "",
-            "CTRL-R": "",
-            "CTRL-S": "",
-            "CTRL-U": "",
-            "CTRL-V": "",
-            "CTRL-X": "",
-            "CTRL-Y": "",
-            "CTRL-Z": "",
-            "Error Loading Xinha.  Developers, check the Error Console for information.": "",
-            "Georgia": "",
-            "Impact": "",
-            "Loading Core": "",
-            "Loading plugins": "",
-            "MS Word Cleaner": "",
-            "Select Color": "",
-            "Tahoma": "",
-            "Times New Roman": "",
-            "Touch here first to activate editor.": "",
-            "Verdana": "",
-            "Waiting for Iframe to load...": "",
-            "WingDings": "",
-            "Xinha": ""
-        },
-        "BackgroundImage": {
-            "__ TRANSLATOR NOTE __": "*** BACKGROUNDIMAGE IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***",
-            "Set Background": ""
-        },
-        "ExtendedFileManager": {
-            "__ TRANSLATOR NOTE __": "*** EXTENDEDFILEMANAGER IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***",
-            "10%": "",
-            "100%": "",
-            "200%": "",
-            "25%": "",
-            "50%": "",
-            "75%": "",
-            ">List View": "",
-            ">Thumbnail View": "",
-            "A:": "",
-            "D:": "",
-            "File List": "",
-            "Filesize:": "",
-            "Folder": "",
-            "GIF": "",
-            "H:": "",
-            "Image Editor": "",
-            "Image Selection": "",
-            "Maximum folder size limit reached. Upload disabled.": "",
-            "Please enter value": "",
-            "PNG": "",
-            "Preset": "",
-            "Rotate 180 &deg;": "",
-            "Rotate 90 &deg; CCW": "",
-            "Rotate 90 &deg; CW": "",
-            "Toggle marker color": "",
-            "X:": "",
-            "Xinha Image Editor": "",
-            "Y:": ""
-        },
-        "ImageManager": {
-            "__ TRANSLATOR NOTE __": "*** IMAGEMANAGER IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***",
-            "Flickr Picture List": "",
-            "Flickr Pictures": "",
-            "Flickr Selection": "",
-            "Flickr Username/Email": "",
-            "Image List": "",
-            "Keyword": "",
-            "No Images Found": "",
-            "No Photos Found": "",
-            "No Videos Found": "",
-            "This Server": "",
-            "YouTube Selection": "",
-            "YouTube Username": "",
-            "YouTube Video List": "",
-            "YouTube Videos": "",
-            "A:": "<<ExtendedFileManager>>",
-            "D:": "<<ExtendedFileManager>>",
-            "GIF": "<<ExtendedFileManager>>",
-            "H:": "<<ExtendedFileManager>>",
-            "Image Editor": "<<ExtendedFileManager>>",
-            "Image Selection": "<<ExtendedFileManager>>",
-            "PNG": "<<ExtendedFileManager>>",
-            "Rotate 180 &deg;": "<<ExtendedFileManager>>",
-            "Rotate 90 &deg; CCW": "<<ExtendedFileManager>>",
-            "Rotate 90 &deg; CW": "<<ExtendedFileManager>>",
-            "X:": "<<ExtendedFileManager>>",
-            "Y:": "<<ExtendedFileManager>>"
-        },
-        "InsertPicture": {
-            "__ TRANSLATOR NOTE __": "*** INSERTPICTURE IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***",
-            "Leave empty for not defined": "",
-            " Open file in new window": ""
-        },
-        "NoteServer": {
-            "__ TRANSLATOR NOTE __": "*** NOTESERVER IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***",
-            "120%": "",
-            "150%": "",
-            "80%": "",
-            "GUIDO Code": "",
-            "Zoom :": "",
-            "100%": "<<ExtendedFileManager>>"
-        },
-        "PSLocal": {
-            "__ TRANSLATOR NOTE __": "*** PSLOCAL IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***",
-            "Confirm": "",
-            "Enable": "",
-            "Enable Gears in order to use local document storage and configuration.": "",
-            "Enabling Local Storage": "",
-            "Install": "",
-            "Learn About Local Storage": "",
-            "This will reload the page, causing you to lose any unsaved work.  Press \"OK\" to reload.": "",
-            "Xinha uses Google Gears to enable local document storage.  With Gears installed, you can save drafts of your documents on your hard drive, configure Xinha to look the way you want, and carry this information wherever you use Xinha on the web.": ""
-        },
-        "PSServer": {
-            "__ TRANSLATOR NOTE __": "*** PSSERVER IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***",
-            "File: ": "",
-            "Import": ""
-        },
-        "PersistentStorage": {
-            "__ TRANSLATOR NOTE __": "*** PERSISTENTSTORAGE IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***",
-            "Details": "",
-            "File Browser": "",
-            "Hello    There C ": "",
-            "Hello  There A ": "",
-            "Hello \" There B \"": "",
-            "Hello ' There D '": "",
-            "List of Places": "",
-            "New Document": "",
-            "Open": "",
-            "Open Document": "",
-            "Places": "",
-            "Please enter the name of the directory you'd like to create.": "",
-            "Save Document": "",
-            "This will erase any unsaved content.  If you're certain, please click OK to continue.": "",
-            "Web URL": "",
-            "Confirm": "<<PSLocal>>",
-            "File List": "<<ExtendedFileManager>>",
-            "Insert": "<<InsertNote>>"
-        },
-        "SpellChecker": {
-            "__ TRANSLATOR NOTE __": "*** SPELLCHECKER IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***",
-            "HTMLArea Spell Checker": "",
-            "pliz weit ;-)": "",
-            "Spell Checker": ""
-        }
-    }
-}
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/lang/merged/lt.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/lang/merged/lt.js
deleted file mode 100644
index 69d76d3..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/lang/merged/lt.js
+++ /dev/null
@@ -1,1573 +0,0 @@
-// Xinha Language Combined Translation File
-//
-// LANG: "lt", ENCODING: UTF-8
-//
-// INSTRUCTIONS TO TRANSLATORS
-// ===========================================================================
-//
-// Your translation must be in UTF-8 Character Encoding.
-//
-// This is a JSON encoded file (plus comments), strings should be double-quote
-// only, do not use single quotes to surround strings - "hello", not 'hello'
-// do not have a trailing comma after the last entry in a section.
-//
-// Only full line comments are allowed (that a comments occupy entire lines).
-//
-// Search for the __NEW_TRANSLATIONS__ section below, this is where you will
-// want to focus, this section includes things that do not presently have a 
-// translation or for which the translation needs to be checked for accuracy.
-//
-// In the New Translations section a translation string is one of the following
-//
-//  "English String Here" : ""
-//     This means it is not translated yet, add your translation...
-//     "English String Here" : "Klingon String Here"
-//
-//  "English String Here" : "Translated String Here"
-//     This means that an existing translation for this string, in some other
-//     section has been found, and used.  Check that it is approprite for this
-//     section and if it is, that's fine leave it as is, otherwise change as
-//     appropriate.
-//
-//  "English String Here" : "<<AnotherSection>>"
-//     This means use the same translation for this string as <<AnotherSection>>
-//     this saves you re-tranlating strings.  If the Context of this section
-//     and the context of AnotherSection seem the same, that's fine leave it
-//     using that translation, but if this section needs a different translation, 
-//     you can provide it by replacing the link (<<AnotherSection>>) with that
-//     new translation.  For example - a "Table" in say "DataPlugin" is 
-//     perhaps translated differently to "Table" in "FurniturePlugin".
-//
-// TESTING YOUR TRANSLATION
-// ===========================================================================
-// Simply place your translation file on your webserver somewhere for example
-//
-//   /xinha/lang/merged/lt.js
-//
-// and then tell Xinha where to get it (before loading XinhaCore.js) by 
-//
-//  _editor_lang              = 'lt';
-//  _editor_lang_merged_file  = '/xinha/lang/merged/lt.js';
-//
-// Xinha will load your new language definition.
-//
-// SUBMITTING YOUR TRANSLATION
-// ===========================================================================
-// Simply create a Ticket on the Xinha website and attach your translation 
-// file.
-//
-// The Xinha developers will take your file and use the 
-//     contrib/lc_split_merged_file.php
-// script to load it into the Xinha distribution.
-
-{
-    "Abbreviation": {
-        "Cancel": "Atšaukti",
-        "OK": "OK"
-    },
-    "AboutBox": {
-        "About this editor": "Apie redaktorių"
-    },
-    "BackgroundImage": {
-        "Cancel": "Atšaukti"
-    },
-    "ColorPicker": {
-        "OK": "OK"
-    },
-    "ContextMenu": {
-        "Justify Center": "Lygiavimas pagal centrą",
-        "Justify Full": "Lygiuoti pastraipą",
-        "Justify Left": "Lygiavimas pagal kairę",
-        "Justify Right": "Lygiavimas pagal dešinę"
-    },
-    "CreateLink": {
-        "Cancel": "Atšaukti",
-        "Insert/Modify Link": "Idėti/Modifikuoti",
-        "New window (_blank)": "Naujas langas (_blank)",
-        "None (use implicit)": "None (use implicit)",
-        "OK": "OK",
-        "Other": "Kitas",
-        "Same frame (_self)": "Same frame (_self)",
-        "Target:": "Target:",
-        "Title (tooltip):": "Pavadinimas (tooltip):",
-        "Top frame (_top)": "Top frame (_top)",
-        "URL:": "URL:"
-    },
-    "EditTag": {
-        "Cancel": "Atšaukti",
-        "OK": "OK"
-    },
-    "Equation": {
-        "Cancel": "Atšaukti",
-        "OK": "OK"
-    },
-    "ExtendedFileManager": {
-        "Cancel": "Atšaukti",
-        "New window (_blank)": "Naujas langas (_blank)",
-        "None (use implicit)": "None (use implicit)",
-        "OK": "OK",
-        "Same frame (_self)": "Same frame (_self)",
-        "Title (tooltip)": "Pavadinimas (tooltip):",
-        "Top frame (_top)": "Top frame (_top)"
-    },
-    "Forms": {
-        "Cancel": "Atšaukti",
-        "OK": "OK"
-    },
-    "FullPage": {
-        "Cancel": "Atšaukti",
-        "OK": "OK"
-    },
-    "HorizontalRule": {
-        "Cancel": "Atšaukti",
-        "Horizontal Rule": "Horizontali linija",
-        "OK": "OK"
-    },
-    "ImageManager": {
-        "Cancel": "Atšaukti",
-        "OK": "OK"
-    },
-    "InsertAnchor": {
-        "Cancel": "Atšaukti",
-        "OK": "OK"
-    },
-    "InsertImage": {
-        "Cancel": "Atšaukti",
-        "OK": "OK"
-    },
-    "InsertMarquee": {
-        "Cancel": "Atšaukti",
-        "OK": "OK"
-    },
-    "InsertNote": {
-        "Cancel": "Atšaukti"
-    },
-    "InsertPicture": {
-        "Cancel": "Atšaukti",
-        "OK": "OK"
-    },
-    "InsertSnippet": {
-        "Cancel": "Atšaukti"
-    },
-    "InsertSnippet2": {
-        "Cancel": "Atšaukti"
-    },
-    "InsertTable": {
-        "Cancel": "Atšaukti",
-        "Insert Table": "Įterpti lentelę",
-        "OK": "OK"
-    },
-    "Linker": {
-        "Cancel": "Atšaukti",
-        "Insert/Modify Link": "Idėti/Modifikuoti",
-        "OK": "OK",
-        "Target:": "Target:",
-        "URL:": "URL:"
-    },
-    "NoteServer": {
-        "Cancel": "Atšaukti",
-        "OK": "OK"
-    },
-    "PSLocal": {
-        "Cancel": "Atšaukti"
-    },
-    "PasteText": {
-        "Cancel": "Atšaukti",
-        "OK": "OK"
-    },
-    "PersistentStorage": {
-        "Cancel": "Atšaukti"
-    },
-    "QuickTag": {
-        "Cancel": "Atšaukti"
-    },
-    "SetId": {
-        "Cancel": "Atšaukti",
-        "OK": "OK"
-    },
-    "SmartReplace": {
-        "OK": "OK"
-    },
-    "SpellChecker": {
-        "Cancel": "Atšaukti",
-        "OK": "OK"
-    },
-    "SuperClean": {
-        "Cancel": "Atšaukti",
-        "OK": "OK"
-    },
-    "TableOperations": {
-        "Cancel": "Atšaukti",
-        "OK": "OK"
-    },
-    "Template": {
-        "Cancel": "Atšaukti"
-    },
-    "UnFormat": {
-        "Cancel": "Atšaukti",
-        "OK": "OK"
-    },
-    "Xinha": {
-        "About this editor": "Apie redaktorių",
-        "Background Color": "Fono spalva",
-        "Bold": "Paryškinti",
-        "Bulleted List": "Suženklintas sąrašas",
-        "Copy selection": "Kopijuoti",
-        "Current style": "Dabartinis stilius",
-        "Cut selection": "Iškirpti",
-        "Decrease Indent": "Sumažinti paraštę",
-        "Font Color": "Šrifto spalva",
-        "Help using editor": "Pagalba naudojant redaktorių",
-        "Horizontal Rule": "Horizontali linija",
-        "Increase Indent": "Padidinti paraštę",
-        "Insert Table": "Įterpti lentelę",
-        "Insert Web Link": "Įterpti nuorodą",
-        "Insert/Modify Image": "Įterpti paveiksliuką",
-        "Italic": "Kursyvas",
-        "Justify Center": "Lygiavimas pagal centrą",
-        "Justify Full": "Lygiuoti pastraipą",
-        "Justify Left": "Lygiavimas pagal kairę",
-        "Justify Right": "Lygiavimas pagal dešinę",
-        "Ordered List": "Numeruotas sąrašas",
-        "Paste from clipboard": "Įterpti",
-        "Path": "Kelias",
-        "Redoes your last action": "Pakartoja paskutinį atšauktą jūsų veiksmą",
-        "Strikethrough": "Perbraukti",
-        "Subscript": "Apatinis indeksas",
-        "Superscript": "Viršutinis indeksas",
-        "Toggle HTML Source": "Perjungti į HTML/WYSIWYG",
-        "Underline": "Pabraukti",
-        "Undoes your last action": "Atšaukia paskutini jūsų veiksmą",
-        "You are in TEXT MODE.  Use the [<>] button to switch back to WYSIWYG.": "Jūs esete teksto režime.  Naudokite [<>] mygtuką grįžimui į WYSIWYG."
-    },
-    "__NEW_TRANSLATIONS__": {
-        "Abbreviation": {
-            "Abbreviation": "",
-            "Delete": "",
-            "Expansion:": ""
-        },
-        "AboutBox": {
-            "Close": "<<Xinha>>"
-        },
-        "CharCounter": {
-            "... in progress": "",
-            "Chars": "",
-            "HTML": "",
-            "Words": ""
-        },
-        "CharacterMap": {
-            "Insert special character": ""
-        },
-        "ColorPicker": {
-            "Click a color...": "",
-            "Color: ": "",
-            "Sample": "",
-            "Web Safe: ": "",
-            "Close": "<<Xinha>>"
-        },
-        "ContextMenu": {
-            "_Delete Row": "",
-            "_Image Properties...": "",
-            "_Modify Link...": "",
-            "_Remove Link...": "",
-            "_Table Properties...": "",
-            "C_ell Properties...": "",
-            "Chec_k Link...": "",
-            "Copy": "",
-            "Create a link": "",
-            "Current URL is": "",
-            "Cut": "",
-            "De_lete Column": "",
-            "Delete Cell": "",
-            "Delete the current column": "",
-            "Delete the current row": "",
-            "How did you get here? (Please report!)": "",
-            "I_nsert Row Before": "",
-            "In_sert Row After": "",
-            "Insert _Column Before": "",
-            "Insert a new column after the current one": "",
-            "Insert a new column before the current one": "",
-            "Insert a new row after the current one": "",
-            "Insert a new row before the current one": "",
-            "Insert a paragraph after the current node": "",
-            "Insert a paragraph before the current node": "",
-            "Insert C_olumn After": "",
-            "Insert Cell After": "",
-            "Insert Cell Before": "",
-            "Insert paragraph after": "",
-            "Insert paragraph before": "",
-            "Link points to:": "",
-            "Make lin_k...": "",
-            "Merge Cells": "",
-            "Opens this link in a new window": "",
-            "Paste": "",
-            "Please confirm that you want to remove this element:": "",
-            "Please confirm that you want to unlink this element.": "",
-            "Remove the $elem Element...": "",
-            "Remove this node from the document": "",
-            "Ro_w Properties...": "",
-            "Show the image properties dialog": "",
-            "Show the Table Cell Properties dialog": "",
-            "Show the Table Properties dialog": "",
-            "Show the Table Row Properties dialog": "",
-            "Unlink the current element": ""
-        },
-        "CreateLink": {
-            "Are you sure you wish to remove this link?": "",
-            "You need to select some text before creating a link": ""
-        },
-        "DefinitionList": {
-            "definition description": "",
-            "definition list": "",
-            "definition term": ""
-        },
-        "Dialogs": {
-            "Some Text Here": ""
-        },
-        "DynamicCSS": {
-            "Choose stylesheet": "",
-            "Default": "",
-            "Undefined": ""
-        },
-        "EditTag": {
-            "Edit HTML for selected text": "",
-            "Edit Tag By Peg": "",
-            "Tag Editor": ""
-        },
-        "Equation": {
-            "!=": "",
-            "!in": "",
-            "&gt;-": "",
-            "&gt;=": "",
-            "&lt;=": "",
-            "&lt;=&gt;": "",
-            "&lt;x&gt;": "",
-            "&nbsp; `!` &nbsp;": "",
-            "&nbsp; `.` &nbsp;": "",
-            "&nbsp; `0` &nbsp;": "",
-            "&nbsp; `2` &nbsp;": "",
-            "&nbsp; `3` &nbsp;": "",
-            "&nbsp; `4` &nbsp;": "",
-            "&nbsp; `5` &nbsp;": "",
-            "&nbsp; `6` &nbsp;": "",
-            "&nbsp; `7` &nbsp;": "",
-            "&nbsp; `8` &nbsp;": "",
-            "&nbsp; `9` &nbsp;": "",
-            "&nbsp; `e` &nbsp;": "",
-            "&nbsp;&nbsp;`1` &nbsp;": "",
-            "&nbsp;`+{::}`&nbsp;": "",
-            "&nbsp;`-:\\ `": "",
-            "&nbsp;`-{::}`&nbsp;": "",
-            "&nbsp;`C`&nbsp;": "",
-            "&nbsp;`cos`": "",
-            "&nbsp;`ln`&nbsp;": "",
-            "&nbsp;`pi` &nbsp;": "",
-            "&nbsp;`sin`": "",
-            "&nbsp;`tan`": "",
-            "&nbsp;`times`&nbsp;": "",
-            "&quot;text&quot;": "",
-            "'+formula+'": "",
-            "((n),(k))": "",
-            "(x+1)/(x-1)": "",
-            "*": "",
-            "**": "",
-            "+-": "",
-            "-&gt;": "",
-            "-&lt;": "",
-            "-:": "",
-            "-=": "",
-            "//": "",
-            "/_": "",
-            ":.": "",
-            "=&gt;": "",
-            "@": "",
-            "[[a,b],[c,d]]": "",
-            "\\\\": "",
-            "\\nClick in the box to use your keyboard or use the buttons\\n": "",
-            "^^": "",
-            "^^^": "",
-            "__|": "",
-            "_|_": "",
-            "`!=`": "",
-            "`!in`": "",
-            "`&and;`": "",
-            "`&cap;`": "",
-            "`&cup;`": "",
-            "`&gt;-`": "",
-            "`&gt;=`": "",
-            "`&lt;=&gt;`": "",
-            "`&lt;=`": "",
-            "`&lt;x&gt;`": "",
-            "`&or;`": "",
-            "`&quot;text&quot;`": "",
-            "`((n),(k))`": "",
-            "`(x+1)/(x-1)`": "",
-            "`**`": "",
-            "`*`": "",
-            "`+-`": "",
-            "`-&gt;`": "",
-            "`-&lt;`": "",
-            "`-:`": "",
-            "`-=`": "",
-            "`//`": "",
-            "`/_`": "",
-            "`:.`": "",
-            "`=&gt;`": "",
-            "`@`": "",
-            "`[[a,b],[c,d]]`": "",
-            "`\\\\`": "",
-            "`__|`": "",
-            "`_|_`": "",
-            "`AA`": "",
-            "`aleph`": "",
-            "`alpha`": "",
-            "`and`": "",
-            "`bara`": "",
-            "`bba`": "",
-            "`bbba`": "",
-            "`beta`": "",
-            "`CC`": "",
-            "`cca`": "",
-            "`chi`": "",
-            "`darr`": "",
-            "`ddota`": "",
-            "`del`": "",
-            "`Delta`": "",
-            "`delta`": "",
-            "`diamond`": "",
-            "`dota`": "",
-            "`dy/dx`": "",
-            "`EE`": "",
-            "`epsi`": "",
-            "`eta`": "",
-            "`fra`": "",
-            "`Gamma`": "",
-            "`gamma`": "",
-            "`grad`": "",
-            "`harr`": "",
-            "`hArr`": "",
-            "`hata`": "",
-            "`if`": "",
-            "`in`": "",
-            "`int`": "",
-            "`iota`": "",
-            "`kappa`": "",
-            "`Lambda`": "",
-            "`lambda`": "",
-            "`lArr`": "",
-            "`larr`": "",
-            "`lim_(x-&gt;oo)`": "",
-            "`log`": "",
-            "`mu`": "",
-            "`NN`": "",
-            "`nn`": "",
-            "`not`": "",
-            "`nu`": "",
-            "`o+`": "",
-            "`o.`": "",
-            "`O/`": "",
-            "`oint`": "",
-            "`omega`": "",
-            "`Omega`": "",
-            "`oo`": "",
-            "`or`": "",
-            "`ox`": "",
-            "`phi`": "",
-            "`Phi`": "",
-            "`Pi`": "",
-            "`pi`": "",
-            "`prod`": "",
-            "`prop`": "",
-            "`Psi`": "",
-            "`psi`": "",
-            "`QQ`": "",
-            "`quad`": "",
-            "`rArr`": "",
-            "`rho`": "",
-            "`root(n)(x)`": "",
-            "`RR`": "",
-            "`sfa`": "",
-            "`Sigma`": "",
-            "`sigma`": "",
-            "`sqrt(x)`": "",
-            "`square`": "",
-            "`stackrel(-&gt;)(+)`": "",
-            "`sub`": "",
-            "`sube`": "",
-            "`sum`": "",
-            "`sup`": "",
-            "`supe`": "",
-            "`tau`": "",
-            "`Theta`": "",
-            "`theta`": "",
-            "`TT`": "",
-            "`tta`": "",
-            "`uarr`": "",
-            "`ula`": "",
-            "`upsilon`": "",
-            "`uu`": "",
-            "`veca`": "",
-            "`vv`": "",
-            "`x_(mn)`": "",
-            "`Xi`": "",
-            "`xi`": "",
-            "`xx`": "",
-            "`zeta`": "",
-            "`ZZ`": "",
-            "`|-&gt;`": "",
-            "`|--`": "",
-            "`|==`": "",
-            "`|__`": "",
-            "`|~`": "",
-            "`~=`": "",
-            "`~|`": "",
-            "`~~`": "",
-            "AA": "",
-            "aleph": "",
-            "alpha": "",
-            "and": "",
-            "AsciiMath Formula Input": "",
-            "AsciiMathML Example": "",
-            "bara": "",
-            "Based on ASCIIMathML by": "",
-            "bba": "",
-            "bbba": "",
-            "beta": "",
-            "CC": "",
-            "cca": "",
-            "chi": "",
-            "darr": "",
-            "ddota": "",
-            "del": "",
-            "delta": "",
-            "Delta": "",
-            "diamond": "",
-            "dota": "",
-            "dy/dx": "",
-            "EE": "",
-            "epsi": "",
-            "eta": "",
-            "For more information on AsciiMathML visit this page:": "",
-            "Formula Editor": "",
-            "fra": "",
-            "gamma": "",
-            "Gamma": "",
-            "grad": "",
-            "hArr": "",
-            "harr": "",
-            "hata": "",
-            "if": "",
-            "in": "",
-            "Input": "",
-            "int": "",
-            "int_a^bf(x)dx": "",
-            "iota": "",
-            "kappa": "",
-            "Lambda": "",
-            "lambda": "",
-            "larr": "",
-            "lArr": "",
-            "lim_(x-&gt;oo)": "",
-            "mu": "",
-            "NN": "",
-            "nn": "",
-            "nnn": "",
-            "not": "",
-            "nu": "",
-            "o+": "",
-            "o.": "",
-            "O/": "",
-            "oint": "",
-            "Omega": "",
-            "omega": "",
-            "oo": "",
-            "or": "",
-            "ox": "",
-            "phi": "",
-            "Phi": "",
-            "pi": "",
-            "Pi": "",
-            "Preview": "",
-            "prod": "",
-            "prop": "",
-            "psi": "",
-            "Psi": "",
-            "QQ": "",
-            "quad": "",
-            "rArr": "",
-            "rho": "",
-            "root(n)(x)": "",
-            "RR": "",
-            "sfa": "",
-            "sigma": "",
-            "Sigma": "",
-            "sqrt(x)": "",
-            "square": "",
-            "stackrel(-&gt;)(+)": "",
-            "sub": "",
-            "sube": "",
-            "sum": "",
-            "sum_(n=1)^oo": "",
-            "sup": "",
-            "supe": "",
-            "tau": "",
-            "Theta": "",
-            "theta": "",
-            "TT": "",
-            "tta": "",
-            "uarr": "",
-            "ula": "",
-            "upsilon": "",
-            "uu": "",
-            "uuu": "",
-            "veca": "",
-            "vv": "",
-            "vvv": "",
-            "x^(m+n)": "",
-            "x_(mn)": "",
-            "Xi": "",
-            "xi": "",
-            "xx": "",
-            "zeta": "",
-            "ZZ": "",
-            "|-&gt;": "",
-            "|--": "",
-            "|==": "",
-            "|__": "",
-            "|~": "",
-            "~=": "",
-            "~|": "",
-            "~~": ""
-        },
-        "FancySelects": {
-            "'+opt.text+'": ""
-        },
-        "FindReplace": {
-            "';\r\n  var tagc = '": "",
-            "Case sensitive search": "",
-            "Clear": "",
-            "Done": "",
-            "Enter the text you want to find": "",
-            "Find and Replace": "",
-            "found item": "",
-            "found items": "",
-            "Highlight": "",
-            "Inform a replacement word": "",
-            "Next": "",
-            "not found": "",
-            "Options": "",
-            "Replace with:": "",
-            "replaced item": "",
-            "replaced items": "",
-            "Search for:": "",
-            "Substitute all occurrences": "",
-            "Substitute this occurrence?": "",
-            "Undo": "",
-            "Whole words only": ""
-        },
-        "FormOperations": {
-            "Enter the name for new option.": "",
-            "Form Editor": "",
-            "Insert a check box.": "",
-            "Insert a Form.": "",
-            "Insert a multi-line text field.": "",
-            "Insert a radio button.": "",
-            "Insert a select field.": "",
-            "Insert a submit/reset button.": "",
-            "Insert a text, password or hidden field.": "",
-            "Message Sent": "",
-            "Please Select...": ""
-        },
-        "Forms": {
-            "'onClick'=": "",
-            "Access Key:": "",
-            "Action URL:": "",
-            "Button Script": "",
-            "Checked": "",
-            "Columns:": "",
-            "Default text (optional)": "",
-            "Dimensions": "",
-            "Disabled": "",
-            "Encoding:": "",
-            "For Control:": "",
-            "Form": "",
-            "Form Element: FIELDSET": "",
-            "Form Element: INPUT": "",
-            "Form Element: LABEL": "",
-            "Form Element: SELECT": "",
-            "Form Element: TEXTAREA": "",
-            "Form handler script": "",
-            "Form Name:": "",
-            "Get": "",
-            "Hard": "",
-            "Height in number of rows": "",
-            "HTML-Form to CGI (default)": "",
-            "Image source": "",
-            "Image URL:": "",
-            "Initial Text:": "",
-            "Insert/Edit Form": "",
-            "Insert/Edit Form Element FIELDSET": "",
-            "Insert/Edit Form Element INPUT": "",
-            "Insert/Edit Form Element LABEL": "",
-            "Insert/Edit Form Element SELECT": "",
-            "Insert/Edit Form Element TEXTAREA": "",
-            "Javascript for button click": "",
-            "Label:": "",
-            "Legend:": "",
-            "Max length:": "",
-            "Maximum number of characters accepted": "",
-            "Method:": "",
-            "multipart Form Data (File-Upload)": "",
-            "Name": "",
-            "Name of the form input": "",
-            "Name of the form select": "",
-            "name of the textarea": "",
-            "Name/ID:": "",
-            "normal": "",
-            "nowrap": "",
-            "Off": "",
-            "Physical": "",
-            "Please enter a Label": "",
-            "Post": "",
-            "pre": "",
-            "Read Only": "",
-            "Rows:": "",
-            "Size of text box in characters": "",
-            "Size:": "",
-            "Soft": "",
-            "Tab Index:": "",
-            "Target Frame:": "",
-            "Text:": "",
-            "URL of image": "",
-            "Value of the form input": "",
-            "Value:": "",
-            "Virtual": "",
-            "Width in number of characters": "",
-            "Wrap Mode:": "",
-            "You must enter a Name": "",
-            "Options": "<<FindReplace>>"
-        },
-        "FullPage": {
-            "...": "",
-            "Alternate style-sheet:": "",
-            "Background color:": "",
-            "Character set:": "",
-            "cyrillic (ISO-8859-5)": "",
-            "cyrillic (KOI8-R)": "",
-            "cyrillic (WINDOWS-1251)": "",
-            "Description:": "",
-            "DOCTYPE:": "",
-            "Document properties": "",
-            "Document title:": "",
-            "Keywords:": "",
-            "Primary style-sheet:": "",
-            "Text color:": "",
-            "UTF-8 (recommended)": "",
-            "western (ISO-8859-1)": ""
-        },
-        "FullScreen": {
-            "Maximize/Minimize Editor": ""
-        },
-        "Gecko": {
-            "The Paste button does not work in this browser for security reasons. Press CTRL-V on your keyboard to paste directly.": ""
-        },
-        "HorizontalRule": {
-            "&#x00d7;": "",
-            "&nbsp;": "",
-            "Alignment:": "",
-            "Center": "",
-            "Color:": "",
-            "Height:": "",
-            "Insert/edit horizontal rule": "",
-            "Insert/Edit Horizontal Rule": "",
-            "Layout": "",
-            "Left": "",
-            "No shading": "",
-            "percent": "",
-            "pixels": "",
-            "Right": "",
-            "Style": "",
-            "Width:": ""
-        },
-        "InlineStyler": {
-            "Background": "",
-            "Baseline": "",
-            "Border": "",
-            "Bottom": "",
-            "Char": "",
-            "Collapsed borders": "",
-            "CSS Style": "",
-            "FG Color": "",
-            "Float": "",
-            "Justify": "",
-            "Margin": "",
-            "Middle": "",
-            "None": "",
-            "Padding": "",
-            "Text align": "",
-            "Top": "",
-            "Vertical align": "",
-            "-": "<<Equation>>",
-            "Center": "<<HorizontalRule>>",
-            "Height": "<<HorizontalRule>>",
-            "Image URL": "<<Forms>>",
-            "Layout": "<<HorizontalRule>>",
-            "Left": "<<HorizontalRule>>",
-            "percent": "<<HorizontalRule>>",
-            "pixels": "<<HorizontalRule>>",
-            "Right": "<<HorizontalRule>>",
-            "Width": "<<HorizontalRule>>"
-        },
-        "InsertAnchor": {
-            "Anchor name": "",
-            "Insert Anchor": "",
-            "Delete": "<<Abbreviation>>"
-        },
-        "InsertImage": {
-            "Absbottom": "",
-            "Absmiddle": "",
-            "Alternate text:": "",
-            "Border thickness:": "",
-            "Enter the image URL here": "",
-            "For browsers that don't support images": "",
-            "Horizontal padding": "",
-            "Horizontal:": "",
-            "Image Preview:": "",
-            "Insert Image": "",
-            "Leave empty for no border": "",
-            "Not set": "",
-            "Positioning of this image": "",
-            "Preview the image in a new window": "",
-            "Spacing": "",
-            "Texttop": "",
-            "Vertical padding": "",
-            "Vertical:": "",
-            "You must enter the URL": "",
-            "Alignment:": "<<HorizontalRule>>",
-            "Baseline": "<<InlineStyler>>",
-            "Bottom": "<<InlineStyler>>",
-            "Image URL:": "<<Forms>>",
-            "Layout": "<<HorizontalRule>>",
-            "Left": "<<HorizontalRule>>",
-            "Middle": "<<InlineStyler>>",
-            "Preview": "<<Equation>>",
-            "Right": "<<HorizontalRule>>",
-            "Top": "<<InlineStyler>>"
-        },
-        "InsertNote": {
-            "Insert": "",
-            "Insert footnote": "",
-            "Insert Note": ""
-        },
-        "InsertPagebreak": {
-            "Page break": "",
-            "Page Break": ""
-        },
-        "InsertSmiley": {
-            "Insert Smiley": ""
-        },
-        "InsertSnippet": {
-            "\\n  This is an information about something\\n": "",
-            "Hide preview": "",
-            "Insert as": "",
-            "Insert Snippet": "",
-            "InsertSnippet for Xinha": "",
-            "Link1": "",
-            "Link2": "",
-            "Link3": "",
-            "Link4": "",
-            "Link5": "",
-            "Show preview": "",
-            "This is an information about something": "",
-            "Variable": ""
-        },
-        "InsertSnippet2": {
-            "All Categories": "",
-            "Filter": "",
-            "Insert as HTML": "",
-            "Insert as template variable": "",
-            "Only search word beginning": "",
-            "HTML": "<<CharCounter>>",
-            "Insert Snippet": "<<InsertSnippet>>",
-            "InsertSnippet for Xinha": "<<InsertSnippet>>",
-            "Variable": "<<InsertSnippet>>"
-        },
-        "InsertTable": {
-            "Caption": "",
-            "Caption for the table": "",
-            "Cell padding:": "",
-            "Cell spacing:": "",
-            "Collapse borders:": "",
-            "Cols:": "",
-            "Em": "",
-            "Fixed width columns": "",
-            "Layou": "",
-            "Number of columns": "",
-            "Number of rows": "",
-            "Positioning of this table": "",
-            "Space between adjacent cells": "",
-            "Space between content and border in cell": "",
-            "Style of the border": "",
-            "Width of the table": "",
-            "Width unit": "",
-            "You must enter a number of columns": "",
-            "You must enter a number of rows": "",
-            "Absbottom": "<<InsertImage>>",
-            "Absmiddle": "<<InsertImage>>",
-            "Alignment:": "<<HorizontalRule>>",
-            "Baseline": "<<InlineStyler>>",
-            "Border": "<<InlineStyler>>",
-            "Border thickness:": "<<InsertImage>>",
-            "Bottom": "<<InlineStyler>>",
-            "Layout": "<<HorizontalRule>>",
-            "Leave empty for no border": "<<InsertImage>>",
-            "Left": "<<HorizontalRule>>",
-            "Middle": "<<InlineStyler>>",
-            "Not set": "<<InsertImage>>",
-            "Percent": "<<HorizontalRule>>",
-            "Pixels": "<<HorizontalRule>>",
-            "Right": "<<HorizontalRule>>",
-            "Rows:": "<<Forms>>",
-            "Spacing": "<<InsertImage>>",
-            "Texttop": "<<InsertImage>>",
-            "Top": "<<InlineStyler>>",
-            "Width:": "<<HorizontalRule>>"
-        },
-        "LangMarks": {
-            "&mdash; language &mdash;": "",
-            "', '": "",
-            "English": "",
-            "French": "",
-            "Greek": "",
-            "language select": "",
-            "Latin": ""
-        },
-        "Linker": {
-            "(px)": "",
-            "Anchor-Link": "",
-            "Anchor:": "",
-            "Email Address:": "",
-            "Email Link": "",
-            "Location Bar:": "",
-            "Menu Bar:": "",
-            "Message Template:": "",
-            "New Window": "",
-            "Ordinary Link": "",
-            "Popup Window": "",
-            "PopupWindow": "",
-            "Remove Link": "",
-            "Resizeable:": "",
-            "Same Window (jump out of frames)": "",
-            "Scrollbars:": "",
-            "Shows On Hover": "",
-            "Status Bar:": "",
-            "Subject:": "",
-            "Title:": "",
-            "Toolbar:": "",
-            "URL Link": "",
-            "You must select some text before making a new link.": "",
-            "Are you sure you wish to remove this link?": "<<CreateLink>>",
-            "Name:": "<<Forms>>",
-            "Size:": "<<Forms>>"
-        },
-        "ListType": {
-            "Choose list style type (for ordered lists)": "",
-            "Decimal numbers": "",
-            "Lower greek letters": "",
-            "Lower latin letters": "",
-            "Lower roman numbers": "",
-            "Upper latin letters": "",
-            "Upper roman numbers": ""
-        },
-        "MootoolsFileManager": {
-            "Insert File Link": "",
-            "You must select some text before making a new link.": "<<Linker>>"
-        },
-        "Opera": {
-            "MARK": "",
-            "The Paste button does not work in Mozilla based web browsers (technical security reasons). Press CTRL-V on your keyboard to paste directly.": ""
-        },
-        "PasteText": {
-            "Insert text in new paragraph": "",
-            "Paste as Plain Text": ""
-        },
-        "PreserveScripts": {
-            "JavaScript": "",
-            "PHP": ""
-        },
-        "QuickTag": {
-            "',\r\n                           'cl': '": "",
-            "ATTRIBUTES": "",
-            "Colors": "",
-            "Enter the TAG you want to insert": "",
-            "No CSS class avaiable": "",
-            "Ok": "",
-            "OPTIONS": "",
-            "Quick Tag Editor": "",
-            "TAGs": "",
-            "There are some unclosed quote": "",
-            "This attribute already exists in the TAG": "",
-            "You have to select some text": ""
-        },
-        "SaveSubmit": {
-            "in progress": "",
-            "Ready": "",
-            "Save": "",
-            "Saving...": ""
-        },
-        "SetId": {
-            "ID/Name:": "",
-            "Set Id and Name": "",
-            "Set Id/Name": "",
-            "Set ID/Name": "",
-            "Delete": "<<Abbreviation>>"
-        },
-        "SmartReplace": {
-            "ClosingDoubleQuotes": "",
-            "ClosingSingleQuote": "",
-            "Convert all quotes and dashes in the current document": "",
-            "Enable automatic replacements": "",
-            "OpeningDoubleQuotes": "",
-            "OpeningSingleQuote": "",
-            "SmartReplace": "",
-            "SmartReplace Settings": ""
-        },
-        "Stylist": {
-            "Styles": ""
-        },
-        "SuperClean": {
-            "Clean bad HTML from Microsoft Word.": "",
-            "Clean Selection Only": "",
-            "Clean up HTML": "",
-            "Cleaning Scope": "",
-            "General tidy up and correction of some problems.": "",
-            "Please select from the following cleaning options...": "",
-            "Please stand by while cleaning in process...": "",
-            "Remove alignment (left/right/justify).": "",
-            "Remove all classes (CSS).": "",
-            "Remove All HTML Tags": "",
-            "Remove all styles (CSS).": "",
-            "Remove custom font sizes.": "",
-            "Remove custom text colors.": "",
-            "Remove custom typefaces (font \"styles\").": "",
-            "Remove emphasis and annotations.": "",
-            "Remove lang attributes.": "",
-            "Remove Paragraphs": "",
-            "Remove superscripts and subscripts.": "",
-            "Replace directional quote marks with non-directional quote marks.": "",
-            "Vigorously purge HTML from Microsoft Word.": ""
-        },
-        "TableOperations": {
-            "All four sides": "",
-            "Borders": "",
-            "Cell properties": "",
-            "Cell Properties": "",
-            "Cell Type:": "",
-            "Cells down": "",
-            "Cells to the right, and": "",
-            "Delete cell": "",
-            "Delete column": "",
-            "Delete row": "",
-            "Do Not Change": "",
-            "Frame and borders": "",
-            "Frames": "",
-            "Header (th)": "",
-            "Insert cell after": "",
-            "Insert cell before": "",
-            "Insert column after": "",
-            "Insert column before": "",
-            "Insert row after": "",
-            "Insert row before": "",
-            "Merge cells": "",
-            "Merge current cell with:": "",
-            "No rules": "",
-            "No sides": "",
-            "Normal (td)": "",
-            "Please click into some cell": "",
-            "Row properties": "",
-            "Row Properties": "",
-            "Rules will appear between all rows and columns": "",
-            "Rules will appear between columns only": "",
-            "Rules will appear between rows only": "",
-            "Spacing and padding": "",
-            "Split column": "",
-            "Split row": "",
-            "Summary": "",
-            "Table properties": "",
-            "Table Properties": "",
-            "The bottom side only": "",
-            "The left-hand side only": "",
-            "The right and left sides only": "",
-            "The right-hand side only": "",
-            "The top and bottom sides only": "",
-            "The top side only": "",
-            "Xinha cowardly refuses to delete the last cell in row.": "",
-            "Xinha cowardly refuses to delete the last column in table.": "",
-            "Xinha cowardly refuses to delete the last row in table.": "",
-            "Caption": "<<InsertTable>>",
-            "Columns": "<<Forms>>",
-            "Description": "<<FullPage>>",
-            "Merge Cells": "<<ContextMenu>>",
-            "Padding": "<<InlineStyler>>",
-            "pixels": "<<HorizontalRule>>",
-            "Rows": "<<Forms>>",
-            "Spacing": "<<InsertImage>>"
-        },
-        "UnsavedChanges": {
-            "You have unsaved changes in the editor": ""
-        },
-        "WebKit": {
-            "The Paste button does not work in this browser for security reasons. Press CTRL-V on your keyboard to paste directly.": "<<Gecko>>"
-        },
-        "Xinha": {
-            "&#8212; font &#8212;": "",
-            "&#8212; format &#8212;": "",
-            "&#8212; size &#8212;": "",
-            "1 (8 pt)": "",
-            "2 (10 pt)": "",
-            "3 (12 pt)": "",
-            "4 (14 pt)": "",
-            "5 (18 pt)": "",
-            "6 (24 pt)": "",
-            "7 (36 pt)": "",
-            "Address": "",
-            "Arial": "",
-            "Clean content pasted from Word": "",
-            "Clear Inline Font Specifications": "",
-            "Clear MSOffice tags": "",
-            "Close": "",
-            "Constructing object": "",
-            "Courier New": "",
-            "Create Statusbar": "",
-            "Create Toolbar": "",
-            "CTRL-0 (zero)": "",
-            "CTRL-1 .. CTRL-6": "",
-            "CTRL-A": "",
-            "CTRL-B": "",
-            "CTRL-C": "",
-            "CTRL-E": "",
-            "CTRL-I": "",
-            "CTRL-J": "",
-            "CTRL-L": "",
-            "CTRL-N": "",
-            "CTRL-R": "",
-            "CTRL-S": "",
-            "CTRL-U": "",
-            "CTRL-V": "",
-            "CTRL-X": "",
-            "CTRL-Y": "",
-            "CTRL-Z": "",
-            "Direction left to right": "",
-            "Direction right to left": "",
-            "Editor Help": "",
-            "ENTER": "",
-            "Error Loading Xinha.  Developers, check the Error Console for information.": "",
-            "Finishing": "",
-            "Formatted": "",
-            "Generate Xinha framework": "",
-            "Georgia": "",
-            "Heading 1": "",
-            "Heading 2": "",
-            "Heading 3": "",
-            "Heading 4": "",
-            "Heading 5": "",
-            "Heading 6": "",
-            "Headings": "",
-            "Impact": "",
-            "Init editor size": "",
-            "insert linebreak": "",
-            "Insert/Overwrite": "",
-            "Keyboard shortcuts": "",
-            "Loading Core": "",
-            "Loading in progress. Please wait!": "",
-            "Loading plugin $plugin": "",
-            "Loading plugins": "",
-            "MS Word Cleaner": "",
-            "new paragraph": "",
-            "Normal": "",
-            "Print document": "",
-            "Register plugin $plugin": "",
-            "Remove formatting": "",
-            "Save as": "",
-            "Select all": "",
-            "Select Color": "",
-            "Set format to paragraph": "",
-            "SHIFT-ENTER": "",
-            "Split Block": "",
-            "Tahoma": "",
-            "The editor provides the following key combinations:": "",
-            "Times New Roman": "",
-            "Toggle Borders": "",
-            "Touch here first to activate editor.": "",
-            "Verdana": "",
-            "Waiting for Iframe to load...": "",
-            "WingDings": "",
-            "Would you like to clear font colours?": "",
-            "Would you like to clear font sizes?": "",
-            "Would you like to clear font typefaces?": "",
-            "Xinha": ""
-        },
-        "BackgroundImage": {
-            "__ TRANSLATOR NOTE __": "*** BACKGROUNDIMAGE IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***",
-            "Remove Current Background": "",
-            "Set Background": "",
-            "Set page background image": "",
-            "Set Page Background Image": ""
-        },
-        "ClientsideSpellcheck": {
-            "__ TRANSLATOR NOTE __": "*** CLIENTSIDESPELLCHECK IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***",
-            "Spell Check using ieSpell": ""
-        },
-        "ExtendedFileManager": {
-            "__ TRANSLATOR NOTE __": "*** EXTENDEDFILEMANAGER IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***",
-            "10%": "",
-            "100%": "",
-            "200%": "",
-            "25%": "",
-            "50%": "",
-            "75%": "",
-            ">List View": "",
-            ">Thumbnail View": "",
-            "A:": "",
-            "Align": "",
-            "Alt": "",
-            "Border Color": "",
-            "Constrain Proportions": "",
-            "Crop": "",
-            "D:": "",
-            "Directory": "",
-            "Directory Up": "",
-            "Edit": "",
-            "File List": "",
-            "File Manager": "",
-            "Filename:": "",
-            "Filesize:": "",
-            "Flip Horizontal": "",
-            "Flip Image": "",
-            "Flip Vertical": "",
-            "Folder": "",
-            "GIF": "",
-            "GIF format is not supported, image editing not supported.": "",
-            "H:": "",
-            "Image Editor": "",
-            "Image Selection": "",
-            "Invalid base directory:": "",
-            "JPEG High": "",
-            "JPEG Low": "",
-            "JPEG Medium": "",
-            "Loading": "",
-            "Lock": "",
-            "Marker": "",
-            "Maximum folder size limit reached. Upload disabled.": "",
-            "Measure": "",
-            "New Folder": "",
-            "No Files Found": "",
-            "No Image Available": "",
-            "Please enter value": "",
-            "PNG": "",
-            "Preset": "",
-            "Quality:": "",
-            "Refresh": "",
-            "Rename": "",
-            "Resize": "",
-            "Rotate": "",
-            "Rotate 180 &deg;": "",
-            "Rotate 90 &deg; CCW": "",
-            "Rotate 90 &deg; CW": "",
-            "Rotate Image": "",
-            "Start X:": "",
-            "Start Y:": "",
-            "Target Window": "",
-            "Toggle marker color": "",
-            "Trash": "",
-            "Upload": "",
-            "W:": "",
-            "X:": "",
-            "Xinha Image Editor": "",
-            "Y:": "",
-            "Zoom": "",
-            "Absbottom": "<<InsertImage>>",
-            "Absmiddle": "<<InsertImage>>",
-            "Baseline": "<<InlineStyler>>",
-            "Border": "<<InlineStyler>>",
-            "Bottom": "<<InlineStyler>>",
-            "Clear": "<<FindReplace>>",
-            "Color": "<<HorizontalRule>>",
-            "Copy": "<<ContextMenu>>",
-            "Cut": "<<ContextMenu>>",
-            "Height": "<<HorizontalRule>>",
-            "Height:": "<<HorizontalRule>>",
-            "Insert File Link": "<<MootoolsFileManager>>",
-            "Left": "<<HorizontalRule>>",
-            "Margin": "<<InlineStyler>>",
-            "Middle": "<<InlineStyler>>",
-            "Not set": "<<InsertImage>>",
-            "Padding": "<<InlineStyler>>",
-            "Positioning of this image": "<<InsertImage>>",
-            "Preview": "<<Equation>>",
-            "Right": "<<HorizontalRule>>",
-            "Save": "<<SaveSubmit>>",
-            "Texttop": "<<InsertImage>>",
-            "Top": "<<InlineStyler>>",
-            "Width": "<<HorizontalRule>>",
-            "Width:": "<<HorizontalRule>>",
-            "You must select some text before making a new link.": "<<Linker>>"
-        },
-        "Filter": {
-            "__ TRANSLATOR NOTE __": "*** FILTER IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***",
-            "Filter": "<<InsertSnippet2>>"
-        },
-        "HtmlTidy": {
-            "__ TRANSLATOR NOTE __": "*** HTMLTIDY IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***",
-            "Auto-Tidy": "",
-            "Don't Tidy": "",
-            "HTML Tidy": "",
-            "Tidy failed.  Check your HTML for syntax errors.": ""
-        },
-        "ImageManager": {
-            "__ TRANSLATOR NOTE __": "*** IMAGEMANAGER IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***",
-            "Angle:": "",
-            "Flickr Picture List": "",
-            "Flickr Pictures": "",
-            "Flickr Selection": "",
-            "Flickr Username/Email": "",
-            "Folder Name:": "",
-            "Image Format": "",
-            "Image List": "",
-            "Keyword": "",
-            "No Images Found": "",
-            "No Photos Found": "",
-            "No Videos Found": "",
-            "This Server": "",
-            "YouTube Selection": "",
-            "YouTube Username": "",
-            "YouTube Video List": "",
-            "YouTube Videos": "",
-            "A:": "<<ExtendedFileManager>>",
-            "Absbottom": "<<InsertImage>>",
-            "Absmiddle": "<<InsertImage>>",
-            "Baseline": "<<InlineStyler>>",
-            "Bottom": "<<InlineStyler>>",
-            "Clear": "<<FindReplace>>",
-            "Constrain Proportions": "<<ExtendedFileManager>>",
-            "Crop": "<<ExtendedFileManager>>",
-            "D:": "<<ExtendedFileManager>>",
-            "Directory": "<<ExtendedFileManager>>",
-            "Directory Up": "<<ExtendedFileManager>>",
-            "Edit": "<<ExtendedFileManager>>",
-            "Filename:": "<<ExtendedFileManager>>",
-            "Flip Horizontal": "<<ExtendedFileManager>>",
-            "Flip Image": "<<ExtendedFileManager>>",
-            "Flip Vertical": "<<ExtendedFileManager>>",
-            "GIF": "<<ExtendedFileManager>>",
-            "GIF format is not supported, image editing not supported.": "<<ExtendedFileManager>>",
-            "H:": "<<ExtendedFileManager>>",
-            "Height:": "<<HorizontalRule>>",
-            "Image Editor": "<<ExtendedFileManager>>",
-            "Image Selection": "<<ExtendedFileManager>>",
-            "Insert Image": "<<InsertImage>>",
-            "Invalid base directory:": "<<ExtendedFileManager>>",
-            "JPEG High": "<<ExtendedFileManager>>",
-            "JPEG Low": "<<ExtendedFileManager>>",
-            "JPEG Medium": "<<ExtendedFileManager>>",
-            "Left": "<<HorizontalRule>>",
-            "Lock": "<<ExtendedFileManager>>",
-            "Marker": "<<ExtendedFileManager>>",
-            "Measure": "<<ExtendedFileManager>>",
-            "Middle": "<<InlineStyler>>",
-            "New Folder": "<<ExtendedFileManager>>",
-            "No Image Available": "<<ExtendedFileManager>>",
-            "Not set": "<<InsertImage>>",
-            "PNG": "<<ExtendedFileManager>>",
-            "Positioning of this image": "<<InsertImage>>",
-            "Quality:": "<<ExtendedFileManager>>",
-            "Refresh": "<<ExtendedFileManager>>",
-            "Resize": "<<ExtendedFileManager>>",
-            "Right": "<<HorizontalRule>>",
-            "Rotate": "<<ExtendedFileManager>>",
-            "Rotate 180 &deg;": "<<ExtendedFileManager>>",
-            "Rotate 90 &deg; CCW": "<<ExtendedFileManager>>",
-            "Rotate 90 &deg; CW": "<<ExtendedFileManager>>",
-            "Rotate Image": "<<ExtendedFileManager>>",
-            "Save": "<<SaveSubmit>>",
-            "Start X:": "<<ExtendedFileManager>>",
-            "Start Y:": "<<ExtendedFileManager>>",
-            "Texttop": "<<InsertImage>>",
-            "Top": "<<InlineStyler>>",
-            "Trash": "<<ExtendedFileManager>>",
-            "W:": "<<ExtendedFileManager>>",
-            "Width:": "<<HorizontalRule>>",
-            "X:": "<<ExtendedFileManager>>",
-            "Y:": "<<ExtendedFileManager>>"
-        },
-        "InsertMarquee": {
-            "__ TRANSLATOR NOTE __": "*** INSERTMARQUEE IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***",
-            "Alternate": "",
-            "Background-Color:": "",
-            "Behavior:": "",
-            "Continuous": "",
-            "Direction:": "",
-            "Insert scrolling marquee": "",
-            "Marquee Editor": "",
-            "Scroll Amount:": "",
-            "Scroll Delay:": "",
-            "Slide": "",
-            "Speed Control": "",
-            "Height:": "<<HorizontalRule>>",
-            "Left": "<<HorizontalRule>>",
-            "Name": "<<Forms>>",
-            "Name/ID:": "<<Forms>>",
-            "Right": "<<HorizontalRule>>",
-            "Text:": "<<Forms>>",
-            "Width:": "<<HorizontalRule>>"
-        },
-        "InsertPicture": {
-            "__ TRANSLATOR NOTE __": "*** INSERTPICTURE IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***",
-            "Leave empty for not defined": "",
-            "Open file in new window": "",
-            " Open file in new window": "",
-            "Upload file": "",
-            "Absbottom": "<<InsertImage>>",
-            "Absmiddle": "<<InsertImage>>",
-            "Alignment:": "<<HorizontalRule>>",
-            "Alternate text:": "<<InsertImage>>",
-            "Baseline": "<<InlineStyler>>",
-            "Border thickness:": "<<InsertImage>>",
-            "Bottom": "<<InlineStyler>>",
-            "Enter the image URL here": "<<InsertImage>>",
-            "For browsers that don't support images": "<<InsertImage>>",
-            "Height:": "<<HorizontalRule>>",
-            "Horizontal padding": "<<InsertImage>>",
-            "Horizontal:": "<<InsertImage>>",
-            "Image Preview:": "<<InsertImage>>",
-            "Image URL:": "<<Forms>>",
-            "Insert Image": "<<InsertImage>>",
-            "Layout": "<<HorizontalRule>>",
-            "Leave empty for no border": "<<InsertImage>>",
-            "Left": "<<HorizontalRule>>",
-            "Middle": "<<InlineStyler>>",
-            "Not set": "<<InsertImage>>",
-            "Positioning of this image": "<<InsertImage>>",
-            "Preview": "<<Equation>>",
-            "Preview the image in a new window": "<<InsertImage>>",
-            "Right": "<<HorizontalRule>>",
-            "Size": "<<Forms>>",
-            "Spacing": "<<InsertImage>>",
-            "Texttop": "<<InsertImage>>",
-            "Top": "<<InlineStyler>>",
-            "Vertical padding": "<<InsertImage>>",
-            "Vertical:": "<<InsertImage>>",
-            "Width:": "<<HorizontalRule>>"
-        },
-        "NoteServer": {
-            "__ TRANSLATOR NOTE __": "*** NOTESERVER IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***",
-            "120%": "",
-            "150%": "",
-            "80%": "",
-            "Add GUIDO Code in a textbox on the page": "",
-            "Add MIDI link to allow students to hear the music": "",
-            "Format": "",
-            "GUIDO Code": "",
-            "Guido code": "",
-            "Image in applet": "",
-            "Insert GUIDO Music Notation": "",
-            "MIDI File": "",
-            "Source Code": "",
-            "With Mozilla, the applet will not be visible in editor, but only in Web page after submitting.": "",
-            "Zoom :": "",
-            "100%": "<<ExtendedFileManager>>",
-            "Image Preview": "<<InsertImage>>",
-            "Options": "<<FindReplace>>",
-            "Preview": "<<Equation>>",
-            "Preview the image in a new window": "<<InsertImage>>",
-            "Zoom": "<<ExtendedFileManager>>"
-        },
-        "PSLocal": {
-            "__ TRANSLATOR NOTE __": "*** PSLOCAL IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***",
-            "Confirm": "",
-            "Enable": "",
-            "Enable Gears in order to use local document storage and configuration.": "",
-            "Enabling Local Storage": "",
-            "Install": "",
-            "Learn About Local Storage": "",
-            "This will reload the page, causing you to lose any unsaved work.  Press \"OK\" to reload.": "",
-            "Xinha uses Google Gears to enable local document storage.  With Gears installed, you can save drafts of your documents on your hard drive, configure Xinha to look the way you want, and carry this information wherever you use Xinha on the web.": ""
-        },
-        "PSServer": {
-            "__ TRANSLATOR NOTE __": "*** PSSERVER IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***",
-            "File: ": "",
-            "Import": ""
-        },
-        "PersistentStorage": {
-            "__ TRANSLATOR NOTE __": "*** PERSISTENTSTORAGE IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***",
-            "Details": "",
-            "File Browser": "",
-            "Hello    There C ": "",
-            "Hello  There A ": "",
-            "Hello \" There B \"": "",
-            "Hello ' There D '": "",
-            "List of Places": "",
-            "New Document": "",
-            "Open": "",
-            "Open Document": "",
-            "Places": "",
-            "Please enter the name of the directory you'd like to create.": "",
-            "Save Document": "",
-            "This will erase any unsaved content.  If you're certain, please click OK to continue.": "",
-            "Web URL": "",
-            "Confirm": "<<PSLocal>>",
-            "Copy": "<<ContextMenu>>",
-            "Delete": "<<Abbreviation>>",
-            "Directory Up": "<<ExtendedFileManager>>",
-            "File List": "<<ExtendedFileManager>>",
-            "File Manager": "<<ExtendedFileManager>>",
-            "Filename": "<<ExtendedFileManager>>",
-            "Insert": "<<InsertNote>>",
-            "Insert Image": "<<InsertImage>>",
-            "New Folder": "<<ExtendedFileManager>>",
-            "Save": "<<SaveSubmit>>",
-            "You must select some text before making a new link.": "<<Linker>>"
-        },
-        "SpellChecker": {
-            "__ TRANSLATOR NOTE __": "*** SPELLCHECKER IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***",
-            "Dictionary": "",
-            "Finished list of mispelled words": "",
-            "HTMLArea Spell Checker": "",
-            "I will open it in a new page.": "",
-            "Ignore": "",
-            "Ignore all": "",
-            "Info": "",
-            "Learn": "",
-            "No mispelled words found with the selected dictionary.": "",
-            "Original word": "",
-            "Please confirm that you want to open this link": "",
-            "Please wait.  Calling spell checker.": "",
-            "Please wait: changing dictionary to": "",
-            "pliz weit ;-)": "",
-            "Re-check": "",
-            "Replace": "",
-            "Replace all": "",
-            "Revert": "",
-            "Spell Checker": "",
-            "Spell-check": "",
-            "Suggestions": "",
-            "This will drop changes and quit spell checker.  Please confirm.": "",
-            "Replace with": "<<FindReplace>>"
-        },
-        "Template": {
-            "__ TRANSLATOR NOTE __": "*** TEMPLATE IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***",
-            "Insert template": ""
-        },
-        "UnFormat": {
-            "__ TRANSLATOR NOTE __": "*** UNFORMAT IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***",
-            "All": "",
-            "All HTML:": "",
-            "Cleaning Area": "",
-            "Cleaning options": "",
-            "Formatting:": "",
-            "Page Cleaner": "",
-            "Select which types of formatting you would like to remove.": "",
-            "Selection": ""
-        }
-    }
-}
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/lang/merged/lv.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/lang/merged/lv.js
deleted file mode 100644
index 7666d42..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/lang/merged/lv.js
+++ /dev/null
@@ -1,1573 +0,0 @@
-// Xinha Language Combined Translation File
-//
-// LANG: "lv", ENCODING: UTF-8
-//
-// INSTRUCTIONS TO TRANSLATORS
-// ===========================================================================
-//
-// Your translation must be in UTF-8 Character Encoding.
-//
-// This is a JSON encoded file (plus comments), strings should be double-quote
-// only, do not use single quotes to surround strings - "hello", not 'hello'
-// do not have a trailing comma after the last entry in a section.
-//
-// Only full line comments are allowed (that a comments occupy entire lines).
-//
-// Search for the __NEW_TRANSLATIONS__ section below, this is where you will
-// want to focus, this section includes things that do not presently have a 
-// translation or for which the translation needs to be checked for accuracy.
-//
-// In the New Translations section a translation string is one of the following
-//
-//  "English String Here" : ""
-//     This means it is not translated yet, add your translation...
-//     "English String Here" : "Klingon String Here"
-//
-//  "English String Here" : "Translated String Here"
-//     This means that an existing translation for this string, in some other
-//     section has been found, and used.  Check that it is approprite for this
-//     section and if it is, that's fine leave it as is, otherwise change as
-//     appropriate.
-//
-//  "English String Here" : "<<AnotherSection>>"
-//     This means use the same translation for this string as <<AnotherSection>>
-//     this saves you re-tranlating strings.  If the Context of this section
-//     and the context of AnotherSection seem the same, that's fine leave it
-//     using that translation, but if this section needs a different translation, 
-//     you can provide it by replacing the link (<<AnotherSection>>) with that
-//     new translation.  For example - a "Table" in say "DataPlugin" is 
-//     perhaps translated differently to "Table" in "FurniturePlugin".
-//
-// TESTING YOUR TRANSLATION
-// ===========================================================================
-// Simply place your translation file on your webserver somewhere for example
-//
-//   /xinha/lang/merged/lv.js
-//
-// and then tell Xinha where to get it (before loading XinhaCore.js) by 
-//
-//  _editor_lang              = 'lv';
-//  _editor_lang_merged_file  = '/xinha/lang/merged/lv.js';
-//
-// Xinha will load your new language definition.
-//
-// SUBMITTING YOUR TRANSLATION
-// ===========================================================================
-// Simply create a Ticket on the Xinha website and attach your translation 
-// file.
-//
-// The Xinha developers will take your file and use the 
-//     contrib/lc_split_merged_file.php
-// script to load it into the Xinha distribution.
-
-{
-    "Abbreviation": {
-        "Cancel": "Atcelt",
-        "OK": "Labi"
-    },
-    "AboutBox": {
-        "About this editor": "Par ðo rediìçtâju"
-    },
-    "BackgroundImage": {
-        "Cancel": "Atcelt"
-    },
-    "ColorPicker": {
-        "OK": "Labi"
-    },
-    "ContextMenu": {
-        "Justify Center": "Izlîdzinât centrâ",
-        "Justify Full": "Izlîdzinât pa visu lapu",
-        "Justify Left": "Izlîdzinât pa kreisi",
-        "Justify Right": "Izlîdzinât pa labi"
-    },
-    "CreateLink": {
-        "Cancel": "Atcelt",
-        "OK": "Labi"
-    },
-    "EditTag": {
-        "Cancel": "Atcelt",
-        "OK": "Labi"
-    },
-    "Equation": {
-        "Cancel": "Atcelt",
-        "OK": "Labi"
-    },
-    "ExtendedFileManager": {
-        "Cancel": "Atcelt",
-        "OK": "Labi"
-    },
-    "Forms": {
-        "Cancel": "Atcelt",
-        "OK": "Labi"
-    },
-    "FullPage": {
-        "Cancel": "Atcelt",
-        "OK": "Labi"
-    },
-    "HorizontalRule": {
-        "Cancel": "Atcelt",
-        "Horizontal Rule": "Horizontâla atdalîtâjsvîtra",
-        "OK": "Labi"
-    },
-    "ImageManager": {
-        "Cancel": "Atcelt",
-        "OK": "Labi"
-    },
-    "InsertAnchor": {
-        "Cancel": "Atcelt",
-        "OK": "Labi"
-    },
-    "InsertImage": {
-        "Cancel": "Atcelt",
-        "OK": "Labi"
-    },
-    "InsertMarquee": {
-        "Cancel": "Atcelt",
-        "OK": "Labi"
-    },
-    "InsertNote": {
-        "Cancel": "Atcelt"
-    },
-    "InsertPicture": {
-        "Cancel": "Atcelt",
-        "OK": "Labi"
-    },
-    "InsertSnippet": {
-        "Cancel": "Atcelt"
-    },
-    "InsertSnippet2": {
-        "Cancel": "Atcelt"
-    },
-    "InsertTable": {
-        "Cancel": "Atcelt",
-        "Insert Table": "Ievietot tabulu",
-        "OK": "Labi"
-    },
-    "Linker": {
-        "Cancel": "Atcelt",
-        "OK": "Labi"
-    },
-    "NoteServer": {
-        "Cancel": "Atcelt",
-        "OK": "Labi"
-    },
-    "PSLocal": {
-        "Cancel": "Atcelt"
-    },
-    "PasteText": {
-        "Cancel": "Atcelt",
-        "OK": "Labi"
-    },
-    "PersistentStorage": {
-        "Cancel": "Atcelt"
-    },
-    "QuickTag": {
-        "Cancel": "Atcelt"
-    },
-    "SetId": {
-        "Cancel": "Atcelt",
-        "OK": "Labi"
-    },
-    "SmartReplace": {
-        "OK": "Labi"
-    },
-    "SpellChecker": {
-        "Cancel": "Atcelt",
-        "OK": "Labi"
-    },
-    "SuperClean": {
-        "Cancel": "Atcelt",
-        "OK": "Labi"
-    },
-    "TableOperations": {
-        "Cancel": "Atcelt",
-        "OK": "Labi"
-    },
-    "Template": {
-        "Cancel": "Atcelt"
-    },
-    "UnFormat": {
-        "Cancel": "Atcelt",
-        "OK": "Labi"
-    },
-    "Xinha": {
-        "About this editor": "Par ðo rediìçtâju",
-        "Background Color": "Fona krâsa",
-        "Bold": "Trekniem burtiem",
-        "Bulleted List": "Saraksts",
-        "Copy selection": "Kopçt iezîmçto",
-        "Current style": "Patreizçjais stils",
-        "Cut selection": "Izgriezt iezîmçto",
-        "Decrease Indent": "Samazinât atkâpi",
-        "Font Color": "Burtu krâsa",
-        "Help using editor": "Rediìçtâja palîgs",
-        "Horizontal Rule": "Horizontâla atdalîtâjsvîtra",
-        "Increase Indent": "Palielinât atkâpi",
-        "Insert Table": "Ievietot tabulu",
-        "Insert Web Link": "Ievietot hipersaiti",
-        "Insert/Modify Image": "Ievietot attçlu",
-        "Italic": "Kursîvâ",
-        "Justify Center": "Izlîdzinât centrâ",
-        "Justify Full": "Izlîdzinât pa visu lapu",
-        "Justify Left": "Izlîdzinât pa kreisi",
-        "Justify Right": "Izlîdzinât pa labi",
-        "Ordered List": "Numurçts saraksts",
-        "Paste from clipboard": "Ievietot iezîmçto",
-        "Path": "Ceïð",
-        "Redoes your last action": "Atkârtot pçdçjo darbîbu",
-        "Strikethrough": "Pârsvîtrots",
-        "Subscript": "Novietot zem rindas",
-        "Superscript": "Novietot virs rindas",
-        "Toggle HTML Source": "Skatît HTML kodu",
-        "Underline": "Pasvîtrots",
-        "Undoes your last action": "Atcelt pçdçjo darbîbu",
-        "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."
-    },
-    "__NEW_TRANSLATIONS__": {
-        "Abbreviation": {
-            "Abbreviation": "",
-            "Delete": "",
-            "Expansion:": ""
-        },
-        "AboutBox": {
-            "Close": "<<Xinha>>"
-        },
-        "CharCounter": {
-            "... in progress": "",
-            "Chars": "",
-            "HTML": "",
-            "Words": ""
-        },
-        "CharacterMap": {
-            "Insert special character": ""
-        },
-        "ColorPicker": {
-            "Click a color...": "",
-            "Color: ": "",
-            "Sample": "",
-            "Web Safe: ": "",
-            "Close": "<<Xinha>>"
-        },
-        "ContextMenu": {
-            "_Delete Row": "",
-            "_Image Properties...": "",
-            "_Modify Link...": "",
-            "_Remove Link...": "",
-            "_Table Properties...": "",
-            "C_ell Properties...": "",
-            "Chec_k Link...": "",
-            "Copy": "",
-            "Create a link": "",
-            "Current URL is": "",
-            "Cut": "",
-            "De_lete Column": "",
-            "Delete Cell": "",
-            "Delete the current column": "",
-            "Delete the current row": "",
-            "How did you get here? (Please report!)": "",
-            "I_nsert Row Before": "",
-            "In_sert Row After": "",
-            "Insert _Column Before": "",
-            "Insert a new column after the current one": "",
-            "Insert a new column before the current one": "",
-            "Insert a new row after the current one": "",
-            "Insert a new row before the current one": "",
-            "Insert a paragraph after the current node": "",
-            "Insert a paragraph before the current node": "",
-            "Insert C_olumn After": "",
-            "Insert Cell After": "",
-            "Insert Cell Before": "",
-            "Insert paragraph after": "",
-            "Insert paragraph before": "",
-            "Link points to:": "",
-            "Make lin_k...": "",
-            "Merge Cells": "",
-            "Opens this link in a new window": "",
-            "Paste": "",
-            "Please confirm that you want to remove this element:": "",
-            "Please confirm that you want to unlink this element.": "",
-            "Remove the $elem Element...": "",
-            "Remove this node from the document": "",
-            "Ro_w Properties...": "",
-            "Show the image properties dialog": "",
-            "Show the Table Cell Properties dialog": "",
-            "Show the Table Properties dialog": "",
-            "Show the Table Row Properties dialog": "",
-            "Unlink the current element": ""
-        },
-        "CreateLink": {
-            "Are you sure you wish to remove this link?": "",
-            "Insert/Modify Link": "",
-            "New window (_blank)": "",
-            "None (use implicit)": "",
-            "Other": "",
-            "Same frame (_self)": "",
-            "Target:": "",
-            "Title (tooltip):": "",
-            "Top frame (_top)": "",
-            "URL:": "",
-            "You need to select some text before creating a link": ""
-        },
-        "DefinitionList": {
-            "definition description": "",
-            "definition list": "",
-            "definition term": ""
-        },
-        "Dialogs": {
-            "Some Text Here": ""
-        },
-        "DynamicCSS": {
-            "Choose stylesheet": "",
-            "Default": "",
-            "Undefined": ""
-        },
-        "EditTag": {
-            "Edit HTML for selected text": "",
-            "Edit Tag By Peg": "",
-            "Tag Editor": ""
-        },
-        "Equation": {
-            "!=": "",
-            "!in": "",
-            "&gt;-": "",
-            "&gt;=": "",
-            "&lt;=": "",
-            "&lt;=&gt;": "",
-            "&lt;x&gt;": "",
-            "&nbsp; `!` &nbsp;": "",
-            "&nbsp; `.` &nbsp;": "",
-            "&nbsp; `0` &nbsp;": "",
-            "&nbsp; `2` &nbsp;": "",
-            "&nbsp; `3` &nbsp;": "",
-            "&nbsp; `4` &nbsp;": "",
-            "&nbsp; `5` &nbsp;": "",
-            "&nbsp; `6` &nbsp;": "",
-            "&nbsp; `7` &nbsp;": "",
-            "&nbsp; `8` &nbsp;": "",
-            "&nbsp; `9` &nbsp;": "",
-            "&nbsp; `e` &nbsp;": "",
-            "&nbsp;&nbsp;`1` &nbsp;": "",
-            "&nbsp;`+{::}`&nbsp;": "",
-            "&nbsp;`-:\\ `": "",
-            "&nbsp;`-{::}`&nbsp;": "",
-            "&nbsp;`C`&nbsp;": "",
-            "&nbsp;`cos`": "",
-            "&nbsp;`ln`&nbsp;": "",
-            "&nbsp;`pi` &nbsp;": "",
-            "&nbsp;`sin`": "",
-            "&nbsp;`tan`": "",
-            "&nbsp;`times`&nbsp;": "",
-            "&quot;text&quot;": "",
-            "'+formula+'": "",
-            "((n),(k))": "",
-            "(x+1)/(x-1)": "",
-            "*": "",
-            "**": "",
-            "+-": "",
-            "-&gt;": "",
-            "-&lt;": "",
-            "-:": "",
-            "-=": "",
-            "//": "",
-            "/_": "",
-            ":.": "",
-            "=&gt;": "",
-            "@": "",
-            "[[a,b],[c,d]]": "",
-            "\\\\": "",
-            "\\nClick in the box to use your keyboard or use the buttons\\n": "",
-            "^^": "",
-            "^^^": "",
-            "__|": "",
-            "_|_": "",
-            "`!=`": "",
-            "`!in`": "",
-            "`&and;`": "",
-            "`&cap;`": "",
-            "`&cup;`": "",
-            "`&gt;-`": "",
-            "`&gt;=`": "",
-            "`&lt;=&gt;`": "",
-            "`&lt;=`": "",
-            "`&lt;x&gt;`": "",
-            "`&or;`": "",
-            "`&quot;text&quot;`": "",
-            "`((n),(k))`": "",
-            "`(x+1)/(x-1)`": "",
-            "`**`": "",
-            "`*`": "",
-            "`+-`": "",
-            "`-&gt;`": "",
-            "`-&lt;`": "",
-            "`-:`": "",
-            "`-=`": "",
-            "`//`": "",
-            "`/_`": "",
-            "`:.`": "",
-            "`=&gt;`": "",
-            "`@`": "",
-            "`[[a,b],[c,d]]`": "",
-            "`\\\\`": "",
-            "`__|`": "",
-            "`_|_`": "",
-            "`AA`": "",
-            "`aleph`": "",
-            "`alpha`": "",
-            "`and`": "",
-            "`bara`": "",
-            "`bba`": "",
-            "`bbba`": "",
-            "`beta`": "",
-            "`CC`": "",
-            "`cca`": "",
-            "`chi`": "",
-            "`darr`": "",
-            "`ddota`": "",
-            "`del`": "",
-            "`Delta`": "",
-            "`delta`": "",
-            "`diamond`": "",
-            "`dota`": "",
-            "`dy/dx`": "",
-            "`EE`": "",
-            "`epsi`": "",
-            "`eta`": "",
-            "`fra`": "",
-            "`Gamma`": "",
-            "`gamma`": "",
-            "`grad`": "",
-            "`harr`": "",
-            "`hArr`": "",
-            "`hata`": "",
-            "`if`": "",
-            "`in`": "",
-            "`int`": "",
-            "`iota`": "",
-            "`kappa`": "",
-            "`Lambda`": "",
-            "`lambda`": "",
-            "`lArr`": "",
-            "`larr`": "",
-            "`lim_(x-&gt;oo)`": "",
-            "`log`": "",
-            "`mu`": "",
-            "`NN`": "",
-            "`nn`": "",
-            "`not`": "",
-            "`nu`": "",
-            "`o+`": "",
-            "`o.`": "",
-            "`O/`": "",
-            "`oint`": "",
-            "`omega`": "",
-            "`Omega`": "",
-            "`oo`": "",
-            "`or`": "",
-            "`ox`": "",
-            "`phi`": "",
-            "`Phi`": "",
-            "`Pi`": "",
-            "`pi`": "",
-            "`prod`": "",
-            "`prop`": "",
-            "`Psi`": "",
-            "`psi`": "",
-            "`QQ`": "",
-            "`quad`": "",
-            "`rArr`": "",
-            "`rho`": "",
-            "`root(n)(x)`": "",
-            "`RR`": "",
-            "`sfa`": "",
-            "`Sigma`": "",
-            "`sigma`": "",
-            "`sqrt(x)`": "",
-            "`square`": "",
-            "`stackrel(-&gt;)(+)`": "",
-            "`sub`": "",
-            "`sube`": "",
-            "`sum`": "",
-            "`sup`": "",
-            "`supe`": "",
-            "`tau`": "",
-            "`Theta`": "",
-            "`theta`": "",
-            "`TT`": "",
-            "`tta`": "",
-            "`uarr`": "",
-            "`ula`": "",
-            "`upsilon`": "",
-            "`uu`": "",
-            "`veca`": "",
-            "`vv`": "",
-            "`x_(mn)`": "",
-            "`Xi`": "",
-            "`xi`": "",
-            "`xx`": "",
-            "`zeta`": "",
-            "`ZZ`": "",
-            "`|-&gt;`": "",
-            "`|--`": "",
-            "`|==`": "",
-            "`|__`": "",
-            "`|~`": "",
-            "`~=`": "",
-            "`~|`": "",
-            "`~~`": "",
-            "AA": "",
-            "aleph": "",
-            "alpha": "",
-            "and": "",
-            "AsciiMath Formula Input": "",
-            "AsciiMathML Example": "",
-            "bara": "",
-            "Based on ASCIIMathML by": "",
-            "bba": "",
-            "bbba": "",
-            "beta": "",
-            "CC": "",
-            "cca": "",
-            "chi": "",
-            "darr": "",
-            "ddota": "",
-            "del": "",
-            "delta": "",
-            "Delta": "",
-            "diamond": "",
-            "dota": "",
-            "dy/dx": "",
-            "EE": "",
-            "epsi": "",
-            "eta": "",
-            "For more information on AsciiMathML visit this page:": "",
-            "Formula Editor": "",
-            "fra": "",
-            "gamma": "",
-            "Gamma": "",
-            "grad": "",
-            "hArr": "",
-            "harr": "",
-            "hata": "",
-            "if": "",
-            "in": "",
-            "Input": "",
-            "int": "",
-            "int_a^bf(x)dx": "",
-            "iota": "",
-            "kappa": "",
-            "Lambda": "",
-            "lambda": "",
-            "larr": "",
-            "lArr": "",
-            "lim_(x-&gt;oo)": "",
-            "mu": "",
-            "NN": "",
-            "nn": "",
-            "nnn": "",
-            "not": "",
-            "nu": "",
-            "o+": "",
-            "o.": "",
-            "O/": "",
-            "oint": "",
-            "Omega": "",
-            "omega": "",
-            "oo": "",
-            "or": "",
-            "ox": "",
-            "phi": "",
-            "Phi": "",
-            "pi": "",
-            "Pi": "",
-            "Preview": "",
-            "prod": "",
-            "prop": "",
-            "psi": "",
-            "Psi": "",
-            "QQ": "",
-            "quad": "",
-            "rArr": "",
-            "rho": "",
-            "root(n)(x)": "",
-            "RR": "",
-            "sfa": "",
-            "sigma": "",
-            "Sigma": "",
-            "sqrt(x)": "",
-            "square": "",
-            "stackrel(-&gt;)(+)": "",
-            "sub": "",
-            "sube": "",
-            "sum": "",
-            "sum_(n=1)^oo": "",
-            "sup": "",
-            "supe": "",
-            "tau": "",
-            "Theta": "",
-            "theta": "",
-            "TT": "",
-            "tta": "",
-            "uarr": "",
-            "ula": "",
-            "upsilon": "",
-            "uu": "",
-            "uuu": "",
-            "veca": "",
-            "vv": "",
-            "vvv": "",
-            "x^(m+n)": "",
-            "x_(mn)": "",
-            "Xi": "",
-            "xi": "",
-            "xx": "",
-            "zeta": "",
-            "ZZ": "",
-            "|-&gt;": "",
-            "|--": "",
-            "|==": "",
-            "|__": "",
-            "|~": "",
-            "~=": "",
-            "~|": "",
-            "~~": ""
-        },
-        "FancySelects": {
-            "'+opt.text+'": ""
-        },
-        "FindReplace": {
-            "';\r\n  var tagc = '": "",
-            "Case sensitive search": "",
-            "Clear": "",
-            "Done": "",
-            "Enter the text you want to find": "",
-            "Find and Replace": "",
-            "found item": "",
-            "found items": "",
-            "Highlight": "",
-            "Inform a replacement word": "",
-            "Next": "",
-            "not found": "",
-            "Options": "",
-            "Replace with:": "",
-            "replaced item": "",
-            "replaced items": "",
-            "Search for:": "",
-            "Substitute all occurrences": "",
-            "Substitute this occurrence?": "",
-            "Undo": "",
-            "Whole words only": ""
-        },
-        "FormOperations": {
-            "Enter the name for new option.": "",
-            "Form Editor": "",
-            "Insert a check box.": "",
-            "Insert a Form.": "",
-            "Insert a multi-line text field.": "",
-            "Insert a radio button.": "",
-            "Insert a select field.": "",
-            "Insert a submit/reset button.": "",
-            "Insert a text, password or hidden field.": "",
-            "Message Sent": "",
-            "Please Select...": ""
-        },
-        "Forms": {
-            "'onClick'=": "",
-            "Access Key:": "",
-            "Action URL:": "",
-            "Button Script": "",
-            "Checked": "",
-            "Columns:": "",
-            "Default text (optional)": "",
-            "Dimensions": "",
-            "Disabled": "",
-            "Encoding:": "",
-            "For Control:": "",
-            "Form": "",
-            "Form Element: FIELDSET": "",
-            "Form Element: INPUT": "",
-            "Form Element: LABEL": "",
-            "Form Element: SELECT": "",
-            "Form Element: TEXTAREA": "",
-            "Form handler script": "",
-            "Form Name:": "",
-            "Get": "",
-            "Hard": "",
-            "Height in number of rows": "",
-            "HTML-Form to CGI (default)": "",
-            "Image source": "",
-            "Image URL:": "",
-            "Initial Text:": "",
-            "Insert/Edit Form": "",
-            "Insert/Edit Form Element FIELDSET": "",
-            "Insert/Edit Form Element INPUT": "",
-            "Insert/Edit Form Element LABEL": "",
-            "Insert/Edit Form Element SELECT": "",
-            "Insert/Edit Form Element TEXTAREA": "",
-            "Javascript for button click": "",
-            "Label:": "",
-            "Legend:": "",
-            "Max length:": "",
-            "Maximum number of characters accepted": "",
-            "Method:": "",
-            "multipart Form Data (File-Upload)": "",
-            "Name": "",
-            "Name of the form input": "",
-            "Name of the form select": "",
-            "name of the textarea": "",
-            "Name/ID:": "",
-            "normal": "",
-            "nowrap": "",
-            "Off": "",
-            "Physical": "",
-            "Please enter a Label": "",
-            "Post": "",
-            "pre": "",
-            "Read Only": "",
-            "Rows:": "",
-            "Size of text box in characters": "",
-            "Size:": "",
-            "Soft": "",
-            "Tab Index:": "",
-            "Target Frame:": "",
-            "Text:": "",
-            "URL of image": "",
-            "Value of the form input": "",
-            "Value:": "",
-            "Virtual": "",
-            "Width in number of characters": "",
-            "Wrap Mode:": "",
-            "You must enter a Name": "",
-            "Options": "<<FindReplace>>"
-        },
-        "FullPage": {
-            "...": "",
-            "Alternate style-sheet:": "",
-            "Background color:": "",
-            "Character set:": "",
-            "cyrillic (ISO-8859-5)": "",
-            "cyrillic (KOI8-R)": "",
-            "cyrillic (WINDOWS-1251)": "",
-            "Description:": "",
-            "DOCTYPE:": "",
-            "Document properties": "",
-            "Document title:": "",
-            "Keywords:": "",
-            "Primary style-sheet:": "",
-            "Text color:": "",
-            "UTF-8 (recommended)": "",
-            "western (ISO-8859-1)": ""
-        },
-        "FullScreen": {
-            "Maximize/Minimize Editor": ""
-        },
-        "Gecko": {
-            "The Paste button does not work in this browser for security reasons. Press CTRL-V on your keyboard to paste directly.": ""
-        },
-        "HorizontalRule": {
-            "&#x00d7;": "",
-            "&nbsp;": "",
-            "Alignment:": "",
-            "Center": "",
-            "Color:": "",
-            "Height:": "",
-            "Insert/edit horizontal rule": "",
-            "Insert/Edit Horizontal Rule": "",
-            "Layout": "",
-            "Left": "",
-            "No shading": "",
-            "percent": "",
-            "pixels": "",
-            "Right": "",
-            "Style": "",
-            "Width:": ""
-        },
-        "InlineStyler": {
-            "Background": "",
-            "Baseline": "",
-            "Border": "",
-            "Bottom": "",
-            "Char": "",
-            "Collapsed borders": "",
-            "CSS Style": "",
-            "FG Color": "",
-            "Float": "",
-            "Justify": "",
-            "Margin": "",
-            "Middle": "",
-            "None": "",
-            "Padding": "",
-            "Text align": "",
-            "Top": "",
-            "Vertical align": "",
-            "-": "<<Equation>>",
-            "Center": "<<HorizontalRule>>",
-            "Height": "<<HorizontalRule>>",
-            "Image URL": "<<Forms>>",
-            "Layout": "<<HorizontalRule>>",
-            "Left": "<<HorizontalRule>>",
-            "percent": "<<HorizontalRule>>",
-            "pixels": "<<HorizontalRule>>",
-            "Right": "<<HorizontalRule>>",
-            "Width": "<<HorizontalRule>>"
-        },
-        "InsertAnchor": {
-            "Anchor name": "",
-            "Insert Anchor": "",
-            "Delete": "<<Abbreviation>>"
-        },
-        "InsertImage": {
-            "Absbottom": "",
-            "Absmiddle": "",
-            "Alternate text:": "",
-            "Border thickness:": "",
-            "Enter the image URL here": "",
-            "For browsers that don't support images": "",
-            "Horizontal padding": "",
-            "Horizontal:": "",
-            "Image Preview:": "",
-            "Insert Image": "",
-            "Leave empty for no border": "",
-            "Not set": "",
-            "Positioning of this image": "",
-            "Preview the image in a new window": "",
-            "Spacing": "",
-            "Texttop": "",
-            "Vertical padding": "",
-            "Vertical:": "",
-            "You must enter the URL": "",
-            "Alignment:": "<<HorizontalRule>>",
-            "Baseline": "<<InlineStyler>>",
-            "Bottom": "<<InlineStyler>>",
-            "Image URL:": "<<Forms>>",
-            "Layout": "<<HorizontalRule>>",
-            "Left": "<<HorizontalRule>>",
-            "Middle": "<<InlineStyler>>",
-            "Preview": "<<Equation>>",
-            "Right": "<<HorizontalRule>>",
-            "Top": "<<InlineStyler>>"
-        },
-        "InsertNote": {
-            "Insert": "",
-            "Insert footnote": "",
-            "Insert Note": ""
-        },
-        "InsertPagebreak": {
-            "Page break": "",
-            "Page Break": ""
-        },
-        "InsertSmiley": {
-            "Insert Smiley": ""
-        },
-        "InsertSnippet": {
-            "\\n  This is an information about something\\n": "",
-            "Hide preview": "",
-            "Insert as": "",
-            "Insert Snippet": "",
-            "InsertSnippet for Xinha": "",
-            "Link1": "",
-            "Link2": "",
-            "Link3": "",
-            "Link4": "",
-            "Link5": "",
-            "Show preview": "",
-            "This is an information about something": "",
-            "Variable": ""
-        },
-        "InsertSnippet2": {
-            "All Categories": "",
-            "Filter": "",
-            "Insert as HTML": "",
-            "Insert as template variable": "",
-            "Only search word beginning": "",
-            "HTML": "<<CharCounter>>",
-            "Insert Snippet": "<<InsertSnippet>>",
-            "InsertSnippet for Xinha": "<<InsertSnippet>>",
-            "Variable": "<<InsertSnippet>>"
-        },
-        "InsertTable": {
-            "Caption": "",
-            "Caption for the table": "",
-            "Cell padding:": "",
-            "Cell spacing:": "",
-            "Collapse borders:": "",
-            "Cols:": "",
-            "Em": "",
-            "Fixed width columns": "",
-            "Layou": "",
-            "Number of columns": "",
-            "Number of rows": "",
-            "Positioning of this table": "",
-            "Space between adjacent cells": "",
-            "Space between content and border in cell": "",
-            "Style of the border": "",
-            "Width of the table": "",
-            "Width unit": "",
-            "You must enter a number of columns": "",
-            "You must enter a number of rows": "",
-            "Absbottom": "<<InsertImage>>",
-            "Absmiddle": "<<InsertImage>>",
-            "Alignment:": "<<HorizontalRule>>",
-            "Baseline": "<<InlineStyler>>",
-            "Border": "<<InlineStyler>>",
-            "Border thickness:": "<<InsertImage>>",
-            "Bottom": "<<InlineStyler>>",
-            "Layout": "<<HorizontalRule>>",
-            "Leave empty for no border": "<<InsertImage>>",
-            "Left": "<<HorizontalRule>>",
-            "Middle": "<<InlineStyler>>",
-            "Not set": "<<InsertImage>>",
-            "Percent": "<<HorizontalRule>>",
-            "Pixels": "<<HorizontalRule>>",
-            "Right": "<<HorizontalRule>>",
-            "Rows:": "<<Forms>>",
-            "Spacing": "<<InsertImage>>",
-            "Texttop": "<<InsertImage>>",
-            "Top": "<<InlineStyler>>",
-            "Width:": "<<HorizontalRule>>"
-        },
-        "LangMarks": {
-            "&mdash; language &mdash;": "",
-            "', '": "",
-            "English": "",
-            "French": "",
-            "Greek": "",
-            "language select": "",
-            "Latin": ""
-        },
-        "Linker": {
-            "(px)": "",
-            "Anchor-Link": "",
-            "Anchor:": "",
-            "Email Address:": "",
-            "Email Link": "",
-            "Location Bar:": "",
-            "Menu Bar:": "",
-            "Message Template:": "",
-            "New Window": "",
-            "Ordinary Link": "",
-            "Popup Window": "",
-            "PopupWindow": "",
-            "Remove Link": "",
-            "Resizeable:": "",
-            "Same Window (jump out of frames)": "",
-            "Scrollbars:": "",
-            "Shows On Hover": "",
-            "Status Bar:": "",
-            "Subject:": "",
-            "Title:": "",
-            "Toolbar:": "",
-            "URL Link": "",
-            "You must select some text before making a new link.": "",
-            "Are you sure you wish to remove this link?": "<<CreateLink>>",
-            "Insert/Modify Link": "<<CreateLink>>",
-            "Name:": "<<Forms>>",
-            "Size:": "<<Forms>>",
-            "Target:": "<<CreateLink>>",
-            "URL:": "<<CreateLink>>"
-        },
-        "ListType": {
-            "Choose list style type (for ordered lists)": "",
-            "Decimal numbers": "",
-            "Lower greek letters": "",
-            "Lower latin letters": "",
-            "Lower roman numbers": "",
-            "Upper latin letters": "",
-            "Upper roman numbers": ""
-        },
-        "MootoolsFileManager": {
-            "Insert File Link": "",
-            "You must select some text before making a new link.": "<<Linker>>"
-        },
-        "Opera": {
-            "MARK": "",
-            "The Paste button does not work in Mozilla based web browsers (technical security reasons). Press CTRL-V on your keyboard to paste directly.": ""
-        },
-        "PasteText": {
-            "Insert text in new paragraph": "",
-            "Paste as Plain Text": ""
-        },
-        "PreserveScripts": {
-            "JavaScript": "",
-            "PHP": ""
-        },
-        "QuickTag": {
-            "',\r\n                           'cl': '": "",
-            "ATTRIBUTES": "",
-            "Colors": "",
-            "Enter the TAG you want to insert": "",
-            "No CSS class avaiable": "",
-            "Ok": "",
-            "OPTIONS": "",
-            "Quick Tag Editor": "",
-            "TAGs": "",
-            "There are some unclosed quote": "",
-            "This attribute already exists in the TAG": "",
-            "You have to select some text": ""
-        },
-        "SaveSubmit": {
-            "in progress": "",
-            "Ready": "",
-            "Save": "",
-            "Saving...": ""
-        },
-        "SetId": {
-            "ID/Name:": "",
-            "Set Id and Name": "",
-            "Set Id/Name": "",
-            "Set ID/Name": "",
-            "Delete": "<<Abbreviation>>"
-        },
-        "SmartReplace": {
-            "ClosingDoubleQuotes": "",
-            "ClosingSingleQuote": "",
-            "Convert all quotes and dashes in the current document": "",
-            "Enable automatic replacements": "",
-            "OpeningDoubleQuotes": "",
-            "OpeningSingleQuote": "",
-            "SmartReplace": "",
-            "SmartReplace Settings": ""
-        },
-        "Stylist": {
-            "Styles": ""
-        },
-        "SuperClean": {
-            "Clean bad HTML from Microsoft Word.": "",
-            "Clean Selection Only": "",
-            "Clean up HTML": "",
-            "Cleaning Scope": "",
-            "General tidy up and correction of some problems.": "",
-            "Please select from the following cleaning options...": "",
-            "Please stand by while cleaning in process...": "",
-            "Remove alignment (left/right/justify).": "",
-            "Remove all classes (CSS).": "",
-            "Remove All HTML Tags": "",
-            "Remove all styles (CSS).": "",
-            "Remove custom font sizes.": "",
-            "Remove custom text colors.": "",
-            "Remove custom typefaces (font \"styles\").": "",
-            "Remove emphasis and annotations.": "",
-            "Remove lang attributes.": "",
-            "Remove Paragraphs": "",
-            "Remove superscripts and subscripts.": "",
-            "Replace directional quote marks with non-directional quote marks.": "",
-            "Vigorously purge HTML from Microsoft Word.": ""
-        },
-        "TableOperations": {
-            "All four sides": "",
-            "Borders": "",
-            "Cell properties": "",
-            "Cell Properties": "",
-            "Cell Type:": "",
-            "Cells down": "",
-            "Cells to the right, and": "",
-            "Delete cell": "",
-            "Delete column": "",
-            "Delete row": "",
-            "Do Not Change": "",
-            "Frame and borders": "",
-            "Frames": "",
-            "Header (th)": "",
-            "Insert cell after": "",
-            "Insert cell before": "",
-            "Insert column after": "",
-            "Insert column before": "",
-            "Insert row after": "",
-            "Insert row before": "",
-            "Merge cells": "",
-            "Merge current cell with:": "",
-            "No rules": "",
-            "No sides": "",
-            "Normal (td)": "",
-            "Please click into some cell": "",
-            "Row properties": "",
-            "Row Properties": "",
-            "Rules will appear between all rows and columns": "",
-            "Rules will appear between columns only": "",
-            "Rules will appear between rows only": "",
-            "Spacing and padding": "",
-            "Split column": "",
-            "Split row": "",
-            "Summary": "",
-            "Table properties": "",
-            "Table Properties": "",
-            "The bottom side only": "",
-            "The left-hand side only": "",
-            "The right and left sides only": "",
-            "The right-hand side only": "",
-            "The top and bottom sides only": "",
-            "The top side only": "",
-            "Xinha cowardly refuses to delete the last cell in row.": "",
-            "Xinha cowardly refuses to delete the last column in table.": "",
-            "Xinha cowardly refuses to delete the last row in table.": "",
-            "Caption": "<<InsertTable>>",
-            "Columns": "<<Forms>>",
-            "Description": "<<FullPage>>",
-            "Merge Cells": "<<ContextMenu>>",
-            "Padding": "<<InlineStyler>>",
-            "pixels": "<<HorizontalRule>>",
-            "Rows": "<<Forms>>",
-            "Spacing": "<<InsertImage>>"
-        },
-        "UnsavedChanges": {
-            "You have unsaved changes in the editor": ""
-        },
-        "WebKit": {
-            "The Paste button does not work in this browser for security reasons. Press CTRL-V on your keyboard to paste directly.": "<<Gecko>>"
-        },
-        "Xinha": {
-            "&#8212; font &#8212;": "",
-            "&#8212; format &#8212;": "",
-            "&#8212; size &#8212;": "",
-            "1 (8 pt)": "",
-            "2 (10 pt)": "",
-            "3 (12 pt)": "",
-            "4 (14 pt)": "",
-            "5 (18 pt)": "",
-            "6 (24 pt)": "",
-            "7 (36 pt)": "",
-            "Address": "",
-            "Arial": "",
-            "Clean content pasted from Word": "",
-            "Clear Inline Font Specifications": "",
-            "Clear MSOffice tags": "",
-            "Close": "",
-            "Constructing object": "",
-            "Courier New": "",
-            "Create Statusbar": "",
-            "Create Toolbar": "",
-            "CTRL-0 (zero)": "",
-            "CTRL-1 .. CTRL-6": "",
-            "CTRL-A": "",
-            "CTRL-B": "",
-            "CTRL-C": "",
-            "CTRL-E": "",
-            "CTRL-I": "",
-            "CTRL-J": "",
-            "CTRL-L": "",
-            "CTRL-N": "",
-            "CTRL-R": "",
-            "CTRL-S": "",
-            "CTRL-U": "",
-            "CTRL-V": "",
-            "CTRL-X": "",
-            "CTRL-Y": "",
-            "CTRL-Z": "",
-            "Direction left to right": "",
-            "Direction right to left": "",
-            "Editor Help": "",
-            "ENTER": "",
-            "Error Loading Xinha.  Developers, check the Error Console for information.": "",
-            "Finishing": "",
-            "Formatted": "",
-            "Generate Xinha framework": "",
-            "Georgia": "",
-            "Heading 1": "",
-            "Heading 2": "",
-            "Heading 3": "",
-            "Heading 4": "",
-            "Heading 5": "",
-            "Heading 6": "",
-            "Headings": "",
-            "Impact": "",
-            "Init editor size": "",
-            "insert linebreak": "",
-            "Insert/Overwrite": "",
-            "Keyboard shortcuts": "",
-            "Loading Core": "",
-            "Loading in progress. Please wait!": "",
-            "Loading plugin $plugin": "",
-            "Loading plugins": "",
-            "MS Word Cleaner": "",
-            "new paragraph": "",
-            "Normal": "",
-            "Print document": "",
-            "Register plugin $plugin": "",
-            "Remove formatting": "",
-            "Save as": "",
-            "Select all": "",
-            "Select Color": "",
-            "Set format to paragraph": "",
-            "SHIFT-ENTER": "",
-            "Split Block": "",
-            "Tahoma": "",
-            "The editor provides the following key combinations:": "",
-            "Times New Roman": "",
-            "Toggle Borders": "",
-            "Touch here first to activate editor.": "",
-            "Verdana": "",
-            "Waiting for Iframe to load...": "",
-            "WingDings": "",
-            "Would you like to clear font colours?": "",
-            "Would you like to clear font sizes?": "",
-            "Would you like to clear font typefaces?": "",
-            "Xinha": ""
-        },
-        "BackgroundImage": {
-            "__ TRANSLATOR NOTE __": "*** BACKGROUNDIMAGE IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***",
-            "Remove Current Background": "",
-            "Set Background": "",
-            "Set page background image": "",
-            "Set Page Background Image": ""
-        },
-        "ClientsideSpellcheck": {
-            "__ TRANSLATOR NOTE __": "*** CLIENTSIDESPELLCHECK IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***",
-            "Spell Check using ieSpell": ""
-        },
-        "ExtendedFileManager": {
-            "__ TRANSLATOR NOTE __": "*** EXTENDEDFILEMANAGER IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***",
-            "10%": "",
-            "100%": "",
-            "200%": "",
-            "25%": "",
-            "50%": "",
-            "75%": "",
-            ">List View": "",
-            ">Thumbnail View": "",
-            "A:": "",
-            "Align": "",
-            "Alt": "",
-            "Border Color": "",
-            "Constrain Proportions": "",
-            "Crop": "",
-            "D:": "",
-            "Directory": "",
-            "Directory Up": "",
-            "Edit": "",
-            "File List": "",
-            "File Manager": "",
-            "Filename:": "",
-            "Filesize:": "",
-            "Flip Horizontal": "",
-            "Flip Image": "",
-            "Flip Vertical": "",
-            "Folder": "",
-            "GIF": "",
-            "GIF format is not supported, image editing not supported.": "",
-            "H:": "",
-            "Image Editor": "",
-            "Image Selection": "",
-            "Invalid base directory:": "",
-            "JPEG High": "",
-            "JPEG Low": "",
-            "JPEG Medium": "",
-            "Loading": "",
-            "Lock": "",
-            "Marker": "",
-            "Maximum folder size limit reached. Upload disabled.": "",
-            "Measure": "",
-            "New Folder": "",
-            "No Files Found": "",
-            "No Image Available": "",
-            "Please enter value": "",
-            "PNG": "",
-            "Preset": "",
-            "Quality:": "",
-            "Refresh": "",
-            "Rename": "",
-            "Resize": "",
-            "Rotate": "",
-            "Rotate 180 &deg;": "",
-            "Rotate 90 &deg; CCW": "",
-            "Rotate 90 &deg; CW": "",
-            "Rotate Image": "",
-            "Start X:": "",
-            "Start Y:": "",
-            "Target Window": "",
-            "Toggle marker color": "",
-            "Trash": "",
-            "Upload": "",
-            "W:": "",
-            "X:": "",
-            "Xinha Image Editor": "",
-            "Y:": "",
-            "Zoom": "",
-            "Absbottom": "<<InsertImage>>",
-            "Absmiddle": "<<InsertImage>>",
-            "Baseline": "<<InlineStyler>>",
-            "Border": "<<InlineStyler>>",
-            "Bottom": "<<InlineStyler>>",
-            "Clear": "<<FindReplace>>",
-            "Color": "<<HorizontalRule>>",
-            "Copy": "<<ContextMenu>>",
-            "Cut": "<<ContextMenu>>",
-            "Height": "<<HorizontalRule>>",
-            "Height:": "<<HorizontalRule>>",
-            "Insert File Link": "<<MootoolsFileManager>>",
-            "Left": "<<HorizontalRule>>",
-            "Margin": "<<InlineStyler>>",
-            "Middle": "<<InlineStyler>>",
-            "New window (_blank)": "<<CreateLink>>",
-            "None (use implicit)": "<<CreateLink>>",
-            "Not set": "<<InsertImage>>",
-            "Padding": "<<InlineStyler>>",
-            "Positioning of this image": "<<InsertImage>>",
-            "Preview": "<<Equation>>",
-            "Right": "<<HorizontalRule>>",
-            "Same frame (_self)": "<<CreateLink>>",
-            "Save": "<<SaveSubmit>>",
-            "Texttop": "<<InsertImage>>",
-            "Title (tooltip)": "<<CreateLink>>",
-            "Top": "<<InlineStyler>>",
-            "Top frame (_top)": "<<CreateLink>>",
-            "Width": "<<HorizontalRule>>",
-            "Width:": "<<HorizontalRule>>",
-            "You must select some text before making a new link.": "<<Linker>>"
-        },
-        "Filter": {
-            "__ TRANSLATOR NOTE __": "*** FILTER IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***",
-            "Filter": "<<InsertSnippet2>>"
-        },
-        "HtmlTidy": {
-            "__ TRANSLATOR NOTE __": "*** HTMLTIDY IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***",
-            "Auto-Tidy": "",
-            "Don't Tidy": "",
-            "HTML Tidy": "",
-            "Tidy failed.  Check your HTML for syntax errors.": ""
-        },
-        "ImageManager": {
-            "__ TRANSLATOR NOTE __": "*** IMAGEMANAGER IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***",
-            "Angle:": "",
-            "Flickr Picture List": "",
-            "Flickr Pictures": "",
-            "Flickr Selection": "",
-            "Flickr Username/Email": "",
-            "Folder Name:": "",
-            "Image Format": "",
-            "Image List": "",
-            "Keyword": "",
-            "No Images Found": "",
-            "No Photos Found": "",
-            "No Videos Found": "",
-            "This Server": "",
-            "YouTube Selection": "",
-            "YouTube Username": "",
-            "YouTube Video List": "",
-            "YouTube Videos": "",
-            "A:": "<<ExtendedFileManager>>",
-            "Absbottom": "<<InsertImage>>",
-            "Absmiddle": "<<InsertImage>>",
-            "Baseline": "<<InlineStyler>>",
-            "Bottom": "<<InlineStyler>>",
-            "Clear": "<<FindReplace>>",
-            "Constrain Proportions": "<<ExtendedFileManager>>",
-            "Crop": "<<ExtendedFileManager>>",
-            "D:": "<<ExtendedFileManager>>",
-            "Directory": "<<ExtendedFileManager>>",
-            "Directory Up": "<<ExtendedFileManager>>",
-            "Edit": "<<ExtendedFileManager>>",
-            "Filename:": "<<ExtendedFileManager>>",
-            "Flip Horizontal": "<<ExtendedFileManager>>",
-            "Flip Image": "<<ExtendedFileManager>>",
-            "Flip Vertical": "<<ExtendedFileManager>>",
-            "GIF": "<<ExtendedFileManager>>",
-            "GIF format is not supported, image editing not supported.": "<<ExtendedFileManager>>",
-            "H:": "<<ExtendedFileManager>>",
-            "Height:": "<<HorizontalRule>>",
-            "Image Editor": "<<ExtendedFileManager>>",
-            "Image Selection": "<<ExtendedFileManager>>",
-            "Insert Image": "<<InsertImage>>",
-            "Invalid base directory:": "<<ExtendedFileManager>>",
-            "JPEG High": "<<ExtendedFileManager>>",
-            "JPEG Low": "<<ExtendedFileManager>>",
-            "JPEG Medium": "<<ExtendedFileManager>>",
-            "Left": "<<HorizontalRule>>",
-            "Lock": "<<ExtendedFileManager>>",
-            "Marker": "<<ExtendedFileManager>>",
-            "Measure": "<<ExtendedFileManager>>",
-            "Middle": "<<InlineStyler>>",
-            "New Folder": "<<ExtendedFileManager>>",
-            "No Image Available": "<<ExtendedFileManager>>",
-            "Not set": "<<InsertImage>>",
-            "PNG": "<<ExtendedFileManager>>",
-            "Positioning of this image": "<<InsertImage>>",
-            "Quality:": "<<ExtendedFileManager>>",
-            "Refresh": "<<ExtendedFileManager>>",
-            "Resize": "<<ExtendedFileManager>>",
-            "Right": "<<HorizontalRule>>",
-            "Rotate": "<<ExtendedFileManager>>",
-            "Rotate 180 &deg;": "<<ExtendedFileManager>>",
-            "Rotate 90 &deg; CCW": "<<ExtendedFileManager>>",
-            "Rotate 90 &deg; CW": "<<ExtendedFileManager>>",
-            "Rotate Image": "<<ExtendedFileManager>>",
-            "Save": "<<SaveSubmit>>",
-            "Start X:": "<<ExtendedFileManager>>",
-            "Start Y:": "<<ExtendedFileManager>>",
-            "Texttop": "<<InsertImage>>",
-            "Top": "<<InlineStyler>>",
-            "Trash": "<<ExtendedFileManager>>",
-            "W:": "<<ExtendedFileManager>>",
-            "Width:": "<<HorizontalRule>>",
-            "X:": "<<ExtendedFileManager>>",
-            "Y:": "<<ExtendedFileManager>>"
-        },
-        "InsertMarquee": {
-            "__ TRANSLATOR NOTE __": "*** INSERTMARQUEE IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***",
-            "Alternate": "",
-            "Background-Color:": "",
-            "Behavior:": "",
-            "Continuous": "",
-            "Direction:": "",
-            "Insert scrolling marquee": "",
-            "Marquee Editor": "",
-            "Scroll Amount:": "",
-            "Scroll Delay:": "",
-            "Slide": "",
-            "Speed Control": "",
-            "Height:": "<<HorizontalRule>>",
-            "Left": "<<HorizontalRule>>",
-            "Name": "<<Forms>>",
-            "Name/ID:": "<<Forms>>",
-            "Right": "<<HorizontalRule>>",
-            "Text:": "<<Forms>>",
-            "Width:": "<<HorizontalRule>>"
-        },
-        "InsertPicture": {
-            "__ TRANSLATOR NOTE __": "*** INSERTPICTURE IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***",
-            "Leave empty for not defined": "",
-            "Open file in new window": "",
-            " Open file in new window": "",
-            "Upload file": "",
-            "Absbottom": "<<InsertImage>>",
-            "Absmiddle": "<<InsertImage>>",
-            "Alignment:": "<<HorizontalRule>>",
-            "Alternate text:": "<<InsertImage>>",
-            "Baseline": "<<InlineStyler>>",
-            "Border thickness:": "<<InsertImage>>",
-            "Bottom": "<<InlineStyler>>",
-            "Enter the image URL here": "<<InsertImage>>",
-            "For browsers that don't support images": "<<InsertImage>>",
-            "Height:": "<<HorizontalRule>>",
-            "Horizontal padding": "<<InsertImage>>",
-            "Horizontal:": "<<InsertImage>>",
-            "Image Preview:": "<<InsertImage>>",
-            "Image URL:": "<<Forms>>",
-            "Insert Image": "<<InsertImage>>",
-            "Layout": "<<HorizontalRule>>",
-            "Leave empty for no border": "<<InsertImage>>",
-            "Left": "<<HorizontalRule>>",
-            "Middle": "<<InlineStyler>>",
-            "Not set": "<<InsertImage>>",
-            "Positioning of this image": "<<InsertImage>>",
-            "Preview": "<<Equation>>",
-            "Preview the image in a new window": "<<InsertImage>>",
-            "Right": "<<HorizontalRule>>",
-            "Size": "<<Forms>>",
-            "Spacing": "<<InsertImage>>",
-            "Texttop": "<<InsertImage>>",
-            "Top": "<<InlineStyler>>",
-            "Vertical padding": "<<InsertImage>>",
-            "Vertical:": "<<InsertImage>>",
-            "Width:": "<<HorizontalRule>>"
-        },
-        "NoteServer": {
-            "__ TRANSLATOR NOTE __": "*** NOTESERVER IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***",
-            "120%": "",
-            "150%": "",
-            "80%": "",
-            "Add GUIDO Code in a textbox on the page": "",
-            "Add MIDI link to allow students to hear the music": "",
-            "Format": "",
-            "GUIDO Code": "",
-            "Guido code": "",
-            "Image in applet": "",
-            "Insert GUIDO Music Notation": "",
-            "MIDI File": "",
-            "Source Code": "",
-            "With Mozilla, the applet will not be visible in editor, but only in Web page after submitting.": "",
-            "Zoom :": "",
-            "100%": "<<ExtendedFileManager>>",
-            "Image Preview": "<<InsertImage>>",
-            "Options": "<<FindReplace>>",
-            "Preview": "<<Equation>>",
-            "Preview the image in a new window": "<<InsertImage>>",
-            "Zoom": "<<ExtendedFileManager>>"
-        },
-        "PSLocal": {
-            "__ TRANSLATOR NOTE __": "*** PSLOCAL IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***",
-            "Confirm": "",
-            "Enable": "",
-            "Enable Gears in order to use local document storage and configuration.": "",
-            "Enabling Local Storage": "",
-            "Install": "",
-            "Learn About Local Storage": "",
-            "This will reload the page, causing you to lose any unsaved work.  Press \"OK\" to reload.": "",
-            "Xinha uses Google Gears to enable local document storage.  With Gears installed, you can save drafts of your documents on your hard drive, configure Xinha to look the way you want, and carry this information wherever you use Xinha on the web.": ""
-        },
-        "PSServer": {
-            "__ TRANSLATOR NOTE __": "*** PSSERVER IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***",
-            "File: ": "",
-            "Import": ""
-        },
-        "PersistentStorage": {
-            "__ TRANSLATOR NOTE __": "*** PERSISTENTSTORAGE IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***",
-            "Details": "",
-            "File Browser": "",
-            "Hello    There C ": "",
-            "Hello  There A ": "",
-            "Hello \" There B \"": "",
-            "Hello ' There D '": "",
-            "List of Places": "",
-            "New Document": "",
-            "Open": "",
-            "Open Document": "",
-            "Places": "",
-            "Please enter the name of the directory you'd like to create.": "",
-            "Save Document": "",
-            "This will erase any unsaved content.  If you're certain, please click OK to continue.": "",
-            "Web URL": "",
-            "Confirm": "<<PSLocal>>",
-            "Copy": "<<ContextMenu>>",
-            "Delete": "<<Abbreviation>>",
-            "Directory Up": "<<ExtendedFileManager>>",
-            "File List": "<<ExtendedFileManager>>",
-            "File Manager": "<<ExtendedFileManager>>",
-            "Filename": "<<ExtendedFileManager>>",
-            "Insert": "<<InsertNote>>",
-            "Insert Image": "<<InsertImage>>",
-            "New Folder": "<<ExtendedFileManager>>",
-            "Save": "<<SaveSubmit>>",
-            "You must select some text before making a new link.": "<<Linker>>"
-        },
-        "SpellChecker": {
-            "__ TRANSLATOR NOTE __": "*** SPELLCHECKER IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***",
-            "Dictionary": "",
-            "Finished list of mispelled words": "",
-            "HTMLArea Spell Checker": "",
-            "I will open it in a new page.": "",
-            "Ignore": "",
-            "Ignore all": "",
-            "Info": "",
-            "Learn": "",
-            "No mispelled words found with the selected dictionary.": "",
-            "Original word": "",
-            "Please confirm that you want to open this link": "",
-            "Please wait.  Calling spell checker.": "",
-            "Please wait: changing dictionary to": "",
-            "pliz weit ;-)": "",
-            "Re-check": "",
-            "Replace": "",
-            "Replace all": "",
-            "Revert": "",
-            "Spell Checker": "",
-            "Spell-check": "",
-            "Suggestions": "",
-            "This will drop changes and quit spell checker.  Please confirm.": "",
-            "Replace with": "<<FindReplace>>"
-        },
-        "Template": {
-            "__ TRANSLATOR NOTE __": "*** TEMPLATE IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***",
-            "Insert template": ""
-        },
-        "UnFormat": {
-            "__ TRANSLATOR NOTE __": "*** UNFORMAT IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***",
-            "All": "",
-            "All HTML:": "",
-            "Cleaning Area": "",
-            "Cleaning options": "",
-            "Formatting:": "",
-            "Page Cleaner": "",
-            "Select which types of formatting you would like to remove.": "",
-            "Selection": ""
-        }
-    }
-}
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/lang/merged/nb.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/lang/merged/nb.js
deleted file mode 100644
index 81f925d..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/lang/merged/nb.js
+++ /dev/null
@@ -1,1579 +0,0 @@
-// Xinha Language Combined Translation File
-//
-// LANG: "nb", ENCODING: UTF-8
-//
-// INSTRUCTIONS TO TRANSLATORS
-// ===========================================================================
-//
-// Your translation must be in UTF-8 Character Encoding.
-//
-// This is a JSON encoded file (plus comments), strings should be double-quote
-// only, do not use single quotes to surround strings - "hello", not 'hello'
-// do not have a trailing comma after the last entry in a section.
-//
-// Only full line comments are allowed (that a comments occupy entire lines).
-//
-// Search for the __NEW_TRANSLATIONS__ section below, this is where you will
-// want to focus, this section includes things that do not presently have a 
-// translation or for which the translation needs to be checked for accuracy.
-//
-// In the New Translations section a translation string is one of the following
-//
-//  "English String Here" : ""
-//     This means it is not translated yet, add your translation...
-//     "English String Here" : "Klingon String Here"
-//
-//  "English String Here" : "Translated String Here"
-//     This means that an existing translation for this string, in some other
-//     section has been found, and used.  Check that it is approprite for this
-//     section and if it is, that's fine leave it as is, otherwise change as
-//     appropriate.
-//
-//  "English String Here" : "<<AnotherSection>>"
-//     This means use the same translation for this string as <<AnotherSection>>
-//     this saves you re-tranlating strings.  If the Context of this section
-//     and the context of AnotherSection seem the same, that's fine leave it
-//     using that translation, but if this section needs a different translation, 
-//     you can provide it by replacing the link (<<AnotherSection>>) with that
-//     new translation.  For example - a "Table" in say "DataPlugin" is 
-//     perhaps translated differently to "Table" in "FurniturePlugin".
-//
-// TESTING YOUR TRANSLATION
-// ===========================================================================
-// Simply place your translation file on your webserver somewhere for example
-//
-//   /xinha/lang/merged/nb.js
-//
-// and then tell Xinha where to get it (before loading XinhaCore.js) by 
-//
-//  _editor_lang              = 'nb';
-//  _editor_lang_merged_file  = '/xinha/lang/merged/nb.js';
-//
-// Xinha will load your new language definition.
-//
-// SUBMITTING YOUR TRANSLATION
-// ===========================================================================
-// Simply create a Ticket on the Xinha website and attach your translation 
-// file.
-//
-// The Xinha developers will take your file and use the 
-//     contrib/lc_split_merged_file.php
-// script to load it into the Xinha distribution.
-
-{
-    "Abbreviation": {
-        "Abbreviation": "Beskrive forkortelse",
-        "Cancel": "Avbryt",
-        "Delete": "Fjerne",
-        "Expansion:": "Betydning:",
-        "OK": "OK"
-    },
-    "AboutBox": {
-        "About this editor": "Om denne editor"
-    },
-    "BackgroundImage": {
-        "Cancel": "Avbryt",
-        "Remove Current Background": "Fjern gjeldende bakgrunn",
-        "Set Page Background Image": "Velg bakgrunnsbilde på Siden",
-        "Set page background image": "Velg bakgrunnsbilde på siden"
-    },
-    "CharCounter": {
-        "Chars": "Tegn"
-    },
-    "CharacterMap": {
-        "Insert special character": "Sett inn tegn"
-    },
-    "ColorPicker": {
-        "Color: ": "Farge",
-        "OK": "OK"
-    },
-    "ContextMenu": {
-        "C_ell Properties...": "C_elleegenskaper...",
-        "Chec_k Link...": "Sje_kk Link...",
-        "Copy": "Kopier",
-        "Create a link": "Lag ny link",
-        "Current URL is": "Gjeldende URL er",
-        "Cut": "Klipp ut",
-        "De_lete Column": "S_lett kolonne",
-        "Delete the current column": "Slett gjeldende kolonne",
-        "Delete the current row": "Slett gjeldende rad",
-        "How did you get here? (Please report!)": "Hva skjedde? (Vennligst beskriv)",
-        "I_nsert Row Before": "Sett I_nn rad før",
-        "In_sert Row After": "_Sett inn rad etter",
-        "Insert C_olumn After": "Sett inn k_olonne etter",
-        "Insert _Column Before": "Sett inn kolonne etter (_c)",
-        "Insert a new column after the current one": "Sett inn kolonne etter gjeldende",
-        "Insert a new column before the current one": "Sett inn kolonne før gjeldende",
-        "Insert a new row after the current one": "Sett inn ny rad etter gjeldende",
-        "Insert a new row before the current one": "Sett inn ny rad før gjeldende",
-        "Insert a paragraph after the current node": "Sett inn paragraf etter gjeldende node",
-        "Insert a paragraph before the current node": "Sett inn paragraf før gjeldende node",
-        "Insert paragraph after": "Sett inn paragraf etter",
-        "Insert paragraph before": "Sett inn paragraf før",
-        "Justify Center": "_Midtjuster",
-        "Justify Full": "Blokk_juster",
-        "Justify Left": "_Venstrejuster",
-        "Justify Right": "_Høyrejuster",
-        "Link points to:": "Link peker til:",
-        "Make lin_k...": "Lag len_ke...",
-        "Opens this link in a new window": "Åpner denne link i nytt vindu",
-        "Paste": "Lim inn",
-        "Please confirm that you want to remove this element:": "Vennligst bekreft at du ønsker å fjerne elementet:",
-        "Please confirm that you want to unlink this element.": "Vennligst bekreft at du ønsker å fjerne link på elementet",
-        "Remove the $elem Element...": "Fjerne $elem elementet...",
-        "Remove this node from the document": "Fjerne denne node fra dokumentet",
-        "Ro_w Properties...": "Rad Egenskaper... (_w)",
-        "Show the Table Cell Properties dialog": "Vis egenskaper for celle",
-        "Show the Table Properties dialog": "Vis egenskaper for tabellen",
-        "Show the Table Row Properties dialog": "Vis egenskaper for rad",
-        "Show the image properties dialog": "Vis bildeegenskaper",
-        "Unlink the current element": "Fjerne link på gjeldende element",
-        "_Delete Row": "Slett rad (_d)",
-        "_Image Properties...": "_Bildeegenskaper...",
-        "_Modify Link...": "_Rediger Link...",
-        "_Remove Link...": "_Fjerne Link...",
-        "_Table Properties...": "_Tabellegenskaper..."
-    },
-    "CreateLink": {
-        "Are you sure you wish to remove this link?": "Er du sikker på at du vil fjerne lenken?",
-        "Cancel": "Avbryt",
-        "Insert/Modify Link": "Rediger lenke",
-        "New window (_blank)": "Eget vindu (_blank)",
-        "None (use implicit)": "Ingen (bruk standardinnstilling)",
-        "OK": "OK",
-        "Other": "Annen",
-        "Same frame (_self)": "Samme ramme (_self)",
-        "Target:": "Mål:",
-        "Title (tooltip):": "Tittel (tooltip):",
-        "Top frame (_top)": "Toppramme (_top)",
-        "URL:": "Adresse:"
-    },
-    "DynamicCSS": {
-        "Choose stylesheet": "Velg stilsett",
-        "Default": "Standard",
-        "Undefined": "Udefinert"
-    },
-    "EditTag": {
-        "Cancel": "Avbryt",
-        "Edit HTML for selected text": "Rediger HTML for den valgte teksten",
-        "OK": "OK"
-    },
-    "Equation": {
-        "Cancel": "Avbryt",
-        "OK": "OK",
-        "Preview": "Forhåndsvisning"
-    },
-    "ExtendedFileManager": {
-        "Align": "Juster",
-        "Alt": "Alt",
-        "Baseline": "Grunnlinje",
-        "Border": "Ramme",
-        "Border Color": "Ramme farge:",
-        "Bottom": "Bunn",
-        "Cancel": "Avbryt",
-        "Clear": "Tøm",
-        "Color": "Farge",
-        "Constrain Proportions": "Beholde proposjoner",
-        "Copy": "Copy",
-        "Crop": "Beskjær",
-        "Cut": "Cut",
-        "Directory": "Mappe",
-        "Directory Up": "Opp et nivå",
-        "Edit": "Rediger",
-        "File Manager": "Filbehandler",
-        "Filename:": "Filnavn:",
-        "Flip Horizontal": "Vend horisontal",
-        "Flip Image": "Vend bilde",
-        "Flip Vertical": "Vend vertikal",
-        "GIF format is not supported, image editing not supported.": "GIF format er ikke støttet og bilderedigering er derfor ikke tilgjengelig.",
-        "Height": "Høyde",
-        "Height:": "Høyde:",
-        "Insert File Link": "Sett inn lenke til fil",
-        "Invalid base directory:": "Ugyldig sti til mappe:",
-        "JPEG High": "JPEG høy",
-        "JPEG Low": "JPEG lav",
-        "JPEG Medium": "JPEG middels",
-        "Left": "Venstre",
-        "Loading": "Laster",
-        "Lock": "Lås",
-        "Margin": "Marg",
-        "Marker": "Markør",
-        "Measure": "Mål",
-        "Middle": "Midten",
-        "New Folder": "Ny mappe",
-        "New window (_blank)": "Eget vindu (_blank)",
-        "No Files Found": "Ingen filer funnet",
-        "No Image Available": "Inget bilde tilgjengelig.",
-        "None (use implicit)": "Ingen (bruk standardinnstilling)",
-        "OK": "OK",
-        "Padding": "Innvendig marg",
-        "Positioning of this image": "Bildepossisjon",
-        "Preview": "Forhåndsvisning",
-        "Quality:": "Kvalitet",
-        "Refresh": "Oppfrisk side",
-        "Rename": "Nytt navn",
-        "Resize": "Endre størrelse",
-        "Right": "Høyre",
-        "Rotate": "Roter",
-        "Rotate Image": "Roter bilde",
-        "Same frame (_self)": "Samme ramme (_self)",
-        "Save": "Lagre",
-        "Start X:": "Start X",
-        "Start Y:": "Start Y",
-        "Target Window": "Mål",
-        "Title (tooltip)": "Tittel (tooltip)",
-        "Top": "Overkant",
-        "Top frame (_top)": "Toppramme (_top)",
-        "Trash": "Søppel",
-        "Upload": "Last opp",
-        "W:": "L:",
-        "Width": "Bredde",
-        "Width:": "Bredde:",
-        "You must select some text before making a new link.": "Du må velge noe tekst før du kan lage en ny lenke.",
-        "Zoom": "Forstørr"
-    },
-    "FindReplace": {
-        "Case sensitive search": "Skille mellom store og små bokstaver",
-        "Clear": "Tøm",
-        "Done": "Ferdig",
-        "Enter the text you want to find": "Skriv inn teksten du ønsker å finne",
-        "Find and Replace": "Søk og erstatt",
-        "Highlight": "Uthev",
-        "Inform a replacement word": "Vennligst skriv inn et erstatningsord / setning",
-        "Next": "Neste",
-        "Options": "Valg",
-        "Replace with:": "Erstatt med:",
-        "Search for:": "Søk etter:",
-        "Substitute all occurrences": "Erstatt alle treff",
-        "Substitute this occurrence?": "Vennligst bekreft at du vil erstatte?",
-        "Undo": "Tilbake",
-        "Whole words only": "Bare hele ord",
-        "found item": "Treff",
-        "found items": "forekomster funnet i søket",
-        "not found": "ikke funnet",
-        "replaced item": "erstattet treff",
-        "replaced items": "forekomster erstattet"
-    },
-    "FormOperations": {
-        "Insert a Form.": "Sett inn skjema",
-        "Insert a check box.": "Hakeboks",
-        "Insert a multi-line text field.": "Sett inn tekstfelt med flere linjer",
-        "Insert a radio button.": "Sett inn en radioknapp",
-        "Insert a select field.": "Sett inn valgboks/ netrekksboks",
-        "Insert a submit/reset button.": "Sett inn send-/nullstill knapp for skjemaet",
-        "Insert a text, password or hidden field.": "Sett inn formfelt"
-    },
-    "Forms": {
-        "Cancel": "Avbryt",
-        "Image URL:": "Bildets URL:",
-        "Name": "Navn",
-        "Name/ID:": "Navn/ID:",
-        "OK": "OK",
-        "Options": "Valg",
-        "Size:": "Størrelse",
-        "Text:": "Tekst:"
-    },
-    "FullPage": {
-        "Alternate style-sheet:": "Alternativt stilsett:",
-        "Background color:": "Bakgrunnsfarge:",
-        "Cancel": "Avbryt",
-        "Character set:": "Tegnsett",
-        "DOCTYPE:": "DOCTYPE:",
-        "Description:": "Beskrivelse",
-        "Document properties": "Egenskaper for dokument",
-        "Document title:": "Tittel på dokument:",
-        "Keywords:": "Nøkkelord",
-        "OK": "OK",
-        "Primary style-sheet:": "Stilsett:",
-        "Text color:": "Tekstfarge:"
-    },
-    "FullScreen": {
-        "Maximize/Minimize Editor": "Maksimer/Minimer WYSIWYG vindu"
-    },
-    "HorizontalRule": {
-        "Alignment:": "Justering:",
-        "Cancel": "Avbryt",
-        "Center": "Sentrert",
-        "Color:": "Farge",
-        "Height:": "Høyde:",
-        "Horizontal Rule": "Horisontal linje",
-        "Insert/edit horizontal rule": "Sett inn/ rediger horisontal linje",
-        "Layout": "Oppsett",
-        "Left": "Venstre",
-        "No shading": "Ingen skygge",
-        "OK": "OK",
-        "Right": "Høyre",
-        "Style": "Stil",
-        "Width:": "Bredde:",
-        "percent": "prosent",
-        "pixels": "Piksel"
-    },
-    "HtmlTidy": {
-        "HTML Tidy": "HTML Tidy",
-        "Tidy failed.  Check your HTML for syntax errors.": "Tidy feilet. Sjekk HTML koden for syntaksfeil."
-    },
-    "ImageManager": {
-        "Angle:": "Vinkel:",
-        "Baseline": "Grunnlinje",
-        "Bottom": "Bunn",
-        "Cancel": "Avbryt",
-        "Clear": "Fjern",
-        "Constrain Proportions": "Behold proposjoner",
-        "Crop": "Beskjær",
-        "Directory": "Mappe",
-        "Directory Up": "Opp en mappe",
-        "Edit": "Rediger",
-        "Filename:": "Filnavn:",
-        "Flip Horizontal": "Vend horisontal",
-        "Flip Image": "Vend bilde",
-        "Flip Vertical": "Vend vertikal",
-        "Folder Name:": "Mappenavn:",
-        "GIF format is not supported, image editing not supported.": "Bildeformatet GIF er ikke støttet.",
-        "Height:": "Høyde:",
-        "Image Format": "Bildeformat:",
-        "Insert Image": "Sett inn bilde",
-        "Invalid base directory:": "Feil rot-mappe:",
-        "JPEG High": "JPEG høy",
-        "JPEG Low": "JPEG lav",
-        "JPEG Medium": "JPEG middelse",
-        "Left": "Venstre",
-        "Lock": "Sperre",
-        "Marker": "Marker",
-        "Measure": "Mål",
-        "Middle": "Midten",
-        "New Folder": "Ny mappe",
-        "No Image Available": "Inget bilde er tilgjengelig",
-        "No Images Found": "Ingen bilder funnet",
-        "OK": "OK",
-        "Positioning of this image": "Bildepossisjon",
-        "Quality:": "Kvalitet",
-        "Refresh": "Oppfrisk",
-        "Resize": "Endre størrelse",
-        "Right": "Høyre",
-        "Rotate": "Roter",
-        "Rotate Image": "Roter bilde",
-        "Save": "Lagre",
-        "Start X:": "Start X",
-        "Start Y:": "Start Y",
-        "Top": "Overkant",
-        "Trash": "Søppelkurv",
-        "W:": "B:",
-        "Width:": "Bredde:"
-    },
-    "InlineStyler": {
-        "Background": "Bakgrund",
-        "Baseline": "Grunnlinje",
-        "Border": "Ramme",
-        "Bottom": "Bunn",
-        "Center": "Sentrert",
-        "Char": "Tegn",
-        "Collapsed borders": "Fjern kantlinjer",
-        "FG Color": "FG farge",
-        "Float": "Flytende",
-        "Height": "Høyde",
-        "Image URL": "Bildets URL",
-        "Justify": "Juster",
-        "Layout": "Oppsett",
-        "Left": "Venstre",
-        "Margin": "Marg",
-        "Middle": "Midten",
-        "None": "Ingen",
-        "Padding": "Luft",
-        "Right": "Høyre",
-        "Text align": "Juster tekst",
-        "Top": "Overkant",
-        "Vertical align": "Vertikal justering",
-        "Width": "Bredde",
-        "percent": "prosent",
-        "pixels": "Piksel"
-    },
-    "InsertAnchor": {
-        "Anchor name": "Ankernavn (ID)",
-        "Cancel": "Avbryt",
-        "Delete": "Fjerne",
-        "Insert Anchor": "Sett inn anker",
-        "OK": "OK"
-    },
-    "InsertImage": {
-        "Alignment:": "Justering:",
-        "Alternate text:": "Alternativ tekst",
-        "Baseline": "Grunnlinje",
-        "Border thickness:": "Rammetykkelse:",
-        "Bottom": "Bunn",
-        "Cancel": "Avbryt",
-        "Horizontal:": "Horisontal:",
-        "Image Preview:": "Forhåndsvisning:",
-        "Image URL:": "Bildets URL:",
-        "Insert Image": "Sett inn bilde",
-        "Layout": "Oppsett",
-        "Left": "Venstre",
-        "Middle": "Midten",
-        "OK": "OK",
-        "Positioning of this image": "Bildepossisjon",
-        "Preview": "Forhåndsvisning",
-        "Right": "Høyre",
-        "Spacing": "Luft",
-        "Top": "Overkant",
-        "Vertical:": "Vertikal:"
-    },
-    "InsertMarquee": {
-        "Background-Color:": "Bakgrunnsfarge:",
-        "Behavior:": "Oppførsel:",
-        "Cancel": "Avbryt",
-        "Direction:": "Rettning:",
-        "Height:": "Høyde:",
-        "Insert scrolling marquee": "Sett inn rulletekst",
-        "Left": "Venstre",
-        "Name": "Navn",
-        "Name/ID:": "Navn/ID:",
-        "OK": "OK",
-        "Right": "Høyre",
-        "Scroll Amount:": "Hastighet:",
-        "Scroll Delay:": "Forsinkelse:",
-        "Speed Control": "Egenskaper for hastigheten til rulleteksten",
-        "Text:": "Tekst:",
-        "Width:": "Bredde:"
-    },
-    "InsertNote": {
-        "Cancel": "Avbryt"
-    },
-    "InsertPagebreak": {
-        "Page break": "Sett inn sideskift"
-    },
-    "InsertPicture": {
-        "Alignment:": "Plassering",
-        "Alternate text:": "Alternativ tekst",
-        "Baseline": "Grunnlinje",
-        "Border thickness:": "Rammetykkelse:",
-        "Bottom": "Bunn",
-        "Cancel": "Avbryt",
-        "Height:": "Høyde:",
-        "Horizontal:": "Horisontal:",
-        "Image Preview:": "Forhåndsvisning:",
-        "Image URL:": "Bildets URL:",
-        "Insert Image": "Sett inn bilde",
-        "Layout": "Oppsett",
-        "Left": "Venstre",
-        "Middle": "Midten",
-        "OK": "OK",
-        "Open file in new window": "Åpne bilde i nytt vindu",
-        "Positioning of this image": "Bildepossisjon",
-        "Preview": "Forhåndsvisning",
-        "Right": "Høyre",
-        "Size": "Størrelse",
-        "Spacing": "Luft rundt bildet",
-        "Top": "Overkant",
-        "Upload file": "Last opp bilde",
-        "Vertical:": "Vertikal:",
-        "Width:": "Bredde:"
-    },
-    "InsertSmiley": {
-        "Insert Smiley": "Sett inn smiley"
-    },
-    "InsertSnippet": {
-        "Cancel": "Avbryt",
-        "Hide preview": "Skjul forhåndsvisning",
-        "Insert Snippet": "Sett inn snutt",
-        "Insert as": "Sett inn som",
-        "Show preview": "Vis forhåndsvisning",
-        "Variable": "Variabel"
-    },
-    "InsertSnippet2": {
-        "Cancel": "Avbryt",
-        "Insert Snippet": "Sett inn snutt",
-        "Variable": "Variabel"
-    },
-    "InsertTable": {
-        "Alignment:": "Justering:",
-        "Baseline": "Grunnlinje",
-        "Border": "Ramme",
-        "Border thickness:": "Rammetykkelse:",
-        "Bottom": "Bunn",
-        "Cancel": "Avbryt",
-        "Caption": "Overskrift",
-        "Insert Table": "Sett inn tabell",
-        "Layout": "Oppsett",
-        "Left": "Venstre",
-        "Middle": "Midten",
-        "OK": "OK",
-        "Percent": "prosent",
-        "Pixels": "Piksel",
-        "Right": "Høyre",
-        "Spacing": "Luft",
-        "Top": "Overkant",
-        "Width:": "Bredde:"
-    },
-    "LangMarks": {
-        "&mdash; language &mdash;": "&mdash; Språk &mdash;",
-        "English": "engelsk",
-        "French": "fransk",
-        "Greek": "grekisk",
-        "Latin": "latin",
-        "language select": "Språkvalg"
-    },
-    "Linker": {
-        "Are you sure you wish to remove this link?": "Er du sikker på at du vil fjerne lenken?",
-        "Cancel": "Avbryt",
-        "Insert/Modify Link": "Rediger lenke",
-        "Name:": "Navn",
-        "OK": "OK",
-        "Size:": "Størrelse",
-        "Target:": "Mål:",
-        "URL:": "Adresse:",
-        "You must select some text before making a new link.": "Du må markere tekst eller et bilde før du kan lage en lenke."
-    },
-    "ListType": {
-        "Choose list style type (for ordered lists)": "Velg listetype (for nummererte lister)",
-        "Decimal numbers": "Desimaltall",
-        "Lower greek letters": "Lower greek letters",
-        "Lower latin letters": "Lower latin letters",
-        "Lower roman numbers": "Lower roman numbers",
-        "Upper latin letters": "Upper latin letters",
-        "Upper roman numbers": "Upper roman numbers"
-    },
-    "MootoolsFileManager": {
-        "Insert File Link": "Sett inn lenke til fil",
-        "You must select some text before making a new link.": "Du må markere tekst eller et bilde før du kan lage en lenke."
-    },
-    "NoteServer": {
-        "Add GUIDO Code in a textbox on the page": "Sett inn GUIDO-kode i et tekstfelt på siden",
-        "Add MIDI link to allow students to hear the music": "Legg til MIDI-link for at studenter kan høre musikken",
-        "Cancel": "Avbryt",
-        "Format": "Format",
-        "Guido code": "GUIDO-kode",
-        "Image Preview": "Bilde forhåndsvisning",
-        "Image in applet": "Bilde i applet",
-        "Insert GUIDO Music Notation": "Sett inn GUIDO-noter",
-        "MIDI File": "MIDIfil",
-        "OK": "OK",
-        "Options": "Muligheter",
-        "Preview": "Preview",
-        "Source Code": "Kildekode",
-        "Zoom": "Forstørr"
-    },
-    "PSLocal": {
-        "Cancel": "Avbryt"
-    },
-    "PasteText": {
-        "Cancel": "Avbryt",
-        "OK": "OK",
-        "Paste as Plain Text": "Lim inn som ren tekst"
-    },
-    "PersistentStorage": {
-        "Cancel": "Avbryt",
-        "Copy": "Kopier",
-        "Delete": "Fjerne",
-        "Directory Up": "Opp et nivå",
-        "File Manager": "Filbehandler",
-        "Filename": "Filnavn:",
-        "Insert Image": "Sett inn bilde",
-        "New Folder": "Ny mappe",
-        "Save": "Lagre",
-        "You must select some text before making a new link.": "Du må markere tekst eller et bilde før du kan lage en lenke."
-    },
-    "QuickTag": {
-        "ATTRIBUTES": "ATTRIBUTTER",
-        "Cancel": "Avbryt",
-        "Colors": "Farger",
-        "Enter the TAG you want to insert": "Skriv inn taggen du vil ønsker å sette inn",
-        "No CSS class avaiable": "Ingen CSS klasse tilgjengelig",
-        "OPTIONS": "EGENSKAPER",
-        "Ok": "OK",
-        "Quick Tag Editor": "Kjapp TAGG-Editor",
-        "TAGs": "TAGGer",
-        "There are some unclosed quote": "Det mangler et hermetegn",
-        "This attribute already exists in the TAG": "Denne attributten eksisterer allerede i taggen",
-        "You have to select some text": "Du må velge noe tekst"
-    },
-    "SaveSubmit": {
-        "Save": "Lagre"
-    },
-    "SetId": {
-        "Cancel": "Avbryt",
-        "Delete": "Slett",
-        "OK": "OK",
-        "Set Id and Name": "Sett ID og navn"
-    },
-    "SmartReplace": {
-        "OK": "OK"
-    },
-    "SpellChecker": {
-        "Cancel": "Avbryt",
-        "Dictionary": "Ordliste",
-        "Finished list of mispelled words": "Ferdig med liste over feilstavede ord",
-        "I will open it in a new page.": "Åpnes i ny side",
-        "Ignore": "Ignorer",
-        "Ignore all": "Ignorer alle",
-        "No mispelled words found with the selected dictionary.": "Ingen feilstavede ord funnet med den valgte ordlisten",
-        "OK": "OK",
-        "Original word": "Opprinnelig ord",
-        "Please confirm that you want to open this link": "Ønsker du å åpne denne lenken",
-        "Please wait.  Calling spell checker.": "Vennligst vent, kaller opp stavekontrollprogrammet",
-        "Please wait: changing dictionary to": "Vennligst vent, endrer ordliste til",
-        "Re-check": "Kjør stavekontroll på nytt",
-        "Replace": "Erstatt",
-        "Replace all": "Erstatt alle",
-        "Replace with": "Erstatt med",
-        "Spell-check": "Stavekontroll",
-        "Suggestions": "Forslag",
-        "This will drop changes and quit spell checker.  Please confirm.": "Dette vil droppe endringene og avbryte stavekontrollen, vennligst bekreft."
-    },
-    "Stylist": {
-        "Styles": "Stiler"
-    },
-    "SuperClean": {
-        "Cancel": "Avbryt",
-        "Clean up HTML": "Vask HTML kode",
-        "General tidy up and correction of some problems.": "Generell opprydding i HTML koden samt korrigering av typiske feil",
-        "OK": "OK",
-        "Please select from the following cleaning options...": "Vennligst velg blandt de forskjellige mulighetene å vaske/ rydde i HTML koden",
-        "Remove custom font sizes.": "Fjerne egendefinerte skriftstørrelser (font size)",
-        "Remove custom text colors.": "Fjerne egendefinerte skriftfarger (font color)",
-        "Remove custom typefaces (font \"styles\").": "Fjerne egendefinerte skrifttyper (font face)",
-        "Remove lang attributes.": "Fjerne lang-attributter."
-    },
-    "TableOperations": {
-        "All four sides": "Alle fire sider",
-        "Borders": "Kantlinjer",
-        "Cancel": "Avbryt",
-        "Caption": "Overskrift",
-        "Cell Properties": "Celleegenskaper",
-        "Cell properties": "Egenskaper for celle",
-        "Delete cell": "Slett celle",
-        "Delete column": "Slett kolonne",
-        "Delete row": "Slett rad",
-        "Description": "Beskrivelse",
-        "Frames": "rammer",
-        "Insert cell after": "Sett inn celle etter",
-        "Insert cell before": "Sett inn celle foran",
-        "Insert column after": "Skyt inn kolonne etter",
-        "Insert column before": "Skyt inn kolonne før",
-        "Insert row after": "Skyt inn rad etter",
-        "Insert row before": "Skyt inn rad foran",
-        "Merge cells": "Slå sammen celler",
-        "No rules": "Ingen linjal",
-        "No sides": "Ingen sider",
-        "OK": "OK",
-        "Padding": "Luft",
-        "Please click into some cell": "Klikk i en eller annen celle",
-        "Row Properties": "Egenskaper for rad",
-        "Row properties": "Egenskaper for rad",
-        "Rules will appear between all rows and columns": "Linjer vil synes mellom alle rader og kolonner",
-        "Rules will appear between columns only": "Linjer vil synes kun mellom kolonner",
-        "Rules will appear between rows only": "Linjer vil synes kun mellom rader",
-        "Spacing": "Luft",
-        "Spacing and padding": "Luft",
-        "Split column": "Del kolonne",
-        "Split row": "Del rad",
-        "Summary": "Sammendrag",
-        "Table Properties": "Tabellegenskaper",
-        "Table properties": "Tabellegenskaper",
-        "The bottom side only": "Bunnen kun",
-        "The left-hand side only": "Venstresiden kun",
-        "The right and left sides only": "Høyre- og venstresiden kun",
-        "The right-hand side only": "Høyresiden kun",
-        "The top and bottom sides only": "The top and bottom sides only",
-        "The top side only": "Overkanten kun",
-        "Xinha cowardly refuses to delete the last cell in row.": "Xinha nekter å slette siste cellen i tabellen.",
-        "Xinha cowardly refuses to delete the last column in table.": "Xinha nekter å slette siste kolonnen i tabellen.",
-        "Xinha cowardly refuses to delete the last row in table.": "Xinha nekter å slette siste raden i tabellen.",
-        "pixels": "billedpunkter"
-    },
-    "Template": {
-        "Cancel": "Avbryt",
-        "Insert template": "Sett inn template"
-    },
-    "UnFormat": {
-        "All": "Hele dokumentet",
-        "All HTML:": "All HTML-kode:",
-        "Cancel": "Avbryt",
-        "Cleaning Area": "Vaskeområde",
-        "Cleaning options": "Vaskemetoder",
-        "Formatting:": "Formattering:",
-        "OK": "OK",
-        "Page Cleaner": "Dokumentvasker",
-        "Select which types of formatting you would like to remove.": "Velg hva slags formattering du ønsker å fjerne.",
-        "Selection": "Markert område"
-    },
-    "Xinha": {
-        "About this editor": "Om denne editor",
-        "Background Color": "Bakgrundsfarge",
-        "Bold": "Fet",
-        "Bulleted List": "Punktliste",
-        "Clear Inline Font Specifications": "Fjerne inline font spesifikasjoner",
-        "Copy selection": "Kopier område",
-        "Create Toolbar": "Lag verktøylinje",
-        "Current style": "Nåværende stil",
-        "Cut selection": "Klipp ut område",
-        "Decrease Indent": "Reduser innrykk",
-        "Direction left to right": "Fra venstre mot høyre",
-        "Direction right to left": "Fra høyre mot venstre",
-        "Font Color": "Tekstfarge",
-        "Help using editor": "Hjelp",
-        "Horizontal Rule": "Vannrett linje",
-        "Increase Indent": "Øke innrykk",
-        "Insert Table": "Sett inn tabell",
-        "Insert Web Link": "Lag lenke",
-        "Insert/Modify Image": "Sett inn bilde",
-        "Insert/Overwrite": "Sett inn/Overskriv",
-        "Italic": "Kursiv",
-        "Justify Center": "Midtjuster",
-        "Justify Full": "Blokkjuster",
-        "Justify Left": "Venstrejuster",
-        "Justify Right": "Høyrejuster",
-        "Ordered List": "Nummerert liste",
-        "Paste from clipboard": "Lim inn",
-        "Path": "Tekstvelger",
-        "Print document": "Skriv ut dokumentet",
-        "Redoes your last action": "Gjør om siste angring",
-        "Remove formatting": "Fjern formattering",
-        "Save as": "Lagre som",
-        "Select all": "Merk alt",
-        "Split Block": "Seperasjonsblokk",
-        "Strikethrough": "Gjennomstreket",
-        "Subscript": "Nedsenket",
-        "Superscript": "Opphøyet",
-        "Toggle Borders": "Skru av/på hjelpelinjer på tabeller",
-        "Toggle HTML Source": "Vis kildekode",
-        "Underline": "Understreket",
-        "Undoes your last action": "Angrer siste redigering",
-        "Would you like to clear font colours?": "Ønsker du å fjerne farger på skriften",
-        "Would you like to clear font sizes?": "Ønsker du å fjerne skrift størrelser",
-        "Would you like to clear font typefaces?": "Ønsker du å fjerne skrifttyper",
-        "You are in TEXT MODE.  Use the [<>] button to switch back to WYSIWYG.": "Du er i tekstmodus  Klikk på [<>] for å gå tilbake til WYSIWIG."
-    },
-    "__NEW_TRANSLATIONS__": {
-        "AboutBox": {
-            "Close": "<<Xinha>>"
-        },
-        "CharCounter": {
-            "... in progress": "",
-            "HTML": "",
-            "Words": ""
-        },
-        "ColorPicker": {
-            "Click a color...": "",
-            "Sample": "",
-            "Web Safe: ": "",
-            "Close": "<<Xinha>>"
-        },
-        "ContextMenu": {
-            "Delete Cell": "",
-            "Insert Cell After": "",
-            "Insert Cell Before": "",
-            "Merge Cells": ""
-        },
-        "CreateLink": {
-            "You need to select some text before creating a link": ""
-        },
-        "DefinitionList": {
-            "definition description": "",
-            "definition list": "",
-            "definition term": ""
-        },
-        "Dialogs": {
-            "Some Text Here": ""
-        },
-        "EditTag": {
-            "Edit Tag By Peg": "",
-            "Tag Editor": ""
-        },
-        "Equation": {
-            "!=": "",
-            "!in": "",
-            "&gt;-": "",
-            "&gt;=": "",
-            "&lt;=": "",
-            "&lt;=&gt;": "",
-            "&lt;x&gt;": "",
-            "&nbsp; `!` &nbsp;": "",
-            "&nbsp; `.` &nbsp;": "",
-            "&nbsp; `0` &nbsp;": "",
-            "&nbsp; `2` &nbsp;": "",
-            "&nbsp; `3` &nbsp;": "",
-            "&nbsp; `4` &nbsp;": "",
-            "&nbsp; `5` &nbsp;": "",
-            "&nbsp; `6` &nbsp;": "",
-            "&nbsp; `7` &nbsp;": "",
-            "&nbsp; `8` &nbsp;": "",
-            "&nbsp; `9` &nbsp;": "",
-            "&nbsp; `e` &nbsp;": "",
-            "&nbsp;&nbsp;`1` &nbsp;": "",
-            "&nbsp;`+{::}`&nbsp;": "",
-            "&nbsp;`-:\\ `": "",
-            "&nbsp;`-{::}`&nbsp;": "",
-            "&nbsp;`C`&nbsp;": "",
-            "&nbsp;`cos`": "",
-            "&nbsp;`ln`&nbsp;": "",
-            "&nbsp;`pi` &nbsp;": "",
-            "&nbsp;`sin`": "",
-            "&nbsp;`tan`": "",
-            "&nbsp;`times`&nbsp;": "",
-            "&quot;text&quot;": "",
-            "'+formula+'": "",
-            "((n),(k))": "",
-            "(x+1)/(x-1)": "",
-            "*": "",
-            "**": "",
-            "+-": "",
-            "-&gt;": "",
-            "-&lt;": "",
-            "-:": "",
-            "-=": "",
-            "//": "",
-            "/_": "",
-            ":.": "",
-            "=&gt;": "",
-            "@": "",
-            "[[a,b],[c,d]]": "",
-            "\\\\": "",
-            "\\nClick in the box to use your keyboard or use the buttons\\n": "",
-            "^^": "",
-            "^^^": "",
-            "__|": "",
-            "_|_": "",
-            "`!=`": "",
-            "`!in`": "",
-            "`&and;`": "",
-            "`&cap;`": "",
-            "`&cup;`": "",
-            "`&gt;-`": "",
-            "`&gt;=`": "",
-            "`&lt;=&gt;`": "",
-            "`&lt;=`": "",
-            "`&lt;x&gt;`": "",
-            "`&or;`": "",
-            "`&quot;text&quot;`": "",
-            "`((n),(k))`": "",
-            "`(x+1)/(x-1)`": "",
-            "`**`": "",
-            "`*`": "",
-            "`+-`": "",
-            "`-&gt;`": "",
-            "`-&lt;`": "",
-            "`-:`": "",
-            "`-=`": "",
-            "`//`": "",
-            "`/_`": "",
-            "`:.`": "",
-            "`=&gt;`": "",
-            "`@`": "",
-            "`[[a,b],[c,d]]`": "",
-            "`\\\\`": "",
-            "`__|`": "",
-            "`_|_`": "",
-            "`AA`": "",
-            "`aleph`": "",
-            "`alpha`": "",
-            "`and`": "",
-            "`bara`": "",
-            "`bba`": "",
-            "`bbba`": "",
-            "`beta`": "",
-            "`CC`": "",
-            "`cca`": "",
-            "`chi`": "",
-            "`darr`": "",
-            "`ddota`": "",
-            "`del`": "",
-            "`Delta`": "",
-            "`delta`": "",
-            "`diamond`": "",
-            "`dota`": "",
-            "`dy/dx`": "",
-            "`EE`": "",
-            "`epsi`": "",
-            "`eta`": "",
-            "`fra`": "",
-            "`Gamma`": "",
-            "`gamma`": "",
-            "`grad`": "",
-            "`harr`": "",
-            "`hArr`": "",
-            "`hata`": "",
-            "`if`": "",
-            "`in`": "",
-            "`int`": "",
-            "`iota`": "",
-            "`kappa`": "",
-            "`lambda`": "",
-            "`Lambda`": "",
-            "`lArr`": "",
-            "`larr`": "",
-            "`lim_(x-&gt;oo)`": "",
-            "`log`": "",
-            "`mu`": "",
-            "`NN`": "",
-            "`nn`": "",
-            "`not`": "",
-            "`nu`": "",
-            "`o+`": "",
-            "`o.`": "",
-            "`O/`": "",
-            "`oint`": "",
-            "`omega`": "",
-            "`Omega`": "",
-            "`oo`": "",
-            "`or`": "",
-            "`ox`": "",
-            "`Phi`": "",
-            "`phi`": "",
-            "`Pi`": "",
-            "`pi`": "",
-            "`prod`": "",
-            "`prop`": "",
-            "`Psi`": "",
-            "`psi`": "",
-            "`QQ`": "",
-            "`quad`": "",
-            "`rArr`": "",
-            "`rho`": "",
-            "`root(n)(x)`": "",
-            "`RR`": "",
-            "`sfa`": "",
-            "`sigma`": "",
-            "`Sigma`": "",
-            "`sqrt(x)`": "",
-            "`square`": "",
-            "`stackrel(-&gt;)(+)`": "",
-            "`sub`": "",
-            "`sube`": "",
-            "`sum`": "",
-            "`sup`": "",
-            "`supe`": "",
-            "`tau`": "",
-            "`Theta`": "",
-            "`theta`": "",
-            "`TT`": "",
-            "`tta`": "",
-            "`uarr`": "",
-            "`ula`": "",
-            "`upsilon`": "",
-            "`uu`": "",
-            "`veca`": "",
-            "`vv`": "",
-            "`x_(mn)`": "",
-            "`Xi`": "",
-            "`xi`": "",
-            "`xx`": "",
-            "`zeta`": "",
-            "`ZZ`": "",
-            "`|-&gt;`": "",
-            "`|--`": "",
-            "`|==`": "",
-            "`|__`": "",
-            "`|~`": "",
-            "`~=`": "",
-            "`~|`": "",
-            "`~~`": "",
-            "AA": "",
-            "aleph": "",
-            "alpha": "",
-            "and": "",
-            "AsciiMath Formula Input": "",
-            "AsciiMathML Example": "",
-            "bara": "",
-            "Based on ASCIIMathML by": "",
-            "bba": "",
-            "bbba": "",
-            "beta": "",
-            "CC": "",
-            "cca": "",
-            "chi": "",
-            "darr": "",
-            "ddota": "",
-            "del": "",
-            "Delta": "",
-            "delta": "",
-            "diamond": "",
-            "dota": "",
-            "dy/dx": "",
-            "EE": "",
-            "epsi": "",
-            "eta": "",
-            "For more information on AsciiMathML visit this page:": "",
-            "Formula Editor": "",
-            "fra": "",
-            "gamma": "",
-            "Gamma": "",
-            "grad": "",
-            "hArr": "",
-            "harr": "",
-            "hata": "",
-            "if": "",
-            "in": "",
-            "Input": "",
-            "int": "",
-            "int_a^bf(x)dx": "",
-            "iota": "",
-            "kappa": "",
-            "Lambda": "",
-            "lambda": "",
-            "larr": "",
-            "lArr": "",
-            "lim_(x-&gt;oo)": "",
-            "mu": "",
-            "NN": "",
-            "nn": "",
-            "nnn": "",
-            "not": "",
-            "nu": "",
-            "o+": "",
-            "o.": "",
-            "O/": "",
-            "oint": "",
-            "omega": "",
-            "Omega": "",
-            "oo": "",
-            "or": "",
-            "ox": "",
-            "Phi": "",
-            "phi": "",
-            "pi": "",
-            "Pi": "",
-            "prod": "",
-            "prop": "",
-            "psi": "",
-            "Psi": "",
-            "QQ": "",
-            "quad": "",
-            "rArr": "",
-            "rho": "",
-            "root(n)(x)": "",
-            "RR": "",
-            "sfa": "",
-            "sigma": "",
-            "Sigma": "",
-            "sqrt(x)": "",
-            "square": "",
-            "stackrel(-&gt;)(+)": "",
-            "sub": "",
-            "sube": "",
-            "sum": "",
-            "sum_(n=1)^oo": "",
-            "sup": "",
-            "supe": "",
-            "tau": "",
-            "Theta": "",
-            "theta": "",
-            "TT": "",
-            "tta": "",
-            "uarr": "",
-            "ula": "",
-            "upsilon": "",
-            "uu": "",
-            "uuu": "",
-            "veca": "",
-            "vv": "",
-            "vvv": "",
-            "x^(m+n)": "",
-            "x_(mn)": "",
-            "Xi": "",
-            "xi": "",
-            "xx": "",
-            "zeta": "",
-            "ZZ": "",
-            "|-&gt;": "",
-            "|--": "",
-            "|==": "",
-            "|__": "",
-            "|~": "",
-            "~=": "",
-            "~|": "",
-            "~~": ""
-        },
-        "FancySelects": {
-            "'+opt.text+'": ""
-        },
-        "FindReplace": {
-            "';\r\n  var tagc = '": ""
-        },
-        "FormOperations": {
-            "Enter the name for new option.": "",
-            "Form Editor": "",
-            "Message Sent": "",
-            "Please Select...": ""
-        },
-        "Forms": {
-            "'onClick'=": "",
-            "Access Key:": "",
-            "Action URL:": "",
-            "Button Script": "",
-            "Checked": "",
-            "Columns:": "",
-            "Default text (optional)": "",
-            "Dimensions": "",
-            "Disabled": "",
-            "Encoding:": "",
-            "For Control:": "",
-            "Form": "",
-            "Form Element: FIELDSET": "",
-            "Form Element: INPUT": "",
-            "Form Element: LABEL": "",
-            "Form Element: SELECT": "",
-            "Form Element: TEXTAREA": "",
-            "Form handler script": "",
-            "Form Name:": "",
-            "Get": "",
-            "Hard": "",
-            "Height in number of rows": "",
-            "HTML-Form to CGI (default)": "",
-            "Image source": "",
-            "Initial Text:": "",
-            "Insert/Edit Form": "",
-            "Insert/Edit Form Element FIELDSET": "",
-            "Insert/Edit Form Element INPUT": "",
-            "Insert/Edit Form Element LABEL": "",
-            "Insert/Edit Form Element SELECT": "",
-            "Insert/Edit Form Element TEXTAREA": "",
-            "Javascript for button click": "",
-            "Label:": "",
-            "Legend:": "",
-            "Max length:": "",
-            "Maximum number of characters accepted": "",
-            "Method:": "",
-            "multipart Form Data (File-Upload)": "",
-            "Name of the form input": "",
-            "Name of the form select": "",
-            "name of the textarea": "",
-            "normal": "",
-            "nowrap": "",
-            "Off": "",
-            "Physical": "",
-            "Please enter a Label": "",
-            "Post": "",
-            "pre": "",
-            "Read Only": "",
-            "Rows:": "",
-            "Size of text box in characters": "",
-            "Soft": "",
-            "Tab Index:": "",
-            "Target Frame:": "",
-            "URL of image": "",
-            "Value of the form input": "",
-            "Value:": "",
-            "Virtual": "",
-            "Width in number of characters": "",
-            "Wrap Mode:": "",
-            "You must enter a Name": ""
-        },
-        "FullPage": {
-            "...": "",
-            "cyrillic (ISO-8859-5)": "",
-            "cyrillic (KOI8-R)": "",
-            "cyrillic (WINDOWS-1251)": "",
-            "UTF-8 (recommended)": "",
-            "western (ISO-8859-1)": ""
-        },
-        "Gecko": {
-            "The Paste button does not work in this browser for security reasons. Press CTRL-V on your keyboard to paste directly.": ""
-        },
-        "HorizontalRule": {
-            "&#x00d7;": "",
-            "&nbsp;": "",
-            "Insert/Edit Horizontal Rule": ""
-        },
-        "InlineStyler": {
-            "CSS Style": "",
-            "-": "<<Equation>>"
-        },
-        "InsertImage": {
-            "Absbottom": "",
-            "Absmiddle": "",
-            "Enter the image URL here": "",
-            "For browsers that don't support images": "",
-            "Horizontal padding": "",
-            "Leave empty for no border": "",
-            "Not set": "",
-            "Preview the image in a new window": "",
-            "Texttop": "",
-            "Vertical padding": "",
-            "You must enter the URL": ""
-        },
-        "InsertNote": {
-            "Insert": "",
-            "Insert footnote": "",
-            "Insert Note": ""
-        },
-        "InsertPagebreak": {
-            "Page Break": ""
-        },
-        "InsertSnippet": {
-            "\\n  This is an information about something\\n": "",
-            "InsertSnippet for Xinha": "",
-            "Link1": "",
-            "Link2": "",
-            "Link3": "",
-            "Link4": "",
-            "Link5": "",
-            "This is an information about something": ""
-        },
-        "InsertSnippet2": {
-            "All Categories": "",
-            "Filter": "",
-            "Insert as HTML": "",
-            "Insert as template variable": "",
-            "Only search word beginning": "",
-            "HTML": "<<CharCounter>>",
-            "InsertSnippet for Xinha": "<<InsertSnippet>>"
-        },
-        "InsertTable": {
-            "Caption for the table": "",
-            "Cell padding:": "",
-            "Cell spacing:": "",
-            "Collapse borders:": "",
-            "Cols:": "",
-            "Em": "",
-            "Fixed width columns": "",
-            "Layou": "",
-            "Number of columns": "",
-            "Number of rows": "",
-            "Positioning of this table": "",
-            "Space between adjacent cells": "",
-            "Space between content and border in cell": "",
-            "Style of the border": "",
-            "Width of the table": "",
-            "Width unit": "",
-            "You must enter a number of columns": "",
-            "You must enter a number of rows": "",
-            "Absbottom": "<<InsertImage>>",
-            "Absmiddle": "<<InsertImage>>",
-            "Leave empty for no border": "<<InsertImage>>",
-            "Not set": "<<InsertImage>>",
-            "Rows:": "<<Forms>>",
-            "Texttop": "<<InsertImage>>"
-        },
-        "LangMarks": {
-            "', '": ""
-        },
-        "Linker": {
-            "(px)": "",
-            "Anchor-Link": "",
-            "Anchor:": "",
-            "Email Address:": "",
-            "Email Link": "",
-            "Location Bar:": "",
-            "Menu Bar:": "",
-            "Message Template:": "",
-            "New Window": "",
-            "Ordinary Link": "",
-            "Popup Window": "",
-            "PopupWindow": "",
-            "Remove Link": "",
-            "Resizeable:": "",
-            "Same Window (jump out of frames)": "",
-            "Scrollbars:": "",
-            "Shows On Hover": "",
-            "Status Bar:": "",
-            "Subject:": "",
-            "Title:": "",
-            "Toolbar:": "",
-            "URL Link": ""
-        },
-        "Opera": {
-            "MARK": "",
-            "The Paste button does not work in Mozilla based web browsers (technical security reasons). Press CTRL-V on your keyboard to paste directly.": ""
-        },
-        "PasteText": {
-            "Insert text in new paragraph": ""
-        },
-        "PreserveScripts": {
-            "JavaScript": "",
-            "PHP": ""
-        },
-        "QuickTag": {
-            "',\r\n                           'cl': '": ""
-        },
-        "SaveSubmit": {
-            "in progress": "",
-            "Ready": "",
-            "Saving...": ""
-        },
-        "SetId": {
-            "ID/Name:": "",
-            "Set Id/Name": "",
-            "Set ID/Name": ""
-        },
-        "SmartReplace": {
-            "ClosingDoubleQuotes": "",
-            "ClosingSingleQuote": "",
-            "Convert all quotes and dashes in the current document": "",
-            "Enable automatic replacements": "",
-            "OpeningDoubleQuotes": "",
-            "OpeningSingleQuote": "",
-            "SmartReplace": "",
-            "SmartReplace Settings": ""
-        },
-        "SuperClean": {
-            "Clean bad HTML from Microsoft Word.": "",
-            "Clean Selection Only": "",
-            "Cleaning Scope": "",
-            "Please stand by while cleaning in process...": "",
-            "Remove alignment (left/right/justify).": "",
-            "Remove all classes (CSS).": "",
-            "Remove All HTML Tags": "",
-            "Remove all styles (CSS).": "",
-            "Remove emphasis and annotations.": "",
-            "Remove Paragraphs": "",
-            "Remove superscripts and subscripts.": "",
-            "Replace directional quote marks with non-directional quote marks.": "",
-            "Vigorously purge HTML from Microsoft Word.": ""
-        },
-        "TableOperations": {
-            "Cell Type:": "",
-            "Cells down": "",
-            "Cells to the right, and": "",
-            "Do Not Change": "",
-            "Frame and borders": "",
-            "Header (th)": "",
-            "Merge current cell with:": "",
-            "Normal (td)": "",
-            "Columns": "<<Forms>>",
-            "Merge Cells": "<<ContextMenu>>",
-            "Rows": "<<Forms>>"
-        },
-        "UnsavedChanges": {
-            "You have unsaved changes in the editor": ""
-        },
-        "WebKit": {
-            "The Paste button does not work in this browser for security reasons. Press CTRL-V on your keyboard to paste directly.": "<<Gecko>>"
-        },
-        "Xinha": {
-            "&#8212; font &#8212;": "",
-            "&#8212; format &#8212;": "",
-            "&#8212; size &#8212;": "",
-            "1 (8 pt)": "",
-            "2 (10 pt)": "",
-            "3 (12 pt)": "",
-            "4 (14 pt)": "",
-            "5 (18 pt)": "",
-            "6 (24 pt)": "",
-            "7 (36 pt)": "",
-            "Address": "",
-            "Arial": "",
-            "Clean content pasted from Word": "",
-            "Clear MSOffice tags": "",
-            "Close": "",
-            "Constructing object": "",
-            "Courier New": "",
-            "Create Statusbar": "",
-            "CTRL-0 (zero)": "",
-            "CTRL-1 .. CTRL-6": "",
-            "CTRL-A": "",
-            "CTRL-B": "",
-            "CTRL-C": "",
-            "CTRL-E": "",
-            "CTRL-I": "",
-            "CTRL-J": "",
-            "CTRL-L": "",
-            "CTRL-N": "",
-            "CTRL-R": "",
-            "CTRL-S": "",
-            "CTRL-U": "",
-            "CTRL-V": "",
-            "CTRL-X": "",
-            "CTRL-Y": "",
-            "CTRL-Z": "",
-            "Editor Help": "",
-            "ENTER": "",
-            "Error Loading Xinha.  Developers, check the Error Console for information.": "",
-            "Finishing": "",
-            "Formatted": "",
-            "Generate Xinha framework": "",
-            "Georgia": "",
-            "Heading 1": "",
-            "Heading 2": "",
-            "Heading 3": "",
-            "Heading 4": "",
-            "Heading 5": "",
-            "Heading 6": "",
-            "Headings": "",
-            "Impact": "",
-            "Init editor size": "",
-            "insert linebreak": "",
-            "Keyboard shortcuts": "",
-            "Loading Core": "",
-            "Loading in progress. Please wait!": "",
-            "Loading plugin $plugin": "",
-            "Loading plugins": "",
-            "MS Word Cleaner": "",
-            "new paragraph": "",
-            "Normal": "",
-            "Register plugin $plugin": "",
-            "Select Color": "",
-            "Set format to paragraph": "",
-            "SHIFT-ENTER": "",
-            "Tahoma": "",
-            "The editor provides the following key combinations:": "",
-            "Times New Roman": "",
-            "Touch here first to activate editor.": "",
-            "Verdana": "",
-            "Waiting for Iframe to load...": "",
-            "WingDings": "",
-            "Xinha": ""
-        },
-        "BackgroundImage": {
-            "__ TRANSLATOR NOTE __": "*** BACKGROUNDIMAGE IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***",
-            "Set Background": ""
-        },
-        "ClientsideSpellcheck": {
-            "__ TRANSLATOR NOTE __": "*** CLIENTSIDESPELLCHECK IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***",
-            "Spell Check using ieSpell": ""
-        },
-        "ExtendedFileManager": {
-            "__ TRANSLATOR NOTE __": "*** EXTENDEDFILEMANAGER IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***",
-            "10%": "",
-            "100%": "",
-            "200%": "",
-            "25%": "",
-            "50%": "",
-            "75%": "",
-            ">List View": "",
-            ">Thumbnail View": "",
-            "A:": "",
-            "D:": "",
-            "File List": "",
-            "Filesize:": "",
-            "Folder": "",
-            "GIF": "",
-            "H:": "",
-            "Image Editor": "",
-            "Image Selection": "",
-            "Maximum folder size limit reached. Upload disabled.": "",
-            "Please enter value": "",
-            "PNG": "",
-            "Preset": "",
-            "Rotate 180 &deg;": "",
-            "Rotate 90 &deg; CCW": "",
-            "Rotate 90 &deg; CW": "",
-            "Toggle marker color": "",
-            "X:": "",
-            "Xinha Image Editor": "",
-            "Y:": "",
-            "Absbottom": "<<InsertImage>>",
-            "Absmiddle": "<<InsertImage>>",
-            "Not set": "<<InsertImage>>",
-            "Texttop": "<<InsertImage>>"
-        },
-        "Filter": {
-            "__ TRANSLATOR NOTE __": "*** FILTER IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***",
-            "Filter": "<<InsertSnippet2>>"
-        },
-        "HtmlTidy": {
-            "__ TRANSLATOR NOTE __": "*** HTMLTIDY IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***",
-            "Auto-Tidy": "",
-            "Don't Tidy": ""
-        },
-        "ImageManager": {
-            "__ TRANSLATOR NOTE __": "*** IMAGEMANAGER IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***",
-            "Flickr Picture List": "",
-            "Flickr Pictures": "",
-            "Flickr Selection": "",
-            "Flickr Username/Email": "",
-            "Image List": "",
-            "Keyword": "",
-            "No Photos Found": "",
-            "No Videos Found": "",
-            "This Server": "",
-            "YouTube Selection": "",
-            "YouTube Username": "",
-            "YouTube Video List": "",
-            "YouTube Videos": "",
-            "A:": "<<ExtendedFileManager>>",
-            "Absbottom": "<<InsertImage>>",
-            "Absmiddle": "<<InsertImage>>",
-            "D:": "<<ExtendedFileManager>>",
-            "GIF": "<<ExtendedFileManager>>",
-            "H:": "<<ExtendedFileManager>>",
-            "Image Editor": "<<ExtendedFileManager>>",
-            "Image Selection": "<<ExtendedFileManager>>",
-            "Not set": "<<InsertImage>>",
-            "PNG": "<<ExtendedFileManager>>",
-            "Rotate 180 &deg;": "<<ExtendedFileManager>>",
-            "Rotate 90 &deg; CCW": "<<ExtendedFileManager>>",
-            "Rotate 90 &deg; CW": "<<ExtendedFileManager>>",
-            "Texttop": "<<InsertImage>>",
-            "X:": "<<ExtendedFileManager>>",
-            "Y:": "<<ExtendedFileManager>>"
-        },
-        "InsertMarquee": {
-            "__ TRANSLATOR NOTE __": "*** INSERTMARQUEE IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***",
-            "Alternate": "",
-            "Continuous": "",
-            "Marquee Editor": "",
-            "Slide": ""
-        },
-        "InsertPicture": {
-            "__ TRANSLATOR NOTE __": "*** INSERTPICTURE IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***",
-            "Leave empty for not defined": "",
-            " Open file in new window": "",
-            "Absbottom": "<<InsertImage>>",
-            "Absmiddle": "<<InsertImage>>",
-            "Enter the image URL here": "<<InsertImage>>",
-            "For browsers that don't support images": "<<InsertImage>>",
-            "Horizontal padding": "<<InsertImage>>",
-            "Leave empty for no border": "<<InsertImage>>",
-            "Not set": "<<InsertImage>>",
-            "Preview the image in a new window": "<<InsertImage>>",
-            "Texttop": "<<InsertImage>>",
-            "Vertical padding": "<<InsertImage>>"
-        },
-        "NoteServer": {
-            "__ TRANSLATOR NOTE __": "*** NOTESERVER IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***",
-            "120%": "",
-            "150%": "",
-            "80%": "",
-            "GUIDO Code": "",
-            "With Mozilla, the applet will not be visible in editor, but only in Web page after submitting.": "",
-            "Zoom :": "",
-            "100%": "<<ExtendedFileManager>>",
-            "Preview the image in a new window": "<<InsertImage>>"
-        },
-        "PSLocal": {
-            "__ TRANSLATOR NOTE __": "*** PSLOCAL IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***",
-            "Confirm": "",
-            "Enable": "",
-            "Enable Gears in order to use local document storage and configuration.": "",
-            "Enabling Local Storage": "",
-            "Install": "",
-            "Learn About Local Storage": "",
-            "This will reload the page, causing you to lose any unsaved work.  Press \"OK\" to reload.": "",
-            "Xinha uses Google Gears to enable local document storage.  With Gears installed, you can save drafts of your documents on your hard drive, configure Xinha to look the way you want, and carry this information wherever you use Xinha on the web.": ""
-        },
-        "PSServer": {
-            "__ TRANSLATOR NOTE __": "*** PSSERVER IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***",
-            "File: ": "",
-            "Import": ""
-        },
-        "PersistentStorage": {
-            "__ TRANSLATOR NOTE __": "*** PERSISTENTSTORAGE IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***",
-            "Details": "",
-            "File Browser": "",
-            "Hello    There C ": "",
-            "Hello  There A ": "",
-            "Hello \" There B \"": "",
-            "Hello ' There D '": "",
-            "List of Places": "",
-            "New Document": "",
-            "Open": "",
-            "Open Document": "",
-            "Places": "",
-            "Please enter the name of the directory you'd like to create.": "",
-            "Save Document": "",
-            "This will erase any unsaved content.  If you're certain, please click OK to continue.": "",
-            "Web URL": "",
-            "Confirm": "<<PSLocal>>",
-            "File List": "<<ExtendedFileManager>>",
-            "Insert": "<<InsertNote>>"
-        },
-        "SpellChecker": {
-            "__ TRANSLATOR NOTE __": "*** SPELLCHECKER IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***",
-            "HTMLArea Spell Checker": "",
-            "Info": "",
-            "Learn": "",
-            "pliz weit ;-)": "",
-            "Revert": "",
-            "Spell Checker": ""
-        }
-    }
-}
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/lang/merged/nl.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/lang/merged/nl.js
deleted file mode 100644
index 8f7931b..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/lang/merged/nl.js
+++ /dev/null
@@ -1,1575 +0,0 @@
-// Xinha Language Combined Translation File
-//
-// LANG: "nl", ENCODING: UTF-8
-//
-// INSTRUCTIONS TO TRANSLATORS
-// ===========================================================================
-//
-// Your translation must be in UTF-8 Character Encoding.
-//
-// This is a JSON encoded file (plus comments), strings should be double-quote
-// only, do not use single quotes to surround strings - "hello", not 'hello'
-// do not have a trailing comma after the last entry in a section.
-//
-// Only full line comments are allowed (that a comments occupy entire lines).
-//
-// Search for the __NEW_TRANSLATIONS__ section below, this is where you will
-// want to focus, this section includes things that do not presently have a 
-// translation or for which the translation needs to be checked for accuracy.
-//
-// In the New Translations section a translation string is one of the following
-//
-//  "English String Here" : ""
-//     This means it is not translated yet, add your translation...
-//     "English String Here" : "Klingon String Here"
-//
-//  "English String Here" : "Translated String Here"
-//     This means that an existing translation for this string, in some other
-//     section has been found, and used.  Check that it is approprite for this
-//     section and if it is, that's fine leave it as is, otherwise change as
-//     appropriate.
-//
-//  "English String Here" : "<<AnotherSection>>"
-//     This means use the same translation for this string as <<AnotherSection>>
-//     this saves you re-tranlating strings.  If the Context of this section
-//     and the context of AnotherSection seem the same, that's fine leave it
-//     using that translation, but if this section needs a different translation, 
-//     you can provide it by replacing the link (<<AnotherSection>>) with that
-//     new translation.  For example - a "Table" in say "DataPlugin" is 
-//     perhaps translated differently to "Table" in "FurniturePlugin".
-//
-// TESTING YOUR TRANSLATION
-// ===========================================================================
-// Simply place your translation file on your webserver somewhere for example
-//
-//   /xinha/lang/merged/nl.js
-//
-// and then tell Xinha where to get it (before loading XinhaCore.js) by 
-//
-//  _editor_lang              = 'nl';
-//  _editor_lang_merged_file  = '/xinha/lang/merged/nl.js';
-//
-// Xinha will load your new language definition.
-//
-// SUBMITTING YOUR TRANSLATION
-// ===========================================================================
-// Simply create a Ticket on the Xinha website and attach your translation 
-// file.
-//
-// The Xinha developers will take your file and use the 
-//     contrib/lc_split_merged_file.php
-// script to load it into the Xinha distribution.
-
-{
-    "Abbreviation": {
-        "Abbreviation": "Afkorting",
-        "Cancel": "Annuleren",
-        "Delete": "Verwijderen",
-        "Expansion:": "Uitbreiding:",
-        "OK": "OK"
-    },
-    "AboutBox": {
-        "About this editor": "Over deze editor"
-    },
-    "BackgroundImage": {
-        "Cancel": "Annuleren",
-        "Remove Current Background": "Huidige Achtergrond Afbeelding Verwijderen",
-        "Set Page Background Image": "Pagina Achtergrond Afbeelding Instellen",
-        "Set page background image": "Pagina achtergrond afbeelding instellen"
-    },
-    "CharCounter": {
-        "... in progress": "... wordt verwerkt",
-        "Chars": "Tekens",
-        "Words": "Woorden"
-    },
-    "CharacterMap": {
-        "Insert special character": "Speciaal character invoegen"
-    },
-    "ClientsideSpellcheck": {
-        "Spell Check using ieSpell": "Engelse spellingscontrole met ieSpell"
-    },
-    "ColorPicker": {
-        "Color: ": "Kleur",
-        "OK": "OK"
-    },
-    "ContextMenu": {
-        "C_ell Properties...": "C_eleigenschappen...",
-        "Chec_k Link...": "Controleer hyperlin_k...",
-        "Copy": "Kopiëren",
-        "Create a link": "Maak een hyperlink",
-        "Current URL is": "Huidig URL is",
-        "Cut": "Knippen",
-        "De_lete Column": "Kolom verwijderen",
-        "Delete the current column": "Verwijder de huidige kolom",
-        "Delete the current row": "Verwijder de huidige rij",
-        "How did you get here? (Please report!)": "Hoe kwam je hier? (A.U.B. doorgeven!)",
-        "I_nsert Row Before": "Rij invoegen boven",
-        "In_sert Row After": "Rij invoegen onder",
-        "Insert C_olumn After": "Kolom invoegen na",
-        "Insert _Column Before": "Kolom invoegen voor",
-        "Insert a new column after the current one": "Voeg een nieuwe kolom in na de huidige",
-        "Insert a new column before the current one": "Voeg een nieuwe kolom in voor de huidige",
-        "Insert a new row after the current one": "Voeg een nieuwe rij in onder de huidige",
-        "Insert a new row before the current one": "Voeg een nieuwe rij in boven de huidige",
-        "Justify Center": "Centreren",
-        "Justify Full": "Uitvullen",
-        "Justify Left": "Links uitlijnen",
-        "Justify Right": "Rechts uitlijnen",
-        "Link points to:": "Hyperlink verwijst naar:",
-        "Make lin_k...": "Maak hyperlin_k...",
-        "Opens this link in a new window": "Opend deze hyperlink in een nieuw venster",
-        "Paste": "Plakken",
-        "Please confirm that you want to remove this element:": "Is het werkelijk de bedoeling dit element te verwijderen:",
-        "Please confirm that you want to unlink this element.": "Is het werkelijk de bedoeling dit element te unlinken.",
-        "Remove the $elem Element...": "Verwijder het $elem element...",
-        "Remove this node from the document": "Verwijder dit punt van het document",
-        "Ro_w Properties...": "Rijeigenscha_ppen...",
-        "Show the Table Cell Properties dialog": "Laat de tabel celeigenschappen dialog zien",
-        "Show the Table Properties dialog": "Laat de tabel eigenschappen dialog zien",
-        "Show the Table Row Properties dialog": "Laat de tabel rijeigenschappen dialog zien",
-        "Show the image properties dialog": "Laat het afbeeldingseigenschappen dialog zien",
-        "Unlink the current element": "Unlink het huidige element",
-        "_Delete Row": "Rij _verwijderen",
-        "_Image Properties...": "Eigenschappen afbeelding...",
-        "_Modify Link...": "Hyperlin_k aanpassen...",
-        "_Remove Link...": "Ve_rwijder hyperlink...",
-        "_Table Properties...": "_Tabeleigenschappen..."
-    },
-    "CreateLink": {
-        "Are you sure you wish to remove this link?": "Wilt u deze link werkelijk verwijderen?",
-        "Cancel": "Annuleren",
-        "Insert/Modify Link": "Hyperlink invoegen/aanpassen",
-        "New window (_blank)": "Nieuw venster (_blank)",
-        "None (use implicit)": "Geen",
-        "OK": "OK",
-        "Other": "Ander",
-        "Same frame (_self)": "Zelfde frame (_self)",
-        "Target:": "Doel:",
-        "Title (tooltip):": "Titel (tooltip):",
-        "Top frame (_top)": "Bovenste frame (_top)",
-        "URL:": "URL:"
-    },
-    "DefinitionList": {
-        "definition description": "definitie omschrijving",
-        "definition list": "definitie lijst",
-        "definition term": "definitie term"
-    },
-    "DynamicCSS": {
-        "Choose stylesheet": "Kies stylesheet",
-        "Default": "Default",
-        "Undefined": "Ungedefinieerd"
-    },
-    "EditTag": {
-        "Cancel": "Annuleren",
-        "Edit HTML for selected text": "HTML bewerken voor geselecteerde tekst",
-        "OK": "OK",
-        "Tag Editor": "HTML tag Editor"
-    },
-    "Equation": {
-        "AsciiMath Formula Input": "AsciiMath Formule Invoeren",
-        "Cancel": "Annuleren",
-        "Formula Editor": "Formule Invoeren",
-        "Input": "Invoer",
-        "OK": "OK",
-        "Preview": "Voorbeeld"
-    },
-    "ExtendedFileManager": {
-        "Align": "Uitlijnen",
-        "Alt": "Alt",
-        "Baseline": "Basis",
-        "Border": "Kader",
-        "Border Color": "Kaderkleur:",
-        "Bottom": "Onder",
-        "Cancel": "Annuleren",
-        "Clear": "Wissen",
-        "Color": "Kleur",
-        "Constrain Proportions": "Proportie behouden",
-        "Copy": "Kopiëren",
-        "Crop": "Uitsneden",
-        "Cut": "Knippen",
-        "Directory": "Map",
-        "Directory Up": "Bovenliggende map",
-        "Edit": "Bewerken",
-        "File Manager": "Bestandsbeheer",
-        "Filename:": "Bestandsnaam:",
-        "Flip Horizontal": "hor. spiegelen",
-        "Flip Image": "Beeld spiegelen",
-        "Flip Vertical": "ver. spiegelen",
-        "GIF format is not supported, image editing not supported.": "GIF-format niet ondersteund, beeldbewerking niet ondersteund.",
-        "Height": "Hoog",
-        "Height:": "Hoogte:",
-        "Insert File Link": "Hypelink van bestandinvoegen",
-        "Invalid base directory:": "Ongeldig pad:",
-        "JPEG High": "JPEG hoog",
-        "JPEG Low": "JPEG laag",
-        "JPEG Medium": "JPEG midden",
-        "Left": "Links",
-        "Loading": "Laden",
-        "Lock": "Op-slot",
-        "Margin": "Inspringen",
-        "Marker": "Markeren",
-        "Measure": "Opmeten",
-        "Middle": "Midden",
-        "New Folder": "Nieuw map",
-        "New window (_blank)": "Nieuw venster (_blank)",
-        "No Files Found": "Geen bestaand gevonden",
-        "No Image Available": "Geen beeld beschikbaar",
-        "None (use implicit)": "Geen",
-        "OK": "OK",
-        "Padding": "Uitvullen",
-        "Positioning of this image": "Uitlijnen van dit beeld",
-        "Preview": "Voorbeeld",
-        "Quality:": "Kwaliteit",
-        "Refresh": "Vernieuwen",
-        "Rename": "Naam wijzigen",
-        "Resize": "Formaat wijzigen",
-        "Right": "Rechts",
-        "Rotate": "Draaien",
-        "Rotate Image": "Beeld draaien",
-        "Same frame (_self)": "Zelfde frame (_self)",
-        "Save": "Opslaan",
-        "Start X:": "Start X",
-        "Start Y:": "Start Y",
-        "Target Window": "Doel venster",
-        "Title (tooltip)": "Titel (tooltip)",
-        "Top": "Boven",
-        "Top frame (_top)": "Bovenste frame (_top)",
-        "Trash": "Prullenbak",
-        "Upload": "Upload",
-        "W:": "W:",
-        "Width": "Breed",
-        "Width:": "Breedte:",
-        "You must select some text before making a new link.": "Eerst tekst selecteren.",
-        "Zoom": "Vergroot/verklein"
-    },
-    "Filter": {
-        "Filter": "Filter"
-    },
-    "FindReplace": {
-        "Case sensitive search": "Exact zoeken",
-        "Clear": "Leeg",
-        "Done": "Voltooien",
-        "Enter the text you want to find": "Voer tekst in waar je op wilt zoeken",
-        "Find and Replace": "Zoek en vervang",
-        "Highlight": "Markeren",
-        "Inform a replacement word": "Voer een vervang woord of zin in",
-        "Next": "Volgende",
-        "Options": "Opties",
-        "Replace with:": "Vervang met:",
-        "Search for:": "Zoek naar:",
-        "Substitute all occurrences": "Vervang alle overeenkomsten",
-        "Substitute this occurrence?": "Deze overeenkomst vervangen?",
-        "Undo": "Ongedaan maken",
-        "Whole words only": "Alleen hele woorden",
-        "found item": "gevonden overeenkomst",
-        "found items": "gevonden overeenkomsten",
-        "not found": "niet gevonden",
-        "replaced item": "vervangen item",
-        "replaced items": "vervangen items"
-    },
-    "FormOperations": {
-        "Insert a Form.": "Formulier invoegen",
-        "Insert a check box.": "Een checkbox invoegen",
-        "Insert a multi-line text field.": "Een tekstveld met meerdere lijnen invoegen",
-        "Insert a radio button.": "Een radio knop invoegen",
-        "Insert a select field.": "Een selectielijst invoegen",
-        "Insert a submit/reset button.": "Een verzend/wis knop invoegen",
-        "Insert a text, password or hidden field.": "Tekst, wachtwoord of verborgen veld invoegen"
-    },
-    "Forms": {
-        "'onClick'=": "'onClick'=",
-        "Access Key:": "Toegangs toets:",
-        "Action URL:": "Actie URL:",
-        "Button Script": "Knop script",
-        "Cancel": "Annuleren",
-        "Checked": "Checked",
-        "Columns:": "Kolommen:",
-        "Default text (optional)": "Standaard tekst (optioneel)",
-        "Dimensions": "Dimenties",
-        "Disabled": "Uitgeschakeld",
-        "Encoding:": "Encodering:",
-        "For Control:": "Voor controle:",
-        "Form": "Formulier",
-        "Form Element: FIELDSET": "Formulier element: FIELDSET",
-        "Form Element: INPUT": "Formulier element: INPUT",
-        "Form Element: LABEL": "Formulier element: LABEL",
-        "Form Element: SELECT": "Formulier element: SELECT",
-        "Form Element: TEXTAREA": "Formulier element: TEXTAREA",
-        "Form Name:": "Formulier naame:",
-        "Form handler script": "Formulier script",
-        "Get": "GET",
-        "HTML-Form to CGI (default)": "HTML formulier naar CGI (standaard)",
-        "Hard": "Hard",
-        "Height in number of rows": "Hoogte in aantal tekens",
-        "Image URL:": "Afbeelding URL:",
-        "Image source": "Afbeelding bron",
-        "Initial Text:": "Start tekst:",
-        "Javascript for button click": "Knop klik met JavaScript",
-        "Label:": "Label",
-        "Legend:": "Legend:",
-        "Max length:": "Maximale lengte:",
-        "Maximum number of characters accepted": "Maximaal aantal tekens toegestaan",
-        "Method:": "Methode:",
-        "Name": "Naame",
-        "Name of the form input": "Naam van formulier invoer",
-        "Name of the form select": "Naam van formulier select",
-        "Name/ID:": "Naam/ID:",
-        "OK": "OK",
-        "Off": "Uit",
-        "Options": "Opties",
-        "Physical": "Fysiek",
-        "Please enter a Label": "Voer een Label in",
-        "Post": "POST",
-        "Read Only": "Alleen lezen",
-        "Rows:": "Rijen:",
-        "Size of text box in characters": "Grootte van tekstveld in tekens",
-        "Size:": "Grootte:",
-        "Soft": "Zacht",
-        "Tab Index:": "Tab volgorde:",
-        "Target Frame:": "Doel venster:",
-        "Text:": "Tekst:",
-        "URL of image": "Afbeelding URL",
-        "Value of the form input": "Waarde van formulier invoer",
-        "Value:": "Waarde:",
-        "Virtual": "Virtueel",
-        "Width in number of characters": "Breedte in aantal tekens",
-        "Wrap Mode:": "Terugloop:",
-        "You must enter a Name": "Voer een Naam in",
-        "multipart Form Data (File-Upload)": "Multipart formulier data(Bestands upload)",
-        "name of the textarea": "Naam van tekst gebied",
-        "normal": "normaal",
-        "nowrap": "geen terugloop",
-        "pre": "pre"
-    },
-    "FullPage": {
-        "Alternate style-sheet:": "Wisselen van style-sheet:",
-        "Background color:": "Achtergrondkleur:",
-        "Cancel": "Annuleren",
-        "DOCTYPE:": "DOCTYPE:",
-        "Description:": "Beschrijving:",
-        "Document properties": "Documenteigenschappen",
-        "Document title:": "Documenttitel:",
-        "OK": "OK",
-        "Primary style-sheet:": "Primaire style-sheet:",
-        "Text color:": "Tekstkleur:"
-    },
-    "FullScreen": {
-        "Maximize/Minimize Editor": "Editor maximaliseren/verkleinen"
-    },
-    "HorizontalRule": {
-        "Alignment:": "Uitvulling:",
-        "Cancel": "Annuleren",
-        "Center": "Midden",
-        "Color:": "kleur",
-        "Height:": "Hoogte:",
-        "Horizontal Rule": "Horizontale lijn",
-        "Insert/edit horizontal rule": "Horizontale lijn invoegen/bewerken",
-        "Layout": "Weergave",
-        "Left": "Links",
-        "No shading": "Geen schaduw",
-        "OK": "OK",
-        "Right": "Rechts",
-        "Style": "Style",
-        "Width:": "Breedte:",
-        "percent": "procent",
-        "pixels": "pixels"
-    },
-    "HtmlTidy": {
-        "Tidy failed.  Check your HTML for syntax errors.": "Tidy mislukt. Controleer HTML op fouten."
-    },
-    "ImageManager": {
-        "Angle:": "Hoek:",
-        "Baseline": "Basis",
-        "Bottom": "Onder",
-        "Cancel": "Annuleren",
-        "Clear": "Leeg",
-        "Constrain Proportions": "Proportie behouden",
-        "Crop": "Passend maken",
-        "Directory": "Map",
-        "Directory Up": "Bovenliggende map",
-        "Edit": "Bewerken",
-        "Filename:": "Bestandsnaam:",
-        "Flip Horizontal": "hor. spiegelen",
-        "Flip Image": "Beeld spiegelen",
-        "Flip Vertical": "ver. spiegelen",
-        "Folder Name:": "Map naam",
-        "GIF format is not supported, image editing not supported.": "GIF-format niet ondersteund, beeldbewerking niet ondersteund.",
-        "Height:": "Hoogte:",
-        "Image Format": "Beeldformaat:",
-        "Insert Image": "Afbeelding invoegen",
-        "Invalid base directory:": "Ongeldig pad:",
-        "JPEG High": "JPEG hoog",
-        "JPEG Low": "JPEG laag",
-        "JPEG Medium": "JPEG midden",
-        "Left": "Links",
-        "Lock": "Op-slot",
-        "Marker": "Markeren",
-        "Measure": "Opmeten",
-        "Middle": "Midden",
-        "New Folder": "Nieuw map",
-        "No Image Available": "Geen beeld beschikbaar",
-        "OK": "OK",
-        "Positioning of this image": "Uitlijnen van dit beeld",
-        "Quality:": "Kwaliteit",
-        "Refresh": "Vernieuwen",
-        "Resize": "Formaat wijzigen",
-        "Right": "Rechts",
-        "Rotate": "Draaien",
-        "Rotate Image": "Beeld draaien",
-        "Save": "Opslaan",
-        "Start X:": "Start X",
-        "Start Y:": "Start Y",
-        "Top": "Boven",
-        "Trash": "Prullenbak",
-        "W:": "W:",
-        "Width:": "Breedte:"
-    },
-    "InlineStyler": {
-        "Background": "Achtergrond",
-        "Baseline": "Basis",
-        "Border": "Kader",
-        "Bottom": "Onder",
-        "Center": "Midden",
-        "Char": "Karakter",
-        "Collapsed borders": "Geen randen",
-        "FG Color": "Voorgrond",
-        "Float": "Zwevend",
-        "Height": "Hoog",
-        "Image URL": "Afbeelding URL",
-        "Justify": "Uitvullen",
-        "Layout": "Weergave",
-        "Left": "Links",
-        "Margin": "Inspringen",
-        "Middle": "Midden",
-        "None": "Geen",
-        "Padding": "Celmarge",
-        "Right": "Rechts",
-        "Text align": "Text uitlijning",
-        "Top": "Boven",
-        "Vertical align": "Vertikale uitlijning",
-        "Width": "Breed",
-        "percent": "procent",
-        "pixels": "pixels"
-    },
-    "InsertAnchor": {
-        "Anchor name": "Naam (ID)",
-        "Cancel": "Annuleren",
-        "Delete": "Verwijderen",
-        "Insert Anchor": "Anker invoegen",
-        "OK": "OK"
-    },
-    "InsertImage": {
-        "Alignment:": "Uitvulling:",
-        "Alternate text:": "Alternatieve tekst:",
-        "Baseline": "Basis",
-        "Border thickness:": "Rand dikte:",
-        "Bottom": "Onder",
-        "Cancel": "Annuleren",
-        "Enter the image URL here": "Afbeeldingslocatie (URL)",
-        "For browsers that don't support images": "Voor browsers welke geen afbeeldingen ondersteunen",
-        "Horizontal padding": "Horizontale ruimte",
-        "Horizontal:": "Horizontaal:",
-        "Image Preview:": "Afbeeldingsvoorbeeld:",
-        "Image URL:": "Afbeelding URL:",
-        "Insert Image": "Afbeelding invoegen",
-        "Layout": "Weergave",
-        "Leave empty for no border": "Leeg voor geen rand",
-        "Left": "Links",
-        "Middle": "Midden",
-        "OK": "OK",
-        "Positioning of this image": "Uitlijnen van dit beeld",
-        "Preview": "Voorbeeld",
-        "Preview the image in a new window": "Afbeelding bekijken in nieuw venster",
-        "Right": "Rechts",
-        "Spacing": "marge",
-        "Top": "Boven",
-        "Vertical padding": "Verticale ruimte",
-        "Vertical:": "Verticaal:"
-    },
-    "InsertMarquee": {
-        "Background-Color:": "Achtergrondkleur:",
-        "Behavior:": "Gedrag:",
-        "Cancel": "Annuleren",
-        "Direction:": "Richting:",
-        "Height:": "Hoogte:",
-        "Insert scrolling marquee": "Scrollende tekst invoegen",
-        "Left": "Links",
-        "Name": "Naame",
-        "Name/ID:": "Naam/ID:",
-        "OK": "OK",
-        "Right": "Rechts",
-        "Scroll Amount:": "Snelheid:",
-        "Scroll Delay:": "Vertraging:",
-        "Speed Control": "Snelheidscontrole",
-        "Text:": "Tekst:",
-        "Width:": "Breedte:"
-    },
-    "InsertNote": {
-        "Cancel": "Annuleren"
-    },
-    "InsertPagebreak": {
-        "Page break": "Pagina einde"
-    },
-    "InsertPicture": {
-        "Alignment:": "Positie:",
-        "Alternate text:": "Alternatieve tekst:",
-        "Baseline": "Basis",
-        "Border thickness:": "Rand dikte:",
-        "Bottom": "Onder",
-        "Cancel": "Annuleren",
-        "Enter the image URL here": "Afbeeldingslocatie (URL)",
-        "For browsers that don't support images": "Voor browsers welke geen afbeeldingen ondersteunen",
-        "Height:": "Hoogte:",
-        "Horizontal padding": "Horizontale ruimte",
-        "Horizontal:": "Horizontaal:",
-        "Image Preview:": "Afbeeldingsvoorbeeld:",
-        "Image URL:": "Afbeelding URL:",
-        "Insert Image": "Afbeelding invoegen",
-        "Layout": "Weergave",
-        "Leave empty for no border": "Leeg voor geen rand",
-        "Leave empty for not defined": "Leeg voor niet gedefinieerd",
-        "Left": "Links",
-        "Middle": "Midden",
-        "OK": "OK",
-        "Positioning of this image": "Positie van de afbeelding",
-        "Preview": "Voorbeeld",
-        "Preview the image in a new window": "Afbeelding bekijken in nieuw venster",
-        "Right": "Rechts",
-        "Size": "Grootte",
-        "Spacing": "Marge",
-        "Top": "Boven",
-        "Upload file": "Upload bestand",
-        "Vertical padding": "Verticale ruimte",
-        "Vertical:": "Verticaal:",
-        "Width:": "Breedte:"
-    },
-    "InsertSmiley": {
-        "Insert Smiley": "Smiley invoegen"
-    },
-    "InsertSnippet": {
-        "Cancel": "Annuleren",
-        "Hide preview": "Verberg voorbeeld",
-        "Insert Snippet": "Snippet invoegen",
-        "Insert as": "Invoegen als",
-        "Show preview": "Laat voorbeeld zien",
-        "Variable": "Variabele"
-    },
-    "InsertSnippet2": {
-        "Cancel": "Annuleren",
-        "Filter": "Filter",
-        "Insert Snippet": "Snippet invoegen",
-        "Variable": "Variabele"
-    },
-    "InsertTable": {
-        "Alignment:": "Uitvulling:",
-        "Baseline": "Basis",
-        "Border": "Kader",
-        "Border thickness:": "Rand dikte:",
-        "Bottom": "Onder",
-        "Cancel": "Annuleren",
-        "Caption": "Opmerking",
-        "Insert Table": "Tabel invoegen",
-        "Layout": "Weergave",
-        "Leave empty for no border": "Leeg voor geen rand",
-        "Left": "Links",
-        "Middle": "Midden",
-        "OK": "OK",
-        "Percent": "procent",
-        "Pixels": "pixels",
-        "Right": "Rechts",
-        "Rows:": "Rijen:",
-        "Spacing": "marge",
-        "Top": "Boven",
-        "Width:": "Breedte:"
-    },
-    "LangMarks": {
-        "&mdash; language &mdash;": "&mdash; taal &mdash;",
-        "English": "Engels",
-        "French": "Frans",
-        "Greek": "Grieks",
-        "Latin": "Latijn",
-        "language select": "Taalkeuze"
-    },
-    "Linker": {
-        "Are you sure you wish to remove this link?": "Wilt u deze link werkelijk verwijderen?",
-        "Cancel": "Annuleren",
-        "Insert/Modify Link": "Hyperlink invoegen/aanpassen",
-        "Name:": "Naame",
-        "OK": "OK",
-        "Size:": "Grootte:",
-        "Target:": "Doel:",
-        "URL:": "URL:",
-        "You must select some text before making a new link.": "Selecteer de tekst welke gelinkt moet worden."
-    },
-    "ListType": {
-        "Choose list style type (for ordered lists)": "Kies stijl type (voor ordered lists)",
-        "Decimal numbers": "Decimale nummers",
-        "Lower greek letters": "Griekse letters",
-        "Lower latin letters": "Latijnse letters klein",
-        "Lower roman numbers": "Romeinse nummers klein",
-        "Upper latin letters": "Latijnse letters groot",
-        "Upper roman numbers": "Romeinse nummers groot"
-    },
-    "MootoolsFileManager": {
-        "Insert File Link": "Hypelink van bestandinvoegen",
-        "You must select some text before making a new link.": "Selecteer de tekst welke gelinkt moet worden."
-    },
-    "NoteServer": {
-        "Add GUIDO Code in a textbox on the page": "GUIDO code in een tekstgebied op de pagina invoegen",
-        "Add MIDI link to allow students to hear the music": "MIDI link invoegen om de muziek te beluisteren",
-        "Cancel": "Annuleren",
-        "Format": "Indeling",
-        "Guido code": "GUIDO-code",
-        "Image Preview": "Afbeeldingsvoorbeeld",
-        "Image in applet": "Afbeelding in applet",
-        "Insert GUIDO Music Notation": "GUIDO muziek notatie invoegen",
-        "MIDI File": "MIDI bestand",
-        "OK": "OK",
-        "Options": "Opties",
-        "Preview": "Voorbeeld",
-        "Preview the image in a new window": "Afbeelding bekijken in nieuw venster",
-        "Source Code": "Broncode",
-        "Zoom": "Vergroot/verklein"
-    },
-    "PSLocal": {
-        "Cancel": "Annuleren"
-    },
-    "PasteText": {
-        "Cancel": "Annuleren",
-        "OK": "OK",
-        "Paste as Plain Text": "Kopieer als platte tekst (geen opmaak)"
-    },
-    "PersistentStorage": {
-        "Cancel": "Annuleren",
-        "Copy": "Kopiëren",
-        "Delete": "Verwijderen",
-        "Directory Up": "Bovenliggende map",
-        "File Manager": "Bestandsbeheer",
-        "Filename": "Bestandsnaam:",
-        "Insert Image": "Afbeelding invoegen",
-        "New Folder": "Nieuw map",
-        "Save": "Opslaan",
-        "You must select some text before making a new link.": "Selecteer de tekst welke gelinkt moet worden."
-    },
-    "QuickTag": {
-        "ATTRIBUTES": "ATTRIBUTEN",
-        "Cancel": "Annuleren",
-        "Colors": "Kleuren",
-        "Enter the TAG you want to insert": "Voer de Tag naam in",
-        "No CSS class avaiable": "Geen CSS class beschikbaar",
-        "OPTIONS": "OPTIES",
-        "Ok": "Ok",
-        "Quick Tag Editor": "Quick Tag Editor",
-        "TAGs": "TAGs",
-        "There are some unclosed quote": "Er zijn niet gesloten quotes",
-        "This attribute already exists in the TAG": "Dit attribuut bestaat al in de tag",
-        "You have to select some text": "Selecteer tekst"
-    },
-    "SaveSubmit": {
-        "Ready": "Klaar",
-        "Save": "Opslaan",
-        "Saving...": "Bezig met opslaan...",
-        "in progress": "bezig met opslaan..."
-    },
-    "SetId": {
-        "Cancel": "Annuleren",
-        "Delete": "Verwijderen",
-        "ID/Name:": "ID/Naam:",
-        "OK": "OK",
-        "Set ID/Name": "ID/Naam instellen",
-        "Set Id and Name": "ID en Naam instellen"
-    },
-    "SmartReplace": {
-        "ClosingDoubleQuotes": "“",
-        "ClosingSingleQuote": "‘",
-        "Convert all quotes and dashes in the current document": "Converteer alle quotes en schuine strepen",
-        "Enable automatic replacements": "Automatisch vervangen inschakelen",
-        "OK": "OK",
-        "OpeningDoubleQuotes": "„",
-        "OpeningSingleQuote": "‚",
-        "SmartReplace Settings": "SmartReplace Instellingen"
-    },
-    "SpellChecker": {
-        "Cancel": "Annuleer",
-        "Dictionary": "Woordenboek",
-        "Finished list of mispelled words": "klaar met de lijst van fouten woorden",
-        "I will open it in a new page.": "Ik zal het in een nieuwe pagina openen.",
-        "Ignore": "Overslaan",
-        "Ignore all": "alles overslaan",
-        "No mispelled words found with the selected dictionary.": "Geen fouten gevonden met dit woordenboek.",
-        "OK": "OK",
-        "Original word": "Originele woord",
-        "Please confirm that you want to open this link": "Weet u zeker dat u deze link wilt openen?",
-        "Please wait.  Calling spell checker.": "Even wachten. spell checker wordt geladen.",
-        "Please wait: changing dictionary to": "even wachten: woordenboek wordt veranderd naar",
-        "Re-check": "Opnieuw",
-        "Replace": "Vervangen",
-        "Replace all": "Alles vervangen",
-        "Replace with": "Vervangen met",
-        "Revert": "Omkeren",
-        "Spell-check": "Spell-check",
-        "Suggestions": "Suggestie",
-        "This will drop changes and quit spell checker.  Please confirm.": "Dit zal alle veranderingen annuleren en de spell checker sluiten.  Weet u het zeker?"
-    },
-    "Stylist": {
-        "Styles": "Style"
-    },
-    "SuperClean": {
-        "Cancel": "Annuleren",
-        "Clean up HTML": "HTML opschonen",
-        "General tidy up and correction of some problems.": "Algemeen opschonen en correctie",
-        "OK": "OK",
-        "Please select from the following cleaning options...": "Selecteer de gewenste opschoon opties...",
-        "Remove custom font sizes.": "Verwijder aangepaste lettergroottes (font size)",
-        "Remove custom text colors.": "Verwijder aangepaste tekstkleuren (font color)",
-        "Remove custom typefaces (font \"styles\").": "Verwijder aangepaste lettertypes (font face)",
-        "Remove lang attributes.": "Verwijder alle taal (lang) attributen."
-    },
-    "TableOperations": {
-        "All four sides": "Alle 4 zijden",
-        "Borders": "Randen",
-        "Cancel": "Annuleren",
-        "Caption": "Opmerking",
-        "Cell Properties": "Celeigenschappen",
-        "Cell properties": "Celeigenschappen",
-        "Columns": "Kolommen:",
-        "Delete cell": "Cel verwijderen",
-        "Delete column": "Kolom verwijderen",
-        "Delete row": "Rij verwijderen",
-        "Description": "Omschrijving",
-        "Frames": "Frames",
-        "Insert cell after": "Voeg cel toe achter",
-        "Insert cell before": "Voeg cel toe voor",
-        "Insert column after": "Kolom invoegen achter",
-        "Insert column before": "Kolom invoegen voor",
-        "Insert row after": "Rij invoegen onder",
-        "Insert row before": "Rij invoegen boven",
-        "Merge cells": "Cellen samenvoegen",
-        "No rules": "Geen regels",
-        "No sides": "Geen zijlijnen",
-        "OK": "OK",
-        "Padding": "Celmarge",
-        "Please click into some cell": "Klik in een cel a.u.b.",
-        "Row Properties": "Rijeigenschappen",
-        "Row properties": "Rij eigenschappen",
-        "Rows": "Rijen:",
-        "Rules will appear between all rows and columns": "Regels verschijnen tussen alle rijen en kolommen",
-        "Rules will appear between columns only": "Regels verschijnen enkel tussen de kolommen",
-        "Rules will appear between rows only": "Regels verschijnen enkel tussen de rijen",
-        "Spacing": "marge",
-        "Spacing and padding": "Celmarge en afstand tussen cellen",
-        "Split column": "Kolom splitsen",
-        "Split row": "Rij splitsen",
-        "Summary": "Overzicht",
-        "Table Properties": "Tabel eigenschappen",
-        "Table properties": "Tabel eigenschappen",
-        "The bottom side only": "Enkel aan de onderkant",
-        "The left-hand side only": "Enkel aan de linkerkant",
-        "The right and left sides only": "Enkel aan de linker en rechterkant",
-        "The right-hand side only": "Enkel aan de rechterkant",
-        "The top and bottom sides only": "Enkel aan de bovenen onderkant",
-        "The top side only": "Enkel aan de bovenkant",
-        "Xinha cowardly refuses to delete the last cell in row.": "Xinha kan de laatste cel in deze tabel niet verwijderen.",
-        "Xinha cowardly refuses to delete the last column in table.": "Xinha kan de laatste kolom in deze tabel niet verwijderen.",
-        "Xinha cowardly refuses to delete the last row in table.": "Xinha kan de laatste rij in deze tabel niet verwijderen.",
-        "pixels": "pixels"
-    },
-    "Template": {
-        "Cancel": "Annuleren",
-        "Insert template": "Template invoegen"
-    },
-    "UnFormat": {
-        "All": "Alles",
-        "All HTML:": "Alle html",
-        "Cancel": "Annuleren",
-        "Cleaning Area": "Schoonmaak gebied",
-        "Cleaning options": "Schoonmaak opties",
-        "Formatting:": "Format",
-        "OK": "OK",
-        "Page Cleaner": "Pagina Schoonmaker",
-        "Select which types of formatting you would like to remove.": "Selecteer welke types van Formatteren je wilt verwijderen",
-        "Selection": "Geselecteerde tekst"
-    },
-    "Xinha": {
-        "About this editor": "Over deze editor",
-        "Background Color": "Achtergrondkleur",
-        "Bold": "Vet",
-        "Bulleted List": "Opsommingstekens",
-        "Copy selection": "Kopi?ren",
-        "Current style": "Huidige stijl",
-        "Cut selection": "Knippen",
-        "Decrease Indent": "Inspringing verkleinen",
-        "Direction left to right": "Tekstrichting links naar rechts",
-        "Direction right to left": "Tekstrichting rechts naar links",
-        "Font Color": "Tekstkleur",
-        "Help using editor": "Xinha help",
-        "Horizontal Rule": "Horizontale lijn",
-        "Increase Indent": "Inspringing vergroten",
-        "Insert Table": "Tabel invoegen",
-        "Insert Web Link": "Hyperlink invoegen/aanpassen",
-        "Insert/Modify Image": "Afbeelding invoegen/aanpassen",
-        "Italic": "Cursief",
-        "Justify Center": "Centreren",
-        "Justify Full": "Uitvullen",
-        "Justify Left": "Links uitlijnen",
-        "Justify Right": "Rechts uitlijnen",
-        "Normal": "normaal",
-        "Ordered List": "Nummering",
-        "Paste from clipboard": "Plakken",
-        "Path": "Pad",
-        "Redoes your last action": "Herhalen",
-        "Strikethrough": "Doorhalen",
-        "Subscript": "Subscript",
-        "Superscript": "Superscript",
-        "Toggle HTML Source": "HTML broncode",
-        "Underline": "Onderstrepen",
-        "Undoes your last action": "Ongedaan maken",
-        "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."
-    },
-    "__NEW_TRANSLATIONS__": {
-        "AboutBox": {
-            "Close": "<<Xinha>>"
-        },
-        "CharCounter": {
-            "HTML": ""
-        },
-        "ColorPicker": {
-            "Click a color...": "",
-            "Sample": "",
-            "Web Safe: ": "",
-            "Close": "<<Xinha>>"
-        },
-        "ContextMenu": {
-            "Delete Cell": "",
-            "Insert a paragraph after the current node": "",
-            "Insert a paragraph before the current node": "",
-            "Insert Cell After": "",
-            "Insert Cell Before": "",
-            "Insert paragraph after": "",
-            "Insert paragraph before": "",
-            "Merge Cells": ""
-        },
-        "CreateLink": {
-            "You need to select some text before creating a link": ""
-        },
-        "Dialogs": {
-            "Some Text Here": ""
-        },
-        "EditTag": {
-            "Edit Tag By Peg": ""
-        },
-        "Equation": {
-            "!=": "",
-            "!in": "",
-            "&gt;-": "",
-            "&gt;=": "",
-            "&lt;=": "",
-            "&lt;=&gt;": "",
-            "&lt;x&gt;": "",
-            "&nbsp; `!` &nbsp;": "",
-            "&nbsp; `.` &nbsp;": "",
-            "&nbsp; `0` &nbsp;": "",
-            "&nbsp; `2` &nbsp;": "",
-            "&nbsp; `3` &nbsp;": "",
-            "&nbsp; `4` &nbsp;": "",
-            "&nbsp; `5` &nbsp;": "",
-            "&nbsp; `6` &nbsp;": "",
-            "&nbsp; `7` &nbsp;": "",
-            "&nbsp; `8` &nbsp;": "",
-            "&nbsp; `9` &nbsp;": "",
-            "&nbsp; `e` &nbsp;": "",
-            "&nbsp;&nbsp;`1` &nbsp;": "",
-            "&nbsp;`+{::}`&nbsp;": "",
-            "&nbsp;`-:\\ `": "",
-            "&nbsp;`-{::}`&nbsp;": "",
-            "&nbsp;`C`&nbsp;": "",
-            "&nbsp;`cos`": "",
-            "&nbsp;`ln`&nbsp;": "",
-            "&nbsp;`pi` &nbsp;": "",
-            "&nbsp;`sin`": "",
-            "&nbsp;`tan`": "",
-            "&nbsp;`times`&nbsp;": "",
-            "&quot;text&quot;": "",
-            "'+formula+'": "",
-            "((n),(k))": "",
-            "(x+1)/(x-1)": "",
-            "*": "",
-            "**": "",
-            "+-": "",
-            "-&gt;": "",
-            "-&lt;": "",
-            "-:": "",
-            "-=": "",
-            "//": "",
-            "/_": "",
-            ":.": "",
-            "=&gt;": "",
-            "@": "",
-            "[[a,b],[c,d]]": "",
-            "\\\\": "",
-            "\\nClick in the box to use your keyboard or use the buttons\\n": "",
-            "^^": "",
-            "^^^": "",
-            "__|": "",
-            "_|_": "",
-            "`!=`": "",
-            "`!in`": "",
-            "`&and;`": "",
-            "`&cap;`": "",
-            "`&cup;`": "",
-            "`&gt;-`": "",
-            "`&gt;=`": "",
-            "`&lt;=&gt;`": "",
-            "`&lt;=`": "",
-            "`&lt;x&gt;`": "",
-            "`&or;`": "",
-            "`&quot;text&quot;`": "",
-            "`((n),(k))`": "",
-            "`(x+1)/(x-1)`": "",
-            "`**`": "",
-            "`*`": "",
-            "`+-`": "",
-            "`-&gt;`": "",
-            "`-&lt;`": "",
-            "`-:`": "",
-            "`-=`": "",
-            "`//`": "",
-            "`/_`": "",
-            "`:.`": "",
-            "`=&gt;`": "",
-            "`@`": "",
-            "`[[a,b],[c,d]]`": "",
-            "`\\\\`": "",
-            "`__|`": "",
-            "`_|_`": "",
-            "`AA`": "",
-            "`aleph`": "",
-            "`alpha`": "",
-            "`and`": "",
-            "`bara`": "",
-            "`bba`": "",
-            "`bbba`": "",
-            "`beta`": "",
-            "`CC`": "",
-            "`cca`": "",
-            "`chi`": "",
-            "`darr`": "",
-            "`ddota`": "",
-            "`del`": "",
-            "`delta`": "",
-            "`Delta`": "",
-            "`diamond`": "",
-            "`dota`": "",
-            "`dy/dx`": "",
-            "`EE`": "",
-            "`epsi`": "",
-            "`eta`": "",
-            "`fra`": "",
-            "`gamma`": "",
-            "`Gamma`": "",
-            "`grad`": "",
-            "`harr`": "",
-            "`hArr`": "",
-            "`hata`": "",
-            "`if`": "",
-            "`in`": "",
-            "`int`": "",
-            "`iota`": "",
-            "`kappa`": "",
-            "`lambda`": "",
-            "`Lambda`": "",
-            "`larr`": "",
-            "`lArr`": "",
-            "`lim_(x-&gt;oo)`": "",
-            "`log`": "",
-            "`mu`": "",
-            "`NN`": "",
-            "`nn`": "",
-            "`not`": "",
-            "`nu`": "",
-            "`o+`": "",
-            "`o.`": "",
-            "`O/`": "",
-            "`oint`": "",
-            "`omega`": "",
-            "`Omega`": "",
-            "`oo`": "",
-            "`or`": "",
-            "`ox`": "",
-            "`phi`": "",
-            "`Phi`": "",
-            "`Pi`": "",
-            "`pi`": "",
-            "`prod`": "",
-            "`prop`": "",
-            "`psi`": "",
-            "`Psi`": "",
-            "`QQ`": "",
-            "`quad`": "",
-            "`rArr`": "",
-            "`rho`": "",
-            "`root(n)(x)`": "",
-            "`RR`": "",
-            "`sfa`": "",
-            "`Sigma`": "",
-            "`sigma`": "",
-            "`sqrt(x)`": "",
-            "`square`": "",
-            "`stackrel(-&gt;)(+)`": "",
-            "`sub`": "",
-            "`sube`": "",
-            "`sum`": "",
-            "`sup`": "",
-            "`supe`": "",
-            "`tau`": "",
-            "`theta`": "",
-            "`Theta`": "",
-            "`TT`": "",
-            "`tta`": "",
-            "`uarr`": "",
-            "`ula`": "",
-            "`upsilon`": "",
-            "`uu`": "",
-            "`veca`": "",
-            "`vv`": "",
-            "`x_(mn)`": "",
-            "`Xi`": "",
-            "`xi`": "",
-            "`xx`": "",
-            "`zeta`": "",
-            "`ZZ`": "",
-            "`|-&gt;`": "",
-            "`|--`": "",
-            "`|==`": "",
-            "`|__`": "",
-            "`|~`": "",
-            "`~=`": "",
-            "`~|`": "",
-            "`~~`": "",
-            "AA": "",
-            "aleph": "",
-            "alpha": "",
-            "and": "",
-            "AsciiMathML Example": "",
-            "bara": "",
-            "Based on ASCIIMathML by": "",
-            "bba": "",
-            "bbba": "",
-            "beta": "",
-            "CC": "",
-            "cca": "",
-            "chi": "",
-            "darr": "",
-            "ddota": "",
-            "del": "",
-            "delta": "",
-            "Delta": "",
-            "diamond": "",
-            "dota": "",
-            "dy/dx": "",
-            "EE": "",
-            "epsi": "",
-            "eta": "",
-            "For more information on AsciiMathML visit this page:": "",
-            "fra": "",
-            "gamma": "",
-            "Gamma": "",
-            "grad": "",
-            "harr": "",
-            "hArr": "",
-            "hata": "",
-            "if": "",
-            "in": "",
-            "int": "",
-            "int_a^bf(x)dx": "",
-            "iota": "",
-            "kappa": "",
-            "Lambda": "",
-            "lambda": "",
-            "lArr": "",
-            "larr": "",
-            "lim_(x-&gt;oo)": "",
-            "mu": "",
-            "NN": "",
-            "nn": "",
-            "nnn": "",
-            "not": "",
-            "nu": "",
-            "o+": "",
-            "o.": "",
-            "O/": "",
-            "oint": "",
-            "Omega": "",
-            "omega": "",
-            "oo": "",
-            "or": "",
-            "ox": "",
-            "phi": "",
-            "Phi": "",
-            "Pi": "",
-            "pi": "",
-            "prod": "",
-            "prop": "",
-            "psi": "",
-            "Psi": "",
-            "QQ": "",
-            "quad": "",
-            "rArr": "",
-            "rho": "",
-            "root(n)(x)": "",
-            "RR": "",
-            "sfa": "",
-            "Sigma": "",
-            "sigma": "",
-            "sqrt(x)": "",
-            "square": "",
-            "stackrel(-&gt;)(+)": "",
-            "sub": "",
-            "sube": "",
-            "sum": "",
-            "sum_(n=1)^oo": "",
-            "sup": "",
-            "supe": "",
-            "tau": "",
-            "theta": "",
-            "Theta": "",
-            "TT": "",
-            "tta": "",
-            "uarr": "",
-            "ula": "",
-            "upsilon": "",
-            "uu": "",
-            "uuu": "",
-            "veca": "",
-            "vv": "",
-            "vvv": "",
-            "x^(m+n)": "",
-            "x_(mn)": "",
-            "Xi": "",
-            "xi": "",
-            "xx": "",
-            "zeta": "",
-            "ZZ": "",
-            "|-&gt;": "",
-            "|--": "",
-            "|==": "",
-            "|__": "",
-            "|~": "",
-            "~=": "",
-            "~|": "",
-            "~~": ""
-        },
-        "FancySelects": {
-            "'+opt.text+'": ""
-        },
-        "FindReplace": {
-            "';\r\n  var tagc = '": ""
-        },
-        "FormOperations": {
-            "Enter the name for new option.": "",
-            "Form Editor": "",
-            "Message Sent": "",
-            "Please Select...": ""
-        },
-        "Forms": {
-            "Insert/Edit Form": "",
-            "Insert/Edit Form Element FIELDSET": "",
-            "Insert/Edit Form Element INPUT": "",
-            "Insert/Edit Form Element LABEL": "",
-            "Insert/Edit Form Element SELECT": "",
-            "Insert/Edit Form Element TEXTAREA": ""
-        },
-        "FullPage": {
-            "...": "",
-            "Character set:": "",
-            "cyrillic (ISO-8859-5)": "",
-            "cyrillic (KOI8-R)": "",
-            "cyrillic (WINDOWS-1251)": "",
-            "Keywords:": "",
-            "UTF-8 (recommended)": "",
-            "western (ISO-8859-1)": ""
-        },
-        "Gecko": {
-            "The Paste button does not work in this browser for security reasons. Press CTRL-V on your keyboard to paste directly.": ""
-        },
-        "HorizontalRule": {
-            "&#x00d7;": "",
-            "&nbsp;": "",
-            "Insert/Edit Horizontal Rule": ""
-        },
-        "InlineStyler": {
-            "CSS Style": "",
-            "-": "<<Equation>>"
-        },
-        "InsertImage": {
-            "Absbottom": "",
-            "Absmiddle": "",
-            "Not set": "",
-            "Texttop": "",
-            "You must enter the URL": ""
-        },
-        "InsertNote": {
-            "Insert": "",
-            "Insert footnote": "",
-            "Insert Note": ""
-        },
-        "InsertPagebreak": {
-            "Page Break": ""
-        },
-        "InsertSnippet": {
-            "\\n  This is an information about something\\n": "",
-            "InsertSnippet for Xinha": "",
-            "Link1": "",
-            "Link2": "",
-            "Link3": "",
-            "Link4": "",
-            "Link5": "",
-            "This is an information about something": ""
-        },
-        "InsertSnippet2": {
-            "All Categories": "",
-            "Insert as HTML": "",
-            "Insert as template variable": "",
-            "Only search word beginning": "",
-            "HTML": "<<CharCounter>>",
-            "InsertSnippet for Xinha": "<<InsertSnippet>>"
-        },
-        "InsertTable": {
-            "Caption for the table": "",
-            "Cell padding:": "",
-            "Cell spacing:": "",
-            "Collapse borders:": "",
-            "Cols:": "",
-            "Em": "",
-            "Fixed width columns": "",
-            "Layou": "",
-            "Number of columns": "",
-            "Number of rows": "",
-            "Positioning of this table": "",
-            "Space between adjacent cells": "",
-            "Space between content and border in cell": "",
-            "Style of the border": "",
-            "Width of the table": "",
-            "Width unit": "",
-            "You must enter a number of columns": "",
-            "You must enter a number of rows": "",
-            "Absbottom": "<<InsertImage>>",
-            "Absmiddle": "<<InsertImage>>",
-            "Not set": "<<InsertImage>>",
-            "Texttop": "<<InsertImage>>"
-        },
-        "LangMarks": {
-            "', '": ""
-        },
-        "Linker": {
-            "(px)": "",
-            "Anchor-Link": "",
-            "Anchor:": "",
-            "Email Address:": "",
-            "Email Link": "",
-            "Location Bar:": "",
-            "Menu Bar:": "",
-            "Message Template:": "",
-            "New Window": "",
-            "Ordinary Link": "",
-            "Popup Window": "",
-            "PopupWindow": "",
-            "Remove Link": "",
-            "Resizeable:": "",
-            "Same Window (jump out of frames)": "",
-            "Scrollbars:": "",
-            "Shows On Hover": "",
-            "Status Bar:": "",
-            "Subject:": "",
-            "Title:": "",
-            "Toolbar:": "",
-            "URL Link": ""
-        },
-        "Opera": {
-            "MARK": "",
-            "The Paste button does not work in Mozilla based web browsers (technical security reasons). Press CTRL-V on your keyboard to paste directly.": ""
-        },
-        "PasteText": {
-            "Insert text in new paragraph": ""
-        },
-        "PreserveScripts": {
-            "JavaScript": "",
-            "PHP": ""
-        },
-        "QuickTag": {
-            "',\r\n                           'cl': '": ""
-        },
-        "SetId": {
-            "Set Id/Name": ""
-        },
-        "SmartReplace": {
-            "SmartReplace": ""
-        },
-        "SuperClean": {
-            "Clean bad HTML from Microsoft Word.": "",
-            "Clean Selection Only": "",
-            "Cleaning Scope": "",
-            "Please stand by while cleaning in process...": "",
-            "Remove alignment (left/right/justify).": "",
-            "Remove all classes (CSS).": "",
-            "Remove All HTML Tags": "",
-            "Remove all styles (CSS).": "",
-            "Remove emphasis and annotations.": "",
-            "Remove Paragraphs": "",
-            "Remove superscripts and subscripts.": "",
-            "Replace directional quote marks with non-directional quote marks.": "",
-            "Vigorously purge HTML from Microsoft Word.": ""
-        },
-        "TableOperations": {
-            "Cell Type:": "",
-            "Cells down": "",
-            "Cells to the right, and": "",
-            "Do Not Change": "",
-            "Frame and borders": "",
-            "Header (th)": "",
-            "Merge current cell with:": "",
-            "Normal (td)": "",
-            "Merge Cells": "<<ContextMenu>>"
-        },
-        "UnsavedChanges": {
-            "You have unsaved changes in the editor": ""
-        },
-        "WebKit": {
-            "The Paste button does not work in this browser for security reasons. Press CTRL-V on your keyboard to paste directly.": "<<Gecko>>"
-        },
-        "Xinha": {
-            "&#8212; font &#8212;": "",
-            "&#8212; format &#8212;": "",
-            "&#8212; size &#8212;": "",
-            "1 (8 pt)": "",
-            "2 (10 pt)": "",
-            "3 (12 pt)": "",
-            "4 (14 pt)": "",
-            "5 (18 pt)": "",
-            "6 (24 pt)": "",
-            "7 (36 pt)": "",
-            "Address": "",
-            "Arial": "",
-            "Clean content pasted from Word": "",
-            "Clear Inline Font Specifications": "",
-            "Clear MSOffice tags": "",
-            "Close": "",
-            "Constructing object": "",
-            "Courier New": "",
-            "Create Statusbar": "",
-            "Create Toolbar": "",
-            "CTRL-0 (zero)": "",
-            "CTRL-1 .. CTRL-6": "",
-            "CTRL-A": "",
-            "CTRL-B": "",
-            "CTRL-C": "",
-            "CTRL-E": "",
-            "CTRL-I": "",
-            "CTRL-J": "",
-            "CTRL-L": "",
-            "CTRL-N": "",
-            "CTRL-R": "",
-            "CTRL-S": "",
-            "CTRL-U": "",
-            "CTRL-V": "",
-            "CTRL-X": "",
-            "CTRL-Y": "",
-            "CTRL-Z": "",
-            "Editor Help": "",
-            "ENTER": "",
-            "Error Loading Xinha.  Developers, check the Error Console for information.": "",
-            "Finishing": "",
-            "Formatted": "",
-            "Generate Xinha framework": "",
-            "Georgia": "",
-            "Heading 1": "",
-            "Heading 2": "",
-            "Heading 3": "",
-            "Heading 4": "",
-            "Heading 5": "",
-            "Heading 6": "",
-            "Headings": "",
-            "Impact": "",
-            "Init editor size": "",
-            "insert linebreak": "",
-            "Insert/Overwrite": "",
-            "Keyboard shortcuts": "",
-            "Loading Core": "",
-            "Loading in progress. Please wait!": "",
-            "Loading plugin $plugin": "",
-            "Loading plugins": "",
-            "MS Word Cleaner": "",
-            "new paragraph": "",
-            "Print document": "",
-            "Register plugin $plugin": "",
-            "Remove formatting": "",
-            "Save as": "",
-            "Select all": "",
-            "Select Color": "",
-            "Set format to paragraph": "",
-            "SHIFT-ENTER": "",
-            "Split Block": "",
-            "Tahoma": "",
-            "The editor provides the following key combinations:": "",
-            "Times New Roman": "",
-            "Toggle Borders": "",
-            "Touch here first to activate editor.": "",
-            "Verdana": "",
-            "Waiting for Iframe to load...": "",
-            "WingDings": "",
-            "Would you like to clear font colours?": "",
-            "Would you like to clear font sizes?": "",
-            "Would you like to clear font typefaces?": "",
-            "Xinha": ""
-        },
-        "BackgroundImage": {
-            "__ TRANSLATOR NOTE __": "*** BACKGROUNDIMAGE IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***",
-            "Set Background": ""
-        },
-        "ExtendedFileManager": {
-            "__ TRANSLATOR NOTE __": "*** EXTENDEDFILEMANAGER IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***",
-            "10%": "",
-            "100%": "",
-            "200%": "",
-            "25%": "",
-            "50%": "",
-            "75%": "",
-            ">List View": "",
-            ">Thumbnail View": "",
-            "A:": "",
-            "D:": "",
-            "File List": "",
-            "Filesize:": "",
-            "Folder": "",
-            "GIF": "",
-            "H:": "",
-            "Image Editor": "",
-            "Image Selection": "",
-            "Maximum folder size limit reached. Upload disabled.": "",
-            "Please enter value": "",
-            "PNG": "",
-            "Preset": "",
-            "Rotate 180 &deg;": "",
-            "Rotate 90 &deg; CCW": "",
-            "Rotate 90 &deg; CW": "",
-            "Toggle marker color": "",
-            "X:": "",
-            "Xinha Image Editor": "",
-            "Y:": "",
-            "Absbottom": "<<InsertImage>>",
-            "Absmiddle": "<<InsertImage>>",
-            "Not set": "<<InsertImage>>",
-            "Texttop": "<<InsertImage>>"
-        },
-        "HtmlTidy": {
-            "__ TRANSLATOR NOTE __": "*** HTMLTIDY IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***",
-            "Auto-Tidy": "",
-            "Don't Tidy": "",
-            "HTML Tidy": ""
-        },
-        "ImageManager": {
-            "__ TRANSLATOR NOTE __": "*** IMAGEMANAGER IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***",
-            "Flickr Picture List": "",
-            "Flickr Pictures": "",
-            "Flickr Selection": "",
-            "Flickr Username/Email": "",
-            "Image List": "",
-            "Keyword": "",
-            "No Images Found": "",
-            "No Photos Found": "",
-            "No Videos Found": "",
-            "This Server": "",
-            "YouTube Selection": "",
-            "YouTube Username": "",
-            "YouTube Video List": "",
-            "YouTube Videos": "",
-            "A:": "<<ExtendedFileManager>>",
-            "Absbottom": "<<InsertImage>>",
-            "Absmiddle": "<<InsertImage>>",
-            "D:": "<<ExtendedFileManager>>",
-            "GIF": "<<ExtendedFileManager>>",
-            "H:": "<<ExtendedFileManager>>",
-            "Image Editor": "<<ExtendedFileManager>>",
-            "Image Selection": "<<ExtendedFileManager>>",
-            "Not set": "<<InsertImage>>",
-            "PNG": "<<ExtendedFileManager>>",
-            "Rotate 180 &deg;": "<<ExtendedFileManager>>",
-            "Rotate 90 &deg; CCW": "<<ExtendedFileManager>>",
-            "Rotate 90 &deg; CW": "<<ExtendedFileManager>>",
-            "Texttop": "<<InsertImage>>",
-            "X:": "<<ExtendedFileManager>>",
-            "Y:": "<<ExtendedFileManager>>"
-        },
-        "InsertMarquee": {
-            "__ TRANSLATOR NOTE __": "*** INSERTMARQUEE IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***",
-            "Alternate": "",
-            "Continuous": "",
-            "Marquee Editor": "",
-            "Slide": ""
-        },
-        "InsertPicture": {
-            "__ TRANSLATOR NOTE __": "*** INSERTPICTURE IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***",
-            " Open file in new window": "",
-            "Open file in new window": "",
-            "Absbottom": "<<InsertImage>>",
-            "Absmiddle": "<<InsertImage>>",
-            "Not set": "<<InsertImage>>",
-            "Texttop": "<<InsertImage>>"
-        },
-        "NoteServer": {
-            "__ TRANSLATOR NOTE __": "*** NOTESERVER IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***",
-            "120%": "",
-            "150%": "",
-            "80%": "",
-            "GUIDO Code": "",
-            "With Mozilla, the applet will not be visible in editor, but only in Web page after submitting.": "",
-            "Zoom :": "",
-            "100%": "<<ExtendedFileManager>>"
-        },
-        "PSLocal": {
-            "__ TRANSLATOR NOTE __": "*** PSLOCAL IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***",
-            "Confirm": "",
-            "Enable": "",
-            "Enable Gears in order to use local document storage and configuration.": "",
-            "Enabling Local Storage": "",
-            "Install": "",
-            "Learn About Local Storage": "",
-            "This will reload the page, causing you to lose any unsaved work.  Press \"OK\" to reload.": "",
-            "Xinha uses Google Gears to enable local document storage.  With Gears installed, you can save drafts of your documents on your hard drive, configure Xinha to look the way you want, and carry this information wherever you use Xinha on the web.": ""
-        },
-        "PSServer": {
-            "__ TRANSLATOR NOTE __": "*** PSSERVER IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***",
-            "File: ": "",
-            "Import": ""
-        },
-        "PersistentStorage": {
-            "__ TRANSLATOR NOTE __": "*** PERSISTENTSTORAGE IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***",
-            "Details": "",
-            "File Browser": "",
-            "Hello    There C ": "",
-            "Hello  There A ": "",
-            "Hello \" There B \"": "",
-            "Hello ' There D '": "",
-            "List of Places": "",
-            "New Document": "",
-            "Open": "",
-            "Open Document": "",
-            "Places": "",
-            "Please enter the name of the directory you'd like to create.": "",
-            "Save Document": "",
-            "This will erase any unsaved content.  If you're certain, please click OK to continue.": "",
-            "Web URL": "",
-            "Confirm": "<<PSLocal>>",
-            "File List": "<<ExtendedFileManager>>",
-            "Insert": "<<InsertNote>>"
-        },
-        "SpellChecker": {
-            "__ TRANSLATOR NOTE __": "*** SPELLCHECKER IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***",
-            "HTMLArea Spell Checker": "",
-            "Info": "",
-            "Learn": "",
-            "pliz weit ;-)": "",
-            "Spell Checker": ""
-        }
-    }
-}
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/lang/merged/pl.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/lang/merged/pl.js
deleted file mode 100644
index 6e83f76..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/lang/merged/pl.js
+++ /dev/null
@@ -1,1579 +0,0 @@
-// Xinha Language Combined Translation File
-//
-// LANG: "pl", ENCODING: UTF-8
-//
-// INSTRUCTIONS TO TRANSLATORS
-// ===========================================================================
-//
-// Your translation must be in UTF-8 Character Encoding.
-//
-// This is a JSON encoded file (plus comments), strings should be double-quote
-// only, do not use single quotes to surround strings - "hello", not 'hello'
-// do not have a trailing comma after the last entry in a section.
-//
-// Only full line comments are allowed (that a comments occupy entire lines).
-//
-// Search for the __NEW_TRANSLATIONS__ section below, this is where you will
-// want to focus, this section includes things that do not presently have a 
-// translation or for which the translation needs to be checked for accuracy.
-//
-// In the New Translations section a translation string is one of the following
-//
-//  "English String Here" : ""
-//     This means it is not translated yet, add your translation...
-//     "English String Here" : "Klingon String Here"
-//
-//  "English String Here" : "Translated String Here"
-//     This means that an existing translation for this string, in some other
-//     section has been found, and used.  Check that it is approprite for this
-//     section and if it is, that's fine leave it as is, otherwise change as
-//     appropriate.
-//
-//  "English String Here" : "<<AnotherSection>>"
-//     This means use the same translation for this string as <<AnotherSection>>
-//     this saves you re-tranlating strings.  If the Context of this section
-//     and the context of AnotherSection seem the same, that's fine leave it
-//     using that translation, but if this section needs a different translation, 
-//     you can provide it by replacing the link (<<AnotherSection>>) with that
-//     new translation.  For example - a "Table" in say "DataPlugin" is 
-//     perhaps translated differently to "Table" in "FurniturePlugin".
-//
-// TESTING YOUR TRANSLATION
-// ===========================================================================
-// Simply place your translation file on your webserver somewhere for example
-//
-//   /xinha/lang/merged/pl.js
-//
-// and then tell Xinha where to get it (before loading XinhaCore.js) by 
-//
-//  _editor_lang              = 'pl';
-//  _editor_lang_merged_file  = '/xinha/lang/merged/pl.js';
-//
-// Xinha will load your new language definition.
-//
-// SUBMITTING YOUR TRANSLATION
-// ===========================================================================
-// Simply create a Ticket on the Xinha website and attach your translation 
-// file.
-//
-// The Xinha developers will take your file and use the 
-//     contrib/lc_split_merged_file.php
-// script to load it into the Xinha distribution.
-
-{
-    "Abbreviation": {
-        "Cancel": "Anuluj",
-        "Delete": "Usuń",
-        "OK": "OK"
-    },
-    "AboutBox": {
-        "About this editor": "Informacje o tym edytorze"
-    },
-    "BackgroundImage": {
-        "Cancel": "Anuluj"
-    },
-    "ColorPicker": {
-        "Color: ": "Kolor",
-        "OK": "OK"
-    },
-    "ContextMenu": {
-        "C_ell Properties...": "Właściwości komórki",
-        "Chec_k Link...": "Sprawdź odnośnik",
-        "Copy": "Kopiuj",
-        "Create a link": "Utwórz odnośnik",
-        "Current URL is": "Bieżący URL odnośnika",
-        "Cut": "Wytnij",
-        "De_lete Column": "Usuń kolumnę",
-        "Delete the current column": "Usuwa bieżącą kolumnę",
-        "Delete the current row": "Usuń bieżący wiersz",
-        "How did you get here? (Please report!)": "Jak tu trafiłeś (Proszę, podaj okoliczności!)",
-        "I_nsert Row Before": "Wstaw wiersz przed",
-        "In_sert Row After": "Wstaw wiersz po",
-        "Insert C_olumn After": "Wstaw kolumnę po",
-        "Insert _Column Before": "Wstaw kolumnę przed",
-        "Insert a new column after the current one": "Wstaw nową kolumnę po bieżącej",
-        "Insert a new column before the current one": "Wstaw nową kolumnę przed bieżącą",
-        "Insert a new row after the current one": "Wstaw nowy wiersz po bieżącym",
-        "Insert a new row before the current one": "Wstaw nowy wiersz przed bieżącym",
-        "Insert a paragraph after the current node": "Wstaw akapit po bieżącym elemencie",
-        "Insert a paragraph before the current node": "Wstaw akapit przed bieżącym elementem",
-        "Insert paragraph after": "Wstaw akapit po",
-        "Insert paragraph before": "Wstaw akapit przed",
-        "Justify Center": "Wycentruj",
-        "Justify Full": "Wyjustuj",
-        "Justify Left": "Wyrównaj do lewej",
-        "Justify Right": "Wyrównaj do prawej",
-        "Link points to:": "Odnośnik wskazuje na:",
-        "Make lin_k...": "Utwórz odnośnik",
-        "Opens this link in a new window": "Otwiera ten odnośnik w nowym oknie",
-        "Paste": "Wklej",
-        "Please confirm that you want to remove this element:": "Na pewno chcesz usunąć ten element?",
-        "Please confirm that you want to unlink this element.": "Na pewno chcesz usunąć odnośnik?",
-        "Remove the $elem Element...": "Usuń $elem...",
-        "Remove this node from the document": "Usuń ten element z dokumentu",
-        "Ro_w Properties...": "Właściwości wiersza",
-        "Show the Table Cell Properties dialog": "Pokaż okno właściwości komórki",
-        "Show the Table Properties dialog": "Pokaż okienko właściwości tabeli",
-        "Show the Table Row Properties dialog": "Pokaż okno właściwości wiersza",
-        "Show the image properties dialog": "Pokaż okienko właściwości obrazka",
-        "Unlink the current element": "Usuń odnośnik z zaznaczonego elementu",
-        "_Delete Row": "Usuń wiersz",
-        "_Image Properties...": "Właściwości obrazka",
-        "_Modify Link...": "Zmień odnośnik",
-        "_Remove Link...": "Usuń odnośnik",
-        "_Table Properties...": "Właściwości tabeli"
-    },
-    "CreateLink": {
-        "Are you sure you wish to remove this link?": "Na pewno chcesz usunąć odnośnik?",
-        "Cancel": "Anuluj",
-        "Insert/Modify Link": "Wstaw/edytuj odnośnik",
-        "New window (_blank)": "Nowe okno (_blank)",
-        "None (use implicit)": "Brak",
-        "OK": "OK",
-        "Other": "Inne",
-        "Same frame (_self)": "Ta sama ramka (_self)",
-        "Target:": "Okno docelowe:",
-        "Title (tooltip):": "Tytuł (tooltip):",
-        "Top frame (_top)": "Główna ramka (_top)",
-        "URL:": "URL:"
-    },
-    "EditTag": {
-        "Cancel": "Anuluj",
-        "OK": "OK"
-    },
-    "Equation": {
-        "Cancel": "Anuluj",
-        "OK": "OK",
-        "Preview": "Podgląd"
-    },
-    "ExtendedFileManager": {
-        "Absbottom": "Abs. dół",
-        "Absmiddle": "Abs. środek",
-        "Align": "Wyrównanie",
-        "Alt": "Alt",
-        "Baseline": "Linia bazowa",
-        "Border": "Ramka",
-        "Border Color": "Kolor ramki",
-        "Bottom": "Dół",
-        "Cancel": "Anuluj",
-        "Clear": "Wyczyść",
-        "Color": "Kolor",
-        "Constrain Proportions": "Zachowaj proporcje",
-        "Copy": "Kopiuj",
-        "Crop": "Przytnij",
-        "Cut": "Wytnij",
-        "Directory": "Katalog",
-        "Directory Up": "Katalog wyżej",
-        "Edit": "Edytuj",
-        "File Manager": "Menedżer plików",
-        "Filename:": "Nazwa pliku:",
-        "Flip Horizontal": "Odwróć poziomo",
-        "Flip Image": "Odwróć",
-        "Flip Vertical": "Odwróć pionowo",
-        "GIF format is not supported, image editing not supported.": "Brak obsługi plików GIF, edycja jest niemożliwa.",
-        "Height": "Wysokość",
-        "Height:": "Wysokość:",
-        "Insert File Link": "Wstaw odnośnik do pliku na serwerze",
-        "Invalid base directory:": "Nieprawidłowy katalog bazowy:",
-        "JPEG High": "JPEG wysoka",
-        "JPEG Low": "JPEG niska",
-        "JPEG Medium": "JPEG średnia",
-        "Left": "Do lewej",
-        "Loading": "Ładowanie",
-        "Lock": "Zablokuj",
-        "Margin": "Odstęp",
-        "Marker": "Zaznacz",
-        "Measure": "Zmierz",
-        "Middle": "Środek",
-        "New Folder": "Nowy katalog",
-        "New window (_blank)": "Nowe okno (_blank)",
-        "No Files Found": "Nie znaleziono plików",
-        "No Image Available": "Obrazek niedostępny",
-        "None (use implicit)": "Brak",
-        "Not set": "Nie ustawione",
-        "OK": "OK",
-        "Padding": "Wcięcie",
-        "Positioning of this image": "Wyrównanie tego obrazka na stronie",
-        "Preview": "Podgląd",
-        "Quality:": "Jakość",
-        "Refresh": "Odśwież",
-        "Rename": "Zmień nazwę",
-        "Resize": "Przeskaluj",
-        "Right": "Do prawej",
-        "Rotate": "Obróć",
-        "Rotate Image": "Obróć",
-        "Same frame (_self)": "Ta sama ramka (_self)",
-        "Save": "Zapisz",
-        "Start X:": "Początek X:",
-        "Start Y:": "Początek Y:",
-        "Target Window": "Docelowe okno",
-        "Texttop": "Góra tekstu",
-        "Title (tooltip)": "Tytuł",
-        "Top": "Góra",
-        "Top frame (_top)": "Główna ramka (_top)",
-        "Trash": "Usuń",
-        "Upload": "Wgraj",
-        "W:": "L:",
-        "Width": "Szerokość",
-        "Width:": "Szerokość:",
-        "You must select some text before making a new link.": "Zaznacz tekst przed dodaniem odnośnika."
-    },
-    "FindReplace": {
-        "Case sensitive search": "Wg wielkości liter",
-        "Clear": "Wyczyść",
-        "Done": "Gotowe",
-        "Enter the text you want to find": "Podaj tekst, jaki chcesz wyszukać",
-        "Find and Replace": "Znajdź i zamień",
-        "Highlight": "Podświetl",
-        "Inform a replacement word": "Podaj tekst do zamiany",
-        "Next": "Następny",
-        "Options": "Opcje",
-        "Replace with:": "Zamień na:",
-        "Search for:": "Szukaj:",
-        "Substitute all occurrences": "Zamień wszystkie wystąpienia",
-        "Substitute this occurrence?": "Zamienić to wystąpienie?",
-        "Undo": "Cofnij",
-        "Whole words only": "Całe słowa",
-        "found item": "znaleziony",
-        "found items": "znalezionych",
-        "not found": "nie znaleziony",
-        "replaced item": "zamieniony",
-        "replaced items": "zamienionych"
-    },
-    "Forms": {
-        "Cancel": "Anuluj",
-        "Image URL:": "URL obrazka:",
-        "Name": "Nazwa",
-        "OK": "OK",
-        "Options": "Opcje",
-        "Rows:": "Wierszy:",
-        "Size:": "Rozmiar:"
-    },
-    "FullPage": {
-        "Alternate style-sheet:": "Alternatywny arkusz stylów:",
-        "Background color:": "Kolor tła:",
-        "Cancel": "Anuluj",
-        "Character set:": "Zestaw znaków",
-        "DOCTYPE:": "DOCTYPE:",
-        "Description:": "Opis",
-        "Document properties": "Właściwości dokumentu",
-        "Document title:": "Tytuł dokumentu:",
-        "Keywords:": "Słowa kluczowe",
-        "OK": "OK",
-        "Primary style-sheet:": "Arkusz stylów:",
-        "Text color:": "Kolor tekstu:",
-        "UTF-8 (recommended)": "UTF-8 (zalecany)"
-    },
-    "FullScreen": {
-        "Maximize/Minimize Editor": "Maksymalizuj/minimalizuj edytor"
-    },
-    "HorizontalRule": {
-        "Alignment:": "Wyrównanie:",
-        "Cancel": "Anuluj",
-        "Center": "Środek",
-        "Color:": "Kolor:",
-        "Height:": "Wysokość:",
-        "Horizontal Rule": "Linia pozioma",
-        "Layout": "Layout",
-        "Left": "Do lewej",
-        "OK": "OK",
-        "Right": "Do prawej",
-        "Width:": "Szerokość:",
-        "percent": "%",
-        "pixels": "pikseli"
-    },
-    "ImageManager": {
-        "Absbottom": "Abs. dół",
-        "Absmiddle": "Abs. środek",
-        "Angle:": "Kąt:",
-        "Baseline": "Linia bazowa",
-        "Bottom": "Dół",
-        "Cancel": "Anuluj",
-        "Clear": "Wyczyść",
-        "Constrain Proportions": "Zachowaj proporcje",
-        "Crop": "Przytnij",
-        "Directory": "Katalog",
-        "Directory Up": "Katalog wyżej",
-        "Edit": "Edytuj",
-        "Filename:": "Nazwa pliku:",
-        "Flip Horizontal": "Odwróć poziomo",
-        "Flip Image": "Odwróć",
-        "Flip Vertical": "Odwróć pionowo",
-        "Folder Name:": "Nazwa katalogu",
-        "GIF format is not supported, image editing not supported.": "Brak obsługi plików GIF, edycja jest niemożliwa.",
-        "Height:": "Wysokość:",
-        "Image Format": "Format pliku:",
-        "Insert Image": "Wstaw obrazek",
-        "Invalid base directory:": "Nieprawidłowy katalog bazowy:",
-        "JPEG High": "JPEG wysoka",
-        "JPEG Low": "JPEG niska",
-        "JPEG Medium": "JPEG średnia",
-        "Left": "Do lewej",
-        "Lock": "Zablokuj",
-        "Marker": "Zaznacz",
-        "Measure": "Zmierz",
-        "Middle": "Środek",
-        "New Folder": "Nowy katalog",
-        "No Image Available": "Obrazek niedostępny",
-        "No Images Found": "Nie znaleziono obrazków",
-        "Not set": "Nie ustawione",
-        "OK": "OK",
-        "Positioning of this image": "Wyrównanie tego obrazka na stronie",
-        "Quality:": "Jakość",
-        "Refresh": "Odśwież",
-        "Resize": "Przeskaluj",
-        "Right": "Do prawej",
-        "Rotate": "Obróć",
-        "Rotate Image": "Obróć",
-        "Save": "Zapisz",
-        "Start X:": "Początek X",
-        "Start Y:": "Początek Y",
-        "Texttop": "Góra tekstu",
-        "Top": "Góra",
-        "Trash": "Usuń",
-        "W:": "L:",
-        "Width:": "Szerokość:"
-    },
-    "InlineStyler": {
-        "Background": "Tło",
-        "Baseline": "Linia bazowa",
-        "Border": "Ramka",
-        "Bottom": "Dół",
-        "CSS Style": "Styl CSS",
-        "Center": "Środek",
-        "Char": "Znak",
-        "Collapsed borders": "Ramki skolapsowane",
-        "FG Color": "Kolor czcionek",
-        "Float": "Opływanie",
-        "Height": "Wysokość",
-        "Image URL": "URL obrazka",
-        "Justify": "Wyjustuj",
-        "Layout": "Layout",
-        "Left": "Do lewej",
-        "Margin": "Odstęp",
-        "Middle": "Środek",
-        "None": "Brak",
-        "Padding": "Wcięcia",
-        "Right": "Do prawej",
-        "Text align": "Wyr. w poziomie",
-        "Top": "Góra",
-        "Vertical align": "Wyr. w pionie",
-        "Width": "Szerokość",
-        "percent": "%",
-        "pixels": "pikseli"
-    },
-    "InsertAnchor": {
-        "Anchor name": "Nazwa kotwicy",
-        "Cancel": "Anuluj",
-        "Delete": "Usuń",
-        "Insert Anchor": "Wstaw kotwicę",
-        "OK": "OK"
-    },
-    "InsertImage": {
-        "Absbottom": "Abs. dół",
-        "Absmiddle": "Abs. środek",
-        "Alignment:": "Wyrównanie:",
-        "Alternate text:": "Tekst alternatywny:",
-        "Baseline": "Linia bazowa",
-        "Border thickness:": "Grubość obramowania:",
-        "Bottom": "Dół",
-        "Cancel": "Anuluj",
-        "Enter the image URL here": "Podaj URL obrazka",
-        "For browsers that don't support images": "Dla przeglądarek, które nie obsługują obrazków",
-        "Horizontal padding": "Wcięcie poziome",
-        "Horizontal:": "Poziome:",
-        "Image Preview:": "Podgląd obrazka:",
-        "Image URL:": "URL obrazka:",
-        "Insert Image": "Wstaw obrazek",
-        "Layout": "Layout",
-        "Leave empty for no border": "Bez ramek - zostaw puste",
-        "Left": "Do lewej",
-        "Middle": "Środek",
-        "Not set": "Nie ustawione",
-        "OK": "OK",
-        "Positioning of this image": "Wyrównanie tego obrazka na stronie",
-        "Preview": "Podgląd",
-        "Preview the image in a new window": "Podgląd obrazka w nowym oknie",
-        "Right": "Do prawej",
-        "Spacing": "Odstęp",
-        "Texttop": "Góra tekstu",
-        "Top": "Góra",
-        "Vertical padding": "Wcięcie pionowe",
-        "Vertical:": "Pionowe:"
-    },
-    "InsertMarquee": {
-        "Cancel": "Anuluj",
-        "Height:": "Wysokość:",
-        "Left": "Do lewej",
-        "Name": "Nazwa",
-        "OK": "OK",
-        "Right": "Do prawej",
-        "Width:": "Szerokość:"
-    },
-    "InsertNote": {
-        "Cancel": "Anuluj"
-    },
-    "InsertPicture": {
-        "Absbottom": "Abs. dół",
-        "Absmiddle": "Abs. środek",
-        "Alignment:": "Wyrównanie:",
-        "Alternate text:": "Tekst alternatywny:",
-        "Baseline": "Linia bazowa",
-        "Border thickness:": "Grubość obramowania:",
-        "Bottom": "Dół",
-        "Cancel": "Anuluj",
-        "Enter the image URL here": "Podaj URL obrazka",
-        "For browsers that don't support images": "Dla przeglądarek, które nie obsługują obrazków",
-        "Height:": "Wysokość:",
-        "Horizontal padding": "Wcięcie poziome",
-        "Horizontal:": "Poziome:",
-        "Image Preview:": "Podgląd obrazka:",
-        "Image URL:": "URL obrazka:",
-        "Insert Image": "Wstaw obrazek",
-        "Layout": "Layout",
-        "Leave empty for no border": "Bez ramek - zostaw puste",
-        "Left": "Do lewej",
-        "Middle": "Środek",
-        "Not set": "Nie ustawione",
-        "OK": "OK",
-        "Positioning of this image": "Wyrównanie tego obrazka na stronie",
-        "Preview": "Podgląd",
-        "Preview the image in a new window": "Podgląd obrazka w nowym oknie",
-        "Right": "Do prawej",
-        "Size": "Rozmiar",
-        "Spacing": "Odstęp",
-        "Texttop": "Góra tekstu",
-        "Top": "Góra",
-        "Vertical padding": "Wcięcie pionowe",
-        "Vertical:": "Pionowe:",
-        "Width:": "Szerokość:"
-    },
-    "InsertSnippet": {
-        "Cancel": "Anuluj"
-    },
-    "InsertSnippet2": {
-        "Cancel": "Anuluj"
-    },
-    "InsertTable": {
-        "Absbottom": "Abs. dół",
-        "Absmiddle": "Abs. środek",
-        "Alignment:": "Wyrównanie:",
-        "Baseline": "Linia bazowa",
-        "Border": "Ramka",
-        "Border thickness:": "Grubość obramowania:",
-        "Bottom": "Dół",
-        "Cancel": "Anuluj",
-        "Caption": "Podpis",
-        "Cell padding:": "Wcięcie komórek:",
-        "Cell spacing:": "Odstęp komórek:",
-        "Cols:": "Kolumn:",
-        "Em": "Em",
-        "Fixed width columns": "Kolumny o stałej szerokości",
-        "Insert Table": "Wstaw tabelę",
-        "Layout": "Layout",
-        "Leave empty for no border": "Bez ramek - zostaw puste",
-        "Left": "Do lewej",
-        "Middle": "Środek",
-        "Not set": "Nie ustawione",
-        "Number of columns": "Liczba kolumn",
-        "Number of rows": "Liczba wierszy",
-        "OK": "OK",
-        "Percent": "Procent",
-        "Pixels": "Pikseli",
-        "Positioning of this table": "Pozycjonowanie tabeli",
-        "Right": "Do prawej",
-        "Rows:": "Wierszy:",
-        "Space between adjacent cells": "Przestrzeń pomiędzy komórkami",
-        "Space between content and border in cell": "Przestrzeń między krawędzią a zawartością komórki",
-        "Spacing": "Odstęp",
-        "Texttop": "Góra tekstu",
-        "Top": "Góra",
-        "Width of the table": "Szerokość tabeli",
-        "Width unit": "Jednostka",
-        "Width:": "Szerokość:"
-    },
-    "Linker": {
-        "Are you sure you wish to remove this link?": "Na pewno chcesz usunąć odnośnik?",
-        "Cancel": "Anuluj",
-        "Email Address:": "Adres e-mail",
-        "Email Link": "Link do e-maila",
-        "Insert/Modify Link": "Wstaw/edytuj odnośnik",
-        "Message Template:": "Szablon wiadmości:",
-        "Name:": "Nazwa:",
-        "New Window": "Nowe okno",
-        "OK": "OK",
-        "Ordinary Link": "Zwykły odnośnik",
-        "Popup Window": "Okienko pop-up",
-        "Remove Link": "USUŃ ODNOŚNIK",
-        "Same Window (jump out of frames)": "To samo okno (wyskocz z ramek)",
-        "Size:": "Rozmiar:",
-        "Subject:": "Temat:",
-        "Target:": "Okno docelowe:",
-        "URL Link": "Adres URL",
-        "URL:": "URL:",
-        "You must select some text before making a new link.": "Zaznacz tekst przed dodaniem odnośnika."
-    },
-    "ListType": {
-        "Choose list style type (for ordered lists)": "Wybierz typ listy numerowanej",
-        "Decimal numbers": "Cyfry arabskie",
-        "Lower greek letters": "Małe litery greckie",
-        "Lower latin letters": "Małe litery",
-        "Lower roman numbers": "Małe rzymskie",
-        "Upper latin letters": "Duże litery",
-        "Upper roman numbers": "Duże rzymskie"
-    },
-    "MootoolsFileManager": {
-        "Insert File Link": "Wstaw odnośnik do pliku na serwerze",
-        "You must select some text before making a new link.": "Zaznacz tekst przed dodaniem odnośnika."
-    },
-    "NoteServer": {
-        "Cancel": "Anuluj",
-        "Image Preview": "Podgląd obrazka:",
-        "OK": "OK",
-        "Options": "Opcje",
-        "Preview": "Podgląd",
-        "Preview the image in a new window": "Podgląd obrazka w nowym oknie"
-    },
-    "Opera": {
-        "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."
-    },
-    "PSLocal": {
-        "Cancel": "Anuluj"
-    },
-    "PasteText": {
-        "Cancel": "Anuluj",
-        "OK": "OK",
-        "Paste as Plain Text": "Wklej jako czysty tekst"
-    },
-    "PersistentStorage": {
-        "Cancel": "Anuluj",
-        "Copy": "Kopiuj",
-        "Delete": "Usuń",
-        "Directory Up": "Katalog wyżej",
-        "File Manager": "Menedżer plików",
-        "Filename": "Nazwa pliku:",
-        "Insert Image": "Wstaw obrazek",
-        "New Folder": "Nowy katalog",
-        "Save": "Zapisz",
-        "You must select some text before making a new link.": "Zaznacz tekst przed dodaniem odnośnika."
-    },
-    "QuickTag": {
-        "ATTRIBUTES": "ATRYBUTY",
-        "Cancel": "Anuluj",
-        "Colors": "Kolory",
-        "Enter the TAG you want to insert": "Podaj TAG, który chcesz wstawić",
-        "No CSS class avaiable": "Brak dostępnych klas CSS",
-        "OPTIONS": "OPCJE",
-        "Ok": "Ok",
-        "Quick Tag Editor": "Edytor Quick Tag",
-        "TAGs": "TAGi",
-        "There are some unclosed quote": "Są jakieś niezamknięte cudzysłowia",
-        "This attribute already exists in the TAG": "TAG posiada już ten atrybut",
-        "You have to select some text": "Musisz zaznaczyć tekst."
-    },
-    "SaveSubmit": {
-        "Save": "Zapisz"
-    },
-    "SetId": {
-        "Cancel": "Anuluj",
-        "Delete": "Usuń",
-        "OK": "OK"
-    },
-    "SmartReplace": {
-        "OK": "OK"
-    },
-    "SpellChecker": {
-        "Cancel": "Anuluj",
-        "OK": "OK",
-        "Replace with": "Zamień na:"
-    },
-    "Stylist": {
-        "Styles": "Style"
-    },
-    "SuperClean": {
-        "Cancel": "Anuluj",
-        "OK": "OK"
-    },
-    "TableOperations": {
-        "All four sides": "Wszystkie 4 strony",
-        "Borders": "Ramki",
-        "Cancel": "Anuluj",
-        "Caption": "Podpis",
-        "Cell Properties": "Właściwości komórki",
-        "Cell properties": "Właściwości komórki",
-        "Delete cell": "Usuń komórkę",
-        "Delete column": "Usuń kolumnę",
-        "Delete row": "Usuń wiersz",
-        "Description": "Opis",
-        "Frame and borders": "Obramowania",
-        "Frames": "Ramki zewn.",
-        "Insert cell after": "Wstaw komórkę po",
-        "Insert cell before": "Wstaw komórkę przed",
-        "Insert column after": "Wstaw kolumnę po",
-        "Insert column before": "Wstaw kolumnę przed",
-        "Insert row after": "Wstaw wiersz po",
-        "Insert row before": "Wstaw wiersz przed",
-        "Merge cells": "Scal komórki",
-        "No rules": "Bez wewnętrzych",
-        "No sides": "Bez ramek",
-        "OK": "OK",
-        "Padding": "Wcięcia",
-        "Please click into some cell": "Kliknij w jakąś komórkę",
-        "Row Properties": "Właściwości wiersza",
-        "Row properties": "Właściwości wiersza",
-        "Rows": "Wierszy:",
-        "Rules will appear between all rows and columns": "Linie będą widoczne pomiędzy kolumnami i wierszami",
-        "Rules will appear between columns only": "Linie będą widoczne tylko pomiędzy kolumnami",
-        "Rules will appear between rows only": "Linie będą widoczne tylko pomiędzy wierszami",
-        "Spacing": "Odstęp",
-        "Spacing and padding": "Spacjowanie",
-        "Split column": "Rozdziel kolumnę",
-        "Split row": "Rozdziel wiersz",
-        "Summary": "Podsumowanie",
-        "Table Properties": "Właściwości tabeli",
-        "Table properties": "Właściwości tabeli",
-        "The bottom side only": "Tylko dolna linia",
-        "The left-hand side only": "Tylko lewa linia",
-        "The right and left sides only": "Lewa i prawa linia",
-        "The right-hand side only": "Tylko prawa linia",
-        "The top and bottom sides only": "Górna i dolna linia",
-        "The top side only": "Tylko górna linia",
-        "Xinha cowardly refuses to delete the last cell in row.": "Nie możesz skasować ostatniej komórki w wierszu.",
-        "Xinha cowardly refuses to delete the last column in table.": "Nie możesz skasować ostatniej kolumny w tabeli.",
-        "Xinha cowardly refuses to delete the last row in table.": "Nie możesz skasować ostatniego wiersza w tabeli.",
-        "pixels": "pikseli"
-    },
-    "Template": {
-        "Cancel": "Anuluj"
-    },
-    "UnFormat": {
-        "Cancel": "Anuluj",
-        "OK": "OK"
-    },
-    "Xinha": {
-        "&#8212; format &#8212;": "&#8212; Format &#8212;",
-        "About this editor": "Informacje o tym edytorze",
-        "Address": "Adres",
-        "Background Color": "Kolor tła",
-        "Bold": "Pogrubienie",
-        "Bulleted List": "Wypunktowanie",
-        "Clear Inline Font Specifications": "Wycisz bezpośrednie przypisania czcionek",
-        "Clear MSOffice tags": "Wyczyść tagi MSOffice",
-        "Copy selection": "Kopiuje zaznaczenie do schowka",
-        "Current style": "Obecny styl",
-        "Cut selection": "Wycina zaznaczenie do schowka",
-        "Decrease Indent": "Zmniejsz wcięcie",
-        "Direction left to right": "Kierunek tekstu lewo-prawo",
-        "Direction right to left": "Kierunek tekstu prawo-lewo",
-        "Font Color": "Kolor czcionki",
-        "Formatted": "Preformatowany",
-        "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",
-        "Help using editor": "Pomoc",
-        "Horizontal Rule": "Linia pozioma",
-        "Increase Indent": "Zwiększ wcięcie",
-        "Insert Table": "Wstaw tabelę",
-        "Insert Web Link": "Wstaw adres sieci Web",
-        "Insert/Modify Image": "Wstaw obraz",
-        "Italic": "Pochylenie",
-        "Justify Center": "Wyśrodkuj",
-        "Justify Full": "Wyjustuj",
-        "Justify Left": "Wyrównaj do lewej",
-        "Justify Right": "Wyrównaj do prawej",
-        "Normal": "Normalny",
-        "Ordered List": "Numerowanie",
-        "Paste from clipboard": "Wkleja zawartość schowka",
-        "Path": "Ścieżka",
-        "Print document": "Drukuj dokument",
-        "Redoes your last action": "Ponawia ostatnio wykonane polecenie",
-        "Remove formatting": "Usuń formatowanie",
-        "Select all": "Zaznacz wszystko",
-        "Split Block": "Podziel blok",
-        "Strikethrough": "Przekreślenie",
-        "Subscript": "Indeks dolny",
-        "Superscript": "Indeks górny",
-        "Toggle Borders": "Włącz / wyłącz ramki",
-        "Toggle HTML Source": "Edycja WYSIWYG/w źródle strony",
-        "Underline": "Podkreślenie",
-        "Undoes your last action": "Cofa ostatnio wykonane polecenie",
-        "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."
-    },
-    "__NEW_TRANSLATIONS__": {
-        "Abbreviation": {
-            "Abbreviation": "",
-            "Expansion:": ""
-        },
-        "AboutBox": {
-            "Close": "<<Xinha>>"
-        },
-        "CharCounter": {
-            "... in progress": "",
-            "Chars": "",
-            "HTML": "",
-            "Words": ""
-        },
-        "CharacterMap": {
-            "Insert special character": ""
-        },
-        "ColorPicker": {
-            "Click a color...": "",
-            "Sample": "",
-            "Web Safe: ": "",
-            "Close": "<<Xinha>>"
-        },
-        "ContextMenu": {
-            "Delete Cell": "",
-            "Insert Cell After": "",
-            "Insert Cell Before": "",
-            "Merge Cells": ""
-        },
-        "CreateLink": {
-            "You need to select some text before creating a link": ""
-        },
-        "DefinitionList": {
-            "definition description": "",
-            "definition list": "",
-            "definition term": ""
-        },
-        "Dialogs": {
-            "Some Text Here": ""
-        },
-        "DynamicCSS": {
-            "Choose stylesheet": "",
-            "Default": "",
-            "Undefined": ""
-        },
-        "EditTag": {
-            "Edit HTML for selected text": "",
-            "Edit Tag By Peg": "",
-            "Tag Editor": ""
-        },
-        "Equation": {
-            "!=": "",
-            "!in": "",
-            "&gt;-": "",
-            "&gt;=": "",
-            "&lt;=": "",
-            "&lt;=&gt;": "",
-            "&lt;x&gt;": "",
-            "&nbsp; `!` &nbsp;": "",
-            "&nbsp; `.` &nbsp;": "",
-            "&nbsp; `0` &nbsp;": "",
-            "&nbsp; `2` &nbsp;": "",
-            "&nbsp; `3` &nbsp;": "",
-            "&nbsp; `4` &nbsp;": "",
-            "&nbsp; `5` &nbsp;": "",
-            "&nbsp; `6` &nbsp;": "",
-            "&nbsp; `7` &nbsp;": "",
-            "&nbsp; `8` &nbsp;": "",
-            "&nbsp; `9` &nbsp;": "",
-            "&nbsp; `e` &nbsp;": "",
-            "&nbsp;&nbsp;`1` &nbsp;": "",
-            "&nbsp;`+{::}`&nbsp;": "",
-            "&nbsp;`-:\\ `": "",
-            "&nbsp;`-{::}`&nbsp;": "",
-            "&nbsp;`C`&nbsp;": "",
-            "&nbsp;`cos`": "",
-            "&nbsp;`ln`&nbsp;": "",
-            "&nbsp;`pi` &nbsp;": "",
-            "&nbsp;`sin`": "",
-            "&nbsp;`tan`": "",
-            "&nbsp;`times`&nbsp;": "",
-            "&quot;text&quot;": "",
-            "'+formula+'": "",
-            "((n),(k))": "",
-            "(x+1)/(x-1)": "",
-            "*": "",
-            "**": "",
-            "+-": "",
-            "-&gt;": "",
-            "-&lt;": "",
-            "-:": "",
-            "-=": "",
-            "//": "",
-            "/_": "",
-            ":.": "",
-            "=&gt;": "",
-            "@": "",
-            "[[a,b],[c,d]]": "",
-            "\\\\": "",
-            "\\nClick in the box to use your keyboard or use the buttons\\n": "",
-            "^^": "",
-            "^^^": "",
-            "__|": "",
-            "_|_": "",
-            "`!=`": "",
-            "`!in`": "",
-            "`&and;`": "",
-            "`&cap;`": "",
-            "`&cup;`": "",
-            "`&gt;-`": "",
-            "`&gt;=`": "",
-            "`&lt;=&gt;`": "",
-            "`&lt;=`": "",
-            "`&lt;x&gt;`": "",
-            "`&or;`": "",
-            "`&quot;text&quot;`": "",
-            "`((n),(k))`": "",
-            "`(x+1)/(x-1)`": "",
-            "`**`": "",
-            "`*`": "",
-            "`+-`": "",
-            "`-&gt;`": "",
-            "`-&lt;`": "",
-            "`-:`": "",
-            "`-=`": "",
-            "`//`": "",
-            "`/_`": "",
-            "`:.`": "",
-            "`=&gt;`": "",
-            "`@`": "",
-            "`[[a,b],[c,d]]`": "",
-            "`\\\\`": "",
-            "`__|`": "",
-            "`_|_`": "",
-            "`AA`": "",
-            "`aleph`": "",
-            "`alpha`": "",
-            "`and`": "",
-            "`bara`": "",
-            "`bba`": "",
-            "`bbba`": "",
-            "`beta`": "",
-            "`CC`": "",
-            "`cca`": "",
-            "`chi`": "",
-            "`darr`": "",
-            "`ddota`": "",
-            "`del`": "",
-            "`Delta`": "",
-            "`delta`": "",
-            "`diamond`": "",
-            "`dota`": "",
-            "`dy/dx`": "",
-            "`EE`": "",
-            "`epsi`": "",
-            "`eta`": "",
-            "`fra`": "",
-            "`Gamma`": "",
-            "`gamma`": "",
-            "`grad`": "",
-            "`harr`": "",
-            "`hArr`": "",
-            "`hata`": "",
-            "`if`": "",
-            "`in`": "",
-            "`int`": "",
-            "`iota`": "",
-            "`kappa`": "",
-            "`lambda`": "",
-            "`Lambda`": "",
-            "`lArr`": "",
-            "`larr`": "",
-            "`lim_(x-&gt;oo)`": "",
-            "`log`": "",
-            "`mu`": "",
-            "`NN`": "",
-            "`nn`": "",
-            "`not`": "",
-            "`nu`": "",
-            "`o+`": "",
-            "`o.`": "",
-            "`O/`": "",
-            "`oint`": "",
-            "`omega`": "",
-            "`Omega`": "",
-            "`oo`": "",
-            "`or`": "",
-            "`ox`": "",
-            "`Phi`": "",
-            "`phi`": "",
-            "`Pi`": "",
-            "`pi`": "",
-            "`prod`": "",
-            "`prop`": "",
-            "`Psi`": "",
-            "`psi`": "",
-            "`QQ`": "",
-            "`quad`": "",
-            "`rArr`": "",
-            "`rho`": "",
-            "`root(n)(x)`": "",
-            "`RR`": "",
-            "`sfa`": "",
-            "`sigma`": "",
-            "`Sigma`": "",
-            "`sqrt(x)`": "",
-            "`square`": "",
-            "`stackrel(-&gt;)(+)`": "",
-            "`sub`": "",
-            "`sube`": "",
-            "`sum`": "",
-            "`sup`": "",
-            "`supe`": "",
-            "`tau`": "",
-            "`Theta`": "",
-            "`theta`": "",
-            "`TT`": "",
-            "`tta`": "",
-            "`uarr`": "",
-            "`ula`": "",
-            "`upsilon`": "",
-            "`uu`": "",
-            "`veca`": "",
-            "`vv`": "",
-            "`x_(mn)`": "",
-            "`Xi`": "",
-            "`xi`": "",
-            "`xx`": "",
-            "`zeta`": "",
-            "`ZZ`": "",
-            "`|-&gt;`": "",
-            "`|--`": "",
-            "`|==`": "",
-            "`|__`": "",
-            "`|~`": "",
-            "`~=`": "",
-            "`~|`": "",
-            "`~~`": "",
-            "AA": "",
-            "aleph": "",
-            "alpha": "",
-            "and": "",
-            "AsciiMath Formula Input": "",
-            "AsciiMathML Example": "",
-            "bara": "",
-            "Based on ASCIIMathML by": "",
-            "bba": "",
-            "bbba": "",
-            "beta": "",
-            "CC": "",
-            "cca": "",
-            "chi": "",
-            "darr": "",
-            "ddota": "",
-            "del": "",
-            "Delta": "",
-            "delta": "",
-            "diamond": "",
-            "dota": "",
-            "dy/dx": "",
-            "EE": "",
-            "epsi": "",
-            "eta": "",
-            "For more information on AsciiMathML visit this page:": "",
-            "Formula Editor": "",
-            "fra": "",
-            "gamma": "",
-            "Gamma": "",
-            "grad": "",
-            "hArr": "",
-            "harr": "",
-            "hata": "",
-            "if": "",
-            "in": "",
-            "Input": "",
-            "int": "",
-            "int_a^bf(x)dx": "",
-            "iota": "",
-            "kappa": "",
-            "Lambda": "",
-            "lambda": "",
-            "larr": "",
-            "lArr": "",
-            "lim_(x-&gt;oo)": "",
-            "mu": "",
-            "NN": "",
-            "nn": "",
-            "nnn": "",
-            "not": "",
-            "nu": "",
-            "o+": "",
-            "o.": "",
-            "O/": "",
-            "oint": "",
-            "omega": "",
-            "Omega": "",
-            "oo": "",
-            "or": "",
-            "ox": "",
-            "Phi": "",
-            "phi": "",
-            "pi": "",
-            "Pi": "",
-            "prod": "",
-            "prop": "",
-            "psi": "",
-            "Psi": "",
-            "QQ": "",
-            "quad": "",
-            "rArr": "",
-            "rho": "",
-            "root(n)(x)": "",
-            "RR": "",
-            "sfa": "",
-            "sigma": "",
-            "Sigma": "",
-            "sqrt(x)": "",
-            "square": "",
-            "stackrel(-&gt;)(+)": "",
-            "sub": "",
-            "sube": "",
-            "sum": "",
-            "sum_(n=1)^oo": "",
-            "sup": "",
-            "supe": "",
-            "tau": "",
-            "Theta": "",
-            "theta": "",
-            "TT": "",
-            "tta": "",
-            "uarr": "",
-            "ula": "",
-            "upsilon": "",
-            "uu": "",
-            "uuu": "",
-            "veca": "",
-            "vv": "",
-            "vvv": "",
-            "x^(m+n)": "",
-            "x_(mn)": "",
-            "Xi": "",
-            "xi": "",
-            "xx": "",
-            "zeta": "",
-            "ZZ": "",
-            "|-&gt;": "",
-            "|--": "",
-            "|==": "",
-            "|__": "",
-            "|~": "",
-            "~=": "",
-            "~|": "",
-            "~~": ""
-        },
-        "FancySelects": {
-            "'+opt.text+'": ""
-        },
-        "FindReplace": {
-            "';\r\n  var tagc = '": ""
-        },
-        "FormOperations": {
-            "Enter the name for new option.": "",
-            "Form Editor": "",
-            "Insert a check box.": "",
-            "Insert a Form.": "",
-            "Insert a multi-line text field.": "",
-            "Insert a radio button.": "",
-            "Insert a select field.": "",
-            "Insert a submit/reset button.": "",
-            "Insert a text, password or hidden field.": "",
-            "Message Sent": "",
-            "Please Select...": ""
-        },
-        "Forms": {
-            "'onClick'=": "",
-            "Access Key:": "",
-            "Action URL:": "",
-            "Button Script": "",
-            "Checked": "",
-            "Columns:": "",
-            "Default text (optional)": "",
-            "Dimensions": "",
-            "Disabled": "",
-            "Encoding:": "",
-            "For Control:": "",
-            "Form": "",
-            "Form Element: FIELDSET": "",
-            "Form Element: INPUT": "",
-            "Form Element: LABEL": "",
-            "Form Element: SELECT": "",
-            "Form Element: TEXTAREA": "",
-            "Form handler script": "",
-            "Form Name:": "",
-            "Get": "",
-            "Hard": "",
-            "Height in number of rows": "",
-            "HTML-Form to CGI (default)": "",
-            "Image source": "",
-            "Initial Text:": "",
-            "Insert/Edit Form": "",
-            "Insert/Edit Form Element FIELDSET": "",
-            "Insert/Edit Form Element INPUT": "",
-            "Insert/Edit Form Element LABEL": "",
-            "Insert/Edit Form Element SELECT": "",
-            "Insert/Edit Form Element TEXTAREA": "",
-            "Javascript for button click": "",
-            "Label:": "",
-            "Legend:": "",
-            "Max length:": "",
-            "Maximum number of characters accepted": "",
-            "Method:": "",
-            "multipart Form Data (File-Upload)": "",
-            "Name of the form input": "",
-            "Name of the form select": "",
-            "name of the textarea": "",
-            "Name/ID:": "",
-            "normal": "",
-            "nowrap": "",
-            "Off": "",
-            "Physical": "",
-            "Please enter a Label": "",
-            "Post": "",
-            "pre": "",
-            "Read Only": "",
-            "Size of text box in characters": "",
-            "Soft": "",
-            "Tab Index:": "",
-            "Target Frame:": "",
-            "Text:": "",
-            "URL of image": "",
-            "Value of the form input": "",
-            "Value:": "",
-            "Virtual": "",
-            "Width in number of characters": "",
-            "Wrap Mode:": "",
-            "You must enter a Name": ""
-        },
-        "FullPage": {
-            "...": "",
-            "cyrillic (ISO-8859-5)": "",
-            "cyrillic (KOI8-R)": "",
-            "cyrillic (WINDOWS-1251)": "",
-            "western (ISO-8859-1)": ""
-        },
-        "Gecko": {
-            "The Paste button does not work in this browser for security reasons. Press CTRL-V on your keyboard to paste directly.": ""
-        },
-        "HorizontalRule": {
-            "&#x00d7;": "",
-            "&nbsp;": "",
-            "Insert/edit horizontal rule": "",
-            "Insert/Edit Horizontal Rule": "",
-            "No shading": "",
-            "Style": ""
-        },
-        "InlineStyler": {
-            "-": "<<Equation>>"
-        },
-        "InsertImage": {
-            "You must enter the URL": ""
-        },
-        "InsertNote": {
-            "Insert": "",
-            "Insert footnote": "",
-            "Insert Note": ""
-        },
-        "InsertPagebreak": {
-            "Page break": "",
-            "Page Break": ""
-        },
-        "InsertSmiley": {
-            "Insert Smiley": ""
-        },
-        "InsertSnippet": {
-            "\\n  This is an information about something\\n": "",
-            "Hide preview": "",
-            "Insert as": "",
-            "Insert Snippet": "",
-            "InsertSnippet for Xinha": "",
-            "Link1": "",
-            "Link2": "",
-            "Link3": "",
-            "Link4": "",
-            "Link5": "",
-            "Show preview": "",
-            "This is an information about something": "",
-            "Variable": ""
-        },
-        "InsertSnippet2": {
-            "All Categories": "",
-            "Filter": "",
-            "Insert as HTML": "",
-            "Insert as template variable": "",
-            "Only search word beginning": "",
-            "HTML": "<<CharCounter>>",
-            "Insert Snippet": "<<InsertSnippet>>",
-            "InsertSnippet for Xinha": "<<InsertSnippet>>",
-            "Variable": "<<InsertSnippet>>"
-        },
-        "InsertTable": {
-            "Caption for the table": "",
-            "Collapse borders:": "",
-            "Layou": "",
-            "Style of the border": "",
-            "You must enter a number of columns": "",
-            "You must enter a number of rows": ""
-        },
-        "LangMarks": {
-            "&mdash; language &mdash;": "",
-            "', '": "",
-            "English": "",
-            "French": "",
-            "Greek": "",
-            "language select": "",
-            "Latin": ""
-        },
-        "Linker": {
-            "(px)": "",
-            "Anchor-Link": "",
-            "Anchor:": "",
-            "Location Bar:": "",
-            "Menu Bar:": "",
-            "PopupWindow": "",
-            "Resizeable:": "",
-            "Scrollbars:": "",
-            "Shows On Hover": "",
-            "Status Bar:": "",
-            "Title:": "",
-            "Toolbar:": ""
-        },
-        "Opera": {
-            "MARK": ""
-        },
-        "PasteText": {
-            "Insert text in new paragraph": ""
-        },
-        "PreserveScripts": {
-            "JavaScript": "",
-            "PHP": ""
-        },
-        "QuickTag": {
-            "',\r\n                           'cl': '": ""
-        },
-        "SaveSubmit": {
-            "in progress": "",
-            "Ready": "",
-            "Saving...": ""
-        },
-        "SetId": {
-            "ID/Name:": "",
-            "Set Id and Name": "",
-            "Set Id/Name": "",
-            "Set ID/Name": ""
-        },
-        "SmartReplace": {
-            "ClosingDoubleQuotes": "",
-            "ClosingSingleQuote": "",
-            "Convert all quotes and dashes in the current document": "",
-            "Enable automatic replacements": "",
-            "OpeningDoubleQuotes": "",
-            "OpeningSingleQuote": "",
-            "SmartReplace": "",
-            "SmartReplace Settings": ""
-        },
-        "SuperClean": {
-            "Clean bad HTML from Microsoft Word.": "",
-            "Clean Selection Only": "",
-            "Clean up HTML": "",
-            "Cleaning Scope": "",
-            "General tidy up and correction of some problems.": "",
-            "Please select from the following cleaning options...": "",
-            "Please stand by while cleaning in process...": "",
-            "Remove alignment (left/right/justify).": "",
-            "Remove all classes (CSS).": "",
-            "Remove All HTML Tags": "",
-            "Remove all styles (CSS).": "",
-            "Remove custom font sizes.": "",
-            "Remove custom text colors.": "",
-            "Remove custom typefaces (font \"styles\").": "",
-            "Remove emphasis and annotations.": "",
-            "Remove lang attributes.": "",
-            "Remove Paragraphs": "",
-            "Remove superscripts and subscripts.": "",
-            "Replace directional quote marks with non-directional quote marks.": "",
-            "Vigorously purge HTML from Microsoft Word.": ""
-        },
-        "TableOperations": {
-            "Cell Type:": "",
-            "Cells down": "",
-            "Cells to the right, and": "",
-            "Do Not Change": "",
-            "Header (th)": "",
-            "Merge current cell with:": "",
-            "Normal (td)": "",
-            "Columns": "<<Forms>>",
-            "Merge Cells": "<<ContextMenu>>"
-        },
-        "UnsavedChanges": {
-            "You have unsaved changes in the editor": ""
-        },
-        "WebKit": {
-            "The Paste button does not work in this browser for security reasons. Press CTRL-V on your keyboard to paste directly.": "<<Gecko>>"
-        },
-        "Xinha": {
-            "&#8212; font &#8212;": "",
-            "&#8212; size &#8212;": "",
-            "1 (8 pt)": "",
-            "2 (10 pt)": "",
-            "3 (12 pt)": "",
-            "4 (14 pt)": "",
-            "5 (18 pt)": "",
-            "6 (24 pt)": "",
-            "7 (36 pt)": "",
-            "Arial": "",
-            "Clean content pasted from Word": "",
-            "Close": "",
-            "Constructing object": "",
-            "Courier New": "",
-            "Create Statusbar": "",
-            "Create Toolbar": "",
-            "CTRL-0 (zero)": "",
-            "CTRL-1 .. CTRL-6": "",
-            "CTRL-A": "",
-            "CTRL-B": "",
-            "CTRL-C": "",
-            "CTRL-E": "",
-            "CTRL-I": "",
-            "CTRL-J": "",
-            "CTRL-L": "",
-            "CTRL-N": "",
-            "CTRL-R": "",
-            "CTRL-S": "",
-            "CTRL-U": "",
-            "CTRL-V": "",
-            "CTRL-X": "",
-            "CTRL-Y": "",
-            "CTRL-Z": "",
-            "Editor Help": "",
-            "ENTER": "",
-            "Error Loading Xinha.  Developers, check the Error Console for information.": "",
-            "Finishing": "",
-            "Generate Xinha framework": "",
-            "Georgia": "",
-            "Headings": "",
-            "Impact": "",
-            "Init editor size": "",
-            "insert linebreak": "",
-            "Insert/Overwrite": "",
-            "Keyboard shortcuts": "",
-            "Loading Core": "",
-            "Loading in progress. Please wait!": "",
-            "Loading plugin $plugin": "",
-            "Loading plugins": "",
-            "MS Word Cleaner": "",
-            "new paragraph": "",
-            "Register plugin $plugin": "",
-            "Save as": "",
-            "Select Color": "",
-            "Set format to paragraph": "",
-            "SHIFT-ENTER": "",
-            "Tahoma": "",
-            "The editor provides the following key combinations:": "",
-            "Times New Roman": "",
-            "Touch here first to activate editor.": "",
-            "Verdana": "",
-            "Waiting for Iframe to load...": "",
-            "WingDings": "",
-            "Would you like to clear font colours?": "",
-            "Would you like to clear font sizes?": "",
-            "Would you like to clear font typefaces?": "",
-            "Xinha": ""
-        },
-        "BackgroundImage": {
-            "__ TRANSLATOR NOTE __": "*** BACKGROUNDIMAGE IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***",
-            "Remove Current Background": "",
-            "Set Background": "",
-            "Set page background image": "",
-            "Set Page Background Image": ""
-        },
-        "ClientsideSpellcheck": {
-            "__ TRANSLATOR NOTE __": "*** CLIENTSIDESPELLCHECK IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***",
-            "Spell Check using ieSpell": ""
-        },
-        "ExtendedFileManager": {
-            "__ TRANSLATOR NOTE __": "*** EXTENDEDFILEMANAGER IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***",
-            "10%": "",
-            "100%": "",
-            "200%": "",
-            "25%": "",
-            "50%": "",
-            "75%": "",
-            ">List View": "",
-            ">Thumbnail View": "",
-            "A:": "",
-            "D:": "",
-            "File List": "",
-            "Filesize:": "",
-            "Folder": "",
-            "GIF": "",
-            "H:": "",
-            "Image Editor": "",
-            "Image Selection": "",
-            "Maximum folder size limit reached. Upload disabled.": "",
-            "Please enter value": "",
-            "PNG": "",
-            "Preset": "",
-            "Rotate 180 &deg;": "",
-            "Rotate 90 &deg; CCW": "",
-            "Rotate 90 &deg; CW": "",
-            "Toggle marker color": "",
-            "X:": "",
-            "Xinha Image Editor": "",
-            "Y:": "",
-            "Zoom": ""
-        },
-        "Filter": {
-            "__ TRANSLATOR NOTE __": "*** FILTER IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***",
-            "Filter": "<<InsertSnippet2>>"
-        },
-        "HtmlTidy": {
-            "__ TRANSLATOR NOTE __": "*** HTMLTIDY IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***",
-            "Auto-Tidy": "",
-            "Don't Tidy": "",
-            "HTML Tidy": "",
-            "Tidy failed.  Check your HTML for syntax errors.": ""
-        },
-        "ImageManager": {
-            "__ TRANSLATOR NOTE __": "*** IMAGEMANAGER IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***",
-            "Flickr Picture List": "",
-            "Flickr Pictures": "",
-            "Flickr Selection": "",
-            "Flickr Username/Email": "",
-            "Image List": "",
-            "Keyword": "",
-            "No Photos Found": "",
-            "No Videos Found": "",
-            "This Server": "",
-            "YouTube Selection": "",
-            "YouTube Username": "",
-            "YouTube Video List": "",
-            "YouTube Videos": "",
-            "A:": "<<ExtendedFileManager>>",
-            "D:": "<<ExtendedFileManager>>",
-            "GIF": "<<ExtendedFileManager>>",
-            "H:": "<<ExtendedFileManager>>",
-            "Image Editor": "<<ExtendedFileManager>>",
-            "Image Selection": "<<ExtendedFileManager>>",
-            "PNG": "<<ExtendedFileManager>>",
-            "Rotate 180 &deg;": "<<ExtendedFileManager>>",
-            "Rotate 90 &deg; CCW": "<<ExtendedFileManager>>",
-            "Rotate 90 &deg; CW": "<<ExtendedFileManager>>",
-            "X:": "<<ExtendedFileManager>>",
-            "Y:": "<<ExtendedFileManager>>"
-        },
-        "InsertMarquee": {
-            "__ TRANSLATOR NOTE __": "*** INSERTMARQUEE IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***",
-            "Alternate": "",
-            "Background-Color:": "",
-            "Behavior:": "",
-            "Continuous": "",
-            "Direction:": "",
-            "Insert scrolling marquee": "",
-            "Marquee Editor": "",
-            "Scroll Amount:": "",
-            "Scroll Delay:": "",
-            "Slide": "",
-            "Speed Control": "",
-            "Name/ID:": "<<Forms>>",
-            "Text:": "<<Forms>>"
-        },
-        "InsertPicture": {
-            "__ TRANSLATOR NOTE __": "*** INSERTPICTURE IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***",
-            "Leave empty for not defined": "",
-            " Open file in new window": "",
-            "Open file in new window": "",
-            "Upload file": ""
-        },
-        "NoteServer": {
-            "__ TRANSLATOR NOTE __": "*** NOTESERVER IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***",
-            "120%": "",
-            "150%": "",
-            "80%": "",
-            "Add GUIDO Code in a textbox on the page": "",
-            "Add MIDI link to allow students to hear the music": "",
-            "Format": "",
-            "Guido code": "",
-            "GUIDO Code": "",
-            "Image in applet": "",
-            "Insert GUIDO Music Notation": "",
-            "MIDI File": "",
-            "Source Code": "",
-            "With Mozilla, the applet will not be visible in editor, but only in Web page after submitting.": "",
-            "Zoom :": "",
-            "100%": "<<ExtendedFileManager>>",
-            "Zoom": "<<ExtendedFileManager>>"
-        },
-        "PSLocal": {
-            "__ TRANSLATOR NOTE __": "*** PSLOCAL IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***",
-            "Confirm": "",
-            "Enable": "",
-            "Enable Gears in order to use local document storage and configuration.": "",
-            "Enabling Local Storage": "",
-            "Install": "",
-            "Learn About Local Storage": "",
-            "This will reload the page, causing you to lose any unsaved work.  Press \"OK\" to reload.": "",
-            "Xinha uses Google Gears to enable local document storage.  With Gears installed, you can save drafts of your documents on your hard drive, configure Xinha to look the way you want, and carry this information wherever you use Xinha on the web.": ""
-        },
-        "PSServer": {
-            "__ TRANSLATOR NOTE __": "*** PSSERVER IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***",
-            "File: ": "",
-            "Import": ""
-        },
-        "PersistentStorage": {
-            "__ TRANSLATOR NOTE __": "*** PERSISTENTSTORAGE IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***",
-            "Details": "",
-            "File Browser": "",
-            "Hello    There C ": "",
-            "Hello  There A ": "",
-            "Hello \" There B \"": "",
-            "Hello ' There D '": "",
-            "List of Places": "",
-            "New Document": "",
-            "Open": "",
-            "Open Document": "",
-            "Places": "",
-            "Please enter the name of the directory you'd like to create.": "",
-            "Save Document": "",
-            "This will erase any unsaved content.  If you're certain, please click OK to continue.": "",
-            "Web URL": "",
-            "Confirm": "<<PSLocal>>",
-            "File List": "<<ExtendedFileManager>>",
-            "Insert": "<<InsertNote>>"
-        },
-        "SpellChecker": {
-            "__ TRANSLATOR NOTE __": "*** SPELLCHECKER IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***",
-            "Dictionary": "",
-            "Finished list of mispelled words": "",
-            "HTMLArea Spell Checker": "",
-            "I will open it in a new page.": "",
-            "Ignore": "",
-            "Ignore all": "",
-            "Info": "",
-            "Learn": "",
-            "No mispelled words found with the selected dictionary.": "",
-            "Original word": "",
-            "Please confirm that you want to open this link": "",
-            "Please wait.  Calling spell checker.": "",
-            "Please wait: changing dictionary to": "",
-            "pliz weit ;-)": "",
-            "Re-check": "",
-            "Replace": "",
-            "Replace all": "",
-            "Revert": "",
-            "Spell Checker": "",
-            "Spell-check": "",
-            "Suggestions": "",
-            "This will drop changes and quit spell checker.  Please confirm.": ""
-        },
-        "Template": {
-            "__ TRANSLATOR NOTE __": "*** TEMPLATE IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***",
-            "Insert template": ""
-        },
-        "UnFormat": {
-            "__ TRANSLATOR NOTE __": "*** UNFORMAT IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***",
-            "All": "",
-            "All HTML:": "",
-            "Cleaning Area": "",
-            "Cleaning options": "",
-            "Formatting:": "",
-            "Page Cleaner": "",
-            "Select which types of formatting you would like to remove.": "",
-            "Selection": ""
-        }
-    }
-}
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/lang/merged/pt_br.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/lang/merged/pt_br.js
deleted file mode 100644
index 6681f71..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/lang/merged/pt_br.js
+++ /dev/null
@@ -1,1553 +0,0 @@
-// Xinha Language Combined Translation File
-//
-// LANG: "pt_br", ENCODING: UTF-8
-//
-// INSTRUCTIONS TO TRANSLATORS
-// ===========================================================================
-//
-// Your translation must be in UTF-8 Character Encoding.
-//
-// This is a JSON encoded file (plus comments), strings should be double-quote
-// only, do not use single quotes to surround strings - "hello", not 'hello'
-// do not have a trailing comma after the last entry in a section.
-//
-// Only full line comments are allowed (that a comments occupy entire lines).
-//
-// Search for the __NEW_TRANSLATIONS__ section below, this is where you will
-// want to focus, this section includes things that do not presently have a 
-// translation or for which the translation needs to be checked for accuracy.
-//
-// In the New Translations section a translation string is one of the following
-//
-//  "English String Here" : ""
-//     This means it is not translated yet, add your translation...
-//     "English String Here" : "Klingon String Here"
-//
-//  "English String Here" : "Translated String Here"
-//     This means that an existing translation for this string, in some other
-//     section has been found, and used.  Check that it is approprite for this
-//     section and if it is, that's fine leave it as is, otherwise change as
-//     appropriate.
-//
-//  "English String Here" : "<<AnotherSection>>"
-//     This means use the same translation for this string as <<AnotherSection>>
-//     this saves you re-tranlating strings.  If the Context of this section
-//     and the context of AnotherSection seem the same, that's fine leave it
-//     using that translation, but if this section needs a different translation, 
-//     you can provide it by replacing the link (<<AnotherSection>>) with that
-//     new translation.  For example - a "Table" in say "DataPlugin" is 
-//     perhaps translated differently to "Table" in "FurniturePlugin".
-//
-// TESTING YOUR TRANSLATION
-// ===========================================================================
-// Simply place your translation file on your webserver somewhere for example
-//
-//   /xinha/lang/merged/pt_br.js
-//
-// and then tell Xinha where to get it (before loading XinhaCore.js) by 
-//
-//  _editor_lang              = 'pt_br';
-//  _editor_lang_merged_file  = '/xinha/lang/merged/pt_br.js';
-//
-// Xinha will load your new language definition.
-//
-// SUBMITTING YOUR TRANSLATION
-// ===========================================================================
-// Simply create a Ticket on the Xinha website and attach your translation 
-// file.
-//
-// The Xinha developers will take your file and use the 
-//     contrib/lc_split_merged_file.php
-// script to load it into the Xinha distribution.
-
-{
-    "Abbreviation": {
-        "Abbreviation": "Abreviação",
-        "Cancel": "Cancelar",
-        "Delete": "Apagar",
-        "Expansion:": "Expandir:",
-        "OK": "OK"
-    },
-    "AboutBox": {
-        "About this editor": "Sobre este editor",
-        "Close": "Fechar"
-    },
-    "BackgroundImage": {
-        "Cancel": "Cancelar",
-        "Remove Current Background": "Remover fundo atual",
-        "Set Page Background Image": "Definir Imagem de Fundo",
-        "Set page background image": "Definir imagem de fundo"
-    },
-    "CharCounter": {
-        "... in progress": "... em processo",
-        "Chars": "Caracteres",
-        "HTML": "HTML",
-        "Words": "Palavras"
-    },
-    "CharacterMap": {
-        "Insert special character": "Inserir caracter especial"
-    },
-    "ClientsideSpellcheck": {
-        "Spell Check using ieSpell": "Verificação Ortográfica utilizando ieSpell"
-    },
-    "ColorPicker": {
-        "Click a color...": "Selecione uma côr...",
-        "Close": "Fechar",
-        "Color: ": "Côr:",
-        "OK": "OK",
-        "Sample": "Exemplo",
-        "Web Safe: ": "Web Segura:"
-    },
-    "ContextMenu": {
-        "C_ell Properties...": "Propriedades da célula",
-        "Chec_k Link...": "Verificar Link...",
-        "Copy": "Copiar",
-        "Create a link": "Criar um novo link",
-        "Current URL is": "A URL corrente é",
-        "Cut": "Recortar",
-        "De_lete Column": "Apagar Coluna",
-        "Delete Cell": "Apagar Célula",
-        "Delete the current column": "Apagar a coluna atual",
-        "Delete the current row": "Apagar a linha atual",
-        "How did you get here? (Please report!)": "Como você começou aqui? (Por favor, informe!)",
-        "I_nsert Row Before": "Inserir linha antes deste ponto",
-        "In_sert Row After": "Inserir linha depois deste ponto",
-        "Insert C_olumn After": "Inserir coluna após este ponto",
-        "Insert Cell After": "Inserir Célula Depois",
-        "Insert Cell Before": "Inserir Célula Antes",
-        "Insert _Column Before": "Inserir coluna antes deste ponto",
-        "Insert a new column after the current one": "Inserir uma nova coluna após esta",
-        "Insert a new column before the current one": "Inserir uma nova coluna antes desta",
-        "Insert a new row after the current one": "Inserir uma linha após esta",
-        "Insert a new row before the current one": "Inserir uma nova linha antes desta",
-        "Insert a paragraph after the current node": "Inserir um parágrafo após o nó atual",
-        "Insert a paragraph before the current node": "Inserir um parágrafo antes do nó atual",
-        "Insert paragraph after": "Inserir um parágrafo após",
-        "Insert paragraph before": "Inserir um parágrafo antes",
-        "Justify Center": "Justificar centralizado",
-        "Justify Full": "Justificação completa",
-        "Justify Left": "Justificar à esquerda",
-        "Justify Right": "Justificar à direita",
-        "Link points to:": "Link para:",
-        "Make lin_k...": "Criar link...",
-        "Merge Cells": "Mesclar Células",
-        "Opens this link in a new window": "Abrir este link em uma nova janela",
-        "Paste": "Colar",
-        "Please confirm that you want to remove this element:": "Por favor, confirme que deseja remover este elemento:",
-        "Please confirm that you want to unlink this element.": "Por favor, confirme que deseja retirar o link do elemento.",
-        "Remove the $elem Element...": "Remover o elemento $elem...",
-        "Remove this node from the document": "Remover este nó do documento",
-        "Ro_w Properties...": "Propriedades da Linha",
-        "Show the Table Cell Properties dialog": "Mostrar Propriedades da Tabelas",
-        "Show the Table Properties dialog": "Mostrar caixa de diálogo de Propriedades da Tabela",
-        "Show the Table Row Properties dialog": "Mostrar caixa de diálogo de Propriedades da Linha",
-        "Show the image properties dialog": "Mostrar a caixa de diálogo das Propriedades da imagem",
-        "Unlink the current element": "Remover link do elemento atual",
-        "_Delete Row": "Apagar linha",
-        "_Image Properties...": "Propriedades da imagem...",
-        "_Modify Link...": "Modificar link",
-        "_Remove Link...": "Remover Link",
-        "_Table Properties...": "Propriedades da Tabela"
-    },
-    "CreateLink": {
-        "Are you sure you wish to remove this link?": "Você tem certeza que deseja remover este link?",
-        "Cancel": "Cancelar",
-        "Insert/Modify Link": "Inserir/Modificar Link",
-        "New window (_blank)": "Nova janela (_blank)",
-        "None (use implicit)": "Nenhum (uso implícito)",
-        "OK": "OK",
-        "Same frame (_self)": "Mesma frame (_self)",
-        "Target:": "Destino:",
-        "Title (tooltip):": "Título (tooltip)",
-        "Top frame (_top)": "Frame do topo (_top)",
-        "URL:": "URL:",
-        "You need to select some text before creating a link": "Você precisa selecionar um texto antes de criar um link"
-    },
-    "DefinitionList": {
-        "definition description": "Descrição de definição",
-        "definition list": "Lista de definição",
-        "definition term": "Termo de definição"
-    },
-    "DynamicCSS": {
-        "Choose stylesheet": "Escolher estilo",
-        "Default": "Padrão",
-        "Undefined": "Indefinido"
-    },
-    "EditTag": {
-        "Cancel": "Cancelar",
-        "Edit HTML for selected text": "Editar HTML para texto selecionado",
-        "Edit Tag By Peg": "Editar Tag por Peg",
-        "OK": "OK",
-        "Tag Editor": "Editor de Tag"
-    },
-    "Equation": {
-        "&quot;text&quot;": "&quot;text&quot;",
-        "AsciiMath Formula Input": "Inserir Fórmula AsciiMath",
-        "AsciiMathML Example": "Exemplo AsciiMathML",
-        "Based on ASCIIMathML by": "Baseado no ASCIIMathML por",
-        "Cancel": "Cancelar",
-        "For more information on AsciiMathML visit this page:": "Para maiores informações do AsciiMathML visite este site:",
-        "Formula Editor": "Editor de Fórmula",
-        "Input": "Entrada",
-        "OK": "OK",
-        "Preview": "Visualizar",
-        "`&quot;text&quot;`": "`&quot;texto&quot;`"
-    },
-    "ExtendedFileManager": {
-        ">List View": ">Lista",
-        ">Thumbnail View": ">Miniaturas",
-        "A:": "A:",
-        "Absbottom": "Inferior absoluto",
-        "Absmiddle": "Meio absoluto",
-        "Align": "Alinhamento",
-        "Alt": "Alt",
-        "Baseline": "Linha de base",
-        "Border": "Borda",
-        "Border Color": "Côr da Borda",
-        "Bottom": "Inferior",
-        "Cancel": "Cancelar",
-        "Clear": "Limpar",
-        "Color": "Côr",
-        "Constrain Proportions": "Manter Proporcionalidade",
-        "Copy": "Copiar",
-        "Crop": "Recortar",
-        "Cut": "Cortar",
-        "D:": "G:",
-        "Directory": "Diretório",
-        "Directory Up": "Diretório Acima",
-        "Edit": "Editar",
-        "File List": "Lista de Arquivos",
-        "File Manager": "Gerenciador de Arquivos",
-        "Filename:": "Nome do Arquivo:",
-        "Flip Horizontal": "Espelhar Horizontalmente",
-        "Flip Image": "Espelhar Imagem",
-        "Flip Vertical": "Espelhar Verticalmente",
-        "Folder": "Pasta",
-        "GIF": "GIF",
-        "GIF format is not supported, image editing not supported.": "Formato GIF não é suportado, não é possível editar imagem.",
-        "H:": "A:",
-        "Height": "Altura",
-        "Height:": "Altura:",
-        "Image Editor": "Editor de Imagem",
-        "Image Selection": "Seleção de Imagem",
-        "Insert File Link": "Inserir Link de Arquivo",
-        "Invalid base directory:": "Diretório base inválido",
-        "JPEG High": "JPEG Alto",
-        "JPEG Low": "JPEG Baixo",
-        "JPEG Medium": "JPEG Médio",
-        "Left": "Esquerda",
-        "Loading": "Carregando",
-        "Lock": "Travar",
-        "Margin": "Margem",
-        "Marker": "Marcar",
-        "Maximum folder size limit reached. Upload disabled.": "Atingido o limite máximo da pasta. Envio desativado.",
-        "Measure": "Medida:",
-        "Middle": "Meio",
-        "New Folder": "Nova Pasta",
-        "New window (_blank)": "Nova janela (_blank)",
-        "No Files Found": "Nenhum Arquivo Encontrado",
-        "No Image Available": "Nenhuma Imagem Disponível",
-        "None (use implicit)": "Nenhum (uso implícito)",
-        "Not set": "Não definido",
-        "OK": "OK",
-        "PNG": "PNG",
-        "Padding": "Espaçamento Interno",
-        "Please enter value": "Por favor, entre o valor",
-        "Positioning of this image": "Posicionamento desta imagem",
-        "Preview": "Visualizar",
-        "Quality:": "Qualidade:",
-        "Refresh": "Atualizar",
-        "Rename": "Renomear",
-        "Resize": "Redimencionar",
-        "Right": "Direita(o)",
-        "Rotate": "Rotacionar",
-        "Rotate 180 &deg;": "Rotacionar 180 &deg;",
-        "Rotate 90 &deg; CCW": "Rotacionar 90 &deg; anti-horário",
-        "Rotate 90 &deg; CW": "Rotacionar 90 &deg; horário",
-        "Rotate Image": "Rotacionar Imagem",
-        "Same frame (_self)": "Mesma frame (_self)",
-        "Save": "Gravar",
-        "Start X:": "Início X:",
-        "Start Y:": "Início Y",
-        "Target Window": "Janela Destino",
-        "Texttop": "Texto no topo",
-        "Title (tooltip)": "Título (tooltip)",
-        "Top": "Topo",
-        "Top frame (_top)": "Frame do topo (_top)",
-        "Trash": "Lixo",
-        "Upload": "Enviar",
-        "W:": "L:",
-        "Width": "Largura",
-        "Width:": "Largura:",
-        "X:": "X:",
-        "Y:": "Y:",
-        "You must select some text before making a new link.": "Você precisa selecionar um texto antes de criar um novo link.",
-        "Zoom": "Ampliação"
-    },
-    "Filter": {
-        "Filter": "Filtro"
-    },
-    "FindReplace": {
-        "Case sensitive search": "Procura diferenciada Maiúsculas/Minúsculas",
-        "Clear": "Limpar",
-        "Done": "Executado",
-        "Enter the text you want to find": "Forneça o texto que deseja procurar",
-        "Find and Replace": "Procurar e Substituir",
-        "Highlight": "Marcar",
-        "Inform a replacement word": "Informe uma palavra para substituir",
-        "Next": "Próxima",
-        "Options": "Opções",
-        "Replace with:": "Substituir por:",
-        "Search for:": "Procurar por:",
-        "Substitute all occurrences": "Substituir todas as ocorrências",
-        "Substitute this occurrence?": "Substituir todas as ocorrências?",
-        "Undo": "Desfazer",
-        "Whole words only": "Apenas palavras inteiras",
-        "found item": "Item encontrado",
-        "found items": "Itens encontrados",
-        "not found": "nada encontrado",
-        "replaced item": "substituir item",
-        "replaced items": "substituir itens"
-    },
-    "FormOperations": {
-        "Enter the name for new option.": "Entre com o nome para nova opção",
-        "Form Editor": "Editor de Formulários",
-        "Insert a Form.": "Inserir um Formulário.",
-        "Insert a check box.": "Inserir uma caixa de opção",
-        "Insert a multi-line text field.": "Inserir um texto multi-linha.",
-        "Insert a radio button.": "Inserir um campo de escolha",
-        "Insert a select field.": "Inserir seleção.",
-        "Insert a submit/reset button.": "Inserir um botão de envio/reset",
-        "Insert a text, password or hidden field.": "Inserir um texto, senha ou campo escondido."
-    },
-    "Forms": {
-        "Access Key:": "Tecla de Acesso:",
-        "Action URL:": "Ação - URL:",
-        "Button Script": "Script de Botão",
-        "Cancel": "Cancelar",
-        "Checked": "Definido",
-        "Columns:": "Colunas:",
-        "Default text (optional)": "Texto padrão (opcional)",
-        "Dimensions": "Dimensões",
-        "Disabled": "Desativado",
-        "Encoding:": "Codificação:",
-        "For Control:": "Para Controle:",
-        "Form": "Formulário",
-        "Form Element: FIELDSET": "Elemento do formulário: FIELDSET",
-        "Form Element: INPUT": "Elemento do formulário: INPUT",
-        "Form Element: LABEL": "Elemento do formulário: LABEL",
-        "Form Element: SELECT": "Elemento do formulário: SELECT",
-        "Form Element: TEXTAREA": "Elemento do formulário: TEXTAREA",
-        "Form Name:": "Nome do Formulário:",
-        "Form handler script": "Script do Formulário",
-        "HTML-Form to CGI (default)": "Formulário para CGI (padrão)",
-        "Hard": "Difícil",
-        "Height in number of rows": "Altura em número de linhas",
-        "Image URL:": "URL da imagem:",
-        "Image source": "Imagem de Origem",
-        "Initial Text:": "Texto Inicial:",
-        "Insert/Edit Form": "Inserir/Editar Formulário",
-        "Insert/Edit Form Element FIELDSET": "Inserir/Editar Elemento FIELDSET",
-        "Insert/Edit Form Element INPUT": "Inserir/Editar Elemento INPUT",
-        "Insert/Edit Form Element LABEL": "Inserir/Editar Elemento LABEL",
-        "Insert/Edit Form Element SELECT": "Inserir/Editar Elemento SELECT",
-        "Insert/Edit Form Element TEXTAREA": "Inserir/Editar Elemento TEXTAREA",
-        "Javascript for button click": "Javascript para botão de clicar",
-        "Label:": "Etiqueta:",
-        "Legend:": "Legenda:",
-        "Max length:": "Comprimento Máx.:",
-        "Maximum number of characters accepted": "Máximo número de caracteres aceitos",
-        "Method:": "Método:",
-        "Name": "Nome",
-        "Name of the form input": "Nome do formulário de entrada",
-        "Name of the form select": "Nome do formulário de seleção",
-        "Name/ID:": "Nome/ID:",
-        "OK": "OK",
-        "Off": "Desligado",
-        "Options": "Opções",
-        "Physical": "Físico",
-        "Please enter a Label": "Por favor, entre uma Etiqueta",
-        "Post": "Post",
-        "Read Only": "Somente Leitura",
-        "Rows:": "Linhas:",
-        "Size of text box in characters": "Tamanho da caixa de texto em caracteres",
-        "Size:": "Tamanho:",
-        "Soft": "Fácil",
-        "Tab Index:": "Ordem de Tabulação:",
-        "Target Frame:": "Frame de destino:",
-        "Text:": "Texto:",
-        "URL of image": "URL da imagem",
-        "Value of the form input": "Valor do formulário de entrada",
-        "Value:": "Valor:",
-        "Virtual": "Virtual",
-        "Width in number of characters": "Largura em número de caracteres",
-        "Wrap Mode:": "Modo de quebras:",
-        "You must enter a Name": "Você precisa entrar com um Nome",
-        "multipart Form Data (File-Upload)": "Formulário de dados multipart (Enviar arquivo)",
-        "name of the textarea": "nome da área de texto",
-        "normal": "normal",
-        "nowrap": "sem quebras"
-    },
-    "FullPage": {
-        "Alternate style-sheet:": "Estilo alternativo:",
-        "Background color:": "Côr de Fundo:",
-        "Cancel": "Cancelar",
-        "Character set:": "Conjunto de Caracteres:",
-        "DOCTYPE:": "DOCTYPE:",
-        "Description:": "Descrição:",
-        "Document properties": "Propriedades do Documento",
-        "Document title:": "Título do Documento:",
-        "Keywords:": "Palavras chave:",
-        "OK": "OK",
-        "Primary style-sheet:": "Estilo Primário:",
-        "Text color:": "Côr do Texto:",
-        "UTF-8 (recommended)": "UTF-8 (recomendado)",
-        "cyrillic (ISO-8859-5)": "Cirílico (ISO-8859-5)",
-        "cyrillic (KOI8-R)": "Cirílico (KOI8-R)",
-        "cyrillic (WINDOWS-1251)": "Círilico (WINDOWS-1251)",
-        "western (ISO-8859-1)": "Ocidental (ISO-8859-1)"
-    },
-    "FullScreen": {
-        "Maximize/Minimize Editor": "Maximizar/Minimizar Editor"
-    },
-    "HorizontalRule": {
-        "Alignment:": "Alinhamento:",
-        "Cancel": "Cancelar",
-        "Center": "Centralizar",
-        "Color:": "Côr:",
-        "Height:": "Alturar:",
-        "Horizontal Rule": "Linha Horizontal",
-        "Insert/Edit Horizontal Rule": "Inserir/Editar Linha Horizontal",
-        "Insert/edit horizontal rule": "Inserir/editar linha horizontal",
-        "Layout": "Esquema",
-        "Left": "Esquerda",
-        "No shading": "Sem sombra",
-        "OK": "OK",
-        "Right": "Direita",
-        "Style": "Estilo",
-        "Width:": "Largura:",
-        "percent": "porcentagem",
-        "pixels": "pixels"
-    },
-    "HtmlTidy": {
-        "Auto-Tidy": "Auto-Tidy",
-        "Don't Tidy": "Sem Tidy",
-        "HTML Tidy": "HTML Tidy",
-        "Tidy failed.  Check your HTML for syntax errors.": "Tidy falhou. Verifique erros de sintaxe em seu HTML."
-    },
-    "ImageManager": {
-        "A:": "A:",
-        "Absbottom": "Inferior absoluto",
-        "Absmiddle": "Meio absoluto",
-        "Angle:": "Ângulo:",
-        "Baseline": "Linha de base",
-        "Bottom": "Base",
-        "Cancel": "Cancelar",
-        "Clear": "Limpar",
-        "Constrain Proportions": "Manter proporções",
-        "Crop": "Recortar",
-        "D:": "G:",
-        "Directory": "Diretório",
-        "Directory Up": "Diretório Acima",
-        "Edit": "Editar",
-        "Filename:": "Nome do arquivo:",
-        "Flip Horizontal": "Espelhar Horizontalmente",
-        "Flip Image": "Espelhar Imagem",
-        "Flip Vertical": "Espelhar Verticalmente",
-        "Folder Name:": "Nome da Pasta:",
-        "GIF": "GIF",
-        "GIF format is not supported, image editing not supported.": "Formato GIF não é suportado, edição de imagem não é suportada.",
-        "H:": "A:",
-        "Height:": "Altura:",
-        "Image Editor": "Editor de Imagem",
-        "Image Format": "Formato da Imagem",
-        "Image List": "Lista de Imagens",
-        "Image Selection": "Seleção de Imagem",
-        "Insert Image": "Inserir Imagem",
-        "Invalid base directory:": "Diretório base inválido:",
-        "JPEG High": "JPEG Alto",
-        "JPEG Low": "JPEG Baixo",
-        "JPEG Medium": "JPEG Médio",
-        "Left": "Esquerda",
-        "Lock": "Travar",
-        "Marker": "Marcar",
-        "Measure": "Medida",
-        "Middle": "Meio",
-        "New Folder": "Nova Pasta",
-        "No Image Available": "Sem Imagem Disponível",
-        "No Images Found": "Nenhuma Imagem Encontrada",
-        "Not set": "Não definido",
-        "OK": "OK",
-        "PNG": "PNG",
-        "Positioning of this image": "Posicionamento desta imagem",
-        "Quality:": "Qualidade:",
-        "Refresh": "Atualização",
-        "Resize": "Redimencionar",
-        "Right": "Direita",
-        "Rotate": "Rotacionar",
-        "Rotate 180 &deg;": "Rotacionar 180 &deg;",
-        "Rotate 90 &deg; CCW": "Rotacionar 90 &deg; anti-horário",
-        "Rotate 90 &deg; CW": "Rotacionar 90 &deg; horário",
-        "Rotate Image": "Rotacionar Imagem",
-        "Save": "Gravar",
-        "Start X:": "Início X:",
-        "Start Y:": "Início Y:",
-        "Texttop": "Texto no topo",
-        "Top": "Topo",
-        "Trash": "Lixo",
-        "W:": "C:",
-        "Width:": "Largura:",
-        "X:": "X:",
-        "Y:": "Y:"
-    },
-    "InlineStyler": {
-        "Background": "Fundo",
-        "Baseline": "Linha de base",
-        "Border": "Borda",
-        "Bottom": "Base",
-        "CSS Style": "Estilo (CSS)",
-        "Center": "Centralizar",
-        "Char": "Caracter",
-        "Collapsed borders": "Bordas fechadas",
-        "FG Color": "Cor de primeiro plano",
-        "Float": "Flutuante",
-        "Height": "Altura",
-        "Image URL": "URL da imagem",
-        "Justify": "Justificado",
-        "Layout": "Esquema",
-        "Left": "Esquerda",
-        "Margin": "Margem",
-        "Middle": "Meio",
-        "None": "Nenhum",
-        "Padding": "Espaço interno",
-        "Right": "Direita",
-        "Text align": "Alinhamento do texto",
-        "Top": "Topo",
-        "Vertical align": "Alinhamento vertical",
-        "Width": "Largura",
-        "percent": "porcentagem",
-        "pixels": "pixels"
-    },
-    "InsertAnchor": {
-        "Anchor name": "Nome da âncora",
-        "Cancel": "Cancelar",
-        "Delete": "Deletar",
-        "Insert Anchor": "Inserir Âncora",
-        "OK": "OK"
-    },
-    "InsertImage": {
-        "Absbottom": "Inferior absoluto",
-        "Absmiddle": "Meio absoluto",
-        "Alignment:": "Alinhamento:",
-        "Alternate text:": "Texto Alternativo:",
-        "Baseline": "Linha de base",
-        "Border thickness:": "Espessura da Borda",
-        "Bottom": "Base",
-        "Cancel": "Cancelar",
-        "Enter the image URL here": "Entre aqui com a URL da imagem",
-        "For browsers that don't support images": "Para navegadores que não suportam imagens",
-        "Horizontal padding": "Espaço horizontal",
-        "Horizontal:": "Horizontal:",
-        "Image Preview:": "Visualização da Imagem:",
-        "Image URL:": "URL da imagem:",
-        "Insert Image": "Inserir Imagem",
-        "Layout": "Esquema",
-        "Leave empty for no border": "Deixe em branco para sem bordas",
-        "Left": "Esquerda",
-        "Middle": "Meio",
-        "Not set": "Não definido",
-        "OK": "OK",
-        "Positioning of this image": "Posicionamento desta imagem",
-        "Preview": "Visualizar",
-        "Preview the image in a new window": "Visualizar imagem em uma nova janela",
-        "Right": "Direita",
-        "Spacing": "Espaçamento",
-        "Texttop": "Texto no topo",
-        "Top": "Topo",
-        "Vertical padding": "Espaço vertical",
-        "Vertical:": "Vertical:"
-    },
-    "InsertMarquee": {
-        "Alternate": "Alternativo",
-        "Background-Color:": "Côr de Fundo:",
-        "Behavior:": "Comportamento:",
-        "Cancel": "Cancelar",
-        "Continuous": "Contínuo",
-        "Direction:": "Direção:",
-        "Height:": "Altura:",
-        "Insert scrolling marquee": "Inserir faixa rolante",
-        "Left": "Esquerda",
-        "Marquee Editor": "Editor de Faixas",
-        "Name": "Nome",
-        "Name/ID:": "Nome/ID:",
-        "OK": "OK",
-        "Right": "Direita",
-        "Scroll Amount:": "Quantidade de Rolagem:",
-        "Scroll Delay:": "Atrazo de Rolagem:",
-        "Slide": "Corrediço",
-        "Speed Control": "Controle de Velocidade",
-        "Text:": "Texto:",
-        "Width:": "Largura:"
-    },
-    "InsertNote": {
-        "Cancel": "Cancelar",
-        "Insert": "Inserir"
-    },
-    "InsertPagebreak": {
-        "Page break": "Quebra de página"
-    },
-    "InsertPicture": {
-        " Open file in new window": " Abrir arquivo em um nova janela",
-        "Absbottom": "Inferior Absoluto",
-        "Absmiddle": "Meio Absoluto",
-        "Alignment:": "Alinhamento:",
-        "Alternate text:": "Texto Alternativo:",
-        "Baseline": "Linha de Base",
-        "Border thickness:": "Espessura da Borda",
-        "Bottom": "Inferior",
-        "Cancel": "Cancelar",
-        "Enter the image URL here": "Entre aqui com a URL da imagem",
-        "For browsers that don't support images": "Para navegadores que não suportam imagens",
-        "Height:": "Altura:",
-        "Horizontal padding": "Espaço horizontal",
-        "Horizontal:": "Horizontal:",
-        "Image Preview:": "Visualização da Imagem:",
-        "Image URL:": "URL da Imagem:",
-        "Insert Image": "Inserir Imagem",
-        "Layout": "Esquema",
-        "Leave empty for no border": "Deixe em branco para sem bordas",
-        "Leave empty for not defined": "Deixe em branco para não definido",
-        "Left": "Esquerda",
-        "Middle": "Meio",
-        "Not set": "Não definido",
-        "OK": "OK",
-        "Open file in new window": "Abrir arquivo em uma nova janela",
-        "Positioning of this image": "Posicionamento desta imagem",
-        "Preview": "Visualização",
-        "Preview the image in a new window": "Visualizar imagem em uma nova janela",
-        "Right": "Direita",
-        "Size": "Tamanho",
-        "Spacing": "Espaço",
-        "Texttop": "Texto no topo",
-        "Top": "Topo",
-        "Upload file": "Enviar arquivo",
-        "Vertical padding": "Espaço vertical",
-        "Vertical:": "Vertical:",
-        "Width:": "Largura:"
-    },
-    "InsertSmiley": {
-        "Insert Smiley": "Inserir Smiley"
-    },
-    "InsertSnippet": {
-        "Cancel": "Cancelar",
-        "Hide preview": "Esconder Visualização",
-        "Insert Snippet": "Inserir Fragmento de Código",
-        "Insert as": "Inserir como",
-        "InsertSnippet for Xinha": "Fragmento de Códigos para o Xinha",
-        "Show preview": "Mostrar Visualização",
-        "This is an information about something": "Isto é uma informação sobre alguma coisa",
-        "Variable": "Variável"
-    },
-    "InsertSnippet2": {
-        "Cancel": "Cancelar",
-        "Filter": "Filtro",
-        "HTML": "HTML",
-        "Insert Snippet": "Inserir Fragmento de Código",
-        "InsertSnippet for Xinha": "Fragmento de Códigos para o Xinha",
-        "Variable": "Variável"
-    },
-    "InsertTable": {
-        "Absbottom": "Inferior absoluto",
-        "Absmiddle": "Meio absoluto",
-        "Alignment:": "Alinhamento:",
-        "Baseline": "Linha de base",
-        "Border": "Borda",
-        "Border thickness:": "Espessura da Borda",
-        "Bottom": "Base",
-        "Cancel": "Cancelar",
-        "Caption": "Captação",
-        "Cell padding:": "Espaçamento interno da célula:",
-        "Cell spacing:": "Espaçamento da célula:",
-        "Collapse borders:": "Bordas fechadas:",
-        "Cols:": "Colunas:",
-        "Em": "Em",
-        "Fixed width columns": "Colunas com largura fixa",
-        "Insert Table": "Inserir Tabela",
-        "Layout": "Esquema",
-        "Leave empty for no border": "Deixe em branco para sem bordas",
-        "Left": "Esquerda",
-        "Middle": "Meio",
-        "Not set": "Não definido",
-        "Number of columns": "Número de colunas",
-        "Number of rows": "Número de linhas",
-        "OK": "OK",
-        "Percent": "Porcentagem",
-        "Pixels": "Pixels",
-        "Positioning of this table": "Posicionamento desta tabela",
-        "Right": "Direita",
-        "Rows:": "Linhas:",
-        "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",
-        "Texttop": "Texto no topo",
-        "Top": "Topo",
-        "Width of the table": "Largura da tabela",
-        "Width unit": "Unidade de largura",
-        "Width:": "Largura:"
-    },
-    "LangMarks": {
-        "&mdash; language &mdash;": "&mdash; Idioma &mdash;",
-        "English": "Inglês",
-        "French": "Francês",
-        "Greek": "Grego",
-        "Latin": "Latim",
-        "language select": "Selecionar idioma"
-    },
-    "Linker": {
-        "Anchor-Link": "Link-Âncora",
-        "Anchor:": "Âncora:",
-        "Are you sure you wish to remove this link?": "Você tem certeza que deseja remover este link?",
-        "Cancel": "Cancelar",
-        "Email Address:": "Endereço de E-mail:",
-        "Email Link": "Link de E-mail",
-        "Insert/Modify Link": "Inserir/Modificar Link",
-        "Location Bar:": "Barra de Localização:",
-        "Menu Bar:": "Barra de Menu:",
-        "Message Template:": "Modelo de Mensagem:",
-        "Name:": "Nome:",
-        "New Window": "Nova Janela",
-        "OK": "OK",
-        "Ordinary Link": "Link Comum",
-        "Popup Window": "Janela Pop-up",
-        "Remove Link": "Remover Link",
-        "Resizeable:": "Redimensionável",
-        "Same Window (jump out of frames)": "Mesma Janela (Sair fora dos frames)",
-        "Scrollbars:": "Barra de Rolagem:",
-        "Size:": "Tamanho:",
-        "Status Bar:": "Barra de Informações:",
-        "Subject:": "Assunto:",
-        "Target:": "Destino:",
-        "Toolbar:": "Barra de Ferramentas:",
-        "URL Link": "URL do Link",
-        "URL:": "URL:",
-        "You must select some text before making a new link.": "Você precisa selecionar algum texto antes de criar um novo link."
-    },
-    "ListType": {
-        "Choose list style type (for ordered lists)": "Escolha um tipo de lista (para lista ordenada)",
-        "Decimal numbers": "Números decimais",
-        "Lower greek letters": "Letras gregas inferiores",
-        "Lower latin letters": "Letras latinas inferiores",
-        "Lower roman numbers": "Números romanos inferiores",
-        "Upper latin letters": "Letras latinas superiores",
-        "Upper roman numbers": "Números romanos superiores"
-    },
-    "MootoolsFileManager": {
-        "Insert File Link": "Inserir Link de Arquivo",
-        "You must select some text before making a new link.": "Você precisa selecionar algum texto antes de criar um novo link."
-    },
-    "NoteServer": {
-        "Add GUIDO Code in a textbox on the page": "Adicionar código GUIDO em uma caixa de texto na página",
-        "Add MIDI link to allow students to hear the music": "Adicionar um link MIDI para permitir que os estudantes escutem a música",
-        "Cancel": "Cancelar",
-        "Format": "Formato",
-        "GUIDO Code": "Código GUIDO",
-        "Guido code": "Código Guido",
-        "Image Preview": "Visualização da Imagem",
-        "Image in applet": "Imagem em Applet",
-        "Insert GUIDO Music Notation": "Inserir Notação GUIDO de Música",
-        "MIDI File": "Arquivo MIDI",
-        "OK": "OK",
-        "Options": "Opções",
-        "Preview": "Visualização",
-        "Preview the image in a new window": "Visualizar imagem em uma nova janela",
-        "Source Code": "Codigo Fonte",
-        "With Mozilla, the applet will not be visible in editor, but only in Web page after submitting.": "Com Mozilla, o applet não estará visível no editor, somente na Página Web depois do envio.",
-        "Zoom": "Ampliação",
-        "Zoom :": "Ampliação :"
-    },
-    "Opera": {
-        "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."
-    },
-    "PSLocal": {
-        "Cancel": "Cancelar"
-    },
-    "PasteText": {
-        "Cancel": "Cancelar",
-        "OK": "OK",
-        "Paste as Plain Text": "Colar um texto básico"
-    },
-    "PersistentStorage": {
-        "Cancel": "Cancelar",
-        "Copy": "Copiar",
-        "Delete": "Deletar",
-        "Directory Up": "Diretório Acima",
-        "File List": "Lista de Arquivos",
-        "File Manager": "Gerenciador de Arquivos",
-        "Filename": "Nome do arquivo:",
-        "Insert": "Inserir",
-        "Insert Image": "Inserir Imagem",
-        "New Folder": "Nova Pasta",
-        "Save": "Salvar",
-        "You must select some text before making a new link.": "Você precisa selecionar algum texto antes de criar um novo link."
-    },
-    "QuickTag": {
-        "ATTRIBUTES": "ATRIBUTOS",
-        "Cancel": "Cancelar",
-        "Colors": "Cores",
-        "Enter the TAG you want to insert": "Entre com a TAG que deseja inserir",
-        "No CSS class avaiable": "Não há classes CSS disponível",
-        "OPTIONS": "OPÇÕES",
-        "Ok": "Ok",
-        "Quick Tag Editor": "Editor Rápido",
-        "TAGs": "TAGs",
-        "There are some unclosed quote": "Há uma ou mais aspas sem fechamento",
-        "This attribute already exists in the TAG": "Esse atributo já existe na TAG",
-        "You have to select some text": "É preciso selecionar algum texto"
-    },
-    "SaveSubmit": {
-        "Ready": "Pronto",
-        "Save": "Salvar",
-        "Saving...": "Gravando...",
-        "in progress": "em processo"
-    },
-    "SetId": {
-        "Cancel": "Cancelar",
-        "Delete": "Apagar",
-        "ID/Name:": "ID/Nome:",
-        "OK": "OK",
-        "Set ID/Name": "Definir ID/Nome",
-        "Set Id and Name": "Definir Id e Nome",
-        "Set Id/Name": "Definir Id/Nome"
-    },
-    "SmartReplace": {
-        "Convert all quotes and dashes in the current document": "Converter todas as citações e hífens no documento atual",
-        "Enable automatic replacements": "Ativar substituições automáticas",
-        "OK": "OK",
-        "SmartReplace": "Substituição Rápida",
-        "SmartReplace Settings": "Configurações da Substituição Rápida"
-    },
-    "SpellChecker": {
-        "Cancel": "Cancelar",
-        "Dictionary": "Dicionário",
-        "Finished list of mispelled words": "Finalizada lista de palavras desconhecidas",
-        "HTMLArea Spell Checker": "Dicionário HTMLArea",
-        "I will open it in a new page.": "Será aberto em uma nova página",
-        "Ignore": "Ignorar",
-        "Ignore all": "Ignorar todas",
-        "Info": "Informação",
-        "Learn": "Aprender",
-        "No mispelled words found with the selected dictionary.": "Nenhuma palavra desconhecida foi encontrada no dicionário selecionado",
-        "OK": "OK",
-        "Original word": "Palavra Original",
-        "Please confirm that you want to open this link": "Por favor, confirme se deseja abrir este link",
-        "Please wait.  Calling spell checker.": "Por favor, aguarde. Chamando dicionário.",
-        "Please wait: changing dictionary to": "Por favor, aguarde: mudando dicionário para",
-        "Re-check": "Re-verificar",
-        "Replace": "Substituir",
-        "Replace all": "Substituir tudo",
-        "Replace with": "Substituir com",
-        "Revert": "Reverter",
-        "Spell Checker": "Dicionário",
-        "Spell-check": "Dicionário",
-        "Suggestions": "Sugestões",
-        "This will drop changes and quit spell checker.  Please confirm.": "Isso desfará as mudanças e finalizará o dicionário. Por favor, confirme.",
-        "pliz weit ;-)": "Por favor, aguarde..."
-    },
-    "Stylist": {
-        "Styles": "Estilos"
-    },
-    "SuperClean": {
-        "Cancel": "Cancelar",
-        "Clean up HTML": "Limpar HTML",
-        "General tidy up and correction of some problems.": "Limpesa geral e correção de alguns problemas.",
-        "OK": "OK",
-        "Please select from the following cleaning options...": "Por favor, selecione uma das opções de limpesa...",
-        "Remove custom font sizes.": "Remover tamanho de fontes personalizados (font size).",
-        "Remove custom text colors.": "Remover cores de texto personalizados (font color).",
-        "Remove custom typefaces (font \"styles\").": "Remover tipos de letras personalizadas (font \"styles\").",
-        "Remove lang attributes.": "Remover atributos de idioma."
-    },
-    "TableOperations": {
-        "All four sides": "todos os quatro lados",
-        "Borders": "Bordas",
-        "Cancel": "Cancelar",
-        "Caption": "Captação",
-        "Cell Properties": "Propriedades da célula",
-        "Cells down": "Células para baixo",
-        "Cells to the right, and": "Células para direita, e",
-        "Columns": "Colunas",
-        "Delete cell": "Apagar célula",
-        "Delete column": "Apagar coluna",
-        "Delete row": "Apagar linha",
-        "Description": "Descrição",
-        "Frame and borders": "Frames e bordas",
-        "Frames": "Frames",
-        "Insert cell after": "Inserir célula antes",
-        "Insert cell before": "Inserir célula depois",
-        "Insert column after": "Inserir coluna antes",
-        "Insert column before": "Inserir coluna depois",
-        "Insert row after": "Inserir linha depois",
-        "Insert row before": "Inserir linha antes",
-        "Merge Cells": "Mesclar Células",
-        "Merge current cell with:": "Mesclar célula atual com:",
-        "No rules": "Sem regras",
-        "No sides": "Sem lados",
-        "OK": "OK",
-        "Padding": "Espaço interno",
-        "Please click into some cell": "Por favor, clique em alguma célula",
-        "Row Properties": "Propriedades da Linha",
-        "Rows": "Linhas",
-        "Rules will appear between all rows and columns": "As Regras apareceram entre todas as linhas e colunas",
-        "Rules will appear between columns only": "Regras apareceram somente nas colunas",
-        "Rules will appear between rows only": "Regras apareceram somente nas linhas",
-        "Spacing": "Espaçamento",
-        "Spacing and padding": "Espaçamentos",
-        "Split column": "Separar colunas",
-        "Split row": "Separar linhas",
-        "Summary": "Sumário",
-        "Table Properties": "Propriedades da Tabela",
-        "The bottom side only": "Somente na parte inferior",
-        "The left-hand side only": "Somente na parte esquerda",
-        "The right and left sides only": "Somente nas parte direita e esquerda",
-        "The right-hand side only": "Somente na parte direita",
-        "The top and bottom sides only": "Somente na parte inferior e superior",
-        "The top side only": "Somente na parte superior",
-        "Xinha cowardly refuses to delete the last cell in row.": "Xinha recusa-se a apagar a última célula na linha",
-        "Xinha cowardly refuses to delete the last column in table.": "Xinha recusa-se a apagar a última coluna da tabela",
-        "Xinha cowardly refuses to delete the last row in table.": "Xinha recusa-se a apagar a última linha da tabela",
-        "pixels": "Pixel"
-    },
-    "Template": {
-        "Cancel": "Cancelar",
-        "Insert template": "Inserir modelo"
-    },
-    "UnFormat": {
-        "All": "Tudo",
-        "All HTML:": "Todo HTML:",
-        "Cancel": "Cancelar",
-        "Cleaning Area": "Limpando Área",
-        "Cleaning options": "Opções de limpesa",
-        "Formatting:": "Formatação:",
-        "OK": "OK",
-        "Page Cleaner": "Limpesa de página",
-        "Select which types of formatting you would like to remove.": "Selecione o tipo de formatação que deseja remover.",
-        "Selection": "Seleção"
-    },
-    "Xinha": {
-        "&#8212; font &#8212;": "&#8212; fonte &#8212;",
-        "&#8212; format &#8212;": "&#8212; formato &#8212;",
-        "&#8212; size &#8212;": "&#8212; tamanho &#8212;",
-        "About this editor": "Sobre este editor",
-        "Address": "Endereço",
-        "Background Color": "Cor do Fundo",
-        "Bold": "Negrito",
-        "Bulleted List": "Lista Marcadores",
-        "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",
-        "Clean content pasted from Word": "Limpar conteúdo copiado do Word",
-        "Clear Inline Font Specifications": "Limpar especificações de fontes inline",
-        "Clear MSOffice tags": "Limpar tags do MS Office",
-        "Close": "Fechar",
-        "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",
-        "Decrease Indent": "Diminuir Indentação",
-        "Direction left to right": "Da esquerda para direita",
-        "Direction right to left": "Da direita para esquerda",
-        "ENTER": "ENTER",
-        "Editor Help": "Ajuda do Editor",
-        "Finishing": "Terminando",
-        "Font Color": "Cor da Fonte",
-        "Formatted": "Formatado",
-        "Generate Xinha framework": "Gerar Área de Trabalho do Xinha",
-        "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",
-        "Headings": "Títulos",
-        "Help using editor": "Ajuda - Usando o editor",
-        "Horizontal Rule": "Linha Horizontal",
-        "Increase Indent": "Aumentar Indentação",
-        "Init editor size": "Iniciar tamanho do editor",
-        "Insert Table": "Inserir Tabela",
-        "Insert Web Link": "Inserir Link",
-        "Insert/Modify Image": "Inserir/Modificar Imagem",
-        "Insert/Overwrite": "Inserir/Sobrescrever",
-        "Italic": "Itálico",
-        "Justify Center": "Justificar Centralizado",
-        "Justify Full": "Justificar Completamente",
-        "Justify Left": "Justificar à Esquerda",
-        "Justify Right": "Justificar à Direita",
-        "Keyboard shortcuts": "Atalhos de Teclado",
-        "Loading in progress. Please wait!": "Carregamento em processo. Por favor, aguarde!",
-        "Normal": "Normal",
-        "Ordered List": "Lista Numerada",
-        "Paste from clipboard": "Colar da Área de Transferência",
-        "Path": "Caminho",
-        "Print document": "Imprimir documento",
-        "Redoes your last action": "Refazer sua última ação",
-        "Remove formatting": "Remover formatação",
-        "SHIFT-ENTER": "SHIFT-ENTER",
-        "Save as": "Salvar como",
-        "Select Color": "Selecionar cor",
-        "Select all": "Selecionar tudo",
-        "Set format to paragraph": "Definir formato para o parágrafo",
-        "Split Block": "Dividir Bloco",
-        "Strikethrough": "Tachado",
-        "Subscript": "Subscrito",
-        "Superscript": "Sobrescrito",
-        "The editor provides the following key combinations:": "Este editor fornece a seguinte combinação de teclas:",
-        "Toggle Borders": "Mudar Bordas",
-        "Toggle HTML Source": "Ver Código-Fonte",
-        "Underline": "Sublinhado",
-        "Undoes your last action": "Desfazer sua última ação",
-        "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",
-        "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 VISUAL (WYSIWYG)",
-        "insert linebreak": "inserir quebra de linha",
-        "new paragraph": "novo parágrafo"
-    },
-    "__NEW_TRANSLATIONS__": {
-        "CreateLink": {
-            "Other": ""
-        },
-        "Dialogs": {
-            "Some Text Here": ""
-        },
-        "Equation": {
-            "!=": "",
-            "!in": "",
-            "&gt;-": "",
-            "&gt;=": "",
-            "&lt;=": "",
-            "&lt;=&gt;": "",
-            "&lt;x&gt;": "",
-            "&nbsp; `!` &nbsp;": "",
-            "&nbsp; `.` &nbsp;": "",
-            "&nbsp; `0` &nbsp;": "",
-            "&nbsp; `2` &nbsp;": "",
-            "&nbsp; `3` &nbsp;": "",
-            "&nbsp; `4` &nbsp;": "",
-            "&nbsp; `5` &nbsp;": "",
-            "&nbsp; `6` &nbsp;": "",
-            "&nbsp; `7` &nbsp;": "",
-            "&nbsp; `8` &nbsp;": "",
-            "&nbsp; `9` &nbsp;": "",
-            "&nbsp; `e` &nbsp;": "",
-            "&nbsp;&nbsp;`1` &nbsp;": "",
-            "&nbsp;`+{::}`&nbsp;": "",
-            "&nbsp;`-:\\ `": "",
-            "&nbsp;`-{::}`&nbsp;": "",
-            "&nbsp;`C`&nbsp;": "",
-            "&nbsp;`cos`": "",
-            "&nbsp;`ln`&nbsp;": "",
-            "&nbsp;`pi` &nbsp;": "",
-            "&nbsp;`sin`": "",
-            "&nbsp;`tan`": "",
-            "&nbsp;`times`&nbsp;": "",
-            "'+formula+'": "",
-            "((n),(k))": "",
-            "(x+1)/(x-1)": "",
-            "*": "",
-            "**": "",
-            "+-": "",
-            "-&gt;": "",
-            "-&lt;": "",
-            "-:": "",
-            "-=": "",
-            "//": "",
-            "/_": "",
-            ":.": "",
-            "=&gt;": "",
-            "@": "",
-            "[[a,b],[c,d]]": "",
-            "\\\\": "",
-            "\\nClick in the box to use your keyboard or use the buttons\\n": "",
-            "^^": "",
-            "^^^": "",
-            "__|": "",
-            "_|_": "",
-            "`!=`": "",
-            "`!in`": "",
-            "`&and;`": "",
-            "`&cap;`": "",
-            "`&cup;`": "",
-            "`&gt;-`": "",
-            "`&gt;=`": "",
-            "`&lt;=&gt;`": "",
-            "`&lt;=`": "",
-            "`&lt;x&gt;`": "",
-            "`&or;`": "",
-            "`((n),(k))`": "",
-            "`(x+1)/(x-1)`": "",
-            "`**`": "",
-            "`*`": "",
-            "`+-`": "",
-            "`-&gt;`": "",
-            "`-&lt;`": "",
-            "`-:`": "",
-            "`-=`": "",
-            "`//`": "",
-            "`/_`": "",
-            "`:.`": "",
-            "`=&gt;`": "",
-            "`@`": "",
-            "`[[a,b],[c,d]]`": "",
-            "`\\\\`": "",
-            "`__|`": "",
-            "`_|_`": "",
-            "`AA`": "",
-            "`aleph`": "",
-            "`alpha`": "",
-            "`and`": "",
-            "`bara`": "",
-            "`bba`": "",
-            "`bbba`": "",
-            "`beta`": "",
-            "`CC`": "",
-            "`cca`": "",
-            "`chi`": "",
-            "`darr`": "",
-            "`ddota`": "",
-            "`del`": "",
-            "`Delta`": "",
-            "`delta`": "",
-            "`diamond`": "",
-            "`dota`": "",
-            "`dy/dx`": "",
-            "`EE`": "",
-            "`epsi`": "",
-            "`eta`": "",
-            "`fra`": "",
-            "`Gamma`": "",
-            "`gamma`": "",
-            "`grad`": "",
-            "`harr`": "",
-            "`hArr`": "",
-            "`hata`": "",
-            "`if`": "",
-            "`in`": "",
-            "`int`": "",
-            "`iota`": "",
-            "`kappa`": "",
-            "`lambda`": "",
-            "`Lambda`": "",
-            "`larr`": "",
-            "`lArr`": "",
-            "`lim_(x-&gt;oo)`": "",
-            "`log`": "",
-            "`mu`": "",
-            "`nn`": "",
-            "`NN`": "",
-            "`not`": "",
-            "`nu`": "",
-            "`o+`": "",
-            "`o.`": "",
-            "`O/`": "",
-            "`oint`": "",
-            "`omega`": "",
-            "`Omega`": "",
-            "`oo`": "",
-            "`or`": "",
-            "`ox`": "",
-            "`Phi`": "",
-            "`phi`": "",
-            "`pi`": "",
-            "`Pi`": "",
-            "`prod`": "",
-            "`prop`": "",
-            "`Psi`": "",
-            "`psi`": "",
-            "`QQ`": "",
-            "`quad`": "",
-            "`rArr`": "",
-            "`rho`": "",
-            "`root(n)(x)`": "",
-            "`RR`": "",
-            "`sfa`": "",
-            "`sigma`": "",
-            "`Sigma`": "",
-            "`sqrt(x)`": "",
-            "`square`": "",
-            "`stackrel(-&gt;)(+)`": "",
-            "`sub`": "",
-            "`sube`": "",
-            "`sum`": "",
-            "`sup`": "",
-            "`supe`": "",
-            "`tau`": "",
-            "`theta`": "",
-            "`Theta`": "",
-            "`TT`": "",
-            "`tta`": "",
-            "`uarr`": "",
-            "`ula`": "",
-            "`upsilon`": "",
-            "`uu`": "",
-            "`veca`": "",
-            "`vv`": "",
-            "`x_(mn)`": "",
-            "`xi`": "",
-            "`Xi`": "",
-            "`xx`": "",
-            "`zeta`": "",
-            "`ZZ`": "",
-            "`|-&gt;`": "",
-            "`|--`": "",
-            "`|==`": "",
-            "`|__`": "",
-            "`|~`": "",
-            "`~=`": "",
-            "`~|`": "",
-            "`~~`": "",
-            "AA": "",
-            "aleph": "",
-            "alpha": "",
-            "and": "",
-            "bara": "",
-            "bba": "",
-            "bbba": "",
-            "beta": "",
-            "CC": "",
-            "cca": "",
-            "chi": "",
-            "darr": "",
-            "ddota": "",
-            "del": "",
-            "delta": "",
-            "Delta": "",
-            "diamond": "",
-            "dota": "",
-            "dy/dx": "",
-            "EE": "",
-            "epsi": "",
-            "eta": "",
-            "fra": "",
-            "gamma": "",
-            "Gamma": "",
-            "grad": "",
-            "harr": "",
-            "hArr": "",
-            "hata": "",
-            "if": "",
-            "in": "",
-            "int": "",
-            "int_a^bf(x)dx": "",
-            "iota": "",
-            "kappa": "",
-            "lambda": "",
-            "Lambda": "",
-            "larr": "",
-            "lArr": "",
-            "lim_(x-&gt;oo)": "",
-            "mu": "",
-            "nn": "",
-            "NN": "",
-            "nnn": "",
-            "not": "",
-            "nu": "",
-            "o+": "",
-            "o.": "",
-            "O/": "",
-            "oint": "",
-            "Omega": "",
-            "omega": "",
-            "oo": "",
-            "or": "",
-            "ox": "",
-            "phi": "",
-            "Phi": "",
-            "pi": "",
-            "Pi": "",
-            "prod": "",
-            "prop": "",
-            "Psi": "",
-            "psi": "",
-            "QQ": "",
-            "quad": "",
-            "rArr": "",
-            "rho": "",
-            "root(n)(x)": "",
-            "RR": "",
-            "sfa": "",
-            "sigma": "",
-            "Sigma": "",
-            "sqrt(x)": "",
-            "square": "",
-            "stackrel(-&gt;)(+)": "",
-            "sub": "",
-            "sube": "",
-            "sum": "",
-            "sum_(n=1)^oo": "",
-            "sup": "",
-            "supe": "",
-            "tau": "",
-            "theta": "",
-            "Theta": "",
-            "TT": "",
-            "tta": "",
-            "uarr": "",
-            "ula": "",
-            "upsilon": "",
-            "uu": "",
-            "uuu": "",
-            "veca": "",
-            "vv": "",
-            "vvv": "",
-            "x^(m+n)": "",
-            "x_(mn)": "",
-            "xi": "",
-            "Xi": "",
-            "xx": "",
-            "zeta": "",
-            "ZZ": "",
-            "|-&gt;": "",
-            "|--": "",
-            "|==": "",
-            "|__": "",
-            "|~": "",
-            "~=": "",
-            "~|": "",
-            "~~": ""
-        },
-        "FancySelects": {
-            "'+opt.text+'": ""
-        },
-        "FindReplace": {
-            "';\r\n  var tagc = '": ""
-        },
-        "FormOperations": {
-            "Message Sent": "",
-            "Please Select...": ""
-        },
-        "Forms": {
-            "'onClick'=": "",
-            "Get": "",
-            "pre": ""
-        },
-        "FullPage": {
-            "...": ""
-        },
-        "Gecko": {
-            "The Paste button does not work in this browser for security reasons. Press CTRL-V on your keyboard to paste directly.": ""
-        },
-        "HorizontalRule": {
-            "&#x00d7;": "",
-            "&nbsp;": ""
-        },
-        "InlineStyler": {
-            "-": "<<Equation>>"
-        },
-        "InsertImage": {
-            "You must enter the URL": ""
-        },
-        "InsertNote": {
-            "Insert footnote": "",
-            "Insert Note": ""
-        },
-        "InsertPagebreak": {
-            "Page Break": ""
-        },
-        "InsertSnippet": {
-            "\\n  This is an information about something\\n": "",
-            "Link1": "",
-            "Link2": "",
-            "Link3": "",
-            "Link4": "",
-            "Link5": ""
-        },
-        "InsertSnippet2": {
-            "All Categories": "",
-            "Insert as HTML": "",
-            "Insert as template variable": "",
-            "Only search word beginning": ""
-        },
-        "InsertTable": {
-            "Caption for the table": "",
-            "Layou": "",
-            "Style of the border": "",
-            "You must enter a number of columns": "",
-            "You must enter a number of rows": ""
-        },
-        "LangMarks": {
-            "', '": ""
-        },
-        "Linker": {
-            "(px)": "",
-            "PopupWindow": "",
-            "Shows On Hover": "",
-            "Title:": ""
-        },
-        "Opera": {
-            "MARK": ""
-        },
-        "PasteText": {
-            "Insert text in new paragraph": ""
-        },
-        "PreserveScripts": {
-            "JavaScript": "",
-            "PHP": ""
-        },
-        "QuickTag": {
-            "',\r\n                           'cl': '": ""
-        },
-        "SmartReplace": {
-            "ClosingDoubleQuotes": "",
-            "ClosingSingleQuote": "",
-            "OpeningDoubleQuotes": "",
-            "OpeningSingleQuote": ""
-        },
-        "SuperClean": {
-            "Clean bad HTML from Microsoft Word.": "",
-            "Clean Selection Only": "",
-            "Cleaning Scope": "",
-            "Please stand by while cleaning in process...": "",
-            "Remove alignment (left/right/justify).": "",
-            "Remove all classes (CSS).": "",
-            "Remove All HTML Tags": "",
-            "Remove all styles (CSS).": "",
-            "Remove emphasis and annotations.": "",
-            "Remove Paragraphs": "",
-            "Remove superscripts and subscripts.": "",
-            "Replace directional quote marks with non-directional quote marks.": "",
-            "Vigorously purge HTML from Microsoft Word.": ""
-        },
-        "TableOperations": {
-            "Cell properties": "",
-            "Cell Type:": "",
-            "Do Not Change": "",
-            "Header (th)": "",
-            "Merge cells": "",
-            "Normal (td)": "",
-            "Row properties": "",
-            "Table properties": ""
-        },
-        "UnsavedChanges": {
-            "You have unsaved changes in the editor": ""
-        },
-        "WebKit": {
-            "The Paste button does not work in this browser for security reasons. Press CTRL-V on your keyboard to paste directly.": "<<Gecko>>"
-        },
-        "Xinha": {
-            "1 (8 pt)": "",
-            "2 (10 pt)": "",
-            "3 (12 pt)": "",
-            "4 (14 pt)": "",
-            "5 (18 pt)": "",
-            "6 (24 pt)": "",
-            "7 (36 pt)": "",
-            "Arial": "",
-            "Courier New": "",
-            "Error Loading Xinha.  Developers, check the Error Console for information.": "",
-            "Georgia": "",
-            "Impact": "",
-            "Loading Core": "",
-            "Loading plugin $plugin": "",
-            "Loading plugins": "",
-            "MS Word Cleaner": "",
-            "Register plugin $plugin": "",
-            "Tahoma": "",
-            "Times New Roman": "",
-            "Touch here first to activate editor.": "",
-            "Verdana": "",
-            "Waiting for Iframe to load...": "",
-            "WingDings": "",
-            "Xinha": ""
-        },
-        "BackgroundImage": {
-            "__ TRANSLATOR NOTE __": "*** BACKGROUNDIMAGE IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***",
-            "Set Background": ""
-        },
-        "ExtendedFileManager": {
-            "__ TRANSLATOR NOTE __": "*** EXTENDEDFILEMANAGER IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***",
-            "10%": "",
-            "100%": "",
-            "200%": "",
-            "25%": "",
-            "50%": "",
-            "75%": "",
-            "Filesize:": "",
-            "Preset": "",
-            "Toggle marker color": "",
-            "Xinha Image Editor": ""
-        },
-        "ImageManager": {
-            "__ TRANSLATOR NOTE __": "*** IMAGEMANAGER IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***",
-            "Flickr Picture List": "",
-            "Flickr Pictures": "",
-            "Flickr Selection": "",
-            "Flickr Username/Email": "",
-            "Keyword": "",
-            "No Photos Found": "",
-            "No Videos Found": "",
-            "This Server": "",
-            "YouTube Selection": "",
-            "YouTube Username": "",
-            "YouTube Video List": "",
-            "YouTube Videos": ""
-        },
-        "NoteServer": {
-            "__ TRANSLATOR NOTE __": "*** NOTESERVER IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***",
-            "120%": "",
-            "150%": "",
-            "80%": "",
-            "100%": "<<ExtendedFileManager>>"
-        },
-        "PSLocal": {
-            "__ TRANSLATOR NOTE __": "*** PSLOCAL IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***",
-            "Confirm": "",
-            "Enable": "",
-            "Enable Gears in order to use local document storage and configuration.": "",
-            "Enabling Local Storage": "",
-            "Install": "",
-            "Learn About Local Storage": "",
-            "This will reload the page, causing you to lose any unsaved work.  Press \"OK\" to reload.": "",
-            "Xinha uses Google Gears to enable local document storage.  With Gears installed, you can save drafts of your documents on your hard drive, configure Xinha to look the way you want, and carry this information wherever you use Xinha on the web.": ""
-        },
-        "PSServer": {
-            "__ TRANSLATOR NOTE __": "*** PSSERVER IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***",
-            "File: ": "",
-            "Import": ""
-        },
-        "PersistentStorage": {
-            "__ TRANSLATOR NOTE __": "*** PERSISTENTSTORAGE IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***",
-            "Details": "",
-            "File Browser": "",
-            "Hello    There C ": "",
-            "Hello  There A ": "",
-            "Hello \" There B \"": "",
-            "Hello ' There D '": "",
-            "List of Places": "",
-            "New Document": "",
-            "Open": "",
-            "Open Document": "",
-            "Places": "",
-            "Please enter the name of the directory you'd like to create.": "",
-            "Save Document": "",
-            "This will erase any unsaved content.  If you're certain, please click OK to continue.": "",
-            "Web URL": "",
-            "Confirm": "<<PSLocal>>"
-        }
-    }
-}
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/lang/merged/ro.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/lang/merged/ro.js
deleted file mode 100644
index ab6fbc9..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/lang/merged/ro.js
+++ /dev/null
@@ -1,1577 +0,0 @@
-// Xinha Language Combined Translation File
-//
-// LANG: "ro", ENCODING: UTF-8
-//
-// INSTRUCTIONS TO TRANSLATORS
-// ===========================================================================
-//
-// Your translation must be in UTF-8 Character Encoding.
-//
-// This is a JSON encoded file (plus comments), strings should be double-quote
-// only, do not use single quotes to surround strings - "hello", not 'hello'
-// do not have a trailing comma after the last entry in a section.
-//
-// Only full line comments are allowed (that a comments occupy entire lines).
-//
-// Search for the __NEW_TRANSLATIONS__ section below, this is where you will
-// want to focus, this section includes things that do not presently have a 
-// translation or for which the translation needs to be checked for accuracy.
-//
-// In the New Translations section a translation string is one of the following
-//
-//  "English String Here" : ""
-//     This means it is not translated yet, add your translation...
-//     "English String Here" : "Klingon String Here"
-//
-//  "English String Here" : "Translated String Here"
-//     This means that an existing translation for this string, in some other
-//     section has been found, and used.  Check that it is approprite for this
-//     section and if it is, that's fine leave it as is, otherwise change as
-//     appropriate.
-//
-//  "English String Here" : "<<AnotherSection>>"
-//     This means use the same translation for this string as <<AnotherSection>>
-//     this saves you re-tranlating strings.  If the Context of this section
-//     and the context of AnotherSection seem the same, that's fine leave it
-//     using that translation, but if this section needs a different translation, 
-//     you can provide it by replacing the link (<<AnotherSection>>) with that
-//     new translation.  For example - a "Table" in say "DataPlugin" is 
-//     perhaps translated differently to "Table" in "FurniturePlugin".
-//
-// TESTING YOUR TRANSLATION
-// ===========================================================================
-// Simply place your translation file on your webserver somewhere for example
-//
-//   /xinha/lang/merged/ro.js
-//
-// and then tell Xinha where to get it (before loading XinhaCore.js) by 
-//
-//  _editor_lang              = 'ro';
-//  _editor_lang_merged_file  = '/xinha/lang/merged/ro.js';
-//
-// Xinha will load your new language definition.
-//
-// SUBMITTING YOUR TRANSLATION
-// ===========================================================================
-// Simply create a Ticket on the Xinha website and attach your translation 
-// file.
-//
-// The Xinha developers will take your file and use the 
-//     contrib/lc_split_merged_file.php
-// script to load it into the Xinha distribution.
-
-{
-    "Abbreviation": {
-        "Cancel": "Renunţă",
-        "OK": "Acceptă"
-    },
-    "AboutBox": {
-        "About this editor": "Despre editor"
-    },
-    "BackgroundImage": {
-        "Cancel": "Renunţă"
-    },
-    "ColorPicker": {
-        "Color: ": "Culoare",
-        "OK": "Acceptă"
-    },
-    "ContextMenu": {
-        "Justify Center": "Aliniere pe centru",
-        "Justify Full": "Aliniere în ambele părţi",
-        "Justify Left": "Aliniere la stânga",
-        "Justify Right": "Aliniere la dreapta"
-    },
-    "CreateLink": {
-        "Cancel": "Renunţă",
-        "Insert/Modify Link": "Inserează/modifcă link",
-        "New window (_blank)": "Fereastră nouă (_blank)",
-        "None (use implicit)": "Nimic (foloseşte ce-i implicit)",
-        "OK": "Acceptă",
-        "Other": "Alt target",
-        "Same frame (_self)": "Aceeaşi fereastră (_self)",
-        "Target:": "Ţinta:",
-        "Title (tooltip):": "Titlul (tooltip):",
-        "Top frame (_top)": "Fereastra principală (_top)",
-        "URL:": "URL:"
-    },
-    "EditTag": {
-        "Cancel": "Renunţă",
-        "OK": "Acceptă"
-    },
-    "Equation": {
-        "Cancel": "Renunţă",
-        "OK": "Acceptă"
-    },
-    "ExtendedFileManager": {
-        "Align": "Aliniere",
-        "Baseline": "Baseline",
-        "Border": "Chenar",
-        "Bottom": "Jos",
-        "Cancel": "Renunţă",
-        "Color": "Culoare",
-        "Height": "Înălţimea",
-        "Height:": "Înălţimea",
-        "Left": "Stânga",
-        "Margin": "Margine",
-        "Middle": "Mijloc",
-        "New window (_blank)": "Fereastră nouă (_blank)",
-        "None (use implicit)": "Nimic (foloseşte ce-i implicit)",
-        "OK": "Acceptă",
-        "Padding": "Spaţiere",
-        "Right": "Dreapta",
-        "Same frame (_self)": "Aceeaşi fereastră (_self)",
-        "Title (tooltip)": "Titlul (tooltip):",
-        "Top": "Sus",
-        "Top frame (_top)": "Fereastra principală (_top)",
-        "Width": "Lăţime",
-        "Width:": "Lăţime"
-    },
-    "FindReplace": {
-        "Replace with:": "Înlocuieşte cu"
-    },
-    "Forms": {
-        "Cancel": "Renunţă",
-        "Image URL:": "URL-ul imaginii",
-        "OK": "Acceptă"
-    },
-    "FullPage": {
-        "Alternate style-sheet:": "Template CSS alternativ:",
-        "Background color:": "Culoare de fundal:",
-        "Cancel": "Renunţă",
-        "DOCTYPE:": "DOCTYPE:",
-        "Description:": "Descriere",
-        "Document properties": "Proprietăţile documentului",
-        "Document title:": "Titlul documentului:",
-        "OK": "Acceptă",
-        "Primary style-sheet:": "Template CSS principal:",
-        "Text color:": "Culoare text:"
-    },
-    "HorizontalRule": {
-        "Cancel": "Renunţă",
-        "Center": "Centru",
-        "Color:": "Culoare",
-        "Height:": "Înălţimea",
-        "Horizontal Rule": "Linie orizontală",
-        "Layout": "Aranjament",
-        "Left": "Stânga",
-        "OK": "Acceptă",
-        "Right": "Dreapta",
-        "Width:": "Lăţime",
-        "percent": "procente",
-        "pixels": "pixeli"
-    },
-    "ImageManager": {
-        "Baseline": "Baseline",
-        "Bottom": "Jos",
-        "Cancel": "Renunţă",
-        "Height:": "Înălţimea",
-        "Left": "Stânga",
-        "Middle": "Mijloc",
-        "OK": "Acceptă",
-        "Right": "Dreapta",
-        "Top": "Sus",
-        "Width:": "Lăţime"
-    },
-    "InlineStyler": {
-        "Background": "Fundal",
-        "Baseline": "Baseline",
-        "Border": "Chenar",
-        "Bottom": "Jos",
-        "Center": "Centru",
-        "Char": "Caracter",
-        "Collapsed borders": "Chenare asimilate",
-        "FG Color": "Culoare text",
-        "Float": "Poziţie",
-        "Height": "Înălţimea",
-        "Image URL": "URL-ul imaginii",
-        "Justify": "Justify",
-        "Layout": "Aranjament",
-        "Left": "Stânga",
-        "Margin": "Margine",
-        "Middle": "Mijloc",
-        "None": "Nimic",
-        "Padding": "Spaţiere",
-        "Right": "Dreapta",
-        "Text align": "Aliniere",
-        "Top": "Sus",
-        "Vertical align": "Aliniere pe verticală",
-        "Width": "Lăţime",
-        "percent": "procente",
-        "pixels": "pixeli"
-    },
-    "InsertAnchor": {
-        "Cancel": "Renunţă",
-        "OK": "Acceptă"
-    },
-    "InsertImage": {
-        "Baseline": "Baseline",
-        "Bottom": "Jos",
-        "Cancel": "Renunţă",
-        "Image URL:": "URL-ul imaginii",
-        "Layout": "Aranjament",
-        "Left": "Stânga",
-        "Middle": "Mijloc",
-        "OK": "Acceptă",
-        "Right": "Dreapta",
-        "Spacing": "Între celule",
-        "Top": "Sus"
-    },
-    "InsertMarquee": {
-        "Cancel": "Renunţă",
-        "Height:": "Înălţimea",
-        "Left": "Stânga",
-        "OK": "Acceptă",
-        "Right": "Dreapta",
-        "Width:": "Lăţime"
-    },
-    "InsertNote": {
-        "Cancel": "Renunţă"
-    },
-    "InsertPicture": {
-        "Baseline": "Baseline",
-        "Bottom": "Jos",
-        "Cancel": "Renunţă",
-        "Height:": "Înălţimea",
-        "Image URL:": "URL-ul imaginii",
-        "Layout": "Aranjament",
-        "Left": "Stânga",
-        "Middle": "Mijloc",
-        "OK": "Acceptă",
-        "Right": "Dreapta",
-        "Spacing": "Între celule",
-        "Top": "Sus",
-        "Width:": "Lăţime"
-    },
-    "InsertSnippet": {
-        "Cancel": "Renunţă"
-    },
-    "InsertSnippet2": {
-        "Cancel": "Renunţă"
-    },
-    "InsertTable": {
-        "Baseline": "Baseline",
-        "Border": "Chenar",
-        "Bottom": "Jos",
-        "Cancel": "Renunţă",
-        "Caption": "Titlu de tabel",
-        "Insert Table": "Inserează un tabel",
-        "Layout": "Aranjament",
-        "Left": "Stânga",
-        "Middle": "Mijloc",
-        "OK": "Acceptă",
-        "Percent": "procente",
-        "Pixels": "pixeli",
-        "Right": "Dreapta",
-        "Spacing": "Între celule",
-        "Top": "Sus",
-        "Width:": "Lăţime"
-    },
-    "Linker": {
-        "Cancel": "Renunţă",
-        "Insert/Modify Link": "Inserează/modifcă link",
-        "OK": "Acceptă",
-        "Target:": "Ţinta:",
-        "URL:": "URL:"
-    },
-    "NoteServer": {
-        "Cancel": "Renunţă",
-        "OK": "Acceptă"
-    },
-    "PSLocal": {
-        "Cancel": "Renunţă"
-    },
-    "PasteText": {
-        "Cancel": "Renunţă",
-        "OK": "Acceptă"
-    },
-    "PersistentStorage": {
-        "Cancel": "Renunţă"
-    },
-    "QuickTag": {
-        "Cancel": "Renunţă"
-    },
-    "SetId": {
-        "Cancel": "Renunţă",
-        "OK": "Acceptă"
-    },
-    "SmartReplace": {
-        "OK": "Acceptă"
-    },
-    "SpellChecker": {
-        "Cancel": "Anulează",
-        "Dictionary": "Dicţionar",
-        "Finished list of mispelled words": "Am terminat lista de cuvinte greşite",
-        "I will open it in a new page.": "O voi deschide într-o altă fereastră.",
-        "Ignore": "Ignoră",
-        "Ignore all": "Ignoră toate",
-        "No mispelled words found with the selected dictionary.": "Nu am găsit nici un cuvânt greşit cu acest dicţionar.",
-        "OK": "OK",
-        "Original word": "Cuvântul original",
-        "Please confirm that you want to open this link": "Vă rog confirmaţi că vreţi să deschideţi acest link",
-        "Please wait.  Calling spell checker.": "Vă rog aşteptaţi.  Apelez spell-checker-ul.",
-        "Please wait: changing dictionary to": "Vă rog aşteptaţi.  Schimb dicţionarul cu",
-        "Re-check": "Scanează",
-        "Replace": "Înlocuieşte",
-        "Replace all": "Înlocuieşte toate",
-        "Replace with": "Înlocuieşte cu",
-        "Spell-check": "Detectează greşeli",
-        "Suggestions": "Sugestii",
-        "This will drop changes and quit spell checker.  Please confirm.": "Doriţi să renunţaţi la modificări şi să închid spell-checker-ul?"
-    },
-    "SuperClean": {
-        "Cancel": "Renunţă",
-        "OK": "Acceptă"
-    },
-    "TableOperations": {
-        "All four sides": "Toate părţile",
-        "Borders": "Chenare",
-        "Cancel": "Renunţă",
-        "Caption": "Titlu de tabel",
-        "Cell Properties": "Proprietăţile celulei",
-        "Cell properties": "Proprietăţile celulei",
-        "Delete cell": "Şterge celula",
-        "Delete column": "Şterge coloana",
-        "Delete row": "Şterge rândul",
-        "Description": "Descriere",
-        "Frames": "Chenare",
-        "Insert cell after": "Inserează o celulă la dreapta",
-        "Insert cell before": "Inserează o celulă la stânga",
-        "Insert column after": "Inserează o coloană la dreapta",
-        "Insert column before": "Inserează o coloană la stânga",
-        "Insert row after": "Inserează un rând după",
-        "Insert row before": "Inserează un rând înainte",
-        "Merge cells": "Uneşte celulele",
-        "No rules": "Fără linii",
-        "No sides": "Fără părţi",
-        "OK": "Acceptă",
-        "Padding": "Spaţiere",
-        "Please click into some cell": "Vă rog să daţi click într-o celulă",
-        "Row Properties": "Proprietăţile liniei",
-        "Row properties": "Proprietăţile rândului",
-        "Rules will appear between all rows and columns": "Vor apărea linii între toate rândurile şi coloanele",
-        "Rules will appear between columns only": "Vor apărea doar linii verticale",
-        "Rules will appear between rows only": "Vor apărea doar linii orizontale",
-        "Spacing": "Între celule",
-        "Spacing and padding": "Spaţierea",
-        "Split column": "Împarte coloana",
-        "Split row": "Împarte rândul",
-        "Summary": "Sumar",
-        "Table Properties": "Proprietăţile tabelei",
-        "Table properties": "Proprietăţile tabelei",
-        "The bottom side only": "Doar partea de jos",
-        "The left-hand side only": "Doar partea din stânga",
-        "The right and left sides only": "Partea din stânga şi cea din dreapta",
-        "The right-hand side only": "Doar partea din dreapta",
-        "The top and bottom sides only": "Partea de sus si cea de jos",
-        "The top side only": "Doar partea de sus",
-        "Xinha cowardly refuses to delete the last cell in row.": "Xinha refuză cu laşitate să şteargă ultima celulă din rând.",
-        "Xinha cowardly refuses to delete the last column in table.": "Xinha refuză cu laşitate să şteargă ultima coloamă din tabela.",
-        "Xinha cowardly refuses to delete the last row in table.": "Xinha refuză cu laşitate să şteargă ultimul rând din tabela.",
-        "pixels": "pixeli"
-    },
-    "Template": {
-        "Cancel": "Renunţă"
-    },
-    "UnFormat": {
-        "Cancel": "Renunţă",
-        "OK": "Acceptă"
-    },
-    "Xinha": {
-        "About this editor": "Despre editor",
-        "Background Color": "Culoare de fundal",
-        "Bold": "Îngroşat",
-        "Bulleted List": "Listă marcată",
-        "Copy selection": "Copie în clipboard",
-        "Current style": "Stilul curent",
-        "Cut selection": "Taie în clipboard",
-        "Decrease Indent": "Micşorează alineatul",
-        "Direction left to right": "Direcţia de scriere: stânga - dreapta",
-        "Direction right to left": "Direcţia de scriere: dreapta - stânga",
-        "Font Color": "Culoarea textului",
-        "Help using editor": "Documentaţie (devel)",
-        "Horizontal Rule": "Linie orizontală",
-        "Increase Indent": "Măreşte alineatul",
-        "Insert Table": "Inserează un tabel",
-        "Insert Web Link": "Inserează/modifică link",
-        "Insert/Modify Image": "Inserează/modifică imagine",
-        "Italic": "Italic",
-        "Justify Center": "Aliniere pe centru",
-        "Justify Full": "Aliniere în ambele părţi",
-        "Justify Left": "Aliniere la stânga",
-        "Justify Right": "Aliniere la dreapta",
-        "Ordered List": "Listă ordonată",
-        "Paste from clipboard": "Aduce din clipboard",
-        "Path": "Calea",
-        "Redoes your last action": "Reface ultima acţiune anulată",
-        "Strikethrough": "Tăiat",
-        "Subscript": "Indice jos",
-        "Superscript": "Indice sus",
-        "Toggle HTML Source": "Sursa HTML / WYSIWYG",
-        "Underline": "Subliniat",
-        "Undoes your last action": "Anulează ultima acţiune",
-        "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."
-    },
-    "__NEW_TRANSLATIONS__": {
-        "Abbreviation": {
-            "Abbreviation": "",
-            "Delete": "",
-            "Expansion:": ""
-        },
-        "AboutBox": {
-            "Close": "<<Xinha>>"
-        },
-        "CharCounter": {
-            "... in progress": "",
-            "Chars": "",
-            "HTML": "",
-            "Words": ""
-        },
-        "CharacterMap": {
-            "Insert special character": ""
-        },
-        "ColorPicker": {
-            "Click a color...": "",
-            "Sample": "",
-            "Web Safe: ": "",
-            "Close": "<<Xinha>>"
-        },
-        "ContextMenu": {
-            "_Delete Row": "",
-            "_Image Properties...": "",
-            "_Modify Link...": "",
-            "_Remove Link...": "",
-            "_Table Properties...": "",
-            "C_ell Properties...": "",
-            "Chec_k Link...": "",
-            "Copy": "",
-            "Create a link": "",
-            "Current URL is": "",
-            "Cut": "",
-            "De_lete Column": "",
-            "Delete Cell": "",
-            "Delete the current column": "",
-            "Delete the current row": "",
-            "How did you get here? (Please report!)": "",
-            "I_nsert Row Before": "",
-            "In_sert Row After": "",
-            "Insert _Column Before": "",
-            "Insert a new column after the current one": "",
-            "Insert a new column before the current one": "",
-            "Insert a new row after the current one": "",
-            "Insert a new row before the current one": "",
-            "Insert a paragraph after the current node": "",
-            "Insert a paragraph before the current node": "",
-            "Insert C_olumn After": "",
-            "Insert Cell After": "",
-            "Insert Cell Before": "",
-            "Insert paragraph after": "",
-            "Insert paragraph before": "",
-            "Link points to:": "",
-            "Make lin_k...": "",
-            "Merge Cells": "",
-            "Opens this link in a new window": "",
-            "Paste": "",
-            "Please confirm that you want to remove this element:": "",
-            "Please confirm that you want to unlink this element.": "",
-            "Remove the $elem Element...": "",
-            "Remove this node from the document": "",
-            "Ro_w Properties...": "",
-            "Show the image properties dialog": "",
-            "Show the Table Cell Properties dialog": "",
-            "Show the Table Properties dialog": "",
-            "Show the Table Row Properties dialog": "",
-            "Unlink the current element": ""
-        },
-        "CreateLink": {
-            "Are you sure you wish to remove this link?": "",
-            "You need to select some text before creating a link": ""
-        },
-        "DefinitionList": {
-            "definition description": "",
-            "definition list": "",
-            "definition term": ""
-        },
-        "Dialogs": {
-            "Some Text Here": ""
-        },
-        "DynamicCSS": {
-            "Choose stylesheet": "",
-            "Default": "",
-            "Undefined": ""
-        },
-        "EditTag": {
-            "Edit HTML for selected text": "",
-            "Edit Tag By Peg": "",
-            "Tag Editor": ""
-        },
-        "Equation": {
-            "!=": "",
-            "!in": "",
-            "&gt;-": "",
-            "&gt;=": "",
-            "&lt;=": "",
-            "&lt;=&gt;": "",
-            "&lt;x&gt;": "",
-            "&nbsp; `!` &nbsp;": "",
-            "&nbsp; `.` &nbsp;": "",
-            "&nbsp; `0` &nbsp;": "",
-            "&nbsp; `2` &nbsp;": "",
-            "&nbsp; `3` &nbsp;": "",
-            "&nbsp; `4` &nbsp;": "",
-            "&nbsp; `5` &nbsp;": "",
-            "&nbsp; `6` &nbsp;": "",
-            "&nbsp; `7` &nbsp;": "",
-            "&nbsp; `8` &nbsp;": "",
-            "&nbsp; `9` &nbsp;": "",
-            "&nbsp; `e` &nbsp;": "",
-            "&nbsp;&nbsp;`1` &nbsp;": "",
-            "&nbsp;`+{::}`&nbsp;": "",
-            "&nbsp;`-:\\ `": "",
-            "&nbsp;`-{::}`&nbsp;": "",
-            "&nbsp;`C`&nbsp;": "",
-            "&nbsp;`cos`": "",
-            "&nbsp;`ln`&nbsp;": "",
-            "&nbsp;`pi` &nbsp;": "",
-            "&nbsp;`sin`": "",
-            "&nbsp;`tan`": "",
-            "&nbsp;`times`&nbsp;": "",
-            "&quot;text&quot;": "",
-            "'+formula+'": "",
-            "((n),(k))": "",
-            "(x+1)/(x-1)": "",
-            "*": "",
-            "**": "",
-            "+-": "",
-            "-&gt;": "",
-            "-&lt;": "",
-            "-:": "",
-            "-=": "",
-            "//": "",
-            "/_": "",
-            ":.": "",
-            "=&gt;": "",
-            "@": "",
-            "[[a,b],[c,d]]": "",
-            "\\\\": "",
-            "\\nClick in the box to use your keyboard or use the buttons\\n": "",
-            "^^": "",
-            "^^^": "",
-            "__|": "",
-            "_|_": "",
-            "`!=`": "",
-            "`!in`": "",
-            "`&and;`": "",
-            "`&cap;`": "",
-            "`&cup;`": "",
-            "`&gt;-`": "",
-            "`&gt;=`": "",
-            "`&lt;=&gt;`": "",
-            "`&lt;=`": "",
-            "`&lt;x&gt;`": "",
-            "`&or;`": "",
-            "`&quot;text&quot;`": "",
-            "`((n),(k))`": "",
-            "`(x+1)/(x-1)`": "",
-            "`**`": "",
-            "`*`": "",
-            "`+-`": "",
-            "`-&gt;`": "",
-            "`-&lt;`": "",
-            "`-:`": "",
-            "`-=`": "",
-            "`//`": "",
-            "`/_`": "",
-            "`:.`": "",
-            "`=&gt;`": "",
-            "`@`": "",
-            "`[[a,b],[c,d]]`": "",
-            "`\\\\`": "",
-            "`__|`": "",
-            "`_|_`": "",
-            "`AA`": "",
-            "`aleph`": "",
-            "`alpha`": "",
-            "`and`": "",
-            "`bara`": "",
-            "`bba`": "",
-            "`bbba`": "",
-            "`beta`": "",
-            "`CC`": "",
-            "`cca`": "",
-            "`chi`": "",
-            "`darr`": "",
-            "`ddota`": "",
-            "`del`": "",
-            "`Delta`": "",
-            "`delta`": "",
-            "`diamond`": "",
-            "`dota`": "",
-            "`dy/dx`": "",
-            "`EE`": "",
-            "`epsi`": "",
-            "`eta`": "",
-            "`fra`": "",
-            "`Gamma`": "",
-            "`gamma`": "",
-            "`grad`": "",
-            "`harr`": "",
-            "`hArr`": "",
-            "`hata`": "",
-            "`if`": "",
-            "`in`": "",
-            "`int`": "",
-            "`iota`": "",
-            "`kappa`": "",
-            "`Lambda`": "",
-            "`lambda`": "",
-            "`lArr`": "",
-            "`larr`": "",
-            "`lim_(x-&gt;oo)`": "",
-            "`log`": "",
-            "`mu`": "",
-            "`NN`": "",
-            "`nn`": "",
-            "`not`": "",
-            "`nu`": "",
-            "`o+`": "",
-            "`o.`": "",
-            "`O/`": "",
-            "`oint`": "",
-            "`omega`": "",
-            "`Omega`": "",
-            "`oo`": "",
-            "`or`": "",
-            "`ox`": "",
-            "`phi`": "",
-            "`Phi`": "",
-            "`Pi`": "",
-            "`pi`": "",
-            "`prod`": "",
-            "`prop`": "",
-            "`Psi`": "",
-            "`psi`": "",
-            "`QQ`": "",
-            "`quad`": "",
-            "`rArr`": "",
-            "`rho`": "",
-            "`root(n)(x)`": "",
-            "`RR`": "",
-            "`sfa`": "",
-            "`Sigma`": "",
-            "`sigma`": "",
-            "`sqrt(x)`": "",
-            "`square`": "",
-            "`stackrel(-&gt;)(+)`": "",
-            "`sub`": "",
-            "`sube`": "",
-            "`sum`": "",
-            "`sup`": "",
-            "`supe`": "",
-            "`tau`": "",
-            "`Theta`": "",
-            "`theta`": "",
-            "`TT`": "",
-            "`tta`": "",
-            "`uarr`": "",
-            "`ula`": "",
-            "`upsilon`": "",
-            "`uu`": "",
-            "`veca`": "",
-            "`vv`": "",
-            "`x_(mn)`": "",
-            "`Xi`": "",
-            "`xi`": "",
-            "`xx`": "",
-            "`zeta`": "",
-            "`ZZ`": "",
-            "`|-&gt;`": "",
-            "`|--`": "",
-            "`|==`": "",
-            "`|__`": "",
-            "`|~`": "",
-            "`~=`": "",
-            "`~|`": "",
-            "`~~`": "",
-            "AA": "",
-            "aleph": "",
-            "alpha": "",
-            "and": "",
-            "AsciiMath Formula Input": "",
-            "AsciiMathML Example": "",
-            "bara": "",
-            "Based on ASCIIMathML by": "",
-            "bba": "",
-            "bbba": "",
-            "beta": "",
-            "CC": "",
-            "cca": "",
-            "chi": "",
-            "darr": "",
-            "ddota": "",
-            "del": "",
-            "delta": "",
-            "Delta": "",
-            "diamond": "",
-            "dota": "",
-            "dy/dx": "",
-            "EE": "",
-            "epsi": "",
-            "eta": "",
-            "For more information on AsciiMathML visit this page:": "",
-            "Formula Editor": "",
-            "fra": "",
-            "gamma": "",
-            "Gamma": "",
-            "grad": "",
-            "hArr": "",
-            "harr": "",
-            "hata": "",
-            "if": "",
-            "in": "",
-            "Input": "",
-            "int": "",
-            "int_a^bf(x)dx": "",
-            "iota": "",
-            "kappa": "",
-            "Lambda": "",
-            "lambda": "",
-            "larr": "",
-            "lArr": "",
-            "lim_(x-&gt;oo)": "",
-            "mu": "",
-            "NN": "",
-            "nn": "",
-            "nnn": "",
-            "not": "",
-            "nu": "",
-            "o+": "",
-            "o.": "",
-            "O/": "",
-            "oint": "",
-            "Omega": "",
-            "omega": "",
-            "oo": "",
-            "or": "",
-            "ox": "",
-            "phi": "",
-            "Phi": "",
-            "pi": "",
-            "Pi": "",
-            "Preview": "",
-            "prod": "",
-            "prop": "",
-            "psi": "",
-            "Psi": "",
-            "QQ": "",
-            "quad": "",
-            "rArr": "",
-            "rho": "",
-            "root(n)(x)": "",
-            "RR": "",
-            "sfa": "",
-            "sigma": "",
-            "Sigma": "",
-            "sqrt(x)": "",
-            "square": "",
-            "stackrel(-&gt;)(+)": "",
-            "sub": "",
-            "sube": "",
-            "sum": "",
-            "sum_(n=1)^oo": "",
-            "sup": "",
-            "supe": "",
-            "tau": "",
-            "Theta": "",
-            "theta": "",
-            "TT": "",
-            "tta": "",
-            "uarr": "",
-            "ula": "",
-            "upsilon": "",
-            "uu": "",
-            "uuu": "",
-            "veca": "",
-            "vv": "",
-            "vvv": "",
-            "x^(m+n)": "",
-            "x_(mn)": "",
-            "Xi": "",
-            "xi": "",
-            "xx": "",
-            "zeta": "",
-            "ZZ": "",
-            "|-&gt;": "",
-            "|--": "",
-            "|==": "",
-            "|__": "",
-            "|~": "",
-            "~=": "",
-            "~|": "",
-            "~~": ""
-        },
-        "FancySelects": {
-            "'+opt.text+'": ""
-        },
-        "FindReplace": {
-            "';\r\n  var tagc = '": "",
-            "Case sensitive search": "",
-            "Clear": "",
-            "Done": "",
-            "Enter the text you want to find": "",
-            "Find and Replace": "",
-            "found item": "",
-            "found items": "",
-            "Highlight": "",
-            "Inform a replacement word": "",
-            "Next": "",
-            "not found": "",
-            "Options": "",
-            "replaced item": "",
-            "replaced items": "",
-            "Search for:": "",
-            "Substitute all occurrences": "",
-            "Substitute this occurrence?": "",
-            "Undo": "",
-            "Whole words only": ""
-        },
-        "FormOperations": {
-            "Enter the name for new option.": "",
-            "Form Editor": "",
-            "Insert a check box.": "",
-            "Insert a Form.": "",
-            "Insert a multi-line text field.": "",
-            "Insert a radio button.": "",
-            "Insert a select field.": "",
-            "Insert a submit/reset button.": "",
-            "Insert a text, password or hidden field.": "",
-            "Message Sent": "",
-            "Please Select...": ""
-        },
-        "Forms": {
-            "'onClick'=": "",
-            "Access Key:": "",
-            "Action URL:": "",
-            "Button Script": "",
-            "Checked": "",
-            "Columns:": "",
-            "Default text (optional)": "",
-            "Dimensions": "",
-            "Disabled": "",
-            "Encoding:": "",
-            "For Control:": "",
-            "Form": "",
-            "Form Element: FIELDSET": "",
-            "Form Element: INPUT": "",
-            "Form Element: LABEL": "",
-            "Form Element: SELECT": "",
-            "Form Element: TEXTAREA": "",
-            "Form handler script": "",
-            "Form Name:": "",
-            "Get": "",
-            "Hard": "",
-            "Height in number of rows": "",
-            "HTML-Form to CGI (default)": "",
-            "Image source": "",
-            "Initial Text:": "",
-            "Insert/Edit Form": "",
-            "Insert/Edit Form Element FIELDSET": "",
-            "Insert/Edit Form Element INPUT": "",
-            "Insert/Edit Form Element LABEL": "",
-            "Insert/Edit Form Element SELECT": "",
-            "Insert/Edit Form Element TEXTAREA": "",
-            "Javascript for button click": "",
-            "Label:": "",
-            "Legend:": "",
-            "Max length:": "",
-            "Maximum number of characters accepted": "",
-            "Method:": "",
-            "multipart Form Data (File-Upload)": "",
-            "Name": "",
-            "Name of the form input": "",
-            "Name of the form select": "",
-            "name of the textarea": "",
-            "Name/ID:": "",
-            "normal": "",
-            "nowrap": "",
-            "Off": "",
-            "Physical": "",
-            "Please enter a Label": "",
-            "Post": "",
-            "pre": "",
-            "Read Only": "",
-            "Rows:": "",
-            "Size of text box in characters": "",
-            "Size:": "",
-            "Soft": "",
-            "Tab Index:": "",
-            "Target Frame:": "",
-            "Text:": "",
-            "URL of image": "",
-            "Value of the form input": "",
-            "Value:": "",
-            "Virtual": "",
-            "Width in number of characters": "",
-            "Wrap Mode:": "",
-            "You must enter a Name": "",
-            "Options": "<<FindReplace>>"
-        },
-        "FullPage": {
-            "...": "",
-            "Character set:": "",
-            "cyrillic (ISO-8859-5)": "",
-            "cyrillic (KOI8-R)": "",
-            "cyrillic (WINDOWS-1251)": "",
-            "Keywords:": "",
-            "UTF-8 (recommended)": "",
-            "western (ISO-8859-1)": ""
-        },
-        "FullScreen": {
-            "Maximize/Minimize Editor": ""
-        },
-        "Gecko": {
-            "The Paste button does not work in this browser for security reasons. Press CTRL-V on your keyboard to paste directly.": ""
-        },
-        "HorizontalRule": {
-            "&#x00d7;": "",
-            "&nbsp;": "",
-            "Alignment:": "",
-            "Insert/edit horizontal rule": "",
-            "Insert/Edit Horizontal Rule": "",
-            "No shading": "",
-            "Style": ""
-        },
-        "InlineStyler": {
-            "CSS Style": "",
-            "-": "<<Equation>>"
-        },
-        "InsertAnchor": {
-            "Anchor name": "",
-            "Insert Anchor": "",
-            "Delete": "<<Abbreviation>>"
-        },
-        "InsertImage": {
-            "Absbottom": "",
-            "Absmiddle": "",
-            "Alternate text:": "",
-            "Border thickness:": "",
-            "Enter the image URL here": "",
-            "For browsers that don't support images": "",
-            "Horizontal padding": "",
-            "Horizontal:": "",
-            "Image Preview:": "",
-            "Insert Image": "",
-            "Leave empty for no border": "",
-            "Not set": "",
-            "Positioning of this image": "",
-            "Preview the image in a new window": "",
-            "Texttop": "",
-            "Vertical padding": "",
-            "Vertical:": "",
-            "You must enter the URL": "",
-            "Alignment:": "<<HorizontalRule>>",
-            "Preview": "<<Equation>>"
-        },
-        "InsertNote": {
-            "Insert": "",
-            "Insert footnote": "",
-            "Insert Note": ""
-        },
-        "InsertPagebreak": {
-            "Page break": "",
-            "Page Break": ""
-        },
-        "InsertSmiley": {
-            "Insert Smiley": ""
-        },
-        "InsertSnippet": {
-            "\\n  This is an information about something\\n": "",
-            "Hide preview": "",
-            "Insert as": "",
-            "Insert Snippet": "",
-            "InsertSnippet for Xinha": "",
-            "Link1": "",
-            "Link2": "",
-            "Link3": "",
-            "Link4": "",
-            "Link5": "",
-            "Show preview": "",
-            "This is an information about something": "",
-            "Variable": ""
-        },
-        "InsertSnippet2": {
-            "All Categories": "",
-            "Filter": "",
-            "Insert as HTML": "",
-            "Insert as template variable": "",
-            "Only search word beginning": "",
-            "HTML": "<<CharCounter>>",
-            "Insert Snippet": "<<InsertSnippet>>",
-            "InsertSnippet for Xinha": "<<InsertSnippet>>",
-            "Variable": "<<InsertSnippet>>"
-        },
-        "InsertTable": {
-            "Caption for the table": "",
-            "Cell padding:": "",
-            "Cell spacing:": "",
-            "Collapse borders:": "",
-            "Cols:": "",
-            "Em": "",
-            "Fixed width columns": "",
-            "Layou": "",
-            "Number of columns": "",
-            "Number of rows": "",
-            "Positioning of this table": "",
-            "Space between adjacent cells": "",
-            "Space between content and border in cell": "",
-            "Style of the border": "",
-            "Width of the table": "",
-            "Width unit": "",
-            "You must enter a number of columns": "",
-            "You must enter a number of rows": "",
-            "Absbottom": "<<InsertImage>>",
-            "Absmiddle": "<<InsertImage>>",
-            "Alignment:": "<<HorizontalRule>>",
-            "Border thickness:": "<<InsertImage>>",
-            "Leave empty for no border": "<<InsertImage>>",
-            "Not set": "<<InsertImage>>",
-            "Rows:": "<<Forms>>",
-            "Texttop": "<<InsertImage>>"
-        },
-        "LangMarks": {
-            "&mdash; language &mdash;": "",
-            "', '": "",
-            "English": "",
-            "French": "",
-            "Greek": "",
-            "language select": "",
-            "Latin": ""
-        },
-        "Linker": {
-            "(px)": "",
-            "Anchor-Link": "",
-            "Anchor:": "",
-            "Email Address:": "",
-            "Email Link": "",
-            "Location Bar:": "",
-            "Menu Bar:": "",
-            "Message Template:": "",
-            "New Window": "",
-            "Ordinary Link": "",
-            "Popup Window": "",
-            "PopupWindow": "",
-            "Remove Link": "",
-            "Resizeable:": "",
-            "Same Window (jump out of frames)": "",
-            "Scrollbars:": "",
-            "Shows On Hover": "",
-            "Status Bar:": "",
-            "Subject:": "",
-            "Title:": "",
-            "Toolbar:": "",
-            "URL Link": "",
-            "You must select some text before making a new link.": "",
-            "Are you sure you wish to remove this link?": "<<CreateLink>>",
-            "Name:": "<<Forms>>",
-            "Size:": "<<Forms>>"
-        },
-        "ListType": {
-            "Choose list style type (for ordered lists)": "",
-            "Decimal numbers": "",
-            "Lower greek letters": "",
-            "Lower latin letters": "",
-            "Lower roman numbers": "",
-            "Upper latin letters": "",
-            "Upper roman numbers": ""
-        },
-        "MootoolsFileManager": {
-            "Insert File Link": "",
-            "You must select some text before making a new link.": "<<Linker>>"
-        },
-        "Opera": {
-            "MARK": "",
-            "The Paste button does not work in Mozilla based web browsers (technical security reasons). Press CTRL-V on your keyboard to paste directly.": ""
-        },
-        "PasteText": {
-            "Insert text in new paragraph": "",
-            "Paste as Plain Text": ""
-        },
-        "PreserveScripts": {
-            "JavaScript": "",
-            "PHP": ""
-        },
-        "QuickTag": {
-            "',\r\n                           'cl': '": "",
-            "ATTRIBUTES": "",
-            "Colors": "",
-            "Enter the TAG you want to insert": "",
-            "No CSS class avaiable": "",
-            "Ok": "",
-            "OPTIONS": "",
-            "Quick Tag Editor": "",
-            "TAGs": "",
-            "There are some unclosed quote": "",
-            "This attribute already exists in the TAG": "",
-            "You have to select some text": ""
-        },
-        "SaveSubmit": {
-            "in progress": "",
-            "Ready": "",
-            "Save": "",
-            "Saving...": ""
-        },
-        "SetId": {
-            "ID/Name:": "",
-            "Set Id and Name": "",
-            "Set Id/Name": "",
-            "Set ID/Name": "",
-            "Delete": "<<Abbreviation>>"
-        },
-        "SmartReplace": {
-            "ClosingDoubleQuotes": "",
-            "ClosingSingleQuote": "",
-            "Convert all quotes and dashes in the current document": "",
-            "Enable automatic replacements": "",
-            "OpeningDoubleQuotes": "",
-            "OpeningSingleQuote": "",
-            "SmartReplace": "",
-            "SmartReplace Settings": ""
-        },
-        "Stylist": {
-            "Styles": ""
-        },
-        "SuperClean": {
-            "Clean bad HTML from Microsoft Word.": "",
-            "Clean Selection Only": "",
-            "Clean up HTML": "",
-            "Cleaning Scope": "",
-            "General tidy up and correction of some problems.": "",
-            "Please select from the following cleaning options...": "",
-            "Please stand by while cleaning in process...": "",
-            "Remove alignment (left/right/justify).": "",
-            "Remove all classes (CSS).": "",
-            "Remove All HTML Tags": "",
-            "Remove all styles (CSS).": "",
-            "Remove custom font sizes.": "",
-            "Remove custom text colors.": "",
-            "Remove custom typefaces (font \"styles\").": "",
-            "Remove emphasis and annotations.": "",
-            "Remove lang attributes.": "",
-            "Remove Paragraphs": "",
-            "Remove superscripts and subscripts.": "",
-            "Replace directional quote marks with non-directional quote marks.": "",
-            "Vigorously purge HTML from Microsoft Word.": ""
-        },
-        "TableOperations": {
-            "Cell Type:": "",
-            "Cells down": "",
-            "Cells to the right, and": "",
-            "Do Not Change": "",
-            "Frame and borders": "",
-            "Header (th)": "",
-            "Merge current cell with:": "",
-            "Normal (td)": "",
-            "Columns": "<<Forms>>",
-            "Merge Cells": "<<ContextMenu>>",
-            "Rows": "<<Forms>>"
-        },
-        "UnsavedChanges": {
-            "You have unsaved changes in the editor": ""
-        },
-        "WebKit": {
-            "The Paste button does not work in this browser for security reasons. Press CTRL-V on your keyboard to paste directly.": "<<Gecko>>"
-        },
-        "Xinha": {
-            "&#8212; font &#8212;": "",
-            "&#8212; format &#8212;": "",
-            "&#8212; size &#8212;": "",
-            "1 (8 pt)": "",
-            "2 (10 pt)": "",
-            "3 (12 pt)": "",
-            "4 (14 pt)": "",
-            "5 (18 pt)": "",
-            "6 (24 pt)": "",
-            "7 (36 pt)": "",
-            "Address": "",
-            "Arial": "",
-            "Clean content pasted from Word": "",
-            "Clear Inline Font Specifications": "",
-            "Clear MSOffice tags": "",
-            "Close": "",
-            "Constructing object": "",
-            "Courier New": "",
-            "Create Statusbar": "",
-            "Create Toolbar": "",
-            "CTRL-0 (zero)": "",
-            "CTRL-1 .. CTRL-6": "",
-            "CTRL-A": "",
-            "CTRL-B": "",
-            "CTRL-C": "",
-            "CTRL-E": "",
-            "CTRL-I": "",
-            "CTRL-J": "",
-            "CTRL-L": "",
-            "CTRL-N": "",
-            "CTRL-R": "",
-            "CTRL-S": "",
-            "CTRL-U": "",
-            "CTRL-V": "",
-            "CTRL-X": "",
-            "CTRL-Y": "",
-            "CTRL-Z": "",
-            "Editor Help": "",
-            "ENTER": "",
-            "Error Loading Xinha.  Developers, check the Error Console for information.": "",
-            "Finishing": "",
-            "Formatted": "",
-            "Generate Xinha framework": "",
-            "Georgia": "",
-            "Heading 1": "",
-            "Heading 2": "",
-            "Heading 3": "",
-            "Heading 4": "",
-            "Heading 5": "",
-            "Heading 6": "",
-            "Headings": "",
-            "Impact": "",
-            "Init editor size": "",
-            "insert linebreak": "",
-            "Insert/Overwrite": "",
-            "Keyboard shortcuts": "",
-            "Loading Core": "",
-            "Loading in progress. Please wait!": "",
-            "Loading plugin $plugin": "",
-            "Loading plugins": "",
-            "MS Word Cleaner": "",
-            "new paragraph": "",
-            "Normal": "",
-            "Print document": "",
-            "Register plugin $plugin": "",
-            "Remove formatting": "",
-            "Save as": "",
-            "Select all": "",
-            "Select Color": "",
-            "Set format to paragraph": "",
-            "SHIFT-ENTER": "",
-            "Split Block": "",
-            "Tahoma": "",
-            "The editor provides the following key combinations:": "",
-            "Times New Roman": "",
-            "Toggle Borders": "",
-            "Touch here first to activate editor.": "",
-            "Verdana": "",
-            "Waiting for Iframe to load...": "",
-            "WingDings": "",
-            "Would you like to clear font colours?": "",
-            "Would you like to clear font sizes?": "",
-            "Would you like to clear font typefaces?": "",
-            "Xinha": ""
-        },
-        "BackgroundImage": {
-            "__ TRANSLATOR NOTE __": "*** BACKGROUNDIMAGE IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***",
-            "Remove Current Background": "",
-            "Set Background": "",
-            "Set page background image": "",
-            "Set Page Background Image": ""
-        },
-        "ClientsideSpellcheck": {
-            "__ TRANSLATOR NOTE __": "*** CLIENTSIDESPELLCHECK IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***",
-            "Spell Check using ieSpell": ""
-        },
-        "ExtendedFileManager": {
-            "__ TRANSLATOR NOTE __": "*** EXTENDEDFILEMANAGER IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***",
-            "10%": "",
-            "100%": "",
-            "200%": "",
-            "25%": "",
-            "50%": "",
-            "75%": "",
-            ">List View": "",
-            ">Thumbnail View": "",
-            "A:": "",
-            "Alt": "",
-            "Border Color": "",
-            "Constrain Proportions": "",
-            "Crop": "",
-            "D:": "",
-            "Directory": "",
-            "Directory Up": "",
-            "Edit": "",
-            "File List": "",
-            "File Manager": "",
-            "Filename:": "",
-            "Filesize:": "",
-            "Flip Horizontal": "",
-            "Flip Image": "",
-            "Flip Vertical": "",
-            "Folder": "",
-            "GIF": "",
-            "GIF format is not supported, image editing not supported.": "",
-            "H:": "",
-            "Image Editor": "",
-            "Image Selection": "",
-            "Invalid base directory:": "",
-            "JPEG High": "",
-            "JPEG Low": "",
-            "JPEG Medium": "",
-            "Loading": "",
-            "Lock": "",
-            "Marker": "",
-            "Maximum folder size limit reached. Upload disabled.": "",
-            "Measure": "",
-            "New Folder": "",
-            "No Files Found": "",
-            "No Image Available": "",
-            "Please enter value": "",
-            "PNG": "",
-            "Preset": "",
-            "Quality:": "",
-            "Refresh": "",
-            "Rename": "",
-            "Resize": "",
-            "Rotate": "",
-            "Rotate 180 &deg;": "",
-            "Rotate 90 &deg; CCW": "",
-            "Rotate 90 &deg; CW": "",
-            "Rotate Image": "",
-            "Start X:": "",
-            "Start Y:": "",
-            "Target Window": "",
-            "Toggle marker color": "",
-            "Trash": "",
-            "Upload": "",
-            "W:": "",
-            "X:": "",
-            "Xinha Image Editor": "",
-            "Y:": "",
-            "Zoom": "",
-            "Absbottom": "<<InsertImage>>",
-            "Absmiddle": "<<InsertImage>>",
-            "Clear": "<<FindReplace>>",
-            "Copy": "<<ContextMenu>>",
-            "Cut": "<<ContextMenu>>",
-            "Insert File Link": "<<MootoolsFileManager>>",
-            "Not set": "<<InsertImage>>",
-            "Positioning of this image": "<<InsertImage>>",
-            "Preview": "<<Equation>>",
-            "Save": "<<SaveSubmit>>",
-            "Texttop": "<<InsertImage>>",
-            "You must select some text before making a new link.": "<<Linker>>"
-        },
-        "Filter": {
-            "__ TRANSLATOR NOTE __": "*** FILTER IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***",
-            "Filter": "<<InsertSnippet2>>"
-        },
-        "HtmlTidy": {
-            "__ TRANSLATOR NOTE __": "*** HTMLTIDY IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***",
-            "Auto-Tidy": "",
-            "Don't Tidy": "",
-            "HTML Tidy": "",
-            "Tidy failed.  Check your HTML for syntax errors.": ""
-        },
-        "ImageManager": {
-            "__ TRANSLATOR NOTE __": "*** IMAGEMANAGER IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***",
-            "Angle:": "",
-            "Flickr Picture List": "",
-            "Flickr Pictures": "",
-            "Flickr Selection": "",
-            "Flickr Username/Email": "",
-            "Folder Name:": "",
-            "Image Format": "",
-            "Image List": "",
-            "Keyword": "",
-            "No Images Found": "",
-            "No Photos Found": "",
-            "No Videos Found": "",
-            "This Server": "",
-            "YouTube Selection": "",
-            "YouTube Username": "",
-            "YouTube Video List": "",
-            "YouTube Videos": "",
-            "A:": "<<ExtendedFileManager>>",
-            "Absbottom": "<<InsertImage>>",
-            "Absmiddle": "<<InsertImage>>",
-            "Clear": "<<FindReplace>>",
-            "Constrain Proportions": "<<ExtendedFileManager>>",
-            "Crop": "<<ExtendedFileManager>>",
-            "D:": "<<ExtendedFileManager>>",
-            "Directory": "<<ExtendedFileManager>>",
-            "Directory Up": "<<ExtendedFileManager>>",
-            "Edit": "<<ExtendedFileManager>>",
-            "Filename:": "<<ExtendedFileManager>>",
-            "Flip Horizontal": "<<ExtendedFileManager>>",
-            "Flip Image": "<<ExtendedFileManager>>",
-            "Flip Vertical": "<<ExtendedFileManager>>",
-            "GIF": "<<ExtendedFileManager>>",
-            "GIF format is not supported, image editing not supported.": "<<ExtendedFileManager>>",
-            "H:": "<<ExtendedFileManager>>",
-            "Image Editor": "<<ExtendedFileManager>>",
-            "Image Selection": "<<ExtendedFileManager>>",
-            "Insert Image": "<<InsertImage>>",
-            "Invalid base directory:": "<<ExtendedFileManager>>",
-            "JPEG High": "<<ExtendedFileManager>>",
-            "JPEG Low": "<<ExtendedFileManager>>",
-            "JPEG Medium": "<<ExtendedFileManager>>",
-            "Lock": "<<ExtendedFileManager>>",
-            "Marker": "<<ExtendedFileManager>>",
-            "Measure": "<<ExtendedFileManager>>",
-            "New Folder": "<<ExtendedFileManager>>",
-            "No Image Available": "<<ExtendedFileManager>>",
-            "Not set": "<<InsertImage>>",
-            "PNG": "<<ExtendedFileManager>>",
-            "Positioning of this image": "<<InsertImage>>",
-            "Quality:": "<<ExtendedFileManager>>",
-            "Refresh": "<<ExtendedFileManager>>",
-            "Resize": "<<ExtendedFileManager>>",
-            "Rotate": "<<ExtendedFileManager>>",
-            "Rotate 180 &deg;": "<<ExtendedFileManager>>",
-            "Rotate 90 &deg; CCW": "<<ExtendedFileManager>>",
-            "Rotate 90 &deg; CW": "<<ExtendedFileManager>>",
-            "Rotate Image": "<<ExtendedFileManager>>",
-            "Save": "<<SaveSubmit>>",
-            "Start X:": "<<ExtendedFileManager>>",
-            "Start Y:": "<<ExtendedFileManager>>",
-            "Texttop": "<<InsertImage>>",
-            "Trash": "<<ExtendedFileManager>>",
-            "W:": "<<ExtendedFileManager>>",
-            "X:": "<<ExtendedFileManager>>",
-            "Y:": "<<ExtendedFileManager>>"
-        },
-        "InsertMarquee": {
-            "__ TRANSLATOR NOTE __": "*** INSERTMARQUEE IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***",
-            "Alternate": "",
-            "Background-Color:": "",
-            "Behavior:": "",
-            "Continuous": "",
-            "Direction:": "",
-            "Insert scrolling marquee": "",
-            "Marquee Editor": "",
-            "Scroll Amount:": "",
-            "Scroll Delay:": "",
-            "Slide": "",
-            "Speed Control": "",
-            "Name": "<<Forms>>",
-            "Name/ID:": "<<Forms>>",
-            "Text:": "<<Forms>>"
-        },
-        "InsertPicture": {
-            "__ TRANSLATOR NOTE __": "*** INSERTPICTURE IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***",
-            "Leave empty for not defined": "",
-            " Open file in new window": "",
-            "Open file in new window": "",
-            "Upload file": "",
-            "Absbottom": "<<InsertImage>>",
-            "Absmiddle": "<<InsertImage>>",
-            "Alignment:": "<<HorizontalRule>>",
-            "Alternate text:": "<<InsertImage>>",
-            "Border thickness:": "<<InsertImage>>",
-            "Enter the image URL here": "<<InsertImage>>",
-            "For browsers that don't support images": "<<InsertImage>>",
-            "Horizontal padding": "<<InsertImage>>",
-            "Horizontal:": "<<InsertImage>>",
-            "Image Preview:": "<<InsertImage>>",
-            "Insert Image": "<<InsertImage>>",
-            "Leave empty for no border": "<<InsertImage>>",
-            "Not set": "<<InsertImage>>",
-            "Positioning of this image": "<<InsertImage>>",
-            "Preview": "<<Equation>>",
-            "Preview the image in a new window": "<<InsertImage>>",
-            "Size": "<<Forms>>",
-            "Texttop": "<<InsertImage>>",
-            "Vertical padding": "<<InsertImage>>",
-            "Vertical:": "<<InsertImage>>"
-        },
-        "NoteServer": {
-            "__ TRANSLATOR NOTE __": "*** NOTESERVER IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***",
-            "120%": "",
-            "150%": "",
-            "80%": "",
-            "Add GUIDO Code in a textbox on the page": "",
-            "Add MIDI link to allow students to hear the music": "",
-            "Format": "",
-            "GUIDO Code": "",
-            "Guido code": "",
-            "Image in applet": "",
-            "Insert GUIDO Music Notation": "",
-            "MIDI File": "",
-            "Source Code": "",
-            "With Mozilla, the applet will not be visible in editor, but only in Web page after submitting.": "",
-            "Zoom :": "",
-            "100%": "<<ExtendedFileManager>>",
-            "Image Preview": "<<InsertImage>>",
-            "Options": "<<FindReplace>>",
-            "Preview": "<<Equation>>",
-            "Preview the image in a new window": "<<InsertImage>>",
-            "Zoom": "<<ExtendedFileManager>>"
-        },
-        "PSLocal": {
-            "__ TRANSLATOR NOTE __": "*** PSLOCAL IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***",
-            "Confirm": "",
-            "Enable": "",
-            "Enable Gears in order to use local document storage and configuration.": "",
-            "Enabling Local Storage": "",
-            "Install": "",
-            "Learn About Local Storage": "",
-            "This will reload the page, causing you to lose any unsaved work.  Press \"OK\" to reload.": "",
-            "Xinha uses Google Gears to enable local document storage.  With Gears installed, you can save drafts of your documents on your hard drive, configure Xinha to look the way you want, and carry this information wherever you use Xinha on the web.": ""
-        },
-        "PSServer": {
-            "__ TRANSLATOR NOTE __": "*** PSSERVER IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***",
-            "File: ": "",
-            "Import": ""
-        },
-        "PersistentStorage": {
-            "__ TRANSLATOR NOTE __": "*** PERSISTENTSTORAGE IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***",
-            "Details": "",
-            "File Browser": "",
-            "Hello    There C ": "",
-            "Hello  There A ": "",
-            "Hello \" There B \"": "",
-            "Hello ' There D '": "",
-            "List of Places": "",
-            "New Document": "",
-            "Open": "",
-            "Open Document": "",
-            "Places": "",
-            "Please enter the name of the directory you'd like to create.": "",
-            "Save Document": "",
-            "This will erase any unsaved content.  If you're certain, please click OK to continue.": "",
-            "Web URL": "",
-            "Confirm": "<<PSLocal>>",
-            "Copy": "<<ContextMenu>>",
-            "Delete": "<<Abbreviation>>",
-            "Directory Up": "<<ExtendedFileManager>>",
-            "File List": "<<ExtendedFileManager>>",
-            "File Manager": "<<ExtendedFileManager>>",
-            "Filename": "<<ExtendedFileManager>>",
-            "Insert": "<<InsertNote>>",
-            "Insert Image": "<<InsertImage>>",
-            "New Folder": "<<ExtendedFileManager>>",
-            "Save": "<<SaveSubmit>>",
-            "You must select some text before making a new link.": "<<Linker>>"
-        },
-        "SpellChecker": {
-            "__ TRANSLATOR NOTE __": "*** SPELLCHECKER IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***",
-            "HTMLArea Spell Checker": "",
-            "Info": "",
-            "Learn": "",
-            "pliz weit ;-)": "",
-            "Revert": "",
-            "Spell Checker": ""
-        },
-        "Template": {
-            "__ TRANSLATOR NOTE __": "*** TEMPLATE IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***",
-            "Insert template": ""
-        },
-        "UnFormat": {
-            "__ TRANSLATOR NOTE __": "*** UNFORMAT IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***",
-            "All": "",
-            "All HTML:": "",
-            "Cleaning Area": "",
-            "Cleaning options": "",
-            "Formatting:": "",
-            "Page Cleaner": "",
-            "Select which types of formatting you would like to remove.": "",
-            "Selection": ""
-        }
-    }
-}
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/lang/merged/ru.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/lang/merged/ru.js
deleted file mode 100644
index 84451d0..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/lang/merged/ru.js
+++ /dev/null
@@ -1,1575 +0,0 @@
-// Xinha Language Combined Translation File
-//
-// LANG: "ru", ENCODING: UTF-8
-//
-// INSTRUCTIONS TO TRANSLATORS
-// ===========================================================================
-//
-// Your translation must be in UTF-8 Character Encoding.
-//
-// This is a JSON encoded file (plus comments), strings should be double-quote
-// only, do not use single quotes to surround strings - "hello", not 'hello'
-// do not have a trailing comma after the last entry in a section.
-//
-// Only full line comments are allowed (that a comments occupy entire lines).
-//
-// Search for the __NEW_TRANSLATIONS__ section below, this is where you will
-// want to focus, this section includes things that do not presently have a 
-// translation or for which the translation needs to be checked for accuracy.
-//
-// In the New Translations section a translation string is one of the following
-//
-//  "English String Here" : ""
-//     This means it is not translated yet, add your translation...
-//     "English String Here" : "Klingon String Here"
-//
-//  "English String Here" : "Translated String Here"
-//     This means that an existing translation for this string, in some other
-//     section has been found, and used.  Check that it is approprite for this
-//     section and if it is, that's fine leave it as is, otherwise change as
-//     appropriate.
-//
-//  "English String Here" : "<<AnotherSection>>"
-//     This means use the same translation for this string as <<AnotherSection>>
-//     this saves you re-tranlating strings.  If the Context of this section
-//     and the context of AnotherSection seem the same, that's fine leave it
-//     using that translation, but if this section needs a different translation, 
-//     you can provide it by replacing the link (<<AnotherSection>>) with that
-//     new translation.  For example - a "Table" in say "DataPlugin" is 
-//     perhaps translated differently to "Table" in "FurniturePlugin".
-//
-// TESTING YOUR TRANSLATION
-// ===========================================================================
-// Simply place your translation file on your webserver somewhere for example
-//
-//   /xinha/lang/merged/ru.js
-//
-// and then tell Xinha where to get it (before loading XinhaCore.js) by 
-//
-//  _editor_lang              = 'ru';
-//  _editor_lang_merged_file  = '/xinha/lang/merged/ru.js';
-//
-// Xinha will load your new language definition.
-//
-// SUBMITTING YOUR TRANSLATION
-// ===========================================================================
-// Simply create a Ticket on the Xinha website and attach your translation 
-// file.
-//
-// The Xinha developers will take your file and use the 
-//     contrib/lc_split_merged_file.php
-// script to load it into the Xinha distribution.
-
-{
-    "Abbreviation": {
-        "Cancel": "Отмена",
-        "OK": "OK"
-    },
-    "AboutBox": {
-        "About this editor": "О редакторе",
-        "Close": "Закрыть"
-    },
-    "BackgroundImage": {
-        "Cancel": "Отмена"
-    },
-    "CharacterMap": {
-        "Insert special character": "Вставить специальный символ"
-    },
-    "ColorPicker": {
-        "Close": "Закрыть",
-        "Color: ": "Цвет",
-        "OK": "OK"
-    },
-    "ContextMenu": {
-        "Justify Center": "По центру",
-        "Justify Full": "По ширине",
-        "Justify Left": "По левому краю",
-        "Justify Right": "По правому краю"
-    },
-    "CreateLink": {
-        "Cancel": "Отмена",
-        "Insert/Modify Link": "Вставка/изменение ссылки",
-        "New window (_blank)": "Новое окно (_blank)",
-        "None (use implicit)": "По умолчанию",
-        "OK": "OK",
-        "Other": "Другое",
-        "Same frame (_self)": "То же окно (_self)",
-        "Target:": "Открывать в окне:",
-        "Title (tooltip):": "Всплывающая подсказка",
-        "Top frame (_top)": "Родительское окно (_top)",
-        "URL:": "URL:",
-        "You need to select some text before creating a link": "Вы должны выделить текст, который будет преобразован в ссылку"
-    },
-    "DefinitionList": {
-        "definition description": "Пояснение",
-        "definition list": "Список с определением",
-        "definition term": "Заголовок"
-    },
-    "EditTag": {
-        "Cancel": "Отмена",
-        "OK": "OK"
-    },
-    "Equation": {
-        "Cancel": "Отмена",
-        "OK": "OK",
-        "Preview": "Предварительный просмотр"
-    },
-    "ExtendedFileManager": {
-        "Absbottom": "По нижней границе",
-        "Absmiddle": "По середине текста",
-        "Align": "Выравнивание",
-        "Baseline": "По нижней границе текста",
-        "Border": "Рамка",
-        "Bottom": "По нижнему краю",
-        "Cancel": "Отмена",
-        "Clear": "Очистить",
-        "Color": "Цвет",
-        "Constrain Proportions": "Сохранить пропорции",
-        "Crop": "Обрезать",
-        "Directory": "Папка",
-        "Directory Up": "Папка наверх",
-        "Edit": "Правка",
-        "Filename:": "Имя файла",
-        "Flip Horizontal": "Развернуть по горизонтали",
-        "Flip Image": "Развернуть картинку",
-        "Flip Vertical": "Развернуть по вертикали",
-        "GIF format is not supported, image editing not supported.": "Формат GIF не поддерживается, редактирование картинки не поддерживается.",
-        "Height": "Высота",
-        "Height:": "Высота",
-        "Invalid base directory:": "Неверная базовая папка:",
-        "JPEG High": "JPEG высок.",
-        "JPEG Low": "JPEG низк.",
-        "JPEG Medium": "JPEG средн.",
-        "Left": "По левому краю",
-        "Loading": "Загрузка",
-        "Lock": "Блокировка",
-        "Margin": "Отступ",
-        "Marker": "Маркер",
-        "Measure": "Измерение",
-        "Middle": "Посредине",
-        "New Folder": "Новая папка",
-        "New window (_blank)": "Новое окно (_blank)",
-        "No Image Available": "Нет доступных картинок",
-        "None (use implicit)": "По умолчанию",
-        "Not set": "Не установлено",
-        "OK": "OK",
-        "Padding": "Поля",
-        "Positioning of this image": "Расположение изображения",
-        "Preview": "Предварительный просмотр",
-        "Quality:": "Качество",
-        "Refresh": "Обновить",
-        "Resize": "Масшабировать",
-        "Right": "По правому краю",
-        "Rotate": "Повернуть",
-        "Rotate Image": "Повернуть картинку",
-        "Same frame (_self)": "То же окно (_self)",
-        "Save": "Сохранить",
-        "Start X:": "Начало X",
-        "Start Y:": "Начало Y",
-        "Texttop": "По верхней границе текста",
-        "Title (tooltip)": "Всплывающая подсказка",
-        "Top": "По верхнему краю",
-        "Top frame (_top)": "Родительское окно (_top)",
-        "Trash": "Корзина",
-        "Upload": "Загрузить",
-        "W:": "Ш:",
-        "Width": "Ширина",
-        "Width:": "Ширина"
-    },
-    "FindReplace": {
-        "Case sensitive search": "Поиск с учетом регистра",
-        "Clear": "Очистить",
-        "Done": "OK",
-        "Enter the text you want to find": "Введите текст, который вы хотите найти",
-        "Find and Replace": "Найти и заменить",
-        "Highlight": "Выделить",
-        "Inform a replacement word": "Показать замещающее слово",
-        "Next": "След.",
-        "Options": "Опции",
-        "Replace with:": "Заменить с",
-        "Search for:": "Найти",
-        "Substitute all occurrences": "Заменить все вхождения",
-        "Substitute this occurrence?": "Заменить это вхождение?",
-        "Undo": "Отменить",
-        "Whole words only": "Только слова целиком",
-        "found item": "найти",
-        "found items": "найти",
-        "not found": "не найдено",
-        "replaced item": "замененная",
-        "replaced items": "замененные"
-    },
-    "Forms": {
-        "Cancel": "Отмена",
-        "Image URL:": "URL изображения",
-        "OK": "OK",
-        "Options": "Опции",
-        "Rows:": "Строки"
-    },
-    "FullPage": {
-        "Cancel": "Отмена",
-        "Description:": "Описание",
-        "OK": "OK"
-    },
-    "FullScreen": {
-        "Maximize/Minimize Editor": "Развернуть/Свернуть редактор"
-    },
-    "HorizontalRule": {
-        "Alignment:": "Выравнивание",
-        "Cancel": "Отмена",
-        "Center": "Центр",
-        "Color:": "Цвет",
-        "Height:": "Высота",
-        "Horizontal Rule": "Горизонтальный разделитель",
-        "Layout": "Расположение",
-        "Left": "По левому краю",
-        "OK": "OK",
-        "Right": "По правому краю",
-        "Width:": "Ширина",
-        "percent": "процентов",
-        "pixels": "пикселей"
-    },
-    "ImageManager": {
-        "Absbottom": "По нижней границе",
-        "Absmiddle": "По середине текста",
-        "Angle:": "Угол",
-        "Baseline": "По нижней границе текста",
-        "Bottom": "По нижнему краю",
-        "Cancel": "Отмена",
-        "Clear": "Очистить",
-        "Constrain Proportions": "Сохранить пропорции",
-        "Crop": "Обрезать",
-        "Directory": "Папка",
-        "Directory Up": "Папка наверх",
-        "Edit": "Правка",
-        "Filename:": "Имя файла",
-        "Flip Horizontal": "Развернуть по горизонтали",
-        "Flip Image": "Развернуть картинку",
-        "Flip Vertical": "Развернуть по вертикали",
-        "Folder Name:": "Название папки:",
-        "GIF format is not supported, image editing not supported.": "Формат GIF не поддерживается, редактирование картинки не поддерживается.",
-        "Height:": "Высота",
-        "Image Format": "Формат картинки",
-        "Insert Image": "Вставка картинки",
-        "Invalid base directory:": "Неверная базовая папка:",
-        "JPEG High": "JPEG высок.",
-        "JPEG Low": "JPEG низк.",
-        "JPEG Medium": "JPEG средн.",
-        "Left": "По левому краю",
-        "Lock": "Блокировка",
-        "Marker": "Маркер",
-        "Measure": "Измерение",
-        "Middle": "Посредине",
-        "New Folder": "Новая папка",
-        "No Image Available": "Нет доступных картинок",
-        "No Images Found": "Картинок не найдено",
-        "Not set": "Не установлено",
-        "OK": "OK",
-        "Positioning of this image": "Расположение изображения",
-        "Quality:": "Качество",
-        "Refresh": "Обновить",
-        "Resize": "Масшабировать",
-        "Right": "По правому краю",
-        "Rotate": "Повернуть",
-        "Rotate Image": "Повернуть картинку",
-        "Save": "Сохранить",
-        "Start X:": "Начало X",
-        "Start Y:": "Начало Y",
-        "Texttop": "По верхней границе текста",
-        "Top": "По верхнему краю",
-        "Trash": "Корзина",
-        "W:": "Ш:",
-        "Width:": "Ширина"
-    },
-    "InlineStyler": {
-        "Background": "Фон",
-        "Baseline": "По нижней границе текста",
-        "Border": "Рамка",
-        "Bottom": "По нижнему краю",
-        "Center": "Центр",
-        "Char": "Символ",
-        "Collapsed borders": "Накладывающиеся рамки",
-        "FG Color": "Цвет переднего плана",
-        "Float": "Обтекание",
-        "Height": "Высота",
-        "Image URL": "URL картинки",
-        "Justify": "По правому краю",
-        "Layout": "Расположение",
-        "Left": "По левому краю",
-        "Margin": "Отступ",
-        "Middle": "Посредине",
-        "None": "Ничего",
-        "Padding": "Поля",
-        "Right": "По правому краю",
-        "Text align": "Выравнивание теста",
-        "Top": "По верхнему краю",
-        "Vertical align": "Вертикальное  выравнивание",
-        "Width": "Ширина",
-        "percent": "процентов",
-        "pixels": "пикселей"
-    },
-    "InsertAnchor": {
-        "Cancel": "Отмена",
-        "OK": "OK"
-    },
-    "InsertImage": {
-        "Absbottom": "По нижней границе",
-        "Absmiddle": "По середине текста",
-        "Alignment:": "Выравнивание",
-        "Alternate text:": "Альтернативный текст",
-        "Baseline": "По нижней границе текста",
-        "Border thickness:": "Толщина рамки",
-        "Bottom": "По нижнему краю",
-        "Cancel": "Отмена",
-        "Enter the image URL here": "Вставьте адрес изображения",
-        "For browsers that don't support images": "Для браузеров, которые не отображают картинки",
-        "Horizontal padding": "Горизонтальные поля",
-        "Horizontal:": "По горизонтали",
-        "Image Preview:": "Предварительный просмотр",
-        "Image URL:": "URL изображения",
-        "Insert Image": "Вставка картинки",
-        "Layout": "Расположение",
-        "Leave empty for no border": "Оставьте пустым, чтобы убрать рамку",
-        "Left": "По левому краю",
-        "Middle": "Посредине",
-        "Not set": "Не установлено",
-        "OK": "OK",
-        "Positioning of this image": "Расположение изображения",
-        "Preview": "Предварительный просмотр",
-        "Preview the image in a new window": "Предварительный просмотр в отдельном окне",
-        "Right": "По правому краю",
-        "Spacing": "Отступы",
-        "Texttop": "По верхней границе текста",
-        "Top": "По верхнему краю",
-        "Vertical padding": "Вертикальные поля",
-        "Vertical:": "По вертикали",
-        "You must enter the URL": "Вы должны ввести URL"
-    },
-    "InsertMarquee": {
-        "Cancel": "Отмена",
-        "Height:": "Высота",
-        "Left": "По левому краю",
-        "OK": "OK",
-        "Right": "По правому краю",
-        "Width:": "Ширина"
-    },
-    "InsertNote": {
-        "Cancel": "Отмена"
-    },
-    "InsertPicture": {
-        "Absbottom": "По нижней границе",
-        "Absmiddle": "По середине текста",
-        "Alignment:": "Выравнивание",
-        "Alternate text:": "Альтернативный текст",
-        "Baseline": "По нижней границе текста",
-        "Border thickness:": "Толщина рамки",
-        "Bottom": "По нижнему краю",
-        "Cancel": "Отмена",
-        "Enter the image URL here": "Вставьте адрес изображения",
-        "For browsers that don't support images": "Для браузеров, которые не отображают картинки",
-        "Height:": "Высота",
-        "Horizontal padding": "Горизонтальные поля",
-        "Horizontal:": "По горизонтали",
-        "Image Preview:": "Предварительный просмотр",
-        "Image URL:": "URL изображения",
-        "Insert Image": "Вставка картинки",
-        "Layout": "Расположение",
-        "Leave empty for no border": "Оставьте пустым, чтобы убрать рамку",
-        "Left": "По левому краю",
-        "Middle": "Посредине",
-        "Not set": "Не установлено",
-        "OK": "OK",
-        "Positioning of this image": "Расположение изображения",
-        "Preview": "Предварительный просмотр",
-        "Preview the image in a new window": "Предварительный просмотр в отдельном окне",
-        "Right": "По правому краю",
-        "Spacing": "Отступы",
-        "Texttop": "По верхней границе текста",
-        "Top": "По верхнему краю",
-        "Vertical padding": "Вертикальные поля",
-        "Vertical:": "По вертикали",
-        "Width:": "Ширина"
-    },
-    "InsertSnippet": {
-        "Cancel": "Отмена"
-    },
-    "InsertSnippet2": {
-        "Cancel": "Отмена"
-    },
-    "InsertTable": {
-        "Absbottom": "По нижней границе",
-        "Absmiddle": "По середине текста",
-        "Alignment:": "Выравнивание",
-        "Baseline": "По нижней границе текста",
-        "Border": "Рамка",
-        "Border thickness:": "Толщина рамки",
-        "Bottom": "По нижнему краю",
-        "Cancel": "Отмена",
-        "Caption": "Заголовок",
-        "Cell padding:": "Поля в ячейках",
-        "Cell spacing:": "Расстояние между ячейками",
-        "Cols:": "Столбцы",
-        "Em": "em",
-        "Fixed width columns": "Столбцы фиксированной ширины",
-        "Insert Table": "Вставка таблицы",
-        "Layout": "Расположение",
-        "Leave empty for no border": "Оставьте пустым, чтобы убрать рамку",
-        "Left": "По левому краю",
-        "Middle": "Посредине",
-        "Not set": "Не установлено",
-        "Number of columns": "Количество столбцов",
-        "Number of rows": "Количество строк",
-        "OK": "OK",
-        "Percent": "проценты",
-        "Pixels": "пикселы",
-        "Positioning of this table": "Расположение таблицы",
-        "Right": "По правому краю",
-        "Rows:": "Строки",
-        "Space between adjacent cells": "Расстояние между соседними ячейками",
-        "Space between content and border in cell": "Расстояние между границей ячейки и текстом",
-        "Spacing": "Отступы",
-        "Texttop": "По верхней границе текста",
-        "Top": "По верхнему краю",
-        "Width of the table": "Ширина таблицы",
-        "Width unit": "Единицы измерения",
-        "Width:": "Ширина",
-        "You must enter a number of columns": "Вы должны ввести количество столбцов",
-        "You must enter a number of rows": "Вы должны ввести количество строк"
-    },
-    "Linker": {
-        "Cancel": "Отмена",
-        "Insert/Modify Link": "Вставка/изменение ссылки",
-        "OK": "OK",
-        "Target:": "Открывать в окне:",
-        "URL:": "URL:"
-    },
-    "ListType": {
-        "Choose list style type (for ordered lists)": "Выберите стиль списков (для упорядоченных списков)",
-        "Decimal numbers": "Десятичные числа",
-        "Lower greek letters": "Строчные греческие символы",
-        "Lower latin letters": "Строчные латинские символы",
-        "Lower roman numbers": "Строчные романские числа",
-        "Upper latin letters": "Заглавные латинские символы",
-        "Upper roman numbers": "Заглавные романские числа"
-    },
-    "NoteServer": {
-        "Cancel": "Отмена",
-        "Image Preview": "Предварительный просмотр",
-        "OK": "OK",
-        "Options": "Опции",
-        "Preview": "Предварительный просмотр",
-        "Preview the image in a new window": "Предварительный просмотр в отдельном окне"
-    },
-    "Opera": {
-        "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 на клавиатуре, чтобы вставить."
-    },
-    "PSLocal": {
-        "Cancel": "Отмена"
-    },
-    "PasteText": {
-        "Cancel": "Отмена",
-        "OK": "OK",
-        "Paste as Plain Text": "Вставить как обычный текст"
-    },
-    "PersistentStorage": {
-        "Cancel": "Отмена",
-        "Directory Up": "Папка наверх",
-        "Filename": "Имя файла",
-        "Insert Image": "Вставка картинки",
-        "New Folder": "Новая папка",
-        "Save": "Сохранить"
-    },
-    "QuickTag": {
-        "Cancel": "Отмена"
-    },
-    "SaveSubmit": {
-        "Ready": "Готово",
-        "Save": "Сохранить",
-        "Saving...": "Сохранение...",
-        "in progress": "пожалуйста, ждите"
-    },
-    "SetId": {
-        "Cancel": "Отмена",
-        "OK": "OK"
-    },
-    "SmartReplace": {
-        "OK": "OK"
-    },
-    "SpellChecker": {
-        "Cancel": "Отмена",
-        "OK": "OK",
-        "Replace with": "Заменить с"
-    },
-    "Stylist": {
-        "Styles": "Стили"
-    },
-    "SuperClean": {
-        "Cancel": "Отмена",
-        "OK": "OK"
-    },
-    "TableOperations": {
-        "All four sides": "Все 4 стороны",
-        "Borders": "Рамки",
-        "Cancel": "Отмена",
-        "Caption": "Заголовок",
-        "Cell Properties": "Свойства ячеек",
-        "Cell properties": "Свойства ячеек",
-        "Delete cell": "Удалить ячейку",
-        "Delete column": "Удалить столбец",
-        "Delete row": "Удалить строку",
-        "Description": "Описание",
-        "Frames": "Фреймы",
-        "Insert cell after": "Вставить ячейку после",
-        "Insert cell before": "Вставить ячейку до",
-        "Insert column after": "Вставить столбец после",
-        "Insert column before": "Вставить столбец до",
-        "Insert row after": "Вставить строку после",
-        "Insert row before": "Вставить строку до",
-        "Merge cells": "Объединить ячейки",
-        "No rules": "Нет линейки",
-        "No sides": "Нет сторон",
-        "OK": "OK",
-        "Padding": "Поля",
-        "Please click into some cell": "Пожалуйста щелкните в некоторые ячейки",
-        "Row Properties": "Свойства строк",
-        "Row properties": "Свойства строки",
-        "Rows": "Строки",
-        "Rules will appear between all rows and columns": "Линейки появятся между всеми строками и столбцами",
-        "Rules will appear between columns only": "Линейки появятся только между столбцами",
-        "Rules will appear between rows only": "Линейки появятся только между строками",
-        "Spacing": "Отступы",
-        "Spacing and padding": "Поля и отступы",
-        "Split column": "Разделить столбец",
-        "Split row": "Разделить строку",
-        "Summary": "Сводка",
-        "Table Properties": "Свойства таблиц",
-        "Table properties": "Свойства таблиц",
-        "The bottom side only": "Только нижний край",
-        "The left-hand side only": "Только левый край",
-        "The right and left sides only": "Только левый и правый край",
-        "The right-hand side only": "Только правый край",
-        "The top and bottom sides only": "Только верхний и нижний край",
-        "The top side only": "Только верхний край",
-        "Xinha cowardly refuses to delete the last cell in row.": "Xinha отказалась удалять последнюю ячейку в строке.",
-        "Xinha cowardly refuses to delete the last column in table.": "Xinha отказалась удалять последний столбец в таблице.",
-        "Xinha cowardly refuses to delete the last row in table.": "Xinha отказалась удалять последнюю строку в таблице.",
-        "pixels": "пикселей"
-    },
-    "Template": {
-        "Cancel": "Отмена"
-    },
-    "UnFormat": {
-        "Cancel": "Отмена",
-        "OK": "OK"
-    },
-    "Xinha": {
-        "&#8212; font &#8212;": "&#8212; шрифт &#8212;",
-        "&#8212; format &#8212;": "&#8212; форматирование &#8212;",
-        "&#8212; size &#8212;": "&#8212; размер &#8212;",
-        "About this editor": "О редакторе",
-        "Address": "Адрес",
-        "Background Color": "Цвет фона",
-        "Bold": "Полужирный",
-        "Bulleted List": "Маркированный список",
-        "Clean content pasted from Word": "Очистить текст, вставленный из Word",
-        "Clear Inline Font Specifications": "Удалить непосредственное задание шрифтов",
-        "Clear MSOffice tags": "Удалить разметку MSOffice",
-        "Close": "Закрыть",
-        "Constructing object": "Создание объекта",
-        "Copy selection": "Копировать",
-        "Create Toolbar": "Создание панели инструментов",
-        "Current style": "Текущий стиль",
-        "Cut selection": "Вырезать",
-        "Decrease Indent": "Уменьшить отступ",
-        "Direction left to right": "Направление слева направо",
-        "Direction right to left": "Направление справа налево",
-        "ENTER": "ENTER",
-        "Editor Help": "Помощь",
-        "Font Color": "Цвет шрифта",
-        "Formatted": "Отформатированный текст",
-        "Heading 1": "Заголовок 1",
-        "Heading 2": "Заголовок 2",
-        "Heading 3": "Заголовок 3",
-        "Heading 4": "Заголовок 4",
-        "Heading 5": "Заголовок 5",
-        "Heading 6": "Заголовок 6",
-        "Headings": "Заголовки",
-        "Help using editor": "Помощь",
-        "Horizontal Rule": "Горизонтальный разделитель",
-        "Increase Indent": "Увеличить отступ",
-        "Init editor size": "Инициализация размера редактора",
-        "Insert Table": "Вставка таблицы",
-        "Insert Web Link": "Вставить гиперссылку",
-        "Insert/Modify Image": "Вставить изображение",
-        "Insert/Overwrite": "Вставка/замена",
-        "Italic": "Наклонный",
-        "Justify Center": "По центру",
-        "Justify Full": "По ширине",
-        "Justify Left": "По левому краю",
-        "Justify Right": "По правому краю",
-        "Keyboard shortcuts": "Горячие клавиши",
-        "Normal": "Обычный текст",
-        "Ordered List": "Нумерованный список",
-        "Paste from clipboard": "Вставить",
-        "Path": "Путь",
-        "Print document": "Печать",
-        "Redoes your last action": "Повторить",
-        "Register plugin $plugin": "Регистрация $plugin",
-        "Remove formatting": "Убрать форматирование",
-        "SHIFT-ENTER": "SHIFT+ENTER",
-        "Save as": "Сохранить как",
-        "Select all": "Выделить все",
-        "Set format to paragraph": "Отформатировать абзац",
-        "Split Block": "Разделить блок",
-        "Strikethrough": "Перечеркнутый",
-        "Subscript": "Нижний индекс",
-        "Superscript": "Верхний индекс",
-        "The editor provides the following key combinations:": "Редактор поддерживает следующие комбинации клавиш:",
-        "Toggle Borders": "Включить/выключить отображение границ",
-        "Toggle HTML Source": "Показать Html-код",
-        "Underline": "Подчеркнутый",
-        "Undoes your last action": "Отменить",
-        "Would you like to clear font colours?": "Удалить цвета шрифтов ?",
-        "Would you like to clear font sizes?": "Удалить размеры шрифтов ?",
-        "Would you like to clear font typefaces?": "Удалить типы шрифтов?",
-        "You are in TEXT MODE.  Use the [<>] button to switch back to WYSIWYG.": "Вы в режиме отображения Html-кода. нажмите кнопку [<>], чтобы переключиться в визуальный режим.",
-        "insert linebreak": "перенос строки",
-        "new paragraph": "новый абзац"
-    },
-    "__NEW_TRANSLATIONS__": {
-        "Abbreviation": {
-            "Abbreviation": "",
-            "Delete": "",
-            "Expansion:": ""
-        },
-        "CharCounter": {
-            "... in progress": "",
-            "Chars": "",
-            "HTML": "",
-            "Words": ""
-        },
-        "ColorPicker": {
-            "Click a color...": "",
-            "Sample": "",
-            "Web Safe: ": ""
-        },
-        "ContextMenu": {
-            "_Delete Row": "",
-            "_Image Properties...": "",
-            "_Modify Link...": "",
-            "_Remove Link...": "",
-            "_Table Properties...": "",
-            "C_ell Properties...": "",
-            "Chec_k Link...": "",
-            "Copy": "",
-            "Create a link": "",
-            "Current URL is": "",
-            "Cut": "",
-            "De_lete Column": "",
-            "Delete Cell": "",
-            "Delete the current column": "",
-            "Delete the current row": "",
-            "How did you get here? (Please report!)": "",
-            "I_nsert Row Before": "",
-            "In_sert Row After": "",
-            "Insert _Column Before": "",
-            "Insert a new column after the current one": "",
-            "Insert a new column before the current one": "",
-            "Insert a new row after the current one": "",
-            "Insert a new row before the current one": "",
-            "Insert a paragraph after the current node": "",
-            "Insert a paragraph before the current node": "",
-            "Insert C_olumn After": "",
-            "Insert Cell After": "",
-            "Insert Cell Before": "",
-            "Insert paragraph after": "",
-            "Insert paragraph before": "",
-            "Link points to:": "",
-            "Make lin_k...": "",
-            "Merge Cells": "",
-            "Opens this link in a new window": "",
-            "Paste": "",
-            "Please confirm that you want to remove this element:": "",
-            "Please confirm that you want to unlink this element.": "",
-            "Remove the $elem Element...": "",
-            "Remove this node from the document": "",
-            "Ro_w Properties...": "",
-            "Show the image properties dialog": "",
-            "Show the Table Cell Properties dialog": "",
-            "Show the Table Properties dialog": "",
-            "Show the Table Row Properties dialog": "",
-            "Unlink the current element": ""
-        },
-        "CreateLink": {
-            "Are you sure you wish to remove this link?": ""
-        },
-        "Dialogs": {
-            "Some Text Here": ""
-        },
-        "DynamicCSS": {
-            "Choose stylesheet": "",
-            "Default": "",
-            "Undefined": ""
-        },
-        "EditTag": {
-            "Edit HTML for selected text": "",
-            "Edit Tag By Peg": "",
-            "Tag Editor": ""
-        },
-        "Equation": {
-            "!=": "",
-            "!in": "",
-            "&gt;-": "",
-            "&gt;=": "",
-            "&lt;=": "",
-            "&lt;=&gt;": "",
-            "&lt;x&gt;": "",
-            "&nbsp; `!` &nbsp;": "",
-            "&nbsp; `.` &nbsp;": "",
-            "&nbsp; `0` &nbsp;": "",
-            "&nbsp; `2` &nbsp;": "",
-            "&nbsp; `3` &nbsp;": "",
-            "&nbsp; `4` &nbsp;": "",
-            "&nbsp; `5` &nbsp;": "",
-            "&nbsp; `6` &nbsp;": "",
-            "&nbsp; `7` &nbsp;": "",
-            "&nbsp; `8` &nbsp;": "",
-            "&nbsp; `9` &nbsp;": "",
-            "&nbsp; `e` &nbsp;": "",
-            "&nbsp;&nbsp;`1` &nbsp;": "",
-            "&nbsp;`+{::}`&nbsp;": "",
-            "&nbsp;`-:\\ `": "",
-            "&nbsp;`-{::}`&nbsp;": "",
-            "&nbsp;`C`&nbsp;": "",
-            "&nbsp;`cos`": "",
-            "&nbsp;`ln`&nbsp;": "",
-            "&nbsp;`pi` &nbsp;": "",
-            "&nbsp;`sin`": "",
-            "&nbsp;`tan`": "",
-            "&nbsp;`times`&nbsp;": "",
-            "&quot;text&quot;": "",
-            "'+formula+'": "",
-            "((n),(k))": "",
-            "(x+1)/(x-1)": "",
-            "*": "",
-            "**": "",
-            "+-": "",
-            "-&gt;": "",
-            "-&lt;": "",
-            "-:": "",
-            "-=": "",
-            "//": "",
-            "/_": "",
-            ":.": "",
-            "=&gt;": "",
-            "@": "",
-            "[[a,b],[c,d]]": "",
-            "\\\\": "",
-            "\\nClick in the box to use your keyboard or use the buttons\\n": "",
-            "^^": "",
-            "^^^": "",
-            "__|": "",
-            "_|_": "",
-            "`!=`": "",
-            "`!in`": "",
-            "`&and;`": "",
-            "`&cap;`": "",
-            "`&cup;`": "",
-            "`&gt;-`": "",
-            "`&gt;=`": "",
-            "`&lt;=&gt;`": "",
-            "`&lt;=`": "",
-            "`&lt;x&gt;`": "",
-            "`&or;`": "",
-            "`&quot;text&quot;`": "",
-            "`((n),(k))`": "",
-            "`(x+1)/(x-1)`": "",
-            "`**`": "",
-            "`*`": "",
-            "`+-`": "",
-            "`-&gt;`": "",
-            "`-&lt;`": "",
-            "`-:`": "",
-            "`-=`": "",
-            "`//`": "",
-            "`/_`": "",
-            "`:.`": "",
-            "`=&gt;`": "",
-            "`@`": "",
-            "`[[a,b],[c,d]]`": "",
-            "`\\\\`": "",
-            "`__|`": "",
-            "`_|_`": "",
-            "`AA`": "",
-            "`aleph`": "",
-            "`alpha`": "",
-            "`and`": "",
-            "`bara`": "",
-            "`bba`": "",
-            "`bbba`": "",
-            "`beta`": "",
-            "`CC`": "",
-            "`cca`": "",
-            "`chi`": "",
-            "`darr`": "",
-            "`ddota`": "",
-            "`del`": "",
-            "`Delta`": "",
-            "`delta`": "",
-            "`diamond`": "",
-            "`dota`": "",
-            "`dy/dx`": "",
-            "`EE`": "",
-            "`epsi`": "",
-            "`eta`": "",
-            "`fra`": "",
-            "`Gamma`": "",
-            "`gamma`": "",
-            "`grad`": "",
-            "`harr`": "",
-            "`hArr`": "",
-            "`hata`": "",
-            "`if`": "",
-            "`in`": "",
-            "`int`": "",
-            "`iota`": "",
-            "`kappa`": "",
-            "`lambda`": "",
-            "`Lambda`": "",
-            "`lArr`": "",
-            "`larr`": "",
-            "`lim_(x-&gt;oo)`": "",
-            "`log`": "",
-            "`mu`": "",
-            "`NN`": "",
-            "`nn`": "",
-            "`not`": "",
-            "`nu`": "",
-            "`o+`": "",
-            "`o.`": "",
-            "`O/`": "",
-            "`oint`": "",
-            "`omega`": "",
-            "`Omega`": "",
-            "`oo`": "",
-            "`or`": "",
-            "`ox`": "",
-            "`Phi`": "",
-            "`phi`": "",
-            "`Pi`": "",
-            "`pi`": "",
-            "`prod`": "",
-            "`prop`": "",
-            "`Psi`": "",
-            "`psi`": "",
-            "`QQ`": "",
-            "`quad`": "",
-            "`rArr`": "",
-            "`rho`": "",
-            "`root(n)(x)`": "",
-            "`RR`": "",
-            "`sfa`": "",
-            "`sigma`": "",
-            "`Sigma`": "",
-            "`sqrt(x)`": "",
-            "`square`": "",
-            "`stackrel(-&gt;)(+)`": "",
-            "`sub`": "",
-            "`sube`": "",
-            "`sum`": "",
-            "`sup`": "",
-            "`supe`": "",
-            "`tau`": "",
-            "`Theta`": "",
-            "`theta`": "",
-            "`TT`": "",
-            "`tta`": "",
-            "`uarr`": "",
-            "`ula`": "",
-            "`upsilon`": "",
-            "`uu`": "",
-            "`veca`": "",
-            "`vv`": "",
-            "`x_(mn)`": "",
-            "`Xi`": "",
-            "`xi`": "",
-            "`xx`": "",
-            "`zeta`": "",
-            "`ZZ`": "",
-            "`|-&gt;`": "",
-            "`|--`": "",
-            "`|==`": "",
-            "`|__`": "",
-            "`|~`": "",
-            "`~=`": "",
-            "`~|`": "",
-            "`~~`": "",
-            "AA": "",
-            "aleph": "",
-            "alpha": "",
-            "and": "",
-            "AsciiMath Formula Input": "",
-            "AsciiMathML Example": "",
-            "bara": "",
-            "Based on ASCIIMathML by": "",
-            "bba": "",
-            "bbba": "",
-            "beta": "",
-            "CC": "",
-            "cca": "",
-            "chi": "",
-            "darr": "",
-            "ddota": "",
-            "del": "",
-            "Delta": "",
-            "delta": "",
-            "diamond": "",
-            "dota": "",
-            "dy/dx": "",
-            "EE": "",
-            "epsi": "",
-            "eta": "",
-            "For more information on AsciiMathML visit this page:": "",
-            "Formula Editor": "",
-            "fra": "",
-            "gamma": "",
-            "Gamma": "",
-            "grad": "",
-            "hArr": "",
-            "harr": "",
-            "hata": "",
-            "if": "",
-            "in": "",
-            "Input": "",
-            "int": "",
-            "int_a^bf(x)dx": "",
-            "iota": "",
-            "kappa": "",
-            "Lambda": "",
-            "lambda": "",
-            "larr": "",
-            "lArr": "",
-            "lim_(x-&gt;oo)": "",
-            "mu": "",
-            "NN": "",
-            "nn": "",
-            "nnn": "",
-            "not": "",
-            "nu": "",
-            "o+": "",
-            "o.": "",
-            "O/": "",
-            "oint": "",
-            "omega": "",
-            "Omega": "",
-            "oo": "",
-            "or": "",
-            "ox": "",
-            "Phi": "",
-            "phi": "",
-            "pi": "",
-            "Pi": "",
-            "prod": "",
-            "prop": "",
-            "psi": "",
-            "Psi": "",
-            "QQ": "",
-            "quad": "",
-            "rArr": "",
-            "rho": "",
-            "root(n)(x)": "",
-            "RR": "",
-            "sfa": "",
-            "sigma": "",
-            "Sigma": "",
-            "sqrt(x)": "",
-            "square": "",
-            "stackrel(-&gt;)(+)": "",
-            "sub": "",
-            "sube": "",
-            "sum": "",
-            "sum_(n=1)^oo": "",
-            "sup": "",
-            "supe": "",
-            "tau": "",
-            "Theta": "",
-            "theta": "",
-            "TT": "",
-            "tta": "",
-            "uarr": "",
-            "ula": "",
-            "upsilon": "",
-            "uu": "",
-            "uuu": "",
-            "veca": "",
-            "vv": "",
-            "vvv": "",
-            "x^(m+n)": "",
-            "x_(mn)": "",
-            "Xi": "",
-            "xi": "",
-            "xx": "",
-            "zeta": "",
-            "ZZ": "",
-            "|-&gt;": "",
-            "|--": "",
-            "|==": "",
-            "|__": "",
-            "|~": "",
-            "~=": "",
-            "~|": "",
-            "~~": ""
-        },
-        "FancySelects": {
-            "'+opt.text+'": ""
-        },
-        "FindReplace": {
-            "';\r\n  var tagc = '": ""
-        },
-        "FormOperations": {
-            "Enter the name for new option.": "",
-            "Form Editor": "",
-            "Insert a check box.": "",
-            "Insert a Form.": "",
-            "Insert a multi-line text field.": "",
-            "Insert a radio button.": "",
-            "Insert a select field.": "",
-            "Insert a submit/reset button.": "",
-            "Insert a text, password or hidden field.": "",
-            "Message Sent": "",
-            "Please Select...": ""
-        },
-        "Forms": {
-            "'onClick'=": "",
-            "Access Key:": "",
-            "Action URL:": "",
-            "Button Script": "",
-            "Checked": "",
-            "Columns:": "",
-            "Default text (optional)": "",
-            "Dimensions": "",
-            "Disabled": "",
-            "Encoding:": "",
-            "For Control:": "",
-            "Form": "",
-            "Form Element: FIELDSET": "",
-            "Form Element: INPUT": "",
-            "Form Element: LABEL": "",
-            "Form Element: SELECT": "",
-            "Form Element: TEXTAREA": "",
-            "Form handler script": "",
-            "Form Name:": "",
-            "Get": "",
-            "Hard": "",
-            "Height in number of rows": "",
-            "HTML-Form to CGI (default)": "",
-            "Image source": "",
-            "Initial Text:": "",
-            "Insert/Edit Form": "",
-            "Insert/Edit Form Element FIELDSET": "",
-            "Insert/Edit Form Element INPUT": "",
-            "Insert/Edit Form Element LABEL": "",
-            "Insert/Edit Form Element SELECT": "",
-            "Insert/Edit Form Element TEXTAREA": "",
-            "Javascript for button click": "",
-            "Label:": "",
-            "Legend:": "",
-            "Max length:": "",
-            "Maximum number of characters accepted": "",
-            "Method:": "",
-            "multipart Form Data (File-Upload)": "",
-            "Name": "",
-            "Name of the form input": "",
-            "Name of the form select": "",
-            "name of the textarea": "",
-            "Name/ID:": "",
-            "normal": "",
-            "nowrap": "",
-            "Off": "",
-            "Physical": "",
-            "Please enter a Label": "",
-            "Post": "",
-            "pre": "",
-            "Read Only": "",
-            "Size of text box in characters": "",
-            "Size:": "",
-            "Soft": "",
-            "Tab Index:": "",
-            "Target Frame:": "",
-            "Text:": "",
-            "URL of image": "",
-            "Value of the form input": "",
-            "Value:": "",
-            "Virtual": "",
-            "Width in number of characters": "",
-            "Wrap Mode:": "",
-            "You must enter a Name": ""
-        },
-        "FullPage": {
-            "...": "",
-            "Alternate style-sheet:": "",
-            "Background color:": "",
-            "Character set:": "",
-            "cyrillic (ISO-8859-5)": "",
-            "cyrillic (KOI8-R)": "",
-            "cyrillic (WINDOWS-1251)": "",
-            "DOCTYPE:": "",
-            "Document properties": "",
-            "Document title:": "",
-            "Keywords:": "",
-            "Primary style-sheet:": "",
-            "Text color:": "",
-            "UTF-8 (recommended)": "",
-            "western (ISO-8859-1)": ""
-        },
-        "Gecko": {
-            "The Paste button does not work in this browser for security reasons. Press CTRL-V on your keyboard to paste directly.": ""
-        },
-        "HorizontalRule": {
-            "&#x00d7;": "",
-            "&nbsp;": "",
-            "Insert/edit horizontal rule": "",
-            "Insert/Edit Horizontal Rule": "",
-            "No shading": "",
-            "Style": ""
-        },
-        "InlineStyler": {
-            "CSS Style": "",
-            "-": "<<Equation>>"
-        },
-        "InsertAnchor": {
-            "Anchor name": "",
-            "Insert Anchor": "",
-            "Delete": "<<Abbreviation>>"
-        },
-        "InsertNote": {
-            "Insert": "",
-            "Insert footnote": "",
-            "Insert Note": ""
-        },
-        "InsertPagebreak": {
-            "Page break": "",
-            "Page Break": ""
-        },
-        "InsertSmiley": {
-            "Insert Smiley": ""
-        },
-        "InsertSnippet": {
-            "\\n  This is an information about something\\n": "",
-            "Hide preview": "",
-            "Insert as": "",
-            "Insert Snippet": "",
-            "InsertSnippet for Xinha": "",
-            "Link1": "",
-            "Link2": "",
-            "Link3": "",
-            "Link4": "",
-            "Link5": "",
-            "Show preview": "",
-            "This is an information about something": "",
-            "Variable": ""
-        },
-        "InsertSnippet2": {
-            "All Categories": "",
-            "Filter": "",
-            "Insert as HTML": "",
-            "Insert as template variable": "",
-            "Only search word beginning": "",
-            "HTML": "<<CharCounter>>",
-            "Insert Snippet": "<<InsertSnippet>>",
-            "InsertSnippet for Xinha": "<<InsertSnippet>>",
-            "Variable": "<<InsertSnippet>>"
-        },
-        "InsertTable": {
-            "Caption for the table": "",
-            "Collapse borders:": "",
-            "Layou": "",
-            "Style of the border": ""
-        },
-        "LangMarks": {
-            "&mdash; language &mdash;": "",
-            "', '": "",
-            "English": "",
-            "French": "",
-            "Greek": "",
-            "language select": "",
-            "Latin": ""
-        },
-        "Linker": {
-            "(px)": "",
-            "Anchor-Link": "",
-            "Anchor:": "",
-            "Email Address:": "",
-            "Email Link": "",
-            "Location Bar:": "",
-            "Menu Bar:": "",
-            "Message Template:": "",
-            "New Window": "",
-            "Ordinary Link": "",
-            "Popup Window": "",
-            "PopupWindow": "",
-            "Remove Link": "",
-            "Resizeable:": "",
-            "Same Window (jump out of frames)": "",
-            "Scrollbars:": "",
-            "Shows On Hover": "",
-            "Status Bar:": "",
-            "Subject:": "",
-            "Title:": "",
-            "Toolbar:": "",
-            "URL Link": "",
-            "You must select some text before making a new link.": "",
-            "Are you sure you wish to remove this link?": "<<CreateLink>>",
-            "Name:": "<<Forms>>",
-            "Size:": "<<Forms>>"
-        },
-        "MootoolsFileManager": {
-            "Insert File Link": "",
-            "You must select some text before making a new link.": "<<Linker>>"
-        },
-        "Opera": {
-            "MARK": ""
-        },
-        "PasteText": {
-            "Insert text in new paragraph": ""
-        },
-        "PreserveScripts": {
-            "JavaScript": "",
-            "PHP": ""
-        },
-        "QuickTag": {
-            "',\r\n                           'cl': '": "",
-            "ATTRIBUTES": "",
-            "Colors": "",
-            "Enter the TAG you want to insert": "",
-            "No CSS class avaiable": "",
-            "Ok": "",
-            "OPTIONS": "",
-            "Quick Tag Editor": "",
-            "TAGs": "",
-            "There are some unclosed quote": "",
-            "This attribute already exists in the TAG": "",
-            "You have to select some text": ""
-        },
-        "SetId": {
-            "ID/Name:": "",
-            "Set Id and Name": "",
-            "Set Id/Name": "",
-            "Set ID/Name": "",
-            "Delete": "<<Abbreviation>>"
-        },
-        "SmartReplace": {
-            "ClosingDoubleQuotes": "",
-            "ClosingSingleQuote": "",
-            "Convert all quotes and dashes in the current document": "",
-            "Enable automatic replacements": "",
-            "OpeningDoubleQuotes": "",
-            "OpeningSingleQuote": "",
-            "SmartReplace": "",
-            "SmartReplace Settings": ""
-        },
-        "SuperClean": {
-            "Clean bad HTML from Microsoft Word.": "",
-            "Clean Selection Only": "",
-            "Clean up HTML": "",
-            "Cleaning Scope": "",
-            "General tidy up and correction of some problems.": "",
-            "Please select from the following cleaning options...": "",
-            "Please stand by while cleaning in process...": "",
-            "Remove alignment (left/right/justify).": "",
-            "Remove all classes (CSS).": "",
-            "Remove All HTML Tags": "",
-            "Remove all styles (CSS).": "",
-            "Remove custom font sizes.": "",
-            "Remove custom text colors.": "",
-            "Remove custom typefaces (font \"styles\").": "",
-            "Remove emphasis and annotations.": "",
-            "Remove lang attributes.": "",
-            "Remove Paragraphs": "",
-            "Remove superscripts and subscripts.": "",
-            "Replace directional quote marks with non-directional quote marks.": "",
-            "Vigorously purge HTML from Microsoft Word.": ""
-        },
-        "TableOperations": {
-            "Cell Type:": "",
-            "Cells down": "",
-            "Cells to the right, and": "",
-            "Do Not Change": "",
-            "Frame and borders": "",
-            "Header (th)": "",
-            "Merge current cell with:": "",
-            "Normal (td)": "",
-            "Columns": "<<Forms>>",
-            "Merge Cells": "<<ContextMenu>>"
-        },
-        "UnsavedChanges": {
-            "You have unsaved changes in the editor": ""
-        },
-        "WebKit": {
-            "The Paste button does not work in this browser for security reasons. Press CTRL-V on your keyboard to paste directly.": "<<Gecko>>"
-        },
-        "Xinha": {
-            "1 (8 pt)": "",
-            "2 (10 pt)": "",
-            "3 (12 pt)": "",
-            "4 (14 pt)": "",
-            "5 (18 pt)": "",
-            "6 (24 pt)": "",
-            "7 (36 pt)": "",
-            "Arial": "",
-            "Courier New": "",
-            "Create Statusbar": "",
-            "CTRL-0 (zero)": "",
-            "CTRL-1 .. CTRL-6": "",
-            "CTRL-A": "",
-            "CTRL-B": "",
-            "CTRL-C": "",
-            "CTRL-E": "",
-            "CTRL-I": "",
-            "CTRL-J": "",
-            "CTRL-L": "",
-            "CTRL-N": "",
-            "CTRL-R": "",
-            "CTRL-S": "",
-            "CTRL-U": "",
-            "CTRL-V": "",
-            "CTRL-X": "",
-            "CTRL-Y": "",
-            "CTRL-Z": "",
-            "Error Loading Xinha.  Developers, check the Error Console for information.": "",
-            "Finishing": "",
-            "Generate Xinha framework": "",
-            "Georgia": "",
-            "Impact": "",
-            "Loading Core": "",
-            "Loading in progress. Please wait!": "",
-            "Loading plugin $plugin": "",
-            "Loading plugins": "",
-            "MS Word Cleaner": "",
-            "Select Color": "",
-            "Tahoma": "",
-            "Times New Roman": "",
-            "Touch here first to activate editor.": "",
-            "Verdana": "",
-            "Waiting for Iframe to load...": "",
-            "WingDings": "",
-            "Xinha": ""
-        },
-        "BackgroundImage": {
-            "__ TRANSLATOR NOTE __": "*** BACKGROUNDIMAGE IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***",
-            "Remove Current Background": "",
-            "Set Background": "",
-            "Set page background image": "",
-            "Set Page Background Image": ""
-        },
-        "ClientsideSpellcheck": {
-            "__ TRANSLATOR NOTE __": "*** CLIENTSIDESPELLCHECK IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***",
-            "Spell Check using ieSpell": ""
-        },
-        "ExtendedFileManager": {
-            "__ TRANSLATOR NOTE __": "*** EXTENDEDFILEMANAGER IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***",
-            "10%": "",
-            "100%": "",
-            "200%": "",
-            "25%": "",
-            "50%": "",
-            "75%": "",
-            ">List View": "",
-            ">Thumbnail View": "",
-            "A:": "",
-            "Alt": "",
-            "Border Color": "",
-            "D:": "",
-            "File List": "",
-            "File Manager": "",
-            "Filesize:": "",
-            "Folder": "",
-            "GIF": "",
-            "H:": "",
-            "Image Editor": "",
-            "Image Selection": "",
-            "Maximum folder size limit reached. Upload disabled.": "",
-            "No Files Found": "",
-            "Please enter value": "",
-            "PNG": "",
-            "Preset": "",
-            "Rename": "",
-            "Rotate 180 &deg;": "",
-            "Rotate 90 &deg; CCW": "",
-            "Rotate 90 &deg; CW": "",
-            "Target Window": "",
-            "Toggle marker color": "",
-            "X:": "",
-            "Xinha Image Editor": "",
-            "Y:": "",
-            "Zoom": "",
-            "Copy": "<<ContextMenu>>",
-            "Cut": "<<ContextMenu>>",
-            "Insert File Link": "<<MootoolsFileManager>>",
-            "You must select some text before making a new link.": "<<Linker>>"
-        },
-        "Filter": {
-            "__ TRANSLATOR NOTE __": "*** FILTER IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***",
-            "Filter": "<<InsertSnippet2>>"
-        },
-        "HtmlTidy": {
-            "__ TRANSLATOR NOTE __": "*** HTMLTIDY IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***",
-            "Auto-Tidy": "",
-            "Don't Tidy": "",
-            "HTML Tidy": "",
-            "Tidy failed.  Check your HTML for syntax errors.": ""
-        },
-        "ImageManager": {
-            "__ TRANSLATOR NOTE __": "*** IMAGEMANAGER IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***",
-            "Flickr Picture List": "",
-            "Flickr Pictures": "",
-            "Flickr Selection": "",
-            "Flickr Username/Email": "",
-            "Image List": "",
-            "Keyword": "",
-            "No Photos Found": "",
-            "No Videos Found": "",
-            "This Server": "",
-            "YouTube Selection": "",
-            "YouTube Username": "",
-            "YouTube Video List": "",
-            "YouTube Videos": "",
-            "A:": "<<ExtendedFileManager>>",
-            "D:": "<<ExtendedFileManager>>",
-            "GIF": "<<ExtendedFileManager>>",
-            "H:": "<<ExtendedFileManager>>",
-            "Image Editor": "<<ExtendedFileManager>>",
-            "Image Selection": "<<ExtendedFileManager>>",
-            "PNG": "<<ExtendedFileManager>>",
-            "Rotate 180 &deg;": "<<ExtendedFileManager>>",
-            "Rotate 90 &deg; CCW": "<<ExtendedFileManager>>",
-            "Rotate 90 &deg; CW": "<<ExtendedFileManager>>",
-            "X:": "<<ExtendedFileManager>>",
-            "Y:": "<<ExtendedFileManager>>"
-        },
-        "InsertMarquee": {
-            "__ TRANSLATOR NOTE __": "*** INSERTMARQUEE IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***",
-            "Alternate": "",
-            "Background-Color:": "",
-            "Behavior:": "",
-            "Continuous": "",
-            "Direction:": "",
-            "Insert scrolling marquee": "",
-            "Marquee Editor": "",
-            "Scroll Amount:": "",
-            "Scroll Delay:": "",
-            "Slide": "",
-            "Speed Control": "",
-            "Name": "<<Forms>>",
-            "Name/ID:": "<<Forms>>",
-            "Text:": "<<Forms>>"
-        },
-        "InsertPicture": {
-            "__ TRANSLATOR NOTE __": "*** INSERTPICTURE IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***",
-            "Leave empty for not defined": "",
-            " Open file in new window": "",
-            "Open file in new window": "",
-            "Upload file": "",
-            "Size": "<<Forms>>"
-        },
-        "NoteServer": {
-            "__ TRANSLATOR NOTE __": "*** NOTESERVER IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***",
-            "120%": "",
-            "150%": "",
-            "80%": "",
-            "Add GUIDO Code in a textbox on the page": "",
-            "Add MIDI link to allow students to hear the music": "",
-            "Format": "",
-            "Guido code": "",
-            "GUIDO Code": "",
-            "Image in applet": "",
-            "Insert GUIDO Music Notation": "",
-            "MIDI File": "",
-            "Source Code": "",
-            "With Mozilla, the applet will not be visible in editor, but only in Web page after submitting.": "",
-            "Zoom :": "",
-            "100%": "<<ExtendedFileManager>>",
-            "Zoom": "<<ExtendedFileManager>>"
-        },
-        "PSLocal": {
-            "__ TRANSLATOR NOTE __": "*** PSLOCAL IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***",
-            "Confirm": "",
-            "Enable": "",
-            "Enable Gears in order to use local document storage and configuration.": "",
-            "Enabling Local Storage": "",
-            "Install": "",
-            "Learn About Local Storage": "",
-            "This will reload the page, causing you to lose any unsaved work.  Press \"OK\" to reload.": "",
-            "Xinha uses Google Gears to enable local document storage.  With Gears installed, you can save drafts of your documents on your hard drive, configure Xinha to look the way you want, and carry this information wherever you use Xinha on the web.": ""
-        },
-        "PSServer": {
-            "__ TRANSLATOR NOTE __": "*** PSSERVER IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***",
-            "File: ": "",
-            "Import": ""
-        },
-        "PersistentStorage": {
-            "__ TRANSLATOR NOTE __": "*** PERSISTENTSTORAGE IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***",
-            "Details": "",
-            "File Browser": "",
-            "Hello    There C ": "",
-            "Hello  There A ": "",
-            "Hello \" There B \"": "",
-            "Hello ' There D '": "",
-            "List of Places": "",
-            "New Document": "",
-            "Open": "",
-            "Open Document": "",
-            "Places": "",
-            "Please enter the name of the directory you'd like to create.": "",
-            "Save Document": "",
-            "This will erase any unsaved content.  If you're certain, please click OK to continue.": "",
-            "Web URL": "",
-            "Confirm": "<<PSLocal>>",
-            "Copy": "<<ContextMenu>>",
-            "Delete": "<<Abbreviation>>",
-            "File List": "<<ExtendedFileManager>>",
-            "File Manager": "<<ExtendedFileManager>>",
-            "Insert": "<<InsertNote>>",
-            "You must select some text before making a new link.": "<<Linker>>"
-        },
-        "SpellChecker": {
-            "__ TRANSLATOR NOTE __": "*** SPELLCHECKER IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***",
-            "Dictionary": "",
-            "Finished list of mispelled words": "",
-            "HTMLArea Spell Checker": "",
-            "I will open it in a new page.": "",
-            "Ignore": "",
-            "Ignore all": "",
-            "Info": "",
-            "Learn": "",
-            "No mispelled words found with the selected dictionary.": "",
-            "Original word": "",
-            "Please confirm that you want to open this link": "",
-            "Please wait.  Calling spell checker.": "",
-            "Please wait: changing dictionary to": "",
-            "pliz weit ;-)": "",
-            "Re-check": "",
-            "Replace": "",
-            "Replace all": "",
-            "Revert": "",
-            "Spell Checker": "",
-            "Spell-check": "",
-            "Suggestions": "",
-            "This will drop changes and quit spell checker.  Please confirm.": ""
-        },
-        "Template": {
-            "__ TRANSLATOR NOTE __": "*** TEMPLATE IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***",
-            "Insert template": ""
-        },
-        "UnFormat": {
-            "__ TRANSLATOR NOTE __": "*** UNFORMAT IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***",
-            "All": "",
-            "All HTML:": "",
-            "Cleaning Area": "",
-            "Cleaning options": "",
-            "Formatting:": "",
-            "Page Cleaner": "",
-            "Select which types of formatting you would like to remove.": "",
-            "Selection": ""
-        }
-    }
-}
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/lang/merged/sh.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/lang/merged/sh.js
deleted file mode 100644
index e734c52..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/lang/merged/sh.js
+++ /dev/null
@@ -1,1575 +0,0 @@
-// Xinha Language Combined Translation File
-//
-// LANG: "sh", ENCODING: UTF-8
-//
-// INSTRUCTIONS TO TRANSLATORS
-// ===========================================================================
-//
-// Your translation must be in UTF-8 Character Encoding.
-//
-// This is a JSON encoded file (plus comments), strings should be double-quote
-// only, do not use single quotes to surround strings - "hello", not 'hello'
-// do not have a trailing comma after the last entry in a section.
-//
-// Only full line comments are allowed (that a comments occupy entire lines).
-//
-// Search for the __NEW_TRANSLATIONS__ section below, this is where you will
-// want to focus, this section includes things that do not presently have a 
-// translation or for which the translation needs to be checked for accuracy.
-//
-// In the New Translations section a translation string is one of the following
-//
-//  "English String Here" : ""
-//     This means it is not translated yet, add your translation...
-//     "English String Here" : "Klingon String Here"
-//
-//  "English String Here" : "Translated String Here"
-//     This means that an existing translation for this string, in some other
-//     section has been found, and used.  Check that it is approprite for this
-//     section and if it is, that's fine leave it as is, otherwise change as
-//     appropriate.
-//
-//  "English String Here" : "<<AnotherSection>>"
-//     This means use the same translation for this string as <<AnotherSection>>
-//     this saves you re-tranlating strings.  If the Context of this section
-//     and the context of AnotherSection seem the same, that's fine leave it
-//     using that translation, but if this section needs a different translation, 
-//     you can provide it by replacing the link (<<AnotherSection>>) with that
-//     new translation.  For example - a "Table" in say "DataPlugin" is 
-//     perhaps translated differently to "Table" in "FurniturePlugin".
-//
-// TESTING YOUR TRANSLATION
-// ===========================================================================
-// Simply place your translation file on your webserver somewhere for example
-//
-//   /xinha/lang/merged/sh.js
-//
-// and then tell Xinha where to get it (before loading XinhaCore.js) by 
-//
-//  _editor_lang              = 'sh';
-//  _editor_lang_merged_file  = '/xinha/lang/merged/sh.js';
-//
-// Xinha will load your new language definition.
-//
-// SUBMITTING YOUR TRANSLATION
-// ===========================================================================
-// Simply create a Ticket on the Xinha website and attach your translation 
-// file.
-//
-// The Xinha developers will take your file and use the 
-//     contrib/lc_split_merged_file.php
-// script to load it into the Xinha distribution.
-
-{
-    "Abbreviation": {
-        "Cancel": "Poništi",
-        "OK": "OK"
-    },
-    "AboutBox": {
-        "About this editor": "O ovom editoru"
-    },
-    "BackgroundImage": {
-        "Cancel": "Poništi"
-    },
-    "ColorPicker": {
-        "OK": "OK"
-    },
-    "ContextMenu": {
-        "Justify Center": "Ravnanje po simetrali",
-        "Justify Full": "Puno ravnanje",
-        "Justify Left": "Ravnanje ulevo",
-        "Justify Right": "Ravnanje udesno"
-    },
-    "CreateLink": {
-        "Cancel": "Poništi",
-        "Insert/Modify Link": "Dodaj/promeni Link",
-        "New window (_blank)": "Novom prozoru (_blank)",
-        "None (use implicit)": "koristi podrazumevano",
-        "OK": "OK",
-        "Other": "Drugo",
-        "Same frame (_self)": "Isti frejm (_self)",
-        "Target:": "Otvori u:",
-        "Title (tooltip):": "Naziv (tooltip):",
-        "Top frame (_top)": "Glavni frejm (_top)",
-        "URL:": "URL:"
-    },
-    "EditTag": {
-        "Cancel": "Poništi",
-        "OK": "OK"
-    },
-    "Equation": {
-        "Cancel": "Poništi",
-        "OK": "OK",
-        "Preview": "Pregled"
-    },
-    "ExtendedFileManager": {
-        "Absbottom": "Apsolutno dno",
-        "Absmiddle": "Apsolutna sredina",
-        "Baseline": "Donja linija",
-        "Bottom": "Dno",
-        "Cancel": "Poništi",
-        "Left": "Levo",
-        "Middle": "Sredina",
-        "New window (_blank)": "Novom prozoru (_blank)",
-        "None (use implicit)": "koristi podrazumevano",
-        "Not set": "Nije postavljeno",
-        "OK": "OK",
-        "Positioning of this image": "Postavljanje ove slike",
-        "Preview": "Pregled",
-        "Right": "Desno",
-        "Same frame (_self)": "Isti frejm (_self)",
-        "Texttop": "Vrh teksta",
-        "Title (tooltip)": "Naziv (tooltip):",
-        "Top": "Vrh",
-        "Top frame (_top)": "Glavni frejm (_top)",
-        "Width": "Širina",
-        "Width:": "Širina"
-    },
-    "Forms": {
-        "Cancel": "Poništi",
-        "Image URL:": "URL slike",
-        "OK": "OK",
-        "Rows:": "Redovi"
-    },
-    "FullPage": {
-        "Cancel": "Poništi",
-        "OK": "OK"
-    },
-    "HorizontalRule": {
-        "Alignment:": "Ravnanje",
-        "Cancel": "Poništi",
-        "Horizontal Rule": "Horizontalna linija",
-        "Layout": "Prelom",
-        "Left": "Levo",
-        "OK": "OK",
-        "Right": "Desno",
-        "Width:": "Širina"
-    },
-    "ImageManager": {
-        "Absbottom": "Apsolutno dno",
-        "Absmiddle": "Apsolutna sredina",
-        "Baseline": "Donja linija",
-        "Bottom": "Dno",
-        "Cancel": "Poništi",
-        "Insert Image": "Ubaci sliku",
-        "Left": "Levo",
-        "Middle": "Sredina",
-        "Not set": "Nije postavljeno",
-        "OK": "OK",
-        "Positioning of this image": "Postavljanje ove slike",
-        "Right": "Desno",
-        "Texttop": "Vrh teksta",
-        "Top": "Vrh",
-        "Width:": "Širina"
-    },
-    "InlineStyler": {
-        "Baseline": "Donja linija",
-        "Bottom": "Dno",
-        "Image URL": "URL slike",
-        "Layout": "Prelom",
-        "Left": "Levo",
-        "Middle": "Sredina",
-        "Right": "Desno",
-        "Top": "Vrh",
-        "Width": "Širina"
-    },
-    "InsertAnchor": {
-        "Cancel": "Poništi",
-        "OK": "OK"
-    },
-    "InsertImage": {
-        "Absbottom": "Apsolutno dno",
-        "Absmiddle": "Apsolutna sredina",
-        "Alignment:": "Ravnanje",
-        "Alternate text:": "Alternativni tekst",
-        "Baseline": "Donja linija",
-        "Border thickness:": "Debljina okvira",
-        "Bottom": "Dno",
-        "Cancel": "Poništi",
-        "Enter the image URL here": "Unesite URL slike ovde",
-        "For browsers that don't support images": "Za pretraživače koji ne podržavaju slike",
-        "Horizontal padding": "Horizontalno odstojanje",
-        "Horizontal:": "Po horizontali",
-        "Image Preview:": "Pregled slike",
-        "Image URL:": "URL slike",
-        "Insert Image": "Ubaci sliku",
-        "Layout": "Prelom",
-        "Leave empty for no border": "Ostavi prazno kad nema okvira",
-        "Left": "Levo",
-        "Middle": "Sredina",
-        "Not set": "Nije postavljeno",
-        "OK": "OK",
-        "Positioning of this image": "Postavljanje ove slike",
-        "Preview": "Pregled",
-        "Preview the image in a new window": "Pregledaj sliku u novom prozoru",
-        "Right": "Desno",
-        "Spacing": "Razmak",
-        "Texttop": "Vrh teksta",
-        "Top": "Vrh",
-        "Vertical padding": "Vertikalno odstojanje",
-        "Vertical:": "Po vertikali"
-    },
-    "InsertMarquee": {
-        "Cancel": "Poništi",
-        "Left": "Levo",
-        "OK": "OK",
-        "Right": "Desno",
-        "Width:": "Širina"
-    },
-    "InsertNote": {
-        "Cancel": "Poništi"
-    },
-    "InsertPicture": {
-        "Absbottom": "Apsolutno dno",
-        "Absmiddle": "Apsolutna sredina",
-        "Alignment:": "Ravnanje",
-        "Alternate text:": "Alternativni tekst",
-        "Baseline": "Donja linija",
-        "Border thickness:": "Debljina okvira",
-        "Bottom": "Dno",
-        "Cancel": "Poništi",
-        "Enter the image URL here": "Unesite URL slike ovde",
-        "For browsers that don't support images": "Za pretraživače koji ne podržavaju slike",
-        "Horizontal padding": "Horizontalno odstojanje",
-        "Horizontal:": "Po horizontali",
-        "Image Preview:": "Pregled slike",
-        "Image URL:": "URL slike",
-        "Insert Image": "Ubaci sliku",
-        "Layout": "Prelom",
-        "Leave empty for no border": "Ostavi prazno kad nema okvira",
-        "Left": "Levo",
-        "Middle": "Sredina",
-        "Not set": "Nije postavljeno",
-        "OK": "OK",
-        "Positioning of this image": "Postavljanje ove slike",
-        "Preview": "Pregled",
-        "Preview the image in a new window": "Pregledaj sliku u novom prozoru",
-        "Right": "Desno",
-        "Spacing": "Razmak",
-        "Texttop": "Vrh teksta",
-        "Top": "Vrh",
-        "Vertical padding": "Vertikalno odstojanje",
-        "Vertical:": "Po vertikali",
-        "Width:": "Širina"
-    },
-    "InsertSnippet": {
-        "Cancel": "Poništi"
-    },
-    "InsertSnippet2": {
-        "Cancel": "Poništi"
-    },
-    "InsertTable": {
-        "Absbottom": "Apsolutno dno",
-        "Absmiddle": "Apsolutna sredina",
-        "Alignment:": "Ravnanje",
-        "Baseline": "Donja linija",
-        "Border thickness:": "Debljina okvira",
-        "Bottom": "Dno",
-        "Cancel": "Poništi",
-        "Cell padding:": "Unutrašnja odstojanja u ćeliji",
-        "Cell spacing:": "Rastojanje ćelija",
-        "Cols:": "Kolone",
-        "Em": "Em",
-        "Fixed width columns": "Fiksirana širina kolona",
-        "Insert Table": "Ubaci tabelu",
-        "Layout": "Prelom",
-        "Leave empty for no border": "Ostavi prazno kad nema okvira",
-        "Left": "Levo",
-        "Middle": "Sredina",
-        "Not set": "Nije postavljeno",
-        "Number of columns": "Broj kolona",
-        "Number of rows": "Broj redova",
-        "OK": "OK",
-        "Percent": "Procenat",
-        "Pixels": "Pikseli",
-        "Positioning of this table": "Postavljanje ove tabele",
-        "Right": "Desno",
-        "Rows:": "Redovi",
-        "Space between adjacent cells": "Rastojanje naspramnih ćelija",
-        "Space between content and border in cell": "Rastojanje između sadržaja i okvira ćelije",
-        "Spacing": "Razmak",
-        "Texttop": "Vrh teksta",
-        "Top": "Vrh",
-        "Width of the table": "Širina tabele",
-        "Width unit": "Jedinica širine",
-        "Width:": "Širina"
-    },
-    "Linker": {
-        "Cancel": "Poništi",
-        "Insert/Modify Link": "Dodaj/promeni Link",
-        "OK": "OK",
-        "Target:": "Otvori u:",
-        "URL:": "URL:"
-    },
-    "NoteServer": {
-        "Cancel": "Poništi",
-        "Image Preview": "Pregled slike",
-        "OK": "OK",
-        "Preview": "Pregled",
-        "Preview the image in a new window": "Pregledaj sliku u novom prozoru"
-    },
-    "PSLocal": {
-        "Cancel": "Poništi"
-    },
-    "PasteText": {
-        "Cancel": "Poništi",
-        "OK": "OK"
-    },
-    "PersistentStorage": {
-        "Cancel": "Poništi",
-        "Insert Image": "Ubaci sliku"
-    },
-    "QuickTag": {
-        "Cancel": "Poništi"
-    },
-    "SetId": {
-        "Cancel": "Poništi",
-        "OK": "OK"
-    },
-    "SmartReplace": {
-        "OK": "OK"
-    },
-    "SpellChecker": {
-        "Cancel": "Poništi",
-        "OK": "OK"
-    },
-    "SuperClean": {
-        "Cancel": "Poništi",
-        "OK": "OK"
-    },
-    "TableOperations": {
-        "Cancel": "Poništi",
-        "OK": "OK",
-        "Rows": "Redovi",
-        "Spacing": "Razmak"
-    },
-    "Template": {
-        "Cancel": "Poništi"
-    },
-    "UnFormat": {
-        "Cancel": "Poništi",
-        "OK": "OK"
-    },
-    "Xinha": {
-        "&#8212; format &#8212;": "&#8212; Format &#8212;",
-        "About this editor": "O ovom editoru",
-        "Address": "Adresa",
-        "Background Color": "Boja pozadine",
-        "Bold": "Masno",
-        "Bulleted List": "Lista sa simbolima",
-        "Clear Inline Font Specifications": "Obriši dodeljene osobine fonta",
-        "Clear MSOffice tags": "Obriši MSOffice tagove",
-        "Copy selection": "Kopiraj izabrano",
-        "Current style": "Važeći stil",
-        "Cut selection": "Iseci izabrano",
-        "Decrease Indent": "smanji uvlačenje",
-        "Direction left to right": "Pravac s leva na desno",
-        "Direction right to left": "Pravac s desna na levo",
-        "Font Color": "Boja slova",
-        "Formatted": "Formatiran",
-        "Heading 1": "Zaglavlje 1",
-        "Heading 2": "Zaglavlje 2",
-        "Heading 3": "Zaglavlje 3",
-        "Heading 4": "Zaglavlje 4",
-        "Heading 5": "Zaglavlje 5",
-        "Heading 6": "Zaglavlje 6",
-        "Help using editor": "Pomoć pri korišćenju editora",
-        "Horizontal Rule": "Horizontalna linija",
-        "Increase Indent": "Povećaj uvlačenje",
-        "Insert Table": "Ubaci tabelu",
-        "Insert Web Link": "Dodaj web link",
-        "Insert/Modify Image": "Dodaj/promeni sliku",
-        "Italic": "Kurziv",
-        "Justify Center": "Ravnanje po simetrali",
-        "Justify Full": "Puno ravnanje",
-        "Justify Left": "Ravnanje ulevo",
-        "Justify Right": "Ravnanje udesno",
-        "Normal": "Običan",
-        "Ordered List": "Lista sa rednim brojevima",
-        "Paste from clipboard": "Zalepi iz klipborda",
-        "Path": "Putanja",
-        "Print document": "Štampaj dokument",
-        "Redoes your last action": "Vraća poslednju radnju",
-        "Remove formatting": "Ukoni formatiranje",
-        "Select Color": "Izaberite boju",
-        "Select all": "Izaberi sve",
-        "Split Block": "Podeli blok",
-        "Strikethrough": "Precrtano",
-        "Subscript": "Indeks-tekst",
-        "Superscript": "Eksponent-tekst",
-        "Toggle Borders": "Izmeni okvire",
-        "Toggle HTML Source": "Prebaci na HTML kod",
-        "Underline": "Podvučeno",
-        "Undoes your last action": "Poništava poslednju radnju",
-        "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."
-    },
-    "__NEW_TRANSLATIONS__": {
-        "Abbreviation": {
-            "Abbreviation": "",
-            "Delete": "",
-            "Expansion:": ""
-        },
-        "AboutBox": {
-            "Close": "<<Xinha>>"
-        },
-        "CharCounter": {
-            "... in progress": "",
-            "Chars": "",
-            "HTML": "",
-            "Words": ""
-        },
-        "CharacterMap": {
-            "Insert special character": ""
-        },
-        "ColorPicker": {
-            "Click a color...": "",
-            "Color: ": "",
-            "Sample": "",
-            "Web Safe: ": "",
-            "Close": "<<Xinha>>"
-        },
-        "ContextMenu": {
-            "_Delete Row": "",
-            "_Image Properties...": "",
-            "_Modify Link...": "",
-            "_Remove Link...": "",
-            "_Table Properties...": "",
-            "C_ell Properties...": "",
-            "Chec_k Link...": "",
-            "Copy": "",
-            "Create a link": "",
-            "Current URL is": "",
-            "Cut": "",
-            "De_lete Column": "",
-            "Delete Cell": "",
-            "Delete the current column": "",
-            "Delete the current row": "",
-            "How did you get here? (Please report!)": "",
-            "I_nsert Row Before": "",
-            "In_sert Row After": "",
-            "Insert _Column Before": "",
-            "Insert a new column after the current one": "",
-            "Insert a new column before the current one": "",
-            "Insert a new row after the current one": "",
-            "Insert a new row before the current one": "",
-            "Insert a paragraph after the current node": "",
-            "Insert a paragraph before the current node": "",
-            "Insert C_olumn After": "",
-            "Insert Cell After": "",
-            "Insert Cell Before": "",
-            "Insert paragraph after": "",
-            "Insert paragraph before": "",
-            "Link points to:": "",
-            "Make lin_k...": "",
-            "Merge Cells": "",
-            "Opens this link in a new window": "",
-            "Paste": "",
-            "Please confirm that you want to remove this element:": "",
-            "Please confirm that you want to unlink this element.": "",
-            "Remove the $elem Element...": "",
-            "Remove this node from the document": "",
-            "Ro_w Properties...": "",
-            "Show the image properties dialog": "",
-            "Show the Table Cell Properties dialog": "",
-            "Show the Table Properties dialog": "",
-            "Show the Table Row Properties dialog": "",
-            "Unlink the current element": ""
-        },
-        "CreateLink": {
-            "Are you sure you wish to remove this link?": "",
-            "You need to select some text before creating a link": ""
-        },
-        "DefinitionList": {
-            "definition description": "",
-            "definition list": "",
-            "definition term": ""
-        },
-        "Dialogs": {
-            "Some Text Here": ""
-        },
-        "DynamicCSS": {
-            "Choose stylesheet": "",
-            "Default": "",
-            "Undefined": ""
-        },
-        "EditTag": {
-            "Edit HTML for selected text": "",
-            "Edit Tag By Peg": "",
-            "Tag Editor": ""
-        },
-        "Equation": {
-            "!=": "",
-            "!in": "",
-            "&gt;-": "",
-            "&gt;=": "",
-            "&lt;=": "",
-            "&lt;=&gt;": "",
-            "&lt;x&gt;": "",
-            "&nbsp; `!` &nbsp;": "",
-            "&nbsp; `.` &nbsp;": "",
-            "&nbsp; `0` &nbsp;": "",
-            "&nbsp; `2` &nbsp;": "",
-            "&nbsp; `3` &nbsp;": "",
-            "&nbsp; `4` &nbsp;": "",
-            "&nbsp; `5` &nbsp;": "",
-            "&nbsp; `6` &nbsp;": "",
-            "&nbsp; `7` &nbsp;": "",
-            "&nbsp; `8` &nbsp;": "",
-            "&nbsp; `9` &nbsp;": "",
-            "&nbsp; `e` &nbsp;": "",
-            "&nbsp;&nbsp;`1` &nbsp;": "",
-            "&nbsp;`+{::}`&nbsp;": "",
-            "&nbsp;`-:\\ `": "",
-            "&nbsp;`-{::}`&nbsp;": "",
-            "&nbsp;`C`&nbsp;": "",
-            "&nbsp;`cos`": "",
-            "&nbsp;`ln`&nbsp;": "",
-            "&nbsp;`pi` &nbsp;": "",
-            "&nbsp;`sin`": "",
-            "&nbsp;`tan`": "",
-            "&nbsp;`times`&nbsp;": "",
-            "&quot;text&quot;": "",
-            "'+formula+'": "",
-            "((n),(k))": "",
-            "(x+1)/(x-1)": "",
-            "*": "",
-            "**": "",
-            "+-": "",
-            "-&gt;": "",
-            "-&lt;": "",
-            "-:": "",
-            "-=": "",
-            "//": "",
-            "/_": "",
-            ":.": "",
-            "=&gt;": "",
-            "@": "",
-            "[[a,b],[c,d]]": "",
-            "\\\\": "",
-            "\\nClick in the box to use your keyboard or use the buttons\\n": "",
-            "^^": "",
-            "^^^": "",
-            "__|": "",
-            "_|_": "",
-            "`!=`": "",
-            "`!in`": "",
-            "`&and;`": "",
-            "`&cap;`": "",
-            "`&cup;`": "",
-            "`&gt;-`": "",
-            "`&gt;=`": "",
-            "`&lt;=&gt;`": "",
-            "`&lt;=`": "",
-            "`&lt;x&gt;`": "",
-            "`&or;`": "",
-            "`&quot;text&quot;`": "",
-            "`((n),(k))`": "",
-            "`(x+1)/(x-1)`": "",
-            "`**`": "",
-            "`*`": "",
-            "`+-`": "",
-            "`-&gt;`": "",
-            "`-&lt;`": "",
-            "`-:`": "",
-            "`-=`": "",
-            "`//`": "",
-            "`/_`": "",
-            "`:.`": "",
-            "`=&gt;`": "",
-            "`@`": "",
-            "`[[a,b],[c,d]]`": "",
-            "`\\\\`": "",
-            "`__|`": "",
-            "`_|_`": "",
-            "`AA`": "",
-            "`aleph`": "",
-            "`alpha`": "",
-            "`and`": "",
-            "`bara`": "",
-            "`bba`": "",
-            "`bbba`": "",
-            "`beta`": "",
-            "`CC`": "",
-            "`cca`": "",
-            "`chi`": "",
-            "`darr`": "",
-            "`ddota`": "",
-            "`del`": "",
-            "`Delta`": "",
-            "`delta`": "",
-            "`diamond`": "",
-            "`dota`": "",
-            "`dy/dx`": "",
-            "`EE`": "",
-            "`epsi`": "",
-            "`eta`": "",
-            "`fra`": "",
-            "`Gamma`": "",
-            "`gamma`": "",
-            "`grad`": "",
-            "`harr`": "",
-            "`hArr`": "",
-            "`hata`": "",
-            "`if`": "",
-            "`in`": "",
-            "`int`": "",
-            "`iota`": "",
-            "`kappa`": "",
-            "`lambda`": "",
-            "`Lambda`": "",
-            "`lArr`": "",
-            "`larr`": "",
-            "`lim_(x-&gt;oo)`": "",
-            "`log`": "",
-            "`mu`": "",
-            "`NN`": "",
-            "`nn`": "",
-            "`not`": "",
-            "`nu`": "",
-            "`o+`": "",
-            "`o.`": "",
-            "`O/`": "",
-            "`oint`": "",
-            "`omega`": "",
-            "`Omega`": "",
-            "`oo`": "",
-            "`or`": "",
-            "`ox`": "",
-            "`Phi`": "",
-            "`phi`": "",
-            "`Pi`": "",
-            "`pi`": "",
-            "`prod`": "",
-            "`prop`": "",
-            "`Psi`": "",
-            "`psi`": "",
-            "`QQ`": "",
-            "`quad`": "",
-            "`rArr`": "",
-            "`rho`": "",
-            "`root(n)(x)`": "",
-            "`RR`": "",
-            "`sfa`": "",
-            "`sigma`": "",
-            "`Sigma`": "",
-            "`sqrt(x)`": "",
-            "`square`": "",
-            "`stackrel(-&gt;)(+)`": "",
-            "`sub`": "",
-            "`sube`": "",
-            "`sum`": "",
-            "`sup`": "",
-            "`supe`": "",
-            "`tau`": "",
-            "`Theta`": "",
-            "`theta`": "",
-            "`TT`": "",
-            "`tta`": "",
-            "`uarr`": "",
-            "`ula`": "",
-            "`upsilon`": "",
-            "`uu`": "",
-            "`veca`": "",
-            "`vv`": "",
-            "`x_(mn)`": "",
-            "`Xi`": "",
-            "`xi`": "",
-            "`xx`": "",
-            "`zeta`": "",
-            "`ZZ`": "",
-            "`|-&gt;`": "",
-            "`|--`": "",
-            "`|==`": "",
-            "`|__`": "",
-            "`|~`": "",
-            "`~=`": "",
-            "`~|`": "",
-            "`~~`": "",
-            "AA": "",
-            "aleph": "",
-            "alpha": "",
-            "and": "",
-            "AsciiMath Formula Input": "",
-            "AsciiMathML Example": "",
-            "bara": "",
-            "Based on ASCIIMathML by": "",
-            "bba": "",
-            "bbba": "",
-            "beta": "",
-            "CC": "",
-            "cca": "",
-            "chi": "",
-            "darr": "",
-            "ddota": "",
-            "del": "",
-            "Delta": "",
-            "delta": "",
-            "diamond": "",
-            "dota": "",
-            "dy/dx": "",
-            "EE": "",
-            "epsi": "",
-            "eta": "",
-            "For more information on AsciiMathML visit this page:": "",
-            "Formula Editor": "",
-            "fra": "",
-            "gamma": "",
-            "Gamma": "",
-            "grad": "",
-            "hArr": "",
-            "harr": "",
-            "hata": "",
-            "if": "",
-            "in": "",
-            "Input": "",
-            "int": "",
-            "int_a^bf(x)dx": "",
-            "iota": "",
-            "kappa": "",
-            "Lambda": "",
-            "lambda": "",
-            "larr": "",
-            "lArr": "",
-            "lim_(x-&gt;oo)": "",
-            "mu": "",
-            "NN": "",
-            "nn": "",
-            "nnn": "",
-            "not": "",
-            "nu": "",
-            "o+": "",
-            "o.": "",
-            "O/": "",
-            "oint": "",
-            "omega": "",
-            "Omega": "",
-            "oo": "",
-            "or": "",
-            "ox": "",
-            "Phi": "",
-            "phi": "",
-            "pi": "",
-            "Pi": "",
-            "prod": "",
-            "prop": "",
-            "psi": "",
-            "Psi": "",
-            "QQ": "",
-            "quad": "",
-            "rArr": "",
-            "rho": "",
-            "root(n)(x)": "",
-            "RR": "",
-            "sfa": "",
-            "sigma": "",
-            "Sigma": "",
-            "sqrt(x)": "",
-            "square": "",
-            "stackrel(-&gt;)(+)": "",
-            "sub": "",
-            "sube": "",
-            "sum": "",
-            "sum_(n=1)^oo": "",
-            "sup": "",
-            "supe": "",
-            "tau": "",
-            "Theta": "",
-            "theta": "",
-            "TT": "",
-            "tta": "",
-            "uarr": "",
-            "ula": "",
-            "upsilon": "",
-            "uu": "",
-            "uuu": "",
-            "veca": "",
-            "vv": "",
-            "vvv": "",
-            "x^(m+n)": "",
-            "x_(mn)": "",
-            "Xi": "",
-            "xi": "",
-            "xx": "",
-            "zeta": "",
-            "ZZ": "",
-            "|-&gt;": "",
-            "|--": "",
-            "|==": "",
-            "|__": "",
-            "|~": "",
-            "~=": "",
-            "~|": "",
-            "~~": ""
-        },
-        "FancySelects": {
-            "'+opt.text+'": ""
-        },
-        "FindReplace": {
-            "';\r\n  var tagc = '": "",
-            "Case sensitive search": "",
-            "Clear": "",
-            "Done": "",
-            "Enter the text you want to find": "",
-            "Find and Replace": "",
-            "found item": "",
-            "found items": "",
-            "Highlight": "",
-            "Inform a replacement word": "",
-            "Next": "",
-            "not found": "",
-            "Options": "",
-            "Replace with:": "",
-            "replaced item": "",
-            "replaced items": "",
-            "Search for:": "",
-            "Substitute all occurrences": "",
-            "Substitute this occurrence?": "",
-            "Undo": "",
-            "Whole words only": ""
-        },
-        "FormOperations": {
-            "Enter the name for new option.": "",
-            "Form Editor": "",
-            "Insert a check box.": "",
-            "Insert a Form.": "",
-            "Insert a multi-line text field.": "",
-            "Insert a radio button.": "",
-            "Insert a select field.": "",
-            "Insert a submit/reset button.": "",
-            "Insert a text, password or hidden field.": "",
-            "Message Sent": "",
-            "Please Select...": ""
-        },
-        "Forms": {
-            "'onClick'=": "",
-            "Access Key:": "",
-            "Action URL:": "",
-            "Button Script": "",
-            "Checked": "",
-            "Columns:": "",
-            "Default text (optional)": "",
-            "Dimensions": "",
-            "Disabled": "",
-            "Encoding:": "",
-            "For Control:": "",
-            "Form": "",
-            "Form Element: FIELDSET": "",
-            "Form Element: INPUT": "",
-            "Form Element: LABEL": "",
-            "Form Element: SELECT": "",
-            "Form Element: TEXTAREA": "",
-            "Form handler script": "",
-            "Form Name:": "",
-            "Get": "",
-            "Hard": "",
-            "Height in number of rows": "",
-            "HTML-Form to CGI (default)": "",
-            "Image source": "",
-            "Initial Text:": "",
-            "Insert/Edit Form": "",
-            "Insert/Edit Form Element FIELDSET": "",
-            "Insert/Edit Form Element INPUT": "",
-            "Insert/Edit Form Element LABEL": "",
-            "Insert/Edit Form Element SELECT": "",
-            "Insert/Edit Form Element TEXTAREA": "",
-            "Javascript for button click": "",
-            "Label:": "",
-            "Legend:": "",
-            "Max length:": "",
-            "Maximum number of characters accepted": "",
-            "Method:": "",
-            "multipart Form Data (File-Upload)": "",
-            "Name": "",
-            "Name of the form input": "",
-            "Name of the form select": "",
-            "name of the textarea": "",
-            "Name/ID:": "",
-            "normal": "",
-            "nowrap": "",
-            "Off": "",
-            "Physical": "",
-            "Please enter a Label": "",
-            "Post": "",
-            "pre": "",
-            "Read Only": "",
-            "Size of text box in characters": "",
-            "Size:": "",
-            "Soft": "",
-            "Tab Index:": "",
-            "Target Frame:": "",
-            "Text:": "",
-            "URL of image": "",
-            "Value of the form input": "",
-            "Value:": "",
-            "Virtual": "",
-            "Width in number of characters": "",
-            "Wrap Mode:": "",
-            "You must enter a Name": "",
-            "Options": "<<FindReplace>>"
-        },
-        "FullPage": {
-            "...": "",
-            "Alternate style-sheet:": "",
-            "Background color:": "",
-            "Character set:": "",
-            "cyrillic (ISO-8859-5)": "",
-            "cyrillic (KOI8-R)": "",
-            "cyrillic (WINDOWS-1251)": "",
-            "Description:": "",
-            "DOCTYPE:": "",
-            "Document properties": "",
-            "Document title:": "",
-            "Keywords:": "",
-            "Primary style-sheet:": "",
-            "Text color:": "",
-            "UTF-8 (recommended)": "",
-            "western (ISO-8859-1)": ""
-        },
-        "FullScreen": {
-            "Maximize/Minimize Editor": ""
-        },
-        "Gecko": {
-            "The Paste button does not work in this browser for security reasons. Press CTRL-V on your keyboard to paste directly.": ""
-        },
-        "HorizontalRule": {
-            "&#x00d7;": "",
-            "&nbsp;": "",
-            "Center": "",
-            "Color:": "",
-            "Height:": "",
-            "Insert/edit horizontal rule": "",
-            "Insert/Edit Horizontal Rule": "",
-            "No shading": "",
-            "percent": "",
-            "pixels": "",
-            "Style": ""
-        },
-        "InlineStyler": {
-            "Background": "",
-            "Border": "",
-            "Char": "",
-            "Collapsed borders": "",
-            "CSS Style": "",
-            "FG Color": "",
-            "Float": "",
-            "Justify": "",
-            "Margin": "",
-            "None": "",
-            "Padding": "",
-            "Text align": "",
-            "Vertical align": "",
-            "-": "<<Equation>>",
-            "Center": "<<HorizontalRule>>",
-            "Height": "<<HorizontalRule>>",
-            "percent": "<<HorizontalRule>>",
-            "pixels": "<<HorizontalRule>>"
-        },
-        "InsertAnchor": {
-            "Anchor name": "",
-            "Insert Anchor": "",
-            "Delete": "<<Abbreviation>>"
-        },
-        "InsertImage": {
-            "You must enter the URL": ""
-        },
-        "InsertNote": {
-            "Insert": "",
-            "Insert footnote": "",
-            "Insert Note": ""
-        },
-        "InsertPagebreak": {
-            "Page break": "",
-            "Page Break": ""
-        },
-        "InsertSmiley": {
-            "Insert Smiley": ""
-        },
-        "InsertSnippet": {
-            "\\n  This is an information about something\\n": "",
-            "Hide preview": "",
-            "Insert as": "",
-            "Insert Snippet": "",
-            "InsertSnippet for Xinha": "",
-            "Link1": "",
-            "Link2": "",
-            "Link3": "",
-            "Link4": "",
-            "Link5": "",
-            "Show preview": "",
-            "This is an information about something": "",
-            "Variable": ""
-        },
-        "InsertSnippet2": {
-            "All Categories": "",
-            "Filter": "",
-            "Insert as HTML": "",
-            "Insert as template variable": "",
-            "Only search word beginning": "",
-            "HTML": "<<CharCounter>>",
-            "Insert Snippet": "<<InsertSnippet>>",
-            "InsertSnippet for Xinha": "<<InsertSnippet>>",
-            "Variable": "<<InsertSnippet>>"
-        },
-        "InsertTable": {
-            "Caption": "",
-            "Caption for the table": "",
-            "Collapse borders:": "",
-            "Layou": "",
-            "Style of the border": "",
-            "You must enter a number of columns": "",
-            "You must enter a number of rows": "",
-            "Border": "<<InlineStyler>>"
-        },
-        "LangMarks": {
-            "&mdash; language &mdash;": "",
-            "', '": "",
-            "English": "",
-            "French": "",
-            "Greek": "",
-            "language select": "",
-            "Latin": ""
-        },
-        "Linker": {
-            "(px)": "",
-            "Anchor-Link": "",
-            "Anchor:": "",
-            "Email Address:": "",
-            "Email Link": "",
-            "Location Bar:": "",
-            "Menu Bar:": "",
-            "Message Template:": "",
-            "New Window": "",
-            "Ordinary Link": "",
-            "Popup Window": "",
-            "PopupWindow": "",
-            "Remove Link": "",
-            "Resizeable:": "",
-            "Same Window (jump out of frames)": "",
-            "Scrollbars:": "",
-            "Shows On Hover": "",
-            "Status Bar:": "",
-            "Subject:": "",
-            "Title:": "",
-            "Toolbar:": "",
-            "URL Link": "",
-            "You must select some text before making a new link.": "",
-            "Are you sure you wish to remove this link?": "<<CreateLink>>",
-            "Name:": "<<Forms>>",
-            "Size:": "<<Forms>>"
-        },
-        "ListType": {
-            "Choose list style type (for ordered lists)": "",
-            "Decimal numbers": "",
-            "Lower greek letters": "",
-            "Lower latin letters": "",
-            "Lower roman numbers": "",
-            "Upper latin letters": "",
-            "Upper roman numbers": ""
-        },
-        "MootoolsFileManager": {
-            "Insert File Link": "",
-            "You must select some text before making a new link.": "<<Linker>>"
-        },
-        "Opera": {
-            "MARK": "",
-            "The Paste button does not work in Mozilla based web browsers (technical security reasons). Press CTRL-V on your keyboard to paste directly.": ""
-        },
-        "PasteText": {
-            "Insert text in new paragraph": "",
-            "Paste as Plain Text": ""
-        },
-        "PreserveScripts": {
-            "JavaScript": "",
-            "PHP": ""
-        },
-        "QuickTag": {
-            "',\r\n                           'cl': '": "",
-            "ATTRIBUTES": "",
-            "Colors": "",
-            "Enter the TAG you want to insert": "",
-            "No CSS class avaiable": "",
-            "Ok": "",
-            "OPTIONS": "",
-            "Quick Tag Editor": "",
-            "TAGs": "",
-            "There are some unclosed quote": "",
-            "This attribute already exists in the TAG": "",
-            "You have to select some text": ""
-        },
-        "SaveSubmit": {
-            "in progress": "",
-            "Ready": "",
-            "Save": "",
-            "Saving...": ""
-        },
-        "SetId": {
-            "ID/Name:": "",
-            "Set Id and Name": "",
-            "Set Id/Name": "",
-            "Set ID/Name": "",
-            "Delete": "<<Abbreviation>>"
-        },
-        "SmartReplace": {
-            "ClosingDoubleQuotes": "",
-            "ClosingSingleQuote": "",
-            "Convert all quotes and dashes in the current document": "",
-            "Enable automatic replacements": "",
-            "OpeningDoubleQuotes": "",
-            "OpeningSingleQuote": "",
-            "SmartReplace": "",
-            "SmartReplace Settings": ""
-        },
-        "Stylist": {
-            "Styles": ""
-        },
-        "SuperClean": {
-            "Clean bad HTML from Microsoft Word.": "",
-            "Clean Selection Only": "",
-            "Clean up HTML": "",
-            "Cleaning Scope": "",
-            "General tidy up and correction of some problems.": "",
-            "Please select from the following cleaning options...": "",
-            "Please stand by while cleaning in process...": "",
-            "Remove alignment (left/right/justify).": "",
-            "Remove all classes (CSS).": "",
-            "Remove All HTML Tags": "",
-            "Remove all styles (CSS).": "",
-            "Remove custom font sizes.": "",
-            "Remove custom text colors.": "",
-            "Remove custom typefaces (font \"styles\").": "",
-            "Remove emphasis and annotations.": "",
-            "Remove lang attributes.": "",
-            "Remove Paragraphs": "",
-            "Remove superscripts and subscripts.": "",
-            "Replace directional quote marks with non-directional quote marks.": "",
-            "Vigorously purge HTML from Microsoft Word.": ""
-        },
-        "TableOperations": {
-            "All four sides": "",
-            "Borders": "",
-            "Cell properties": "",
-            "Cell Properties": "",
-            "Cell Type:": "",
-            "Cells down": "",
-            "Cells to the right, and": "",
-            "Delete cell": "",
-            "Delete column": "",
-            "Delete row": "",
-            "Do Not Change": "",
-            "Frame and borders": "",
-            "Frames": "",
-            "Header (th)": "",
-            "Insert cell after": "",
-            "Insert cell before": "",
-            "Insert column after": "",
-            "Insert column before": "",
-            "Insert row after": "",
-            "Insert row before": "",
-            "Merge cells": "",
-            "Merge current cell with:": "",
-            "No rules": "",
-            "No sides": "",
-            "Normal (td)": "",
-            "Please click into some cell": "",
-            "Row properties": "",
-            "Row Properties": "",
-            "Rules will appear between all rows and columns": "",
-            "Rules will appear between columns only": "",
-            "Rules will appear between rows only": "",
-            "Spacing and padding": "",
-            "Split column": "",
-            "Split row": "",
-            "Summary": "",
-            "Table Properties": "",
-            "Table properties": "",
-            "The bottom side only": "",
-            "The left-hand side only": "",
-            "The right and left sides only": "",
-            "The right-hand side only": "",
-            "The top and bottom sides only": "",
-            "The top side only": "",
-            "Xinha cowardly refuses to delete the last cell in row.": "",
-            "Xinha cowardly refuses to delete the last column in table.": "",
-            "Xinha cowardly refuses to delete the last row in table.": "",
-            "Caption": "<<InsertTable>>",
-            "Columns": "<<Forms>>",
-            "Description": "<<FullPage>>",
-            "Merge Cells": "<<ContextMenu>>",
-            "Padding": "<<InlineStyler>>",
-            "pixels": "<<HorizontalRule>>"
-        },
-        "UnsavedChanges": {
-            "You have unsaved changes in the editor": ""
-        },
-        "WebKit": {
-            "The Paste button does not work in this browser for security reasons. Press CTRL-V on your keyboard to paste directly.": "<<Gecko>>"
-        },
-        "Xinha": {
-            "&#8212; font &#8212;": "",
-            "&#8212; size &#8212;": "",
-            "1 (8 pt)": "",
-            "2 (10 pt)": "",
-            "3 (12 pt)": "",
-            "4 (14 pt)": "",
-            "5 (18 pt)": "",
-            "6 (24 pt)": "",
-            "7 (36 pt)": "",
-            "Arial": "",
-            "Clean content pasted from Word": "",
-            "Close": "",
-            "Constructing object": "",
-            "Courier New": "",
-            "Create Statusbar": "",
-            "Create Toolbar": "",
-            "CTRL-0 (zero)": "",
-            "CTRL-1 .. CTRL-6": "",
-            "CTRL-A": "",
-            "CTRL-B": "",
-            "CTRL-C": "",
-            "CTRL-E": "",
-            "CTRL-I": "",
-            "CTRL-J": "",
-            "CTRL-L": "",
-            "CTRL-N": "",
-            "CTRL-R": "",
-            "CTRL-S": "",
-            "CTRL-U": "",
-            "CTRL-V": "",
-            "CTRL-X": "",
-            "CTRL-Y": "",
-            "CTRL-Z": "",
-            "Editor Help": "",
-            "ENTER": "",
-            "Error Loading Xinha.  Developers, check the Error Console for information.": "",
-            "Finishing": "",
-            "Generate Xinha framework": "",
-            "Georgia": "",
-            "Headings": "",
-            "Impact": "",
-            "Init editor size": "",
-            "insert linebreak": "",
-            "Insert/Overwrite": "",
-            "Keyboard shortcuts": "",
-            "Loading Core": "",
-            "Loading in progress. Please wait!": "",
-            "Loading plugin $plugin": "",
-            "Loading plugins": "",
-            "MS Word Cleaner": "",
-            "new paragraph": "",
-            "Register plugin $plugin": "",
-            "Save as": "",
-            "Set format to paragraph": "",
-            "SHIFT-ENTER": "",
-            "Tahoma": "",
-            "The editor provides the following key combinations:": "",
-            "Times New Roman": "",
-            "Touch here first to activate editor.": "",
-            "Verdana": "",
-            "Waiting for Iframe to load...": "",
-            "WingDings": "",
-            "Would you like to clear font colours?": "",
-            "Would you like to clear font sizes?": "",
-            "Would you like to clear font typefaces?": "",
-            "Xinha": ""
-        },
-        "BackgroundImage": {
-            "__ TRANSLATOR NOTE __": "*** BACKGROUNDIMAGE IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***",
-            "Remove Current Background": "",
-            "Set Background": "",
-            "Set page background image": "",
-            "Set Page Background Image": ""
-        },
-        "ClientsideSpellcheck": {
-            "__ TRANSLATOR NOTE __": "*** CLIENTSIDESPELLCHECK IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***",
-            "Spell Check using ieSpell": ""
-        },
-        "ExtendedFileManager": {
-            "__ TRANSLATOR NOTE __": "*** EXTENDEDFILEMANAGER IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***",
-            "10%": "",
-            "100%": "",
-            "200%": "",
-            "25%": "",
-            "50%": "",
-            "75%": "",
-            ">List View": "",
-            ">Thumbnail View": "",
-            "A:": "",
-            "Align": "",
-            "Alt": "",
-            "Border Color": "",
-            "Constrain Proportions": "",
-            "Crop": "",
-            "D:": "",
-            "Directory": "",
-            "Directory Up": "",
-            "Edit": "",
-            "File List": "",
-            "File Manager": "",
-            "Filename:": "",
-            "Filesize:": "",
-            "Flip Horizontal": "",
-            "Flip Image": "",
-            "Flip Vertical": "",
-            "Folder": "",
-            "GIF": "",
-            "GIF format is not supported, image editing not supported.": "",
-            "H:": "",
-            "Image Editor": "",
-            "Image Selection": "",
-            "Invalid base directory:": "",
-            "JPEG High": "",
-            "JPEG Low": "",
-            "JPEG Medium": "",
-            "Loading": "",
-            "Lock": "",
-            "Marker": "",
-            "Maximum folder size limit reached. Upload disabled.": "",
-            "Measure": "",
-            "New Folder": "",
-            "No Files Found": "",
-            "No Image Available": "",
-            "Please enter value": "",
-            "PNG": "",
-            "Preset": "",
-            "Quality:": "",
-            "Refresh": "",
-            "Rename": "",
-            "Resize": "",
-            "Rotate": "",
-            "Rotate 180 &deg;": "",
-            "Rotate 90 &deg; CCW": "",
-            "Rotate 90 &deg; CW": "",
-            "Rotate Image": "",
-            "Start X:": "",
-            "Start Y:": "",
-            "Target Window": "",
-            "Toggle marker color": "",
-            "Trash": "",
-            "Upload": "",
-            "W:": "",
-            "X:": "",
-            "Xinha Image Editor": "",
-            "Y:": "",
-            "Zoom": "",
-            "Border": "<<InlineStyler>>",
-            "Clear": "<<FindReplace>>",
-            "Color": "<<HorizontalRule>>",
-            "Copy": "<<ContextMenu>>",
-            "Cut": "<<ContextMenu>>",
-            "Height": "<<HorizontalRule>>",
-            "Height:": "<<HorizontalRule>>",
-            "Insert File Link": "<<MootoolsFileManager>>",
-            "Margin": "<<InlineStyler>>",
-            "Padding": "<<InlineStyler>>",
-            "Save": "<<SaveSubmit>>",
-            "You must select some text before making a new link.": "<<Linker>>"
-        },
-        "Filter": {
-            "__ TRANSLATOR NOTE __": "*** FILTER IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***",
-            "Filter": "<<InsertSnippet2>>"
-        },
-        "HtmlTidy": {
-            "__ TRANSLATOR NOTE __": "*** HTMLTIDY IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***",
-            "Auto-Tidy": "",
-            "Don't Tidy": "",
-            "HTML Tidy": "",
-            "Tidy failed.  Check your HTML for syntax errors.": ""
-        },
-        "ImageManager": {
-            "__ TRANSLATOR NOTE __": "*** IMAGEMANAGER IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***",
-            "Angle:": "",
-            "Flickr Picture List": "",
-            "Flickr Pictures": "",
-            "Flickr Selection": "",
-            "Flickr Username/Email": "",
-            "Folder Name:": "",
-            "Image Format": "",
-            "Image List": "",
-            "Keyword": "",
-            "No Images Found": "",
-            "No Photos Found": "",
-            "No Videos Found": "",
-            "This Server": "",
-            "YouTube Selection": "",
-            "YouTube Username": "",
-            "YouTube Video List": "",
-            "YouTube Videos": "",
-            "A:": "<<ExtendedFileManager>>",
-            "Clear": "<<FindReplace>>",
-            "Constrain Proportions": "<<ExtendedFileManager>>",
-            "Crop": "<<ExtendedFileManager>>",
-            "D:": "<<ExtendedFileManager>>",
-            "Directory": "<<ExtendedFileManager>>",
-            "Directory Up": "<<ExtendedFileManager>>",
-            "Edit": "<<ExtendedFileManager>>",
-            "Filename:": "<<ExtendedFileManager>>",
-            "Flip Horizontal": "<<ExtendedFileManager>>",
-            "Flip Image": "<<ExtendedFileManager>>",
-            "Flip Vertical": "<<ExtendedFileManager>>",
-            "GIF": "<<ExtendedFileManager>>",
-            "GIF format is not supported, image editing not supported.": "<<ExtendedFileManager>>",
-            "H:": "<<ExtendedFileManager>>",
-            "Height:": "<<HorizontalRule>>",
-            "Image Editor": "<<ExtendedFileManager>>",
-            "Image Selection": "<<ExtendedFileManager>>",
-            "Invalid base directory:": "<<ExtendedFileManager>>",
-            "JPEG High": "<<ExtendedFileManager>>",
-            "JPEG Low": "<<ExtendedFileManager>>",
-            "JPEG Medium": "<<ExtendedFileManager>>",
-            "Lock": "<<ExtendedFileManager>>",
-            "Marker": "<<ExtendedFileManager>>",
-            "Measure": "<<ExtendedFileManager>>",
-            "New Folder": "<<ExtendedFileManager>>",
-            "No Image Available": "<<ExtendedFileManager>>",
-            "PNG": "<<ExtendedFileManager>>",
-            "Quality:": "<<ExtendedFileManager>>",
-            "Refresh": "<<ExtendedFileManager>>",
-            "Resize": "<<ExtendedFileManager>>",
-            "Rotate": "<<ExtendedFileManager>>",
-            "Rotate 180 &deg;": "<<ExtendedFileManager>>",
-            "Rotate 90 &deg; CCW": "<<ExtendedFileManager>>",
-            "Rotate 90 &deg; CW": "<<ExtendedFileManager>>",
-            "Rotate Image": "<<ExtendedFileManager>>",
-            "Save": "<<SaveSubmit>>",
-            "Start X:": "<<ExtendedFileManager>>",
-            "Start Y:": "<<ExtendedFileManager>>",
-            "Trash": "<<ExtendedFileManager>>",
-            "W:": "<<ExtendedFileManager>>",
-            "X:": "<<ExtendedFileManager>>",
-            "Y:": "<<ExtendedFileManager>>"
-        },
-        "InsertMarquee": {
-            "__ TRANSLATOR NOTE __": "*** INSERTMARQUEE IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***",
-            "Alternate": "",
-            "Background-Color:": "",
-            "Behavior:": "",
-            "Continuous": "",
-            "Direction:": "",
-            "Insert scrolling marquee": "",
-            "Marquee Editor": "",
-            "Scroll Amount:": "",
-            "Scroll Delay:": "",
-            "Slide": "",
-            "Speed Control": "",
-            "Height:": "<<HorizontalRule>>",
-            "Name": "<<Forms>>",
-            "Name/ID:": "<<Forms>>",
-            "Text:": "<<Forms>>"
-        },
-        "InsertPicture": {
-            "__ TRANSLATOR NOTE __": "*** INSERTPICTURE IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***",
-            "Leave empty for not defined": "",
-            " Open file in new window": "",
-            "Open file in new window": "",
-            "Upload file": "",
-            "Height:": "<<HorizontalRule>>",
-            "Size": "<<Forms>>"
-        },
-        "NoteServer": {
-            "__ TRANSLATOR NOTE __": "*** NOTESERVER IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***",
-            "120%": "",
-            "150%": "",
-            "80%": "",
-            "Add GUIDO Code in a textbox on the page": "",
-            "Add MIDI link to allow students to hear the music": "",
-            "Format": "",
-            "Guido code": "",
-            "GUIDO Code": "",
-            "Image in applet": "",
-            "Insert GUIDO Music Notation": "",
-            "MIDI File": "",
-            "Source Code": "",
-            "With Mozilla, the applet will not be visible in editor, but only in Web page after submitting.": "",
-            "Zoom :": "",
-            "100%": "<<ExtendedFileManager>>",
-            "Options": "<<FindReplace>>",
-            "Zoom": "<<ExtendedFileManager>>"
-        },
-        "PSLocal": {
-            "__ TRANSLATOR NOTE __": "*** PSLOCAL IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***",
-            "Confirm": "",
-            "Enable": "",
-            "Enable Gears in order to use local document storage and configuration.": "",
-            "Enabling Local Storage": "",
-            "Install": "",
-            "Learn About Local Storage": "",
-            "This will reload the page, causing you to lose any unsaved work.  Press \"OK\" to reload.": "",
-            "Xinha uses Google Gears to enable local document storage.  With Gears installed, you can save drafts of your documents on your hard drive, configure Xinha to look the way you want, and carry this information wherever you use Xinha on the web.": ""
-        },
-        "PSServer": {
-            "__ TRANSLATOR NOTE __": "*** PSSERVER IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***",
-            "File: ": "",
-            "Import": ""
-        },
-        "PersistentStorage": {
-            "__ TRANSLATOR NOTE __": "*** PERSISTENTSTORAGE IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***",
-            "Details": "",
-            "File Browser": "",
-            "Hello    There C ": "",
-            "Hello  There A ": "",
-            "Hello \" There B \"": "",
-            "Hello ' There D '": "",
-            "List of Places": "",
-            "New Document": "",
-            "Open": "",
-            "Open Document": "",
-            "Places": "",
-            "Please enter the name of the directory you'd like to create.": "",
-            "Save Document": "",
-            "This will erase any unsaved content.  If you're certain, please click OK to continue.": "",
-            "Web URL": "",
-            "Confirm": "<<PSLocal>>",
-            "Copy": "<<ContextMenu>>",
-            "Delete": "<<Abbreviation>>",
-            "Directory Up": "<<ExtendedFileManager>>",
-            "File List": "<<ExtendedFileManager>>",
-            "File Manager": "<<ExtendedFileManager>>",
-            "Filename": "<<ExtendedFileManager>>",
-            "Insert": "<<InsertNote>>",
-            "New Folder": "<<ExtendedFileManager>>",
-            "Save": "<<SaveSubmit>>",
-            "You must select some text before making a new link.": "<<Linker>>"
-        },
-        "SpellChecker": {
-            "__ TRANSLATOR NOTE __": "*** SPELLCHECKER IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***",
-            "Dictionary": "",
-            "Finished list of mispelled words": "",
-            "HTMLArea Spell Checker": "",
-            "I will open it in a new page.": "",
-            "Ignore": "",
-            "Ignore all": "",
-            "Info": "",
-            "Learn": "",
-            "No mispelled words found with the selected dictionary.": "",
-            "Original word": "",
-            "Please confirm that you want to open this link": "",
-            "Please wait.  Calling spell checker.": "",
-            "Please wait: changing dictionary to": "",
-            "pliz weit ;-)": "",
-            "Re-check": "",
-            "Replace": "",
-            "Replace all": "",
-            "Revert": "",
-            "Spell Checker": "",
-            "Spell-check": "",
-            "Suggestions": "",
-            "This will drop changes and quit spell checker.  Please confirm.": "",
-            "Replace with": "<<FindReplace>>"
-        },
-        "Template": {
-            "__ TRANSLATOR NOTE __": "*** TEMPLATE IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***",
-            "Insert template": ""
-        },
-        "UnFormat": {
-            "__ TRANSLATOR NOTE __": "*** UNFORMAT IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***",
-            "All": "",
-            "All HTML:": "",
-            "Cleaning Area": "",
-            "Cleaning options": "",
-            "Formatting:": "",
-            "Page Cleaner": "",
-            "Select which types of formatting you would like to remove.": "",
-            "Selection": ""
-        }
-    }
-}
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/lang/merged/si.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/lang/merged/si.js
deleted file mode 100644
index 76feb0a..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/lang/merged/si.js
+++ /dev/null
@@ -1,1573 +0,0 @@
-// Xinha Language Combined Translation File
-//
-// LANG: "si", ENCODING: UTF-8
-//
-// INSTRUCTIONS TO TRANSLATORS
-// ===========================================================================
-//
-// Your translation must be in UTF-8 Character Encoding.
-//
-// This is a JSON encoded file (plus comments), strings should be double-quote
-// only, do not use single quotes to surround strings - "hello", not 'hello'
-// do not have a trailing comma after the last entry in a section.
-//
-// Only full line comments are allowed (that a comments occupy entire lines).
-//
-// Search for the __NEW_TRANSLATIONS__ section below, this is where you will
-// want to focus, this section includes things that do not presently have a 
-// translation or for which the translation needs to be checked for accuracy.
-//
-// In the New Translations section a translation string is one of the following
-//
-//  "English String Here" : ""
-//     This means it is not translated yet, add your translation...
-//     "English String Here" : "Klingon String Here"
-//
-//  "English String Here" : "Translated String Here"
-//     This means that an existing translation for this string, in some other
-//     section has been found, and used.  Check that it is approprite for this
-//     section and if it is, that's fine leave it as is, otherwise change as
-//     appropriate.
-//
-//  "English String Here" : "<<AnotherSection>>"
-//     This means use the same translation for this string as <<AnotherSection>>
-//     this saves you re-tranlating strings.  If the Context of this section
-//     and the context of AnotherSection seem the same, that's fine leave it
-//     using that translation, but if this section needs a different translation, 
-//     you can provide it by replacing the link (<<AnotherSection>>) with that
-//     new translation.  For example - a "Table" in say "DataPlugin" is 
-//     perhaps translated differently to "Table" in "FurniturePlugin".
-//
-// TESTING YOUR TRANSLATION
-// ===========================================================================
-// Simply place your translation file on your webserver somewhere for example
-//
-//   /xinha/lang/merged/si.js
-//
-// and then tell Xinha where to get it (before loading XinhaCore.js) by 
-//
-//  _editor_lang              = 'si';
-//  _editor_lang_merged_file  = '/xinha/lang/merged/si.js';
-//
-// Xinha will load your new language definition.
-//
-// SUBMITTING YOUR TRANSLATION
-// ===========================================================================
-// Simply create a Ticket on the Xinha website and attach your translation 
-// file.
-//
-// The Xinha developers will take your file and use the 
-//     contrib/lc_split_merged_file.php
-// script to load it into the Xinha distribution.
-
-{
-    "Abbreviation": {
-        "Cancel": "Prekliči",
-        "OK": "V redu"
-    },
-    "AboutBox": {
-        "About this editor": "Vizitka za urejevalnik"
-    },
-    "BackgroundImage": {
-        "Cancel": "Prekliči"
-    },
-    "ColorPicker": {
-        "OK": "V redu"
-    },
-    "ContextMenu": {
-        "Justify Center": "Na sredino",
-        "Justify Full": "Porazdeli vsebino",
-        "Justify Left": "Poravnaj levo",
-        "Justify Right": "Poravnaj desno"
-    },
-    "CreateLink": {
-        "Cancel": "Prekliči",
-        "OK": "V redu"
-    },
-    "EditTag": {
-        "Cancel": "Prekliči",
-        "OK": "V redu"
-    },
-    "Equation": {
-        "Cancel": "Prekliči",
-        "OK": "V redu"
-    },
-    "ExtendedFileManager": {
-        "Cancel": "Prekliči",
-        "OK": "V redu"
-    },
-    "Forms": {
-        "Cancel": "Prekliči",
-        "OK": "V redu"
-    },
-    "FullPage": {
-        "Cancel": "Prekliči",
-        "OK": "V redu"
-    },
-    "HorizontalRule": {
-        "Cancel": "Prekliči",
-        "Horizontal Rule": "Vodoravna črta",
-        "OK": "V redu"
-    },
-    "ImageManager": {
-        "Cancel": "Prekliči",
-        "OK": "V redu"
-    },
-    "InsertAnchor": {
-        "Cancel": "Prekliči",
-        "OK": "V redu"
-    },
-    "InsertImage": {
-        "Cancel": "Prekliči",
-        "OK": "V redu"
-    },
-    "InsertMarquee": {
-        "Cancel": "Prekliči",
-        "OK": "V redu"
-    },
-    "InsertNote": {
-        "Cancel": "Prekliči"
-    },
-    "InsertPicture": {
-        "Cancel": "Prekliči",
-        "OK": "V redu"
-    },
-    "InsertSnippet": {
-        "Cancel": "Prekliči"
-    },
-    "InsertSnippet2": {
-        "Cancel": "Prekliči"
-    },
-    "InsertTable": {
-        "Cancel": "Prekliči",
-        "Insert Table": "Vstavi tabelo",
-        "OK": "V redu"
-    },
-    "Linker": {
-        "Cancel": "Prekliči",
-        "OK": "V redu"
-    },
-    "NoteServer": {
-        "Cancel": "Prekliči",
-        "OK": "V redu"
-    },
-    "PSLocal": {
-        "Cancel": "Prekliči"
-    },
-    "PasteText": {
-        "Cancel": "Prekliči",
-        "OK": "V redu"
-    },
-    "PersistentStorage": {
-        "Cancel": "Prekliči"
-    },
-    "QuickTag": {
-        "Cancel": "Prekliči"
-    },
-    "SetId": {
-        "Cancel": "Prekliči",
-        "OK": "V redu"
-    },
-    "SmartReplace": {
-        "OK": "V redu"
-    },
-    "SpellChecker": {
-        "Cancel": "Prekliči",
-        "OK": "V redu"
-    },
-    "SuperClean": {
-        "Cancel": "Prekliči",
-        "OK": "V redu"
-    },
-    "TableOperations": {
-        "Cancel": "Prekliči",
-        "OK": "V redu"
-    },
-    "Template": {
-        "Cancel": "Prekliči"
-    },
-    "UnFormat": {
-        "Cancel": "Prekliči",
-        "OK": "V redu"
-    },
-    "Xinha": {
-        "About this editor": "Vizitka za urejevalnik",
-        "Background Color": "Barva ozadja",
-        "Bold": "Krepko",
-        "Bulleted List": "Označevanje",
-        "Copy selection": "Kopiraj",
-        "Current style": "Trenutni slog",
-        "Cut selection": "Izreži",
-        "Decrease Indent": "Zmanjšaj zamik",
-        "Font Color": "Barva pisave",
-        "Help using editor": "Pomoč za urejevalnik",
-        "Horizontal Rule": "Vodoravna črta",
-        "Increase Indent": "Povečaj zamik",
-        "Insert Table": "Vstavi tabelo",
-        "Insert Web Link": "Vstavi hiperpovezavo",
-        "Insert/Modify Image": "Vstavi sliko",
-        "Italic": "Ležeče",
-        "Justify Center": "Na sredino",
-        "Justify Full": "Porazdeli vsebino",
-        "Justify Left": "Poravnaj levo",
-        "Justify Right": "Poravnaj desno",
-        "Ordered List": "Oštevilčevanje",
-        "Paste from clipboard": "Prilepi",
-        "Path": "Pot",
-        "Redoes your last action": "Uveljavi zadnjo akcijo",
-        "Strikethrough": "Prečrtano",
-        "Subscript": "Podpisano",
-        "Superscript": "Nadpisano",
-        "Toggle HTML Source": "Preklopi na HTML kodo",
-        "Underline": "Podčrtano",
-        "Undoes your last action": "Razveljavi zadnjo akcijo",
-        "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."
-    },
-    "__NEW_TRANSLATIONS__": {
-        "Abbreviation": {
-            "Abbreviation": "",
-            "Delete": "",
-            "Expansion:": ""
-        },
-        "AboutBox": {
-            "Close": "<<Xinha>>"
-        },
-        "CharCounter": {
-            "... in progress": "",
-            "Chars": "",
-            "HTML": "",
-            "Words": ""
-        },
-        "CharacterMap": {
-            "Insert special character": ""
-        },
-        "ColorPicker": {
-            "Click a color...": "",
-            "Color: ": "",
-            "Sample": "",
-            "Web Safe: ": "",
-            "Close": "<<Xinha>>"
-        },
-        "ContextMenu": {
-            "_Delete Row": "",
-            "_Image Properties...": "",
-            "_Modify Link...": "",
-            "_Remove Link...": "",
-            "_Table Properties...": "",
-            "C_ell Properties...": "",
-            "Chec_k Link...": "",
-            "Copy": "",
-            "Create a link": "",
-            "Current URL is": "",
-            "Cut": "",
-            "De_lete Column": "",
-            "Delete Cell": "",
-            "Delete the current column": "",
-            "Delete the current row": "",
-            "How did you get here? (Please report!)": "",
-            "I_nsert Row Before": "",
-            "In_sert Row After": "",
-            "Insert _Column Before": "",
-            "Insert a new column after the current one": "",
-            "Insert a new column before the current one": "",
-            "Insert a new row after the current one": "",
-            "Insert a new row before the current one": "",
-            "Insert a paragraph after the current node": "",
-            "Insert a paragraph before the current node": "",
-            "Insert C_olumn After": "",
-            "Insert Cell After": "",
-            "Insert Cell Before": "",
-            "Insert paragraph after": "",
-            "Insert paragraph before": "",
-            "Link points to:": "",
-            "Make lin_k...": "",
-            "Merge Cells": "",
-            "Opens this link in a new window": "",
-            "Paste": "",
-            "Please confirm that you want to remove this element:": "",
-            "Please confirm that you want to unlink this element.": "",
-            "Remove the $elem Element...": "",
-            "Remove this node from the document": "",
-            "Ro_w Properties...": "",
-            "Show the image properties dialog": "",
-            "Show the Table Cell Properties dialog": "",
-            "Show the Table Properties dialog": "",
-            "Show the Table Row Properties dialog": "",
-            "Unlink the current element": ""
-        },
-        "CreateLink": {
-            "Are you sure you wish to remove this link?": "",
-            "Insert/Modify Link": "",
-            "New window (_blank)": "",
-            "None (use implicit)": "",
-            "Other": "",
-            "Same frame (_self)": "",
-            "Target:": "",
-            "Title (tooltip):": "",
-            "Top frame (_top)": "",
-            "URL:": "",
-            "You need to select some text before creating a link": ""
-        },
-        "DefinitionList": {
-            "definition description": "",
-            "definition list": "",
-            "definition term": ""
-        },
-        "Dialogs": {
-            "Some Text Here": ""
-        },
-        "DynamicCSS": {
-            "Choose stylesheet": "",
-            "Default": "",
-            "Undefined": ""
-        },
-        "EditTag": {
-            "Edit HTML for selected text": "",
-            "Edit Tag By Peg": "",
-            "Tag Editor": ""
-        },
-        "Equation": {
-            "!=": "",
-            "!in": "",
-            "&gt;-": "",
-            "&gt;=": "",
-            "&lt;=": "",
-            "&lt;=&gt;": "",
-            "&lt;x&gt;": "",
-            "&nbsp; `!` &nbsp;": "",
-            "&nbsp; `.` &nbsp;": "",
-            "&nbsp; `0` &nbsp;": "",
-            "&nbsp; `2` &nbsp;": "",
-            "&nbsp; `3` &nbsp;": "",
-            "&nbsp; `4` &nbsp;": "",
-            "&nbsp; `5` &nbsp;": "",
-            "&nbsp; `6` &nbsp;": "",
-            "&nbsp; `7` &nbsp;": "",
-            "&nbsp; `8` &nbsp;": "",
-            "&nbsp; `9` &nbsp;": "",
-            "&nbsp; `e` &nbsp;": "",
-            "&nbsp;&nbsp;`1` &nbsp;": "",
-            "&nbsp;`+{::}`&nbsp;": "",
-            "&nbsp;`-:\\ `": "",
-            "&nbsp;`-{::}`&nbsp;": "",
-            "&nbsp;`C`&nbsp;": "",
-            "&nbsp;`cos`": "",
-            "&nbsp;`ln`&nbsp;": "",
-            "&nbsp;`pi` &nbsp;": "",
-            "&nbsp;`sin`": "",
-            "&nbsp;`tan`": "",
-            "&nbsp;`times`&nbsp;": "",
-            "&quot;text&quot;": "",
-            "'+formula+'": "",
-            "((n),(k))": "",
-            "(x+1)/(x-1)": "",
-            "*": "",
-            "**": "",
-            "+-": "",
-            "-&gt;": "",
-            "-&lt;": "",
-            "-:": "",
-            "-=": "",
-            "//": "",
-            "/_": "",
-            ":.": "",
-            "=&gt;": "",
-            "@": "",
-            "[[a,b],[c,d]]": "",
-            "\\\\": "",
-            "\\nClick in the box to use your keyboard or use the buttons\\n": "",
-            "^^": "",
-            "^^^": "",
-            "__|": "",
-            "_|_": "",
-            "`!=`": "",
-            "`!in`": "",
-            "`&and;`": "",
-            "`&cap;`": "",
-            "`&cup;`": "",
-            "`&gt;-`": "",
-            "`&gt;=`": "",
-            "`&lt;=&gt;`": "",
-            "`&lt;=`": "",
-            "`&lt;x&gt;`": "",
-            "`&or;`": "",
-            "`&quot;text&quot;`": "",
-            "`((n),(k))`": "",
-            "`(x+1)/(x-1)`": "",
-            "`**`": "",
-            "`*`": "",
-            "`+-`": "",
-            "`-&gt;`": "",
-            "`-&lt;`": "",
-            "`-:`": "",
-            "`-=`": "",
-            "`//`": "",
-            "`/_`": "",
-            "`:.`": "",
-            "`=&gt;`": "",
-            "`@`": "",
-            "`[[a,b],[c,d]]`": "",
-            "`\\\\`": "",
-            "`__|`": "",
-            "`_|_`": "",
-            "`AA`": "",
-            "`aleph`": "",
-            "`alpha`": "",
-            "`and`": "",
-            "`bara`": "",
-            "`bba`": "",
-            "`bbba`": "",
-            "`beta`": "",
-            "`CC`": "",
-            "`cca`": "",
-            "`chi`": "",
-            "`darr`": "",
-            "`ddota`": "",
-            "`del`": "",
-            "`Delta`": "",
-            "`delta`": "",
-            "`diamond`": "",
-            "`dota`": "",
-            "`dy/dx`": "",
-            "`EE`": "",
-            "`epsi`": "",
-            "`eta`": "",
-            "`fra`": "",
-            "`Gamma`": "",
-            "`gamma`": "",
-            "`grad`": "",
-            "`harr`": "",
-            "`hArr`": "",
-            "`hata`": "",
-            "`if`": "",
-            "`in`": "",
-            "`int`": "",
-            "`iota`": "",
-            "`kappa`": "",
-            "`Lambda`": "",
-            "`lambda`": "",
-            "`lArr`": "",
-            "`larr`": "",
-            "`lim_(x-&gt;oo)`": "",
-            "`log`": "",
-            "`mu`": "",
-            "`NN`": "",
-            "`nn`": "",
-            "`not`": "",
-            "`nu`": "",
-            "`o+`": "",
-            "`o.`": "",
-            "`O/`": "",
-            "`oint`": "",
-            "`omega`": "",
-            "`Omega`": "",
-            "`oo`": "",
-            "`or`": "",
-            "`ox`": "",
-            "`phi`": "",
-            "`Phi`": "",
-            "`Pi`": "",
-            "`pi`": "",
-            "`prod`": "",
-            "`prop`": "",
-            "`Psi`": "",
-            "`psi`": "",
-            "`QQ`": "",
-            "`quad`": "",
-            "`rArr`": "",
-            "`rho`": "",
-            "`root(n)(x)`": "",
-            "`RR`": "",
-            "`sfa`": "",
-            "`Sigma`": "",
-            "`sigma`": "",
-            "`sqrt(x)`": "",
-            "`square`": "",
-            "`stackrel(-&gt;)(+)`": "",
-            "`sub`": "",
-            "`sube`": "",
-            "`sum`": "",
-            "`sup`": "",
-            "`supe`": "",
-            "`tau`": "",
-            "`Theta`": "",
-            "`theta`": "",
-            "`TT`": "",
-            "`tta`": "",
-            "`uarr`": "",
-            "`ula`": "",
-            "`upsilon`": "",
-            "`uu`": "",
-            "`veca`": "",
-            "`vv`": "",
-            "`x_(mn)`": "",
-            "`Xi`": "",
-            "`xi`": "",
-            "`xx`": "",
-            "`zeta`": "",
-            "`ZZ`": "",
-            "`|-&gt;`": "",
-            "`|--`": "",
-            "`|==`": "",
-            "`|__`": "",
-            "`|~`": "",
-            "`~=`": "",
-            "`~|`": "",
-            "`~~`": "",
-            "AA": "",
-            "aleph": "",
-            "alpha": "",
-            "and": "",
-            "AsciiMath Formula Input": "",
-            "AsciiMathML Example": "",
-            "bara": "",
-            "Based on ASCIIMathML by": "",
-            "bba": "",
-            "bbba": "",
-            "beta": "",
-            "CC": "",
-            "cca": "",
-            "chi": "",
-            "darr": "",
-            "ddota": "",
-            "del": "",
-            "delta": "",
-            "Delta": "",
-            "diamond": "",
-            "dota": "",
-            "dy/dx": "",
-            "EE": "",
-            "epsi": "",
-            "eta": "",
-            "For more information on AsciiMathML visit this page:": "",
-            "Formula Editor": "",
-            "fra": "",
-            "gamma": "",
-            "Gamma": "",
-            "grad": "",
-            "hArr": "",
-            "harr": "",
-            "hata": "",
-            "if": "",
-            "in": "",
-            "Input": "",
-            "int": "",
-            "int_a^bf(x)dx": "",
-            "iota": "",
-            "kappa": "",
-            "Lambda": "",
-            "lambda": "",
-            "larr": "",
-            "lArr": "",
-            "lim_(x-&gt;oo)": "",
-            "mu": "",
-            "NN": "",
-            "nn": "",
-            "nnn": "",
-            "not": "",
-            "nu": "",
-            "o+": "",
-            "o.": "",
-            "O/": "",
-            "oint": "",
-            "Omega": "",
-            "omega": "",
-            "oo": "",
-            "or": "",
-            "ox": "",
-            "phi": "",
-            "Phi": "",
-            "pi": "",
-            "Pi": "",
-            "Preview": "",
-            "prod": "",
-            "prop": "",
-            "psi": "",
-            "Psi": "",
-            "QQ": "",
-            "quad": "",
-            "rArr": "",
-            "rho": "",
-            "root(n)(x)": "",
-            "RR": "",
-            "sfa": "",
-            "sigma": "",
-            "Sigma": "",
-            "sqrt(x)": "",
-            "square": "",
-            "stackrel(-&gt;)(+)": "",
-            "sub": "",
-            "sube": "",
-            "sum": "",
-            "sum_(n=1)^oo": "",
-            "sup": "",
-            "supe": "",
-            "tau": "",
-            "Theta": "",
-            "theta": "",
-            "TT": "",
-            "tta": "",
-            "uarr": "",
-            "ula": "",
-            "upsilon": "",
-            "uu": "",
-            "uuu": "",
-            "veca": "",
-            "vv": "",
-            "vvv": "",
-            "x^(m+n)": "",
-            "x_(mn)": "",
-            "Xi": "",
-            "xi": "",
-            "xx": "",
-            "zeta": "",
-            "ZZ": "",
-            "|-&gt;": "",
-            "|--": "",
-            "|==": "",
-            "|__": "",
-            "|~": "",
-            "~=": "",
-            "~|": "",
-            "~~": ""
-        },
-        "FancySelects": {
-            "'+opt.text+'": ""
-        },
-        "FindReplace": {
-            "';\r\n  var tagc = '": "",
-            "Case sensitive search": "",
-            "Clear": "",
-            "Done": "",
-            "Enter the text you want to find": "",
-            "Find and Replace": "",
-            "found item": "",
-            "found items": "",
-            "Highlight": "",
-            "Inform a replacement word": "",
-            "Next": "",
-            "not found": "",
-            "Options": "",
-            "Replace with:": "",
-            "replaced item": "",
-            "replaced items": "",
-            "Search for:": "",
-            "Substitute all occurrences": "",
-            "Substitute this occurrence?": "",
-            "Undo": "",
-            "Whole words only": ""
-        },
-        "FormOperations": {
-            "Enter the name for new option.": "",
-            "Form Editor": "",
-            "Insert a check box.": "",
-            "Insert a Form.": "",
-            "Insert a multi-line text field.": "",
-            "Insert a radio button.": "",
-            "Insert a select field.": "",
-            "Insert a submit/reset button.": "",
-            "Insert a text, password or hidden field.": "",
-            "Message Sent": "",
-            "Please Select...": ""
-        },
-        "Forms": {
-            "'onClick'=": "",
-            "Access Key:": "",
-            "Action URL:": "",
-            "Button Script": "",
-            "Checked": "",
-            "Columns:": "",
-            "Default text (optional)": "",
-            "Dimensions": "",
-            "Disabled": "",
-            "Encoding:": "",
-            "For Control:": "",
-            "Form": "",
-            "Form Element: FIELDSET": "",
-            "Form Element: INPUT": "",
-            "Form Element: LABEL": "",
-            "Form Element: SELECT": "",
-            "Form Element: TEXTAREA": "",
-            "Form handler script": "",
-            "Form Name:": "",
-            "Get": "",
-            "Hard": "",
-            "Height in number of rows": "",
-            "HTML-Form to CGI (default)": "",
-            "Image source": "",
-            "Image URL:": "",
-            "Initial Text:": "",
-            "Insert/Edit Form": "",
-            "Insert/Edit Form Element FIELDSET": "",
-            "Insert/Edit Form Element INPUT": "",
-            "Insert/Edit Form Element LABEL": "",
-            "Insert/Edit Form Element SELECT": "",
-            "Insert/Edit Form Element TEXTAREA": "",
-            "Javascript for button click": "",
-            "Label:": "",
-            "Legend:": "",
-            "Max length:": "",
-            "Maximum number of characters accepted": "",
-            "Method:": "",
-            "multipart Form Data (File-Upload)": "",
-            "Name": "",
-            "Name of the form input": "",
-            "Name of the form select": "",
-            "name of the textarea": "",
-            "Name/ID:": "",
-            "normal": "",
-            "nowrap": "",
-            "Off": "",
-            "Physical": "",
-            "Please enter a Label": "",
-            "Post": "",
-            "pre": "",
-            "Read Only": "",
-            "Rows:": "",
-            "Size of text box in characters": "",
-            "Size:": "",
-            "Soft": "",
-            "Tab Index:": "",
-            "Target Frame:": "",
-            "Text:": "",
-            "URL of image": "",
-            "Value of the form input": "",
-            "Value:": "",
-            "Virtual": "",
-            "Width in number of characters": "",
-            "Wrap Mode:": "",
-            "You must enter a Name": "",
-            "Options": "<<FindReplace>>"
-        },
-        "FullPage": {
-            "...": "",
-            "Alternate style-sheet:": "",
-            "Background color:": "",
-            "Character set:": "",
-            "cyrillic (ISO-8859-5)": "",
-            "cyrillic (KOI8-R)": "",
-            "cyrillic (WINDOWS-1251)": "",
-            "Description:": "",
-            "DOCTYPE:": "",
-            "Document properties": "",
-            "Document title:": "",
-            "Keywords:": "",
-            "Primary style-sheet:": "",
-            "Text color:": "",
-            "UTF-8 (recommended)": "",
-            "western (ISO-8859-1)": ""
-        },
-        "FullScreen": {
-            "Maximize/Minimize Editor": ""
-        },
-        "Gecko": {
-            "The Paste button does not work in this browser for security reasons. Press CTRL-V on your keyboard to paste directly.": ""
-        },
-        "HorizontalRule": {
-            "&#x00d7;": "",
-            "&nbsp;": "",
-            "Alignment:": "",
-            "Center": "",
-            "Color:": "",
-            "Height:": "",
-            "Insert/edit horizontal rule": "",
-            "Insert/Edit Horizontal Rule": "",
-            "Layout": "",
-            "Left": "",
-            "No shading": "",
-            "percent": "",
-            "pixels": "",
-            "Right": "",
-            "Style": "",
-            "Width:": ""
-        },
-        "InlineStyler": {
-            "Background": "",
-            "Baseline": "",
-            "Border": "",
-            "Bottom": "",
-            "Char": "",
-            "Collapsed borders": "",
-            "CSS Style": "",
-            "FG Color": "",
-            "Float": "",
-            "Justify": "",
-            "Margin": "",
-            "Middle": "",
-            "None": "",
-            "Padding": "",
-            "Text align": "",
-            "Top": "",
-            "Vertical align": "",
-            "-": "<<Equation>>",
-            "Center": "<<HorizontalRule>>",
-            "Height": "<<HorizontalRule>>",
-            "Image URL": "<<Forms>>",
-            "Layout": "<<HorizontalRule>>",
-            "Left": "<<HorizontalRule>>",
-            "percent": "<<HorizontalRule>>",
-            "pixels": "<<HorizontalRule>>",
-            "Right": "<<HorizontalRule>>",
-            "Width": "<<HorizontalRule>>"
-        },
-        "InsertAnchor": {
-            "Anchor name": "",
-            "Insert Anchor": "",
-            "Delete": "<<Abbreviation>>"
-        },
-        "InsertImage": {
-            "Absbottom": "",
-            "Absmiddle": "",
-            "Alternate text:": "",
-            "Border thickness:": "",
-            "Enter the image URL here": "",
-            "For browsers that don't support images": "",
-            "Horizontal padding": "",
-            "Horizontal:": "",
-            "Image Preview:": "",
-            "Insert Image": "",
-            "Leave empty for no border": "",
-            "Not set": "",
-            "Positioning of this image": "",
-            "Preview the image in a new window": "",
-            "Spacing": "",
-            "Texttop": "",
-            "Vertical padding": "",
-            "Vertical:": "",
-            "You must enter the URL": "",
-            "Alignment:": "<<HorizontalRule>>",
-            "Baseline": "<<InlineStyler>>",
-            "Bottom": "<<InlineStyler>>",
-            "Image URL:": "<<Forms>>",
-            "Layout": "<<HorizontalRule>>",
-            "Left": "<<HorizontalRule>>",
-            "Middle": "<<InlineStyler>>",
-            "Preview": "<<Equation>>",
-            "Right": "<<HorizontalRule>>",
-            "Top": "<<InlineStyler>>"
-        },
-        "InsertNote": {
-            "Insert": "",
-            "Insert footnote": "",
-            "Insert Note": ""
-        },
-        "InsertPagebreak": {
-            "Page break": "",
-            "Page Break": ""
-        },
-        "InsertSmiley": {
-            "Insert Smiley": ""
-        },
-        "InsertSnippet": {
-            "\\n  This is an information about something\\n": "",
-            "Hide preview": "",
-            "Insert as": "",
-            "Insert Snippet": "",
-            "InsertSnippet for Xinha": "",
-            "Link1": "",
-            "Link2": "",
-            "Link3": "",
-            "Link4": "",
-            "Link5": "",
-            "Show preview": "",
-            "This is an information about something": "",
-            "Variable": ""
-        },
-        "InsertSnippet2": {
-            "All Categories": "",
-            "Filter": "",
-            "Insert as HTML": "",
-            "Insert as template variable": "",
-            "Only search word beginning": "",
-            "HTML": "<<CharCounter>>",
-            "Insert Snippet": "<<InsertSnippet>>",
-            "InsertSnippet for Xinha": "<<InsertSnippet>>",
-            "Variable": "<<InsertSnippet>>"
-        },
-        "InsertTable": {
-            "Caption": "",
-            "Caption for the table": "",
-            "Cell padding:": "",
-            "Cell spacing:": "",
-            "Collapse borders:": "",
-            "Cols:": "",
-            "Em": "",
-            "Fixed width columns": "",
-            "Layou": "",
-            "Number of columns": "",
-            "Number of rows": "",
-            "Positioning of this table": "",
-            "Space between adjacent cells": "",
-            "Space between content and border in cell": "",
-            "Style of the border": "",
-            "Width of the table": "",
-            "Width unit": "",
-            "You must enter a number of columns": "",
-            "You must enter a number of rows": "",
-            "Absbottom": "<<InsertImage>>",
-            "Absmiddle": "<<InsertImage>>",
-            "Alignment:": "<<HorizontalRule>>",
-            "Baseline": "<<InlineStyler>>",
-            "Border": "<<InlineStyler>>",
-            "Border thickness:": "<<InsertImage>>",
-            "Bottom": "<<InlineStyler>>",
-            "Layout": "<<HorizontalRule>>",
-            "Leave empty for no border": "<<InsertImage>>",
-            "Left": "<<HorizontalRule>>",
-            "Middle": "<<InlineStyler>>",
-            "Not set": "<<InsertImage>>",
-            "Percent": "<<HorizontalRule>>",
-            "Pixels": "<<HorizontalRule>>",
-            "Right": "<<HorizontalRule>>",
-            "Rows:": "<<Forms>>",
-            "Spacing": "<<InsertImage>>",
-            "Texttop": "<<InsertImage>>",
-            "Top": "<<InlineStyler>>",
-            "Width:": "<<HorizontalRule>>"
-        },
-        "LangMarks": {
-            "&mdash; language &mdash;": "",
-            "', '": "",
-            "English": "",
-            "French": "",
-            "Greek": "",
-            "language select": "",
-            "Latin": ""
-        },
-        "Linker": {
-            "(px)": "",
-            "Anchor-Link": "",
-            "Anchor:": "",
-            "Email Address:": "",
-            "Email Link": "",
-            "Location Bar:": "",
-            "Menu Bar:": "",
-            "Message Template:": "",
-            "New Window": "",
-            "Ordinary Link": "",
-            "Popup Window": "",
-            "PopupWindow": "",
-            "Remove Link": "",
-            "Resizeable:": "",
-            "Same Window (jump out of frames)": "",
-            "Scrollbars:": "",
-            "Shows On Hover": "",
-            "Status Bar:": "",
-            "Subject:": "",
-            "Title:": "",
-            "Toolbar:": "",
-            "URL Link": "",
-            "You must select some text before making a new link.": "",
-            "Are you sure you wish to remove this link?": "<<CreateLink>>",
-            "Insert/Modify Link": "<<CreateLink>>",
-            "Name:": "<<Forms>>",
-            "Size:": "<<Forms>>",
-            "Target:": "<<CreateLink>>",
-            "URL:": "<<CreateLink>>"
-        },
-        "ListType": {
-            "Choose list style type (for ordered lists)": "",
-            "Decimal numbers": "",
-            "Lower greek letters": "",
-            "Lower latin letters": "",
-            "Lower roman numbers": "",
-            "Upper latin letters": "",
-            "Upper roman numbers": ""
-        },
-        "MootoolsFileManager": {
-            "Insert File Link": "",
-            "You must select some text before making a new link.": "<<Linker>>"
-        },
-        "Opera": {
-            "MARK": "",
-            "The Paste button does not work in Mozilla based web browsers (technical security reasons). Press CTRL-V on your keyboard to paste directly.": ""
-        },
-        "PasteText": {
-            "Insert text in new paragraph": "",
-            "Paste as Plain Text": ""
-        },
-        "PreserveScripts": {
-            "JavaScript": "",
-            "PHP": ""
-        },
-        "QuickTag": {
-            "',\r\n                           'cl': '": "",
-            "ATTRIBUTES": "",
-            "Colors": "",
-            "Enter the TAG you want to insert": "",
-            "No CSS class avaiable": "",
-            "Ok": "",
-            "OPTIONS": "",
-            "Quick Tag Editor": "",
-            "TAGs": "",
-            "There are some unclosed quote": "",
-            "This attribute already exists in the TAG": "",
-            "You have to select some text": ""
-        },
-        "SaveSubmit": {
-            "in progress": "",
-            "Ready": "",
-            "Save": "",
-            "Saving...": ""
-        },
-        "SetId": {
-            "ID/Name:": "",
-            "Set Id and Name": "",
-            "Set Id/Name": "",
-            "Set ID/Name": "",
-            "Delete": "<<Abbreviation>>"
-        },
-        "SmartReplace": {
-            "ClosingDoubleQuotes": "",
-            "ClosingSingleQuote": "",
-            "Convert all quotes and dashes in the current document": "",
-            "Enable automatic replacements": "",
-            "OpeningDoubleQuotes": "",
-            "OpeningSingleQuote": "",
-            "SmartReplace": "",
-            "SmartReplace Settings": ""
-        },
-        "Stylist": {
-            "Styles": ""
-        },
-        "SuperClean": {
-            "Clean bad HTML from Microsoft Word.": "",
-            "Clean Selection Only": "",
-            "Clean up HTML": "",
-            "Cleaning Scope": "",
-            "General tidy up and correction of some problems.": "",
-            "Please select from the following cleaning options...": "",
-            "Please stand by while cleaning in process...": "",
-            "Remove alignment (left/right/justify).": "",
-            "Remove all classes (CSS).": "",
-            "Remove All HTML Tags": "",
-            "Remove all styles (CSS).": "",
-            "Remove custom font sizes.": "",
-            "Remove custom text colors.": "",
-            "Remove custom typefaces (font \"styles\").": "",
-            "Remove emphasis and annotations.": "",
-            "Remove lang attributes.": "",
-            "Remove Paragraphs": "",
-            "Remove superscripts and subscripts.": "",
-            "Replace directional quote marks with non-directional quote marks.": "",
-            "Vigorously purge HTML from Microsoft Word.": ""
-        },
-        "TableOperations": {
-            "All four sides": "",
-            "Borders": "",
-            "Cell properties": "",
-            "Cell Properties": "",
-            "Cell Type:": "",
-            "Cells down": "",
-            "Cells to the right, and": "",
-            "Delete cell": "",
-            "Delete column": "",
-            "Delete row": "",
-            "Do Not Change": "",
-            "Frame and borders": "",
-            "Frames": "",
-            "Header (th)": "",
-            "Insert cell after": "",
-            "Insert cell before": "",
-            "Insert column after": "",
-            "Insert column before": "",
-            "Insert row after": "",
-            "Insert row before": "",
-            "Merge cells": "",
-            "Merge current cell with:": "",
-            "No rules": "",
-            "No sides": "",
-            "Normal (td)": "",
-            "Please click into some cell": "",
-            "Row properties": "",
-            "Row Properties": "",
-            "Rules will appear between all rows and columns": "",
-            "Rules will appear between columns only": "",
-            "Rules will appear between rows only": "",
-            "Spacing and padding": "",
-            "Split column": "",
-            "Split row": "",
-            "Summary": "",
-            "Table properties": "",
-            "Table Properties": "",
-            "The bottom side only": "",
-            "The left-hand side only": "",
-            "The right and left sides only": "",
-            "The right-hand side only": "",
-            "The top and bottom sides only": "",
-            "The top side only": "",
-            "Xinha cowardly refuses to delete the last cell in row.": "",
-            "Xinha cowardly refuses to delete the last column in table.": "",
-            "Xinha cowardly refuses to delete the last row in table.": "",
-            "Caption": "<<InsertTable>>",
-            "Columns": "<<Forms>>",
-            "Description": "<<FullPage>>",
-            "Merge Cells": "<<ContextMenu>>",
-            "Padding": "<<InlineStyler>>",
-            "pixels": "<<HorizontalRule>>",
-            "Rows": "<<Forms>>",
-            "Spacing": "<<InsertImage>>"
-        },
-        "UnsavedChanges": {
-            "You have unsaved changes in the editor": ""
-        },
-        "WebKit": {
-            "The Paste button does not work in this browser for security reasons. Press CTRL-V on your keyboard to paste directly.": "<<Gecko>>"
-        },
-        "Xinha": {
-            "&#8212; font &#8212;": "",
-            "&#8212; format &#8212;": "",
-            "&#8212; size &#8212;": "",
-            "1 (8 pt)": "",
-            "2 (10 pt)": "",
-            "3 (12 pt)": "",
-            "4 (14 pt)": "",
-            "5 (18 pt)": "",
-            "6 (24 pt)": "",
-            "7 (36 pt)": "",
-            "Address": "",
-            "Arial": "",
-            "Clean content pasted from Word": "",
-            "Clear Inline Font Specifications": "",
-            "Clear MSOffice tags": "",
-            "Close": "",
-            "Constructing object": "",
-            "Courier New": "",
-            "Create Statusbar": "",
-            "Create Toolbar": "",
-            "CTRL-0 (zero)": "",
-            "CTRL-1 .. CTRL-6": "",
-            "CTRL-A": "",
-            "CTRL-B": "",
-            "CTRL-C": "",
-            "CTRL-E": "",
-            "CTRL-I": "",
-            "CTRL-J": "",
-            "CTRL-L": "",
-            "CTRL-N": "",
-            "CTRL-R": "",
-            "CTRL-S": "",
-            "CTRL-U": "",
-            "CTRL-V": "",
-            "CTRL-X": "",
-            "CTRL-Y": "",
-            "CTRL-Z": "",
-            "Direction left to right": "",
-            "Direction right to left": "",
-            "Editor Help": "",
-            "ENTER": "",
-            "Error Loading Xinha.  Developers, check the Error Console for information.": "",
-            "Finishing": "",
-            "Formatted": "",
-            "Generate Xinha framework": "",
-            "Georgia": "",
-            "Heading 1": "",
-            "Heading 2": "",
-            "Heading 3": "",
-            "Heading 4": "",
-            "Heading 5": "",
-            "Heading 6": "",
-            "Headings": "",
-            "Impact": "",
-            "Init editor size": "",
-            "insert linebreak": "",
-            "Insert/Overwrite": "",
-            "Keyboard shortcuts": "",
-            "Loading Core": "",
-            "Loading in progress. Please wait!": "",
-            "Loading plugin $plugin": "",
-            "Loading plugins": "",
-            "MS Word Cleaner": "",
-            "new paragraph": "",
-            "Normal": "",
-            "Print document": "",
-            "Register plugin $plugin": "",
-            "Remove formatting": "",
-            "Save as": "",
-            "Select all": "",
-            "Select Color": "",
-            "Set format to paragraph": "",
-            "SHIFT-ENTER": "",
-            "Split Block": "",
-            "Tahoma": "",
-            "The editor provides the following key combinations:": "",
-            "Times New Roman": "",
-            "Toggle Borders": "",
-            "Touch here first to activate editor.": "",
-            "Verdana": "",
-            "Waiting for Iframe to load...": "",
-            "WingDings": "",
-            "Would you like to clear font colours?": "",
-            "Would you like to clear font sizes?": "",
-            "Would you like to clear font typefaces?": "",
-            "Xinha": ""
-        },
-        "BackgroundImage": {
-            "__ TRANSLATOR NOTE __": "*** BACKGROUNDIMAGE IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***",
-            "Remove Current Background": "",
-            "Set Background": "",
-            "Set page background image": "",
-            "Set Page Background Image": ""
-        },
-        "ClientsideSpellcheck": {
-            "__ TRANSLATOR NOTE __": "*** CLIENTSIDESPELLCHECK IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***",
-            "Spell Check using ieSpell": ""
-        },
-        "ExtendedFileManager": {
-            "__ TRANSLATOR NOTE __": "*** EXTENDEDFILEMANAGER IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***",
-            "10%": "",
-            "100%": "",
-            "200%": "",
-            "25%": "",
-            "50%": "",
-            "75%": "",
-            ">List View": "",
-            ">Thumbnail View": "",
-            "A:": "",
-            "Align": "",
-            "Alt": "",
-            "Border Color": "",
-            "Constrain Proportions": "",
-            "Crop": "",
-            "D:": "",
-            "Directory": "",
-            "Directory Up": "",
-            "Edit": "",
-            "File List": "",
-            "File Manager": "",
-            "Filename:": "",
-            "Filesize:": "",
-            "Flip Horizontal": "",
-            "Flip Image": "",
-            "Flip Vertical": "",
-            "Folder": "",
-            "GIF": "",
-            "GIF format is not supported, image editing not supported.": "",
-            "H:": "",
-            "Image Editor": "",
-            "Image Selection": "",
-            "Invalid base directory:": "",
-            "JPEG High": "",
-            "JPEG Low": "",
-            "JPEG Medium": "",
-            "Loading": "",
-            "Lock": "",
-            "Marker": "",
-            "Maximum folder size limit reached. Upload disabled.": "",
-            "Measure": "",
-            "New Folder": "",
-            "No Files Found": "",
-            "No Image Available": "",
-            "Please enter value": "",
-            "PNG": "",
-            "Preset": "",
-            "Quality:": "",
-            "Refresh": "",
-            "Rename": "",
-            "Resize": "",
-            "Rotate": "",
-            "Rotate 180 &deg;": "",
-            "Rotate 90 &deg; CCW": "",
-            "Rotate 90 &deg; CW": "",
-            "Rotate Image": "",
-            "Start X:": "",
-            "Start Y:": "",
-            "Target Window": "",
-            "Toggle marker color": "",
-            "Trash": "",
-            "Upload": "",
-            "W:": "",
-            "X:": "",
-            "Xinha Image Editor": "",
-            "Y:": "",
-            "Zoom": "",
-            "Absbottom": "<<InsertImage>>",
-            "Absmiddle": "<<InsertImage>>",
-            "Baseline": "<<InlineStyler>>",
-            "Border": "<<InlineStyler>>",
-            "Bottom": "<<InlineStyler>>",
-            "Clear": "<<FindReplace>>",
-            "Color": "<<HorizontalRule>>",
-            "Copy": "<<ContextMenu>>",
-            "Cut": "<<ContextMenu>>",
-            "Height": "<<HorizontalRule>>",
-            "Height:": "<<HorizontalRule>>",
-            "Insert File Link": "<<MootoolsFileManager>>",
-            "Left": "<<HorizontalRule>>",
-            "Margin": "<<InlineStyler>>",
-            "Middle": "<<InlineStyler>>",
-            "New window (_blank)": "<<CreateLink>>",
-            "None (use implicit)": "<<CreateLink>>",
-            "Not set": "<<InsertImage>>",
-            "Padding": "<<InlineStyler>>",
-            "Positioning of this image": "<<InsertImage>>",
-            "Preview": "<<Equation>>",
-            "Right": "<<HorizontalRule>>",
-            "Same frame (_self)": "<<CreateLink>>",
-            "Save": "<<SaveSubmit>>",
-            "Texttop": "<<InsertImage>>",
-            "Title (tooltip)": "<<CreateLink>>",
-            "Top": "<<InlineStyler>>",
-            "Top frame (_top)": "<<CreateLink>>",
-            "Width": "<<HorizontalRule>>",
-            "Width:": "<<HorizontalRule>>",
-            "You must select some text before making a new link.": "<<Linker>>"
-        },
-        "Filter": {
-            "__ TRANSLATOR NOTE __": "*** FILTER IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***",
-            "Filter": "<<InsertSnippet2>>"
-        },
-        "HtmlTidy": {
-            "__ TRANSLATOR NOTE __": "*** HTMLTIDY IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***",
-            "Auto-Tidy": "",
-            "Don't Tidy": "",
-            "HTML Tidy": "",
-            "Tidy failed.  Check your HTML for syntax errors.": ""
-        },
-        "ImageManager": {
-            "__ TRANSLATOR NOTE __": "*** IMAGEMANAGER IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***",
-            "Angle:": "",
-            "Flickr Picture List": "",
-            "Flickr Pictures": "",
-            "Flickr Selection": "",
-            "Flickr Username/Email": "",
-            "Folder Name:": "",
-            "Image Format": "",
-            "Image List": "",
-            "Keyword": "",
-            "No Images Found": "",
-            "No Photos Found": "",
-            "No Videos Found": "",
-            "This Server": "",
-            "YouTube Selection": "",
-            "YouTube Username": "",
-            "YouTube Video List": "",
-            "YouTube Videos": "",
-            "A:": "<<ExtendedFileManager>>",
-            "Absbottom": "<<InsertImage>>",
-            "Absmiddle": "<<InsertImage>>",
-            "Baseline": "<<InlineStyler>>",
-            "Bottom": "<<InlineStyler>>",
-            "Clear": "<<FindReplace>>",
-            "Constrain Proportions": "<<ExtendedFileManager>>",
-            "Crop": "<<ExtendedFileManager>>",
-            "D:": "<<ExtendedFileManager>>",
-            "Directory": "<<ExtendedFileManager>>",
-            "Directory Up": "<<ExtendedFileManager>>",
-            "Edit": "<<ExtendedFileManager>>",
-            "Filename:": "<<ExtendedFileManager>>",
-            "Flip Horizontal": "<<ExtendedFileManager>>",
-            "Flip Image": "<<ExtendedFileManager>>",
-            "Flip Vertical": "<<ExtendedFileManager>>",
-            "GIF": "<<ExtendedFileManager>>",
-            "GIF format is not supported, image editing not supported.": "<<ExtendedFileManager>>",
-            "H:": "<<ExtendedFileManager>>",
-            "Height:": "<<HorizontalRule>>",
-            "Image Editor": "<<ExtendedFileManager>>",
-            "Image Selection": "<<ExtendedFileManager>>",
-            "Insert Image": "<<InsertImage>>",
-            "Invalid base directory:": "<<ExtendedFileManager>>",
-            "JPEG High": "<<ExtendedFileManager>>",
-            "JPEG Low": "<<ExtendedFileManager>>",
-            "JPEG Medium": "<<ExtendedFileManager>>",
-            "Left": "<<HorizontalRule>>",
-            "Lock": "<<ExtendedFileManager>>",
-            "Marker": "<<ExtendedFileManager>>",
-            "Measure": "<<ExtendedFileManager>>",
-            "Middle": "<<InlineStyler>>",
-            "New Folder": "<<ExtendedFileManager>>",
-            "No Image Available": "<<ExtendedFileManager>>",
-            "Not set": "<<InsertImage>>",
-            "PNG": "<<ExtendedFileManager>>",
-            "Positioning of this image": "<<InsertImage>>",
-            "Quality:": "<<ExtendedFileManager>>",
-            "Refresh": "<<ExtendedFileManager>>",
-            "Resize": "<<ExtendedFileManager>>",
-            "Right": "<<HorizontalRule>>",
-            "Rotate": "<<ExtendedFileManager>>",
-            "Rotate 180 &deg;": "<<ExtendedFileManager>>",
-            "Rotate 90 &deg; CCW": "<<ExtendedFileManager>>",
-            "Rotate 90 &deg; CW": "<<ExtendedFileManager>>",
-            "Rotate Image": "<<ExtendedFileManager>>",
-            "Save": "<<SaveSubmit>>",
-            "Start X:": "<<ExtendedFileManager>>",
-            "Start Y:": "<<ExtendedFileManager>>",
-            "Texttop": "<<InsertImage>>",
-            "Top": "<<InlineStyler>>",
-            "Trash": "<<ExtendedFileManager>>",
-            "W:": "<<ExtendedFileManager>>",
-            "Width:": "<<HorizontalRule>>",
-            "X:": "<<ExtendedFileManager>>",
-            "Y:": "<<ExtendedFileManager>>"
-        },
-        "InsertMarquee": {
-            "__ TRANSLATOR NOTE __": "*** INSERTMARQUEE IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***",
-            "Alternate": "",
-            "Background-Color:": "",
-            "Behavior:": "",
-            "Continuous": "",
-            "Direction:": "",
-            "Insert scrolling marquee": "",
-            "Marquee Editor": "",
-            "Scroll Amount:": "",
-            "Scroll Delay:": "",
-            "Slide": "",
-            "Speed Control": "",
-            "Height:": "<<HorizontalRule>>",
-            "Left": "<<HorizontalRule>>",
-            "Name": "<<Forms>>",
-            "Name/ID:": "<<Forms>>",
-            "Right": "<<HorizontalRule>>",
-            "Text:": "<<Forms>>",
-            "Width:": "<<HorizontalRule>>"
-        },
-        "InsertPicture": {
-            "__ TRANSLATOR NOTE __": "*** INSERTPICTURE IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***",
-            "Leave empty for not defined": "",
-            "Open file in new window": "",
-            " Open file in new window": "",
-            "Upload file": "",
-            "Absbottom": "<<InsertImage>>",
-            "Absmiddle": "<<InsertImage>>",
-            "Alignment:": "<<HorizontalRule>>",
-            "Alternate text:": "<<InsertImage>>",
-            "Baseline": "<<InlineStyler>>",
-            "Border thickness:": "<<InsertImage>>",
-            "Bottom": "<<InlineStyler>>",
-            "Enter the image URL here": "<<InsertImage>>",
-            "For browsers that don't support images": "<<InsertImage>>",
-            "Height:": "<<HorizontalRule>>",
-            "Horizontal padding": "<<InsertImage>>",
-            "Horizontal:": "<<InsertImage>>",
-            "Image Preview:": "<<InsertImage>>",
-            "Image URL:": "<<Forms>>",
-            "Insert Image": "<<InsertImage>>",
-            "Layout": "<<HorizontalRule>>",
-            "Leave empty for no border": "<<InsertImage>>",
-            "Left": "<<HorizontalRule>>",
-            "Middle": "<<InlineStyler>>",
-            "Not set": "<<InsertImage>>",
-            "Positioning of this image": "<<InsertImage>>",
-            "Preview": "<<Equation>>",
-            "Preview the image in a new window": "<<InsertImage>>",
-            "Right": "<<HorizontalRule>>",
-            "Size": "<<Forms>>",
-            "Spacing": "<<InsertImage>>",
-            "Texttop": "<<InsertImage>>",
-            "Top": "<<InlineStyler>>",
-            "Vertical padding": "<<InsertImage>>",
-            "Vertical:": "<<InsertImage>>",
-            "Width:": "<<HorizontalRule>>"
-        },
-        "NoteServer": {
-            "__ TRANSLATOR NOTE __": "*** NOTESERVER IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***",
-            "120%": "",
-            "150%": "",
-            "80%": "",
-            "Add GUIDO Code in a textbox on the page": "",
-            "Add MIDI link to allow students to hear the music": "",
-            "Format": "",
-            "GUIDO Code": "",
-            "Guido code": "",
-            "Image in applet": "",
-            "Insert GUIDO Music Notation": "",
-            "MIDI File": "",
-            "Source Code": "",
-            "With Mozilla, the applet will not be visible in editor, but only in Web page after submitting.": "",
-            "Zoom :": "",
-            "100%": "<<ExtendedFileManager>>",
-            "Image Preview": "<<InsertImage>>",
-            "Options": "<<FindReplace>>",
-            "Preview": "<<Equation>>",
-            "Preview the image in a new window": "<<InsertImage>>",
-            "Zoom": "<<ExtendedFileManager>>"
-        },
-        "PSLocal": {
-            "__ TRANSLATOR NOTE __": "*** PSLOCAL IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***",
-            "Confirm": "",
-            "Enable": "",
-            "Enable Gears in order to use local document storage and configuration.": "",
-            "Enabling Local Storage": "",
-            "Install": "",
-            "Learn About Local Storage": "",
-            "This will reload the page, causing you to lose any unsaved work.  Press \"OK\" to reload.": "",
-            "Xinha uses Google Gears to enable local document storage.  With Gears installed, you can save drafts of your documents on your hard drive, configure Xinha to look the way you want, and carry this information wherever you use Xinha on the web.": ""
-        },
-        "PSServer": {
-            "__ TRANSLATOR NOTE __": "*** PSSERVER IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***",
-            "File: ": "",
-            "Import": ""
-        },
-        "PersistentStorage": {
-            "__ TRANSLATOR NOTE __": "*** PERSISTENTSTORAGE IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***",
-            "Details": "",
-            "File Browser": "",
-            "Hello    There C ": "",
-            "Hello  There A ": "",
-            "Hello \" There B \"": "",
-            "Hello ' There D '": "",
-            "List of Places": "",
-            "New Document": "",
-            "Open": "",
-            "Open Document": "",
-            "Places": "",
-            "Please enter the name of the directory you'd like to create.": "",
-            "Save Document": "",
-            "This will erase any unsaved content.  If you're certain, please click OK to continue.": "",
-            "Web URL": "",
-            "Confirm": "<<PSLocal>>",
-            "Copy": "<<ContextMenu>>",
-            "Delete": "<<Abbreviation>>",
-            "Directory Up": "<<ExtendedFileManager>>",
-            "File List": "<<ExtendedFileManager>>",
-            "File Manager": "<<ExtendedFileManager>>",
-            "Filename": "<<ExtendedFileManager>>",
-            "Insert": "<<InsertNote>>",
-            "Insert Image": "<<InsertImage>>",
-            "New Folder": "<<ExtendedFileManager>>",
-            "Save": "<<SaveSubmit>>",
-            "You must select some text before making a new link.": "<<Linker>>"
-        },
-        "SpellChecker": {
-            "__ TRANSLATOR NOTE __": "*** SPELLCHECKER IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***",
-            "Dictionary": "",
-            "Finished list of mispelled words": "",
-            "HTMLArea Spell Checker": "",
-            "I will open it in a new page.": "",
-            "Ignore": "",
-            "Ignore all": "",
-            "Info": "",
-            "Learn": "",
-            "No mispelled words found with the selected dictionary.": "",
-            "Original word": "",
-            "Please confirm that you want to open this link": "",
-            "Please wait.  Calling spell checker.": "",
-            "Please wait: changing dictionary to": "",
-            "pliz weit ;-)": "",
-            "Re-check": "",
-            "Replace": "",
-            "Replace all": "",
-            "Revert": "",
-            "Spell Checker": "",
-            "Spell-check": "",
-            "Suggestions": "",
-            "This will drop changes and quit spell checker.  Please confirm.": "",
-            "Replace with": "<<FindReplace>>"
-        },
-        "Template": {
-            "__ TRANSLATOR NOTE __": "*** TEMPLATE IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***",
-            "Insert template": ""
-        },
-        "UnFormat": {
-            "__ TRANSLATOR NOTE __": "*** UNFORMAT IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***",
-            "All": "",
-            "All HTML:": "",
-            "Cleaning Area": "",
-            "Cleaning options": "",
-            "Formatting:": "",
-            "Page Cleaner": "",
-            "Select which types of formatting you would like to remove.": "",
-            "Selection": ""
-        }
-    }
-}
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/lang/merged/sr.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/lang/merged/sr.js
deleted file mode 100644
index d15bee8..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/lang/merged/sr.js
+++ /dev/null
@@ -1,1577 +0,0 @@
-// Xinha Language Combined Translation File
-//
-// LANG: "sr", ENCODING: UTF-8
-//
-// INSTRUCTIONS TO TRANSLATORS
-// ===========================================================================
-//
-// Your translation must be in UTF-8 Character Encoding.
-//
-// This is a JSON encoded file (plus comments), strings should be double-quote
-// only, do not use single quotes to surround strings - "hello", not 'hello'
-// do not have a trailing comma after the last entry in a section.
-//
-// Only full line comments are allowed (that a comments occupy entire lines).
-//
-// Search for the __NEW_TRANSLATIONS__ section below, this is where you will
-// want to focus, this section includes things that do not presently have a 
-// translation or for which the translation needs to be checked for accuracy.
-//
-// In the New Translations section a translation string is one of the following
-//
-//  "English String Here" : ""
-//     This means it is not translated yet, add your translation...
-//     "English String Here" : "Klingon String Here"
-//
-//  "English String Here" : "Translated String Here"
-//     This means that an existing translation for this string, in some other
-//     section has been found, and used.  Check that it is approprite for this
-//     section and if it is, that's fine leave it as is, otherwise change as
-//     appropriate.
-//
-//  "English String Here" : "<<AnotherSection>>"
-//     This means use the same translation for this string as <<AnotherSection>>
-//     this saves you re-tranlating strings.  If the Context of this section
-//     and the context of AnotherSection seem the same, that's fine leave it
-//     using that translation, but if this section needs a different translation, 
-//     you can provide it by replacing the link (<<AnotherSection>>) with that
-//     new translation.  For example - a "Table" in say "DataPlugin" is 
-//     perhaps translated differently to "Table" in "FurniturePlugin".
-//
-// TESTING YOUR TRANSLATION
-// ===========================================================================
-// Simply place your translation file on your webserver somewhere for example
-//
-//   /xinha/lang/merged/sr.js
-//
-// and then tell Xinha where to get it (before loading XinhaCore.js) by 
-//
-//  _editor_lang              = 'sr';
-//  _editor_lang_merged_file  = '/xinha/lang/merged/sr.js';
-//
-// Xinha will load your new language definition.
-//
-// SUBMITTING YOUR TRANSLATION
-// ===========================================================================
-// Simply create a Ticket on the Xinha website and attach your translation 
-// file.
-//
-// The Xinha developers will take your file and use the 
-//     contrib/lc_split_merged_file.php
-// script to load it into the Xinha distribution.
-
-{
-    "Abbreviation": {
-        "Cancel": "Поништи",
-        "OK": "OK"
-    },
-    "AboutBox": {
-        "About this editor": "О овом едитору"
-    },
-    "BackgroundImage": {
-        "Cancel": "Поништи"
-    },
-    "ColorPicker": {
-        "OK": "OK"
-    },
-    "ContextMenu": {
-        "Justify Center": "Равнање по симетрали",
-        "Justify Full": "Пуно равнање",
-        "Justify Left": "Равнање улево",
-        "Justify Right": "Равнање удесно"
-    },
-    "CreateLink": {
-        "Cancel": "Поништи",
-        "Insert/Modify Link": "додај/промени линк",
-        "New window (_blank)": "Новом прозору (_blank)",
-        "None (use implicit)": "користи подразумевано",
-        "OK": "OK",
-        "Other": "Друго",
-        "Same frame (_self)": "Исти фрејм (_self)",
-        "Target:": "Отвори у:",
-        "Title (tooltip):": "Назив (tooltip):",
-        "Top frame (_top)": "Главни фрејм (_top)",
-        "URL:": "УРЛ:"
-    },
-    "EditTag": {
-        "Cancel": "Поништи",
-        "OK": "OK"
-    },
-    "Equation": {
-        "Cancel": "Поништи",
-        "OK": "OK",
-        "Preview": "Преглед"
-    },
-    "ExtendedFileManager": {
-        "Absbottom": "Апсолутно дно",
-        "Absmiddle": "Апсолутна средина",
-        "Baseline": "Доња линија",
-        "Bottom": "Дно",
-        "Cancel": "Поништи",
-        "Left": "Лево",
-        "Middle": "Средина",
-        "New window (_blank)": "Новом прозору (_blank)",
-        "None (use implicit)": "користи подразумевано",
-        "Not set": "Није постављено",
-        "OK": "OK",
-        "Positioning of this image": "Постављање ове слике",
-        "Preview": "Преглед",
-        "Right": "Десно",
-        "Same frame (_self)": "Исти фрејм (_self)",
-        "Texttop": "Врх текста",
-        "Title (tooltip)": "Назив (tooltip):",
-        "Top": "Врх",
-        "Top frame (_top)": "Главни фрејм (_top)",
-        "Width": "Ширина",
-        "Width:": "Ширина"
-    },
-    "Forms": {
-        "Cancel": "Поништи",
-        "Image URL:": "УРЛ слике",
-        "OK": "OK",
-        "Rows:": "Редови"
-    },
-    "FullPage": {
-        "Cancel": "Поништи",
-        "OK": "OK"
-    },
-    "HorizontalRule": {
-        "Alignment:": "Равнање",
-        "Cancel": "Поништи",
-        "Horizontal Rule": "Хоризонтална линија",
-        "Layout": "Прелом",
-        "Left": "Лево",
-        "OK": "OK",
-        "Right": "Десно",
-        "Width:": "Ширина"
-    },
-    "ImageManager": {
-        "Absbottom": "Апсолутно дно",
-        "Absmiddle": "Апсолутна средина",
-        "Baseline": "Доња линија",
-        "Bottom": "Дно",
-        "Cancel": "Поништи",
-        "Insert Image": "Убаци слику",
-        "Left": "Лево",
-        "Middle": "Средина",
-        "Not set": "Није постављено",
-        "OK": "OK",
-        "Positioning of this image": "Постављање ове слике",
-        "Right": "Десно",
-        "Texttop": "Врх текста",
-        "Top": "Врх",
-        "Width:": "Ширина"
-    },
-    "InlineStyler": {
-        "Baseline": "Доња линија",
-        "Bottom": "Дно",
-        "Image URL": "УРЛ слике",
-        "Layout": "Прелом",
-        "Left": "Лево",
-        "Middle": "Средина",
-        "Right": "Десно",
-        "Top": "Врх",
-        "Width": "Ширина"
-    },
-    "InsertAnchor": {
-        "Cancel": "Поништи",
-        "OK": "OK"
-    },
-    "InsertImage": {
-        "Absbottom": "Апсолутно дно",
-        "Absmiddle": "Апсолутна средина",
-        "Alignment:": "Равнање",
-        "Alternate text:": "алтернативни текст",
-        "Baseline": "Доња линија",
-        "Border thickness:": "Дебљина оквира",
-        "Bottom": "Дно",
-        "Cancel": "Поништи",
-        "Enter the image URL here": "Унесите УРЛ слике овде",
-        "For browsers that don't support images": "За претраживаче који не подржавају слике",
-        "Horizontal padding": "Хортизонтално одстојање",
-        "Horizontal:": "По хоризонтали",
-        "Image Preview:": "Преглед слике",
-        "Image URL:": "УРЛ слике",
-        "Insert Image": "Убаци слику",
-        "Layout": "Прелом",
-        "Leave empty for no border": "Остави празно кад нема оквира",
-        "Left": "Лево",
-        "Middle": "Средина",
-        "Not set": "Није постављено",
-        "OK": "OK",
-        "Positioning of this image": "Постављање ове слике",
-        "Preview": "Преглед",
-        "Preview the image in a new window": "Прегледај слику у новом прозору",
-        "Right": "Десно",
-        "Spacing": "Размак",
-        "Texttop": "Врх текста",
-        "Top": "Врх",
-        "Vertical padding": "Вертикално одстојање",
-        "Vertical:": "По вертикали"
-    },
-    "InsertMarquee": {
-        "Cancel": "Поништи",
-        "Left": "Лево",
-        "OK": "OK",
-        "Right": "Десно",
-        "Width:": "Ширина"
-    },
-    "InsertNote": {
-        "Cancel": "Поништи"
-    },
-    "InsertPicture": {
-        "Absbottom": "Апсолутно дно",
-        "Absmiddle": "Апсолутна средина",
-        "Alignment:": "Равнање",
-        "Alternate text:": "алтернативни текст",
-        "Baseline": "Доња линија",
-        "Border thickness:": "Дебљина оквира",
-        "Bottom": "Дно",
-        "Cancel": "Поништи",
-        "Enter the image URL here": "Унесите УРЛ слике овде",
-        "For browsers that don't support images": "За претраживаче који не подржавају слике",
-        "Horizontal padding": "Хортизонтално одстојање",
-        "Horizontal:": "По хоризонтали",
-        "Image Preview:": "Преглед слике",
-        "Image URL:": "УРЛ слике",
-        "Insert Image": "Убаци слику",
-        "Layout": "Прелом",
-        "Leave empty for no border": "Остави празно кад нема оквира",
-        "Left": "Лево",
-        "Middle": "Средина",
-        "Not set": "Није постављено",
-        "OK": "OK",
-        "Positioning of this image": "Постављање ове слике",
-        "Preview": "Преглед",
-        "Preview the image in a new window": "Прегледај слику у новом прозору",
-        "Right": "Десно",
-        "Spacing": "Размак",
-        "Texttop": "Врх текста",
-        "Top": "Врх",
-        "Vertical padding": "Вертикално одстојање",
-        "Vertical:": "По вертикали",
-        "Width:": "Ширина"
-    },
-    "InsertSnippet": {
-        "Cancel": "Поништи"
-    },
-    "InsertSnippet2": {
-        "Cancel": "Поништи"
-    },
-    "InsertTable": {
-        "Absbottom": "Апсолутно дно",
-        "Absmiddle": "Апсолутна средина",
-        "Alignment:": "Равнање",
-        "Baseline": "Доња линија",
-        "Border thickness:": "Дебљина оквира",
-        "Bottom": "Дно",
-        "Cancel": "Поништи",
-        "Cell padding:": "Унутрашња одстојања од ивица ћелије",
-        "Cell spacing:": "Размак између ћелија",
-        "Cols:": "Колоне",
-        "Em": "Ем",
-        "Fixed width columns": "Фиксирана ширина колоне",
-        "Insert Table": "Убаци табелу",
-        "Layout": "Прелом",
-        "Leave empty for no border": "Остави празно кад нема оквира",
-        "Left": "Лево",
-        "Middle": "Средина",
-        "Not set": "Није постављено",
-        "Number of columns": "Број колона",
-        "Number of rows": "Број редова",
-        "OK": "OK",
-        "Percent": "Процената",
-        "Pixels": "Пиксела",
-        "Positioning of this table": "Постављање ове табеле",
-        "Right": "Десно",
-        "Rows:": "Редови",
-        "Space between adjacent cells": "Размак између наспрамних ћелија",
-        "Space between content and border in cell": "Растојање између садржаја у ћелији и њеног оквира",
-        "Spacing": "Размак",
-        "Texttop": "Врх текста",
-        "Top": "Врх",
-        "Width of the table": "Ширина табеле",
-        "Width unit": "Јединица ширине",
-        "Width:": "Ширина"
-    },
-    "Linker": {
-        "Cancel": "Поништи",
-        "Insert/Modify Link": "додај/промени линк",
-        "OK": "OK",
-        "Target:": "Отвори у:",
-        "URL:": "УРЛ:"
-    },
-    "NoteServer": {
-        "Cancel": "Поништи",
-        "Image Preview": "Преглед слике",
-        "OK": "OK",
-        "Preview": "Преглед",
-        "Preview the image in a new window": "Прегледај слику у новом прозору"
-    },
-    "Opera": {
-        "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 на тастатури да директно залепите."
-    },
-    "PSLocal": {
-        "Cancel": "Поништи"
-    },
-    "PasteText": {
-        "Cancel": "Поништи",
-        "OK": "OK"
-    },
-    "PersistentStorage": {
-        "Cancel": "Поништи",
-        "Insert Image": "Убаци слику"
-    },
-    "QuickTag": {
-        "Cancel": "Поништи"
-    },
-    "SetId": {
-        "Cancel": "Поништи",
-        "OK": "OK"
-    },
-    "SmartReplace": {
-        "OK": "OK"
-    },
-    "SpellChecker": {
-        "Cancel": "Поништи",
-        "OK": "OK"
-    },
-    "SuperClean": {
-        "Cancel": "Поништи",
-        "OK": "OK"
-    },
-    "TableOperations": {
-        "Cancel": "Поништи",
-        "OK": "OK",
-        "Rows": "Редови",
-        "Spacing": "Размак"
-    },
-    "Template": {
-        "Cancel": "Поништи"
-    },
-    "UnFormat": {
-        "Cancel": "Поништи",
-        "OK": "OK"
-    },
-    "Xinha": {
-        "&#8212; format &#8212;": "&#8212; Format &#8212;",
-        "About this editor": "О овом едитору",
-        "Address": "адреса",
-        "Background Color": "Боја позадине",
-        "Bold": "Масно",
-        "Bulleted List": "Листа са симболима",
-        "Clear Inline Font Specifications": "Обриши примењене особине фонта",
-        "Clear MSOffice tags": "Обриши MSOffice тагове",
-        "Copy selection": "Копирај изабрано",
-        "Current style": "Важећи стил",
-        "Cut selection": "Исеци изабрано",
-        "Decrease Indent": "Смањи увлачење",
-        "Direction left to right": "Правац с лева на десно",
-        "Direction right to left": "Правац с десна на лево",
-        "Font Color": "Боја слова",
-        "Formatted": "форматиран",
-        "Heading 1": "Заглавље 1",
-        "Heading 2": "Заглавље 2",
-        "Heading 3": "Заглавље 3",
-        "Heading 4": "Заглавље 4",
-        "Heading 5": "Заглавље 5",
-        "Heading 6": "Заглавље 6",
-        "Help using editor": "Помоћ при коришћењу едитора",
-        "Horizontal Rule": "Хоризонтална линија",
-        "Increase Indent": "Повећај увлачење",
-        "Insert Table": "Убаци табелу",
-        "Insert Web Link": "додај веб линк",
-        "Insert/Modify Image": "додај/промени слику",
-        "Italic": "Курзив",
-        "Justify Center": "Равнање по симетрали",
-        "Justify Full": "Пуно равнање",
-        "Justify Left": "Равнање улево",
-        "Justify Right": "Равнање удесно",
-        "Normal": "обичан",
-        "Ordered List": "Листа са редним бројевима",
-        "Paste from clipboard": "Залепи из клипборда",
-        "Path": "Путања",
-        "Print document": "Штампај документ",
-        "Redoes your last action": "Враћа последњу радњу",
-        "Remove formatting": "Уклони форматирање",
-        "Select Color": "Изабери боју",
-        "Select all": "Изабери све",
-        "Split Block": "Подели блок",
-        "Strikethrough": "Прецртано",
-        "Subscript": "Индекс-текст",
-        "Superscript": "Експонент-текст",
-        "Toggle Borders": "Пребаци оквирне линије",
-        "Toggle HTML Source": "Пребаци на приказ ХТМЛ кода",
-        "Underline": "Подвучено",
-        "Undoes your last action": "Поништава последњу радњу",
-        "You are in TEXT MODE.  Use the [<>] button to switch back to WYSIWYG.": "Налазите се у ТЕКСТ режиму.  Користите [<>] дугме за повратак на ШВТИД (WYSIWYG)."
-    },
-    "__NEW_TRANSLATIONS__": {
-        "Abbreviation": {
-            "Abbreviation": "",
-            "Delete": "",
-            "Expansion:": ""
-        },
-        "AboutBox": {
-            "Close": "<<Xinha>>"
-        },
-        "CharCounter": {
-            "... in progress": "",
-            "Chars": "",
-            "HTML": "",
-            "Words": ""
-        },
-        "CharacterMap": {
-            "Insert special character": ""
-        },
-        "ColorPicker": {
-            "Click a color...": "",
-            "Color: ": "",
-            "Sample": "",
-            "Web Safe: ": "",
-            "Close": "<<Xinha>>"
-        },
-        "ContextMenu": {
-            "_Delete Row": "",
-            "_Image Properties...": "",
-            "_Modify Link...": "",
-            "_Remove Link...": "",
-            "_Table Properties...": "",
-            "C_ell Properties...": "",
-            "Chec_k Link...": "",
-            "Copy": "",
-            "Create a link": "",
-            "Current URL is": "",
-            "Cut": "",
-            "De_lete Column": "",
-            "Delete Cell": "",
-            "Delete the current column": "",
-            "Delete the current row": "",
-            "How did you get here? (Please report!)": "",
-            "I_nsert Row Before": "",
-            "In_sert Row After": "",
-            "Insert _Column Before": "",
-            "Insert a new column after the current one": "",
-            "Insert a new column before the current one": "",
-            "Insert a new row after the current one": "",
-            "Insert a new row before the current one": "",
-            "Insert a paragraph after the current node": "",
-            "Insert a paragraph before the current node": "",
-            "Insert C_olumn After": "",
-            "Insert Cell After": "",
-            "Insert Cell Before": "",
-            "Insert paragraph after": "",
-            "Insert paragraph before": "",
-            "Link points to:": "",
-            "Make lin_k...": "",
-            "Merge Cells": "",
-            "Opens this link in a new window": "",
-            "Paste": "",
-            "Please confirm that you want to remove this element:": "",
-            "Please confirm that you want to unlink this element.": "",
-            "Remove the $elem Element...": "",
-            "Remove this node from the document": "",
-            "Ro_w Properties...": "",
-            "Show the image properties dialog": "",
-            "Show the Table Cell Properties dialog": "",
-            "Show the Table Properties dialog": "",
-            "Show the Table Row Properties dialog": "",
-            "Unlink the current element": ""
-        },
-        "CreateLink": {
-            "Are you sure you wish to remove this link?": "",
-            "You need to select some text before creating a link": ""
-        },
-        "DefinitionList": {
-            "definition description": "",
-            "definition list": "",
-            "definition term": ""
-        },
-        "Dialogs": {
-            "Some Text Here": ""
-        },
-        "DynamicCSS": {
-            "Choose stylesheet": "",
-            "Default": "",
-            "Undefined": ""
-        },
-        "EditTag": {
-            "Edit HTML for selected text": "",
-            "Edit Tag By Peg": "",
-            "Tag Editor": ""
-        },
-        "Equation": {
-            "!=": "",
-            "!in": "",
-            "&gt;-": "",
-            "&gt;=": "",
-            "&lt;=": "",
-            "&lt;=&gt;": "",
-            "&lt;x&gt;": "",
-            "&nbsp; `!` &nbsp;": "",
-            "&nbsp; `.` &nbsp;": "",
-            "&nbsp; `0` &nbsp;": "",
-            "&nbsp; `2` &nbsp;": "",
-            "&nbsp; `3` &nbsp;": "",
-            "&nbsp; `4` &nbsp;": "",
-            "&nbsp; `5` &nbsp;": "",
-            "&nbsp; `6` &nbsp;": "",
-            "&nbsp; `7` &nbsp;": "",
-            "&nbsp; `8` &nbsp;": "",
-            "&nbsp; `9` &nbsp;": "",
-            "&nbsp; `e` &nbsp;": "",
-            "&nbsp;&nbsp;`1` &nbsp;": "",
-            "&nbsp;`+{::}`&nbsp;": "",
-            "&nbsp;`-:\\ `": "",
-            "&nbsp;`-{::}`&nbsp;": "",
-            "&nbsp;`C`&nbsp;": "",
-            "&nbsp;`cos`": "",
-            "&nbsp;`ln`&nbsp;": "",
-            "&nbsp;`pi` &nbsp;": "",
-            "&nbsp;`sin`": "",
-            "&nbsp;`tan`": "",
-            "&nbsp;`times`&nbsp;": "",
-            "&quot;text&quot;": "",
-            "'+formula+'": "",
-            "((n),(k))": "",
-            "(x+1)/(x-1)": "",
-            "*": "",
-            "**": "",
-            "+-": "",
-            "-&gt;": "",
-            "-&lt;": "",
-            "-:": "",
-            "-=": "",
-            "//": "",
-            "/_": "",
-            ":.": "",
-            "=&gt;": "",
-            "@": "",
-            "[[a,b],[c,d]]": "",
-            "\\\\": "",
-            "\\nClick in the box to use your keyboard or use the buttons\\n": "",
-            "^^": "",
-            "^^^": "",
-            "__|": "",
-            "_|_": "",
-            "`!=`": "",
-            "`!in`": "",
-            "`&and;`": "",
-            "`&cap;`": "",
-            "`&cup;`": "",
-            "`&gt;-`": "",
-            "`&gt;=`": "",
-            "`&lt;=&gt;`": "",
-            "`&lt;=`": "",
-            "`&lt;x&gt;`": "",
-            "`&or;`": "",
-            "`&quot;text&quot;`": "",
-            "`((n),(k))`": "",
-            "`(x+1)/(x-1)`": "",
-            "`**`": "",
-            "`*`": "",
-            "`+-`": "",
-            "`-&gt;`": "",
-            "`-&lt;`": "",
-            "`-:`": "",
-            "`-=`": "",
-            "`//`": "",
-            "`/_`": "",
-            "`:.`": "",
-            "`=&gt;`": "",
-            "`@`": "",
-            "`[[a,b],[c,d]]`": "",
-            "`\\\\`": "",
-            "`__|`": "",
-            "`_|_`": "",
-            "`AA`": "",
-            "`aleph`": "",
-            "`alpha`": "",
-            "`and`": "",
-            "`bara`": "",
-            "`bba`": "",
-            "`bbba`": "",
-            "`beta`": "",
-            "`CC`": "",
-            "`cca`": "",
-            "`chi`": "",
-            "`darr`": "",
-            "`ddota`": "",
-            "`del`": "",
-            "`Delta`": "",
-            "`delta`": "",
-            "`diamond`": "",
-            "`dota`": "",
-            "`dy/dx`": "",
-            "`EE`": "",
-            "`epsi`": "",
-            "`eta`": "",
-            "`fra`": "",
-            "`Gamma`": "",
-            "`gamma`": "",
-            "`grad`": "",
-            "`harr`": "",
-            "`hArr`": "",
-            "`hata`": "",
-            "`if`": "",
-            "`in`": "",
-            "`int`": "",
-            "`iota`": "",
-            "`kappa`": "",
-            "`lambda`": "",
-            "`Lambda`": "",
-            "`lArr`": "",
-            "`larr`": "",
-            "`lim_(x-&gt;oo)`": "",
-            "`log`": "",
-            "`mu`": "",
-            "`NN`": "",
-            "`nn`": "",
-            "`not`": "",
-            "`nu`": "",
-            "`o+`": "",
-            "`o.`": "",
-            "`O/`": "",
-            "`oint`": "",
-            "`omega`": "",
-            "`Omega`": "",
-            "`oo`": "",
-            "`or`": "",
-            "`ox`": "",
-            "`Phi`": "",
-            "`phi`": "",
-            "`Pi`": "",
-            "`pi`": "",
-            "`prod`": "",
-            "`prop`": "",
-            "`Psi`": "",
-            "`psi`": "",
-            "`QQ`": "",
-            "`quad`": "",
-            "`rArr`": "",
-            "`rho`": "",
-            "`root(n)(x)`": "",
-            "`RR`": "",
-            "`sfa`": "",
-            "`sigma`": "",
-            "`Sigma`": "",
-            "`sqrt(x)`": "",
-            "`square`": "",
-            "`stackrel(-&gt;)(+)`": "",
-            "`sub`": "",
-            "`sube`": "",
-            "`sum`": "",
-            "`sup`": "",
-            "`supe`": "",
-            "`tau`": "",
-            "`Theta`": "",
-            "`theta`": "",
-            "`TT`": "",
-            "`tta`": "",
-            "`uarr`": "",
-            "`ula`": "",
-            "`upsilon`": "",
-            "`uu`": "",
-            "`veca`": "",
-            "`vv`": "",
-            "`x_(mn)`": "",
-            "`Xi`": "",
-            "`xi`": "",
-            "`xx`": "",
-            "`zeta`": "",
-            "`ZZ`": "",
-            "`|-&gt;`": "",
-            "`|--`": "",
-            "`|==`": "",
-            "`|__`": "",
-            "`|~`": "",
-            "`~=`": "",
-            "`~|`": "",
-            "`~~`": "",
-            "AA": "",
-            "aleph": "",
-            "alpha": "",
-            "and": "",
-            "AsciiMath Formula Input": "",
-            "AsciiMathML Example": "",
-            "bara": "",
-            "Based on ASCIIMathML by": "",
-            "bba": "",
-            "bbba": "",
-            "beta": "",
-            "CC": "",
-            "cca": "",
-            "chi": "",
-            "darr": "",
-            "ddota": "",
-            "del": "",
-            "Delta": "",
-            "delta": "",
-            "diamond": "",
-            "dota": "",
-            "dy/dx": "",
-            "EE": "",
-            "epsi": "",
-            "eta": "",
-            "For more information on AsciiMathML visit this page:": "",
-            "Formula Editor": "",
-            "fra": "",
-            "gamma": "",
-            "Gamma": "",
-            "grad": "",
-            "hArr": "",
-            "harr": "",
-            "hata": "",
-            "if": "",
-            "in": "",
-            "Input": "",
-            "int": "",
-            "int_a^bf(x)dx": "",
-            "iota": "",
-            "kappa": "",
-            "Lambda": "",
-            "lambda": "",
-            "larr": "",
-            "lArr": "",
-            "lim_(x-&gt;oo)": "",
-            "mu": "",
-            "NN": "",
-            "nn": "",
-            "nnn": "",
-            "not": "",
-            "nu": "",
-            "o+": "",
-            "o.": "",
-            "O/": "",
-            "oint": "",
-            "omega": "",
-            "Omega": "",
-            "oo": "",
-            "or": "",
-            "ox": "",
-            "Phi": "",
-            "phi": "",
-            "pi": "",
-            "Pi": "",
-            "prod": "",
-            "prop": "",
-            "psi": "",
-            "Psi": "",
-            "QQ": "",
-            "quad": "",
-            "rArr": "",
-            "rho": "",
-            "root(n)(x)": "",
-            "RR": "",
-            "sfa": "",
-            "sigma": "",
-            "Sigma": "",
-            "sqrt(x)": "",
-            "square": "",
-            "stackrel(-&gt;)(+)": "",
-            "sub": "",
-            "sube": "",
-            "sum": "",
-            "sum_(n=1)^oo": "",
-            "sup": "",
-            "supe": "",
-            "tau": "",
-            "Theta": "",
-            "theta": "",
-            "TT": "",
-            "tta": "",
-            "uarr": "",
-            "ula": "",
-            "upsilon": "",
-            "uu": "",
-            "uuu": "",
-            "veca": "",
-            "vv": "",
-            "vvv": "",
-            "x^(m+n)": "",
-            "x_(mn)": "",
-            "Xi": "",
-            "xi": "",
-            "xx": "",
-            "zeta": "",
-            "ZZ": "",
-            "|-&gt;": "",
-            "|--": "",
-            "|==": "",
-            "|__": "",
-            "|~": "",
-            "~=": "",
-            "~|": "",
-            "~~": ""
-        },
-        "FancySelects": {
-            "'+opt.text+'": ""
-        },
-        "FindReplace": {
-            "';\r\n  var tagc = '": "",
-            "Case sensitive search": "",
-            "Clear": "",
-            "Done": "",
-            "Enter the text you want to find": "",
-            "Find and Replace": "",
-            "found item": "",
-            "found items": "",
-            "Highlight": "",
-            "Inform a replacement word": "",
-            "Next": "",
-            "not found": "",
-            "Options": "",
-            "Replace with:": "",
-            "replaced item": "",
-            "replaced items": "",
-            "Search for:": "",
-            "Substitute all occurrences": "",
-            "Substitute this occurrence?": "",
-            "Undo": "",
-            "Whole words only": ""
-        },
-        "FormOperations": {
-            "Enter the name for new option.": "",
-            "Form Editor": "",
-            "Insert a check box.": "",
-            "Insert a Form.": "",
-            "Insert a multi-line text field.": "",
-            "Insert a radio button.": "",
-            "Insert a select field.": "",
-            "Insert a submit/reset button.": "",
-            "Insert a text, password or hidden field.": "",
-            "Message Sent": "",
-            "Please Select...": ""
-        },
-        "Forms": {
-            "'onClick'=": "",
-            "Access Key:": "",
-            "Action URL:": "",
-            "Button Script": "",
-            "Checked": "",
-            "Columns:": "",
-            "Default text (optional)": "",
-            "Dimensions": "",
-            "Disabled": "",
-            "Encoding:": "",
-            "For Control:": "",
-            "Form": "",
-            "Form Element: FIELDSET": "",
-            "Form Element: INPUT": "",
-            "Form Element: LABEL": "",
-            "Form Element: SELECT": "",
-            "Form Element: TEXTAREA": "",
-            "Form handler script": "",
-            "Form Name:": "",
-            "Get": "",
-            "Hard": "",
-            "Height in number of rows": "",
-            "HTML-Form to CGI (default)": "",
-            "Image source": "",
-            "Initial Text:": "",
-            "Insert/Edit Form": "",
-            "Insert/Edit Form Element FIELDSET": "",
-            "Insert/Edit Form Element INPUT": "",
-            "Insert/Edit Form Element LABEL": "",
-            "Insert/Edit Form Element SELECT": "",
-            "Insert/Edit Form Element TEXTAREA": "",
-            "Javascript for button click": "",
-            "Label:": "",
-            "Legend:": "",
-            "Max length:": "",
-            "Maximum number of characters accepted": "",
-            "Method:": "",
-            "multipart Form Data (File-Upload)": "",
-            "Name": "",
-            "Name of the form input": "",
-            "Name of the form select": "",
-            "name of the textarea": "",
-            "Name/ID:": "",
-            "normal": "",
-            "nowrap": "",
-            "Off": "",
-            "Physical": "",
-            "Please enter a Label": "",
-            "Post": "",
-            "pre": "",
-            "Read Only": "",
-            "Size of text box in characters": "",
-            "Size:": "",
-            "Soft": "",
-            "Tab Index:": "",
-            "Target Frame:": "",
-            "Text:": "",
-            "URL of image": "",
-            "Value of the form input": "",
-            "Value:": "",
-            "Virtual": "",
-            "Width in number of characters": "",
-            "Wrap Mode:": "",
-            "You must enter a Name": "",
-            "Options": "<<FindReplace>>"
-        },
-        "FullPage": {
-            "...": "",
-            "Alternate style-sheet:": "",
-            "Background color:": "",
-            "Character set:": "",
-            "cyrillic (ISO-8859-5)": "",
-            "cyrillic (KOI8-R)": "",
-            "cyrillic (WINDOWS-1251)": "",
-            "Description:": "",
-            "DOCTYPE:": "",
-            "Document properties": "",
-            "Document title:": "",
-            "Keywords:": "",
-            "Primary style-sheet:": "",
-            "Text color:": "",
-            "UTF-8 (recommended)": "",
-            "western (ISO-8859-1)": ""
-        },
-        "FullScreen": {
-            "Maximize/Minimize Editor": ""
-        },
-        "Gecko": {
-            "The Paste button does not work in this browser for security reasons. Press CTRL-V on your keyboard to paste directly.": ""
-        },
-        "HorizontalRule": {
-            "&#x00d7;": "",
-            "&nbsp;": "",
-            "Center": "",
-            "Color:": "",
-            "Height:": "",
-            "Insert/edit horizontal rule": "",
-            "Insert/Edit Horizontal Rule": "",
-            "No shading": "",
-            "percent": "",
-            "pixels": "",
-            "Style": ""
-        },
-        "InlineStyler": {
-            "Background": "",
-            "Border": "",
-            "Char": "",
-            "Collapsed borders": "",
-            "CSS Style": "",
-            "FG Color": "",
-            "Float": "",
-            "Justify": "",
-            "Margin": "",
-            "None": "",
-            "Padding": "",
-            "Text align": "",
-            "Vertical align": "",
-            "-": "<<Equation>>",
-            "Center": "<<HorizontalRule>>",
-            "Height": "<<HorizontalRule>>",
-            "percent": "<<HorizontalRule>>",
-            "pixels": "<<HorizontalRule>>"
-        },
-        "InsertAnchor": {
-            "Anchor name": "",
-            "Insert Anchor": "",
-            "Delete": "<<Abbreviation>>"
-        },
-        "InsertImage": {
-            "You must enter the URL": ""
-        },
-        "InsertNote": {
-            "Insert": "",
-            "Insert footnote": "",
-            "Insert Note": ""
-        },
-        "InsertPagebreak": {
-            "Page break": "",
-            "Page Break": ""
-        },
-        "InsertSmiley": {
-            "Insert Smiley": ""
-        },
-        "InsertSnippet": {
-            "\\n  This is an information about something\\n": "",
-            "Hide preview": "",
-            "Insert as": "",
-            "Insert Snippet": "",
-            "InsertSnippet for Xinha": "",
-            "Link1": "",
-            "Link2": "",
-            "Link3": "",
-            "Link4": "",
-            "Link5": "",
-            "Show preview": "",
-            "This is an information about something": "",
-            "Variable": ""
-        },
-        "InsertSnippet2": {
-            "All Categories": "",
-            "Filter": "",
-            "Insert as HTML": "",
-            "Insert as template variable": "",
-            "Only search word beginning": "",
-            "HTML": "<<CharCounter>>",
-            "Insert Snippet": "<<InsertSnippet>>",
-            "InsertSnippet for Xinha": "<<InsertSnippet>>",
-            "Variable": "<<InsertSnippet>>"
-        },
-        "InsertTable": {
-            "Caption": "",
-            "Caption for the table": "",
-            "Collapse borders:": "",
-            "Layou": "",
-            "Style of the border": "",
-            "You must enter a number of columns": "",
-            "You must enter a number of rows": "",
-            "Border": "<<InlineStyler>>"
-        },
-        "LangMarks": {
-            "&mdash; language &mdash;": "",
-            "', '": "",
-            "English": "",
-            "French": "",
-            "Greek": "",
-            "language select": "",
-            "Latin": ""
-        },
-        "Linker": {
-            "(px)": "",
-            "Anchor-Link": "",
-            "Anchor:": "",
-            "Email Address:": "",
-            "Email Link": "",
-            "Location Bar:": "",
-            "Menu Bar:": "",
-            "Message Template:": "",
-            "New Window": "",
-            "Ordinary Link": "",
-            "Popup Window": "",
-            "PopupWindow": "",
-            "Remove Link": "",
-            "Resizeable:": "",
-            "Same Window (jump out of frames)": "",
-            "Scrollbars:": "",
-            "Shows On Hover": "",
-            "Status Bar:": "",
-            "Subject:": "",
-            "Title:": "",
-            "Toolbar:": "",
-            "URL Link": "",
-            "You must select some text before making a new link.": "",
-            "Are you sure you wish to remove this link?": "<<CreateLink>>",
-            "Name:": "<<Forms>>",
-            "Size:": "<<Forms>>"
-        },
-        "ListType": {
-            "Choose list style type (for ordered lists)": "",
-            "Decimal numbers": "",
-            "Lower greek letters": "",
-            "Lower latin letters": "",
-            "Lower roman numbers": "",
-            "Upper latin letters": "",
-            "Upper roman numbers": ""
-        },
-        "MootoolsFileManager": {
-            "Insert File Link": "",
-            "You must select some text before making a new link.": "<<Linker>>"
-        },
-        "Opera": {
-            "MARK": ""
-        },
-        "PasteText": {
-            "Insert text in new paragraph": "",
-            "Paste as Plain Text": ""
-        },
-        "PreserveScripts": {
-            "JavaScript": "",
-            "PHP": ""
-        },
-        "QuickTag": {
-            "',\r\n                           'cl': '": "",
-            "ATTRIBUTES": "",
-            "Colors": "",
-            "Enter the TAG you want to insert": "",
-            "No CSS class avaiable": "",
-            "Ok": "",
-            "OPTIONS": "",
-            "Quick Tag Editor": "",
-            "TAGs": "",
-            "There are some unclosed quote": "",
-            "This attribute already exists in the TAG": "",
-            "You have to select some text": ""
-        },
-        "SaveSubmit": {
-            "in progress": "",
-            "Ready": "",
-            "Save": "",
-            "Saving...": ""
-        },
-        "SetId": {
-            "ID/Name:": "",
-            "Set Id and Name": "",
-            "Set Id/Name": "",
-            "Set ID/Name": "",
-            "Delete": "<<Abbreviation>>"
-        },
-        "SmartReplace": {
-            "ClosingDoubleQuotes": "",
-            "ClosingSingleQuote": "",
-            "Convert all quotes and dashes in the current document": "",
-            "Enable automatic replacements": "",
-            "OpeningDoubleQuotes": "",
-            "OpeningSingleQuote": "",
-            "SmartReplace": "",
-            "SmartReplace Settings": ""
-        },
-        "Stylist": {
-            "Styles": ""
-        },
-        "SuperClean": {
-            "Clean bad HTML from Microsoft Word.": "",
-            "Clean Selection Only": "",
-            "Clean up HTML": "",
-            "Cleaning Scope": "",
-            "General tidy up and correction of some problems.": "",
-            "Please select from the following cleaning options...": "",
-            "Please stand by while cleaning in process...": "",
-            "Remove alignment (left/right/justify).": "",
-            "Remove all classes (CSS).": "",
-            "Remove All HTML Tags": "",
-            "Remove all styles (CSS).": "",
-            "Remove custom font sizes.": "",
-            "Remove custom text colors.": "",
-            "Remove custom typefaces (font \"styles\").": "",
-            "Remove emphasis and annotations.": "",
-            "Remove lang attributes.": "",
-            "Remove Paragraphs": "",
-            "Remove superscripts and subscripts.": "",
-            "Replace directional quote marks with non-directional quote marks.": "",
-            "Vigorously purge HTML from Microsoft Word.": ""
-        },
-        "TableOperations": {
-            "All four sides": "",
-            "Borders": "",
-            "Cell properties": "",
-            "Cell Properties": "",
-            "Cell Type:": "",
-            "Cells down": "",
-            "Cells to the right, and": "",
-            "Delete cell": "",
-            "Delete column": "",
-            "Delete row": "",
-            "Do Not Change": "",
-            "Frame and borders": "",
-            "Frames": "",
-            "Header (th)": "",
-            "Insert cell after": "",
-            "Insert cell before": "",
-            "Insert column after": "",
-            "Insert column before": "",
-            "Insert row after": "",
-            "Insert row before": "",
-            "Merge cells": "",
-            "Merge current cell with:": "",
-            "No rules": "",
-            "No sides": "",
-            "Normal (td)": "",
-            "Please click into some cell": "",
-            "Row properties": "",
-            "Row Properties": "",
-            "Rules will appear between all rows and columns": "",
-            "Rules will appear between columns only": "",
-            "Rules will appear between rows only": "",
-            "Spacing and padding": "",
-            "Split column": "",
-            "Split row": "",
-            "Summary": "",
-            "Table Properties": "",
-            "Table properties": "",
-            "The bottom side only": "",
-            "The left-hand side only": "",
-            "The right and left sides only": "",
-            "The right-hand side only": "",
-            "The top and bottom sides only": "",
-            "The top side only": "",
-            "Xinha cowardly refuses to delete the last cell in row.": "",
-            "Xinha cowardly refuses to delete the last column in table.": "",
-            "Xinha cowardly refuses to delete the last row in table.": "",
-            "Caption": "<<InsertTable>>",
-            "Columns": "<<Forms>>",
-            "Description": "<<FullPage>>",
-            "Merge Cells": "<<ContextMenu>>",
-            "Padding": "<<InlineStyler>>",
-            "pixels": "<<HorizontalRule>>"
-        },
-        "UnsavedChanges": {
-            "You have unsaved changes in the editor": ""
-        },
-        "WebKit": {
-            "The Paste button does not work in this browser for security reasons. Press CTRL-V on your keyboard to paste directly.": "<<Gecko>>"
-        },
-        "Xinha": {
-            "&#8212; font &#8212;": "",
-            "&#8212; size &#8212;": "",
-            "1 (8 pt)": "",
-            "2 (10 pt)": "",
-            "3 (12 pt)": "",
-            "4 (14 pt)": "",
-            "5 (18 pt)": "",
-            "6 (24 pt)": "",
-            "7 (36 pt)": "",
-            "Arial": "",
-            "Clean content pasted from Word": "",
-            "Close": "",
-            "Constructing object": "",
-            "Courier New": "",
-            "Create Statusbar": "",
-            "Create Toolbar": "",
-            "CTRL-0 (zero)": "",
-            "CTRL-1 .. CTRL-6": "",
-            "CTRL-A": "",
-            "CTRL-B": "",
-            "CTRL-C": "",
-            "CTRL-E": "",
-            "CTRL-I": "",
-            "CTRL-J": "",
-            "CTRL-L": "",
-            "CTRL-N": "",
-            "CTRL-R": "",
-            "CTRL-S": "",
-            "CTRL-U": "",
-            "CTRL-V": "",
-            "CTRL-X": "",
-            "CTRL-Y": "",
-            "CTRL-Z": "",
-            "Editor Help": "",
-            "ENTER": "",
-            "Error Loading Xinha.  Developers, check the Error Console for information.": "",
-            "Finishing": "",
-            "Generate Xinha framework": "",
-            "Georgia": "",
-            "Headings": "",
-            "Impact": "",
-            "Init editor size": "",
-            "insert linebreak": "",
-            "Insert/Overwrite": "",
-            "Keyboard shortcuts": "",
-            "Loading Core": "",
-            "Loading in progress. Please wait!": "",
-            "Loading plugin $plugin": "",
-            "Loading plugins": "",
-            "MS Word Cleaner": "",
-            "new paragraph": "",
-            "Register plugin $plugin": "",
-            "Save as": "",
-            "Set format to paragraph": "",
-            "SHIFT-ENTER": "",
-            "Tahoma": "",
-            "The editor provides the following key combinations:": "",
-            "Times New Roman": "",
-            "Touch here first to activate editor.": "",
-            "Verdana": "",
-            "Waiting for Iframe to load...": "",
-            "WingDings": "",
-            "Would you like to clear font colours?": "",
-            "Would you like to clear font sizes?": "",
-            "Would you like to clear font typefaces?": "",
-            "Xinha": ""
-        },
-        "BackgroundImage": {
-            "__ TRANSLATOR NOTE __": "*** BACKGROUNDIMAGE IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***",
-            "Remove Current Background": "",
-            "Set Background": "",
-            "Set page background image": "",
-            "Set Page Background Image": ""
-        },
-        "ClientsideSpellcheck": {
-            "__ TRANSLATOR NOTE __": "*** CLIENTSIDESPELLCHECK IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***",
-            "Spell Check using ieSpell": ""
-        },
-        "ExtendedFileManager": {
-            "__ TRANSLATOR NOTE __": "*** EXTENDEDFILEMANAGER IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***",
-            "10%": "",
-            "100%": "",
-            "200%": "",
-            "25%": "",
-            "50%": "",
-            "75%": "",
-            ">List View": "",
-            ">Thumbnail View": "",
-            "A:": "",
-            "Align": "",
-            "Alt": "",
-            "Border Color": "",
-            "Constrain Proportions": "",
-            "Crop": "",
-            "D:": "",
-            "Directory": "",
-            "Directory Up": "",
-            "Edit": "",
-            "File List": "",
-            "File Manager": "",
-            "Filename:": "",
-            "Filesize:": "",
-            "Flip Horizontal": "",
-            "Flip Image": "",
-            "Flip Vertical": "",
-            "Folder": "",
-            "GIF": "",
-            "GIF format is not supported, image editing not supported.": "",
-            "H:": "",
-            "Image Editor": "",
-            "Image Selection": "",
-            "Invalid base directory:": "",
-            "JPEG High": "",
-            "JPEG Low": "",
-            "JPEG Medium": "",
-            "Loading": "",
-            "Lock": "",
-            "Marker": "",
-            "Maximum folder size limit reached. Upload disabled.": "",
-            "Measure": "",
-            "New Folder": "",
-            "No Files Found": "",
-            "No Image Available": "",
-            "Please enter value": "",
-            "PNG": "",
-            "Preset": "",
-            "Quality:": "",
-            "Refresh": "",
-            "Rename": "",
-            "Resize": "",
-            "Rotate": "",
-            "Rotate 180 &deg;": "",
-            "Rotate 90 &deg; CCW": "",
-            "Rotate 90 &deg; CW": "",
-            "Rotate Image": "",
-            "Start X:": "",
-            "Start Y:": "",
-            "Target Window": "",
-            "Toggle marker color": "",
-            "Trash": "",
-            "Upload": "",
-            "W:": "",
-            "X:": "",
-            "Xinha Image Editor": "",
-            "Y:": "",
-            "Zoom": "",
-            "Border": "<<InlineStyler>>",
-            "Clear": "<<FindReplace>>",
-            "Color": "<<HorizontalRule>>",
-            "Copy": "<<ContextMenu>>",
-            "Cut": "<<ContextMenu>>",
-            "Height": "<<HorizontalRule>>",
-            "Height:": "<<HorizontalRule>>",
-            "Insert File Link": "<<MootoolsFileManager>>",
-            "Margin": "<<InlineStyler>>",
-            "Padding": "<<InlineStyler>>",
-            "Save": "<<SaveSubmit>>",
-            "You must select some text before making a new link.": "<<Linker>>"
-        },
-        "Filter": {
-            "__ TRANSLATOR NOTE __": "*** FILTER IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***",
-            "Filter": "<<InsertSnippet2>>"
-        },
-        "HtmlTidy": {
-            "__ TRANSLATOR NOTE __": "*** HTMLTIDY IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***",
-            "Auto-Tidy": "",
-            "Don't Tidy": "",
-            "HTML Tidy": "",
-            "Tidy failed.  Check your HTML for syntax errors.": ""
-        },
-        "ImageManager": {
-            "__ TRANSLATOR NOTE __": "*** IMAGEMANAGER IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***",
-            "Angle:": "",
-            "Flickr Picture List": "",
-            "Flickr Pictures": "",
-            "Flickr Selection": "",
-            "Flickr Username/Email": "",
-            "Folder Name:": "",
-            "Image Format": "",
-            "Image List": "",
-            "Keyword": "",
-            "No Images Found": "",
-            "No Photos Found": "",
-            "No Videos Found": "",
-            "This Server": "",
-            "YouTube Selection": "",
-            "YouTube Username": "",
-            "YouTube Video List": "",
-            "YouTube Videos": "",
-            "A:": "<<ExtendedFileManager>>",
-            "Clear": "<<FindReplace>>",
-            "Constrain Proportions": "<<ExtendedFileManager>>",
-            "Crop": "<<ExtendedFileManager>>",
-            "D:": "<<ExtendedFileManager>>",
-            "Directory": "<<ExtendedFileManager>>",
-            "Directory Up": "<<ExtendedFileManager>>",
-            "Edit": "<<ExtendedFileManager>>",
-            "Filename:": "<<ExtendedFileManager>>",
-            "Flip Horizontal": "<<ExtendedFileManager>>",
-            "Flip Image": "<<ExtendedFileManager>>",
-            "Flip Vertical": "<<ExtendedFileManager>>",
-            "GIF": "<<ExtendedFileManager>>",
-            "GIF format is not supported, image editing not supported.": "<<ExtendedFileManager>>",
-            "H:": "<<ExtendedFileManager>>",
-            "Height:": "<<HorizontalRule>>",
-            "Image Editor": "<<ExtendedFileManager>>",
-            "Image Selection": "<<ExtendedFileManager>>",
-            "Invalid base directory:": "<<ExtendedFileManager>>",
-            "JPEG High": "<<ExtendedFileManager>>",
-            "JPEG Low": "<<ExtendedFileManager>>",
-            "JPEG Medium": "<<ExtendedFileManager>>",
-            "Lock": "<<ExtendedFileManager>>",
-            "Marker": "<<ExtendedFileManager>>",
-            "Measure": "<<ExtendedFileManager>>",
-            "New Folder": "<<ExtendedFileManager>>",
-            "No Image Available": "<<ExtendedFileManager>>",
-            "PNG": "<<ExtendedFileManager>>",
-            "Quality:": "<<ExtendedFileManager>>",
-            "Refresh": "<<ExtendedFileManager>>",
-            "Resize": "<<ExtendedFileManager>>",
-            "Rotate": "<<ExtendedFileManager>>",
-            "Rotate 180 &deg;": "<<ExtendedFileManager>>",
-            "Rotate 90 &deg; CCW": "<<ExtendedFileManager>>",
-            "Rotate 90 &deg; CW": "<<ExtendedFileManager>>",
-            "Rotate Image": "<<ExtendedFileManager>>",
-            "Save": "<<SaveSubmit>>",
-            "Start X:": "<<ExtendedFileManager>>",
-            "Start Y:": "<<ExtendedFileManager>>",
-            "Trash": "<<ExtendedFileManager>>",
-            "W:": "<<ExtendedFileManager>>",
-            "X:": "<<ExtendedFileManager>>",
-            "Y:": "<<ExtendedFileManager>>"
-        },
-        "InsertMarquee": {
-            "__ TRANSLATOR NOTE __": "*** INSERTMARQUEE IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***",
-            "Alternate": "",
-            "Background-Color:": "",
-            "Behavior:": "",
-            "Continuous": "",
-            "Direction:": "",
-            "Insert scrolling marquee": "",
-            "Marquee Editor": "",
-            "Scroll Amount:": "",
-            "Scroll Delay:": "",
-            "Slide": "",
-            "Speed Control": "",
-            "Height:": "<<HorizontalRule>>",
-            "Name": "<<Forms>>",
-            "Name/ID:": "<<Forms>>",
-            "Text:": "<<Forms>>"
-        },
-        "InsertPicture": {
-            "__ TRANSLATOR NOTE __": "*** INSERTPICTURE IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***",
-            "Leave empty for not defined": "",
-            " Open file in new window": "",
-            "Open file in new window": "",
-            "Upload file": "",
-            "Height:": "<<HorizontalRule>>",
-            "Size": "<<Forms>>"
-        },
-        "NoteServer": {
-            "__ TRANSLATOR NOTE __": "*** NOTESERVER IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***",
-            "120%": "",
-            "150%": "",
-            "80%": "",
-            "Add GUIDO Code in a textbox on the page": "",
-            "Add MIDI link to allow students to hear the music": "",
-            "Format": "",
-            "Guido code": "",
-            "GUIDO Code": "",
-            "Image in applet": "",
-            "Insert GUIDO Music Notation": "",
-            "MIDI File": "",
-            "Source Code": "",
-            "With Mozilla, the applet will not be visible in editor, but only in Web page after submitting.": "",
-            "Zoom :": "",
-            "100%": "<<ExtendedFileManager>>",
-            "Options": "<<FindReplace>>",
-            "Zoom": "<<ExtendedFileManager>>"
-        },
-        "PSLocal": {
-            "__ TRANSLATOR NOTE __": "*** PSLOCAL IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***",
-            "Confirm": "",
-            "Enable": "",
-            "Enable Gears in order to use local document storage and configuration.": "",
-            "Enabling Local Storage": "",
-            "Install": "",
-            "Learn About Local Storage": "",
-            "This will reload the page, causing you to lose any unsaved work.  Press \"OK\" to reload.": "",
-            "Xinha uses Google Gears to enable local document storage.  With Gears installed, you can save drafts of your documents on your hard drive, configure Xinha to look the way you want, and carry this information wherever you use Xinha on the web.": ""
-        },
-        "PSServer": {
-            "__ TRANSLATOR NOTE __": "*** PSSERVER IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***",
-            "File: ": "",
-            "Import": ""
-        },
-        "PersistentStorage": {
-            "__ TRANSLATOR NOTE __": "*** PERSISTENTSTORAGE IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***",
-            "Details": "",
-            "File Browser": "",
-            "Hello    There C ": "",
-            "Hello  There A ": "",
-            "Hello \" There B \"": "",
-            "Hello ' There D '": "",
-            "List of Places": "",
-            "New Document": "",
-            "Open": "",
-            "Open Document": "",
-            "Places": "",
-            "Please enter the name of the directory you'd like to create.": "",
-            "Save Document": "",
-            "This will erase any unsaved content.  If you're certain, please click OK to continue.": "",
-            "Web URL": "",
-            "Confirm": "<<PSLocal>>",
-            "Copy": "<<ContextMenu>>",
-            "Delete": "<<Abbreviation>>",
-            "Directory Up": "<<ExtendedFileManager>>",
-            "File List": "<<ExtendedFileManager>>",
-            "File Manager": "<<ExtendedFileManager>>",
-            "Filename": "<<ExtendedFileManager>>",
-            "Insert": "<<InsertNote>>",
-            "New Folder": "<<ExtendedFileManager>>",
-            "Save": "<<SaveSubmit>>",
-            "You must select some text before making a new link.": "<<Linker>>"
-        },
-        "SpellChecker": {
-            "__ TRANSLATOR NOTE __": "*** SPELLCHECKER IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***",
-            "Dictionary": "",
-            "Finished list of mispelled words": "",
-            "HTMLArea Spell Checker": "",
-            "I will open it in a new page.": "",
-            "Ignore": "",
-            "Ignore all": "",
-            "Info": "",
-            "Learn": "",
-            "No mispelled words found with the selected dictionary.": "",
-            "Original word": "",
-            "Please confirm that you want to open this link": "",
-            "Please wait.  Calling spell checker.": "",
-            "Please wait: changing dictionary to": "",
-            "pliz weit ;-)": "",
-            "Re-check": "",
-            "Replace": "",
-            "Replace all": "",
-            "Revert": "",
-            "Spell Checker": "",
-            "Spell-check": "",
-            "Suggestions": "",
-            "This will drop changes and quit spell checker.  Please confirm.": "",
-            "Replace with": "<<FindReplace>>"
-        },
-        "Template": {
-            "__ TRANSLATOR NOTE __": "*** TEMPLATE IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***",
-            "Insert template": ""
-        },
-        "UnFormat": {
-            "__ TRANSLATOR NOTE __": "*** UNFORMAT IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***",
-            "All": "",
-            "All HTML:": "",
-            "Cleaning Area": "",
-            "Cleaning options": "",
-            "Formatting:": "",
-            "Page Cleaner": "",
-            "Select which types of formatting you would like to remove.": "",
-            "Selection": ""
-        }
-    }
-}
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/lang/merged/sv.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/lang/merged/sv.js
deleted file mode 100644
index 05ffea2..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/lang/merged/sv.js
+++ /dev/null
@@ -1,1577 +0,0 @@
-// Xinha Language Combined Translation File
-//
-// LANG: "sv", ENCODING: UTF-8
-//
-// INSTRUCTIONS TO TRANSLATORS
-// ===========================================================================
-//
-// Your translation must be in UTF-8 Character Encoding.
-//
-// This is a JSON encoded file (plus comments), strings should be double-quote
-// only, do not use single quotes to surround strings - "hello", not 'hello'
-// do not have a trailing comma after the last entry in a section.
-//
-// Only full line comments are allowed (that a comments occupy entire lines).
-//
-// Search for the __NEW_TRANSLATIONS__ section below, this is where you will
-// want to focus, this section includes things that do not presently have a 
-// translation or for which the translation needs to be checked for accuracy.
-//
-// In the New Translations section a translation string is one of the following
-//
-//  "English String Here" : ""
-//     This means it is not translated yet, add your translation...
-//     "English String Here" : "Klingon String Here"
-//
-//  "English String Here" : "Translated String Here"
-//     This means that an existing translation for this string, in some other
-//     section has been found, and used.  Check that it is approprite for this
-//     section and if it is, that's fine leave it as is, otherwise change as
-//     appropriate.
-//
-//  "English String Here" : "<<AnotherSection>>"
-//     This means use the same translation for this string as <<AnotherSection>>
-//     this saves you re-tranlating strings.  If the Context of this section
-//     and the context of AnotherSection seem the same, that's fine leave it
-//     using that translation, but if this section needs a different translation, 
-//     you can provide it by replacing the link (<<AnotherSection>>) with that
-//     new translation.  For example - a "Table" in say "DataPlugin" is 
-//     perhaps translated differently to "Table" in "FurniturePlugin".
-//
-// TESTING YOUR TRANSLATION
-// ===========================================================================
-// Simply place your translation file on your webserver somewhere for example
-//
-//   /xinha/lang/merged/sv.js
-//
-// and then tell Xinha where to get it (before loading XinhaCore.js) by 
-//
-//  _editor_lang              = 'sv';
-//  _editor_lang_merged_file  = '/xinha/lang/merged/sv.js';
-//
-// Xinha will load your new language definition.
-//
-// SUBMITTING YOUR TRANSLATION
-// ===========================================================================
-// Simply create a Ticket on the Xinha website and attach your translation 
-// file.
-//
-// The Xinha developers will take your file and use the 
-//     contrib/lc_split_merged_file.php
-// script to load it into the Xinha distribution.
-
-{
-    "Abbreviation": {
-        "Cancel": "Avbryt",
-        "OK": "OK"
-    },
-    "AboutBox": {
-        "About this editor": "Om denna editor",
-        "Close": "Stäng"
-    },
-    "BackgroundImage": {
-        "Cancel": "Avbryt"
-    },
-    "CharacterMap": {
-        "Insert special character": "Infoga tecken"
-    },
-    "ColorPicker": {
-        "Close": "Stäng",
-        "Color: ": "Färg",
-        "OK": "OK"
-    },
-    "ContextMenu": {
-        "C_ell Properties...": "C_ellegenskaper...",
-        "Chec_k Link...": "Kontrollera länk...",
-        "Copy": "Kopiera",
-        "Create a link": "SKapa ny länk",
-        "Current URL is": "Aktuellt URL är",
-        "Cut": "Klipp ut",
-        "De_lete Column": "_Radera kolumn",
-        "Delete the current column": "Radera aktuell kolumn",
-        "Delete the current row": "T bort aktuell rad",
-        "How did you get here? (Please report!)": "Hur hamnade du här? (Beskriv förloppet)",
-        "I_nsert Row Before": "I_nfoga rad före",
-        "In_sert Row After": "Infoga rad efter aktuell rad",
-        "Insert C_olumn After": "Infoga k_olumn efter",
-        "Insert _Column Before": "Infoga kolumn efter (_c)",
-        "Insert a new column after the current one": "Infoga kolumn efter aktuell",
-        "Insert a new column before the current one": "Infoga kolumn före aktuell",
-        "Insert a new row after the current one": "Infoga ny rad efter aktuell",
-        "Insert a new row before the current one": "Infoga ny rad före aktuell",
-        "Insert a paragraph after the current node": "Infoga paragraf efter aktuell nod",
-        "Insert a paragraph before the current node": "Infoga paragraf före aktuell nod",
-        "Insert paragraph after": "Infoga paragraf efter",
-        "Insert paragraph before": "Infoga paragraf före",
-        "Justify Center": "_Centerjustera",
-        "Justify Full": "Block_justera",
-        "Justify Left": "_Vänsterjustera",
-        "Justify Right": "_Högerjustera",
-        "Link points to:": "Länken pekar mot:",
-        "Make lin_k...": "Skapa län_k...",
-        "Opens this link in a new window": "Öppna länk i nytt fönster",
-        "Paste": "Klistra in",
-        "Please confirm that you want to remove this element:": "Bekräfta borttagning av element:",
-        "Please confirm that you want to unlink this element.": "Bekräfta borttagning av länk",
-        "Remove the $elem Element...": "Radera elementet $elem...",
-        "Remove this node from the document": "Radera nod från dokumentet",
-        "Ro_w Properties...": "Radegenskaper... (_w)",
-        "Show the Table Cell Properties dialog": "Visa egenskaper for cellen",
-        "Show the Table Properties dialog": "Visa tabellegenskaper",
-        "Show the Table Row Properties dialog": "Visa egenskaper för rad",
-        "Show the image properties dialog": "Visa bildegenskaper",
-        "Unlink the current element": "Ta bort länk kopplad till elementet",
-        "_Delete Row": "Radera rad (_d)",
-        "_Image Properties...": "_Bildegenskaper...",
-        "_Modify Link...": "_Redigera Länk...",
-        "_Remove Link...": "_Ta bort länk...",
-        "_Table Properties...": "_Tabellegenskaper..."
-    },
-    "CreateLink": {
-        "Cancel": "Avbryt",
-        "Insert/Modify Link": "Redigera länk",
-        "New window (_blank)": "Nytt fönster (_blank)",
-        "None (use implicit)": "Ingen (använd standardinställing)",
-        "OK": "OK",
-        "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 need to select some text before creating a link": "Du måsta markera ett objekt att applicera länken på!"
-    },
-    "EditTag": {
-        "Cancel": "Avbryt",
-        "OK": "OK"
-    },
-    "Equation": {
-        "Cancel": "Avbryt",
-        "OK": "OK",
-        "Preview": "Förhandsgranska"
-    },
-    "ExtendedFileManager": {
-        "Align": "Justera",
-        "Baseline": "Baslinje",
-        "Border": "Kantlinje",
-        "Bottom": "Botten",
-        "Cancel": "Avbryt",
-        "Clear": "Töm",
-        "Color": "Färg",
-        "Copy": "Kopiera",
-        "Crop": "Beskjär",
-        "Cut": "Klipp ut",
-        "Height": "Höjd",
-        "Height:": "Höjd:",
-        "Left": "Venster",
-        "Margin": "Marginal",
-        "Middle": "Mitten",
-        "New window (_blank)": "Nytt fönster (_blank)",
-        "None (use implicit)": "Ingen (använd standardinställing)",
-        "OK": "OK",
-        "Padding": "Luft",
-        "Positioning of this image": "Bildens positionering",
-        "Preview": "Förhandsgranska",
-        "Right": "Höger",
-        "Same frame (_self)": "Samma ram (_self)",
-        "Title (tooltip)": "Titel (tooltip):",
-        "Top": "Överkant",
-        "Top frame (_top)": "Toppram (_top)",
-        "Width": "Bredd",
-        "Width:": "Bredd:"
-    },
-    "FindReplace": {
-        "Case sensitive search": "Skilj mellan stora och små bokstäver",
-        "Clear": "Töm",
-        "Done": "Färdig",
-        "Enter the text you want to find": "Skriv in text du vill söka",
-        "Find and Replace": "Sök och ersätt",
-        "Highlight": "Markera",
-        "Inform a replacement word": "Skriv in ett ersättningsord",
-        "Next": "Nästa",
-        "Options": "Välj",
-        "Replace with:": "Ersätt med:",
-        "Search for:": "Sök efter:",
-        "Substitute all occurrences": "Erstatt alla träffar",
-        "Substitute this occurrence?": "Ersätt denna?",
-        "Undo": "Tillbaka",
-        "Whole words only": "Bara hela ord",
-        "found item": "Träff",
-        "found items": "förekomster funna i sökningen",
-        "not found": "inte funnet",
-        "replaced item": "erstatt träff",
-        "replaced items": "förekomster erstatta"
-    },
-    "Forms": {
-        "Cancel": "Avbryt",
-        "Image URL:": "Bildens URL:",
-        "OK": "OK",
-        "Options": "Välj",
-        "Rows:": "Rader:",
-        "Size:": "Storlek"
-    },
-    "FullPage": {
-        "Cancel": "Avbryt",
-        "Description:": "Beskrivning",
-        "OK": "OK"
-    },
-    "FullScreen": {
-        "Maximize/Minimize Editor": "Maximera/Minimera WYSIWYG fönster"
-    },
-    "HorizontalRule": {
-        "Alignment:": "Placering:",
-        "Cancel": "Avbryt",
-        "Center": "Centrera",
-        "Color:": "Färg",
-        "Height:": "Höjd:",
-        "Horizontal Rule": "Vågrät linje",
-        "Layout": "Layout",
-        "Left": "Venster",
-        "OK": "OK",
-        "Right": "Höger",
-        "Width:": "Bredd:",
-        "percent": "procent",
-        "pixels": "bildpunkter"
-    },
-    "ImageManager": {
-        "Baseline": "Baslinje",
-        "Bottom": "Botten",
-        "Cancel": "Avbryt",
-        "Clear": "Töm",
-        "Crop": "Beskjär",
-        "Height:": "Höjd:",
-        "Insert Image": "Infoga bild",
-        "Left": "Venster",
-        "Middle": "Mitten",
-        "OK": "OK",
-        "Positioning of this image": "Bildens positionering",
-        "Right": "Höger",
-        "Top": "Överkant",
-        "Width:": "Bredd:"
-    },
-    "InlineStyler": {
-        "Background": "Bakgrund",
-        "Baseline": "Baslinje",
-        "Border": "Kantlinje",
-        "Bottom": "Botten",
-        "Center": "Centrera",
-        "Char": "Tecken",
-        "Collapsed borders": "Osynliga kantlinjer",
-        "FG Color": "Förgrundsfärg",
-        "Float": "Flytande",
-        "Height": "Höjd",
-        "Image URL": "Bildens URL",
-        "Justify": "Justera",
-        "Layout": "Layout",
-        "Left": "Venster",
-        "Margin": "Marginal",
-        "Middle": "Mitten",
-        "None": "Ingen",
-        "Padding": "Luft",
-        "Right": "Höger",
-        "Text align": "Justera text",
-        "Top": "Överkant",
-        "Vertical align": "Vertikal justering",
-        "Width": "Bredd",
-        "percent": "procent",
-        "pixels": "bildpunkter"
-    },
-    "InsertAnchor": {
-        "Cancel": "Avbryt",
-        "OK": "OK"
-    },
-    "InsertImage": {
-        "Alignment:": "Placering:",
-        "Alternate text:": "Alternativ text:",
-        "Baseline": "Baslinje",
-        "Border thickness:": "Ramtjocklek:",
-        "Bottom": "Botten",
-        "Cancel": "Avbryt",
-        "Enter the image URL here": "Bildens sökväg (URL)",
-        "For browsers that don't support images": "Beskrivande text för webläsare som inte stödjer inbäddade bilder",
-        "Horizontal padding": "Horizontellt indrag på bild",
-        "Horizontal:": "Horisontell:",
-        "Image Preview:": "Förhandsgranskning:",
-        "Image URL:": "Bildens URL:",
-        "Insert Image": "Infoga bild",
-        "Layout": "Layout",
-        "Leave empty for no border": "Lämna tomt för att undvika ram",
-        "Left": "Venster",
-        "Middle": "Mitten",
-        "OK": "OK",
-        "Positioning of this image": "Bildens positionering",
-        "Preview": "Förhandsgranska",
-        "Preview the image in a new window": "Öppna bild i nytt fönster",
-        "Right": "Höger",
-        "Spacing": "Mellanrum",
-        "Top": "Överkant",
-        "Vertical padding": "Vertikalt indrag på bild",
-        "Vertical:": "Vertikal:"
-    },
-    "InsertMarquee": {
-        "Cancel": "Avbryt",
-        "Height:": "Höjd:",
-        "Left": "Venster",
-        "OK": "OK",
-        "Right": "Höger",
-        "Width:": "Bredd:"
-    },
-    "InsertNote": {
-        "Cancel": "Avbryt"
-    },
-    "InsertPicture": {
-        "Alignment:": "Placering:",
-        "Alternate text:": "Alternativ text:",
-        "Baseline": "Baslinje",
-        "Border thickness:": "Ramtjocklek:",
-        "Bottom": "Botten",
-        "Cancel": "Avbryt",
-        "Enter the image URL here": "Bildens sökväg (URL)",
-        "For browsers that don't support images": "Beskrivande text för webläsare som inte stödjer inbäddade bilder",
-        "Height:": "Höjd:",
-        "Horizontal padding": "Horizontellt indrag på bild",
-        "Horizontal:": "Horisontell:",
-        "Image Preview:": "Förhandsgranskning:",
-        "Image URL:": "Bildens URL:",
-        "Insert Image": "Infoga bild",
-        "Layout": "Layout",
-        "Leave empty for no border": "Lämna tomt för att undvika ram",
-        "Leave empty for not defined": "Lämna tomt för att låta webläsaren bestämma",
-        "Left": "Venster",
-        "Middle": "Mitten",
-        "OK": "OK",
-        "Positioning of this image": "Bildens positionering",
-        "Preview": "Förhandsgranska",
-        "Preview the image in a new window": "Öppna bild i nytt fönster",
-        "Right": "Höger",
-        "Size": "Storlek",
-        "Spacing": "Marginal",
-        "Top": "Överkant",
-        "Upload file": "Ladda upp bild",
-        "Vertical padding": "Vertikalt indrag på bild",
-        "Vertical:": "Vertikal:",
-        "Width:": "Bredd:"
-    },
-    "InsertSnippet": {
-        "Cancel": "Avbryt"
-    },
-    "InsertSnippet2": {
-        "Cancel": "Avbryt"
-    },
-    "InsertTable": {
-        "Alignment:": "Placering:",
-        "Baseline": "Baslinje",
-        "Border": "Kantlinje",
-        "Border thickness:": "Ramtjocklek:",
-        "Bottom": "Botten",
-        "Cancel": "Avbryt",
-        "Caption": "Överskrift",
-        "Cell padding:": "Cellindrag:",
-        "Cell spacing:": "Cellmarginaler:",
-        "Cols:": "Kolumner:",
-        "Fixed width columns": "Fixerad bredd",
-        "Insert Table": "Infoga tabell",
-        "Layout": "Layout",
-        "Leave empty for no border": "Lämna tomt för att undvika ram",
-        "Left": "Venster",
-        "Middle": "Mitten",
-        "Number of columns": "Antal kolumner",
-        "Number of rows": "Antal rader",
-        "OK": "OK",
-        "Percent": "Procent",
-        "Pixels": "Pixlar",
-        "Positioning of this table": "Tabellposition",
-        "Right": "Höger",
-        "Rows:": "Rader:",
-        "Space between adjacent cells": "Utrymme mellan celler",
-        "Space between content and border in cell": "Utrymme mellan ram och cellinnehåll",
-        "Spacing": "Mellanrum",
-        "Top": "Överkant",
-        "Width of the table": "Tabellbredd",
-        "Width unit": "Breddenheter",
-        "Width:": "Bredd:",
-        "You must enter a number of columns": "Ange antal kolumner",
-        "You must enter a number of rows": "Ange ental rader"
-    },
-    "Linker": {
-        "Cancel": "Avbryt",
-        "Insert/Modify Link": "Redigera länk",
-        "OK": "OK",
-        "Size:": "Storlek",
-        "Target:": "Mål:",
-        "URL:": "Sökväg:"
-    },
-    "ListType": {
-        "Choose list style type (for ordered lists)": "Välj listtyp (för numrerade listor)",
-        "Decimal numbers": "Desimaltal",
-        "Lower greek letters": "Små grekiska bokstäver",
-        "Lower latin letters": "Små latinska bokstäver",
-        "Lower roman numbers": "Små romerska siffror",
-        "Upper latin letters": "Stora latinska bokstäver",
-        "Upper roman numbers": "Stora romerska siffror"
-    },
-    "NoteServer": {
-        "Cancel": "Avbryt",
-        "Image Preview": "Förhandsgranskning:",
-        "OK": "OK",
-        "Options": "Välj",
-        "Preview": "Förhandsgranska",
-        "Preview the image in a new window": "Öppna bild i nytt fönster"
-    },
-    "Opera": {
-        "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."
-    },
-    "PSLocal": {
-        "Cancel": "Avbryt"
-    },
-    "PasteText": {
-        "Cancel": "Avbryt",
-        "OK": "OK"
-    },
-    "PersistentStorage": {
-        "Cancel": "Avbryt",
-        "Copy": "Kopiera",
-        "Insert Image": "Infoga bild"
-    },
-    "QuickTag": {
-        "Cancel": "Avbryt"
-    },
-    "SetId": {
-        "Cancel": "Avbryt",
-        "OK": "OK"
-    },
-    "SmartReplace": {
-        "OK": "OK"
-    },
-    "SpellChecker": {
-        "Cancel": "Avbryt",
-        "OK": "OK",
-        "Replace with": "Ersätt med:"
-    },
-    "SuperClean": {
-        "Cancel": "Avbryt",
-        "OK": "OK"
-    },
-    "TableOperations": {
-        "All four sides": "Alla fyra sidor",
-        "Borders": "Kantlinjer",
-        "Cancel": "Avbryt",
-        "Caption": "Överskrift",
-        "Cell Properties": "Cellegenskaper",
-        "Cell properties": "Egenskaper for cell",
-        "Delete cell": "Radera cell",
-        "Delete column": "Radera kolumn",
-        "Delete row": "Radera rad",
-        "Description": "Beskrivning",
-        "Frames": "ramar",
-        "Insert cell after": "Infoga cell efter",
-        "Insert cell before": "Infoga cell före",
-        "Insert column after": "Infoga kolumn efter",
-        "Insert column before": "Infoga kolumn före",
-        "Insert row after": "Infoga rad efter",
-        "Insert row before": "Infoga rad före",
-        "Merge cells": "Slå samman celler",
-        "No rules": "Ingen linjal",
-        "No sides": "Inga sidor",
-        "OK": "OK",
-        "Padding": "Luft",
-        "Please click into some cell": "Klicka i valfri cell",
-        "Row Properties": "Egenskaper for rad",
-        "Row properties": "Egenskaper för rad",
-        "Rows": "Rader:",
-        "Rules will appear between all rows and columns": "Linjaler kommer att synas mellan alla rader och kolumner",
-        "Rules will appear between columns only": "Linjaler kommer enbart synas mellan kolumner",
-        "Rules will appear between rows only": "Linjaler kommer enbart synas mellan rader",
-        "Spacing": "Mellanrum",
-        "Spacing and padding": "Mellanrum och luft",
-        "Split column": "Dela kolumn",
-        "Split row": "Dela rad",
-        "Summary": "Sammandrag",
-        "Table Properties": "Tabellegenskaper",
-        "Table properties": "Tabellegenskaper",
-        "The bottom side only": "Nederkanten enbart",
-        "The left-hand side only": "Vänstersidan enbart",
-        "The right and left sides only": "Höger- och vänstersidan enbart",
-        "The right-hand side only": "Högersidan enbart",
-        "The top and bottom sides only": "Över- och nederkanten enbart",
-        "The top side only": "Överkanten enbart",
-        "Xinha cowardly refuses to delete the last cell in row.": "Xinha nekar att radera sista cellen i tabellen.",
-        "Xinha cowardly refuses to delete the last column in table.": "Xinha nekar att radera sista kolumnen i tabellen.",
-        "Xinha cowardly refuses to delete the last row in table.": "Xinha nekar att radera sista raden i tabellen.",
-        "pixels": "bildpunkter"
-    },
-    "Template": {
-        "Cancel": "Avbryt"
-    },
-    "UnFormat": {
-        "Cancel": "Avbryt",
-        "OK": "OK"
-    },
-    "Xinha": {
-        "About this editor": "Om denna editor",
-        "Background Color": "Bakgrundsfärg",
-        "Bold": "Fet",
-        "Bulleted List": "Punktlista",
-        "Clean content pasted from Word": "Rensa innehåll inklistrat från MS Word",
-        "Clear Inline Font Specifications": "Rensa inbäddad typsnittsinformation",
-        "Clear MSOffice tags": "Städa bort MS Office taggar",
-        "Close": "Stäng",
-        "Copy selection": "Kopiera  markering",
-        "Create Toolbar": "Skapar verktygspanel",
-        "Current style": "Nuvarande stil",
-        "Cut selection": "Klipp ut markering",
-        "Decrease Indent": "Minska indrag",
-        "Direction left to right": "Vänster till höger",
-        "Direction right to left": "Höger till vänster",
-        "Font Color": "Textfärg",
-        "Headings": "Skapa standardrubrik",
-        "Help using editor": "Hjälp",
-        "Horizontal Rule": "Vågrät linje",
-        "Increase Indent": "Öka indrag",
-        "Insert Table": "Infoga tabell",
-        "Insert Web Link": "Infoga länk",
-        "Insert/Modify Image": "Infoga bild",
-        "Insert/Overwrite": "Infoga/Skriv över",
-        "Italic": "Kursiv",
-        "Justify Center": "Centrera",
-        "Justify Full": "Marginaljustera",
-        "Justify Left": "Vänsterjustera",
-        "Justify Right": "Högerjustera",
-        "Keyboard shortcuts": "Snabbtangenter",
-        "Ordered List": "Numrerad lista",
-        "Paste from clipboard": "Klistra in",
-        "Path": "Objekt",
-        "Print document": "Skriv ut",
-        "Redoes your last action": "Upprepa kommando",
-        "Remove formatting": "Rensa formattering",
-        "Select all": "Markera allt",
-        "Set format to paragraph": "Aktivera paragrafläge",
-        "Split Block": "Dela block",
-        "Strikethrough": "Genomstruken",
-        "Subscript": "Nedsänkt",
-        "Superscript": "Upphöjd",
-        "The editor provides the following key combinations:": "Editorn nyttjar följande kombinationer:",
-        "Toggle Borders": "Objektramar",
-        "Toggle HTML Source": "Visa källkod",
-        "Underline": "Understruken",
-        "Undoes your last action": "Ångra kommando",
-        "Would you like to clear font colours?": "Ta bort all textfärger ?",
-        "Would you like to clear font sizes?": "Radera alla fontstorlekar ?",
-        "Would you like to clear font typefaces?": "Radera alla typsnittsinformation ?",
-        "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",
-        "insert linebreak": "Infoga radbrytning ",
-        "new paragraph": "Ny paragraf "
-    },
-    "__NEW_TRANSLATIONS__": {
-        "Abbreviation": {
-            "Abbreviation": "",
-            "Delete": "",
-            "Expansion:": ""
-        },
-        "CharCounter": {
-            "... in progress": "",
-            "Chars": "",
-            "HTML": "",
-            "Words": ""
-        },
-        "ColorPicker": {
-            "Click a color...": "",
-            "Sample": "",
-            "Web Safe: ": ""
-        },
-        "ContextMenu": {
-            "Delete Cell": "",
-            "Insert Cell After": "",
-            "Insert Cell Before": "",
-            "Merge Cells": ""
-        },
-        "CreateLink": {
-            "Are you sure you wish to remove this link?": ""
-        },
-        "DefinitionList": {
-            "definition description": "",
-            "definition list": "",
-            "definition term": ""
-        },
-        "Dialogs": {
-            "Some Text Here": ""
-        },
-        "DynamicCSS": {
-            "Choose stylesheet": "",
-            "Default": "",
-            "Undefined": ""
-        },
-        "EditTag": {
-            "Edit HTML for selected text": "",
-            "Edit Tag By Peg": "",
-            "Tag Editor": ""
-        },
-        "Equation": {
-            "!=": "",
-            "!in": "",
-            "&gt;-": "",
-            "&gt;=": "",
-            "&lt;=": "",
-            "&lt;=&gt;": "",
-            "&lt;x&gt;": "",
-            "&nbsp; `!` &nbsp;": "",
-            "&nbsp; `.` &nbsp;": "",
-            "&nbsp; `0` &nbsp;": "",
-            "&nbsp; `2` &nbsp;": "",
-            "&nbsp; `3` &nbsp;": "",
-            "&nbsp; `4` &nbsp;": "",
-            "&nbsp; `5` &nbsp;": "",
-            "&nbsp; `6` &nbsp;": "",
-            "&nbsp; `7` &nbsp;": "",
-            "&nbsp; `8` &nbsp;": "",
-            "&nbsp; `9` &nbsp;": "",
-            "&nbsp; `e` &nbsp;": "",
-            "&nbsp;&nbsp;`1` &nbsp;": "",
-            "&nbsp;`+{::}`&nbsp;": "",
-            "&nbsp;`-:\\ `": "",
-            "&nbsp;`-{::}`&nbsp;": "",
-            "&nbsp;`C`&nbsp;": "",
-            "&nbsp;`cos`": "",
-            "&nbsp;`ln`&nbsp;": "",
-            "&nbsp;`pi` &nbsp;": "",
-            "&nbsp;`sin`": "",
-            "&nbsp;`tan`": "",
-            "&nbsp;`times`&nbsp;": "",
-            "&quot;text&quot;": "",
-            "'+formula+'": "",
-            "((n),(k))": "",
-            "(x+1)/(x-1)": "",
-            "*": "",
-            "**": "",
-            "+-": "",
-            "-&gt;": "",
-            "-&lt;": "",
-            "-:": "",
-            "-=": "",
-            "//": "",
-            "/_": "",
-            ":.": "",
-            "=&gt;": "",
-            "@": "",
-            "[[a,b],[c,d]]": "",
-            "\\\\": "",
-            "\\nClick in the box to use your keyboard or use the buttons\\n": "",
-            "^^": "",
-            "^^^": "",
-            "__|": "",
-            "_|_": "",
-            "`!=`": "",
-            "`!in`": "",
-            "`&and;`": "",
-            "`&cap;`": "",
-            "`&cup;`": "",
-            "`&gt;-`": "",
-            "`&gt;=`": "",
-            "`&lt;=&gt;`": "",
-            "`&lt;=`": "",
-            "`&lt;x&gt;`": "",
-            "`&or;`": "",
-            "`&quot;text&quot;`": "",
-            "`((n),(k))`": "",
-            "`(x+1)/(x-1)`": "",
-            "`**`": "",
-            "`*`": "",
-            "`+-`": "",
-            "`-&gt;`": "",
-            "`-&lt;`": "",
-            "`-:`": "",
-            "`-=`": "",
-            "`//`": "",
-            "`/_`": "",
-            "`:.`": "",
-            "`=&gt;`": "",
-            "`@`": "",
-            "`[[a,b],[c,d]]`": "",
-            "`\\\\`": "",
-            "`__|`": "",
-            "`_|_`": "",
-            "`AA`": "",
-            "`aleph`": "",
-            "`alpha`": "",
-            "`and`": "",
-            "`bara`": "",
-            "`bba`": "",
-            "`bbba`": "",
-            "`beta`": "",
-            "`CC`": "",
-            "`cca`": "",
-            "`chi`": "",
-            "`darr`": "",
-            "`ddota`": "",
-            "`del`": "",
-            "`Delta`": "",
-            "`delta`": "",
-            "`diamond`": "",
-            "`dota`": "",
-            "`dy/dx`": "",
-            "`EE`": "",
-            "`epsi`": "",
-            "`eta`": "",
-            "`fra`": "",
-            "`Gamma`": "",
-            "`gamma`": "",
-            "`grad`": "",
-            "`harr`": "",
-            "`hArr`": "",
-            "`hata`": "",
-            "`if`": "",
-            "`in`": "",
-            "`int`": "",
-            "`iota`": "",
-            "`kappa`": "",
-            "`lambda`": "",
-            "`Lambda`": "",
-            "`lArr`": "",
-            "`larr`": "",
-            "`lim_(x-&gt;oo)`": "",
-            "`log`": "",
-            "`mu`": "",
-            "`NN`": "",
-            "`nn`": "",
-            "`not`": "",
-            "`nu`": "",
-            "`o+`": "",
-            "`o.`": "",
-            "`O/`": "",
-            "`oint`": "",
-            "`omega`": "",
-            "`Omega`": "",
-            "`oo`": "",
-            "`or`": "",
-            "`ox`": "",
-            "`Phi`": "",
-            "`phi`": "",
-            "`Pi`": "",
-            "`pi`": "",
-            "`prod`": "",
-            "`prop`": "",
-            "`Psi`": "",
-            "`psi`": "",
-            "`QQ`": "",
-            "`quad`": "",
-            "`rArr`": "",
-            "`rho`": "",
-            "`root(n)(x)`": "",
-            "`RR`": "",
-            "`sfa`": "",
-            "`sigma`": "",
-            "`Sigma`": "",
-            "`sqrt(x)`": "",
-            "`square`": "",
-            "`stackrel(-&gt;)(+)`": "",
-            "`sub`": "",
-            "`sube`": "",
-            "`sum`": "",
-            "`sup`": "",
-            "`supe`": "",
-            "`tau`": "",
-            "`Theta`": "",
-            "`theta`": "",
-            "`TT`": "",
-            "`tta`": "",
-            "`uarr`": "",
-            "`ula`": "",
-            "`upsilon`": "",
-            "`uu`": "",
-            "`veca`": "",
-            "`vv`": "",
-            "`x_(mn)`": "",
-            "`Xi`": "",
-            "`xi`": "",
-            "`xx`": "",
-            "`zeta`": "",
-            "`ZZ`": "",
-            "`|-&gt;`": "",
-            "`|--`": "",
-            "`|==`": "",
-            "`|__`": "",
-            "`|~`": "",
-            "`~=`": "",
-            "`~|`": "",
-            "`~~`": "",
-            "AA": "",
-            "aleph": "",
-            "alpha": "",
-            "and": "",
-            "AsciiMath Formula Input": "",
-            "AsciiMathML Example": "",
-            "bara": "",
-            "Based on ASCIIMathML by": "",
-            "bba": "",
-            "bbba": "",
-            "beta": "",
-            "CC": "",
-            "cca": "",
-            "chi": "",
-            "darr": "",
-            "ddota": "",
-            "del": "",
-            "Delta": "",
-            "delta": "",
-            "diamond": "",
-            "dota": "",
-            "dy/dx": "",
-            "EE": "",
-            "epsi": "",
-            "eta": "",
-            "For more information on AsciiMathML visit this page:": "",
-            "Formula Editor": "",
-            "fra": "",
-            "gamma": "",
-            "Gamma": "",
-            "grad": "",
-            "hArr": "",
-            "harr": "",
-            "hata": "",
-            "if": "",
-            "in": "",
-            "Input": "",
-            "int": "",
-            "int_a^bf(x)dx": "",
-            "iota": "",
-            "kappa": "",
-            "Lambda": "",
-            "lambda": "",
-            "larr": "",
-            "lArr": "",
-            "lim_(x-&gt;oo)": "",
-            "mu": "",
-            "NN": "",
-            "nn": "",
-            "nnn": "",
-            "not": "",
-            "nu": "",
-            "o+": "",
-            "o.": "",
-            "O/": "",
-            "oint": "",
-            "omega": "",
-            "Omega": "",
-            "oo": "",
-            "or": "",
-            "ox": "",
-            "Phi": "",
-            "phi": "",
-            "pi": "",
-            "Pi": "",
-            "prod": "",
-            "prop": "",
-            "psi": "",
-            "Psi": "",
-            "QQ": "",
-            "quad": "",
-            "rArr": "",
-            "rho": "",
-            "root(n)(x)": "",
-            "RR": "",
-            "sfa": "",
-            "sigma": "",
-            "Sigma": "",
-            "sqrt(x)": "",
-            "square": "",
-            "stackrel(-&gt;)(+)": "",
-            "sub": "",
-            "sube": "",
-            "sum": "",
-            "sum_(n=1)^oo": "",
-            "sup": "",
-            "supe": "",
-            "tau": "",
-            "Theta": "",
-            "theta": "",
-            "TT": "",
-            "tta": "",
-            "uarr": "",
-            "ula": "",
-            "upsilon": "",
-            "uu": "",
-            "uuu": "",
-            "veca": "",
-            "vv": "",
-            "vvv": "",
-            "x^(m+n)": "",
-            "x_(mn)": "",
-            "Xi": "",
-            "xi": "",
-            "xx": "",
-            "zeta": "",
-            "ZZ": "",
-            "|-&gt;": "",
-            "|--": "",
-            "|==": "",
-            "|__": "",
-            "|~": "",
-            "~=": "",
-            "~|": "",
-            "~~": ""
-        },
-        "FancySelects": {
-            "'+opt.text+'": ""
-        },
-        "FindReplace": {
-            "';\r\n  var tagc = '": ""
-        },
-        "FormOperations": {
-            "Enter the name for new option.": "",
-            "Form Editor": "",
-            "Insert a check box.": "",
-            "Insert a Form.": "",
-            "Insert a multi-line text field.": "",
-            "Insert a radio button.": "",
-            "Insert a select field.": "",
-            "Insert a submit/reset button.": "",
-            "Insert a text, password or hidden field.": "",
-            "Message Sent": "",
-            "Please Select...": ""
-        },
-        "Forms": {
-            "'onClick'=": "",
-            "Access Key:": "",
-            "Action URL:": "",
-            "Button Script": "",
-            "Checked": "",
-            "Columns:": "",
-            "Default text (optional)": "",
-            "Dimensions": "",
-            "Disabled": "",
-            "Encoding:": "",
-            "For Control:": "",
-            "Form": "",
-            "Form Element: FIELDSET": "",
-            "Form Element: INPUT": "",
-            "Form Element: LABEL": "",
-            "Form Element: SELECT": "",
-            "Form Element: TEXTAREA": "",
-            "Form handler script": "",
-            "Form Name:": "",
-            "Get": "",
-            "Hard": "",
-            "Height in number of rows": "",
-            "HTML-Form to CGI (default)": "",
-            "Image source": "",
-            "Initial Text:": "",
-            "Insert/Edit Form": "",
-            "Insert/Edit Form Element FIELDSET": "",
-            "Insert/Edit Form Element INPUT": "",
-            "Insert/Edit Form Element LABEL": "",
-            "Insert/Edit Form Element SELECT": "",
-            "Insert/Edit Form Element TEXTAREA": "",
-            "Javascript for button click": "",
-            "Label:": "",
-            "Legend:": "",
-            "Max length:": "",
-            "Maximum number of characters accepted": "",
-            "Method:": "",
-            "multipart Form Data (File-Upload)": "",
-            "Name": "",
-            "Name of the form input": "",
-            "Name of the form select": "",
-            "name of the textarea": "",
-            "Name/ID:": "",
-            "normal": "",
-            "nowrap": "",
-            "Off": "",
-            "Physical": "",
-            "Please enter a Label": "",
-            "Post": "",
-            "pre": "",
-            "Read Only": "",
-            "Size of text box in characters": "",
-            "Soft": "",
-            "Tab Index:": "",
-            "Target Frame:": "",
-            "Text:": "",
-            "URL of image": "",
-            "Value of the form input": "",
-            "Value:": "",
-            "Virtual": "",
-            "Width in number of characters": "",
-            "Wrap Mode:": "",
-            "You must enter a Name": ""
-        },
-        "FullPage": {
-            "...": "",
-            "Alternate style-sheet:": "",
-            "Background color:": "",
-            "Character set:": "",
-            "cyrillic (ISO-8859-5)": "",
-            "cyrillic (KOI8-R)": "",
-            "cyrillic (WINDOWS-1251)": "",
-            "DOCTYPE:": "",
-            "Document properties": "",
-            "Document title:": "",
-            "Keywords:": "",
-            "Primary style-sheet:": "",
-            "Text color:": "",
-            "UTF-8 (recommended)": "",
-            "western (ISO-8859-1)": ""
-        },
-        "Gecko": {
-            "The Paste button does not work in this browser for security reasons. Press CTRL-V on your keyboard to paste directly.": ""
-        },
-        "HorizontalRule": {
-            "&#x00d7;": "",
-            "&nbsp;": "",
-            "Insert/edit horizontal rule": "",
-            "Insert/Edit Horizontal Rule": "",
-            "No shading": "",
-            "Style": ""
-        },
-        "InlineStyler": {
-            "CSS Style": "",
-            "-": "<<Equation>>"
-        },
-        "InsertAnchor": {
-            "Anchor name": "",
-            "Insert Anchor": "",
-            "Delete": "<<Abbreviation>>"
-        },
-        "InsertImage": {
-            "Absbottom": "",
-            "Absmiddle": "",
-            "Not set": "",
-            "Texttop": "",
-            "You must enter the URL": ""
-        },
-        "InsertNote": {
-            "Insert": "",
-            "Insert footnote": "",
-            "Insert Note": ""
-        },
-        "InsertPagebreak": {
-            "Page break": "",
-            "Page Break": ""
-        },
-        "InsertSmiley": {
-            "Insert Smiley": ""
-        },
-        "InsertSnippet": {
-            "\\n  This is an information about something\\n": "",
-            "Hide preview": "",
-            "Insert as": "",
-            "Insert Snippet": "",
-            "InsertSnippet for Xinha": "",
-            "Link1": "",
-            "Link2": "",
-            "Link3": "",
-            "Link4": "",
-            "Link5": "",
-            "Show preview": "",
-            "This is an information about something": "",
-            "Variable": ""
-        },
-        "InsertSnippet2": {
-            "All Categories": "",
-            "Filter": "",
-            "Insert as HTML": "",
-            "Insert as template variable": "",
-            "Only search word beginning": "",
-            "HTML": "<<CharCounter>>",
-            "Insert Snippet": "<<InsertSnippet>>",
-            "InsertSnippet for Xinha": "<<InsertSnippet>>",
-            "Variable": "<<InsertSnippet>>"
-        },
-        "InsertTable": {
-            "Caption for the table": "",
-            "Collapse borders:": "",
-            "Em": "",
-            "Layou": "",
-            "Style of the border": "",
-            "Absbottom": "<<InsertImage>>",
-            "Absmiddle": "<<InsertImage>>",
-            "Not set": "<<InsertImage>>",
-            "Texttop": "<<InsertImage>>"
-        },
-        "LangMarks": {
-            "&mdash; language &mdash;": "",
-            "', '": "",
-            "English": "",
-            "French": "",
-            "Greek": "",
-            "language select": "",
-            "Latin": ""
-        },
-        "Linker": {
-            "(px)": "",
-            "Anchor-Link": "",
-            "Anchor:": "",
-            "Email Address:": "",
-            "Email Link": "",
-            "Location Bar:": "",
-            "Menu Bar:": "",
-            "Message Template:": "",
-            "New Window": "",
-            "Ordinary Link": "",
-            "Popup Window": "",
-            "PopupWindow": "",
-            "Remove Link": "",
-            "Resizeable:": "",
-            "Same Window (jump out of frames)": "",
-            "Scrollbars:": "",
-            "Shows On Hover": "",
-            "Status Bar:": "",
-            "Subject:": "",
-            "Title:": "",
-            "Toolbar:": "",
-            "URL Link": "",
-            "You must select some text before making a new link.": "",
-            "Are you sure you wish to remove this link?": "<<CreateLink>>",
-            "Name:": "<<Forms>>"
-        },
-        "MootoolsFileManager": {
-            "Insert File Link": "",
-            "You must select some text before making a new link.": "<<Linker>>"
-        },
-        "Opera": {
-            "MARK": ""
-        },
-        "PasteText": {
-            "Insert text in new paragraph": "",
-            "Paste as Plain Text": ""
-        },
-        "PreserveScripts": {
-            "JavaScript": "",
-            "PHP": ""
-        },
-        "QuickTag": {
-            "',\r\n                           'cl': '": "",
-            "ATTRIBUTES": "",
-            "Colors": "",
-            "Enter the TAG you want to insert": "",
-            "No CSS class avaiable": "",
-            "Ok": "",
-            "OPTIONS": "",
-            "Quick Tag Editor": "",
-            "TAGs": "",
-            "There are some unclosed quote": "",
-            "This attribute already exists in the TAG": "",
-            "You have to select some text": ""
-        },
-        "SaveSubmit": {
-            "in progress": "",
-            "Ready": "",
-            "Save": "",
-            "Saving...": ""
-        },
-        "SetId": {
-            "ID/Name:": "",
-            "Set Id and Name": "",
-            "Set Id/Name": "",
-            "Set ID/Name": "",
-            "Delete": "<<Abbreviation>>"
-        },
-        "SmartReplace": {
-            "ClosingDoubleQuotes": "",
-            "ClosingSingleQuote": "",
-            "Convert all quotes and dashes in the current document": "",
-            "Enable automatic replacements": "",
-            "OpeningDoubleQuotes": "",
-            "OpeningSingleQuote": "",
-            "SmartReplace": "",
-            "SmartReplace Settings": ""
-        },
-        "Stylist": {
-            "Styles": ""
-        },
-        "SuperClean": {
-            "Clean bad HTML from Microsoft Word.": "",
-            "Clean Selection Only": "",
-            "Clean up HTML": "",
-            "Cleaning Scope": "",
-            "General tidy up and correction of some problems.": "",
-            "Please select from the following cleaning options...": "",
-            "Please stand by while cleaning in process...": "",
-            "Remove alignment (left/right/justify).": "",
-            "Remove all classes (CSS).": "",
-            "Remove All HTML Tags": "",
-            "Remove all styles (CSS).": "",
-            "Remove custom font sizes.": "",
-            "Remove custom text colors.": "",
-            "Remove custom typefaces (font \"styles\").": "",
-            "Remove emphasis and annotations.": "",
-            "Remove lang attributes.": "",
-            "Remove Paragraphs": "",
-            "Remove superscripts and subscripts.": "",
-            "Replace directional quote marks with non-directional quote marks.": "",
-            "Vigorously purge HTML from Microsoft Word.": ""
-        },
-        "TableOperations": {
-            "Cell Type:": "",
-            "Cells down": "",
-            "Cells to the right, and": "",
-            "Do Not Change": "",
-            "Frame and borders": "",
-            "Header (th)": "",
-            "Merge current cell with:": "",
-            "Normal (td)": "",
-            "Columns": "<<Forms>>",
-            "Merge Cells": "<<ContextMenu>>"
-        },
-        "UnsavedChanges": {
-            "You have unsaved changes in the editor": ""
-        },
-        "WebKit": {
-            "The Paste button does not work in this browser for security reasons. Press CTRL-V on your keyboard to paste directly.": "<<Gecko>>"
-        },
-        "Xinha": {
-            "&#8212; font &#8212;": "",
-            "&#8212; format &#8212;": "",
-            "&#8212; size &#8212;": "",
-            "1 (8 pt)": "",
-            "2 (10 pt)": "",
-            "3 (12 pt)": "",
-            "4 (14 pt)": "",
-            "5 (18 pt)": "",
-            "6 (24 pt)": "",
-            "7 (36 pt)": "",
-            "Address": "",
-            "Arial": "",
-            "Constructing object": "",
-            "Courier New": "",
-            "Create Statusbar": "",
-            "CTRL-0 (zero)": "",
-            "CTRL-1 .. CTRL-6": "",
-            "CTRL-A": "",
-            "CTRL-B": "",
-            "CTRL-C": "",
-            "CTRL-E": "",
-            "CTRL-I": "",
-            "CTRL-J": "",
-            "CTRL-L": "",
-            "CTRL-N": "",
-            "CTRL-R": "",
-            "CTRL-S": "",
-            "CTRL-U": "",
-            "CTRL-V": "",
-            "CTRL-X": "",
-            "CTRL-Y": "",
-            "CTRL-Z": "",
-            "Editor Help": "",
-            "ENTER": "",
-            "Error Loading Xinha.  Developers, check the Error Console for information.": "",
-            "Finishing": "",
-            "Formatted": "",
-            "Generate Xinha framework": "",
-            "Georgia": "",
-            "Heading 1": "",
-            "Heading 2": "",
-            "Heading 3": "",
-            "Heading 4": "",
-            "Heading 5": "",
-            "Heading 6": "",
-            "Impact": "",
-            "Init editor size": "",
-            "Loading Core": "",
-            "Loading in progress. Please wait!": "",
-            "Loading plugin $plugin": "",
-            "Loading plugins": "",
-            "MS Word Cleaner": "",
-            "Normal": "",
-            "Register plugin $plugin": "",
-            "Save as": "",
-            "Select Color": "",
-            "SHIFT-ENTER": "",
-            "Tahoma": "",
-            "Times New Roman": "",
-            "Touch here first to activate editor.": "",
-            "Verdana": "",
-            "Waiting for Iframe to load...": "",
-            "WingDings": "",
-            "Xinha": ""
-        },
-        "BackgroundImage": {
-            "__ TRANSLATOR NOTE __": "*** BACKGROUNDIMAGE IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***",
-            "Remove Current Background": "",
-            "Set Background": "",
-            "Set page background image": "",
-            "Set Page Background Image": ""
-        },
-        "ClientsideSpellcheck": {
-            "__ TRANSLATOR NOTE __": "*** CLIENTSIDESPELLCHECK IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***",
-            "Spell Check using ieSpell": ""
-        },
-        "ExtendedFileManager": {
-            "__ TRANSLATOR NOTE __": "*** EXTENDEDFILEMANAGER IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***",
-            "10%": "",
-            "100%": "",
-            "200%": "",
-            "25%": "",
-            "50%": "",
-            "75%": "",
-            ">List View": "",
-            ">Thumbnail View": "",
-            "A:": "",
-            "Alt": "",
-            "Border Color": "",
-            "Constrain Proportions": "",
-            "D:": "",
-            "Directory": "",
-            "Directory Up": "",
-            "Edit": "",
-            "File List": "",
-            "File Manager": "",
-            "Filename:": "",
-            "Filesize:": "",
-            "Flip Horizontal": "",
-            "Flip Image": "",
-            "Flip Vertical": "",
-            "Folder": "",
-            "GIF": "",
-            "GIF format is not supported, image editing not supported.": "",
-            "H:": "",
-            "Image Editor": "",
-            "Image Selection": "",
-            "Invalid base directory:": "",
-            "JPEG High": "",
-            "JPEG Low": "",
-            "JPEG Medium": "",
-            "Loading": "",
-            "Lock": "",
-            "Marker": "",
-            "Maximum folder size limit reached. Upload disabled.": "",
-            "Measure": "",
-            "New Folder": "",
-            "No Files Found": "",
-            "No Image Available": "",
-            "Please enter value": "",
-            "PNG": "",
-            "Preset": "",
-            "Quality:": "",
-            "Refresh": "",
-            "Rename": "",
-            "Resize": "",
-            "Rotate": "",
-            "Rotate 180 &deg;": "",
-            "Rotate 90 &deg; CCW": "",
-            "Rotate 90 &deg; CW": "",
-            "Rotate Image": "",
-            "Start X:": "",
-            "Start Y:": "",
-            "Target Window": "",
-            "Toggle marker color": "",
-            "Trash": "",
-            "Upload": "",
-            "W:": "",
-            "X:": "",
-            "Xinha Image Editor": "",
-            "Y:": "",
-            "Zoom": "",
-            "Absbottom": "<<InsertImage>>",
-            "Absmiddle": "<<InsertImage>>",
-            "Insert File Link": "<<MootoolsFileManager>>",
-            "Not set": "<<InsertImage>>",
-            "Save": "<<SaveSubmit>>",
-            "Texttop": "<<InsertImage>>",
-            "You must select some text before making a new link.": "<<Linker>>"
-        },
-        "Filter": {
-            "__ TRANSLATOR NOTE __": "*** FILTER IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***",
-            "Filter": "<<InsertSnippet2>>"
-        },
-        "HtmlTidy": {
-            "__ TRANSLATOR NOTE __": "*** HTMLTIDY IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***",
-            "Auto-Tidy": "",
-            "Don't Tidy": "",
-            "HTML Tidy": "",
-            "Tidy failed.  Check your HTML for syntax errors.": ""
-        },
-        "ImageManager": {
-            "__ TRANSLATOR NOTE __": "*** IMAGEMANAGER IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***",
-            "Angle:": "",
-            "Flickr Picture List": "",
-            "Flickr Pictures": "",
-            "Flickr Selection": "",
-            "Flickr Username/Email": "",
-            "Folder Name:": "",
-            "Image Format": "",
-            "Image List": "",
-            "Keyword": "",
-            "No Images Found": "",
-            "No Photos Found": "",
-            "No Videos Found": "",
-            "This Server": "",
-            "YouTube Selection": "",
-            "YouTube Username": "",
-            "YouTube Video List": "",
-            "YouTube Videos": "",
-            "A:": "<<ExtendedFileManager>>",
-            "Absbottom": "<<InsertImage>>",
-            "Absmiddle": "<<InsertImage>>",
-            "Constrain Proportions": "<<ExtendedFileManager>>",
-            "D:": "<<ExtendedFileManager>>",
-            "Directory": "<<ExtendedFileManager>>",
-            "Directory Up": "<<ExtendedFileManager>>",
-            "Edit": "<<ExtendedFileManager>>",
-            "Filename:": "<<ExtendedFileManager>>",
-            "Flip Horizontal": "<<ExtendedFileManager>>",
-            "Flip Image": "<<ExtendedFileManager>>",
-            "Flip Vertical": "<<ExtendedFileManager>>",
-            "GIF": "<<ExtendedFileManager>>",
-            "GIF format is not supported, image editing not supported.": "<<ExtendedFileManager>>",
-            "H:": "<<ExtendedFileManager>>",
-            "Image Editor": "<<ExtendedFileManager>>",
-            "Image Selection": "<<ExtendedFileManager>>",
-            "Invalid base directory:": "<<ExtendedFileManager>>",
-            "JPEG High": "<<ExtendedFileManager>>",
-            "JPEG Low": "<<ExtendedFileManager>>",
-            "JPEG Medium": "<<ExtendedFileManager>>",
-            "Lock": "<<ExtendedFileManager>>",
-            "Marker": "<<ExtendedFileManager>>",
-            "Measure": "<<ExtendedFileManager>>",
-            "New Folder": "<<ExtendedFileManager>>",
-            "No Image Available": "<<ExtendedFileManager>>",
-            "Not set": "<<InsertImage>>",
-            "PNG": "<<ExtendedFileManager>>",
-            "Quality:": "<<ExtendedFileManager>>",
-            "Refresh": "<<ExtendedFileManager>>",
-            "Resize": "<<ExtendedFileManager>>",
-            "Rotate": "<<ExtendedFileManager>>",
-            "Rotate 180 &deg;": "<<ExtendedFileManager>>",
-            "Rotate 90 &deg; CCW": "<<ExtendedFileManager>>",
-            "Rotate 90 &deg; CW": "<<ExtendedFileManager>>",
-            "Rotate Image": "<<ExtendedFileManager>>",
-            "Save": "<<SaveSubmit>>",
-            "Start X:": "<<ExtendedFileManager>>",
-            "Start Y:": "<<ExtendedFileManager>>",
-            "Texttop": "<<InsertImage>>",
-            "Trash": "<<ExtendedFileManager>>",
-            "W:": "<<ExtendedFileManager>>",
-            "X:": "<<ExtendedFileManager>>",
-            "Y:": "<<ExtendedFileManager>>"
-        },
-        "InsertMarquee": {
-            "__ TRANSLATOR NOTE __": "*** INSERTMARQUEE IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***",
-            "Alternate": "",
-            "Background-Color:": "",
-            "Behavior:": "",
-            "Continuous": "",
-            "Direction:": "",
-            "Insert scrolling marquee": "",
-            "Marquee Editor": "",
-            "Scroll Amount:": "",
-            "Scroll Delay:": "",
-            "Slide": "",
-            "Speed Control": "",
-            "Name": "<<Forms>>",
-            "Name/ID:": "<<Forms>>",
-            "Text:": "<<Forms>>"
-        },
-        "InsertPicture": {
-            "__ TRANSLATOR NOTE __": "*** INSERTPICTURE IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***",
-            " Open file in new window": "",
-            "Open file in new window": "",
-            "Absbottom": "<<InsertImage>>",
-            "Absmiddle": "<<InsertImage>>",
-            "Not set": "<<InsertImage>>",
-            "Texttop": "<<InsertImage>>"
-        },
-        "NoteServer": {
-            "__ TRANSLATOR NOTE __": "*** NOTESERVER IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***",
-            "120%": "",
-            "150%": "",
-            "80%": "",
-            "Add GUIDO Code in a textbox on the page": "",
-            "Add MIDI link to allow students to hear the music": "",
-            "Format": "",
-            "Guido code": "",
-            "GUIDO Code": "",
-            "Image in applet": "",
-            "Insert GUIDO Music Notation": "",
-            "MIDI File": "",
-            "Source Code": "",
-            "With Mozilla, the applet will not be visible in editor, but only in Web page after submitting.": "",
-            "Zoom :": "",
-            "100%": "<<ExtendedFileManager>>",
-            "Zoom": "<<ExtendedFileManager>>"
-        },
-        "PSLocal": {
-            "__ TRANSLATOR NOTE __": "*** PSLOCAL IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***",
-            "Confirm": "",
-            "Enable": "",
-            "Enable Gears in order to use local document storage and configuration.": "",
-            "Enabling Local Storage": "",
-            "Install": "",
-            "Learn About Local Storage": "",
-            "This will reload the page, causing you to lose any unsaved work.  Press \"OK\" to reload.": "",
-            "Xinha uses Google Gears to enable local document storage.  With Gears installed, you can save drafts of your documents on your hard drive, configure Xinha to look the way you want, and carry this information wherever you use Xinha on the web.": ""
-        },
-        "PSServer": {
-            "__ TRANSLATOR NOTE __": "*** PSSERVER IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***",
-            "File: ": "",
-            "Import": ""
-        },
-        "PersistentStorage": {
-            "__ TRANSLATOR NOTE __": "*** PERSISTENTSTORAGE IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***",
-            "Details": "",
-            "File Browser": "",
-            "Hello    There C ": "",
-            "Hello  There A ": "",
-            "Hello \" There B \"": "",
-            "Hello ' There D '": "",
-            "List of Places": "",
-            "New Document": "",
-            "Open": "",
-            "Open Document": "",
-            "Places": "",
-            "Please enter the name of the directory you'd like to create.": "",
-            "Save Document": "",
-            "This will erase any unsaved content.  If you're certain, please click OK to continue.": "",
-            "Web URL": "",
-            "Confirm": "<<PSLocal>>",
-            "Delete": "<<Abbreviation>>",
-            "Directory Up": "<<ExtendedFileManager>>",
-            "File List": "<<ExtendedFileManager>>",
-            "File Manager": "<<ExtendedFileManager>>",
-            "Filename": "<<ExtendedFileManager>>",
-            "Insert": "<<InsertNote>>",
-            "New Folder": "<<ExtendedFileManager>>",
-            "Save": "<<SaveSubmit>>",
-            "You must select some text before making a new link.": "<<Linker>>"
-        },
-        "SpellChecker": {
-            "__ TRANSLATOR NOTE __": "*** SPELLCHECKER IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***",
-            "Dictionary": "",
-            "Finished list of mispelled words": "",
-            "HTMLArea Spell Checker": "",
-            "I will open it in a new page.": "",
-            "Ignore": "",
-            "Ignore all": "",
-            "Info": "",
-            "Learn": "",
-            "No mispelled words found with the selected dictionary.": "",
-            "Original word": "",
-            "Please confirm that you want to open this link": "",
-            "Please wait.  Calling spell checker.": "",
-            "Please wait: changing dictionary to": "",
-            "pliz weit ;-)": "",
-            "Re-check": "",
-            "Replace": "",
-            "Replace all": "",
-            "Revert": "",
-            "Spell Checker": "",
-            "Spell-check": "",
-            "Suggestions": "",
-            "This will drop changes and quit spell checker.  Please confirm.": ""
-        },
-        "Template": {
-            "__ TRANSLATOR NOTE __": "*** TEMPLATE IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***",
-            "Insert template": ""
-        },
-        "UnFormat": {
-            "__ TRANSLATOR NOTE __": "*** UNFORMAT IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***",
-            "All": "",
-            "All HTML:": "",
-            "Cleaning Area": "",
-            "Cleaning options": "",
-            "Formatting:": "",
-            "Page Cleaner": "",
-            "Select which types of formatting you would like to remove.": "",
-            "Selection": ""
-        }
-    }
-}
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/lang/merged/th.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/lang/merged/th.js
deleted file mode 100644
index 7ba4985..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/lang/merged/th.js
+++ /dev/null
@@ -1,1573 +0,0 @@
-// Xinha Language Combined Translation File
-//
-// LANG: "th", ENCODING: UTF-8
-//
-// INSTRUCTIONS TO TRANSLATORS
-// ===========================================================================
-//
-// Your translation must be in UTF-8 Character Encoding.
-//
-// This is a JSON encoded file (plus comments), strings should be double-quote
-// only, do not use single quotes to surround strings - "hello", not 'hello'
-// do not have a trailing comma after the last entry in a section.
-//
-// Only full line comments are allowed (that a comments occupy entire lines).
-//
-// Search for the __NEW_TRANSLATIONS__ section below, this is where you will
-// want to focus, this section includes things that do not presently have a 
-// translation or for which the translation needs to be checked for accuracy.
-//
-// In the New Translations section a translation string is one of the following
-//
-//  "English String Here" : ""
-//     This means it is not translated yet, add your translation...
-//     "English String Here" : "Klingon String Here"
-//
-//  "English String Here" : "Translated String Here"
-//     This means that an existing translation for this string, in some other
-//     section has been found, and used.  Check that it is approprite for this
-//     section and if it is, that's fine leave it as is, otherwise change as
-//     appropriate.
-//
-//  "English String Here" : "<<AnotherSection>>"
-//     This means use the same translation for this string as <<AnotherSection>>
-//     this saves you re-tranlating strings.  If the Context of this section
-//     and the context of AnotherSection seem the same, that's fine leave it
-//     using that translation, but if this section needs a different translation, 
-//     you can provide it by replacing the link (<<AnotherSection>>) with that
-//     new translation.  For example - a "Table" in say "DataPlugin" is 
-//     perhaps translated differently to "Table" in "FurniturePlugin".
-//
-// TESTING YOUR TRANSLATION
-// ===========================================================================
-// Simply place your translation file on your webserver somewhere for example
-//
-//   /xinha/lang/merged/th.js
-//
-// and then tell Xinha where to get it (before loading XinhaCore.js) by 
-//
-//  _editor_lang              = 'th';
-//  _editor_lang_merged_file  = '/xinha/lang/merged/th.js';
-//
-// Xinha will load your new language definition.
-//
-// SUBMITTING YOUR TRANSLATION
-// ===========================================================================
-// Simply create a Ticket on the Xinha website and attach your translation 
-// file.
-//
-// The Xinha developers will take your file and use the 
-//     contrib/lc_split_merged_file.php
-// script to load it into the Xinha distribution.
-
-{
-    "Abbreviation": {
-        "Cancel": "ยกเลิก",
-        "OK": "ตกลง"
-    },
-    "AboutBox": {
-        "About this editor": "เกี่ยวกับโปรแกรมนี้"
-    },
-    "BackgroundImage": {
-        "Cancel": "ยกเลิก"
-    },
-    "ColorPicker": {
-        "OK": "ตกลง"
-    },
-    "ContextMenu": {
-        "Justify Center": "จัดกึ่งกลาง",
-        "Justify Full": "จัดเต็มขอบ",
-        "Justify Left": "จัดชิดซ้าย",
-        "Justify Right": "จัดชิดขวา"
-    },
-    "CreateLink": {
-        "Cancel": "ยกเลิก",
-        "OK": "ตกลง"
-    },
-    "EditTag": {
-        "Cancel": "ยกเลิก",
-        "OK": "ตกลง"
-    },
-    "Equation": {
-        "Cancel": "ยกเลิก",
-        "OK": "ตกลง"
-    },
-    "ExtendedFileManager": {
-        "Cancel": "ยกเลิก",
-        "OK": "ตกลง"
-    },
-    "Forms": {
-        "Cancel": "ยกเลิก",
-        "OK": "ตกลง"
-    },
-    "FullPage": {
-        "Cancel": "ยกเลิก",
-        "OK": "ตกลง"
-    },
-    "HorizontalRule": {
-        "Cancel": "ยกเลิก",
-        "Horizontal Rule": "เส้นกึ่งกลาง",
-        "OK": "ตกลง"
-    },
-    "ImageManager": {
-        "Cancel": "ยกเลิก",
-        "OK": "ตกลง"
-    },
-    "InsertAnchor": {
-        "Cancel": "ยกเลิก",
-        "OK": "ตกลง"
-    },
-    "InsertImage": {
-        "Cancel": "ยกเลิก",
-        "OK": "ตกลง"
-    },
-    "InsertMarquee": {
-        "Cancel": "ยกเลิก",
-        "OK": "ตกลง"
-    },
-    "InsertNote": {
-        "Cancel": "ยกเลิก"
-    },
-    "InsertPicture": {
-        "Cancel": "ยกเลิก",
-        "OK": "ตกลง"
-    },
-    "InsertSnippet": {
-        "Cancel": "ยกเลิก"
-    },
-    "InsertSnippet2": {
-        "Cancel": "ยกเลิก"
-    },
-    "InsertTable": {
-        "Cancel": "ยกเลิก",
-        "Insert Table": "เพิ่มตาราง",
-        "OK": "ตกลง"
-    },
-    "Linker": {
-        "Cancel": "ยกเลิก",
-        "OK": "ตกลง"
-    },
-    "NoteServer": {
-        "Cancel": "ยกเลิก",
-        "OK": "ตกลง"
-    },
-    "PSLocal": {
-        "Cancel": "ยกเลิก"
-    },
-    "PasteText": {
-        "Cancel": "ยกเลิก",
-        "OK": "ตกลง"
-    },
-    "PersistentStorage": {
-        "Cancel": "ยกเลิก"
-    },
-    "QuickTag": {
-        "Cancel": "ยกเลิก"
-    },
-    "SetId": {
-        "Cancel": "ยกเลิก",
-        "OK": "ตกลง"
-    },
-    "SmartReplace": {
-        "OK": "ตกลง"
-    },
-    "SpellChecker": {
-        "Cancel": "ยกเลิก",
-        "OK": "ตกลง"
-    },
-    "SuperClean": {
-        "Cancel": "ยกเลิก",
-        "OK": "ตกลง"
-    },
-    "TableOperations": {
-        "Cancel": "ยกเลิก",
-        "OK": "ตกลง"
-    },
-    "Template": {
-        "Cancel": "ยกเลิก"
-    },
-    "UnFormat": {
-        "Cancel": "ยกเลิก",
-        "OK": "ตกลง"
-    },
-    "Xinha": {
-        "About this editor": "เกี่ยวกับโปรแกรมนี้",
-        "Background Color": "สีพื้นหลัง",
-        "Bold": "ตัวหนา",
-        "Bulleted List": "ลำดับ",
-        "Copy selection": "สำเนาส่วนที่เลือก",
-        "Current style": "รูปแบบปัจจุบัน",
-        "Cut selection": "ตัดส่วนที่เลือก",
-        "Decrease Indent": "ลดย่อหน้า",
-        "Font Color": "สีขอบแบบอักษร",
-        "Help using editor": "การใช้งานโปรแกรม",
-        "Horizontal Rule": "เส้นกึ่งกลาง",
-        "Increase Indent": "เพิ่มย่อหน้า",
-        "Insert Table": "เพิ่มตาราง",
-        "Insert Web Link": "ิเพิ่มลิ้งค์",
-        "Insert/Modify Image": "เพิ่ม/แก้ไขภาพ",
-        "Italic": "ตัวเอียง",
-        "Justify Center": "จัดกึ่งกลาง",
-        "Justify Full": "จัดเต็มขอบ",
-        "Justify Left": "จัดชิดซ้าย",
-        "Justify Right": "จัดชิดขวา",
-        "Ordered List": "เลขลำดับ",
-        "Paste from clipboard": "วางจากคลิปบอร์ด",
-        "Path": "เส้นทาง",
-        "Redoes your last action": "ทำซ้ำ",
-        "Strikethrough": "ขีดทับ",
-        "Subscript": "ตัวห้อย",
-        "Superscript": "ตัวยก",
-        "Toggle HTML Source": "สลับการแสดงโค้ด HTML",
-        "Underline": "ขีดเส้นใต้",
-        "Undoes your last action": "ย้อนกลับ",
-        "You are in TEXT MODE.  Use the [<>] button to switch back to WYSIWYG.": "คุณอยู่ในโหมดธรรมดา กดที่ปุ่ม [<>] เพื่อสลับกลับไปยังโหมดพิมพ์งานแบบเวิร์ด"
-    },
-    "__NEW_TRANSLATIONS__": {
-        "Abbreviation": {
-            "Abbreviation": "",
-            "Delete": "",
-            "Expansion:": ""
-        },
-        "AboutBox": {
-            "Close": "<<Xinha>>"
-        },
-        "CharCounter": {
-            "... in progress": "",
-            "Chars": "",
-            "HTML": "",
-            "Words": ""
-        },
-        "CharacterMap": {
-            "Insert special character": ""
-        },
-        "ColorPicker": {
-            "Click a color...": "",
-            "Color: ": "",
-            "Sample": "",
-            "Web Safe: ": "",
-            "Close": "<<Xinha>>"
-        },
-        "ContextMenu": {
-            "_Delete Row": "",
-            "_Image Properties...": "",
-            "_Modify Link...": "",
-            "_Remove Link...": "",
-            "_Table Properties...": "",
-            "C_ell Properties...": "",
-            "Chec_k Link...": "",
-            "Copy": "",
-            "Create a link": "",
-            "Current URL is": "",
-            "Cut": "",
-            "De_lete Column": "",
-            "Delete Cell": "",
-            "Delete the current column": "",
-            "Delete the current row": "",
-            "How did you get here? (Please report!)": "",
-            "I_nsert Row Before": "",
-            "In_sert Row After": "",
-            "Insert _Column Before": "",
-            "Insert a new column after the current one": "",
-            "Insert a new column before the current one": "",
-            "Insert a new row after the current one": "",
-            "Insert a new row before the current one": "",
-            "Insert a paragraph after the current node": "",
-            "Insert a paragraph before the current node": "",
-            "Insert C_olumn After": "",
-            "Insert Cell After": "",
-            "Insert Cell Before": "",
-            "Insert paragraph after": "",
-            "Insert paragraph before": "",
-            "Link points to:": "",
-            "Make lin_k...": "",
-            "Merge Cells": "",
-            "Opens this link in a new window": "",
-            "Paste": "",
-            "Please confirm that you want to remove this element:": "",
-            "Please confirm that you want to unlink this element.": "",
-            "Remove the $elem Element...": "",
-            "Remove this node from the document": "",
-            "Ro_w Properties...": "",
-            "Show the image properties dialog": "",
-            "Show the Table Cell Properties dialog": "",
-            "Show the Table Properties dialog": "",
-            "Show the Table Row Properties dialog": "",
-            "Unlink the current element": ""
-        },
-        "CreateLink": {
-            "Are you sure you wish to remove this link?": "",
-            "Insert/Modify Link": "",
-            "New window (_blank)": "",
-            "None (use implicit)": "",
-            "Other": "",
-            "Same frame (_self)": "",
-            "Target:": "",
-            "Title (tooltip):": "",
-            "Top frame (_top)": "",
-            "URL:": "",
-            "You need to select some text before creating a link": ""
-        },
-        "DefinitionList": {
-            "definition description": "",
-            "definition list": "",
-            "definition term": ""
-        },
-        "Dialogs": {
-            "Some Text Here": ""
-        },
-        "DynamicCSS": {
-            "Choose stylesheet": "",
-            "Default": "",
-            "Undefined": ""
-        },
-        "EditTag": {
-            "Edit HTML for selected text": "",
-            "Edit Tag By Peg": "",
-            "Tag Editor": ""
-        },
-        "Equation": {
-            "!=": "",
-            "!in": "",
-            "&gt;-": "",
-            "&gt;=": "",
-            "&lt;=": "",
-            "&lt;=&gt;": "",
-            "&lt;x&gt;": "",
-            "&nbsp; `!` &nbsp;": "",
-            "&nbsp; `.` &nbsp;": "",
-            "&nbsp; `0` &nbsp;": "",
-            "&nbsp; `2` &nbsp;": "",
-            "&nbsp; `3` &nbsp;": "",
-            "&nbsp; `4` &nbsp;": "",
-            "&nbsp; `5` &nbsp;": "",
-            "&nbsp; `6` &nbsp;": "",
-            "&nbsp; `7` &nbsp;": "",
-            "&nbsp; `8` &nbsp;": "",
-            "&nbsp; `9` &nbsp;": "",
-            "&nbsp; `e` &nbsp;": "",
-            "&nbsp;&nbsp;`1` &nbsp;": "",
-            "&nbsp;`+{::}`&nbsp;": "",
-            "&nbsp;`-:\\ `": "",
-            "&nbsp;`-{::}`&nbsp;": "",
-            "&nbsp;`C`&nbsp;": "",
-            "&nbsp;`cos`": "",
-            "&nbsp;`ln`&nbsp;": "",
-            "&nbsp;`pi` &nbsp;": "",
-            "&nbsp;`sin`": "",
-            "&nbsp;`tan`": "",
-            "&nbsp;`times`&nbsp;": "",
-            "&quot;text&quot;": "",
-            "'+formula+'": "",
-            "((n),(k))": "",
-            "(x+1)/(x-1)": "",
-            "*": "",
-            "**": "",
-            "+-": "",
-            "-&gt;": "",
-            "-&lt;": "",
-            "-:": "",
-            "-=": "",
-            "//": "",
-            "/_": "",
-            ":.": "",
-            "=&gt;": "",
-            "@": "",
-            "[[a,b],[c,d]]": "",
-            "\\\\": "",
-            "\\nClick in the box to use your keyboard or use the buttons\\n": "",
-            "^^": "",
-            "^^^": "",
-            "__|": "",
-            "_|_": "",
-            "`!=`": "",
-            "`!in`": "",
-            "`&and;`": "",
-            "`&cap;`": "",
-            "`&cup;`": "",
-            "`&gt;-`": "",
-            "`&gt;=`": "",
-            "`&lt;=&gt;`": "",
-            "`&lt;=`": "",
-            "`&lt;x&gt;`": "",
-            "`&or;`": "",
-            "`&quot;text&quot;`": "",
-            "`((n),(k))`": "",
-            "`(x+1)/(x-1)`": "",
-            "`**`": "",
-            "`*`": "",
-            "`+-`": "",
-            "`-&gt;`": "",
-            "`-&lt;`": "",
-            "`-:`": "",
-            "`-=`": "",
-            "`//`": "",
-            "`/_`": "",
-            "`:.`": "",
-            "`=&gt;`": "",
-            "`@`": "",
-            "`[[a,b],[c,d]]`": "",
-            "`\\\\`": "",
-            "`__|`": "",
-            "`_|_`": "",
-            "`AA`": "",
-            "`aleph`": "",
-            "`alpha`": "",
-            "`and`": "",
-            "`bara`": "",
-            "`bba`": "",
-            "`bbba`": "",
-            "`beta`": "",
-            "`CC`": "",
-            "`cca`": "",
-            "`chi`": "",
-            "`darr`": "",
-            "`ddota`": "",
-            "`del`": "",
-            "`Delta`": "",
-            "`delta`": "",
-            "`diamond`": "",
-            "`dota`": "",
-            "`dy/dx`": "",
-            "`EE`": "",
-            "`epsi`": "",
-            "`eta`": "",
-            "`fra`": "",
-            "`Gamma`": "",
-            "`gamma`": "",
-            "`grad`": "",
-            "`harr`": "",
-            "`hArr`": "",
-            "`hata`": "",
-            "`if`": "",
-            "`in`": "",
-            "`int`": "",
-            "`iota`": "",
-            "`kappa`": "",
-            "`Lambda`": "",
-            "`lambda`": "",
-            "`lArr`": "",
-            "`larr`": "",
-            "`lim_(x-&gt;oo)`": "",
-            "`log`": "",
-            "`mu`": "",
-            "`NN`": "",
-            "`nn`": "",
-            "`not`": "",
-            "`nu`": "",
-            "`o+`": "",
-            "`o.`": "",
-            "`O/`": "",
-            "`oint`": "",
-            "`omega`": "",
-            "`Omega`": "",
-            "`oo`": "",
-            "`or`": "",
-            "`ox`": "",
-            "`phi`": "",
-            "`Phi`": "",
-            "`Pi`": "",
-            "`pi`": "",
-            "`prod`": "",
-            "`prop`": "",
-            "`Psi`": "",
-            "`psi`": "",
-            "`QQ`": "",
-            "`quad`": "",
-            "`rArr`": "",
-            "`rho`": "",
-            "`root(n)(x)`": "",
-            "`RR`": "",
-            "`sfa`": "",
-            "`Sigma`": "",
-            "`sigma`": "",
-            "`sqrt(x)`": "",
-            "`square`": "",
-            "`stackrel(-&gt;)(+)`": "",
-            "`sub`": "",
-            "`sube`": "",
-            "`sum`": "",
-            "`sup`": "",
-            "`supe`": "",
-            "`tau`": "",
-            "`Theta`": "",
-            "`theta`": "",
-            "`TT`": "",
-            "`tta`": "",
-            "`uarr`": "",
-            "`ula`": "",
-            "`upsilon`": "",
-            "`uu`": "",
-            "`veca`": "",
-            "`vv`": "",
-            "`x_(mn)`": "",
-            "`Xi`": "",
-            "`xi`": "",
-            "`xx`": "",
-            "`zeta`": "",
-            "`ZZ`": "",
-            "`|-&gt;`": "",
-            "`|--`": "",
-            "`|==`": "",
-            "`|__`": "",
-            "`|~`": "",
-            "`~=`": "",
-            "`~|`": "",
-            "`~~`": "",
-            "AA": "",
-            "aleph": "",
-            "alpha": "",
-            "and": "",
-            "AsciiMath Formula Input": "",
-            "AsciiMathML Example": "",
-            "bara": "",
-            "Based on ASCIIMathML by": "",
-            "bba": "",
-            "bbba": "",
-            "beta": "",
-            "CC": "",
-            "cca": "",
-            "chi": "",
-            "darr": "",
-            "ddota": "",
-            "del": "",
-            "delta": "",
-            "Delta": "",
-            "diamond": "",
-            "dota": "",
-            "dy/dx": "",
-            "EE": "",
-            "epsi": "",
-            "eta": "",
-            "For more information on AsciiMathML visit this page:": "",
-            "Formula Editor": "",
-            "fra": "",
-            "gamma": "",
-            "Gamma": "",
-            "grad": "",
-            "hArr": "",
-            "harr": "",
-            "hata": "",
-            "if": "",
-            "in": "",
-            "Input": "",
-            "int": "",
-            "int_a^bf(x)dx": "",
-            "iota": "",
-            "kappa": "",
-            "Lambda": "",
-            "lambda": "",
-            "larr": "",
-            "lArr": "",
-            "lim_(x-&gt;oo)": "",
-            "mu": "",
-            "NN": "",
-            "nn": "",
-            "nnn": "",
-            "not": "",
-            "nu": "",
-            "o+": "",
-            "o.": "",
-            "O/": "",
-            "oint": "",
-            "Omega": "",
-            "omega": "",
-            "oo": "",
-            "or": "",
-            "ox": "",
-            "phi": "",
-            "Phi": "",
-            "pi": "",
-            "Pi": "",
-            "Preview": "",
-            "prod": "",
-            "prop": "",
-            "psi": "",
-            "Psi": "",
-            "QQ": "",
-            "quad": "",
-            "rArr": "",
-            "rho": "",
-            "root(n)(x)": "",
-            "RR": "",
-            "sfa": "",
-            "sigma": "",
-            "Sigma": "",
-            "sqrt(x)": "",
-            "square": "",
-            "stackrel(-&gt;)(+)": "",
-            "sub": "",
-            "sube": "",
-            "sum": "",
-            "sum_(n=1)^oo": "",
-            "sup": "",
-            "supe": "",
-            "tau": "",
-            "Theta": "",
-            "theta": "",
-            "TT": "",
-            "tta": "",
-            "uarr": "",
-            "ula": "",
-            "upsilon": "",
-            "uu": "",
-            "uuu": "",
-            "veca": "",
-            "vv": "",
-            "vvv": "",
-            "x^(m+n)": "",
-            "x_(mn)": "",
-            "Xi": "",
-            "xi": "",
-            "xx": "",
-            "zeta": "",
-            "ZZ": "",
-            "|-&gt;": "",
-            "|--": "",
-            "|==": "",
-            "|__": "",
-            "|~": "",
-            "~=": "",
-            "~|": "",
-            "~~": ""
-        },
-        "FancySelects": {
-            "'+opt.text+'": ""
-        },
-        "FindReplace": {
-            "';\r\n  var tagc = '": "",
-            "Case sensitive search": "",
-            "Clear": "",
-            "Done": "",
-            "Enter the text you want to find": "",
-            "Find and Replace": "",
-            "found item": "",
-            "found items": "",
-            "Highlight": "",
-            "Inform a replacement word": "",
-            "Next": "",
-            "not found": "",
-            "Options": "",
-            "Replace with:": "",
-            "replaced item": "",
-            "replaced items": "",
-            "Search for:": "",
-            "Substitute all occurrences": "",
-            "Substitute this occurrence?": "",
-            "Undo": "",
-            "Whole words only": ""
-        },
-        "FormOperations": {
-            "Enter the name for new option.": "",
-            "Form Editor": "",
-            "Insert a check box.": "",
-            "Insert a Form.": "",
-            "Insert a multi-line text field.": "",
-            "Insert a radio button.": "",
-            "Insert a select field.": "",
-            "Insert a submit/reset button.": "",
-            "Insert a text, password or hidden field.": "",
-            "Message Sent": "",
-            "Please Select...": ""
-        },
-        "Forms": {
-            "'onClick'=": "",
-            "Access Key:": "",
-            "Action URL:": "",
-            "Button Script": "",
-            "Checked": "",
-            "Columns:": "",
-            "Default text (optional)": "",
-            "Dimensions": "",
-            "Disabled": "",
-            "Encoding:": "",
-            "For Control:": "",
-            "Form": "",
-            "Form Element: FIELDSET": "",
-            "Form Element: INPUT": "",
-            "Form Element: LABEL": "",
-            "Form Element: SELECT": "",
-            "Form Element: TEXTAREA": "",
-            "Form handler script": "",
-            "Form Name:": "",
-            "Get": "",
-            "Hard": "",
-            "Height in number of rows": "",
-            "HTML-Form to CGI (default)": "",
-            "Image source": "",
-            "Image URL:": "",
-            "Initial Text:": "",
-            "Insert/Edit Form": "",
-            "Insert/Edit Form Element FIELDSET": "",
-            "Insert/Edit Form Element INPUT": "",
-            "Insert/Edit Form Element LABEL": "",
-            "Insert/Edit Form Element SELECT": "",
-            "Insert/Edit Form Element TEXTAREA": "",
-            "Javascript for button click": "",
-            "Label:": "",
-            "Legend:": "",
-            "Max length:": "",
-            "Maximum number of characters accepted": "",
-            "Method:": "",
-            "multipart Form Data (File-Upload)": "",
-            "Name": "",
-            "Name of the form input": "",
-            "Name of the form select": "",
-            "name of the textarea": "",
-            "Name/ID:": "",
-            "normal": "",
-            "nowrap": "",
-            "Off": "",
-            "Physical": "",
-            "Please enter a Label": "",
-            "Post": "",
-            "pre": "",
-            "Read Only": "",
-            "Rows:": "",
-            "Size of text box in characters": "",
-            "Size:": "",
-            "Soft": "",
-            "Tab Index:": "",
-            "Target Frame:": "",
-            "Text:": "",
-            "URL of image": "",
-            "Value of the form input": "",
-            "Value:": "",
-            "Virtual": "",
-            "Width in number of characters": "",
-            "Wrap Mode:": "",
-            "You must enter a Name": "",
-            "Options": "<<FindReplace>>"
-        },
-        "FullPage": {
-            "...": "",
-            "Alternate style-sheet:": "",
-            "Background color:": "",
-            "Character set:": "",
-            "cyrillic (ISO-8859-5)": "",
-            "cyrillic (KOI8-R)": "",
-            "cyrillic (WINDOWS-1251)": "",
-            "Description:": "",
-            "DOCTYPE:": "",
-            "Document properties": "",
-            "Document title:": "",
-            "Keywords:": "",
-            "Primary style-sheet:": "",
-            "Text color:": "",
-            "UTF-8 (recommended)": "",
-            "western (ISO-8859-1)": ""
-        },
-        "FullScreen": {
-            "Maximize/Minimize Editor": ""
-        },
-        "Gecko": {
-            "The Paste button does not work in this browser for security reasons. Press CTRL-V on your keyboard to paste directly.": ""
-        },
-        "HorizontalRule": {
-            "&#x00d7;": "",
-            "&nbsp;": "",
-            "Alignment:": "",
-            "Center": "",
-            "Color:": "",
-            "Height:": "",
-            "Insert/edit horizontal rule": "",
-            "Insert/Edit Horizontal Rule": "",
-            "Layout": "",
-            "Left": "",
-            "No shading": "",
-            "percent": "",
-            "pixels": "",
-            "Right": "",
-            "Style": "",
-            "Width:": ""
-        },
-        "InlineStyler": {
-            "Background": "",
-            "Baseline": "",
-            "Border": "",
-            "Bottom": "",
-            "Char": "",
-            "Collapsed borders": "",
-            "CSS Style": "",
-            "FG Color": "",
-            "Float": "",
-            "Justify": "",
-            "Margin": "",
-            "Middle": "",
-            "None": "",
-            "Padding": "",
-            "Text align": "",
-            "Top": "",
-            "Vertical align": "",
-            "-": "<<Equation>>",
-            "Center": "<<HorizontalRule>>",
-            "Height": "<<HorizontalRule>>",
-            "Image URL": "<<Forms>>",
-            "Layout": "<<HorizontalRule>>",
-            "Left": "<<HorizontalRule>>",
-            "percent": "<<HorizontalRule>>",
-            "pixels": "<<HorizontalRule>>",
-            "Right": "<<HorizontalRule>>",
-            "Width": "<<HorizontalRule>>"
-        },
-        "InsertAnchor": {
-            "Anchor name": "",
-            "Insert Anchor": "",
-            "Delete": "<<Abbreviation>>"
-        },
-        "InsertImage": {
-            "Absbottom": "",
-            "Absmiddle": "",
-            "Alternate text:": "",
-            "Border thickness:": "",
-            "Enter the image URL here": "",
-            "For browsers that don't support images": "",
-            "Horizontal padding": "",
-            "Horizontal:": "",
-            "Image Preview:": "",
-            "Insert Image": "",
-            "Leave empty for no border": "",
-            "Not set": "",
-            "Positioning of this image": "",
-            "Preview the image in a new window": "",
-            "Spacing": "",
-            "Texttop": "",
-            "Vertical padding": "",
-            "Vertical:": "",
-            "You must enter the URL": "",
-            "Alignment:": "<<HorizontalRule>>",
-            "Baseline": "<<InlineStyler>>",
-            "Bottom": "<<InlineStyler>>",
-            "Image URL:": "<<Forms>>",
-            "Layout": "<<HorizontalRule>>",
-            "Left": "<<HorizontalRule>>",
-            "Middle": "<<InlineStyler>>",
-            "Preview": "<<Equation>>",
-            "Right": "<<HorizontalRule>>",
-            "Top": "<<InlineStyler>>"
-        },
-        "InsertNote": {
-            "Insert": "",
-            "Insert footnote": "",
-            "Insert Note": ""
-        },
-        "InsertPagebreak": {
-            "Page break": "",
-            "Page Break": ""
-        },
-        "InsertSmiley": {
-            "Insert Smiley": ""
-        },
-        "InsertSnippet": {
-            "\\n  This is an information about something\\n": "",
-            "Hide preview": "",
-            "Insert as": "",
-            "Insert Snippet": "",
-            "InsertSnippet for Xinha": "",
-            "Link1": "",
-            "Link2": "",
-            "Link3": "",
-            "Link4": "",
-            "Link5": "",
-            "Show preview": "",
-            "This is an information about something": "",
-            "Variable": ""
-        },
-        "InsertSnippet2": {
-            "All Categories": "",
-            "Filter": "",
-            "Insert as HTML": "",
-            "Insert as template variable": "",
-            "Only search word beginning": "",
-            "HTML": "<<CharCounter>>",
-            "Insert Snippet": "<<InsertSnippet>>",
-            "InsertSnippet for Xinha": "<<InsertSnippet>>",
-            "Variable": "<<InsertSnippet>>"
-        },
-        "InsertTable": {
-            "Caption": "",
-            "Caption for the table": "",
-            "Cell padding:": "",
-            "Cell spacing:": "",
-            "Collapse borders:": "",
-            "Cols:": "",
-            "Em": "",
-            "Fixed width columns": "",
-            "Layou": "",
-            "Number of columns": "",
-            "Number of rows": "",
-            "Positioning of this table": "",
-            "Space between adjacent cells": "",
-            "Space between content and border in cell": "",
-            "Style of the border": "",
-            "Width of the table": "",
-            "Width unit": "",
-            "You must enter a number of columns": "",
-            "You must enter a number of rows": "",
-            "Absbottom": "<<InsertImage>>",
-            "Absmiddle": "<<InsertImage>>",
-            "Alignment:": "<<HorizontalRule>>",
-            "Baseline": "<<InlineStyler>>",
-            "Border": "<<InlineStyler>>",
-            "Border thickness:": "<<InsertImage>>",
-            "Bottom": "<<InlineStyler>>",
-            "Layout": "<<HorizontalRule>>",
-            "Leave empty for no border": "<<InsertImage>>",
-            "Left": "<<HorizontalRule>>",
-            "Middle": "<<InlineStyler>>",
-            "Not set": "<<InsertImage>>",
-            "Percent": "<<HorizontalRule>>",
-            "Pixels": "<<HorizontalRule>>",
-            "Right": "<<HorizontalRule>>",
-            "Rows:": "<<Forms>>",
-            "Spacing": "<<InsertImage>>",
-            "Texttop": "<<InsertImage>>",
-            "Top": "<<InlineStyler>>",
-            "Width:": "<<HorizontalRule>>"
-        },
-        "LangMarks": {
-            "&mdash; language &mdash;": "",
-            "', '": "",
-            "English": "",
-            "French": "",
-            "Greek": "",
-            "language select": "",
-            "Latin": ""
-        },
-        "Linker": {
-            "(px)": "",
-            "Anchor-Link": "",
-            "Anchor:": "",
-            "Email Address:": "",
-            "Email Link": "",
-            "Location Bar:": "",
-            "Menu Bar:": "",
-            "Message Template:": "",
-            "New Window": "",
-            "Ordinary Link": "",
-            "Popup Window": "",
-            "PopupWindow": "",
-            "Remove Link": "",
-            "Resizeable:": "",
-            "Same Window (jump out of frames)": "",
-            "Scrollbars:": "",
-            "Shows On Hover": "",
-            "Status Bar:": "",
-            "Subject:": "",
-            "Title:": "",
-            "Toolbar:": "",
-            "URL Link": "",
-            "You must select some text before making a new link.": "",
-            "Are you sure you wish to remove this link?": "<<CreateLink>>",
-            "Insert/Modify Link": "<<CreateLink>>",
-            "Name:": "<<Forms>>",
-            "Size:": "<<Forms>>",
-            "Target:": "<<CreateLink>>",
-            "URL:": "<<CreateLink>>"
-        },
-        "ListType": {
-            "Choose list style type (for ordered lists)": "",
-            "Decimal numbers": "",
-            "Lower greek letters": "",
-            "Lower latin letters": "",
-            "Lower roman numbers": "",
-            "Upper latin letters": "",
-            "Upper roman numbers": ""
-        },
-        "MootoolsFileManager": {
-            "Insert File Link": "",
-            "You must select some text before making a new link.": "<<Linker>>"
-        },
-        "Opera": {
-            "MARK": "",
-            "The Paste button does not work in Mozilla based web browsers (technical security reasons). Press CTRL-V on your keyboard to paste directly.": ""
-        },
-        "PasteText": {
-            "Insert text in new paragraph": "",
-            "Paste as Plain Text": ""
-        },
-        "PreserveScripts": {
-            "JavaScript": "",
-            "PHP": ""
-        },
-        "QuickTag": {
-            "',\r\n                           'cl': '": "",
-            "ATTRIBUTES": "",
-            "Colors": "",
-            "Enter the TAG you want to insert": "",
-            "No CSS class avaiable": "",
-            "Ok": "",
-            "OPTIONS": "",
-            "Quick Tag Editor": "",
-            "TAGs": "",
-            "There are some unclosed quote": "",
-            "This attribute already exists in the TAG": "",
-            "You have to select some text": ""
-        },
-        "SaveSubmit": {
-            "in progress": "",
-            "Ready": "",
-            "Save": "",
-            "Saving...": ""
-        },
-        "SetId": {
-            "ID/Name:": "",
-            "Set Id and Name": "",
-            "Set Id/Name": "",
-            "Set ID/Name": "",
-            "Delete": "<<Abbreviation>>"
-        },
-        "SmartReplace": {
-            "ClosingDoubleQuotes": "",
-            "ClosingSingleQuote": "",
-            "Convert all quotes and dashes in the current document": "",
-            "Enable automatic replacements": "",
-            "OpeningDoubleQuotes": "",
-            "OpeningSingleQuote": "",
-            "SmartReplace": "",
-            "SmartReplace Settings": ""
-        },
-        "Stylist": {
-            "Styles": ""
-        },
-        "SuperClean": {
-            "Clean bad HTML from Microsoft Word.": "",
-            "Clean Selection Only": "",
-            "Clean up HTML": "",
-            "Cleaning Scope": "",
-            "General tidy up and correction of some problems.": "",
-            "Please select from the following cleaning options...": "",
-            "Please stand by while cleaning in process...": "",
-            "Remove alignment (left/right/justify).": "",
-            "Remove all classes (CSS).": "",
-            "Remove All HTML Tags": "",
-            "Remove all styles (CSS).": "",
-            "Remove custom font sizes.": "",
-            "Remove custom text colors.": "",
-            "Remove custom typefaces (font \"styles\").": "",
-            "Remove emphasis and annotations.": "",
-            "Remove lang attributes.": "",
-            "Remove Paragraphs": "",
-            "Remove superscripts and subscripts.": "",
-            "Replace directional quote marks with non-directional quote marks.": "",
-            "Vigorously purge HTML from Microsoft Word.": ""
-        },
-        "TableOperations": {
-            "All four sides": "",
-            "Borders": "",
-            "Cell properties": "",
-            "Cell Properties": "",
-            "Cell Type:": "",
-            "Cells down": "",
-            "Cells to the right, and": "",
-            "Delete cell": "",
-            "Delete column": "",
-            "Delete row": "",
-            "Do Not Change": "",
-            "Frame and borders": "",
-            "Frames": "",
-            "Header (th)": "",
-            "Insert cell after": "",
-            "Insert cell before": "",
-            "Insert column after": "",
-            "Insert column before": "",
-            "Insert row after": "",
-            "Insert row before": "",
-            "Merge cells": "",
-            "Merge current cell with:": "",
-            "No rules": "",
-            "No sides": "",
-            "Normal (td)": "",
-            "Please click into some cell": "",
-            "Row properties": "",
-            "Row Properties": "",
-            "Rules will appear between all rows and columns": "",
-            "Rules will appear between columns only": "",
-            "Rules will appear between rows only": "",
-            "Spacing and padding": "",
-            "Split column": "",
-            "Split row": "",
-            "Summary": "",
-            "Table properties": "",
-            "Table Properties": "",
-            "The bottom side only": "",
-            "The left-hand side only": "",
-            "The right and left sides only": "",
-            "The right-hand side only": "",
-            "The top and bottom sides only": "",
-            "The top side only": "",
-            "Xinha cowardly refuses to delete the last cell in row.": "",
-            "Xinha cowardly refuses to delete the last column in table.": "",
-            "Xinha cowardly refuses to delete the last row in table.": "",
-            "Caption": "<<InsertTable>>",
-            "Columns": "<<Forms>>",
-            "Description": "<<FullPage>>",
-            "Merge Cells": "<<ContextMenu>>",
-            "Padding": "<<InlineStyler>>",
-            "pixels": "<<HorizontalRule>>",
-            "Rows": "<<Forms>>",
-            "Spacing": "<<InsertImage>>"
-        },
-        "UnsavedChanges": {
-            "You have unsaved changes in the editor": ""
-        },
-        "WebKit": {
-            "The Paste button does not work in this browser for security reasons. Press CTRL-V on your keyboard to paste directly.": "<<Gecko>>"
-        },
-        "Xinha": {
-            "&#8212; font &#8212;": "",
-            "&#8212; format &#8212;": "",
-            "&#8212; size &#8212;": "",
-            "1 (8 pt)": "",
-            "2 (10 pt)": "",
-            "3 (12 pt)": "",
-            "4 (14 pt)": "",
-            "5 (18 pt)": "",
-            "6 (24 pt)": "",
-            "7 (36 pt)": "",
-            "Address": "",
-            "Arial": "",
-            "Clean content pasted from Word": "",
-            "Clear Inline Font Specifications": "",
-            "Clear MSOffice tags": "",
-            "Close": "",
-            "Constructing object": "",
-            "Courier New": "",
-            "Create Statusbar": "",
-            "Create Toolbar": "",
-            "CTRL-0 (zero)": "",
-            "CTRL-1 .. CTRL-6": "",
-            "CTRL-A": "",
-            "CTRL-B": "",
-            "CTRL-C": "",
-            "CTRL-E": "",
-            "CTRL-I": "",
-            "CTRL-J": "",
-            "CTRL-L": "",
-            "CTRL-N": "",
-            "CTRL-R": "",
-            "CTRL-S": "",
-            "CTRL-U": "",
-            "CTRL-V": "",
-            "CTRL-X": "",
-            "CTRL-Y": "",
-            "CTRL-Z": "",
-            "Direction left to right": "",
-            "Direction right to left": "",
-            "Editor Help": "",
-            "ENTER": "",
-            "Error Loading Xinha.  Developers, check the Error Console for information.": "",
-            "Finishing": "",
-            "Formatted": "",
-            "Generate Xinha framework": "",
-            "Georgia": "",
-            "Heading 1": "",
-            "Heading 2": "",
-            "Heading 3": "",
-            "Heading 4": "",
-            "Heading 5": "",
-            "Heading 6": "",
-            "Headings": "",
-            "Impact": "",
-            "Init editor size": "",
-            "insert linebreak": "",
-            "Insert/Overwrite": "",
-            "Keyboard shortcuts": "",
-            "Loading Core": "",
-            "Loading in progress. Please wait!": "",
-            "Loading plugin $plugin": "",
-            "Loading plugins": "",
-            "MS Word Cleaner": "",
-            "new paragraph": "",
-            "Normal": "",
-            "Print document": "",
-            "Register plugin $plugin": "",
-            "Remove formatting": "",
-            "Save as": "",
-            "Select all": "",
-            "Select Color": "",
-            "Set format to paragraph": "",
-            "SHIFT-ENTER": "",
-            "Split Block": "",
-            "Tahoma": "",
-            "The editor provides the following key combinations:": "",
-            "Times New Roman": "",
-            "Toggle Borders": "",
-            "Touch here first to activate editor.": "",
-            "Verdana": "",
-            "Waiting for Iframe to load...": "",
-            "WingDings": "",
-            "Would you like to clear font colours?": "",
-            "Would you like to clear font sizes?": "",
-            "Would you like to clear font typefaces?": "",
-            "Xinha": ""
-        },
-        "BackgroundImage": {
-            "__ TRANSLATOR NOTE __": "*** BACKGROUNDIMAGE IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***",
-            "Remove Current Background": "",
-            "Set Background": "",
-            "Set page background image": "",
-            "Set Page Background Image": ""
-        },
-        "ClientsideSpellcheck": {
-            "__ TRANSLATOR NOTE __": "*** CLIENTSIDESPELLCHECK IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***",
-            "Spell Check using ieSpell": ""
-        },
-        "ExtendedFileManager": {
-            "__ TRANSLATOR NOTE __": "*** EXTENDEDFILEMANAGER IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***",
-            "10%": "",
-            "100%": "",
-            "200%": "",
-            "25%": "",
-            "50%": "",
-            "75%": "",
-            ">List View": "",
-            ">Thumbnail View": "",
-            "A:": "",
-            "Align": "",
-            "Alt": "",
-            "Border Color": "",
-            "Constrain Proportions": "",
-            "Crop": "",
-            "D:": "",
-            "Directory": "",
-            "Directory Up": "",
-            "Edit": "",
-            "File List": "",
-            "File Manager": "",
-            "Filename:": "",
-            "Filesize:": "",
-            "Flip Horizontal": "",
-            "Flip Image": "",
-            "Flip Vertical": "",
-            "Folder": "",
-            "GIF": "",
-            "GIF format is not supported, image editing not supported.": "",
-            "H:": "",
-            "Image Editor": "",
-            "Image Selection": "",
-            "Invalid base directory:": "",
-            "JPEG High": "",
-            "JPEG Low": "",
-            "JPEG Medium": "",
-            "Loading": "",
-            "Lock": "",
-            "Marker": "",
-            "Maximum folder size limit reached. Upload disabled.": "",
-            "Measure": "",
-            "New Folder": "",
-            "No Files Found": "",
-            "No Image Available": "",
-            "Please enter value": "",
-            "PNG": "",
-            "Preset": "",
-            "Quality:": "",
-            "Refresh": "",
-            "Rename": "",
-            "Resize": "",
-            "Rotate": "",
-            "Rotate 180 &deg;": "",
-            "Rotate 90 &deg; CCW": "",
-            "Rotate 90 &deg; CW": "",
-            "Rotate Image": "",
-            "Start X:": "",
-            "Start Y:": "",
-            "Target Window": "",
-            "Toggle marker color": "",
-            "Trash": "",
-            "Upload": "",
-            "W:": "",
-            "X:": "",
-            "Xinha Image Editor": "",
-            "Y:": "",
-            "Zoom": "",
-            "Absbottom": "<<InsertImage>>",
-            "Absmiddle": "<<InsertImage>>",
-            "Baseline": "<<InlineStyler>>",
-            "Border": "<<InlineStyler>>",
-            "Bottom": "<<InlineStyler>>",
-            "Clear": "<<FindReplace>>",
-            "Color": "<<HorizontalRule>>",
-            "Copy": "<<ContextMenu>>",
-            "Cut": "<<ContextMenu>>",
-            "Height": "<<HorizontalRule>>",
-            "Height:": "<<HorizontalRule>>",
-            "Insert File Link": "<<MootoolsFileManager>>",
-            "Left": "<<HorizontalRule>>",
-            "Margin": "<<InlineStyler>>",
-            "Middle": "<<InlineStyler>>",
-            "New window (_blank)": "<<CreateLink>>",
-            "None (use implicit)": "<<CreateLink>>",
-            "Not set": "<<InsertImage>>",
-            "Padding": "<<InlineStyler>>",
-            "Positioning of this image": "<<InsertImage>>",
-            "Preview": "<<Equation>>",
-            "Right": "<<HorizontalRule>>",
-            "Same frame (_self)": "<<CreateLink>>",
-            "Save": "<<SaveSubmit>>",
-            "Texttop": "<<InsertImage>>",
-            "Title (tooltip)": "<<CreateLink>>",
-            "Top": "<<InlineStyler>>",
-            "Top frame (_top)": "<<CreateLink>>",
-            "Width": "<<HorizontalRule>>",
-            "Width:": "<<HorizontalRule>>",
-            "You must select some text before making a new link.": "<<Linker>>"
-        },
-        "Filter": {
-            "__ TRANSLATOR NOTE __": "*** FILTER IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***",
-            "Filter": "<<InsertSnippet2>>"
-        },
-        "HtmlTidy": {
-            "__ TRANSLATOR NOTE __": "*** HTMLTIDY IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***",
-            "Auto-Tidy": "",
-            "Don't Tidy": "",
-            "HTML Tidy": "",
-            "Tidy failed.  Check your HTML for syntax errors.": ""
-        },
-        "ImageManager": {
-            "__ TRANSLATOR NOTE __": "*** IMAGEMANAGER IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***",
-            "Angle:": "",
-            "Flickr Picture List": "",
-            "Flickr Pictures": "",
-            "Flickr Selection": "",
-            "Flickr Username/Email": "",
-            "Folder Name:": "",
-            "Image Format": "",
-            "Image List": "",
-            "Keyword": "",
-            "No Images Found": "",
-            "No Photos Found": "",
-            "No Videos Found": "",
-            "This Server": "",
-            "YouTube Selection": "",
-            "YouTube Username": "",
-            "YouTube Video List": "",
-            "YouTube Videos": "",
-            "A:": "<<ExtendedFileManager>>",
-            "Absbottom": "<<InsertImage>>",
-            "Absmiddle": "<<InsertImage>>",
-            "Baseline": "<<InlineStyler>>",
-            "Bottom": "<<InlineStyler>>",
-            "Clear": "<<FindReplace>>",
-            "Constrain Proportions": "<<ExtendedFileManager>>",
-            "Crop": "<<ExtendedFileManager>>",
-            "D:": "<<ExtendedFileManager>>",
-            "Directory": "<<ExtendedFileManager>>",
-            "Directory Up": "<<ExtendedFileManager>>",
-            "Edit": "<<ExtendedFileManager>>",
-            "Filename:": "<<ExtendedFileManager>>",
-            "Flip Horizontal": "<<ExtendedFileManager>>",
-            "Flip Image": "<<ExtendedFileManager>>",
-            "Flip Vertical": "<<ExtendedFileManager>>",
-            "GIF": "<<ExtendedFileManager>>",
-            "GIF format is not supported, image editing not supported.": "<<ExtendedFileManager>>",
-            "H:": "<<ExtendedFileManager>>",
-            "Height:": "<<HorizontalRule>>",
-            "Image Editor": "<<ExtendedFileManager>>",
-            "Image Selection": "<<ExtendedFileManager>>",
-            "Insert Image": "<<InsertImage>>",
-            "Invalid base directory:": "<<ExtendedFileManager>>",
-            "JPEG High": "<<ExtendedFileManager>>",
-            "JPEG Low": "<<ExtendedFileManager>>",
-            "JPEG Medium": "<<ExtendedFileManager>>",
-            "Left": "<<HorizontalRule>>",
-            "Lock": "<<ExtendedFileManager>>",
-            "Marker": "<<ExtendedFileManager>>",
-            "Measure": "<<ExtendedFileManager>>",
-            "Middle": "<<InlineStyler>>",
-            "New Folder": "<<ExtendedFileManager>>",
-            "No Image Available": "<<ExtendedFileManager>>",
-            "Not set": "<<InsertImage>>",
-            "PNG": "<<ExtendedFileManager>>",
-            "Positioning of this image": "<<InsertImage>>",
-            "Quality:": "<<ExtendedFileManager>>",
-            "Refresh": "<<ExtendedFileManager>>",
-            "Resize": "<<ExtendedFileManager>>",
-            "Right": "<<HorizontalRule>>",
-            "Rotate": "<<ExtendedFileManager>>",
-            "Rotate 180 &deg;": "<<ExtendedFileManager>>",
-            "Rotate 90 &deg; CCW": "<<ExtendedFileManager>>",
-            "Rotate 90 &deg; CW": "<<ExtendedFileManager>>",
-            "Rotate Image": "<<ExtendedFileManager>>",
-            "Save": "<<SaveSubmit>>",
-            "Start X:": "<<ExtendedFileManager>>",
-            "Start Y:": "<<ExtendedFileManager>>",
-            "Texttop": "<<InsertImage>>",
-            "Top": "<<InlineStyler>>",
-            "Trash": "<<ExtendedFileManager>>",
-            "W:": "<<ExtendedFileManager>>",
-            "Width:": "<<HorizontalRule>>",
-            "X:": "<<ExtendedFileManager>>",
-            "Y:": "<<ExtendedFileManager>>"
-        },
-        "InsertMarquee": {
-            "__ TRANSLATOR NOTE __": "*** INSERTMARQUEE IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***",
-            "Alternate": "",
-            "Background-Color:": "",
-            "Behavior:": "",
-            "Continuous": "",
-            "Direction:": "",
-            "Insert scrolling marquee": "",
-            "Marquee Editor": "",
-            "Scroll Amount:": "",
-            "Scroll Delay:": "",
-            "Slide": "",
-            "Speed Control": "",
-            "Height:": "<<HorizontalRule>>",
-            "Left": "<<HorizontalRule>>",
-            "Name": "<<Forms>>",
-            "Name/ID:": "<<Forms>>",
-            "Right": "<<HorizontalRule>>",
-            "Text:": "<<Forms>>",
-            "Width:": "<<HorizontalRule>>"
-        },
-        "InsertPicture": {
-            "__ TRANSLATOR NOTE __": "*** INSERTPICTURE IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***",
-            "Leave empty for not defined": "",
-            "Open file in new window": "",
-            " Open file in new window": "",
-            "Upload file": "",
-            "Absbottom": "<<InsertImage>>",
-            "Absmiddle": "<<InsertImage>>",
-            "Alignment:": "<<HorizontalRule>>",
-            "Alternate text:": "<<InsertImage>>",
-            "Baseline": "<<InlineStyler>>",
-            "Border thickness:": "<<InsertImage>>",
-            "Bottom": "<<InlineStyler>>",
-            "Enter the image URL here": "<<InsertImage>>",
-            "For browsers that don't support images": "<<InsertImage>>",
-            "Height:": "<<HorizontalRule>>",
-            "Horizontal padding": "<<InsertImage>>",
-            "Horizontal:": "<<InsertImage>>",
-            "Image Preview:": "<<InsertImage>>",
-            "Image URL:": "<<Forms>>",
-            "Insert Image": "<<InsertImage>>",
-            "Layout": "<<HorizontalRule>>",
-            "Leave empty for no border": "<<InsertImage>>",
-            "Left": "<<HorizontalRule>>",
-            "Middle": "<<InlineStyler>>",
-            "Not set": "<<InsertImage>>",
-            "Positioning of this image": "<<InsertImage>>",
-            "Preview": "<<Equation>>",
-            "Preview the image in a new window": "<<InsertImage>>",
-            "Right": "<<HorizontalRule>>",
-            "Size": "<<Forms>>",
-            "Spacing": "<<InsertImage>>",
-            "Texttop": "<<InsertImage>>",
-            "Top": "<<InlineStyler>>",
-            "Vertical padding": "<<InsertImage>>",
-            "Vertical:": "<<InsertImage>>",
-            "Width:": "<<HorizontalRule>>"
-        },
-        "NoteServer": {
-            "__ TRANSLATOR NOTE __": "*** NOTESERVER IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***",
-            "120%": "",
-            "150%": "",
-            "80%": "",
-            "Add GUIDO Code in a textbox on the page": "",
-            "Add MIDI link to allow students to hear the music": "",
-            "Format": "",
-            "GUIDO Code": "",
-            "Guido code": "",
-            "Image in applet": "",
-            "Insert GUIDO Music Notation": "",
-            "MIDI File": "",
-            "Source Code": "",
-            "With Mozilla, the applet will not be visible in editor, but only in Web page after submitting.": "",
-            "Zoom :": "",
-            "100%": "<<ExtendedFileManager>>",
-            "Image Preview": "<<InsertImage>>",
-            "Options": "<<FindReplace>>",
-            "Preview": "<<Equation>>",
-            "Preview the image in a new window": "<<InsertImage>>",
-            "Zoom": "<<ExtendedFileManager>>"
-        },
-        "PSLocal": {
-            "__ TRANSLATOR NOTE __": "*** PSLOCAL IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***",
-            "Confirm": "",
-            "Enable": "",
-            "Enable Gears in order to use local document storage and configuration.": "",
-            "Enabling Local Storage": "",
-            "Install": "",
-            "Learn About Local Storage": "",
-            "This will reload the page, causing you to lose any unsaved work.  Press \"OK\" to reload.": "",
-            "Xinha uses Google Gears to enable local document storage.  With Gears installed, you can save drafts of your documents on your hard drive, configure Xinha to look the way you want, and carry this information wherever you use Xinha on the web.": ""
-        },
-        "PSServer": {
-            "__ TRANSLATOR NOTE __": "*** PSSERVER IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***",
-            "File: ": "",
-            "Import": ""
-        },
-        "PersistentStorage": {
-            "__ TRANSLATOR NOTE __": "*** PERSISTENTSTORAGE IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***",
-            "Details": "",
-            "File Browser": "",
-            "Hello    There C ": "",
-            "Hello  There A ": "",
-            "Hello \" There B \"": "",
-            "Hello ' There D '": "",
-            "List of Places": "",
-            "New Document": "",
-            "Open": "",
-            "Open Document": "",
-            "Places": "",
-            "Please enter the name of the directory you'd like to create.": "",
-            "Save Document": "",
-            "This will erase any unsaved content.  If you're certain, please click OK to continue.": "",
-            "Web URL": "",
-            "Confirm": "<<PSLocal>>",
-            "Copy": "<<ContextMenu>>",
-            "Delete": "<<Abbreviation>>",
-            "Directory Up": "<<ExtendedFileManager>>",
-            "File List": "<<ExtendedFileManager>>",
-            "File Manager": "<<ExtendedFileManager>>",
-            "Filename": "<<ExtendedFileManager>>",
-            "Insert": "<<InsertNote>>",
-            "Insert Image": "<<InsertImage>>",
-            "New Folder": "<<ExtendedFileManager>>",
-            "Save": "<<SaveSubmit>>",
-            "You must select some text before making a new link.": "<<Linker>>"
-        },
-        "SpellChecker": {
-            "__ TRANSLATOR NOTE __": "*** SPELLCHECKER IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***",
-            "Dictionary": "",
-            "Finished list of mispelled words": "",
-            "HTMLArea Spell Checker": "",
-            "I will open it in a new page.": "",
-            "Ignore": "",
-            "Ignore all": "",
-            "Info": "",
-            "Learn": "",
-            "No mispelled words found with the selected dictionary.": "",
-            "Original word": "",
-            "Please confirm that you want to open this link": "",
-            "Please wait.  Calling spell checker.": "",
-            "Please wait: changing dictionary to": "",
-            "pliz weit ;-)": "",
-            "Re-check": "",
-            "Replace": "",
-            "Replace all": "",
-            "Revert": "",
-            "Spell Checker": "",
-            "Spell-check": "",
-            "Suggestions": "",
-            "This will drop changes and quit spell checker.  Please confirm.": "",
-            "Replace with": "<<FindReplace>>"
-        },
-        "Template": {
-            "__ TRANSLATOR NOTE __": "*** TEMPLATE IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***",
-            "Insert template": ""
-        },
-        "UnFormat": {
-            "__ TRANSLATOR NOTE __": "*** UNFORMAT IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***",
-            "All": "",
-            "All HTML:": "",
-            "Cleaning Area": "",
-            "Cleaning options": "",
-            "Formatting:": "",
-            "Page Cleaner": "",
-            "Select which types of formatting you would like to remove.": "",
-            "Selection": ""
-        }
-    }
-}
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/lang/merged/tr.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/lang/merged/tr.js
deleted file mode 100644
index 9f43b0c..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/lang/merged/tr.js
+++ /dev/null
@@ -1,1569 +0,0 @@
-// Xinha Language Combined Translation File
-//
-// LANG: "tr", ENCODING: UTF-8
-//
-// INSTRUCTIONS TO TRANSLATORS
-// ===========================================================================
-//
-// Your translation must be in UTF-8 Character Encoding.
-//
-// This is a JSON encoded file (plus comments), strings should be double-quote
-// only, do not use single quotes to surround strings - "hello", not 'hello'
-// do not have a trailing comma after the last entry in a section.
-//
-// Only full line comments are allowed (that a comments occupy entire lines).
-//
-// Search for the __NEW_TRANSLATIONS__ section below, this is where you will
-// want to focus, this section includes things that do not presently have a 
-// translation or for which the translation needs to be checked for accuracy.
-//
-// In the New Translations section a translation string is one of the following
-//
-//  "English String Here" : ""
-//     This means it is not translated yet, add your translation...
-//     "English String Here" : "Klingon String Here"
-//
-//  "English String Here" : "Translated String Here"
-//     This means that an existing translation for this string, in some other
-//     section has been found, and used.  Check that it is approprite for this
-//     section and if it is, that's fine leave it as is, otherwise change as
-//     appropriate.
-//
-//  "English String Here" : "<<AnotherSection>>"
-//     This means use the same translation for this string as <<AnotherSection>>
-//     this saves you re-tranlating strings.  If the Context of this section
-//     and the context of AnotherSection seem the same, that's fine leave it
-//     using that translation, but if this section needs a different translation, 
-//     you can provide it by replacing the link (<<AnotherSection>>) with that
-//     new translation.  For example - a "Table" in say "DataPlugin" is 
-//     perhaps translated differently to "Table" in "FurniturePlugin".
-//
-// TESTING YOUR TRANSLATION
-// ===========================================================================
-// Simply place your translation file on your webserver somewhere for example
-//
-//   /xinha/lang/merged/tr.js
-//
-// and then tell Xinha where to get it (before loading XinhaCore.js) by 
-//
-//  _editor_lang              = 'tr';
-//  _editor_lang_merged_file  = '/xinha/lang/merged/tr.js';
-//
-// Xinha will load your new language definition.
-//
-// SUBMITTING YOUR TRANSLATION
-// ===========================================================================
-// Simply create a Ticket on the Xinha website and attach your translation 
-// file.
-//
-// The Xinha developers will take your file and use the 
-//     contrib/lc_split_merged_file.php
-// script to load it into the Xinha distribution.
-
-{
-    "Abbreviation": {
-        "Abbreviation": "Kısaltma",
-        "Cancel": "İptal",
-        "Delete": "Sil",
-        "Expansion:": "Açılım:",
-        "OK": "Tamam"
-    },
-    "AboutBox": {
-        "About this editor": "Bu düzenleyici hakkında",
-        "Close": "Kapat"
-    },
-    "BackgroundImage": {
-        "Cancel": "İptal"
-    },
-    "CharacterMap": {
-        "Insert special character": "Özel karakter ekle"
-    },
-    "ColorPicker": {
-        "Click a color...": "Bir renk seçin",
-        "Close": "Kapat",
-        "Color: ": "Renk: ",
-        "OK": "Tamam",
-        "Sample": "Örnek",
-        "Web Safe: ": "Web güvenli mod: "
-    },
-    "ContextMenu": {
-        "Justify Center": "Ortaya hizala",
-        "Justify Full": "Tam hizala",
-        "Justify Left": "Sola hizala",
-        "Justify Right": "Sağa hizala"
-    },
-    "CreateLink": {
-        "Cancel": "İptal",
-        "Insert/Modify Link": "Bağlantı ekle/değiştir",
-        "New window (_blank)": "Yeni pencere (_blank)",
-        "None (use implicit)": "Hiçbiri (Örtük)",
-        "OK": "Tamam",
-        "Other": "Başka",
-        "Same frame (_self)": "Aynı çerçeve (_self)",
-        "Target:": "Hedef:",
-        "Title (tooltip):": "Başlık (Araç ipucu):",
-        "Top frame (_top)": "En üst çerçeve (_top)",
-        "URL:": "URL:"
-    },
-    "EditTag": {
-        "Cancel": "İptal",
-        "Edit HTML for selected text": "Seçilen metin için HTML düzenlemesi yap",
-        "OK": "Tamam",
-        "Tag Editor": "HTML etiket düzenleyicisi"
-    },
-    "Equation": {
-        "Cancel": "İptal",
-        "OK": "Tamam",
-        "Preview": "Önizleme"
-    },
-    "ExtendedFileManager": {
-        "Absbottom": "Salt alta",
-        "Absmiddle": "Salt orta",
-        "Align": "Hizala",
-        "Baseline": "Taban hizası",
-        "Border": "Kenarlık",
-        "Bottom": "Alta",
-        "Cancel": "İptal",
-        "Color": "Renk",
-        "Height": "Yükseklik",
-        "Height:": "Yükseklik",
-        "Left": "Sola",
-        "Margin": "Kenar boşluğu",
-        "Middle": "Ortala",
-        "New window (_blank)": "Yeni pencere (_blank)",
-        "None (use implicit)": "Hiçbiri (Örtük)",
-        "Not set": "Ayarlanmamış",
-        "OK": "Tamam",
-        "Padding": "İç boşluk",
-        "Positioning of this image": "Resmi konumlandırma",
-        "Preview": "Önizleme",
-        "Right": "Sağa",
-        "Same frame (_self)": "Aynı çerçeve (_self)",
-        "Texttop": "Metin-üstte",
-        "Title (tooltip)": "Başlık (Araç ipucu):",
-        "Top": "Yukarı",
-        "Top frame (_top)": "En üst çerçeve (_top)",
-        "Width": "Genişlik",
-        "Width:": "Genişlik:"
-    },
-    "Forms": {
-        "Cancel": "İptal",
-        "Image URL:": "Resim URL'si:",
-        "OK": "Tamam",
-        "Rows:": "Satır:"
-    },
-    "FullPage": {
-        "Cancel": "İptal",
-        "Description:": "Tanım",
-        "OK": "Tamam"
-    },
-    "FullScreen": {
-        "Maximize/Minimize Editor": "Editörü simge durumuna küçült/geri yükle"
-    },
-    "HorizontalRule": {
-        "Alignment:": "Hizalama:",
-        "Cancel": "İptal",
-        "Center": "Ortala",
-        "Color:": "Renk",
-        "Height:": "Yükseklik",
-        "Horizontal Rule": "Yatay cetvel",
-        "Layout": "Düzen",
-        "Left": "Sola",
-        "OK": "Tamam",
-        "Right": "Sağa",
-        "Width:": "Genişlik:",
-        "percent": "%",
-        "pixels": "Piksel"
-    },
-    "ImageManager": {
-        "Absbottom": "Salt alta",
-        "Absmiddle": "Salt orta",
-        "Baseline": "Taban hizası",
-        "Bottom": "Alta",
-        "Cancel": "İptal",
-        "Height:": "Yükseklik",
-        "Insert Image": "Resim ekle",
-        "Left": "Sola",
-        "Middle": "Ortala",
-        "Not set": "Ayarlanmamış",
-        "OK": "Tamam",
-        "Positioning of this image": "Resmi konumlandırma",
-        "Right": "Sağa",
-        "Texttop": "Metin-üstte",
-        "Top": "Yukarı",
-        "Width:": "Genişlik:"
-    },
-    "InlineStyler": {
-        "Background": "Arka plan",
-        "Baseline": "Taban hizası",
-        "Border": "Kenarlık",
-        "Bottom": "Alta",
-        "Center": "Ortala",
-        "Char": "Karakter",
-        "Collapsed borders": "Daraltılmış kenarlıklar",
-        "FG Color": "Ön plan rengi",
-        "Float": "Kaydır",
-        "Height": "Yükseklik",
-        "Image URL": "Resim URL'si",
-        "Justify": "Yasla",
-        "Layout": "Düzen",
-        "Left": "Sola",
-        "Margin": "Kenar boşluğu",
-        "Middle": "Ortala",
-        "None": "Hiçbiri",
-        "Padding": "İç boşluk",
-        "Right": "Sağa",
-        "Text align": "Metin hizası",
-        "Top": "Yukarı",
-        "Vertical align": "Dikey hiza",
-        "Width": "Genişlik",
-        "percent": "%",
-        "pixels": "Piksel"
-    },
-    "InsertAnchor": {
-        "Cancel": "İptal",
-        "Delete": "Sil",
-        "OK": "Tamam"
-    },
-    "InsertImage": {
-        "Absbottom": "Salt alta",
-        "Absmiddle": "Salt orta",
-        "Alignment:": "Hizalama:",
-        "Alternate text:": "Alternatif metin:",
-        "Baseline": "Taban hizası",
-        "Border thickness:": "Kenarlık kalınlığı:",
-        "Bottom": "Alta",
-        "Cancel": "İptal",
-        "Enter the image URL here": "Lütfen buraya resim URL'sini girin",
-        "For browsers that don't support images": "Resim desteklemeyen tarayıcılar için",
-        "Horizontal padding": "Yatay doldurma miktarı",
-        "Horizontal:": "Yatay:",
-        "Image Preview:": "Resim önizleme:",
-        "Image URL:": "Resim URL'si:",
-        "Insert Image": "Resim ekle",
-        "Layout": "Düzen",
-        "Leave empty for no border": "Kenarlık istemiyorsanız boş bırakın",
-        "Left": "Sola",
-        "Middle": "Ortala",
-        "Not set": "Ayarlanmamış",
-        "OK": "Tamam",
-        "Positioning of this image": "Resmi konumlandırma",
-        "Preview": "Önizleme",
-        "Preview the image in a new window": "Resmi yeni pencerede önizleme",
-        "Right": "Sağa",
-        "Spacing": "Aralık",
-        "Texttop": "Metin-üstte",
-        "Top": "Yukarı",
-        "Vertical padding": "Dikey doldurma miktarı",
-        "Vertical:": "Dikey:",
-        "You must enter the URL": "Lütfen URL girin"
-    },
-    "InsertMarquee": {
-        "Cancel": "İptal",
-        "Height:": "Yükseklik",
-        "Left": "Sola",
-        "OK": "Tamam",
-        "Right": "Sağa",
-        "Width:": "Genişlik:"
-    },
-    "InsertNote": {
-        "Cancel": "İptal"
-    },
-    "InsertPicture": {
-        "Absbottom": "Salt alta",
-        "Absmiddle": "Salt orta",
-        "Alignment:": "Hizalama:",
-        "Alternate text:": "Alternatif metin:",
-        "Baseline": "Taban hizası",
-        "Border thickness:": "Kenarlık kalınlığı:",
-        "Bottom": "Alta",
-        "Cancel": "İptal",
-        "Enter the image URL here": "Lütfen buraya resim URL'sini girin",
-        "For browsers that don't support images": "Resim desteklemeyen tarayıcılar için",
-        "Height:": "Yükseklik",
-        "Horizontal padding": "Yatay doldurma miktarı",
-        "Horizontal:": "Yatay:",
-        "Image Preview:": "Resim önizleme:",
-        "Image URL:": "Resim URL'si:",
-        "Insert Image": "Resim ekle",
-        "Layout": "Düzen",
-        "Leave empty for no border": "Kenarlık istemiyorsanız boş bırakın",
-        "Left": "Sola",
-        "Middle": "Ortala",
-        "Not set": "Ayarlanmamış",
-        "OK": "Tamam",
-        "Positioning of this image": "Resmi konumlandırma",
-        "Preview": "Önizleme",
-        "Preview the image in a new window": "Resmi yeni pencerede önizleme",
-        "Right": "Sağa",
-        "Spacing": "Aralık",
-        "Texttop": "Metin-üstte",
-        "Top": "Yukarı",
-        "Vertical padding": "Dikey doldurma miktarı",
-        "Vertical:": "Dikey:",
-        "Width:": "Genişlik:"
-    },
-    "InsertSmiley": {
-        "Insert Smiley": "Gülen yüz ekle"
-    },
-    "InsertSnippet": {
-        "Cancel": "İptal"
-    },
-    "InsertSnippet2": {
-        "Cancel": "İptal"
-    },
-    "InsertTable": {
-        "Absbottom": "Salt alta",
-        "Absmiddle": "Salt orta",
-        "Alignment:": "Hizalama:",
-        "Baseline": "Taban hizası",
-        "Border": "Kenarlık",
-        "Border thickness:": "Kenarlık kalınlığı:",
-        "Bottom": "Alta",
-        "Cancel": "İptal",
-        "Caption": "Başlık",
-        "Cell padding:": "Hücre doldurma:",
-        "Cell spacing:": "Hücre aralığı:",
-        "Cols:": "Sütun:",
-        "Em": "Em",
-        "Fixed width columns": "Sabit başlı sütun",
-        "Insert Table": "Tablo ekle",
-        "Layout": "Düzen",
-        "Leave empty for no border": "Kenarlık istemiyorsanız boş bırakın",
-        "Left": "Sola",
-        "Middle": "Ortala",
-        "Not set": "Ayarlanmamış",
-        "Number of columns": "Sütun sayısı",
-        "Number of rows": "Satır sayısı",
-        "OK": "Tamam",
-        "Percent": "Yüzde",
-        "Pixels": "Piksel",
-        "Positioning of this table": "Tablo konumlandırma",
-        "Right": "Sağa",
-        "Rows:": "Satır:",
-        "Space between adjacent cells": "Bitişik hücre aralığı",
-        "Space between content and border in cell": "İç kenarlığı ve hücre içeriği arasındaki boşluk",
-        "Spacing": "Aralık",
-        "Texttop": "Metin-üstte",
-        "Top": "Yukarı",
-        "Width of the table": "Tablo genişliği",
-        "Width unit": "Genişlik birimi",
-        "Width:": "Genişlik:",
-        "You must enter a number of columns": "Lütfen sütun sayısını girin",
-        "You must enter a number of rows": "Lütfen satır sayısını girin"
-    },
-    "Linker": {
-        "Cancel": "İptal",
-        "Insert/Modify Link": "Bağlantı ekle/değiştir",
-        "OK": "Tamam",
-        "Target:": "Hedef:",
-        "URL:": "URL:"
-    },
-    "NoteServer": {
-        "Cancel": "İptal",
-        "Image Preview": "Resim önizleme:",
-        "OK": "Tamam",
-        "Preview": "Önizleme",
-        "Preview the image in a new window": "Resmi yeni pencerede önizleme"
-    },
-    "Opera": {
-        "The Paste button does not work in Mozilla based web browsers (technical security reasons). Press CTRL-V on your keyboard to paste directly.": "Güvenlik sebeplerinden dolayı bazı tarayıcılar kes/kopyala/yapıştır komutlarına erişemez. Kesme/kopyalama/yapıştırma komutunu kullanmak için lütfen  klavyenizin kısayollarını kullanın (CTRL + C/V/X)."
-    },
-    "PSLocal": {
-        "Cancel": "İptal"
-    },
-    "PasteText": {
-        "Cancel": "İptal",
-        "OK": "Tamam"
-    },
-    "PersistentStorage": {
-        "Cancel": "İptal",
-        "Delete": "Sil",
-        "Insert Image": "Resim ekle"
-    },
-    "QuickTag": {
-        "Cancel": "İptal"
-    },
-    "SetId": {
-        "Cancel": "İptal",
-        "Delete": "Sil",
-        "OK": "Tamam"
-    },
-    "SmartReplace": {
-        "OK": "Tamam"
-    },
-    "SpellChecker": {
-        "Cancel": "İptal",
-        "OK": "Tamam"
-    },
-    "SuperClean": {
-        "Cancel": "İptal",
-        "OK": "Tamam"
-    },
-    "TableOperations": {
-        "All four sides": "Dört kenarı da",
-        "Borders": "Kenarlıklar",
-        "Cancel": "İptal",
-        "Caption": "Başlık",
-        "Cell Properties": "Hücre özellikleri",
-        "Cell properties": "Satır özellikleri",
-        "Delete cell": "Hücreyi sil",
-        "Delete column": "Sütunu sil",
-        "Delete row": "Sırayı sil",
-        "Description": "Tanım",
-        "Frames": "Çerçeveler",
-        "Insert cell after": "Sağına satır ekle",
-        "Insert cell before": "Soluna satır ekle",
-        "Insert column after": "Sağına sütun ekle",
-        "Insert column before": "Soluna sütun ekle",
-        "Insert row after": "Soluna sıra ekle",
-        "Insert row before": "Sağına sıra ekle",
-        "Merge cells": "Satırları birleştir",
-        "No rules": "Çizgi olmasın",
-        "No sides": "Kenar olmasın",
-        "OK": "Tamam",
-        "Padding": "İç boşluk",
-        "Please click into some cell": "Lütfen bir hücre seçin",
-        "Row Properties": "Satır özellikleri",
-        "Row properties": "Sıra özellikleri",
-        "Rows": "Satır:",
-        "Rules will appear between all rows and columns": "Tüm satır ve sütunların arasında",
-        "Rules will appear between columns only": "Yalnızca sütunların arasında",
-        "Rules will appear between rows only": "Yalnızca satırların arasında",
-        "Spacing": "Aralık",
-        "Spacing and padding": "Aralıklar",
-        "Split column": "Sütunu böl",
-        "Split row": "Sütunu böl",
-        "Summary": "Özet",
-        "Table Properties": "Tablo özellikleri",
-        "Table properties": "Tablo özellikleri",
-        "The bottom side only": "Yalnız alt taraf",
-        "The left-hand side only": "Yalnız sol taraf",
-        "The right and left sides only": "Yalnız sağ ve sol taraf",
-        "The right-hand side only": "Yalnız sağ taraf",
-        "The top and bottom sides only": "Yalnız üst ve alt taraf",
-        "The top side only": "Yalnız üst taraf",
-        "Xinha cowardly refuses to delete the last cell in row.": "Satırdaki son hücre silinemez",
-        "Xinha cowardly refuses to delete the last column in table.": "Tablodaki son sütun silinemez",
-        "Xinha cowardly refuses to delete the last row in table.": "Tablodaki son satır silinemez",
-        "pixels": "Piksel"
-    },
-    "Template": {
-        "Cancel": "İptal"
-    },
-    "UnFormat": {
-        "Cancel": "İptal",
-        "OK": "Tamam"
-    },
-    "Xinha": {
-        "&#8212; format &#8212;": "&#8212; Bçim &#8212;",
-        "About this editor": "Bu düzenleyici hakkında",
-        "Address": "Adres",
-        "Background Color": "Arka plan rengi",
-        "Bold": "Kalın",
-        "Bulleted List": "Madde işaretli liste",
-        "Clean content pasted from Word": "Word'dan yapıştırılan içeriği temizle",
-        "Clear Inline Font Specifications": "Yazı tipi biçimlendirmesini sil",
-        "Clear MSOffice tags": "MSOffice etiketlerini sil",
-        "Close": "Kapat",
-        "Constructing object": "Nesne oluşturuluyor",
-        "Copy selection": "Seçimi kopyala",
-        "Create Statusbar": "Durum çubuğu oluşturuluyor",
-        "Create Toolbar": "Araç çubuğu oluşturuluyor",
-        "Current style": "Geçerli stil",
-        "Cut selection": "Seçimi kes",
-        "Decrease Indent": "Girintiyi azalt",
-        "Direction left to right": "Belge yönlendirmesi soldan sağa",
-        "Direction right to left": "Belde yönlendirmesi sağdan sola",
-        "Finishing": "Başlatılıyor",
-        "Font Color": "Yazı tipi rengi",
-        "Formatted": "Biçimli",
-        "Generate Xinha framework": "Xinha çerçevesi oluşturuluyor",
-        "Heading 1": "Başlık 1",
-        "Heading 2": "Başlık 2",
-        "Heading 3": "Başlık 3",
-        "Heading 4": "Başlık 4",
-        "Heading 5": "Başlık 5",
-        "Heading 6": "Başlık 6",
-        "Headings": "Başlık türleri",
-        "Help using editor": "Yardım",
-        "Horizontal Rule": "Yatay cetvel",
-        "Increase Indent": "Girintiyi arttır",
-        "Init editor size": "Editör büyüklüğü tanımlanıyor",
-        "Insert Table": "Tablo ekle",
-        "Insert Web Link": "Web bağlantısı gir",
-        "Insert/Modify Image": "Resim ekle/değiştir",
-        "Insert/Overwrite": "Ekle/Üzerine yaz",
-        "Italic": "İtalik",
-        "Justify Center": "Ortaya hizala",
-        "Justify Full": "Tam hizala",
-        "Justify Left": "Sola hizala",
-        "Justify Right": "Sağa hizala",
-        "Keyboard shortcuts": "Klavye kısayolları",
-        "Loading in progress. Please wait!": "Editör yükleniyor. Lütfen bekleyin!",
-        "Loading plugin $plugin": "$plugin yükleniyor",
-        "Normal": "Normal (Paragraf)",
-        "Ordered List": "Sıralı liste",
-        "Paste from clipboard": "Panodan yapıştır",
-        "Path": "Yol",
-        "Print document": "Belgeyi yazdır",
-        "Redoes your last action": "Yinele",
-        "Register plugin $plugin": "$plugin kayıt ediliyor",
-        "Remove formatting": "Biçimlendirmeyi kaldır",
-        "Save as": "Farklı kaydet",
-        "Select all": "Tümünü seç",
-        "Set format to paragraph": "Paragrafın biçimini ayarla",
-        "Split Block": "Bloğu böl",
-        "Strikethrough": "Üstü çizili",
-        "Subscript": "Altsimge",
-        "Superscript": "Üstsimge",
-        "The editor provides the following key combinations:": "Editörün desteklediği kombinasyonlar:",
-        "Toggle Borders": "Tablo kenarlıklarını göster/gösterme",
-        "Toggle HTML Source": "HTML kaynak kodunu aç/kapat",
-        "Underline": "Altı çizili",
-        "Undoes your last action": "Geri al",
-        "Would you like to clear font colours?": "Yazı tipi renklerini sıfırlamak mı istiyorsunuz?",
-        "Would you like to clear font sizes?": "Yazı tipi boyutlarını sıfırlamak mı istiyorsunuz?",
-        "Would you like to clear font typefaces?": "Yazı tipi biçimlendirmesini silmek mı istiyorsunuz?",
-        "You are in TEXT MODE.  Use the [<>] button to switch back to WYSIWYG.": "Metin modundasınız. Görsel moda (WYSIWIG) dönmek için [<>] düğmesine tıklayın.",
-        "insert linebreak": "Satır sonu ekle",
-        "new paragraph": "Yeni paragraf"
-    },
-    "__NEW_TRANSLATIONS__": {
-        "CharCounter": {
-            "... in progress": "",
-            "Chars": "",
-            "HTML": "",
-            "Words": ""
-        },
-        "ContextMenu": {
-            "_Delete Row": "",
-            "_Image Properties...": "",
-            "_Modify Link...": "",
-            "_Remove Link...": "",
-            "_Table Properties...": "",
-            "C_ell Properties...": "",
-            "Chec_k Link...": "",
-            "Copy": "",
-            "Create a link": "",
-            "Current URL is": "",
-            "Cut": "",
-            "De_lete Column": "",
-            "Delete Cell": "",
-            "Delete the current column": "",
-            "Delete the current row": "",
-            "How did you get here? (Please report!)": "",
-            "I_nsert Row Before": "",
-            "In_sert Row After": "",
-            "Insert _Column Before": "",
-            "Insert a new column after the current one": "",
-            "Insert a new column before the current one": "",
-            "Insert a new row after the current one": "",
-            "Insert a new row before the current one": "",
-            "Insert a paragraph after the current node": "",
-            "Insert a paragraph before the current node": "",
-            "Insert C_olumn After": "",
-            "Insert Cell After": "",
-            "Insert Cell Before": "",
-            "Insert paragraph after": "",
-            "Insert paragraph before": "",
-            "Link points to:": "",
-            "Make lin_k...": "",
-            "Merge Cells": "",
-            "Opens this link in a new window": "",
-            "Paste": "",
-            "Please confirm that you want to remove this element:": "",
-            "Please confirm that you want to unlink this element.": "",
-            "Remove the $elem Element...": "",
-            "Remove this node from the document": "",
-            "Ro_w Properties...": "",
-            "Show the image properties dialog": "",
-            "Show the Table Cell Properties dialog": "",
-            "Show the Table Properties dialog": "",
-            "Show the Table Row Properties dialog": "",
-            "Unlink the current element": ""
-        },
-        "CreateLink": {
-            "Are you sure you wish to remove this link?": "",
-            "You need to select some text before creating a link": ""
-        },
-        "DefinitionList": {
-            "definition description": "",
-            "definition list": "",
-            "definition term": ""
-        },
-        "Dialogs": {
-            "Some Text Here": ""
-        },
-        "DynamicCSS": {
-            "Choose stylesheet": "",
-            "Default": "",
-            "Undefined": ""
-        },
-        "EditTag": {
-            "Edit Tag By Peg": ""
-        },
-        "Equation": {
-            "!=": "",
-            "!in": "",
-            "&gt;-": "",
-            "&gt;=": "",
-            "&lt;=": "",
-            "&lt;=&gt;": "",
-            "&lt;x&gt;": "",
-            "&nbsp; `!` &nbsp;": "",
-            "&nbsp; `.` &nbsp;": "",
-            "&nbsp; `0` &nbsp;": "",
-            "&nbsp; `2` &nbsp;": "",
-            "&nbsp; `3` &nbsp;": "",
-            "&nbsp; `4` &nbsp;": "",
-            "&nbsp; `5` &nbsp;": "",
-            "&nbsp; `6` &nbsp;": "",
-            "&nbsp; `7` &nbsp;": "",
-            "&nbsp; `8` &nbsp;": "",
-            "&nbsp; `9` &nbsp;": "",
-            "&nbsp; `e` &nbsp;": "",
-            "&nbsp;&nbsp;`1` &nbsp;": "",
-            "&nbsp;`+{::}`&nbsp;": "",
-            "&nbsp;`-:\\ `": "",
-            "&nbsp;`-{::}`&nbsp;": "",
-            "&nbsp;`C`&nbsp;": "",
-            "&nbsp;`cos`": "",
-            "&nbsp;`ln`&nbsp;": "",
-            "&nbsp;`pi` &nbsp;": "",
-            "&nbsp;`sin`": "",
-            "&nbsp;`tan`": "",
-            "&nbsp;`times`&nbsp;": "",
-            "&quot;text&quot;": "",
-            "'+formula+'": "",
-            "((n),(k))": "",
-            "(x+1)/(x-1)": "",
-            "*": "",
-            "**": "",
-            "+-": "",
-            "-&gt;": "",
-            "-&lt;": "",
-            "-:": "",
-            "-=": "",
-            "//": "",
-            "/_": "",
-            ":.": "",
-            "=&gt;": "",
-            "@": "",
-            "[[a,b],[c,d]]": "",
-            "\\\\": "",
-            "\\nClick in the box to use your keyboard or use the buttons\\n": "",
-            "^^": "",
-            "^^^": "",
-            "__|": "",
-            "_|_": "",
-            "`!=`": "",
-            "`!in`": "",
-            "`&and;`": "",
-            "`&cap;`": "",
-            "`&cup;`": "",
-            "`&gt;-`": "",
-            "`&gt;=`": "",
-            "`&lt;=&gt;`": "",
-            "`&lt;=`": "",
-            "`&lt;x&gt;`": "",
-            "`&or;`": "",
-            "`&quot;text&quot;`": "",
-            "`((n),(k))`": "",
-            "`(x+1)/(x-1)`": "",
-            "`**`": "",
-            "`*`": "",
-            "`+-`": "",
-            "`-&gt;`": "",
-            "`-&lt;`": "",
-            "`-:`": "",
-            "`-=`": "",
-            "`//`": "",
-            "`/_`": "",
-            "`:.`": "",
-            "`=&gt;`": "",
-            "`@`": "",
-            "`[[a,b],[c,d]]`": "",
-            "`\\\\`": "",
-            "`__|`": "",
-            "`_|_`": "",
-            "`AA`": "",
-            "`aleph`": "",
-            "`alpha`": "",
-            "`and`": "",
-            "`bara`": "",
-            "`bba`": "",
-            "`bbba`": "",
-            "`beta`": "",
-            "`CC`": "",
-            "`cca`": "",
-            "`chi`": "",
-            "`darr`": "",
-            "`ddota`": "",
-            "`del`": "",
-            "`Delta`": "",
-            "`delta`": "",
-            "`diamond`": "",
-            "`dota`": "",
-            "`dy/dx`": "",
-            "`EE`": "",
-            "`epsi`": "",
-            "`eta`": "",
-            "`fra`": "",
-            "`Gamma`": "",
-            "`gamma`": "",
-            "`grad`": "",
-            "`harr`": "",
-            "`hArr`": "",
-            "`hata`": "",
-            "`if`": "",
-            "`in`": "",
-            "`int`": "",
-            "`iota`": "",
-            "`kappa`": "",
-            "`lambda`": "",
-            "`Lambda`": "",
-            "`lArr`": "",
-            "`larr`": "",
-            "`lim_(x-&gt;oo)`": "",
-            "`log`": "",
-            "`mu`": "",
-            "`NN`": "",
-            "`nn`": "",
-            "`not`": "",
-            "`nu`": "",
-            "`o+`": "",
-            "`o.`": "",
-            "`O/`": "",
-            "`oint`": "",
-            "`omega`": "",
-            "`Omega`": "",
-            "`oo`": "",
-            "`or`": "",
-            "`ox`": "",
-            "`Phi`": "",
-            "`phi`": "",
-            "`Pi`": "",
-            "`pi`": "",
-            "`prod`": "",
-            "`prop`": "",
-            "`Psi`": "",
-            "`psi`": "",
-            "`QQ`": "",
-            "`quad`": "",
-            "`rArr`": "",
-            "`rho`": "",
-            "`root(n)(x)`": "",
-            "`RR`": "",
-            "`sfa`": "",
-            "`sigma`": "",
-            "`Sigma`": "",
-            "`sqrt(x)`": "",
-            "`square`": "",
-            "`stackrel(-&gt;)(+)`": "",
-            "`sub`": "",
-            "`sube`": "",
-            "`sum`": "",
-            "`sup`": "",
-            "`supe`": "",
-            "`tau`": "",
-            "`Theta`": "",
-            "`theta`": "",
-            "`TT`": "",
-            "`tta`": "",
-            "`uarr`": "",
-            "`ula`": "",
-            "`upsilon`": "",
-            "`uu`": "",
-            "`veca`": "",
-            "`vv`": "",
-            "`x_(mn)`": "",
-            "`Xi`": "",
-            "`xi`": "",
-            "`xx`": "",
-            "`zeta`": "",
-            "`ZZ`": "",
-            "`|-&gt;`": "",
-            "`|--`": "",
-            "`|==`": "",
-            "`|__`": "",
-            "`|~`": "",
-            "`~=`": "",
-            "`~|`": "",
-            "`~~`": "",
-            "AA": "",
-            "aleph": "",
-            "alpha": "",
-            "and": "",
-            "AsciiMath Formula Input": "",
-            "AsciiMathML Example": "",
-            "bara": "",
-            "Based on ASCIIMathML by": "",
-            "bba": "",
-            "bbba": "",
-            "beta": "",
-            "CC": "",
-            "cca": "",
-            "chi": "",
-            "darr": "",
-            "ddota": "",
-            "del": "",
-            "Delta": "",
-            "delta": "",
-            "diamond": "",
-            "dota": "",
-            "dy/dx": "",
-            "EE": "",
-            "epsi": "",
-            "eta": "",
-            "For more information on AsciiMathML visit this page:": "",
-            "Formula Editor": "",
-            "fra": "",
-            "gamma": "",
-            "Gamma": "",
-            "grad": "",
-            "hArr": "",
-            "harr": "",
-            "hata": "",
-            "if": "",
-            "in": "",
-            "Input": "",
-            "int": "",
-            "int_a^bf(x)dx": "",
-            "iota": "",
-            "kappa": "",
-            "Lambda": "",
-            "lambda": "",
-            "larr": "",
-            "lArr": "",
-            "lim_(x-&gt;oo)": "",
-            "mu": "",
-            "NN": "",
-            "nn": "",
-            "nnn": "",
-            "not": "",
-            "nu": "",
-            "o+": "",
-            "o.": "",
-            "O/": "",
-            "oint": "",
-            "omega": "",
-            "Omega": "",
-            "oo": "",
-            "or": "",
-            "ox": "",
-            "Phi": "",
-            "phi": "",
-            "pi": "",
-            "Pi": "",
-            "prod": "",
-            "prop": "",
-            "psi": "",
-            "Psi": "",
-            "QQ": "",
-            "quad": "",
-            "rArr": "",
-            "rho": "",
-            "root(n)(x)": "",
-            "RR": "",
-            "sfa": "",
-            "sigma": "",
-            "Sigma": "",
-            "sqrt(x)": "",
-            "square": "",
-            "stackrel(-&gt;)(+)": "",
-            "sub": "",
-            "sube": "",
-            "sum": "",
-            "sum_(n=1)^oo": "",
-            "sup": "",
-            "supe": "",
-            "tau": "",
-            "Theta": "",
-            "theta": "",
-            "TT": "",
-            "tta": "",
-            "uarr": "",
-            "ula": "",
-            "upsilon": "",
-            "uu": "",
-            "uuu": "",
-            "veca": "",
-            "vv": "",
-            "vvv": "",
-            "x^(m+n)": "",
-            "x_(mn)": "",
-            "Xi": "",
-            "xi": "",
-            "xx": "",
-            "zeta": "",
-            "ZZ": "",
-            "|-&gt;": "",
-            "|--": "",
-            "|==": "",
-            "|__": "",
-            "|~": "",
-            "~=": "",
-            "~|": "",
-            "~~": ""
-        },
-        "FancySelects": {
-            "'+opt.text+'": ""
-        },
-        "FindReplace": {
-            "';\r\n  var tagc = '": "",
-            "Case sensitive search": "",
-            "Clear": "",
-            "Done": "",
-            "Enter the text you want to find": "",
-            "Find and Replace": "",
-            "found item": "",
-            "found items": "",
-            "Highlight": "",
-            "Inform a replacement word": "",
-            "Next": "",
-            "not found": "",
-            "Options": "",
-            "Replace with:": "",
-            "replaced item": "",
-            "replaced items": "",
-            "Search for:": "",
-            "Substitute all occurrences": "",
-            "Substitute this occurrence?": "",
-            "Undo": "",
-            "Whole words only": ""
-        },
-        "FormOperations": {
-            "Enter the name for new option.": "",
-            "Form Editor": "",
-            "Insert a check box.": "",
-            "Insert a Form.": "",
-            "Insert a multi-line text field.": "",
-            "Insert a radio button.": "",
-            "Insert a select field.": "",
-            "Insert a submit/reset button.": "",
-            "Insert a text, password or hidden field.": "",
-            "Message Sent": "",
-            "Please Select...": ""
-        },
-        "Forms": {
-            "'onClick'=": "",
-            "Access Key:": "",
-            "Action URL:": "",
-            "Button Script": "",
-            "Checked": "",
-            "Columns:": "",
-            "Default text (optional)": "",
-            "Dimensions": "",
-            "Disabled": "",
-            "Encoding:": "",
-            "For Control:": "",
-            "Form": "",
-            "Form Element: FIELDSET": "",
-            "Form Element: INPUT": "",
-            "Form Element: LABEL": "",
-            "Form Element: SELECT": "",
-            "Form Element: TEXTAREA": "",
-            "Form handler script": "",
-            "Form Name:": "",
-            "Get": "",
-            "Hard": "",
-            "Height in number of rows": "",
-            "HTML-Form to CGI (default)": "",
-            "Image source": "",
-            "Initial Text:": "",
-            "Insert/Edit Form": "",
-            "Insert/Edit Form Element FIELDSET": "",
-            "Insert/Edit Form Element INPUT": "",
-            "Insert/Edit Form Element LABEL": "",
-            "Insert/Edit Form Element SELECT": "",
-            "Insert/Edit Form Element TEXTAREA": "",
-            "Javascript for button click": "",
-            "Label:": "",
-            "Legend:": "",
-            "Max length:": "",
-            "Maximum number of characters accepted": "",
-            "Method:": "",
-            "multipart Form Data (File-Upload)": "",
-            "Name": "",
-            "Name of the form input": "",
-            "Name of the form select": "",
-            "name of the textarea": "",
-            "Name/ID:": "",
-            "normal": "",
-            "nowrap": "",
-            "Off": "",
-            "Physical": "",
-            "Please enter a Label": "",
-            "Post": "",
-            "pre": "",
-            "Read Only": "",
-            "Size of text box in characters": "",
-            "Size:": "",
-            "Soft": "",
-            "Tab Index:": "",
-            "Target Frame:": "",
-            "Text:": "",
-            "URL of image": "",
-            "Value of the form input": "",
-            "Value:": "",
-            "Virtual": "",
-            "Width in number of characters": "",
-            "Wrap Mode:": "",
-            "You must enter a Name": "",
-            "Options": "<<FindReplace>>"
-        },
-        "FullPage": {
-            "...": "",
-            "Alternate style-sheet:": "",
-            "Background color:": "",
-            "Character set:": "",
-            "cyrillic (ISO-8859-5)": "",
-            "cyrillic (KOI8-R)": "",
-            "cyrillic (WINDOWS-1251)": "",
-            "DOCTYPE:": "",
-            "Document properties": "",
-            "Document title:": "",
-            "Keywords:": "",
-            "Primary style-sheet:": "",
-            "Text color:": "",
-            "UTF-8 (recommended)": "",
-            "western (ISO-8859-1)": ""
-        },
-        "Gecko": {
-            "The Paste button does not work in this browser for security reasons. Press CTRL-V on your keyboard to paste directly.": ""
-        },
-        "HorizontalRule": {
-            "&#x00d7;": "",
-            "&nbsp;": "",
-            "Insert/edit horizontal rule": "",
-            "Insert/Edit Horizontal Rule": "",
-            "No shading": "",
-            "Style": ""
-        },
-        "InlineStyler": {
-            "CSS Style": "",
-            "-": "<<Equation>>"
-        },
-        "InsertAnchor": {
-            "Anchor name": "",
-            "Insert Anchor": ""
-        },
-        "InsertNote": {
-            "Insert": "",
-            "Insert footnote": "",
-            "Insert Note": ""
-        },
-        "InsertPagebreak": {
-            "Page break": "",
-            "Page Break": ""
-        },
-        "InsertSnippet": {
-            "\\n  This is an information about something\\n": "",
-            "Hide preview": "",
-            "Insert as": "",
-            "Insert Snippet": "",
-            "InsertSnippet for Xinha": "",
-            "Link1": "",
-            "Link2": "",
-            "Link3": "",
-            "Link4": "",
-            "Link5": "",
-            "Show preview": "",
-            "This is an information about something": "",
-            "Variable": ""
-        },
-        "InsertSnippet2": {
-            "All Categories": "",
-            "Filter": "",
-            "Insert as HTML": "",
-            "Insert as template variable": "",
-            "Only search word beginning": "",
-            "HTML": "<<CharCounter>>",
-            "Insert Snippet": "<<InsertSnippet>>",
-            "InsertSnippet for Xinha": "<<InsertSnippet>>",
-            "Variable": "<<InsertSnippet>>"
-        },
-        "InsertTable": {
-            "Caption for the table": "",
-            "Collapse borders:": "",
-            "Layou": "",
-            "Style of the border": ""
-        },
-        "LangMarks": {
-            "&mdash; language &mdash;": "",
-            "', '": "",
-            "English": "",
-            "French": "",
-            "Greek": "",
-            "language select": "",
-            "Latin": ""
-        },
-        "Linker": {
-            "(px)": "",
-            "Anchor-Link": "",
-            "Anchor:": "",
-            "Email Address:": "",
-            "Email Link": "",
-            "Location Bar:": "",
-            "Menu Bar:": "",
-            "Message Template:": "",
-            "New Window": "",
-            "Ordinary Link": "",
-            "Popup Window": "",
-            "PopupWindow": "",
-            "Remove Link": "",
-            "Resizeable:": "",
-            "Same Window (jump out of frames)": "",
-            "Scrollbars:": "",
-            "Shows On Hover": "",
-            "Status Bar:": "",
-            "Subject:": "",
-            "Title:": "",
-            "Toolbar:": "",
-            "URL Link": "",
-            "You must select some text before making a new link.": "",
-            "Are you sure you wish to remove this link?": "<<CreateLink>>",
-            "Name:": "<<Forms>>",
-            "Size:": "<<Forms>>"
-        },
-        "ListType": {
-            "Choose list style type (for ordered lists)": "",
-            "Decimal numbers": "",
-            "Lower greek letters": "",
-            "Lower latin letters": "",
-            "Lower roman numbers": "",
-            "Upper latin letters": "",
-            "Upper roman numbers": ""
-        },
-        "MootoolsFileManager": {
-            "Insert File Link": "",
-            "You must select some text before making a new link.": "<<Linker>>"
-        },
-        "Opera": {
-            "MARK": ""
-        },
-        "PasteText": {
-            "Insert text in new paragraph": "",
-            "Paste as Plain Text": ""
-        },
-        "PreserveScripts": {
-            "JavaScript": "",
-            "PHP": ""
-        },
-        "QuickTag": {
-            "',\r\n                           'cl': '": "",
-            "ATTRIBUTES": "",
-            "Colors": "",
-            "Enter the TAG you want to insert": "",
-            "No CSS class avaiable": "",
-            "Ok": "",
-            "OPTIONS": "",
-            "Quick Tag Editor": "",
-            "TAGs": "",
-            "There are some unclosed quote": "",
-            "This attribute already exists in the TAG": "",
-            "You have to select some text": ""
-        },
-        "SaveSubmit": {
-            "in progress": "",
-            "Ready": "",
-            "Save": "",
-            "Saving...": ""
-        },
-        "SetId": {
-            "ID/Name:": "",
-            "Set Id and Name": "",
-            "Set Id/Name": "",
-            "Set ID/Name": ""
-        },
-        "SmartReplace": {
-            "ClosingDoubleQuotes": "",
-            "ClosingSingleQuote": "",
-            "Convert all quotes and dashes in the current document": "",
-            "Enable automatic replacements": "",
-            "OpeningDoubleQuotes": "",
-            "OpeningSingleQuote": "",
-            "SmartReplace": "",
-            "SmartReplace Settings": ""
-        },
-        "Stylist": {
-            "Styles": ""
-        },
-        "SuperClean": {
-            "Clean bad HTML from Microsoft Word.": "",
-            "Clean Selection Only": "",
-            "Clean up HTML": "",
-            "Cleaning Scope": "",
-            "General tidy up and correction of some problems.": "",
-            "Please select from the following cleaning options...": "",
-            "Please stand by while cleaning in process...": "",
-            "Remove alignment (left/right/justify).": "",
-            "Remove all classes (CSS).": "",
-            "Remove All HTML Tags": "",
-            "Remove all styles (CSS).": "",
-            "Remove custom font sizes.": "",
-            "Remove custom text colors.": "",
-            "Remove custom typefaces (font \"styles\").": "",
-            "Remove emphasis and annotations.": "",
-            "Remove lang attributes.": "",
-            "Remove Paragraphs": "",
-            "Remove superscripts and subscripts.": "",
-            "Replace directional quote marks with non-directional quote marks.": "",
-            "Vigorously purge HTML from Microsoft Word.": ""
-        },
-        "TableOperations": {
-            "Cell Type:": "",
-            "Cells down": "",
-            "Cells to the right, and": "",
-            "Do Not Change": "",
-            "Frame and borders": "",
-            "Header (th)": "",
-            "Merge current cell with:": "",
-            "Normal (td)": "",
-            "Columns": "<<Forms>>",
-            "Merge Cells": "<<ContextMenu>>"
-        },
-        "UnsavedChanges": {
-            "You have unsaved changes in the editor": ""
-        },
-        "WebKit": {
-            "The Paste button does not work in this browser for security reasons. Press CTRL-V on your keyboard to paste directly.": "<<Gecko>>"
-        },
-        "Xinha": {
-            "&#8212; font &#8212;": "",
-            "&#8212; size &#8212;": "",
-            "1 (8 pt)": "",
-            "2 (10 pt)": "",
-            "3 (12 pt)": "",
-            "4 (14 pt)": "",
-            "5 (18 pt)": "",
-            "6 (24 pt)": "",
-            "7 (36 pt)": "",
-            "Arial": "",
-            "Courier New": "",
-            "CTRL-0 (zero)": "",
-            "CTRL-1 .. CTRL-6": "",
-            "CTRL-A": "",
-            "CTRL-B": "",
-            "CTRL-C": "",
-            "CTRL-E": "",
-            "CTRL-I": "",
-            "CTRL-J": "",
-            "CTRL-L": "",
-            "CTRL-N": "",
-            "CTRL-R": "",
-            "CTRL-S": "",
-            "CTRL-U": "",
-            "CTRL-V": "",
-            "CTRL-X": "",
-            "CTRL-Y": "",
-            "CTRL-Z": "",
-            "Editor Help": "",
-            "ENTER": "",
-            "Error Loading Xinha.  Developers, check the Error Console for information.": "",
-            "Georgia": "",
-            "Impact": "",
-            "Loading Core": "",
-            "Loading plugins": "",
-            "MS Word Cleaner": "",
-            "Select Color": "",
-            "SHIFT-ENTER": "",
-            "Tahoma": "",
-            "Times New Roman": "",
-            "Touch here first to activate editor.": "",
-            "Verdana": "",
-            "Waiting for Iframe to load...": "",
-            "WingDings": "",
-            "Xinha": ""
-        },
-        "BackgroundImage": {
-            "__ TRANSLATOR NOTE __": "*** BACKGROUNDIMAGE IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***",
-            "Remove Current Background": "",
-            "Set Background": "",
-            "Set page background image": "",
-            "Set Page Background Image": ""
-        },
-        "ClientsideSpellcheck": {
-            "__ TRANSLATOR NOTE __": "*** CLIENTSIDESPELLCHECK IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***",
-            "Spell Check using ieSpell": ""
-        },
-        "ExtendedFileManager": {
-            "__ TRANSLATOR NOTE __": "*** EXTENDEDFILEMANAGER IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***",
-            "10%": "",
-            "100%": "",
-            "200%": "",
-            "25%": "",
-            "50%": "",
-            "75%": "",
-            ">List View": "",
-            ">Thumbnail View": "",
-            "A:": "",
-            "Alt": "",
-            "Border Color": "",
-            "Constrain Proportions": "",
-            "Crop": "",
-            "D:": "",
-            "Directory": "",
-            "Directory Up": "",
-            "Edit": "",
-            "File List": "",
-            "File Manager": "",
-            "Filename:": "",
-            "Filesize:": "",
-            "Flip Horizontal": "",
-            "Flip Image": "",
-            "Flip Vertical": "",
-            "Folder": "",
-            "GIF": "",
-            "GIF format is not supported, image editing not supported.": "",
-            "H:": "",
-            "Image Editor": "",
-            "Image Selection": "",
-            "Invalid base directory:": "",
-            "JPEG High": "",
-            "JPEG Low": "",
-            "JPEG Medium": "",
-            "Loading": "",
-            "Lock": "",
-            "Marker": "",
-            "Maximum folder size limit reached. Upload disabled.": "",
-            "Measure": "",
-            "New Folder": "",
-            "No Files Found": "",
-            "No Image Available": "",
-            "Please enter value": "",
-            "PNG": "",
-            "Preset": "",
-            "Quality:": "",
-            "Refresh": "",
-            "Rename": "",
-            "Resize": "",
-            "Rotate": "",
-            "Rotate 180 &deg;": "",
-            "Rotate 90 &deg; CCW": "",
-            "Rotate 90 &deg; CW": "",
-            "Rotate Image": "",
-            "Start X:": "",
-            "Start Y:": "",
-            "Target Window": "",
-            "Toggle marker color": "",
-            "Trash": "",
-            "Upload": "",
-            "W:": "",
-            "X:": "",
-            "Xinha Image Editor": "",
-            "Y:": "",
-            "Zoom": "",
-            "Clear": "<<FindReplace>>",
-            "Copy": "<<ContextMenu>>",
-            "Cut": "<<ContextMenu>>",
-            "Insert File Link": "<<MootoolsFileManager>>",
-            "Save": "<<SaveSubmit>>",
-            "You must select some text before making a new link.": "<<Linker>>"
-        },
-        "Filter": {
-            "__ TRANSLATOR NOTE __": "*** FILTER IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***",
-            "Filter": "<<InsertSnippet2>>"
-        },
-        "HtmlTidy": {
-            "__ TRANSLATOR NOTE __": "*** HTMLTIDY IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***",
-            "Auto-Tidy": "",
-            "Don't Tidy": "",
-            "HTML Tidy": "",
-            "Tidy failed.  Check your HTML for syntax errors.": ""
-        },
-        "ImageManager": {
-            "__ TRANSLATOR NOTE __": "*** IMAGEMANAGER IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***",
-            "Angle:": "",
-            "Flickr Picture List": "",
-            "Flickr Pictures": "",
-            "Flickr Selection": "",
-            "Flickr Username/Email": "",
-            "Folder Name:": "",
-            "Image Format": "",
-            "Image List": "",
-            "Keyword": "",
-            "No Images Found": "",
-            "No Photos Found": "",
-            "No Videos Found": "",
-            "This Server": "",
-            "YouTube Selection": "",
-            "YouTube Username": "",
-            "YouTube Video List": "",
-            "YouTube Videos": "",
-            "A:": "<<ExtendedFileManager>>",
-            "Clear": "<<FindReplace>>",
-            "Constrain Proportions": "<<ExtendedFileManager>>",
-            "Crop": "<<ExtendedFileManager>>",
-            "D:": "<<ExtendedFileManager>>",
-            "Directory": "<<ExtendedFileManager>>",
-            "Directory Up": "<<ExtendedFileManager>>",
-            "Edit": "<<ExtendedFileManager>>",
-            "Filename:": "<<ExtendedFileManager>>",
-            "Flip Horizontal": "<<ExtendedFileManager>>",
-            "Flip Image": "<<ExtendedFileManager>>",
-            "Flip Vertical": "<<ExtendedFileManager>>",
-            "GIF": "<<ExtendedFileManager>>",
-            "GIF format is not supported, image editing not supported.": "<<ExtendedFileManager>>",
-            "H:": "<<ExtendedFileManager>>",
-            "Image Editor": "<<ExtendedFileManager>>",
-            "Image Selection": "<<ExtendedFileManager>>",
-            "Invalid base directory:": "<<ExtendedFileManager>>",
-            "JPEG High": "<<ExtendedFileManager>>",
-            "JPEG Low": "<<ExtendedFileManager>>",
-            "JPEG Medium": "<<ExtendedFileManager>>",
-            "Lock": "<<ExtendedFileManager>>",
-            "Marker": "<<ExtendedFileManager>>",
-            "Measure": "<<ExtendedFileManager>>",
-            "New Folder": "<<ExtendedFileManager>>",
-            "No Image Available": "<<ExtendedFileManager>>",
-            "PNG": "<<ExtendedFileManager>>",
-            "Quality:": "<<ExtendedFileManager>>",
-            "Refresh": "<<ExtendedFileManager>>",
-            "Resize": "<<ExtendedFileManager>>",
-            "Rotate": "<<ExtendedFileManager>>",
-            "Rotate 180 &deg;": "<<ExtendedFileManager>>",
-            "Rotate 90 &deg; CCW": "<<ExtendedFileManager>>",
-            "Rotate 90 &deg; CW": "<<ExtendedFileManager>>",
-            "Rotate Image": "<<ExtendedFileManager>>",
-            "Save": "<<SaveSubmit>>",
-            "Start X:": "<<ExtendedFileManager>>",
-            "Start Y:": "<<ExtendedFileManager>>",
-            "Trash": "<<ExtendedFileManager>>",
-            "W:": "<<ExtendedFileManager>>",
-            "X:": "<<ExtendedFileManager>>",
-            "Y:": "<<ExtendedFileManager>>"
-        },
-        "InsertMarquee": {
-            "__ TRANSLATOR NOTE __": "*** INSERTMARQUEE IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***",
-            "Alternate": "",
-            "Background-Color:": "",
-            "Behavior:": "",
-            "Continuous": "",
-            "Direction:": "",
-            "Insert scrolling marquee": "",
-            "Marquee Editor": "",
-            "Scroll Amount:": "",
-            "Scroll Delay:": "",
-            "Slide": "",
-            "Speed Control": "",
-            "Name": "<<Forms>>",
-            "Name/ID:": "<<Forms>>",
-            "Text:": "<<Forms>>"
-        },
-        "InsertPicture": {
-            "__ TRANSLATOR NOTE __": "*** INSERTPICTURE IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***",
-            "Leave empty for not defined": "",
-            " Open file in new window": "",
-            "Open file in new window": "",
-            "Upload file": "",
-            "Size": "<<Forms>>"
-        },
-        "NoteServer": {
-            "__ TRANSLATOR NOTE __": "*** NOTESERVER IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***",
-            "120%": "",
-            "150%": "",
-            "80%": "",
-            "Add GUIDO Code in a textbox on the page": "",
-            "Add MIDI link to allow students to hear the music": "",
-            "Format": "",
-            "Guido code": "",
-            "GUIDO Code": "",
-            "Image in applet": "",
-            "Insert GUIDO Music Notation": "",
-            "MIDI File": "",
-            "Source Code": "",
-            "With Mozilla, the applet will not be visible in editor, but only in Web page after submitting.": "",
-            "Zoom :": "",
-            "100%": "<<ExtendedFileManager>>",
-            "Options": "<<FindReplace>>",
-            "Zoom": "<<ExtendedFileManager>>"
-        },
-        "PSLocal": {
-            "__ TRANSLATOR NOTE __": "*** PSLOCAL IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***",
-            "Confirm": "",
-            "Enable": "",
-            "Enable Gears in order to use local document storage and configuration.": "",
-            "Enabling Local Storage": "",
-            "Install": "",
-            "Learn About Local Storage": "",
-            "This will reload the page, causing you to lose any unsaved work.  Press \"OK\" to reload.": "",
-            "Xinha uses Google Gears to enable local document storage.  With Gears installed, you can save drafts of your documents on your hard drive, configure Xinha to look the way you want, and carry this information wherever you use Xinha on the web.": ""
-        },
-        "PSServer": {
-            "__ TRANSLATOR NOTE __": "*** PSSERVER IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***",
-            "File: ": "",
-            "Import": ""
-        },
-        "PersistentStorage": {
-            "__ TRANSLATOR NOTE __": "*** PERSISTENTSTORAGE IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***",
-            "Details": "",
-            "File Browser": "",
-            "Hello    There C ": "",
-            "Hello  There A ": "",
-            "Hello \" There B \"": "",
-            "Hello ' There D '": "",
-            "List of Places": "",
-            "New Document": "",
-            "Open": "",
-            "Open Document": "",
-            "Places": "",
-            "Please enter the name of the directory you'd like to create.": "",
-            "Save Document": "",
-            "This will erase any unsaved content.  If you're certain, please click OK to continue.": "",
-            "Web URL": "",
-            "Confirm": "<<PSLocal>>",
-            "Copy": "<<ContextMenu>>",
-            "Directory Up": "<<ExtendedFileManager>>",
-            "File List": "<<ExtendedFileManager>>",
-            "File Manager": "<<ExtendedFileManager>>",
-            "Filename": "<<ExtendedFileManager>>",
-            "Insert": "<<InsertNote>>",
-            "New Folder": "<<ExtendedFileManager>>",
-            "Save": "<<SaveSubmit>>",
-            "You must select some text before making a new link.": "<<Linker>>"
-        },
-        "SpellChecker": {
-            "__ TRANSLATOR NOTE __": "*** SPELLCHECKER IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***",
-            "Dictionary": "",
-            "Finished list of mispelled words": "",
-            "HTMLArea Spell Checker": "",
-            "I will open it in a new page.": "",
-            "Ignore": "",
-            "Ignore all": "",
-            "Info": "",
-            "Learn": "",
-            "No mispelled words found with the selected dictionary.": "",
-            "Original word": "",
-            "Please confirm that you want to open this link": "",
-            "Please wait.  Calling spell checker.": "",
-            "Please wait: changing dictionary to": "",
-            "pliz weit ;-)": "",
-            "Re-check": "",
-            "Replace": "",
-            "Replace all": "",
-            "Revert": "",
-            "Spell Checker": "",
-            "Spell-check": "",
-            "Suggestions": "",
-            "This will drop changes and quit spell checker.  Please confirm.": "",
-            "Replace with": "<<FindReplace>>"
-        },
-        "Template": {
-            "__ TRANSLATOR NOTE __": "*** TEMPLATE IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***",
-            "Insert template": ""
-        },
-        "UnFormat": {
-            "__ TRANSLATOR NOTE __": "*** UNFORMAT IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***",
-            "All": "",
-            "All HTML:": "",
-            "Cleaning Area": "",
-            "Cleaning options": "",
-            "Formatting:": "",
-            "Page Cleaner": "",
-            "Select which types of formatting you would like to remove.": "",
-            "Selection": ""
-        }
-    }
-}
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/lang/merged/vn.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/lang/merged/vn.js
deleted file mode 100644
index d26187c..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/lang/merged/vn.js
+++ /dev/null
@@ -1,1573 +0,0 @@
-// Xinha Language Combined Translation File
-//
-// LANG: "vn", ENCODING: UTF-8
-//
-// INSTRUCTIONS TO TRANSLATORS
-// ===========================================================================
-//
-// Your translation must be in UTF-8 Character Encoding.
-//
-// This is a JSON encoded file (plus comments), strings should be double-quote
-// only, do not use single quotes to surround strings - "hello", not 'hello'
-// do not have a trailing comma after the last entry in a section.
-//
-// Only full line comments are allowed (that a comments occupy entire lines).
-//
-// Search for the __NEW_TRANSLATIONS__ section below, this is where you will
-// want to focus, this section includes things that do not presently have a 
-// translation or for which the translation needs to be checked for accuracy.
-//
-// In the New Translations section a translation string is one of the following
-//
-//  "English String Here" : ""
-//     This means it is not translated yet, add your translation...
-//     "English String Here" : "Klingon String Here"
-//
-//  "English String Here" : "Translated String Here"
-//     This means that an existing translation for this string, in some other
-//     section has been found, and used.  Check that it is approprite for this
-//     section and if it is, that's fine leave it as is, otherwise change as
-//     appropriate.
-//
-//  "English String Here" : "<<AnotherSection>>"
-//     This means use the same translation for this string as <<AnotherSection>>
-//     this saves you re-tranlating strings.  If the Context of this section
-//     and the context of AnotherSection seem the same, that's fine leave it
-//     using that translation, but if this section needs a different translation, 
-//     you can provide it by replacing the link (<<AnotherSection>>) with that
-//     new translation.  For example - a "Table" in say "DataPlugin" is 
-//     perhaps translated differently to "Table" in "FurniturePlugin".
-//
-// TESTING YOUR TRANSLATION
-// ===========================================================================
-// Simply place your translation file on your webserver somewhere for example
-//
-//   /xinha/lang/merged/vn.js
-//
-// and then tell Xinha where to get it (before loading XinhaCore.js) by 
-//
-//  _editor_lang              = 'vn';
-//  _editor_lang_merged_file  = '/xinha/lang/merged/vn.js';
-//
-// Xinha will load your new language definition.
-//
-// SUBMITTING YOUR TRANSLATION
-// ===========================================================================
-// Simply create a Ticket on the Xinha website and attach your translation 
-// file.
-//
-// The Xinha developers will take your file and use the 
-//     contrib/lc_split_merged_file.php
-// script to load it into the Xinha distribution.
-
-{
-    "Abbreviation": {
-        "Cancel": "Hủy",
-        "OK": "Đồng ý"
-    },
-    "AboutBox": {
-        "About this editor": "Tự Giới Thiệu"
-    },
-    "BackgroundImage": {
-        "Cancel": "Hủy"
-    },
-    "ColorPicker": {
-        "OK": "Đồng ý"
-    },
-    "ContextMenu": {
-        "Justify Center": "Căn Giữa",
-        "Justify Full": "Căn Đều",
-        "Justify Left": "Căn Trái",
-        "Justify Right": "Căn Phải"
-    },
-    "CreateLink": {
-        "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:"
-    },
-    "EditTag": {
-        "Cancel": "Hủy",
-        "OK": "Đồng ý"
-    },
-    "Equation": {
-        "Cancel": "Hủy",
-        "OK": "Đồng ý"
-    },
-    "ExtendedFileManager": {
-        "Cancel": "Hủy",
-        "New window (_blank)": "Cửa sổ mới (_blank)",
-        "None (use implicit)": "Không (sử dụng implicit)",
-        "OK": "Đồng ý",
-        "Same frame (_self)": "Trên cùng khung (_self)",
-        "Title (tooltip)": "Tiêu đề (của hướng dẫn):",
-        "Top frame (_top)": "Khung trên cùng (_top)"
-    },
-    "Forms": {
-        "Cancel": "Hủy",
-        "OK": "Đồng ý"
-    },
-    "FullPage": {
-        "Cancel": "Hủy",
-        "OK": "Đồng ý"
-    },
-    "HorizontalRule": {
-        "Cancel": "Hủy",
-        "Horizontal Rule": "Dòng Kẻ Ngang",
-        "OK": "Đồng ý"
-    },
-    "ImageManager": {
-        "Cancel": "Hủy",
-        "OK": "Đồng ý"
-    },
-    "InsertAnchor": {
-        "Cancel": "Hủy",
-        "OK": "Đồng ý"
-    },
-    "InsertImage": {
-        "Cancel": "Hủy",
-        "OK": "Đồng ý"
-    },
-    "InsertMarquee": {
-        "Cancel": "Hủy",
-        "OK": "Đồng ý"
-    },
-    "InsertNote": {
-        "Cancel": "Hủy"
-    },
-    "InsertPicture": {
-        "Cancel": "Hủy",
-        "OK": "Đồng ý"
-    },
-    "InsertSnippet": {
-        "Cancel": "Hủy"
-    },
-    "InsertSnippet2": {
-        "Cancel": "Hủy"
-    },
-    "InsertTable": {
-        "Cancel": "Hủy",
-        "Insert Table": "Chèn Bảng",
-        "OK": "Đồng ý"
-    },
-    "Linker": {
-        "Cancel": "Hủy",
-        "Insert/Modify Link": "Thêm/Chỉnh sửa đường dẫn",
-        "OK": "Đồng ý",
-        "Target:": "Nơi hiện thị:",
-        "URL:": "URL:"
-    },
-    "NoteServer": {
-        "Cancel": "Hủy",
-        "OK": "Đồng ý"
-    },
-    "PSLocal": {
-        "Cancel": "Hủy"
-    },
-    "PasteText": {
-        "Cancel": "Hủy",
-        "OK": "Đồng ý"
-    },
-    "PersistentStorage": {
-        "Cancel": "Hủy"
-    },
-    "QuickTag": {
-        "Cancel": "Hủy"
-    },
-    "SetId": {
-        "Cancel": "Hủy",
-        "OK": "Đồng ý"
-    },
-    "SmartReplace": {
-        "OK": "Đồng ý"
-    },
-    "SpellChecker": {
-        "Cancel": "Hủy",
-        "OK": "Đồng ý"
-    },
-    "SuperClean": {
-        "Cancel": "Hủy",
-        "OK": "Đồng ý"
-    },
-    "TableOperations": {
-        "Cancel": "Hủy",
-        "OK": "Đồng ý"
-    },
-    "Template": {
-        "Cancel": "Hủy"
-    },
-    "UnFormat": {
-        "Cancel": "Hủy",
-        "OK": "Đồng ý"
-    },
-    "Xinha": {
-        "About this editor": "Tự Giới Thiệu",
-        "Background Color": "Màu Nền",
-        "Bold": "Đậm",
-        "Bulleted List": "Danh Sách Phi Thứ Tự (Chấm đầu dòng)",
-        "Copy selection": "Sao chép",
-        "Current style": "Định Dạng Hiện Thời",
-        "Cut selection": "Cắt",
-        "Decrease Indent": "Lùi Ra Ngoài",
-        "Direction left to right": "Viết từ trái sang phải",
-        "Direction right to left": "Viết từ phải sang trái",
-        "Font Color": "Màu Chữ",
-        "Help using editor": "Giúp Đỡ",
-        "Horizontal Rule": "Dòng Kẻ Ngang",
-        "Increase Indent": "Thụt Vào Trong",
-        "Insert Table": "Chèn Bảng",
-        "Insert Web Link": "Tạo Liên Kết",
-        "Insert/Modify Image": "Chèn Ảnh",
-        "Italic": "Nghiêng",
-        "Justify Center": "Căn Giữa",
-        "Justify Full": "Căn Đều",
-        "Justify Left": "Căn Trái",
-        "Justify Right": "Căn Phải",
-        "Ordered List": "Danh Sách Có Thứ Tự (1, 2, 3)",
-        "Paste from clipboard": "Dán",
-        "Path": "Đường Dẫn",
-        "Redoes your last action": "Lấy lại thao tác vừa bỏ",
-        "Strikethrough": "Gạch Xóa",
-        "Subscript": "Viết Xuống Dưới",
-        "Superscript": "Viết Lên Trên",
-        "Toggle HTML Source": "Chế Độ Mã HTML",
-        "Underline": "Gạch Chân",
-        "Undoes your last action": "Hủy thao tác trước",
-        "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."
-    },
-    "__NEW_TRANSLATIONS__": {
-        "Abbreviation": {
-            "Abbreviation": "",
-            "Delete": "",
-            "Expansion:": ""
-        },
-        "AboutBox": {
-            "Close": "<<Xinha>>"
-        },
-        "CharCounter": {
-            "... in progress": "",
-            "Chars": "",
-            "HTML": "",
-            "Words": ""
-        },
-        "CharacterMap": {
-            "Insert special character": ""
-        },
-        "ColorPicker": {
-            "Click a color...": "",
-            "Color: ": "",
-            "Sample": "",
-            "Web Safe: ": "",
-            "Close": "<<Xinha>>"
-        },
-        "ContextMenu": {
-            "_Delete Row": "",
-            "_Image Properties...": "",
-            "_Modify Link...": "",
-            "_Remove Link...": "",
-            "_Table Properties...": "",
-            "C_ell Properties...": "",
-            "Chec_k Link...": "",
-            "Copy": "",
-            "Create a link": "",
-            "Current URL is": "",
-            "Cut": "",
-            "De_lete Column": "",
-            "Delete Cell": "",
-            "Delete the current column": "",
-            "Delete the current row": "",
-            "How did you get here? (Please report!)": "",
-            "I_nsert Row Before": "",
-            "In_sert Row After": "",
-            "Insert _Column Before": "",
-            "Insert a new column after the current one": "",
-            "Insert a new column before the current one": "",
-            "Insert a new row after the current one": "",
-            "Insert a new row before the current one": "",
-            "Insert a paragraph after the current node": "",
-            "Insert a paragraph before the current node": "",
-            "Insert C_olumn After": "",
-            "Insert Cell After": "",
-            "Insert Cell Before": "",
-            "Insert paragraph after": "",
-            "Insert paragraph before": "",
-            "Link points to:": "",
-            "Make lin_k...": "",
-            "Merge Cells": "",
-            "Opens this link in a new window": "",
-            "Paste": "",
-            "Please confirm that you want to remove this element:": "",
-            "Please confirm that you want to unlink this element.": "",
-            "Remove the $elem Element...": "",
-            "Remove this node from the document": "",
-            "Ro_w Properties...": "",
-            "Show the image properties dialog": "",
-            "Show the Table Cell Properties dialog": "",
-            "Show the Table Properties dialog": "",
-            "Show the Table Row Properties dialog": "",
-            "Unlink the current element": ""
-        },
-        "CreateLink": {
-            "Are you sure you wish to remove this link?": "",
-            "You need to select some text before creating a link": ""
-        },
-        "DefinitionList": {
-            "definition description": "",
-            "definition list": "",
-            "definition term": ""
-        },
-        "Dialogs": {
-            "Some Text Here": ""
-        },
-        "DynamicCSS": {
-            "Choose stylesheet": "",
-            "Default": "",
-            "Undefined": ""
-        },
-        "EditTag": {
-            "Edit HTML for selected text": "",
-            "Edit Tag By Peg": "",
-            "Tag Editor": ""
-        },
-        "Equation": {
-            "!=": "",
-            "!in": "",
-            "&gt;-": "",
-            "&gt;=": "",
-            "&lt;=": "",
-            "&lt;=&gt;": "",
-            "&lt;x&gt;": "",
-            "&nbsp; `!` &nbsp;": "",
-            "&nbsp; `.` &nbsp;": "",
-            "&nbsp; `0` &nbsp;": "",
-            "&nbsp; `2` &nbsp;": "",
-            "&nbsp; `3` &nbsp;": "",
-            "&nbsp; `4` &nbsp;": "",
-            "&nbsp; `5` &nbsp;": "",
-            "&nbsp; `6` &nbsp;": "",
-            "&nbsp; `7` &nbsp;": "",
-            "&nbsp; `8` &nbsp;": "",
-            "&nbsp; `9` &nbsp;": "",
-            "&nbsp; `e` &nbsp;": "",
-            "&nbsp;&nbsp;`1` &nbsp;": "",
-            "&nbsp;`+{::}`&nbsp;": "",
-            "&nbsp;`-:\\ `": "",
-            "&nbsp;`-{::}`&nbsp;": "",
-            "&nbsp;`C`&nbsp;": "",
-            "&nbsp;`cos`": "",
-            "&nbsp;`ln`&nbsp;": "",
-            "&nbsp;`pi` &nbsp;": "",
-            "&nbsp;`sin`": "",
-            "&nbsp;`tan`": "",
-            "&nbsp;`times`&nbsp;": "",
-            "&quot;text&quot;": "",
-            "'+formula+'": "",
-            "((n),(k))": "",
-            "(x+1)/(x-1)": "",
-            "*": "",
-            "**": "",
-            "+-": "",
-            "-&gt;": "",
-            "-&lt;": "",
-            "-:": "",
-            "-=": "",
-            "//": "",
-            "/_": "",
-            ":.": "",
-            "=&gt;": "",
-            "@": "",
-            "[[a,b],[c,d]]": "",
-            "\\\\": "",
-            "\\nClick in the box to use your keyboard or use the buttons\\n": "",
-            "^^": "",
-            "^^^": "",
-            "__|": "",
-            "_|_": "",
-            "`!=`": "",
-            "`!in`": "",
-            "`&and;`": "",
-            "`&cap;`": "",
-            "`&cup;`": "",
-            "`&gt;-`": "",
-            "`&gt;=`": "",
-            "`&lt;=&gt;`": "",
-            "`&lt;=`": "",
-            "`&lt;x&gt;`": "",
-            "`&or;`": "",
-            "`&quot;text&quot;`": "",
-            "`((n),(k))`": "",
-            "`(x+1)/(x-1)`": "",
-            "`**`": "",
-            "`*`": "",
-            "`+-`": "",
-            "`-&gt;`": "",
-            "`-&lt;`": "",
-            "`-:`": "",
-            "`-=`": "",
-            "`//`": "",
-            "`/_`": "",
-            "`:.`": "",
-            "`=&gt;`": "",
-            "`@`": "",
-            "`[[a,b],[c,d]]`": "",
-            "`\\\\`": "",
-            "`__|`": "",
-            "`_|_`": "",
-            "`AA`": "",
-            "`aleph`": "",
-            "`alpha`": "",
-            "`and`": "",
-            "`bara`": "",
-            "`bba`": "",
-            "`bbba`": "",
-            "`beta`": "",
-            "`CC`": "",
-            "`cca`": "",
-            "`chi`": "",
-            "`darr`": "",
-            "`ddota`": "",
-            "`del`": "",
-            "`Delta`": "",
-            "`delta`": "",
-            "`diamond`": "",
-            "`dota`": "",
-            "`dy/dx`": "",
-            "`EE`": "",
-            "`epsi`": "",
-            "`eta`": "",
-            "`fra`": "",
-            "`Gamma`": "",
-            "`gamma`": "",
-            "`grad`": "",
-            "`harr`": "",
-            "`hArr`": "",
-            "`hata`": "",
-            "`if`": "",
-            "`in`": "",
-            "`int`": "",
-            "`iota`": "",
-            "`kappa`": "",
-            "`Lambda`": "",
-            "`lambda`": "",
-            "`lArr`": "",
-            "`larr`": "",
-            "`lim_(x-&gt;oo)`": "",
-            "`log`": "",
-            "`mu`": "",
-            "`NN`": "",
-            "`nn`": "",
-            "`not`": "",
-            "`nu`": "",
-            "`o+`": "",
-            "`o.`": "",
-            "`O/`": "",
-            "`oint`": "",
-            "`omega`": "",
-            "`Omega`": "",
-            "`oo`": "",
-            "`or`": "",
-            "`ox`": "",
-            "`phi`": "",
-            "`Phi`": "",
-            "`Pi`": "",
-            "`pi`": "",
-            "`prod`": "",
-            "`prop`": "",
-            "`Psi`": "",
-            "`psi`": "",
-            "`QQ`": "",
-            "`quad`": "",
-            "`rArr`": "",
-            "`rho`": "",
-            "`root(n)(x)`": "",
-            "`RR`": "",
-            "`sfa`": "",
-            "`Sigma`": "",
-            "`sigma`": "",
-            "`sqrt(x)`": "",
-            "`square`": "",
-            "`stackrel(-&gt;)(+)`": "",
-            "`sub`": "",
-            "`sube`": "",
-            "`sum`": "",
-            "`sup`": "",
-            "`supe`": "",
-            "`tau`": "",
-            "`Theta`": "",
-            "`theta`": "",
-            "`TT`": "",
-            "`tta`": "",
-            "`uarr`": "",
-            "`ula`": "",
-            "`upsilon`": "",
-            "`uu`": "",
-            "`veca`": "",
-            "`vv`": "",
-            "`x_(mn)`": "",
-            "`Xi`": "",
-            "`xi`": "",
-            "`xx`": "",
-            "`zeta`": "",
-            "`ZZ`": "",
-            "`|-&gt;`": "",
-            "`|--`": "",
-            "`|==`": "",
-            "`|__`": "",
-            "`|~`": "",
-            "`~=`": "",
-            "`~|`": "",
-            "`~~`": "",
-            "AA": "",
-            "aleph": "",
-            "alpha": "",
-            "and": "",
-            "AsciiMath Formula Input": "",
-            "AsciiMathML Example": "",
-            "bara": "",
-            "Based on ASCIIMathML by": "",
-            "bba": "",
-            "bbba": "",
-            "beta": "",
-            "CC": "",
-            "cca": "",
-            "chi": "",
-            "darr": "",
-            "ddota": "",
-            "del": "",
-            "delta": "",
-            "Delta": "",
-            "diamond": "",
-            "dota": "",
-            "dy/dx": "",
-            "EE": "",
-            "epsi": "",
-            "eta": "",
-            "For more information on AsciiMathML visit this page:": "",
-            "Formula Editor": "",
-            "fra": "",
-            "gamma": "",
-            "Gamma": "",
-            "grad": "",
-            "hArr": "",
-            "harr": "",
-            "hata": "",
-            "if": "",
-            "in": "",
-            "Input": "",
-            "int": "",
-            "int_a^bf(x)dx": "",
-            "iota": "",
-            "kappa": "",
-            "Lambda": "",
-            "lambda": "",
-            "larr": "",
-            "lArr": "",
-            "lim_(x-&gt;oo)": "",
-            "mu": "",
-            "NN": "",
-            "nn": "",
-            "nnn": "",
-            "not": "",
-            "nu": "",
-            "o+": "",
-            "o.": "",
-            "O/": "",
-            "oint": "",
-            "Omega": "",
-            "omega": "",
-            "oo": "",
-            "or": "",
-            "ox": "",
-            "phi": "",
-            "Phi": "",
-            "pi": "",
-            "Pi": "",
-            "Preview": "",
-            "prod": "",
-            "prop": "",
-            "psi": "",
-            "Psi": "",
-            "QQ": "",
-            "quad": "",
-            "rArr": "",
-            "rho": "",
-            "root(n)(x)": "",
-            "RR": "",
-            "sfa": "",
-            "sigma": "",
-            "Sigma": "",
-            "sqrt(x)": "",
-            "square": "",
-            "stackrel(-&gt;)(+)": "",
-            "sub": "",
-            "sube": "",
-            "sum": "",
-            "sum_(n=1)^oo": "",
-            "sup": "",
-            "supe": "",
-            "tau": "",
-            "Theta": "",
-            "theta": "",
-            "TT": "",
-            "tta": "",
-            "uarr": "",
-            "ula": "",
-            "upsilon": "",
-            "uu": "",
-            "uuu": "",
-            "veca": "",
-            "vv": "",
-            "vvv": "",
-            "x^(m+n)": "",
-            "x_(mn)": "",
-            "Xi": "",
-            "xi": "",
-            "xx": "",
-            "zeta": "",
-            "ZZ": "",
-            "|-&gt;": "",
-            "|--": "",
-            "|==": "",
-            "|__": "",
-            "|~": "",
-            "~=": "",
-            "~|": "",
-            "~~": ""
-        },
-        "FancySelects": {
-            "'+opt.text+'": ""
-        },
-        "FindReplace": {
-            "';\r\n  var tagc = '": "",
-            "Case sensitive search": "",
-            "Clear": "",
-            "Done": "",
-            "Enter the text you want to find": "",
-            "Find and Replace": "",
-            "found item": "",
-            "found items": "",
-            "Highlight": "",
-            "Inform a replacement word": "",
-            "Next": "",
-            "not found": "",
-            "Options": "",
-            "Replace with:": "",
-            "replaced item": "",
-            "replaced items": "",
-            "Search for:": "",
-            "Substitute all occurrences": "",
-            "Substitute this occurrence?": "",
-            "Undo": "",
-            "Whole words only": ""
-        },
-        "FormOperations": {
-            "Enter the name for new option.": "",
-            "Form Editor": "",
-            "Insert a check box.": "",
-            "Insert a Form.": "",
-            "Insert a multi-line text field.": "",
-            "Insert a radio button.": "",
-            "Insert a select field.": "",
-            "Insert a submit/reset button.": "",
-            "Insert a text, password or hidden field.": "",
-            "Message Sent": "",
-            "Please Select...": ""
-        },
-        "Forms": {
-            "'onClick'=": "",
-            "Access Key:": "",
-            "Action URL:": "",
-            "Button Script": "",
-            "Checked": "",
-            "Columns:": "",
-            "Default text (optional)": "",
-            "Dimensions": "",
-            "Disabled": "",
-            "Encoding:": "",
-            "For Control:": "",
-            "Form": "",
-            "Form Element: FIELDSET": "",
-            "Form Element: INPUT": "",
-            "Form Element: LABEL": "",
-            "Form Element: SELECT": "",
-            "Form Element: TEXTAREA": "",
-            "Form handler script": "",
-            "Form Name:": "",
-            "Get": "",
-            "Hard": "",
-            "Height in number of rows": "",
-            "HTML-Form to CGI (default)": "",
-            "Image source": "",
-            "Image URL:": "",
-            "Initial Text:": "",
-            "Insert/Edit Form": "",
-            "Insert/Edit Form Element FIELDSET": "",
-            "Insert/Edit Form Element INPUT": "",
-            "Insert/Edit Form Element LABEL": "",
-            "Insert/Edit Form Element SELECT": "",
-            "Insert/Edit Form Element TEXTAREA": "",
-            "Javascript for button click": "",
-            "Label:": "",
-            "Legend:": "",
-            "Max length:": "",
-            "Maximum number of characters accepted": "",
-            "Method:": "",
-            "multipart Form Data (File-Upload)": "",
-            "Name": "",
-            "Name of the form input": "",
-            "Name of the form select": "",
-            "name of the textarea": "",
-            "Name/ID:": "",
-            "normal": "",
-            "nowrap": "",
-            "Off": "",
-            "Physical": "",
-            "Please enter a Label": "",
-            "Post": "",
-            "pre": "",
-            "Read Only": "",
-            "Rows:": "",
-            "Size of text box in characters": "",
-            "Size:": "",
-            "Soft": "",
-            "Tab Index:": "",
-            "Target Frame:": "",
-            "Text:": "",
-            "URL of image": "",
-            "Value of the form input": "",
-            "Value:": "",
-            "Virtual": "",
-            "Width in number of characters": "",
-            "Wrap Mode:": "",
-            "You must enter a Name": "",
-            "Options": "<<FindReplace>>"
-        },
-        "FullPage": {
-            "...": "",
-            "Alternate style-sheet:": "",
-            "Background color:": "",
-            "Character set:": "",
-            "cyrillic (ISO-8859-5)": "",
-            "cyrillic (KOI8-R)": "",
-            "cyrillic (WINDOWS-1251)": "",
-            "Description:": "",
-            "DOCTYPE:": "",
-            "Document properties": "",
-            "Document title:": "",
-            "Keywords:": "",
-            "Primary style-sheet:": "",
-            "Text color:": "",
-            "UTF-8 (recommended)": "",
-            "western (ISO-8859-1)": ""
-        },
-        "FullScreen": {
-            "Maximize/Minimize Editor": ""
-        },
-        "Gecko": {
-            "The Paste button does not work in this browser for security reasons. Press CTRL-V on your keyboard to paste directly.": ""
-        },
-        "HorizontalRule": {
-            "&#x00d7;": "",
-            "&nbsp;": "",
-            "Alignment:": "",
-            "Center": "",
-            "Color:": "",
-            "Height:": "",
-            "Insert/edit horizontal rule": "",
-            "Insert/Edit Horizontal Rule": "",
-            "Layout": "",
-            "Left": "",
-            "No shading": "",
-            "percent": "",
-            "pixels": "",
-            "Right": "",
-            "Style": "",
-            "Width:": ""
-        },
-        "InlineStyler": {
-            "Background": "",
-            "Baseline": "",
-            "Border": "",
-            "Bottom": "",
-            "Char": "",
-            "Collapsed borders": "",
-            "CSS Style": "",
-            "FG Color": "",
-            "Float": "",
-            "Justify": "",
-            "Margin": "",
-            "Middle": "",
-            "None": "",
-            "Padding": "",
-            "Text align": "",
-            "Top": "",
-            "Vertical align": "",
-            "-": "<<Equation>>",
-            "Center": "<<HorizontalRule>>",
-            "Height": "<<HorizontalRule>>",
-            "Image URL": "<<Forms>>",
-            "Layout": "<<HorizontalRule>>",
-            "Left": "<<HorizontalRule>>",
-            "percent": "<<HorizontalRule>>",
-            "pixels": "<<HorizontalRule>>",
-            "Right": "<<HorizontalRule>>",
-            "Width": "<<HorizontalRule>>"
-        },
-        "InsertAnchor": {
-            "Anchor name": "",
-            "Insert Anchor": "",
-            "Delete": "<<Abbreviation>>"
-        },
-        "InsertImage": {
-            "Absbottom": "",
-            "Absmiddle": "",
-            "Alternate text:": "",
-            "Border thickness:": "",
-            "Enter the image URL here": "",
-            "For browsers that don't support images": "",
-            "Horizontal padding": "",
-            "Horizontal:": "",
-            "Image Preview:": "",
-            "Insert Image": "",
-            "Leave empty for no border": "",
-            "Not set": "",
-            "Positioning of this image": "",
-            "Preview the image in a new window": "",
-            "Spacing": "",
-            "Texttop": "",
-            "Vertical padding": "",
-            "Vertical:": "",
-            "You must enter the URL": "",
-            "Alignment:": "<<HorizontalRule>>",
-            "Baseline": "<<InlineStyler>>",
-            "Bottom": "<<InlineStyler>>",
-            "Image URL:": "<<Forms>>",
-            "Layout": "<<HorizontalRule>>",
-            "Left": "<<HorizontalRule>>",
-            "Middle": "<<InlineStyler>>",
-            "Preview": "<<Equation>>",
-            "Right": "<<HorizontalRule>>",
-            "Top": "<<InlineStyler>>"
-        },
-        "InsertNote": {
-            "Insert": "",
-            "Insert footnote": "",
-            "Insert Note": ""
-        },
-        "InsertPagebreak": {
-            "Page break": "",
-            "Page Break": ""
-        },
-        "InsertSmiley": {
-            "Insert Smiley": ""
-        },
-        "InsertSnippet": {
-            "\\n  This is an information about something\\n": "",
-            "Hide preview": "",
-            "Insert as": "",
-            "Insert Snippet": "",
-            "InsertSnippet for Xinha": "",
-            "Link1": "",
-            "Link2": "",
-            "Link3": "",
-            "Link4": "",
-            "Link5": "",
-            "Show preview": "",
-            "This is an information about something": "",
-            "Variable": ""
-        },
-        "InsertSnippet2": {
-            "All Categories": "",
-            "Filter": "",
-            "Insert as HTML": "",
-            "Insert as template variable": "",
-            "Only search word beginning": "",
-            "HTML": "<<CharCounter>>",
-            "Insert Snippet": "<<InsertSnippet>>",
-            "InsertSnippet for Xinha": "<<InsertSnippet>>",
-            "Variable": "<<InsertSnippet>>"
-        },
-        "InsertTable": {
-            "Caption": "",
-            "Caption for the table": "",
-            "Cell padding:": "",
-            "Cell spacing:": "",
-            "Collapse borders:": "",
-            "Cols:": "",
-            "Em": "",
-            "Fixed width columns": "",
-            "Layou": "",
-            "Number of columns": "",
-            "Number of rows": "",
-            "Positioning of this table": "",
-            "Space between adjacent cells": "",
-            "Space between content and border in cell": "",
-            "Style of the border": "",
-            "Width of the table": "",
-            "Width unit": "",
-            "You must enter a number of columns": "",
-            "You must enter a number of rows": "",
-            "Absbottom": "<<InsertImage>>",
-            "Absmiddle": "<<InsertImage>>",
-            "Alignment:": "<<HorizontalRule>>",
-            "Baseline": "<<InlineStyler>>",
-            "Border": "<<InlineStyler>>",
-            "Border thickness:": "<<InsertImage>>",
-            "Bottom": "<<InlineStyler>>",
-            "Layout": "<<HorizontalRule>>",
-            "Leave empty for no border": "<<InsertImage>>",
-            "Left": "<<HorizontalRule>>",
-            "Middle": "<<InlineStyler>>",
-            "Not set": "<<InsertImage>>",
-            "Percent": "<<HorizontalRule>>",
-            "Pixels": "<<HorizontalRule>>",
-            "Right": "<<HorizontalRule>>",
-            "Rows:": "<<Forms>>",
-            "Spacing": "<<InsertImage>>",
-            "Texttop": "<<InsertImage>>",
-            "Top": "<<InlineStyler>>",
-            "Width:": "<<HorizontalRule>>"
-        },
-        "LangMarks": {
-            "&mdash; language &mdash;": "",
-            "', '": "",
-            "English": "",
-            "French": "",
-            "Greek": "",
-            "language select": "",
-            "Latin": ""
-        },
-        "Linker": {
-            "(px)": "",
-            "Anchor-Link": "",
-            "Anchor:": "",
-            "Email Address:": "",
-            "Email Link": "",
-            "Location Bar:": "",
-            "Menu Bar:": "",
-            "Message Template:": "",
-            "New Window": "",
-            "Ordinary Link": "",
-            "Popup Window": "",
-            "PopupWindow": "",
-            "Remove Link": "",
-            "Resizeable:": "",
-            "Same Window (jump out of frames)": "",
-            "Scrollbars:": "",
-            "Shows On Hover": "",
-            "Status Bar:": "",
-            "Subject:": "",
-            "Title:": "",
-            "Toolbar:": "",
-            "URL Link": "",
-            "You must select some text before making a new link.": "",
-            "Are you sure you wish to remove this link?": "<<CreateLink>>",
-            "Name:": "<<Forms>>",
-            "Size:": "<<Forms>>"
-        },
-        "ListType": {
-            "Choose list style type (for ordered lists)": "",
-            "Decimal numbers": "",
-            "Lower greek letters": "",
-            "Lower latin letters": "",
-            "Lower roman numbers": "",
-            "Upper latin letters": "",
-            "Upper roman numbers": ""
-        },
-        "MootoolsFileManager": {
-            "Insert File Link": "",
-            "You must select some text before making a new link.": "<<Linker>>"
-        },
-        "Opera": {
-            "MARK": "",
-            "The Paste button does not work in Mozilla based web browsers (technical security reasons). Press CTRL-V on your keyboard to paste directly.": ""
-        },
-        "PasteText": {
-            "Insert text in new paragraph": "",
-            "Paste as Plain Text": ""
-        },
-        "PreserveScripts": {
-            "JavaScript": "",
-            "PHP": ""
-        },
-        "QuickTag": {
-            "',\r\n                           'cl': '": "",
-            "ATTRIBUTES": "",
-            "Colors": "",
-            "Enter the TAG you want to insert": "",
-            "No CSS class avaiable": "",
-            "Ok": "",
-            "OPTIONS": "",
-            "Quick Tag Editor": "",
-            "TAGs": "",
-            "There are some unclosed quote": "",
-            "This attribute already exists in the TAG": "",
-            "You have to select some text": ""
-        },
-        "SaveSubmit": {
-            "in progress": "",
-            "Ready": "",
-            "Save": "",
-            "Saving...": ""
-        },
-        "SetId": {
-            "ID/Name:": "",
-            "Set Id and Name": "",
-            "Set Id/Name": "",
-            "Set ID/Name": "",
-            "Delete": "<<Abbreviation>>"
-        },
-        "SmartReplace": {
-            "ClosingDoubleQuotes": "",
-            "ClosingSingleQuote": "",
-            "Convert all quotes and dashes in the current document": "",
-            "Enable automatic replacements": "",
-            "OpeningDoubleQuotes": "",
-            "OpeningSingleQuote": "",
-            "SmartReplace": "",
-            "SmartReplace Settings": ""
-        },
-        "Stylist": {
-            "Styles": ""
-        },
-        "SuperClean": {
-            "Clean bad HTML from Microsoft Word.": "",
-            "Clean Selection Only": "",
-            "Clean up HTML": "",
-            "Cleaning Scope": "",
-            "General tidy up and correction of some problems.": "",
-            "Please select from the following cleaning options...": "",
-            "Please stand by while cleaning in process...": "",
-            "Remove alignment (left/right/justify).": "",
-            "Remove all classes (CSS).": "",
-            "Remove All HTML Tags": "",
-            "Remove all styles (CSS).": "",
-            "Remove custom font sizes.": "",
-            "Remove custom text colors.": "",
-            "Remove custom typefaces (font \"styles\").": "",
-            "Remove emphasis and annotations.": "",
-            "Remove lang attributes.": "",
-            "Remove Paragraphs": "",
-            "Remove superscripts and subscripts.": "",
-            "Replace directional quote marks with non-directional quote marks.": "",
-            "Vigorously purge HTML from Microsoft Word.": ""
-        },
-        "TableOperations": {
-            "All four sides": "",
-            "Borders": "",
-            "Cell properties": "",
-            "Cell Properties": "",
-            "Cell Type:": "",
-            "Cells down": "",
-            "Cells to the right, and": "",
-            "Delete cell": "",
-            "Delete column": "",
-            "Delete row": "",
-            "Do Not Change": "",
-            "Frame and borders": "",
-            "Frames": "",
-            "Header (th)": "",
-            "Insert cell after": "",
-            "Insert cell before": "",
-            "Insert column after": "",
-            "Insert column before": "",
-            "Insert row after": "",
-            "Insert row before": "",
-            "Merge cells": "",
-            "Merge current cell with:": "",
-            "No rules": "",
-            "No sides": "",
-            "Normal (td)": "",
-            "Please click into some cell": "",
-            "Row properties": "",
-            "Row Properties": "",
-            "Rules will appear between all rows and columns": "",
-            "Rules will appear between columns only": "",
-            "Rules will appear between rows only": "",
-            "Spacing and padding": "",
-            "Split column": "",
-            "Split row": "",
-            "Summary": "",
-            "Table properties": "",
-            "Table Properties": "",
-            "The bottom side only": "",
-            "The left-hand side only": "",
-            "The right and left sides only": "",
-            "The right-hand side only": "",
-            "The top and bottom sides only": "",
-            "The top side only": "",
-            "Xinha cowardly refuses to delete the last cell in row.": "",
-            "Xinha cowardly refuses to delete the last column in table.": "",
-            "Xinha cowardly refuses to delete the last row in table.": "",
-            "Caption": "<<InsertTable>>",
-            "Columns": "<<Forms>>",
-            "Description": "<<FullPage>>",
-            "Merge Cells": "<<ContextMenu>>",
-            "Padding": "<<InlineStyler>>",
-            "pixels": "<<HorizontalRule>>",
-            "Rows": "<<Forms>>",
-            "Spacing": "<<InsertImage>>"
-        },
-        "UnsavedChanges": {
-            "You have unsaved changes in the editor": ""
-        },
-        "WebKit": {
-            "The Paste button does not work in this browser for security reasons. Press CTRL-V on your keyboard to paste directly.": "<<Gecko>>"
-        },
-        "Xinha": {
-            "&#8212; font &#8212;": "",
-            "&#8212; format &#8212;": "",
-            "&#8212; size &#8212;": "",
-            "1 (8 pt)": "",
-            "2 (10 pt)": "",
-            "3 (12 pt)": "",
-            "4 (14 pt)": "",
-            "5 (18 pt)": "",
-            "6 (24 pt)": "",
-            "7 (36 pt)": "",
-            "Address": "",
-            "Arial": "",
-            "Clean content pasted from Word": "",
-            "Clear Inline Font Specifications": "",
-            "Clear MSOffice tags": "",
-            "Close": "",
-            "Constructing object": "",
-            "Courier New": "",
-            "Create Statusbar": "",
-            "Create Toolbar": "",
-            "CTRL-0 (zero)": "",
-            "CTRL-1 .. CTRL-6": "",
-            "CTRL-A": "",
-            "CTRL-B": "",
-            "CTRL-C": "",
-            "CTRL-E": "",
-            "CTRL-I": "",
-            "CTRL-J": "",
-            "CTRL-L": "",
-            "CTRL-N": "",
-            "CTRL-R": "",
-            "CTRL-S": "",
-            "CTRL-U": "",
-            "CTRL-V": "",
-            "CTRL-X": "",
-            "CTRL-Y": "",
-            "CTRL-Z": "",
-            "Editor Help": "",
-            "ENTER": "",
-            "Error Loading Xinha.  Developers, check the Error Console for information.": "",
-            "Finishing": "",
-            "Formatted": "",
-            "Generate Xinha framework": "",
-            "Georgia": "",
-            "Heading 1": "",
-            "Heading 2": "",
-            "Heading 3": "",
-            "Heading 4": "",
-            "Heading 5": "",
-            "Heading 6": "",
-            "Headings": "",
-            "Impact": "",
-            "Init editor size": "",
-            "insert linebreak": "",
-            "Insert/Overwrite": "",
-            "Keyboard shortcuts": "",
-            "Loading Core": "",
-            "Loading in progress. Please wait!": "",
-            "Loading plugin $plugin": "",
-            "Loading plugins": "",
-            "MS Word Cleaner": "",
-            "new paragraph": "",
-            "Normal": "",
-            "Print document": "",
-            "Register plugin $plugin": "",
-            "Remove formatting": "",
-            "Save as": "",
-            "Select all": "",
-            "Select Color": "",
-            "Set format to paragraph": "",
-            "SHIFT-ENTER": "",
-            "Split Block": "",
-            "Tahoma": "",
-            "The editor provides the following key combinations:": "",
-            "Times New Roman": "",
-            "Toggle Borders": "",
-            "Touch here first to activate editor.": "",
-            "Verdana": "",
-            "Waiting for Iframe to load...": "",
-            "WingDings": "",
-            "Would you like to clear font colours?": "",
-            "Would you like to clear font sizes?": "",
-            "Would you like to clear font typefaces?": "",
-            "Xinha": ""
-        },
-        "BackgroundImage": {
-            "__ TRANSLATOR NOTE __": "*** BACKGROUNDIMAGE IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***",
-            "Remove Current Background": "",
-            "Set Background": "",
-            "Set page background image": "",
-            "Set Page Background Image": ""
-        },
-        "ClientsideSpellcheck": {
-            "__ TRANSLATOR NOTE __": "*** CLIENTSIDESPELLCHECK IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***",
-            "Spell Check using ieSpell": ""
-        },
-        "ExtendedFileManager": {
-            "__ TRANSLATOR NOTE __": "*** EXTENDEDFILEMANAGER IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***",
-            "10%": "",
-            "100%": "",
-            "200%": "",
-            "25%": "",
-            "50%": "",
-            "75%": "",
-            ">List View": "",
-            ">Thumbnail View": "",
-            "A:": "",
-            "Align": "",
-            "Alt": "",
-            "Border Color": "",
-            "Constrain Proportions": "",
-            "Crop": "",
-            "D:": "",
-            "Directory": "",
-            "Directory Up": "",
-            "Edit": "",
-            "File List": "",
-            "File Manager": "",
-            "Filename:": "",
-            "Filesize:": "",
-            "Flip Horizontal": "",
-            "Flip Image": "",
-            "Flip Vertical": "",
-            "Folder": "",
-            "GIF": "",
-            "GIF format is not supported, image editing not supported.": "",
-            "H:": "",
-            "Image Editor": "",
-            "Image Selection": "",
-            "Invalid base directory:": "",
-            "JPEG High": "",
-            "JPEG Low": "",
-            "JPEG Medium": "",
-            "Loading": "",
-            "Lock": "",
-            "Marker": "",
-            "Maximum folder size limit reached. Upload disabled.": "",
-            "Measure": "",
-            "New Folder": "",
-            "No Files Found": "",
-            "No Image Available": "",
-            "Please enter value": "",
-            "PNG": "",
-            "Preset": "",
-            "Quality:": "",
-            "Refresh": "",
-            "Rename": "",
-            "Resize": "",
-            "Rotate": "",
-            "Rotate 180 &deg;": "",
-            "Rotate 90 &deg; CCW": "",
-            "Rotate 90 &deg; CW": "",
-            "Rotate Image": "",
-            "Start X:": "",
-            "Start Y:": "",
-            "Target Window": "",
-            "Toggle marker color": "",
-            "Trash": "",
-            "Upload": "",
-            "W:": "",
-            "X:": "",
-            "Xinha Image Editor": "",
-            "Y:": "",
-            "Zoom": "",
-            "Absbottom": "<<InsertImage>>",
-            "Absmiddle": "<<InsertImage>>",
-            "Baseline": "<<InlineStyler>>",
-            "Border": "<<InlineStyler>>",
-            "Bottom": "<<InlineStyler>>",
-            "Clear": "<<FindReplace>>",
-            "Color": "<<HorizontalRule>>",
-            "Copy": "<<ContextMenu>>",
-            "Cut": "<<ContextMenu>>",
-            "Height": "<<HorizontalRule>>",
-            "Height:": "<<HorizontalRule>>",
-            "Insert File Link": "<<MootoolsFileManager>>",
-            "Left": "<<HorizontalRule>>",
-            "Margin": "<<InlineStyler>>",
-            "Middle": "<<InlineStyler>>",
-            "Not set": "<<InsertImage>>",
-            "Padding": "<<InlineStyler>>",
-            "Positioning of this image": "<<InsertImage>>",
-            "Preview": "<<Equation>>",
-            "Right": "<<HorizontalRule>>",
-            "Save": "<<SaveSubmit>>",
-            "Texttop": "<<InsertImage>>",
-            "Top": "<<InlineStyler>>",
-            "Width": "<<HorizontalRule>>",
-            "Width:": "<<HorizontalRule>>",
-            "You must select some text before making a new link.": "<<Linker>>"
-        },
-        "Filter": {
-            "__ TRANSLATOR NOTE __": "*** FILTER IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***",
-            "Filter": "<<InsertSnippet2>>"
-        },
-        "HtmlTidy": {
-            "__ TRANSLATOR NOTE __": "*** HTMLTIDY IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***",
-            "Auto-Tidy": "",
-            "Don't Tidy": "",
-            "HTML Tidy": "",
-            "Tidy failed.  Check your HTML for syntax errors.": ""
-        },
-        "ImageManager": {
-            "__ TRANSLATOR NOTE __": "*** IMAGEMANAGER IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***",
-            "Angle:": "",
-            "Flickr Picture List": "",
-            "Flickr Pictures": "",
-            "Flickr Selection": "",
-            "Flickr Username/Email": "",
-            "Folder Name:": "",
-            "Image Format": "",
-            "Image List": "",
-            "Keyword": "",
-            "No Images Found": "",
-            "No Photos Found": "",
-            "No Videos Found": "",
-            "This Server": "",
-            "YouTube Selection": "",
-            "YouTube Username": "",
-            "YouTube Video List": "",
-            "YouTube Videos": "",
-            "A:": "<<ExtendedFileManager>>",
-            "Absbottom": "<<InsertImage>>",
-            "Absmiddle": "<<InsertImage>>",
-            "Baseline": "<<InlineStyler>>",
-            "Bottom": "<<InlineStyler>>",
-            "Clear": "<<FindReplace>>",
-            "Constrain Proportions": "<<ExtendedFileManager>>",
-            "Crop": "<<ExtendedFileManager>>",
-            "D:": "<<ExtendedFileManager>>",
-            "Directory": "<<ExtendedFileManager>>",
-            "Directory Up": "<<ExtendedFileManager>>",
-            "Edit": "<<ExtendedFileManager>>",
-            "Filename:": "<<ExtendedFileManager>>",
-            "Flip Horizontal": "<<ExtendedFileManager>>",
-            "Flip Image": "<<ExtendedFileManager>>",
-            "Flip Vertical": "<<ExtendedFileManager>>",
-            "GIF": "<<ExtendedFileManager>>",
-            "GIF format is not supported, image editing not supported.": "<<ExtendedFileManager>>",
-            "H:": "<<ExtendedFileManager>>",
-            "Height:": "<<HorizontalRule>>",
-            "Image Editor": "<<ExtendedFileManager>>",
-            "Image Selection": "<<ExtendedFileManager>>",
-            "Insert Image": "<<InsertImage>>",
-            "Invalid base directory:": "<<ExtendedFileManager>>",
-            "JPEG High": "<<ExtendedFileManager>>",
-            "JPEG Low": "<<ExtendedFileManager>>",
-            "JPEG Medium": "<<ExtendedFileManager>>",
-            "Left": "<<HorizontalRule>>",
-            "Lock": "<<ExtendedFileManager>>",
-            "Marker": "<<ExtendedFileManager>>",
-            "Measure": "<<ExtendedFileManager>>",
-            "Middle": "<<InlineStyler>>",
-            "New Folder": "<<ExtendedFileManager>>",
-            "No Image Available": "<<ExtendedFileManager>>",
-            "Not set": "<<InsertImage>>",
-            "PNG": "<<ExtendedFileManager>>",
-            "Positioning of this image": "<<InsertImage>>",
-            "Quality:": "<<ExtendedFileManager>>",
-            "Refresh": "<<ExtendedFileManager>>",
-            "Resize": "<<ExtendedFileManager>>",
-            "Right": "<<HorizontalRule>>",
-            "Rotate": "<<ExtendedFileManager>>",
-            "Rotate 180 &deg;": "<<ExtendedFileManager>>",
-            "Rotate 90 &deg; CCW": "<<ExtendedFileManager>>",
-            "Rotate 90 &deg; CW": "<<ExtendedFileManager>>",
-            "Rotate Image": "<<ExtendedFileManager>>",
-            "Save": "<<SaveSubmit>>",
-            "Start X:": "<<ExtendedFileManager>>",
-            "Start Y:": "<<ExtendedFileManager>>",
-            "Texttop": "<<InsertImage>>",
-            "Top": "<<InlineStyler>>",
-            "Trash": "<<ExtendedFileManager>>",
-            "W:": "<<ExtendedFileManager>>",
-            "Width:": "<<HorizontalRule>>",
-            "X:": "<<ExtendedFileManager>>",
-            "Y:": "<<ExtendedFileManager>>"
-        },
-        "InsertMarquee": {
-            "__ TRANSLATOR NOTE __": "*** INSERTMARQUEE IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***",
-            "Alternate": "",
-            "Background-Color:": "",
-            "Behavior:": "",
-            "Continuous": "",
-            "Direction:": "",
-            "Insert scrolling marquee": "",
-            "Marquee Editor": "",
-            "Scroll Amount:": "",
-            "Scroll Delay:": "",
-            "Slide": "",
-            "Speed Control": "",
-            "Height:": "<<HorizontalRule>>",
-            "Left": "<<HorizontalRule>>",
-            "Name": "<<Forms>>",
-            "Name/ID:": "<<Forms>>",
-            "Right": "<<HorizontalRule>>",
-            "Text:": "<<Forms>>",
-            "Width:": "<<HorizontalRule>>"
-        },
-        "InsertPicture": {
-            "__ TRANSLATOR NOTE __": "*** INSERTPICTURE IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***",
-            "Leave empty for not defined": "",
-            "Open file in new window": "",
-            " Open file in new window": "",
-            "Upload file": "",
-            "Absbottom": "<<InsertImage>>",
-            "Absmiddle": "<<InsertImage>>",
-            "Alignment:": "<<HorizontalRule>>",
-            "Alternate text:": "<<InsertImage>>",
-            "Baseline": "<<InlineStyler>>",
-            "Border thickness:": "<<InsertImage>>",
-            "Bottom": "<<InlineStyler>>",
-            "Enter the image URL here": "<<InsertImage>>",
-            "For browsers that don't support images": "<<InsertImage>>",
-            "Height:": "<<HorizontalRule>>",
-            "Horizontal padding": "<<InsertImage>>",
-            "Horizontal:": "<<InsertImage>>",
-            "Image Preview:": "<<InsertImage>>",
-            "Image URL:": "<<Forms>>",
-            "Insert Image": "<<InsertImage>>",
-            "Layout": "<<HorizontalRule>>",
-            "Leave empty for no border": "<<InsertImage>>",
-            "Left": "<<HorizontalRule>>",
-            "Middle": "<<InlineStyler>>",
-            "Not set": "<<InsertImage>>",
-            "Positioning of this image": "<<InsertImage>>",
-            "Preview": "<<Equation>>",
-            "Preview the image in a new window": "<<InsertImage>>",
-            "Right": "<<HorizontalRule>>",
-            "Size": "<<Forms>>",
-            "Spacing": "<<InsertImage>>",
-            "Texttop": "<<InsertImage>>",
-            "Top": "<<InlineStyler>>",
-            "Vertical padding": "<<InsertImage>>",
-            "Vertical:": "<<InsertImage>>",
-            "Width:": "<<HorizontalRule>>"
-        },
-        "NoteServer": {
-            "__ TRANSLATOR NOTE __": "*** NOTESERVER IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***",
-            "120%": "",
-            "150%": "",
-            "80%": "",
-            "Add GUIDO Code in a textbox on the page": "",
-            "Add MIDI link to allow students to hear the music": "",
-            "Format": "",
-            "GUIDO Code": "",
-            "Guido code": "",
-            "Image in applet": "",
-            "Insert GUIDO Music Notation": "",
-            "MIDI File": "",
-            "Source Code": "",
-            "With Mozilla, the applet will not be visible in editor, but only in Web page after submitting.": "",
-            "Zoom :": "",
-            "100%": "<<ExtendedFileManager>>",
-            "Image Preview": "<<InsertImage>>",
-            "Options": "<<FindReplace>>",
-            "Preview": "<<Equation>>",
-            "Preview the image in a new window": "<<InsertImage>>",
-            "Zoom": "<<ExtendedFileManager>>"
-        },
-        "PSLocal": {
-            "__ TRANSLATOR NOTE __": "*** PSLOCAL IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***",
-            "Confirm": "",
-            "Enable": "",
-            "Enable Gears in order to use local document storage and configuration.": "",
-            "Enabling Local Storage": "",
-            "Install": "",
-            "Learn About Local Storage": "",
-            "This will reload the page, causing you to lose any unsaved work.  Press \"OK\" to reload.": "",
-            "Xinha uses Google Gears to enable local document storage.  With Gears installed, you can save drafts of your documents on your hard drive, configure Xinha to look the way you want, and carry this information wherever you use Xinha on the web.": ""
-        },
-        "PSServer": {
-            "__ TRANSLATOR NOTE __": "*** PSSERVER IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***",
-            "File: ": "",
-            "Import": ""
-        },
-        "PersistentStorage": {
-            "__ TRANSLATOR NOTE __": "*** PERSISTENTSTORAGE IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***",
-            "Details": "",
-            "File Browser": "",
-            "Hello    There C ": "",
-            "Hello  There A ": "",
-            "Hello \" There B \"": "",
-            "Hello ' There D '": "",
-            "List of Places": "",
-            "New Document": "",
-            "Open": "",
-            "Open Document": "",
-            "Places": "",
-            "Please enter the name of the directory you'd like to create.": "",
-            "Save Document": "",
-            "This will erase any unsaved content.  If you're certain, please click OK to continue.": "",
-            "Web URL": "",
-            "Confirm": "<<PSLocal>>",
-            "Copy": "<<ContextMenu>>",
-            "Delete": "<<Abbreviation>>",
-            "Directory Up": "<<ExtendedFileManager>>",
-            "File List": "<<ExtendedFileManager>>",
-            "File Manager": "<<ExtendedFileManager>>",
-            "Filename": "<<ExtendedFileManager>>",
-            "Insert": "<<InsertNote>>",
-            "Insert Image": "<<InsertImage>>",
-            "New Folder": "<<ExtendedFileManager>>",
-            "Save": "<<SaveSubmit>>",
-            "You must select some text before making a new link.": "<<Linker>>"
-        },
-        "SpellChecker": {
-            "__ TRANSLATOR NOTE __": "*** SPELLCHECKER IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***",
-            "Dictionary": "",
-            "Finished list of mispelled words": "",
-            "HTMLArea Spell Checker": "",
-            "I will open it in a new page.": "",
-            "Ignore": "",
-            "Ignore all": "",
-            "Info": "",
-            "Learn": "",
-            "No mispelled words found with the selected dictionary.": "",
-            "Original word": "",
-            "Please confirm that you want to open this link": "",
-            "Please wait.  Calling spell checker.": "",
-            "Please wait: changing dictionary to": "",
-            "pliz weit ;-)": "",
-            "Re-check": "",
-            "Replace": "",
-            "Replace all": "",
-            "Revert": "",
-            "Spell Checker": "",
-            "Spell-check": "",
-            "Suggestions": "",
-            "This will drop changes and quit spell checker.  Please confirm.": "",
-            "Replace with": "<<FindReplace>>"
-        },
-        "Template": {
-            "__ TRANSLATOR NOTE __": "*** TEMPLATE IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***",
-            "Insert template": ""
-        },
-        "UnFormat": {
-            "__ TRANSLATOR NOTE __": "*** UNFORMAT IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***",
-            "All": "",
-            "All HTML:": "",
-            "Cleaning Area": "",
-            "Cleaning options": "",
-            "Formatting:": "",
-            "Page Cleaner": "",
-            "Select which types of formatting you would like to remove.": "",
-            "Selection": ""
-        }
-    }
-}
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/lang/merged/zh_cn.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/lang/merged/zh_cn.js
deleted file mode 100644
index c9642f7..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/lang/merged/zh_cn.js
+++ /dev/null
@@ -1,1513 +0,0 @@
-// Xinha Language Combined Translation File
-//
-// LANG: "zh_cn", ENCODING: UTF-8
-//
-// INSTRUCTIONS TO TRANSLATORS
-// ===========================================================================
-//
-// Your translation must be in UTF-8 Character Encoding.
-//
-// This is a JSON encoded file (plus comments), strings should be double-quote
-// only, do not use single quotes to surround strings - "hello", not 'hello'
-// do not have a trailing comma after the last entry in a section.
-//
-// Only full line comments are allowed (that a comments occupy entire lines).
-//
-// Search for the __NEW_TRANSLATIONS__ section below, this is where you will
-// want to focus, this section includes things that do not presently have a 
-// translation or for which the translation needs to be checked for accuracy.
-//
-// In the New Translations section a translation string is one of the following
-//
-//  "English String Here" : ""
-//     This means it is not translated yet, add your translation...
-//     "English String Here" : "Klingon String Here"
-//
-//  "English String Here" : "Translated String Here"
-//     This means that an existing translation for this string, in some other
-//     section has been found, and used.  Check that it is approprite for this
-//     section and if it is, that's fine leave it as is, otherwise change as
-//     appropriate.
-//
-//  "English String Here" : "<<AnotherSection>>"
-//     This means use the same translation for this string as <<AnotherSection>>
-//     this saves you re-tranlating strings.  If the Context of this section
-//     and the context of AnotherSection seem the same, that's fine leave it
-//     using that translation, but if this section needs a different translation, 
-//     you can provide it by replacing the link (<<AnotherSection>>) with that
-//     new translation.  For example - a "Table" in say "DataPlugin" is 
-//     perhaps translated differently to "Table" in "FurniturePlugin".
-//
-// TESTING YOUR TRANSLATION
-// ===========================================================================
-// Simply place your translation file on your webserver somewhere for example
-//
-//   /xinha/lang/merged/zh_cn.js
-//
-// and then tell Xinha where to get it (before loading XinhaCore.js) by 
-//
-//  _editor_lang              = 'zh_cn';
-//  _editor_lang_merged_file  = '/xinha/lang/merged/zh_cn.js';
-//
-// Xinha will load your new language definition.
-//
-// SUBMITTING YOUR TRANSLATION
-// ===========================================================================
-// Simply create a Ticket on the Xinha website and attach your translation 
-// file.
-//
-// The Xinha developers will take your file and use the 
-//     contrib/lc_split_merged_file.php
-// script to load it into the Xinha distribution.
-
-{
-    "AboutBox": {
-        "About this editor": "关於 Xinha"
-    },
-    "ContextMenu": {
-        "Justify Center": "位置居中",
-        "Justify Full": "位置左右平等",
-        "Justify Left": "位置靠左",
-        "Justify Right": "位置靠右"
-    },
-    "HorizontalRule": {
-        "Horizontal Rule": "水平线"
-    },
-    "InsertTable": {
-        "Insert Table": "插入表格"
-    },
-    "Xinha": {
-        "About this editor": "关於 Xinha",
-        "Background Color": "背景颜色",
-        "Bold": "粗体",
-        "Bulleted List": "无序清单",
-        "Current style": "字体例子",
-        "Decrease Indent": "减小行前空白",
-        "Font Color": "文字颜色",
-        "Help using editor": "说明",
-        "Horizontal Rule": "水平线",
-        "Increase Indent": "加宽行前空白",
-        "Insert Table": "插入表格",
-        "Insert Web Link": "插入连结",
-        "Insert/Modify Image": "插入图形",
-        "Italic": "斜体",
-        "Justify Center": "位置居中",
-        "Justify Full": "位置左右平等",
-        "Justify Left": "位置靠左",
-        "Justify Right": "位置靠右",
-        "Ordered List": "顺序清单",
-        "Strikethrough": "删除线",
-        "Subscript": "下标",
-        "Superscript": "上标",
-        "Toggle HTML Source": "切换HTML原始码",
-        "Underline": "底线"
-    },
-    "__NEW_TRANSLATIONS__": {
-        "Abbreviation": {
-            "Abbreviation": "",
-            "Cancel": "",
-            "Delete": "",
-            "Expansion:": "",
-            "OK": ""
-        },
-        "AboutBox": {
-            "Close": "<<Xinha>>"
-        },
-        "CharCounter": {
-            "... in progress": "",
-            "Chars": "",
-            "HTML": "",
-            "Words": ""
-        },
-        "CharacterMap": {
-            "Insert special character": ""
-        },
-        "ColorPicker": {
-            "Click a color...": "",
-            "Color: ": "",
-            "Sample": "",
-            "Web Safe: ": "",
-            "Close": "<<Xinha>>",
-            "OK": "<<Abbreviation>>"
-        },
-        "ContextMenu": {
-            "_Delete Row": "",
-            "_Image Properties...": "",
-            "_Modify Link...": "",
-            "_Remove Link...": "",
-            "_Table Properties...": "",
-            "C_ell Properties...": "",
-            "Chec_k Link...": "",
-            "Copy": "",
-            "Create a link": "",
-            "Current URL is": "",
-            "Cut": "",
-            "De_lete Column": "",
-            "Delete Cell": "",
-            "Delete the current column": "",
-            "Delete the current row": "",
-            "How did you get here? (Please report!)": "",
-            "I_nsert Row Before": "",
-            "In_sert Row After": "",
-            "Insert _Column Before": "",
-            "Insert a new column after the current one": "",
-            "Insert a new column before the current one": "",
-            "Insert a new row after the current one": "",
-            "Insert a new row before the current one": "",
-            "Insert a paragraph after the current node": "",
-            "Insert a paragraph before the current node": "",
-            "Insert C_olumn After": "",
-            "Insert Cell After": "",
-            "Insert Cell Before": "",
-            "Insert paragraph after": "",
-            "Insert paragraph before": "",
-            "Link points to:": "",
-            "Make lin_k...": "",
-            "Merge Cells": "",
-            "Opens this link in a new window": "",
-            "Paste": "",
-            "Please confirm that you want to remove this element:": "",
-            "Please confirm that you want to unlink this element.": "",
-            "Remove the $elem Element...": "",
-            "Remove this node from the document": "",
-            "Ro_w Properties...": "",
-            "Show the image properties dialog": "",
-            "Show the Table Cell Properties dialog": "",
-            "Show the Table Properties dialog": "",
-            "Show the Table Row Properties dialog": "",
-            "Unlink the current element": ""
-        },
-        "CreateLink": {
-            "Are you sure you wish to remove this link?": "",
-            "Insert/Modify Link": "",
-            "New window (_blank)": "",
-            "None (use implicit)": "",
-            "Other": "",
-            "Same frame (_self)": "",
-            "Target:": "",
-            "Title (tooltip):": "",
-            "Top frame (_top)": "",
-            "URL:": "",
-            "You need to select some text before creating a link": "",
-            "Cancel": "<<Abbreviation>>",
-            "OK": "<<Abbreviation>>"
-        },
-        "DefinitionList": {
-            "definition description": "",
-            "definition list": "",
-            "definition term": ""
-        },
-        "Dialogs": {
-            "Some Text Here": ""
-        },
-        "DynamicCSS": {
-            "Choose stylesheet": "",
-            "Default": "",
-            "Undefined": ""
-        },
-        "EditTag": {
-            "Edit HTML for selected text": "",
-            "Edit Tag By Peg": "",
-            "Tag Editor": "",
-            "Cancel": "<<Abbreviation>>",
-            "OK": "<<Abbreviation>>"
-        },
-        "Equation": {
-            "!=": "",
-            "!in": "",
-            "&gt;-": "",
-            "&gt;=": "",
-            "&lt;=": "",
-            "&lt;=&gt;": "",
-            "&lt;x&gt;": "",
-            "&nbsp; `!` &nbsp;": "",
-            "&nbsp; `.` &nbsp;": "",
-            "&nbsp; `0` &nbsp;": "",
-            "&nbsp; `2` &nbsp;": "",
-            "&nbsp; `3` &nbsp;": "",
-            "&nbsp; `4` &nbsp;": "",
-            "&nbsp; `5` &nbsp;": "",
-            "&nbsp; `6` &nbsp;": "",
-            "&nbsp; `7` &nbsp;": "",
-            "&nbsp; `8` &nbsp;": "",
-            "&nbsp; `9` &nbsp;": "",
-            "&nbsp; `e` &nbsp;": "",
-            "&nbsp;&nbsp;`1` &nbsp;": "",
-            "&nbsp;`+{::}`&nbsp;": "",
-            "&nbsp;`-:\\ `": "",
-            "&nbsp;`-{::}`&nbsp;": "",
-            "&nbsp;`C`&nbsp;": "",
-            "&nbsp;`cos`": "",
-            "&nbsp;`ln`&nbsp;": "",
-            "&nbsp;`pi` &nbsp;": "",
-            "&nbsp;`sin`": "",
-            "&nbsp;`tan`": "",
-            "&nbsp;`times`&nbsp;": "",
-            "&quot;text&quot;": "",
-            "'+formula+'": "",
-            "((n),(k))": "",
-            "(x+1)/(x-1)": "",
-            "*": "",
-            "**": "",
-            "+-": "",
-            "-&gt;": "",
-            "-&lt;": "",
-            "-:": "",
-            "-=": "",
-            "//": "",
-            "/_": "",
-            ":.": "",
-            "=&gt;": "",
-            "@": "",
-            "[[a,b],[c,d]]": "",
-            "\\\\": "",
-            "\\nClick in the box to use your keyboard or use the buttons\\n": "",
-            "^^": "",
-            "^^^": "",
-            "__|": "",
-            "_|_": "",
-            "`!=`": "",
-            "`!in`": "",
-            "`&and;`": "",
-            "`&cap;`": "",
-            "`&cup;`": "",
-            "`&gt;-`": "",
-            "`&gt;=`": "",
-            "`&lt;=&gt;`": "",
-            "`&lt;=`": "",
-            "`&lt;x&gt;`": "",
-            "`&or;`": "",
-            "`&quot;text&quot;`": "",
-            "`((n),(k))`": "",
-            "`(x+1)/(x-1)`": "",
-            "`**`": "",
-            "`*`": "",
-            "`+-`": "",
-            "`-&gt;`": "",
-            "`-&lt;`": "",
-            "`-:`": "",
-            "`-=`": "",
-            "`//`": "",
-            "`/_`": "",
-            "`:.`": "",
-            "`=&gt;`": "",
-            "`@`": "",
-            "`[[a,b],[c,d]]`": "",
-            "`\\\\`": "",
-            "`__|`": "",
-            "`_|_`": "",
-            "`AA`": "",
-            "`aleph`": "",
-            "`alpha`": "",
-            "`and`": "",
-            "`bara`": "",
-            "`bba`": "",
-            "`bbba`": "",
-            "`beta`": "",
-            "`CC`": "",
-            "`cca`": "",
-            "`chi`": "",
-            "`darr`": "",
-            "`ddota`": "",
-            "`del`": "",
-            "`Delta`": "",
-            "`delta`": "",
-            "`diamond`": "",
-            "`dota`": "",
-            "`dy/dx`": "",
-            "`EE`": "",
-            "`epsi`": "",
-            "`eta`": "",
-            "`fra`": "",
-            "`Gamma`": "",
-            "`gamma`": "",
-            "`grad`": "",
-            "`hArr`": "",
-            "`harr`": "",
-            "`hata`": "",
-            "`if`": "",
-            "`in`": "",
-            "`int`": "",
-            "`iota`": "",
-            "`kappa`": "",
-            "`Lambda`": "",
-            "`lambda`": "",
-            "`larr`": "",
-            "`lArr`": "",
-            "`lim_(x-&gt;oo)`": "",
-            "`log`": "",
-            "`mu`": "",
-            "`NN`": "",
-            "`nn`": "",
-            "`not`": "",
-            "`nu`": "",
-            "`o+`": "",
-            "`o.`": "",
-            "`O/`": "",
-            "`oint`": "",
-            "`Omega`": "",
-            "`omega`": "",
-            "`oo`": "",
-            "`or`": "",
-            "`ox`": "",
-            "`phi`": "",
-            "`Phi`": "",
-            "`Pi`": "",
-            "`pi`": "",
-            "`prod`": "",
-            "`prop`": "",
-            "`psi`": "",
-            "`Psi`": "",
-            "`QQ`": "",
-            "`quad`": "",
-            "`rArr`": "",
-            "`rho`": "",
-            "`root(n)(x)`": "",
-            "`RR`": "",
-            "`sfa`": "",
-            "`Sigma`": "",
-            "`sigma`": "",
-            "`sqrt(x)`": "",
-            "`square`": "",
-            "`stackrel(-&gt;)(+)`": "",
-            "`sub`": "",
-            "`sube`": "",
-            "`sum`": "",
-            "`sup`": "",
-            "`supe`": "",
-            "`tau`": "",
-            "`theta`": "",
-            "`Theta`": "",
-            "`TT`": "",
-            "`tta`": "",
-            "`uarr`": "",
-            "`ula`": "",
-            "`upsilon`": "",
-            "`uu`": "",
-            "`veca`": "",
-            "`vv`": "",
-            "`x_(mn)`": "",
-            "`xi`": "",
-            "`Xi`": "",
-            "`xx`": "",
-            "`zeta`": "",
-            "`ZZ`": "",
-            "`|-&gt;`": "",
-            "`|--`": "",
-            "`|==`": "",
-            "`|__`": "",
-            "`|~`": "",
-            "`~=`": "",
-            "`~|`": "",
-            "`~~`": "",
-            "AA": "",
-            "aleph": "",
-            "alpha": "",
-            "and": "",
-            "AsciiMath Formula Input": "",
-            "AsciiMathML Example": "",
-            "bara": "",
-            "Based on ASCIIMathML by": "",
-            "bba": "",
-            "bbba": "",
-            "beta": "",
-            "CC": "",
-            "cca": "",
-            "chi": "",
-            "darr": "",
-            "ddota": "",
-            "del": "",
-            "delta": "",
-            "Delta": "",
-            "diamond": "",
-            "dota": "",
-            "dy/dx": "",
-            "EE": "",
-            "epsi": "",
-            "eta": "",
-            "For more information on AsciiMathML visit this page:": "",
-            "Formula Editor": "",
-            "fra": "",
-            "gamma": "",
-            "Gamma": "",
-            "grad": "",
-            "hArr": "",
-            "harr": "",
-            "hata": "",
-            "if": "",
-            "in": "",
-            "Input": "",
-            "int": "",
-            "int_a^bf(x)dx": "",
-            "iota": "",
-            "kappa": "",
-            "lambda": "",
-            "Lambda": "",
-            "lArr": "",
-            "larr": "",
-            "lim_(x-&gt;oo)": "",
-            "mu": "",
-            "nn": "",
-            "NN": "",
-            "nnn": "",
-            "not": "",
-            "nu": "",
-            "o+": "",
-            "o.": "",
-            "O/": "",
-            "oint": "",
-            "Omega": "",
-            "omega": "",
-            "oo": "",
-            "or": "",
-            "ox": "",
-            "Phi": "",
-            "phi": "",
-            "pi": "",
-            "Pi": "",
-            "Preview": "",
-            "prod": "",
-            "prop": "",
-            "psi": "",
-            "Psi": "",
-            "QQ": "",
-            "quad": "",
-            "rArr": "",
-            "rho": "",
-            "root(n)(x)": "",
-            "RR": "",
-            "sfa": "",
-            "Sigma": "",
-            "sigma": "",
-            "sqrt(x)": "",
-            "square": "",
-            "stackrel(-&gt;)(+)": "",
-            "sub": "",
-            "sube": "",
-            "sum": "",
-            "sum_(n=1)^oo": "",
-            "sup": "",
-            "supe": "",
-            "tau": "",
-            "Theta": "",
-            "theta": "",
-            "TT": "",
-            "tta": "",
-            "uarr": "",
-            "ula": "",
-            "upsilon": "",
-            "uu": "",
-            "uuu": "",
-            "veca": "",
-            "vv": "",
-            "vvv": "",
-            "x^(m+n)": "",
-            "x_(mn)": "",
-            "Xi": "",
-            "xi": "",
-            "xx": "",
-            "zeta": "",
-            "ZZ": "",
-            "|-&gt;": "",
-            "|--": "",
-            "|==": "",
-            "|__": "",
-            "|~": "",
-            "~=": "",
-            "~|": "",
-            "~~": "",
-            "Cancel": "<<Abbreviation>>",
-            "OK": "<<Abbreviation>>"
-        },
-        "FancySelects": {
-            "'+opt.text+'": ""
-        },
-        "FindReplace": {
-            "';\r\n  var tagc = '": "",
-            "Case sensitive search": "",
-            "Clear": "",
-            "Done": "",
-            "Enter the text you want to find": "",
-            "Find and Replace": "",
-            "found item": "",
-            "found items": "",
-            "Highlight": "",
-            "Inform a replacement word": "",
-            "Next": "",
-            "not found": "",
-            "Options": "",
-            "Replace with:": "",
-            "replaced item": "",
-            "replaced items": "",
-            "Search for:": "",
-            "Substitute all occurrences": "",
-            "Substitute this occurrence?": "",
-            "Undo": "",
-            "Whole words only": ""
-        },
-        "FormOperations": {
-            "Enter the name for new option.": "",
-            "Form Editor": "",
-            "Insert a check box.": "",
-            "Insert a Form.": "",
-            "Insert a multi-line text field.": "",
-            "Insert a radio button.": "",
-            "Insert a select field.": "",
-            "Insert a submit/reset button.": "",
-            "Insert a text, password or hidden field.": "",
-            "Message Sent": "",
-            "Please Select...": ""
-        },
-        "Forms": {
-            "'onClick'=": "",
-            "Access Key:": "",
-            "Action URL:": "",
-            "Button Script": "",
-            "Checked": "",
-            "Columns:": "",
-            "Default text (optional)": "",
-            "Dimensions": "",
-            "Disabled": "",
-            "Encoding:": "",
-            "For Control:": "",
-            "Form": "",
-            "Form Element: FIELDSET": "",
-            "Form Element: INPUT": "",
-            "Form Element: LABEL": "",
-            "Form Element: SELECT": "",
-            "Form Element: TEXTAREA": "",
-            "Form handler script": "",
-            "Form Name:": "",
-            "Get": "",
-            "Hard": "",
-            "Height in number of rows": "",
-            "HTML-Form to CGI (default)": "",
-            "Image source": "",
-            "Image URL:": "",
-            "Initial Text:": "",
-            "Insert/Edit Form": "",
-            "Insert/Edit Form Element FIELDSET": "",
-            "Insert/Edit Form Element INPUT": "",
-            "Insert/Edit Form Element LABEL": "",
-            "Insert/Edit Form Element SELECT": "",
-            "Insert/Edit Form Element TEXTAREA": "",
-            "Javascript for button click": "",
-            "Label:": "",
-            "Legend:": "",
-            "Max length:": "",
-            "Maximum number of characters accepted": "",
-            "Method:": "",
-            "multipart Form Data (File-Upload)": "",
-            "Name": "",
-            "Name of the form input": "",
-            "Name of the form select": "",
-            "name of the textarea": "",
-            "Name/ID:": "",
-            "normal": "",
-            "nowrap": "",
-            "Off": "",
-            "Physical": "",
-            "Please enter a Label": "",
-            "Post": "",
-            "pre": "",
-            "Read Only": "",
-            "Rows:": "",
-            "Size of text box in characters": "",
-            "Size:": "",
-            "Soft": "",
-            "Tab Index:": "",
-            "Target Frame:": "",
-            "Text:": "",
-            "URL of image": "",
-            "Value of the form input": "",
-            "Value:": "",
-            "Virtual": "",
-            "Width in number of characters": "",
-            "Wrap Mode:": "",
-            "You must enter a Name": "",
-            "Cancel": "<<Abbreviation>>",
-            "OK": "<<Abbreviation>>",
-            "Options": "<<FindReplace>>"
-        },
-        "FullPage": {
-            "...": "",
-            "Alternate style-sheet:": "",
-            "Background color:": "",
-            "Character set:": "",
-            "cyrillic (ISO-8859-5)": "",
-            "cyrillic (KOI8-R)": "",
-            "cyrillic (WINDOWS-1251)": "",
-            "Description:": "",
-            "DOCTYPE:": "",
-            "Document properties": "",
-            "Document title:": "",
-            "Keywords:": "",
-            "Primary style-sheet:": "",
-            "Text color:": "",
-            "UTF-8 (recommended)": "",
-            "western (ISO-8859-1)": "",
-            "Cancel": "<<Abbreviation>>",
-            "OK": "<<Abbreviation>>"
-        },
-        "FullScreen": {
-            "Maximize/Minimize Editor": ""
-        },
-        "Gecko": {
-            "The Paste button does not work in this browser for security reasons. Press CTRL-V on your keyboard to paste directly.": ""
-        },
-        "HorizontalRule": {
-            "&#x00d7;": "",
-            "&nbsp;": "",
-            "Alignment:": "",
-            "Center": "",
-            "Color:": "",
-            "Height:": "",
-            "Insert/Edit Horizontal Rule": "",
-            "Insert/edit horizontal rule": "",
-            "Layout": "",
-            "Left": "",
-            "No shading": "",
-            "percent": "",
-            "pixels": "",
-            "Right": "",
-            "Style": "",
-            "Width:": "",
-            "Cancel": "<<Abbreviation>>",
-            "OK": "<<Abbreviation>>"
-        },
-        "InlineStyler": {
-            "Background": "",
-            "Baseline": "",
-            "Border": "",
-            "Bottom": "",
-            "Char": "",
-            "Collapsed borders": "",
-            "CSS Style": "",
-            "FG Color": "",
-            "Float": "",
-            "Justify": "",
-            "Margin": "",
-            "Middle": "",
-            "None": "",
-            "Padding": "",
-            "Text align": "",
-            "Top": "",
-            "Vertical align": "",
-            "-": "<<Equation>>",
-            "Center": "<<HorizontalRule>>",
-            "Height": "<<HorizontalRule>>",
-            "Image URL": "<<Forms>>",
-            "Layout": "<<HorizontalRule>>",
-            "Left": "<<HorizontalRule>>",
-            "percent": "<<HorizontalRule>>",
-            "pixels": "<<HorizontalRule>>",
-            "Right": "<<HorizontalRule>>",
-            "Width": "<<HorizontalRule>>"
-        },
-        "InsertAnchor": {
-            "Anchor name": "",
-            "Insert Anchor": "",
-            "Cancel": "<<Abbreviation>>",
-            "Delete": "<<Abbreviation>>",
-            "OK": "<<Abbreviation>>"
-        },
-        "InsertImage": {
-            "Absbottom": "",
-            "Absmiddle": "",
-            "Alternate text:": "",
-            "Border thickness:": "",
-            "Enter the image URL here": "",
-            "For browsers that don't support images": "",
-            "Horizontal padding": "",
-            "Horizontal:": "",
-            "Image Preview:": "",
-            "Insert Image": "",
-            "Leave empty for no border": "",
-            "Not set": "",
-            "Positioning of this image": "",
-            "Preview the image in a new window": "",
-            "Spacing": "",
-            "Texttop": "",
-            "Vertical padding": "",
-            "Vertical:": "",
-            "You must enter the URL": "",
-            "Alignment:": "<<HorizontalRule>>",
-            "Baseline": "<<InlineStyler>>",
-            "Bottom": "<<InlineStyler>>",
-            "Cancel": "<<Abbreviation>>",
-            "Image URL:": "<<Forms>>",
-            "Layout": "<<HorizontalRule>>",
-            "Left": "<<HorizontalRule>>",
-            "Middle": "<<InlineStyler>>",
-            "OK": "<<Abbreviation>>",
-            "Preview": "<<Equation>>",
-            "Right": "<<HorizontalRule>>",
-            "Top": "<<InlineStyler>>"
-        },
-        "InsertNote": {
-            "Insert": "",
-            "Insert footnote": "",
-            "Insert Note": "",
-            "Cancel": "<<Abbreviation>>"
-        },
-        "InsertPagebreak": {
-            "Page break": "",
-            "Page Break": ""
-        },
-        "InsertSmiley": {
-            "Insert Smiley": ""
-        },
-        "InsertSnippet": {
-            "\\n  This is an information about something\\n": "",
-            "Hide preview": "",
-            "Insert as": "",
-            "Insert Snippet": "",
-            "InsertSnippet for Xinha": "",
-            "Link1": "",
-            "Link2": "",
-            "Link3": "",
-            "Link4": "",
-            "Link5": "",
-            "Show preview": "",
-            "This is an information about something": "",
-            "Variable": "",
-            "Cancel": "<<Abbreviation>>"
-        },
-        "InsertSnippet2": {
-            "All Categories": "",
-            "Filter": "",
-            "Insert as HTML": "",
-            "Insert as template variable": "",
-            "Only search word beginning": "",
-            "Cancel": "<<Abbreviation>>",
-            "HTML": "<<CharCounter>>",
-            "Insert Snippet": "<<InsertSnippet>>",
-            "InsertSnippet for Xinha": "<<InsertSnippet>>",
-            "Variable": "<<InsertSnippet>>"
-        },
-        "InsertTable": {
-            "Caption": "",
-            "Caption for the table": "",
-            "Cell padding:": "",
-            "Cell spacing:": "",
-            "Collapse borders:": "",
-            "Cols:": "",
-            "Em": "",
-            "Fixed width columns": "",
-            "Layou": "",
-            "Number of columns": "",
-            "Number of rows": "",
-            "Positioning of this table": "",
-            "Space between adjacent cells": "",
-            "Space between content and border in cell": "",
-            "Style of the border": "",
-            "Width of the table": "",
-            "Width unit": "",
-            "You must enter a number of columns": "",
-            "You must enter a number of rows": "",
-            "Absbottom": "<<InsertImage>>",
-            "Absmiddle": "<<InsertImage>>",
-            "Alignment:": "<<HorizontalRule>>",
-            "Baseline": "<<InlineStyler>>",
-            "Border": "<<InlineStyler>>",
-            "Border thickness:": "<<InsertImage>>",
-            "Bottom": "<<InlineStyler>>",
-            "Cancel": "<<Abbreviation>>",
-            "Layout": "<<HorizontalRule>>",
-            "Leave empty for no border": "<<InsertImage>>",
-            "Left": "<<HorizontalRule>>",
-            "Middle": "<<InlineStyler>>",
-            "Not set": "<<InsertImage>>",
-            "OK": "<<Abbreviation>>",
-            "Percent": "<<HorizontalRule>>",
-            "Pixels": "<<HorizontalRule>>",
-            "Right": "<<HorizontalRule>>",
-            "Rows:": "<<Forms>>",
-            "Spacing": "<<InsertImage>>",
-            "Texttop": "<<InsertImage>>",
-            "Top": "<<InlineStyler>>",
-            "Width:": "<<HorizontalRule>>"
-        },
-        "LangMarks": {
-            "&mdash; language &mdash;": "",
-            "', '": "",
-            "English": "",
-            "French": "",
-            "Greek": "",
-            "language select": "",
-            "Latin": ""
-        },
-        "Linker": {
-            "(px)": "",
-            "Anchor-Link": "",
-            "Anchor:": "",
-            "Email Address:": "",
-            "Email Link": "",
-            "Location Bar:": "",
-            "Menu Bar:": "",
-            "Message Template:": "",
-            "New Window": "",
-            "Ordinary Link": "",
-            "Popup Window": "",
-            "PopupWindow": "",
-            "Remove Link": "",
-            "Resizeable:": "",
-            "Same Window (jump out of frames)": "",
-            "Scrollbars:": "",
-            "Shows On Hover": "",
-            "Status Bar:": "",
-            "Subject:": "",
-            "Title:": "",
-            "Toolbar:": "",
-            "URL Link": "",
-            "You must select some text before making a new link.": "",
-            "Are you sure you wish to remove this link?": "<<CreateLink>>",
-            "Cancel": "<<Abbreviation>>",
-            "Insert/Modify Link": "<<CreateLink>>",
-            "Name:": "<<Forms>>",
-            "OK": "<<Abbreviation>>",
-            "Size:": "<<Forms>>",
-            "Target:": "<<CreateLink>>",
-            "URL:": "<<CreateLink>>"
-        },
-        "ListType": {
-            "Choose list style type (for ordered lists)": "",
-            "Decimal numbers": "",
-            "Lower greek letters": "",
-            "Lower latin letters": "",
-            "Lower roman numbers": "",
-            "Upper latin letters": "",
-            "Upper roman numbers": ""
-        },
-        "MootoolsFileManager": {
-            "Insert File Link": "",
-            "You must select some text before making a new link.": "<<Linker>>"
-        },
-        "Opera": {
-            "MARK": "",
-            "The Paste button does not work in Mozilla based web browsers (technical security reasons). Press CTRL-V on your keyboard to paste directly.": ""
-        },
-        "PasteText": {
-            "Insert text in new paragraph": "",
-            "Paste as Plain Text": "",
-            "Cancel": "<<Abbreviation>>",
-            "OK": "<<Abbreviation>>"
-        },
-        "PreserveScripts": {
-            "JavaScript": "",
-            "PHP": ""
-        },
-        "QuickTag": {
-            "',\r\n                           'cl': '": "",
-            "ATTRIBUTES": "",
-            "Colors": "",
-            "Enter the TAG you want to insert": "",
-            "No CSS class avaiable": "",
-            "Ok": "",
-            "OPTIONS": "",
-            "Quick Tag Editor": "",
-            "TAGs": "",
-            "There are some unclosed quote": "",
-            "This attribute already exists in the TAG": "",
-            "You have to select some text": "",
-            "Cancel": "<<Abbreviation>>"
-        },
-        "SaveSubmit": {
-            "in progress": "",
-            "Ready": "",
-            "Save": "",
-            "Saving...": ""
-        },
-        "SetId": {
-            "ID/Name:": "",
-            "Set Id and Name": "",
-            "Set Id/Name": "",
-            "Set ID/Name": "",
-            "Cancel": "<<Abbreviation>>",
-            "Delete": "<<Abbreviation>>",
-            "OK": "<<Abbreviation>>"
-        },
-        "SmartReplace": {
-            "ClosingDoubleQuotes": "",
-            "ClosingSingleQuote": "",
-            "Convert all quotes and dashes in the current document": "",
-            "Enable automatic replacements": "",
-            "OpeningDoubleQuotes": "",
-            "OpeningSingleQuote": "",
-            "SmartReplace": "",
-            "SmartReplace Settings": "",
-            "OK": "<<Abbreviation>>"
-        },
-        "Stylist": {
-            "Styles": ""
-        },
-        "SuperClean": {
-            "Clean bad HTML from Microsoft Word.": "",
-            "Clean Selection Only": "",
-            "Clean up HTML": "",
-            "Cleaning Scope": "",
-            "General tidy up and correction of some problems.": "",
-            "Please select from the following cleaning options...": "",
-            "Please stand by while cleaning in process...": "",
-            "Remove alignment (left/right/justify).": "",
-            "Remove all classes (CSS).": "",
-            "Remove All HTML Tags": "",
-            "Remove all styles (CSS).": "",
-            "Remove custom font sizes.": "",
-            "Remove custom text colors.": "",
-            "Remove custom typefaces (font \"styles\").": "",
-            "Remove emphasis and annotations.": "",
-            "Remove lang attributes.": "",
-            "Remove Paragraphs": "",
-            "Remove superscripts and subscripts.": "",
-            "Replace directional quote marks with non-directional quote marks.": "",
-            "Vigorously purge HTML from Microsoft Word.": "",
-            "Cancel": "<<Abbreviation>>",
-            "OK": "<<Abbreviation>>"
-        },
-        "TableOperations": {
-            "All four sides": "",
-            "Borders": "",
-            "Cell Properties": "",
-            "Cell properties": "",
-            "Cell Type:": "",
-            "Cells down": "",
-            "Cells to the right, and": "",
-            "Delete cell": "",
-            "Delete column": "",
-            "Delete row": "",
-            "Do Not Change": "",
-            "Frame and borders": "",
-            "Frames": "",
-            "Header (th)": "",
-            "Insert cell after": "",
-            "Insert cell before": "",
-            "Insert column after": "",
-            "Insert column before": "",
-            "Insert row after": "",
-            "Insert row before": "",
-            "Merge cells": "",
-            "Merge current cell with:": "",
-            "No rules": "",
-            "No sides": "",
-            "Normal (td)": "",
-            "Please click into some cell": "",
-            "Row Properties": "",
-            "Row properties": "",
-            "Rules will appear between all rows and columns": "",
-            "Rules will appear between columns only": "",
-            "Rules will appear between rows only": "",
-            "Spacing and padding": "",
-            "Split column": "",
-            "Split row": "",
-            "Summary": "",
-            "Table properties": "",
-            "Table Properties": "",
-            "The bottom side only": "",
-            "The left-hand side only": "",
-            "The right and left sides only": "",
-            "The right-hand side only": "",
-            "The top and bottom sides only": "",
-            "The top side only": "",
-            "Xinha cowardly refuses to delete the last cell in row.": "",
-            "Xinha cowardly refuses to delete the last column in table.": "",
-            "Xinha cowardly refuses to delete the last row in table.": "",
-            "Cancel": "<<Abbreviation>>",
-            "Caption": "<<InsertTable>>",
-            "Columns": "<<Forms>>",
-            "Description": "<<FullPage>>",
-            "Merge Cells": "<<ContextMenu>>",
-            "OK": "<<Abbreviation>>",
-            "Padding": "<<InlineStyler>>",
-            "pixels": "<<HorizontalRule>>",
-            "Rows": "<<Forms>>",
-            "Spacing": "<<InsertImage>>"
-        },
-        "UnsavedChanges": {
-            "You have unsaved changes in the editor": ""
-        },
-        "WebKit": {
-            "The Paste button does not work in this browser for security reasons. Press CTRL-V on your keyboard to paste directly.": "<<Gecko>>"
-        },
-        "Xinha": {
-            "&#8212; font &#8212;": "",
-            "&#8212; format &#8212;": "",
-            "&#8212; size &#8212;": "",
-            "1 (8 pt)": "",
-            "2 (10 pt)": "",
-            "3 (12 pt)": "",
-            "4 (14 pt)": "",
-            "5 (18 pt)": "",
-            "6 (24 pt)": "",
-            "7 (36 pt)": "",
-            "Address": "",
-            "Arial": "",
-            "Clean content pasted from Word": "",
-            "Clear Inline Font Specifications": "",
-            "Clear MSOffice tags": "",
-            "Close": "",
-            "Constructing object": "",
-            "Copy selection": "",
-            "Courier New": "",
-            "Create Statusbar": "",
-            "Create Toolbar": "",
-            "CTRL-0 (zero)": "",
-            "CTRL-1 .. CTRL-6": "",
-            "CTRL-A": "",
-            "CTRL-B": "",
-            "CTRL-C": "",
-            "CTRL-E": "",
-            "CTRL-I": "",
-            "CTRL-J": "",
-            "CTRL-L": "",
-            "CTRL-N": "",
-            "CTRL-R": "",
-            "CTRL-S": "",
-            "CTRL-U": "",
-            "CTRL-V": "",
-            "CTRL-X": "",
-            "CTRL-Y": "",
-            "CTRL-Z": "",
-            "Cut selection": "",
-            "Direction left to right": "",
-            "Direction right to left": "",
-            "Editor Help": "",
-            "ENTER": "",
-            "Error Loading Xinha.  Developers, check the Error Console for information.": "",
-            "Finishing": "",
-            "Formatted": "",
-            "Generate Xinha framework": "",
-            "Georgia": "",
-            "Heading 1": "",
-            "Heading 2": "",
-            "Heading 3": "",
-            "Heading 4": "",
-            "Heading 5": "",
-            "Heading 6": "",
-            "Headings": "",
-            "Impact": "",
-            "Init editor size": "",
-            "insert linebreak": "",
-            "Insert/Overwrite": "",
-            "Keyboard shortcuts": "",
-            "Loading Core": "",
-            "Loading in progress. Please wait!": "",
-            "Loading plugin $plugin": "",
-            "Loading plugins": "",
-            "MS Word Cleaner": "",
-            "new paragraph": "",
-            "Normal": "",
-            "Paste from clipboard": "",
-            "Path": "",
-            "Print document": "",
-            "Redoes your last action": "",
-            "Register plugin $plugin": "",
-            "Remove formatting": "",
-            "Save as": "",
-            "Select all": "",
-            "Select Color": "",
-            "Set format to paragraph": "",
-            "SHIFT-ENTER": "",
-            "Split Block": "",
-            "Tahoma": "",
-            "The editor provides the following key combinations:": "",
-            "Times New Roman": "",
-            "Toggle Borders": "",
-            "Touch here first to activate editor.": "",
-            "Undoes your last action": "",
-            "Verdana": "",
-            "Waiting for Iframe to load...": "",
-            "WingDings": "",
-            "Would you like to clear font colours?": "",
-            "Would you like to clear font sizes?": "",
-            "Would you like to clear font typefaces?": "",
-            "Xinha": "",
-            "You are in TEXT MODE.  Use the [<>] button to switch back to WYSIWYG.": ""
-        },
-        "BackgroundImage": {
-            "__ TRANSLATOR NOTE __": "*** BACKGROUNDIMAGE IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***",
-            "Remove Current Background": "",
-            "Set Background": "",
-            "Set page background image": "",
-            "Set Page Background Image": "",
-            "Cancel": "<<Abbreviation>>"
-        },
-        "ClientsideSpellcheck": {
-            "__ TRANSLATOR NOTE __": "*** CLIENTSIDESPELLCHECK IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***",
-            "Spell Check using ieSpell": ""
-        },
-        "ExtendedFileManager": {
-            "__ TRANSLATOR NOTE __": "*** EXTENDEDFILEMANAGER IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***",
-            "10%": "",
-            "100%": "",
-            "200%": "",
-            "25%": "",
-            "50%": "",
-            "75%": "",
-            ">List View": "",
-            ">Thumbnail View": "",
-            "A:": "",
-            "Align": "",
-            "Alt": "",
-            "Border Color": "",
-            "Constrain Proportions": "",
-            "Crop": "",
-            "D:": "",
-            "Directory": "",
-            "Directory Up": "",
-            "Edit": "",
-            "File List": "",
-            "File Manager": "",
-            "Filename:": "",
-            "Filesize:": "",
-            "Flip Horizontal": "",
-            "Flip Image": "",
-            "Flip Vertical": "",
-            "Folder": "",
-            "GIF": "",
-            "GIF format is not supported, image editing not supported.": "",
-            "H:": "",
-            "Image Editor": "",
-            "Image Selection": "",
-            "Invalid base directory:": "",
-            "JPEG High": "",
-            "JPEG Low": "",
-            "JPEG Medium": "",
-            "Loading": "",
-            "Lock": "",
-            "Marker": "",
-            "Maximum folder size limit reached. Upload disabled.": "",
-            "Measure": "",
-            "New Folder": "",
-            "No Files Found": "",
-            "No Image Available": "",
-            "Please enter value": "",
-            "PNG": "",
-            "Preset": "",
-            "Quality:": "",
-            "Refresh": "",
-            "Rename": "",
-            "Resize": "",
-            "Rotate": "",
-            "Rotate 180 &deg;": "",
-            "Rotate 90 &deg; CCW": "",
-            "Rotate 90 &deg; CW": "",
-            "Rotate Image": "",
-            "Start X:": "",
-            "Start Y:": "",
-            "Target Window": "",
-            "Toggle marker color": "",
-            "Trash": "",
-            "Upload": "",
-            "W:": "",
-            "X:": "",
-            "Xinha Image Editor": "",
-            "Y:": "",
-            "Zoom": "",
-            "Absbottom": "<<InsertImage>>",
-            "Absmiddle": "<<InsertImage>>",
-            "Baseline": "<<InlineStyler>>",
-            "Border": "<<InlineStyler>>",
-            "Bottom": "<<InlineStyler>>",
-            "Cancel": "<<Abbreviation>>",
-            "Clear": "<<FindReplace>>",
-            "Color": "<<HorizontalRule>>",
-            "Copy": "<<ContextMenu>>",
-            "Cut": "<<ContextMenu>>",
-            "Height": "<<HorizontalRule>>",
-            "Height:": "<<HorizontalRule>>",
-            "Insert File Link": "<<MootoolsFileManager>>",
-            "Left": "<<HorizontalRule>>",
-            "Margin": "<<InlineStyler>>",
-            "Middle": "<<InlineStyler>>",
-            "New window (_blank)": "<<CreateLink>>",
-            "None (use implicit)": "<<CreateLink>>",
-            "Not set": "<<InsertImage>>",
-            "OK": "<<Abbreviation>>",
-            "Padding": "<<InlineStyler>>",
-            "Positioning of this image": "<<InsertImage>>",
-            "Preview": "<<Equation>>",
-            "Right": "<<HorizontalRule>>",
-            "Same frame (_self)": "<<CreateLink>>",
-            "Save": "<<SaveSubmit>>",
-            "Texttop": "<<InsertImage>>",
-            "Title (tooltip)": "<<CreateLink>>",
-            "Top": "<<InlineStyler>>",
-            "Top frame (_top)": "<<CreateLink>>",
-            "Width": "<<HorizontalRule>>",
-            "Width:": "<<HorizontalRule>>",
-            "You must select some text before making a new link.": "<<Linker>>"
-        },
-        "Filter": {
-            "__ TRANSLATOR NOTE __": "*** FILTER IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***",
-            "Filter": "<<InsertSnippet2>>"
-        },
-        "HtmlTidy": {
-            "__ TRANSLATOR NOTE __": "*** HTMLTIDY IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***",
-            "Auto-Tidy": "",
-            "Don't Tidy": "",
-            "HTML Tidy": "",
-            "Tidy failed.  Check your HTML for syntax errors.": ""
-        },
-        "ImageManager": {
-            "__ TRANSLATOR NOTE __": "*** IMAGEMANAGER IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***",
-            "Angle:": "",
-            "Flickr Picture List": "",
-            "Flickr Pictures": "",
-            "Flickr Selection": "",
-            "Flickr Username/Email": "",
-            "Folder Name:": "",
-            "Image Format": "",
-            "Image List": "",
-            "Keyword": "",
-            "No Images Found": "",
-            "No Photos Found": "",
-            "No Videos Found": "",
-            "This Server": "",
-            "YouTube Selection": "",
-            "YouTube Username": "",
-            "YouTube Video List": "",
-            "YouTube Videos": "",
-            "A:": "<<ExtendedFileManager>>",
-            "Absbottom": "<<InsertImage>>",
-            "Absmiddle": "<<InsertImage>>",
-            "Baseline": "<<InlineStyler>>",
-            "Bottom": "<<InlineStyler>>",
-            "Cancel": "<<Abbreviation>>",
-            "Clear": "<<FindReplace>>",
-            "Constrain Proportions": "<<ExtendedFileManager>>",
-            "Crop": "<<ExtendedFileManager>>",
-            "D:": "<<ExtendedFileManager>>",
-            "Directory": "<<ExtendedFileManager>>",
-            "Directory Up": "<<ExtendedFileManager>>",
-            "Edit": "<<ExtendedFileManager>>",
-            "Filename:": "<<ExtendedFileManager>>",
-            "Flip Horizontal": "<<ExtendedFileManager>>",
-            "Flip Image": "<<ExtendedFileManager>>",
-            "Flip Vertical": "<<ExtendedFileManager>>",
-            "GIF": "<<ExtendedFileManager>>",
-            "GIF format is not supported, image editing not supported.": "<<ExtendedFileManager>>",
-            "H:": "<<ExtendedFileManager>>",
-            "Height:": "<<HorizontalRule>>",
-            "Image Editor": "<<ExtendedFileManager>>",
-            "Image Selection": "<<ExtendedFileManager>>",
-            "Insert Image": "<<InsertImage>>",
-            "Invalid base directory:": "<<ExtendedFileManager>>",
-            "JPEG High": "<<ExtendedFileManager>>",
-            "JPEG Low": "<<ExtendedFileManager>>",
-            "JPEG Medium": "<<ExtendedFileManager>>",
-            "Left": "<<HorizontalRule>>",
-            "Lock": "<<ExtendedFileManager>>",
-            "Marker": "<<ExtendedFileManager>>",
-            "Measure": "<<ExtendedFileManager>>",
-            "Middle": "<<InlineStyler>>",
-            "New Folder": "<<ExtendedFileManager>>",
-            "No Image Available": "<<ExtendedFileManager>>",
-            "Not set": "<<InsertImage>>",
-            "OK": "<<Abbreviation>>",
-            "PNG": "<<ExtendedFileManager>>",
-            "Positioning of this image": "<<InsertImage>>",
-            "Quality:": "<<ExtendedFileManager>>",
-            "Refresh": "<<ExtendedFileManager>>",
-            "Resize": "<<ExtendedFileManager>>",
-            "Right": "<<HorizontalRule>>",
-            "Rotate": "<<ExtendedFileManager>>",
-            "Rotate 180 &deg;": "<<ExtendedFileManager>>",
-            "Rotate 90 &deg; CCW": "<<ExtendedFileManager>>",
-            "Rotate 90 &deg; CW": "<<ExtendedFileManager>>",
-            "Rotate Image": "<<ExtendedFileManager>>",
-            "Save": "<<SaveSubmit>>",
-            "Start X:": "<<ExtendedFileManager>>",
-            "Start Y:": "<<ExtendedFileManager>>",
-            "Texttop": "<<InsertImage>>",
-            "Top": "<<InlineStyler>>",
-            "Trash": "<<ExtendedFileManager>>",
-            "W:": "<<ExtendedFileManager>>",
-            "Width:": "<<HorizontalRule>>",
-            "X:": "<<ExtendedFileManager>>",
-            "Y:": "<<ExtendedFileManager>>"
-        },
-        "InsertMarquee": {
-            "__ TRANSLATOR NOTE __": "*** INSERTMARQUEE IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***",
-            "Alternate": "",
-            "Background-Color:": "",
-            "Behavior:": "",
-            "Continuous": "",
-            "Direction:": "",
-            "Insert scrolling marquee": "",
-            "Marquee Editor": "",
-            "Scroll Amount:": "",
-            "Scroll Delay:": "",
-            "Slide": "",
-            "Speed Control": "",
-            "Cancel": "<<Abbreviation>>",
-            "Height:": "<<HorizontalRule>>",
-            "Left": "<<HorizontalRule>>",
-            "Name": "<<Forms>>",
-            "Name/ID:": "<<Forms>>",
-            "OK": "<<Abbreviation>>",
-            "Right": "<<HorizontalRule>>",
-            "Text:": "<<Forms>>",
-            "Width:": "<<HorizontalRule>>"
-        },
-        "InsertPicture": {
-            "__ TRANSLATOR NOTE __": "*** INSERTPICTURE IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***",
-            "Leave empty for not defined": "",
-            " Open file in new window": "",
-            "Open file in new window": "",
-            "Upload file": "",
-            "Absbottom": "<<InsertImage>>",
-            "Absmiddle": "<<InsertImage>>",
-            "Alignment:": "<<HorizontalRule>>",
-            "Alternate text:": "<<InsertImage>>",
-            "Baseline": "<<InlineStyler>>",
-            "Border thickness:": "<<InsertImage>>",
-            "Bottom": "<<InlineStyler>>",
-            "Cancel": "<<Abbreviation>>",
-            "Enter the image URL here": "<<InsertImage>>",
-            "For browsers that don't support images": "<<InsertImage>>",
-            "Height:": "<<HorizontalRule>>",
-            "Horizontal padding": "<<InsertImage>>",
-            "Horizontal:": "<<InsertImage>>",
-            "Image Preview:": "<<InsertImage>>",
-            "Image URL:": "<<Forms>>",
-            "Insert Image": "<<InsertImage>>",
-            "Layout": "<<HorizontalRule>>",
-            "Leave empty for no border": "<<InsertImage>>",
-            "Left": "<<HorizontalRule>>",
-            "Middle": "<<InlineStyler>>",
-            "Not set": "<<InsertImage>>",
-            "OK": "<<Abbreviation>>",
-            "Positioning of this image": "<<InsertImage>>",
-            "Preview": "<<Equation>>",
-            "Preview the image in a new window": "<<InsertImage>>",
-            "Right": "<<HorizontalRule>>",
-            "Size": "<<Forms>>",
-            "Spacing": "<<InsertImage>>",
-            "Texttop": "<<InsertImage>>",
-            "Top": "<<InlineStyler>>",
-            "Vertical padding": "<<InsertImage>>",
-            "Vertical:": "<<InsertImage>>",
-            "Width:": "<<HorizontalRule>>"
-        },
-        "NoteServer": {
-            "__ TRANSLATOR NOTE __": "*** NOTESERVER IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***",
-            "120%": "",
-            "150%": "",
-            "80%": "",
-            "Add GUIDO Code in a textbox on the page": "",
-            "Add MIDI link to allow students to hear the music": "",
-            "Format": "",
-            "GUIDO Code": "",
-            "Guido code": "",
-            "Image in applet": "",
-            "Insert GUIDO Music Notation": "",
-            "MIDI File": "",
-            "Source Code": "",
-            "With Mozilla, the applet will not be visible in editor, but only in Web page after submitting.": "",
-            "Zoom :": "",
-            "100%": "<<ExtendedFileManager>>",
-            "Cancel": "<<Abbreviation>>",
-            "Image Preview": "<<InsertImage>>",
-            "OK": "<<Abbreviation>>",
-            "Options": "<<FindReplace>>",
-            "Preview": "<<Equation>>",
-            "Preview the image in a new window": "<<InsertImage>>",
-            "Zoom": "<<ExtendedFileManager>>"
-        },
-        "PSLocal": {
-            "__ TRANSLATOR NOTE __": "*** PSLOCAL IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***",
-            "Confirm": "",
-            "Enable": "",
-            "Enable Gears in order to use local document storage and configuration.": "",
-            "Enabling Local Storage": "",
-            "Install": "",
-            "Learn About Local Storage": "",
-            "This will reload the page, causing you to lose any unsaved work.  Press \"OK\" to reload.": "",
-            "Xinha uses Google Gears to enable local document storage.  With Gears installed, you can save drafts of your documents on your hard drive, configure Xinha to look the way you want, and carry this information wherever you use Xinha on the web.": "",
-            "Cancel": "<<Abbreviation>>"
-        },
-        "PSServer": {
-            "__ TRANSLATOR NOTE __": "*** PSSERVER IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***",
-            "File: ": "",
-            "Import": ""
-        },
-        "PersistentStorage": {
-            "__ TRANSLATOR NOTE __": "*** PERSISTENTSTORAGE IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***",
-            "Details": "",
-            "File Browser": "",
-            "Hello    There C ": "",
-            "Hello  There A ": "",
-            "Hello \" There B \"": "",
-            "Hello ' There D '": "",
-            "List of Places": "",
-            "New Document": "",
-            "Open": "",
-            "Open Document": "",
-            "Places": "",
-            "Please enter the name of the directory you'd like to create.": "",
-            "Save Document": "",
-            "This will erase any unsaved content.  If you're certain, please click OK to continue.": "",
-            "Web URL": "",
-            "Cancel": "<<Abbreviation>>",
-            "Confirm": "<<PSLocal>>",
-            "Copy": "<<ContextMenu>>",
-            "Delete": "<<Abbreviation>>",
-            "Directory Up": "<<ExtendedFileManager>>",
-            "File List": "<<ExtendedFileManager>>",
-            "File Manager": "<<ExtendedFileManager>>",
-            "Filename": "<<ExtendedFileManager>>",
-            "Insert": "<<InsertNote>>",
-            "Insert Image": "<<InsertImage>>",
-            "New Folder": "<<ExtendedFileManager>>",
-            "Save": "<<SaveSubmit>>",
-            "You must select some text before making a new link.": "<<Linker>>"
-        },
-        "SpellChecker": {
-            "__ TRANSLATOR NOTE __": "*** SPELLCHECKER IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***",
-            "Dictionary": "",
-            "Finished list of mispelled words": "",
-            "HTMLArea Spell Checker": "",
-            "I will open it in a new page.": "",
-            "Ignore": "",
-            "Ignore all": "",
-            "Info": "",
-            "Learn": "",
-            "No mispelled words found with the selected dictionary.": "",
-            "Original word": "",
-            "Please confirm that you want to open this link": "",
-            "Please wait.  Calling spell checker.": "",
-            "Please wait: changing dictionary to": "",
-            "pliz weit ;-)": "",
-            "Re-check": "",
-            "Replace": "",
-            "Replace all": "",
-            "Revert": "",
-            "Spell Checker": "",
-            "Spell-check": "",
-            "Suggestions": "",
-            "This will drop changes and quit spell checker.  Please confirm.": "",
-            "Cancel": "<<Abbreviation>>",
-            "OK": "<<Abbreviation>>",
-            "Replace with": "<<FindReplace>>"
-        },
-        "Template": {
-            "__ TRANSLATOR NOTE __": "*** TEMPLATE IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***",
-            "Insert template": "",
-            "Cancel": "<<Abbreviation>>"
-        },
-        "UnFormat": {
-            "__ TRANSLATOR NOTE __": "*** UNFORMAT IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***",
-            "All": "",
-            "All HTML:": "",
-            "Cleaning Area": "",
-            "Cleaning options": "",
-            "Formatting:": "",
-            "Page Cleaner": "",
-            "Select which types of formatting you would like to remove.": "",
-            "Selection": "",
-            "Cancel": "<<Abbreviation>>",
-            "OK": "<<Abbreviation>>"
-        }
-    }
-}
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/lang/nb.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/lang/nb.js
deleted file mode 100644
index ccd9bd0..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/lang/nb.js
+++ /dev/null
@@ -1,79 +0,0 @@
-// I18N constants
-// LANG: "nb", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "About this editor": "Om denne editor",
-    "Background Color": "Bakgrundsfarge",
-    "Bold": "Fet",
-    "Bulleted List": "Punktliste",
-    "Clear Inline Font Specifications": "Fjerne inline font spesifikasjoner",
-    "Copy selection": "Kopier område",
-    "Create Toolbar": "Lag verktøylinje",
-    "Current style": "Nåværende stil",
-    "Cut selection": "Klipp ut område",
-    "Decrease Indent": "Reduser innrykk",
-    "Direction left to right": "Fra venstre mot høyre",
-    "Direction right to left": "Fra høyre mot venstre",
-    "Font Color": "Tekstfarge",
-    "Help using editor": "Hjelp",
-    "Horizontal Rule": "Vannrett linje",
-    "Increase Indent": "Øke innrykk",
-    "Insert Table": "Sett inn tabell",
-    "Insert Web Link": "Lag lenke",
-    "Insert/Modify Image": "Sett inn bilde",
-    "Insert/Overwrite": "Sett inn/Overskriv",
-    "Italic": "Kursiv",
-    "Justify Center": "Midtjuster",
-    "Justify Full": "Blokkjuster",
-    "Justify Left": "Venstrejuster",
-    "Justify Right": "Høyrejuster",
-    "Ordered List": "Nummerert liste",
-    "Paste from clipboard": "Lim inn",
-    "Path": "Tekstvelger",
-    "Print document": "Skriv ut dokumentet",
-    "Redoes your last action": "Gjør om siste angring",
-    "Remove formatting": "Fjern formattering",
-    "Save as": "Lagre som",
-    "Select all": "Merk alt",
-    "Split Block": "Seperasjonsblokk",
-    "Strikethrough": "Gjennomstreket",
-    "Subscript": "Nedsenket",
-    "Superscript": "Opphøyet",
-    "Toggle Borders": "Skru av/på hjelpelinjer på tabeller",
-    "Toggle HTML Source": "Vis kildekode",
-    "Underline": "Understreket",
-    "Undoes your last action": "Angrer siste redigering",
-    "Would you like to clear font colours?": "Ønsker du å fjerne farger på skriften",
-    "Would you like to clear font sizes?": "Ønsker du å fjerne skrift størrelser",
-    "Would you like to clear font typefaces?": "Ønsker du å fjerne skrifttyper",
-    "You are in TEXT MODE.  Use the [<>] button to switch back to WYSIWYG.": "Du er i tekstmodus  Klikk på [<>] for å gå tilbake til WYSIWIG.",
-    "__OBSOLETE__": {
-        "Cancel": "Avbryt",
-        "Constructing main object": "Vennligst vent",
-        "Enlarge Editor": "Vis i eget vindu",
-        "Insert/Modify Link": "Rediger lenke",
-        "Loading in progress. Please wait !": "WYSIWYG laster, vennligst vent!",
-        "New window (_blank)": "Eget vindu (_blank)",
-        "None (use implicit)": "Ingen (bruk standardinnstilling)",
-        "OK": "OK",
-        "Other": "Annen",
-        "Register panel bottom": "Registrer bunnpanel",
-        "Register panel left": "Registrer venstrepanel",
-        "Register panel right": "Registrer høyrepanel",
-        "Register panel top": "Registrer toppanel",
-        "Same frame (_self)": "Samme ramme (_self)",
-        "Target:": "Mål:",
-        "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 ",
-        "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"
-    }
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/lang/nl.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/lang/nl.js
deleted file mode 100644
index 6075968..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/lang/nl.js
+++ /dev/null
@@ -1,62 +0,0 @@
-// I18N constants
-// LANG: "nl", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "About this editor": "Over deze editor",
-    "Background Color": "Achtergrondkleur",
-    "Bold": "Vet",
-    "Bulleted List": "Opsommingstekens",
-    "Copy selection": "Kopi?ren",
-    "Current style": "Huidige stijl",
-    "Cut selection": "Knippen",
-    "Decrease Indent": "Inspringing verkleinen",
-    "Direction left to right": "Tekstrichting links naar rechts",
-    "Direction right to left": "Tekstrichting rechts naar links",
-    "Font Color": "Tekstkleur",
-    "Help using editor": "Xinha help",
-    "Horizontal Rule": "Horizontale lijn",
-    "Increase Indent": "Inspringing vergroten",
-    "Insert Table": "Tabel invoegen",
-    "Insert Web Link": "Hyperlink invoegen/aanpassen",
-    "Insert/Modify Image": "Afbeelding invoegen/aanpassen",
-    "Italic": "Cursief",
-    "Justify Center": "Centreren",
-    "Justify Full": "Uitvullen",
-    "Justify Left": "Links uitlijnen",
-    "Justify Right": "Rechts uitlijnen",
-    "Normal": "normaal",
-    "Ordered List": "Nummering",
-    "Paste from clipboard": "Plakken",
-    "Path": "Pad",
-    "Redoes your last action": "Herhalen",
-    "Strikethrough": "Doorhalen",
-    "Subscript": "Subscript",
-    "Superscript": "Superscript",
-    "Toggle HTML Source": "HTML broncode",
-    "Underline": "Onderstrepen",
-    "Undoes your last action": "Ongedaan maken",
-    "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.",
-    "__OBSOLETE__": {
-        "Cancel": "Annuleren",
-        "Enlarge Editor": "Vergroot Editor",
-        "Insert/Modify Link": "Hyperlink invoegen/aanpassen",
-        "New window (_blank)": "Nieuw venster (_blank)",
-        "None (use implicit)": "Geen",
-        "OK": "OK",
-        "Other": "Ander",
-        "Same frame (_self)": "Zelfde frame (_self)",
-        "Target:": "Doel:",
-        "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 (",
-        "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"
-    }
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/lang/pl.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/lang/pl.js
deleted file mode 100644
index 899c93b..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/lang/pl.js
+++ /dev/null
@@ -1,122 +0,0 @@
-// I18N constants
-// LANG: "pl", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "&#8212; format &#8212;": "&#8212; Format &#8212;",
-    "About this editor": "Informacje o tym edytorze",
-    "Address": "Adres",
-    "Background Color": "Kolor tła",
-    "Bold": "Pogrubienie",
-    "Bulleted List": "Wypunktowanie",
-    "Clear Inline Font Specifications": "Wycisz bezpośrednie przypisania czcionek",
-    "Clear MSOffice tags": "Wyczyść tagi MSOffice",
-    "Copy selection": "Kopiuje zaznaczenie do schowka",
-    "Current style": "Obecny styl",
-    "Cut selection": "Wycina zaznaczenie do schowka",
-    "Decrease Indent": "Zmniejsz wcięcie",
-    "Direction left to right": "Kierunek tekstu lewo-prawo",
-    "Direction right to left": "Kierunek tekstu prawo-lewo",
-    "Font Color": "Kolor czcionki",
-    "Formatted": "Preformatowany",
-    "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",
-    "Help using editor": "Pomoc",
-    "Horizontal Rule": "Linia pozioma",
-    "Increase Indent": "Zwiększ wcięcie",
-    "Insert Table": "Wstaw tabelę",
-    "Insert Web Link": "Wstaw adres sieci Web",
-    "Insert/Modify Image": "Wstaw obraz",
-    "Italic": "Pochylenie",
-    "Justify Center": "Wyśrodkuj",
-    "Justify Full": "Wyjustuj",
-    "Justify Left": "Wyrównaj do lewej",
-    "Justify Right": "Wyrównaj do prawej",
-    "Normal": "Normalny",
-    "Ordered List": "Numerowanie",
-    "Paste from clipboard": "Wkleja zawartość schowka",
-    "Path": "Ścieżka",
-    "Print document": "Drukuj dokument",
-    "Redoes your last action": "Ponawia ostatnio wykonane polecenie",
-    "Remove formatting": "Usuń formatowanie",
-    "Select all": "Zaznacz wszystko",
-    "Split Block": "Podziel blok",
-    "Strikethrough": "Przekreślenie",
-    "Subscript": "Indeks dolny",
-    "Superscript": "Indeks górny",
-    "Toggle Borders": "Włącz / wyłącz ramki",
-    "Toggle HTML Source": "Edycja WYSIWYG/w źródle strony",
-    "Underline": "Podkreślenie",
-    "Undoes your last action": "Cofa ostatnio wykonane polecenie",
-    "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.",
-    "__OBSOLETE__": {
-        "Absbottom": "Abs. dół",
-        "Absmiddle": "Abs. środek",
-        "Alignment:": "Wyrównanie:",
-        "Alternate text:": "Tekst alternatywny:",
-        "Baseline": "Linia bazowa",
-        "Border thickness:": "Grubość obramowania:",
-        "Bottom": "Dół",
-        "Cancel": "Anuluj",
-        "Cell padding:": "Wcięcie komórek:",
-        "Cell spacing:": "Odstęp komórek:",
-        "Cols:": "Kolumn:",
-        "Em": "Em",
-        "Enlarge Editor": "Pełny ekran",
-        "Enter the image URL here": "Podaj URL obrazka",
-        "Fixed width columns": "Kolumny o stałej szerokości",
-        "For browsers that don't support images": "Dla przeglądarek, które nie obsługują obrazków",
-        "Horizontal padding": "Wcięcie poziome",
-        "Horizontal:": "Poziome:",
-        "Image Preview:": "Podgląd obrazka:",
-        "Image URL:": "URL obrazka:",
-        "Insert Image": "Wstaw obrazek",
-        "Insert/Modify Link": "Wstaw/edytuj odnośnik",
-        "Layout": "Layout",
-        "Leave empty for no border": "Bez ramek - zostaw puste",
-        "Left": "Do lewej",
-        "Middle": "Środek",
-        "New window (_blank)": "Nowe okno (_blank)",
-        "None (use implicit)": "Brak",
-        "Not set": "Nie ustawione",
-        "Number of columns": "Liczba kolumn",
-        "Number of rows": "Liczba wierszy",
-        "OK": "OK",
-        "Other": "Inne",
-        "Percent": "Procent",
-        "Pixels": "Pikseli",
-        "Positioning of this image": "Pozycjonowanie obrazka",
-        "Positioning of this table": "Pozycjonowanie tabeli",
-        "Preview": "Podgląd",
-        "Preview the image in a new window": "Podgląd obrazka w nowym oknie",
-        "Right": "Do prawej",
-        "Rows:": "Wierszy:",
-        "Same frame (_self)": "Ta sama ramka (_self)",
-        "Space between adjacent cells": "Przestrzeń pomiędzy komórkami",
-        "Space between content and border in cell": "Przestrzeń między krawędzią a zawartością komórki",
-        "Spacing": "Spacjowanie",
-        "Target:": "Okno docelowe:",
-        "Texttop": "Góra tekstu",
-        "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.",
-        "Title (tooltip):": "Tytuł (tooltip):",
-        "Top": "Góra",
-        "Top frame (_top)": "Główna ramka (_top)",
-        "URL:": "URL:",
-        "Vertical padding": "Wcięcie pionowe",
-        "Vertical:": "Pionowe:",
-        "Width of the table": "Szerokość tabeli",
-        "Width unit": "Jednostka",
-        "Width:": "Szerokość:",
-        "You must enter the URL where this link points to": "Musisz podać URL, na jaki będzie wskazywał odnośnik"
-    }
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/lang/pt_br.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/lang/pt_br.js
deleted file mode 100644
index 7b6c740..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/lang/pt_br.js
+++ /dev/null
@@ -1,175 +0,0 @@
-// I18N constants
-// LANG: "pt_br", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "&#8212; font &#8212;": "&#8212; fonte &#8212;",
-    "&#8212; format &#8212;": "&#8212; formato &#8212;",
-    "&#8212; size &#8212;": "&#8212; tamanho &#8212;",
-    "About this editor": "Sobre este editor",
-    "Address": "Endereço",
-    "Background Color": "Cor do Fundo",
-    "Bold": "Negrito",
-    "Bulleted List": "Lista Marcadores",
-    "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",
-    "Clean content pasted from Word": "Limpar conteúdo copiado do Word",
-    "Clear Inline Font Specifications": "Limpar especificações de fontes inline",
-    "Clear MSOffice tags": "Limpar tags do MS Office",
-    "Close": "Fechar",
-    "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",
-    "Decrease Indent": "Diminuir Indentação",
-    "Direction left to right": "Da esquerda para direita",
-    "Direction right to left": "Da direita para esquerda",
-    "ENTER": "ENTER",
-    "Editor Help": "Ajuda do Editor",
-    "Finishing": "Terminando",
-    "Font Color": "Cor da Fonte",
-    "Formatted": "Formatado",
-    "Generate Xinha framework": "Gerar Área de Trabalho do Xinha",
-    "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",
-    "Headings": "Títulos",
-    "Help using editor": "Ajuda - Usando o editor",
-    "Horizontal Rule": "Linha Horizontal",
-    "Increase Indent": "Aumentar Indentação",
-    "Init editor size": "Iniciar tamanho do editor",
-    "Insert Table": "Inserir Tabela",
-    "Insert Web Link": "Inserir Link",
-    "Insert/Modify Image": "Inserir/Modificar Imagem",
-    "Insert/Overwrite": "Inserir/Sobrescrever",
-    "Italic": "Itálico",
-    "Justify Center": "Justificar Centralizado",
-    "Justify Full": "Justificar Completamente",
-    "Justify Left": "Justificar à Esquerda",
-    "Justify Right": "Justificar à Direita",
-    "Keyboard shortcuts": "Atalhos de Teclado",
-    "Loading in progress. Please wait!": "Carregamento em processo. Por favor, aguarde!",
-    "Normal": "Normal",
-    "Ordered List": "Lista Numerada",
-    "Paste from clipboard": "Colar da Área de Transferência",
-    "Path": "Caminho",
-    "Print document": "Imprimir documento",
-    "Redoes your last action": "Refazer sua última ação",
-    "Remove formatting": "Remover formatação",
-    "SHIFT-ENTER": "SHIFT-ENTER",
-    "Save as": "Salvar como",
-    "Select Color": "Selecionar cor",
-    "Select all": "Selecionar tudo",
-    "Set format to paragraph": "Definir formato para o parágrafo",
-    "Split Block": "Dividir Bloco",
-    "Strikethrough": "Tachado",
-    "Subscript": "Subscrito",
-    "Superscript": "Sobrescrito",
-    "The editor provides the following key combinations:": "Este editor fornece a seguinte combinação de teclas:",
-    "Toggle Borders": "Mudar Bordas",
-    "Toggle HTML Source": "Ver Código-Fonte",
-    "Underline": "Sublinhado",
-    "Undoes your last action": "Desfazer sua última ação",
-    "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",
-    "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 VISUAL (WYSIWYG)",
-    "insert linebreak": "inserir quebra de linha",
-    "new paragraph": "novo parágrafo",
-    "__OBSOLETE__": {
-        "About": "Sobre",
-        "About Xinha": "Sobre o Xinha",
-        "Absbottom": "Inferior absoluto",
-        "Absmiddle": "Meio absoluto",
-        "Alignment:": "Alinhamento",
-        "Alternate text:": "Texto alternativo",
-        "Baseline": "Linha base",
-        "Border thickness:": "Espessura da borda",
-        "Bottom": "Botão",
-        "Cancel": "Cancelar",
-        "Cell padding:": "Espaçamento interno da célula:",
-        "Cell spacing:": "Espaçamento da célula:",
-        "Collapse borders:": "Bordas fechadas:",
-        "Cols:": "Colunas:",
-        "Developer": "Desenvolvedor",
-        "Em": "Em",
-        "Enlarge Editor": "Expandir Editor",
-        "Enter the image URL here": "Entre aqui com a URL da imagem",
-        "Fixed width columns": "Colunas com largura fixa",
-        "For browsers that don't support images": "Para navegadores que não suportam imagens",
-        "Horizontal padding": "Espaçamento interno horizontal",
-        "Horizontal:": "Horizontal:",
-        "Image Preview:": "Visualização da Imagem:",
-        "Image URL:": "URL da imagem:",
-        "Insert Image": "Inserir Imagem",
-        "Insert/Modify Link": "Inserir/Modificar Link",
-        "Layout": "Esquema",
-        "Leave empty for no border": "Deixe em branco para não ter bordas",
-        "Left": "Esquerda",
-        "License": "Licença",
-        "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",
-        "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",
-        "Right": "Direita",
-        "Rows:": "Linhas:",
-        "Same frame (_self)": "Mesmo frame (_self)",
-        "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",
-        "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.",
-        "Title (tooltip):": "Título (tooltip)",
-        "Top": "Topo",
-        "Top frame (_top)": "Frame no topo (_top)",
-        "URL:": "URL:",
-        "Version": "Versão",
-        "Vertical padding": "Espaçamento interno vertical",
-        "Vertical:": "Vertical:",
-        "Width of the table": "Largura da tabela",
-        "Width unit": "Unidade de largura",
-        "Width:": "Largura:",
-        "Xinha Help": "Ajuda do Xinha",
-        "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."
-    }
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/lang/ro.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/lang/ro.js
deleted file mode 100644
index 4977d88..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/lang/ro.js
+++ /dev/null
@@ -1,60 +0,0 @@
-// I18N constants
-// LANG: "ro", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "About this editor": "Despre editor",
-    "Background Color": "Culoare de fundal",
-    "Bold": "Îngroşat",
-    "Bulleted List": "Listă marcată",
-    "Copy selection": "Copie în clipboard",
-    "Current style": "Stilul curent",
-    "Cut selection": "Taie în clipboard",
-    "Decrease Indent": "Micşorează alineatul",
-    "Direction left to right": "Direcţia de scriere: stânga - dreapta",
-    "Direction right to left": "Direcţia de scriere: dreapta - stânga",
-    "Font Color": "Culoarea textului",
-    "Help using editor": "Documentaţie (devel)",
-    "Horizontal Rule": "Linie orizontală",
-    "Increase Indent": "Măreşte alineatul",
-    "Insert Table": "Inserează un tabel",
-    "Insert Web Link": "Inserează/modifică link",
-    "Insert/Modify Image": "Inserează/modifică imagine",
-    "Italic": "Italic",
-    "Justify Center": "Aliniere pe centru",
-    "Justify Full": "Aliniere în ambele părţi",
-    "Justify Left": "Aliniere la stânga",
-    "Justify Right": "Aliniere la dreapta",
-    "Ordered List": "Listă ordonată",
-    "Paste from clipboard": "Aduce din clipboard",
-    "Path": "Calea",
-    "Redoes your last action": "Reface ultima acţiune anulată",
-    "Strikethrough": "Tăiat",
-    "Subscript": "Indice jos",
-    "Superscript": "Indice sus",
-    "Toggle HTML Source": "Sursa HTML / WYSIWYG",
-    "Underline": "Subliniat",
-    "Undoes your last action": "Anulează ultima acţiune",
-    "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.",
-    "__OBSOLETE__": {
-        "Cancel": "Renunţă",
-        "Enlarge Editor": "Maximizează editorul",
-        "Insert/Modify Link": "Inserează/modifcă link",
-        "New window (_blank)": "Fereastră nouă (_blank)",
-        "None (use implicit)": "Nimic (foloseşte ce-i implicit)",
-        "OK": "OK",
-        "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"
-    }
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/lang/ru.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/lang/ru.js
deleted file mode 100644
index cdcbda9..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/lang/ru.js
+++ /dev/null
@@ -1,159 +0,0 @@
-// I18N constants
-// LANG: "ru", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "&#8212; font &#8212;": "&#8212; шрифт &#8212;",
-    "&#8212; format &#8212;": "&#8212; форматирование &#8212;",
-    "&#8212; size &#8212;": "&#8212; размер &#8212;",
-    "About this editor": "О редакторе",
-    "Address": "Адрес",
-    "Background Color": "Цвет фона",
-    "Bold": "Полужирный",
-    "Bulleted List": "Маркированный список",
-    "Clean content pasted from Word": "Очистить текст, вставленный из Word",
-    "Clear Inline Font Specifications": "Удалить непосредственное задание шрифтов",
-    "Clear MSOffice tags": "Удалить разметку MSOffice",
-    "Close": "Закрыть",
-    "Constructing object": "Создание объекта",
-    "Copy selection": "Копировать",
-    "Create Toolbar": "Создание панели инструментов",
-    "Current style": "Текущий стиль",
-    "Cut selection": "Вырезать",
-    "Decrease Indent": "Уменьшить отступ",
-    "Direction left to right": "Направление слева направо",
-    "Direction right to left": "Направление справа налево",
-    "ENTER": "ENTER",
-    "Editor Help": "Помощь",
-    "Font Color": "Цвет шрифта",
-    "Formatted": "Отформатированный текст",
-    "Heading 1": "Заголовок 1",
-    "Heading 2": "Заголовок 2",
-    "Heading 3": "Заголовок 3",
-    "Heading 4": "Заголовок 4",
-    "Heading 5": "Заголовок 5",
-    "Heading 6": "Заголовок 6",
-    "Headings": "Заголовки",
-    "Help using editor": "Помощь",
-    "Horizontal Rule": "Горизонтальный разделитель",
-    "Increase Indent": "Увеличить отступ",
-    "Init editor size": "Инициализация размера редактора",
-    "Insert Table": "Вставка таблицы",
-    "Insert Web Link": "Вставить гиперссылку",
-    "Insert/Modify Image": "Вставить изображение",
-    "Insert/Overwrite": "Вставка/замена",
-    "Italic": "Наклонный",
-    "Justify Center": "По центру",
-    "Justify Full": "По ширине",
-    "Justify Left": "По левому краю",
-    "Justify Right": "По правому краю",
-    "Keyboard shortcuts": "Горячие клавиши",
-    "Normal": "Обычный текст",
-    "Ordered List": "Нумерованный список",
-    "Paste from clipboard": "Вставить",
-    "Path": "Путь",
-    "Print document": "Печать",
-    "Redoes your last action": "Повторить",
-    "Register plugin $plugin": "Регистрация $plugin",
-    "Remove formatting": "Убрать форматирование",
-    "SHIFT-ENTER": "SHIFT+ENTER",
-    "Save as": "Сохранить как",
-    "Select all": "Выделить все",
-    "Set format to paragraph": "Отформатировать абзац",
-    "Split Block": "Разделить блок",
-    "Strikethrough": "Перечеркнутый",
-    "Subscript": "Нижний индекс",
-    "Superscript": "Верхний индекс",
-    "The editor provides the following key combinations:": "Редактор поддерживает следующие комбинации клавиш:",
-    "Toggle Borders": "Включить/выключить отображение границ",
-    "Toggle HTML Source": "Показать Html-код",
-    "Underline": "Подчеркнутый",
-    "Undoes your last action": "Отменить",
-    "Would you like to clear font colours?": "Удалить цвета шрифтов ?",
-    "Would you like to clear font sizes?": "Удалить размеры шрифтов ?",
-    "Would you like to clear font typefaces?": "Удалить типы шрифтов?",
-    "You are in TEXT MODE.  Use the [<>] button to switch back to WYSIWYG.": "Вы в режиме отображения Html-кода. нажмите кнопку [<>], чтобы переключиться в визуальный режим.",
-    "insert linebreak": "перенос строки",
-    "new paragraph": "новый абзац",
-    "__OBSOLETE__": {
-        "Absbottom": "По нижней границе",
-        "Absmiddle": "По середине текста",
-        "Alignment:": "Выравнивание",
-        "Alternate text:": "Альтернативный текст",
-        "Baseline": "По нижней границе текста",
-        "Border thickness:": "Толщина рамки",
-        "Bottom": "По нижнему краю",
-        "Cancel": "Отмена",
-        "Cell padding:": "Поля в ячейках",
-        "Cell spacing:": "Расстояние между ячейками",
-        "Cols:": "Столбцы",
-        "Constructing main object": "Создание главного объекта",
-        "Create StatusBar": "Создание панели состояния",
-        "Em": "em",
-        "Enlarge Editor": "Увеличить редактор",
-        "Enter the image URL here": "Вставьте адрес изображения",
-        "Fixed width columns": "Столбцы фиксированной ширины",
-        "For browsers that don't support images": "Для браузеров, которые не отображают картинки",
-        "Generate Xinha object": "Создание объекта Xinha",
-        "Horizontal padding": "Горизонтальные поля",
-        "Horizontal:": "По горизонтали",
-        "Image Preview:": "Предварительный просмотр",
-        "Image URL:": "URL изображения",
-        "Init IFrame": "инициализация iframe",
-        "Insert Image": "Вставка изображения",
-        "Insert/Modify Link": "Вставка/изменение ссылки",
-        "Layout": "Расположение",
-        "Leave empty for no border": "Оставьте пустым, чтобы убрать рамку",
-        "Left": "По левому краю",
-        "Loading in progress. Please wait !": "Загрузка... Пожалуйста, подождите.",
-        "Middle": "Посредине",
-        "New window (_blank)": "Новое окно (_blank)",
-        "None (use implicit)": "По умолчанию",
-        "Not set": "Не установлено",
-        "Number of columns": "Количество столбцов",
-        "Number of rows": "Количество строк",
-        "OK": "OK",
-        "Other": "Другое",
-        "Percent": "проценты",
-        "Pixels": "пикселы",
-        "Positioning of this image": "Расположение изображения",
-        "Positioning of this table": "Расположение таблицы",
-        "Preview": "Предварительный просмотр",
-        "Preview the image in a new window": "Предварительный просмотр в отдельном окне",
-        "Register panel bottom": "Регистрация нижней панели",
-        "Register panel left": "Регистрация левой панели",
-        "Register panel right": "Регистрация правой панели",
-        "Register panel top": "Регистрация верхней панели",
-        "Right": "По правому краю",
-        "Rows:": "Строки",
-        "Same frame (_self)": "То же окно (_self)",
-        "Space between adjacent cells": "Расстояние между соседними ячейками",
-        "Space between content and border in cell": "Расстояние между границей ячейки и текстом",
-        "Spacing": "Поля",
-        "Target:": "Открывать в окне:",
-        "Texttop": "По верхней границе текста",
-        "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 на клавиатуре, чтобы вставить.",
-        "Title (tooltip):": "Всплывающая подсказка",
-        "Top": "По верхнему краю",
-        "Top frame (_top)": "Родительское окно (_top)",
-        "URL:": "URL:",
-        "Vertical padding": "Вертикальные поля",
-        "Vertical:": "По вертикали",
-        "Width of the table": "Ширина таблицы",
-        "Width unit": "Единицы измерения",
-        "Width:": "Ширина",
-        "Xinha Help": "Помощь",
-        "You must enter a number of columns": "Вы должны ввести количество столбцов",
-        "You must enter a number of rows": "Вы должны ввести количество строк",
-        "You must enter the URL": "Вы должны ввести URL",
-        "You must enter the URL where this link points to": "Вы должны указать URL, на который будет указывать ссылка",
-        "You need to select some text before creating a link": "Вы должны выделить текст, который будет преобразован в ссылку",
-        "Your Document is not well formed. Check JavaScript console for details.": "Ваш документ неправильно сформирован. Посмотрите Консоль JavaScript, чтобы узнать подробности."
-    }
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/lang/sh.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/lang/sh.js
deleted file mode 100644
index 3fac980..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/lang/sh.js
+++ /dev/null
@@ -1,123 +0,0 @@
-// I18N constants
-// LANG: "sh", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "&#8212; format &#8212;": "&#8212; Format &#8212;",
-    "About this editor": "O ovom editoru",
-    "Address": "Adresa",
-    "Background Color": "Boja pozadine",
-    "Bold": "Masno",
-    "Bulleted List": "Lista sa simbolima",
-    "Clear Inline Font Specifications": "Obriši dodeljene osobine fonta",
-    "Clear MSOffice tags": "Obriši MSOffice tagove",
-    "Copy selection": "Kopiraj izabrano",
-    "Current style": "Važeći stil",
-    "Cut selection": "Iseci izabrano",
-    "Decrease Indent": "smanji uvlačenje",
-    "Direction left to right": "Pravac s leva na desno",
-    "Direction right to left": "Pravac s desna na levo",
-    "Font Color": "Boja slova",
-    "Formatted": "Formatiran",
-    "Heading 1": "Zaglavlje 1",
-    "Heading 2": "Zaglavlje 2",
-    "Heading 3": "Zaglavlje 3",
-    "Heading 4": "Zaglavlje 4",
-    "Heading 5": "Zaglavlje 5",
-    "Heading 6": "Zaglavlje 6",
-    "Help using editor": "Pomoć pri korišćenju editora",
-    "Horizontal Rule": "Horizontalna linija",
-    "Increase Indent": "Povećaj uvlačenje",
-    "Insert Table": "Ubaci tabelu",
-    "Insert Web Link": "Dodaj web link",
-    "Insert/Modify Image": "Dodaj/promeni sliku",
-    "Italic": "Kurziv",
-    "Justify Center": "Ravnanje po simetrali",
-    "Justify Full": "Puno ravnanje",
-    "Justify Left": "Ravnanje ulevo",
-    "Justify Right": "Ravnanje udesno",
-    "Normal": "Običan",
-    "Ordered List": "Lista sa rednim brojevima",
-    "Paste from clipboard": "Zalepi iz klipborda",
-    "Path": "Putanja",
-    "Print document": "Štampaj dokument",
-    "Redoes your last action": "Vraća poslednju radnju",
-    "Remove formatting": "Ukoni formatiranje",
-    "Select Color": "Izaberite boju",
-    "Select all": "Izaberi sve",
-    "Split Block": "Podeli blok",
-    "Strikethrough": "Precrtano",
-    "Subscript": "Indeks-tekst",
-    "Superscript": "Eksponent-tekst",
-    "Toggle Borders": "Izmeni okvire",
-    "Toggle HTML Source": "Prebaci na HTML kod",
-    "Underline": "Podvučeno",
-    "Undoes your last action": "Poništava poslednju radnju",
-    "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.",
-    "__OBSOLETE__": {
-        "Absbottom": "Apsolutno dno",
-        "Absmiddle": "Apsolutna sredina",
-        "Alignment:": "Ravnanje",
-        "Alternate text:": "Alternativni tekst",
-        "Baseline": "Donja linija",
-        "Border thickness:": "Debljina okvira",
-        "Bottom": "Dno",
-        "Cancel": "Poništi",
-        "Cell padding:": "Unutrašnja odstojanja u ćeliji",
-        "Cell spacing:": "Rastojanje ćelija",
-        "Cols:": "Kolone",
-        "Em": "Em",
-        "Enlarge Editor": "Povećaj editor",
-        "Enter the image URL here": "Unesite URL slike ovde",
-        "Fixed width columns": "Fiksirana širina kolona",
-        "For browsers that don't support images": "Za pretraživače koji ne podržavaju slike",
-        "Horizontal padding": "Horizontalno odstojanje",
-        "Horizontal:": "Po horizontali",
-        "Image Preview:": "Pregled slike",
-        "Image URL:": "URL slike",
-        "Insert Image": "Ubaci sliku",
-        "Insert/Modify Link": "Dodaj/promeni Link",
-        "Layout": "Prelom",
-        "Leave empty for no border": "Ostavi prazno kad nema okvira",
-        "Left": "Levo",
-        "Middle": "Sredina",
-        "New window (_blank)": "Novom prozoru (_blank)",
-        "None (use implicit)": "koristi podrazumevano",
-        "Not set": "Nije postavljeno",
-        "Number of columns": "Broj kolona",
-        "Number of rows": "Broj redova",
-        "OK": "OK",
-        "Other": "Drugo",
-        "Percent": "Procenat",
-        "Pixels": "Pikseli",
-        "Positioning of this image": "Postavljanje ove slike",
-        "Positioning of this table": "Postavljanje ove tabele",
-        "Preview": "Pregled",
-        "Preview the image in a new window": "Pregledaj sliku u novom prozoru",
-        "Right": "Desno",
-        "Rows:": "Redovi",
-        "Same frame (_self)": "Isti frejm (_self)",
-        "Space between adjacent cells": "Rastojanje naspramnih ćelija",
-        "Space between content and border in cell": "Rastojanje između sadržaja i okvira ćelije",
-        "Spacing": "Razmak",
-        "Target:": "Otvori u:",
-        "Texttop": "Vrh teksta",
-        "The Paste button does not work in Mozilla based web browsers (technical security reasons). Press CTRL-V on your keyboard to paste directly.": "",
-        "Title (tooltip):": "Naziv (tooltip):",
-        "Top": "Vrh",
-        "Top frame (_top)": "Glavni frejm (_top)",
-        "URL:": "URL:",
-        "Vertical padding": "Vertikalno odstojanje",
-        "Vertical:": "Po vertikali",
-        "Width of the table": "Širina tabele",
-        "Width unit": "Jedinica širine",
-        "Width:": "Širina",
-        "You must enter the URL where this link points to": "Morate uneti URL na koji vodi ovaj link"
-    }
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/lang/si.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/lang/si.js
deleted file mode 100644
index 3b60373..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/lang/si.js
+++ /dev/null
@@ -1,48 +0,0 @@
-// I18N constants
-// LANG: "si", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "About this editor": "Vizitka za urejevalnik",
-    "Background Color": "Barva ozadja",
-    "Bold": "Krepko",
-    "Bulleted List": "Označevanje",
-    "Copy selection": "Kopiraj",
-    "Current style": "Trenutni slog",
-    "Cut selection": "Izreži",
-    "Decrease Indent": "Zmanjšaj zamik",
-    "Font Color": "Barva pisave",
-    "Help using editor": "Pomoč za urejevalnik",
-    "Horizontal Rule": "Vodoravna črta",
-    "Increase Indent": "Povečaj zamik",
-    "Insert Table": "Vstavi tabelo",
-    "Insert Web Link": "Vstavi hiperpovezavo",
-    "Insert/Modify Image": "Vstavi sliko",
-    "Italic": "Ležeče",
-    "Justify Center": "Na sredino",
-    "Justify Full": "Porazdeli vsebino",
-    "Justify Left": "Poravnaj levo",
-    "Justify Right": "Poravnaj desno",
-    "Ordered List": "Oštevilčevanje",
-    "Paste from clipboard": "Prilepi",
-    "Path": "Pot",
-    "Redoes your last action": "Uveljavi zadnjo akcijo",
-    "Strikethrough": "Prečrtano",
-    "Subscript": "Podpisano",
-    "Superscript": "Nadpisano",
-    "Toggle HTML Source": "Preklopi na HTML kodo",
-    "Underline": "Podčrtano",
-    "Undoes your last action": "Razveljavi zadnjo akcijo",
-    "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.",
-    "__OBSOLETE__": {
-        "Cancel": "Prekliči",
-        "Enlarge Editor": "Povečaj urejevalnik",
-        "OK": "V redu"
-    }
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/lang/sr.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/lang/sr.js
deleted file mode 100644
index 84e0c70..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/lang/sr.js
+++ /dev/null
@@ -1,123 +0,0 @@
-// I18N constants
-// LANG: "sr", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "&#8212; format &#8212;": "&#8212; Format &#8212;",
-    "About this editor": "О овом едитору",
-    "Address": "адреса",
-    "Background Color": "Боја позадине",
-    "Bold": "Масно",
-    "Bulleted List": "Листа са симболима",
-    "Clear Inline Font Specifications": "Обриши примењене особине фонта",
-    "Clear MSOffice tags": "Обриши MSOffice тагове",
-    "Copy selection": "Копирај изабрано",
-    "Current style": "Важећи стил",
-    "Cut selection": "Исеци изабрано",
-    "Decrease Indent": "Смањи увлачење",
-    "Direction left to right": "Правац с лева на десно",
-    "Direction right to left": "Правац с десна на лево",
-    "Font Color": "Боја слова",
-    "Formatted": "форматиран",
-    "Heading 1": "Заглавље 1",
-    "Heading 2": "Заглавље 2",
-    "Heading 3": "Заглавље 3",
-    "Heading 4": "Заглавље 4",
-    "Heading 5": "Заглавље 5",
-    "Heading 6": "Заглавље 6",
-    "Help using editor": "Помоћ при коришћењу едитора",
-    "Horizontal Rule": "Хоризонтална линија",
-    "Increase Indent": "Повећај увлачење",
-    "Insert Table": "Убаци табелу",
-    "Insert Web Link": "додај веб линк",
-    "Insert/Modify Image": "додај/промени слику",
-    "Italic": "Курзив",
-    "Justify Center": "Равнање по симетрали",
-    "Justify Full": "Пуно равнање",
-    "Justify Left": "Равнање улево",
-    "Justify Right": "Равнање удесно",
-    "Normal": "обичан",
-    "Ordered List": "Листа са редним бројевима",
-    "Paste from clipboard": "Залепи из клипборда",
-    "Path": "Путања",
-    "Print document": "Штампај документ",
-    "Redoes your last action": "Враћа последњу радњу",
-    "Remove formatting": "Уклони форматирање",
-    "Select Color": "Изабери боју",
-    "Select all": "Изабери све",
-    "Split Block": "Подели блок",
-    "Strikethrough": "Прецртано",
-    "Subscript": "Индекс-текст",
-    "Superscript": "Експонент-текст",
-    "Toggle Borders": "Пребаци оквирне линије",
-    "Toggle HTML Source": "Пребаци на приказ ХТМЛ кода",
-    "Underline": "Подвучено",
-    "Undoes your last action": "Поништава последњу радњу",
-    "You are in TEXT MODE.  Use the [<>] button to switch back to WYSIWYG.": "Налазите се у ТЕКСТ режиму.  Користите [<>] дугме за повратак на ШВТИД (WYSIWYG).",
-    "__OBSOLETE__": {
-        "Absbottom": "Апсолутно дно",
-        "Absmiddle": "Апсолутна средина",
-        "Alignment:": "Равнање",
-        "Alternate text:": "алтернативни текст",
-        "Baseline": "Доња линија",
-        "Border thickness:": "Дебљина оквира",
-        "Bottom": "Дно",
-        "Cancel": "Поништи",
-        "Cell padding:": "Унутрашња одстојања од ивица ћелије",
-        "Cell spacing:": "Размак између ћелија",
-        "Cols:": "Колоне",
-        "Em": "Ем",
-        "Enlarge Editor": "Повећај едитор",
-        "Enter the image URL here": "Унесите УРЛ слике овде",
-        "Fixed width columns": "Фиксирана ширина колоне",
-        "For browsers that don't support images": "За претраживаче који не подржавају слике",
-        "Horizontal padding": "Хортизонтално одстојање",
-        "Horizontal:": "По хоризонтали",
-        "Image Preview:": "Преглед слике",
-        "Image URL:": "УРЛ слике",
-        "Insert Image": "Убаци слику",
-        "Insert/Modify Link": "додај/промени линк",
-        "Layout": "Прелом",
-        "Leave empty for no border": "Остави празно кад нема оквира",
-        "Left": "Лево",
-        "Middle": "Средина",
-        "New window (_blank)": "Новом прозору (_blank)",
-        "None (use implicit)": "користи подразумевано",
-        "Not set": "Није постављено",
-        "Number of columns": "Број колона",
-        "Number of rows": "Број редова",
-        "OK": "OK",
-        "Other": "Друго",
-        "Percent": "Процената",
-        "Pixels": "Пиксела",
-        "Positioning of this image": "Постављање ове слике",
-        "Positioning of this table": "Постављање ове табеле",
-        "Preview": "Преглед",
-        "Preview the image in a new window": "Прегледај слику у новом прозору",
-        "Right": "Десно",
-        "Rows:": "Редови",
-        "Same frame (_self)": "Исти фрејм (_self)",
-        "Space between adjacent cells": "Размак између наспрамних ћелија",
-        "Space between content and border in cell": "Растојање између садржаја у ћелији и њеног оквира",
-        "Spacing": "Размак",
-        "Target:": "Отвори у:",
-        "Texttop": "Врх текста",
-        "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 на тастатури да директно залепите.",
-        "Title (tooltip):": "Назив (tooltip):",
-        "Top": "Врх",
-        "Top frame (_top)": "Главни фрејм (_top)",
-        "URL:": "УРЛ:",
-        "Vertical padding": "Вертикално одстојање",
-        "Vertical:": "По вертикали",
-        "Width of the table": "Ширина табеле",
-        "Width unit": "Јединица ширине",
-        "Width:": "Ширина",
-        "You must enter the URL where this link points to": "Морате унети УРЛ на који води овај линк"
-    }
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/lang/sv.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/lang/sv.js
deleted file mode 100644
index 25bf8ad..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/lang/sv.js
+++ /dev/null
@@ -1,111 +0,0 @@
-// I18N constants
-// LANG: "sv", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "About this editor": "Om denna editor",
-    "Background Color": "Bakgrundsfärg",
-    "Bold": "Fet",
-    "Bulleted List": "Punktlista",
-    "Clean content pasted from Word": "Rensa innehåll inklistrat från MS Word",
-    "Clear Inline Font Specifications": "Rensa inbäddad typsnittsinformation",
-    "Clear MSOffice tags": "Städa bort MS Office taggar",
-    "Close": "Stäng",
-    "Copy selection": "Kopiera  markering",
-    "Create Toolbar": "Skapar verktygspanel",
-    "Current style": "Nuvarande stil",
-    "Cut selection": "Klipp ut markering",
-    "Decrease Indent": "Minska indrag",
-    "Direction left to right": "Vänster till höger",
-    "Direction right to left": "Höger till vänster",
-    "Font Color": "Textfärg",
-    "Headings": "Skapa standardrubrik",
-    "Help using editor": "Hjälp",
-    "Horizontal Rule": "Vågrät linje",
-    "Increase Indent": "Öka indrag",
-    "Insert Table": "Infoga tabell",
-    "Insert Web Link": "Infoga länk",
-    "Insert/Modify Image": "Infoga bild",
-    "Insert/Overwrite": "Infoga/Skriv över",
-    "Italic": "Kursiv",
-    "Justify Center": "Centrera",
-    "Justify Full": "Marginaljustera",
-    "Justify Left": "Vänsterjustera",
-    "Justify Right": "Högerjustera",
-    "Keyboard shortcuts": "Snabbtangenter",
-    "Ordered List": "Numrerad lista",
-    "Paste from clipboard": "Klistra in",
-    "Path": "Objekt",
-    "Print document": "Skriv ut",
-    "Redoes your last action": "Upprepa kommando",
-    "Remove formatting": "Rensa formattering",
-    "Select all": "Markera allt",
-    "Set format to paragraph": "Aktivera paragrafläge",
-    "Split Block": "Dela block",
-    "Strikethrough": "Genomstruken",
-    "Subscript": "Nedsänkt",
-    "Superscript": "Upphöjd",
-    "The editor provides the following key combinations:": "Editorn nyttjar följande kombinationer:",
-    "Toggle Borders": "Objektramar",
-    "Toggle HTML Source": "Visa källkod",
-    "Underline": "Understruken",
-    "Undoes your last action": "Ångra kommando",
-    "Would you like to clear font colours?": "Ta bort all textfärger ?",
-    "Would you like to clear font sizes?": "Radera alla fontstorlekar ?",
-    "Would you like to clear font typefaces?": "Radera alla typsnittsinformation ?",
-    "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",
-    "insert linebreak": "Infoga radbrytning ",
-    "new paragraph": "Ny paragraf ",
-    "__OBSOLETE__": {
-        "Alignment:": "Marginaljustering",
-        "Border thickness:": "Ramtjocklek",
-        "Cancel": "Avbryt",
-        "Cell padding:": "Cellindrag:",
-        "Cell spacing:": "Cellmarginaler:",
-        "Cols:": "Kolumner:",
-        "Constructing main object": "Skapar huvudobjekt",
-        "Em": "",
-        "Enlarge Editor": "Visa i eget fönster",
-        "Fixed width columns": "Fixerad bredd",
-        "Insert/Modify Link": "Redigera länk",
-        "Leave empty for no border": "Lämna fältet tomt för att undvika ramar",
-        "Loading in progress. Please wait !": "Editorn laddas. Vänta...",
-        "New window (_blank)": "Nytt fönster (_blank)",
-        "None (use implicit)": "Ingen (använd standardinställing)",
-        "Number of columns": "Antal kolumner",
-        "Number of rows": "Antal rader",
-        "OK": "OK",
-        "Other": "Annan",
-        "Percent": "Procent",
-        "Pixels": "Pixlar",
-        "Positioning of this table": "Tabellposition",
-        "Register panel bottom": "Registerar fotpanel",
-        "Register panel left": "Registerar panel vänster",
-        "Register panel right": "Registerar panel höger",
-        "Register panel top": "Registerar toppanel",
-        "Rows:": "Rader:",
-        "Same frame (_self)": "Samma ram (_self)",
-        "Space between adjacent cells": "Utrymme mellan celler",
-        "Space between content and border in cell": "Utrymme mellan ram och cellinnehåll",
-        "Spacing": "Cellegenskaper",
-        "Target:": "Mål:",
-        "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.",
-        "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 ",
-        "Title (tooltip):": "Titel (tooltip):",
-        "Top frame (_top)": "Toppram (_top)",
-        "URL:": "Sökväg:",
-        "Width of the table": "Tabellbredd",
-        "Width unit": "Breddenheter",
-        "Width:": "Bredd:",
-        "You must enter a number of columns": "Ange antal kolumner",
-        "You must enter a number of rows": "Ange ental rader",
-        "You must enter the URL where this link points to": "Du måsta ange en adress till vilken länken skall peka på",
-        "You need to select some text before creating a link": "Du måsta markera ett objekt att applicera länken på!"
-    }
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/lang/th.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/lang/th.js
deleted file mode 100644
index eedfa14..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/lang/th.js
+++ /dev/null
@@ -1,48 +0,0 @@
-// I18N constants
-// LANG: "th", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "About this editor": "เกี่ยวกับโปรแกรมนี้",
-    "Background Color": "สีพื้นหลัง",
-    "Bold": "ตัวหนา",
-    "Bulleted List": "ลำดับ",
-    "Copy selection": "สำเนาส่วนที่เลือก",
-    "Current style": "รูปแบบปัจจุบัน",
-    "Cut selection": "ตัดส่วนที่เลือก",
-    "Decrease Indent": "ลดย่อหน้า",
-    "Font Color": "สีขอบแบบอักษร",
-    "Help using editor": "การใช้งานโปรแกรม",
-    "Horizontal Rule": "เส้นกึ่งกลาง",
-    "Increase Indent": "เพิ่มย่อหน้า",
-    "Insert Table": "เพิ่มตาราง",
-    "Insert Web Link": "ิเพิ่มลิ้งค์",
-    "Insert/Modify Image": "เพิ่ม/แก้ไขภาพ",
-    "Italic": "ตัวเอียง",
-    "Justify Center": "จัดกึ่งกลาง",
-    "Justify Full": "จัดเต็มขอบ",
-    "Justify Left": "จัดชิดซ้าย",
-    "Justify Right": "จัดชิดขวา",
-    "Ordered List": "เลขลำดับ",
-    "Paste from clipboard": "วางจากคลิปบอร์ด",
-    "Path": "เส้นทาง",
-    "Redoes your last action": "ทำซ้ำ",
-    "Strikethrough": "ขีดทับ",
-    "Subscript": "ตัวห้อย",
-    "Superscript": "ตัวยก",
-    "Toggle HTML Source": "สลับการแสดงโค้ด HTML",
-    "Underline": "ขีดเส้นใต้",
-    "Undoes your last action": "ย้อนกลับ",
-    "You are in TEXT MODE.  Use the [<>] button to switch back to WYSIWYG.": "คุณอยู่ในโหมดธรรมดา กดที่ปุ่ม [<>] เพื่อสลับกลับไปยังโหมดพิมพ์งานแบบเวิร์ด",
-    "__OBSOLETE__": {
-        "Cancel": "ยกเลิก",
-        "Enlarge Editor": "ขยายให้เต็มจอ",
-        "OK": "ตกลง"
-    }
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/lang/tr.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/lang/tr.js
deleted file mode 100644
index 841d282..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/lang/tr.js
+++ /dev/null
@@ -1,157 +0,0 @@
-// I18N constants
-// LANG: "tr", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "&#8212; format &#8212;": "&#8212; Bçim &#8212;",
-    "About this editor": "Bu düzenleyici hakkında",
-    "Address": "Adres",
-    "Background Color": "Arka plan rengi",
-    "Bold": "Kalın",
-    "Bulleted List": "Madde işaretli liste",
-    "Clean content pasted from Word": "Word'dan yapıştırılan içeriği temizle",
-    "Clear Inline Font Specifications": "Yazı tipi biçimlendirmesini sil",
-    "Clear MSOffice tags": "MSOffice etiketlerini sil",
-    "Close": "Kapat",
-    "Constructing object": "Nesne oluşturuluyor",
-    "Copy selection": "Seçimi kopyala",
-    "Create Statusbar": "Durum çubuğu oluşturuluyor",
-    "Create Toolbar": "Araç çubuğu oluşturuluyor",
-    "Current style": "Geçerli stil",
-    "Cut selection": "Seçimi kes",
-    "Decrease Indent": "Girintiyi azalt",
-    "Direction left to right": "Belge yönlendirmesi soldan sağa",
-    "Direction right to left": "Belde yönlendirmesi sağdan sola",
-    "Finishing": "Başlatılıyor",
-    "Font Color": "Yazı tipi rengi",
-    "Formatted": "Biçimli",
-    "Generate Xinha framework": "Xinha çerçevesi oluşturuluyor",
-    "Heading 1": "Başlık 1",
-    "Heading 2": "Başlık 2",
-    "Heading 3": "Başlık 3",
-    "Heading 4": "Başlık 4",
-    "Heading 5": "Başlık 5",
-    "Heading 6": "Başlık 6",
-    "Headings": "Başlık türleri",
-    "Help using editor": "Yardım",
-    "Horizontal Rule": "Yatay cetvel",
-    "Increase Indent": "Girintiyi arttır",
-    "Init editor size": "Editör büyüklüğü tanımlanıyor",
-    "Insert Table": "Tablo ekle",
-    "Insert Web Link": "Web bağlantısı gir",
-    "Insert/Modify Image": "Resim ekle/değiştir",
-    "Insert/Overwrite": "Ekle/Üzerine yaz",
-    "Italic": "İtalik",
-    "Justify Center": "Ortaya hizala",
-    "Justify Full": "Tam hizala",
-    "Justify Left": "Sola hizala",
-    "Justify Right": "Sağa hizala",
-    "Keyboard shortcuts": "Klavye kısayolları",
-    "Loading in progress. Please wait!": "Editör yükleniyor. Lütfen bekleyin!",
-    "Loading plugin $plugin": "$plugin yükleniyor",
-    "Normal": "Normal (Paragraf)",
-    "Ordered List": "Sıralı liste",
-    "Paste from clipboard": "Panodan yapıştır",
-    "Path": "Yol",
-    "Print document": "Belgeyi yazdır",
-    "Redoes your last action": "Yinele",
-    "Register plugin $plugin": "$plugin kayıt ediliyor",
-    "Remove formatting": "Biçimlendirmeyi kaldır",
-    "Save as": "Farklı kaydet",
-    "Select all": "Tümünü seç",
-    "Set format to paragraph": "Paragrafın biçimini ayarla",
-    "Split Block": "Bloğu böl",
-    "Strikethrough": "Üstü çizili",
-    "Subscript": "Altsimge",
-    "Superscript": "Üstsimge",
-    "The editor provides the following key combinations:": "Editörün desteklediği kombinasyonlar:",
-    "Toggle Borders": "Tablo kenarlıklarını göster/gösterme",
-    "Toggle HTML Source": "HTML kaynak kodunu aç/kapat",
-    "Underline": "Altı çizili",
-    "Undoes your last action": "Geri al",
-    "Would you like to clear font colours?": "Yazı tipi renklerini sıfırlamak mı istiyorsunuz?",
-    "Would you like to clear font sizes?": "Yazı tipi boyutlarını sıfırlamak mı istiyorsunuz?",
-    "Would you like to clear font typefaces?": "Yazı tipi biçimlendirmesini silmek mı istiyorsunuz?",
-    "You are in TEXT MODE.  Use the [<>] button to switch back to WYSIWYG.": "Metin modundasınız. Görsel moda (WYSIWIG) dönmek için [<>] düğmesine tıklayın.",
-    "insert linebreak": "Satır sonu ekle",
-    "new paragraph": "Yeni paragraf",
-    "__OBSOLETE__": {
-        "Absbottom": "Salt alta",
-        "Absmiddle": "Salt orta",
-        "Alignment:": "Hizalama:",
-        "Alternate text:": "Alternatif metin:",
-        "Baseline": "Taban hizası",
-        "Border thickness:": "Kenarlık kalınlığı:",
-        "Bottom": "Alta",
-        "Cancel": "İptal",
-        "Cell padding:": "Hücre doldurma:",
-        "Cell spacing:": "Hücre aralığı:",
-        "Click a color...": "Bir renk seçin",
-        "Color: ": "Renk: ",
-        "Cols:": "Sütun:",
-        "Em": "Em",
-        "Enlarge Editor": "Düzenleyiciyi büyüt",
-        "Enter the image URL here": "Lütfen buraya resim URL'sini girin",
-        "Fixed width columns": "Sabit başlı sütun",
-        "For browsers that don't support images": "Resim desteklemeyen tarayıcılar için",
-        "Horizontal padding": "Yatay doldurma miktarı",
-        "Horizontal:": "Yatay:",
-        "Image Preview:": "Resim önizleme:",
-        "Image URL:": "Resim URL'si:",
-        "Insert Image": "Resim ekle",
-        "Insert/Modify Link": "Bağlantı ekle/değiştir",
-        "Layout": "Düzen",
-        "Leave empty for no border": "Kenarlık istemiyorsanız boş bırakın",
-        "Left": "Sola",
-        "Middle": "Ortala",
-        "New window (_blank)": "Yeni pencere (_blank)",
-        "None (use implicit)": "Hiçbiri (Örtük)",
-        "Not set": "Ayarlanmamış",
-        "Number of columns": "Sütun sayısı",
-        "Number of rows": "Satır sayısı",
-        "OK": "OK",
-        "Other": "Başka",
-        "Percent": "Yüzde",
-        "Pixels": "Piksel",
-        "Positioning of this image": "Resmi konumlandırma",
-        "Positioning of this table": "Tablo konumlandırma",
-        "Preview": "Önizleme",
-        "Preview the image in a new window": "Resmi yeni pencerede önizleme",
-        "Register bottom panel": "Alt panel oluşturuluyor",
-        "Register left panel": "Sol panel oluşturuluyor",
-        "Register right panel": "Sağ panel oluşturuluyor",
-        "Register top panel": "Üst panel oluşturuluyor",
-        "Right": "Sağa",
-        "Rows:": "Satır:",
-        "Same frame (_self)": "Aynı çerçeve (_self)",
-        "Sample": "Örnek",
-        "Space between adjacent cells": "Bitişik hücre aralığı",
-        "Space between content and border in cell": "İç kenarlığı ve hücre içeriği arasındaki boşluk",
-        "Spacing": "Aralık",
-        "Target:": "Hedef:",
-        "Texttop": "Metin-üstte",
-        "The Paste button does not work in Mozilla based web browsers (technical security reasons). Press CTRL-V on your keyboard to paste directly.": "Güvenlik sebeplerinden dolayı bazı tarayıcılar kes/kopyala/yapıştır komutlarına erişemez. Kesme/kopyalama/yapıştırma komutunu kullanmak için lütfen  klavyenizin kısayollarını kullanın (CTRL + C/V/X).",
-        "Title (tooltip):": "Başlık (Araç ipucu):",
-        "Top": "Yukarı",
-        "Top frame (_top)": "En üst çerçeve (_top)",
-        "URL:": "URL:",
-        "Vertical padding": "Dikey doldurma miktarı",
-        "Vertical:": "Dikey:",
-        "Web Safe: ": "Web güvenli mod: ",
-        "Width of the table": "Tablo genişliği",
-        "Width unit": "Genişlik birimi",
-        "Width:": "Genişlik:",
-        "You must enter a number of columns": "Lütfen sütun sayısını girin",
-        "You must enter a number of rows": "Lütfen satır sayısını girin",
-        "You must enter the URL": "Lütfen URL girin",
-        "You must enter the URL where this link points to": "Bağlantının hangi konuma işaret ettiğini girmelisiniz",
-        "You need to select some text before create a link": "Bağlantı oluşturmak için bir metin seçmeniz gerekir",
-        "Your Document is not well formed. Check JavaScript console for details.": "Metninizin biçimi iyi değil. Daha fazla bilgi için Javascript konsolunu kontrol edin."
-    }
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/lang/vn.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/lang/vn.js
deleted file mode 100644
index 08d8747..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/lang/vn.js
+++ /dev/null
@@ -1,61 +0,0 @@
-// I18N constants
-// LANG: "vn", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "About this editor": "Tự Giới Thiệu",
-    "Background Color": "Màu Nền",
-    "Bold": "Đậm",
-    "Bulleted List": "Danh Sách Phi Thứ Tự (Chấm đầu dòng)",
-    "Copy selection": "Sao chép",
-    "Current style": "Định Dạng Hiện Thời",
-    "Cut selection": "Cắt",
-    "Decrease Indent": "Lùi Ra Ngoài",
-    "Direction left to right": "Viết từ trái sang phải",
-    "Direction right to left": "Viết từ phải sang trái",
-    "Font Color": "Màu Chữ",
-    "Help using editor": "Giúp Đỡ",
-    "Horizontal Rule": "Dòng Kẻ Ngang",
-    "Increase Indent": "Thụt Vào Trong",
-    "Insert Table": "Chèn Bảng",
-    "Insert Web Link": "Tạo Liên Kết",
-    "Insert/Modify Image": "Chèn Ảnh",
-    "Italic": "Nghiêng",
-    "Justify Center": "Căn Giữa",
-    "Justify Full": "Căn Đều",
-    "Justify Left": "Căn Trái",
-    "Justify Right": "Căn Phải",
-    "Ordered List": "Danh Sách Có Thứ Tự (1, 2, 3)",
-    "Paste from clipboard": "Dán",
-    "Path": "Đường Dẫn",
-    "Redoes your last action": "Lấy lại thao tác vừa bỏ",
-    "Strikethrough": "Gạch Xóa",
-    "Subscript": "Viết Xuống Dưới",
-    "Superscript": "Viết Lên Trên",
-    "Toggle HTML Source": "Chế Độ Mã HTML",
-    "Underline": "Gạch Chân",
-    "Undoes your last action": "Hủy thao tác trước",
-    "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.",
-    "__OBSOLETE__": {
-        "Cancel": "Hủy",
-        "Enlarge Editor": "Phóng To Ô Soạn Thảo",
-        "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ị:",
-        "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 ",
-        "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"
-    }
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/lang/zh_cn.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/lang/zh_cn.js
deleted file mode 100644
index d0ba912..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/lang/zh_cn.js
+++ /dev/null
@@ -1,39 +0,0 @@
-// I18N constants
-// LANG: "zh_cn", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "About this editor": "关於 Xinha",
-    "Background Color": "背景颜色",
-    "Bold": "粗体",
-    "Bulleted List": "无序清单",
-    "Current style": "字体例子",
-    "Decrease Indent": "减小行前空白",
-    "Font Color": "文字颜色",
-    "Help using editor": "说明",
-    "Horizontal Rule": "水平线",
-    "Increase Indent": "加宽行前空白",
-    "Insert Table": "插入表格",
-    "Insert Web Link": "插入连结",
-    "Insert/Modify Image": "插入图形",
-    "Italic": "斜体",
-    "Justify Center": "位置居中",
-    "Justify Full": "位置左右平等",
-    "Justify Left": "位置靠左",
-    "Justify Right": "位置靠右",
-    "Ordered List": "顺序清单",
-    "Strikethrough": "删除线",
-    "Subscript": "下标",
-    "Superscript": "上标",
-    "Toggle HTML Source": "切换HTML原始码",
-    "Underline": "底线",
-    "__OBSOLETE__": {
-        "Enlarge Editor": "放大"
-    }
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/libraries/MooTools-Core-1.3.3dev.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/libraries/MooTools-Core-1.3.3dev.js
deleted file mode 100644
index a847852..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/libraries/MooTools-Core-1.3.3dev.js
+++ /dev/null
@@ -1,5958 +0,0 @@
-/*
----
-
-name: Core
-
-description: The heart of MooTools.
-
-license: MIT-style license.
-
-copyright: Copyright (c) 2006-2010 [Valerio Proietti](http://mad4milk.net/).
-
-authors: The MooTools production team (http://mootools.net/developers/)
-
-inspiration:
-  - Class implementation inspired by [Base.js](http://dean.edwards.name/weblog/2006/03/base/) Copyright (c) 2006 Dean Edwards, [GNU Lesser General Public License](http://opensource.org/licenses/lgpl-license.php)
-  - Some functionality inspired by [Prototype.js](http://prototypejs.org) Copyright (c) 2005-2007 Sam Stephenson, [MIT License](http://opensource.org/licenses/mit-license.php)
-
-provides: [Core, MooTools, Type, typeOf, instanceOf, Native]
-
-...
-*/
-
-(function(){
-
-this.MooTools = {
-	version: '1.3.3dev',
-	build: '%build%'
-};
-
-// typeOf, instanceOf
-
-var typeOf = this.typeOf = function(item){
-	if (item == null) return 'null';
-	if (item.$family) return item.$family();
-
-	if (item.nodeName){
-		if (item.nodeType == 1) return 'element';
-		if (item.nodeType == 3) return (/\S/).test(item.nodeValue) ? 'textnode' : 'whitespace';
-	} else if (typeof item.length == 'number'){
-		if (item.callee) return 'arguments';
-		if ('item' in item) return 'collection';
-	}
-
-	return typeof item;
-};
-
-var instanceOf = this.instanceOf = function(item, object){
-	if (item == null) return false;
-	var constructor = item.$constructor || item.constructor;
-	while (constructor){
-		if (constructor === object) return true;
-		constructor = constructor.parent;
-	}
-	return item instanceof object;
-};
-
-// Function overloading
-
-var Function = this.Function;
-
-var enumerables = true;
-for (var i in {toString: 1}) enumerables = null;
-if (enumerables) enumerables = ['hasOwnProperty', 'valueOf', 'isPrototypeOf', 'propertyIsEnumerable', 'toLocaleString', 'toString', 'constructor'];
-
-Function.prototype.overloadSetter = function(usePlural){
-	var self = this;
-	return function(a, b){
-		if (a == null) return this;
-		if (usePlural || typeof a != 'string'){
-			for (var k in a) self.call(this, k, a[k]);
-			if (enumerables) for (var i = enumerables.length; i--;){
-				k = enumerables[i];
-				if (a.hasOwnProperty(k)) self.call(this, k, a[k]);
-			}
-		} else {
-			self.call(this, a, b);
-		}
-		return this;
-	};
-};
-
-Function.prototype.overloadGetter = function(usePlural){
-	var self = this;
-	return function(a){
-		var args, result;
-		if (usePlural || typeof a != 'string') args = a;
-		else if (arguments.length > 1) args = arguments;
-		if (args){
-			result = {};
-			for (var i = 0; i < args.length; i++) result[args[i]] = self.call(this, args[i]);
-		} else {
-			result = self.call(this, a);
-		}
-		return result;
-	};
-};
-
-Function.prototype.extend = function(key, value){
-	this[key] = value;
-}.overloadSetter();
-
-Function.prototype.implement = function(key, value){
-	this.prototype[key] = value;
-}.overloadSetter();
-
-// From
-
-var slice = Array.prototype.slice;
-
-Function.from = function(item){
-	return (typeOf(item) == 'function') ? item : function(){
-		return item;
-	};
-};
-
-Array.from = function(item){
-	if (item == null) return [];
-	return (Type.isEnumerable(item) && typeof item != 'string') ? (typeOf(item) == 'array') ? item : slice.call(item) : [item];
-};
-
-Number.from = function(item){
-	var number = parseFloat(item);
-	return isFinite(number) ? number : null;
-};
-
-String.from = function(item){
-	return item + '';
-};
-
-// hide, protect
-
-Function.implement({
-
-	hide: function(){
-		this.$hidden = true;
-		return this;
-	},
-
-	protect: function(){
-		this.$protected = true;
-		return this;
-	}
-
-});
-
-// Type
-
-var Type = this.Type = function(name, object){
-	if (name){
-		var lower = name.toLowerCase();
-		var typeCheck = function(item){
-			return (typeOf(item) == lower);
-		};
-
-		Type['is' + name] = typeCheck;
-		if (object != null){
-			object.prototype.$family = (function(){
-				return lower;
-			}).hide();
-			//<1.2compat>
-			object.type = typeCheck;
-			//</1.2compat>
-		}
-	}
-
-	if (object == null) return null;
-
-	object.extend(this);
-	object.$constructor = Type;
-	object.prototype.$constructor = object;
-
-	return object;
-};
-
-var toString = Object.prototype.toString;
-
-Type.isEnumerable = function(item){
-	return (item != null && typeof item.length == 'number' && toString.call(item) != '[object Function]' );
-};
-
-var hooks = {};
-
-var hooksOf = function(object){
-	var type = typeOf(object.prototype);
-	return hooks[type] || (hooks[type] = []);
-};
-
-var implement = function(name, method){
-	if (method && method.$hidden) return;
-
-	var hooks = hooksOf(this);
-
-	for (var i = 0; i < hooks.length; i++){
-		var hook = hooks[i];
-		if (typeOf(hook) == 'type') implement.call(hook, name, method);
-		else hook.call(this, name, method);
-	}
-
-	var previous = this.prototype[name];
-	if (previous == null || !previous.$protected) this.prototype[name] = method;
-
-	if (this[name] == null && typeOf(method) == 'function') extend.call(this, name, function(item){
-		return method.apply(item, slice.call(arguments, 1));
-	});
-};
-
-var extend = function(name, method){
-	if (method && method.$hidden) return;
-	var previous = this[name];
-	if (previous == null || !previous.$protected) this[name] = method;
-};
-
-Type.implement({
-
-	implement: implement.overloadSetter(),
-
-	extend: extend.overloadSetter(),
-
-	alias: function(name, existing){
-		implement.call(this, name, this.prototype[existing]);
-	}.overloadSetter(),
-
-	mirror: function(hook){
-		hooksOf(this).push(hook);
-		return this;
-	}
-
-});
-
-new Type('Type', Type);
-
-// Default Types
-
-var force = function(name, object, methods){
-	var isType = (object != Object),
-		prototype = object.prototype;
-
-	if (isType) object = new Type(name, object);
-
-	for (var i = 0, l = methods.length; i < l; i++){
-		var key = methods[i],
-			generic = object[key],
-			proto = prototype[key];
-
-		if (generic) generic.protect();
-
-		if (isType && proto){
-			delete prototype[key];
-			prototype[key] = proto.protect();
-		}
-	}
-
-	if (isType) object.implement(prototype);
-
-	return force;
-};
-
-force('String', String, [
-	'charAt', 'charCodeAt', 'concat', 'indexOf', 'lastIndexOf', 'match', 'quote', 'replace', 'search',
-	'slice', 'split', 'substr', 'substring', 'toLowerCase', 'toUpperCase'
-])('Array', Array, [
-	'pop', 'push', 'reverse', 'shift', 'sort', 'splice', 'unshift', 'concat', 'join', 'slice',
-	'indexOf', 'lastIndexOf', 'filter', 'forEach', 'every', 'map', 'some', 'reduce', 'reduceRight'
-])('Number', Number, [
-	'toExponential', 'toFixed', 'toLocaleString', 'toPrecision'
-])('Function', Function, [
-	'apply', 'call', 'bind'
-])('RegExp', RegExp, [
-	'exec', 'test'
-])('Object', Object, [
-	'create', 'defineProperty', 'defineProperties', 'keys',
-	'getPrototypeOf', 'getOwnPropertyDescriptor', 'getOwnPropertyNames',
-	'preventExtensions', 'isExtensible', 'seal', 'isSealed', 'freeze', 'isFrozen'
-])('Date', Date, ['now']);
-
-Object.extend = extend.overloadSetter();
-
-Date.extend('now', function(){
-	return +(new Date);
-});
-
-new Type('Boolean', Boolean);
-
-// fixes NaN returning as Number
-
-Number.prototype.$family = function(){
-	return isFinite(this) ? 'number' : 'null';
-}.hide();
-
-// Number.random
-
-Number.extend('random', function(min, max){
-	return Math.floor(Math.random() * (max - min + 1) + min);
-});
-
-// forEach, each
-
-var hasOwnProperty = Object.prototype.hasOwnProperty;
-Object.extend('forEach', function(object, fn, bind){
-	for (var key in object){
-		if (hasOwnProperty.call(object, key)) fn.call(bind, object[key], key, object);
-	}
-});
-
-Object.each = Object.forEach;
-
-Array.implement({
-
-	forEach: function(fn, bind){
-		for (var i = 0, l = this.length; i < l; i++){
-			if (i in this) fn.call(bind, this[i], i, this);
-		}
-	},
-
-	each: function(fn, bind){
-		Array.forEach(this, fn, bind);
-		return this;
-	}
-
-});
-
-// Array & Object cloning, Object merging and appending
-
-var cloneOf = function(item){
-	switch (typeOf(item)){
-		case 'array': return item.clone();
-		case 'object': return Object.clone(item);
-		default: return item;
-	}
-};
-
-Array.implement('clone', function(){
-	var i = this.length, clone = new Array(i);
-	while (i--) clone[i] = cloneOf(this[i]);
-	return clone;
-});
-
-var mergeOne = function(source, key, current){
-	switch (typeOf(current)){
-		case 'object':
-			if (typeOf(source[key]) == 'object') Object.merge(source[key], current);
-			else source[key] = Object.clone(current);
-		break;
-		case 'array': source[key] = current.clone(); break;
-		default: source[key] = current;
-	}
-	return source;
-};
-
-Object.extend({
-
-	merge: function(source, k, v){
-		if (typeOf(k) == 'string') return mergeOne(source, k, v);
-		for (var i = 1, l = arguments.length; i < l; i++){
-			var object = arguments[i];
-			for (var key in object) mergeOne(source, key, object[key]);
-		}
-		return source;
-	},
-
-	clone: function(object){
-		var clone = {};
-		for (var key in object) clone[key] = cloneOf(object[key]);
-		return clone;
-	},
-
-	append: function(original){
-		for (var i = 1, l = arguments.length; i < l; i++){
-			var extended = arguments[i] || {};
-			for (var key in extended) original[key] = extended[key];
-		}
-		return original;
-	}
-
-});
-
-// Object-less types
-
-['Object', 'WhiteSpace', 'TextNode', 'Collection', 'Arguments'].each(function(name){
-	new Type(name);
-});
-
-// Unique ID
-
-var UID = Date.now();
-
-String.extend('uniqueID', function(){
-	return (UID++).toString(36);
-});
-
-//<1.2compat>
-
-var Hash = this.Hash = new Type('Hash', function(object){
-	if (typeOf(object) == 'hash') object = Object.clone(object.getClean());
-	for (var key in object) this[key] = object[key];
-	return this;
-});
-
-Hash.implement({
-
-	forEach: function(fn, bind){
-		Object.forEach(this, fn, bind);
-	},
-
-	getClean: function(){
-		var clean = {};
-		for (var key in this){
-			if (this.hasOwnProperty(key)) clean[key] = this[key];
-		}
-		return clean;
-	},
-
-	getLength: function(){
-		var length = 0;
-		for (var key in this){
-			if (this.hasOwnProperty(key)) length++;
-		}
-		return length;
-	}
-
-});
-
-Hash.alias('each', 'forEach');
-
-Object.type = Type.isObject;
-
-var Native = this.Native = function(properties){
-	return new Type(properties.name, properties.initialize);
-};
-
-Native.type = Type.type;
-
-Native.implement = function(objects, methods){
-	for (var i = 0; i < objects.length; i++) objects[i].implement(methods);
-	return Native;
-};
-
-var arrayType = Array.type;
-Array.type = function(item){
-	return instanceOf(item, Array) || arrayType(item);
-};
-
-this.$A = function(item){
-	return Array.from(item).slice();
-};
-
-this.$arguments = function(i){
-	return function(){
-		return arguments[i];
-	};
-};
-
-this.$chk = function(obj){
-	return !!(obj || obj === 0);
-};
-
-this.$clear = function(timer){
-	clearTimeout(timer);
-	clearInterval(timer);
-	return null;
-};
-
-this.$defined = function(obj){
-	return (obj != null);
-};
-
-this.$each = function(iterable, fn, bind){
-	var type = typeOf(iterable);
-	((type == 'arguments' || type == 'collection' || type == 'array' || type == 'elements') ? Array : Object).each(iterable, fn, bind);
-};
-
-this.$empty = function(){};
-
-this.$extend = function(original, extended){
-	return Object.append(original, extended);
-};
-
-this.$H = function(object){
-	return new Hash(object);
-};
-
-this.$merge = function(){
-	var args = Array.slice(arguments);
-	args.unshift({});
-	return Object.merge.apply(null, args);
-};
-
-this.$lambda = Function.from;
-this.$mixin = Object.merge;
-this.$random = Number.random;
-this.$splat = Array.from;
-this.$time = Date.now;
-
-this.$type = function(object){
-	var type = typeOf(object);
-	if (type == 'elements') return 'array';
-	return (type == 'null') ? false : type;
-};
-
-this.$unlink = function(object){
-	switch (typeOf(object)){
-		case 'object': return Object.clone(object);
-		case 'array': return Array.clone(object);
-		case 'hash': return new Hash(object);
-		default: return object;
-	}
-};
-
-//</1.2compat>
-
-})();
-
-
-/*
----
-
-name: Array
-
-description: Contains Array Prototypes like each, contains, and erase.
-
-license: MIT-style license.
-
-requires: Type
-
-provides: Array
-
-...
-*/
-
-Array.implement({
-
-	/*<!ES5>*/
-	every: function(fn, bind){
-		for (var i = 0, l = this.length; i < l; i++){
-			if ((i in this) && !fn.call(bind, this[i], i, this)) return false;
-		}
-		return true;
-	},
-
-	filter: function(fn, bind){
-		var results = [];
-		for (var i = 0, l = this.length; i < l; i++){
-			if ((i in this) && fn.call(bind, this[i], i, this)) results.push(this[i]);
-		}
-		return results;
-	},
-
-	indexOf: function(item, from){
-		var len = this.length;
-		for (var i = (from < 0) ? Math.max(0, len + from) : from || 0; i < len; i++){
-			if (this[i] === item) return i;
-		}
-		return -1;
-	},
-
-	map: function(fn, bind){
-		var results = [];
-		for (var i = 0, l = this.length; i < l; i++){
-			if (i in this) results[i] = fn.call(bind, this[i], i, this);
-		}
-		return results;
-	},
-
-	some: function(fn, bind){
-		for (var i = 0, l = this.length; i < l; i++){
-			if ((i in this) && fn.call(bind, this[i], i, this)) return true;
-		}
-		return false;
-	},
-	/*</!ES5>*/
-
-	clean: function(){
-		return this.filter(function(item){
-			return item != null;
-		});
-	},
-
-	invoke: function(methodName){
-		var args = Array.slice(arguments, 1);
-		return this.map(function(item){
-			return item[methodName].apply(item, args);
-		});
-	},
-
-	associate: function(keys){
-		var obj = {}, length = Math.min(this.length, keys.length);
-		for (var i = 0; i < length; i++) obj[keys[i]] = this[i];
-		return obj;
-	},
-
-	link: function(object){
-		var result = {};
-		for (var i = 0, l = this.length; i < l; i++){
-			for (var key in object){
-				if (object[key](this[i])){
-					result[key] = this[i];
-					delete object[key];
-					break;
-				}
-			}
-		}
-		return result;
-	},
-
-	contains: function(item, from){
-		return this.indexOf(item, from) != -1;
-	},
-
-	append: function(array){
-		this.push.apply(this, array);
-		return this;
-	},
-
-	getLast: function(){
-		return (this.length) ? this[this.length - 1] : null;
-	},
-
-	getRandom: function(){
-		return (this.length) ? this[Number.random(0, this.length - 1)] : null;
-	},
-
-	include: function(item){
-		if (!this.contains(item)) this.push(item);
-		return this;
-	},
-
-	combine: function(array){
-		for (var i = 0, l = array.length; i < l; i++) this.include(array[i]);
-		return this;
-	},
-
-	erase: function(item){
-		for (var i = this.length; i--;){
-			if (this[i] === item) this.splice(i, 1);
-		}
-		return this;
-	},
-
-	empty: function(){
-		this.length = 0;
-		return this;
-	},
-
-	flatten: function(){
-		var array = [];
-		for (var i = 0, l = this.length; i < l; i++){
-			var type = typeOf(this[i]);
-			if (type == 'null') continue;
-			array = array.concat((type == 'array' || type == 'collection' || type == 'arguments' || instanceOf(this[i], Array)) ? Array.flatten(this[i]) : this[i]);
-		}
-		return array;
-	},
-
-	pick: function(){
-		for (var i = 0, l = this.length; i < l; i++){
-			if (this[i] != null) return this[i];
-		}
-		return null;
-	},
-
-	hexToRgb: function(array){
-		if (this.length != 3) return null;
-		var rgb = this.map(function(value){
-			if (value.length == 1) value += value;
-			return value.toInt(16);
-		});
-		return (array) ? rgb : 'rgb(' + rgb + ')';
-	},
-
-	rgbToHex: function(array){
-		if (this.length < 3) return null;
-		if (this.length == 4 && this[3] == 0 && !array) return 'transparent';
-		var hex = [];
-		for (var i = 0; i < 3; i++){
-			var bit = (this[i] - 0).toString(16);
-			hex.push((bit.length == 1) ? '0' + bit : bit);
-		}
-		return (array) ? hex : '#' + hex.join('');
-	}
-
-});
-
-//<1.2compat>
-
-Array.alias('extend', 'append');
-
-var $pick = function(){
-	return Array.from(arguments).pick();
-};
-
-//</1.2compat>
-
-
-/*
----
-
-name: String
-
-description: Contains String Prototypes like camelCase, capitalize, test, and toInt.
-
-license: MIT-style license.
-
-requires: Type
-
-provides: String
-
-...
-*/
-
-String.implement({
-
-	test: function(regex, params){
-		return ((typeOf(regex) == 'regexp') ? regex : new RegExp('' + regex, params)).test(this);
-	},
-
-	contains: function(string, separator){
-		return (separator) ? (separator + this + separator).indexOf(separator + string + separator) > -1 : this.indexOf(string) > -1;
-	},
-
-	trim: function(){
-		return this.replace(/^\s+|\s+$/g, '');
-	},
-
-	clean: function(){
-		return this.replace(/\s+/g, ' ').trim();
-	},
-
-	camelCase: function(){
-		return this.replace(/-\D/g, function(match){
-			return match.charAt(1).toUpperCase();
-		});
-	},
-
-	hyphenate: function(){
-		return this.replace(/[A-Z]/g, function(match){
-			return ('-' + match.charAt(0).toLowerCase());
-		});
-	},
-
-	capitalize: function(){
-		return this.replace(/\b[a-z]/g, function(match){
-			return match.toUpperCase();
-		});
-	},
-
-	escapeRegExp: function(){
-		return this.replace(/([-.*+?^${}()|[\]\/\\])/g, '\\$1');
-	},
-
-	toInt: function(base){
-		return parseInt(this, base || 10);
-	},
-
-	toFloat: function(){
-		return parseFloat(this);
-	},
-
-	hexToRgb: function(array){
-		var hex = this.match(/^#?(\w{1,2})(\w{1,2})(\w{1,2})$/);
-		return (hex) ? hex.slice(1).hexToRgb(array) : null;
-	},
-
-	rgbToHex: function(array){
-		var rgb = this.match(/\d{1,3}/g);
-		return (rgb) ? rgb.rgbToHex(array) : null;
-	},
-
-	substitute: function(object, regexp){
-		return this.replace(regexp || (/\\?\{([^{}]+)\}/g), function(match, name){
-			if (match.charAt(0) == '\\') return match.slice(1);
-			return (object[name] != null) ? object[name] : '';
-		});
-	}
-
-});
-
-
-/*
----
-
-name: Number
-
-description: Contains Number Prototypes like limit, round, times, and ceil.
-
-license: MIT-style license.
-
-requires: Type
-
-provides: Number
-
-...
-*/
-
-Number.implement({
-
-	limit: function(min, max){
-		return Math.min(max, Math.max(min, this));
-	},
-
-	round: function(precision){
-		precision = Math.pow(10, precision || 0).toFixed(precision < 0 ? -precision : 0);
-		return Math.round(this * precision) / precision;
-	},
-
-	times: function(fn, bind){
-		for (var i = 0; i < this; i++) fn.call(bind, i, this);
-	},
-
-	toFloat: function(){
-		return parseFloat(this);
-	},
-
-	toInt: function(base){
-		return parseInt(this, base || 10);
-	}
-
-});
-
-Number.alias('each', 'times');
-
-(function(math){
-	var methods = {};
-	math.each(function(name){
-		if (!Number[name]) methods[name] = function(){
-			return Math[name].apply(null, [this].concat(Array.from(arguments)));
-		};
-	});
-	Number.implement(methods);
-})(['abs', 'acos', 'asin', 'atan', 'atan2', 'ceil', 'cos', 'exp', 'floor', 'log', 'max', 'min', 'pow', 'sin', 'sqrt', 'tan']);
-
-
-/*
----
-
-name: Function
-
-description: Contains Function Prototypes like create, bind, pass, and delay.
-
-license: MIT-style license.
-
-requires: Type
-
-provides: Function
-
-...
-*/
-
-Function.extend({
-
-	attempt: function(){
-		for (var i = 0, l = arguments.length; i < l; i++){
-			try {
-				return arguments[i]();
-			} catch (e){}
-		}
-		return null;
-	}
-
-});
-
-Function.implement({
-
-	attempt: function(args, bind){
-		try {
-			return this.apply(bind, Array.from(args));
-		} catch (e){}
-
-		return null;
-	},
-
-	/*<!ES5>*/
-	bind: function(bind){
-		var self = this,
-			args = (arguments.length > 1) ? Array.slice(arguments, 1) : null;
-
-		return function(){
-			if (!args && !arguments.length) return self.call(bind);
-			if (args && arguments.length) return self.apply(bind, args.concat(Array.from(arguments)));
-			return self.apply(bind, args || arguments);
-		};
-	},
-	/*</!ES5>*/
-
-	pass: function(args, bind){
-		var self = this;
-		if (args != null) args = Array.from(args);
-		return function(){
-			return self.apply(bind, args || arguments);
-		};
-	},
-
-	delay: function(delay, bind, args){
-		return setTimeout(this.pass((args == null ? [] : args), bind), delay);
-	},
-
-	periodical: function(periodical, bind, args){
-		return setInterval(this.pass((args == null ? [] : args), bind), periodical);
-	}
-
-});
-
-//<1.2compat>
-
-delete Function.prototype.bind;
-
-Function.implement({
-
-	create: function(options){
-		var self = this;
-		options = options || {};
-		return function(event){
-			var args = options.arguments;
-			args = (args != null) ? Array.from(args) : Array.slice(arguments, (options.event) ? 1 : 0);
-			if (options.event) args = [event || window.event].extend(args);
-			var returns = function(){
-				return self.apply(options.bind || null, args);
-			};
-			if (options.delay) return setTimeout(returns, options.delay);
-			if (options.periodical) return setInterval(returns, options.periodical);
-			if (options.attempt) return Function.attempt(returns);
-			return returns();
-		};
-	},
-
-	bind: function(bind, args){
-		var self = this;
-		if (args != null) args = Array.from(args);
-		return function(){
-			return self.apply(bind, args || arguments);
-		};
-	},
-
-	bindWithEvent: function(bind, args){
-		var self = this;
-		if (args != null) args = Array.from(args);
-		return function(event){
-			return self.apply(bind, (args == null) ? arguments : [event].concat(args));
-		};
-	},
-
-	run: function(args, bind){
-		return this.apply(bind, Array.from(args));
-	}
-
-});
-
-var $try = Function.attempt;
-
-//</1.2compat>
-
-
-/*
----
-
-name: Object
-
-description: Object generic methods
-
-license: MIT-style license.
-
-requires: Type
-
-provides: [Object, Hash]
-
-...
-*/
-
-(function(){
-
-var hasOwnProperty = Object.prototype.hasOwnProperty;
-
-Object.extend({
-
-	subset: function(object, keys){
-		var results = {};
-		for (var i = 0, l = keys.length; i < l; i++){
-			var k = keys[i];
-			if (k in object) results[k] = object[k];
-		}
-		return results;
-	},
-
-	map: function(object, fn, bind){
-		var results = {};
-		for (var key in object){
-			if (hasOwnProperty.call(object, key)) results[key] = fn.call(bind, object[key], key, object);
-		}
-		return results;
-	},
-
-	filter: function(object, fn, bind){
-		var results = {};
-		for (var key in object){
-			var value = object[key];
-			if (hasOwnProperty.call(object, key) && fn.call(bind, value, key, object)) results[key] = value;
-		}
-		return results;
-	},
-
-	every: function(object, fn, bind){
-		for (var key in object){
-			if (hasOwnProperty.call(object, key) && !fn.call(bind, object[key], key)) return false;
-		}
-		return true;
-	},
-
-	some: function(object, fn, bind){
-		for (var key in object){
-			if (hasOwnProperty.call(object, key) && fn.call(bind, object[key], key)) return true;
-		}
-		return false;
-	},
-
-	keys: function(object){
-		var keys = [];
-		for (var key in object){
-			if (hasOwnProperty.call(object, key)) keys.push(key);
-		}
-		return keys;
-	},
-
-	values: function(object){
-		var values = [];
-		for (var key in object){
-			if (hasOwnProperty.call(object, key)) values.push(object[key]);
-		}
-		return values;
-	},
-
-	getLength: function(object){
-		return Object.keys(object).length;
-	},
-
-	keyOf: function(object, value){
-		for (var key in object){
-			if (hasOwnProperty.call(object, key) && object[key] === value) return key;
-		}
-		return null;
-	},
-
-	contains: function(object, value){
-		return Object.keyOf(object, value) != null;
-	},
-
-	toQueryString: function(object, base){
-		var queryString = [];
-
-		Object.each(object, function(value, key){
-			if (base) key = base + '[' + key + ']';
-			var result;
-			switch (typeOf(value)){
-				case 'object': result = Object.toQueryString(value, key); break;
-				case 'array':
-					var qs = {};
-					value.each(function(val, i){
-						qs[i] = val;
-					});
-					result = Object.toQueryString(qs, key);
-				break;
-				default: result = key + '=' + encodeURIComponent(value);
-			}
-			if (value != null) queryString.push(result);
-		});
-
-		return queryString.join('&');
-	}
-
-});
-
-})();
-
-//<1.2compat>
-
-Hash.implement({
-
-	has: Object.prototype.hasOwnProperty,
-
-	keyOf: function(value){
-		return Object.keyOf(this, value);
-	},
-
-	hasValue: function(value){
-		return Object.contains(this, value);
-	},
-
-	extend: function(properties){
-		Hash.each(properties || {}, function(value, key){
-			Hash.set(this, key, value);
-		}, this);
-		return this;
-	},
-
-	combine: function(properties){
-		Hash.each(properties || {}, function(value, key){
-			Hash.include(this, key, value);
-		}, this);
-		return this;
-	},
-
-	erase: function(key){
-		if (this.hasOwnProperty(key)) delete this[key];
-		return this;
-	},
-
-	get: function(key){
-		return (this.hasOwnProperty(key)) ? this[key] : null;
-	},
-
-	set: function(key, value){
-		if (!this[key] || this.hasOwnProperty(key)) this[key] = value;
-		return this;
-	},
-
-	empty: function(){
-		Hash.each(this, function(value, key){
-			delete this[key];
-		}, this);
-		return this;
-	},
-
-	include: function(key, value){
-		if (this[key] == null) this[key] = value;
-		return this;
-	},
-
-	map: function(fn, bind){
-		return new Hash(Object.map(this, fn, bind));
-	},
-
-	filter: function(fn, bind){
-		return new Hash(Object.filter(this, fn, bind));
-	},
-
-	every: function(fn, bind){
-		return Object.every(this, fn, bind);
-	},
-
-	some: function(fn, bind){
-		return Object.some(this, fn, bind);
-	},
-
-	getKeys: function(){
-		return Object.keys(this);
-	},
-
-	getValues: function(){
-		return Object.values(this);
-	},
-
-	toQueryString: function(base){
-		return Object.toQueryString(this, base);
-	}
-
-});
-
-Hash.extend = Object.append;
-
-Hash.alias({indexOf: 'keyOf', contains: 'hasValue'});
-
-//</1.2compat>
-
-
-/*
----
-
-name: Browser
-
-description: The Browser Object. Contains Browser initialization, Window and Document, and the Browser Hash.
-
-license: MIT-style license.
-
-requires: [Array, Function, Number, String]
-
-provides: [Browser, Window, Document]
-
-...
-*/
-
-(function(){
-
-var document = this.document;
-var window = document.window = this;
-
-var UID = 1;
-
-this.$uid = (window.ActiveXObject) ? function(item){
-	return (item.uid || (item.uid = [UID++]))[0];
-} : function(item){
-	return item.uid || (item.uid = UID++);
-};
-
-$uid(window);
-$uid(document);
-
-var ua = navigator.userAgent.toLowerCase(),
-	platform = navigator.platform.toLowerCase(),
-	UA = ua.match(/(opera|ie|firefox|chrome|version)[\s\/:]([\w\d\.]+)?.*?(safari|version[\s\/:]([\w\d\.]+)|$)/) || [null, 'unknown', 0],
-	mode = UA[1] == 'ie' && document.documentMode;
-
-var Browser = this.Browser = {
-
-	extend: Function.prototype.extend,
-
-	name: (UA[1] == 'version') ? UA[3] : UA[1],
-
-	version: mode || parseFloat((UA[1] == 'opera' && UA[4]) ? UA[4] : UA[2]),
-
-	Platform: {
-		name: ua.match(/ip(?:ad|od|hone)/) ? 'ios' : (ua.match(/(?:webos|android)/) || platform.match(/mac|win|linux/) || ['other'])[0]
-	},
-
-	Features: {
-		xpath: !!(document.evaluate),
-		air: !!(window.runtime),
-		query: !!(document.querySelector),
-		json: !!(window.JSON)
-	},
-
-	Plugins: {}
-
-};
-
-Browser[Browser.name] = true;
-Browser[Browser.name + parseInt(Browser.version, 10)] = true;
-Browser.Platform[Browser.Platform.name] = true;
-
-// Request
-
-Browser.Request = (function(){
-
-	var XMLHTTP = function(){
-		return new XMLHttpRequest();
-	};
-
-	var MSXML2 = function(){
-		return new ActiveXObject('MSXML2.XMLHTTP');
-	};
-
-	var MSXML = function(){
-		return new ActiveXObject('Microsoft.XMLHTTP');
-	};
-
-	return Function.attempt(function(){
-		XMLHTTP();
-		return XMLHTTP;
-	}, function(){
-		MSXML2();
-		return MSXML2;
-	}, function(){
-		MSXML();
-		return MSXML;
-	});
-
-})();
-
-Browser.Features.xhr = !!(Browser.Request);
-
-// Flash detection
-
-var version = (Function.attempt(function(){
-	return navigator.plugins['Shockwave Flash'].description;
-}, function(){
-	return new ActiveXObject('ShockwaveFlash.ShockwaveFlash').GetVariable('$version');
-}) || '0 r0').match(/\d+/g);
-
-Browser.Plugins.Flash = {
-	version: Number(version[0] || '0.' + version[1]) || 0,
-	build: Number(version[2]) || 0
-};
-
-// String scripts
-
-Browser.exec = function(text){
-	if (!text) return text;
-	if (window.execScript){
-		window.execScript(text);
-	} else {
-		var script = document.createElement('script');
-		script.setAttribute('type', 'text/javascript');
-		script.text = text;
-		document.head.appendChild(script);
-		document.head.removeChild(script);
-	}
-	return text;
-};
-
-String.implement('stripScripts', function(exec){
-	var scripts = '';
-	var text = this.replace(/<script[^>]*>([\s\S]*?)<\/script>/gi, function(all, code){
-		scripts += code + '\n';
-		return '';
-	});
-	if (exec === true) Browser.exec(scripts);
-	else if (typeOf(exec) == 'function') exec(scripts, text);
-	return text;
-});
-
-// Window, Document
-
-Browser.extend({
-	Document: this.Document,
-	Window: this.Window,
-	Element: this.Element,
-	Event: this.Event
-});
-
-this.Window = this.$constructor = new Type('Window', function(){});
-
-this.$family = Function.from('window').hide();
-
-Window.mirror(function(name, method){
-	window[name] = method;
-});
-
-this.Document = document.$constructor = new Type('Document', function(){});
-
-document.$family = Function.from('document').hide();
-
-Document.mirror(function(name, method){
-	document[name] = method;
-});
-
-document.html = document.documentElement;
-if (!document.head) document.head = document.getElementsByTagName('head')[0];
-
-if (document.execCommand) try {
-	document.execCommand("BackgroundImageCache", false, true);
-} catch (e){}
-
-/*<ltIE9>*/
-if (this.attachEvent && !this.addEventListener){
-	var unloadEvent = function(){
-		this.detachEvent('onunload', unloadEvent);
-		document.head = document.html = document.window = null;
-	};
-	this.attachEvent('onunload', unloadEvent);
-}
-
-// IE fails on collections and <select>.options (refers to <select>)
-var arrayFrom = Array.from;
-try {
-	arrayFrom(document.html.childNodes);
-} catch(e){
-	Array.from = function(item){
-		if (typeof item != 'string' && Type.isEnumerable(item) && typeOf(item) != 'array'){
-			var i = item.length, array = new Array(i);
-			while (i--) array[i] = item[i];
-			return array;
-		}
-		return arrayFrom(item);
-	};
-
-	var prototype = Array.prototype,
-		slice = prototype.slice;
-	['pop', 'push', 'reverse', 'shift', 'sort', 'splice', 'unshift', 'concat', 'join', 'slice'].each(function(name){
-		var method = prototype[name];
-		Array[name] = function(item){
-			return method.apply(Array.from(item), slice.call(arguments, 1));
-		};
-	});
-}
-/*</ltIE9>*/
-
-//<1.2compat>
-
-if (Browser.Platform.ios) Browser.Platform.ipod = true;
-
-Browser.Engine = {};
-
-var setEngine = function(name, version){
-	Browser.Engine.name = name;
-	Browser.Engine[name + version] = true;
-	Browser.Engine.version = version;
-};
-
-if (Browser.ie){
-	Browser.Engine.trident = true;
-
-	switch (Browser.version){
-		case 6: setEngine('trident', 4); break;
-		case 7: setEngine('trident', 5); break;
-		case 8: setEngine('trident', 6);
-	}
-}
-
-if (Browser.firefox){
-	Browser.Engine.gecko = true;
-
-	if (Browser.version >= 3) setEngine('gecko', 19);
-	else setEngine('gecko', 18);
-}
-
-if (Browser.safari || Browser.chrome){
-	Browser.Engine.webkit = true;
-
-	switch (Browser.version){
-		case 2: setEngine('webkit', 419); break;
-		case 3: setEngine('webkit', 420); break;
-		case 4: setEngine('webkit', 525);
-	}
-}
-
-if (Browser.opera){
-	Browser.Engine.presto = true;
-
-	if (Browser.version >= 9.6) setEngine('presto', 960);
-	else if (Browser.version >= 9.5) setEngine('presto', 950);
-	else setEngine('presto', 925);
-}
-
-if (Browser.name == 'unknown'){
-	switch ((ua.match(/(?:webkit|khtml|gecko)/) || [])[0]){
-		case 'webkit':
-		case 'khtml':
-			Browser.Engine.webkit = true;
-		break;
-		case 'gecko':
-			Browser.Engine.gecko = true;
-	}
-}
-
-this.$exec = Browser.exec;
-
-//</1.2compat>
-
-})();
-
-
-/*
----
-
-name: Event
-
-description: Contains the Event Class, to make the event object cross-browser.
-
-license: MIT-style license.
-
-requires: [Window, Document, Array, Function, String, Object]
-
-provides: Event
-
-...
-*/
-
-var Event = new Type('Event', function(event, win){
-	if (!win) win = window;
-	var doc = win.document;
-	event = event || win.event;
-	if (event.$extended) return event;
-	this.$extended = true;
-	var type = event.type,
-		target = event.target || event.srcElement,
-		page = {},
-		client = {},
-		related = null,
-		rightClick, wheel, code, key;
-	while (target && target.nodeType == 3) target = target.parentNode;
-
-	if (type.indexOf('key') != -1){
-		code = event.which || event.keyCode;
-		key = Object.keyOf(Event.Keys, code);
-		if (type == 'keydown'){
-			var fKey = code - 111;
-			if (fKey > 0 && fKey < 13) key = 'f' + fKey;
-		}
-		if (!key) key = String.fromCharCode(code).toLowerCase();
-	} else if ((/click|mouse|menu/i).test(type)){
-		doc = (!doc.compatMode || doc.compatMode == 'CSS1Compat') ? doc.html : doc.body;
-		page = {
-			x: (event.pageX != null) ? event.pageX : event.clientX + doc.scrollLeft,
-			y: (event.pageY != null) ? event.pageY : event.clientY + doc.scrollTop
-		};
-		client = {
-			x: (event.pageX != null) ? event.pageX - win.pageXOffset : event.clientX,
-			y: (event.pageY != null) ? event.pageY - win.pageYOffset : event.clientY
-		};
-		if ((/DOMMouseScroll|mousewheel/).test(type)){
-			wheel = (event.wheelDelta) ? event.wheelDelta / 120 : -(event.detail || 0) / 3;
-		}
-		rightClick = (event.which == 3) || (event.button == 2);
-		if ((/over|out/).test(type)){
-			related = event.relatedTarget || event[(type == 'mouseover' ? 'from' : 'to') + 'Element'];
-			var testRelated = function(){
-				while (related && related.nodeType == 3) related = related.parentNode;
-				return true;
-			};
-			var hasRelated = (Browser.firefox2) ? testRelated.attempt() : testRelated();
-			related = (hasRelated) ? related : null;
-		}
-	} else if ((/gesture|touch/i).test(type)){
-		this.rotation = event.rotation;
-		this.scale = event.scale;
-		this.targetTouches = event.targetTouches;
-		this.changedTouches = event.changedTouches;
-		var touches = this.touches = event.touches;
-		if (touches && touches[0]){
-			var touch = touches[0];
-			page = {x: touch.pageX, y: touch.pageY};
-			client = {x: touch.clientX, y: touch.clientY};
-		}
-	}
-
-	return Object.append(this, {
-		event: event,
-		type: type,
-
-		page: page,
-		client: client,
-		rightClick: rightClick,
-
-		wheel: wheel,
-
-		relatedTarget: document.id(related),
-		target: document.id(target),
-
-		code: code,
-		key: key,
-
-		shift: event.shiftKey,
-		control: event.ctrlKey,
-		alt: event.altKey,
-		meta: event.metaKey
-	});
-});
-
-Event.Keys = {
-	'enter': 13,
-	'up': 38,
-	'down': 40,
-	'left': 37,
-	'right': 39,
-	'esc': 27,
-	'space': 32,
-	'backspace': 8,
-	'tab': 9,
-	'delete': 46
-};
-
-//<1.2compat>
-
-Event.Keys = new Hash(Event.Keys);
-
-//</1.2compat>
-
-Event.implement({
-
-	stop: function(){
-		return this.stopPropagation().preventDefault();
-	},
-
-	stopPropagation: function(){
-		if (this.event.stopPropagation) this.event.stopPropagation();
-		else this.event.cancelBubble = true;
-		return this;
-	},
-
-	preventDefault: function(){
-		if (this.event.preventDefault) this.event.preventDefault();
-		else this.event.returnValue = false;
-		return this;
-	}
-
-});
-
-
-/*
----
-
-name: Class
-
-description: Contains the Class Function for easily creating, extending, and implementing reusable Classes.
-
-license: MIT-style license.
-
-requires: [Array, String, Function, Number]
-
-provides: Class
-
-...
-*/
-
-(function(){
-
-var Class = this.Class = new Type('Class', function(params){
-	if (instanceOf(params, Function)) params = {initialize: params};
-
-	var newClass = function(){
-		reset(this);
-		if (newClass.$prototyping) return this;
-		this.$caller = null;
-		var value = (this.initialize) ? this.initialize.apply(this, arguments) : this;
-		this.$caller = this.caller = null;
-		return value;
-	}.extend(this).implement(params);
-
-	newClass.$constructor = Class;
-	newClass.prototype.$constructor = newClass;
-	newClass.prototype.parent = parent;
-
-	return newClass;
-});
-
-var parent = function(){
-	if (!this.$caller) throw new Error('The method "parent" cannot be called.');
-	var name = this.$caller.$name,
-		parent = this.$caller.$owner.parent,
-		previous = (parent) ? parent.prototype[name] : null;
-	if (!previous) throw new Error('The method "' + name + '" has no parent.');
-	return previous.apply(this, arguments);
-};
-
-var reset = function(object){
-	for (var key in object){
-		var value = object[key];
-		switch (typeOf(value)){
-			case 'object':
-				var F = function(){};
-				F.prototype = value;
-				object[key] = reset(new F);
-			break;
-			case 'array': object[key] = value.clone(); break;
-		}
-	}
-	return object;
-};
-
-var wrap = function(self, key, method){
-	if (method.$origin) method = method.$origin;
-	var wrapper = function(){
-		if (method.$protected && this.$caller == null) throw new Error('The method "' + key + '" cannot be called.');
-		var caller = this.caller, current = this.$caller;
-		this.caller = current; this.$caller = wrapper;
-		var result = method.apply(this, arguments);
-		this.$caller = current; this.caller = caller;
-		return result;
-	}.extend({$owner: self, $origin: method, $name: key});
-	return wrapper;
-};
-
-var implement = function(key, value, retain){
-	if (Class.Mutators.hasOwnProperty(key)){
-		value = Class.Mutators[key].call(this, value);
-		if (value == null) return this;
-	}
-
-	if (typeOf(value) == 'function'){
-		if (value.$hidden) return this;
-		this.prototype[key] = (retain) ? value : wrap(this, key, value);
-	} else {
-		Object.merge(this.prototype, key, value);
-	}
-
-	return this;
-};
-
-var getInstance = function(klass){
-	klass.$prototyping = true;
-	var proto = new klass;
-	delete klass.$prototyping;
-	return proto;
-};
-
-Class.implement('implement', implement.overloadSetter());
-
-Class.Mutators = {
-
-	Extends: function(parent){
-		this.parent = parent;
-		this.prototype = getInstance(parent);
-	},
-
-	Implements: function(items){
-		Array.from(items).each(function(item){
-			var instance = new item;
-			for (var key in instance) implement.call(this, key, instance[key], true);
-		}, this);
-	}
-};
-
-})();
-
-
-/*
----
-
-name: Class.Extras
-
-description: Contains Utility Classes that can be implemented into your own Classes to ease the execution of many common tasks.
-
-license: MIT-style license.
-
-requires: Class
-
-provides: [Class.Extras, Chain, Events, Options]
-
-...
-*/
-
-(function(){
-
-this.Chain = new Class({
-
-	$chain: [],
-
-	chain: function(){
-		this.$chain.append(Array.flatten(arguments));
-		return this;
-	},
-
-	callChain: function(){
-		return (this.$chain.length) ? this.$chain.shift().apply(this, arguments) : false;
-	},
-
-	clearChain: function(){
-		this.$chain.empty();
-		return this;
-	}
-
-});
-
-var removeOn = function(string){
-	return string.replace(/^on([A-Z])/, function(full, first){
-		return first.toLowerCase();
-	});
-};
-
-this.Events = new Class({
-
-	$events: {},
-
-	addEvent: function(type, fn, internal){
-		type = removeOn(type);
-
-		/*<1.2compat>*/
-		if (fn == $empty) return this;
-		/*</1.2compat>*/
-
-		this.$events[type] = (this.$events[type] || []).include(fn);
-		if (internal) fn.internal = true;
-		return this;
-	},
-
-	addEvents: function(events){
-		for (var type in events) this.addEvent(type, events[type]);
-		return this;
-	},
-
-	fireEvent: function(type, args, delay){
-		type = removeOn(type);
-		var events = this.$events[type];
-		if (!events) return this;
-		args = Array.from(args);
-		events.each(function(fn){
-			if (delay) fn.delay(delay, this, args);
-			else fn.apply(this, args);
-		}, this);
-		return this;
-	},
-	
-	removeEvent: function(type, fn){
-		type = removeOn(type);
-		var events = this.$events[type];
-		if (events && !fn.internal){
-			var index =  events.indexOf(fn);
-			if (index != -1) delete events[index];
-		}
-		return this;
-	},
-
-	removeEvents: function(events){
-		var type;
-		if (typeOf(events) == 'object'){
-			for (type in events) this.removeEvent(type, events[type]);
-			return this;
-		}
-		if (events) events = removeOn(events);
-		for (type in this.$events){
-			if (events && events != type) continue;
-			var fns = this.$events[type];
-			for (var i = fns.length; i--;) if (i in fns){
-				this.removeEvent(type, fns[i]);
-			}
-		}
-		return this;
-	}
-
-});
-
-this.Options = new Class({
-
-	setOptions: function(){
-		var options = this.options = Object.merge.apply(null, [{}, this.options].append(arguments));
-		if (this.addEvent) for (var option in options){
-			if (typeOf(options[option]) != 'function' || !(/^on[A-Z]/).test(option)) continue;
-			this.addEvent(option, options[option]);
-			delete options[option];
-		}
-		return this;
-	}
-
-});
-
-})();
-
-
-/*
----
-name: Slick.Parser
-description: Standalone CSS3 Selector parser
-provides: Slick.Parser
-...
-*/
-
-(function(){
-
-var parsed,
-	separatorIndex,
-	combinatorIndex,
-	reversed,
-	cache = {},
-	reverseCache = {},
-	reUnescape = /\\/g;
-
-var parse = function(expression, isReversed){
-	if (expression == null) return null;
-	if (expression.Slick === true) return expression;
-	expression = ('' + expression).replace(/^\s+|\s+$/g, '');
-	reversed = !!isReversed;
-	var currentCache = (reversed) ? reverseCache : cache;
-	if (currentCache[expression]) return currentCache[expression];
-	parsed = {
-		Slick: true,
-		expressions: [],
-		raw: expression,
-		reverse: function(){
-			return parse(this.raw, true);
-		}
-	};
-	separatorIndex = -1;
-	while (expression != (expression = expression.replace(regexp, parser)));
-	parsed.length = parsed.expressions.length;
-	return currentCache[parsed.raw] = (reversed) ? reverse(parsed) : parsed;
-};
-
-var reverseCombinator = function(combinator){
-	if (combinator === '!') return ' ';
-	else if (combinator === ' ') return '!';
-	else if ((/^!/).test(combinator)) return combinator.replace(/^!/, '');
-	else return '!' + combinator;
-};
-
-var reverse = function(expression){
-	var expressions = expression.expressions;
-	for (var i = 0; i < expressions.length; i++){
-		var exp = expressions[i];
-		var last = {parts: [], tag: '*', combinator: reverseCombinator(exp[0].combinator)};
-
-		for (var j = 0; j < exp.length; j++){
-			var cexp = exp[j];
-			if (!cexp.reverseCombinator) cexp.reverseCombinator = ' ';
-			cexp.combinator = cexp.reverseCombinator;
-			delete cexp.reverseCombinator;
-		}
-
-		exp.reverse().push(last);
-	}
-	return expression;
-};
-
-var escapeRegExp = function(string){// Credit: XRegExp 0.6.1 (c) 2007-2008 Steven Levithan <http://stevenlevithan.com/regex/xregexp/> MIT License
-	return string.replace(/[-[\]{}()*+?.\\^$|,#\s]/g, function(match){
-		return '\\' + match;
-	});
-};
-
-var regexp = new RegExp(
-/*
-#!/usr/bin/env ruby
-puts "\t\t" + DATA.read.gsub(/\(\?x\)|\s+#.*$|\s+|\\$|\\n/,'')
-__END__
-	"(?x)^(?:\
-	  \\s* ( , ) \\s*               # Separator          \n\
-	| \\s* ( <combinator>+ ) \\s*   # Combinator         \n\
-	|      ( \\s+ )                 # CombinatorChildren \n\
-	|      ( <unicode>+ | \\* )     # Tag                \n\
-	| \\#  ( <unicode>+       )     # ID                 \n\
-	| \\.  ( <unicode>+       )     # ClassName          \n\
-	|                               # Attribute          \n\
-	\\[  \
-		\\s* (<unicode1>+)  (?:  \
-			\\s* ([*^$!~|]?=)  (?:  \
-				\\s* (?:\
-					([\"']?)(.*?)\\9 \
-				)\
-			)  \
-		)?  \\s*  \
-	\\](?!\\]) \n\
-	|   :+ ( <unicode>+ )(?:\
-	\\( (?:\
-		(?:([\"'])([^\\12]*)\\12)|((?:\\([^)]+\\)|[^()]*)+)\
-	) \\)\
-	)?\
-	)"
-*/
-	"^(?:\\s*(,)\\s*|\\s*(<combinator>+)\\s*|(\\s+)|(<unicode>+|\\*)|\\#(<unicode>+)|\\.(<unicode>+)|\\[\\s*(<unicode1>+)(?:\\s*([*^$!~|]?=)(?:\\s*(?:([\"']?)(.*?)\\9)))?\\s*\\](?!\\])|(:+)(<unicode>+)(?:\\((?:(?:([\"'])([^\\13]*)\\13)|((?:\\([^)]+\\)|[^()]*)+))\\))?)"
-	.replace(/<combinator>/, '[' + escapeRegExp(">+~`!@$%^&={}\\;</") + ']')
-	.replace(/<unicode>/g, '(?:[\\w\\u00a1-\\uFFFF-]|\\\\[^\\s0-9a-f])')
-	.replace(/<unicode1>/g, '(?:[:\\w\\u00a1-\\uFFFF-]|\\\\[^\\s0-9a-f])')
-);
-
-function parser(
-	rawMatch,
-
-	separator,
-	combinator,
-	combinatorChildren,
-
-	tagName,
-	id,
-	className,
-
-	attributeKey,
-	attributeOperator,
-	attributeQuote,
-	attributeValue,
-
-	pseudoMarker,
-	pseudoClass,
-	pseudoQuote,
-	pseudoClassQuotedValue,
-	pseudoClassValue
-){
-	if (separator || separatorIndex === -1){
-		parsed.expressions[++separatorIndex] = [];
-		combinatorIndex = -1;
-		if (separator) return '';
-	}
-
-	if (combinator || combinatorChildren || combinatorIndex === -1){
-		combinator = combinator || ' ';
-		var currentSeparator = parsed.expressions[separatorIndex];
-		if (reversed && currentSeparator[combinatorIndex])
-			currentSeparator[combinatorIndex].reverseCombinator = reverseCombinator(combinator);
-		currentSeparator[++combinatorIndex] = {combinator: combinator, tag: '*'};
-	}
-
-	var currentParsed = parsed.expressions[separatorIndex][combinatorIndex];
-
-	if (tagName){
-		currentParsed.tag = tagName.replace(reUnescape, '');
-
-	} else if (id){
-		currentParsed.id = id.replace(reUnescape, '');
-
-	} else if (className){
-		className = className.replace(reUnescape, '');
-
-		if (!currentParsed.classList) currentParsed.classList = [];
-		if (!currentParsed.classes) currentParsed.classes = [];
-		currentParsed.classList.push(className);
-		currentParsed.classes.push({
-			value: className,
-			regexp: new RegExp('(^|\\s)' + escapeRegExp(className) + '(\\s|$)')
-		});
-
-	} else if (pseudoClass){
-		pseudoClassValue = pseudoClassValue || pseudoClassQuotedValue;
-		pseudoClassValue = pseudoClassValue ? pseudoClassValue.replace(reUnescape, '') : null;
-
-		if (!currentParsed.pseudos) currentParsed.pseudos = [];
-		currentParsed.pseudos.push({
-			key: pseudoClass.replace(reUnescape, ''),
-			value: pseudoClassValue,
-			type: pseudoMarker.length == 1 ? 'class' : 'element'
-		});
-
-	} else if (attributeKey){
-		attributeKey = attributeKey.replace(reUnescape, '');
-		attributeValue = (attributeValue || '').replace(reUnescape, '');
-
-		var test, regexp;
-
-		switch (attributeOperator){
-			case '^=' : regexp = new RegExp(       '^'+ escapeRegExp(attributeValue)            ); break;
-			case '$=' : regexp = new RegExp(            escapeRegExp(attributeValue) +'$'       ); break;
-			case '~=' : regexp = new RegExp( '(^|\\s)'+ escapeRegExp(attributeValue) +'(\\s|$)' ); break;
-			case '|=' : regexp = new RegExp(       '^'+ escapeRegExp(attributeValue) +'(-|$)'   ); break;
-			case  '=' : test = function(value){
-				return attributeValue == value;
-			}; break;
-			case '*=' : test = function(value){
-				return value && value.indexOf(attributeValue) > -1;
-			}; break;
-			case '!=' : test = function(value){
-				return attributeValue != value;
-			}; break;
-			default   : test = function(value){
-				return !!value;
-			};
-		}
-
-		if (attributeValue == '' && (/^[*$^]=$/).test(attributeOperator)) test = function(){
-			return false;
-		};
-
-		if (!test) test = function(value){
-			return value && regexp.test(value);
-		};
-
-		if (!currentParsed.attributes) currentParsed.attributes = [];
-		currentParsed.attributes.push({
-			key: attributeKey,
-			operator: attributeOperator,
-			value: attributeValue,
-			test: test
-		});
-
-	}
-
-	return '';
-};
-
-// Slick NS
-
-var Slick = (this.Slick || {});
-
-Slick.parse = function(expression){
-	return parse(expression);
-};
-
-Slick.escapeRegExp = escapeRegExp;
-
-if (!this.Slick) this.Slick = Slick;
-
-}).apply(/*<CommonJS>*/(typeof exports != 'undefined') ? exports : /*</CommonJS>*/this);
-
-
-/*
----
-name: Slick.Finder
-description: The new, superfast css selector engine.
-provides: Slick.Finder
-requires: Slick.Parser
-...
-*/
-
-(function(){
-
-var local = {},
-	featuresCache = {},
-	toString = Object.prototype.toString;
-
-// Feature / Bug detection
-
-local.isNativeCode = function(fn){
-	return (/\{\s*\[native code\]\s*\}/).test('' + fn);
-};
-
-local.isXML = function(document){
-	return (!!document.xmlVersion) || (!!document.xml) || (toString.call(document) == '[object XMLDocument]') ||
-	(document.nodeType == 9 && document.documentElement.nodeName != 'HTML');
-};
-
-local.setDocument = function(document){
-
-	// convert elements / window arguments to document. if document cannot be extrapolated, the function returns.
-	var nodeType = document.nodeType;
-	if (nodeType == 9); // document
-	else if (nodeType) document = document.ownerDocument; // node
-	else if (document.navigator) document = document.document; // window
-	else return;
-
-	// check if it's the old document
-
-	if (this.document === document) return;
-	this.document = document;
-
-	// check if we have done feature detection on this document before
-
-	var root = document.documentElement,
-		rootUid = this.getUIDXML(root),
-		features = featuresCache[rootUid],
-		feature;
-
-	if (features){
-		for (feature in features){
-			this[feature] = features[feature];
-		}
-		return;
-	}
-
-	features = featuresCache[rootUid] = {};
-
-	features.root = root;
-	features.isXMLDocument = this.isXML(document);
-
-	features.brokenStarGEBTN
-	= features.starSelectsClosedQSA
-	= features.idGetsName
-	= features.brokenMixedCaseQSA
-	= features.brokenGEBCN
-	= features.brokenCheckedQSA
-	= features.brokenEmptyAttributeQSA
-	= features.isHTMLDocument
-	= features.nativeMatchesSelector
-	= false;
-
-	var starSelectsClosed, starSelectsComments,
-		brokenSecondClassNameGEBCN, cachedGetElementsByClassName,
-		brokenFormAttributeGetter;
-
-	var selected, id = 'slick_uniqueid';
-	var testNode = document.createElement('div');
-
-	var testRoot = document.body || document.getElementsByTagName('body')[0] || root;
-	testRoot.appendChild(testNode);
-
-	// on non-HTML documents innerHTML and getElementsById doesnt work properly
-	try {
-		testNode.innerHTML = '<a id="'+id+'"></a>';
-		features.isHTMLDocument = !!document.getElementById(id);
-	} catch(e){};
-
-	if (features.isHTMLDocument){
-
-		testNode.style.display = 'none';
-
-		// IE returns comment nodes for getElementsByTagName('*') for some documents
-		testNode.appendChild(document.createComment(''));
-		starSelectsComments = (testNode.getElementsByTagName('*').length > 1);
-
-		// IE returns closed nodes (EG:"</foo>") for getElementsByTagName('*') for some documents
-		try {
-			testNode.innerHTML = 'foo</foo>';
-			selected = testNode.getElementsByTagName('*');
-			starSelectsClosed = (selected && !!selected.length && selected[0].nodeName.charAt(0) == '/');
-		} catch(e){};
-
-		features.brokenStarGEBTN = starSelectsComments || starSelectsClosed;
-
-		// IE returns elements with the name instead of just id for getElementsById for some documents
-		try {
-			testNode.innerHTML = '<a name="'+ id +'"></a><b id="'+ id +'"></b>';
-			features.idGetsName = document.getElementById(id) === testNode.firstChild;
-		} catch(e){};
-
-		if (testNode.getElementsByClassName){
-
-			// Safari 3.2 getElementsByClassName caches results
-			try {
-				testNode.innerHTML = '<a class="f"></a><a class="b"></a>';
-				testNode.getElementsByClassName('b').length;
-				testNode.firstChild.className = 'b';
-				cachedGetElementsByClassName = (testNode.getElementsByClassName('b').length != 2);
-			} catch(e){};
-
-			// Opera 9.6 getElementsByClassName doesnt detects the class if its not the first one
-			try {
-				testNode.innerHTML = '<a class="a"></a><a class="f b a"></a>';
-				brokenSecondClassNameGEBCN = (testNode.getElementsByClassName('a').length != 2);
-			} catch(e){};
-
-			features.brokenGEBCN = cachedGetElementsByClassName || brokenSecondClassNameGEBCN;
-		}
-
-		if (testNode.querySelectorAll){
-			// IE 8 returns closed nodes (EG:"</foo>") for querySelectorAll('*') for some documents
-			try {
-				testNode.innerHTML = 'foo</foo>';
-				selected = testNode.querySelectorAll('*');
-				features.starSelectsClosedQSA = (selected && !!selected.length && selected[0].nodeName.charAt(0) == '/');
-			} catch(e){};
-
-			// Safari 3.2 querySelectorAll doesnt work with mixedcase on quirksmode
-			try {
-				testNode.innerHTML = '<a class="MiX"></a>';
-				features.brokenMixedCaseQSA = !testNode.querySelectorAll('.MiX').length;
-			} catch(e){};
-
-			// Webkit and Opera dont return selected options on querySelectorAll
-			try {
-				testNode.innerHTML = '<select><option selected="selected">a</option></select>';
-				features.brokenCheckedQSA = (testNode.querySelectorAll(':checked').length == 0);
-			} catch(e){};
-
-			// IE returns incorrect results for attr[*^$]="" selectors on querySelectorAll
-			try {
-				testNode.innerHTML = '<a class=""></a>';
-				features.brokenEmptyAttributeQSA = (testNode.querySelectorAll('[class*=""]').length != 0);
-			} catch(e){};
-
-		}
-
-		// IE6-7, if a form has an input of id x, form.getAttribute(x) returns a reference to the input
-		try {
-			testNode.innerHTML = '<form action="s"><input id="action"/></form>';
-			brokenFormAttributeGetter = (testNode.firstChild.getAttribute('action') != 's');
-		} catch(e){};
-
-		// native matchesSelector function
-
-		features.nativeMatchesSelector = root.matchesSelector || /*root.msMatchesSelector ||*/ root.mozMatchesSelector || root.webkitMatchesSelector;
-		if (features.nativeMatchesSelector) try {
-			// if matchesSelector trows errors on incorrect sintaxes we can use it
-			features.nativeMatchesSelector.call(root, ':slick');
-			features.nativeMatchesSelector = null;
-		} catch(e){};
-
-	}
-
-	try {
-		root.slick_expando = 1;
-		delete root.slick_expando;
-		features.getUID = this.getUIDHTML;
-	} catch(e) {
-		features.getUID = this.getUIDXML;
-	}
-
-	testRoot.removeChild(testNode);
-	testNode = selected = testRoot = null;
-
-	// getAttribute
-
-	features.getAttribute = (features.isHTMLDocument && brokenFormAttributeGetter) ? function(node, name){
-		var method = this.attributeGetters[name];
-		if (method) return method.call(node);
-		var attributeNode = node.getAttributeNode(name);
-		return (attributeNode) ? attributeNode.nodeValue : null;
-	} : function(node, name){
-		var method = this.attributeGetters[name];
-		return (method) ? method.call(node) : node.getAttribute(name);
-	};
-
-	// hasAttribute
-
-	features.hasAttribute = (root && this.isNativeCode(root.hasAttribute)) ? function(node, attribute) {
-		return node.hasAttribute(attribute);
-	} : function(node, attribute) {
-		node = node.getAttributeNode(attribute);
-		return !!(node && (node.specified || node.nodeValue));
-	};
-
-	// contains
-	// FIXME: Add specs: local.contains should be different for xml and html documents?
-	features.contains = (root && this.isNativeCode(root.contains)) ? function(context, node){
-		return context.contains(node);
-	} : (root && root.compareDocumentPosition) ? function(context, node){
-		return context === node || !!(context.compareDocumentPosition(node) & 16);
-	} : function(context, node){
-		if (node) do {
-			if (node === context) return true;
-		} while ((node = node.parentNode));
-		return false;
-	};
-
-	// document order sorting
-	// credits to Sizzle (http://sizzlejs.com/)
-
-	features.documentSorter = (root.compareDocumentPosition) ? function(a, b){
-		if (!a.compareDocumentPosition || !b.compareDocumentPosition) return 0;
-		return a.compareDocumentPosition(b) & 4 ? -1 : a === b ? 0 : 1;
-	} : ('sourceIndex' in root) ? function(a, b){
-		if (!a.sourceIndex || !b.sourceIndex) return 0;
-		return a.sourceIndex - b.sourceIndex;
-	} : (document.createRange) ? function(a, b){
-		if (!a.ownerDocument || !b.ownerDocument) return 0;
-		var aRange = a.ownerDocument.createRange(), bRange = b.ownerDocument.createRange();
-		aRange.setStart(a, 0);
-		aRange.setEnd(a, 0);
-		bRange.setStart(b, 0);
-		bRange.setEnd(b, 0);
-		return aRange.compareBoundaryPoints(Range.START_TO_END, bRange);
-	} : null ;
-
-	root = null;
-
-	for (feature in features){
-		this[feature] = features[feature];
-	}
-};
-
-// Main Method
-
-var reSimpleSelector = /^([#.]?)((?:[\w-]+|\*))$/,
-	reEmptyAttribute = /\[.+[*$^]=(?:""|'')?\]/,
-	qsaFailExpCache = {};
-
-local.search = function(context, expression, append, first){
-
-	var found = this.found = (first) ? null : (append || []);
-
-	if (!context) return found;
-	else if (context.navigator) context = context.document; // Convert the node from a window to a document
-	else if (!context.nodeType) return found;
-
-	// setup
-
-	var parsed, i,
-		uniques = this.uniques = {},
-		hasOthers = !!(append && append.length),
-		contextIsDocument = (context.nodeType == 9);
-
-	if (this.document !== (contextIsDocument ? context : context.ownerDocument)) this.setDocument(context);
-
-	// avoid duplicating items already in the append array
-	if (hasOthers) for (i = found.length; i--;) uniques[this.getUID(found[i])] = true;
-
-	// expression checks
-
-	if (typeof expression == 'string'){ // expression is a string
-
-		/*<simple-selectors-override>*/
-		var simpleSelector = expression.match(reSimpleSelector);
-		simpleSelectors: if (simpleSelector) {
-
-			var symbol = simpleSelector[1],
-				name = simpleSelector[2],
-				node, nodes;
-
-			if (!symbol){
-
-				if (name == '*' && this.brokenStarGEBTN) break simpleSelectors;
-				nodes = context.getElementsByTagName(name);
-				if (first) return nodes[0] || null;
-				for (i = 0; node = nodes[i++];){
-					if (!(hasOthers && uniques[this.getUID(node)])) found.push(node);
-				}
-
-			} else if (symbol == '#'){
-
-				if (!this.isHTMLDocument || !contextIsDocument) break simpleSelectors;
-				node = context.getElementById(name);
-				if (!node) return found;
-				if (this.idGetsName && node.getAttributeNode('id').nodeValue != name) break simpleSelectors;
-				if (first) return node || null;
-				if (!(hasOthers && uniques[this.getUID(node)])) found.push(node);
-
-			} else if (symbol == '.'){
-
-				if (!this.isHTMLDocument || ((!context.getElementsByClassName || this.brokenGEBCN) && context.querySelectorAll)) break simpleSelectors;
-				if (context.getElementsByClassName && !this.brokenGEBCN){
-					nodes = context.getElementsByClassName(name);
-					if (first) return nodes[0] || null;
-					for (i = 0; node = nodes[i++];){
-						if (!(hasOthers && uniques[this.getUID(node)])) found.push(node);
-					}
-				} else {
-					var matchClass = new RegExp('(^|\\s)'+ Slick.escapeRegExp(name) +'(\\s|$)');
-					nodes = context.getElementsByTagName('*');
-					for (i = 0; node = nodes[i++];){
-						className = node.className;
-						if (!(className && matchClass.test(className))) continue;
-						if (first) return node;
-						if (!(hasOthers && uniques[this.getUID(node)])) found.push(node);
-					}
-				}
-
-			}
-
-			if (hasOthers) this.sort(found);
-			return (first) ? null : found;
-
-		}
-		/*</simple-selectors-override>*/
-
-		/*<query-selector-override>*/
-		querySelector: if (context.querySelectorAll) {
-
-			if (!this.isHTMLDocument
-				|| qsaFailExpCache[expression]
-				//TODO: only skip when expression is actually mixed case
-				|| this.brokenMixedCaseQSA
-				|| (this.brokenCheckedQSA && expression.indexOf(':checked') > -1)
-				|| (this.brokenEmptyAttributeQSA && reEmptyAttribute.test(expression))
-				|| (!contextIsDocument //Abort when !contextIsDocument and...
-					//  there are multiple expressions in the selector
-					//  since we currently only fix non-document rooted QSA for single expression selectors
-					&& expression.indexOf(',') > -1
-				)
-				|| Slick.disableQSA
-			) break querySelector;
-
-			var _expression = expression, _context = context;
-			if (!contextIsDocument){
-				// non-document rooted QSA
-				// credits to Andrew Dupont
-				var currentId = _context.getAttribute('id'), slickid = 'slickid__';
-				_context.setAttribute('id', slickid);
-				_expression = '#' + slickid + ' ' + _expression;
-				context = _context.parentNode;
-			}
-
-			try {
-				if (context == null) {
-					qsaFailExpCache[expression] = 1;
-					break querySelector;
-				}
-				else if (first) return context.querySelector(_expression) || null;
-				else nodes = context.querySelectorAll(_expression);
-			} catch(e) {
-				qsaFailExpCache[expression] = 1;
-				break querySelector;
-			} finally {
-				if (!contextIsDocument){
-					if (currentId) _context.setAttribute('id', currentId);
-					else _context.removeAttribute('id');
-					context = _context;
-				}
-			}
-
-			if (this.starSelectsClosedQSA) for (i = 0; node = nodes[i++];){
-				if (node.nodeName > '@' && !(hasOthers && uniques[this.getUID(node)])) found.push(node);
-			} else for (i = 0; node = nodes[i++];){
-				if (!(hasOthers && uniques[this.getUID(node)])) found.push(node);
-			}
-
-			if (hasOthers) this.sort(found);
-			return found;
-
-		}
-		/*</query-selector-override>*/
-
-		parsed = this.Slick.parse(expression);
-		if (!parsed.length) return found;
-	} else if (expression == null){ // there is no expression
-		return found;
-	} else if (expression.Slick){ // expression is a parsed Slick object
-		parsed = expression;
-	} else if (this.contains(context.documentElement || context, expression)){ // expression is a node
-		(found) ? found.push(expression) : found = expression;
-		return found;
-	} else { // other junk
-		return found;
-	}
-
-	/*<pseudo-selectors>*//*<nth-pseudo-selectors>*/
-
-	// cache elements for the nth selectors
-
-	this.posNTH = {};
-	this.posNTHLast = {};
-	this.posNTHType = {};
-	this.posNTHTypeLast = {};
-
-	/*</nth-pseudo-selectors>*//*</pseudo-selectors>*/
-
-	// if append is null and there is only a single selector with one expression use pushArray, else use pushUID
-	this.push = (!hasOthers && (first || (parsed.length == 1 && parsed.expressions[0].length == 1))) ? this.pushArray : this.pushUID;
-
-	if (found == null) found = [];
-
-	// default engine
-
-	var j, m, n;
-	var combinator, tag, id, classList, classes, attributes, pseudos;
-	var currentItems, currentExpression, currentBit, lastBit, expressions = parsed.expressions;
-
-	search: for (i = 0; (currentExpression = expressions[i]); i++) for (j = 0; (currentBit = currentExpression[j]); j++){
-
-		combinator = 'combinator:' + currentBit.combinator;
-		if (!this[combinator]) continue search;
-
-		tag        = (this.isXMLDocument) ? currentBit.tag : currentBit.tag.toUpperCase();
-		id         = currentBit.id;
-		classList  = currentBit.classList;
-		classes    = currentBit.classes;
-		attributes = currentBit.attributes;
-		pseudos    = currentBit.pseudos;
-		lastBit    = (j === (currentExpression.length - 1));
-
-		this.bitUniques = {};
-
-		if (lastBit){
-			this.uniques = uniques;
-			this.found = found;
-		} else {
-			this.uniques = {};
-			this.found = [];
-		}
-
-		if (j === 0){
-			this[combinator](context, tag, id, classes, attributes, pseudos, classList);
-			if (first && lastBit && found.length) break search;
-		} else {
-			if (first && lastBit) for (m = 0, n = currentItems.length; m < n; m++){
-				this[combinator](currentItems[m], tag, id, classes, attributes, pseudos, classList);
-				if (found.length) break search;
-			} else for (m = 0, n = currentItems.length; m < n; m++) this[combinator](currentItems[m], tag, id, classes, attributes, pseudos, classList);
-		}
-
-		currentItems = this.found;
-	}
-
-	// should sort if there are nodes in append and if you pass multiple expressions.
-	if (hasOthers || (parsed.expressions.length > 1)) this.sort(found);
-
-	return (first) ? (found[0] || null) : found;
-};
-
-// Utils
-
-local.uidx = 1;
-local.uidk = 'slick-uniqueid';
-
-local.getUIDXML = function(node){
-	var uid = node.getAttribute(this.uidk);
-	if (!uid){
-		uid = this.uidx++;
-		node.setAttribute(this.uidk, uid);
-	}
-	return uid;
-};
-
-local.getUIDHTML = function(node){
-	return node.uniqueNumber || (node.uniqueNumber = this.uidx++);
-};
-
-// sort based on the setDocument documentSorter method.
-
-local.sort = function(results){
-	if (!this.documentSorter) return results;
-	results.sort(this.documentSorter);
-	return results;
-};
-
-/*<pseudo-selectors>*//*<nth-pseudo-selectors>*/
-
-local.cacheNTH = {};
-
-local.matchNTH = /^([+-]?\d*)?([a-z]+)?([+-]\d+)?$/;
-
-local.parseNTHArgument = function(argument){
-	var parsed = argument.match(this.matchNTH);
-	if (!parsed) return false;
-	var special = parsed[2] || false;
-	var a = parsed[1] || 1;
-	if (a == '-') a = -1;
-	var b = +parsed[3] || 0;
-	parsed =
-		(special == 'n')	? {a: a, b: b} :
-		(special == 'odd')	? {a: 2, b: 1} :
-		(special == 'even')	? {a: 2, b: 0} : {a: 0, b: a};
-
-	return (this.cacheNTH[argument] = parsed);
-};
-
-local.createNTHPseudo = function(child, sibling, positions, ofType){
-	return function(node, argument){
-		var uid = this.getUID(node);
-		if (!this[positions][uid]){
-			var parent = node.parentNode;
-			if (!parent) return false;
-			var el = parent[child], count = 1;
-			if (ofType){
-				var nodeName = node.nodeName;
-				do {
-					if (el.nodeName != nodeName) continue;
-					this[positions][this.getUID(el)] = count++;
-				} while ((el = el[sibling]));
-			} else {
-				do {
-					if (el.nodeType != 1) continue;
-					this[positions][this.getUID(el)] = count++;
-				} while ((el = el[sibling]));
-			}
-		}
-		argument = argument || 'n';
-		var parsed = this.cacheNTH[argument] || this.parseNTHArgument(argument);
-		if (!parsed) return false;
-		var a = parsed.a, b = parsed.b, pos = this[positions][uid];
-		if (a == 0) return b == pos;
-		if (a > 0){
-			if (pos < b) return false;
-		} else {
-			if (b < pos) return false;
-		}
-		return ((pos - b) % a) == 0;
-	};
-};
-
-/*</nth-pseudo-selectors>*//*</pseudo-selectors>*/
-
-local.pushArray = function(node, tag, id, classes, attributes, pseudos){
-	if (this.matchSelector(node, tag, id, classes, attributes, pseudos)) this.found.push(node);
-};
-
-local.pushUID = function(node, tag, id, classes, attributes, pseudos){
-	var uid = this.getUID(node);
-	if (!this.uniques[uid] && this.matchSelector(node, tag, id, classes, attributes, pseudos)){
-		this.uniques[uid] = true;
-		this.found.push(node);
-	}
-};
-
-local.matchNode = function(node, selector){
-	if (this.isHTMLDocument && this.nativeMatchesSelector){
-		try {
-			return this.nativeMatchesSelector.call(node, selector.replace(/\[([^=]+)=\s*([^'"\]]+?)\s*\]/g, '[$1="$2"]'));
-		} catch(matchError) {}
-	}
-
-	var parsed = this.Slick.parse(selector);
-	if (!parsed) return true;
-
-	// simple (single) selectors
-	var expressions = parsed.expressions, reversedExpressions, simpleExpCounter = 0, i;
-	for (i = 0; (currentExpression = expressions[i]); i++){
-		if (currentExpression.length == 1){
-			var exp = currentExpression[0];
-			if (this.matchSelector(node, (this.isXMLDocument) ? exp.tag : exp.tag.toUpperCase(), exp.id, exp.classes, exp.attributes, exp.pseudos)) return true;
-			simpleExpCounter++;
-		}
-	}
-
-	if (simpleExpCounter == parsed.length) return false;
-
-	var nodes = this.search(this.document, parsed), item;
-	for (i = 0; item = nodes[i++];){
-		if (item === node) return true;
-	}
-	return false;
-};
-
-local.matchPseudo = function(node, name, argument){
-	var pseudoName = 'pseudo:' + name;
-	if (this[pseudoName]) return this[pseudoName](node, argument);
-	var attribute = this.getAttribute(node, name);
-	return (argument) ? argument == attribute : !!attribute;
-};
-
-local.matchSelector = function(node, tag, id, classes, attributes, pseudos){
-	if (tag){
-		var nodeName = (this.isXMLDocument) ? node.nodeName : node.nodeName.toUpperCase();
-		if (tag == '*'){
-			if (nodeName < '@') return false; // Fix for comment nodes and closed nodes
-		} else {
-			if (nodeName != tag) return false;
-		}
-	}
-
-	if (id && node.getAttribute('id') != id) return false;
-
-	var i, part, cls;
-	if (classes) for (i = classes.length; i--;){
-		cls = node.getAttribute('class') || node.className;
-		if (!(cls && classes[i].regexp.test(cls))) return false;
-	}
-	if (attributes) for (i = attributes.length; i--;){
-		part = attributes[i];
-		if (part.operator ? !part.test(this.getAttribute(node, part.key)) : !this.hasAttribute(node, part.key)) return false;
-	}
-	if (pseudos) for (i = pseudos.length; i--;){
-		part = pseudos[i];
-		if (!this.matchPseudo(node, part.key, part.value)) return false;
-	}
-	return true;
-};
-
-var combinators = {
-
-	' ': function(node, tag, id, classes, attributes, pseudos, classList){ // all child nodes, any level
-
-		var i, item, children;
-
-		if (this.isHTMLDocument){
-			getById: if (id){
-				item = this.document.getElementById(id);
-				if ((!item && node.all) || (this.idGetsName && item && item.getAttributeNode('id').nodeValue != id)){
-					// all[id] returns all the elements with that name or id inside node
-					// if theres just one it will return the element, else it will be a collection
-					children = node.all[id];
-					if (!children) return;
-					if (!children[0]) children = [children];
-					for (i = 0; item = children[i++];){
-						var idNode = item.getAttributeNode('id');
-						if (idNode && idNode.nodeValue == id){
-							this.push(item, tag, null, classes, attributes, pseudos);
-							break;
-						}
-					}
-					return;
-				}
-				if (!item){
-					// if the context is in the dom we return, else we will try GEBTN, breaking the getById label
-					if (this.contains(this.root, node)) return;
-					else break getById;
-				} else if (this.document !== node && !this.contains(node, item)) return;
-				this.push(item, tag, null, classes, attributes, pseudos);
-				return;
-			}
-			getByClass: if (classes && node.getElementsByClassName && !this.brokenGEBCN){
-				children = node.getElementsByClassName(classList.join(' '));
-				if (!(children && children.length)) break getByClass;
-				for (i = 0; item = children[i++];) this.push(item, tag, id, null, attributes, pseudos);
-				return;
-			}
-		}
-		getByTag: {
-			children = node.getElementsByTagName(tag);
-			if (!(children && children.length)) break getByTag;
-			if (!this.brokenStarGEBTN) tag = null;
-			for (i = 0; item = children[i++];) this.push(item, tag, id, classes, attributes, pseudos);
-		}
-	},
-
-	'>': function(node, tag, id, classes, attributes, pseudos){ // direct children
-		if ((node = node.firstChild)) do {
-			if (node.nodeType == 1) this.push(node, tag, id, classes, attributes, pseudos);
-		} while ((node = node.nextSibling));
-	},
-
-	'+': function(node, tag, id, classes, attributes, pseudos){ // next sibling
-		while ((node = node.nextSibling)) if (node.nodeType == 1){
-			this.push(node, tag, id, classes, attributes, pseudos);
-			break;
-		}
-	},
-
-	'^': function(node, tag, id, classes, attributes, pseudos){ // first child
-		node = node.firstChild;
-		if (node){
-			if (node.nodeType == 1) this.push(node, tag, id, classes, attributes, pseudos);
-			else this['combinator:+'](node, tag, id, classes, attributes, pseudos);
-		}
-	},
-
-	'~': function(node, tag, id, classes, attributes, pseudos){ // next siblings
-		while ((node = node.nextSibling)){
-			if (node.nodeType != 1) continue;
-			var uid = this.getUID(node);
-			if (this.bitUniques[uid]) break;
-			this.bitUniques[uid] = true;
-			this.push(node, tag, id, classes, attributes, pseudos);
-		}
-	},
-
-	'++': function(node, tag, id, classes, attributes, pseudos){ // next sibling and previous sibling
-		this['combinator:+'](node, tag, id, classes, attributes, pseudos);
-		this['combinator:!+'](node, tag, id, classes, attributes, pseudos);
-	},
-
-	'~~': function(node, tag, id, classes, attributes, pseudos){ // next siblings and previous siblings
-		this['combinator:~'](node, tag, id, classes, attributes, pseudos);
-		this['combinator:!~'](node, tag, id, classes, attributes, pseudos);
-	},
-
-	'!': function(node, tag, id, classes, attributes, pseudos){ // all parent nodes up to document
-		while ((node = node.parentNode)) if (node !== this.document) this.push(node, tag, id, classes, attributes, pseudos);
-	},
-
-	'!>': function(node, tag, id, classes, attributes, pseudos){ // direct parent (one level)
-		node = node.parentNode;
-		if (node !== this.document) this.push(node, tag, id, classes, attributes, pseudos);
-	},
-
-	'!+': function(node, tag, id, classes, attributes, pseudos){ // previous sibling
-		while ((node = node.previousSibling)) if (node.nodeType == 1){
-			this.push(node, tag, id, classes, attributes, pseudos);
-			break;
-		}
-	},
-
-	'!^': function(node, tag, id, classes, attributes, pseudos){ // last child
-		node = node.lastChild;
-		if (node){
-			if (node.nodeType == 1) this.push(node, tag, id, classes, attributes, pseudos);
-			else this['combinator:!+'](node, tag, id, classes, attributes, pseudos);
-		}
-	},
-
-	'!~': function(node, tag, id, classes, attributes, pseudos){ // previous siblings
-		while ((node = node.previousSibling)){
-			if (node.nodeType != 1) continue;
-			var uid = this.getUID(node);
-			if (this.bitUniques[uid]) break;
-			this.bitUniques[uid] = true;
-			this.push(node, tag, id, classes, attributes, pseudos);
-		}
-	}
-
-};
-
-for (var c in combinators) local['combinator:' + c] = combinators[c];
-
-var pseudos = {
-
-	/*<pseudo-selectors>*/
-
-	'empty': function(node){
-		var child = node.firstChild;
-		return !(child && child.nodeType == 1) && !(node.innerText || node.textContent || '').length;
-	},
-
-	'not': function(node, expression){
-		return !this.matchNode(node, expression);
-	},
-
-	'contains': function(node, text){
-		return (node.innerText || node.textContent || '').indexOf(text) > -1;
-	},
-
-	'first-child': function(node){
-		while ((node = node.previousSibling)) if (node.nodeType == 1) return false;
-		return true;
-	},
-
-	'last-child': function(node){
-		while ((node = node.nextSibling)) if (node.nodeType == 1) return false;
-		return true;
-	},
-
-	'only-child': function(node){
-		var prev = node;
-		while ((prev = prev.previousSibling)) if (prev.nodeType == 1) return false;
-		var next = node;
-		while ((next = next.nextSibling)) if (next.nodeType == 1) return false;
-		return true;
-	},
-
-	/*<nth-pseudo-selectors>*/
-
-	'nth-child': local.createNTHPseudo('firstChild', 'nextSibling', 'posNTH'),
-
-	'nth-last-child': local.createNTHPseudo('lastChild', 'previousSibling', 'posNTHLast'),
-
-	'nth-of-type': local.createNTHPseudo('firstChild', 'nextSibling', 'posNTHType', true),
-
-	'nth-last-of-type': local.createNTHPseudo('lastChild', 'previousSibling', 'posNTHTypeLast', true),
-
-	'index': function(node, index){
-		return this['pseudo:nth-child'](node, '' + index + 1);
-	},
-
-	'even': function(node){
-		return this['pseudo:nth-child'](node, '2n');
-	},
-
-	'odd': function(node){
-		return this['pseudo:nth-child'](node, '2n+1');
-	},
-
-	/*</nth-pseudo-selectors>*/
-
-	/*<of-type-pseudo-selectors>*/
-
-	'first-of-type': function(node){
-		var nodeName = node.nodeName;
-		while ((node = node.previousSibling)) if (node.nodeName == nodeName) return false;
-		return true;
-	},
-
-	'last-of-type': function(node){
-		var nodeName = node.nodeName;
-		while ((node = node.nextSibling)) if (node.nodeName == nodeName) return false;
-		return true;
-	},
-
-	'only-of-type': function(node){
-		var prev = node, nodeName = node.nodeName;
-		while ((prev = prev.previousSibling)) if (prev.nodeName == nodeName) return false;
-		var next = node;
-		while ((next = next.nextSibling)) if (next.nodeName == nodeName) return false;
-		return true;
-	},
-
-	/*</of-type-pseudo-selectors>*/
-
-	// custom pseudos
-
-	'enabled': function(node){
-		return !node.disabled;
-	},
-
-	'disabled': function(node){
-		return node.disabled;
-	},
-
-	'checked': function(node){
-		return node.checked || node.selected;
-	},
-
-	'focus': function(node){
-		return this.isHTMLDocument && this.document.activeElement === node && (node.href || node.type || this.hasAttribute(node, 'tabindex'));
-	},
-
-	'root': function(node){
-		return (node === this.root);
-	},
-
-	'selected': function(node){
-		return node.selected;
-	}
-
-	/*</pseudo-selectors>*/
-};
-
-for (var p in pseudos) local['pseudo:' + p] = pseudos[p];
-
-// attributes methods
-
-local.attributeGetters = {
-
-	'class': function(){
-		return this.getAttribute('class') || this.className;
-	},
-
-	'for': function(){
-		return ('htmlFor' in this) ? this.htmlFor : this.getAttribute('for');
-	},
-
-	'href': function(){
-		return ('href' in this) ? this.getAttribute('href', 2) : this.getAttribute('href');
-	},
-
-	'style': function(){
-		return (this.style) ? this.style.cssText : this.getAttribute('style');
-	},
-
-	'tabindex': function(){
-		var attributeNode = this.getAttributeNode('tabindex');
-		return (attributeNode && attributeNode.specified) ? attributeNode.nodeValue : null;
-	},
-
-	'type': function(){
-		return this.getAttribute('type');
-	}
-
-};
-
-// Slick
-
-var Slick = local.Slick = (this.Slick || {});
-
-Slick.version = '1.1.5';
-
-// Slick finder
-
-Slick.search = function(context, expression, append){
-	return local.search(context, expression, append);
-};
-
-Slick.find = function(context, expression){
-	return local.search(context, expression, null, true);
-};
-
-// Slick containment checker
-
-Slick.contains = function(container, node){
-	local.setDocument(container);
-	return local.contains(container, node);
-};
-
-// Slick attribute getter
-
-Slick.getAttribute = function(node, name){
-	return local.getAttribute(node, name);
-};
-
-// Slick matcher
-
-Slick.match = function(node, selector){
-	if (!(node && selector)) return false;
-	if (!selector || selector === node) return true;
-	local.setDocument(node);
-	return local.matchNode(node, selector);
-};
-
-// Slick attribute accessor
-
-Slick.defineAttributeGetter = function(name, fn){
-	local.attributeGetters[name] = fn;
-	return this;
-};
-
-Slick.lookupAttributeGetter = function(name){
-	return local.attributeGetters[name];
-};
-
-// Slick pseudo accessor
-
-Slick.definePseudo = function(name, fn){
-	local['pseudo:' + name] = function(node, argument){
-		return fn.call(node, argument);
-	};
-	return this;
-};
-
-Slick.lookupPseudo = function(name){
-	var pseudo = local['pseudo:' + name];
-	if (pseudo) return function(argument){
-		return pseudo.call(this, argument);
-	};
-	return null;
-};
-
-// Slick overrides accessor
-
-Slick.override = function(regexp, fn){
-	local.override(regexp, fn);
-	return this;
-};
-
-Slick.isXML = local.isXML;
-
-Slick.uidOf = function(node){
-	return local.getUIDHTML(node);
-};
-
-if (!this.Slick) this.Slick = Slick;
-
-}).apply(/*<CommonJS>*/(typeof exports != 'undefined') ? exports : /*</CommonJS>*/this);
-
-
-/*
----
-
-name: Element
-
-description: One of the most important items in MooTools. Contains the dollar function, the dollars function, and an handful of cross-browser, time-saver methods to let you easily work with HTML Elements.
-
-license: MIT-style license.
-
-requires: [Window, Document, Array, String, Function, Number, Slick.Parser, Slick.Finder]
-
-provides: [Element, Elements, $, $$, Iframe, Selectors]
-
-...
-*/
-
-var Element = function(tag, props){
-	var konstructor = Element.Constructors[tag];
-	if (konstructor) return konstructor(props);
-	if (typeof tag != 'string') return document.id(tag).set(props);
-
-	if (!props) props = {};
-
-	if (!(/^[\w-]+$/).test(tag)){
-		var parsed = Slick.parse(tag).expressions[0][0];
-		tag = (parsed.tag == '*') ? 'div' : parsed.tag;
-		if (parsed.id && props.id == null) props.id = parsed.id;
-
-		var attributes = parsed.attributes;
-		if (attributes) for (var i = 0, l = attributes.length; i < l; i++){
-			var attr = attributes[i];
-			if (props[attr.key] != null) continue;
-
-			if (attr.value != null && attr.operator == '=') props[attr.key] = attr.value;
-			else if (!attr.value && !attr.operator) props[attr.key] = true;
-		}
-
-		if (parsed.classList && props['class'] == null) props['class'] = parsed.classList.join(' ');
-	}
-
-	return document.newElement(tag, props);
-};
-
-if (Browser.Element) Element.prototype = Browser.Element.prototype;
-
-new Type('Element', Element).mirror(function(name){
-	if (Array.prototype[name]) return;
-
-	var obj = {};
-	obj[name] = function(){
-		var results = [], args = arguments, elements = true;
-		for (var i = 0, l = this.length; i < l; i++){
-			var element = this[i], result = results[i] = element[name].apply(element, args);
-			elements = (elements && typeOf(result) == 'element');
-		}
-		return (elements) ? new Elements(results) : results;
-	};
-
-	Elements.implement(obj);
-});
-
-if (!Browser.Element){
-	Element.parent = Object;
-
-	Element.Prototype = {'$family': Function.from('element').hide()};
-
-	Element.mirror(function(name, method){
-		Element.Prototype[name] = method;
-	});
-}
-
-Element.Constructors = {};
-
-//<1.2compat>
-
-Element.Constructors = new Hash;
-
-//</1.2compat>
-
-var IFrame = new Type('IFrame', function(){
-	var params = Array.link(arguments, {
-		properties: Type.isObject,
-		iframe: function(obj){
-			return (obj != null);
-		}
-	});
-
-	var props = params.properties || {}, iframe;
-	if (params.iframe) iframe = document.id(params.iframe);
-	var onload = props.onload || function(){};
-	delete props.onload;
-	props.id = props.name = [props.id, props.name, iframe ? (iframe.id || iframe.name) : 'IFrame_' + String.uniqueID()].pick();
-	iframe = new Element(iframe || 'iframe', props);
-
-	var onLoad = function(){
-		onload.call(iframe.contentWindow);
-	};
-
-	if (window.frames[props.id]) onLoad();
-	else iframe.addListener('load', onLoad);
-	return iframe;
-});
-
-var Elements = this.Elements = function(nodes){
-	if (nodes && nodes.length){
-		var uniques = {}, node;
-		for (var i = 0; node = nodes[i++];){
-			var uid = Slick.uidOf(node);
-			if (!uniques[uid]){
-				uniques[uid] = true;
-				this.push(node);
-			}
-		}
-	}
-};
-
-Elements.prototype = {length: 0};
-Elements.parent = Array;
-
-new Type('Elements', Elements).implement({
-
-	filter: function(filter, bind){
-		if (!filter) return this;
-		return new Elements(Array.filter(this, (typeOf(filter) == 'string') ? function(item){
-			return item.match(filter);
-		} : filter, bind));
-	}.protect(),
-
-	push: function(){
-		var length = this.length;
-		for (var i = 0, l = arguments.length; i < l; i++){
-			var item = document.id(arguments[i]);
-			if (item) this[length++] = item;
-		}
-		return (this.length = length);
-	}.protect(),
-
-	unshift: function(){
-		var items = [];
-		for (var i = 0, l = arguments.length; i < l; i++){
-			var item = document.id(arguments[i]);
-			if (item) items.push(item);
-		}
-		return Array.prototype.unshift.apply(this, items);
-	}.protect(),
-
-	concat: function(){
-		var newElements = new Elements(this);
-		for (var i = 0, l = arguments.length; i < l; i++){
-			var item = arguments[i];
-			if (Type.isEnumerable(item)) newElements.append(item);
-			else newElements.push(item);
-		}
-		return newElements;
-	}.protect(),
-
-	append: function(collection){
-		for (var i = 0, l = collection.length; i < l; i++) this.push(collection[i]);
-		return this;
-	}.protect(),
-
-	empty: function(){
-		while (this.length) delete this[--this.length];
-		return this;
-	}.protect()
-
-});
-
-//<1.2compat>
-
-Elements.alias('extend', 'append');
-
-//</1.2compat>
-
-(function(){
-
-// FF, IE
-var splice = Array.prototype.splice, object = {'0': 0, '1': 1, length: 2};
-
-splice.call(object, 1, 1);
-if (object[1] == 1) Elements.implement('splice', function(){
-	var length = this.length;
-	splice.apply(this, arguments);
-	while (length >= this.length) delete this[length--];
-	return this;
-}.protect());
-
-Elements.implement(Array.prototype);
-
-Array.mirror(Elements);
-
-/*<ltIE8>*/
-var createElementAcceptsHTML;
-try {
-	var x = document.createElement('<input name=x>');
-	createElementAcceptsHTML = (x.name == 'x');
-} catch(e){}
-
-var escapeQuotes = function(html){
-	return ('' + html).replace(/&/g, '&amp;').replace(/"/g, '&quot;');
-};
-/*</ltIE8>*/
-
-Document.implement({
-
-	newElement: function(tag, props){
-		if (props && props.checked != null) props.defaultChecked = props.checked;
-		/*<ltIE8>*/// Fix for readonly name and type properties in IE < 8
-		if (createElementAcceptsHTML && props){
-			tag = '<' + tag;
-			if (props.name) tag += ' name="' + escapeQuotes(props.name) + '"';
-			if (props.type) tag += ' type="' + escapeQuotes(props.type) + '"';
-			tag += '>';
-			delete props.name;
-			delete props.type;
-		}
-		/*</ltIE8>*/
-		return this.id(this.createElement(tag)).set(props);
-	}
-
-});
-
-})();
-
-Document.implement({
-
-	newTextNode: function(text){
-		return this.createTextNode(text);
-	},
-
-	getDocument: function(){
-		return this;
-	},
-
-	getWindow: function(){
-		return this.window;
-	},
-
-	id: (function(){
-
-		var types = {
-
-			string: function(id, nocash, doc){
-				id = Slick.find(doc, '#' + id.replace(/(\W)/g, '\\$1'));
-				return (id) ? types.element(id, nocash) : null;
-			},
-
-			element: function(el, nocash){
-				$uid(el);
-				if (!nocash && !el.$family && !(/^(?:object|embed)$/i).test(el.tagName)){
-					Object.append(el, Element.Prototype);
-				}
-				return el;
-			},
-
-			object: function(obj, nocash, doc){
-				if (obj.toElement) return types.element(obj.toElement(doc), nocash);
-				return null;
-			}
-
-		};
-
-		types.textnode = types.whitespace = types.window = types.document = function(zero){
-			return zero;
-		};
-
-		return function(el, nocash, doc){
-			if (el && el.$family && el.uid) return el;
-			var type = typeOf(el);
-			return (types[type]) ? types[type](el, nocash, doc || document) : null;
-		};
-
-	})()
-
-});
-
-if (window.$ == null) Window.implement('$', function(el, nc){
-	return document.id(el, nc, this.document);
-});
-
-Window.implement({
-
-	getDocument: function(){
-		return this.document;
-	},
-
-	getWindow: function(){
-		return this;
-	}
-
-});
-
-[Document, Element].invoke('implement', {
-
-	getElements: function(expression){
-		return Slick.search(this, expression, new Elements);
-	},
-
-	getElement: function(expression){
-		return document.id(Slick.find(this, expression));
-	}
-
-});
-
-//<1.2compat>
-
-(function(search, find, match){
-
-	this.Selectors = {};
-	var pseudos = this.Selectors.Pseudo = new Hash();
-
-	var addSlickPseudos = function(){
-		for (var name in pseudos) if (pseudos.hasOwnProperty(name)){
-			Slick.definePseudo(name, pseudos[name]);
-			delete pseudos[name];
-		}
-	};
-
-	Slick.search = function(context, expression, append){
-		addSlickPseudos();
-		return search.call(this, context, expression, append);
-	};
-
-	Slick.find = function(context, expression){
-		addSlickPseudos();
-		return find.call(this, context, expression);
-	};
-
-	Slick.match = function(node, selector){
-		addSlickPseudos();
-		return match.call(this, node, selector);
-	};
-
-})(Slick.search, Slick.find, Slick.match);
-
-if (window.$$ == null) Window.implement('$$', function(selector){
-	var elements = new Elements;
-	if (arguments.length == 1 && typeof selector == 'string') return Slick.search(this.document, selector, elements);
-	var args = Array.flatten(arguments);
-	for (var i = 0, l = args.length; i < l; i++){
-		var item = args[i];
-		switch (typeOf(item)){
-			case 'element': elements.push(item); break;
-			case 'string': Slick.search(this.document, item, elements);
-		}
-	}
-	return elements;
-});
-
-//</1.2compat>
-
-if (window.$$ == null) Window.implement('$$', function(selector){
-	if (arguments.length == 1){
-		if (typeof selector == 'string') return Slick.search(this.document, selector, new Elements);
-		else if (Type.isEnumerable(selector)) return new Elements(selector);
-	}
-	return new Elements(arguments);
-});
-
-(function(){
-
-var collected = {}, storage = {};
-var formProps = {input: 'checked', option: 'selected', textarea: 'value'};
-
-var get = function(uid){
-	return (storage[uid] || (storage[uid] = {}));
-};
-
-var clean = function(item){
-	var uid = item.uid;
-	if (item.removeEvents) item.removeEvents();
-	if (item.clearAttributes) item.clearAttributes();
-	if (uid != null){
-		delete collected[uid];
-		delete storage[uid];
-	}
-	return item;
-};
-
-var camels = ['defaultValue', 'accessKey', 'cellPadding', 'cellSpacing', 'colSpan', 'frameBorder', 'maxLength', 'readOnly',
-	'rowSpan', 'tabIndex', 'useMap'
-];
-var bools = ['compact', 'nowrap', 'ismap', 'declare', 'noshade', 'checked', 'disabled', 'readOnly', 'multiple', 'selected',
-	'noresize', 'defer', 'defaultChecked', 'autofocus'
-];
- var attributes = {
-	'html': 'innerHTML',
-	'class': 'className',
-	'for': 'htmlFor',
-	'text': (function(){
-		var temp = document.createElement('div');
-		return (temp.textContent == null) ? 'innerText' : 'textContent';
-	})()
-};
-var readOnly = ['type'];
-var expandos = ['value', 'defaultValue'];
-var uriAttrs = /^(?:href|src|usemap)$/i;
-
-bools = bools.associate(bools);
-camels = camels.associate(camels.map(String.toLowerCase));
-readOnly = readOnly.associate(readOnly);
-
-Object.append(attributes, expandos.associate(expandos));
-
-var inserters = {
-
-	before: function(context, element){
-		var parent = element.parentNode;
-		if (parent) parent.insertBefore(context, element);
-	},
-
-	after: function(context, element){
-		var parent = element.parentNode;
-		if (parent) parent.insertBefore(context, element.nextSibling);
-	},
-
-	bottom: function(context, element){
-		element.appendChild(context);
-	},
-
-	top: function(context, element){
-		element.insertBefore(context, element.firstChild);
-	}
-
-};
-
-inserters.inside = inserters.bottom;
-
-//<1.2compat>
-
-Object.each(inserters, function(inserter, where){
-
-	where = where.capitalize();
-
-	var methods = {};
-
-	methods['inject' + where] = function(el){
-		inserter(this, document.id(el, true));
-		return this;
-	};
-
-	methods['grab' + where] = function(el){
-		inserter(document.id(el, true), this);
-		return this;
-	};
-
-	Element.implement(methods);
-
-});
-
-//</1.2compat>
-
-var injectCombinator = function(expression, combinator){
-	if (!expression) return combinator;
-
-	expression = Object.clone(Slick.parse(expression));
-
-	var expressions = expression.expressions;
-	for (var i = expressions.length; i--;)
-		expressions[i][0].combinator = combinator;
-
-	return expression;
-};
-
-Element.implement({
-
-	set: function(prop, value){
-		var property = Element.Properties[prop];
-		(property && property.set) ? property.set.call(this, value) : this.setProperty(prop, value);
-	}.overloadSetter(),
-
-	get: function(prop){
-		var property = Element.Properties[prop];
-		return (property && property.get) ? property.get.apply(this) : this.getProperty(prop);
-	}.overloadGetter(),
-
-	erase: function(prop){
-		var property = Element.Properties[prop];
-		(property && property.erase) ? property.erase.apply(this) : this.removeProperty(prop);
-		return this;
-	},
-
-	setProperty: function(attribute, value){
-		attribute = camels[attribute] || attribute;
-		if (value == null) return this.removeProperty(attribute);
-		var key = attributes[attribute];
-		(key) ? this[key] = value :
-			(bools[attribute]) ? this[attribute] = !!value : this.setAttribute(attribute, '' + value);
-		return this;
-	},
-
-	setProperties: function(attributes){
-		for (var attribute in attributes) this.setProperty(attribute, attributes[attribute]);
-		return this;
-	},
-
-	getProperty: function(attribute){
-		attribute = camels[attribute] || attribute;
-		var key = attributes[attribute] || readOnly[attribute];
-		return (key) ? this[key] :
-			(bools[attribute]) ? !!this[attribute] :
-			(uriAttrs.test(attribute) ? this.getAttribute(attribute, 2) :
-			(key = this.getAttributeNode(attribute)) ? key.nodeValue : null) || null;
-	},
-
-	getProperties: function(){
-		var args = Array.from(arguments);
-		return args.map(this.getProperty, this).associate(args);
-	},
-
-	removeProperty: function(attribute){
-		attribute = camels[attribute] || attribute;
-		var key = attributes[attribute];
-		(key) ? this[key] = '' :
-			(bools[attribute]) ? this[attribute] = false : this.removeAttribute(attribute);
-		return this;
-	},
-
-	removeProperties: function(){
-		Array.each(arguments, this.removeProperty, this);
-		return this;
-	},
-
-	hasClass: function(className){
-		return this.className.clean().contains(className, ' ');
-	},
-
-	addClass: function(className){
-		if (!this.hasClass(className)) this.className = (this.className + ' ' + className).clean();
-		return this;
-	},
-
-	removeClass: function(className){
-		this.className = this.className.replace(new RegExp('(^|\\s)' + className + '(?:\\s|$)'), '$1');
-		return this;
-	},
-
-	toggleClass: function(className, force){
-		if (force == null) force = !this.hasClass(className);
-		return (force) ? this.addClass(className) : this.removeClass(className);
-	},
-
-	adopt: function(){
-		var parent = this, fragment, elements = Array.flatten(arguments), length = elements.length;
-		if (length > 1) parent = fragment = document.createDocumentFragment();
-
-		for (var i = 0; i < length; i++){
-			var element = document.id(elements[i], true);
-			if (element) parent.appendChild(element);
-		}
-
-		if (fragment) this.appendChild(fragment);
-
-		return this;
-	},
-
-	appendText: function(text, where){
-		return this.grab(this.getDocument().newTextNode(text), where);
-	},
-
-	grab: function(el, where){
-		inserters[where || 'bottom'](document.id(el, true), this);
-		return this;
-	},
-
-	inject: function(el, where){
-		inserters[where || 'bottom'](this, document.id(el, true));
-		return this;
-	},
-
-	replaces: function(el){
-		el = document.id(el, true);
-		el.parentNode.replaceChild(this, el);
-		return this;
-	},
-
-	wraps: function(el, where){
-		el = document.id(el, true);
-		return this.replaces(el).grab(el, where);
-	},
-
-	getPrevious: function(expression){
-		return document.id(Slick.find(this, injectCombinator(expression, '!~')));
-	},
-
-	getAllPrevious: function(expression){
-		return Slick.search(this, injectCombinator(expression, '!~'), new Elements);
-	},
-
-	getNext: function(expression){
-		return document.id(Slick.find(this, injectCombinator(expression, '~')));
-	},
-
-	getAllNext: function(expression){
-		return Slick.search(this, injectCombinator(expression, '~'), new Elements);
-	},
-
-	getFirst: function(expression){
-		return document.id(Slick.search(this, injectCombinator(expression, '>'))[0]);
-	},
-
-	getLast: function(expression){
-		return document.id(Slick.search(this, injectCombinator(expression, '>')).getLast());
-	},
-
-	getParent: function(expression){
-		return document.id(Slick.find(this, injectCombinator(expression, '!')));
-	},
-
-	getParents: function(expression){
-		return Slick.search(this, injectCombinator(expression, '!'), new Elements);
-	},
-
-	getSiblings: function(expression){
-		return Slick.search(this, injectCombinator(expression, '~~'), new Elements);
-	},
-
-	getChildren: function(expression){
-		return Slick.search(this, injectCombinator(expression, '>'), new Elements);
-	},
-
-	getWindow: function(){
-		return this.ownerDocument.window;
-	},
-
-	getDocument: function(){
-		return this.ownerDocument;
-	},
-
-	getElementById: function(id){
-		return document.id(Slick.find(this, '#' + ('' + id).replace(/(\W)/g, '\\$1')));
-	},
-
-	getSelected: function(){
-		this.selectedIndex; // Safari 3.2.1
-		return new Elements(Array.from(this.options).filter(function(option){
-			return option.selected;
-		}));
-	},
-
-	toQueryString: function(){
-		var queryString = [];
-		this.getElements('input, select, textarea').each(function(el){
-			var type = el.type;
-			if (!el.name || el.disabled || type == 'submit' || type == 'reset' || type == 'file' || type == 'image') return;
-
-			var value = (el.get('tag') == 'select') ? el.getSelected().map(function(opt){
-				// IE
-				return document.id(opt).get('value');
-			}) : ((type == 'radio' || type == 'checkbox') && !el.checked) ? null : el.get('value');
-
-			Array.from(value).each(function(val){
-				if (typeof val != 'undefined') queryString.push(encodeURIComponent(el.name) + '=' + encodeURIComponent(val));
-			});
-		});
-		return queryString.join('&');
-	},
-
-	destroy: function(){
-		var children = clean(this).getElementsByTagName('*');
-		Array.each(children, clean);
-		Element.dispose(this);
-		return null;
-	},
-
-	empty: function(){
-		Array.from(this.childNodes).each(Element.dispose);
-		return this;
-	},
-
-	dispose: function(){
-		return (this.parentNode) ? this.parentNode.removeChild(this) : this;
-	},
-
-	match: function(expression){
-		return !expression || Slick.match(this, expression);
-	}
-
-});
-
-var cleanClone = function(node, element, keepid){
-	if (!keepid) node.setAttributeNode(document.createAttribute('id'));
-	if (node.clearAttributes){
-		node.clearAttributes();
-		node.mergeAttributes(element);
-		node.removeAttribute('uid');
-		if (node.options){
-			var no = node.options, eo = element.options;
-			for (var i = no.length; i--;) no[i].selected = eo[i].selected;
-		}
-	}
-
-	var prop = formProps[element.tagName.toLowerCase()];
-	if (prop && element[prop]) node[prop] = element[prop];
-};
-
-Element.implement('clone', function(contents, keepid){
-	contents = contents !== false;
-	var clone = this.cloneNode(contents), i;
-
-	if (contents){
-		var ce = clone.getElementsByTagName('*'), te = this.getElementsByTagName('*');
-		for (i = ce.length; i--;) cleanClone(ce[i], te[i], keepid);
-	}
-
-	cleanClone(clone, this, keepid);
-
-	if (Browser.ie){
-		var co = clone.getElementsByTagName('object'), to = this.getElementsByTagName('object');
-		for (i = co.length; i--;) co[i].outerHTML = to[i].outerHTML;
-	}
-	return document.id(clone);
-});
-
-var contains = {contains: function(element){
-	return Slick.contains(this, element);
-}};
-
-if (!document.contains) Document.implement(contains);
-if (!document.createElement('div').contains) Element.implement(contains);
-
-//<1.2compat>
-
-Element.implement('hasChild', function(element){
-	return this !== element && this.contains(element);
-});
-
-//</1.2compat>
-
-[Element, Window, Document].invoke('implement', {
-
-	addListener: function(type, fn){
-		if (type == 'unload'){
-			var old = fn, self = this;
-			fn = function(){
-				self.removeListener('unload', fn);
-				old();
-			};
-		} else {
-			collected[$uid(this)] = this;
-		}
-		if (this.addEventListener) this.addEventListener(type, fn, !!arguments[2]);
-		else this.attachEvent('on' + type, fn);
-		return this;
-	},
-
-	removeListener: function(type, fn){
-		if (this.removeEventListener) this.removeEventListener(type, fn, !!arguments[2]);
-		else this.detachEvent('on' + type, fn);
-		return this;
-	},
-
-	retrieve: function(property, dflt){
-		var storage = get($uid(this)), prop = storage[property];
-		if (dflt != null && prop == null) prop = storage[property] = dflt;
-		return prop != null ? prop : null;
-	},
-
-	store: function(property, value){
-		var storage = get($uid(this));
-		storage[property] = value;
-		return this;
-	},
-
-	eliminate: function(property){
-		var storage = get($uid(this));
-		delete storage[property];
-		return this;
-	}
-
-});
-
-/*<ltIE9>*/
-if (window.attachEvent && !window.addEventListener) window.addListener('unload', function(){
-	Object.each(collected, clean);
-	if (window.CollectGarbage) CollectGarbage();
-});
-/*</ltIE9>*/
-
-})();
-
-Element.Properties = {};
-
-//<1.2compat>
-
-Element.Properties = new Hash;
-
-//</1.2compat>
-
-Element.Properties.style = {
-
-	set: function(style){
-		this.style.cssText = style;
-	},
-
-	get: function(){
-		return this.style.cssText;
-	},
-
-	erase: function(){
-		this.style.cssText = '';
-	}
-
-};
-
-Element.Properties.tag = {
-
-	get: function(){
-		return this.tagName.toLowerCase();
-	}
-
-};
-
-/*<ltIE9>*/
-(function(maxLength){
-	if (maxLength != null) Element.Properties.maxlength = Element.Properties.maxLength = {
-		get: function(){
-			var maxlength = this.getAttribute('maxLength');
-			return maxlength == maxLength ? null : maxlength;
-		}
-	};
-})(document.createElement('input').getAttribute('maxLength'));
-/*</ltIE9>*/
-
-/*<!webkit>*/
-Element.Properties.html = (function(){
-
-	var tableTest = Function.attempt(function(){
-		var table = document.createElement('table');
-		table.innerHTML = '<tr><td></td></tr>';
-	});
-
-	var wrapper = document.createElement('div');
-
-	var translations = {
-		table: [1, '<table>', '</table>'],
-		select: [1, '<select>', '</select>'],
-		tbody: [2, '<table><tbody>', '</tbody></table>'],
-		tr: [3, '<table><tbody><tr>', '</tr></tbody></table>']
-	};
-	translations.thead = translations.tfoot = translations.tbody;
-
-	var html = {
-		set: function(){
-			var html = Array.flatten(arguments).join('');
-			var wrap = (!tableTest && translations[this.get('tag')]);
-			if (wrap){
-				var first = wrapper;
-				first.innerHTML = wrap[1] + html + wrap[2];
-				for (var i = wrap[0]; i--;) first = first.firstChild;
-				this.empty().adopt(first.childNodes);
-			} else {
-				this.innerHTML = html;
-			}
-		}
-	};
-
-	html.erase = html.set;
-
-	return html;
-})();
-/*</!webkit>*/
-
-
-/*
----
-
-name: Element.Style
-
-description: Contains methods for interacting with the styles of Elements in a fashionable way.
-
-license: MIT-style license.
-
-requires: Element
-
-provides: Element.Style
-
-...
-*/
-
-(function(){
-
-var html = document.html;
-
-Element.Properties.styles = {set: function(styles){
-	this.setStyles(styles);
-}};
-
-var hasOpacity = (html.style.opacity != null);
-var reAlpha = /alpha\(opacity=([\d.]+)\)/i;
-
-var setOpacity = function(element, opacity){
-	if (!element.currentStyle || !element.currentStyle.hasLayout) element.style.zoom = 1;
-	if (hasOpacity){
-		element.style.opacity = opacity;
-	} else {
-		opacity = (opacity * 100).limit(0, 100).round();
-		opacity = (opacity == 100) ? '' : 'alpha(opacity=' + opacity + ')';
-		var filter = element.style.filter || element.getComputedStyle('filter') || '';
-		element.style.filter = reAlpha.test(filter) ? filter.replace(reAlpha, opacity) : filter + opacity;
-	}
-};
-
-Element.Properties.opacity = {
-
-	set: function(opacity){
-		var visibility = this.style.visibility;
-		if (opacity == 0 && visibility != 'hidden') this.style.visibility = 'hidden';
-		else if (opacity != 0 && visibility != 'visible') this.style.visibility = 'visible';
-
-		setOpacity(this, opacity);
-	},
-
-	get: (hasOpacity) ? function(){
-		var opacity = this.style.opacity || this.getComputedStyle('opacity');
-		return (opacity == '') ? 1 : opacity;
-	} : function(){
-		var opacity, filter = (this.style.filter || this.getComputedStyle('filter'));
-		if (filter) opacity = filter.match(reAlpha);
-		return (opacity == null || filter == null) ? 1 : (opacity[1] / 100);
-	}
-
-};
-
-var floatName = (html.style.cssFloat == null) ? 'styleFloat' : 'cssFloat';
-
-Element.implement({
-
-	getComputedStyle: function(property){
-		if (this.currentStyle) return this.currentStyle[property.camelCase()];
-		var defaultView = Element.getDocument(this).defaultView,
-			computed = defaultView ? defaultView.getComputedStyle(this, null) : null;
-		return (computed) ? computed.getPropertyValue((property == floatName) ? 'float' : property.hyphenate()) : null;
-	},
-
-	setOpacity: function(value){
-		setOpacity(this, value);
-		return this;
-	},
-
-	getOpacity: function(){
-		return this.get('opacity');
-	},
-
-	setStyle: function(property, value){
-		switch (property){
-			case 'opacity': return this.set('opacity', parseFloat(value));
-			case 'float': property = floatName;
-		}
-		property = property.camelCase();
-		if (typeOf(value) != 'string'){
-			var map = (Element.Styles[property] || '@').split(' ');
-			value = Array.from(value).map(function(val, i){
-				if (!map[i]) return '';
-				return (typeOf(val) == 'number') ? map[i].replace('@', Math.round(val)) : val;
-			}).join(' ');
-		} else if (value == String(Number(value))){
-			value = Math.round(value);
-		}
-		if ((property === 'width' || property === 'height') && value.toString().indexOf('-') >= 0)
-		{
-			// [i_a] don't set a negative width or height: MSIE6 croaks!
-			this.style[property] = '0px';
-			return this;
-		}
-		else if (property === 'zIndex' && value === 'auto')
-		{
-			// [i_a] MSIE6 croaks on this one; set to nil instead
-			this.style[property] = '';
-			return this;
-		}
-		this.style[property] = value;
-		return this;
-	},
-
-	getStyle: function(property){
-		switch (property){
-			case 'opacity': return this.get('opacity');
-			case 'float': property = floatName;
-		}
-		property = property.camelCase();
-		var result = this.style[property];
-		if (!result || property == 'zIndex'){
-			result = [];
-			for (var style in Element.ShortStyles){
-				if (property != style) continue;
-				for (var s in Element.ShortStyles[style]) result.push(this.getStyle(s));
-				return result.join(' ');
-			}
-			result = this.getComputedStyle(property);
-		}
-		if (result){
-			result = String(result);
-			var color = result.match(/rgba?\([\d\s,]+\)/);
-			if (color) result = result.replace(color[0], color[0].rgbToHex());
-		}
-		if (Browser.opera || (Browser.ie && isNaN(parseFloat(result)))){
-			if ((/^(height|width)$/).test(property)){
-				var values = (property == 'width') ? ['left', 'right'] : ['top', 'bottom'], size = 0;
-				values.each(function(value){
-					size += this.getStyle('border-' + value + '-width').toInt() + this.getStyle('padding-' + value).toInt();
-				}, this);
-				return this['offset' + property.capitalize()] - size + 'px';
-			}
-			if (Browser.opera && String(result).indexOf('px') != -1) return result;
-			if ((/^border(.+)Width|margin|padding/).test(property)) return '0px';
-		}
-		return result;
-	},
-
-	setStyles: function(styles){
-		for (var style in styles) this.setStyle(style, styles[style]);
-		return this;
-	},
-
-	getStyles: function(){
-		var result = {};
-		Array.flatten(arguments).each(function(key){
-			result[key] = this.getStyle(key);
-		}, this);
-		return result;
-	}
-
-});
-
-Element.Styles = {
-	left: '@px', top: '@px', bottom: '@px', right: '@px',
-	width: '@px', height: '@px', maxWidth: '@px', maxHeight: '@px', minWidth: '@px', minHeight: '@px',
-	backgroundColor: 'rgb(@, @, @)', backgroundPosition: '@px @px', color: 'rgb(@, @, @)',
-	fontSize: '@px', letterSpacing: '@px', lineHeight: '@px', clip: 'rect(@px @px @px @px)',
-	margin: '@px @px @px @px', padding: '@px @px @px @px', border: '@px @ rgb(@, @, @) @px @ rgb(@, @, @) @px @ rgb(@, @, @)',
-	borderWidth: '@px @px @px @px', borderStyle: '@ @ @ @', borderColor: 'rgb(@, @, @) rgb(@, @, @) rgb(@, @, @) rgb(@, @, @)',
-	zIndex: '@', 'zoom': '@', fontWeight: '@', textIndent: '@px', opacity: '@'
-};
-
-//<1.2compat>
-
-Element.Styles = new Hash(Element.Styles);
-
-//</1.2compat>
-
-Element.ShortStyles = {margin: {}, padding: {}, border: {}, borderWidth: {}, borderStyle: {}, borderColor: {}};
-
-['Top', 'Right', 'Bottom', 'Left'].each(function(direction){
-	var Short = Element.ShortStyles;
-	var All = Element.Styles;
-	['margin', 'padding'].each(function(style){
-		var sd = style + direction;
-		Short[style][sd] = All[sd] = '@px';
-	});
-	var bd = 'border' + direction;
-	Short.border[bd] = All[bd] = '@px @ rgb(@, @, @)';
-	var bdw = bd + 'Width', bds = bd + 'Style', bdc = bd + 'Color';
-	Short[bd] = {};
-	Short.borderWidth[bdw] = Short[bd][bdw] = All[bdw] = '@px';
-	Short.borderStyle[bds] = Short[bd][bds] = All[bds] = '@';
-	Short.borderColor[bdc] = Short[bd][bdc] = All[bdc] = 'rgb(@, @, @)';
-});
-
-})();
-
-
-/*
----
-
-name: Element.Event
-
-description: Contains Element methods for dealing with events. This file also includes mouseenter and mouseleave custom Element Events.
-
-license: MIT-style license.
-
-requires: [Element, Event]
-
-provides: Element.Event
-
-...
-*/
-
-(function(){
-
-Element.Properties.events = {set: function(events){
-	this.addEvents(events);
-}};
-
-[Element, Window, Document].invoke('implement', {
-
-	addEvent: function(type, fn){
-		var events = this.retrieve('events', {});
-		if (!events[type]) events[type] = {keys: [], values: []};
-		if (events[type].keys.contains(fn)) return this;
-		events[type].keys.push(fn);
-		var realType = type,
-			custom = Element.Events[type],
-			condition = fn,
-			self = this;
-		if (custom){
-			if (custom.onAdd) custom.onAdd.call(this, fn);
-			if (custom.condition){
-				condition = function(event){
-					if (custom.condition.call(this, event)) return fn.call(this, event);
-					return true;
-				};
-			}
-			realType = custom.base || realType;
-		}
-		var defn = function(){
-			return fn.call(self);
-		};
-		var nativeEvent = Element.NativeEvents[realType];
-		if (nativeEvent){
-			if (nativeEvent == 2){
-				defn = function(event){
-					event = new Event(event, self.getWindow());
-					if (condition.call(self, event) === false) event.stop();
-				};
-			}
-			this.addListener(realType, defn, arguments[2]);
-		}
-		events[type].values.push(defn);
-		return this;
-	},
-
-	removeEvent: function(type, fn){
-		var events = this.retrieve('events');
-		if (!events || !events[type]) return this;
-		var list = events[type];
-		var index = list.keys.indexOf(fn);
-		if (index == -1) return this;
-		var value = list.values[index];
-		delete list.keys[index];
-		delete list.values[index];
-		var custom = Element.Events[type];
-		if (custom){
-			if (custom.onRemove) custom.onRemove.call(this, fn);
-			type = custom.base || type;
-		}
-		return (Element.NativeEvents[type]) ? this.removeListener(type, value, arguments[2]) : this;
-	},
-
-	addEvents: function(events){
-		for (var event in events) this.addEvent(event, events[event]);
-		return this;
-	},
-
-	removeEvents: function(events){
-		var type;
-		if (typeOf(events) == 'object'){
-			for (type in events) this.removeEvent(type, events[type]);
-			return this;
-		}
-		var attached = this.retrieve('events');
-		if (!attached) return this;
-		if (!events){
-			for (type in attached) this.removeEvents(type);
-			this.eliminate('events');
-		} else if (attached[events]){
-			attached[events].keys.each(function(fn){
-				this.removeEvent(events, fn);
-			}, this);
-			delete attached[events];
-		}
-		return this;
-	},
-
-	fireEvent: function(type, args, delay){
-		var events = this.retrieve('events');
-		if (!events || !events[type]) return this;
-		args = Array.from(args);
-
-		events[type].keys.each(function(fn){
-			if (delay) fn.delay(delay, this, args);
-			else fn.apply(this, args);
-		}, this);
-		return this;
-	},
-
-	cloneEvents: function(from, type){
-		from = document.id(from);
-		var events = from.retrieve('events');
-		if (!events) return this;
-		if (!type){
-			for (var eventType in events) this.cloneEvents(from, eventType);
-		} else if (events[type]){
-			events[type].keys.each(function(fn){
-				this.addEvent(type, fn);
-			}, this);
-		}
-		return this;
-	}
-
-});
-
-Element.NativeEvents = {
-	click: 2, dblclick: 2, mouseup: 2, mousedown: 2, contextmenu: 2, //mouse buttons
-	mousewheel: 2, DOMMouseScroll: 2, //mouse wheel
-	mouseover: 2, mouseout: 2, mousemove: 2, selectstart: 2, selectend: 2, //mouse movement
-	keydown: 2, keypress: 2, keyup: 2, //keyboard
-	orientationchange: 2, // mobile
-	touchstart: 2, touchmove: 2, touchend: 2, touchcancel: 2, // touch
-	gesturestart: 2, gesturechange: 2, gestureend: 2, // gesture
-	focus: 2, blur: 2, change: 2, reset: 2, select: 2, submit: 2, //form elements
-	load: 2, unload: 1, beforeunload: 2, resize: 1, move: 1, DOMContentLoaded: 1, readystatechange: 1, //window
-	error: 1, abort: 1, scroll: 1 //misc
-};
-
-var check = function(event){
-	var related = event.relatedTarget;
-	if (related == null) return true;
-	if (!related) return false;
-	return (related != this && related.prefix != 'xul' && typeOf(this) != 'document' && !this.contains(related));
-};
-
-Element.Events = {
-
-	mouseenter: {
-		base: 'mouseover',
-		condition: check
-	},
-
-	mouseleave: {
-		base: 'mouseout',
-		condition: check
-	},
-
-	mousewheel: {
-		base: (Browser.firefox) ? 'DOMMouseScroll' : 'mousewheel'
-	}
-
-};
-
-//<1.2compat>
-
-Element.Events = new Hash(Element.Events);
-
-//</1.2compat>
-
-})();
-
-
-/*
----
-
-name: Element.Dimensions
-
-description: Contains methods to work with size, scroll, or positioning of Elements and the window object.
-
-license: MIT-style license.
-
-credits:
-  - Element positioning based on the [qooxdoo](http://qooxdoo.org/) code and smart browser fixes, [LGPL License](http://www.gnu.org/licenses/lgpl.html).
-  - Viewport dimensions based on [YUI](http://developer.yahoo.com/yui/) code, [BSD License](http://developer.yahoo.com/yui/license.html).
-
-requires: [Element, Element.Style]
-
-provides: [Element.Dimensions]
-
-...
-*/
-
-(function(){
-
-var element = document.createElement('div'),
-	child = document.createElement('div');
-element.style.height = '0';
-element.appendChild(child);
-var brokenOffsetParent = (child.offsetParent === element);
-element = child = null;
-
-var isOffset = function(el){
-	return styleString(el, 'position') != 'static' || isBody(el);
-};
-
-var isOffsetStatic = function(el){
-	return isOffset(el) || (/^(?:table|td|th)$/i).test(el.tagName);
-};
-
-Element.implement({
-
-	scrollTo: function(x, y){
-		if (isBody(this)){
-			this.getWindow().scrollTo(x, y);
-		} else {
-			this.scrollLeft = x;
-			this.scrollTop = y;
-		}
-		return this;
-	},
-
-	getSize: function(){
-		if (isBody(this)) return this.getWindow().getSize();
-		return {x: this.offsetWidth, y: this.offsetHeight};
-	},
-
-	getScrollSize: function(){
-		if (isBody(this)) return this.getWindow().getScrollSize();
-		return {x: this.scrollWidth, y: this.scrollHeight};
-	},
-
-	getScroll: function(){
-		if (isBody(this)) return this.getWindow().getScroll();
-		return {x: this.scrollLeft, y: this.scrollTop};
-	},
-
-	getScrolls: function(){
-		var element = this.parentNode, position = {x: 0, y: 0};
-		while (element && !isBody(element)){
-			position.x += element.scrollLeft;
-			position.y += element.scrollTop;
-			element = element.parentNode;
-		}
-		return position;
-	},
-
-	getOffsetParent: brokenOffsetParent ? function(){
-		var element = this;
-		if (isBody(element) || styleString(element, 'position') == 'fixed') return null;
-
-		var isOffsetCheck = (styleString(element, 'position') == 'static') ? isOffsetStatic : isOffset;
-		while ((element = element.parentNode)){
-			if (isOffsetCheck(element)) return element;
-		}
-		return null;
-	} : function(){
-		var element = this;
-		if (isBody(element) || styleString(element, 'position') == 'fixed') return null;
-
-		try {
-			return element.offsetParent;
-		} catch(e) {}
-		return null;
-	},
-
-	getOffsets: function(){
-		if (this.getBoundingClientRect && !Browser.Platform.ios){
-			var bound = this.getBoundingClientRect(),
-				html = document.id(this.getDocument().documentElement),
-				htmlScroll = html.getScroll(),
-				elemScrolls = this.getScrolls(),
-				isFixed = (styleString(this, 'position') == 'fixed');
-
-			return {
-				x: bound.left.toInt() + elemScrolls.x + ((isFixed) ? 0 : htmlScroll.x) - html.clientLeft,
-				y: bound.top.toInt()  + elemScrolls.y + ((isFixed) ? 0 : htmlScroll.y) - html.clientTop
-			};
-		}
-
-		var element = this, position = {x: 0, y: 0};
-		if (isBody(this)) return position;
-
-		while (element && !isBody(element)){
-			position.x += element.offsetLeft;
-			position.y += element.offsetTop;
-
-			if (Browser.firefox){
-				if (!borderBox(element)){
-					position.x += leftBorder(element);
-					position.y += topBorder(element);
-				}
-				var parent = element.parentNode;
-				if (parent && styleString(parent, 'overflow') != 'visible'){
-					position.x += leftBorder(parent);
-					position.y += topBorder(parent);
-				}
-			} else if (element != this && Browser.safari){
-				position.x += leftBorder(element);
-				position.y += topBorder(element);
-			}
-
-			element = element.offsetParent;
-		}
-		if (Browser.firefox && !borderBox(this)){
-			position.x -= leftBorder(this);
-			position.y -= topBorder(this);
-		}
-		return position;
-	},
-
-	getPosition: function(relative){
-		if (isBody(this)) return {x: 0, y: 0};
-		var offset = this.getOffsets(),
-			scroll = this.getScrolls();
-		var position = {
-			x: offset.x - scroll.x,
-			y: offset.y - scroll.y
-		};
-
-		if (relative && (relative = document.id(relative))){
-			var relativePosition = relative.getPosition();
-			return {x: position.x - relativePosition.x - leftBorder(relative), y: position.y - relativePosition.y - topBorder(relative)};
-		}
-		return position;
-	},
-
-	getCoordinates: function(element){
-		if (isBody(this)) return this.getWindow().getCoordinates();
-		var position = this.getPosition(element),
-			size = this.getSize();
-		var obj = {
-			left: position.x,
-			top: position.y,
-			width: size.x,
-			height: size.y
-		};
-		obj.right = obj.left + obj.width;
-		obj.bottom = obj.top + obj.height;
-		return obj;
-	},
-
-	computePosition: function(obj){
-		return {
-			left: obj.x - styleNumber(this, 'margin-left'),
-			top: obj.y - styleNumber(this, 'margin-top')
-		};
-	},
-
-	setPosition: function(obj){
-		return this.setStyles(this.computePosition(obj));
-	}
-
-});
-
-
-[Document, Window].invoke('implement', {
-
-	getSize: function(){
-		var doc = getCompatElement(this);
-		return {x: doc.clientWidth, y: doc.clientHeight};
-	},
-
-	getScroll: function(){
-		var win = this.getWindow(), doc = getCompatElement(this);
-		return {x: win.pageXOffset || doc.scrollLeft, y: win.pageYOffset || doc.scrollTop};
-	},
-
-	getScrollSize: function(){
-		var doc = getCompatElement(this),
-			min = this.getSize(),
-			body = this.getDocument().body;
-
-		return {x: Math.max(doc.scrollWidth, body.scrollWidth, min.x), y: Math.max(doc.scrollHeight, body.scrollHeight, min.y)};
-	},
-
-	getPosition: function(){
-		return {x: 0, y: 0};
-	},
-
-	getCoordinates: function(){
-		var size = this.getSize();
-		return {top: 0, left: 0, bottom: size.y, right: size.x, height: size.y, width: size.x};
-	}
-
-});
-
-// private methods
-
-var styleString = Element.getComputedStyle;
-
-function styleNumber(element, style){
-	return styleString(element, style).toInt() || 0;
-}
-
-function borderBox(element){
-	return styleString(element, '-moz-box-sizing') == 'border-box';
-}
-
-function topBorder(element){
-	return styleNumber(element, 'border-top-width');
-}
-
-function leftBorder(element){
-	return styleNumber(element, 'border-left-width');
-}
-
-function isBody(element){
-	return (/^(?:body|html)$/i).test(element.tagName);
-}
-
-function getCompatElement(element){
-	var doc = element.getDocument();
-	return (!doc.compatMode || doc.compatMode == 'CSS1Compat') ? doc.html : doc.body;
-}
-
-})();
-
-//aliases
-Element.alias({position: 'setPosition'}); //compatability
-
-[Window, Document, Element].invoke('implement', {
-
-	getHeight: function(){
-		return this.getSize().y;
-	},
-
-	getWidth: function(){
-		return this.getSize().x;
-	},
-
-	getScrollTop: function(){
-		return this.getScroll().y;
-	},
-
-	getScrollLeft: function(){
-		return this.getScroll().x;
-	},
-
-	getScrollHeight: function(){
-		return this.getScrollSize().y;
-	},
-
-	getScrollWidth: function(){
-		return this.getScrollSize().x;
-	},
-
-	getTop: function(){
-		return this.getPosition().y;
-	},
-
-	getLeft: function(){
-		return this.getPosition().x;
-	}
-
-});
-
-
-/*
----
-
-name: Fx
-
-description: Contains the basic animation logic to be extended by all other Fx Classes.
-
-license: MIT-style license.
-
-requires: [Chain, Events, Options]
-
-provides: Fx
-
-...
-*/
-
-(function(){
-
-var Fx = this.Fx = new Class({
-
-	Implements: [Chain, Events, Options],
-
-	options: {
-		/*
-		onStart: nil,
-		onCancel: nil,
-		onComplete: nil,
-		*/
-		fps: 60,
-		unit: false,
-		duration: 500,
-		frames: null,
-		frameSkip: true,
-		link: 'ignore'
-	},
-
-	initialize: function(options){
-		this.subject = this.subject || this;
-		this.setOptions(options);
-	},
-
-	getTransition: function(){
-		return function(p){
-			return -(Math.cos(Math.PI * p) - 1) / 2;
-		};
-	},
-
-	step: function(now){
-		if (this.options.frameSkip){
-			var diff = (this.time != null) ? (now - this.time) : 0, frames = diff / this.frameInterval;
-			this.time = now;
-			this.frame += frames;
-		} else {
-			this.frame++;
-		}
-		
-		if (this.frame < this.frames){
-			var delta = this.transition(this.frame / this.frames);
-			this.set(this.compute(this.from, this.to, delta));
-		} else {
-			this.frame = this.frames;
-			this.set(this.compute(this.from, this.to, 1));
-			this.stop();
-		}
-	},
-
-	set: function(now){
-		return now;
-	},
-
-	compute: function(from, to, delta){
-		return Fx.compute(from, to, delta);
-	},
-
-	check: function(){
-		if (!this.isRunning()) return true;
-		switch (this.options.link){
-			case 'cancel': this.cancel(); return true;
-			case 'chain': this.chain(this.caller.pass(arguments, this)); return false;
-		}
-		return false;
-	},
-
-	start: function(from, to){
-		if (!this.check(from, to)) return this;
-		this.from = from;
-		this.to = to;
-		this.frame = (this.options.frameSkip) ? 0 : -1;
-		this.time = null;
-		this.transition = this.getTransition();
-		var frames = this.options.frames, fps = this.options.fps, duration = this.options.duration;
-		this.duration = Fx.Durations[duration] || duration.toInt();
-		this.frameInterval = 1000 / fps;
-		this.frames = frames || Math.round(this.duration / this.frameInterval);
-		this.fireEvent('start', this.subject);
-		pushInstance.call(this, fps);
-		return this;
-	},
-	
-	stop: function(){
-		if (this.isRunning()){
-			this.time = null;
-			pullInstance.call(this, this.options.fps);
-			if (this.frames == this.frame){
-				this.fireEvent('complete', this.subject);
-				if (!this.callChain()) this.fireEvent('chainComplete', this.subject);
-			} else {
-				this.fireEvent('stop', this.subject);
-			}
-		}
-		return this;
-	},
-	
-	cancel: function(){
-		if (this.isRunning()){
-			this.time = null;
-			pullInstance.call(this, this.options.fps);
-			this.frame = this.frames;
-			this.fireEvent('cancel', this.subject).clearChain();
-		}
-		return this;
-	},
-	
-	pause: function(){
-		if (this.isRunning()){
-			this.time = null;
-			pullInstance.call(this, this.options.fps);
-		}
-		return this;
-	},
-	
-	resume: function(){
-		if ((this.frame < this.frames) && !this.isRunning()) pushInstance.call(this, this.options.fps);
-		return this;
-	},
-	
-	isRunning: function(){
-		var list = instances[this.options.fps];
-		return list && list.contains(this);
-	}
-
-});
-
-Fx.compute = function(from, to, delta){
-	return (to - from) * delta + from;
-};
-
-Fx.Durations = {'short': 250, 'normal': 500, 'long': 1000};
-
-// global timers
-
-var instances = {}, timers = {};
-
-var loop = function(){
-	var now = Date.now();
-	for (var i = this.length; i--;){
-		var instance = this[i];
-		if (instance) instance.step(now);
-	}
-};
-
-var pushInstance = function(fps){
-	var list = instances[fps] || (instances[fps] = []);
-	list.push(this);
-	if (!timers[fps]) timers[fps] = loop.periodical(Math.round(1000 / fps), list);
-};
-
-var pullInstance = function(fps){
-	var list = instances[fps];
-	if (list){
-		list.erase(this);
-		if (!list.length && timers[fps]){
-			delete instances[fps];
-			timers[fps] = clearInterval(timers[fps]);
-		}
-	}
-};
-
-})();
-
-
-/*
----
-
-name: Fx.CSS
-
-description: Contains the CSS animation logic. Used by Fx.Tween, Fx.Morph, Fx.Elements.
-
-license: MIT-style license.
-
-requires: [Fx, Element.Style]
-
-provides: Fx.CSS
-
-...
-*/
-
-Fx.CSS = new Class({
-
-	Extends: Fx,
-
-	//prepares the base from/to object
-
-	prepare: function(element, property, values){
-		values = Array.from(values);
-		if (values[1] == null){
-			values[1] = values[0];
-			values[0] = element.getStyle(property);
-		}
-		var parsed = values.map(this.parse);
-		return {from: parsed[0], to: parsed[1]};
-	},
-
-	//parses a value into an array
-
-	parse: function(value){
-		value = Function.from(value)();
-		value = (typeof value == 'string') ? value.split(' ') : Array.from(value);
-		return value.map(function(val){
-			val = String(val);
-			var found = false;
-			Object.each(Fx.CSS.Parsers, function(parser, key){
-				if (found) return;
-				var parsed = parser.parse(val);
-				if (parsed || parsed === 0) found = {value: parsed, parser: parser};
-			});
-			found = found || {value: val, parser: Fx.CSS.Parsers.String};
-			return found;
-		});
-	},
-
-	//computes by a from and to prepared objects, using their parsers.
-
-	compute: function(from, to, delta){
-		var computed = [];
-		(Math.min(from.length, to.length)).times(function(i){
-			computed.push({value: from[i].parser.compute(from[i].value, to[i].value, delta), parser: from[i].parser});
-		});
-		computed.$family = Function.from('fx:css:value');
-		return computed;
-	},
-
-	//serves the value as settable
-
-	serve: function(value, unit){
-		if (typeOf(value) != 'fx:css:value') value = this.parse(value);
-		var returned = [];
-		value.each(function(bit){
-			returned = returned.concat(bit.parser.serve(bit.value, unit));
-		});
-		return returned;
-	},
-
-	//renders the change to an element
-
-	render: function(element, property, value, unit){
-		element.setStyle(property, this.serve(value, unit));
-	},
-
-	//searches inside the page css to find the values for a selector
-
-	search: function(selector){
-		if (Fx.CSS.Cache[selector]) return Fx.CSS.Cache[selector];
-		var to = {}, selectorTest = new RegExp('^' + selector.escapeRegExp() + '$');
-		Array.each(document.styleSheets, function(sheet, j){
-			var href = sheet.href;
-			if (href && href.contains('://') && !href.contains(document.domain)) return;
-			var rules = sheet.rules || sheet.cssRules;
-			Array.each(rules, function(rule, i){
-				if (!rule.style) return;
-				var selectorText = (rule.selectorText) ? rule.selectorText.replace(/^\w+/, function(m){
-					return m.toLowerCase();
-				}) : null;
-				if (!selectorText || !selectorTest.test(selectorText)) return;
-				Object.each(Element.Styles, function(value, style){
-					if (!rule.style[style] || Element.ShortStyles[style]) return;
-					value = String(rule.style[style]);
-					to[style] = ((/^rgb/).test(value)) ? value.rgbToHex() : value;
-				});
-			});
-		});
-		return Fx.CSS.Cache[selector] = to;
-	}
-
-});
-
-Fx.CSS.Cache = {};
-
-Fx.CSS.Parsers = {
-
-	Color: {
-		parse: function(value){
-			if (value.match(/^#[0-9a-f]{3,6}$/i)) return value.hexToRgb(true);
-			return ((value = value.match(/(\d+),\s*(\d+),\s*(\d+)/))) ? [value[1], value[2], value[3]] : false;
-		},
-		compute: function(from, to, delta){
-			return from.map(function(value, i){
-				return Math.round(Fx.compute(from[i], to[i], delta));
-			});
-		},
-		serve: function(value){
-			return value.map(Number);
-		}
-	},
-
-	Number: {
-		parse: parseFloat,
-		compute: Fx.compute,
-		serve: function(value, unit){
-			return (unit) ? value + unit : value;
-		}
-	},
-
-	String: {
-		parse: Function.from(false),
-		compute: function(zero, one){
-			return one;
-		},
-		serve: function(zero){
-			return zero;
-		}
-	}
-
-};
-
-//<1.2compat>
-
-Fx.CSS.Parsers = new Hash(Fx.CSS.Parsers);
-
-//</1.2compat>
-
-
-/*
----
-
-name: Fx.Tween
-
-description: Formerly Fx.Style, effect to transition any CSS property for an element.
-
-license: MIT-style license.
-
-requires: Fx.CSS
-
-provides: [Fx.Tween, Element.fade, Element.highlight]
-
-...
-*/
-
-Fx.Tween = new Class({
-
-	Extends: Fx.CSS,
-
-	initialize: function(element, options){
-		this.element = this.subject = document.id(element);
-		this.parent(options);
-	},
-
-	set: function(property, now){
-		if (arguments.length == 1){
-			now = property;
-			property = this.property || this.options.property;
-		}
-		this.render(this.element, property, now, this.options.unit);
-		return this;
-	},
-
-	start: function(property, from, to){
-		if (!this.check(property, from, to)) return this;
-		var args = Array.flatten(arguments);
-		this.property = this.options.property || args.shift();
-		var parsed = this.prepare(this.element, this.property, args);
-		return this.parent(parsed.from, parsed.to);
-	}
-
-});
-
-Element.Properties.tween = {
-
-	set: function(options){
-		this.get('tween').cancel().setOptions(options);
-		return this;
-	},
-
-	get: function(){
-		var tween = this.retrieve('tween');
-		if (!tween){
-			tween = new Fx.Tween(this, {link: 'cancel'});
-			this.store('tween', tween);
-		}
-		return tween;
-	}
-
-};
-
-Element.implement({
-
-	tween: function(property, from, to){
-		this.get('tween').start(arguments);
-		return this;
-	},
-
-	fade: function(how){
-		var fade = this.get('tween'), o = 'opacity', toggle;
-		how = [how, 'toggle'].pick();
-		switch (how){
-			case 'in': fade.start(o, 1); break;
-			case 'out': fade.start(o, 0); break;
-			case 'show': fade.set(o, 1); break;
-			case 'hide': fade.set(o, 0); break;
-			case 'toggle':
-				var flag = this.retrieve('fade:flag', this.get('opacity') == 1);
-				fade.start(o, (flag) ? 0 : 1);
-				this.store('fade:flag', !flag);
-				toggle = true;
-			break;
-			default: fade.start(o, arguments);
-		}
-		if (!toggle) this.eliminate('fade:flag');
-		return this;
-	},
-
-	highlight: function(start, end){
-		if (!end){
-			end = this.retrieve('highlight:original', this.getStyle('background-color'));
-			end = (end == 'transparent') ? '#fff' : end;
-		}
-		var tween = this.get('tween');
-		tween.start('background-color', start || '#ffff88', end).chain(function(){
-			this.setStyle('background-color', this.retrieve('highlight:original'));
-			tween.callChain();
-		}.bind(this));
-		return this;
-	}
-
-});
-
-
-/*
----
-
-name: Fx.Morph
-
-description: Formerly Fx.Styles, effect to transition any number of CSS properties for an element using an object of rules, or CSS based selector rules.
-
-license: MIT-style license.
-
-requires: Fx.CSS
-
-provides: Fx.Morph
-
-...
-*/
-
-Fx.Morph = new Class({
-
-	Extends: Fx.CSS,
-
-	initialize: function(element, options){
-		this.element = this.subject = document.id(element);
-		this.parent(options);
-	},
-
-	set: function(now){
-		if (typeof now == 'string') now = this.search(now);
-		for (var p in now) this.render(this.element, p, now[p], this.options.unit);
-		return this;
-	},
-
-	compute: function(from, to, delta){
-		var now = {};
-		for (var p in from) now[p] = this.parent(from[p], to[p], delta);
-		return now;
-	},
-
-	start: function(properties){
-		if (!this.check(properties)) return this;
-		if (typeof properties == 'string') properties = this.search(properties);
-		var from = {}, to = {};
-		for (var p in properties){
-			var parsed = this.prepare(this.element, p, properties[p]);
-			from[p] = parsed.from;
-			to[p] = parsed.to;
-		}
-		return this.parent(from, to);
-	}
-
-});
-
-Element.Properties.morph = {
-
-	set: function(options){
-		this.get('morph').cancel().setOptions(options);
-		return this;
-	},
-
-	get: function(){
-		var morph = this.retrieve('morph');
-		if (!morph){
-			morph = new Fx.Morph(this, {link: 'cancel'});
-			this.store('morph', morph);
-		}
-		return morph;
-	}
-
-};
-
-Element.implement({
-
-	morph: function(props){
-		this.get('morph').start(props);
-		return this;
-	}
-
-});
-
-
-/*
----
-
-name: Fx.Transitions
-
-description: Contains a set of advanced transitions to be used with any of the Fx Classes.
-
-license: MIT-style license.
-
-credits:
-  - Easing Equations by Robert Penner, <http://www.robertpenner.com/easing/>, modified and optimized to be used with MooTools.
-
-requires: Fx
-
-provides: Fx.Transitions
-
-...
-*/
-
-Fx.implement({
-
-	getTransition: function(){
-		var trans = this.options.transition || Fx.Transitions.Sine.easeInOut;
-		if (typeof trans == 'string'){
-			var data = trans.split(':');
-			trans = Fx.Transitions;
-			trans = trans[data[0]] || trans[data[0].capitalize()];
-			if (data[1]) trans = trans['ease' + data[1].capitalize() + (data[2] ? data[2].capitalize() : '')];
-		}
-		return trans;
-	}
-
-});
-
-Fx.Transition = function(transition, params){
-	params = Array.from(params);
-	var easeIn = function(pos){
-		return transition(pos, params);
-	};
-	return Object.append(easeIn, {
-		easeIn: easeIn,
-		easeOut: function(pos){
-			return 1 - transition(1 - pos, params);
-		},
-		easeInOut: function(pos){
-			return (pos <= 0.5 ? transition(2 * pos, params) : (2 - transition(2 * (1 - pos), params))) / 2;
-		}
-	});
-};
-
-Fx.Transitions = {
-
-	linear: function(zero){
-		return zero;
-	}
-
-};
-
-//<1.2compat>
-
-Fx.Transitions = new Hash(Fx.Transitions);
-
-//</1.2compat>
-
-Fx.Transitions.extend = function(transitions){
-	for (var transition in transitions) Fx.Transitions[transition] = new Fx.Transition(transitions[transition]);
-};
-
-Fx.Transitions.extend({
-
-	Pow: function(p, x){
-		return Math.pow(p, x && x[0] || 6);
-	},
-
-	Expo: function(p){
-		return Math.pow(2, 8 * (p - 1));
-	},
-
-	Circ: function(p){
-		return 1 - Math.sin(Math.acos(p));
-	},
-
-	Sine: function(p){
-		return 1 - Math.cos(p * Math.PI / 2);
-	},
-
-	Back: function(p, x){
-		x = x && x[0] || 1.618;
-		return Math.pow(p, 2) * ((x + 1) * p - x);
-	},
-
-	Bounce: function(p){
-		var value;
-		for (var a = 0, b = 1; 1; a += b, b /= 2){
-			if (p >= (7 - 4 * a) / 11){
-				value = b * b - Math.pow((11 - 6 * a - 11 * p) / 4, 2);
-				break;
-			}
-		}
-		return value;
-	},
-
-	Elastic: function(p, x){
-		return Math.pow(2, 10 * --p) * Math.cos(20 * p * Math.PI * (x && x[0] || 1) / 3);
-	}
-
-});
-
-['Quad', 'Cubic', 'Quart', 'Quint'].each(function(transition, i){
-	Fx.Transitions[transition] = new Fx.Transition(function(p){
-		return Math.pow(p, i + 2);
-	});
-});
-
-
-/*
----
-
-name: Request
-
-description: Powerful all purpose Request Class. Uses XMLHTTPRequest.
-
-license: MIT-style license.
-
-requires: [Object, Element, Chain, Events, Options, Browser]
-
-provides: Request
-
-...
-*/
-
-(function(){
-
-var empty = function(){},
-	progressSupport = ('onprogress' in new Browser.Request);
-
-var Request = this.Request = new Class({
-
-	Implements: [Chain, Events, Options],
-
-	options: {/*
-		onRequest: function(){},
-		onLoadstart: function(event, xhr){},
-		onProgress: function(event, xhr){},
-		onComplete: function(){},
-		onCancel: function(){},
-		onSuccess: function(responseText, responseXML){},
-		onFailure: function(xhr){},
-		onException: function(headerName, value){},
-		onTimeout: function(){},
-		user: '',
-		password: '',*/
-		url: '',
-		data: '',
-		headers: {
-			'X-Requested-With': 'XMLHttpRequest',
-			'Accept': 'text/javascript, text/html, application/xml, text/xml, */*'
-		},
-		async: true,
-		format: false,
-		method: 'post',
-		link: 'ignore',
-		isSuccess: null,
-		emulation: true,
-		urlEncoded: true,
-		encoding: 'utf-8',
-		evalScripts: false,
-		evalResponse: false,
-		timeout: 0,
-		noCache: false
-	},
-
-	initialize: function(options){
-		this.xhr = new Browser.Request();
-		this.setOptions(options);
-		this.headers = this.options.headers;
-	},
-
-	onStateChange: function(){
-		var xhr = this.xhr;
-		if (xhr.readyState != 4 || !this.running) return;
-		this.running = false;
-		this.status = 0;
-		Function.attempt(function(){
-			var status = xhr.status;
-			this.status = (status == 1223) ? 204 : status;
-		}.bind(this));
-		xhr.onreadystatechange = empty;
-		if (progressSupport) xhr.onprogress = xhr.onloadstart = empty;
-		clearTimeout(this.timer);
-		
-		this.response = {text: this.xhr.responseText || '', xml: this.xhr.responseXML};
-		if (this.options.isSuccess.call(this, this.status))
-			this.success(this.response.text, this.response.xml);
-		else
-			this.failure();
-	},
-
-	isSuccess: function(){
-		var status = this.status;
-		return (status >= 200 && status < 300);
-	},
-
-	isRunning: function(){
-		return !!this.running;
-	},
-
-	processScripts: function(text){
-		if (this.options.evalResponse || (/(ecma|java)script/).test(this.getHeader('Content-type'))) return Browser.exec(text);
-		return text.stripScripts(this.options.evalScripts);
-	},
-
-	success: function(text, xml){
-		this.onSuccess(this.processScripts(text), xml);
-	},
-
-	onSuccess: function(){
-		this.fireEvent('complete', arguments).fireEvent('success', arguments).callChain();
-	},
-
-	failure: function(){
-		this.onFailure();
-	},
-
-	onFailure: function(){
-		this.fireEvent('complete').fireEvent('failure', this.xhr);
-	},
-	
-	loadstart: function(event){
-		this.fireEvent('loadstart', [event, this.xhr]);
-	},
-	
-	progress: function(event){
-		this.fireEvent('progress', [event, this.xhr]);
-	},
-	
-	timeout: function(){
-		this.fireEvent('timeout', this.xhr);
-	},
-
-	setHeader: function(name, value){
-		this.headers[name] = value;
-		return this;
-	},
-
-	getHeader: function(name){
-		return Function.attempt(function(){
-			return this.xhr.getResponseHeader(name);
-		}.bind(this));
-	},
-
-	check: function(){
-		if (!this.running) return true;
-		switch (this.options.link){
-			case 'cancel': this.cancel(); return true;
-			case 'chain': this.chain(this.caller.pass(arguments, this)); return false;
-		}
-		return false;
-	},
-	
-	send: function(options){
-		if (!this.check(options)) return this;
-
-		this.options.isSuccess = this.options.isSuccess || this.isSuccess;
-		this.running = true;
-
-		var type = typeOf(options);
-		if (type == 'string' || type == 'element') options = {data: options};
-
-		var old = this.options;
-		options = Object.append({data: old.data, url: old.url, method: old.method}, options);
-		var data = options.data, url = String(options.url), method = options.method.toLowerCase();
-
-		switch (typeOf(data)){
-			case 'element': data = document.id(data).toQueryString(); break;
-			case 'object': case 'hash': data = Object.toQueryString(data);
-		}
-
-		if (this.options.format){
-			var format = 'format=' + this.options.format;
-			data = (data) ? format + '&' + data : format;
-		}
-
-		if (this.options.emulation && !['get', 'post'].contains(method)){
-			var _method = '_method=' + method;
-			data = (data) ? _method + '&' + data : _method;
-			method = 'post';
-		}
-
-		if (this.options.urlEncoded && ['post', 'put'].contains(method)){
-			var encoding = (this.options.encoding) ? '; charset=' + this.options.encoding : '';
-			this.headers['Content-type'] = 'application/x-www-form-urlencoded' + encoding;
-		}
-
-		if (!url) url = document.location.pathname;
-		
-		var trimPosition = url.lastIndexOf('/');
-		if (trimPosition > -1 && (trimPosition = url.indexOf('#')) > -1) url = url.substr(0, trimPosition);
-
-		if (this.options.noCache)
-			url += (url.contains('?') ? '&' : '?') + String.uniqueID();
-
-		if (data && method == 'get'){
-			url += (url.contains('?') ? '&' : '?') + data;
-			data = null;
-		}
-
-		var xhr = this.xhr;
-		if (progressSupport){
-			xhr.onloadstart = this.loadstart.bind(this);
-			xhr.onprogress = this.progress.bind(this);
-		}
-
-		xhr.open(method.toUpperCase(), url, this.options.async, this.options.user, this.options.password);
-		if (this.options.user && 'withCredentials' in xhr) xhr.withCredentials = true;
-		
-		xhr.onreadystatechange = this.onStateChange.bind(this);
-
-		Object.each(this.headers, function(value, key){
-			try {
-				xhr.setRequestHeader(key, value);
-			} catch (e){
-				this.fireEvent('exception', [key, value]);
-			}
-		}, this);
-
-		this.fireEvent('request');
-		xhr.send(data);
-		if (!this.options.async) this.onStateChange();
-		if (this.options.timeout) this.timer = this.timeout.delay(this.options.timeout, this);
-		return this;
-	},
-
-	cancel: function(){
-		if (!this.running) return this;
-		this.running = false;
-		var xhr = this.xhr;
-		xhr.abort();
-		clearTimeout(this.timer);
-		xhr.onreadystatechange = empty;
-		if (progressSupport) xhr.onprogress = xhr.onloadstart = empty;
-		this.xhr = new Browser.Request();
-		this.fireEvent('cancel');
-		return this;
-	}
-
-});
-
-var methods = {};
-['get', 'post', 'put', 'delete', 'GET', 'POST', 'PUT', 'DELETE'].each(function(method){
-	methods[method] = function(data){
-		var object = {
-			method: method
-		};
-		if (data != null) object.data = data;
-		return this.send(object);
-	};
-});
-
-Request.implement(methods);
-
-Element.Properties.send = {
-
-	set: function(options){
-		var send = this.get('send').cancel();
-		send.setOptions(options);
-		return this;
-	},
-
-	get: function(){
-		var send = this.retrieve('send');
-		if (!send){
-			send = new Request({
-				data: this, link: 'cancel', method: this.get('method') || 'post', url: this.get('action')
-			});
-			this.store('send', send);
-		}
-		return send;
-	}
-
-};
-
-Element.implement({
-
-	send: function(url){
-		var sender = this.get('send');
-		sender.send({data: this, url: url || sender.options.url});
-		return this;
-	}
-
-});
-
-})();
-
-/*
----
-
-name: Request.HTML
-
-description: Extends the basic Request Class with additional methods for interacting with HTML responses.
-
-license: MIT-style license.
-
-requires: [Element, Request]
-
-provides: Request.HTML
-
-...
-*/
-
-Request.HTML = new Class({
-
-	Extends: Request,
-
-	options: {
-		update: false,
-		append: false,
-		evalScripts: true,
-		filter: false,
-		headers: {
-			Accept: 'text/html, application/xml, text/xml, */*'
-		}
-	},
-
-	success: function(text){
-		var options = this.options, response = this.response;
-
-		response.html = text.stripScripts(function(script){
-			response.javascript = script;
-		});
-
-		var match = response.html.match(/<body[^>]*>([\s\S]*?)<\/body>/i);
-		if (match) response.html = match[1];
-		var temp = new Element('div').set('html', response.html);
-
-		response.tree = temp.childNodes;
-		response.elements = temp.getElements('*');
-
-		if (options.filter) response.tree = response.elements.filter(options.filter);
-		if (options.update) document.id(options.update).empty().set('html', response.html);
-		else if (options.append) document.id(options.append).adopt(temp.getChildren());
-		if (options.evalScripts) Browser.exec(response.javascript);
-
-		this.onSuccess(response.tree, response.elements, response.html, response.javascript);
-	}
-
-});
-
-Element.Properties.load = {
-
-	set: function(options){
-		var load = this.get('load').cancel();
-		load.setOptions(options);
-		return this;
-	},
-
-	get: function(){
-		var load = this.retrieve('load');
-		if (!load){
-			load = new Request.HTML({data: this, link: 'cancel', update: this, method: 'get'});
-			this.store('load', load);
-		}
-		return load;
-	}
-
-};
-
-Element.implement({
-
-	load: function(){
-		this.get('load').send(Array.link(arguments, {data: Type.isObject, url: Type.isString}));
-		return this;
-	}
-
-});
-
-
-/*
----
-
-name: JSON
-
-description: JSON encoder and decoder.
-
-license: MIT-style license.
-
-See Also: <http://www.json.org/>
-
-requires: [Array, String, Number, Function]
-
-provides: JSON
-
-...
-*/
-
-if (typeof JSON == 'undefined') this.JSON = {};
-
-//<1.2compat>
-
-JSON = new Hash({
-	stringify: JSON.stringify,
-	parse: JSON.parse
-});
-
-//</1.2compat>
-
-(function(){
-
-var special = {'\b': '\\b', '\t': '\\t', '\n': '\\n', '\f': '\\f', '\r': '\\r', '"' : '\\"', '\\': '\\\\'};
-
-var escape = function(chr){
-	return special[chr] || '\\u' + ('0000' + chr.charCodeAt(0).toString(16)).slice(-4);
-};
-
-JSON.validate = function(string){
-	string = string.replace(/\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g, '@').
-					replace(/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g, ']').
-					replace(/(?:^|:|,)(?:\s*\[)+/g, '');
-
-	return (/^[\],:{}\s]*$/).test(string);
-};
-
-JSON.encode = JSON.stringify ? function(obj){
-	return JSON.stringify(obj);
-} : function(obj){
-	if (obj && obj.toJSON) obj = obj.toJSON();
-
-	switch (typeOf(obj)){
-		case 'string':
-			return '"' + obj.replace(/[\x00-\x1f\\"]/g, escape) + '"';
-		case 'array':
-			return '[' + obj.map(JSON.encode).clean() + ']';
-		case 'object': case 'hash':
-			var string = [];
-			Object.each(obj, function(value, key){
-				var json = JSON.encode(value);
-				if (json) string.push(JSON.encode(key) + ':' + json);
-			});
-			return '{' + string + '}';
-		case 'number': case 'boolean': return '' + obj;
-		case 'null': return 'null';
-	}
-
-	return null;
-};
-
-JSON.decode = function(string, secure){
-	if (!string || typeOf(string) != 'string') return null;
-
-	if (secure || JSON.secure){
-		if (JSON.parse) return JSON.parse(string);
-		if (!JSON.validate(string)) throw new Error('JSON could not decode the input; security is enabled and the value is not secure.');
-	}
-
-	return eval('(' + string + ')');
-};
-
-})();
-
-
-/*
----
-
-name: Request.JSON
-
-description: Extends the basic Request Class with additional methods for sending and receiving JSON data.
-
-license: MIT-style license.
-
-requires: [Request, JSON]
-
-provides: Request.JSON
-
-...
-*/
-
-Request.JSON = new Class({
-
-	Extends: Request,
-
-	options: {
-		/*onError: function(text, error){},*/
-		secure: true
-	},
-
-	initialize: function(options){
-		this.parent(options);
-		Object.append(this.headers, {
-			'Accept': 'application/json',
-			'X-Request': 'JSON'
-		});
-	},
-
-	success: function(text){
-		var json;
-		try {
-			json = this.response.json = JSON.decode(text, this.options.secure);
-		} catch (error){
-			this.fireEvent('error', [text, error]);
-			return;
-		}
-		if (json == null) this.onFailure();
-		else this.onSuccess(json, text);
-	}
-
-});
-
-
-/*
----
-
-name: Cookie
-
-description: Class for creating, reading, and deleting browser Cookies.
-
-license: MIT-style license.
-
-credits:
-  - Based on the functions by Peter-Paul Koch (http://quirksmode.org).
-
-requires: [Options, Browser]
-
-provides: Cookie
-
-...
-*/
-
-var Cookie = new Class({
-
-	Implements: Options,
-
-	options: {
-		path: '/',
-		domain: false,
-		duration: false,
-		secure: false,
-		document: document,
-		encode: true
-	},
-
-	initialize: function(key, options){
-		this.key = key;
-		this.setOptions(options);
-	},
-
-	write: function(value){
-		if (this.options.encode) value = encodeURIComponent(value);
-		if (this.options.domain) value += '; domain=' + this.options.domain;
-		if (this.options.path) value += '; path=' + this.options.path;
-		if (this.options.duration){
-			var date = new Date();
-			date.setTime(date.getTime() + this.options.duration * 24 * 60 * 60 * 1000);
-			value += '; expires=' + date.toGMTString();
-		}
-		if (this.options.secure) value += '; secure';
-		this.options.document.cookie = this.key + '=' + value;
-		return this;
-	},
-
-	read: function(){
-		var value = this.options.document.cookie.match('(?:^|;)\\s*' + this.key.escapeRegExp() + '=([^;]*)');
-		return (value) ? decodeURIComponent(value[1]) : null;
-	},
-
-	dispose: function(){
-		new Cookie(this.key, Object.merge({}, this.options, {duration: -1})).write('');
-		return this;
-	}
-
-});
-
-Cookie.write = function(key, value, options){
-	return new Cookie(key, options).write(value);
-};
-
-Cookie.read = function(key){
-	return new Cookie(key).read();
-};
-
-Cookie.dispose = function(key, options){
-	return new Cookie(key, options).dispose();
-};
-
-
-/*
----
-
-name: DOMReady
-
-description: Contains the custom event domready.
-
-license: MIT-style license.
-
-requires: [Browser, Element, Element.Event]
-
-provides: [DOMReady, DomReady]
-
-...
-*/
-
-(function(window, document){
-
-var ready,
-	loaded,
-	checks = [],
-	shouldPoll,
-	timer,
-	testElement = document.createElement('div');
-
-var domready = function(){
-	clearTimeout(timer);
-	if (ready) return;
-	Browser.loaded = ready = true;
-	document.removeListener('DOMContentLoaded', domready).removeListener('readystatechange', check);
-	
-	document.fireEvent('domready');
-	window.fireEvent('domready');
-};
-
-var check = function(){
-	for (var i = checks.length; i--;) if (checks[i]()){
-		domready();
-		return true;
-	}
-	return false;
-};
-
-var poll = function(){
-	clearTimeout(timer);
-	if (!check()) timer = setTimeout(poll, 10);
-};
-
-document.addListener('DOMContentLoaded', domready);
-
-/*<ltIE8>*/
-// doScroll technique by Diego Perini http://javascript.nwbox.com/IEContentLoaded/
-// testElement.doScroll() throws when the DOM is not ready, only in the top window
-var doScrollWorks = function(){
-	try {
-		testElement.doScroll();
-		return true;
-	} catch (e){}
-	return false;
-}
-// If doScroll works already, it can't be used to determine domready
-//   e.g. in an iframe
-if (testElement.doScroll && !doScrollWorks()){
-	checks.push(doScrollWorks);
-	shouldPoll = true;
-}
-/*</ltIE8>*/
-
-if (document.readyState) checks.push(function(){
-	var state = document.readyState;
-	return (state == 'loaded' || state == 'complete');
-});
-
-if ('onreadystatechange' in document) document.addListener('readystatechange', check);
-else shouldPoll = true;
-
-if (shouldPoll) poll();
-
-Element.Events.domready = {
-	onAdd: function(fn){
-		if (ready) fn.call(this);
-	}
-};
-
-// Make sure that domready fires before load
-Element.Events.load = {
-	base: 'load',
-	onAdd: function(fn){
-		if (loaded && this == window) fn.call(this);
-	},
-	condition: function(){
-		if (this == window){
-			domready();
-			delete Element.Events.load;
-		}
-		return true;
-	}
-};
-
-// This is based on the custom load event
-window.addEvent('load', function(){
-	loaded = true;
-});
-
-})(window, document);
-
-
-/*
----
-
-name: Swiff
-
-description: Wrapper for embedding SWF movies. Supports External Interface Communication.
-
-license: MIT-style license.
-
-credits:
-  - Flash detection & Internet Explorer + Flash Player 9 fix inspired by SWFObject.
-
-requires: [Options, Object, Element]
-
-provides: Swiff
-
-...
-*/
-
-(function(){
-
-var Swiff = this.Swiff = new Class({
-
-	Implements: Options,
-
-	options: {
-		id: null,
-		height: 1,
-		width: 1,
-		container: null,
-		properties: {},
-		params: {
-			quality: 'high',
-			allowScriptAccess: 'always',
-			wMode: 'window',
-			swLiveConnect: true
-		},
-		callBacks: {},
-		vars: {}
-	},
-
-	toElement: function(){
-		return this.object;
-	},
-
-	initialize: function(path, options){
-		this.instance = 'Swiff_' + String.uniqueID();
-
-		this.setOptions(options);
-		options = this.options;
-		var id = this.id = options.id || this.instance;
-		var container = document.id(options.container);
-
-		Swiff.CallBacks[this.instance] = {};
-
-		var params = options.params, vars = options.vars, callBacks = options.callBacks;
-		var properties = Object.append({height: options.height, width: options.width}, options.properties);
-
-		var self = this;
-
-		for (var callBack in callBacks){
-			Swiff.CallBacks[this.instance][callBack] = (function(option){
-				return function(){
-					return option.apply(self.object, arguments);
-				};
-			})(callBacks[callBack]);
-			vars[callBack] = 'Swiff.CallBacks.' + this.instance + '.' + callBack;
-		}
-
-		params.flashVars = Object.toQueryString(vars);
-		if (Browser.ie){
-			properties.classid = 'clsid:D27CDB6E-AE6D-11cf-96B8-444553540000';
-			params.movie = path;
-		} else {
-			properties.type = 'application/x-shockwave-flash';
-		}
-		properties.data = path;
-
-		var build = '<object id="' + id + '"';
-		for (var property in properties) build += ' ' + property + '="' + properties[property] + '"';
-		build += '>';
-		for (var param in params){
-			if (params[param]) build += '<param name="' + param + '" value="' + params[param] + '" />';
-		}
-		build += '</object>';
-		this.object = ((container) ? container.empty() : new Element('div')).set('html', build).firstChild;
-	},
-
-	replaces: function(element){
-		element = document.id(element, true);
-		element.parentNode.replaceChild(this.toElement(), element);
-		return this;
-	},
-
-	inject: function(element){
-		document.id(element, true).appendChild(this.toElement());
-		return this;
-	},
-
-	remote: function(){
-		return Swiff.remote.apply(Swiff, [this.toElement()].append(arguments));
-	}
-
-});
-
-Swiff.CallBacks = {};
-
-Swiff.remote = function(obj, fn){
-	var rs = obj.CallFunction('<invoke name="' + fn + '" returntype="javascript">' + __flash__argumentsToXML(arguments, 2) + '</invoke>');
-	return eval(rs);
-};
-
-})();
-
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/libraries/MooTools-Core-1.6.0.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/libraries/MooTools-Core-1.6.0.js
deleted file mode 100644
index f35c54f..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/libraries/MooTools-Core-1.6.0.js
+++ /dev/null
@@ -1,6382 +0,0 @@
-/* MooTools: the javascript framework. license: MIT-style license. copyright: Copyright (c) 2006-2018 [Valerio Proietti](https://mootools.net/).*/ 
-/*!
-Web Build: https://mootools.net/core/builder/e426a9ae7167c5807b173d5deff673fc
-*/
-/*
----
-
-name: Core
-
-description: The heart of MooTools.
-
-license: MIT-style license.
-
-copyright: Copyright (c) 2006-2015 [Valerio Proietti](https://github.com/kamicane/).
-
-authors: The MooTools production team (http://mootools.net/developers/)
-
-inspiration:
-  - Class implementation inspired by [Base.js](http://dean.edwards.name/weblog/2006/03/base/) Copyright (c) 2006 Dean Edwards, [GNU Lesser General Public License](http://opensource.org/licenses/lgpl-license.php)
-  - Some functionality inspired by [Prototype.js](http://prototypejs.org) Copyright (c) 2005-2007 Sam Stephenson, [MIT License](http://opensource.org/licenses/mit-license.php)
-
-provides: [Core, MooTools, Type, typeOf, instanceOf, Native]
-
-...
-*/
-/*! MooTools: the javascript framework. license: MIT-style license. copyright: Copyright (c) 2006-2015 [Valerio Proietti](https://github.com/kamicane/).*/
-(function(){
-
-this.MooTools = {
-	version: '1.6.0',
-	build: '529422872adfff401b901b8b6c7ca5114ee95e2b'
-};
-
-// typeOf, instanceOf
-
-var typeOf = this.typeOf = function(item){
-	if (item == null) return 'null';
-	if (item.$family != null) return item.$family();
-
-	if (item.nodeName){
-		if (item.nodeType == 1) return 'element';
-		if (item.nodeType == 3) return (/\S/).test(item.nodeValue) ? 'textnode' : 'whitespace';
-	} else if (typeof item.length == 'number'){
-		if ('callee' in item) return 'arguments';
-		if ('item' in item) return 'collection';
-	}
-
-	return typeof item;
-};
-
-var instanceOf = this.instanceOf = function(item, object){
-	if (item == null) return false;
-	var constructor = item.$constructor || item.constructor;
-	while (constructor){
-		if (constructor === object) return true;
-		constructor = constructor.parent;
-	}
-	/*<ltIE8>*/
-	if (!item.hasOwnProperty) return false;
-	/*</ltIE8>*/
-	return item instanceof object;
-};
-
-var hasOwnProperty = Object.prototype.hasOwnProperty;
-
-/*<ltIE8>*/
-var enumerables = true;
-for (var i in {toString: 1}) enumerables = null;
-if (enumerables) enumerables = ['hasOwnProperty', 'valueOf', 'isPrototypeOf', 'propertyIsEnumerable', 'toLocaleString', 'toString', 'constructor'];
-function forEachObjectEnumberableKey(object, fn, bind){
-	if (enumerables) for (var i = enumerables.length; i--;){
-		var k = enumerables[i];
-		// signature has key-value, so overloadSetter can directly pass the
-		// method function, without swapping arguments.
-		if (hasOwnProperty.call(object, k)) fn.call(bind, k, object[k]);
-	}
-}
-/*</ltIE8>*/
-
-// Function overloading
-
-var Function = this.Function;
-
-Function.prototype.overloadSetter = function(usePlural){
-	var self = this;
-	return function(a, b){
-		if (a == null) return this;
-		if (usePlural || typeof a != 'string'){
-			for (var k in a) self.call(this, k, a[k]);
-			/*<ltIE8>*/
-			forEachObjectEnumberableKey(a, self, this);
-			/*</ltIE8>*/
-		} else {
-			self.call(this, a, b);
-		}
-		return this;
-	};
-};
-
-Function.prototype.overloadGetter = function(usePlural){
-	var self = this;
-	return function(a){
-		var args, result;
-		if (typeof a != 'string') args = a;
-		else if (arguments.length > 1) args = arguments;
-		else if (usePlural) args = [a];
-		if (args){
-			result = {};
-			for (var i = 0; i < args.length; i++) result[args[i]] = self.call(this, args[i]);
-		} else {
-			result = self.call(this, a);
-		}
-		return result;
-	};
-};
-
-Function.prototype.extend = function(key, value){
-	this[key] = value;
-}.overloadSetter();
-
-Function.prototype.implement = function(key, value){
-	this.prototype[key] = value;
-}.overloadSetter();
-
-// From
-
-var slice = Array.prototype.slice;
-
-Array.convert = function(item){
-	if (item == null) return [];
-	return (Type.isEnumerable(item) && typeof item != 'string') ? (typeOf(item) == 'array') ? item : slice.call(item) : [item];
-};
-
-Function.convert = function(item){
-	return (typeOf(item) == 'function') ? item : function(){
-		return item;
-	};
-};
-
-
-Number.convert = function(item){
-	var number = parseFloat(item);
-	return isFinite(number) ? number : null;
-};
-
-String.convert = function(item){
-	return item + '';
-};
-
-
-
-Function.from = Function.convert;
-Number.from = Number.convert;
-String.from = String.convert;
-
-// hide, protect
-
-Function.implement({
-
-	hide: function(){
-		this.$hidden = true;
-		return this;
-	},
-
-	protect: function(){
-		this.$protected = true;
-		return this;
-	}
-
-});
-
-// Type
-
-var Type = this.Type = function(name, object){
-	if (name){
-		var lower = name.toLowerCase();
-		var typeCheck = function(item){
-			return (typeOf(item) == lower);
-		};
-
-		Type['is' + name] = typeCheck;
-		if (object != null){
-			object.prototype.$family = (function(){
-				return lower;
-			}).hide();
-			
-		}
-	}
-
-	if (object == null) return null;
-
-	object.extend(this);
-	object.$constructor = Type;
-	object.prototype.$constructor = object;
-
-	return object;
-};
-
-var toString = Object.prototype.toString;
-
-Type.isEnumerable = function(item){
-	return (item != null && typeof item.length == 'number' && toString.call(item) != '[object Function]' );
-};
-
-var hooks = {};
-
-var hooksOf = function(object){
-	var type = typeOf(object.prototype);
-	return hooks[type] || (hooks[type] = []);
-};
-
-var implement = function(name, method){
-	if (method && method.$hidden) return;
-
-	var hooks = hooksOf(this);
-
-	for (var i = 0; i < hooks.length; i++){
-		var hook = hooks[i];
-		if (typeOf(hook) == 'type') implement.call(hook, name, method);
-		else hook.call(this, name, method);
-	}
-
-	var previous = this.prototype[name];
-	if (previous == null || !previous.$protected) this.prototype[name] = method;
-
-	if (this[name] == null && typeOf(method) == 'function') extend.call(this, name, function(item){
-		return method.apply(item, slice.call(arguments, 1));
-	});
-};
-
-var extend = function(name, method){
-	if (method && method.$hidden) return;
-	var previous = this[name];
-	if (previous == null || !previous.$protected) this[name] = method;
-};
-
-Type.implement({
-
-	implement: implement.overloadSetter(),
-
-	extend: extend.overloadSetter(),
-
-	alias: function(name, existing){
-		implement.call(this, name, this.prototype[existing]);
-	}.overloadSetter(),
-
-	mirror: function(hook){
-		hooksOf(this).push(hook);
-		return this;
-	}
-
-});
-
-new Type('Type', Type);
-
-// Default Types
-
-var force = function(name, object, methods){
-	var isType = (object != Object),
-		prototype = object.prototype;
-
-	if (isType) object = new Type(name, object);
-
-	for (var i = 0, l = methods.length; i < l; i++){
-		var key = methods[i],
-			generic = object[key],
-			proto = prototype[key];
-
-		if (generic) generic.protect();
-		if (isType && proto) object.implement(key, proto.protect());
-	}
-
-	if (isType){
-		var methodsEnumerable = prototype.propertyIsEnumerable(methods[0]);
-		object.forEachMethod = function(fn){
-			if (!methodsEnumerable) for (var i = 0, l = methods.length; i < l; i++){
-				fn.call(prototype, prototype[methods[i]], methods[i]);
-			}
-			for (var key in prototype) fn.call(prototype, prototype[key], key);
-		};
-	}
-
-	return force;
-};
-
-force('String', String, [
-	'charAt', 'charCodeAt', 'concat', 'contains', 'indexOf', 'lastIndexOf', 'match', 'quote', 'replace', 'search',
-	'slice', 'split', 'substr', 'substring', 'trim', 'toLowerCase', 'toUpperCase'
-])('Array', Array, [
-	'pop', 'push', 'reverse', 'shift', 'sort', 'splice', 'unshift', 'concat', 'join', 'slice',
-	'indexOf', 'lastIndexOf', 'filter', 'forEach', 'every', 'map', 'some', 'reduce', 'reduceRight', 'contains'
-])('Number', Number, [
-	'toExponential', 'toFixed', 'toLocaleString', 'toPrecision'
-])('Function', Function, [
-	'apply', 'call', 'bind'
-])('RegExp', RegExp, [
-	'exec', 'test'
-])('Object', Object, [
-	'create', 'defineProperty', 'defineProperties', 'keys',
-	'getPrototypeOf', 'getOwnPropertyDescriptor', 'getOwnPropertyNames',
-	'preventExtensions', 'isExtensible', 'seal', 'isSealed', 'freeze', 'isFrozen'
-])('Date', Date, ['now']);
-
-Object.extend = extend.overloadSetter();
-
-Date.extend('now', function(){
-	return +(new Date);
-});
-
-new Type('Boolean', Boolean);
-
-// fixes NaN returning as Number
-
-Number.prototype.$family = function(){
-	return isFinite(this) ? 'number' : 'null';
-}.hide();
-
-// Number.random
-
-Number.extend('random', function(min, max){
-	return Math.floor(Math.random() * (max - min + 1) + min);
-});
-
-// forEach, each, keys
-
-Array.implement({
-
-	/*<!ES5>*/
-	forEach: function(fn, bind){
-		for (var i = 0, l = this.length; i < l; i++){
-			if (i in this) fn.call(bind, this[i], i, this);
-		}
-	},
-	/*</!ES5>*/
-
-	each: function(fn, bind){
-		Array.forEach(this, fn, bind);
-		return this;
-	}
-
-});
-
-Object.extend({
-
-	keys: function(object){
-		var keys = [];
-		for (var k in object){
-			if (hasOwnProperty.call(object, k)) keys.push(k);
-		}
-		/*<ltIE8>*/
-		forEachObjectEnumberableKey(object, function(k){
-			keys.push(k);
-		});
-		/*</ltIE8>*/
-		return keys;
-	},
-
-	forEach: function(object, fn, bind){
-		Object.keys(object).forEach(function(key){
-			fn.call(bind, object[key], key, object);
-		});
-	}
-
-});
-
-Object.each = Object.forEach;
-
-
-// Array & Object cloning, Object merging and appending
-
-var cloneOf = function(item){
-	switch (typeOf(item)){
-		case 'array': return item.clone();
-		case 'object': return Object.clone(item);
-		default: return item;
-	}
-};
-
-Array.implement('clone', function(){
-	var i = this.length, clone = new Array(i);
-	while (i--) clone[i] = cloneOf(this[i]);
-	return clone;
-});
-
-var mergeOne = function(source, key, current){
-	switch (typeOf(current)){
-		case 'object':
-			if (typeOf(source[key]) == 'object') Object.merge(source[key], current);
-			else source[key] = Object.clone(current);
-			break;
-		case 'array': source[key] = current.clone(); break;
-		default: source[key] = current;
-	}
-	return source;
-};
-
-Object.extend({
-
-	merge: function(source, k, v){
-		if (typeOf(k) == 'string') return mergeOne(source, k, v);
-		for (var i = 1, l = arguments.length; i < l; i++){
-			var object = arguments[i];
-			for (var key in object) mergeOne(source, key, object[key]);
-		}
-		return source;
-	},
-
-	clone: function(object){
-		var clone = {};
-		for (var key in object) clone[key] = cloneOf(object[key]);
-		return clone;
-	},
-
-	append: function(original){
-		for (var i = 1, l = arguments.length; i < l; i++){
-			var extended = arguments[i] || {};
-			for (var key in extended) original[key] = extended[key];
-		}
-		return original;
-	}
-
-});
-
-// Object-less types
-
-['Object', 'WhiteSpace', 'TextNode', 'Collection', 'Arguments'].each(function(name){
-	new Type(name);
-});
-
-// Unique ID
-
-var UID = Date.now();
-
-String.extend('uniqueID', function(){
-	return (UID++).toString(36);
-});
-
-
-
-})();
-
-/*
----
-
-name: Array
-
-description: Contains Array Prototypes like each, contains, and erase.
-
-license: MIT-style license.
-
-requires: [Type]
-
-provides: Array
-
-...
-*/
-
-Array.implement({
-
-	/*<!ES5>*/
-	every: function(fn, bind){
-		for (var i = 0, l = this.length >>> 0; i < l; i++){
-			if ((i in this) && !fn.call(bind, this[i], i, this)) return false;
-		}
-		return true;
-	},
-
-	filter: function(fn, bind){
-		var results = [];
-		for (var value, i = 0, l = this.length >>> 0; i < l; i++) if (i in this){
-			value = this[i];
-			if (fn.call(bind, value, i, this)) results.push(value);
-		}
-		return results;
-	},
-
-	indexOf: function(item, from){
-		var length = this.length >>> 0;
-		for (var i = (from < 0) ? Math.max(0, length + from) : from || 0; i < length; i++){
-			if (this[i] === item) return i;
-		}
-		return -1;
-	},
-
-	map: function(fn, bind){
-		var length = this.length >>> 0, results = Array(length);
-		for (var i = 0; i < length; i++){
-			if (i in this) results[i] = fn.call(bind, this[i], i, this);
-		}
-		return results;
-	},
-
-	some: function(fn, bind){
-		for (var i = 0, l = this.length >>> 0; i < l; i++){
-			if ((i in this) && fn.call(bind, this[i], i, this)) return true;
-		}
-		return false;
-	},
-	/*</!ES5>*/
-
-	clean: function(){
-		return this.filter(function(item){
-			return item != null;
-		});
-	},
-
-	invoke: function(methodName){
-		var args = Array.slice(arguments, 1);
-		return this.map(function(item){
-			return item[methodName].apply(item, args);
-		});
-	},
-
-	associate: function(keys){
-		var obj = {}, length = Math.min(this.length, keys.length);
-		for (var i = 0; i < length; i++) obj[keys[i]] = this[i];
-		return obj;
-	},
-
-	link: function(object){
-		var result = {};
-		for (var i = 0, l = this.length; i < l; i++){
-			for (var key in object){
-				if (object[key](this[i])){
-					result[key] = this[i];
-					delete object[key];
-					break;
-				}
-			}
-		}
-		return result;
-	},
-
-	contains: function(item, from){
-		return this.indexOf(item, from) != -1;
-	},
-
-	append: function(array){
-		this.push.apply(this, array);
-		return this;
-	},
-
-	getLast: function(){
-		return (this.length) ? this[this.length - 1] : null;
-	},
-
-	getRandom: function(){
-		return (this.length) ? this[Number.random(0, this.length - 1)] : null;
-	},
-
-	include: function(item){
-		if (!this.contains(item)) this.push(item);
-		return this;
-	},
-
-	combine: function(array){
-		for (var i = 0, l = array.length; i < l; i++) this.include(array[i]);
-		return this;
-	},
-
-	erase: function(item){
-		for (var i = this.length; i--;){
-			if (this[i] === item) this.splice(i, 1);
-		}
-		return this;
-	},
-
-	empty: function(){
-		this.length = 0;
-		return this;
-	},
-
-	flatten: function(){
-		var array = [];
-		for (var i = 0, l = this.length; i < l; i++){
-			var type = typeOf(this[i]);
-			if (type == 'null') continue;
-			array = array.concat((type == 'array' || type == 'collection' || type == 'arguments' || instanceOf(this[i], Array)) ? Array.flatten(this[i]) : this[i]);
-		}
-		return array;
-	},
-
-	pick: function(){
-		for (var i = 0, l = this.length; i < l; i++){
-			if (this[i] != null) return this[i];
-		}
-		return null;
-	},
-
-	hexToRgb: function(array){
-		if (this.length != 3) return null;
-		var rgb = this.map(function(value){
-			if (value.length == 1) value += value;
-			return parseInt(value, 16);
-		});
-		return (array) ? rgb : 'rgb(' + rgb + ')';
-	},
-
-	rgbToHex: function(array){
-		if (this.length < 3) return null;
-		if (this.length == 4 && this[3] == 0 && !array) return 'transparent';
-		var hex = [];
-		for (var i = 0; i < 3; i++){
-			var bit = (this[i] - 0).toString(16);
-			hex.push((bit.length == 1) ? '0' + bit : bit);
-		}
-		return (array) ? hex : '#' + hex.join('');
-	}
-
-});
-
-
-
-/*
----
-
-name: Function
-
-description: Contains Function Prototypes like create, bind, pass, and delay.
-
-license: MIT-style license.
-
-requires: Type
-
-provides: Function
-
-...
-*/
-
-Function.extend({
-
-	attempt: function(){
-		for (var i = 0, l = arguments.length; i < l; i++){
-			try {
-				return arguments[i]();
-			} catch (e){}
-		}
-		return null;
-	}
-
-});
-
-Function.implement({
-
-	attempt: function(args, bind){
-		try {
-			return this.apply(bind, Array.convert(args));
-		} catch (e){}
-
-		return null;
-	},
-
-	/*<!ES5-bind>*/
-	bind: function(that){
-		var self = this,
-			args = arguments.length > 1 ? Array.slice(arguments, 1) : null,
-			F = function(){};
-
-		var bound = function(){
-			var context = that, length = arguments.length;
-			if (this instanceof bound){
-				F.prototype = self.prototype;
-				context = new F;
-			}
-			var result = (!args && !length)
-				? self.call(context)
-				: self.apply(context, args && length ? args.concat(Array.slice(arguments)) : args || arguments);
-			return context == that ? result : context;
-		};
-		return bound;
-	},
-	/*</!ES5-bind>*/
-
-	pass: function(args, bind){
-		var self = this;
-		if (args != null) args = Array.convert(args);
-		return function(){
-			return self.apply(bind, args || arguments);
-		};
-	},
-
-	delay: function(delay, bind, args){
-		return setTimeout(this.pass((args == null ? [] : args), bind), delay);
-	},
-
-	periodical: function(periodical, bind, args){
-		return setInterval(this.pass((args == null ? [] : args), bind), periodical);
-	}
-
-});
-
-
-
-/*
----
-
-name: Number
-
-description: Contains Number Prototypes like limit, round, times, and ceil.
-
-license: MIT-style license.
-
-requires: Type
-
-provides: Number
-
-...
-*/
-
-Number.implement({
-
-	limit: function(min, max){
-		return Math.min(max, Math.max(min, this));
-	},
-
-	round: function(precision){
-		precision = Math.pow(10, precision || 0).toFixed(precision < 0 ? -precision : 0);
-		return Math.round(this * precision) / precision;
-	},
-
-	times: function(fn, bind){
-		for (var i = 0; i < this; i++) fn.call(bind, i, this);
-	},
-
-	toFloat: function(){
-		return parseFloat(this);
-	},
-
-	toInt: function(base){
-		return parseInt(this, base || 10);
-	}
-
-});
-
-Number.alias('each', 'times');
-
-(function(math){
-
-var methods = {};
-
-math.each(function(name){
-	if (!Number[name]) methods[name] = function(){
-		return Math[name].apply(null, [this].concat(Array.convert(arguments)));
-	};
-});
-
-Number.implement(methods);
-
-})(['abs', 'acos', 'asin', 'atan', 'atan2', 'ceil', 'cos', 'exp', 'floor', 'log', 'max', 'min', 'pow', 'sin', 'sqrt', 'tan']);
-
-/*
----
-
-name: String
-
-description: Contains String Prototypes like camelCase, capitalize, test, and toInt.
-
-license: MIT-style license.
-
-requires: [Type, Array]
-
-provides: String
-
-...
-*/
-
-String.implement({
-
-	//<!ES6>
-	contains: function(string, index){
-		return (index ? String(this).slice(index) : String(this)).indexOf(string) > -1;
-	},
-	//</!ES6>
-
-	test: function(regex, params){
-		return ((typeOf(regex) == 'regexp') ? regex : new RegExp('' + regex, params)).test(this);
-	},
-
-	trim: function(){
-		return String(this).replace(/^\s+|\s+$/g, '');
-	},
-
-	clean: function(){
-		return String(this).replace(/\s+/g, ' ').trim();
-	},
-
-	camelCase: function(){
-		return String(this).replace(/-\D/g, function(match){
-			return match.charAt(1).toUpperCase();
-		});
-	},
-
-	hyphenate: function(){
-		return String(this).replace(/[A-Z]/g, function(match){
-			return ('-' + match.charAt(0).toLowerCase());
-		});
-	},
-
-	capitalize: function(){
-		return String(this).replace(/\b[a-z]/g, function(match){
-			return match.toUpperCase();
-		});
-	},
-
-	escapeRegExp: function(){
-		return String(this).replace(/([-.*+?^${}()|[\]\/\\])/g, '\\$1');
-	},
-
-	toInt: function(base){
-		return parseInt(this, base || 10);
-	},
-
-	toFloat: function(){
-		return parseFloat(this);
-	},
-
-	hexToRgb: function(array){
-		var hex = String(this).match(/^#?(\w{1,2})(\w{1,2})(\w{1,2})$/);
-		return (hex) ? hex.slice(1).hexToRgb(array) : null;
-	},
-
-	rgbToHex: function(array){
-		var rgb = String(this).match(/\d{1,3}/g);
-		return (rgb) ? rgb.rgbToHex(array) : null;
-	},
-
-	substitute: function(object, regexp){
-		return String(this).replace(regexp || (/\\?\{([^{}]+)\}/g), function(match, name){
-			if (match.charAt(0) == '\\') return match.slice(1);
-			return (object[name] != null) ? object[name] : '';
-		});
-	}
-
-});
-
-
-
-/*
----
-
-name: Browser
-
-description: The Browser Object. Contains Browser initialization, Window and Document, and the Browser Hash.
-
-license: MIT-style license.
-
-requires: [Array, Function, Number, String]
-
-provides: [Browser, Window, Document]
-
-...
-*/
-
-(function(){
-
-var document = this.document;
-var window = document.window = this;
-
-var parse = function(ua, platform){
-	ua = ua.toLowerCase();
-	platform = (platform ? platform.toLowerCase() : '');
-
-	// chrome is included in the edge UA, so need to check for edge first,
-	// before checking if it's chrome.
-	var UA = ua.match(/(edge)[\s\/:]([\w\d\.]+)/);
-	if (!UA){
-		UA = ua.match(/(opera|ie|firefox|chrome|trident|crios|version)[\s\/:]([\w\d\.]+)?.*?(safari|(?:rv[\s\/:]|version[\s\/:])([\w\d\.]+)|$)/) || [null, 'unknown', 0];
-	}
-
-	if (UA[1] == 'trident'){
-		UA[1] = 'ie';
-		if (UA[4]) UA[2] = UA[4];
-	} else if (UA[1] == 'crios'){
-		UA[1] = 'chrome';
-	}
-
-	platform = ua.match(/ip(?:ad|od|hone)/) ? 'ios' : (ua.match(/(?:webos|android)/) || ua.match(/mac|win|linux/) || ['other'])[0];
-	if (platform == 'win') platform = 'windows';
-
-	return {
-		extend: Function.prototype.extend,
-		name: (UA[1] == 'version') ? UA[3] : UA[1],
-		version: parseFloat((UA[1] == 'opera' && UA[4]) ? UA[4] : UA[2]),
-		platform: platform
-	};
-};
-
-var Browser = this.Browser = parse(navigator.userAgent, navigator.platform);
-
-if (Browser.name == 'ie' && document.documentMode){
-	Browser.version = document.documentMode;
-}
-
-Browser.extend({
-	Features: {
-		xpath: !!(document.evaluate),
-		air: !!(window.runtime),
-		query: !!(document.querySelector),
-		json: !!(window.JSON)
-	},
-	parseUA: parse
-});
-
-
-
-// Request
-
-Browser.Request = (function(){
-
-	var XMLHTTP = function(){
-		return new XMLHttpRequest();
-	};
-
-	var MSXML2 = function(){
-		return new ActiveXObject('MSXML2.XMLHTTP');
-	};
-
-	var MSXML = function(){
-		return new ActiveXObject('Microsoft.XMLHTTP');
-	};
-
-	return Function.attempt(function(){
-		XMLHTTP();
-		return XMLHTTP;
-	}, function(){
-		MSXML2();
-		return MSXML2;
-	}, function(){
-		MSXML();
-		return MSXML;
-	});
-
-})();
-
-Browser.Features.xhr = !!(Browser.Request);
-
-
-
-// String scripts
-
-Browser.exec = function(text){
-	if (!text) return text;
-	if (window.execScript){
-		window.execScript(text);
-	} else {
-		var script = document.createElement('script');
-		script.setAttribute('type', 'text/javascript');
-		script.text = text;
-		document.head.appendChild(script);
-		document.head.removeChild(script);
-	}
-	return text;
-};
-
-String.implement('stripScripts', function(exec){
-	var scripts = '';
-	var text = this.replace(/<script[^>]*>([\s\S]*?)<\/script>/gi, function(all, code){
-		scripts += code + '\n';
-		return '';
-	});
-	if (exec === true) Browser.exec(scripts);
-	else if (typeOf(exec) == 'function') exec(scripts, text);
-	return text;
-});
-
-// Window, Document
-
-Browser.extend({
-	Document: this.Document,
-	Window: this.Window,
-	Element: this.Element,
-	Event: this.Event
-});
-
-this.Window = this.$constructor = new Type('Window', function(){});
-
-this.$family = Function.convert('window').hide();
-
-Window.mirror(function(name, method){
-	window[name] = method;
-});
-
-this.Document = document.$constructor = new Type('Document', function(){});
-
-document.$family = Function.convert('document').hide();
-
-Document.mirror(function(name, method){
-	document[name] = method;
-});
-
-document.html = document.documentElement;
-if (!document.head) document.head = document.getElementsByTagName('head')[0];
-
-if (document.execCommand) try {
-	document.execCommand('BackgroundImageCache', false, true);
-} catch (e){}
-
-/*<ltIE9>*/
-if (this.attachEvent && !this.addEventListener){
-	var unloadEvent = function(){
-		this.detachEvent('onunload', unloadEvent);
-		document.head = document.html = document.window = null;
-		window = this.Window = document = null;
-	};
-	this.attachEvent('onunload', unloadEvent);
-}
-
-// IE fails on collections and <select>.options (refers to <select>)
-var arrayFrom = Array.convert;
-try {
-	arrayFrom(document.html.childNodes);
-} catch (e){
-	Array.convert = function(item){
-		if (typeof item != 'string' && Type.isEnumerable(item) && typeOf(item) != 'array'){
-			var i = item.length, array = new Array(i);
-			while (i--) array[i] = item[i];
-			return array;
-		}
-		return arrayFrom(item);
-	};
-
-	var prototype = Array.prototype,
-		slice = prototype.slice;
-	['pop', 'push', 'reverse', 'shift', 'sort', 'splice', 'unshift', 'concat', 'join', 'slice'].each(function(name){
-		var method = prototype[name];
-		Array[name] = function(item){
-			return method.apply(Array.convert(item), slice.call(arguments, 1));
-		};
-	});
-}
-/*</ltIE9>*/
-
-
-
-})();
-
-/*
----
-
-name: Class
-
-description: Contains the Class Function for easily creating, extending, and implementing reusable Classes.
-
-license: MIT-style license.
-
-requires: [Array, String, Function, Number]
-
-provides: Class
-
-...
-*/
-
-(function(){
-
-var Class = this.Class = new Type('Class', function(params){
-	if (instanceOf(params, Function)) params = {initialize: params};
-
-	var newClass = function(){
-		reset(this);
-		if (newClass.$prototyping) return this;
-		this.$caller = null;
-		this.$family = null;
-		var value = (this.initialize) ? this.initialize.apply(this, arguments) : this;
-		this.$caller = this.caller = null;
-		return value;
-	}.extend(this).implement(params);
-
-	newClass.$constructor = Class;
-	newClass.prototype.$constructor = newClass;
-	newClass.prototype.parent = parent;
-
-	return newClass;
-});
-
-var parent = function(){
-	if (!this.$caller) throw new Error('The method "parent" cannot be called.');
-	var name = this.$caller.$name,
-		parent = this.$caller.$owner.parent,
-		previous = (parent) ? parent.prototype[name] : null;
-	if (!previous) throw new Error('The method "' + name + '" has no parent.');
-	return previous.apply(this, arguments);
-};
-
-var reset = function(object){
-	for (var key in object){
-		var value = object[key];
-		switch (typeOf(value)){
-			case 'object':
-				var F = function(){};
-				F.prototype = value;
-				object[key] = reset(new F);
-				break;
-			case 'array': object[key] = value.clone(); break;
-		}
-	}
-	return object;
-};
-
-var wrap = function(self, key, method){
-	if (method.$origin) method = method.$origin;
-	var wrapper = function(){
-		if (method.$protected && this.$caller == null) throw new Error('The method "' + key + '" cannot be called.');
-		var caller = this.caller, current = this.$caller;
-		this.caller = current; this.$caller = wrapper;
-		var result = method.apply(this, arguments);
-		this.$caller = current; this.caller = caller;
-		return result;
-	}.extend({$owner: self, $origin: method, $name: key});
-	return wrapper;
-};
-
-var implement = function(key, value, retain){
-	if (Class.Mutators.hasOwnProperty(key)){
-		value = Class.Mutators[key].call(this, value);
-		if (value == null) return this;
-	}
-
-	if (typeOf(value) == 'function'){
-		if (value.$hidden) return this;
-		this.prototype[key] = (retain) ? value : wrap(this, key, value);
-	} else {
-		Object.merge(this.prototype, key, value);
-	}
-
-	return this;
-};
-
-var getInstance = function(klass){
-	klass.$prototyping = true;
-	var proto = new klass;
-	delete klass.$prototyping;
-	return proto;
-};
-
-Class.implement('implement', implement.overloadSetter());
-
-Class.Mutators = {
-
-	Extends: function(parent){
-		this.parent = parent;
-		this.prototype = getInstance(parent);
-	},
-
-	Implements: function(items){
-		Array.convert(items).each(function(item){
-			var instance = new item;
-			for (var key in instance) implement.call(this, key, instance[key], true);
-		}, this);
-	}
-};
-
-})();
-
-/*
----
-
-name: Class.Extras
-
-description: Contains Utility Classes that can be implemented into your own Classes to ease the execution of many common tasks.
-
-license: MIT-style license.
-
-requires: Class
-
-provides: [Class.Extras, Chain, Events, Options]
-
-...
-*/
-
-(function(){
-
-this.Chain = new Class({
-
-	$chain: [],
-
-	chain: function(){
-		this.$chain.append(Array.flatten(arguments));
-		return this;
-	},
-
-	callChain: function(){
-		return (this.$chain.length) ? this.$chain.shift().apply(this, arguments) : false;
-	},
-
-	clearChain: function(){
-		this.$chain.empty();
-		return this;
-	}
-
-});
-
-var removeOn = function(string){
-	return string.replace(/^on([A-Z])/, function(full, first){
-		return first.toLowerCase();
-	});
-};
-
-this.Events = new Class({
-
-	$events: {},
-
-	addEvent: function(type, fn, internal){
-		type = removeOn(type);
-
-		
-
-		this.$events[type] = (this.$events[type] || []).include(fn);
-		if (internal) fn.internal = true;
-		return this;
-	},
-
-	addEvents: function(events){
-		for (var type in events) this.addEvent(type, events[type]);
-		return this;
-	},
-
-	fireEvent: function(type, args, delay){
-		type = removeOn(type);
-		var events = this.$events[type];
-		if (!events) return this;
-		args = Array.convert(args);
-		events.each(function(fn){
-			if (delay) fn.delay(delay, this, args);
-			else fn.apply(this, args);
-		}, this);
-		return this;
-	},
-
-	removeEvent: function(type, fn){
-		type = removeOn(type);
-		var events = this.$events[type];
-		if (events && !fn.internal){
-			var index = events.indexOf(fn);
-			if (index != -1) delete events[index];
-		}
-		return this;
-	},
-
-	removeEvents: function(events){
-		var type;
-		if (typeOf(events) == 'object'){
-			for (type in events) this.removeEvent(type, events[type]);
-			return this;
-		}
-		if (events) events = removeOn(events);
-		for (type in this.$events){
-			if (events && events != type) continue;
-			var fns = this.$events[type];
-			for (var i = fns.length; i--;) if (i in fns){
-				this.removeEvent(type, fns[i]);
-			}
-		}
-		return this;
-	}
-
-});
-
-this.Options = new Class({
-
-	setOptions: function(){
-		var options = this.options = Object.merge.apply(null, [{}, this.options].append(arguments));
-		if (this.addEvent) for (var option in options){
-			if (typeOf(options[option]) != 'function' || !(/^on[A-Z]/).test(option)) continue;
-			this.addEvent(option, options[option]);
-			delete options[option];
-		}
-		return this;
-	}
-
-});
-
-})();
-
-/*
----
-
-name: Class.Thenable
-
-description: Contains a Utility Class that can be implemented into your own Classes to make them "thenable".
-
-license: MIT-style license.
-
-requires: Class
-
-provides: [Class.Thenable]
-
-...
-*/
-
-(function(){
-
-var STATE_PENDING = 0,
-	STATE_FULFILLED = 1,
-	STATE_REJECTED = 2;
-
-var Thenable = Class.Thenable = new Class({
-
-	$thenableState: STATE_PENDING,
-	$thenableResult: null,
-	$thenableReactions: [],
-
-	resolve: function(value){
-		resolve(this, value);
-		return this;
-	},
-
-	reject: function(reason){
-		reject(this, reason);
-		return this;
-	},
-
-	getThenableState: function(){
-		switch (this.$thenableState){
-			case STATE_PENDING:
-				return 'pending';
-
-			case STATE_FULFILLED:
-				return 'fulfilled';
-
-			case STATE_REJECTED:
-				return 'rejected';
-		}
-	},
-
-	resetThenable: function(reason){
-		reject(this, reason);
-		reset(this);
-		return this;
-	},
-
-	then: function(onFulfilled, onRejected){
-		if (typeof onFulfilled !== 'function') onFulfilled = 'Identity';
-		if (typeof onRejected !== 'function') onRejected = 'Thrower';
-
-		var thenable = new Thenable();
-
-		this.$thenableReactions.push({
-			thenable: thenable,
-			fulfillHandler: onFulfilled,
-			rejectHandler: onRejected
-		});
-
-		if (this.$thenableState !== STATE_PENDING){
-			react(this);
-		}
-
-		return thenable;
-	},
-
-	'catch': function(onRejected){
-		return this.then(null, onRejected);
-	}
-
-});
-
-Thenable.extend({
-	resolve: function(value){
-		var thenable;
-		if (value instanceof Thenable){
-			thenable = value;
-		} else {
-			thenable = new Thenable();
-			resolve(thenable, value);
-		}
-		return thenable;
-	},
-	reject: function(reason){
-		var thenable = new Thenable();
-		reject(thenable, reason);
-		return thenable;
-	}
-});
-
-// Private functions
-
-function resolve(thenable, value){
-	if (thenable.$thenableState === STATE_PENDING){
-		if (thenable === value){
-			reject(thenable, new TypeError('Tried to resolve a thenable with itself.'));
-		} else if (value && (typeof value === 'object' || typeof value === 'function')){
-			var then;
-			try {
-				then = value.then;
-			} catch (exception){
-				reject(thenable, exception);
-			}
-			if (typeof then === 'function'){
-				var resolved = false;
-				defer(function(){
-					try {
-						then.call(
-							value,
-							function(nextValue){
-								if (!resolved){
-									resolved = true;
-									resolve(thenable, nextValue);
-								}
-							},
-							function(reason){
-								if (!resolved){
-									resolved = true;
-									reject(thenable, reason);
-								}
-							}
-						);
-					} catch (exception){
-						if (!resolved){
-							resolved = true;
-							reject(thenable, exception);
-						}
-					}
-				});
-			} else {
-				fulfill(thenable, value);
-			}
-		} else {
-			fulfill(thenable, value);
-		}
-	}
-}
-
-function fulfill(thenable, value){
-	if (thenable.$thenableState === STATE_PENDING){
-		thenable.$thenableResult = value;
-		thenable.$thenableState = STATE_FULFILLED;
-
-		react(thenable);
-	}
-}
-
-function reject(thenable, reason){
-	if (thenable.$thenableState === STATE_PENDING){
-		thenable.$thenableResult = reason;
-		thenable.$thenableState = STATE_REJECTED;
-
-		react(thenable);
-	}
-}
-
-function reset(thenable){
-	if (thenable.$thenableState !== STATE_PENDING){
-		thenable.$thenableResult = null;
-		thenable.$thenableState = STATE_PENDING;
-	}
-}
-
-function react(thenable){
-	var state = thenable.$thenableState,
-		result = thenable.$thenableResult,
-		reactions = thenable.$thenableReactions,
-		type;
-
-	if (state === STATE_FULFILLED){
-		thenable.$thenableReactions = [];
-		type = 'fulfillHandler';
-	} else if (state == STATE_REJECTED){
-		thenable.$thenableReactions = [];
-		type = 'rejectHandler';
-	}
-
-	if (type){
-		defer(handle.pass([result, reactions, type]));
-	}
-}
-
-function handle(result, reactions, type){
-	for (var i = 0, l = reactions.length; i < l; ++i){
-		var reaction = reactions[i],
-			handler = reaction[type];
-
-		if (handler === 'Identity'){
-			resolve(reaction.thenable, result);
-		} else if (handler === 'Thrower'){
-			reject(reaction.thenable, result);
-		} else {
-			try {
-				resolve(reaction.thenable, handler(result));
-			} catch (exception){
-				reject(reaction.thenable, exception);
-			}
-		}
-	}
-}
-
-var defer;
-if (typeof process !== 'undefined' && typeof process.nextTick === 'function'){
-	defer = process.nextTick;
-} else if (typeof setImmediate !== 'undefined'){
-	defer = setImmediate;
-} else {
-	defer = function(fn){
-		setTimeout(fn, 0);
-	};
-}
-
-})();
-
-/*
----
-
-name: Object
-
-description: Object generic methods
-
-license: MIT-style license.
-
-requires: Type
-
-provides: [Object, Hash]
-
-...
-*/
-
-(function(){
-
-Object.extend({
-
-	subset: function(object, keys){
-		var results = {};
-		for (var i = 0, l = keys.length; i < l; i++){
-			var k = keys[i];
-			if (k in object) results[k] = object[k];
-		}
-		return results;
-	},
-
-	map: function(object, fn, bind){
-		var results = {};
-		var keys = Object.keys(object);
-		for (var i = 0; i < keys.length; i++){
-			var key = keys[i];
-			results[key] = fn.call(bind, object[key], key, object);
-		}
-		return results;
-	},
-
-	filter: function(object, fn, bind){
-		var results = {};
-		var keys = Object.keys(object);
-		for (var i = 0; i < keys.length; i++){
-			var key = keys[i], value = object[key];
-			if (fn.call(bind, value, key, object)) results[key] = value;
-		}
-		return results;
-	},
-
-	every: function(object, fn, bind){
-		var keys = Object.keys(object);
-		for (var i = 0; i < keys.length; i++){
-			var key = keys[i];
-			if (!fn.call(bind, object[key], key)) return false;
-		}
-		return true;
-	},
-
-	some: function(object, fn, bind){
-		var keys = Object.keys(object);
-		for (var i = 0; i < keys.length; i++){
-			var key = keys[i];
-			if (fn.call(bind, object[key], key)) return true;
-		}
-		return false;
-	},
-
-	values: function(object){
-		var values = [];
-		var keys = Object.keys(object);
-		for (var i = 0; i < keys.length; i++){
-			var k = keys[i];
-			values.push(object[k]);
-		}
-		return values;
-	},
-
-	getLength: function(object){
-		return Object.keys(object).length;
-	},
-
-	keyOf: function(object, value){
-		var keys = Object.keys(object);
-		for (var i = 0; i < keys.length; i++){
-			var key = keys[i];
-			if (object[key] === value) return key;
-		}
-		return null;
-	},
-
-	contains: function(object, value){
-		return Object.keyOf(object, value) != null;
-	},
-
-	toQueryString: function(object, base){
-		var queryString = [];
-
-		Object.each(object, function(value, key){
-			if (base) key = base + '[' + key + ']';
-			var result;
-			switch (typeOf(value)){
-				case 'object': result = Object.toQueryString(value, key); break;
-				case 'array':
-					var qs = {};
-					value.each(function(val, i){
-						qs[i] = val;
-					});
-					result = Object.toQueryString(qs, key);
-					break;
-				default: result = key + '=' + encodeURIComponent(value);
-			}
-			if (value != null) queryString.push(result);
-		});
-
-		return queryString.join('&');
-	}
-
-});
-
-})();
-
-
-
-/*
----
-name: Slick.Parser
-description: Standalone CSS3 Selector parser
-provides: Slick.Parser
-...
-*/
-
-;(function(){
-
-var parsed,
-	separatorIndex,
-	combinatorIndex,
-	reversed,
-	cache = {},
-	reverseCache = {},
-	reUnescape = /\\/g;
-
-var parse = function(expression, isReversed){
-	if (expression == null) return null;
-	if (expression.Slick === true) return expression;
-	expression = ('' + expression).replace(/^\s+|\s+$/g, '');
-	reversed = !!isReversed;
-	var currentCache = (reversed) ? reverseCache : cache;
-	if (currentCache[expression]) return currentCache[expression];
-	parsed = {
-		Slick: true,
-		expressions: [],
-		raw: expression,
-		reverse: function(){
-			return parse(this.raw, true);
-		}
-	};
-	separatorIndex = -1;
-	while (expression != (expression = expression.replace(regexp, parser)));
-	parsed.length = parsed.expressions.length;
-	return currentCache[parsed.raw] = (reversed) ? reverse(parsed) : parsed;
-};
-
-var reverseCombinator = function(combinator){
-	if (combinator === '!') return ' ';
-	else if (combinator === ' ') return '!';
-	else if ((/^!/).test(combinator)) return combinator.replace(/^!/, '');
-	else return '!' + combinator;
-};
-
-var reverse = function(expression){
-	var expressions = expression.expressions;
-	for (var i = 0; i < expressions.length; i++){
-		var exp = expressions[i];
-		var last = {parts: [], tag: '*', combinator: reverseCombinator(exp[0].combinator)};
-
-		for (var j = 0; j < exp.length; j++){
-			var cexp = exp[j];
-			if (!cexp.reverseCombinator) cexp.reverseCombinator = ' ';
-			cexp.combinator = cexp.reverseCombinator;
-			delete cexp.reverseCombinator;
-		}
-
-		exp.reverse().push(last);
-	}
-	return expression;
-};
-
-var escapeRegExp = function(string){// Credit: XRegExp 0.6.1 (c) 2007-2008 Steven Levithan <http://stevenlevithan.com/regex/xregexp/> MIT License
-	return string.replace(/[-[\]{}()*+?.\\^$|,#\s]/g, function(match){
-		return '\\' + match;
-	});
-};
-
-var regexp = new RegExp(
-/*
-#!/usr/bin/env ruby
-puts "\t\t" + DATA.read.gsub(/\(\?x\)|\s+#.*$|\s+|\\$|\\n/,'')
-__END__
-	"(?x)^(?:\
-	  \\s* ( , ) \\s*               # Separator          \n\
-	| \\s* ( <combinator>+ ) \\s*   # Combinator         \n\
-	|      ( \\s+ )                 # CombinatorChildren \n\
-	|      ( <unicode>+ | \\* )     # Tag                \n\
-	| \\#  ( <unicode>+       )     # ID                 \n\
-	| \\.  ( <unicode>+       )     # ClassName          \n\
-	|                               # Attribute          \n\
-	\\[  \
-		\\s* (<unicode1>+)  (?:  \
-			\\s* ([*^$!~|]?=)  (?:  \
-				\\s* (?:\
-					([\"']?)(.*?)\\9 \
-				)\
-			)  \
-		)?  \\s*  \
-	\\](?!\\]) \n\
-	|   :+ ( <unicode>+ )(?:\
-	\\( (?:\
-		(?:([\"'])([^\\12]*)\\12)|((?:\\([^)]+\\)|[^()]*)+)\
-	) \\)\
-	)?\
-	)"
-*/
-	"^(?:\\s*(,)\\s*|\\s*(<combinator>+)\\s*|(\\s+)|(<unicode>+|\\*)|\\#(<unicode>+)|\\.(<unicode>+)|\\[\\s*(<unicode1>+)(?:\\s*([*^$!~|]?=)(?:\\s*(?:([\"']?)(.*?)\\9)))?\\s*\\](?!\\])|(:+)(<unicode>+)(?:\\((?:(?:([\"'])([^\\13]*)\\13)|((?:\\([^)]+\\)|[^()]*)+))\\))?)"
-	.replace(/<combinator>/, '[' + escapeRegExp('>+~`!@$%^&={}\\;</') + ']')
-	.replace(/<unicode>/g, '(?:[\\w\\u00a1-\\uFFFF-]|\\\\[^\\s0-9a-f])')
-	.replace(/<unicode1>/g, '(?:[:\\w\\u00a1-\\uFFFF-]|\\\\[^\\s0-9a-f])')
-);
-
-function parser(
-	rawMatch,
-
-	separator,
-	combinator,
-	combinatorChildren,
-
-	tagName,
-	id,
-	className,
-
-	attributeKey,
-	attributeOperator,
-	attributeQuote,
-	attributeValue,
-
-	pseudoMarker,
-	pseudoClass,
-	pseudoQuote,
-	pseudoClassQuotedValue,
-	pseudoClassValue
-){
-	if (separator || separatorIndex === -1){
-		parsed.expressions[++separatorIndex] = [];
-		combinatorIndex = -1;
-		if (separator) return '';
-	}
-
-	if (combinator || combinatorChildren || combinatorIndex === -1){
-		combinator = combinator || ' ';
-		var currentSeparator = parsed.expressions[separatorIndex];
-		if (reversed && currentSeparator[combinatorIndex])
-			currentSeparator[combinatorIndex].reverseCombinator = reverseCombinator(combinator);
-		currentSeparator[++combinatorIndex] = {combinator: combinator, tag: '*'};
-	}
-
-	var currentParsed = parsed.expressions[separatorIndex][combinatorIndex];
-
-	if (tagName){
-		currentParsed.tag = tagName.replace(reUnescape, '');
-
-	} else if (id){
-		currentParsed.id = id.replace(reUnescape, '');
-
-	} else if (className){
-		className = className.replace(reUnescape, '');
-
-		if (!currentParsed.classList) currentParsed.classList = [];
-		if (!currentParsed.classes) currentParsed.classes = [];
-		currentParsed.classList.push(className);
-		currentParsed.classes.push({
-			value: className,
-			regexp: new RegExp('(^|\\s)' + escapeRegExp(className) + '(\\s|$)')
-		});
-
-	} else if (pseudoClass){
-		pseudoClassValue = pseudoClassValue || pseudoClassQuotedValue;
-		pseudoClassValue = pseudoClassValue ? pseudoClassValue.replace(reUnescape, '') : null;
-
-		if (!currentParsed.pseudos) currentParsed.pseudos = [];
-		currentParsed.pseudos.push({
-			key: pseudoClass.replace(reUnescape, ''),
-			value: pseudoClassValue,
-			type: pseudoMarker.length == 1 ? 'class' : 'element'
-		});
-
-	} else if (attributeKey){
-		attributeKey = attributeKey.replace(reUnescape, '');
-		attributeValue = (attributeValue || '').replace(reUnescape, '');
-
-		var test, regexp;
-
-		switch (attributeOperator){
-			case '^=' : regexp = new RegExp(       '^'+ escapeRegExp(attributeValue)            ); break;
-			case '$=' : regexp = new RegExp(            escapeRegExp(attributeValue) +'$'       ); break;
-			case '~=' : regexp = new RegExp( '(^|\\s)'+ escapeRegExp(attributeValue) +'(\\s|$)' ); break;
-			case '|=' : regexp = new RegExp(       '^'+ escapeRegExp(attributeValue) +'(-|$)'   ); break;
-			case  '=' : test = function(value){
-				return attributeValue == value;
-			}; break;
-			case '*=' : test = function(value){
-				return value && value.indexOf(attributeValue) > -1;
-			}; break;
-			case '!=' : test = function(value){
-				return attributeValue != value;
-			}; break;
-			default   : test = function(value){
-				return !!value;
-			};
-		}
-
-		if (attributeValue == '' && (/^[*$^]=$/).test(attributeOperator)) test = function(){
-			return false;
-		};
-
-		if (!test) test = function(value){
-			return value && regexp.test(value);
-		};
-
-		if (!currentParsed.attributes) currentParsed.attributes = [];
-		currentParsed.attributes.push({
-			key: attributeKey,
-			operator: attributeOperator,
-			value: attributeValue,
-			test: test
-		});
-
-	}
-
-	return '';
-};
-
-// Slick NS
-
-var Slick = (this.Slick || {});
-
-Slick.parse = function(expression){
-	return parse(expression);
-};
-
-Slick.escapeRegExp = escapeRegExp;
-
-if (!this.Slick) this.Slick = Slick;
-
-}).apply(/*<CommonJS>*/(typeof exports != 'undefined') ? exports : /*</CommonJS>*/this);
-
-/*
----
-name: Slick.Finder
-description: The new, superfast css selector engine.
-provides: Slick.Finder
-requires: Slick.Parser
-...
-*/
-
-;(function(){
-
-var local = {},
-	featuresCache = {},
-	toString = Object.prototype.toString;
-
-// Feature / Bug detection
-
-local.isNativeCode = function(fn){
-	return (/\{\s*\[native code\]\s*\}/).test('' + fn);
-};
-
-local.isXML = function(document){
-	return (!!document.xmlVersion) || (!!document.xml) || (toString.call(document) == '[object XMLDocument]') ||
-	(document.nodeType == 9 && document.documentElement.nodeName != 'HTML');
-};
-
-local.setDocument = function(document){
-
-	// convert elements / window arguments to document. if document cannot be extrapolated, the function returns.
-	var nodeType = document.nodeType;
-	if (nodeType == 9); // document
-	else if (nodeType) document = document.ownerDocument; // node
-	else if (document.navigator) document = document.document; // window
-	else return;
-
-	// check if it's the old document
-
-	if (this.document === document) return;
-	this.document = document;
-
-	// check if we have done feature detection on this document before
-
-	var root = document.documentElement,
-		rootUid = this.getUIDXML(root),
-		features = featuresCache[rootUid],
-		feature;
-
-	if (features){
-		for (feature in features){
-			this[feature] = features[feature];
-		}
-		return;
-	}
-
-	features = featuresCache[rootUid] = {};
-
-	features.root = root;
-	features.isXMLDocument = this.isXML(document);
-
-	features.brokenStarGEBTN
-	= features.starSelectsClosedQSA
-	= features.idGetsName
-	= features.brokenMixedCaseQSA
-	= features.brokenGEBCN
-	= features.brokenCheckedQSA
-	= features.brokenEmptyAttributeQSA
-	= features.isHTMLDocument
-	= features.nativeMatchesSelector
-	= false;
-
-	var starSelectsClosed, starSelectsComments,
-		brokenSecondClassNameGEBCN, cachedGetElementsByClassName,
-		brokenFormAttributeGetter;
-
-	var selected, id = 'slick_uniqueid';
-	var testNode = document.createElement('div');
-
-	var testRoot = document.body || document.getElementsByTagName('body')[0] || root;
-	testRoot.appendChild(testNode);
-
-	// on non-HTML documents innerHTML and getElementsById doesnt work properly
-	try {
-		testNode.innerHTML = '<a id="'+id+'"></a>';
-		features.isHTMLDocument = !!document.getElementById(id);
-	} catch (e){}
-
-	if (features.isHTMLDocument){
-
-		testNode.style.display = 'none';
-
-		// IE returns comment nodes for getElementsByTagName('*') for some documents
-		testNode.appendChild(document.createComment(''));
-		starSelectsComments = (testNode.getElementsByTagName('*').length > 1);
-
-		// IE returns closed nodes (EG:"</foo>") for getElementsByTagName('*') for some documents
-		try {
-			testNode.innerHTML = 'foo</foo>';
-			selected = testNode.getElementsByTagName('*');
-			starSelectsClosed = (selected && !!selected.length && selected[0].nodeName.charAt(0) == '/');
-		} catch (e){};
-
-		features.brokenStarGEBTN = starSelectsComments || starSelectsClosed;
-
-		// IE returns elements with the name instead of just id for getElementsById for some documents
-		try {
-			testNode.innerHTML = '<a name="'+ id +'"></a><b id="'+ id +'"></b>';
-			features.idGetsName = document.getElementById(id) === testNode.firstChild;
-		} catch (e){}
-
-		if (testNode.getElementsByClassName){
-
-			// Safari 3.2 getElementsByClassName caches results
-			try {
-				testNode.innerHTML = '<a class="f"></a><a class="b"></a>';
-				testNode.getElementsByClassName('b').length;
-				testNode.firstChild.className = 'b';
-				cachedGetElementsByClassName = (testNode.getElementsByClassName('b').length != 2);
-			} catch (e){};
-
-			// Opera 9.6 getElementsByClassName doesnt detects the class if its not the first one
-			try {
-				testNode.innerHTML = '<a class="a"></a><a class="f b a"></a>';
-				brokenSecondClassNameGEBCN = (testNode.getElementsByClassName('a').length != 2);
-			} catch (e){}
-
-			features.brokenGEBCN = cachedGetElementsByClassName || brokenSecondClassNameGEBCN;
-		}
-
-		if (testNode.querySelectorAll){
-			// IE 8 returns closed nodes (EG:"</foo>") for querySelectorAll('*') for some documents
-			try {
-				testNode.innerHTML = 'foo</foo>';
-				selected = testNode.querySelectorAll('*');
-				features.starSelectsClosedQSA = (selected && !!selected.length && selected[0].nodeName.charAt(0) == '/');
-			} catch (e){}
-
-			// Safari 3.2 querySelectorAll doesnt work with mixedcase on quirksmode
-			try {
-				testNode.innerHTML = '<a class="MiX"></a>';
-				features.brokenMixedCaseQSA = !testNode.querySelectorAll('.MiX').length;
-			} catch (e){}
-
-			// Webkit and Opera dont return selected options on querySelectorAll
-			try {
-				testNode.innerHTML = '<select><option selected="selected">a</option></select>';
-				features.brokenCheckedQSA = (testNode.querySelectorAll(':checked').length == 0);
-			} catch (e){};
-
-			// IE returns incorrect results for attr[*^$]="" selectors on querySelectorAll
-			try {
-				testNode.innerHTML = '<a class=""></a>';
-				features.brokenEmptyAttributeQSA = (testNode.querySelectorAll('[class*=""]').length != 0);
-			} catch (e){}
-
-		}
-
-		// IE6-7, if a form has an input of id x, form.getAttribute(x) returns a reference to the input
-		try {
-			testNode.innerHTML = '<form action="s"><input id="action"/></form>';
-			brokenFormAttributeGetter = (testNode.firstChild.getAttribute('action') != 's');
-		} catch (e){}
-
-		// native matchesSelector function
-
-		features.nativeMatchesSelector = root.matches || /*root.msMatchesSelector ||*/ root.mozMatchesSelector || root.webkitMatchesSelector;
-		if (features.nativeMatchesSelector) try {
-			// if matchesSelector trows errors on incorrect sintaxes we can use it
-			features.nativeMatchesSelector.call(root, ':slick');
-			features.nativeMatchesSelector = null;
-		} catch (e){}
-
-	}
-
-	try {
-		root.slick_expando = 1;
-		delete root.slick_expando;
-		features.getUID = this.getUIDHTML;
-	} catch (e){
-		features.getUID = this.getUIDXML;
-	}
-
-	testRoot.removeChild(testNode);
-	testNode = selected = testRoot = null;
-
-	// getAttribute
-
-	features.getAttribute = (features.isHTMLDocument && brokenFormAttributeGetter) ? function(node, name){
-		var method = this.attributeGetters[name];
-		if (method) return method.call(node);
-		var attributeNode = node.getAttributeNode(name);
-		return (attributeNode) ? attributeNode.nodeValue : null;
-	} : function(node, name){
-		var method = this.attributeGetters[name];
-		return (method) ? method.call(node) : node.getAttribute(name);
-	};
-
-	// hasAttribute
-
-	features.hasAttribute = (root && this.isNativeCode(root.hasAttribute)) ? function(node, attribute){
-		return node.hasAttribute(attribute);
-	} : function(node, attribute){
-		node = node.getAttributeNode(attribute);
-		return !!(node && (node.specified || node.nodeValue));
-	};
-
-	// contains
-	// FIXME: Add specs: local.contains should be different for xml and html documents?
-	var nativeRootContains = root && this.isNativeCode(root.contains),
-		nativeDocumentContains = document && this.isNativeCode(document.contains);
-
-	features.contains = (nativeRootContains && nativeDocumentContains) ? function(context, node){
-		return context.contains(node);
-	} : (nativeRootContains && !nativeDocumentContains) ? function(context, node){
-		// IE8 does not have .contains on document.
-		return context === node || ((context === document) ? document.documentElement : context).contains(node);
-	} : (root && root.compareDocumentPosition) ? function(context, node){
-		return context === node || !!(context.compareDocumentPosition(node) & 16);
-	} : function(context, node){
-		if (node) do {
-			if (node === context) return true;
-		} while ((node = node.parentNode));
-		return false;
-	};
-
-	// document order sorting
-	// credits to Sizzle (http://sizzlejs.com/)
-
-	features.documentSorter = (root.compareDocumentPosition) ? function(a, b){
-		if (!a.compareDocumentPosition || !b.compareDocumentPosition) return 0;
-		return a.compareDocumentPosition(b) & 4 ? -1 : a === b ? 0 : 1;
-	} : ('sourceIndex' in root) ? function(a, b){
-		if (!a.sourceIndex || !b.sourceIndex) return 0;
-		return a.sourceIndex - b.sourceIndex;
-	} : (document.createRange) ? function(a, b){
-		if (!a.ownerDocument || !b.ownerDocument) return 0;
-		var aRange = a.ownerDocument.createRange(), bRange = b.ownerDocument.createRange();
-		aRange.setStart(a, 0);
-		aRange.setEnd(a, 0);
-		bRange.setStart(b, 0);
-		bRange.setEnd(b, 0);
-		return aRange.compareBoundaryPoints(Range.START_TO_END, bRange);
-	} : null;
-
-	root = null;
-
-	for (feature in features){
-		this[feature] = features[feature];
-	}
-};
-
-// Main Method
-
-var reSimpleSelector = /^([#.]?)((?:[\w-]+|\*))$/,
-	reEmptyAttribute = /\[.+[*$^]=(?:""|'')?\]/,
-	qsaFailExpCache = {};
-
-local.search = function(context, expression, append, first){
-
-	var found = this.found = (first) ? null : (append || []);
-
-	if (!context) return found;
-	else if (context.navigator) context = context.document; // Convert the node from a window to a document
-	else if (!context.nodeType) return found;
-
-	// setup
-
-	var parsed, i, node, nodes,
-		uniques = this.uniques = {},
-		hasOthers = !!(append && append.length),
-		contextIsDocument = (context.nodeType == 9);
-
-	if (this.document !== (contextIsDocument ? context : context.ownerDocument)) this.setDocument(context);
-
-	// avoid duplicating items already in the append array
-	if (hasOthers) for (i = found.length; i--;) uniques[this.getUID(found[i])] = true;
-
-	// expression checks
-
-	if (typeof expression == 'string'){ // expression is a string
-
-		/*<simple-selectors-override>*/
-		var simpleSelector = expression.match(reSimpleSelector);
-		simpleSelectors: if (simpleSelector){
-
-			var symbol = simpleSelector[1],
-				name = simpleSelector[2];
-
-			if (!symbol){
-
-				if (name == '*' && this.brokenStarGEBTN) break simpleSelectors;
-				nodes = context.getElementsByTagName(name);
-				if (first) return nodes[0] || null;
-				for (i = 0; node = nodes[i++];){
-					if (!(hasOthers && uniques[this.getUID(node)])) found.push(node);
-				}
-
-			} else if (symbol == '#'){
-
-				if (!this.isHTMLDocument || !contextIsDocument) break simpleSelectors;
-				node = context.getElementById(name);
-				if (!node) return found;
-				if (this.idGetsName && node.getAttributeNode('id').nodeValue != name) break simpleSelectors;
-				if (first) return node || null;
-				if (!(hasOthers && uniques[this.getUID(node)])) found.push(node);
-
-			} else if (symbol == '.'){
-
-				if (!this.isHTMLDocument || ((!context.getElementsByClassName || this.brokenGEBCN) && context.querySelectorAll)) break simpleSelectors;
-				if (context.getElementsByClassName && !this.brokenGEBCN){
-					nodes = context.getElementsByClassName(name);
-					if (first) return nodes[0] || null;
-					for (i = 0; node = nodes[i++];){
-						if (!(hasOthers && uniques[this.getUID(node)])) found.push(node);
-					}
-				} else {
-					var matchClass = new RegExp('(^|\\s)'+ Slick.escapeRegExp(name) +'(\\s|$)');
-					nodes = context.getElementsByTagName('*');
-					for (i = 0; node = nodes[i++];){
-						className = node.className;
-						if (!(className && matchClass.test(className))) continue;
-						if (first) return node;
-						if (!(hasOthers && uniques[this.getUID(node)])) found.push(node);
-					}
-				}
-
-			}
-
-			if (hasOthers) this.sort(found);
-			return (first) ? null : found;
-
-		}
-		/*</simple-selectors-override>*/
-
-		/*<query-selector-override>*/
-		querySelector: if (context.querySelectorAll){
-
-			if (!this.isHTMLDocument
-				|| qsaFailExpCache[expression]
-				//TODO: only skip when expression is actually mixed case
-				|| this.brokenMixedCaseQSA
-				|| (this.brokenCheckedQSA && expression.indexOf(':checked') > -1)
-				|| (this.brokenEmptyAttributeQSA && reEmptyAttribute.test(expression))
-				|| (!contextIsDocument //Abort when !contextIsDocument and...
-					//  there are multiple expressions in the selector
-					//  since we currently only fix non-document rooted QSA for single expression selectors
-					&& expression.indexOf(',') > -1
-				)
-				|| Slick.disableQSA
-			) break querySelector;
-
-			var _expression = expression, _context = context, currentId;
-			if (!contextIsDocument){
-				// non-document rooted QSA
-				// credits to Andrew Dupont
-				currentId = _context.getAttribute('id'), slickid = 'slickid__';
-				_context.setAttribute('id', slickid);
-				_expression = '#' + slickid + ' ' + _expression;
-				context = _context.parentNode;
-			}
-
-			try {
-				if (first) return context.querySelector(_expression) || null;
-				else nodes = context.querySelectorAll(_expression);
-			} catch (e){
-				qsaFailExpCache[expression] = 1;
-				break querySelector;
-			} finally {
-				if (!contextIsDocument){
-					if (currentId) _context.setAttribute('id', currentId);
-					else _context.removeAttribute('id');
-					context = _context;
-				}
-			}
-
-			if (this.starSelectsClosedQSA) for (i = 0; node = nodes[i++];){
-				if (node.nodeName > '@' && !(hasOthers && uniques[this.getUID(node)])) found.push(node);
-			} else for (i = 0; node = nodes[i++];){
-				if (!(hasOthers && uniques[this.getUID(node)])) found.push(node);
-			}
-
-			if (hasOthers) this.sort(found);
-			return found;
-
-		}
-		/*</query-selector-override>*/
-
-		parsed = this.Slick.parse(expression);
-		if (!parsed.length) return found;
-	} else if (expression == null){ // there is no expression
-		return found;
-	} else if (expression.Slick){ // expression is a parsed Slick object
-		parsed = expression;
-	} else if (this.contains(context.documentElement || context, expression)){ // expression is a node
-		(found) ? found.push(expression) : found = expression;
-		return found;
-	} else { // other junk
-		return found;
-	}
-
-	/*<pseudo-selectors>*//*<nth-pseudo-selectors>*/
-
-	// cache elements for the nth selectors
-
-	this.posNTH = {};
-	this.posNTHLast = {};
-	this.posNTHType = {};
-	this.posNTHTypeLast = {};
-
-	/*</nth-pseudo-selectors>*//*</pseudo-selectors>*/
-
-	// if append is null and there is only a single selector with one expression use pushArray, else use pushUID
-	this.push = (!hasOthers && (first || (parsed.length == 1 && parsed.expressions[0].length == 1))) ? this.pushArray : this.pushUID;
-
-	if (found == null) found = [];
-
-	// default engine
-
-	var j, m, n;
-	var combinator, tag, id, classList, classes, attributes, pseudos;
-	var currentItems, currentExpression, currentBit, lastBit, expressions = parsed.expressions;
-
-	search: for (i = 0; (currentExpression = expressions[i]); i++) for (j = 0; (currentBit = currentExpression[j]); j++){
-
-		combinator = 'combinator:' + currentBit.combinator;
-		if (!this[combinator]) continue search;
-
-		tag        = (this.isXMLDocument) ? currentBit.tag : currentBit.tag.toUpperCase();
-		id         = currentBit.id;
-		classList  = currentBit.classList;
-		classes    = currentBit.classes;
-		attributes = currentBit.attributes;
-		pseudos    = currentBit.pseudos;
-		lastBit    = (j === (currentExpression.length - 1));
-
-		this.bitUniques = {};
-
-		if (lastBit){
-			this.uniques = uniques;
-			this.found = found;
-		} else {
-			this.uniques = {};
-			this.found = [];
-		}
-
-		if (j === 0){
-			this[combinator](context, tag, id, classes, attributes, pseudos, classList);
-			if (first && lastBit && found.length) break search;
-		} else {
-			if (first && lastBit) for (m = 0, n = currentItems.length; m < n; m++){
-				this[combinator](currentItems[m], tag, id, classes, attributes, pseudos, classList);
-				if (found.length) break search;
-			} else for (m = 0, n = currentItems.length; m < n; m++) this[combinator](currentItems[m], tag, id, classes, attributes, pseudos, classList);
-		}
-
-		currentItems = this.found;
-	}
-
-	// should sort if there are nodes in append and if you pass multiple expressions.
-	if (hasOthers || (parsed.expressions.length > 1)) this.sort(found);
-
-	return (first) ? (found[0] || null) : found;
-};
-
-// Utils
-
-local.uidx = 1;
-local.uidk = 'slick-uniqueid';
-
-local.getUIDXML = function(node){
-	var uid = node.getAttribute(this.uidk);
-	if (!uid){
-		uid = this.uidx++;
-		node.setAttribute(this.uidk, uid);
-	}
-	return uid;
-};
-
-local.getUIDHTML = function(node){
-	return node.uniqueNumber || (node.uniqueNumber = this.uidx++);
-};
-
-// sort based on the setDocument documentSorter method.
-
-local.sort = function(results){
-	if (!this.documentSorter) return results;
-	results.sort(this.documentSorter);
-	return results;
-};
-
-/*<pseudo-selectors>*//*<nth-pseudo-selectors>*/
-
-local.cacheNTH = {};
-
-local.matchNTH = /^([+-]?\d*)?([a-z]+)?([+-]\d+)?$/;
-
-local.parseNTHArgument = function(argument){
-	var parsed = argument.match(this.matchNTH);
-	if (!parsed) return false;
-	var special = parsed[2] || false;
-	var a = parsed[1] || 1;
-	if (a == '-') a = -1;
-	var b = +parsed[3] || 0;
-	parsed =
-		(special == 'n')	? {a: a, b: b} :
-		(special == 'odd')	? {a: 2, b: 1} :
-		(special == 'even')	? {a: 2, b: 0} : {a: 0, b: a};
-
-	return (this.cacheNTH[argument] = parsed);
-};
-
-local.createNTHPseudo = function(child, sibling, positions, ofType){
-	return function(node, argument){
-		var uid = this.getUID(node);
-		if (!this[positions][uid]){
-			var parent = node.parentNode;
-			if (!parent) return false;
-			var el = parent[child], count = 1;
-			if (ofType){
-				var nodeName = node.nodeName;
-				do {
-					if (el.nodeName != nodeName) continue;
-					this[positions][this.getUID(el)] = count++;
-				} while ((el = el[sibling]));
-			} else {
-				do {
-					if (el.nodeType != 1) continue;
-					this[positions][this.getUID(el)] = count++;
-				} while ((el = el[sibling]));
-			}
-		}
-		argument = argument || 'n';
-		var parsed = this.cacheNTH[argument] || this.parseNTHArgument(argument);
-		if (!parsed) return false;
-		var a = parsed.a, b = parsed.b, pos = this[positions][uid];
-		if (a == 0) return b == pos;
-		if (a > 0){
-			if (pos < b) return false;
-		} else {
-			if (b < pos) return false;
-		}
-		return ((pos - b) % a) == 0;
-	};
-};
-
-/*</nth-pseudo-selectors>*//*</pseudo-selectors>*/
-
-local.pushArray = function(node, tag, id, classes, attributes, pseudos){
-	if (this.matchSelector(node, tag, id, classes, attributes, pseudos)) this.found.push(node);
-};
-
-local.pushUID = function(node, tag, id, classes, attributes, pseudos){
-	var uid = this.getUID(node);
-	if (!this.uniques[uid] && this.matchSelector(node, tag, id, classes, attributes, pseudos)){
-		this.uniques[uid] = true;
-		this.found.push(node);
-	}
-};
-
-local.matchNode = function(node, selector){
-	if (this.isHTMLDocument && this.nativeMatchesSelector){
-		try {
-			return this.nativeMatchesSelector.call(node, selector.replace(/\[([^=]+)=\s*([^'"\]]+?)\s*\]/g, '[$1="$2"]'));
-		} catch (matchError){}
-	}
-
-	var parsed = this.Slick.parse(selector);
-	if (!parsed) return true;
-
-	// simple (single) selectors
-	var expressions = parsed.expressions, simpleExpCounter = 0, i, currentExpression;
-	for (i = 0; (currentExpression = expressions[i]); i++){
-		if (currentExpression.length == 1){
-			var exp = currentExpression[0];
-			if (this.matchSelector(node, (this.isXMLDocument) ? exp.tag : exp.tag.toUpperCase(), exp.id, exp.classes, exp.attributes, exp.pseudos)) return true;
-			simpleExpCounter++;
-		}
-	}
-
-	if (simpleExpCounter == parsed.length) return false;
-
-	var nodes = this.search(this.document, parsed), item;
-	for (i = 0; item = nodes[i++];){
-		if (item === node) return true;
-	}
-	return false;
-};
-
-local.matchPseudo = function(node, name, argument){
-	var pseudoName = 'pseudo:' + name;
-	if (this[pseudoName]) return this[pseudoName](node, argument);
-	var attribute = this.getAttribute(node, name);
-	return (argument) ? argument == attribute : !!attribute;
-};
-
-local.matchSelector = function(node, tag, id, classes, attributes, pseudos){
-	if (tag){
-		var nodeName = (this.isXMLDocument) ? node.nodeName : node.nodeName.toUpperCase();
-		if (tag == '*'){
-			if (nodeName < '@') return false; // Fix for comment nodes and closed nodes
-		} else {
-			if (nodeName != tag) return false;
-		}
-	}
-
-	if (id && node.getAttribute('id') != id) return false;
-
-	var i, part, cls;
-	if (classes) for (i = classes.length; i--;){
-		cls = this.getAttribute(node, 'class');
-		if (!(cls && classes[i].regexp.test(cls))) return false;
-	}
-	if (attributes) for (i = attributes.length; i--;){
-		part = attributes[i];
-		if (part.operator ? !part.test(this.getAttribute(node, part.key)) : !this.hasAttribute(node, part.key)) return false;
-	}
-	if (pseudos) for (i = pseudos.length; i--;){
-		part = pseudos[i];
-		if (!this.matchPseudo(node, part.key, part.value)) return false;
-	}
-	return true;
-};
-
-var combinators = {
-
-	' ': function(node, tag, id, classes, attributes, pseudos, classList){ // all child nodes, any level
-
-		var i, item, children;
-
-		if (this.isHTMLDocument){
-			getById: if (id){
-				item = this.document.getElementById(id);
-				if ((!item && node.all) || (this.idGetsName && item && item.getAttributeNode('id').nodeValue != id)){
-					// all[id] returns all the elements with that name or id inside node
-					// if theres just one it will return the element, else it will be a collection
-					children = node.all[id];
-					if (!children) return;
-					if (!children[0]) children = [children];
-					for (i = 0; item = children[i++];){
-						var idNode = item.getAttributeNode('id');
-						if (idNode && idNode.nodeValue == id){
-							this.push(item, tag, null, classes, attributes, pseudos);
-							break;
-						}
-					}
-					return;
-				}
-				if (!item){
-					// if the context is in the dom we return, else we will try GEBTN, breaking the getById label
-					if (this.contains(this.root, node)) return;
-					else break getById;
-				} else if (this.document !== node && !this.contains(node, item)) return;
-				this.push(item, tag, null, classes, attributes, pseudos);
-				return;
-			}
-			getByClass: if (classes && node.getElementsByClassName && !this.brokenGEBCN){
-				children = node.getElementsByClassName(classList.join(' '));
-				if (!(children && children.length)) break getByClass;
-				for (i = 0; item = children[i++];) this.push(item, tag, id, null, attributes, pseudos);
-				return;
-			}
-		}
-		getByTag: {
-			children = node.getElementsByTagName(tag);
-			if (!(children && children.length)) break getByTag;
-			if (!this.brokenStarGEBTN) tag = null;
-			for (i = 0; item = children[i++];) this.push(item, tag, id, classes, attributes, pseudos);
-		}
-	},
-
-	'>': function(node, tag, id, classes, attributes, pseudos){ // direct children
-		if ((node = node.firstChild)) do {
-			if (node.nodeType == 1) this.push(node, tag, id, classes, attributes, pseudos);
-		} while ((node = node.nextSibling));
-	},
-
-	'+': function(node, tag, id, classes, attributes, pseudos){ // next sibling
-		while ((node = node.nextSibling)) if (node.nodeType == 1){
-			this.push(node, tag, id, classes, attributes, pseudos);
-			break;
-		}
-	},
-
-	'^': function(node, tag, id, classes, attributes, pseudos){ // first child
-		node = node.firstChild;
-		if (node){
-			if (node.nodeType == 1) this.push(node, tag, id, classes, attributes, pseudos);
-			else this['combinator:+'](node, tag, id, classes, attributes, pseudos);
-		}
-	},
-
-	'~': function(node, tag, id, classes, attributes, pseudos){ // next siblings
-		while ((node = node.nextSibling)){
-			if (node.nodeType != 1) continue;
-			var uid = this.getUID(node);
-			if (this.bitUniques[uid]) break;
-			this.bitUniques[uid] = true;
-			this.push(node, tag, id, classes, attributes, pseudos);
-		}
-	},
-
-	'++': function(node, tag, id, classes, attributes, pseudos){ // next sibling and previous sibling
-		this['combinator:+'](node, tag, id, classes, attributes, pseudos);
-		this['combinator:!+'](node, tag, id, classes, attributes, pseudos);
-	},
-
-	'~~': function(node, tag, id, classes, attributes, pseudos){ // next siblings and previous siblings
-		this['combinator:~'](node, tag, id, classes, attributes, pseudos);
-		this['combinator:!~'](node, tag, id, classes, attributes, pseudos);
-	},
-
-	'!': function(node, tag, id, classes, attributes, pseudos){ // all parent nodes up to document
-		while ((node = node.parentNode)) if (node !== this.document) this.push(node, tag, id, classes, attributes, pseudos);
-	},
-
-	'!>': function(node, tag, id, classes, attributes, pseudos){ // direct parent (one level)
-		node = node.parentNode;
-		if (node !== this.document) this.push(node, tag, id, classes, attributes, pseudos);
-	},
-
-	'!+': function(node, tag, id, classes, attributes, pseudos){ // previous sibling
-		while ((node = node.previousSibling)) if (node.nodeType == 1){
-			this.push(node, tag, id, classes, attributes, pseudos);
-			break;
-		}
-	},
-
-	'!^': function(node, tag, id, classes, attributes, pseudos){ // last child
-		node = node.lastChild;
-		if (node){
-			if (node.nodeType == 1) this.push(node, tag, id, classes, attributes, pseudos);
-			else this['combinator:!+'](node, tag, id, classes, attributes, pseudos);
-		}
-	},
-
-	'!~': function(node, tag, id, classes, attributes, pseudos){ // previous siblings
-		while ((node = node.previousSibling)){
-			if (node.nodeType != 1) continue;
-			var uid = this.getUID(node);
-			if (this.bitUniques[uid]) break;
-			this.bitUniques[uid] = true;
-			this.push(node, tag, id, classes, attributes, pseudos);
-		}
-	}
-
-};
-
-for (var c in combinators) local['combinator:' + c] = combinators[c];
-
-var pseudos = {
-
-	/*<pseudo-selectors>*/
-
-	'empty': function(node){
-		var child = node.firstChild;
-		return !(child && child.nodeType == 1) && !(node.innerText || node.textContent || '').length;
-	},
-
-	'not': function(node, expression){
-		return !this.matchNode(node, expression);
-	},
-
-	'contains': function(node, text){
-		return (node.innerText || node.textContent || '').indexOf(text) > -1;
-	},
-
-	'first-child': function(node){
-		while ((node = node.previousSibling)) if (node.nodeType == 1) return false;
-		return true;
-	},
-
-	'last-child': function(node){
-		while ((node = node.nextSibling)) if (node.nodeType == 1) return false;
-		return true;
-	},
-
-	'only-child': function(node){
-		var prev = node;
-		while ((prev = prev.previousSibling)) if (prev.nodeType == 1) return false;
-		var next = node;
-		while ((next = next.nextSibling)) if (next.nodeType == 1) return false;
-		return true;
-	},
-
-	/*<nth-pseudo-selectors>*/
-
-	'nth-child': local.createNTHPseudo('firstChild', 'nextSibling', 'posNTH'),
-
-	'nth-last-child': local.createNTHPseudo('lastChild', 'previousSibling', 'posNTHLast'),
-
-	'nth-of-type': local.createNTHPseudo('firstChild', 'nextSibling', 'posNTHType', true),
-
-	'nth-last-of-type': local.createNTHPseudo('lastChild', 'previousSibling', 'posNTHTypeLast', true),
-
-	'index': function(node, index){
-		return this['pseudo:nth-child'](node, '' + (index + 1));
-	},
-
-	'even': function(node){
-		return this['pseudo:nth-child'](node, '2n');
-	},
-
-	'odd': function(node){
-		return this['pseudo:nth-child'](node, '2n+1');
-	},
-
-	/*</nth-pseudo-selectors>*/
-
-	/*<of-type-pseudo-selectors>*/
-
-	'first-of-type': function(node){
-		var nodeName = node.nodeName;
-		while ((node = node.previousSibling)) if (node.nodeName == nodeName) return false;
-		return true;
-	},
-
-	'last-of-type': function(node){
-		var nodeName = node.nodeName;
-		while ((node = node.nextSibling)) if (node.nodeName == nodeName) return false;
-		return true;
-	},
-
-	'only-of-type': function(node){
-		var prev = node, nodeName = node.nodeName;
-		while ((prev = prev.previousSibling)) if (prev.nodeName == nodeName) return false;
-		var next = node;
-		while ((next = next.nextSibling)) if (next.nodeName == nodeName) return false;
-		return true;
-	},
-
-	/*</of-type-pseudo-selectors>*/
-
-	// custom pseudos
-
-	'enabled': function(node){
-		return !node.disabled;
-	},
-
-	'disabled': function(node){
-		return node.disabled;
-	},
-
-	'checked': function(node){
-		return node.checked || node.selected;
-	},
-
-	'focus': function(node){
-		return this.isHTMLDocument && this.document.activeElement === node && (node.href || node.type || this.hasAttribute(node, 'tabindex'));
-	},
-
-	'root': function(node){
-		return (node === this.root);
-	},
-
-	'selected': function(node){
-		return node.selected;
-	}
-
-	/*</pseudo-selectors>*/
-};
-
-for (var p in pseudos) local['pseudo:' + p] = pseudos[p];
-
-// attributes methods
-
-var attributeGetters = local.attributeGetters = {
-
-	'for': function(){
-		return ('htmlFor' in this) ? this.htmlFor : this.getAttribute('for');
-	},
-
-	'href': function(){
-		return ('href' in this) ? this.getAttribute('href', 2) : this.getAttribute('href');
-	},
-
-	'style': function(){
-		return (this.style) ? this.style.cssText : this.getAttribute('style');
-	},
-
-	'tabindex': function(){
-		var attributeNode = this.getAttributeNode('tabindex');
-		return (attributeNode && attributeNode.specified) ? attributeNode.nodeValue : null;
-	},
-
-	'type': function(){
-		return this.getAttribute('type');
-	},
-
-	'maxlength': function(){
-		var attributeNode = this.getAttributeNode('maxLength');
-		return (attributeNode && attributeNode.specified) ? attributeNode.nodeValue : null;
-	}
-
-};
-
-attributeGetters.MAXLENGTH = attributeGetters.maxLength = attributeGetters.maxlength;
-
-// Slick
-
-var Slick = local.Slick = (this.Slick || {});
-
-Slick.version = '1.1.7';
-
-// Slick finder
-
-Slick.search = function(context, expression, append){
-	return local.search(context, expression, append);
-};
-
-Slick.find = function(context, expression){
-	return local.search(context, expression, null, true);
-};
-
-// Slick containment checker
-
-Slick.contains = function(container, node){
-	local.setDocument(container);
-	return local.contains(container, node);
-};
-
-// Slick attribute getter
-
-Slick.getAttribute = function(node, name){
-	local.setDocument(node);
-	return local.getAttribute(node, name);
-};
-
-Slick.hasAttribute = function(node, name){
-	local.setDocument(node);
-	return local.hasAttribute(node, name);
-};
-
-// Slick matcher
-
-Slick.match = function(node, selector){
-	if (!(node && selector)) return false;
-	if (!selector || selector === node) return true;
-	local.setDocument(node);
-	return local.matchNode(node, selector);
-};
-
-// Slick attribute accessor
-
-Slick.defineAttributeGetter = function(name, fn){
-	local.attributeGetters[name] = fn;
-	return this;
-};
-
-Slick.lookupAttributeGetter = function(name){
-	return local.attributeGetters[name];
-};
-
-// Slick pseudo accessor
-
-Slick.definePseudo = function(name, fn){
-	local['pseudo:' + name] = function(node, argument){
-		return fn.call(node, argument);
-	};
-	return this;
-};
-
-Slick.lookupPseudo = function(name){
-	var pseudo = local['pseudo:' + name];
-	if (pseudo) return function(argument){
-		return pseudo.call(this, argument);
-	};
-	return null;
-};
-
-// Slick overrides accessor
-
-Slick.override = function(regexp, fn){
-	local.override(regexp, fn);
-	return this;
-};
-
-Slick.isXML = local.isXML;
-
-Slick.uidOf = function(node){
-	return local.getUIDHTML(node);
-};
-
-if (!this.Slick) this.Slick = Slick;
-
-}).apply(/*<CommonJS>*/(typeof exports != 'undefined') ? exports : /*</CommonJS>*/this);
-
-/*
----
-
-name: Element
-
-description: One of the most important items in MooTools. Contains the dollar function, the dollars function, and an handful of cross-browser, time-saver methods to let you easily work with HTML Elements.
-
-license: MIT-style license.
-
-requires: [Window, Document, Array, String, Function, Object, Number, Slick.Parser, Slick.Finder]
-
-provides: [Element, Elements, $, $$, IFrame, Selectors]
-
-...
-*/
-
-var Element = this.Element = function(tag, props){
-	var konstructor = Element.Constructors[tag];
-	if (konstructor) return konstructor(props);
-	if (typeof tag != 'string') return document.id(tag).set(props);
-
-	if (!props) props = {};
-
-	if (!(/^[\w-]+$/).test(tag)){
-		var parsed = Slick.parse(tag).expressions[0][0];
-		tag = (parsed.tag == '*') ? 'div' : parsed.tag;
-		if (parsed.id && props.id == null) props.id = parsed.id;
-
-		var attributes = parsed.attributes;
-		if (attributes) for (var attr, i = 0, l = attributes.length; i < l; i++){
-			attr = attributes[i];
-			if (props[attr.key] != null) continue;
-
-			if (attr.value != null && attr.operator == '=') props[attr.key] = attr.value;
-			else if (!attr.value && !attr.operator) props[attr.key] = true;
-		}
-
-		if (parsed.classList && props['class'] == null) props['class'] = parsed.classList.join(' ');
-	}
-
-	return document.newElement(tag, props);
-};
-
-
-if (Browser.Element){
-	Element.prototype = Browser.Element.prototype;
-	// IE8 and IE9 require the wrapping.
-	Element.prototype._fireEvent = (function(fireEvent){
-		return function(type, event){
-			return fireEvent.call(this, type, event);
-		};
-	})(Element.prototype.fireEvent);
-}
-
-new Type('Element', Element).mirror(function(name){
-	if (Array.prototype[name]) return;
-
-	var obj = {};
-	obj[name] = function(){
-		var results = [], args = arguments, elements = true;
-		for (var i = 0, l = this.length; i < l; i++){
-			var element = this[i], result = results[i] = element[name].apply(element, args);
-			elements = (elements && typeOf(result) == 'element');
-		}
-		return (elements) ? new Elements(results) : results;
-	};
-
-	Elements.implement(obj);
-});
-
-if (!Browser.Element){
-	Element.parent = Object;
-
-	Element.Prototype = {
-		'$constructor': Element,
-		'$family': Function.convert('element').hide()
-	};
-
-	Element.mirror(function(name, method){
-		Element.Prototype[name] = method;
-	});
-}
-
-Element.Constructors = {};
-
-
-
-var IFrame = new Type('IFrame', function(){
-	var params = Array.link(arguments, {
-		properties: Type.isObject,
-		iframe: function(obj){
-			return (obj != null);
-		}
-	});
-
-	var props = params.properties || {}, iframe;
-	if (params.iframe) iframe = document.id(params.iframe);
-	var onload = props.onload || function(){};
-	delete props.onload;
-	props.id = props.name = [props.id, props.name, iframe ? (iframe.id || iframe.name) : 'IFrame_' + String.uniqueID()].pick();
-	iframe = new Element(iframe || 'iframe', props);
-
-	var onLoad = function(){
-		onload.call(iframe.contentWindow);
-	};
-
-	if (window.frames[props.id]) onLoad();
-	else iframe.addListener('load', onLoad);
-	return iframe;
-});
-
-var Elements = this.Elements = function(nodes){
-	if (nodes && nodes.length){
-		var uniques = {}, node;
-		for (var i = 0; node = nodes[i++];){
-			var uid = Slick.uidOf(node);
-			if (!uniques[uid]){
-				uniques[uid] = true;
-				this.push(node);
-			}
-		}
-	}
-};
-
-Elements.prototype = {length: 0};
-Elements.parent = Array;
-
-new Type('Elements', Elements).implement({
-
-	filter: function(filter, bind){
-		if (!filter) return this;
-		return new Elements(Array.filter(this, (typeOf(filter) == 'string') ? function(item){
-			return item.match(filter);
-		} : filter, bind));
-	}.protect(),
-
-	push: function(){
-		var length = this.length;
-		for (var i = 0, l = arguments.length; i < l; i++){
-			var item = document.id(arguments[i]);
-			if (item) this[length++] = item;
-		}
-		return (this.length = length);
-	}.protect(),
-
-	unshift: function(){
-		var items = [];
-		for (var i = 0, l = arguments.length; i < l; i++){
-			var item = document.id(arguments[i]);
-			if (item) items.push(item);
-		}
-		return Array.prototype.unshift.apply(this, items);
-	}.protect(),
-
-	concat: function(){
-		var newElements = new Elements(this);
-		for (var i = 0, l = arguments.length; i < l; i++){
-			var item = arguments[i];
-			if (Type.isEnumerable(item)) newElements.append(item);
-			else newElements.push(item);
-		}
-		return newElements;
-	}.protect(),
-
-	append: function(collection){
-		for (var i = 0, l = collection.length; i < l; i++) this.push(collection[i]);
-		return this;
-	}.protect(),
-
-	empty: function(){
-		while (this.length) delete this[--this.length];
-		return this;
-	}.protect()
-
-});
-
-
-
-(function(){
-
-// FF, IE
-var splice = Array.prototype.splice, object = {'0': 0, '1': 1, length: 2};
-
-splice.call(object, 1, 1);
-if (object[1] == 1) Elements.implement('splice', function(){
-	var length = this.length;
-	var result = splice.apply(this, arguments);
-	while (length >= this.length) delete this[length--];
-	return result;
-}.protect());
-
-Array.forEachMethod(function(method, name){
-	Elements.implement(name, method);
-});
-
-Array.mirror(Elements);
-
-/*<ltIE8>*/
-var createElementAcceptsHTML;
-try {
-	createElementAcceptsHTML = (document.createElement('<input name=x>').name == 'x');
-} catch (e){}
-
-var escapeQuotes = function(html){
-	return ('' + html).replace(/&/g, '&amp;').replace(/"/g, '&quot;');
-};
-/*</ltIE8>*/
-
-/*<ltIE9>*/
-// #2479 - IE8 Cannot set HTML of style element
-var canChangeStyleHTML = (function(){
-	var div = document.createElement('style'),
-		flag = false;
-	try {
-		div.innerHTML = '#justTesing{margin: 0px;}';
-		flag = !!div.innerHTML;
-	} catch (e){}
-	return flag;
-})();
-/*</ltIE9>*/
-
-Document.implement({
-
-	newElement: function(tag, props){
-		if (props){
-			if (props.checked != null) props.defaultChecked = props.checked;
-			if ((props.type == 'checkbox' || props.type == 'radio') && props.value == null) props.value = 'on';
-			/*<ltIE9>*/ // IE needs the type to be set before changing content of style element
-			if (!canChangeStyleHTML && tag == 'style'){
-				var styleElement = document.createElement('style');
-				styleElement.setAttribute('type', 'text/css');
-				if (props.type) delete props.type;
-				return this.id(styleElement).set(props);
-			}
-			/*</ltIE9>*/
-			/*<ltIE8>*/// Fix for readonly name and type properties in IE < 8
-			if (createElementAcceptsHTML){
-				tag = '<' + tag;
-				if (props.name) tag += ' name="' + escapeQuotes(props.name) + '"';
-				if (props.type) tag += ' type="' + escapeQuotes(props.type) + '"';
-				tag += '>';
-				delete props.name;
-				delete props.type;
-			}
-			/*</ltIE8>*/
-		}
-		return this.id(this.createElement(tag)).set(props);
-	}
-
-});
-
-})();
-
-(function(){
-
-Slick.uidOf(window);
-Slick.uidOf(document);
-
-Document.implement({
-
-	newTextNode: function(text){
-		return this.createTextNode(text);
-	},
-
-	getDocument: function(){
-		return this;
-	},
-
-	getWindow: function(){
-		return this.window;
-	},
-
-	id: (function(){
-
-		var types = {
-
-			string: function(id, nocash, doc){
-				id = Slick.find(doc, '#' + id.replace(/(\W)/g, '\\$1'));
-				return (id) ? types.element(id, nocash) : null;
-			},
-
-			element: function(el, nocash){
-				Slick.uidOf(el);
-				if (!nocash && !el.$family && !(/^(?:object|embed)$/i).test(el.tagName)){
-					var fireEvent = el.fireEvent;
-					// wrapping needed in IE7, or else crash
-					el._fireEvent = function(type, event){
-						return fireEvent(type, event);
-					};
-					Object.append(el, Element.Prototype);
-				}
-				return el;
-			},
-
-			object: function(obj, nocash, doc){
-				if (obj.toElement) return types.element(obj.toElement(doc), nocash);
-				return null;
-			}
-
-		};
-
-		types.textnode = types.whitespace = types.window = types.document = function(zero){
-			return zero;
-		};
-
-		return function(el, nocash, doc){
-			if (el && el.$family && el.uniqueNumber) return el;
-			var type = typeOf(el);
-			return (types[type]) ? types[type](el, nocash, doc || document) : null;
-		};
-
-	})()
-
-});
-
-if (window.$ == null) Window.implement('$', function(el, nc){
-	return document.id(el, nc, this.document);
-});
-
-Window.implement({
-
-	getDocument: function(){
-		return this.document;
-	},
-
-	getWindow: function(){
-		return this;
-	}
-
-});
-
-[Document, Element].invoke('implement', {
-
-	getElements: function(expression){
-		return Slick.search(this, expression, new Elements);
-	},
-
-	getElement: function(expression){
-		return document.id(Slick.find(this, expression));
-	}
-
-});
-
-var contains = {contains: function(element){
-	return Slick.contains(this, element);
-}};
-
-if (!document.contains) Document.implement(contains);
-if (!document.createElement('div').contains) Element.implement(contains);
-
-
-
-// tree walking
-
-var injectCombinator = function(expression, combinator){
-	if (!expression) return combinator;
-
-	expression = Object.clone(Slick.parse(expression));
-
-	var expressions = expression.expressions;
-	for (var i = expressions.length; i--;)
-		expressions[i][0].combinator = combinator;
-
-	return expression;
-};
-
-Object.forEach({
-	getNext: '~',
-	getPrevious: '!~',
-	getParent: '!'
-}, function(combinator, method){
-	Element.implement(method, function(expression){
-		return this.getElement(injectCombinator(expression, combinator));
-	});
-});
-
-Object.forEach({
-	getAllNext: '~',
-	getAllPrevious: '!~',
-	getSiblings: '~~',
-	getChildren: '>',
-	getParents: '!'
-}, function(combinator, method){
-	Element.implement(method, function(expression){
-		return this.getElements(injectCombinator(expression, combinator));
-	});
-});
-
-Element.implement({
-
-	getFirst: function(expression){
-		return document.id(Slick.search(this, injectCombinator(expression, '>'))[0]);
-	},
-
-	getLast: function(expression){
-		return document.id(Slick.search(this, injectCombinator(expression, '>')).getLast());
-	},
-
-	getWindow: function(){
-		return this.ownerDocument.window;
-	},
-
-	getDocument: function(){
-		return this.ownerDocument;
-	},
-
-	getElementById: function(id){
-		return document.id(Slick.find(this, '#' + ('' + id).replace(/(\W)/g, '\\$1')));
-	},
-
-	match: function(expression){
-		return !expression || Slick.match(this, expression);
-	}
-
-});
-
-
-
-if (window.$$ == null) Window.implement('$$', function(selector){
-	if (arguments.length == 1){
-		if (typeof selector == 'string') return Slick.search(this.document, selector, new Elements);
-		else if (Type.isEnumerable(selector)) return new Elements(selector);
-	}
-	return new Elements(arguments);
-});
-
-// Inserters
-
-var inserters = {
-
-	before: function(context, element){
-		var parent = element.parentNode;
-		if (parent) parent.insertBefore(context, element);
-	},
-
-	after: function(context, element){
-		var parent = element.parentNode;
-		if (parent) parent.insertBefore(context, element.nextSibling);
-	},
-
-	bottom: function(context, element){
-		element.appendChild(context);
-	},
-
-	top: function(context, element){
-		element.insertBefore(context, element.firstChild);
-	}
-
-};
-
-inserters.inside = inserters.bottom;
-
-
-
-// getProperty / setProperty
-
-var propertyGetters = {}, propertySetters = {};
-
-// properties
-
-var properties = {};
-Array.forEach([
-	'type', 'value', 'defaultValue', 'accessKey', 'cellPadding', 'cellSpacing', 'colSpan',
-	'frameBorder', 'rowSpan', 'tabIndex', 'useMap'
-], function(property){
-	properties[property.toLowerCase()] = property;
-});
-
-properties.html = 'innerHTML';
-properties.text = (document.createElement('div').textContent == null) ? 'innerText': 'textContent';
-
-Object.forEach(properties, function(real, key){
-	propertySetters[key] = function(node, value){
-		node[real] = value;
-	};
-	propertyGetters[key] = function(node){
-		return node[real];
-	};
-});
-
-/*<ltIE9>*/
-propertySetters.text = (function(){
-	return function(node, value){
-		if (node.get('tag') == 'style') node.set('html', value);
-		else node[properties.text] = value;
-	};
-})(propertySetters.text);
-
-propertyGetters.text = (function(getter){
-	return function(node){
-		return (node.get('tag') == 'style') ? node.innerHTML : getter(node);
-	};
-})(propertyGetters.text);
-/*</ltIE9>*/
-
-// Booleans
-
-var bools = [
-	'compact', 'nowrap', 'ismap', 'declare', 'noshade', 'checked',
-	'disabled', 'readOnly', 'multiple', 'selected', 'noresize',
-	'defer', 'defaultChecked', 'autofocus', 'controls', 'autoplay',
-	'loop'
-];
-
-var booleans = {};
-Array.forEach(bools, function(bool){
-	var lower = bool.toLowerCase();
-	booleans[lower] = bool;
-	propertySetters[lower] = function(node, value){
-		node[bool] = !!value;
-	};
-	propertyGetters[lower] = function(node){
-		return !!node[bool];
-	};
-});
-
-// Special cases
-
-Object.append(propertySetters, {
-
-	'class': function(node, value){
-		('className' in node) ? node.className = (value || '') : node.setAttribute('class', value);
-	},
-
-	'for': function(node, value){
-		('htmlFor' in node) ? node.htmlFor = value : node.setAttribute('for', value);
-	},
-
-	'style': function(node, value){
-		(node.style) ? node.style.cssText = value : node.setAttribute('style', value);
-	},
-
-	'value': function(node, value){
-		node.value = (value != null) ? value : '';
-	}
-
-});
-
-propertyGetters['class'] = function(node){
-	return ('className' in node) ? node.className || null : node.getAttribute('class');
-};
-
-/* <webkit> */
-var el = document.createElement('button');
-// IE sets type as readonly and throws
-try { el.type = 'button'; } catch (e){}
-if (el.type != 'button') propertySetters.type = function(node, value){
-	node.setAttribute('type', value);
-};
-el = null;
-/* </webkit> */
-
-/*<IE>*/
-
-/*<ltIE9>*/
-// #2479 - IE8 Cannot set HTML of style element
-var canChangeStyleHTML = (function(){
-	var div = document.createElement('style'),
-		flag = false;
-	try {
-		div.innerHTML = '#justTesing{margin: 0px;}';
-		flag = !!div.innerHTML;
-	} catch (e){}
-	return flag;
-})();
-/*</ltIE9>*/
-
-var input = document.createElement('input'), volatileInputValue, html5InputSupport;
-
-// #2178
-input.value = 't';
-input.type = 'submit';
-volatileInputValue = input.value != 't';
-
-// #2443 - IE throws "Invalid Argument" when trying to use html5 input types
-try {
-	input.value = '';
-	input.type = 'email';
-	html5InputSupport = input.type == 'email';
-} catch (e){}
-
-input = null;
-
-if (volatileInputValue || !html5InputSupport) propertySetters.type = function(node, type){
-	try {
-		var value = node.value;
-		node.type = type;
-		node.value = value;
-	} catch (e){}
-};
-/*</IE>*/
-
-/* getProperty, setProperty */
-
-/* <ltIE9> */
-var pollutesGetAttribute = (function(div){
-	div.random = 'attribute';
-	return (div.getAttribute('random') == 'attribute');
-})(document.createElement('div'));
-
-var hasCloneBug = (function(test){
-	test.innerHTML = '<object><param name="should_fix" value="the unknown" /></object>';
-	return test.cloneNode(true).firstChild.childNodes.length != 1;
-})(document.createElement('div'));
-/* </ltIE9> */
-
-var hasClassList = !!document.createElement('div').classList;
-
-var classes = function(className){
-	var classNames = (className || '').clean().split(' '), uniques = {};
-	return classNames.filter(function(className){
-		if (className !== '' && !uniques[className]) return uniques[className] = className;
-	});
-};
-
-var addToClassList = function(name){
-	this.classList.add(name);
-};
-
-var removeFromClassList = function(name){
-	this.classList.remove(name);
-};
-
-Element.implement({
-
-	setProperty: function(name, value){
-		var setter = propertySetters[name.toLowerCase()];
-		if (setter){
-			setter(this, value);
-		} else {
-			/* <ltIE9> */
-			var attributeWhiteList;
-			if (pollutesGetAttribute) attributeWhiteList = this.retrieve('$attributeWhiteList', {});
-			/* </ltIE9> */
-
-			if (value == null){
-				this.removeAttribute(name);
-				/* <ltIE9> */
-				if (pollutesGetAttribute) delete attributeWhiteList[name];
-				/* </ltIE9> */
-			} else {
-				this.setAttribute(name, '' + value);
-				/* <ltIE9> */
-				if (pollutesGetAttribute) attributeWhiteList[name] = true;
-				/* </ltIE9> */
-			}
-		}
-		return this;
-	},
-
-	setProperties: function(attributes){
-		for (var attribute in attributes) this.setProperty(attribute, attributes[attribute]);
-		return this;
-	},
-
-	getProperty: function(name){
-		var getter = propertyGetters[name.toLowerCase()];
-		if (getter) return getter(this);
-		/* <ltIE9> */
-		if (pollutesGetAttribute){
-			var attr = this.getAttributeNode(name), attributeWhiteList = this.retrieve('$attributeWhiteList', {});
-			if (!attr) return null;
-			if (attr.expando && !attributeWhiteList[name]){
-				var outer = this.outerHTML;
-				// segment by the opening tag and find mention of attribute name
-				if (outer.substr(0, outer.search(/\/?['"]?>(?![^<]*<['"])/)).indexOf(name) < 0) return null;
-				attributeWhiteList[name] = true;
-			}
-		}
-		/* </ltIE9> */
-		var result = Slick.getAttribute(this, name);
-		return (!result && !Slick.hasAttribute(this, name)) ? null : result;
-	},
-
-	getProperties: function(){
-		var args = Array.convert(arguments);
-		return args.map(this.getProperty, this).associate(args);
-	},
-
-	removeProperty: function(name){
-		return this.setProperty(name, null);
-	},
-
-	removeProperties: function(){
-		Array.each(arguments, this.removeProperty, this);
-		return this;
-	},
-
-	set: function(prop, value){
-		var property = Element.Properties[prop];
-		(property && property.set) ? property.set.call(this, value) : this.setProperty(prop, value);
-	}.overloadSetter(),
-
-	get: function(prop){
-		var property = Element.Properties[prop];
-		return (property && property.get) ? property.get.apply(this) : this.getProperty(prop);
-	}.overloadGetter(),
-
-	erase: function(prop){
-		var property = Element.Properties[prop];
-		(property && property.erase) ? property.erase.apply(this) : this.removeProperty(prop);
-		return this;
-	},
-
-	hasClass: hasClassList ? function(className){
-		return this.classList.contains(className);
-	} : function(className){
-		return classes(this.className).contains(className);
-	},
-
-	addClass: hasClassList ? function(className){
-		classes(className).forEach(addToClassList, this);
-		return this;
-	} : function(className){
-		this.className = classes(className + ' ' + this.className).join(' ');
-		return this;
-	},
-
-	removeClass: hasClassList ? function(className){
-		classes(className).forEach(removeFromClassList, this);
-		return this;
-	} : function(className){
-		var classNames = classes(this.className);
-		classes(className).forEach(classNames.erase, classNames);
-		this.className = classNames.join(' ');
-		return this;
-	},
-
-	toggleClass: function(className, force){
-		if (force == null) force = !this.hasClass(className);
-		return (force) ? this.addClass(className) : this.removeClass(className);
-	},
-
-	adopt: function(){
-		var parent = this, fragment, elements = Array.flatten(arguments), length = elements.length;
-		if (length > 1) parent = fragment = document.createDocumentFragment();
-
-		for (var i = 0; i < length; i++){
-			var element = document.id(elements[i], true);
-			if (element) parent.appendChild(element);
-		}
-
-		if (fragment) this.appendChild(fragment);
-
-		return this;
-	},
-
-	appendText: function(text, where){
-		return this.grab(this.getDocument().newTextNode(text), where);
-	},
-
-	grab: function(el, where){
-		inserters[where || 'bottom'](document.id(el, true), this);
-		return this;
-	},
-
-	inject: function(el, where){
-		inserters[where || 'bottom'](this, document.id(el, true));
-		return this;
-	},
-
-	replaces: function(el){
-		el = document.id(el, true);
-		el.parentNode.replaceChild(this, el);
-		return this;
-	},
-
-	wraps: function(el, where){
-		el = document.id(el, true);
-		return this.replaces(el).grab(el, where);
-	},
-
-	getSelected: function(){
-		this.selectedIndex; // Safari 3.2.1
-		return new Elements(Array.convert(this.options).filter(function(option){
-			return option.selected;
-		}));
-	},
-
-	toQueryString: function(){
-		var queryString = [];
-		this.getElements('input, select, textarea').each(function(el){
-			var type = el.type;
-			if (!el.name || el.disabled || type == 'submit' || type == 'reset' || type == 'file' || type == 'image') return;
-
-			var value = (el.get('tag') == 'select') ? el.getSelected().map(function(opt){
-				// IE
-				return document.id(opt).get('value');
-			}) : ((type == 'radio' || type == 'checkbox') && !el.checked) ? null : el.get('value');
-
-			Array.convert(value).each(function(val){
-				if (typeof val != 'undefined') queryString.push(encodeURIComponent(el.name) + '=' + encodeURIComponent(val));
-			});
-		});
-		return queryString.join('&');
-	}
-
-});
-
-
-// appendHTML
-
-var appendInserters = {
-	before: 'beforeBegin',
-	after: 'afterEnd',
-	bottom: 'beforeEnd',
-	top: 'afterBegin',
-	inside: 'beforeEnd'
-};
-
-Element.implement('appendHTML', ('insertAdjacentHTML' in document.createElement('div')) ? function(html, where){
-	this.insertAdjacentHTML(appendInserters[where || 'bottom'], html);
-	return this;
-} : function(html, where){
-	var temp = new Element('div', {html: html}),
-		children = temp.childNodes,
-		fragment = temp.firstChild;
-
-	if (!fragment) return this;
-	if (children.length > 1){
-		fragment = document.createDocumentFragment();
-		for (var i = 0, l = children.length; i < l; i++){
-			fragment.appendChild(children[i]);
-		}
-	}
-
-	inserters[where || 'bottom'](fragment, this);
-	return this;
-});
-
-var collected = {}, storage = {};
-
-var get = function(uid){
-	return (storage[uid] || (storage[uid] = {}));
-};
-
-var clean = function(item){
-	var uid = item.uniqueNumber;
-	if (item.removeEvents) item.removeEvents();
-	if (item.clearAttributes) item.clearAttributes();
-	if (uid != null){
-		delete collected[uid];
-		delete storage[uid];
-	}
-	return item;
-};
-
-var formProps = {input: 'checked', option: 'selected', textarea: 'value'};
-
-Element.implement({
-
-	destroy: function(){
-		var children = clean(this).getElementsByTagName('*');
-		Array.each(children, clean);
-		Element.dispose(this);
-		return null;
-	},
-
-	empty: function(){
-		Array.convert(this.childNodes).each(Element.dispose);
-		return this;
-	},
-
-	dispose: function(){
-		return (this.parentNode) ? this.parentNode.removeChild(this) : this;
-	},
-
-	clone: function(contents, keepid){
-		contents = contents !== false;
-		var clone = this.cloneNode(contents), ce = [clone], te = [this], i;
-
-		if (contents){
-			ce.append(Array.convert(clone.getElementsByTagName('*')));
-			te.append(Array.convert(this.getElementsByTagName('*')));
-		}
-
-		for (i = ce.length; i--;){
-			var node = ce[i], element = te[i];
-			if (!keepid) node.removeAttribute('id');
-			/*<ltIE9>*/
-			if (node.clearAttributes){
-				node.clearAttributes();
-				node.mergeAttributes(element);
-				node.removeAttribute('uniqueNumber');
-				if (node.options){
-					var no = node.options, eo = element.options;
-					for (var j = no.length; j--;) no[j].selected = eo[j].selected;
-				}
-			}
-			/*</ltIE9>*/
-			var prop = formProps[element.tagName.toLowerCase()];
-			if (prop && element[prop]) node[prop] = element[prop];
-		}
-
-		/*<ltIE9>*/
-		if (hasCloneBug){
-			var co = clone.getElementsByTagName('object'), to = this.getElementsByTagName('object');
-			for (i = co.length; i--;) co[i].outerHTML = to[i].outerHTML;
-		}
-		/*</ltIE9>*/
-		return document.id(clone);
-	}
-
-});
-
-[Element, Window, Document].invoke('implement', {
-
-	addListener: function(type, fn){
-		if (window.attachEvent && !window.addEventListener){
-			collected[Slick.uidOf(this)] = this;
-		}
-		if (this.addEventListener) this.addEventListener(type, fn, !!arguments[2]);
-		else this.attachEvent('on' + type, fn);
-		return this;
-	},
-
-	removeListener: function(type, fn){
-		if (this.removeEventListener) this.removeEventListener(type, fn, !!arguments[2]);
-		else this.detachEvent('on' + type, fn);
-		return this;
-	},
-
-	retrieve: function(property, dflt){
-		var storage = get(Slick.uidOf(this)), prop = storage[property];
-		if (dflt != null && prop == null) prop = storage[property] = dflt;
-		return prop != null ? prop : null;
-	},
-
-	store: function(property, value){
-		var storage = get(Slick.uidOf(this));
-		storage[property] = value;
-		return this;
-	},
-
-	eliminate: function(property){
-		var storage = get(Slick.uidOf(this));
-		delete storage[property];
-		return this;
-	}
-
-});
-
-/*<ltIE9>*/
-if (window.attachEvent && !window.addEventListener){
-	var gc = function(){
-		Object.each(collected, clean);
-		if (window.CollectGarbage) CollectGarbage();
-		window.removeListener('unload', gc);
-	};
-	window.addListener('unload', gc);
-}
-/*</ltIE9>*/
-
-Element.Properties = {};
-
-
-
-Element.Properties.style = {
-
-	set: function(style){
-		this.style.cssText = style;
-	},
-
-	get: function(){
-		return this.style.cssText;
-	},
-
-	erase: function(){
-		this.style.cssText = '';
-	}
-
-};
-
-Element.Properties.tag = {
-
-	get: function(){
-		return this.tagName.toLowerCase();
-	}
-
-};
-
-Element.Properties.html = {
-
-	set: function(html){
-		if (html == null) html = '';
-		else if (typeOf(html) == 'array') html = html.join('');
-
-		/*<ltIE9>*/
-		if (this.styleSheet && !canChangeStyleHTML) this.styleSheet.cssText = html;
-		else /*</ltIE9>*/this.innerHTML = html;
-	},
-	erase: function(){
-		this.set('html', '');
-	}
-
-};
-
-var supportsHTML5Elements = true, supportsTableInnerHTML = true, supportsTRInnerHTML = true;
-
-/*<ltIE9>*/
-// technique by jdbarlett - http://jdbartlett.com/innershiv/
-var div = document.createElement('div');
-var fragment;
-div.innerHTML = '<nav></nav>';
-supportsHTML5Elements = (div.childNodes.length == 1);
-if (!supportsHTML5Elements){
-	var tags = 'abbr article aside audio canvas datalist details figcaption figure footer header hgroup mark meter nav output progress section summary time video'.split(' ');
-	fragment = document.createDocumentFragment(), l = tags.length;
-	while (l--) fragment.createElement(tags[l]);
-}
-div = null;
-/*</ltIE9>*/
-
-/*<IE>*/
-supportsTableInnerHTML = Function.attempt(function(){
-	var table = document.createElement('table');
-	table.innerHTML = '<tr><td></td></tr>';
-	return true;
-});
-
-/*<ltFF4>*/
-var tr = document.createElement('tr'), html = '<td></td>';
-tr.innerHTML = html;
-supportsTRInnerHTML = (tr.innerHTML == html);
-tr = null;
-/*</ltFF4>*/
-
-if (!supportsTableInnerHTML || !supportsTRInnerHTML || !supportsHTML5Elements){
-
-	Element.Properties.html.set = (function(set){
-
-		var translations = {
-			table: [1, '<table>', '</table>'],
-			select: [1, '<select>', '</select>'],
-			tbody: [2, '<table><tbody>', '</tbody></table>'],
-			tr: [3, '<table><tbody><tr>', '</tr></tbody></table>']
-		};
-
-		translations.thead = translations.tfoot = translations.tbody;
-
-		return function(html){
-
-			/*<ltIE9>*/
-			if (this.styleSheet) return set.call(this, html);
-			/*</ltIE9>*/
-			var wrap = translations[this.get('tag')];
-			if (!wrap && !supportsHTML5Elements) wrap = [0, '', ''];
-			if (!wrap) return set.call(this, html);
-
-			var level = wrap[0], wrapper = document.createElement('div'), target = wrapper;
-			if (!supportsHTML5Elements) fragment.appendChild(wrapper);
-			wrapper.innerHTML = [wrap[1], html, wrap[2]].flatten().join('');
-			while (level--) target = target.firstChild;
-			this.empty().adopt(target.childNodes);
-			if (!supportsHTML5Elements) fragment.removeChild(wrapper);
-			wrapper = null;
-		};
-
-	})(Element.Properties.html.set);
-}
-/*</IE>*/
-
-/*<ltIE9>*/
-var testForm = document.createElement('form');
-testForm.innerHTML = '<select><option>s</option></select>';
-
-if (testForm.firstChild.value != 's') Element.Properties.value = {
-
-	set: function(value){
-		var tag = this.get('tag');
-		if (tag != 'select') return this.setProperty('value', value);
-		var options = this.getElements('option');
-		value = String(value);
-		for (var i = 0; i < options.length; i++){
-			var option = options[i],
-				attr = option.getAttributeNode('value'),
-				optionValue = (attr && attr.specified) ? option.value : option.get('text');
-			if (optionValue === value) return option.selected = true;
-		}
-	},
-
-	get: function(){
-		var option = this, tag = option.get('tag');
-
-		if (tag != 'select' && tag != 'option') return this.getProperty('value');
-
-		if (tag == 'select' && !(option = option.getSelected()[0])) return '';
-
-		var attr = option.getAttributeNode('value');
-		return (attr && attr.specified) ? option.value : option.get('text');
-	}
-
-};
-testForm = null;
-/*</ltIE9>*/
-
-/*<IE>*/
-if (document.createElement('div').getAttributeNode('id')) Element.Properties.id = {
-	set: function(id){
-		this.id = this.getAttributeNode('id').value = id;
-	},
-	get: function(){
-		return this.id || null;
-	},
-	erase: function(){
-		this.id = this.getAttributeNode('id').value = '';
-	}
-};
-/*</IE>*/
-
-})();
-
-/*
----
-
-name: Event
-
-description: Contains the Event Type, to make the event object cross-browser.
-
-license: MIT-style license.
-
-requires: [Window, Document, Array, Function, String, Object]
-
-provides: Event
-
-...
-*/
-
-(function(){
-
-var _keys = {};
-var normalizeWheelSpeed = function(event){
-	var normalized;
-	if (event.wheelDelta){
-		normalized = event.wheelDelta % 120 == 0 ? event.wheelDelta / 120 : event.wheelDelta / 12;
-	} else {
-		var rawAmount = event.deltaY || event.detail || 0;
-		normalized = -(rawAmount % 3 == 0 ? rawAmount / 3 : rawAmount * 10);
-	}
-	return normalized;
-};
-
-var DOMEvent = this.DOMEvent = new Type('DOMEvent', function(event, win){
-	if (!win) win = window;
-	event = event || win.event;
-	if (event.$extended) return event;
-	this.event = event;
-	this.$extended = true;
-	this.shift = event.shiftKey;
-	this.control = event.ctrlKey;
-	this.alt = event.altKey;
-	this.meta = event.metaKey;
-	var type = this.type = event.type;
-	var target = event.target || event.srcElement;
-	while (target && target.nodeType == 3) target = target.parentNode;
-	this.target = document.id(target);
-
-	if (type.indexOf('key') == 0){
-		var code = this.code = (event.which || event.keyCode);
-		if (!this.shift || type != 'keypress') this.key = _keys[code];
-		if (type == 'keydown' || type == 'keyup'){
-			if (code > 111 && code < 124) this.key = 'f' + (code - 111);
-			else if (code > 95 && code < 106) this.key = code - 96;
-		}
-		if (this.key == null) this.key = String.fromCharCode(code).toLowerCase();
-	} else if (type == 'click' || type == 'dblclick' || type == 'contextmenu' || type == 'wheel' || type == 'DOMMouseScroll' || type.indexOf('mouse') == 0){
-		var doc = win.document;
-		doc = (!doc.compatMode || doc.compatMode == 'CSS1Compat') ? doc.html : doc.body;
-		this.page = {
-			x: (event.pageX != null) ? event.pageX : event.clientX + doc.scrollLeft,
-			y: (event.pageY != null) ? event.pageY : event.clientY + doc.scrollTop
-		};
-		this.client = {
-			x: (event.pageX != null) ? event.pageX - win.pageXOffset : event.clientX,
-			y: (event.pageY != null) ? event.pageY - win.pageYOffset : event.clientY
-		};
-		if (type == 'DOMMouseScroll' || type == 'wheel' || type == 'mousewheel') this.wheel = normalizeWheelSpeed(event);
-		this.rightClick = (event.which == 3 || event.button == 2);
-		if (type == 'mouseover' || type == 'mouseout' || type == 'mouseenter' || type == 'mouseleave'){
-			var overTarget = type == 'mouseover' || type == 'mouseenter';
-			var related = event.relatedTarget || event[(overTarget ? 'from' : 'to') + 'Element'];
-			while (related && related.nodeType == 3) related = related.parentNode;
-			this.relatedTarget = document.id(related);
-		}
-	} else if (type.indexOf('touch') == 0 || type.indexOf('gesture') == 0){
-		this.rotation = event.rotation;
-		this.scale = event.scale;
-		this.targetTouches = event.targetTouches;
-		this.changedTouches = event.changedTouches;
-		var touches = this.touches = event.touches;
-		if (touches && touches[0]){
-			var touch = touches[0];
-			this.page = {x: touch.pageX, y: touch.pageY};
-			this.client = {x: touch.clientX, y: touch.clientY};
-		}
-	}
-
-	if (!this.client) this.client = {};
-	if (!this.page) this.page = {};
-});
-
-DOMEvent.implement({
-
-	stop: function(){
-		return this.preventDefault().stopPropagation();
-	},
-
-	stopPropagation: function(){
-		if (this.event.stopPropagation) this.event.stopPropagation();
-		else this.event.cancelBubble = true;
-		return this;
-	},
-
-	preventDefault: function(){
-		if (this.event.preventDefault) this.event.preventDefault();
-		else this.event.returnValue = false;
-		return this;
-	}
-
-});
-
-DOMEvent.defineKey = function(code, key){
-	_keys[code] = key;
-	return this;
-};
-
-DOMEvent.defineKeys = DOMEvent.defineKey.overloadSetter(true);
-
-DOMEvent.defineKeys({
-	'38': 'up', '40': 'down', '37': 'left', '39': 'right',
-	'27': 'esc', '32': 'space', '8': 'backspace', '9': 'tab',
-	'46': 'delete', '13': 'enter'
-});
-
-})();
-
-
-
-
-
-/*
----
-
-name: Element.Event
-
-description: Contains Element methods for dealing with events. This file also includes mouseenter and mouseleave custom Element Events, if necessary.
-
-license: MIT-style license.
-
-requires: [Element, Event]
-
-provides: Element.Event
-
-...
-*/
-
-(function(){
-
-Element.Properties.events = {set: function(events){
-	this.addEvents(events);
-}};
-
-[Element, Window, Document].invoke('implement', {
-
-	addEvent: function(type, fn){
-		var events = this.retrieve('events', {});
-		if (!events[type]) events[type] = {keys: [], values: []};
-		if (events[type].keys.contains(fn)) return this;
-		events[type].keys.push(fn);
-		var realType = type,
-			custom = Element.Events[type],
-			condition = fn,
-			self = this;
-		if (custom){
-			if (custom.onAdd) custom.onAdd.call(this, fn, type);
-			if (custom.condition){
-				condition = function(event){
-					if (custom.condition.call(this, event, type)) return fn.call(this, event);
-					return true;
-				};
-			}
-			if (custom.base) realType = Function.convert(custom.base).call(this, type);
-		}
-		var defn = function(){
-			return fn.call(self);
-		};
-		var nativeEvent = Element.NativeEvents[realType];
-		if (nativeEvent){
-			if (nativeEvent == 2){
-				defn = function(event){
-					event = new DOMEvent(event, self.getWindow());
-					if (condition.call(self, event) === false) event.stop();
-				};
-			}
-			this.addListener(realType, defn, arguments[2]);
-		}
-		events[type].values.push(defn);
-		return this;
-	},
-
-	removeEvent: function(type, fn){
-		var events = this.retrieve('events');
-		if (!events || !events[type]) return this;
-		var list = events[type];
-		var index = list.keys.indexOf(fn);
-		if (index == -1) return this;
-		var value = list.values[index];
-		delete list.keys[index];
-		delete list.values[index];
-		var custom = Element.Events[type];
-		if (custom){
-			if (custom.onRemove) custom.onRemove.call(this, fn, type);
-			if (custom.base) type = Function.convert(custom.base).call(this, type);
-		}
-		return (Element.NativeEvents[type]) ? this.removeListener(type, value, arguments[2]) : this;
-	},
-
-	addEvents: function(events){
-		for (var event in events) this.addEvent(event, events[event]);
-		return this;
-	},
-
-	removeEvents: function(events){
-		var type;
-		if (typeOf(events) == 'object'){
-			for (type in events) this.removeEvent(type, events[type]);
-			return this;
-		}
-		var attached = this.retrieve('events');
-		if (!attached) return this;
-		if (!events){
-			for (type in attached) this.removeEvents(type);
-			this.eliminate('events');
-		} else if (attached[events]){
-			attached[events].keys.each(function(fn){
-				this.removeEvent(events, fn);
-			}, this);
-			delete attached[events];
-		}
-		return this;
-	},
-
-	fireEvent: function(type, args, delay){
-		var events = this.retrieve('events');
-		if (!events || !events[type]) return this;
-		args = Array.convert(args);
-
-		events[type].keys.each(function(fn){
-			if (delay) fn.delay(delay, this, args);
-			else fn.apply(this, args);
-		}, this);
-		return this;
-	},
-
-	cloneEvents: function(from, type){
-		from = document.id(from);
-		var events = from.retrieve('events');
-		if (!events) return this;
-		if (!type){
-			for (var eventType in events) this.cloneEvents(from, eventType);
-		} else if (events[type]){
-			events[type].keys.each(function(fn){
-				this.addEvent(type, fn);
-			}, this);
-		}
-		return this;
-	}
-
-});
-
-Element.NativeEvents = {
-	click: 2, dblclick: 2, mouseup: 2, mousedown: 2, contextmenu: 2, //mouse buttons
-	wheel: 2, mousewheel: 2, DOMMouseScroll: 2, //mouse wheel
-	mouseover: 2, mouseout: 2, mousemove: 2, selectstart: 2, selectend: 2, //mouse movement
-	keydown: 2, keypress: 2, keyup: 2, //keyboard
-	orientationchange: 2, // mobile
-	touchstart: 2, touchmove: 2, touchend: 2, touchcancel: 2, // touch
-	gesturestart: 2, gesturechange: 2, gestureend: 2, // gesture
-	focus: 2, blur: 2, change: 2, reset: 2, select: 2, submit: 2, paste: 2, input: 2, //form elements
-	load: 2, unload: 1, beforeunload: 2, resize: 1, move: 1, DOMContentLoaded: 1, readystatechange: 1, //window
-	hashchange: 1, popstate: 2, pageshow: 2, pagehide: 2, // history
-	error: 1, abort: 1, scroll: 1, message: 2 //misc
-};
-
-Element.Events = {
-	mousewheel: {
-		base: 'onwheel' in document ? 'wheel' : 'onmousewheel' in document ? 'mousewheel' : 'DOMMouseScroll'
-	}
-};
-
-var check = function(event){
-	var related = event.relatedTarget;
-	if (related == null) return true;
-	if (!related) return false;
-	return (related != this && related.prefix != 'xul' && typeOf(this) != 'document' && !this.contains(related));
-};
-
-if ('onmouseenter' in document.documentElement){
-	Element.NativeEvents.mouseenter = Element.NativeEvents.mouseleave = 2;
-	Element.MouseenterCheck = check;
-} else {
-	Element.Events.mouseenter = {
-		base: 'mouseover',
-		condition: check
-	};
-
-	Element.Events.mouseleave = {
-		base: 'mouseout',
-		condition: check
-	};
-}
-
-/*<ltIE9>*/
-if (!window.addEventListener){
-	Element.NativeEvents.propertychange = 2;
-	Element.Events.change = {
-		base: function(){
-			var type = this.type;
-			return (this.get('tag') == 'input' && (type == 'radio' || type == 'checkbox')) ? 'propertychange' : 'change';
-		},
-		condition: function(event){
-			return event.type != 'propertychange' || event.event.propertyName == 'checked';
-		}
-	};
-}
-/*</ltIE9>*/
-
-
-
-})();
-
-/*
----
-
-name: Element.Delegation
-
-description: Extends the Element native object to include the delegate method for more efficient event management.
-
-license: MIT-style license.
-
-requires: [Element.Event]
-
-provides: [Element.Delegation]
-
-...
-*/
-
-(function(){
-
-var eventListenerSupport = !!window.addEventListener;
-
-Element.NativeEvents.focusin = Element.NativeEvents.focusout = 2;
-
-var bubbleUp = function(self, match, fn, event, target){
-	while (target && target != self){
-		if (match(target, event)) return fn.call(target, event, target);
-		target = document.id(target.parentNode);
-	}
-};
-
-var map = {
-	mouseenter: {
-		base: 'mouseover',
-		condition: Element.MouseenterCheck
-	},
-	mouseleave: {
-		base: 'mouseout',
-		condition: Element.MouseenterCheck
-	},
-	focus: {
-		base: 'focus' + (eventListenerSupport ? '' : 'in'),
-		capture: true
-	},
-	blur: {
-		base: eventListenerSupport ? 'blur' : 'focusout',
-		capture: true
-	}
-};
-
-/*<ltIE9>*/
-var _key = '$delegation:';
-var formObserver = function(type){
-
-	return {
-
-		base: 'focusin',
-
-		remove: function(self, uid){
-			var list = self.retrieve(_key + type + 'listeners', {})[uid];
-			if (list && list.forms) for (var i = list.forms.length; i--;){
-				// the form may have been destroyed, so it won't have the
-				// removeEvent method anymore. In that case the event was
-				// removed as well.
-				if (list.forms[i].removeEvent) list.forms[i].removeEvent(type, list.fns[i]);
-			}
-		},
-
-		listen: function(self, match, fn, event, target, uid){
-			var form = (target.get('tag') == 'form') ? target : event.target.getParent('form');
-			if (!form) return;
-
-			var listeners = self.retrieve(_key + type + 'listeners', {}),
-				listener = listeners[uid] || {forms: [], fns: []},
-				forms = listener.forms, fns = listener.fns;
-
-			if (forms.indexOf(form) != -1) return;
-			forms.push(form);
-
-			var _fn = function(event){
-				bubbleUp(self, match, fn, event, target);
-			};
-			form.addEvent(type, _fn);
-			fns.push(_fn);
-
-			listeners[uid] = listener;
-			self.store(_key + type + 'listeners', listeners);
-		}
-	};
-};
-
-var inputObserver = function(type){
-	return {
-		base: 'focusin',
-		listen: function(self, match, fn, event, target){
-			var events = {blur: function(){
-				this.removeEvents(events);
-			}};
-			events[type] = function(event){
-				bubbleUp(self, match, fn, event, target);
-			};
-			event.target.addEvents(events);
-		}
-	};
-};
-
-if (!eventListenerSupport) Object.append(map, {
-	submit: formObserver('submit'),
-	reset: formObserver('reset'),
-	change: inputObserver('change'),
-	select: inputObserver('select')
-});
-/*</ltIE9>*/
-
-var proto = Element.prototype,
-	addEvent = proto.addEvent,
-	removeEvent = proto.removeEvent;
-
-var relay = function(old, method){
-	return function(type, fn, useCapture){
-		if (type.indexOf(':relay') == -1) return old.call(this, type, fn, useCapture);
-		var parsed = Slick.parse(type).expressions[0][0];
-		if (parsed.pseudos[0].key != 'relay') return old.call(this, type, fn, useCapture);
-		var newType = parsed.tag;
-		parsed.pseudos.slice(1).each(function(pseudo){
-			newType += ':' + pseudo.key + (pseudo.value ? '(' + pseudo.value + ')' : '');
-		});
-		old.call(this, type, fn);
-		return method.call(this, newType, parsed.pseudos[0].value, fn);
-	};
-};
-
-var delegation = {
-
-	addEvent: function(type, match, fn){
-		var storage = this.retrieve('$delegates', {}), stored = storage[type];
-		if (stored) for (var _uid in stored){
-			if (stored[_uid].fn == fn && stored[_uid].match == match) return this;
-		}
-
-		var _type = type, _match = match, _fn = fn, _map = map[type] || {};
-		type = _map.base || _type;
-
-		match = function(target){
-			return Slick.match(target, _match);
-		};
-
-		var elementEvent = Element.Events[_type];
-		if (_map.condition || elementEvent && elementEvent.condition){
-			var __match = match, condition = _map.condition || elementEvent.condition;
-			match = function(target, event){
-				return __match(target, event) && condition.call(target, event, type);
-			};
-		}
-
-		var self = this, uid = String.uniqueID();
-		var delegator = _map.listen ? function(event, target){
-			if (!target && event && event.target) target = event.target;
-			if (target) _map.listen(self, match, fn, event, target, uid);
-		} : function(event, target){
-			if (!target && event && event.target) target = event.target;
-			if (target) bubbleUp(self, match, fn, event, target);
-		};
-
-		if (!stored) stored = {};
-		stored[uid] = {
-			match: _match,
-			fn: _fn,
-			delegator: delegator
-		};
-		storage[_type] = stored;
-		return addEvent.call(this, type, delegator, _map.capture);
-	},
-
-	removeEvent: function(type, match, fn, _uid){
-		var storage = this.retrieve('$delegates', {}), stored = storage[type];
-		if (!stored) return this;
-
-		if (_uid){
-			var _type = type, delegator = stored[_uid].delegator, _map = map[type] || {};
-			type = _map.base || _type;
-			if (_map.remove) _map.remove(this, _uid);
-			delete stored[_uid];
-			storage[_type] = stored;
-			return removeEvent.call(this, type, delegator, _map.capture);
-		}
-
-		var __uid, s;
-		if (fn) for (__uid in stored){
-			s = stored[__uid];
-			if (s.match == match && s.fn == fn) return delegation.removeEvent.call(this, type, match, fn, __uid);
-		} else for (__uid in stored){
-			s = stored[__uid];
-			if (s.match == match) delegation.removeEvent.call(this, type, match, s.fn, __uid);
-		}
-		return this;
-	}
-
-};
-
-[Element, Window, Document].invoke('implement', {
-	addEvent: relay(addEvent, delegation.addEvent),
-	removeEvent: relay(removeEvent, delegation.removeEvent)
-});
-
-})();
-
-/*
----
-
-name: Element.Style
-
-description: Contains methods for interacting with the styles of Elements in a fashionable way.
-
-license: MIT-style license.
-
-requires: Element
-
-provides: Element.Style
-
-...
-*/
-
-(function(){
-
-var html = document.html, el;
-
-//<ltIE9>
-// Check for oldIE, which does not remove styles when they're set to null
-el = document.createElement('div');
-el.style.color = 'red';
-el.style.color = null;
-var doesNotRemoveStyles = el.style.color == 'red';
-
-// check for oldIE, which returns border* shorthand styles in the wrong order (color-width-style instead of width-style-color)
-var border = '1px solid #123abc';
-el.style.border = border;
-var returnsBordersInWrongOrder = el.style.border != border;
-el = null;
-//</ltIE9>
-
-var hasGetComputedStyle = !!window.getComputedStyle,
-	supportBorderRadius = document.createElement('div').style.borderRadius != null;
-
-Element.Properties.styles = {set: function(styles){
-	this.setStyles(styles);
-}};
-
-var hasOpacity = (html.style.opacity != null),
-	hasFilter = (html.style.filter != null),
-	reAlpha = /alpha\(opacity=([\d.]+)\)/i;
-
-var setVisibility = function(element, opacity){
-	element.store('$opacity', opacity);
-	element.style.visibility = opacity > 0 || opacity == null ? 'visible' : 'hidden';
-};
-
-//<ltIE9>
-var setFilter = function(element, regexp, value){
-	var style = element.style,
-		filter = style.filter || element.getComputedStyle('filter') || '';
-	style.filter = (regexp.test(filter) ? filter.replace(regexp, value) : filter + ' ' + value).trim();
-	if (!style.filter) style.removeAttribute('filter');
-};
-//</ltIE9>
-
-var setOpacity = (hasOpacity ? function(element, opacity){
-	element.style.opacity = opacity;
-} : (hasFilter ? function(element, opacity){
-	if (!element.currentStyle || !element.currentStyle.hasLayout) element.style.zoom = 1;
-	if (opacity == null || opacity == 1){
-		setFilter(element, reAlpha, '');
-		if (opacity == 1 && getOpacity(element) != 1) setFilter(element, reAlpha, 'alpha(opacity=100)');
-	} else {
-		setFilter(element, reAlpha, 'alpha(opacity=' + (opacity * 100).limit(0, 100).round() + ')');
-	}
-} : setVisibility));
-
-var getOpacity = (hasOpacity ? function(element){
-	var opacity = element.style.opacity || element.getComputedStyle('opacity');
-	return (opacity == '') ? 1 : opacity.toFloat();
-} : (hasFilter ? function(element){
-	var filter = (element.style.filter || element.getComputedStyle('filter')),
-		opacity;
-	if (filter) opacity = filter.match(reAlpha);
-	return (opacity == null || filter == null) ? 1 : (opacity[1] / 100);
-} : function(element){
-	var opacity = element.retrieve('$opacity');
-	if (opacity == null) opacity = (element.style.visibility == 'hidden' ? 0 : 1);
-	return opacity;
-}));
-
-var floatName = (html.style.cssFloat == null) ? 'styleFloat' : 'cssFloat',
-	namedPositions = {left: '0%', top: '0%', center: '50%', right: '100%', bottom: '100%'},
-	hasBackgroundPositionXY = (html.style.backgroundPositionX != null),
-	prefixPattern = /^-(ms)-/;
-
-var camelCase = function(property){
-	return property.replace(prefixPattern, '$1-').camelCase();
-};
-
-//<ltIE9>
-var removeStyle = function(style, property){
-	if (property == 'backgroundPosition'){
-		style.removeAttribute(property + 'X');
-		property += 'Y';
-	}
-	style.removeAttribute(property);
-};
-//</ltIE9>
-
-Element.implement({
-
-	getComputedStyle: function(property){
-		if (!hasGetComputedStyle && this.currentStyle) return this.currentStyle[camelCase(property)];
-		var defaultView = Element.getDocument(this).defaultView,
-			computed = defaultView ? defaultView.getComputedStyle(this, null) : null;
-		return (computed) ? computed.getPropertyValue((property == floatName) ? 'float' : property.hyphenate()) : '';
-	},
-
-	setStyle: function(property, value){
-		if (property == 'opacity'){
-			if (value != null) value = parseFloat(value);
-			setOpacity(this, value);
-			return this;
-		}
-		property = camelCase(property == 'float' ? floatName : property);
-		if (typeOf(value) != 'string'){
-			var map = (Element.Styles[property] || '@').split(' ');
-			value = Array.convert(value).map(function(val, i){
-				if (!map[i]) return '';
-				return (typeOf(val) == 'number') ? map[i].replace('@', Math.round(val)) : val;
-			}).join(' ');
-		} else if (value == String(Number(value))){
-			value = Math.round(value);
-		}
-		this.style[property] = value;
-		//<ltIE9>
-		if ((value == '' || value == null) && doesNotRemoveStyles && this.style.removeAttribute){
-			removeStyle(this.style, property);
-		}
-		//</ltIE9>
-		return this;
-	},
-
-	getStyle: function(property){
-		if (property == 'opacity') return getOpacity(this);
-		property = camelCase(property == 'float' ? floatName : property);
-		if (supportBorderRadius && property.indexOf('borderRadius') != -1){
-			return ['borderTopLeftRadius', 'borderTopRightRadius', 'borderBottomRightRadius', 'borderBottomLeftRadius'].map(function(corner){
-				return this.style[corner] || '0px';
-			}, this).join(' ');
-		}
-		var result = this.style[property];
-		if (!result || property == 'zIndex'){
-			if (Element.ShortStyles.hasOwnProperty(property)){
-				result = [];
-				for (var s in Element.ShortStyles[property]) result.push(this.getStyle(s));
-				return result.join(' ');
-			}
-			result = this.getComputedStyle(property);
-		}
-		if (hasBackgroundPositionXY && /^backgroundPosition[XY]?$/.test(property)){
-			return result.replace(/(top|right|bottom|left)/g, function(position){
-				return namedPositions[position];
-			}) || '0px';
-		}
-		if (!result && property == 'backgroundPosition') return '0px 0px';
-		if (result){
-			result = String(result);
-			var color = result.match(/rgba?\([\d\s,]+\)/);
-			if (color) result = result.replace(color[0], color[0].rgbToHex());
-		}
-		if (!hasGetComputedStyle && !this.style[property]){
-			if ((/^(height|width)$/).test(property) && !(/px$/.test(result))){
-				var values = (property == 'width') ? ['left', 'right'] : ['top', 'bottom'], size = 0;
-				values.each(function(value){
-					size += this.getStyle('border-' + value + '-width').toInt() + this.getStyle('padding-' + value).toInt();
-				}, this);
-				return this['offset' + property.capitalize()] - size + 'px';
-			}
-			if ((/^border(.+)Width|margin|padding/).test(property) && isNaN(parseFloat(result))){
-				return '0px';
-			}
-		}
-		//<ltIE9>
-		if (returnsBordersInWrongOrder && /^border(Top|Right|Bottom|Left)?$/.test(property) && /^#/.test(result)){
-			return result.replace(/^(.+)\s(.+)\s(.+)$/, '$2 $3 $1');
-		}
-		//</ltIE9>
-
-		return result;
-	},
-
-	setStyles: function(styles){
-		for (var style in styles) this.setStyle(style, styles[style]);
-		return this;
-	},
-
-	getStyles: function(){
-		var result = {};
-		Array.flatten(arguments).each(function(key){
-			result[key] = this.getStyle(key);
-		}, this);
-		return result;
-	}
-
-});
-
-Element.Styles = {
-	left: '@px', top: '@px', bottom: '@px', right: '@px',
-	width: '@px', height: '@px', maxWidth: '@px', maxHeight: '@px', minWidth: '@px', minHeight: '@px',
-	backgroundColor: 'rgb(@, @, @)', backgroundSize: '@px', backgroundPosition: '@px @px', color: 'rgb(@, @, @)',
-	fontSize: '@px', letterSpacing: '@px', lineHeight: '@px', clip: 'rect(@px @px @px @px)',
-	margin: '@px @px @px @px', padding: '@px @px @px @px', border: '@px @ rgb(@, @, @) @px @ rgb(@, @, @) @px @ rgb(@, @, @)',
-	borderWidth: '@px @px @px @px', borderStyle: '@ @ @ @', borderColor: 'rgb(@, @, @) rgb(@, @, @) rgb(@, @, @) rgb(@, @, @)',
-	zIndex: '@', 'zoom': '@', fontWeight: '@', textIndent: '@px', opacity: '@', borderRadius: '@px @px @px @px'
-};
-
-
-
-
-
-Element.ShortStyles = {margin: {}, padding: {}, border: {}, borderWidth: {}, borderStyle: {}, borderColor: {}};
-
-['Top', 'Right', 'Bottom', 'Left'].each(function(direction){
-	var Short = Element.ShortStyles;
-	var All = Element.Styles;
-	['margin', 'padding'].each(function(style){
-		var sd = style + direction;
-		Short[style][sd] = All[sd] = '@px';
-	});
-	var bd = 'border' + direction;
-	Short.border[bd] = All[bd] = '@px @ rgb(@, @, @)';
-	var bdw = bd + 'Width', bds = bd + 'Style', bdc = bd + 'Color';
-	Short[bd] = {};
-	Short.borderWidth[bdw] = Short[bd][bdw] = All[bdw] = '@px';
-	Short.borderStyle[bds] = Short[bd][bds] = All[bds] = '@';
-	Short.borderColor[bdc] = Short[bd][bdc] = All[bdc] = 'rgb(@, @, @)';
-});
-
-if (hasBackgroundPositionXY) Element.ShortStyles.backgroundPosition = {backgroundPositionX: '@', backgroundPositionY: '@'};
-})();
-
-/*
----
-
-name: Element.Dimensions
-
-description: Contains methods to work with size, scroll, or positioning of Elements and the window object.
-
-license: MIT-style license.
-
-credits:
-  - Element positioning based on the [qooxdoo](http://qooxdoo.org/) code and smart browser fixes, [LGPL License](http://www.gnu.org/licenses/lgpl.html).
-  - Viewport dimensions based on [YUI](http://developer.yahoo.com/yui/) code, [BSD License](http://developer.yahoo.com/yui/license.html).
-
-requires: [Element, Element.Style]
-
-provides: [Element.Dimensions]
-
-...
-*/
-
-(function(){
-
-var element = document.createElement('div'),
-	child = document.createElement('div');
-element.style.height = '0';
-element.appendChild(child);
-var brokenOffsetParent = (child.offsetParent === element);
-element = child = null;
-
-var heightComponents = ['height', 'paddingTop', 'paddingBottom', 'borderTopWidth', 'borderBottomWidth'],
-	widthComponents = ['width', 'paddingLeft', 'paddingRight', 'borderLeftWidth', 'borderRightWidth'];
-
-var svgCalculateSize = function(el){
-
-	var gCS = window.getComputedStyle(el),
-		bounds = {x: 0, y: 0};
-
-	heightComponents.each(function(css){
-		bounds.y += parseFloat(gCS[css]);
-	});
-	widthComponents.each(function(css){
-		bounds.x += parseFloat(gCS[css]);
-	});
-	return bounds;
-};
-
-var isOffset = function(el){
-	return styleString(el, 'position') != 'static' || isBody(el);
-};
-
-var isOffsetStatic = function(el){
-	return isOffset(el) || (/^(?:table|td|th)$/i).test(el.tagName);
-};
-
-Element.implement({
-
-	scrollTo: function(x, y){
-		if (isBody(this)){
-			this.getWindow().scrollTo(x, y);
-		} else {
-			this.scrollLeft = x;
-			this.scrollTop = y;
-		}
-		return this;
-	},
-
-	getSize: function(){
-		if (isBody(this)) return this.getWindow().getSize();
-
-		//<ltIE9>
-		// This if clause is because IE8- cannot calculate getBoundingClientRect of elements with visibility hidden.
-		if (!window.getComputedStyle) return {x: this.offsetWidth, y: this.offsetHeight};
-		//</ltIE9>
-
-		// This svg section under, calling `svgCalculateSize()`, can be removed when FF fixed the svg size bug.
-		// Bug info: https://bugzilla.mozilla.org/show_bug.cgi?id=530985
-		if (this.get('tag') == 'svg') return svgCalculateSize(this);
-
-		try {
-			var bounds = this.getBoundingClientRect();
-			return {x: bounds.width, y: bounds.height};
-		} catch (e){
-			return {x: 0, y: 0};
-		}
-	},
-
-	getScrollSize: function(){
-		if (isBody(this)) return this.getWindow().getScrollSize();
-		return {x: this.scrollWidth, y: this.scrollHeight};
-	},
-
-	getScroll: function(){
-		if (isBody(this)) return this.getWindow().getScroll();
-		return {x: this.scrollLeft, y: this.scrollTop};
-	},
-
-	getScrolls: function(){
-		var element = this.parentNode, position = {x: 0, y: 0};
-		while (element && !isBody(element)){
-			position.x += element.scrollLeft;
-			position.y += element.scrollTop;
-			element = element.parentNode;
-		}
-		return position;
-	},
-
-	getOffsetParent: brokenOffsetParent ? function(){
-		var element = this;
-		if (isBody(element) || styleString(element, 'position') == 'fixed') return null;
-
-		var isOffsetCheck = (styleString(element, 'position') == 'static') ? isOffsetStatic : isOffset;
-		while ((element = element.parentNode)){
-			if (isOffsetCheck(element)) return element;
-		}
-		return null;
-	} : function(){
-		var element = this;
-		if (isBody(element) || styleString(element, 'position') == 'fixed') return null;
-
-		try {
-			return element.offsetParent;
-		} catch (e){}
-		return null;
-	},
-
-	getOffsets: function(){
-		var hasGetBoundingClientRect = this.getBoundingClientRect;
-
-		if (hasGetBoundingClientRect){
-			var bound = this.getBoundingClientRect(),
-				html = document.id(this.getDocument().documentElement),
-				htmlScroll = html.getScroll(),
-				elemScrolls = this.getScrolls(),
-				isFixed = (styleString(this, 'position') == 'fixed');
-
-			return {
-				x: bound.left.toFloat() + elemScrolls.x + ((isFixed) ? 0 : htmlScroll.x) - html.clientLeft,
-				y: bound.top.toFloat() + elemScrolls.y + ((isFixed) ? 0 : htmlScroll.y) - html.clientTop
-			};
-		}
-
-		var element = this, position = {x: 0, y: 0};
-		if (isBody(this)) return position;
-
-		while (element && !isBody(element)){
-			position.x += element.offsetLeft;
-			position.y += element.offsetTop;
-
-			element = element.offsetParent;
-		}
-
-		return position;
-	},
-
-	getPosition: function(relative){
-		var offset = this.getOffsets(),
-			scroll = this.getScrolls();
-		var position = {
-			x: offset.x - scroll.x,
-			y: offset.y - scroll.y
-		};
-
-		if (relative && (relative = document.id(relative))){
-			var relativePosition = relative.getPosition();
-			return {x: position.x - relativePosition.x - leftBorder(relative), y: position.y - relativePosition.y - topBorder(relative)};
-		}
-		return position;
-	},
-
-	getCoordinates: function(element){
-		if (isBody(this)) return this.getWindow().getCoordinates();
-		var position = this.getPosition(element),
-			size = this.getSize();
-		var obj = {
-			left: position.x,
-			top: position.y,
-			width: size.x,
-			height: size.y
-		};
-		obj.right = obj.left + obj.width;
-		obj.bottom = obj.top + obj.height;
-		return obj;
-	},
-
-	computePosition: function(obj){
-		return {
-			left: obj.x - styleNumber(this, 'margin-left'),
-			top: obj.y - styleNumber(this, 'margin-top')
-		};
-	},
-
-	setPosition: function(obj){
-		return this.setStyles(this.computePosition(obj));
-	}
-
-});
-
-
-[Document, Window].invoke('implement', {
-
-	getSize: function(){
-		var doc = getCompatElement(this);
-		return {x: doc.clientWidth, y: doc.clientHeight};
-	},
-
-	getScroll: function(){
-		var win = this.getWindow(), doc = getCompatElement(this);
-		return {x: win.pageXOffset || doc.scrollLeft, y: win.pageYOffset || doc.scrollTop};
-	},
-
-	getScrollSize: function(){
-		var doc = getCompatElement(this),
-			min = this.getSize(),
-			body = this.getDocument().body;
-
-		return {x: Math.max(doc.scrollWidth, body.scrollWidth, min.x), y: Math.max(doc.scrollHeight, body.scrollHeight, min.y)};
-	},
-
-	getPosition: function(){
-		return {x: 0, y: 0};
-	},
-
-	getCoordinates: function(){
-		var size = this.getSize();
-		return {top: 0, left: 0, bottom: size.y, right: size.x, height: size.y, width: size.x};
-	}
-
-});
-
-// private methods
-
-var styleString = Element.getComputedStyle;
-
-function styleNumber(element, style){
-	return styleString(element, style).toInt() || 0;
-}
-
-
-
-function topBorder(element){
-	return styleNumber(element, 'border-top-width');
-}
-
-function leftBorder(element){
-	return styleNumber(element, 'border-left-width');
-}
-
-function isBody(element){
-	return (/^(?:body|html)$/i).test(element.tagName);
-}
-
-function getCompatElement(element){
-	var doc = element.getDocument();
-	return (!doc.compatMode || doc.compatMode == 'CSS1Compat') ? doc.html : doc.body;
-}
-
-})();
-
-//aliases
-Element.alias({position: 'setPosition'}); //compatability
-
-[Window, Document, Element].invoke('implement', {
-
-	getHeight: function(){
-		return this.getSize().y;
-	},
-
-	getWidth: function(){
-		return this.getSize().x;
-	},
-
-	getScrollTop: function(){
-		return this.getScroll().y;
-	},
-
-	getScrollLeft: function(){
-		return this.getScroll().x;
-	},
-
-	getScrollHeight: function(){
-		return this.getScrollSize().y;
-	},
-
-	getScrollWidth: function(){
-		return this.getScrollSize().x;
-	},
-
-	getTop: function(){
-		return this.getPosition().y;
-	},
-
-	getLeft: function(){
-		return this.getPosition().x;
-	}
-
-});
-
-/*
----
-
-name: Fx
-
-description: Contains the basic animation logic to be extended by all other Fx Classes.
-
-license: MIT-style license.
-
-requires: [Chain, Events, Options, Class.Thenable]
-
-provides: Fx
-
-...
-*/
-
-(function(){
-
-var Fx = this.Fx = new Class({
-
-	Implements: [Chain, Events, Options, Class.Thenable],
-
-	options: {
-		/*
-		onStart: nil,
-		onCancel: nil,
-		onComplete: nil,
-		*/
-		fps: 60,
-		unit: false,
-		duration: 500,
-		frames: null,
-		frameSkip: true,
-		link: 'ignore'
-	},
-
-	initialize: function(options){
-		this.subject = this.subject || this;
-		this.setOptions(options);
-	},
-
-	getTransition: function(){
-		return function(p){
-			return -(Math.cos(Math.PI * p) - 1) / 2;
-		};
-	},
-
-	step: function(now){
-		if (this.options.frameSkip){
-			var diff = (this.time != null) ? (now - this.time) : 0, frames = diff / this.frameInterval;
-			this.time = now;
-			this.frame += frames;
-		} else {
-			this.frame++;
-		}
-
-		if (this.frame < this.frames){
-			var delta = this.transition(this.frame / this.frames);
-			this.set(this.compute(this.from, this.to, delta));
-		} else {
-			this.frame = this.frames;
-			this.set(this.compute(this.from, this.to, 1));
-			this.stop();
-		}
-	},
-
-	set: function(now){
-		return now;
-	},
-
-	compute: function(from, to, delta){
-		return Fx.compute(from, to, delta);
-	},
-
-	check: function(){
-		if (!this.isRunning()) return true;
-		switch (this.options.link){
-			case 'cancel': this.cancel(); return true;
-			case 'chain': this.chain(this.caller.pass(arguments, this)); return false;
-		}
-		return false;
-	},
-
-	start: function(from, to){
-		if (!this.check(from, to)) return this;
-		this.from = from;
-		this.to = to;
-		this.frame = (this.options.frameSkip) ? 0 : -1;
-		this.time = null;
-		this.transition = this.getTransition();
-		var frames = this.options.frames, fps = this.options.fps, duration = this.options.duration;
-		this.duration = Fx.Durations[duration] || duration.toInt();
-		this.frameInterval = 1000 / fps;
-		this.frames = frames || Math.round(this.duration / this.frameInterval);
-		if (this.getThenableState() !== 'pending'){
-			this.resetThenable(this.subject);
-		}
-		this.fireEvent('start', this.subject);
-		pushInstance.call(this, fps);
-		return this;
-	},
-
-	stop: function(){
-		if (this.isRunning()){
-			this.time = null;
-			pullInstance.call(this, this.options.fps);
-			if (this.frames == this.frame){
-				this.fireEvent('complete', this.subject);
-				if (!this.callChain()) this.fireEvent('chainComplete', this.subject);
-			} else {
-				this.fireEvent('stop', this.subject);
-			}
-			this.resolve(this.subject === this ? null : this.subject);
-		}
-		return this;
-	},
-
-	cancel: function(){
-		if (this.isRunning()){
-			this.time = null;
-			pullInstance.call(this, this.options.fps);
-			this.frame = this.frames;
-			this.fireEvent('cancel', this.subject).clearChain();
-			this.reject(this.subject);
-		}
-		return this;
-	},
-
-	pause: function(){
-		if (this.isRunning()){
-			this.time = null;
-			pullInstance.call(this, this.options.fps);
-		}
-		return this;
-	},
-
-	resume: function(){
-		if (this.isPaused()) pushInstance.call(this, this.options.fps);
-		return this;
-	},
-
-	isRunning: function(){
-		var list = instances[this.options.fps];
-		return list && list.contains(this);
-	},
-
-	isPaused: function(){
-		return (this.frame < this.frames) && !this.isRunning();
-	}
-
-});
-
-Fx.compute = function(from, to, delta){
-	return (to - from) * delta + from;
-};
-
-Fx.Durations = {'short': 250, 'normal': 500, 'long': 1000};
-
-// global timers
-
-var instances = {}, timers = {};
-
-var loop = function(){
-	var now = Date.now();
-	for (var i = this.length; i--;){
-		var instance = this[i];
-		if (instance) instance.step(now);
-	}
-};
-
-var pushInstance = function(fps){
-	var list = instances[fps] || (instances[fps] = []);
-	list.push(this);
-	if (!timers[fps]) timers[fps] = loop.periodical(Math.round(1000 / fps), list);
-};
-
-var pullInstance = function(fps){
-	var list = instances[fps];
-	if (list){
-		list.erase(this);
-		if (!list.length && timers[fps]){
-			delete instances[fps];
-			timers[fps] = clearInterval(timers[fps]);
-		}
-	}
-};
-
-})();
-
-/*
----
-
-name: Fx.CSS
-
-description: Contains the CSS animation logic. Used by Fx.Tween, Fx.Morph, Fx.Elements.
-
-license: MIT-style license.
-
-requires: [Fx, Element.Style]
-
-provides: Fx.CSS
-
-...
-*/
-
-Fx.CSS = new Class({
-
-	Extends: Fx,
-
-	//prepares the base from/to object
-
-	prepare: function(element, property, values){
-		values = Array.convert(values);
-		var from = values[0], to = values[1];
-		if (to == null){
-			to = from;
-			from = element.getStyle(property);
-			var unit = this.options.unit;
-			// adapted from: https://github.com/ryanmorr/fx/blob/master/fx.js#L299
-			if (unit && from && typeof from == 'string' && from.slice(-unit.length) != unit && parseFloat(from) != 0){
-				element.setStyle(property, to + unit);
-				var value = element.getComputedStyle(property);
-				// IE and Opera support pixelLeft or pixelWidth
-				if (!(/px$/.test(value))){
-					value = element.style[('pixel-' + property).camelCase()];
-					if (value == null){
-						// adapted from Dean Edwards' http://erik.eae.net/archives/2007/07/27/18.54.15/#comment-102291
-						var left = element.style.left;
-						element.style.left = to + unit;
-						value = element.style.pixelLeft;
-						element.style.left = left;
-					}
-				}
-				from = (to || 1) / (parseFloat(value) || 1) * (parseFloat(from) || 0);
-				element.setStyle(property, from + unit);
-			}
-		}
-		return {from: this.parse(from), to: this.parse(to)};
-	},
-
-	//parses a value into an array
-
-	parse: function(value){
-		value = Function.convert(value)();
-		value = (typeof value == 'string') ? value.split(' ') : Array.convert(value);
-		return value.map(function(val){
-			val = String(val);
-			var found = false;
-			Object.each(Fx.CSS.Parsers, function(parser){
-				if (found) return;
-				var parsed = parser.parse(val);
-				if (parsed || parsed === 0) found = {value: parsed, parser: parser};
-			});
-			found = found || {value: val, parser: Fx.CSS.Parsers.String};
-			return found;
-		});
-	},
-
-	//computes by a from and to prepared objects, using their parsers.
-
-	compute: function(from, to, delta){
-		var computed = [];
-		(Math.min(from.length, to.length)).times(function(i){
-			computed.push({value: from[i].parser.compute(from[i].value, to[i].value, delta), parser: from[i].parser});
-		});
-		computed.$family = Function.convert('fx:css:value');
-		return computed;
-	},
-
-	//serves the value as settable
-
-	serve: function(value, unit){
-		if (typeOf(value) != 'fx:css:value') value = this.parse(value);
-		var returned = [];
-		value.each(function(bit){
-			returned = returned.concat(bit.parser.serve(bit.value, unit));
-		});
-		return returned;
-	},
-
-	//renders the change to an element
-
-	render: function(element, property, value, unit){
-		element.setStyle(property, this.serve(value, unit));
-	},
-
-	//searches inside the page css to find the values for a selector
-
-	search: function(selector){
-		if (Fx.CSS.Cache[selector]) return Fx.CSS.Cache[selector];
-		var to = {}, selectorTest = new RegExp('^' + selector.escapeRegExp() + '$');
-
-		var searchStyles = function(rules){
-			Array.each(rules, function(rule){
-				if (rule.media){
-					searchStyles(rule.rules || rule.cssRules);
-					return;
-				}
-				if (!rule.style) return;
-				var selectorText = (rule.selectorText) ? rule.selectorText.replace(/^\w+/, function(m){
-					return m.toLowerCase();
-				}) : null;
-				if (!selectorText || !selectorTest.test(selectorText)) return;
-				Object.each(Element.Styles, function(value, style){
-					if (!rule.style[style] || Element.ShortStyles[style]) return;
-					value = String(rule.style[style]);
-					to[style] = ((/^rgb/).test(value)) ? value.rgbToHex() : value;
-				});
-			});
-		};
-
-		Array.each(document.styleSheets, function(sheet){
-			var href = sheet.href;
-			if (href && href.indexOf('://') > -1 && href.indexOf(document.domain) == -1) return;
-			var rules = sheet.rules || sheet.cssRules;
-			searchStyles(rules);
-		});
-		return Fx.CSS.Cache[selector] = to;
-	}
-
-});
-
-Fx.CSS.Cache = {};
-
-Fx.CSS.Parsers = {
-
-	Color: {
-		parse: function(value){
-			if (value.match(/^#[0-9a-f]{3,6}$/i)) return value.hexToRgb(true);
-			return ((value = value.match(/(\d+),\s*(\d+),\s*(\d+)/))) ? [value[1], value[2], value[3]] : false;
-		},
-		compute: function(from, to, delta){
-			return from.map(function(value, i){
-				return Math.round(Fx.compute(from[i], to[i], delta));
-			});
-		},
-		serve: function(value){
-			return value.map(Number);
-		}
-	},
-
-	Number: {
-		parse: parseFloat,
-		compute: Fx.compute,
-		serve: function(value, unit){
-			return (unit) ? value + unit : value;
-		}
-	},
-
-	String: {
-		parse: Function.convert(false),
-		compute: function(zero, one){
-			return one;
-		},
-		serve: function(zero){
-			return zero;
-		}
-	}
-
-};
-
-
-
-/*
----
-
-name: Fx.Morph
-
-description: Formerly Fx.Styles, effect to transition any number of CSS properties for an element using an object of rules, or CSS based selector rules.
-
-license: MIT-style license.
-
-requires: Fx.CSS
-
-provides: Fx.Morph
-
-...
-*/
-
-Fx.Morph = new Class({
-
-	Extends: Fx.CSS,
-
-	initialize: function(element, options){
-		this.element = this.subject = document.id(element);
-		this.parent(options);
-	},
-
-	set: function(now){
-		if (typeof now == 'string') now = this.search(now);
-		for (var p in now) this.render(this.element, p, now[p], this.options.unit);
-		return this;
-	},
-
-	compute: function(from, to, delta){
-		var now = {};
-		for (var p in from) now[p] = this.parent(from[p], to[p], delta);
-		return now;
-	},
-
-	start: function(properties){
-		if (!this.check(properties)) return this;
-		if (typeof properties == 'string') properties = this.search(properties);
-		var from = {}, to = {};
-		for (var p in properties){
-			var parsed = this.prepare(this.element, p, properties[p]);
-			from[p] = parsed.from;
-			to[p] = parsed.to;
-		}
-		return this.parent(from, to);
-	}
-
-});
-
-Element.Properties.morph = {
-
-	set: function(options){
-		this.get('morph').cancel().setOptions(options);
-		return this;
-	},
-
-	get: function(){
-		var morph = this.retrieve('morph');
-		if (!morph){
-			morph = new Fx.Morph(this, {link: 'cancel'});
-			this.store('morph', morph);
-		}
-		return morph;
-	}
-
-};
-
-Element.implement({
-
-	morph: function(props){
-		this.get('morph').start(props);
-		return this;
-	}
-
-});
-
-/*
----
-
-name: Fx.Transitions
-
-description: Contains a set of advanced transitions to be used with any of the Fx Classes.
-
-license: MIT-style license.
-
-credits:
-  - Easing Equations by Robert Penner, <http://www.robertpenner.com/easing/>, modified and optimized to be used with MooTools.
-
-requires: Fx
-
-provides: Fx.Transitions
-
-...
-*/
-
-Fx.implement({
-
-	getTransition: function(){
-		var trans = this.options.transition || Fx.Transitions.Sine.easeInOut;
-		if (typeof trans == 'string'){
-			var data = trans.split(':');
-			trans = Fx.Transitions;
-			trans = trans[data[0]] || trans[data[0].capitalize()];
-			if (data[1]) trans = trans['ease' + data[1].capitalize() + (data[2] ? data[2].capitalize() : '')];
-		}
-		return trans;
-	}
-
-});
-
-Fx.Transition = function(transition, params){
-	params = Array.convert(params);
-	var easeIn = function(pos){
-		return transition(pos, params);
-	};
-	return Object.append(easeIn, {
-		easeIn: easeIn,
-		easeOut: function(pos){
-			return 1 - transition(1 - pos, params);
-		},
-		easeInOut: function(pos){
-			return (pos <= 0.5 ? transition(2 * pos, params) : (2 - transition(2 * (1 - pos), params))) / 2;
-		}
-	});
-};
-
-Fx.Transitions = {
-
-	linear: function(zero){
-		return zero;
-	}
-
-};
-
-
-
-Fx.Transitions.extend = function(transitions){
-	for (var transition in transitions) Fx.Transitions[transition] = new Fx.Transition(transitions[transition]);
-};
-
-Fx.Transitions.extend({
-
-	Pow: function(p, x){
-		return Math.pow(p, x && x[0] || 6);
-	},
-
-	Expo: function(p){
-		return Math.pow(2, 8 * (p - 1));
-	},
-
-	Circ: function(p){
-		return 1 - Math.sin(Math.acos(p));
-	},
-
-	Sine: function(p){
-		return 1 - Math.cos(p * Math.PI / 2);
-	},
-
-	Back: function(p, x){
-		x = x && x[0] || 1.618;
-		return Math.pow(p, 2) * ((x + 1) * p - x);
-	},
-
-	Bounce: function(p){
-		var value;
-		for (var a = 0, b = 1; 1; a += b, b /= 2){
-			if (p >= (7 - 4 * a) / 11){
-				value = b * b - Math.pow((11 - 6 * a - 11 * p) / 4, 2);
-				break;
-			}
-		}
-		return value;
-	},
-
-	Elastic: function(p, x){
-		return Math.pow(2, 10 * --p) * Math.cos(20 * p * Math.PI * (x && x[0] || 1) / 3);
-	}
-
-});
-
-['Quad', 'Cubic', 'Quart', 'Quint'].each(function(transition, i){
-	Fx.Transitions[transition] = new Fx.Transition(function(p){
-		return Math.pow(p, i + 2);
-	});
-});
-
-/*
----
-
-name: Fx.Tween
-
-description: Formerly Fx.Style, effect to transition any CSS property for an element.
-
-license: MIT-style license.
-
-requires: Fx.CSS
-
-provides: [Fx.Tween, Element.fade, Element.highlight]
-
-...
-*/
-
-Fx.Tween = new Class({
-
-	Extends: Fx.CSS,
-
-	initialize: function(element, options){
-		this.element = this.subject = document.id(element);
-		this.parent(options);
-	},
-
-	set: function(property, now){
-		if (arguments.length == 1){
-			now = property;
-			property = this.property || this.options.property;
-		}
-		this.render(this.element, property, now, this.options.unit);
-		return this;
-	},
-
-	start: function(property, from, to){
-		if (!this.check(property, from, to)) return this;
-		var args = Array.flatten(arguments);
-		this.property = this.options.property || args.shift();
-		var parsed = this.prepare(this.element, this.property, args);
-		return this.parent(parsed.from, parsed.to);
-	}
-
-});
-
-Element.Properties.tween = {
-
-	set: function(options){
-		this.get('tween').cancel().setOptions(options);
-		return this;
-	},
-
-	get: function(){
-		var tween = this.retrieve('tween');
-		if (!tween){
-			tween = new Fx.Tween(this, {link: 'cancel'});
-			this.store('tween', tween);
-		}
-		return tween;
-	}
-
-};
-
-Element.implement({
-
-	tween: function(property, from, to){
-		this.get('tween').start(property, from, to);
-		return this;
-	},
-
-	fade: function(){
-		var fade = this.get('tween'), method, args = ['opacity'].append(arguments), toggle;
-		if (args[1] == null) args[1] = 'toggle';
-		switch (args[1]){
-			case 'in': method = 'start'; args[1] = 1; break;
-			case 'out': method = 'start'; args[1] = 0; break;
-			case 'show': method = 'set'; args[1] = 1; break;
-			case 'hide': method = 'set'; args[1] = 0; break;
-			case 'toggle':
-				var flag = this.retrieve('fade:flag', this.getStyle('opacity') == 1);
-				method = 'start';
-				args[1] = flag ? 0 : 1;
-				this.store('fade:flag', !flag);
-				toggle = true;
-				break;
-			default: method = 'start';
-		}
-		if (!toggle) this.eliminate('fade:flag');
-		fade[method].apply(fade, args);
-		var to = args[args.length - 1];
-
-		if (method == 'set'){
-			this.setStyle('visibility', to == 0 ? 'hidden' : 'visible');
-		} else if (to != 0){
-			if (fade.$chain.length){
-				fade.chain(function(){
-					this.element.setStyle('visibility', 'visible');
-					this.callChain();
-				});
-			} else {
-				this.setStyle('visibility', 'visible');
-			}
-		} else {
-			fade.chain(function(){
-				if (this.element.getStyle('opacity')) return;
-				this.element.setStyle('visibility', 'hidden');
-				this.callChain();
-			});
-		}
-
-		return this;
-	},
-
-	highlight: function(start, end){
-		if (!end){
-			end = this.retrieve('highlight:original', this.getStyle('background-color'));
-			end = (end == 'transparent') ? '#fff' : end;
-		}
-		var tween = this.get('tween');
-		tween.start('background-color', start || '#ffff88', end).chain(function(){
-			this.setStyle('background-color', this.retrieve('highlight:original'));
-			tween.callChain();
-		}.bind(this));
-		return this;
-	}
-
-});
-
-/*
----
-
-name: Request
-
-description: Powerful all purpose Request Class. Uses XMLHTTPRequest.
-
-license: MIT-style license.
-
-requires: [Object, Element, Chain, Events, Options, Class.Thenable, Browser]
-
-provides: Request
-
-...
-*/
-
-(function(){
-
-var empty = function(){},
-	progressSupport = ('onprogress' in new Browser.Request);
-
-var Request = this.Request = new Class({
-
-	Implements: [Chain, Events, Options, Class.Thenable],
-
-	options: {/*
-		onRequest: function(){},
-		onLoadstart: function(event, xhr){},
-		onProgress: function(event, xhr){},
-		onComplete: function(){},
-		onCancel: function(){},
-		onSuccess: function(responseText, responseXML){},
-		onFailure: function(xhr){},
-		onException: function(headerName, value){},
-		onTimeout: function(){},
-		user: '',
-		password: '',
-		withCredentials: false,*/
-		url: '',
-		data: '',
-		headers: {
-			'X-Requested-With': 'XMLHttpRequest',
-			'Accept': 'text/javascript, text/html, application/xml, text/xml, */*'
-		},
-		async: true,
-		format: false,
-		method: 'post',
-		link: 'ignore',
-		isSuccess: null,
-		emulation: true,
-		urlEncoded: true,
-		encoding: 'utf-8',
-		evalScripts: false,
-		evalResponse: false,
-		timeout: 0,
-		noCache: false
-	},
-
-	initialize: function(options){
-		this.xhr = new Browser.Request();
-		this.setOptions(options);
-		this.headers = this.options.headers;
-	},
-
-	onStateChange: function(){
-		var xhr = this.xhr;
-		if (xhr.readyState != 4 || !this.running) return;
-		this.running = false;
-		this.status = 0;
-		Function.attempt(function(){
-			var status = xhr.status;
-			this.status = (status == 1223) ? 204 : status;
-		}.bind(this));
-		xhr.onreadystatechange = empty;
-		if (progressSupport) xhr.onprogress = xhr.onloadstart = empty;
-		if (this.timer){
-			clearTimeout(this.timer);
-			delete this.timer;
-		}
-
-		this.response = {text: this.xhr.responseText || '', xml: this.xhr.responseXML};
-		if (this.options.isSuccess.call(this, this.status))
-			this.success(this.response.text, this.response.xml);
-		else
-			this.failure();
-	},
-
-	isSuccess: function(){
-		var status = this.status;
-		return (status >= 200 && status < 300);
-	},
-
-	isRunning: function(){
-		return !!this.running;
-	},
-
-	processScripts: function(text){
-		if (this.options.evalResponse || (/(ecma|java)script/).test(this.getHeader('Content-type'))) return Browser.exec(text);
-		return text.stripScripts(this.options.evalScripts);
-	},
-
-	success: function(text, xml){
-		this.onSuccess(this.processScripts(text), xml);
-		this.resolve({text: text, xml: xml});
-	},
-
-	onSuccess: function(){
-		this.fireEvent('complete', arguments).fireEvent('success', arguments).callChain();
-	},
-
-	failure: function(){
-		this.onFailure();
-		this.reject({reason: 'failure', xhr: this.xhr});
-	},
-
-	onFailure: function(){
-		this.fireEvent('complete').fireEvent('failure', this.xhr);
-	},
-
-	loadstart: function(event){
-		this.fireEvent('loadstart', [event, this.xhr]);
-	},
-
-	progress: function(event){
-		this.fireEvent('progress', [event, this.xhr]);
-	},
-
-	timeout: function(){
-		this.fireEvent('timeout', this.xhr);
-		this.reject({reason: 'timeout', xhr: this.xhr});
-	},
-
-	setHeader: function(name, value){
-		this.headers[name] = value;
-		return this;
-	},
-
-	getHeader: function(name){
-		return Function.attempt(function(){
-			return this.xhr.getResponseHeader(name);
-		}.bind(this));
-	},
-
-	check: function(){
-		if (!this.running) return true;
-		switch (this.options.link){
-			case 'cancel': this.cancel(); return true;
-			case 'chain': this.chain(this.caller.pass(arguments, this)); return false;
-		}
-		return false;
-	},
-
-	send: function(options){
-		if (!this.check(options)) return this;
-
-		this.options.isSuccess = this.options.isSuccess || this.isSuccess;
-		this.running = true;
-
-		var type = typeOf(options);
-		if (type == 'string' || type == 'element') options = {data: options};
-
-		var old = this.options;
-		options = Object.append({data: old.data, url: old.url, method: old.method}, options);
-		var data = options.data, url = String(options.url), method = options.method.toLowerCase();
-
-		switch (typeOf(data)){
-			case 'element': data = document.id(data).toQueryString(); break;
-			case 'object': case 'hash': data = Object.toQueryString(data);
-		}
-
-		if (this.options.format){
-			var format = 'format=' + this.options.format;
-			data = (data) ? format + '&' + data : format;
-		}
-
-		if (this.options.emulation && !['get', 'post'].contains(method)){
-			var _method = '_method=' + method;
-			data = (data) ? _method + '&' + data : _method;
-			method = 'post';
-		}
-
-		if (this.options.urlEncoded && ['post', 'put'].contains(method)){
-			var encoding = (this.options.encoding) ? '; charset=' + this.options.encoding : '';
-			this.headers['Content-type'] = 'application/x-www-form-urlencoded' + encoding;
-		}
-
-		if (!url) url = document.location.pathname;
-
-		var trimPosition = url.lastIndexOf('/');
-		if (trimPosition > -1 && (trimPosition = url.indexOf('#')) > -1) url = url.substr(0, trimPosition);
-
-		if (this.options.noCache)
-			url += (url.indexOf('?') > -1 ? '&' : '?') + String.uniqueID();
-
-		if (data && (method == 'get' || method == 'delete')){
-			url += (url.indexOf('?') > -1 ? '&' : '?') + data;
-			data = null;
-		}
-
-		var xhr = this.xhr;
-		if (progressSupport){
-			xhr.onloadstart = this.loadstart.bind(this);
-			xhr.onprogress = this.progress.bind(this);
-		}
-
-		xhr.open(method.toUpperCase(), url, this.options.async, this.options.user, this.options.password);
-		if ((this.options.withCredentials) && 'withCredentials' in xhr) xhr.withCredentials = true;
-
-		xhr.onreadystatechange = this.onStateChange.bind(this);
-
-		Object.each(this.headers, function(value, key){
-			try {
-				xhr.setRequestHeader(key, value);
-			} catch (e){
-				this.fireEvent('exception', [key, value]);
-				this.reject({reason: 'exception', xhr: xhr, exception: e});
-			}
-		}, this);
-
-		if (this.getThenableState() !== 'pending'){
-			this.resetThenable({reason: 'send'});
-		}
-		this.fireEvent('request');
-		xhr.send(data);
-		if (!this.options.async) this.onStateChange();
-		else if (this.options.timeout) this.timer = this.timeout.delay(this.options.timeout, this);
-		return this;
-	},
-
-	cancel: function(){
-		if (!this.running) return this;
-		this.running = false;
-		var xhr = this.xhr;
-		xhr.abort();
-		if (this.timer){
-			clearTimeout(this.timer);
-			delete this.timer;
-		}
-		xhr.onreadystatechange = empty;
-		if (progressSupport) xhr.onprogress = xhr.onloadstart = empty;
-		this.xhr = new Browser.Request();
-		this.fireEvent('cancel');
-		this.reject({reason: 'cancel', xhr: xhr});
-		return this;
-	}
-
-});
-
-var methods = {};
-['get', 'post', 'put', 'delete', 'patch', 'head', 'GET', 'POST', 'PUT', 'DELETE', 'PATCH', 'HEAD'].each(function(method){
-	methods[method] = function(data){
-		var object = {
-			method: method
-		};
-		if (data != null) object.data = data;
-		return this.send(object);
-	};
-});
-
-Request.implement(methods);
-
-Element.Properties.send = {
-
-	set: function(options){
-		var send = this.get('send').cancel();
-		send.setOptions(options);
-		return this;
-	},
-
-	get: function(){
-		var send = this.retrieve('send');
-		if (!send){
-			send = new Request({
-				data: this, link: 'cancel', method: this.get('method') || 'post', url: this.get('action')
-			});
-			this.store('send', send);
-		}
-		return send;
-	}
-
-};
-
-Element.implement({
-
-	send: function(url){
-		var sender = this.get('send');
-		sender.send({data: this, url: url || sender.options.url});
-		return this;
-	}
-
-});
-
-})();
-
-/*
----
-
-name: Request.HTML
-
-description: Extends the basic Request Class with additional methods for interacting with HTML responses.
-
-license: MIT-style license.
-
-requires: [Element, Request]
-
-provides: Request.HTML
-
-...
-*/
-
-Request.HTML = new Class({
-
-	Extends: Request,
-
-	options: {
-		update: false,
-		append: false,
-		evalScripts: true,
-		filter: false,
-		headers: {
-			Accept: 'text/html, application/xml, text/xml, */*'
-		}
-	},
-
-	success: function(text){
-		var options = this.options, response = this.response;
-
-		response.html = text.stripScripts(function(script){
-			response.javascript = script;
-		});
-
-		var match = response.html.match(/<body[^>]*>([\s\S]*?)<\/body>/i);
-		if (match) response.html = match[1];
-		var temp = new Element('div').set('html', response.html);
-
-		response.tree = temp.childNodes;
-		response.elements = temp.getElements(options.filter || '*');
-
-		if (options.filter) response.tree = response.elements;
-		if (options.update){
-			var update = document.id(options.update).empty();
-			if (options.filter) update.adopt(response.elements);
-			else update.set('html', response.html);
-		} else if (options.append){
-			var append = document.id(options.append);
-			if (options.filter) response.elements.reverse().inject(append);
-			else append.adopt(temp.getChildren());
-		}
-		if (options.evalScripts) Browser.exec(response.javascript);
-
-		this.onSuccess(response.tree, response.elements, response.html, response.javascript);
-		this.resolve({tree: response.tree, elements: response.elements, html: response.html, javascript: response.javascript});
-	}
-
-});
-
-Element.Properties.load = {
-
-	set: function(options){
-		var load = this.get('load').cancel();
-		load.setOptions(options);
-		return this;
-	},
-
-	get: function(){
-		var load = this.retrieve('load');
-		if (!load){
-			load = new Request.HTML({data: this, link: 'cancel', update: this, method: 'get'});
-			this.store('load', load);
-		}
-		return load;
-	}
-
-};
-
-Element.implement({
-
-	load: function(){
-		this.get('load').send(Array.link(arguments, {data: Type.isObject, url: Type.isString}));
-		return this;
-	}
-
-});
-
-/*
----
-
-name: JSON
-
-description: JSON encoder and decoder.
-
-license: MIT-style license.
-
-SeeAlso: <http://www.json.org/>
-
-requires: [Array, String, Number, Function]
-
-provides: JSON
-
-...
-*/
-
-if (typeof JSON == 'undefined') this.JSON = {};
-
-
-
-(function(){
-
-var special = {'\b': '\\b', '\t': '\\t', '\n': '\\n', '\f': '\\f', '\r': '\\r', '"' : '\\"', '\\': '\\\\'};
-
-var escape = function(chr){
-	return special[chr] || '\\u' + ('0000' + chr.charCodeAt(0).toString(16)).slice(-4);
-};
-
-JSON.validate = function(string){
-	string = string.replace(/\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g, '@').
-					replace(/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g, ']').
-					replace(/(?:^|:|,)(?:\s*\[)+/g, '');
-
-	return (/^[\],:{}\s]*$/).test(string);
-};
-
-JSON.encode = JSON.stringify ? function(obj){
-	return JSON.stringify(obj);
-} : function(obj){
-	if (obj && obj.toJSON) obj = obj.toJSON();
-
-	switch (typeOf(obj)){
-		case 'string':
-			return '"' + obj.replace(/[\x00-\x1f\\"]/g, escape) + '"';
-		case 'array':
-			return '[' + obj.map(JSON.encode).clean() + ']';
-		case 'object': case 'hash':
-			var string = [];
-			Object.each(obj, function(value, key){
-				var json = JSON.encode(value);
-				if (json) string.push(JSON.encode(key) + ':' + json);
-			});
-			return '{' + string + '}';
-		case 'number': case 'boolean': return '' + obj;
-		case 'null': return 'null';
-	}
-
-	return null;
-};
-
-JSON.secure = true;
-
-
-JSON.decode = function(string, secure){
-	if (!string || typeOf(string) != 'string') return null;
-
-	if (secure == null) secure = JSON.secure;
-	if (secure){
-		if (JSON.parse) return JSON.parse(string);
-		if (!JSON.validate(string)) throw new Error('JSON could not decode the input; security is enabled and the value is not secure.');
-	}
-
-	return eval('(' + string + ')');
-};
-
-})();
-
-/*
----
-
-name: Request.JSON
-
-description: Extends the basic Request Class with additional methods for sending and receiving JSON data.
-
-license: MIT-style license.
-
-requires: [Request, JSON]
-
-provides: Request.JSON
-
-...
-*/
-
-Request.JSON = new Class({
-
-	Extends: Request,
-
-	options: {
-		/*onError: function(text, error){},*/
-		secure: true
-	},
-
-	initialize: function(options){
-		this.parent(options);
-		Object.append(this.headers, {
-			'Accept': 'application/json',
-			'X-Request': 'JSON'
-		});
-	},
-
-	success: function(text){
-		var json;
-		try {
-			json = this.response.json = JSON.decode(text, this.options.secure);
-		} catch (error){
-			this.fireEvent('error', [text, error]);
-			return;
-		}
-		if (json == null){
-			this.failure();
-		} else {
-			this.onSuccess(json, text);
-			this.resolve({json: json, text: text});
-		}
-	}
-
-});
-
-/*
----
-
-name: Cookie
-
-description: Class for creating, reading, and deleting browser Cookies.
-
-license: MIT-style license.
-
-credits:
-  - Based on the functions by Peter-Paul Koch (http://quirksmode.org).
-
-requires: [Options, Browser]
-
-provides: Cookie
-
-...
-*/
-
-var Cookie = new Class({
-
-	Implements: Options,
-
-	options: {
-		path: '/',
-		domain: false,
-		duration: false,
-		secure: false,
-		document: document,
-		encode: true,
-		httpOnly: false
-	},
-
-	initialize: function(key, options){
-		this.key = key;
-		this.setOptions(options);
-	},
-
-	write: function(value){
-		if (this.options.encode) value = encodeURIComponent(value);
-		if (this.options.domain) value += '; domain=' + this.options.domain;
-		if (this.options.path) value += '; path=' + this.options.path;
-		if (this.options.duration){
-			var date = new Date();
-			date.setTime(date.getTime() + this.options.duration * 24 * 60 * 60 * 1000);
-			value += '; expires=' + date.toGMTString();
-		}
-		if (this.options.secure) value += '; secure';
-		if (this.options.httpOnly) value += '; HttpOnly';
-		this.options.document.cookie = this.key + '=' + value;
-		return this;
-	},
-
-	read: function(){
-		var value = this.options.document.cookie.match('(?:^|;)\\s*' + this.key.escapeRegExp() + '=([^;]*)');
-		return (value) ? decodeURIComponent(value[1]) : null;
-	},
-
-	dispose: function(){
-		new Cookie(this.key, Object.merge({}, this.options, {duration: -1})).write('');
-		return this;
-	}
-
-});
-
-Cookie.write = function(key, value, options){
-	return new Cookie(key, options).write(value);
-};
-
-Cookie.read = function(key){
-	return new Cookie(key).read();
-};
-
-Cookie.dispose = function(key, options){
-	return new Cookie(key, options).dispose();
-};
-
-/*
----
-
-name: DOMReady
-
-description: Contains the custom event domready.
-
-license: MIT-style license.
-
-requires: [Browser, Element, Element.Event]
-
-provides: [DOMReady, DomReady]
-
-...
-*/
-
-(function(window, document){
-
-var ready,
-	loaded,
-	checks = [],
-	shouldPoll,
-	timer,
-	testElement = document.createElement('div');
-
-var domready = function(){
-	clearTimeout(timer);
-	if (!ready){
-		Browser.loaded = ready = true;
-		document.removeListener('DOMContentLoaded', domready).removeListener('readystatechange', check);
-		document.fireEvent('domready');
-		window.fireEvent('domready');
-	}
-	// cleanup scope vars
-	document = window = testElement = null;
-};
-
-var check = function(){
-	for (var i = checks.length; i--;) if (checks[i]()){
-		domready();
-		return true;
-	}
-	return false;
-};
-
-var poll = function(){
-	clearTimeout(timer);
-	if (!check()) timer = setTimeout(poll, 10);
-};
-
-document.addListener('DOMContentLoaded', domready);
-
-/*<ltIE8>*/
-// doScroll technique by Diego Perini http://javascript.nwbox.com/IEContentLoaded/
-// testElement.doScroll() throws when the DOM is not ready, only in the top window
-var doScrollWorks = function(){
-	try {
-		testElement.doScroll();
-		return true;
-	} catch (e){}
-	return false;
-};
-// If doScroll works already, it can't be used to determine domready
-//   e.g. in an iframe
-if (testElement.doScroll && !doScrollWorks()){
-	checks.push(doScrollWorks);
-	shouldPoll = true;
-}
-/*</ltIE8>*/
-
-if (document.readyState) checks.push(function(){
-	var state = document.readyState;
-	return (state == 'loaded' || state == 'complete');
-});
-
-if ('onreadystatechange' in document) document.addListener('readystatechange', check);
-else shouldPoll = true;
-
-if (shouldPoll) poll();
-
-Element.Events.domready = {
-	onAdd: function(fn){
-		if (ready) fn.call(this);
-	}
-};
-
-// Make sure that domready fires before load
-Element.Events.load = {
-	base: 'load',
-	onAdd: function(fn){
-		if (loaded && this == window) fn.call(this);
-	},
-	condition: function(){
-		if (this == window){
-			domready();
-			delete Element.Events.load;
-		}
-		return true;
-	}
-};
-
-// This is based on the custom load event
-window.addEvent('load', function(){
-	loaded = true;
-});
-
-})(window, document);
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/libraries/MooTools-More-1.3.3dev.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/libraries/MooTools-More-1.3.3dev.js
deleted file mode 100644
index 0d8df04..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/libraries/MooTools-More-1.3.3dev.js
+++ /dev/null
@@ -1,13543 +0,0 @@
-/*
----
-
-script: More.js
-
-name: More
-
-description: MooTools More
-
-license: MIT-style license
-
-authors:
-  - Guillermo Rauch
-  - Thomas Aylott
-  - Scott Kyle
-  - Arian Stolwijk
-  - Tim Wienk
-  - Christoph Pojer
-  - Aaron Newton
-  - Jacob Thornton
-
-requires:
-  - Core/MooTools
-
-provides: [MooTools.More]
-
-...
-*/
-
-MooTools.More = {
-	'version': '1.3.2.2dev',
-	'build': 'b6dcbdcc821fbf62404ef43f332f5c594ac76a3a'
-};
-
-
-/*
----
-
-name: Events.Pseudos
-
-description: Adds the functionality to add pseudo events
-
-license: MIT-style license
-
-authors:
-  - Arian Stolwijk
-
-requires: [Core/Class.Extras, Core/Slick.Parser, More/MooTools.More]
-
-provides: [Events.Pseudos]
-
-...
-*/
-
-Events.Pseudos = function(pseudos, addEvent, removeEvent){
-
-	var storeKey = 'monitorEvents:';
-
-	var storageOf = function(object){
-		return {
-			store: object.store ? function(key, value){
-				object.store(storeKey + key, value);
-			} : function(key, value){
-				(object.$monitorEvents || (object.$monitorEvents = {}))[key] = value;
-			},
-			retrieve: object.retrieve ? function(key, dflt){
-				return object.retrieve(storeKey + key, dflt);
-			} : function(key, dflt){
-				if (!object.$monitorEvents) return dflt;
-				return object.$monitorEvents[key] || dflt;
-			}
-		};
-	};
-
-	var splitType = function(type){
-		if (type.indexOf(':') == -1 || !pseudos) return null;
-
-		var parsed = Slick.parse(type).expressions[0][0],
-			parsedPseudos = parsed.pseudos,
-			l = parsedPseudos.length,
-			splits = [];
-
-		while (l--) if (pseudos[parsedPseudos[l].key]){
-			splits.push({
-				event: parsed.tag,
-				value: parsedPseudos[l].value,
-				pseudo: parsedPseudos[l].key,
-				original: type
-			});
-		}
-
-		return splits.length ? splits : null;
-	};
-
-	var mergePseudoOptions = function(split){
-		return Object.merge.apply(this, split.map(function(item){
-			return pseudos[item.pseudo].options || {};
-		}));
-	};
-
-	return {
-
-		addEvent: function(type, fn, internal){
-			var split = splitType(type);
-			if (!split) return addEvent.call(this, type, fn, internal);
-
-			var storage = storageOf(this),
-				events = storage.retrieve(type, []),
-				eventType = split[0].event,
-				options = mergePseudoOptions(split),
-				stack = fn,
-				eventOptions = options[eventType] || {},
-				args = Array.slice(arguments, 2),
-				self = this,
-				monitor;
-
-			if (eventOptions.args) args.append(Array.from(eventOptions.args));
-			if (eventOptions.base) eventType = eventOptions.base;
-			if (eventOptions.onAdd) eventOptions.onAdd(this);
-
-			split.each(function(item){
-				var stackFn = stack;
-				stack = function(){
-					(eventOptions.listener || pseudos[item.pseudo].listener).call(self, item, stackFn, arguments, monitor, options);
-				};
-			});
-			monitor = stack.bind(this);
-
-			events.include({event: fn, monitor: monitor});
-			storage.store(type, events);
-
-			addEvent.apply(this, [type, fn].concat(args));
-			return addEvent.apply(this, [eventType, monitor].concat(args));
-		},
-
-		removeEvent: function(type, fn){
-			var split = splitType(type);
-			if (!split) return removeEvent.call(this, type, fn);
-
-			var storage = storageOf(this),
-				events = storage.retrieve(type);
-			if (!events) return this;
-
-			var eventType = split[0].event,
-				options = mergePseudoOptions(split),
-				eventOptions = options[eventType] || {},
-				args = Array.slice(arguments, 2);
-
-			if (eventOptions.args) args.append(Array.from(eventOptions.args));
-			if (eventOptions.base) eventType = eventOptions.base;
-			if (eventOptions.onRemove) eventOptions.onRemove(this);
-
-			removeEvent.apply(this, [type, fn].concat(args));
-			events.each(function(monitor, i){
-				if (!fn || monitor.event == fn) removeEvent.apply(this, [eventType, monitor.monitor].concat(args));
-				delete events[i];
-			}, this);
-
-			storage.store(type, events);
-			return this;
-		}
-
-	};
-
-};
-
-(function(){
-
-var pseudos = {
-
-	once: {
-		listener: function(split, fn, args, monitor){
-			fn.apply(this, args);
-			this.removeEvent(split.event, monitor)
-				.removeEvent(split.original, fn);
-		}
-	},
-
-	throttle: {
-		listener: function(split, fn, args){
-			if (!fn._throttled){
-				fn.apply(this, args);
-				fn._throttled = setTimeout(function(){
-					fn._throttled = false;
-				}, split.value || 250);
-			}
-		}
-	},
-
-	pause: {
-		listener: function(split, fn, args){
-			clearTimeout(fn._pause);
-			fn._pause = fn.delay(split.value || 250, this, args);
-		}
-	}
-
-};
-
-Events.definePseudo = function(key, listener){
-	pseudos[key] = Type.isFunction(listener) ? {listener: listener} : listener;
-	return this;
-};
-
-Events.lookupPseudo = function(key){
-	return pseudos[key];
-};
-
-var proto = Events.prototype;
-Events.implement(Events.Pseudos(pseudos, proto.addEvent, proto.removeEvent));
-
-['Request', 'Fx'].each(function(klass){
-	if (this[klass]) this[klass].implement(Events.prototype);
-});
-
-})();
-
-
-/*
----
-
-script: Class.Refactor.js
-
-name: Class.Refactor
-
-description: Extends a class onto itself with new property, preserving any items attached to the class's namespace.
-
-license: MIT-style license
-
-authors:
-  - Aaron Newton
-
-requires:
-  - Core/Class
-  - /MooTools.More
-
-# Some modules declare themselves dependent on Class.Refactor
-provides: [Class.refactor, Class.Refactor]
-
-...
-*/
-
-Class.refactor = function(original, refactors){
-
-	Object.each(refactors, function(item, name){
-		var origin = original.prototype[name];
-		origin = (origin && origin.$origin) || origin || function(){};
-		original.implement(name, (typeof item == 'function') ? function(){
-			var old = this.previous;
-			this.previous = origin;
-			var value = item.apply(this, arguments);
-			this.previous = old;
-			return value;
-		} : item);
-	});
-
-	return original;
-
-};
-
-
-/*
----
-
-script: Class.Binds.js
-
-name: Class.Binds
-
-description: Automagically binds specified methods in a class to the instance of the class.
-
-license: MIT-style license
-
-authors:
-  - Aaron Newton
-
-requires:
-  - Core/Class
-  - /MooTools.More
-
-provides: [Class.Binds]
-
-...
-*/
-
-Class.Mutators.Binds = function(binds){
-	if (!this.prototype.initialize) this.implement('initialize', function(){});
-	return Array.from(binds).concat(this.prototype.Binds || []);
-};
-
-Class.Mutators.initialize = function(initialize){
-	return function(){
-		Array.from(this.Binds).each(function(name){
-			var original = this[name];
-			if (original) this[name] = original.bind(this);
-		}, this);
-		return initialize.apply(this, arguments);
-	};
-};
-
-
-/*
----
-
-script: Class.Occlude.js
-
-name: Class.Occlude
-
-description: Prevents a class from being applied to a DOM element twice.
-
-license: MIT-style license.
-
-authors:
-  - Aaron Newton
-
-requires:
-  - Core/Class
-  - Core/Element
-  - /MooTools.More
-
-provides: [Class.Occlude]
-
-...
-*/
-
-Class.Occlude = new Class({
-
-	occlude: function(property, element){
-		element = document.id(element || this.element);
-		var instance = element.retrieve(property || this.property);
-		if (instance && !this.occluded)
-			return (this.occluded = instance);
-
-		this.occluded = false;
-		element.store(property || this.property, this);
-		return this.occluded;
-	}
-
-});
-
-
-/*
----
-
-script: Chain.Wait.js
-
-name: Chain.Wait
-
-description: value, Adds a method to inject pauses between chained events.
-
-license: MIT-style license.
-
-authors:
-  - Aaron Newton
-
-requires:
-  - Core/Chain
-  - Core/Element
-  - Core/Fx
-  - /MooTools.More
-
-provides: [Chain.Wait]
-
-...
-*/
-
-(function(){
-
-	var wait = {
-		wait: function(duration){
-			return this.chain(function(){
-				this.callChain.delay(duration == null ? 500 : duration, this);
-				return this;
-			}.bind(this));
-		}
-	};
-
-	Chain.implement(wait);
-
-	if (this.Fx) Fx.implement(wait);
-
-	if (this.Element && Element.implement && this.Fx){
-		Element.implement({
-
-			chains: function(effects){
-				Array.from(effects || ['tween', 'morph', 'reveal']).each(function(effect){
-					effect = this.get(effect);
-					if (!effect) return;
-					effect.setOptions({
-						link:'chain'
-					});
-				}, this);
-				return this;
-			},
-
-			pauseFx: function(duration, effect){
-				this.chains(effect).get(effect || 'tween').wait(duration);
-				return this;
-			}
-
-		});
-	}
-
-})();
-
-
-/*
----
-
-script: Array.Extras.js
-
-name: Array.Extras
-
-description: Extends the Array native object to include useful methods to work with arrays.
-
-license: MIT-style license
-
-authors:
-  - Christoph Pojer
-  - Sebastian Markbåge
-
-requires:
-  - Core/Array
-  - MooTools.More
-
-provides: [Array.Extras]
-
-...
-*/
-
-(function(nil){
-
-Array.implement({
-
-	min: function(){
-		return Math.min.apply(null, this);
-	},
-
-	max: function(){
-		return Math.max.apply(null, this);
-	},
-
-	average: function(){
-		return this.length ? this.sum() / this.length : 0;
-	},
-
-	sum: function(){
-		var result = 0, l = this.length;
-		if (l){
-			while (l--) result += this[l];
-		}
-		return result;
-	},
-
-	unique: function(){
-		return [].combine(this);
-	},
-
-	shuffle: function(){
-		for (var i = this.length; i && --i;){
-			var temp = this[i], r = Math.floor(Math.random() * ( i + 1 ));
-			this[i] = this[r];
-			this[r] = temp;
-		}
-		return this;
-	},
-
-	reduce: function(fn, value){
-		for (var i = 0, l = this.length; i < l; i++){
-			if (i in this) value = value === nil ? this[i] : fn.call(null, value, this[i], i, this);
-		}
-		return value;
-	},
-
-	reduceRight: function(fn, value){
-		var i = this.length;
-		while (i--){
-			if (i in this) value = value === nil ? this[i] : fn.call(null, value, this[i], i, this);
-		}
-		return value;
-	}
-
-});
-
-})();
-
-
-/*
----
-
-script: Object.Extras.js
-
-name: Object.Extras
-
-description: Extra Object generics, like getFromPath which allows a path notation to child elements.
-
-license: MIT-style license
-
-authors:
-  - Aaron Newton
-
-requires:
-  - Core/Object
-  - /MooTools.More
-
-provides: [Object.Extras]
-
-...
-*/
-
-(function(){
-
-var defined = function(value){
-	return value != null;
-};
-
-var hasOwnProperty = Object.prototype.hasOwnProperty;
-
-Object.extend({
-
-	getFromPath: function(source, parts){
-		if (typeof parts == 'string') parts = parts.split('.');
-		for (var i = 0, l = parts.length; i < l; i++){
-			if (hasOwnProperty.call(source, parts[i])) source = source[parts[i]];
-			else return null;
-		}
-		return source;
-	},
-
-	cleanValues: function(object, method){
-		method = method || defined;
-		for (var key in object) if (!method(object[key])){
-			delete object[key];
-		}
-		return object;
-	},
-
-	erase: function(object, key){
-		if (hasOwnProperty.call(object, key)) delete object[key];
-		return object;
-	},
-
-	run: function(object){
-		var args = Array.slice(arguments, 1);
-		for (var key in object) if (object[key].apply){
-			object[key].apply(object, args);
-		}
-		return object;
-	}
-
-});
-
-})();
-
-
-/*
----
-
-script: Locale.js
-
-name: Locale
-
-description: Provides methods for localization.
-
-license: MIT-style license
-
-authors:
-  - Aaron Newton
-  - Arian Stolwijk
-
-requires:
-  - Core/Events
-  - /Object.Extras
-  - /MooTools.More
-
-provides: [Locale, Lang]
-
-...
-*/
-
-(function(){
-
-var current = null,
-	locales = {},
-	inherits = {};
-
-var getSet = function(set){
-	if (instanceOf(set, Locale.Set)) return set;
-	else return locales[set];
-};
-
-var Locale = this.Locale = {
-
-	define: function(locale, set, key, value){
-		var name;
-		if (instanceOf(locale, Locale.Set)){
-			name = locale.name;
-			if (name) locales[name] = locale;
-		} else {
-			name = locale;
-			if (!locales[name]) locales[name] = new Locale.Set(name);
-			locale = locales[name];
-		}
-
-		if (set) locale.define(set, key, value);
-
-		/*<1.2compat>*/
-		if (set == 'cascade') return Locale.inherit(name, key);
-		/*</1.2compat>*/
-
-		if (!current) current = locale;
-
-		return locale;
-	},
-
-	use: function(locale){
-		locale = getSet(locale);
-
-		if (locale){
-			current = locale;
-
-			this.fireEvent('change', locale);
-
-			/*<1.2compat>*/
-			this.fireEvent('langChange', locale.name);
-			/*</1.2compat>*/
-		}
-
-		return this;
-	},
-
-	getCurrent: function(){
-		return current;
-	},
-
-	get: function(key, args){
-		return (current) ? current.get(key, args) : '';
-	},
-
-	inherit: function(locale, inherits, set){
-		locale = getSet(locale);
-
-		if (locale) locale.inherit(inherits, set);
-		return this;
-	},
-
-	list: function(){
-		return Object.keys(locales);
-	}
-
-};
-
-Object.append(Locale, new Events);
-
-Locale.Set = new Class({
-
-	sets: {},
-
-	inherits: {
-		locales: [],
-		sets: {}
-	},
-
-	initialize: function(name){
-		this.name = name || '';
-	},
-
-	define: function(set, key, value){
-		var defineData = this.sets[set];
-		if (!defineData) defineData = {};
-
-		if (key){
-			if (typeOf(key) == 'object') defineData = Object.merge(defineData, key);
-			else defineData[key] = value;
-		}
-		this.sets[set] = defineData;
-
-		return this;
-	},
-
-	get: function(key, args, _base){
-		var value = Object.getFromPath(this.sets, key);
-		if (value != null){
-			var type = typeOf(value);
-			if (type == 'function') value = value.apply(null, Array.from(args));
-			else if (type == 'object') value = Object.clone(value);
-			return value;
-		}
-
-		// get value of inherited locales
-		var index = key.indexOf('.'),
-			set = index < 0 ? key : key.substr(0, index),
-			names = (this.inherits.sets[set] || []).combine(this.inherits.locales).include('en-US');
-		if (!_base) _base = [];
-
-		for (var i = 0, l = names.length; i < l; i++){
-			if (_base.contains(names[i])) continue;
-			_base.include(names[i]);
-
-			var locale = locales[names[i]];
-			if (!locale) continue;
-
-			value = locale.get(key, args, _base);
-			if (value != null) return value;
-		}
-
-		return '';
-	},
-
-	inherit: function(names, set){
-		names = Array.from(names);
-
-		if (set && !this.inherits.sets[set]) this.inherits.sets[set] = [];
-
-		var l = names.length;
-		while (l--) (set ? this.inherits.sets[set] : this.inherits.locales).unshift(names[l]);
-
-		return this;
-	}
-
-});
-
-/*<1.2compat>*/
-var lang = MooTools.lang = {};
-
-Object.append(lang, Locale, {
-	setLanguage: Locale.use,
-	getCurrentLanguage: function(){
-		var current = Locale.getCurrent();
-		return (current) ? current.name : null;
-	},
-	set: function(){
-		Locale.define.apply(this, arguments);
-		return this;
-	},
-	get: function(set, key, args){
-		if (key) set += '.' + key;
-		return Locale.get(set, args);
-	}
-});
-/*</1.2compat>*/
-
-})();
-
-
-/*
----
-
-name: Locale.en-US.Date
-
-description: Date messages for US English.
-
-license: MIT-style license
-
-authors:
-  - Aaron Newton
-
-requires:
-  - /Locale
-
-provides: [Locale.en-US.Date]
-
-...
-*/
-
-Locale.define('en-US', 'Date', {
-
-	months: ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'],
-	months_abbr: ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'],
-	days: ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'],
-	days_abbr: ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'],
-
-	// Culture's date order: MM/DD/YYYY
-	dateOrder: ['month', 'date', 'year'],
-	shortDate: '%m/%d/%Y',
-	shortTime: '%I:%M%p',
-	AM: 'AM',
-	PM: 'PM',
-	firstDayOfWeek: 0,
-
-	// Date.Extras
-	ordinal: function(dayOfMonth){
-		// 1st, 2nd, 3rd, etc.
-		return (dayOfMonth > 3 && dayOfMonth < 21) ? 'th' : ['th', 'st', 'nd', 'rd', 'th'][Math.min(dayOfMonth % 10, 4)];
-	},
-
-	lessThanMinuteAgo: 'less than a minute ago',
-	minuteAgo: 'about a minute ago',
-	minutesAgo: '{delta} minutes ago',
-	hourAgo: 'about an hour ago',
-	hoursAgo: 'about {delta} hours ago',
-	dayAgo: '1 day ago',
-	daysAgo: '{delta} days ago',
-	weekAgo: '1 week ago',
-	weeksAgo: '{delta} weeks ago',
-	monthAgo: '1 month ago',
-	monthsAgo: '{delta} months ago',
-	yearAgo: '1 year ago',
-	yearsAgo: '{delta} years ago',
-
-	lessThanMinuteUntil: 'less than a minute from now',
-	minuteUntil: 'about a minute from now',
-	minutesUntil: '{delta} minutes from now',
-	hourUntil: 'about an hour from now',
-	hoursUntil: 'about {delta} hours from now',
-	dayUntil: '1 day from now',
-	daysUntil: '{delta} days from now',
-	weekUntil: '1 week from now',
-	weeksUntil: '{delta} weeks from now',
-	monthUntil: '1 month from now',
-	monthsUntil: '{delta} months from now',
-	yearUntil: '1 year from now',
-	yearsUntil: '{delta} years from now'
-
-});
-
-
-/*
----
-
-script: Date.js
-
-name: Date
-
-description: Extends the Date native object to include methods useful in managing dates.
-
-license: MIT-style license
-
-authors:
-  - Aaron Newton
-  - Nicholas Barthelemy - https://svn.nbarthelemy.com/date-js/
-  - Harald Kirshner - mail [at] digitarald.de; http://digitarald.de
-  - Scott Kyle - scott [at] appden.com; http://appden.com
-
-requires:
-  - Core/Array
-  - Core/String
-  - Core/Number
-  - MooTools.More
-  - Locale
-  - Locale.en-US.Date
-
-provides: [Date]
-
-...
-*/
-
-(function(){
-
-var Date = this.Date;
-
-var DateMethods = Date.Methods = {
-	ms: 'Milliseconds',
-	year: 'FullYear',
-	min: 'Minutes',
-	mo: 'Month',
-	sec: 'Seconds',
-	hr: 'Hours'
-};
-
-['Date', 'Day', 'FullYear', 'Hours', 'Milliseconds', 'Minutes', 'Month', 'Seconds', 'Time', 'TimezoneOffset',
-	'Week', 'Timezone', 'GMTOffset', 'DayOfYear', 'LastMonth', 'LastDayOfMonth', 'UTCDate', 'UTCDay', 'UTCFullYear',
-	'AMPM', 'Ordinal', 'UTCHours', 'UTCMilliseconds', 'UTCMinutes', 'UTCMonth', 'UTCSeconds', 'UTCMilliseconds'].each(function(method){
-	Date.Methods[method.toLowerCase()] = method;
-});
-
-var pad = function(n, digits, string){
-	if (digits == 1) return n;
-	return n < Math.pow(10, digits - 1) ? (string || '0') + pad(n, digits - 1, string) : n;
-};
-
-Date.implement({
-
-	set: function(prop, value){
-		prop = prop.toLowerCase();
-		var method = DateMethods[prop] && 'set' + DateMethods[prop];
-		if (method && this[method]) this[method](value);
-		return this;
-	}.overloadSetter(),
-
-	get: function(prop){
-		prop = prop.toLowerCase();
-		var method = DateMethods[prop] && 'get' + DateMethods[prop];
-		if (method && this[method]) return this[method]();
-		return null;
-	}.overloadGetter(),
-
-	clone: function(){
-		return new Date(this.get('time'));
-	},
-
-	increment: function(interval, times){
-		interval = interval || 'day';
-		times = times != null ? times : 1;
-
-		switch (interval){
-			case 'year':
-				return this.increment('month', times * 12);
-			case 'month':
-				var d = this.get('date');
-				this.set('date', 1).set('mo', this.get('mo') + times);
-				return this.set('date', d.min(this.get('lastdayofmonth')));
-			case 'week':
-				return this.increment('day', times * 7);
-			case 'day':
-				return this.set('date', this.get('date') + times);
-		}
-
-		if (!Date.units[interval]) throw new Error(interval + ' is not a supported interval');
-
-		return this.set('time', this.get('time') + times * Date.units[interval]());
-	},
-
-	decrement: function(interval, times){
-		return this.increment(interval, -1 * (times != null ? times : 1));
-	},
-
-	isLeapYear: function(){
-		return Date.isLeapYear(this.get('year'));
-	},
-
-	clearTime: function(){
-		return this.set({hr: 0, min: 0, sec: 0, ms: 0});
-	},
-
-	diff: function(date, resolution){
-		if (typeOf(date) == 'string') date = Date.parse(date);
-
-		return ((date - this) / Date.units[resolution || 'day'](3, 3)).round(); // non-leap year, 30-day month
-	},
-
-	getLastDayOfMonth: function(){
-		return Date.daysInMonth(this.get('mo'), this.get('year'));
-	},
-
-	getDayOfYear: function(){
-		return (Date.UTC(this.get('year'), this.get('mo'), this.get('date') + 1)
-			- Date.UTC(this.get('year'), 0, 1)) / Date.units.day();
-	},
-
-	setDay: function(day, firstDayOfWeek){
-		if (firstDayOfWeek == null){
-			firstDayOfWeek = Date.getMsg('firstDayOfWeek');
-			if (firstDayOfWeek === '') firstDayOfWeek = 1;
-		}
-
-		day = (7 + Date.parseDay(day, true) - firstDayOfWeek) % 7;
-		var currentDay = (7 + this.get('day') - firstDayOfWeek) % 7;
-
-		return this.increment('day', day - currentDay);
-	},
-
-	getWeek: function(firstDayOfWeek){
-		if (firstDayOfWeek == null){
-			firstDayOfWeek = Date.getMsg('firstDayOfWeek');
-			if (firstDayOfWeek === '') firstDayOfWeek = 1;
-		}
-
-		var date = this,
-			dayOfWeek = (7 + date.get('day') - firstDayOfWeek) % 7,
-			dividend = 0,
-			firstDayOfYear;
-
-		if (firstDayOfWeek == 1){
-			// ISO-8601, week belongs to year that has the most days of the week (i.e. has the thursday of the week)
-			var month = date.get('month'),
-				startOfWeek = date.get('date') - dayOfWeek;
-
-			if (month == 11 && startOfWeek > 28) return 1; // Week 1 of next year
-
-			if (month == 0 && startOfWeek < -2){
-				// Use a date from last year to determine the week
-				date = new Date(date).decrement('day', dayOfWeek);
-				dayOfWeek = 0;
-			}
-
-			firstDayOfYear = new Date(date.get('year'), 0, 1).get('day') || 7;
-			if (firstDayOfYear > 4) dividend = -7; // First week of the year is not week 1
-		} else {
-			// In other cultures the first week of the year is always week 1 and the last week always 53 or 54.
-			// Days in the same week can have a different weeknumber if the week spreads across two years.
-			firstDayOfYear = new Date(date.get('year'), 0, 1).get('day');
-		}
-
-		dividend += date.get('dayofyear');
-		dividend += 6 - dayOfWeek; // Add days so we calculate the current date's week as a full week
-		dividend += (7 + firstDayOfYear - firstDayOfWeek) % 7; // Make up for first week of the year not being a full week
-
-		return (dividend / 7);
-	},
-
-	getOrdinal: function(day){
-		return Date.getMsg('ordinal', day || this.get('date'));
-	},
-
-	getTimezone: function(){
-		return this.toString()
-			.replace(/^.*? ([A-Z]{3}).[0-9]{4}.*$/, '$1')
-			.replace(/^.*?\(([A-Z])[a-z]+ ([A-Z])[a-z]+ ([A-Z])[a-z]+\)$/, '$1$2$3');
-	},
-
-	getGMTOffset: function(){
-		var off = this.get('timezoneOffset');
-		return ((off > 0) ? '-' : '+') + pad((off.abs() / 60).floor(), 2) + pad(off % 60, 2);
-	},
-
-	setAMPM: function(ampm){
-		ampm = ampm.toUpperCase();
-		var hr = this.get('hr');
-		if (hr > 11 && ampm == 'AM') return this.decrement('hour', 12);
-		else if (hr < 12 && ampm == 'PM') return this.increment('hour', 12);
-		return this;
-	},
-
-	getAMPM: function(){
-		return (this.get('hr') < 12) ? 'AM' : 'PM';
-	},
-
-	parse: function(str){
-		this.set('time', Date.parse(str));
-		return this;
-	},
-
-	isValid: function(date){
-		return !isNaN((date || this).valueOf());
-	},
-
-	format: function(f){
-		if (!this.isValid()) return 'invalid date';
-		if (!f) f = '%x %X';
-
-		var formatLower = f.toLowerCase();
-		if (formatters[formatLower]) return formatters[formatLower](this); // it's a formatter!
-		f = formats[formatLower] || f; // replace short-hand with actual format
-
-		var d = this;
-		return f.replace(/%([a-z%])/gi,
-			function($0, $1){
-				switch ($1){
-					case 'a': return Date.getMsg('days_abbr')[d.get('day')];
-					case 'A': return Date.getMsg('days')[d.get('day')];
-					case 'b': return Date.getMsg('months_abbr')[d.get('month')];
-					case 'B': return Date.getMsg('months')[d.get('month')];
-					case 'c': return d.format('%a %b %d %H:%M:%S %Y');
-					case 'd': return pad(d.get('date'), 2);
-					case 'e': return pad(d.get('date'), 2, ' ');
-					case 'H': return pad(d.get('hr'), 2);
-					case 'I': return pad((d.get('hr') % 12) || 12, 2);
-					case 'j': return pad(d.get('dayofyear'), 3);
-					case 'k': return pad(d.get('hr'), 2, ' ');
-					case 'l': return pad((d.get('hr') % 12) || 12, 2, ' ');
-					case 'L': return pad(d.get('ms'), 3);
-					case 'm': return pad((d.get('mo') + 1), 2);
-					case 'M': return pad(d.get('min'), 2);
-					case 'o': return d.get('ordinal');
-					case 'p': return Date.getMsg(d.get('ampm'));
-					case 's': return Math.round(d / 1000);
-					case 'S': return pad(d.get('seconds'), 2);
-					case 'T': return d.format('%H:%M:%S');
-					case 'U': return pad(d.get('week'), 2);
-					case 'w': return d.get('day');
-					case 'x': return d.format(Date.getMsg('shortDate'));
-					case 'X': return d.format(Date.getMsg('shortTime'));
-					case 'y': return d.get('year').toString().substr(2);
-					case 'Y': return d.get('year');
-					case 'z': return d.get('GMTOffset');
-					case 'Z': return d.get('Timezone');
-				}
-				return $1;
-			}
-		);
-	},
-
-	toISOString: function(){
-		return this.format('iso8601');
-	}
-
-}).alias({
-	toJSON: 'toISOString',
-	compare: 'diff',
-	strftime: 'format'
-});
-
-var formats = {
-	db: '%Y-%m-%d %H:%M:%S',
-	compact: '%Y%m%dT%H%M%S',
-	'short': '%d %b %H:%M',
-	'long': '%B %d, %Y %H:%M'
-};
-
-// The day and month abbreviations are standardized, so we cannot use simply %a and %b because they will get localized
-var rfcDayAbbr = ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'],
-	rfcMonthAbbr = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'];
-
-var formatters = {
-	rfc822: function(date){
-		return rfcDayAbbr[date.get('day')] + date.format(', %d ') + rfcMonthAbbr[date.get('month')] + date.format(' %Y %H:%M:%S %Z');
-	},
-	rfc2822: function(date){
-		return rfcDayAbbr[date.get('day')] + date.format(', %d ') + rfcMonthAbbr[date.get('month')] + date.format(' %Y %H:%M:%S %z');
-	},
-	iso8601: function(date){
-		return (
-			date.getUTCFullYear() + '-' +
-			pad(date.getUTCMonth() + 1, 2) + '-' +
-			pad(date.getUTCDate(), 2) + 'T' +
-			pad(date.getUTCHours(), 2) + ':' +
-			pad(date.getUTCMinutes(), 2) + ':' +
-			pad(date.getUTCSeconds(), 2) + '.' +
-			pad(date.getUTCMilliseconds(), 3) + 'Z'
-		);
-	}
-};
-
-
-var parsePatterns = [],
-	nativeParse = Date.parse;
-
-var parseWord = function(type, word, num){
-	var ret = -1,
-		translated = Date.getMsg(type + 's');
-	switch (typeOf(word)){
-		case 'object':
-			ret = translated[word.get(type)];
-			break;
-		case 'number':
-			ret = translated[word];
-			if (!ret) throw new Error('Invalid ' + type + ' index: ' + word);
-			break;
-		case 'string':
-			var match = translated.filter(function(name){
-				return this.test(name);
-			}, new RegExp('^' + word, 'i'));
-			if (!match.length) throw new Error('Invalid ' + type + ' string');
-			if (match.length > 1) throw new Error('Ambiguous ' + type);
-			ret = match[0];
-	}
-
-	return (num) ? translated.indexOf(ret) : ret;
-};
-
-var startCentury = 1900,
-	startYear = 70;
-
-Date.extend({
-
-	getMsg: function(key, args){
-		return Locale.get('Date.' + key, args);
-	},
-
-	units: {
-		ms: Function.from(1),
-		second: Function.from(1000),
-		minute: Function.from(60000),
-		hour: Function.from(3600000),
-		day: Function.from(86400000),
-		week: Function.from(608400000),
-		month: function(month, year){
-			var d = new Date;
-			return Date.daysInMonth(month != null ? month : d.get('mo'), year != null ? year : d.get('year')) * 86400000;
-		},
-		year: function(year){
-			year = year || new Date().get('year');
-			return Date.isLeapYear(year) ? 31622400000 : 31536000000;
-		}
-	},
-
-	daysInMonth: function(month, year){
-		return [31, Date.isLeapYear(year) ? 29 : 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31][month];
-	},
-
-	isLeapYear: function(year){
-		return ((year % 4 === 0) && (year % 100 !== 0)) || (year % 400 === 0);
-	},
-
-	parse: function(from){
-		var t = typeOf(from);
-		if (t == 'number') return new Date(from);
-		if (t != 'string') return from;
-		from = from.clean();
-		if (!from.length) return null;
-
-		var parsed;
-		parsePatterns.some(function(pattern){
-			var bits = pattern.re.exec(from);
-			return (bits) ? (parsed = pattern.handler(bits)) : false;
-		});
-
-		if (!(parsed && parsed.isValid())){
-			parsed = new Date(nativeParse(from));
-			if (!(parsed && parsed.isValid())) parsed = new Date(from.toInt());
-		}
-		return parsed;
-	},
-
-	parseDay: function(day, num){
-		return parseWord('day', day, num);
-	},
-
-	parseMonth: function(month, num){
-		return parseWord('month', month, num);
-	},
-
-	parseUTC: function(value){
-		var localDate = new Date(value);
-		var utcSeconds = Date.UTC(
-			localDate.get('year'),
-			localDate.get('mo'),
-			localDate.get('date'),
-			localDate.get('hr'),
-			localDate.get('min'),
-			localDate.get('sec'),
-			localDate.get('ms')
-		);
-		return new Date(utcSeconds);
-	},
-
-	orderIndex: function(unit){
-		return Date.getMsg('dateOrder').indexOf(unit) + 1;
-	},
-
-	defineFormat: function(name, format){
-		formats[name] = format;
-		return this;
-	},
-
-	defineFormats: function(formats){
-		for (var name in formats) Date.defineFormat(name, formats[name]);
-		return this;
-	},
-
-	//<1.2compat>
-	parsePatterns: parsePatterns,
-	//</1.2compat>
-
-	defineParser: function(pattern){
-		parsePatterns.push((pattern.re && pattern.handler) ? pattern : build(pattern));
-		return this;
-	},
-
-	defineParsers: function(){
-		Array.flatten(arguments).each(Date.defineParser);
-		return this;
-	},
-
-	define2DigitYearStart: function(year){
-		startYear = year % 100;
-		startCentury = year - startYear;
-		return this;
-	}
-
-});
-
-var regexOf = function(type){
-	return new RegExp('(?:' + Date.getMsg(type).map(function(name){
-		return name.substr(0, 3);
-	}).join('|') + ')[a-z]*');
-};
-
-var replacers = function(key){
-	switch (key){
-		case 'T':
-			return '%H:%M:%S';
-		case 'x': // iso8601 covers yyyy-mm-dd, so just check if month is first
-			return ((Date.orderIndex('month') == 1) ? '%m[-./]%d' : '%d[-./]%m') + '([-./]%y)?';
-		case 'X':
-			return '%H([.:]%M)?([.:]%S([.:]%s)?)? ?%p? ?%z?';
-	}
-	return null;
-};
-
-var keys = {
-	d: /[0-2]?[0-9]|3[01]/,
-	H: /[01]?[0-9]|2[0-3]/,
-	I: /0?[1-9]|1[0-2]/,
-	M: /[0-5]?\d/,
-	s: /\d+/,
-	o: /[a-z]*/,
-	p: /[ap]\.?m\.?/,
-	y: /\d{2}|\d{4}/,
-	Y: /\d{4}/,
-	z: /Z|[+-]\d{2}(?::?\d{2})?/
-};
-
-keys.m = keys.I;
-keys.S = keys.M;
-
-var currentLanguage;
-
-var recompile = function(language){
-	currentLanguage = language;
-
-	keys.a = keys.A = regexOf('days');
-	keys.b = keys.B = regexOf('months');
-
-	parsePatterns.each(function(pattern, i){
-		if (pattern.format) parsePatterns[i] = build(pattern.format);
-	});
-};
-
-var build = function(format){
-	if (!currentLanguage) return {format: format};
-
-	var parsed = [];
-	var re = (format.source || format) // allow format to be regex
-	 .replace(/%([a-z])/gi,
-		function($0, $1){
-			return replacers($1) || $0;
-		}
-	).replace(/\((?!\?)/g, '(?:') // make all groups non-capturing
-	 .replace(/ (?!\?|\*)/g, ',? ') // be forgiving with spaces and commas
-	 .replace(/%([a-z%])/gi,
-		function($0, $1){
-			var p = keys[$1];
-			if (!p) return $1;
-			parsed.push($1);
-			return '(' + p.source + ')';
-		}
-	).replace(/\[a-z\]/gi, '[a-z\\u00c0-\\uffff;\&]'); // handle unicode words
-
-	return {
-		format: format,
-		re: new RegExp('^' + re + '$', 'i'),
-		handler: function(bits){
-			bits = bits.slice(1).associate(parsed);
-			var date = new Date().clearTime(),
-				year = bits.y || bits.Y;
-
-			if (year != null) handle.call(date, 'y', year); // need to start in the right year
-			if ('d' in bits) handle.call(date, 'd', 1);
-			if ('m' in bits || bits.b || bits.B) handle.call(date, 'm', 1);
-
-			for (var key in bits) handle.call(date, key, bits[key]);
-			return date;
-		}
-	};
-};
-
-var handle = function(key, value){
-	if (!value) return this;
-
-	switch (key){
-		case 'a': case 'A': return this.set('day', Date.parseDay(value, true));
-		case 'b': case 'B': return this.set('mo', Date.parseMonth(value, true));
-		case 'd': return this.set('date', value);
-		case 'H': case 'I': return this.set('hr', value);
-		case 'm': return this.set('mo', value - 1);
-		case 'M': return this.set('min', value);
-		case 'p': return this.set('ampm', value.replace(/\./g, ''));
-		case 'S': return this.set('sec', value);
-		case 's': return this.set('ms', ('0.' + value) * 1000);
-		case 'w': return this.set('day', value);
-		case 'Y': return this.set('year', value);
-		case 'y':
-			value = +value;
-			if (value < 100) value += startCentury + (value < startYear ? 100 : 0);
-			return this.set('year', value);
-		case 'z':
-			if (value == 'Z') value = '+00';
-			var offset = value.match(/([+-])(\d{2}):?(\d{2})?/);
-			offset = (offset[1] + '1') * (offset[2] * 60 + (+offset[3] || 0)) + this.getTimezoneOffset();
-			return this.set('time', this - offset * 60000);
-	}
-
-	return this;
-};
-
-Date.defineParsers(
-	'%Y([-./]%m([-./]%d((T| )%X)?)?)?', // "1999-12-31", "1999-12-31 11:59pm", "1999-12-31 23:59:59", ISO8601
-	'%Y%m%d(T%H(%M%S?)?)?', // "19991231", "19991231T1159", compact
-	'%x( %X)?', // "12/31", "12.31.99", "12-31-1999", "12/31/2008 11:59 PM"
-	'%d%o( %b( %Y)?)?( %X)?', // "31st", "31st December", "31 Dec 1999", "31 Dec 1999 11:59pm"
-	'%b( %d%o)?( %Y)?( %X)?', // Same as above with month and day switched
-	'%Y %b( %d%o( %X)?)?', // Same as above with year coming first
-	'%o %b %d %X %z %Y', // "Thu Oct 22 08:11:23 +0000 2009"
-	'%T', // %H:%M:%S
-	'%H:%M( ?%p)?' // "11:05pm", "11:05 am" and "11:05"
-);
-
-Locale.addEvent('change', function(language){
-	if (Locale.get('Date')) recompile(language);
-}).fireEvent('change', Locale.getCurrent());
-
-})();
-
-
-/*
----
-
-script: Date.Extras.js
-
-name: Date.Extras
-
-description: Extends the Date native object to include extra methods (on top of those in Date.js).
-
-license: MIT-style license
-
-authors:
-  - Aaron Newton
-  - Scott Kyle
-
-requires:
-  - /Date
-
-provides: [Date.Extras]
-
-...
-*/
-
-Date.implement({
-
-	timeDiffInWords: function(to){
-		return Date.distanceOfTimeInWords(this, to || new Date);
-	},
-
-	timeDiff: function(to, separator){
-		if (to == null) to = new Date;
-		var delta = ((to - this) / 1000).floor().abs();
-
-		var vals = [],
-			durations = [60, 60, 24, 365, 0],
-			names = ['s', 'm', 'h', 'd', 'y'],
-			value, duration;
-
-		for (var item = 0; item < durations.length; item++){
-			if (item && !delta) break;
-			value = delta;
-			if ((duration = durations[item])){
-				value = (delta % duration);
-				delta = (delta / duration).floor();
-			}
-			vals.unshift(value + (names[item] || ''));
-		}
-
-		return vals.join(separator || ':');
-	}
-
-}).extend({
-
-	distanceOfTimeInWords: function(from, to){
-		return Date.getTimePhrase(((to - from) / 1000).toInt());
-	},
-
-	getTimePhrase: function(delta){
-		var suffix = (delta < 0) ? 'Until' : 'Ago';
-		if (delta < 0) delta *= -1;
-
-		var units = {
-			minute: 60,
-			hour: 60,
-			day: 24,
-			week: 7,
-			month: 52 / 12,
-			year: 12,
-			eon: Infinity
-		};
-
-		var msg = 'lessThanMinute';
-
-		for (var unit in units){
-			var interval = units[unit];
-			if (delta < 1.5 * interval){
-				if (delta > 0.75 * interval) msg = unit;
-				break;
-			}
-			delta /= interval;
-			msg = unit + 's';
-		}
-
-		delta = delta.round();
-		return Date.getMsg(msg + suffix, delta).substitute({delta: delta});
-	}
-
-}).defineParsers(
-
-	{
-		// "today", "tomorrow", "yesterday"
-		re: /^(?:tod|tom|yes)/i,
-		handler: function(bits){
-			var d = new Date().clearTime();
-			switch (bits[0]){
-				case 'tom': return d.increment();
-				case 'yes': return d.decrement();
-				default: return d;
-			}
-		}
-	},
-
-	{
-		// "next Wednesday", "last Thursday"
-		re: /^(next|last) ([a-z]+)$/i,
-		handler: function(bits){
-			var d = new Date().clearTime();
-			var day = d.getDay();
-			var newDay = Date.parseDay(bits[2], true);
-			var addDays = newDay - day;
-			if (newDay <= day) addDays += 7;
-			if (bits[1] == 'last') addDays -= 7;
-			return d.set('date', d.getDate() + addDays);
-		}
-	}
-
-).alias('timeAgoInWords', 'timeDiffInWords');
-
-
-/*
----
-
-name: Locale.en-US.Number
-
-description: Number messages for US English.
-
-license: MIT-style license
-
-authors:
-  - Arian Stolwijk
-
-requires:
-  - /Locale
-
-provides: [Locale.en-US.Number]
-
-...
-*/
-
-Locale.define('en-US', 'Number', {
-
-	decimal: '.',
-	group: ',',
-
-/* 	Commented properties are the defaults for Number.format
-	decimals: 0,
-	precision: 0,
-	scientific: null,
-
-	prefix: null,
-	suffic: null,
-
-	// Negative/Currency/percentage will mixin Number
-	negative: {
-		prefix: '-'
-	},*/
-
-	currency: {
-//		decimals: 2,
-		prefix: '$ '
-	}/*,
-
-	percentage: {
-		decimals: 2,
-		suffix: '%'
-	}*/
-
-});
-
-
-
-
-/*
----
-name: Number.Format
-description: Extends the Number Type object to include a number formatting method.
-license: MIT-style license
-authors: [Arian Stolwijk]
-requires: [Core/Number, Locale.en-US.Number]
-# Number.Extras is for compatibility
-provides: [Number.Format, Number.Extras]
-...
-*/
-
-
-Number.implement({
-
-	format: function(options){
-		// Thanks dojo and YUI for some inspiration
-		var value = this;
-		options = options ? Object.clone(options) : {};
-		var getOption = function(key){
-			if (options[key] != null) return options[key];
-			return Locale.get('Number.' + key);
-		};
-
-		var negative = value < 0,
-			decimal = getOption('decimal'),
-			precision = getOption('precision'),
-			group = getOption('group'),
-			decimals = getOption('decimals');
-
-		if (negative){
-			var negativeLocale = getOption('negative') || {};
-			if (negativeLocale.prefix == null && negativeLocale.suffix == null) negativeLocale.prefix = '-';
-			['prefix', 'suffix'].each(function(key){
-				if (negativeLocale[key]) options[key] = getOption(key) + negativeLocale[key];
-			});
-
-			value = -value;
-		}
-
-		var prefix = getOption('prefix'),
-			suffix = getOption('suffix');
-
-		if (decimals !== '' && decimals >= 0 && decimals <= 20) value = value.toFixed(decimals);
-		if (precision >= 1 && precision <= 21) value = (+value).toPrecision(precision);
-
-		value += '';
-		var index;
-		if (getOption('scientific') === false && value.indexOf('e') > -1){
-			var match = value.split('e'),
-				zeros = +match[1];
-			value = match[0].replace('.', '');
-
-			if (zeros < 0){
-				zeros = -zeros - 1;
-				index = match[0].indexOf('.');
-				if (index > -1) zeros -= index - 1;
-				while (zeros--) value = '0' + value;
-				value = '0.' + value;
-			} else {
-				index = match[0].lastIndexOf('.');
-				if (index > -1) zeros -= match[0].length - index - 1;
-				while (zeros--) value += '0';
-			}
-		}
-
-		if (decimal != '.') value = value.replace('.', decimal);
-
-		if (group){
-			index = value.lastIndexOf(decimal);
-			index = (index > -1) ? index : value.length;
-			var newOutput = value.substring(index),
-				i = index;
-
-			while (i--){
-				if ((index - i - 1) % 3 == 0 && i != (index - 1)) newOutput = group + newOutput;
-				newOutput = value.charAt(i) + newOutput;
-			}
-
-			value = newOutput;
-		}
-
-		if (prefix) value = prefix + value;
-		if (suffix) value += suffix;
-
-		return value;
-	},
-
-	formatCurrency: function(){
-		var locale = Locale.get('Number.currency') || {};
-		if (locale.scientific == null) locale.scientific = false;
-		if (locale.decimals == null) locale.decimals = 2;
-
-		return this.format(locale);
-	},
-
-	formatPercentage: function(){
-		var locale = Locale.get('Number.percentage') || {};
-		if (locale.suffix == null) locale.suffix = '%';
-		if (locale.decimals == null) locale.decimals = 2;
-
-		return this.format(locale);
-	}
-
-});
-
-
-/*
----
-
-script: String.Extras.js
-
-name: String.Extras
-
-description: Extends the String native object to include methods useful in managing various kinds of strings (query strings, urls, html, etc).
-
-license: MIT-style license
-
-authors:
-  - Aaron Newton
-  - Guillermo Rauch
-  - Christopher Pitt
-
-requires:
-  - Core/String
-  - Core/Array
-  - MooTools.More
-
-provides: [String.Extras]
-
-...
-*/
-
-(function(){
-
-var special = {
-	'a': /[àáâãäåăą]/g,
-	'A': /[ÀÁÂÃÄÅĂĄ]/g,
-	'c': /[ćčç]/g,
-	'C': /[ĆČÇ]/g,
-	'd': /[ďđ]/g,
-	'D': /[ĎÐ]/g,
-	'e': /[èéêëěę]/g,
-	'E': /[ÈÉÊËĚĘ]/g,
-	'g': /[ğ]/g,
-	'G': /[Ğ]/g,
-	'i': /[ìíîï]/g,
-	'I': /[ÌÍÎÏ]/g,
-	'l': /[ĺľł]/g,
-	'L': /[ĹĽŁ]/g,
-	'n': /[ñňń]/g,
-	'N': /[ÑŇŃ]/g,
-	'o': /[òóôõöøő]/g,
-	'O': /[ÒÓÔÕÖØ]/g,
-	'r': /[řŕ]/g,
-	'R': /[ŘŔ]/g,
-	's': /[ššş]/g,
-	'S': /[ŠŞŚ]/g,
-	't': /[ťţ]/g,
-	'T': /[ŤŢ]/g,
-	'ue': /[ü]/g,
-	'UE': /[Ü]/g,
-	'u': /[ùúûůµ]/g,
-	'U': /[ÙÚÛŮ]/g,
-	'y': /[ÿý]/g,
-	'Y': /[ŸÝ]/g,
-	'z': /[žźż]/g,
-	'Z': /[ŽŹŻ]/g,
-	'th': /[þ]/g,
-	'TH': /[Þ]/g,
-	'dh': /[ð]/g,
-	'DH': /[Ð]/g,
-	'ss': /[ß]/g,
-	'oe': /[œ]/g,
-	'OE': /[Œ]/g,
-	'ae': /[æ]/g,
-	'AE': /[Æ]/g
-},
-
-tidy = {
-	' ': /[\xa0\u2002\u2003\u2009]/g,
-	'*': /[\xb7]/g,
-	'\'': /[\u2018\u2019]/g,
-	'"': /[\u201c\u201d]/g,
-	'...': /[\u2026]/g,
-	'-': /[\u2013]/g,
-//	'--': /[\u2014]/g,
-	'&raquo;': /[\uFFFD]/g
-};
-
-var walk = function(string, replacements){
-	var result = string, key;
-	for (key in replacements) result = result.replace(replacements[key], key);
-	return result;
-};
-
-var getRegexForTag = function(tag, contents){
-	tag = tag || '';
-	var regstr = contents ? "<" + tag + "(?!\\w)[^>]*>([\\s\\S]*?)<\/" + tag + "(?!\\w)>" : "<\/?" + tag + "([^>]+)?>",
-		reg = new RegExp(regstr, "gi");
-	return reg;
-};
-
-String.implement({
-
-	standardize: function(){
-		return walk(this, special);
-	},
-
-	repeat: function(times){
-		return new Array(times + 1).join(this);
-	},
-
-	pad: function(length, str, direction){
-		if (this.length >= length) return this;
-
-		var pad = (str == null ? ' ' : '' + str)
-			.repeat(length - this.length)
-			.substr(0, length - this.length);
-
-		if (!direction || direction == 'right') return this + pad;
-		if (direction == 'left') return pad + this;
-
-		return pad.substr(0, (pad.length / 2).floor()) + this + pad.substr(0, (pad.length / 2).ceil());
-	},
-
-	getTags: function(tag, contents){
-		return this.match(getRegexForTag(tag, contents)) || [];
-	},
-
-	stripTags: function(tag, contents){
-		return this.replace(getRegexForTag(tag, contents), '');
-	},
-
-	tidy: function(){
-		return walk(this, tidy);
-	},
-
-	truncate: function(max, trail, atChar){
-		var string = this;
-		if (trail == null && arguments.length == 1) trail = '…';
-		if (string.length > max){
-			string = string.substring(0, max);
-			if (atChar){
-				var index = string.lastIndexOf(atChar);
-				if (index != -1) string = string.substr(0, index);
-			}
-			if (trail) string += trail;
-		}
-		return string;
-	}
-
-});
-
-})();
-
-
-/*
----
-
-script: String.QueryString.js
-
-name: String.QueryString
-
-description: Methods for dealing with URI query strings.
-
-license: MIT-style license
-
-authors:
-  - Sebastian Markbåge
-  - Aaron Newton
-  - Lennart Pilon
-  - Valerio Proietti
-
-requires:
-  - Core/Array
-  - Core/String
-  - /MooTools.More
-
-provides: [String.QueryString]
-
-...
-*/
-
-String.implement({
-
-	parseQueryString: function(decodeKeys, decodeValues){
-		if (decodeKeys == null) decodeKeys = true;
-		if (decodeValues == null) decodeValues = true;
-
-		var vars = this.split(/[&;]/),
-			object = {};
-		if (!vars.length) return object;
-
-		vars.each(function(val){
-			var index = val.indexOf('=') + 1,
-				value = index ? val.substr(index) : '',
-				keys = index ? val.substr(0, index - 1).match(/([^\]\[]+|(\B)(?=\]))/g) : [val],
-				obj = object;
-			if (!keys) return;
-			if (decodeValues) value = decodeURIComponent(value);
-			keys.each(function(key, i){
-				if (decodeKeys) key = decodeURIComponent(key);
-				var current = obj[key];
-
-				if (i < keys.length - 1) obj = obj[key] = current || {};
-				else if (typeOf(current) == 'array') current.push(value);
-				else obj[key] = current != null ? [current, value] : value;
-			});
-		});
-
-		return object;
-	},
-
-	cleanQueryString: function(method){
-		return this.split('&').filter(function(val){
-			var index = val.indexOf('='),
-				key = index < 0 ? '' : val.substr(0, index),
-				value = val.substr(index + 1);
-
-			return method ? method.call(null, key, value) : (value || value === 0);
-		}).join('&');
-	}
-
-});
-
-
-/*
----
-
-script: URI.js
-
-name: URI
-
-description: Provides methods useful in managing the window location and uris.
-
-license: MIT-style license
-
-authors:
-  - Sebastian Markbåge
-  - Aaron Newton
-
-requires:
-  - Core/Object
-  - Core/Class
-  - Core/Class.Extras
-  - Core/Element
-  - /String.QueryString
-
-provides: [URI]
-
-...
-*/
-
-(function(){
-
-var toString = function(){
-	return this.get('value');
-};
-
-var URI = this.URI = new Class({
-
-	Implements: Options,
-
-	options: {
-		/*base: false*/
-	},
-
-	regex: /^(?:(\w+):)?(?:\/\/(?:(?:([^:@\/]*):?([^:@\/]*))?@)?([^:\/?#]*)(?::(\d*))?)?(\.\.?$|(?:[^?#\/]*\/)*)([^?#]*)(?:\?([^#]*))?(?:#(.*))?/,
-	parts: ['scheme', 'user', 'password', 'host', 'port', 'directory', 'file', 'query', 'fragment'],
-	schemes: {http: 80, https: 443, ftp: 21, rtsp: 554, mms: 1755, file: 0},
-
-	initialize: function(uri, options){
-		this.setOptions(options);
-		var base = this.options.base || URI.base;
-		if (!uri) uri = base;
-
-		if (uri && uri.parsed) this.parsed = Object.clone(uri.parsed);
-		else this.set('value', uri.href || uri.toString(), base ? new URI(base) : false);
-	},
-
-	parse: function(value, base){
-		var bits = value.match(this.regex);
-		if (!bits) return false;
-		bits.shift();
-		return this.merge(bits.associate(this.parts), base);
-	},
-
-	merge: function(bits, base){
-		if ((!bits || !bits.scheme) && (!base || !base.scheme)) return false;
-		if (base){
-			this.parts.every(function(part){
-				if (bits[part]) return false;
-				bits[part] = base[part] || '';
-				return true;
-			});
-		}
-		bits.port = bits.port || this.schemes[bits.scheme.toLowerCase()];
-		bits.directory = bits.directory ? this.parseDirectory(bits.directory, base ? base.directory : '') : '/';
-		return bits;
-	},
-
-	parseDirectory: function(directory, baseDirectory){
-		directory = (directory.substr(0, 1) == '/' ? '' : (baseDirectory || '/')) + directory;
-		if (!directory.test(URI.regs.directoryDot)) return directory;
-		var result = [];
-		directory.replace(URI.regs.endSlash, '').split('/').each(function(dir){
-			if (dir == '..' && result.length > 0) result.pop();
-			else if (dir != '.') result.push(dir);
-		});
-		return result.join('/') + '/';
-	},
-
-	combine: function(bits){
-		return bits.value || bits.scheme + '://' +
-			(bits.user ? bits.user + (bits.password ? ':' + bits.password : '') + '@' : '') +
-			(bits.host || '') + (bits.port && bits.port != this.schemes[bits.scheme] ? ':' + bits.port : '') +
-			(bits.directory || '/') + (bits.file || '') +
-			(bits.query ? '?' + bits.query : '') +
-			(bits.fragment ? '#' + bits.fragment : '');
-	},
-
-	set: function(part, value, base){
-		if (part == 'value'){
-			var scheme = value.match(URI.regs.scheme);
-			if (scheme) scheme = scheme[1];
-			if (scheme && this.schemes[scheme.toLowerCase()] == null) this.parsed = { scheme: scheme, value: value };
-			else this.parsed = this.parse(value, (base || this).parsed) || (scheme ? { scheme: scheme, value: value } : { value: value });
-		} else if (part == 'data'){
-			this.setData(value);
-		} else {
-			this.parsed[part] = value;
-		}
-		return this;
-	},
-
-	get: function(part, base){
-		switch (part){
-			case 'value': return this.combine(this.parsed, base ? base.parsed : false);
-			case 'data' : return this.getData();
-		}
-		return this.parsed[part] || '';
-	},
-
-	go: function(){
-		document.location.href = this.toString();
-	},
-
-	toURI: function(){
-		return this;
-	},
-
-	getData: function(key, part){
-		var qs = this.get(part || 'query');
-		if (!(qs || qs === 0)) return key ? null : {};
-		var obj = qs.parseQueryString();
-		return key ? obj[key] : obj;
-	},
-
-	setData: function(values, merge, part){
-		if (typeof values == 'string'){
-			var data = this.getData();
-			data[arguments[0]] = arguments[1];
-			values = data;
-		} else if (merge){
-			values = Object.merge(this.getData(), values);
-		}
-		return this.set(part || 'query', Object.toQueryString(values));
-	},
-
-	clearData: function(part){
-		return this.set(part || 'query', '');
-	},
-
-	toString: toString,
-	valueOf: toString
-
-});
-
-URI.regs = {
-	endSlash: /\/$/,
-	scheme: /^(\w+):/,
-	directoryDot: /\.\/|\.$/
-};
-
-URI.base = new URI(Array.from(document.getElements('base[href]', true)).getLast(), {base: document.location});
-
-String.implement({
-
-	toURI: function(options){
-		return new URI(this, options);
-	}
-
-});
-
-})();
-
-
-/*
----
-
-script: URI.Relative.js
-
-name: URI.Relative
-
-description: Extends the URI class to add methods for computing relative and absolute urls.
-
-license: MIT-style license
-
-authors:
-  - Sebastian Markbåge
-
-
-requires:
-  - /Class.refactor
-  - /URI
-
-provides: [URI.Relative]
-
-...
-*/
-
-URI = Class.refactor(URI, {
-
-	combine: function(bits, base){
-		if (!base || bits.scheme != base.scheme || bits.host != base.host || bits.port != base.port)
-			return this.previous.apply(this, arguments);
-		var end = bits.file + (bits.query ? '?' + bits.query : '') + (bits.fragment ? '#' + bits.fragment : '');
-
-		if (!base.directory) return (bits.directory || (bits.file ? '' : './')) + end;
-
-		var baseDir = base.directory.split('/'),
-			relDir = bits.directory.split('/'),
-			path = '',
-			offset;
-
-		var i = 0;
-		for (offset = 0; offset < baseDir.length && offset < relDir.length && baseDir[offset] == relDir[offset]; offset++);
-		for (i = 0; i < baseDir.length - offset - 1; i++) path += '../';
-		for (i = offset; i < relDir.length - 1; i++) path += relDir[i] + '/';
-
-		return (path || (bits.file ? '' : './')) + end;
-	},
-
-	toAbsolute: function(base){
-		base = new URI(base);
-		if (base) base.set('directory', '').set('file', '');
-		return this.toRelative(base);
-	},
-
-	toRelative: function(base){
-		return this.get('value', new URI(base));
-	}
-
-});
-
-
-/*
----
-
-name: Hash
-
-description: Contains Hash Prototypes. Provides a means for overcoming the JavaScript practical impossibility of extending native Objects.
-
-license: MIT-style license.
-
-requires:
-  - Core/Object
-  - /MooTools.More
-
-provides: [Hash]
-
-...
-*/
-
-(function(){
-
-if (this.Hash) return;
-
-var Hash = this.Hash = new Type('Hash', function(object){
-	if (typeOf(object) == 'hash') object = Object.clone(object.getClean());
-	for (var key in object) this[key] = object[key];
-	return this;
-});
-
-this.$H = function(object){
-	return new Hash(object);
-};
-
-Hash.implement({
-
-	forEach: function(fn, bind){
-		Object.forEach(this, fn, bind);
-	},
-
-	getClean: function(){
-		var clean = {};
-		for (var key in this){
-			if (this.hasOwnProperty(key)) clean[key] = this[key];
-		}
-		return clean;
-	},
-
-	getLength: function(){
-		var length = 0;
-		for (var key in this){
-			if (this.hasOwnProperty(key)) length++;
-		}
-		return length;
-	}
-
-});
-
-Hash.alias('each', 'forEach');
-
-Hash.implement({
-
-	has: Object.prototype.hasOwnProperty,
-
-	keyOf: function(value){
-		return Object.keyOf(this, value);
-	},
-
-	hasValue: function(value){
-		return Object.contains(this, value);
-	},
-
-	extend: function(properties){
-		Hash.each(properties || {}, function(value, key){
-			Hash.set(this, key, value);
-		}, this);
-		return this;
-	},
-
-	combine: function(properties){
-		Hash.each(properties || {}, function(value, key){
-			Hash.include(this, key, value);
-		}, this);
-		return this;
-	},
-
-	erase: function(key){
-		if (this.hasOwnProperty(key)) delete this[key];
-		return this;
-	},
-
-	get: function(key){
-		return (this.hasOwnProperty(key)) ? this[key] : null;
-	},
-
-	set: function(key, value){
-		if (!this[key] || this.hasOwnProperty(key)) this[key] = value;
-		return this;
-	},
-
-	empty: function(){
-		Hash.each(this, function(value, key){
-			delete this[key];
-		}, this);
-		return this;
-	},
-
-	include: function(key, value){
-		if (this[key] == undefined) this[key] = value;
-		return this;
-	},
-
-	map: function(fn, bind){
-		return new Hash(Object.map(this, fn, bind));
-	},
-
-	filter: function(fn, bind){
-		return new Hash(Object.filter(this, fn, bind));
-	},
-
-	every: function(fn, bind){
-		return Object.every(this, fn, bind);
-	},
-
-	some: function(fn, bind){
-		return Object.some(this, fn, bind);
-	},
-
-	getKeys: function(){
-		return Object.keys(this);
-	},
-
-	getValues: function(){
-		return Object.values(this);
-	},
-
-	toQueryString: function(base){
-		return Object.toQueryString(this, base);
-	}
-
-});
-
-Hash.alias({indexOf: 'keyOf', contains: 'hasValue'});
-
-
-})();
-
-
-
-/*
----
-
-script: Hash.Extras.js
-
-name: Hash.Extras
-
-description: Extends the Hash Type to include getFromPath which allows a path notation to child elements.
-
-license: MIT-style license
-
-authors:
-  - Aaron Newton
-
-requires:
-  - /Hash
-  - /Object.Extras
-
-provides: [Hash.Extras]
-
-...
-*/
-
-Hash.implement({
-
-	getFromPath: function(notation){
-		return Object.getFromPath(this, notation);
-	},
-
-	cleanValues: function(method){
-		return new Hash(Object.cleanValues(this, method));
-	},
-
-	run: function(){
-		Object.run(arguments);
-	}
-
-});
-
-
-/*
----
-
-script: Element.Forms.js
-
-name: Element.Forms
-
-description: Extends the Element native object to include methods useful in managing inputs.
-
-license: MIT-style license
-
-authors:
-  - Aaron Newton
-
-requires:
-  - Core/Element
-  - /String.Extras
-  - /MooTools.More
-
-provides: [Element.Forms]
-
-...
-*/
-
-Element.implement({
-
-	tidy: function(){
-		this.set('value', this.get('value').tidy());
-	},
-
-	getTextInRange: function(start, end){
-		return this.get('value').substring(start, end);
-	},
-
-	getSelectedText: function(){
-		if (this.setSelectionRange) return this.getTextInRange(this.getSelectionStart(), this.getSelectionEnd());
-		return document.selection.createRange().text;
-	},
-
-	getSelectedRange: function(){
-		if (this.selectionStart != null){
-			return {
-				start: this.selectionStart,
-				end: this.selectionEnd
-			};
-		}
-
-		var pos = {
-			start: 0,
-			end: 0
-		};
-		var range = this.getDocument().selection.createRange();
-		if (!range || range.parentElement() != this) return pos;
-		var duplicate = range.duplicate();
-
-		if (this.type == 'text'){
-			pos.start = 0 - duplicate.moveStart('character', -100000);
-			pos.end = pos.start + range.text.length;
-		} else {
-			var value = this.get('value');
-			var offset = value.length;
-			duplicate.moveToElementText(this);
-			duplicate.setEndPoint('StartToEnd', range);
-			if (duplicate.text.length) offset -= value.match(/[\n\r]*$/)[0].length;
-			pos.end = offset - duplicate.text.length;
-			duplicate.setEndPoint('StartToStart', range);
-			pos.start = offset - duplicate.text.length;
-		}
-		return pos;
-	},
-
-	getSelectionStart: function(){
-		return this.getSelectedRange().start;
-	},
-
-	getSelectionEnd: function(){
-		return this.getSelectedRange().end;
-	},
-
-	setCaretPosition: function(pos){
-		if (pos == 'end') pos = this.get('value').length;
-		this.selectRange(pos, pos);
-		return this;
-	},
-
-	getCaretPosition: function(){
-		return this.getSelectedRange().start;
-	},
-
-	selectRange: function(start, end){
-		if (this.setSelectionRange){
-			this.focus();
-			this.setSelectionRange(start, end);
-		} else {
-			var value = this.get('value');
-			var diff = value.substr(start, end - start).replace(/\r/g, '').length;
-			start = value.substr(0, start).replace(/\r/g, '').length;
-			var range = this.createTextRange();
-			range.collapse(true);
-			range.moveEnd('character', start + diff);
-			range.moveStart('character', start);
-			range.select();
-		}
-		return this;
-	},
-
-	insertAtCursor: function(value, select){
-		var pos = this.getSelectedRange();
-		var text = this.get('value');
-		this.set('value', text.substring(0, pos.start) + value + text.substring(pos.end, text.length));
-		if (select !== false) this.selectRange(pos.start, pos.start + value.length);
-		else this.setCaretPosition(pos.start + value.length);
-		return this;
-	},
-
-	insertAroundCursor: function(options, select){
-		options = Object.append({
-			before: '',
-			defaultMiddle: '',
-			after: ''
-		}, options);
-
-		var value = this.getSelectedText() || options.defaultMiddle;
-		var pos = this.getSelectedRange();
-		var text = this.get('value');
-
-		if (pos.start == pos.end){
-			this.set('value', text.substring(0, pos.start) + options.before + value + options.after + text.substring(pos.end, text.length));
-			this.selectRange(pos.start + options.before.length, pos.end + options.before.length + value.length);
-		} else {
-			var current = text.substring(pos.start, pos.end);
-			this.set('value', text.substring(0, pos.start) + options.before + current + options.after + text.substring(pos.end, text.length));
-			var selStart = pos.start + options.before.length;
-			if (select !== false) this.selectRange(selStart, selStart + current.length);
-			else this.setCaretPosition(selStart + text.length);
-		}
-		return this;
-	}
-
-});
-
-
-/*
----
-
-script: Elements.From.js
-
-name: Elements.From
-
-description: Returns a collection of elements from a string of html.
-
-license: MIT-style license
-
-authors:
-  - Aaron Newton
-
-requires:
-  - Core/String
-  - Core/Element
-  - /MooTools.More
-
-provides: [Elements.from, Elements.From]
-
-...
-*/
-
-Elements.from = function(text, excludeScripts){
-	if (excludeScripts || excludeScripts == null) text = text.stripScripts();
-
-	var container, match = text.match(/^\s*<(t[dhr]|tbody|tfoot|thead)/i);
-
-	if (match){
-		container = new Element('table');
-		var tag = match[1].toLowerCase();
-		if (['td', 'th', 'tr'].contains(tag)){
-			container = new Element('tbody').inject(container);
-			if (tag != 'tr') container = new Element('tr').inject(container);
-		}
-	}
-
-	return (container || new Element('div')).set('html', text).getChildren();
-};
-
-
-/*
----
-
-name: Element.Event.Pseudos
-
-description: Adds the functionality to add pseudo events for Elements
-
-license: MIT-style license
-
-authors:
-  - Arian Stolwijk
-
-requires: [Core/Element.Event, Events.Pseudos]
-
-provides: [Element.Event.Pseudos]
-
-...
-*/
-
-(function(){
-
-var pseudos = {},
-	copyFromEvents = ['once', 'throttle', 'pause'],
-	count = copyFromEvents.length;
-
-while (count--) pseudos[copyFromEvents[count]] = Events.lookupPseudo(copyFromEvents[count]);
-
-Event.definePseudo = function(key, listener){
-	pseudos[key] = Type.isFunction(listener) ? {listener: listener} : listener;
-	return this;
-};
-
-var proto = Element.prototype;
-[Element, Window, Document].invoke('implement', Events.Pseudos(pseudos, proto.addEvent, proto.removeEvent));
-
-})();
-
-
-/*
----
-
-name: Element.Event.Pseudos.Keys
-
-description: Adds functionality fire events if certain keycombinations are pressed
-
-license: MIT-style license
-
-authors:
-  - Arian Stolwijk
-
-requires: [Element.Event.Pseudos]
-
-provides: [Element.Event.Pseudos.Keys]
-
-...
-*/
-
-(function(){
-
-var keysStoreKey = '$moo:keys-pressed',
-	keysKeyupStoreKey = '$moo:keys-keyup';
-
-
-Event.definePseudo('keys', function(split, fn, args){
-
-	var event = args[0],
-		keys = [],
-		pressed = this.retrieve(keysStoreKey, []);
-
-	keys.append(split.value.replace('++', function(){
-		keys.push('+'); // shift++ and shift+++a
-		return '';
-	}).split('+'));
-
-	pressed.include(event.key);
-
-	if (keys.every(function(key){
-		return pressed.contains(key);
-	})) fn.apply(this, args);
-
-	this.store(keysStoreKey, pressed);
-
-	if (!this.retrieve(keysKeyupStoreKey)){
-		var keyup = function(event){
-			(function(){
-				pressed = this.retrieve(keysStoreKey, []).erase(event.key);
-				this.store(keysStoreKey, pressed);
-			}).delay(0, this); // Fix for IE
-		};
-		this.store(keysKeyupStoreKey, keyup).addEvent('keyup', keyup);
-	}
-
-});
-
-Object.append(Event.Keys, {
-	'shift': 16,
-	'control': 17,
-	'alt': 18,
-	'capslock': 20,
-	'pageup': 33,
-	'pagedown': 34,
-	'end': 35,
-	'home': 36,
-	'numlock': 144,
-	'scrolllock': 145,
-	';': 186,
-	'=': 187,
-	',': 188,
-	'-': Browser.firefox ? 109 : 189,
-	'.': 190,
-	'/': 191,
-	'`': 192,
-	'[': 219,
-	'\\': 220,
-	']': 221,
-	"'": 222,
-	'+': 107
-});
-
-})();
-
-
-/*
----
-
-script: Element.Delegation.js
-
-name: Element.Delegation
-
-description: Extends the Element native object to include the delegate method for more efficient event management.
-
-credits:
-  - "Event checking based on the work of Daniel Steigerwald. License: MIT-style license. Copyright: Copyright (c) 2008 Daniel Steigerwald, daniel.steigerwald.cz"
-
-license: MIT-style license
-
-authors:
-  - Aaron Newton
-  - Daniel Steigerwald
-
-requires: [/MooTools.More, Element.Event.Pseudos]
-
-provides: [Element.Delegation]
-
-...
-*/
-
-(function(){
-
-var eventListenerSupport = !(window.attachEvent && !window.addEventListener),
-	nativeEvents = Element.NativeEvents;
-
-nativeEvents.focusin = 2;
-nativeEvents.focusout = 2;
-
-var check = function(split, target, event){
-	var elementEvent = Element.Events[split.event], condition;
-	if (elementEvent) condition = elementEvent.condition;
-	return Slick.match(target, split.value) && (!condition || condition.call(target, event));
-};
-
-var bubbleUp = function(split, event, fn){
-	for (var target = event.target; target && target != this; target = document.id(target.parentNode)){
-		if (target && check(split, target, event)) return fn.call(target, event, target);
-	}
-};
-
-var formObserver = function(eventName){
-
-	var $delegationKey = '$delegation:';
-
-	return {
-		base: 'focusin',
-
-		onRemove: function(element){
-			element.retrieve($delegationKey + 'forms', []).each(function(el){
-				el.retrieve($delegationKey + 'listeners', []).each(function(listener){
-					el.removeEvent(eventName, listener);
-				});
-				el.eliminate($delegationKey + eventName + 'listeners')
-					.eliminate($delegationKey + eventName + 'originalFn');
-			});
-		},
-
-		listener: function(split, fn, args, monitor, options){
-			var event = args[0],
-				forms = this.retrieve($delegationKey + 'forms', []),
-				target = event.target,
-				form = (target.get('tag') == 'form') ? target : event.target.getParent('form');
-
-			if (!form) return;
-
-			var formEvents = form.retrieve($delegationKey + 'originalFn', []),
-				formListeners = form.retrieve($delegationKey + 'listeners', []),
-				self = this;
-
-			forms.include(form);
-			this.store($delegationKey + 'forms', forms);
-
-			if (!formEvents.contains(fn)){
-				var formListener = function(event){
-					bubbleUp.call(self, split, event, fn);
-				};
-				form.addEvent(eventName, formListener);
-
-				formEvents.push(fn);
-				formListeners.push(formListener);
-
-				form.store($delegationKey + eventName + 'originalFn', formEvents)
-					.store($delegationKey + eventName + 'listeners', formListeners);
-			}
-		}
-	};
-};
-
-var inputObserver = function(eventName){
-	return {
-		base: 'focusin',
-		listener: function(split, fn, args){
-			var events = {blur: function(){
-				this.removeEvents(events);
-			}}, self = this;
-			events[eventName] = function(event){
-				bubbleUp.call(self, split, event, fn);
-			};
-			args[0].target.addEvents(events);
-		}
-	};
-};
-
-var eventOptions = {
-	mouseenter: {
-		base: 'mouseover'
-	},
-	mouseleave: {
-		base: 'mouseout'
-	},
-	focus: {
-		base: 'focus' + (eventListenerSupport ? '' : 'in'),
-		args: [true]
-	},
-	blur: {
-		base: eventListenerSupport ? 'blur' : 'focusout',
-		args: [true]
-	}
-};
-
-if (!eventListenerSupport) Object.append(eventOptions, {
-	submit: formObserver('submit'),
-	reset: formObserver('reset'),
-	change: inputObserver('change'),
-	select: inputObserver('select')
-});
-
-Event.definePseudo('relay', {
-	listener: function(split, fn, args){
-		bubbleUp.call(this, split, args[0], fn);
-	},
-	options: eventOptions
-});
-
-})();
-
-
-/*
----
-
-script: Element.Measure.js
-
-name: Element.Measure
-
-description: Extends the Element native object to include methods useful in measuring dimensions.
-
-credits: "Element.measure / .expose methods by Daniel Steigerwald License: MIT-style license. Copyright: Copyright (c) 2008 Daniel Steigerwald, daniel.steigerwald.cz"
-
-license: MIT-style license
-
-authors:
-  - Aaron Newton
-
-requires:
-  - Core/Element.Style
-  - Core/Element.Dimensions
-  - /MooTools.More
-
-provides: [Element.Measure]
-
-...
-*/
-
-(function(){
-
-var getStylesList = function(styles, planes){
-	var list = [];
-	Object.each(planes, function(directions){
-		Object.each(directions, function(edge){
-			styles.each(function(style){
-				list.push(style + '-' + edge + (style == 'border' ? '-width' : ''));
-			});
-		});
-	});
-	return list;
-};
-
-var calculateEdgeSize = function(edge, styles){
-	var total = 0;
-	Object.each(styles, function(value, style){
-		if (style.test(edge)) total = total + value.toInt();
-	});
-	return total;
-};
-
-var isVisible = function(el){
-	return !!(!el || el.offsetHeight || el.offsetWidth);
-};
-
-
-Element.implement({
-
-	measure: function(fn){
-		if (isVisible(this)) return fn.call(this);
-		var parent = this.getParent(),
-			toMeasure = [];
-		while (!isVisible(parent) && parent != document.body){
-			toMeasure.push(parent.expose());
-			parent = parent.getParent();
-		}
-		var restore = this.expose(),
-			result = fn.call(this);
-		restore();
-		toMeasure.each(function(restore){
-			restore();
-		});
-		return result;
-	},
-
-	expose: function(){
-		if (this.getStyle('display') != 'none') return function(){};
-		var before = this.style.cssText;
-		this.setStyles({
-			display: 'block',
-			position: 'absolute',
-			visibility: 'hidden'
-		});
-		return function(){
-			this.style.cssText = before;
-		}.bind(this);
-	},
-
-	getDimensions: function(options){
-		options = Object.merge({computeSize: false}, options);
-		var dim = {x: 0, y: 0};
-
-		var getSize = function(el, options){
-			return (options.computeSize) ? el.getComputedSize(options) : el.getSize();
-		};
-
-		var parent = this.getParent('body');
-
-		if (parent && this.getStyle('display') == 'none'){
-			dim = this.measure(function(){
-				return getSize(this, options);
-			});
-		} else if (parent){
-			try { //safari sometimes crashes here, so catch it
-				dim = getSize(this, options);
-			}catch(e){}
-		}
-
-		return Object.append(dim, (dim.x || dim.x === 0) ? {
-				width: dim.x,
-				height: dim.y
-			} : {
-				x: dim.width,
-				y: dim.height
-			}
-		);
-	},
-
-	getComputedSize: function(options){
-		//<1.2compat>
-		//legacy support for my stupid spelling error
-		if (options && options.plains) options.planes = options.plains;
-		//</1.2compat>
-
-		options = Object.merge({
-			styles: ['padding','border'],
-			planes: {
-				height: ['top','bottom'],
-				width: ['left','right']
-			},
-			mode: 'both'
-		}, options);
-
-		var styles = {},
-			size = {width: 0, height: 0},
-			dimensions;
-
-		if (options.mode == 'vertical'){
-			delete size.width;
-			delete options.planes.width;
-		} else if (options.mode == 'horizontal'){
-			delete size.height;
-			delete options.planes.height;
-		}
-
-		getStylesList(options.styles, options.planes).each(function(style){
-			styles[style] = this.getStyle(style).toInt();
-		}, this);
-
-		Object.each(options.planes, function(edges, plane){
-
-			var capitalized = plane.capitalize(),
-				style = this.getStyle(plane);
-
-			if (style == 'auto' && !dimensions) dimensions = this.getDimensions();
-
-			style = styles[plane] = (style == 'auto') ? dimensions[plane] : style.toInt();
-			size['total' + capitalized] = style;
-
-			edges.each(function(edge){
-				var edgesize = calculateEdgeSize(edge, styles);
-				size['computed' + edge.capitalize()] = edgesize;
-				size['total' + capitalized] += edgesize;
-			});
-
-		}, this);
-
-		return Object.append(size, styles);
-	}
-
-});
-
-})();
-
-
-/*
----
-
-script: Element.Pin.js
-
-name: Element.Pin
-
-description: Extends the Element native object to include the pin method useful for fixed positioning for elements.
-
-license: MIT-style license
-
-authors:
-  - Aaron Newton
-
-requires:
-  - Core/Element.Event
-  - Core/Element.Dimensions
-  - Core/Element.Style
-  - /MooTools.More
-
-provides: [Element.Pin]
-
-...
-*/
-
-(function(){
-	var supportsPositionFixed = false,
-		supportTested = false;
-
-	var testPositionFixed = function(){
-		var test = new Element('div').setStyles({
-			position: 'fixed',
-			top: 0,
-			right: 0
-		}).inject(document.body);
-		supportsPositionFixed = (test.offsetTop === 0);
-		test.dispose();
-		supportTested = true;
-	};
-
-	Element.implement({
-
-		pin: function(enable, forceScroll){
-			if (!supportTested) testPositionFixed();
-			if (this.getStyle('display') == 'none') return this;
-
-			var pinnedPosition,
-				scroll = window.getScroll(),
-				parent,
-				scrollFixer;
-
-			if (enable !== false){
-				pinnedPosition = this.getPosition(supportsPositionFixed ? document.body : this.getOffsetParent());
-				if (!this.retrieve('pin:_pinned')){
-					var currentPosition = {
-						top: pinnedPosition.y - scroll.y,
-						left: pinnedPosition.x - scroll.x
-					};
-
-					if (supportsPositionFixed && !forceScroll){
-						this.setStyle('position', 'fixed').setStyles(currentPosition);
-					} else {
-
-						parent = this.getOffsetParent();
-						var position = this.getPosition(parent),
-							styles = this.getStyles('left', 'top');
-
-						if (parent && styles.left == 'auto' || styles.top == 'auto') this.setPosition(position);
-						if (this.getStyle('position') == 'static') this.setStyle('position', 'absolute');
-
-						position = {
-							x: styles.left.toInt() - scroll.x,
-							y: styles.top.toInt() - scroll.y
-						};
-
-						scrollFixer = function(){
-							if (!this.retrieve('pin:_pinned')) return;
-							var scroll = window.getScroll();
-							this.setStyles({
-								left: position.x + scroll.x,
-								top: position.y + scroll.y
-							});
-						}.bind(this);
-
-						this.store('pin:_scrollFixer', scrollFixer);
-						window.addEvent('scroll', scrollFixer);
-					}
-					this.store('pin:_pinned', true);
-				}
-
-			} else {
-				if (!this.retrieve('pin:_pinned')) return this;
-
-				parent = this.getParent();
-				var offsetParent = (parent.getComputedStyle('position') != 'static' ? parent : parent.getOffsetParent());
-
-				pinnedPosition = this.getPosition(offsetParent);
-
-				this.store('pin:_pinned', false);
-				scrollFixer = this.retrieve('pin:_scrollFixer');
-				if (!scrollFixer){
-					this.setStyles({
-						position: 'absolute',
-						top: pinnedPosition.y + scroll.y,
-						left: pinnedPosition.x + scroll.x
-					});
-				} else {
-					this.store('pin:_scrollFixer', null);
-					window.removeEvent('scroll', scrollFixer);
-				}
-				this.removeClass('isPinned');
-			}
-			return this;
-		},
-
-		unpin: function(){
-			return this.pin(false);
-		},
-
-		togglePin: function(){
-			return this.pin(!this.retrieve('pin:_pinned'));
-		}
-
-	});
-
-//<1.2compat>
-Element.alias('togglepin', 'togglePin');
-//</1.2compat>
-
-})();
-
-
-/*
----
-
-script: Element.Position.js
-
-name: Element.Position
-
-description: Extends the Element native object to include methods useful positioning elements relative to others.
-
-license: MIT-style license
-
-authors:
-  - Aaron Newton
-  - Jacob Thornton
-
-requires:
-  - Core/Options
-  - Core/Element.Dimensions
-  - Element.Measure
-
-provides: [Element.Position]
-
-...
-*/
-
-(function(original){
-
-var local = Element.Position = {
-
-	options: {/*
-		edge: false,
-		returnPos: false,
-		minimum: {x: 0, y: 0},
-		maximum: {x: 0, y: 0},
-		relFixedPosition: false,
-		ignoreMargins: false,
-		ignoreScroll: false,
-		allowNegative: false,*/
-		relativeTo: document.body,
-		position: {
-			x: 'center', //left, center, right
-			y: 'center' //top, center, bottom
-		},
-		offset: {x: 0, y: 0}
-	},
-
-	getOptions: function(element, options){
-		options = Object.merge({}, local.options, options);
-		local.setPositionOption(options);
-		local.setEdgeOption(options);
-		local.setOffsetOption(element, options);
-		local.setDimensionsOption(element, options);
-		return options;
-	},
-
-	setPositionOption: function(options){
-		options.position = local.getCoordinateFromValue(options.position);
-	},
-
-	setEdgeOption: function(options){
-		var edgeOption = local.getCoordinateFromValue(options.edge);
-		options.edge = edgeOption ? edgeOption :
-			(options.position.x == 'center' && options.position.y == 'center') ? {x: 'center', y: 'center'} :
-			{x: 'left', y: 'top'};
-	},
-
-	setOffsetOption: function(element, options){
-		var parentOffset = {x: 0, y: 0},
-			offsetParent = element.measure(function(){
-				return document.id(this.getOffsetParent());
-			}),
-			parentScroll = offsetParent.getScroll();
-
-		if (!offsetParent || offsetParent == element.getDocument().body) return;
-		parentOffset = offsetParent.measure(function(){
-			var position = this.getPosition();
-			if (this.getStyle('position') == 'fixed'){
-				var scroll = window.getScroll();
-				position.x += scroll.x;
-				position.y += scroll.y;
-			}
-			return position;
-		});
-
-		options.offset = {
-			parentPositioned: offsetParent != document.id(options.relativeTo),
-			x: options.offset.x - parentOffset.x + parentScroll.x,
-			y: options.offset.y - parentOffset.y + parentScroll.y
-		};
-	},
-
-	setDimensionsOption: function(element, options){
-		options.dimensions = element.getDimensions({
-			computeSize: true,
-			styles: ['padding', 'border', 'margin']
-		});
-	},
-
-	getPosition: function(element, options){
-		var position = {};
-		options = local.getOptions(element, options);
-		var relativeTo = document.id(options.relativeTo) || document.body;
-
-		local.setPositionCoordinates(options, position, relativeTo);
-		if (options.edge) local.toEdge(position, options);
-
-		var offset = options.offset;
-		position.left = ((position.x >= 0 || offset.parentPositioned || options.allowNegative) ? position.x : 0).toInt();
-		position.top = ((position.y >= 0 || offset.parentPositioned || options.allowNegative) ? position.y : 0).toInt();
-
-		local.toMinMax(position, options);
-
-		if (options.relFixedPosition || relativeTo.getStyle('position') == 'fixed') local.toRelFixedPosition(relativeTo, position);
-		if (options.ignoreScroll) local.toIgnoreScroll(relativeTo, position);
-		if (options.ignoreMargins) local.toIgnoreMargins(position, options);
-
-		position.left = Math.ceil(position.left);
-		position.top = Math.ceil(position.top);
-		delete position.x;
-		delete position.y;
-
-		return position;
-	},
-
-	setPositionCoordinates: function(options, position, relativeTo){
-		var offsetY = options.offset.y,
-			offsetX = options.offset.x,
-			calc = (relativeTo == document.body) ? window.getScroll() : relativeTo.getPosition(),
-			top = calc.y,
-			left = calc.x,
-			winSize = window.getSize();
-
-		switch(options.position.x){
-			case 'left': position.x = left + offsetX; break;
-			case 'right': position.x = left + offsetX + relativeTo.offsetWidth; break;
-			default: position.x = left + ((relativeTo == document.body ? winSize.x : relativeTo.offsetWidth) / 2) + offsetX; break;
-		}
-
-		switch(options.position.y){
-			case 'top': position.y = top + offsetY; break;
-			case 'bottom': position.y = top + offsetY + relativeTo.offsetHeight; break;
-			default: position.y = top + ((relativeTo == document.body ? winSize.y : relativeTo.offsetHeight) / 2) + offsetY; break;
-		}
-	},
-
-	toMinMax: function(position, options){
-		var xy = {left: 'x', top: 'y'}, value;
-		['minimum', 'maximum'].each(function(minmax){
-			['left', 'top'].each(function(lr){
-				value = options[minmax] ? options[minmax][xy[lr]] : null;
-				if (value != null && ((minmax == 'minimum') ? position[lr] < value : position[lr] > value)) position[lr] = value;
-			});
-		});
-	},
-
-	toRelFixedPosition: function(relativeTo, position){
-		var winScroll = window.getScroll();
-		position.top += winScroll.y;
-		position.left += winScroll.x;
-	},
-
-	toIgnoreScroll: function(relativeTo, position){
-		var relScroll = relativeTo.getScroll();
-		position.top -= relScroll.y;
-		position.left -= relScroll.x;
-	},
-
-	toIgnoreMargins: function(position, options){
-		position.left += options.edge.x == 'right'
-			? options.dimensions['margin-right']
-			: (options.edge.x != 'center'
-				? -options.dimensions['margin-left']
-				: -options.dimensions['margin-left'] + ((options.dimensions['margin-right'] + options.dimensions['margin-left']) / 2));
-
-		position.top += options.edge.y == 'bottom'
-			? options.dimensions['margin-bottom']
-			: (options.edge.y != 'center'
-				? -options.dimensions['margin-top']
-				: -options.dimensions['margin-top'] + ((options.dimensions['margin-bottom'] + options.dimensions['margin-top']) / 2));
-	},
-
-	toEdge: function(position, options){
-		var edgeOffset = {},
-			dimensions = options.dimensions,
-			edge = options.edge;
-
-		switch(edge.x){
-			case 'left': edgeOffset.x = 0; break;
-			case 'right': edgeOffset.x = -dimensions.x - dimensions.computedRight - dimensions.computedLeft; break;
-			// center
-			default: edgeOffset.x = -(Math.round(dimensions.totalWidth / 2)); break;
-		}
-
-		switch(edge.y){
-			case 'top': edgeOffset.y = 0; break;
-			case 'bottom': edgeOffset.y = -dimensions.y - dimensions.computedTop - dimensions.computedBottom; break;
-			// center
-			default: edgeOffset.y = -(Math.round(dimensions.totalHeight / 2)); break;
-		}
-
-		position.x += edgeOffset.x;
-		position.y += edgeOffset.y;
-	},
-
-	getCoordinateFromValue: function(option){
-		if (typeOf(option) != 'string') return option;
-		option = option.toLowerCase();
-
-		return {
-			x: option.test('left') ? 'left'
-				: (option.test('right') ? 'right' : 'center'),
-			y: option.test(/upper|top/) ? 'top'
-				: (option.test('bottom') ? 'bottom' : 'center')
-		};
-	}
-
-};
-
-Element.implement({
-
-	position: function(options){
-		if (options && (options.x != null || options.y != null)) {
-			return (original ? original.apply(this, arguments) : this);
-		}
-		var position = this.setStyle('position', 'absolute').calculatePosition(options);
-		return (options && options.returnPos) ? position : this.setStyles(position);
-	},
-
-	calculatePosition: function(options){
-		return local.getPosition(this, options);
-	}
-
-});
-
-})(Element.prototype.position);
-
-
-/*
----
-
-script: Element.Shortcuts.js
-
-name: Element.Shortcuts
-
-description: Extends the Element native object to include some shortcut methods.
-
-license: MIT-style license
-
-authors:
-  - Aaron Newton
-
-requires:
-  - Core/Element.Style
-  - /MooTools.More
-
-provides: [Element.Shortcuts]
-
-...
-*/
-
-Element.implement({
-
-	isDisplayed: function(){
-		return this.getStyle('display') != 'none';
-	},
-
-	isVisible: function(){
-		var w = this.offsetWidth,
-			h = this.offsetHeight;
-		return (w == 0 && h == 0) ? false : (w > 0 && h > 0) ? true : this.style.display != 'none';
-	},
-
-	toggle: function(){
-		return this[this.isDisplayed() ? 'hide' : 'show']();
-	},
-
-	hide: function(){
-		var d;
-		try {
-			//IE fails here if the element is not in the dom
-			d = this.getStyle('display');
-		} catch(e){}
-		if (d == 'none') return this;
-		return this.store('element:_originalDisplay', d || '').setStyle('display', 'none');
-	},
-
-	show: function(display){
-		if (!display && this.isDisplayed()) return this;
-		display = display || this.retrieve('element:_originalDisplay') || 'block';
-		return this.setStyle('display', (display == 'none') ? 'block' : display);
-	},
-
-	swapClass: function(remove, add){
-		return this.removeClass(remove).addClass(add);
-	}
-
-});
-
-Document.implement({
-
-	clearSelection: function(){
-		if (window.getSelection){
-			var selection = window.getSelection();
-			if (selection && selection.removeAllRanges) selection.removeAllRanges();
-		} else if (document.selection && document.selection.empty){
-			try {
-				//IE fails here if selected element is not in dom
-				document.selection.empty();
-			} catch(e){}
-		}
-	}
-
-});
-
-
-/*
----
-
-script: IframeShim.js
-
-name: IframeShim
-
-description: Defines IframeShim, a class for obscuring select lists and flash objects in IE.
-
-license: MIT-style license
-
-authors:
-  - Aaron Newton
-
-requires:
-  - Core/Element.Event
-  - Core/Element.Style
-  - Core/Options
-  - Core/Events
-  - /Element.Position
-  - /Class.Occlude
-
-provides: [IframeShim]
-
-...
-*/
-
-var IframeShim = new Class({
-
-	Implements: [Options, Events, Class.Occlude],
-
-	options: {
-		className: 'iframeShim',
-		src: 'javascript:false;document.write("");',
-		display: false,
-		zIndex: null,
-		margin: 0,
-		offset: {x: 0, y: 0},
-		browsers: (Browser.ie6 || (Browser.firefox && Browser.version < 3 && Browser.Platform.mac))
-	},
-
-	property: 'IframeShim',
-
-	initialize: function(element, options){
-		this.element = document.id(element);
-		if (this.occlude()) return this.occluded;
-		this.setOptions(options);
-		this.makeShim();
-		return this;
-	},
-
-	makeShim: function(){
-		if (this.options.browsers){
-			var zIndex = this.element.getStyle('zIndex').toInt();
-
-			if (!zIndex){
-				zIndex = 1;
-				var pos = this.element.getStyle('position');
-				if (pos == 'static' || !pos) this.element.setStyle('position', 'relative');
-				this.element.setStyle('zIndex', zIndex);
-			}
-			zIndex = ((this.options.zIndex != null || this.options.zIndex === 0) && zIndex > this.options.zIndex) ? this.options.zIndex : zIndex - 1;
-			if (zIndex < 0) zIndex = 1;
-			this.shim = new Element('iframe', {
-				src: this.options.src,
-				scrolling: 'no',
-				frameborder: 0,
-				styles: {
-					zIndex: zIndex,
-					position: 'absolute',
-					border: 'none',
-					filter: 'progid:DXImageTransform.Microsoft.Alpha(style=0,opacity=0)'
-				},
-				'class': this.options.className
-			}).store('IframeShim', this);
-			var inject = (function(){
-				this.shim.inject(this.element, 'after');
-				this[this.options.display ? 'show' : 'hide']();
-				this.fireEvent('inject');
-			}).bind(this);
-			if (!IframeShim.ready) window.addEvent('load', inject);
-			else inject();
-		} else {
-			this.position = this.hide = this.show = this.dispose = Function.from(this);
-		}
-	},
-
-	position: function(){
-		if (!IframeShim.ready || !this.shim) return this;
-		var size = this.element.measure(function(){
-			return this.getSize();
-		});
-		if (this.options.margin != undefined){
-			size.x = size.x - (this.options.margin * 2);
-			size.y = size.y - (this.options.margin * 2);
-			this.options.offset.x += this.options.margin;
-			this.options.offset.y += this.options.margin;
-		}
-		this.shim.set({width: size.x, height: size.y}).position({
-			relativeTo: this.element,
-			offset: this.options.offset
-		});
-		return this;
-	},
-
-	hide: function(){
-		if (this.shim) this.shim.setStyle('display', 'none');
-		return this;
-	},
-
-	show: function(){
-		if (this.shim) this.shim.setStyle('display', 'block');
-		return this.position();
-	},
-
-	dispose: function(){
-		if (this.shim) this.shim.dispose();
-		return this;
-	},
-
-	destroy: function(){
-		if (this.shim) this.shim.destroy();
-		return this;
-	}
-
-});
-
-window.addEvent('load', function(){
-	IframeShim.ready = true;
-});
-
-
-/*
----
-
-script: Mask.js
-
-name: Mask
-
-description: Creates a mask element to cover another.
-
-license: MIT-style license
-
-authors:
-  - Aaron Newton
-
-requires:
-  - Core/Options
-  - Core/Events
-  - Core/Element.Event
-  - /Class.Binds
-  - /Element.Position
-  - /IframeShim
-
-provides: [Mask]
-
-...
-*/
-
-var Mask = new Class({
-
-	Implements: [Options, Events],
-
-	Binds: ['position'],
-
-	options: {/*
-		onShow: function(){},
-		onHide: function(){},
-		onDestroy: function(){},
-		onClick: function(event){},
-		inject: {
-			where: 'after',
-			target: null,
-		},
-		hideOnClick: false,
-		id: null,
-		destroyOnHide: false,*/
-		style: {},
-		'class': 'mask',
-		maskMargins: false,
-		useIframeShim: true,
-		iframeShimOptions: {}
-	},
-
-	initialize: function(target, options){
-		this.target = document.id(target) || document.id(document.body);
-		this.target.store('mask', this);
-		this.setOptions(options);
-		this.render();
-		this.inject();
-	},
-
-	render: function(){
-		this.element = new Element('div', {
-			'class': this.options['class'],
-			id: this.options.id || 'mask-' + String.uniqueID(),
-			styles: Object.merge({}, this.options.style, {
-				display: 'none'
-			}),
-			events: {
-				click: function(event){
-					this.fireEvent('click', event);
-					if (this.options.hideOnClick) this.hide();
-				}.bind(this)
-			}
-		});
-
-		this.hidden = true;
-	},
-
-	toElement: function(){
-		return this.element;
-	},
-
-	inject: function(target, where){
-		where = where || (this.options.inject ? this.options.inject.where : '') || this.target == document.body ? 'inside' : 'after';
-		target = target || (this.options.inject && this.options.inject.target) || this.target;
-
-		this.element.inject(target, where);
-
-		if (this.options.useIframeShim){
-			this.shim = new IframeShim(this.element, this.options.iframeShimOptions);
-
-			this.addEvents({
-				show: this.shim.show.bind(this.shim),
-				hide: this.shim.hide.bind(this.shim),
-				destroy: this.shim.destroy.bind(this.shim)
-			});
-		}
-	},
-
-	position: function(){
-		this.resize(this.options.width, this.options.height);
-
-		this.element.position({
-			relativeTo: this.target,
-			position: 'topLeft',
-			ignoreMargins: !this.options.maskMargins,
-			ignoreScroll: this.target == document.body
-		});
-
-		return this;
-	},
-
-	resize: function(x, y){
-		var opt = {
-			styles: ['padding', 'border']
-		};
-		if (this.options.maskMargins) opt.styles.push('margin');
-
-		var dim = this.target.getComputedSize(opt);
-		if (this.target == document.body){
-			this.element.setStyles({width: 0, height: 0});
-			var win = window.getScrollSize();
-			if (dim.totalHeight < win.y) dim.totalHeight = win.y;
-			if (dim.totalWidth < win.x) dim.totalWidth = win.x;
-		}
-		this.element.setStyles({
-			width: Array.pick([x, dim.totalWidth, dim.x]),
-			height: Array.pick([y, dim.totalHeight, dim.y])
-		});
-
-		return this;
-	},
-
-	show: function(){
-		if (!this.hidden) return this;
-
-		window.addEvent('resize', this.position);
-		this.position();
-		this.showMask.apply(this, arguments);
-
-		return this;
-	},
-
-	showMask: function(){
-		this.element.setStyle('display', 'block');
-		this.hidden = false;
-		this.fireEvent('show');
-	},
-
-	hide: function(){
-		if (this.hidden) return this;
-
-		window.removeEvent('resize', this.position);
-		this.hideMask.apply(this, arguments);
-		if (this.options.destroyOnHide) return this.destroy();
-
-		return this;
-	},
-
-	hideMask: function(){
-		this.element.setStyle('display', 'none');
-		this.hidden = true;
-		this.fireEvent('hide');
-	},
-
-	toggle: function(){
-		this[this.hidden ? 'show' : 'hide']();
-	},
-
-	destroy: function(){
-		this.hide();
-		this.element.destroy();
-		this.fireEvent('destroy');
-		this.target.eliminate('mask');
-	}
-
-});
-
-Element.Properties.mask = {
-
-	set: function(options){
-		var mask = this.retrieve('mask');
-		if (mask) mask.destroy();
-		return this.eliminate('mask').store('mask:options', options);
-	},
-
-	get: function(){
-		var mask = this.retrieve('mask');
-		if (!mask){
-			mask = new Mask(this, this.retrieve('mask:options'));
-			this.store('mask', mask);
-		}
-		return mask;
-	}
-
-};
-
-Element.implement({
-
-	mask: function(options){
-		if (options) this.set('mask', options);
-		this.get('mask').show();
-		return this;
-	},
-
-	unmask: function(){
-		this.get('mask').hide();
-		return this;
-	}
-
-});
-
-
-/*
----
-
-script: Spinner.js
-
-name: Spinner
-
-description: Adds a semi-transparent overlay over a dom element with a spinnin ajax icon.
-
-license: MIT-style license
-
-authors:
-  - Aaron Newton
-
-requires:
-  - Core/Fx.Tween
-  - Core/Request
-  - /Class.refactor
-  - /Mask
-
-provides: [Spinner]
-
-...
-*/
-
-var Spinner = new Class({
-
-	Extends: Mask,
-
-	Implements: Chain,
-
-	options: {/*
-		message: false,*/
-		'class': 'spinner',
-		containerPosition: {},
-		content: {
-			'class': 'spinner-content'
-		},
-		messageContainer: {
-			'class': 'spinner-msg'
-		},
-		img: {
-			'class': 'spinner-img'
-		},
-		fxOptions: {
-			link: 'chain'
-		}
-	},
-
-	initialize: function(target, options){
-		this.target = document.id(target) || document.id(document.body);
-		this.target.store('spinner', this);
-		this.setOptions(options);
-		this.render();
-		this.inject();
-
-		// Add this to events for when noFx is true; parent methods handle hide/show.
-		var deactivate = function(){ this.active = false; }.bind(this);
-		this.addEvents({
-			hide: deactivate,
-			show: deactivate
-		});
-	},
-
-	render: function(){
-		this.parent();
-
-		this.element.set('id', this.options.id || 'spinner-' + String.uniqueID());
-
-		this.content = document.id(this.options.content) || new Element('div', this.options.content);
-		this.content.inject(this.element);
-
-		if (this.options.message){
-			this.msg = document.id(this.options.message) || new Element('p', this.options.messageContainer).appendText(this.options.message);
-			this.msg.inject(this.content);
-		}
-
-		if (this.options.img){
-			this.img = document.id(this.options.img) || new Element('div', this.options.img);
-			this.img.inject(this.content);
-		}
-
-		this.element.set('tween', this.options.fxOptions);
-	},
-
-	show: function(noFx){
-		if (this.active) return this.chain(this.show.bind(this));
-		if (!this.hidden){
-			this.callChain.delay(20, this);
-			return this;
-		}
-
-		this.active = true;
-
-		return this.parent(noFx);
-	},
-
-	showMask: function(noFx){
-		var pos = function(){
-			this.content.position(Object.merge({
-				relativeTo: this.element
-			}, this.options.containerPosition));
-		}.bind(this);
-
-		if (noFx){
-			this.parent();
-			pos();
-		} else {
-			if (!this.options.style.opacity) this.options.style.opacity = this.element.getStyle('opacity').toFloat();
-			this.element.setStyles({
-				display: 'block',
-				opacity: 0
-			}).tween('opacity', this.options.style.opacity);
-			pos();
-			this.hidden = false;
-			this.fireEvent('show');
-			this.callChain();
-		}
-	},
-
-	hide: function(noFx){
-		if (this.active) return this.chain(this.hide.bind(this));
-		if (this.hidden){
-			this.callChain.delay(20, this);
-			return this;
-		}
-		this.active = true;
-		return this.parent(noFx);
-	},
-
-	hideMask: function(noFx){
-		if (noFx) return this.parent();
-		this.element.tween('opacity', 0).get('tween').chain(function(){
-			this.element.setStyle('display', 'none');
-			this.hidden = true;
-			this.fireEvent('hide');
-			this.callChain();
-		}.bind(this));
-	},
-
-	destroy: function(){
-		this.content.destroy();
-		this.parent();
-		this.target.eliminate('spinner');
-	}
-
-});
-
-Request = Class.refactor(Request, {
-
-	options: {
-		useSpinner: false,
-		spinnerOptions: {},
-		spinnerTarget: false
-	},
-
-	initialize: function(options){
-		this._send = this.send;
-		this.send = function(options){
-			var spinner = this.getSpinner();
-			if (spinner) spinner.chain(this._send.pass(options, this)).show();
-			else this._send(options);
-			return this;
-		};
-		this.previous(options);
-	},
-
-	getSpinner: function(){
-		if (!this.spinner){
-			var update = document.id(this.options.spinnerTarget) || document.id(this.options.update);
-			if (this.options.useSpinner && update){
-				update.set('spinner', this.options.spinnerOptions);
-				var spinner = this.spinner = update.get('spinner');
-				['complete', 'exception', 'cancel'].each(function(event){
-					this.addEvent(event, spinner.hide.bind(spinner));
-				}, this);
-			}
-		}
-		return this.spinner;
-	}
-
-});
-
-Element.Properties.spinner = {
-
-	set: function(options){
-		var spinner = this.retrieve('spinner');
-		if (spinner) spinner.destroy();
-		return this.eliminate('spinner').store('spinner:options', options);
-	},
-
-	get: function(){
-		var spinner = this.retrieve('spinner');
-		if (!spinner){
-			spinner = new Spinner(this, this.retrieve('spinner:options'));
-			this.store('spinner', spinner);
-		}
-		return spinner;
-	}
-
-};
-
-Element.implement({
-
-	spin: function(options){
-		if (options) this.set('spinner', options);
-		this.get('spinner').show();
-		return this;
-	},
-
-	unspin: function(){
-		this.get('spinner').hide();
-		return this;
-	}
-
-});
-
-
-/*
----
-
-script: Form.Request.js
-
-name: Form.Request
-
-description: Handles the basic functionality of submitting a form and updating a dom element with the result.
-
-license: MIT-style license
-
-authors:
-  - Aaron Newton
-
-requires:
-  - Core/Request.HTML
-  - /Class.Binds
-  - /Class.Occlude
-  - /Spinner
-  - /String.QueryString
-  - /Element.Delegation
-
-provides: [Form.Request]
-
-...
-*/
-
-if (!window.Form) window.Form = {};
-
-(function(){
-
-	Form.Request = new Class({
-
-		Binds: ['onSubmit', 'onFormValidate'],
-
-		Implements: [Options, Events, Class.Occlude],
-
-		options: {/*
-			onFailure: function(){},
-			onSuccess: function(){}, // aliased to onComplete,
-			onSend: function(){}*/
-			requestOptions: {
-				evalScripts: true,
-				useSpinner: true,
-				emulation: false,
-				link: 'ignore'
-			},
-			sendButtonClicked: true,
-			extraData: {},
-			resetForm: true
-		},
-
-		property: 'form.request',
-
-		initialize: function(form, target, options){
-			this.element = document.id(form);
-			if (this.occlude()) return this.occluded;
-			this.setOptions(options)
-				.setTarget(target)
-				.attach();
-		},
-
-		setTarget: function(target){
-			this.target = document.id(target);
-			if (!this.request){
-				this.makeRequest();
-			} else {
-				this.request.setOptions({
-					update: this.target
-				});
-			}
-			return this;
-		},
-
-		toElement: function(){
-			return this.element;
-		},
-
-		makeRequest: function(){
-			var self = this;
-			this.request = new Request.HTML(Object.merge({
-					update: this.target,
-					emulation: false,
-					spinnerTarget: this.element,
-					method: this.element.get('method') || 'post'
-			}, this.options.requestOptions)).addEvents({
-				success: function(tree, elements, html, javascript){
-					['complete', 'success'].each(function(evt){
-						self.fireEvent(evt, [self.target, tree, elements, html, javascript]);
-					});
-				},
-				failure: function(){
-					self.fireEvent('complete', arguments).fireEvent('failure', arguments);
-				},
-				exception: function(){
-					self.fireEvent('failure', arguments);
-				}
-			});
-			return this.attachReset();
-		},
-
-		attachReset: function(){
-			if (!this.options.resetForm) return this;
-			this.request.addEvent('success', function(){
-				Function.attempt(function(){
-					this.element.reset();
-				}.bind(this));
-				if (window.OverText) OverText.update();
-			}.bind(this));
-			return this;
-		},
-
-		attach: function(attach){
-			var method = (attach != false) ? 'addEvent' : 'removeEvent';
-			this.element[method]('click:relay(button, input[type=submit])', this.saveClickedButton.bind(this));
-
-			var fv = this.element.retrieve('validator');
-			if (fv) fv[method]('onFormValidate', this.onFormValidate);
-			else this.element[method]('submit', this.onSubmit);
-
-			return this;
-		},
-
-		detach: function(){
-			return this.attach(false);
-		},
-
-		//public method
-		enable: function(){
-			return this.attach();
-		},
-
-		//public method
-		disable: function(){
-			return this.detach();
-		},
-
-		onFormValidate: function(valid, form, event){
-			//if there's no event, then this wasn't a submit event
-			if (!event) return;
-			var fv = this.element.retrieve('validator');
-			if (valid || (fv && !fv.options.stopOnFailure)){
-				event.stop();
-				this.send();
-			}
-		},
-
-		onSubmit: function(event){
-			var fv = this.element.retrieve('validator');
-			if (fv){
-				//form validator was created after Form.Request
-				this.element.removeEvent('submit', this.onSubmit);
-				fv.addEvent('onFormValidate', this.onFormValidate);
-				this.element.validate();
-				return;
-			}
-			if (event) event.stop();
-			this.send();
-		},
-
-		saveClickedButton: function(event, target){
-			var targetName = target.get('name');
-			if (!targetName || !this.options.sendButtonClicked) return;
-			this.options.extraData[targetName] = target.get('value') || true;
-			this.clickedCleaner = function(){
-				delete this.options.extraData[targetName];
-				this.clickedCleaner = function(){};
-			}.bind(this);
-		},
-
-		clickedCleaner: function(){},
-
-		send: function(){
-			var str = this.element.toQueryString().trim(),
-				data = Object.toQueryString(this.options.extraData);
-
-			if (str) str += "&" + data;
-			else str = data;
-
-			this.fireEvent('send', [this.element, str.parseQueryString()]);
-			this.request.send({
-				data: str,
-				url: this.options.requestOptions.url || this.element.get('action')
-			});
-			this.clickedCleaner();
-			return this;
-		}
-
-	});
-
-	Element.implement('formUpdate', function(update, options){
-		var fq = this.retrieve('form.request');
-		if (!fq) {
-			fq = new Form.Request(this, update, options);
-		} else {
-			if (update) fq.setTarget(update);
-			if (options) fq.setOptions(options).makeRequest();
-		}
-		fq.send();
-		return this;
-	});
-
-})();
-
-
-/*
----
-
-script: Fx.Reveal.js
-
-name: Fx.Reveal
-
-description: Defines Fx.Reveal, a class that shows and hides elements with a transition.
-
-license: MIT-style license
-
-authors:
-  - Aaron Newton
-
-requires:
-  - Core/Fx.Morph
-  - /Element.Shortcuts
-  - /Element.Measure
-
-provides: [Fx.Reveal]
-
-...
-*/
-
-(function(){
-
-
-var hideTheseOf = function(object){
-	var hideThese = object.options.hideInputs;
-	if (window.OverText){
-		var otClasses = [null];
-		OverText.each(function(ot){
-			otClasses.include('.' + ot.options.labelClass);
-		});
-		if (otClasses) hideThese += otClasses.join(', ');
-	}
-	return (hideThese) ? object.element.getElements(hideThese) : null;
-};
-
-
-Fx.Reveal = new Class({
-
-	Extends: Fx.Morph,
-
-	options: {/*
-		onShow: function(thisElement){},
-		onHide: function(thisElement){},
-		onComplete: function(thisElement){},
-		heightOverride: null,
-		widthOverride: null,*/
-		link: 'cancel',
-		styles: ['padding', 'border', 'margin'],
-		transitionOpacity: !Browser.ie6,
-		mode: 'vertical',
-		display: function(){
-			return this.element.get('tag') != 'tr' ? 'block' : 'table-row';
-		},
-		opacity: 1,
-		hideInputs: Browser.ie ? 'select, input, textarea, object, embed' : null
-	},
-
-	dissolve: function(){
-		if (!this.hiding && !this.showing){
-			if (this.element.getStyle('display') != 'none'){
-				this.hiding = true;
-				this.showing = false;
-				this.hidden = true;
-				this.cssText = this.element.style.cssText;
-
-				var startStyles = this.element.getComputedSize({
-					styles: this.options.styles,
-					mode: this.options.mode
-				});
-				if (this.options.transitionOpacity) startStyles.opacity = this.options.opacity;
-
-				var zero = {};
-				Object.each(startStyles, function(style, name){
-					zero[name] = [style, 0];
-				});
-
-				this.element.setStyles({
-					display: Function.from(this.options.display).call(this),
-					overflow: 'hidden'
-				});
-
-				var hideThese = hideTheseOf(this);
-				if (hideThese) hideThese.setStyle('visibility', 'hidden');
-
-				this.$chain.unshift(function(){
-					if (this.hidden){
-						this.hiding = false;
-						this.element.style.cssText = this.cssText;
-						this.element.setStyle('display', 'none');
-						if (hideThese) hideThese.setStyle('visibility', 'visible');
-					}
-					this.fireEvent('hide', this.element);
-					this.callChain();
-				}.bind(this));
-
-				this.start(zero);
-			} else {
-				this.callChain.delay(10, this);
-				this.fireEvent('complete', this.element);
-				this.fireEvent('hide', this.element);
-			}
-		} else if (this.options.link == 'chain'){
-			this.chain(this.dissolve.bind(this));
-		} else if (this.options.link == 'cancel' && !this.hiding){
-			this.cancel();
-			this.dissolve();
-		}
-		return this;
-	},
-
-	reveal: function(){
-		if (!this.showing && !this.hiding){
-			if (this.element.getStyle('display') == 'none'){
-				this.hiding = false;
-				this.showing = true;
-				this.hidden = false;
-				this.cssText = this.element.style.cssText;
-
-				var startStyles;
-				this.element.measure(function(){
-					startStyles = this.element.getComputedSize({
-						styles: this.options.styles,
-						mode: this.options.mode
-					});
-				}.bind(this));
-				if (this.options.heightOverride != null) startStyles.height = this.options.heightOverride.toInt();
-				if (this.options.widthOverride != null) startStyles.width = this.options.widthOverride.toInt();
-				if (this.options.transitionOpacity){
-					this.element.setStyle('opacity', 0);
-					startStyles.opacity = this.options.opacity;
-				}
-
-				var zero = {
-					height: 0,
-					display: Function.from(this.options.display).call(this)
-				};
-				Object.each(startStyles, function(style, name){
-					zero[name] = 0;
-				});
-				zero.overflow = 'hidden';
-
-				this.element.setStyles(zero);
-
-				var hideThese = hideTheseOf(this);
-				if (hideThese) hideThese.setStyle('visibility', 'hidden');
-
-				this.$chain.unshift(function(){
-					this.element.style.cssText = this.cssText;
-					this.element.setStyle('display', Function.from(this.options.display).call(this));
-					if (!this.hidden) this.showing = false;
-					if (hideThese) hideThese.setStyle('visibility', 'visible');
-					this.callChain();
-					this.fireEvent('show', this.element);
-				}.bind(this));
-
-				this.start(startStyles);
-			} else {
-				this.callChain();
-				this.fireEvent('complete', this.element);
-				this.fireEvent('show', this.element);
-			}
-		} else if (this.options.link == 'chain'){
-			this.chain(this.reveal.bind(this));
-		} else if (this.options.link == 'cancel' && !this.showing){
-			this.cancel();
-			this.reveal();
-		}
-		return this;
-	},
-
-	toggle: function(){
-		if (this.element.getStyle('display') == 'none'){
-			this.reveal();
-		} else {
-			this.dissolve();
-		}
-		return this;
-	},
-
-	cancel: function(){
-		this.parent.apply(this, arguments);
-		if (this.cssText != null) this.element.style.cssText = this.cssText;
-		this.hiding = false;
-		this.showing = false;
-		return this;
-	}
-
-});
-
-Element.Properties.reveal = {
-
-	set: function(options){
-		this.get('reveal').cancel().setOptions(options);
-		return this;
-	},
-
-	get: function(){
-		var reveal = this.retrieve('reveal');
-		if (!reveal){
-			reveal = new Fx.Reveal(this);
-			this.store('reveal', reveal);
-		}
-		return reveal;
-	}
-
-};
-
-Element.Properties.dissolve = Element.Properties.reveal;
-
-Element.implement({
-
-	reveal: function(options){
-		this.get('reveal').setOptions(options).reveal();
-		return this;
-	},
-
-	dissolve: function(options){
-		this.get('reveal').setOptions(options).dissolve();
-		return this;
-	},
-
-	nix: function(options){
-		var params = Array.link(arguments, {destroy: Type.isBoolean, options: Type.isObject});
-		this.get('reveal').setOptions(options).dissolve().chain(function(){
-			this[params.destroy ? 'destroy' : 'dispose']();
-		}.bind(this));
-		return this;
-	},
-
-	wink: function(){
-		var params = Array.link(arguments, {duration: Type.isNumber, options: Type.isObject});
-		var reveal = this.get('reveal').setOptions(params.options);
-		reveal.reveal().chain(function(){
-			(function(){
-				reveal.dissolve();
-			}).delay(params.duration || 2000);
-		});
-	}
-
-});
-
-})();
-
-
-/*
----
-
-script: Form.Request.Append.js
-
-name: Form.Request.Append
-
-description: Handles the basic functionality of submitting a form and updating a dom element with the result. The result is appended to the DOM element instead of replacing its contents.
-
-license: MIT-style license
-
-authors:
-  - Aaron Newton
-
-requires:
-  - /Form.Request
-  - /Fx.Reveal
-  - /Elements.from
-
-provides: [Form.Request.Append]
-
-...
-*/
-
-Form.Request.Append = new Class({
-
-	Extends: Form.Request,
-
-	options: {
-		//onBeforeEffect: function(){},
-		useReveal: true,
-		revealOptions: {},
-		inject: 'bottom'
-	},
-
-	makeRequest: function(){
-		this.request = new Request.HTML(Object.merge({
-				url: this.element.get('action'),
-				method: this.element.get('method') || 'post',
-				spinnerTarget: this.element
-			}, this.options.requestOptions, {
-				evalScripts: false
-			})
-		).addEvents({
-			success: function(tree, elements, html, javascript){
-				var container;
-				var kids = Elements.from(html);
-				if (kids.length == 1){
-					container = kids[0];
-				} else {
-					 container = new Element('div', {
-						styles: {
-							display: 'none'
-						}
-					}).adopt(kids);
-				}
-				container.inject(this.target, this.options.inject);
-				if (this.options.requestOptions.evalScripts) Browser.exec(javascript);
-				this.fireEvent('beforeEffect', container);
-				var finish = function(){
-					this.fireEvent('success', [container, this.target, tree, elements, html, javascript]);
-				}.bind(this);
-				if (this.options.useReveal){
-					container.set('reveal', this.options.revealOptions).get('reveal').chain(finish);
-					container.reveal();
-				} else {
-					finish();
-				}
-			}.bind(this),
-			failure: function(xhr){
-				this.fireEvent('failure', xhr);
-			}.bind(this)
-		});
-		this.attachReset();
-	}
-
-});
-
-
-/*
----
-
-name: Locale.en-US.Form.Validator
-
-description: Form Validator messages for English.
-
-license: MIT-style license
-
-authors:
-  - Aaron Newton
-
-requires:
-  - /Locale
-
-provides: [Locale.en-US.Form.Validator]
-
-...
-*/
-
-Locale.define('en-US', 'FormValidator', {
-
-	required: 'This field is required.',
-	minLength: 'Please enter at least {minLength} characters (you entered {length} characters).',
-	maxLength: 'Please enter no more than {maxLength} characters (you entered {length} characters).',
-	integer: 'Please enter an integer in this field. Numbers with decimals (e.g. 1.25) are not permitted.',
-	numeric: 'Please enter only numeric values in this field (i.e. "1" or "1.1" or "-1" or "-1.1").',
-	digits: 'Please use numbers and punctuation only in this field (for example, a phone number with dashes or dots is permitted).',
-	alpha: 'Please use only letters (a-z) within this field. No spaces or other characters are allowed.',
-	alphanum: 'Please use only letters (a-z) or numbers (0-9) in this field. No spaces or other characters are allowed.',
-	dateSuchAs: 'Please enter a valid date such as {date}',
-	dateInFormatMDY: 'Please enter a valid date such as MM/DD/YYYY (i.e. "12/31/1999")',
-	email: 'Please enter a valid email address. For example "fred@domain.com".',
-	url: 'Please enter a valid URL such as http://www.example.com.',
-	currencyDollar: 'Please enter a valid $ amount. For example $100.00 .',
-	oneRequired: 'Please enter something for at least one of these inputs.',
-	errorPrefix: 'Error: ',
-	warningPrefix: 'Warning: ',
-
-	// Form.Validator.Extras
-	noSpace: 'There can be no spaces in this input.',
-	reqChkByNode: 'No items are selected.',
-	requiredChk: 'This field is required.',
-	reqChkByName: 'Please select a {label}.',
-	match: 'This field needs to match the {matchName} field',
-	startDate: 'the start date',
-	endDate: 'the end date',
-	currendDate: 'the current date',
-	afterDate: 'The date should be the same or after {label}.',
-	beforeDate: 'The date should be the same or before {label}.',
-	startMonth: 'Please select a start month',
-	sameMonth: 'These two dates must be in the same month - you must change one or the other.',
-	creditcard: 'The credit card number entered is invalid. Please check the number and try again. {length} digits entered.'
-
-});
-
-
-/*
----
-
-script: Form.Validator.js
-
-name: Form.Validator
-
-description: A css-class based form validation system.
-
-license: MIT-style license
-
-authors:
-  - Aaron Newton
-
-requires:
-  - Core/Options
-  - Core/Events
-  - Core/Slick.Finder
-  - Core/Element.Event
-  - Core/Element.Style
-  - Core/JSON
-  - /Locale
-  - /Class.Binds
-  - /Date
-  - /Element.Forms
-  - /Locale.en-US.Form.Validator
-  - /Element.Shortcuts
-
-provides: [Form.Validator, InputValidator, FormValidator.BaseValidators]
-
-...
-*/
-if (!window.Form) window.Form = {};
-
-var InputValidator = this.InputValidator = new Class({
-
-	Implements: [Options],
-
-	options: {
-		errorMsg: 'Validation failed.',
-		test: Function.from(true)
-	},
-
-	initialize: function(className, options){
-		this.setOptions(options);
-		this.className = className;
-	},
-
-	test: function(field, props){
-		field = document.id(field);
-		return (field) ? this.options.test(field, props || this.getProps(field)) : false;
-	},
-
-	getError: function(field, props){
-		field = document.id(field);
-		var err = this.options.errorMsg;
-		if (typeOf(err) == 'function') err = err(field, props || this.getProps(field));
-		return err;
-	},
-
-	getProps: function(field){
-		field = document.id(field);
-		return (field) ? field.get('validatorProps') : {};
-	}
-
-});
-
-Element.Properties.validators = {
-
-	get: function(){
-		return (this.get('data-validators') || this.className).clean().split(' ');
-	}
-
-};
-
-Element.Properties.validatorProps = {
-
-	set: function(props){
-		return this.eliminate('$moo:validatorProps').store('$moo:validatorProps', props);
-	},
-
-	get: function(props){
-		if (props) this.set(props);
-		if (this.retrieve('$moo:validatorProps')) return this.retrieve('$moo:validatorProps');
-		if (this.getProperty('data-validator-properties') || this.getProperty('validatorProps')){
-			try {
-				this.store('$moo:validatorProps', JSON.decode(this.getProperty('validatorProps') || this.getProperty('data-validator-properties')));
-			}catch(e){
-				return {};
-			}
-		} else {
-			var vals = this.get('validators').filter(function(cls){
-				return cls.test(':');
-			});
-			if (!vals.length){
-				this.store('$moo:validatorProps', {});
-			} else {
-				props = {};
-				vals.each(function(cls){
-					var split = cls.split(':');
-					if (split[1]){
-						try {
-							props[split[0]] = JSON.decode(split[1]);
-						} catch(e){}
-					}
-				});
-				this.store('$moo:validatorProps', props);
-			}
-		}
-		return this.retrieve('$moo:validatorProps');
-	}
-
-};
-
-Form.Validator = new Class({
-
-	Implements: [Options, Events],
-
-	Binds: ['onSubmit'],
-
-	options: {/*
-		onFormValidate: function(isValid, form, event){},
-		onElementValidate: function(isValid, field, className, warn){},
-		onElementPass: function(field){},
-		onElementFail: function(field, validatorsFailed){}, */
-		fieldSelectors: 'input, select, textarea',
-		ignoreHidden: true,
-		ignoreDisabled: true,
-		useTitles: false,
-		evaluateOnSubmit: true,
-		evaluateFieldsOnBlur: true,
-		evaluateFieldsOnChange: true,
-		serial: true,
-		stopOnFailure: true,
-		warningPrefix: function(){
-			return Form.Validator.getMsg('warningPrefix') || 'Warning: ';
-		},
-		errorPrefix: function(){
-			return Form.Validator.getMsg('errorPrefix') || 'Error: ';
-		}
-	},
-
-	initialize: function(form, options){
-		this.setOptions(options);
-		this.element = document.id(form);
-		this.element.store('validator', this);
-		this.warningPrefix = Function.from(this.options.warningPrefix)();
-		this.errorPrefix = Function.from(this.options.errorPrefix)();
-		if (this.options.evaluateOnSubmit) this.element.addEvent('submit', this.onSubmit);
-		if (this.options.evaluateFieldsOnBlur || this.options.evaluateFieldsOnChange) this.watchFields(this.getFields());
-	},
-
-	toElement: function(){
-		return this.element;
-	},
-
-	getFields: function(){
-		return (this.fields = this.element.getElements(this.options.fieldSelectors));
-	},
-
-	watchFields: function(fields){
-		fields.each(function(el){
-			if (this.options.evaluateFieldsOnBlur)
-				el.addEvent('blur', this.validationMonitor.pass([el, false], this));
-			if (this.options.evaluateFieldsOnChange)
-				el.addEvent('change', this.validationMonitor.pass([el, true], this));
-		}, this);
-	},
-
-	validationMonitor: function(){
-		clearTimeout(this.timer);
-		this.timer = this.validateField.delay(50, this, arguments);
-	},
-
-	onSubmit: function(event){
-		if (this.validate(event)) this.reset();
-	},
-
-	reset: function(){
-		this.getFields().each(this.resetField, this);
-		return this;
-	},
-
-	validate: function(event){
-		var result = this.getFields().map(function(field){
-			return this.validateField(field, true);
-		}, this).every(function(v){
-			return v;
-		});
-		this.fireEvent('formValidate', [result, this.element, event]);
-		if (this.options.stopOnFailure && !result && event) event.preventDefault();
-		return result;
-	},
-
-	validateField: function(field, force){
-		if (this.paused) return true;
-		field = document.id(field);
-		var passed = !field.hasClass('validation-failed');
-		var failed, warned;
-		if (this.options.serial && !force){
-			failed = this.element.getElement('.validation-failed');
-			warned = this.element.getElement('.warning');
-		}
-		if (field && (!failed || force || field.hasClass('validation-failed') || (failed && !this.options.serial))){
-			var validationTypes = field.get('validators');
-			var validators = validationTypes.some(function(cn){
-				return this.getValidator(cn);
-			}, this);
-			var validatorsFailed = [];
-			validationTypes.each(function(className){
-				if (className && !this.test(className, field)) validatorsFailed.include(className);
-			}, this);
-			passed = validatorsFailed.length === 0;
-			if (validators && !this.hasValidator(field, 'warnOnly')){
-				if (passed){
-					field.addClass('validation-passed').removeClass('validation-failed');
-					this.fireEvent('elementPass', [field]);
-				} else {
-					field.addClass('validation-failed').removeClass('validation-passed');
-					this.fireEvent('elementFail', [field, validatorsFailed]);
-				}
-			}
-			if (!warned){
-				var warnings = validationTypes.some(function(cn){
-					if (cn.test('^warn'))
-						return this.getValidator(cn.replace(/^warn-/,''));
-					else return null;
-				}, this);
-				field.removeClass('warning');
-				var warnResult = validationTypes.map(function(cn){
-					if (cn.test('^warn'))
-						return this.test(cn.replace(/^warn-/,''), field, true);
-					else return null;
-				}, this);
-			}
-		}
-		return passed;
-	},
-
-	test: function(className, field, warn){
-		field = document.id(field);
-		if ((this.options.ignoreHidden && !field.isVisible()) || (this.options.ignoreDisabled && field.get('disabled'))) return true;
-		var validator = this.getValidator(className);
-		if (warn != null) warn = false;
-		if (this.hasValidator(field, 'warnOnly')) warn = true;
-		var isValid = this.hasValidator(field, 'ignoreValidation') || (validator ? validator.test(field) : true);
-		if (validator && field.isVisible()) this.fireEvent('elementValidate', [isValid, field, className, warn]);
-		if (warn) return true;
-		return isValid;
-	},
-
-	hasValidator: function(field, value){
-		return field.get('validators').contains(value);
-	},
-
-	resetField: function(field){
-		field = document.id(field);
-		if (field){
-			field.get('validators').each(function(className){
-				if (className.test('^warn-')) className = className.replace(/^warn-/, '');
-				field.removeClass('validation-failed');
-				field.removeClass('warning');
-				field.removeClass('validation-passed');
-			}, this);
-		}
-		return this;
-	},
-
-	stop: function(){
-		this.paused = true;
-		return this;
-	},
-
-	start: function(){
-		this.paused = false;
-		return this;
-	},
-
-	ignoreField: function(field, warn){
-		field = document.id(field);
-		if (field){
-			this.enforceField(field);
-			if (warn) field.addClass('warnOnly');
-			else field.addClass('ignoreValidation');
-		}
-		return this;
-	},
-
-	enforceField: function(field){
-		field = document.id(field);
-		if (field) field.removeClass('warnOnly').removeClass('ignoreValidation');
-		return this;
-	}
-
-});
-
-Form.Validator.getMsg = function(key){
-	return Locale.get('FormValidator.' + key);
-};
-
-Form.Validator.adders = {
-
-	validators:{},
-
-	add : function(className, options){
-		this.validators[className] = new InputValidator(className, options);
-		//if this is a class (this method is used by instances of Form.Validator and the Form.Validator namespace)
-		//extend these validators into it
-		//this allows validators to be global and/or per instance
-		if (!this.initialize){
-			this.implement({
-				validators: this.validators
-			});
-		}
-	},
-
-	addAllThese : function(validators){
-		Array.from(validators).each(function(validator){
-			this.add(validator[0], validator[1]);
-		}, this);
-	},
-
-	getValidator: function(className){
-		return this.validators[className.split(':')[0]];
-	}
-
-};
-
-Object.append(Form.Validator, Form.Validator.adders);
-
-Form.Validator.implement(Form.Validator.adders);
-
-Form.Validator.add('IsEmpty', {
-
-	errorMsg: false,
-	test: function(element){
-		if (element.type == 'select-one' || element.type == 'select')
-			return !(element.selectedIndex >= 0 && element.options[element.selectedIndex].value != '');
-		else
-			return ((element.get('value') == null) || (element.get('value').length == 0));
-	}
-
-});
-
-Form.Validator.addAllThese([
-
-	['required', {
-		errorMsg: function(){
-			return Form.Validator.getMsg('required');
-		},
-		test: function(element){
-			return !Form.Validator.getValidator('IsEmpty').test(element);
-		}
-	}],
-
-	['minLength', {
-		errorMsg: function(element, props){
-			if (typeOf(props.minLength) != 'null')
-				return Form.Validator.getMsg('minLength').substitute({minLength:props.minLength,length:element.get('value').length });
-			else return '';
-		},
-		test: function(element, props){
-			if (typeOf(props.minLength) != 'null') return (element.get('value').length >= (props.minLength || 0));
-			else return true;
-		}
-	}],
-
-	['maxLength', {
-		errorMsg: function(element, props){
-			//props is {maxLength:10}
-			if (typeOf(props.maxLength) != 'null')
-				return Form.Validator.getMsg('maxLength').substitute({maxLength:props.maxLength,length:element.get('value').length });
-			else return '';
-		},
-		test: function(element, props){
-			return element.get('value').length <= (props.maxLength || 10000);
-		}
-	}],
-
-	['validate-integer', {
-		errorMsg: Form.Validator.getMsg.pass('integer'),
-		test: function(element){
-			return Form.Validator.getValidator('IsEmpty').test(element) || (/^(-?[1-9]\d*|0)$/).test(element.get('value'));
-		}
-	}],
-
-	['validate-numeric', {
-		errorMsg: Form.Validator.getMsg.pass('numeric'),
-		test: function(element){
-			return Form.Validator.getValidator('IsEmpty').test(element) ||
-				(/^-?(?:0$0(?=\d*\.)|[1-9]|0)\d*(\.\d+)?$/).test(element.get('value'));
-		}
-	}],
-
-	['validate-digits', {
-		errorMsg: Form.Validator.getMsg.pass('digits'),
-		test: function(element){
-			return Form.Validator.getValidator('IsEmpty').test(element) || (/^[\d() .:\-\+#]+$/.test(element.get('value')));
-		}
-	}],
-
-	['validate-alpha', {
-		errorMsg: Form.Validator.getMsg.pass('alpha'),
-		test: function(element){
-			return Form.Validator.getValidator('IsEmpty').test(element) || (/^[a-zA-Z]+$/).test(element.get('value'));
-		}
-	}],
-
-	['validate-alphanum', {
-		errorMsg: Form.Validator.getMsg.pass('alphanum'),
-		test: function(element){
-			return Form.Validator.getValidator('IsEmpty').test(element) || !(/\W/).test(element.get('value'));
-		}
-	}],
-
-	['validate-date', {
-		errorMsg: function(element, props){
-			if (Date.parse){
-				var format = props.dateFormat || '%x';
-				return Form.Validator.getMsg('dateSuchAs').substitute({date: new Date().format(format)});
-			} else {
-				return Form.Validator.getMsg('dateInFormatMDY');
-			}
-		},
-		test: function(element, props){
-			if (Form.Validator.getValidator('IsEmpty').test(element)) return true;
-			var dateLocale = Locale.getCurrent().sets.Date,
-				dateNouns = new RegExp([dateLocale.days, dateLocale.days_abbr, dateLocale.months, dateLocale.months_abbr].flatten().join('|'), 'i'),
-				value = element.get('value'),
-				wordsInValue = value.match(/[a-z]+/gi);
-
-				if (wordsInValue && !wordsInValue.every(dateNouns.exec, dateNouns)) return false;
-
-				var date = Date.parse(value),
-					format = props.dateFormat || '%x',
-					formatted = date.format(format);
-
-				if (formatted != 'invalid date') element.set('value', formatted);
-				return date.isValid();
-		}
-	}],
-
-	['validate-email', {
-		errorMsg: Form.Validator.getMsg.pass('email'),
-		test: function(element){
-			/*
-			var chars = "[a-z0-9!#$%&'*+/=?^_`{|}~-]",
-				local = '(?:' + chars + '\\.?){0,63}' + chars,
-
-				label = '[a-z0-9](?:[a-z0-9-]{0,61}[a-z0-9])?',
-				hostname = '(?:' + label + '\\.)*' + label;
-
-				octet = '(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)',
-				ipv4 = '\\[(?:' + octet + '\\.){3}' + octet + '\\]',
-
-				domain = '(?:' + hostname + '|' + ipv4 + ')';
-
-			var regex = new RegExp('^' + local + '@' + domain + '$', 'i');
-			*/
-			return Form.Validator.getValidator('IsEmpty').test(element) || (/^(?:[a-z0-9!#$%&'*+\/=?^_`{|}~-]\.?){0,63}[a-z0-9!#$%&'*+\/=?^_`{|}~-]@(?:(?:[a-z0-9](?:[a-z0-9-]{0,61}[a-z0-9])?\.)*[a-z0-9](?:[a-z0-9-]{0,61}[a-z0-9])?|\[(?:(?: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]?)\])$/i).test(element.get('value'));
-		}
-	}],
-
-	['validate-url', {
-		errorMsg: Form.Validator.getMsg.pass('url'),
-		test: function(element){
-			return Form.Validator.getValidator('IsEmpty').test(element) || (/^(https?|ftp|rmtp|mms):\/\/(([A-Z0-9][A-Z0-9_-]*)(\.[A-Z0-9][A-Z0-9_-]*)+)(:(\d+))?\/?/i).test(element.get('value'));
-		}
-	}],
-
-	['validate-currency-dollar', {
-		errorMsg: Form.Validator.getMsg.pass('currencyDollar'),
-		test: function(element){
-			return Form.Validator.getValidator('IsEmpty').test(element) || (/^\$?\-?([1-9]{1}[0-9]{0,2}(\,[0-9]{3})*(\.[0-9]{0,2})?|[1-9]{1}\d*(\.[0-9]{0,2})?|0(\.[0-9]{0,2})?|(\.[0-9]{1,2})?)$/).test(element.get('value'));
-		}
-	}],
-
-	['validate-one-required', {
-		errorMsg: Form.Validator.getMsg.pass('oneRequired'),
-		test: function(element, props){
-			var p = document.id(props['validate-one-required']) || element.getParent(props['validate-one-required']);
-			return p.getElements('input').some(function(el){
-				if (['checkbox', 'radio'].contains(el.get('type'))) return el.get('checked');
-				return el.get('value');
-			});
-		}
-	}]
-
-]);
-
-Element.Properties.validator = {
-
-	set: function(options){
-		this.get('validator').setOptions(options);
-	},
-
-	get: function(){
-		var validator = this.retrieve('validator');
-		if (!validator){
-			validator = new Form.Validator(this);
-			this.store('validator', validator);
-		}
-		return validator;
-	}
-
-};
-
-Element.implement({
-
-	validate: function(options){
-		if (options) this.set('validator', options);
-		return this.get('validator').validate();
-	}
-
-});
-
-
-//<1.2compat>
-//legacy
-var FormValidator = Form.Validator;
-//</1.2compat>
-
-
-
-
-/*
----
-
-script: Form.Validator.Inline.js
-
-name: Form.Validator.Inline
-
-description: Extends Form.Validator to add inline messages.
-
-license: MIT-style license
-
-authors:
-  - Aaron Newton
-
-requires:
-  - /Form.Validator
-
-provides: [Form.Validator.Inline]
-
-...
-*/
-
-Form.Validator.Inline = new Class({
-
-	Extends: Form.Validator,
-
-	options: {
-		showError: function(errorElement){
-			if (errorElement.reveal) errorElement.reveal();
-			else errorElement.setStyle('display', 'block');
-		},
-		hideError: function(errorElement){
-			if (errorElement.dissolve) errorElement.dissolve();
-			else errorElement.setStyle('display', 'none');
-		},
-		scrollToErrorsOnSubmit: true,
-		scrollToErrorsOnBlur: false,
-		scrollToErrorsOnChange: false,
-		scrollFxOptions: {
-			transition: 'quad:out',
-			offset: {
-				y: -20
-			}
-		}
-	},
-
-	initialize: function(form, options){
-		this.parent(form, options);
-		this.addEvent('onElementValidate', function(isValid, field, className, warn){
-			var validator = this.getValidator(className);
-			if (!isValid && validator.getError(field)){
-				if (warn) field.addClass('warning');
-				var advice = this.makeAdvice(className, field, validator.getError(field), warn);
-				this.insertAdvice(advice, field);
-				this.showAdvice(className, field);
-			} else {
-				this.hideAdvice(className, field);
-			}
-		});
-	},
-
-	makeAdvice: function(className, field, error, warn){
-		var errorMsg = (warn) ? this.warningPrefix : this.errorPrefix;
-			errorMsg += (this.options.useTitles) ? field.title || error:error;
-		var cssClass = (warn) ? 'warning-advice' : 'validation-advice';
-		var advice = this.getAdvice(className, field);
-		if (advice){
-			advice = advice.set('html', errorMsg);
-		} else {
-			advice = new Element('div', {
-				html: errorMsg,
-				styles: { display: 'none' },
-				id: 'advice-' + className.split(':')[0] + '-' + this.getFieldId(field)
-			}).addClass(cssClass);
-		}
-		field.store('$moo:advice-' + className, advice);
-		return advice;
-	},
-
-	getFieldId : function(field){
-		return field.id ? field.id : field.id = 'input_' + field.name;
-	},
-
-	showAdvice: function(className, field){
-		var advice = this.getAdvice(className, field);
-		if (
-			advice &&
-			!field.retrieve('$moo:' + this.getPropName(className)) &&
-			(
-				advice.getStyle('display') == 'none' ||
-				advice.getStyle('visiblity') == 'hidden' ||
-				advice.getStyle('opacity') == 0
-			)
-		){
-			field.store('$moo:' + this.getPropName(className), true);
-			this.options.showError(advice);
-			this.fireEvent('showAdvice', [field, advice, className]);
-		}
-	},
-
-	hideAdvice: function(className, field){
-		var advice = this.getAdvice(className, field);
-		if (advice && field.retrieve('$moo:' + this.getPropName(className))){
-			field.store('$moo:' + this.getPropName(className), false);
-			this.options.hideError(advice);
-			this.fireEvent('hideAdvice', [field, advice, className]);
-		}
-	},
-
-	getPropName: function(className){
-		return 'advice' + className;
-	},
-
-	resetField: function(field){
-		field = document.id(field);
-		if (!field) return this;
-		this.parent(field);
-		field.get('validators').each(function(className){
-			this.hideAdvice(className, field);
-		}, this);
-		return this;
-	},
-
-	getAllAdviceMessages: function(field, force){
-		var advice = [];
-		if (field.hasClass('ignoreValidation') && !force) return advice;
-		var validators = field.get('validators').some(function(cn){
-			var warner = cn.test('^warn-') || field.hasClass('warnOnly');
-			if (warner) cn = cn.replace(/^warn-/, '');
-			var validator = this.getValidator(cn);
-			if (!validator) return;
-			advice.push({
-				message: validator.getError(field),
-				warnOnly: warner,
-				passed: validator.test(),
-				validator: validator
-			});
-		}, this);
-		return advice;
-	},
-
-	getAdvice: function(className, field){
-		return field.retrieve('$moo:advice-' + className);
-	},
-
-	insertAdvice: function(advice, field){
-		//Check for error position prop
-		var props = field.get('validatorProps');
-		//Build advice
-		if (!props.msgPos || !document.id(props.msgPos)){
-			if (field.type && field.type.toLowerCase() == 'radio') field.getParent().adopt(advice);
-			else advice.inject(document.id(field), 'after');
-		} else {
-			document.id(props.msgPos).grab(advice);
-		}
-	},
-
-	validateField: function(field, force, scroll){
-		var result = this.parent(field, force);
-		if (((this.options.scrollToErrorsOnSubmit && scroll == null) || scroll) && !result){
-			var failed = document.id(this).getElement('.validation-failed');
-			var par = document.id(this).getParent();
-			while (par != document.body && par.getScrollSize().y == par.getSize().y){
-				par = par.getParent();
-			}
-			var fx = par.retrieve('$moo:fvScroller');
-			if (!fx && window.Fx && Fx.Scroll){
-				fx = new Fx.Scroll(par, this.options.scrollFxOptions);
-				par.store('$moo:fvScroller', fx);
-			}
-			if (failed){
-				if (fx) fx.toElement(failed);
-				else par.scrollTo(par.getScroll().x, failed.getPosition(par).y - 20);
-			}
-		}
-		return result;
-	},
-
-	watchFields: function(fields){
-		fields.each(function(el){
-		if (this.options.evaluateFieldsOnBlur){
-			el.addEvent('blur', this.validationMonitor.pass([el, false, this.options.scrollToErrorsOnBlur], this));
-		}
-		if (this.options.evaluateFieldsOnChange){
-				el.addEvent('change', this.validationMonitor.pass([el, true, this.options.scrollToErrorsOnChange], this));
-			}
-		}, this);
-	}
-
-});
-
-
-/*
----
-
-script: Form.Validator.Extras.js
-
-name: Form.Validator.Extras
-
-description: Additional validators for the Form.Validator class.
-
-license: MIT-style license
-
-authors:
-  - Aaron Newton
-
-requires:
-  - /Form.Validator
-
-provides: [Form.Validator.Extras]
-
-...
-*/
-Form.Validator.addAllThese([
-
-	['validate-enforce-oncheck', {
-		test: function(element, props){
-			var fv = element.getParent('form').retrieve('validator');
-			if (!fv) return true;
-			(props.toEnforce || document.id(props.enforceChildrenOf).getElements('input, select, textarea')).map(function(item){
-				if (element.checked){
-					fv.enforceField(item);
-				} else {
-					fv.ignoreField(item);
-					fv.resetField(item);
-				}
-			});
-			return true;
-		}
-	}],
-
-	['validate-ignore-oncheck', {
-		test: function(element, props){
-			var fv = element.getParent('form').retrieve('validator');
-			if (!fv) return true;
-			(props.toIgnore || document.id(props.ignoreChildrenOf).getElements('input, select, textarea')).each(function(item){
-				if (element.checked){
-					fv.ignoreField(item);
-					fv.resetField(item);
-				} else {
-					fv.enforceField(item);
-				}
-			});
-			return true;
-		}
-	}],
-
-	['validate-nospace', {
-		errorMsg: function(){
-			return Form.Validator.getMsg('noSpace');
-		},
-		test: function(element, props){
-			return !element.get('value').test(/\s/);
-		}
-	}],
-
-	['validate-toggle-oncheck', {
-		test: function(element, props){
-			var fv = element.getParent('form').retrieve('validator');
-			if (!fv) return true;
-			var eleArr = props.toToggle || document.id(props.toToggleChildrenOf).getElements('input, select, textarea');
-			if (!element.checked){
-				eleArr.each(function(item){
-					fv.ignoreField(item);
-					fv.resetField(item);
-				});
-			} else {
-				eleArr.each(function(item){
-					fv.enforceField(item);
-				});
-			}
-			return true;
-		}
-	}],
-
-	['validate-reqchk-bynode', {
-		errorMsg: function(){
-			return Form.Validator.getMsg('reqChkByNode');
-		},
-		test: function(element, props){
-			return (document.id(props.nodeId).getElements(props.selector || 'input[type=checkbox], input[type=radio]')).some(function(item){
-				return item.checked;
-			});
-		}
-	}],
-
-	['validate-required-check', {
-		errorMsg: function(element, props){
-			return props.useTitle ? element.get('title') : Form.Validator.getMsg('requiredChk');
-		},
-		test: function(element, props){
-			return !!element.checked;
-		}
-	}],
-
-	['validate-reqchk-byname', {
-		errorMsg: function(element, props){
-			return Form.Validator.getMsg('reqChkByName').substitute({label: props.label || element.get('type')});
-		},
-		test: function(element, props){
-			var grpName = props.groupName || element.get('name');
-			var oneCheckedItem = $$(document.getElementsByName(grpName)).some(function(item, index){
-				return item.checked;
-			});
-			var fv = element.getParent('form').retrieve('validator');
-			if (oneCheckedItem && fv) fv.resetField(element);
-			return oneCheckedItem;
-		}
-	}],
-
-	['validate-match', {
-		errorMsg: function(element, props){
-			return Form.Validator.getMsg('match').substitute({matchName: props.matchName || document.id(props.matchInput).get('name')});
-		},
-		test: function(element, props){
-			var eleVal = element.get('value');
-			var matchVal = document.id(props.matchInput) && document.id(props.matchInput).get('value');
-			return eleVal && matchVal ? eleVal == matchVal : true;
-		}
-	}],
-
-	['validate-after-date', {
-		errorMsg: function(element, props){
-			return Form.Validator.getMsg('afterDate').substitute({
-				label: props.afterLabel || (props.afterElement ? Form.Validator.getMsg('startDate') : Form.Validator.getMsg('currentDate'))
-			});
-		},
-		test: function(element, props){
-			var start = document.id(props.afterElement) ? Date.parse(document.id(props.afterElement).get('value')) : new Date();
-			var end = Date.parse(element.get('value'));
-			return end && start ? end >= start : true;
-		}
-	}],
-
-	['validate-before-date', {
-		errorMsg: function(element, props){
-			return Form.Validator.getMsg('beforeDate').substitute({
-				label: props.beforeLabel || (props.beforeElement ? Form.Validator.getMsg('endDate') : Form.Validator.getMsg('currentDate'))
-			});
-		},
-		test: function(element, props){
-			var start = Date.parse(element.get('value'));
-			var end = document.id(props.beforeElement) ? Date.parse(document.id(props.beforeElement).get('value')) : new Date();
-			return end && start ? end >= start : true;
-		}
-	}],
-
-	['validate-custom-required', {
-		errorMsg: function(){
-			return Form.Validator.getMsg('required');
-		},
-		test: function(element, props){
-			return element.get('value') != props.emptyValue;
-		}
-	}],
-
-	['validate-same-month', {
-		errorMsg: function(element, props){
-			var startMo = document.id(props.sameMonthAs) && document.id(props.sameMonthAs).get('value');
-			var eleVal = element.get('value');
-			if (eleVal != '') return Form.Validator.getMsg(startMo ? 'sameMonth' : 'startMonth');
-		},
-		test: function(element, props){
-			var d1 = Date.parse(element.get('value'));
-			var d2 = Date.parse(document.id(props.sameMonthAs) && document.id(props.sameMonthAs).get('value'));
-			return d1 && d2 ? d1.format('%B') == d2.format('%B') : true;
-		}
-	}],
-
-
-	['validate-cc-num', {
-		errorMsg: function(element){
-			var ccNum = element.get('value').replace(/[^0-9]/g, '');
-			return Form.Validator.getMsg('creditcard').substitute({length: ccNum.length});
-		},
-		test: function(element){
-			// required is a different test
-			if (Form.Validator.getValidator('IsEmpty').test(element)) return true;
-
-			// Clean number value
-			var ccNum = element.get('value');
-			ccNum = ccNum.replace(/[^0-9]/g, '');
-
-			var valid_type = false;
-
-			if (ccNum.test(/^4[0-9]{12}([0-9]{3})?$/)) valid_type = 'Visa';
-			else if (ccNum.test(/^5[1-5]([0-9]{14})$/)) valid_type = 'Master Card';
-			else if (ccNum.test(/^3[47][0-9]{13}$/)) valid_type = 'American Express';
-			else if (ccNum.test(/^6011[0-9]{12}$/)) valid_type = 'Discover';
-
-			if (valid_type){
-				var sum = 0;
-				var cur = 0;
-
-				for (var i=ccNum.length-1; i>=0; --i){
-					cur = ccNum.charAt(i).toInt();
-					if (cur == 0) continue;
-
-					if ((ccNum.length-i) % 2 == 0) cur += cur;
-					if (cur > 9){
-						cur = cur.toString().charAt(0).toInt() + cur.toString().charAt(1).toInt();
-					}
-
-					sum += cur;
-				}
-				if ((sum % 10) == 0) return true;
-			}
-
-			var chunks = '';
-			while (ccNum != ''){
-				chunks += ' ' + ccNum.substr(0,4);
-				ccNum = ccNum.substr(4);
-			}
-
-			element.getParent('form').retrieve('validator').ignoreField(element);
-			element.set('value', chunks.clean());
-			element.getParent('form').retrieve('validator').enforceField(element);
-			return false;
-		}
-	}]
-
-
-]);
-
-
-/*
----
-
-script: OverText.js
-
-name: OverText
-
-description: Shows text over an input that disappears when the user clicks into it. The text remains hidden if the user adds a value.
-
-license: MIT-style license
-
-authors:
-  - Aaron Newton
-
-requires:
-  - Core/Options
-  - Core/Events
-  - Core/Element.Event
-  - Class.Binds
-  - Class.Occlude
-  - Element.Position
-  - Element.Shortcuts
-
-provides: [OverText]
-
-...
-*/
-
-var OverText = new Class({
-
-	Implements: [Options, Events, Class.Occlude],
-
-	Binds: ['reposition', 'assert', 'focus', 'hide'],
-
-	options: {/*
-		textOverride: null,
-		onFocus: function(){},
-		onTextHide: function(textEl, inputEl){},
-		onTextShow: function(textEl, inputEl){}, */
-		element: 'label',
-		labelClass: 'overTxtLabel',
-		positionOptions: {
-			position: 'upperLeft',
-			edge: 'upperLeft',
-			offset: {
-				x: 4,
-				y: 2
-			}
-		},
-		poll: false,
-		pollInterval: 250,
-		wrap: false
-	},
-
-	property: 'OverText',
-
-	initialize: function(element, options){
-		element = this.element = document.id(element);
-
-		if (this.occlude()) return this.occluded;
-		this.setOptions(options);
-
-		this.attach(element);
-		OverText.instances.push(this);
-
-		if (this.options.poll) this.poll();
-	},
-
-	toElement: function(){
-		return this.element;
-	},
-
-	attach: function(){
-		var element = this.element,
-			options = this.options,
-			value = options.textOverride || element.get('alt') || element.get('title');
-
-		if (!value) return this;
-
-		var text = this.text = new Element(options.element, {
-			'class': options.labelClass,
-			styles: {
-				lineHeight: 'normal',
-				position: 'absolute',
-				cursor: 'text'
-			},
-			html: value,
-			events: {
-				click: this.hide.pass(options.element == 'label', this)
-			}
-		}).inject(element, 'after');
-
-		if (options.element == 'label'){
-			if (!element.get('id')) element.set('id', 'input_' + String.uniqueID());
-			text.set('for', element.get('id'));
-		}
-
-		if (options.wrap){
-			this.textHolder = new Element('div.overTxtWrapper', {
-				styles: {
-					lineHeight: 'normal',
-					position: 'relative'
-				}
-			}).grab(text).inject(element, 'before');
-		}
-
-		return this.enable();
-	},
-
-	destroy: function(){
-		this.element.eliminate(this.property); // Class.Occlude storage
-		this.disable();
-		if (this.text) this.text.destroy();
-		if (this.textHolder) this.textHolder.destroy();
-		return this;
-	},
-
-	disable: function(){
-		this.element.removeEvents({
-			focus: this.focus,
-			blur: this.assert,
-			change: this.assert
-		});
-		window.removeEvent('resize', this.reposition);
-		this.hide(true, true);
-		return this;
-	},
-
-	enable: function(){
-		this.element.addEvents({
-			focus: this.focus,
-			blur: this.assert,
-			change: this.assert
-		});
-		window.addEvent('resize', this.reposition);
-		this.assert(true);
-		this.reposition();
-		return this;
-	},
-
-	wrap: function(){
-		if (this.options.element == 'label'){
-			if (!this.element.get('id')) this.element.set('id', 'input_' + String.uniqueID());
-			this.text.set('for', this.element.get('id'));
-		}
-	},
-
-	startPolling: function(){
-		this.pollingPaused = false;
-		return this.poll();
-	},
-
-	poll: function(stop){
-		//start immediately
-		//pause on focus
-		//resumeon blur
-		if (this.poller && !stop) return this;
-		if (stop){
-			clearInterval(this.poller);
-		} else {
-			this.poller = (function(){
-				if (!this.pollingPaused) this.assert(true);
-			}).periodical(this.options.pollInterval, this);
-		}
-
-		return this;
-	},
-
-	stopPolling: function(){
-		this.pollingPaused = true;
-		return this.poll(true);
-	},
-
-	focus: function(){
-		if (this.text && (!this.text.isDisplayed() || this.element.get('disabled'))) return this;
-		return this.hide();
-	},
-
-	hide: function(suppressFocus, force){
-		if (this.text && (this.text.isDisplayed() && (!this.element.get('disabled') || force))){
-			this.text.hide();
-			this.fireEvent('textHide', [this.text, this.element]);
-			this.pollingPaused = true;
-			if (!suppressFocus){
-				try {
-					this.element.fireEvent('focus');
-					this.element.focus();
-				} catch(e){} //IE barfs if you call focus on hidden elements
-			}
-		}
-		return this;
-	},
-
-	show: function(){
-		if (this.text && !this.text.isDisplayed()){
-			this.text.show();
-			this.reposition();
-			this.fireEvent('textShow', [this.text, this.element]);
-			this.pollingPaused = false;
-		}
-		return this;
-	},
-
-	test: function(){
-		return !this.element.get('value');
-	},
-
-	assert: function(suppressFocus){
-		return this[this.test() ? 'show' : 'hide'](suppressFocus);
-	},
-
-	reposition: function(){
-		this.assert(true);
-		if (!this.element.isVisible()) return this.stopPolling().hide();
-		if (this.text && this.test()){
-			this.text.position(Object.merge(this.options.positionOptions, {
-				relativeTo: this.element
-			}));
-		}
-		return this;
-	}
-
-});
-
-OverText.instances = [];
-
-Object.append(OverText, {
-
-	each: function(fn){
-		return OverText.instances.each(function(ot, i){
-			if (ot.element && ot.text) fn.call(OverText, ot, i);
-		});
-	},
-
-	update: function(){
-
-		return OverText.each(function(ot){
-			return ot.reposition();
-		});
-
-	},
-
-	hideAll: function(){
-
-		return OverText.each(function(ot){
-			return ot.hide(true, true);
-		});
-
-	},
-
-	showAll: function(){
-		return OverText.each(function(ot){
-			return ot.show();
-		});
-	}
-
-});
-
-
-
-/*
----
-
-script: Fx.Elements.js
-
-name: Fx.Elements
-
-description: Effect to change any number of CSS properties of any number of Elements.
-
-license: MIT-style license
-
-authors:
-  - Valerio Proietti
-
-requires:
-  - Core/Fx.CSS
-  - /MooTools.More
-
-provides: [Fx.Elements]
-
-...
-*/
-
-Fx.Elements = new Class({
-
-	Extends: Fx.CSS,
-
-	initialize: function(elements, options){
-		this.elements = this.subject = $$(elements);
-		this.parent(options);
-	},
-
-	compute: function(from, to, delta){
-		var now = {};
-
-		for (var i in from){
-			var iFrom = from[i], iTo = to[i], iNow = now[i] = {};
-			for (var p in iFrom) iNow[p] = this.parent(iFrom[p], iTo[p], delta);
-		}
-
-		return now;
-	},
-
-	set: function(now){
-		for (var i in now){
-			if (!this.elements[i]) continue;
-
-			var iNow = now[i];
-			for (var p in iNow) this.render(this.elements[i], p, iNow[p], this.options.unit);
-		}
-
-		return this;
-	},
-
-	start: function(obj){
-		if (!this.check(obj)) return this;
-		var from = {}, to = {};
-
-		for (var i in obj){
-			if (!this.elements[i]) continue;
-
-			var iProps = obj[i], iFrom = from[i] = {}, iTo = to[i] = {};
-
-			for (var p in iProps){
-				var parsed = this.prepare(this.elements[i], p, iProps[p]);
-				iFrom[p] = parsed.from;
-				iTo[p] = parsed.to;
-			}
-		}
-
-		return this.parent(from, to);
-	}
-
-});
-
-
-/*
----
-
-script: Fx.Accordion.js
-
-name: Fx.Accordion
-
-description: An Fx.Elements extension which allows you to easily create accordion type controls.
-
-license: MIT-style license
-
-authors:
-  - Valerio Proietti
-
-requires:
-  - Core/Element.Event
-  - /Fx.Elements
-
-provides: [Fx.Accordion]
-
-...
-*/
-
-Fx.Accordion = new Class({
-
-	Extends: Fx.Elements,
-
-	options: {/*
-		onActive: function(toggler, section){},
-		onBackground: function(toggler, section){},*/
-		fixedHeight: false,
-		fixedWidth: false,
-		display: 0,
-		show: false,
-		height: true,
-		width: false,
-		opacity: true,
-		alwaysHide: false,
-		trigger: 'click',
-		initialDisplayFx: true,
-		resetHeight: true
-	},
-
-	initialize: function(){
-		var defined = function(obj){
-			return obj != null;
-		};
-
-		var params = Array.link(arguments, {
-			'container': Type.isElement, //deprecated
-			'options': Type.isObject,
-			'togglers': defined,
-			'elements': defined
-		});
-		this.parent(params.elements, params.options);
-
-		var options = this.options,
-			togglers = this.togglers = $$(params.togglers);
-
-		this.previous = -1;
-		this.internalChain = new Chain();
-
-		if (options.alwaysHide) this.options.link = 'chain';
-
-		if (options.show || this.options.show === 0){
-			options.display = false;
-			this.previous = options.show;
-		}
-
-		if (options.start){
-			options.display = false;
-			options.show = false;
-		}
-
-		var effects = this.effects = {};
-
-		if (options.opacity) effects.opacity = 'fullOpacity';
-		if (options.width) effects.width = options.fixedWidth ? 'fullWidth' : 'offsetWidth';
-		if (options.height) effects.height = options.fixedHeight ? 'fullHeight' : 'scrollHeight';
-
-		for (var i = 0, l = togglers.length; i < l; i++) this.addSection(togglers[i], this.elements[i]);
-
-		this.elements.each(function(el, i){
-			if (options.show === i){
-				this.fireEvent('active', [togglers[i], el]);
-			} else {
-				for (var fx in effects) el.setStyle(fx, 0);
-			}
-		}, this);
-
-		if (options.display || options.display === 0 || options.initialDisplayFx === false){
-			this.display(options.display, options.initialDisplayFx);
-		}
-
-		if (options.fixedHeight !== false) options.resetHeight = false;
-		this.addEvent('complete', this.internalChain.callChain.bind(this.internalChain));
-	},
-
-	addSection: function(toggler, element){
-		toggler = document.id(toggler);
-		element = document.id(element);
-		this.togglers.include(toggler);
-		this.elements.include(element);
-
-		var togglers = this.togglers,
-			options = this.options,
-			test = togglers.contains(toggler),
-			idx = togglers.indexOf(toggler),
-			displayer = this.display.pass(idx, this);
-
-		toggler.store('accordion:display', displayer)
-			.addEvent(options.trigger, displayer);
-
-		if (options.height) element.setStyles({'padding-top': 0, 'border-top': 'none', 'padding-bottom': 0, 'border-bottom': 'none'});
-		if (options.width) element.setStyles({'padding-left': 0, 'border-left': 'none', 'padding-right': 0, 'border-right': 'none'});
-
-		element.fullOpacity = 1;
-		if (options.fixedWidth) element.fullWidth = options.fixedWidth;
-		if (options.fixedHeight) element.fullHeight = options.fixedHeight;
-		element.setStyle('overflow', 'hidden');
-
-		if (!test) for (var fx in this.effects){
-			element.setStyle(fx, 0);
-		}
-		return this;
-	},
-
-	removeSection: function(toggler, displayIndex){
-		var togglers = this.togglers,
-			idx = togglers.indexOf(toggler),
-			element = this.elements[idx];
-
-		var remover = function(){
-			togglers.erase(toggler);
-			this.elements.erase(element);
-			this.detach(toggler);
-		}.bind(this);
-
-		if (this.now == idx || displayIndex != null){
-			this.display(displayIndex != null ? displayIndex : (idx - 1 >= 0 ? idx - 1 : 0)).chain(remover);
-		} else {
-			remover();
-		}
-		return this;
-	},
-
-	detach: function(toggler){
-		var remove = function(toggler){
-			toggler.removeEvent(this.options.trigger, toggler.retrieve('accordion:display'));
-		}.bind(this);
-
-		if (!toggler) this.togglers.each(remove);
-		else remove(toggler);
-		return this;
-	},
-
-	display: function(index, useFx){
-		if (!this.check(index, useFx)) return this;
-
-		var obj = {},
-			elements = this.elements,
-			options = this.options,
-			effects = this.effects;
-
-		if (useFx == null) useFx = true;
-		if (typeOf(index) == 'element') index = elements.indexOf(index);
-		if (index == this.previous && !options.alwaysHide) return this;
-
-		if (options.resetHeight){
-			var prev = elements[this.previous];
-			if (prev && !this.selfHidden){
-				for (var fx in effects) prev.setStyle(fx, prev[effects[fx]]);
-			}
-		}
-
-		if ((this.timer && options.link == 'chain') || (index === this.previous && !options.alwaysHide)) return this;
-
-		this.previous = index;
-		this.selfHidden = false;
-
-		elements.each(function(el, i){
-			obj[i] = {};
-			var hide;
-			if (i != index){
-				hide = true;
-			} else if (options.alwaysHide && ((el.offsetHeight > 0 && options.height) || el.offsetWidth > 0 && options.width)){
-				hide = true;
-				this.selfHidden = true;
-			}
-			this.fireEvent(hide ? 'background' : 'active', [this.togglers[i], el]);
-			for (var fx in effects) obj[i][fx] = hide ? 0 : el[effects[fx]];
-			if (!useFx && !hide && options.resetHeight) obj[i].height = 'auto';
-		}, this);
-
-		this.internalChain.clearChain();
-		this.internalChain.chain(function(){
-			if (options.resetHeight && !this.selfHidden){
-				var el = elements[index];
-				if (el) el.setStyle('height', 'auto');
-			}
-		}.bind(this));
-
-		return useFx ? this.start(obj) : this.set(obj).internalChain.callChain();
-	}
-
-});
-
-/*<1.2compat>*/
-/*
-	Compatibility with 1.2.0
-*/
-var Accordion = new Class({
-
-	Extends: Fx.Accordion,
-
-	initialize: function(){
-		this.parent.apply(this, arguments);
-		var params = Array.link(arguments, {'container': Type.isElement});
-		this.container = params.container;
-	},
-
-	addSection: function(toggler, element, pos){
-		toggler = document.id(toggler);
-		element = document.id(element);
-
-		var test = this.togglers.contains(toggler);
-		var len = this.togglers.length;
-		if (len && (!test || pos)){
-			pos = pos != null ? pos : len - 1;
-			toggler.inject(this.togglers[pos], 'before');
-			element.inject(toggler, 'after');
-		} else if (this.container && !test){
-			toggler.inject(this.container);
-			element.inject(this.container);
-		}
-		return this.parent.apply(this, arguments);
-	}
-
-});
-/*</1.2compat>*/
-
-
-/*
----
-
-script: Fx.Move.js
-
-name: Fx.Move
-
-description: Defines Fx.Move, a class that works with Element.Position.js to transition an element from one location to another.
-
-license: MIT-style license
-
-authors:
-  - Aaron Newton
-
-requires:
-  - Core/Fx.Morph
-  - /Element.Position
-
-provides: [Fx.Move]
-
-...
-*/
-
-Fx.Move = new Class({
-
-	Extends: Fx.Morph,
-
-	options: {
-		relativeTo: document.body,
-		position: 'center',
-		edge: false,
-		offset: {x: 0, y: 0}
-	},
-
-	start: function(destination){
-		var element = this.element,
-			topLeft = element.getStyles('top', 'left');
-		if (topLeft.top == 'auto' || topLeft.left == 'auto'){
-			element.setPosition(element.getPosition(element.getOffsetParent()));
-		}
-		return this.parent(element.position(Object.merge({}, this.options, destination, {returnPos: true})));
-	}
-
-});
-
-Element.Properties.move = {
-
-	set: function(options){
-		this.get('move').cancel().setOptions(options);
-		return this;
-	},
-
-	get: function(){
-		var move = this.retrieve('move');
-		if (!move){
-			move = new Fx.Move(this, {link: 'cancel'});
-			this.store('move', move);
-		}
-		return move;
-	}
-
-};
-
-Element.implement({
-
-	move: function(options){
-		this.get('move').start(options);
-		return this;
-	}
-
-});
-
-
-/*
----
-
-script: Fx.Scroll.js
-
-name: Fx.Scroll
-
-description: Effect to smoothly scroll any element, including the window.
-
-license: MIT-style license
-
-authors:
-  - Valerio Proietti
-
-requires:
-  - Core/Fx
-  - Core/Element.Event
-  - Core/Element.Dimensions
-  - /MooTools.More
-
-provides: [Fx.Scroll]
-
-...
-*/
-
-(function(){
-
-Fx.Scroll = new Class({
-
-	Extends: Fx,
-
-	options: {
-		offset: {x: 0, y: 0},
-		wheelStops: true
-	},
-
-	initialize: function(element, options){
-		this.element = this.subject = document.id(element);
-		this.parent(options);
-
-		if (typeOf(this.element) != 'element') this.element = document.id(this.element.getDocument().body);
-
-		if (this.options.wheelStops){
-			var stopper = this.element,
-				cancel = this.cancel.pass(false, this);
-			this.addEvent('start', function(){
-				stopper.addEvent('mousewheel', cancel);
-			}, true);
-			this.addEvent('complete', function(){
-				stopper.removeEvent('mousewheel', cancel);
-			}, true);
-		}
-	},
-
-	set: function(){
-		var now = Array.flatten(arguments);
-		if (Browser.firefox) now = [Math.round(now[0]), Math.round(now[1])]; // not needed anymore in newer firefox versions
-		this.element.scrollTo(now[0], now[1]);
-		return this;
-	},
-
-	compute: function(from, to, delta){
-		return [0, 1].map(function(i){
-			return Fx.compute(from[i], to[i], delta);
-		});
-	},
-
-	start: function(x, y){
-		if (!this.check(x, y)) return this;
-		var scroll = this.element.getScroll();
-		return this.parent([scroll.x, scroll.y], [x, y]);
-	},
-
-	calculateScroll: function(x, y){
-		var element = this.element,
-			scrollSize = element.getScrollSize(),
-			scroll = element.getScroll(),
-			size = element.getSize(),
-			offset = this.options.offset,
-			values = {x: x, y: y};
-
-		for (var z in values){
-			if (!values[z] && values[z] !== 0) values[z] = scroll[z];
-			if (typeOf(values[z]) != 'number') values[z] = scrollSize[z] - size[z];
-			values[z] += offset[z];
-		}
-
-		return [values.x, values.y];
-	},
-
-	toTop: function(){
-		return this.start.apply(this, this.calculateScroll(false, 0));
-	},
-
-	toLeft: function(){
-		return this.start.apply(this, this.calculateScroll(0, false));
-	},
-
-	toRight: function(){
-		return this.start.apply(this, this.calculateScroll('right', false));
-	},
-
-	toBottom: function(){
-		return this.start.apply(this, this.calculateScroll(false, 'bottom'));
-	},
-
-	toElement: function(el, axes){
-		axes = axes ? Array.from(axes) : ['x', 'y'];
-		var scroll = isBody(this.element) ? {x: 0, y: 0} : this.element.getScroll();
-		var position = Object.map(document.id(el).getPosition(this.element), function(value, axis){
-			return axes.contains(axis) ? value + scroll[axis] : false;
-		});
-		return this.start.apply(this, this.calculateScroll(position.x, position.y));
-	},
-
-	toElementEdge: function(el, axes, offset){
-		axes = axes ? Array.from(axes) : ['x', 'y'];
-		el = document.id(el);
-		var to = {},
-			position = el.getPosition(this.element),
-			size = el.getSize(),
-			scroll = this.element.getScroll(),
-			containerSize = this.element.getSize(),
-			edge = {
-				x: position.x + size.x,
-				y: position.y + size.y
-			};
-
-		['x', 'y'].each(function(axis){
-			if (axes.contains(axis)){
-				if (edge[axis] > scroll[axis] + containerSize[axis]) to[axis] = edge[axis] - containerSize[axis];
-				if (position[axis] < scroll[axis]) to[axis] = position[axis];
-			}
-			if (to[axis] == null) to[axis] = scroll[axis];
-			if (offset && offset[axis]) to[axis] = to[axis] + offset[axis];
-		}, this);
-
-		if (to.x != scroll.x || to.y != scroll.y) this.start(to.x, to.y);
-		return this;
-	},
-
-	toElementCenter: function(el, axes, offset){
-		axes = axes ? Array.from(axes) : ['x', 'y'];
-		el = document.id(el);
-		var to = {},
-			position = el.getPosition(this.element),
-			size = el.getSize(),
-			scroll = this.element.getScroll(),
-			containerSize = this.element.getSize();
-
-		['x', 'y'].each(function(axis){
-			if (axes.contains(axis)){
-				to[axis] = position[axis] - (containerSize[axis] - size[axis]) / 2;
-			}
-			if (to[axis] == null) to[axis] = scroll[axis];
-			if (offset && offset[axis]) to[axis] = to[axis] + offset[axis];
-		}, this);
-
-		if (to.x != scroll.x || to.y != scroll.y) this.start(to.x, to.y);
-		return this;
-	}
-
-});
-
-//<1.2compat>
-Fx.Scroll.implement({
-	scrollToCenter: function(){
-		return this.toElementCenter.apply(this, arguments);
-	},
-	scrollIntoView: function(){
-		return this.toElementEdge.apply(this, arguments);
-	}
-});
-//</1.2compat>
-
-function isBody(element){
-	return (/^(?:body|html)$/i).test(element.tagName);
-}
-
-})();
-
-
-/*
----
-
-script: Fx.Slide.js
-
-name: Fx.Slide
-
-description: Effect to slide an element in and out of view.
-
-license: MIT-style license
-
-authors:
-  - Valerio Proietti
-
-requires:
-  - Core/Fx
-  - Core/Element.Style
-  - /MooTools.More
-
-provides: [Fx.Slide]
-
-...
-*/
-
-Fx.Slide = new Class({
-
-	Extends: Fx,
-
-	options: {
-		mode: 'vertical',
-		wrapper: false,
-		hideOverflow: true,
-		resetHeight: false
-	},
-
-	initialize: function(element, options){
-		element = this.element = this.subject = document.id(element);
-		this.parent(options);
-		options = this.options;
-
-		var wrapper = element.retrieve('wrapper'),
-			styles = element.getStyles('margin', 'position', 'overflow');
-
-		if (options.hideOverflow) styles = Object.append(styles, {overflow: 'hidden'});
-		if (options.wrapper) wrapper = document.id(options.wrapper).setStyles(styles);
-
-		if (!wrapper) wrapper = new Element('div', {
-			styles: styles
-		}).wraps(element);
-
-		element.store('wrapper', wrapper).setStyle('margin', 0);
-		if (element.getStyle('overflow') == 'visible') element.setStyle('overflow', 'hidden');
-
-		this.now = [];
-		this.open = true;
-		this.wrapper = wrapper;
-
-		this.addEvent('complete', function(){
-			this.open = (wrapper['offset' + this.layout.capitalize()] != 0);
-			if (this.open && this.options.resetHeight) wrapper.setStyle('height', '');
-		}, true);
-	},
-
-	vertical: function(){
-		this.margin = 'margin-top';
-		this.layout = 'height';
-		this.offset = this.element.offsetHeight;
-	},
-
-	horizontal: function(){
-		this.margin = 'margin-left';
-		this.layout = 'width';
-		this.offset = this.element.offsetWidth;
-	},
-
-	set: function(now){
-		this.element.setStyle(this.margin, now[0]);
-		this.wrapper.setStyle(this.layout, now[1]);
-		return this;
-	},
-
-	compute: function(from, to, delta){
-		return [0, 1].map(function(i){
-			return Fx.compute(from[i], to[i], delta);
-		});
-	},
-
-	start: function(how, mode){
-		if (!this.check(how, mode)) return this;
-		this[mode || this.options.mode]();
-
-		var margin = this.element.getStyle(this.margin).toInt(),
-			layout = this.wrapper.getStyle(this.layout).toInt(),
-			caseIn = [[margin, layout], [0, this.offset]],
-			caseOut = [[margin, layout], [-this.offset, 0]],
-			start;
-
-		switch (how){
-			case 'in': start = caseIn; break;
-			case 'out': start = caseOut; break;
-			case 'toggle': start = (layout == 0) ? caseIn : caseOut;
-		}
-		return this.parent(start[0], start[1]);
-	},
-
-	slideIn: function(mode){
-		return this.start('in', mode);
-	},
-
-	slideOut: function(mode){
-		return this.start('out', mode);
-	},
-
-	hide: function(mode){
-		this[mode || this.options.mode]();
-		this.open = false;
-		return this.set([-this.offset, 0]);
-	},
-
-	show: function(mode){
-		this[mode || this.options.mode]();
-		this.open = true;
-		return this.set([0, this.offset]);
-	},
-
-	toggle: function(mode){
-		return this.start('toggle', mode);
-	}
-
-});
-
-Element.Properties.slide = {
-
-	set: function(options){
-		this.get('slide').cancel().setOptions(options);
-		return this;
-	},
-
-	get: function(){
-		var slide = this.retrieve('slide');
-		if (!slide){
-			slide = new Fx.Slide(this, {link: 'cancel'});
-			this.store('slide', slide);
-		}
-		return slide;
-	}
-
-};
-
-Element.implement({
-
-	slide: function(how, mode){
-		how = how || 'toggle';
-		var slide = this.get('slide'), toggle;
-		switch (how){
-			case 'hide': slide.hide(mode); break;
-			case 'show': slide.show(mode); break;
-			case 'toggle':
-				var flag = this.retrieve('slide:flag', slide.open);
-				slide[flag ? 'slideOut' : 'slideIn'](mode);
-				this.store('slide:flag', !flag);
-				toggle = true;
-			break;
-			default: slide.start(how, mode);
-		}
-		if (!toggle) this.eliminate('slide:flag');
-		return this;
-	}
-
-});
-
-
-/*
----
-
-script: Fx.SmoothScroll.js
-
-name: Fx.SmoothScroll
-
-description: Class for creating a smooth scrolling effect to all internal links on the page.
-
-license: MIT-style license
-
-authors:
-  - Valerio Proietti
-
-requires:
-  - Core/Slick.Finder
-  - /Fx.Scroll
-
-provides: [Fx.SmoothScroll]
-
-...
-*/
-
-/*<1.2compat>*/var SmoothScroll = /*</1.2compat>*/Fx.SmoothScroll = new Class({
-
-	Extends: Fx.Scroll,
-
-	options: {
-		axes: ['x', 'y']
-	},
-
-	initialize: function(options, context){
-		context = context || document;
-		this.doc = context.getDocument();
-		this.parent(this.doc, options);
-
-		var win = context.getWindow(),
-			location = win.location.href.match(/^[^#]*/)[0] + '#',
-			links = $$(this.options.links || this.doc.links);
-
-		links.each(function(link){
-			if (link.href.indexOf(location) != 0) return;
-			var anchor = link.href.substr(location.length);
-			if (anchor) this.useLink(link, anchor);
-		}, this);
-
-		this.addEvent('complete', function(){
-			win.location.hash = this.anchor;
-			this.element.scrollTo(this.to[0], this.to[1]);
-		}, true);
-	},
-
-	useLink: function(link, anchor){
-
-		link.addEvent('click', function(event){
-			var el = document.id(anchor) || this.doc.getElement('a[name=' + anchor + ']');
-			if (!el) return;
-
-			event.preventDefault();
-			this.toElement(el, this.options.axes).chain(function(){
-				this.fireEvent('scrolledTo', [link, el]);
-			}.bind(this));
-
-			this.anchor = anchor;
-
-		}.bind(this));
-
-		return this;
-	}
-});
-
-
-/*
----
-
-script: Fx.Sort.js
-
-name: Fx.Sort
-
-description: Defines Fx.Sort, a class that reorders lists with a transition.
-
-license: MIT-style license
-
-authors:
-  - Aaron Newton
-
-requires:
-  - Core/Element.Dimensions
-  - /Fx.Elements
-  - /Element.Measure
-
-provides: [Fx.Sort]
-
-...
-*/
-
-Fx.Sort = new Class({
-
-	Extends: Fx.Elements,
-
-	options: {
-		mode: 'vertical'
-	},
-
-	initialize: function(elements, options){
-		this.parent(elements, options);
-		this.elements.each(function(el){
-			if (el.getStyle('position') == 'static') el.setStyle('position', 'relative');
-		});
-		this.setDefaultOrder();
-	},
-
-	setDefaultOrder: function(){
-		this.currentOrder = this.elements.map(function(el, index){
-			return index;
-		});
-	},
-
-	sort: function(){
-		if (!this.check(arguments)) return this;
-		var newOrder = Array.flatten(arguments);
-
-		var top = 0,
-			left = 0,
-			next = {},
-			zero = {},
-			vert = this.options.mode == 'vertical';
-
-		var current = this.elements.map(function(el, index){
-			var size = el.getComputedSize({styles: ['border', 'padding', 'margin']});
-			var val;
-			if (vert){
-				val = {
-					top: top,
-					margin: size['margin-top'],
-					height: size.totalHeight
-				};
-				top += val.height - size['margin-top'];
-			} else {
-				val = {
-					left: left,
-					margin: size['margin-left'],
-					width: size.totalWidth
-				};
-				left += val.width;
-			}
-			var plane = vert ? 'top' : 'left';
-			zero[index] = {};
-			var start = el.getStyle(plane).toInt();
-			zero[index][plane] = start || 0;
-			return val;
-		}, this);
-
-		this.set(zero);
-		newOrder = newOrder.map(function(i){ return i.toInt(); });
-		if (newOrder.length != this.elements.length){
-			this.currentOrder.each(function(index){
-				if (!newOrder.contains(index)) newOrder.push(index);
-			});
-			if (newOrder.length > this.elements.length)
-				newOrder.splice(this.elements.length-1, newOrder.length - this.elements.length);
-		}
-		var margin = 0;
-		top = left = 0;
-		newOrder.each(function(item){
-			var newPos = {};
-			if (vert){
-				newPos.top = top - current[item].top - margin;
-				top += current[item].height;
-			} else {
-				newPos.left = left - current[item].left;
-				left += current[item].width;
-			}
-			margin = margin + current[item].margin;
-			next[item]=newPos;
-		}, this);
-		var mapped = {};
-		Array.clone(newOrder).sort().each(function(index){
-			mapped[index] = next[index];
-		});
-		this.start(mapped);
-		this.currentOrder = newOrder;
-
-		return this;
-	},
-
-	rearrangeDOM: function(newOrder){
-		newOrder = newOrder || this.currentOrder;
-		var parent = this.elements[0].getParent();
-		var rearranged = [];
-		this.elements.setStyle('opacity', 0);
-		//move each element and store the new default order
-		newOrder.each(function(index){
-			rearranged.push(this.elements[index].inject(parent).setStyles({
-				top: 0,
-				left: 0
-			}));
-		}, this);
-		this.elements.setStyle('opacity', 1);
-		this.elements = $$(rearranged);
-		this.setDefaultOrder();
-		return this;
-	},
-
-	getDefaultOrder: function(){
-		return this.elements.map(function(el, index){
-			return index;
-		});
-	},
-
-	getCurrentOrder: function(){
-		return this.currentOrder;
-	},
-
-	forward: function(){
-		return this.sort(this.getDefaultOrder());
-	},
-
-	backward: function(){
-		return this.sort(this.getDefaultOrder().reverse());
-	},
-
-	reverse: function(){
-		return this.sort(this.currentOrder.reverse());
-	},
-
-	sortByElements: function(elements){
-		return this.sort(elements.map(function(el){
-			return this.elements.indexOf(el);
-		}, this));
-	},
-
-	swap: function(one, two){
-		if (typeOf(one) == 'element') one = this.elements.indexOf(one);
-		if (typeOf(two) == 'element') two = this.elements.indexOf(two);
-
-		var newOrder = Array.clone(this.currentOrder);
-		newOrder[this.currentOrder.indexOf(one)] = two;
-		newOrder[this.currentOrder.indexOf(two)] = one;
-
-		return this.sort(newOrder);
-	}
-
-});
-
-
-/*
----
-
-script: Drag.js
-
-name: Drag
-
-description: The base Drag Class. Can be used to drag and resize Elements using mouse events.
-
-license: MIT-style license
-
-authors:
-  - Valerio Proietti
-  - Tom Occhinno
-  - Jan Kassens
-
-requires:
-  - Core/Events
-  - Core/Options
-  - Core/Element.Event
-  - Core/Element.Style
-  - Core/Element.Dimensions
-  - /MooTools.More
-
-provides: [Drag]
-...
-
-*/
-
-var Drag = new Class({
-
-	Implements: [Events, Options],
-
-	options: {/*
-		onBeforeStart: function(thisElement){},
-		onStart: function(thisElement, event){},
-		onSnap: function(thisElement){},
-		onDrag: function(thisElement, event){},
-		onCancel: function(thisElement){},
-		onComplete: function(thisElement, event){},*/
-		snap: 6,
-		unit: 'px',
-		grid: false,
-		style: true,
-		limit: false,
-		handle: false,
-		invert: false,
-		preventDefault: false,
-		stopPropagation: false,
-		modifiers: {x: 'left', y: 'top'}
-	},
-
-	initialize: function(){
-		var params = Array.link(arguments, {
-			'options': Type.isObject,
-			'element': function(obj){
-				return obj != null;
-			}
-		});
-
-		this.element = document.id(params.element);
-		this.document = this.element.getDocument();
-		this.setOptions(params.options || {});
-		var htype = typeOf(this.options.handle);
-		this.handles = ((htype == 'array' || htype == 'collection') ? $$(this.options.handle) : document.id(this.options.handle)) || this.element;
-		this.mouse = {'now': {}, 'pos': {}};
-		this.value = {'start': {}, 'now': {}};
-
-		this.selection = (Browser.ie) ? 'selectstart' : 'mousedown';
-
-
-		if (Browser.ie && !Drag.ondragstartFixed){
-			document.ondragstart = Function.from(false);
-			Drag.ondragstartFixed = true;
-		}
-
-		this.bound = {
-			start: this.start.bind(this),
-			check: this.check.bind(this),
-			drag: this.drag.bind(this),
-			stop: this.stop.bind(this),
-			cancel: this.cancel.bind(this),
-			eventStop: Function.from(false)
-		};
-		this.attach();
-	},
-
-	attach: function(){
-		this.handles.addEvent('mousedown', this.bound.start);
-		return this;
-	},
-
-	detach: function(){
-		this.handles.removeEvent('mousedown', this.bound.start);
-		return this;
-	},
-
-	start: function(event){
-		var options = this.options;
-
-		if (event.rightClick) return;
-
-		if (options.preventDefault) event.preventDefault();
-		if (options.stopPropagation) event.stopPropagation();
-		this.mouse.start = event.page;
-
-		this.fireEvent('beforeStart', this.element);
-
-		var limit = options.limit;
-		this.limit = {x: [], y: []};
-
-		var z, coordinates;
-		for (z in options.modifiers){
-			if (!options.modifiers[z]) continue;
-
-			var style = this.element.getStyle(options.modifiers[z]);
-
-			// Some browsers (IE and Opera) don't always return pixels.
-			if (style && !style.match(/px$/)){
-				if (!coordinates) coordinates = this.element.getCoordinates(this.element.getOffsetParent());
-				style = coordinates[options.modifiers[z]];
-			}
-
-			if (options.style) this.value.now[z] = (style || 0).toInt();
-			else this.value.now[z] = this.element[options.modifiers[z]];
-
-			if (options.invert) this.value.now[z] *= -1;
-
-			this.mouse.pos[z] = event.page[z] - this.value.now[z];
-
-			if (limit && limit[z]){
-				var i = 2;
-				while (i--){
-					var limitZI = limit[z][i];
-					if (limitZI || limitZI === 0) this.limit[z][i] = (typeof limitZI == 'function') ? limitZI() : limitZI;
-				}
-			}
-		}
-
-		if (typeOf(this.options.grid) == 'number') this.options.grid = {
-			x: this.options.grid,
-			y: this.options.grid
-		};
-
-		var events = {
-			mousemove: this.bound.check,
-			mouseup: this.bound.cancel
-		};
-		events[this.selection] = this.bound.eventStop;
-		this.document.addEvents(events);
-	},
-
-	check: function(event){
-		if (this.options.preventDefault) event.preventDefault();
-		var distance = Math.round(Math.sqrt(Math.pow(event.page.x - this.mouse.start.x, 2) + Math.pow(event.page.y - this.mouse.start.y, 2)));
-		if (distance > this.options.snap){
-			this.cancel();
-			this.document.addEvents({
-				mousemove: this.bound.drag,
-				mouseup: this.bound.stop
-			});
-			this.fireEvent('start', [this.element, event]).fireEvent('snap', this.element);
-		}
-	},
-
-	drag: function(event){
-		var options = this.options;
-
-		if (options.preventDefault) event.preventDefault();
-		this.mouse.now = event.page;
-
-		for (var z in options.modifiers){
-			if (!options.modifiers[z]) continue;
-			this.value.now[z] = this.mouse.now[z] - this.mouse.pos[z];
-
-			if (options.invert) this.value.now[z] *= -1;
-
-			if (options.limit && this.limit[z]){
-				if ((this.limit[z][1] || this.limit[z][1] === 0) && (this.value.now[z] > this.limit[z][1])){
-					this.value.now[z] = this.limit[z][1];
-				} else if ((this.limit[z][0] || this.limit[z][0] === 0) && (this.value.now[z] < this.limit[z][0])){
-					this.value.now[z] = this.limit[z][0];
-				}
-			}
-
-			if (options.grid[z]) this.value.now[z] -= ((this.value.now[z] - (this.limit[z][0]||0)) % options.grid[z]);
-
-			if (options.style) this.element.setStyle(options.modifiers[z], this.value.now[z] + options.unit);
-			else this.element[options.modifiers[z]] = this.value.now[z];
-		}
-
-		this.fireEvent('drag', [this.element, event]);
-	},
-
-	cancel: function(event){
-		this.document.removeEvents({
-			mousemove: this.bound.check,
-			mouseup: this.bound.cancel
-		});
-		if (event){
-			this.document.removeEvent(this.selection, this.bound.eventStop);
-			this.fireEvent('cancel', this.element);
-		}
-	},
-
-	stop: function(event){
-		var events = {
-			mousemove: this.bound.drag,
-			mouseup: this.bound.stop
-		};
-		events[this.selection] = this.bound.eventStop;
-		this.document.removeEvents(events);
-		if (event) this.fireEvent('complete', [this.element, event]);
-	}
-
-});
-
-Element.implement({
-
-	makeResizable: function(options){
-		var drag = new Drag(this, Object.merge({
-			modifiers: {
-				x: 'width',
-				y: 'height'
-			}
-		}, options));
-
-		this.store('resizer', drag);
-		return drag.addEvent('drag', function(){
-			this.fireEvent('resize', drag);
-		}.bind(this));
-	}
-
-});
-
-
-/*
----
-
-script: Drag.Move.js
-
-name: Drag.Move
-
-description: A Drag extension that provides support for the constraining of draggables to containers and droppables.
-
-license: MIT-style license
-
-authors:
-  - Valerio Proietti
-  - Tom Occhinno
-  - Jan Kassens
-  - Aaron Newton
-  - Scott Kyle
-
-requires:
-  - Core/Element.Dimensions
-  - /Drag
-
-provides: [Drag.Move]
-
-...
-*/
-
-Drag.Move = new Class({
-
-	Extends: Drag,
-
-	options: {/*
-		onEnter: function(thisElement, overed){},
-		onLeave: function(thisElement, overed){},
-		onDrop: function(thisElement, overed, event){},*/
-		droppables: [],
-		container: false,
-		precalculate: false,
-		includeMargins: true,
-		checkDroppables: true
-	},
-
-	initialize: function(element, options){
-		this.parent(element, options);
-		element = this.element;
-
-		this.droppables = $$(this.options.droppables);
-		this.container = document.id(this.options.container);
-
-		if (this.container && typeOf(this.container) != 'element')
-			this.container = document.id(this.container.getDocument().body);
-
-		if (this.options.style){
-			if (this.options.modifiers.x == 'left' && this.options.modifiers.y == 'top'){
-				var parent = element.getOffsetParent(),
-					styles = element.getStyles('left', 'top');
-				if (parent && (styles.left == 'auto' || styles.top == 'auto')){
-					element.setPosition(element.getPosition(parent));
-				}
-			}
-
-			if (element.getStyle('position') == 'static') element.setStyle('position', 'absolute');
-		}
-
-		this.addEvent('start', this.checkDroppables, true);
-		this.overed = null;
-	},
-
-	start: function(event){
-		if (this.container) this.options.limit = this.calculateLimit();
-
-		if (this.options.precalculate){
-			this.positions = this.droppables.map(function(el){
-				return el.getCoordinates();
-			});
-		}
-
-		this.parent(event);
-	},
-
-	calculateLimit: function(){
-		var element = this.element,
-			container = this.container,
-
-			offsetParent = document.id(element.getOffsetParent()) || document.body,
-			containerCoordinates = container.getCoordinates(offsetParent),
-			elementMargin = {},
-			elementBorder = {},
-			containerMargin = {},
-			containerBorder = {},
-			offsetParentPadding = {};
-
-		['top', 'right', 'bottom', 'left'].each(function(pad){
-			elementMargin[pad] = element.getStyle('margin-' + pad).toInt();
-			elementBorder[pad] = element.getStyle('border-' + pad).toInt();
-			containerMargin[pad] = container.getStyle('margin-' + pad).toInt();
-			containerBorder[pad] = container.getStyle('border-' + pad).toInt();
-			offsetParentPadding[pad] = offsetParent.getStyle('padding-' + pad).toInt();
-		}, this);
-
-		var width = element.offsetWidth + elementMargin.left + elementMargin.right,
-			height = element.offsetHeight + elementMargin.top + elementMargin.bottom,
-			left = 0,
-			top = 0,
-			right = containerCoordinates.right - containerBorder.right - width,
-			bottom = containerCoordinates.bottom - containerBorder.bottom - height;
-
-		if (this.options.includeMargins){
-			left += elementMargin.left;
-			top += elementMargin.top;
-		} else {
-			right += elementMargin.right;
-			bottom += elementMargin.bottom;
-		}
-
-		if (element.getStyle('position') == 'relative'){
-			var coords = element.getCoordinates(offsetParent);
-			coords.left -= element.getStyle('left').toInt();
-			coords.top -= element.getStyle('top').toInt();
-
-			left -= coords.left;
-			top -= coords.top;
-			if (container.getStyle('position') != 'relative'){
-				left += containerBorder.left;
-				top += containerBorder.top;
-			}
-			right += elementMargin.left - coords.left;
-			bottom += elementMargin.top - coords.top;
-
-			if (container != offsetParent){
-				left += containerMargin.left + offsetParentPadding.left;
-				top += ((Browser.ie6 || Browser.ie7) ? 0 : containerMargin.top) + offsetParentPadding.top;
-			}
-		} else {
-			left -= elementMargin.left;
-			top -= elementMargin.top;
-			if (container != offsetParent){
-				left += containerCoordinates.left + containerBorder.left;
-				top += containerCoordinates.top + containerBorder.top;
-			}
-		}
-
-		return {
-			x: [left, right],
-			y: [top, bottom]
-		};
-	},
-
-	getDroppableCoordinates: function(element){
-		var position = element.getCoordinates();
-		if (element.getStyle('position') == 'fixed'){
-			var scroll = window.getScroll();
-			position.left += scroll.x;
-			position.right += scroll.x;
-			position.top += scroll.y;
-			position.bottom += scroll.y;
-		}
-		return position;
-	},
-
-	checkDroppables: function(){
-		var overed = this.droppables.filter(function(el, i){
-			el = this.positions ? this.positions[i] : this.getDroppableCoordinates(el);
-			var now = this.mouse.now;
-			return (now.x > el.left && now.x < el.right && now.y < el.bottom && now.y > el.top);
-		}, this).getLast();
-
-		if (this.overed != overed){
-			if (this.overed) this.fireEvent('leave', [this.element, this.overed]);
-			if (overed) this.fireEvent('enter', [this.element, overed]);
-			this.overed = overed;
-		}
-	},
-
-	drag: function(event){
-		this.parent(event);
-		if (this.options.checkDroppables && this.droppables.length) this.checkDroppables();
-	},
-
-	stop: function(event){
-		this.checkDroppables();
-		this.fireEvent('drop', [this.element, this.overed, event]);
-		this.overed = null;
-		return this.parent(event);
-	}
-
-});
-
-Element.implement({
-
-	makeDraggable: function(options){
-		var drag = new Drag.Move(this, options);
-		this.store('dragger', drag);
-		return drag;
-	}
-
-});
-
-
-/*
----
-
-script: Slider.js
-
-name: Slider
-
-description: Class for creating horizontal and vertical slider controls.
-
-license: MIT-style license
-
-authors:
-  - Valerio Proietti
-
-requires:
-  - Core/Element.Dimensions
-  - /Class.Binds
-  - /Drag
-  - /Element.Measure
-
-provides: [Slider]
-
-...
-*/
-
-var Slider = new Class({
-
-	Implements: [Events, Options],
-
-	Binds: ['clickedElement', 'draggedKnob', 'scrolledElement'],
-
-	options: {/*
-		onTick: function(intPosition){},
-		onChange: function(intStep){},
-		onComplete: function(strStep){},*/
-		onTick: function(position){
-			this.setKnobPosition(position);
-		},
-		initialStep: 0,
-		snap: false,
-		offset: 0,
-		range: false,
-		wheel: false,
-		steps: 100,
-		mode: 'horizontal'
-	},
-
-	initialize: function(element, knob, options){
-		this.setOptions(options);
-		options = this.options;
-		this.element = document.id(element);
-		knob = this.knob = document.id(knob);
-		this.previousChange = this.previousEnd = this.step = -1;
-
-		var limit = {},
-			modifiers = {x: false, y: false};
-
-		switch (options.mode){
-			case 'vertical':
-				this.axis = 'y';
-				this.property = 'top';
-				this.offset = 'offsetHeight';
-				break;
-			case 'horizontal':
-				this.axis = 'x';
-				this.property = 'left';
-				this.offset = 'offsetWidth';
-		}
-
-		this.setSliderDimensions();
-		this.setRange(options.range);
-
-		if (knob.getStyle('position') == 'static') knob.setStyle('position', 'relative');
-		knob.setStyle(this.property, -options.offset);
-		modifiers[this.axis] = this.property;
-		limit[this.axis] = [-options.offset, this.full - options.offset];
-
-		var dragOptions = {
-			snap: 0,
-			limit: limit,
-			modifiers: modifiers,
-			onDrag: this.draggedKnob,
-			onStart: this.draggedKnob,
-			onBeforeStart: (function(){
-				this.isDragging = true;
-			}).bind(this),
-			onCancel: function(){
-				this.isDragging = false;
-			}.bind(this),
-			onComplete: function(){
-				this.isDragging = false;
-				this.draggedKnob();
-				this.end();
-			}.bind(this)
-		};
-		if (options.snap) this.setSnap(dragOptions);
-
-		this.drag = new Drag(knob, dragOptions);
-		this.attach();
-		if (options.initialStep != null) this.set(options.initialStep);
-	},
-
-	attach: function(){
-		this.element.addEvent('mousedown', this.clickedElement);
-		if (this.options.wheel) this.element.addEvent('mousewheel', this.scrolledElement);
-		this.drag.attach();
-		return this;
-	},
-
-	detach: function(){
-		this.element.removeEvent('mousedown', this.clickedElement)
-			.removeEvent('mousewheel', this.scrolledElement);
-		this.drag.detach();
-		return this;
-	},
-
-	autosize: function(){
-		this.setSliderDimensions()
-			.setKnobPosition(this.toPosition(this.step));
-		this.drag.options.limit[this.axis] = [-this.options.offset, this.full - this.options.offset];
-		if (this.options.snap) this.setSnap();
-		return this;
-	},
-
-	setSnap: function(options){
-		if (!options) options = this.drag.options;
-		options.grid = Math.ceil(this.stepWidth);
-		options.limit[this.axis][1] = this.full;
-		return this;
-	},
-
-	setKnobPosition: function(position){
-		if (this.options.snap) position = this.toPosition(this.step);
-		this.knob.setStyle(this.property, position);
-		return this;
-	},
-
-	setSliderDimensions: function(){
-		this.full = this.element.measure(function(){
-			this.half = this.knob[this.offset] / 2;
-			return this.element[this.offset] - this.knob[this.offset] + (this.options.offset * 2);
-		}.bind(this));
-		return this;
-	},
-
-	set: function(step){
-		if (!((this.range > 0) ^ (step < this.min))) step = this.min;
-		if (!((this.range > 0) ^ (step > this.max))) step = this.max;
-
-		this.step = Math.round(step);
-		return this.checkStep()
-			.fireEvent('tick', this.toPosition(this.step))
-			.end();
-	},
-
-	setRange: function(range, pos){
-		this.min = Array.pick([range[0], 0]);
-		this.max = Array.pick([range[1], this.options.steps]);
-		this.range = this.max - this.min;
-		this.steps = this.options.steps || this.full;
-		this.stepSize = Math.abs(this.range) / this.steps;
-		this.stepWidth = this.stepSize * this.full / Math.abs(this.range);
-		if (range) this.set(Array.pick([pos, this.step]).floor(this.min).max(this.max));
-		return this;
-	},
-
-	clickedElement: function(event){
-		if (this.isDragging || event.target == this.knob) return;
-
-		var dir = this.range < 0 ? -1 : 1,
-			position = event.page[this.axis] - this.element.getPosition()[this.axis] - this.half;
-
-		position = position.limit(-this.options.offset, this.full - this.options.offset);
-
-		this.step = Math.round(this.min + dir * this.toStep(position));
-
-		this.checkStep()
-			.fireEvent('tick', position)
-			.end();
-	},
-
-	scrolledElement: function(event){
-		var mode = (this.options.mode == 'horizontal') ? (event.wheel < 0) : (event.wheel > 0);
-		this.set(this.step + (mode ? -1 : 1) * this.stepSize);
-		event.stop();
-	},
-
-	draggedKnob: function(){
-		var dir = this.range < 0 ? -1 : 1,
-			position = this.drag.value.now[this.axis];
-
-		position = position.limit(-this.options.offset, this.full -this.options.offset);
-
-		this.step = Math.round(this.min + dir * this.toStep(position));
-		this.checkStep();
-	},
-
-	checkStep: function(){
-		var step = this.step;
-		if (this.previousChange != step){
-			this.previousChange = step;
-			this.fireEvent('change', step);
-		}
-		return this;
-	},
-
-	end: function(){
-		var step = this.step;
-		if (this.previousEnd !== step){
-			this.previousEnd = step;
-			this.fireEvent('complete', step + '');
-		}
-		return this;
-	},
-
-	toStep: function(position){
-		var step = (position + this.options.offset) * this.stepSize / this.full * this.steps;
-		return this.options.steps ? Math.round(step -= step % this.stepSize) : step;
-	},
-
-	toPosition: function(step){
-		return (this.full * Math.abs(this.min - step)) / (this.steps * this.stepSize) - this.options.offset;
-	}
-
-});
-
-
-/*
----
-
-script: Sortables.js
-
-name: Sortables
-
-description: Class for creating a drag and drop sorting interface for lists of items.
-
-license: MIT-style license
-
-authors:
-  - Tom Occhino
-
-requires:
-  - Core/Fx.Morph
-  - /Drag.Move
-
-provides: [Sortables]
-
-...
-*/
-
-var Sortables = new Class({
-
-	Implements: [Events, Options],
-
-	options: {/*
-		onSort: function(element, clone){},
-		onStart: function(element, clone){},
-		onComplete: function(element){},*/
-		opacity: 1,
-		clone: false,
-		revert: false,
-		handle: false,
-		dragOptions: {}/*<1.2compat>*/,
-		snap: 4,
-		constrain: false,
-		preventDefault: false
-		/*</1.2compat>*/
-	},
-
-	initialize: function(lists, options){
-		this.setOptions(options);
-
-		this.elements = [];
-		this.lists = [];
-		this.idle = true;
-
-		this.addLists($$(document.id(lists) || lists));
-
-		if (!this.options.clone) this.options.revert = false;
-		if (this.options.revert) this.effect = new Fx.Morph(null, Object.merge({
-			duration: 250,
-			link: 'cancel'
-		}, this.options.revert));
-	},
-
-	attach: function(){
-		this.addLists(this.lists);
-		return this;
-	},
-
-	detach: function(){
-		this.lists = this.removeLists(this.lists);
-		return this;
-	},
-
-	addItems: function(){
-		Array.flatten(arguments).each(function(element){
-			this.elements.push(element);
-			var start = element.retrieve('sortables:start', function(event){
-				this.start.call(this, event, element);
-			}.bind(this));
-			(this.options.handle ? element.getElement(this.options.handle) || element : element).addEvent('mousedown', start);
-		}, this);
-		return this;
-	},
-
-	addLists: function(){
-		Array.flatten(arguments).each(function(list){
-			this.lists.include(list);
-			this.addItems(list.getChildren());
-		}, this);
-		return this;
-	},
-
-	removeItems: function(){
-		return $$(Array.flatten(arguments).map(function(element){
-			this.elements.erase(element);
-			var start = element.retrieve('sortables:start');
-			(this.options.handle ? element.getElement(this.options.handle) || element : element).removeEvent('mousedown', start);
-
-			return element;
-		}, this));
-	},
-
-	removeLists: function(){
-		return $$(Array.flatten(arguments).map(function(list){
-			this.lists.erase(list);
-			this.removeItems(list.getChildren());
-
-			return list;
-		}, this));
-	},
-
-	getClone: function(event, element){
-		if (!this.options.clone) return new Element(element.tagName).inject(document.body);
-		if (typeOf(this.options.clone) == 'function') return this.options.clone.call(this, event, element, this.list);
-		var clone = element.clone(true).setStyles({
-			margin: 0,
-			position: 'absolute',
-			visibility: 'hidden',
-			width: element.getStyle('width')
-		}).addEvent('mousedown', function(event){
-			element.fireEvent('mousedown', event);
-		});
-		//prevent the duplicated radio inputs from unchecking the real one
-		if (clone.get('html').test('radio')){
-			clone.getElements('input[type=radio]').each(function(input, i){
-				input.set('name', 'clone_' + i);
-				if (input.get('checked')) element.getElements('input[type=radio]')[i].set('checked', true);
-			});
-		}
-
-		return clone.inject(this.list).setPosition(element.getPosition(element.getOffsetParent()));
-	},
-
-	getDroppables: function(){
-		var droppables = this.list.getChildren().erase(this.clone).erase(this.element);
-		if (!this.options.constrain) droppables.append(this.lists).erase(this.list);
-		return droppables;
-	},
-
-	insert: function(dragging, element){
-		var where = 'inside';
-		if (this.lists.contains(element)){
-			this.list = element;
-			this.drag.droppables = this.getDroppables();
-		} else {
-			where = this.element.getAllPrevious().contains(element) ? 'before' : 'after';
-		}
-		this.element.inject(element, where);
-		this.fireEvent('sort', [this.element, this.clone]);
-	},
-
-	start: function(event, element){
-		if (
-			!this.idle ||
-			event.rightClick ||
-			['button', 'input', 'a'].contains(event.target.get('tag'))
-		) return;
-
-		this.idle = false;
-		this.element = element;
-		this.opacity = element.get('opacity');
-		this.list = element.getParent();
-		this.clone = this.getClone(event, element);
-
-		this.drag = new Drag.Move(this.clone, Object.merge({
-			/*<1.2compat>*/
-			preventDefault: this.options.preventDefault,
-			snap: this.options.snap,
-			container: this.options.constrain && this.element.getParent(),
-			/*</1.2compat>*/
-			droppables: this.getDroppables()
-		}, this.options.dragOptions)).addEvents({
-			onSnap: function(){
-				event.stop();
-				this.clone.setStyle('visibility', 'visible');
-				this.element.set('opacity', this.options.opacity || 0);
-				this.fireEvent('start', [this.element, this.clone]);
-			}.bind(this),
-			onEnter: this.insert.bind(this),
-			onCancel: this.end.bind(this),
-			onComplete: this.end.bind(this)
-		});
-
-		this.clone.inject(this.element, 'before');
-		this.drag.start(event);
-	},
-
-	end: function(){
-		this.drag.detach();
-		this.element.set('opacity', this.opacity);
-		if (this.effect){
-			var dim = this.element.getStyles('width', 'height'),
-				clone = this.clone,
-				pos = clone.computePosition(this.element.getPosition(this.clone.getOffsetParent()));
-
-			var destroy = function(){
-				this.removeEvent('cancel', destroy);
-				clone.destroy();
-			};
-
-			this.effect.element = clone;
-			this.effect.start({
-				top: pos.top,
-				left: pos.left,
-				width: dim.width,
-				height: dim.height,
-				opacity: 0.25
-			}).addEvent('cancel', destroy).chain(destroy);
-		} else {
-			this.clone.destroy();
-		}
-		this.reset();
-	},
-
-	reset: function(){
-		this.idle = true;
-		this.fireEvent('complete', this.element);
-	},
-
-	serialize: function(){
-		var params = Array.link(arguments, {
-			modifier: Type.isFunction,
-			index: function(obj){
-				return obj != null;
-			}
-		});
-		var serial = this.lists.map(function(list){
-			return list.getChildren().map(params.modifier || function(element){
-				return element.get('id');
-			}, this);
-		}, this);
-
-		var index = params.index;
-		if (this.lists.length == 1) index = 0;
-		return (index || index === 0) && index >= 0 && index < this.lists.length ? serial[index] : serial;
-	}
-
-});
-
-
-/*
----
-
-script: Request.JSONP.js
-
-name: Request.JSONP
-
-description: Defines Request.JSONP, a class for cross domain javascript via script injection.
-
-license: MIT-style license
-
-authors:
-  - Aaron Newton
-  - Guillermo Rauch
-  - Arian Stolwijk
-
-requires:
-  - Core/Element
-  - Core/Request
-  - MooTools.More
-
-provides: [Request.JSONP]
-
-...
-*/
-
-Request.JSONP = new Class({
-
-	Implements: [Chain, Events, Options],
-
-	options: {/*
-		onRequest: function(src, scriptElement){},
-		onComplete: function(data){},
-		onSuccess: function(data){},
-		onCancel: function(){},
-		onTimeout: function(){},
-		onError: function(){}, */
-		onRequest: function(src){
-			if (this.options.log && window.console && console.log){
-				console.log('JSONP retrieving script with url:' + src);
-			}
-		},
-		onError: function(src){
-			if (this.options.log && window.console && console.warn){
-				console.warn('JSONP '+ src +' will fail in Internet Explorer, which enforces a 2083 bytes length limit on URIs');
-			}
-		},
-		url: '',
-		callbackKey: 'callback',
-		injectScript: document.head,
-		data: '',
-		link: 'ignore',
-		timeout: 0,
-		log: false
-	},
-
-	initialize: function(options){
-		this.setOptions(options);
-	},
-
-	send: function(options){
-		if (!Request.prototype.check.call(this, options)) return this;
-		this.running = true;
-
-		var type = typeOf(options);
-		if (type == 'string' || type == 'element') options = {data: options};
-		options = Object.merge(this.options, options || {});
-
-		var data = options.data;
-		switch (typeOf(data)){
-			case 'element': data = document.id(data).toQueryString(); break;
-			case 'object': case 'hash': data = Object.toQueryString(data);
-		}
-
-		var index = this.index = Request.JSONP.counter++;
-
-		var src = options.url +
-			(options.url.test('\\?') ? '&' :'?') +
-			(options.callbackKey) +
-			'=Request.JSONP.request_map.request_'+ index +
-			(data ? '&' + data : '');
-
-		if (src.length > 2083) this.fireEvent('error', src);
-
-		Request.JSONP.request_map['request_' + index] = function(){
-			this.success(arguments, index);
-		}.bind(this);
-
-		var script = this.getScript(src).inject(options.injectScript);
-		this.fireEvent('request', [src, script]);
-
-		if (options.timeout) this.timeout.delay(options.timeout, this);
-
-		return this;
-	},
-
-	getScript: function(src){
-		if (!this.script) this.script = new Element('script', {
-			type: 'text/javascript',
-			async: true,
-			src: src
-		});
-		return this.script;
-	},
-
-	success: function(args, index){
-		if (!this.running) return;
-		this.clear()
-			.fireEvent('complete', args).fireEvent('success', args)
-			.callChain();
-	},
-
-	cancel: function(){
-		if (this.running) this.clear().fireEvent('cancel');
-		return this;
-	},
-
-	isRunning: function(){
-		return !!this.running;
-	},
-
-	clear: function(){
-		this.running = false;
-		if (this.script){
-			this.script.destroy();
-			this.script = null;
-		}
-		return this;
-	},
-
-	timeout: function(){
-		if (this.running){
-			this.running = false;
-			this.fireEvent('timeout', [this.script.get('src'), this.script]).fireEvent('failure').cancel();
-		}
-		return this;
-	}
-
-});
-
-Request.JSONP.counter = 0;
-Request.JSONP.request_map = {};
-
-
-/*
----
-
-script: Request.Queue.js
-
-name: Request.Queue
-
-description: Controls several instances of Request and its variants to run only one request at a time.
-
-license: MIT-style license
-
-authors:
-  - Aaron Newton
-
-requires:
-  - Core/Element
-  - Core/Request
-  - /Class.Binds
-
-provides: [Request.Queue]
-
-...
-*/
-
-Request.Queue = new Class({
-
-	Implements: [Options, Events],
-
-	Binds: ['attach', 'request', 'complete', 'cancel', 'success', 'failure', 'exception'],
-
-	options: {/*
-		onRequest: function(argsPassedToOnRequest){},
-		onSuccess: function(argsPassedToOnSuccess){},
-		onComplete: function(argsPassedToOnComplete){},
-		onCancel: function(argsPassedToOnCancel){},
-		onException: function(argsPassedToOnException){},
-		onFailure: function(argsPassedToOnFailure){},
-		onEnd: function(){},
-		*/
-		stopOnFailure: true,
-		autoAdvance: true,
-		concurrent: 1,
-		requests: {}
-	},
-
-	initialize: function(options){
-		var requests;
-		if (options){
-			requests = options.requests;
-			delete options.requests;
-		}
-		this.setOptions(options);
-		this.requests = {};
-		this.queue = [];
-		this.reqBinders = {};
-
-		if (requests) this.addRequests(requests);
-	},
-
-	addRequest: function(name, request){
-		this.requests[name] = request;
-		this.attach(name, request);
-		return this;
-	},
-
-	addRequests: function(obj){
-		Object.each(obj, function(req, name){
-			this.addRequest(name, req);
-		}, this);
-		return this;
-	},
-
-	getName: function(req){
-		return Object.keyOf(this.requests, req);
-	},
-
-	attach: function(name, req){
-		if (req._groupSend) return this;
-		['request', 'complete', 'cancel', 'success', 'failure', 'exception'].each(function(evt){
-			if (!this.reqBinders[name]) this.reqBinders[name] = {};
-			this.reqBinders[name][evt] = function(){
-				this['on' + evt.capitalize()].apply(this, [name, req].append(arguments));
-			}.bind(this);
-			req.addEvent(evt, this.reqBinders[name][evt]);
-		}, this);
-		req._groupSend = req.send;
-		req.send = function(options){
-			this.send(name, options);
-			return req;
-		}.bind(this);
-		return this;
-	},
-
-	removeRequest: function(req){
-		var name = typeOf(req) == 'object' ? this.getName(req) : req;
-		if (!name && typeOf(name) != 'string') return this;
-		req = this.requests[name];
-		if (!req) return this;
-		['request', 'complete', 'cancel', 'success', 'failure', 'exception'].each(function(evt){
-			req.removeEvent(evt, this.reqBinders[name][evt]);
-		}, this);
-		req.send = req._groupSend;
-		delete req._groupSend;
-		return this;
-	},
-
-	getRunning: function(){
-		return Object.filter(this.requests, function(r){
-			return r.running;
-		});
-	},
-
-	isRunning: function(){
-		return !!(Object.keys(this.getRunning()).length);
-	},
-
-	send: function(name, options){
-		var q = function(){
-			this.requests[name]._groupSend(options);
-			this.queue.erase(q);
-		}.bind(this);
-
-		q.name = name;
-		if (Object.keys(this.getRunning()).length >= this.options.concurrent || (this.error && this.options.stopOnFailure)) this.queue.push(q);
-		else q();
-		return this;
-	},
-
-	hasNext: function(name){
-		return (!name) ? !!this.queue.length : !!this.queue.filter(function(q){ return q.name == name; }).length;
-	},
-
-	resume: function(){
-		this.error = false;
-		(this.options.concurrent - Object.keys(this.getRunning()).length).times(this.runNext, this);
-		return this;
-	},
-
-	runNext: function(name){
-		if (!this.queue.length) return this;
-		if (!name){
-			this.queue[0]();
-		} else {
-			var found;
-			this.queue.each(function(q){
-				if (!found && q.name == name){
-					found = true;
-					q();
-				}
-			});
-		}
-		return this;
-	},
-
-	runAll: function(){
-		this.queue.each(function(q){
-			q();
-		});
-		return this;
-	},
-
-	clear: function(name){
-		if (!name){
-			this.queue.empty();
-		} else {
-			this.queue = this.queue.map(function(q){
-				if (q.name != name) return q;
-				else return false;
-			}).filter(function(q){
-				return q;
-			});
-		}
-		return this;
-	},
-
-	cancel: function(name){
-		this.requests[name].cancel();
-		return this;
-	},
-
-	onRequest: function(){
-		this.fireEvent('request', arguments);
-	},
-
-	onComplete: function(){
-		this.fireEvent('complete', arguments);
-		if (!this.queue.length) this.fireEvent('end');
-	},
-
-	onCancel: function(){
-		if (this.options.autoAdvance && !this.error) this.runNext();
-		this.fireEvent('cancel', arguments);
-	},
-
-	onSuccess: function(){
-		if (this.options.autoAdvance && !this.error) this.runNext();
-		this.fireEvent('success', arguments);
-	},
-
-	onFailure: function(){
-		this.error = true;
-		if (!this.options.stopOnFailure && this.options.autoAdvance) this.runNext();
-		this.fireEvent('failure', arguments);
-	},
-
-	onException: function(){
-		this.error = true;
-		if (!this.options.stopOnFailure && this.options.autoAdvance) this.runNext();
-		this.fireEvent('exception', arguments);
-	}
-
-});
-
-
-/*
----
-
-script: Request.Periodical.js
-
-name: Request.Periodical
-
-description: Requests the same URL to pull data from a server but increases the intervals if no data is returned to reduce the load
-
-license: MIT-style license
-
-authors:
-  - Christoph Pojer
-
-requires:
-  - Core/Request
-  - /MooTools.More
-
-provides: [Request.Periodical]
-
-...
-*/
-
-Request.implement({
-
-	options: {
-		initialDelay: 5000,
-		delay: 5000,
-		limit: 60000
-	},
-
-	startTimer: function(data){
-		var fn = function(){
-			if (!this.running) this.send({data: data});
-		};
-		this.lastDelay = this.options.initialDelay;
-		this.timer = fn.delay(this.lastDelay, this);
-		this.completeCheck = function(response){
-			clearTimeout(this.timer);
-			this.lastDelay = (response) ? this.options.delay : (this.lastDelay + this.options.delay).min(this.options.limit);
-			this.timer = fn.delay(this.lastDelay, this);
-		};
-		return this.addEvent('complete', this.completeCheck);
-	},
-
-	stopTimer: function(){
-		clearTimeout(this.timer);
-		return this.removeEvent('complete', this.completeCheck);
-	}
-
-});
-
-
-/*
----
-
-script: Assets.js
-
-name: Assets
-
-description: Provides methods to dynamically load JavaScript, CSS, and Image files into the document.
-
-license: MIT-style license
-
-authors:
-  - Valerio Proietti
-
-requires:
-  - Core/Element.Event
-  - /MooTools.More
-
-provides: [Assets]
-
-...
-*/
-
-var Asset = {
-
-	javascript: function(source, properties){
-		if (!properties) properties = {};
-
-		var script = new Element('script', {src: source, type: 'text/javascript'}),
-			doc = properties.document || document,
-			loaded = 0,
-			loadEvent = properties.onload || properties.onLoad;
-
-		var load = loadEvent ? function(){ // make sure we only call the event once
-			if (++loaded == 1) loadEvent.call(this);
-		} : function(){};
-
-		delete properties.onload;
-		delete properties.onLoad;
-		delete properties.document;
-
-		return script.addEvents({
-			load: load,
-			readystatechange: function(){
-				if (['loaded', 'complete'].contains(this.readyState)) load.call(this);
-			}
-		}).set(properties).inject(doc.head);
-	},
-
-	css: function(source, properties){
-		if (!properties) properties = {};
-
-		var link = new Element('link', {
-			rel: 'stylesheet',
-			media: 'screen',
-			type: 'text/css',
-			href: source
-		});
-
-		var load = properties.onload || properties.onLoad,
-			doc = properties.document || document;
-
-		delete properties.onload;
-		delete properties.onLoad;
-		delete properties.document;
-
-		if (load) link.addEvent('load', load);
-		return link.set(properties).inject(doc.head);
-	},
-
-	image: function(source, properties){
-		if (!properties) properties = {};
-
-		var image = new Image(),
-			element = document.id(image) || new Element('img');
-
-		['load', 'abort', 'error'].each(function(name){
-			var type = 'on' + name,
-				cap = 'on' + name.capitalize(),
-				event = properties[type] || properties[cap] || function(){};
-
-			delete properties[cap];
-			delete properties[type];
-
-			image[type] = function(){
-				if (!image) return;
-				if (!element.parentNode){
-					element.width = image.width;
-					element.height = image.height;
-				}
-				image = image.onload = image.onabort = image.onerror = null;
-				event.delay(1, element, element);
-				element.fireEvent(name, element, 1);
-			};
-		});
-
-		image.src = element.src = source;
-		if (image && image.complete) image.onload.delay(1);
-		return element.set(properties);
-	},
-
-	images: function(sources, options){
-		sources = Array.from(sources);
-
-		var fn = function(){},
-			counter = 0;
-
-		options = Object.merge({
-			onComplete: fn,
-			onProgress: fn,
-			onError: fn,
-			properties: {}
-		}, options);
-
-		return new Elements(sources.map(function(source, index){
-			return Asset.image(source, Object.append(options.properties, {
-				onload: function(){
-					counter++;
-					options.onProgress.call(this, counter, index, source);
-					if (counter == sources.length) options.onComplete();
-				},
-				onerror: function(){
-					counter++;
-					options.onError.call(this, counter, index, source);
-					if (counter == sources.length) options.onComplete();
-				}
-			}));
-		}));
-	}
-
-};
-
-
-/*
----
-
-script: Color.js
-
-name: Color
-
-description: Class for creating and manipulating colors in JavaScript. Supports HSB -> RGB Conversions and vice versa.
-
-license: MIT-style license
-
-authors:
-  - Valerio Proietti
-
-requires:
-  - Core/Array
-  - Core/String
-  - Core/Number
-  - Core/Hash
-  - Core/Function
-  - MooTools.More
-
-provides: [Color]
-
-...
-*/
-
-(function(){
-
-var Color = this.Color = new Type('Color', function(color, type){
-	if (arguments.length >= 3){
-		type = 'rgb'; color = Array.slice(arguments, 0, 3);
-	} else if (typeof color == 'string'){
-		if (color.match(/rgb/)) color = color.rgbToHex().hexToRgb(true);
-		else if (color.match(/hsb/)) color = color.hsbToRgb();
-		else color = color.hexToRgb(true);
-	}
-	type = type || 'rgb';
-	switch (type){
-		case 'hsb':
-			var old = color;
-			color = color.hsbToRgb();
-			color.hsb = old;
-		break;
-		case 'hex': color = color.hexToRgb(true); break;
-	}
-	color.rgb = color.slice(0, 3);
-	color.hsb = color.hsb || color.rgbToHsb();
-	color.hex = color.rgbToHex();
-	return Object.append(color, this);
-});
-
-Color.implement({
-
-	mix: function(){
-		var colors = Array.slice(arguments);
-		var alpha = (typeOf(colors.getLast()) == 'number') ? colors.pop() : 50;
-		var rgb = this.slice();
-		colors.each(function(color){
-			color = new Color(color);
-			for (var i = 0; i < 3; i++) rgb[i] = Math.round((rgb[i] / 100 * (100 - alpha)) + (color[i] / 100 * alpha));
-		});
-		return new Color(rgb, 'rgb');
-	},
-
-	invert: function(){
-		return new Color(this.map(function(value){
-			return 255 - value;
-		}));
-	},
-
-	setHue: function(value){
-		return new Color([value, this.hsb[1], this.hsb[2]], 'hsb');
-	},
-
-	setSaturation: function(percent){
-		return new Color([this.hsb[0], percent, this.hsb[2]], 'hsb');
-	},
-
-	setBrightness: function(percent){
-		return new Color([this.hsb[0], this.hsb[1], percent], 'hsb');
-	}
-
-});
-
-this.$RGB = function(r, g, b){
-	return new Color([r, g, b], 'rgb');
-};
-
-this.$HSB = function(h, s, b){
-	return new Color([h, s, b], 'hsb');
-};
-
-this.$HEX = function(hex){
-	return new Color(hex, 'hex');
-};
-
-Array.implement({
-
-	rgbToHsb: function(){
-		var red = this[0],
-				green = this[1],
-				blue = this[2],
-				hue = 0;
-		var max = Math.max(red, green, blue),
-				min = Math.min(red, green, blue);
-		var delta = max - min;
-		var brightness = max / 255,
-				saturation = (max != 0) ? delta / max : 0;
-		if (saturation != 0){
-			var rr = (max - red) / delta;
-			var gr = (max - green) / delta;
-			var br = (max - blue) / delta;
-			if (red == max) hue = br - gr;
-			else if (green == max) hue = 2 + rr - br;
-			else hue = 4 + gr - rr;
-			hue /= 6;
-			if (hue < 0) hue++;
-		}
-		return [Math.round(hue * 360), Math.round(saturation * 100), Math.round(brightness * 100)];
-	},
-
-	hsbToRgb: function(){
-		var br = Math.round(this[2] / 100 * 255);
-		if (this[1] == 0){
-			return [br, br, br];
-		} else {
-			var hue = this[0] % 360;
-			var f = hue % 60;
-			var p = Math.round((this[2] * (100 - this[1])) / 10000 * 255);
-			var q = Math.round((this[2] * (6000 - this[1] * f)) / 600000 * 255);
-			var t = Math.round((this[2] * (6000 - this[1] * (60 - f))) / 600000 * 255);
-			switch (Math.floor(hue / 60)){
-				case 0: return [br, t, p];
-				case 1: return [q, br, p];
-				case 2: return [p, br, t];
-				case 3: return [p, q, br];
-				case 4: return [t, p, br];
-				case 5: return [br, p, q];
-			}
-		}
-		return false;
-	}
-
-});
-
-String.implement({
-
-	rgbToHsb: function(){
-		var rgb = this.match(/\d{1,3}/g);
-		return (rgb) ? rgb.rgbToHsb() : null;
-	},
-
-	hsbToRgb: function(){
-		var hsb = this.match(/\d{1,3}/g);
-		return (hsb) ? hsb.hsbToRgb() : null;
-	}
-
-});
-
-})();
-
-
-
-/*
----
-
-script: Group.js
-
-name: Group
-
-description: Class for monitoring collections of events
-
-license: MIT-style license
-
-authors:
-  - Valerio Proietti
-
-requires:
-  - Core/Events
-  - /MooTools.More
-
-provides: [Group]
-
-...
-*/
-
-(function(){
-
-this.Group = new Class({
-
-	initialize: function(){
-		this.instances = Array.flatten(arguments);
-		this.events = {};
-		this.checker = {};
-	},
-
-	addEvent: function(type, fn){
-		this.checker[type] = this.checker[type] || {};
-		this.events[type] = this.events[type] || [];
-		if (this.events[type].contains(fn)) return false;
-		else this.events[type].push(fn);
-		this.instances.each(function(instance, i){
-			instance.addEvent(type, this.check.pass([type, instance, i], this));
-		}, this);
-		return this;
-	},
-
-	check: function(type, instance, i){
-		this.checker[type][i] = true;
-		var every = this.instances.every(function(current, j){
-			return this.checker[type][j] || false;
-		}, this);
-		if (!every) return;
-		this.checker[type] = {};
-		this.events[type].each(function(event){
-			event.call(this, this.instances, instance);
-		}, this);
-	}
-
-});
-
-})();
-
-
-
-/*
----
-
-script: Hash.Cookie.js
-
-name: Hash.Cookie
-
-description: Class for creating, reading, and deleting Cookies in JSON format.
-
-license: MIT-style license
-
-authors:
-  - Valerio Proietti
-  - Aaron Newton
-
-requires:
-  - Core/Cookie
-  - Core/JSON
-  - /MooTools.More
-  - /Hash
-
-provides: [Hash.Cookie]
-
-...
-*/
-
-Hash.Cookie = new Class({
-
-	Extends: Cookie,
-
-	options: {
-		autoSave: true
-	},
-
-	initialize: function(name, options){
-		this.parent(name, options);
-		this.load();
-	},
-
-	save: function(){
-		var value = JSON.encode(this.hash);
-		if (!value || value.length > 4096) return false; //cookie would be truncated!
-		if (value == '{}') this.dispose();
-		else this.write(value);
-		return true;
-	},
-
-	load: function(){
-		this.hash = new Hash(JSON.decode(this.read(), true));
-		return this;
-	}
-
-});
-
-Hash.each(Hash.prototype, function(method, name){
-	if (typeof method == 'function') Hash.Cookie.implement(name, function(){
-		var value = method.apply(this.hash, arguments);
-		if (this.options.autoSave) this.save();
-		return value;
-	});
-});
-
-
-/*
----
-name: Table
-description: LUA-Style table implementation.
-license: MIT-style license
-authors:
-  - Valerio Proietti
-requires: [Core/Array]
-provides: [Table]
-...
-*/
-
-(function(){
-
-var Table = this.Table = function(){
-
-	this.length = 0;
-	var keys = [],
-	    values = [];
-
-	this.set = function(key, value){
-		var index = keys.indexOf(key);
-		if (index == -1){
-			var length = keys.length;
-			keys[length] = key;
-			values[length] = value;
-			this.length++;
-		} else {
-			values[index] = value;
-		}
-		return this;
-	};
-
-	this.get = function(key){
-		var index = keys.indexOf(key);
-		return (index == -1) ? null : values[index];
-	};
-
-	this.erase = function(key){
-		var index = keys.indexOf(key);
-		if (index != -1){
-			this.length--;
-			keys.splice(index, 1);
-			return values.splice(index, 1)[0];
-		}
-		return null;
-	};
-
-	this.each = this.forEach = function(fn, bind){
-		for (var i = 0, l = this.length; i < l; i++) fn.call(bind, keys[i], values[i], this);
-	};
-
-};
-
-if (this.Type) new Type('Table', Table);
-
-})();
-
-
-/*
----
-
-script: HtmlTable.js
-
-name: HtmlTable
-
-description: Builds table elements with methods to add rows.
-
-license: MIT-style license
-
-authors:
-  - Aaron Newton
-
-requires:
-  - Core/Options
-  - Core/Events
-  - /Class.Occlude
-
-provides: [HtmlTable]
-
-...
-*/
-
-var HtmlTable = new Class({
-
-	Implements: [Options, Events, Class.Occlude],
-
-	options: {
-		properties: {
-			cellpadding: 0,
-			cellspacing: 0,
-			border: 0
-		},
-		rows: [],
-		headers: [],
-		footers: []
-	},
-
-	property: 'HtmlTable',
-
-	initialize: function(){
-		var params = Array.link(arguments, {options: Type.isObject, table: Type.isElement, id: Type.isString});
-		this.setOptions(params.options);
-		if (!params.table && params.id) params.table = document.id(params.id);
-		this.element = params.table || new Element('table', this.options.properties);
-		if (this.occlude()) return this.occluded;
-		this.build();
-	},
-
-	build: function(){
-		this.element.store('HtmlTable', this);
-
-		this.body = document.id(this.element.tBodies[0]) || new Element('tbody').inject(this.element);
-		$$(this.body.rows);
-
-		if (this.options.headers.length) this.setHeaders(this.options.headers);
-		else this.thead = document.id(this.element.tHead);
-
-		if (this.thead) this.head = this.getHead();
-		if (this.options.footers.length) this.setFooters(this.options.footers);
-
-		this.tfoot = document.id(this.element.tFoot);
-		if (this.tfoot) this.foot = document.id(this.tfoot.rows[0]);
-
-		this.options.rows.each(function(row){
-			this.push(row);
-		}, this);
-	},
-
-	toElement: function(){
-		return this.element;
-	},
-
-	empty: function(){
-		this.body.empty();
-		return this;
-	},
-
-	set: function(what, items){
-		var target = (what == 'headers') ? 'tHead' : 'tFoot',
-			lower = target.toLowerCase();
-
-		this[lower] = (document.id(this.element[target]) || new Element(lower).inject(this.element, 'top')).empty();
-		var data = this.push(items, {}, this[lower], what == 'headers' ? 'th' : 'td');
-
-		if (what == 'headers') this.head = this.getHead();
-		else this.foot = this.getHead();
-
-		return data;
-	},
-
-	getHead: function(){
-		var rows = this.thead.rows;
-		return rows.length > 1 ? $$(rows) : rows.length ? document.id(rows[0]) : false;
-	},
-
-	setHeaders: function(headers){
-		this.set('headers', headers);
-		return this;
-	},
-
-	setFooters: function(footers){
-		this.set('footers', footers);
-		return this;
-	},
-
-	push: function(row, rowProperties, target, tag, where){
-		if (typeOf(row) == 'element' && row.get('tag') == 'tr'){
-			row.inject(target || this.body, where);
-			return {
-				tr: row,
-				tds: row.getChildren('td')
-			};
-		}
-
-		var tds = row.map(function(data){
-			var td = new Element(tag || 'td', data ? data.properties : {}),
-				content = (data ? data.content : '') || data,
-				type = typeOf(content);
-
-			if (['element', 'array', 'collection', 'elements'].contains(type)) td.adopt(content);
-			else td.set('html', content);
-
-			return td;
-		});
-
-		return {
-			tr: new Element('tr', rowProperties).inject(target || this.body, where).adopt(tds),
-			tds: tds
-		};
-	}
-
-});
-
-
-['adopt', 'inject', 'wraps', 'grab', 'replaces', 'dispose'].each(function(method){
-	HtmlTable.implement(method, function(){
-		this.element[method].apply(this.element, arguments);
-		return this;
-	});
-});
-
-
-
-
-/*
----
-
-script: HtmlTable.Zebra.js
-
-name: HtmlTable.Zebra
-
-description: Builds a stripy table with methods to add rows.
-
-license: MIT-style license
-
-authors:
-  - Harald Kirschner
-  - Aaron Newton
-
-requires:
-  - /HtmlTable
-  - /Class.refactor
-
-provides: [HtmlTable.Zebra]
-
-...
-*/
-
-HtmlTable = Class.refactor(HtmlTable, {
-
-	options: {
-		classZebra: 'table-tr-odd',
-		zebra: true
-	},
-
-	initialize: function(){
-		this.previous.apply(this, arguments);
-		if (this.occluded) return this.occluded;
-		if (this.options.zebra) this.updateZebras();
-	},
-
-	updateZebras: function(){
-		Array.each(this.body.rows, this.zebra, this);
-	},
-
-	setRowStyle: function(row, i){
-		if (this.previous) this.previous(row, i);
-		this.zebra(row, i);
-	},
-
-	zebra: function(row, i){
-		return row[((i % 2) ? 'remove' : 'add')+'Class'](this.options.classZebra);
-	},
-
-	push: function(){
-		var pushed = this.previous.apply(this, arguments);
-		if (this.options.zebra) this.updateZebras();
-		return pushed;
-	}
-
-});
-
-
-/*
----
-
-script: HtmlTable.Sort.js
-
-name: HtmlTable.Sort
-
-description: Builds a stripy, sortable table with methods to add rows.
-
-license: MIT-style license
-
-authors:
-  - Harald Kirschner
-  - Aaron Newton
-  - Jacob Thornton
-
-requires:
-  - Core/Hash
-  - /HtmlTable
-  - /Class.refactor
-  - /Element.Delegation
-  - /String.Extras
-  - /Date
-
-provides: [HtmlTable.Sort]
-
-...
-*/
-
-HtmlTable = Class.refactor(HtmlTable, {
-
-	options: {/*
-		onSort: function(){}, */
-		sortIndex: 0,
-		sortReverse: false,
-		parsers: [],
-		defaultParser: 'string',
-		classSortable: 'table-sortable',
-		classHeadSort: 'table-th-sort',
-		classHeadSortRev: 'table-th-sort-rev',
-		classNoSort: 'table-th-nosort',
-		classGroupHead: 'table-tr-group-head',
-		classGroup: 'table-tr-group',
-		classCellSort: 'table-td-sort',
-		classSortSpan: 'table-th-sort-span',
-		sortable: false,
-		thSelector: 'th'
-	},
-
-	initialize: function (){
-		this.previous.apply(this, arguments);
-		if (this.occluded) return this.occluded;
-		this.sorted = {index: null, dir: 1};
-		this.bound = {
-			headClick: this.headClick.bind(this)
-		};
-		this.sortSpans = new Elements();
-		if (this.options.sortable){
-			this.enableSort();
-			if (this.options.sortIndex != null) this.sort(this.options.sortIndex, this.options.sortReverse);
-		}
-	},
-
-	attachSorts: function(attach){
-		this.detachSorts();
-		if (attach !== false) this.element.addEvent('click:relay(' + this.options.thSelector + ')', this.bound.headClick);
-	},
-
-	detachSorts: function(){
-		this.element.removeEvents('click:relay(' + this.options.thSelector + ')');
-	},
-
-	setHeaders: function(){
-		this.previous.apply(this, arguments);
-		if (this.sortEnabled) this.setParsers();
-	},
-
-	setParsers: function(){
-		this.parsers = this.detectParsers();
-	},
-
-	detectParsers: function(){
-		return this.head && this.head.getElements(this.options.thSelector).flatten().map(this.detectParser, this);
-	},
-
-	detectParser: function(cell, index){
-		if (cell.hasClass(this.options.classNoSort) || cell.retrieve('htmltable-parser')) return cell.retrieve('htmltable-parser');
-		var thDiv = new Element('div');
-		thDiv.adopt(cell.childNodes).inject(cell);
-		var sortSpan = new Element('span', {'class': this.options.classSortSpan}).inject(thDiv, 'top');
-		this.sortSpans.push(sortSpan);
-		var parser = this.options.parsers[index],
-			rows = this.body.rows,
-			cancel;
-		switch (typeOf(parser)){
-			case 'function': parser = {convert: parser}; cancel = true; break;
-			case 'string': parser = parser; cancel = true; break;
-		}
-		if (!cancel){
-			HtmlTable.ParserPriority.some(function(parserName){
-				var current = HtmlTable.Parsers[parserName],
-					match = current.match;
-				if (!match) return false;
-				for (var i = 0, j = rows.length; i < j; i++){
-					var cell = document.id(rows[i].cells[index]),
-						text = cell ? cell.get('html').clean() : '';
-					if (text && match.test(text)){
-						parser = current;
-						return true;
-					}
-				}
-			});
-		}
-		if (!parser) parser = this.options.defaultParser;
-		cell.store('htmltable-parser', parser);
-		return parser;
-	},
-
-	headClick: function(event, el){
-		if (!this.head || el.hasClass(this.options.classNoSort)) return;
-		return this.sort(Array.indexOf(this.head.getElements(this.options.thSelector).flatten(), el) % this.body.rows[0].cells.length);
-	},
-
-	serialize: function() {
-		var previousSerialization = this.previous.apply(this, arguments) || {};
-		if (this.options.sortable) {
-			previousSerialization.sortIndex = this.sorted.index;
-			previousSerialization.sortReverse = this.sorted.reverse;
-		}
-		return previousSerialization;
-	},
-
-	restore: function(tableState) {
-		if(this.options.sortable && tableState.sortIndex) {
-			this.sort(tableState.sortIndex, tableState.sortReverse);
-		}
-		this.previous.apply(this, arguments);
-	},
-
-	setSortedState: function(index, reverse){
-		if (reverse != null) this.sorted.reverse = reverse;
-		else if (this.sorted.index == index) this.sorted.reverse = !this.sorted.reverse;
-		else this.sorted.reverse = this.sorted.index == null;
-
-		if (index != null) this.sorted.index = index;
-	},
-
-	setHeadSort: function(sorted){
-		var head = $$(!this.head.length ? this.head.cells[this.sorted.index] : this.head.map(function(row){
-			return row.getElements(this.options.thSelector)[this.sorted.index];
-		}, this).clean());
-		if (!head.length) return;
-		if (sorted){
-			head.addClass(this.options.classHeadSort);
-			if (this.sorted.reverse) head.addClass(this.options.classHeadSortRev);
-			else head.removeClass(this.options.classHeadSortRev);
-		} else {
-			head.removeClass(this.options.classHeadSort).removeClass(this.options.classHeadSortRev);
-		}
-	},
-
-	setRowSort: function(data, pre){
-		var count = data.length,
-			body = this.body,
-			group,
-			rowIndex;
-
-		while (count){
-			var item = data[--count],
-				position = item.position,
-				row = body.rows[position];
-
-			if (row.disabled) continue;
-			if (!pre){
-				group = this.setGroupSort(group, row, item);
-				this.setRowStyle(row, count);
-			}
-			body.appendChild(row);
-
-			for (rowIndex = 0; rowIndex < count; rowIndex++){
-				if (data[rowIndex].position > position) data[rowIndex].position--;
-			}
-		}
-	},
-
-	setRowStyle: function(row, i){
-		this.previous(row, i);
-		row.cells[this.sorted.index].addClass(this.options.classCellSort);
-	},
-
-	setGroupSort: function(group, row, item){
-		if (group == item.value) row.removeClass(this.options.classGroupHead).addClass(this.options.classGroup);
-		else row.removeClass(this.options.classGroup).addClass(this.options.classGroupHead);
-		return item.value;
-	},
-
-	getParser: function(){
-		var parser = this.parsers[this.sorted.index];
-		return typeOf(parser) == 'string' ? HtmlTable.Parsers[parser] : parser;
-	},
-
-	sort: function(index, reverse, pre){
-		if (!this.head) return;
-
-		if (!pre){
-			this.clearSort();
-			this.setSortedState(index, reverse);
-			this.setHeadSort(true);
-		}
-
-		var parser = this.getParser();
-		if (!parser) return;
-
-		var rel;
-		if (!Browser.ie){
-			rel = this.body.getParent();
-			this.body.dispose();
-		}
-
-		var data = this.parseData(parser).sort(function(a, b){
-			if (a.value === b.value) return 0;
-			return a.value > b.value ? 1 : -1;
-		});
-
-		if (this.sorted.reverse == (parser == HtmlTable.Parsers['input-checked'])) data.reverse(true);
-		this.setRowSort(data, pre);
-
-		if (rel) rel.grab(this.body);
-		this.fireEvent('stateChanged');
-		return this.fireEvent('sort', [this.body, this.sorted.index]);
-	},
-
-	parseData: function(parser){
-		return Array.map(this.body.rows, function(row, i){
-			var value = parser.convert.call(document.id(row.cells[this.sorted.index]));
-			return {
-				position: i,
-				value: value
-			};
-		}, this);
-	},
-
-	clearSort: function(){
-		this.setHeadSort(false);
-		this.body.getElements('td').removeClass(this.options.classCellSort);
-	},
-
-	reSort: function(){
-		if (this.sortEnabled) this.sort.call(this, this.sorted.index, this.sorted.reverse);
-		return this;
-	},
-
-	enableSort: function(){
-		this.element.addClass(this.options.classSortable);
-		this.attachSorts(true);
-		this.setParsers();
-		this.sortEnabled = true;
-		return this;
-	},
-
-	disableSort: function(){
-		this.element.removeClass(this.options.classSortable);
-		this.attachSorts(false);
-		this.sortSpans.each(function(span){
-			span.destroy();
-		});
-		this.sortSpans.empty();
-		this.sortEnabled = false;
-		return this;
-	}
-
-});
-
-HtmlTable.ParserPriority = ['date', 'input-checked', 'input-value', 'float', 'number'];
-
-HtmlTable.Parsers = {
-
-	'date': {
-		match: /^\d{2}[-\/ ]\d{2}[-\/ ]\d{2,4}$/,
-		convert: function(){
-			var d = Date.parse(this.get('text').stripTags());
-			return (typeOf(d) == 'date') ? d.format('db') : '';
-		},
-		type: 'date'
-	},
-	'input-checked': {
-		match: / type="(radio|checkbox)" /,
-		convert: function(){
-			return this.getElement('input').checked;
-		}
-	},
-	'input-value': {
-		match: /<input/,
-		convert: function(){
-			return this.getElement('input').value;
-		}
-	},
-	'number': {
-		match: /^\d+[^\d.,]*$/,
-		convert: function(){
-			return this.get('text').stripTags().toInt();
-		},
-		number: true
-	},
-	'numberLax': {
-		match: /^[^\d]+\d+$/,
-		convert: function(){
-			return this.get('text').replace(/[^-?^0-9]/, '').stripTags().toInt();
-		},
-		number: true
-	},
-	'float': {
-		match: /^[\d]+\.[\d]+/,
-		convert: function(){
-			return this.get('text').replace(/[^-?^\d.]/, '').stripTags().toFloat();
-		},
-		number: true
-	},
-	'floatLax': {
-		match: /^[^\d]+[\d]+\.[\d]+$/,
-		convert: function(){
-			return this.get('text').replace(/[^-?^\d.]/, '').stripTags();
-		},
-		number: true
-	},
-	'string': {
-		match: null,
-		convert: function(){
-			return this.get('text').stripTags().toLowerCase();
-		}
-	},
-	'title': {
-		match: null,
-		convert: function(){
-			return this.title;
-		}
-	}
-
-};
-
-//<1.2compat>
-HtmlTable.Parsers = new Hash(HtmlTable.Parsers);
-//</1.2compat>
-
-HtmlTable.defineParsers = function(parsers){
-	HtmlTable.Parsers = Object.append(HtmlTable.Parsers, parsers);
-	for (var parser in parsers){
-		HtmlTable.ParserPriority.unshift(parser);
-	}
-};
-
-
-/*
----
-
-script: Keyboard.js
-
-name: Keyboard
-
-description: KeyboardEvents used to intercept events on a class for keyboard and format modifiers in a specific order so as to make alt+shift+c the same as shift+alt+c.
-
-license: MIT-style license
-
-authors:
-  - Perrin Westrich
-  - Aaron Newton
-  - Scott Kyle
-
-requires:
-  - Core/Events
-  - Core/Options
-  - Core/Element.Event
-  - Element.Event.Pseudos.Keys
-
-provides: [Keyboard]
-
-...
-*/
-
-(function(){
-
-	var Keyboard = this.Keyboard = new Class({
-
-		Extends: Events,
-
-		Implements: [Options],
-
-		options: {/*
-			onActivate: function(){},
-			onDeactivate: function(){},*/
-			defaultEventType: 'keydown',
-			active: false,
-			manager: null,
-			events: {},
-			nonParsedEvents: ['activate', 'deactivate', 'onactivate', 'ondeactivate', 'changed', 'onchanged']
-		},
-
-		initialize: function(options){
-			if (options && options.manager){
-				this._manager = options.manager;
-				delete options.manager;
-			}
-			this.setOptions(options);
-			this._setup();
-		},
-
-		addEvent: function(type, fn, internal){
-			return this.parent(Keyboard.parse(type, this.options.defaultEventType, this.options.nonParsedEvents), fn, internal);
-		},
-
-		removeEvent: function(type, fn){
-			return this.parent(Keyboard.parse(type, this.options.defaultEventType, this.options.nonParsedEvents), fn);
-		},
-
-		toggleActive: function(){
-			return this[this.isActive() ? 'deactivate' : 'activate']();
-		},
-
-		activate: function(instance){
-			if (instance){
-				if (instance.isActive()) return this;
-				//if we're stealing focus, store the last keyboard to have it so the relinquish command works
-				if (this._activeKB && instance != this._activeKB){
-					this.previous = this._activeKB;
-					this.previous.fireEvent('deactivate');
-				}
-				//if we're enabling a child, assign it so that events are now passed to it
-				this._activeKB = instance.fireEvent('activate');
-				Keyboard.manager.fireEvent('changed');
-			} else if (this._manager){
-				//else we're enabling ourselves, we must ask our parent to do it for us
-				this._manager.activate(this);
-			}
-			return this;
-		},
-
-		isActive: function(){
-			return this._manager ? (this._manager._activeKB == this) : (Keyboard.manager == this);
-		},
-
-		deactivate: function(instance){
-			if (instance){
-				if (instance === this._activeKB){
-					this._activeKB = null;
-					instance.fireEvent('deactivate');
-					Keyboard.manager.fireEvent('changed');
-				}
-			} else if (this._manager){
-				this._manager.deactivate(this);
-			}
-			return this;
-		},
-
-		relinquish: function(){
-			if (this.isActive() && this._manager && this._manager.previous) this._manager.activate(this._manager.previous);
-			else this.deactivate();
-			return this;
-		},
-
-		//management logic
-		manage: function(instance){
-			if (instance._manager) instance._manager.drop(instance);
-			this._instances.push(instance);
-			instance._manager = this;
-			if (!this._activeKB) this.activate(instance);
-			return this;
-		},
-
-		drop: function(instance){
-			instance.relinquish();
-			this._instances.erase(instance);
-			if (this._activeKB == instance){
-				if (this.previous && this._instances.contains(this.previous)) this.activate(this.previous);
-				else this._activeKB = this._instances[0];
-			}
-			return this;
-		},
-
-		trace: function(){
-			Keyboard.trace(this);
-		},
-
-		each: function(fn){
-			Keyboard.each(this, fn);
-		},
-
-		/*
-			PRIVATE METHODS
-		*/
-
-		_instances: [],
-
-		_disable: function(instance){
-			if (this._activeKB == instance) this._activeKB = null;
-		},
-
-		_setup: function(){
-			this.addEvents(this.options.events);
-			//if this is the root manager, nothing manages it
-			if (Keyboard.manager && !this._manager) Keyboard.manager.manage(this);
-			if (this.options.active) this.activate();
-			else this.relinquish();
-		},
-
-		_handle: function(event, type){
-			//Keyboard.stop(event) prevents key propagation
-			if (event.preventKeyboardPropagation) return;
-
-			var bubbles = !!this._manager;
-			if (bubbles && this._activeKB){
-				this._activeKB._handle(event, type);
-				if (event.preventKeyboardPropagation) return;
-			}
-			this.fireEvent(type, event);
-
-			if (!bubbles && this._activeKB) this._activeKB._handle(event, type);
-		}
-
-	});
-
-	var parsed = {};
-	var modifiers = ['shift', 'control', 'alt', 'meta'];
-	var regex = /^(?:shift|control|ctrl|alt|meta)$/;
-
-	Keyboard.parse = function(type, eventType, ignore){
-		if (ignore && ignore.contains(type.toLowerCase())) return type;
-
-		type = type.toLowerCase().replace(/^(keyup|keydown):/, function($0, $1){
-			eventType = $1;
-			return '';
-		});
-
-		if (!parsed[type]){
-			var key, mods = {};
-			type.split('+').each(function(part){
-				if (regex.test(part)) mods[part] = true;
-				else key = part;
-			});
-
-			mods.control = mods.control || mods.ctrl; // allow both control and ctrl
-
-			var keys = [];
-			modifiers.each(function(mod){
-				if (mods[mod]) keys.push(mod);
-			});
-
-			if (key) keys.push(key);
-			parsed[type] = keys.join('+');
-		}
-
-		return eventType + ':keys(' + parsed[type] + ')';
-	};
-
-	Keyboard.each = function(keyboard, fn){
-		var current = keyboard || Keyboard.manager;
-		while (current){
-			fn.run(current);
-			current = current._activeKB;
-		}
-	};
-
-	Keyboard.stop = function(event){
-		event.preventKeyboardPropagation = true;
-	};
-
-	Keyboard.manager = new Keyboard({
-		active: true
-	});
-
-	Keyboard.trace = function(keyboard){
-		keyboard = keyboard || Keyboard.manager;
-		var hasConsole = window.console && console.log;
-		if (hasConsole) console.log('the following items have focus: ');
-		Keyboard.each(keyboard, function(current){
-			if (hasConsole) console.log(document.id(current.widget) || current.wiget || current);
-		});
-	};
-
-	var handler = function(event){
-		var keys = [];
-		modifiers.each(function(mod){
-			if (event[mod]) keys.push(mod);
-		});
-
-		if (!regex.test(event.key)) keys.push(event.key);
-		Keyboard.manager._handle(event, event.type + ':keys(' + keys.join('+') + ')');
-	};
-
-	document.addEvents({
-		'keyup': handler,
-		'keydown': handler
-	});
-
-})();
-
-
-/*
----
-
-script: Keyboard.Extras.js
-
-name: Keyboard.Extras
-
-description: Enhances Keyboard by adding the ability to name and describe keyboard shortcuts, and the ability to grab shortcuts by name and bind the shortcut to different keys.
-
-license: MIT-style license
-
-authors:
-  - Perrin Westrich
-
-requires:
-  - /Keyboard
-  - /MooTools.More
-
-provides: [Keyboard.Extras]
-
-...
-*/
-Keyboard.prototype.options.nonParsedEvents.combine(['rebound', 'onrebound']);
-
-Keyboard.implement({
-
-	/*
-		shortcut should be in the format of:
-		{
-			'keys': 'shift+s', // the default to add as an event.
-			'description': 'blah blah blah', // a brief description of the functionality.
-			'handler': function(){} // the event handler to run when keys are pressed.
-		}
-	*/
-	addShortcut: function(name, shortcut){
-		this._shortcuts = this._shortcuts || [];
-		this._shortcutIndex = this._shortcutIndex || {};
-
-		shortcut.getKeyboard = Function.from(this);
-		shortcut.name = name;
-		this._shortcutIndex[name] = shortcut;
-		this._shortcuts.push(shortcut);
-		if (shortcut.keys) this.addEvent(shortcut.keys, shortcut.handler);
-		return this;
-	},
-
-	addShortcuts: function(obj){
-		for (var name in obj) this.addShortcut(name, obj[name]);
-		return this;
-	},
-
-	removeShortcut: function(name){
-		var shortcut = this.getShortcut(name);
-		if (shortcut && shortcut.keys){
-			this.removeEvent(shortcut.keys, shortcut.handler);
-			delete this._shortcutIndex[name];
-			this._shortcuts.erase(shortcut);
-		}
-		return this;
-	},
-
-	removeShortcuts: function(names){
-		names.each(this.removeShortcut, this);
-		return this;
-	},
-
-	getShortcuts: function(){
-		return this._shortcuts || [];
-	},
-
-	getShortcut: function(name){
-		return (this._shortcutIndex || {})[name];
-	}
-
-});
-
-Keyboard.rebind = function(newKeys, shortcuts){
-	Array.from(shortcuts).each(function(shortcut){
-		shortcut.getKeyboard().removeEvent(shortcut.keys, shortcut.handler);
-		shortcut.getKeyboard().addEvent(newKeys, shortcut.handler);
-		shortcut.keys = newKeys;
-		shortcut.getKeyboard().fireEvent('rebound');
-	});
-};
-
-
-Keyboard.getActiveShortcuts = function(keyboard){
-	var activeKBS = [], activeSCS = [];
-	Keyboard.each(keyboard, [].push.bind(activeKBS));
-	activeKBS.each(function(kb){ activeSCS.extend(kb.getShortcuts()); });
-	return activeSCS;
-};
-
-Keyboard.getShortcut = function(name, keyboard, opts){
-	opts = opts || {};
-	var shortcuts = opts.many ? [] : null,
-		set = opts.many ? function(kb){
-				var shortcut = kb.getShortcut(name);
-				if (shortcut) shortcuts.push(shortcut);
-			} : function(kb){
-				if (!shortcuts) shortcuts = kb.getShortcut(name);
-			};
-	Keyboard.each(keyboard, set);
-	return shortcuts;
-};
-
-Keyboard.getShortcuts = function(name, keyboard){
-	return Keyboard.getShortcut(name, keyboard, { many: true });
-};
-
-
-/*
----
-
-script: HtmlTable.Select.js
-
-name: HtmlTable.Select
-
-description: Builds a stripy, sortable table with methods to add rows. Rows can be selected with the mouse or keyboard navigation.
-
-license: MIT-style license
-
-authors:
-  - Harald Kirschner
-  - Aaron Newton
-
-requires:
-  - /Keyboard
-  - /Keyboard.Extras
-  - /HtmlTable
-  - /Class.refactor
-  - /Element.Delegation
-  - /Element.Shortcuts
-
-provides: [HtmlTable.Select]
-
-...
-*/
-
-HtmlTable = Class.refactor(HtmlTable, {
-
-	options: {
-		/*onRowFocus: function(){},
-		onRowUnfocus: function(){},*/
-		useKeyboard: true,
-		classRowSelected: 'table-tr-selected',
-		classRowHovered: 'table-tr-hovered',
-		classSelectable: 'table-selectable',
-		shiftForMultiSelect: true,
-		allowMultiSelect: true,
-		selectable: false
-	},
-
-	initialize: function(){
-		this.previous.apply(this, arguments);
-		if (this.occluded) return this.occluded;
-
-		this.selectedRows = new Elements();
-
-		this.bound = {
-			mouseleave: this.mouseleave.bind(this),
-			clickRow: this.clickRow.bind(this),
-			activateKeyboard: function() {
-				if (this.keyboard && this.selectEnabled) this.keyboard.activate();
-			}.bind(this)
-		};
-
-		if (this.options.selectable) this.enableSelect();
-	},
-
-	empty: function(){
-		this.selectNone();
-		return this.previous();
-	},
-
-	enableSelect: function(){
-		this.selectEnabled = true;
-		this.attachSelects();
-		this.element.addClass(this.options.classSelectable);
-		return this;
-	},
-
-	disableSelect: function(){
-		this.selectEnabled = false;
-		this.attachSelects(false);
-		this.element.removeClass(this.options.classSelectable);
-		return this;
-	},
-
-	push: function(){
-		var ret = this.previous.apply(this, arguments);
-		this.updateSelects();
-		return ret;
-	},
-
-	isSelected: function(row){
-		return this.selectedRows.contains(row);
-	},
-
-	toggleRow: function(row){
-		return this[(this.isSelected(row) ? 'de' : '') + 'selectRow'](row);
-	},
-
-	selectRow: function(row, _nocheck){
-		//private variable _nocheck: boolean whether or not to confirm the row is in the table body
-		//added here for optimization when selecting ranges
-		if (this.isSelected(row) || (!_nocheck && !this.body.getChildren().contains(row))) return;
-		if (!this.options.allowMultiSelect) this.selectNone();
-
-		if (!this.isSelected(row)){
-			this.selectedRows.push(row);
-			row.addClass(this.options.classRowSelected);
-			this.fireEvent('rowFocus', [row, this.selectedRows]);
-			this.fireEvent('stateChanged');
-		}
-
-		this.focused = row;
-		document.clearSelection();
-
-		return this;
-	},
-
-	getSelected: function(){
-		return this.selectedRows;
-	},
-
-	serialize: function() {
-		var previousSerialization = this.previous.apply(this, arguments) || {};
-		if (this.options.selectable) {
-			previousSerialization.selectedRows = this.selectedRows.map(function(row) {
-				return Array.indexOf(this.body.rows, row);
-			}.bind(this));
-		}
-		return previousSerialization;
-	},
-
-	restore: function(tableState) {
-		if(this.options.selectable && tableState.selectedRows) {
-			tableState.selectedRows.each(function(index) {
-				this.selectRow(this.body.rows[index]);
-			}.bind(this));
-		}
-		this.previous.apply(this, arguments);
-	},
-
-	deselectRow: function(row, _nocheck){
-		if (!this.isSelected(row) || (!_nocheck && !this.body.getChildren().contains(row))) return;
-
-		this.selectedRows = new Elements(Array.from(this.selectedRows).erase(row));
-		row.removeClass(this.options.classRowSelected);
-		this.fireEvent('rowUnfocus', [row, this.selectedRows]);
-		this.fireEvent('stateChanged');
-		return this;
-	},
-
-	selectAll: function(selectNone){
-		if (!selectNone && !this.options.allowMultiSelect) return;
-		this.selectRange(0, this.body.rows.length, selectNone);
-		return this;
-	},
-
-	selectNone: function(){
-		return this.selectAll(true);
-	},
-
-	selectRange: function(startRow, endRow, _deselect){
-		if (!this.options.allowMultiSelect && !_deselect) return;
-		var method = _deselect ? 'deselectRow' : 'selectRow',
-			rows = Array.clone(this.body.rows);
-
-		if (typeOf(startRow) == 'element') startRow = rows.indexOf(startRow);
-		if (typeOf(endRow) == 'element') endRow = rows.indexOf(endRow);
-		endRow = endRow < rows.length - 1 ? endRow : rows.length - 1;
-
-		if (endRow < startRow){
-			var tmp = startRow;
-			startRow = endRow;
-			endRow = tmp;
-		}
-
-		for (var i = startRow; i <= endRow; i++) this[method](rows[i], true);
-
-		return this;
-	},
-
-	deselectRange: function(startRow, endRow){
-		this.selectRange(startRow, endRow, true);
-	},
-
-	getSelected: function(){
-		return this.selectedRows;
-	},
-
-/*
-	Private methods:
-*/
-
-	enterRow: function(row){
-		if (this.hovered) this.hovered = this.leaveRow(this.hovered);
-		this.hovered = row.addClass(this.options.classRowHovered);
-	},
-
-	leaveRow: function(row){
-		row.removeClass(this.options.classRowHovered);
-	},
-
-	updateSelects: function(){
-		Array.each(this.body.rows, function(row){
-			var binders = row.retrieve('binders');
-			if (!binders && !this.selectEnabled) return;
-			if (!binders){
-				binders = {
-					mouseenter: this.enterRow.pass([row], this),
-					mouseleave: this.leaveRow.pass([row], this)
-				};
-				row.store('binders', binders);
-			}
-			if (this.selectEnabled) row.addEvents(binders);
-			else row.removeEvents(binders);
-		}, this);
-	},
-
-	shiftFocus: function(offset, event){
-		if (!this.focused) return this.selectRow(this.body.rows[0], event);
-		var to = this.getRowByOffset(offset);
-		if (to === null || this.focused == this.body.rows[to]) return this;
-		this.toggleRow(this.body.rows[to], event);
-	},
-
-	clickRow: function(event, row){
-		var selecting = (event.shift || event.meta || event.control) && this.options.shiftForMultiSelect;
-		if (!selecting && !(event.rightClick && this.isSelected(row) && this.options.allowMultiSelect)) this.selectNone();
-
-		if (event.rightClick) this.selectRow(row);
-		else this.toggleRow(row);
-
-		if (event.shift){
-			this.selectRange(this.rangeStart || this.body.rows[0], row, this.rangeStart ? !this.isSelected(row) : true);
-			this.focused = row;
-		}
-		this.rangeStart = row;
-	},
-
-	getRowByOffset: function(offset){
-		if (!this.focused) return 0;
-		var rows = Array.clone(this.body.rows),
-			index = rows.indexOf(this.focused) + offset;
-
-		if (index < 0) index = null;
-		if (index >= rows.length) index = null;
-
-		return index;
-	},
-
-	attachSelects: function(attach){
-		attach = attach != null ? attach : true;
-
-		var method = attach ? 'addEvents' : 'removeEvents';
-		this.element[method]({
-			mouseleave: this.bound.mouseleave,
-			click: this.bound.activateKeyboard
-		});
-
-		this.body[method]({
-			'click:relay(tr)': this.bound.clickRow,
-			'contextmenu:relay(tr)': this.bound.clickRow
-		});
-
-		if (this.options.useKeyboard || this.keyboard){
-			if (!this.keyboard) this.keyboard = new Keyboard();
-			if (!this.selectKeysDefined) {
-				this.selectKeysDefined = true;
-				var timer, held;
-
-				var move = function(offset){
-					var mover = function(e){
-						clearTimeout(timer);
-						e.preventDefault();
-
-						var to = this.body.rows[this.getRowByOffset(offset)];
-						if (e.shift && to && this.isSelected(to)){
-							this.deselectRow(this.focused);
-							this.focused = to;
-						} else {
-							if (to && (!this.options.allowMultiSelect || !e.shift)){
-								this.selectNone();
-							}
-							this.shiftFocus(offset, e);
-						}
-
-						if (held){
-							timer = mover.delay(100, this, e);
-						} else {
-							timer = (function(){
-								held = true;
-								mover(e);
-							}).delay(400);
-						}
-					}.bind(this);
-					return mover;
-				}.bind(this);
-
-				var clear = function(){
-					clearTimeout(timer);
-					held = false;
-				};
-
-				this.keyboard.addEvents({
-					'keydown:shift+up': move(-1),
-					'keydown:shift+down': move(1),
-					'keyup:shift+up': clear,
-					'keyup:shift+down': clear,
-					'keyup:up': clear,
-					'keyup:down': clear
-				});
-
-				var shiftHint = '';
-				if (this.options.allowMultiSelect && this.options.shiftForMultiSelect && this.options.useKeyboard){
-					shiftHint = " (Shift multi-selects).";
-				}
-
-				this.keyboard.addShortcuts({
-					'Select Previous Row': {
-						keys: 'up',
-						shortcut: 'up arrow',
-						handler: move(-1),
-						description: 'Select the previous row in the table.' + shiftHint
-					},
-					'Select Next Row': {
-						keys: 'down',
-						shortcut: 'down arrow',
-						handler: move(1),
-						description: 'Select the next row in the table.' + shiftHint
-					}
-				});
-
-			}
-			this.keyboard[attach ? 'activate' : 'deactivate']();
-		}
-		this.updateSelects();
-	},
-
-	mouseleave: function(){
-		if (this.hovered) this.leaveRow(this.hovered);
-	}
-
-});
-
-
-/*
----
-
-script: Scroller.js
-
-name: Scroller
-
-description: Class which scrolls the contents of any Element (including the window) when the mouse reaches the Element's boundaries.
-
-license: MIT-style license
-
-authors:
-  - Valerio Proietti
-
-requires:
-  - Core/Events
-  - Core/Options
-  - Core/Element.Event
-  - Core/Element.Dimensions
-  - MooTools.More
-
-provides: [Scroller]
-
-...
-*/
-
-var Scroller = new Class({
-
-	Implements: [Events, Options],
-
-	options: {
-		area: 20,
-		velocity: 1,
-		onChange: function(x, y){
-			this.element.scrollTo(x, y);
-		},
-		fps: 50
-	},
-
-	initialize: function(element, options){
-		this.setOptions(options);
-		this.element = document.id(element);
-		this.docBody = document.id(this.element.getDocument().body);
-		this.listener = (typeOf(this.element) != 'element') ? this.docBody : this.element;
-		this.timer = null;
-		this.bound = {
-			attach: this.attach.bind(this),
-			detach: this.detach.bind(this),
-			getCoords: this.getCoords.bind(this)
-		};
-	},
-
-	start: function(){
-		this.listener.addEvents({
-			mouseover: this.bound.attach,
-			mouseleave: this.bound.detach
-		});
-		return this;
-	},
-
-	stop: function(){
-		this.listener.removeEvents({
-			mouseover: this.bound.attach,
-			mouseleave: this.bound.detach
-		});
-		this.detach();
-		this.timer = clearInterval(this.timer);
-		return this;
-	},
-
-	attach: function(){
-		this.listener.addEvent('mousemove', this.bound.getCoords);
-	},
-
-	detach: function(){
-		this.listener.removeEvent('mousemove', this.bound.getCoords);
-		this.timer = clearInterval(this.timer);
-	},
-
-	getCoords: function(event){
-		this.page = (this.listener.get('tag') == 'body') ? event.client : event.page;
-		if (!this.timer) this.timer = this.scroll.periodical(Math.round(1000 / this.options.fps), this);
-	},
-
-	scroll: function(){
-		var size = this.element.getSize(),
-			scroll = this.element.getScroll(),
-			pos = this.element != this.docBody ? this.element.getOffsets() : {x: 0, y:0},
-			scrollSize = this.element.getScrollSize(),
-			change = {x: 0, y: 0},
-			top = this.options.area.top || this.options.area,
-			bottom = this.options.area.bottom || this.options.area;
-		for (var z in this.page){
-			if (this.page[z] < (top + pos[z]) && scroll[z] != 0){
-				change[z] = (this.page[z] - top - pos[z]) * this.options.velocity;
-			} else if (this.page[z] + bottom > (size[z] + pos[z]) && scroll[z] + size[z] != scrollSize[z]){
-				change[z] = (this.page[z] - size[z] + bottom - pos[z]) * this.options.velocity;
-			}
-			change[z] = change[z].round();
-		}
-		if (change.y || change.x) this.fireEvent('change', [scroll.x + change.x, scroll.y + change.y]);
-	}
-
-});
-
-
-/*
----
-
-script: Tips.js
-
-name: Tips
-
-description: Class for creating nice tips that follow the mouse cursor when hovering an element.
-
-license: MIT-style license
-
-authors:
-  - Valerio Proietti
-  - Christoph Pojer
-  - Luis Merino
-
-requires:
-  - Core/Options
-  - Core/Events
-  - Core/Element.Event
-  - Core/Element.Style
-  - Core/Element.Dimensions
-  - /MooTools.More
-
-provides: [Tips]
-
-...
-*/
-
-(function(){
-
-var read = function(option, element){
-	return (option) ? (typeOf(option) == 'function' ? option(element) : element.get(option)) : '';
-};
-
-this.Tips = new Class({
-
-	Implements: [Events, Options],
-
-	options: {/*
-		onAttach: function(element){},
-		onDetach: function(element){},
-		onBound: function(coords){},*/
-		onShow: function(){
-			this.tip.setStyle('display', 'block');
-		},
-		onHide: function(){
-			this.tip.setStyle('display', 'none');
-		},
-		title: 'title',
-		text: function(element){
-			return element.get('rel') || element.get('href');
-		},
-		showDelay: 100,
-		hideDelay: 100,
-		className: 'tip-wrap',
-		offset: {x: 16, y: 16},
-		windowPadding: {x:0, y:0},
-		fixed: false
-	},
-
-	initialize: function(){
-		var params = Array.link(arguments, {
-			options: Type.isObject,
-			elements: function(obj){
-				return obj != null;
-			}
-		});
-		this.setOptions(params.options);
-		if (params.elements) this.attach(params.elements);
-		this.container = new Element('div', {'class': 'tip'});
-	},
-
-	toElement: function(){
-		if (this.tip) return this.tip;
-
-		this.tip = new Element('div', {
-			'class': this.options.className,
-			styles: {
-				position: 'absolute',
-				top: 0,
-				left: 0
-			}
-		}).adopt(
-			new Element('div', {'class': 'tip-top'}),
-			this.container,
-			new Element('div', {'class': 'tip-bottom'})
-		);
-
-		return this.tip;
-	},
-
-	attach: function(elements){
-		$$(elements).each(function(element){
-			var title = read(this.options.title, element),
-				text = read(this.options.text, element);
-
-			element.set('title', '').store('tip:native', title).retrieve('tip:title', title);
-			element.retrieve('tip:text', text);
-			this.fireEvent('attach', [element]);
-
-			var events = ['enter', 'leave'];
-			if (!this.options.fixed) events.push('move');
-
-			events.each(function(value){
-				var event = element.retrieve('tip:' + value);
-				if (!event) event = function(event){
-					this['element' + value.capitalize()].apply(this, [event, element]);
-				}.bind(this);
-
-				element.store('tip:' + value, event).addEvent('mouse' + value, event);
-			}, this);
-		}, this);
-
-		return this;
-	},
-
-	detach: function(elements){
-		$$(elements).each(function(element){
-			['enter', 'leave', 'move'].each(function(value){
-				element.removeEvent('mouse' + value, element.retrieve('tip:' + value)).eliminate('tip:' + value);
-			});
-
-			this.fireEvent('detach', [element]);
-
-			if (this.options.title == 'title'){ // This is necessary to check if we can revert the title
-				var original = element.retrieve('tip:native');
-				if (original) element.set('title', original);
-			}
-		}, this);
-
-		return this;
-	},
-
-	elementEnter: function(event, element){
-		clearTimeout(this.timer);
-		this.timer = (function(){
-			this.container.empty();
-
-			['title', 'text'].each(function(value){
-				var content = element.retrieve('tip:' + value);
-				var div = this['_' + value + 'Element'] = new Element('div', {
-						'class': 'tip-' + value
-					}).inject(this.container);
-				if (content) this.fill(div, content);
-			}, this);
-			this.show(element);
-			this.position((this.options.fixed) ? {page: element.getPosition()} : event);
-		}).delay(this.options.showDelay, this);
-	},
-
-	elementLeave: function(event, element){
-		clearTimeout(this.timer);
-		this.timer = this.hide.delay(this.options.hideDelay, this, element);
-		this.fireForParent(event, element);
-	},
-
-	setTitle: function(title){
-		if (this._titleElement){
-			this._titleElement.empty();
-			this.fill(this._titleElement, title);
-		}
-		return this;
-	},
-
-	setText: function(text){
-		if (this._textElement){
-			this._textElement.empty();
-			this.fill(this._textElement, text);
-		}
-		return this;
-	},
-
-	fireForParent: function(event, element){
-		element = element.getParent();
-		if (!element || element == document.body) return;
-		if (element.retrieve('tip:enter')) element.fireEvent('mouseenter', event);
-		else this.fireForParent(event, element);
-	},
-
-	elementMove: function(event, element){
-		this.position(event);
-	},
-
-	position: function(event){
-		if (!this.tip) document.id(this);
-
-		var size = window.getSize(), scroll = window.getScroll(),
-			tip = {x: this.tip.offsetWidth, y: this.tip.offsetHeight},
-			props = {x: 'left', y: 'top'},
-			bounds = {y: false, x2: false, y2: false, x: false},
-			obj = {};
-
-		for (var z in props){
-			obj[props[z]] = event.page[z] + this.options.offset[z];
-			if (obj[props[z]] < 0) bounds[z] = true;
-			if ((obj[props[z]] + tip[z] - scroll[z]) > size[z] - this.options.windowPadding[z]){
-				obj[props[z]] = event.page[z] - this.options.offset[z] - tip[z];
-				bounds[z+'2'] = true;
-			}
-		}
-
-		this.fireEvent('bound', bounds);
-		this.tip.setStyles(obj);
-	},
-
-	fill: function(element, contents){
-		if (typeof contents == 'string') element.set('html', contents);
-		else element.adopt(contents);
-	},
-
-	show: function(element){
-		if (!this.tip) document.id(this);
-		if (!this.tip.getParent()) this.tip.inject(document.body);
-		this.fireEvent('show', [this.tip, element]);
-	},
-
-	hide: function(element){
-		if (!this.tip) document.id(this);
-		this.fireEvent('hide', [this.tip, element]);
-	}
-
-});
-
-})();
-
-
-/*
----
-
-script: Locale.Set.From.js
-
-name: Locale.Set.From
-
-description: Provides an alternative way to create Locale.Set objects.
-
-license: MIT-style license
-
-authors:
-  - Tim Wienk
-
-requires:
-  - Core/JSON
-  - /Locale
-
-provides: Locale.Set.From
-
-...
-*/
-
-(function(){
-
-var parsers = {
-	'json': JSON.decode
-};
-
-Locale.Set.defineParser = function(name, fn){
-	parsers[name] = fn;
-};
-
-Locale.Set.from = function(set, type){
-	if (instanceOf(set, Locale.Set)) return set;
-
-	if (!type && typeOf(set) == 'string') type = 'json';
-	if (parsers[type]) set = parsers[type](set);
-
-	var locale = new Locale.Set;
-
-	locale.sets = set.sets || {};
-
-	if (set.inherits){
-		locale.inherits.locales = Array.from(set.inherits.locales);
-		locale.inherits.sets = set.inherits.sets || {};
-	}
-
-	return locale;
-};
-
-})();
-
-
-/*
----
-
-name: Locale.ar.Date
-
-description: Date messages for Arabic.
-
-license: MIT-style license
-
-authors:
-  - Chafik Barbar
-
-requires:
-  - /Locale
-
-provides: [Locale.ar.Date]
-
-...
-*/
-
-Locale.define('ar', 'Date', {
-
-	// Culture's date order: DD/MM/YYYY
-	dateOrder: ['date', 'month', 'year'],
-	shortDate: '%d/%m/%Y',
-	shortTime: '%H:%M'
-
-});
-
-
-/*
----
-
-name: Locale.ar.Form.Validator
-
-description: Form Validator messages for Arabic.
-
-license: MIT-style license
-
-authors:
-  - Chafik Barbar
-
-requires:
-  - /Locale
-
-provides: [Locale.ar.Form.Validator]
-
-...
-*/
-
-Locale.define('ar', 'FormValidator', {
-
-	required: 'هذا الحقل مطلوب.',
-	minLength: 'رجاءً إدخال {minLength} أحرف على الأقل (تم إدخال {length} أحرف).',
-	maxLength: 'الرجاء عدم إدخال أكثر من {maxLength} أحرف (تم إدخال {length} أحرف).',
-	integer: 'الرجاء إدخال عدد صحيح في هذا الحقل. أي رقم ذو كسر عشري أو مئوي (مثال 1.25 ) غير مسموح.',
-	numeric: 'الرجاء إدخال قيم رقمية في هذا الحقل (مثال "1" أو "1.1" أو "-1" أو "-1.1").',
-	digits: 'الرجاء أستخدام قيم رقمية وعلامات ترقيمية فقط في هذا الحقل (مثال, رقم هاتف مع نقطة أو شحطة)',
-	alpha: 'الرجاء أستخدام أحرف فقط (ا-ي) في هذا الحقل. أي فراغات أو علامات غير مسموحة.',
-	alphanum: 'الرجاء أستخدام أحرف فقط (ا-ي) أو أرقام (0-9) فقط في هذا الحقل. أي فراغات أو علامات غير مسموحة.',
-	dateSuchAs: 'الرجاء إدخال تاريخ صحيح كالتالي {date}',
-	dateInFormatMDY: 'الرجاء إدخال تاريخ صحيح (مثال, 31-12-1999)',
-	email: 'الرجاء إدخال بريد إلكتروني صحيح.',
-	url: 'الرجاء إدخال عنوان إلكتروني صحيح مثل http://www.example.com',
-	currencyDollar: 'الرجاء إدخال قيمة $ صحيحة. مثال, 100.00$',
-	oneRequired: 'الرجاء إدخال قيمة في أحد هذه الحقول على الأقل.',
-	errorPrefix: 'خطأ: ',
-	warningPrefix: 'تحذير: '
-
-});
-
-
-/*
----
-
-name: Locale.ca-CA.Date
-
-description: Date messages for Catalan.
-
-license: MIT-style license
-
-authors:
-  - Ãlfons Sanchez
-
-requires:
-  - /Locale
-
-provides: [Locale.ca-CA.Date]
-
-...
-*/
-
-Locale.define('ca-CA', 'Date', {
-
-	months: ['Gener', 'Febrer', 'Març', 'Abril', 'Maig', 'Juny', 'Juli', 'Agost', 'Setembre', 'Octubre', 'Novembre', 'Desembre'],
-	months_abbr: ['gen.', 'febr.', 'març', 'abr.', 'maig', 'juny', 'jul.', 'ag.', 'set.', 'oct.', 'nov.', 'des.'],
-	days: ['Diumenge', 'Dilluns', 'Dimarts', 'Dimecres', 'Dijous', 'Divendres', 'Dissabte'],
-	days_abbr: ['dg', 'dl', 'dt', 'dc', 'dj', 'dv', 'ds'],
-
-	// Culture's date order: DD/MM/YYYY
-	dateOrder: ['date', 'month', 'year'],
-	shortDate: '%d/%m/%Y',
-	shortTime: '%H:%M',
-	AM: 'AM',
-	PM: 'PM',
-	firstDayOfWeek: 0,
-
-	// Date.Extras
-	ordinal: '',
-
-	lessThanMinuteAgo: 'fa menys d`un minut',
-	minuteAgo: 'fa un minut',
-	minutesAgo: 'fa {delta} minuts',
-	hourAgo: 'fa un hora',
-	hoursAgo: 'fa unes {delta} hores',
-	dayAgo: 'fa un dia',
-	daysAgo: 'fa {delta} dies',
-
-	lessThanMinuteUntil: 'menys d`un minut des d`ara',
-	minuteUntil: 'un minut des d`ara',
-	minutesUntil: '{delta} minuts des d`ara',
-	hourUntil: 'un hora des d`ara',
-	hoursUntil: 'unes {delta} hores des d`ara',
-	dayUntil: '1 dia des d`ara',
-	daysUntil: '{delta} dies des d`ara'
-
-});
-
-
-/*
----
-
-name: Locale.ca-CA.Form.Validator
-
-description: Form Validator messages for Catalan.
-
-license: MIT-style license
-
-authors:
-  - Miquel Hudin
-  - Ãlfons Sanchez
-
-requires:
-  - /Locale
-
-provides: [Locale.ca-CA.Form.Validator]
-
-...
-*/
-
-Locale.define('ca-CA', 'FormValidator', {
-
-	required: 'Aquest camp es obligatori.',
-	minLength: 'Per favor introdueix al menys {minLength} caracters (has introduit {length} caracters).',
-	maxLength: 'Per favor introdueix no mes de {maxLength} caracters (has introduit {length} caracters).',
-	integer: 'Per favor introdueix un nombre enter en aquest camp. Nombres amb decimals (p.e. 1,25) no estan permesos.',
-	numeric: 'Per favor introdueix sols valors numerics en aquest camp (p.e. "1" o "1,1" o "-1" o "-1,1").',
-	digits: 'Per favor usa sols numeros i puntuacio en aquest camp (per exemple, un nombre de telefon amb guions i punts no esta permes).',
-	alpha: 'Per favor utilitza lletres nomes (a-z) en aquest camp. No s´admiteixen espais ni altres caracters.',
-	alphanum: 'Per favor, utilitza nomes lletres (a-z) o numeros (0-9) en aquest camp. No s´admiteixen espais ni altres caracters.',
-	dateSuchAs: 'Per favor introdueix una data valida com {date}',
-	dateInFormatMDY: 'Per favor introdueix una data valida com DD/MM/YYYY (p.e. "31/12/1999")',
-	email: 'Per favor, introdueix una adreça de correu electronic valida. Per exemple, "fred@domain.com".',
-	url: 'Per favor introdueix una URL valida com http://www.example.com.',
-	currencyDollar: 'Per favor introdueix una quantitat valida de €. Per exemple €100,00 .',
-	oneRequired: 'Per favor introdueix alguna cosa per al menys una d´aquestes entrades.',
-	errorPrefix: 'Error: ',
-	warningPrefix: 'Avis: ',
-
-	// Form.Validator.Extras
-	noSpace: 'No poden haver espais en aquesta entrada.',
-	reqChkByNode: 'No hi han elements seleccionats.',
-	requiredChk: 'Aquest camp es obligatori.',
-	reqChkByName: 'Per favor selecciona una {label}.',
-	match: 'Aquest camp necessita coincidir amb el camp {matchName}',
-	startDate: 'la data de inici',
-	endDate: 'la data de fi',
-	currendDate: 'la data actual',
-	afterDate: 'La data deu ser igual o posterior a {label}.',
-	beforeDate: 'La data deu ser igual o anterior a {label}.',
-	startMonth: 'Per favor selecciona un mes d´orige',
-	sameMonth: 'Aquestes dos dates deuen estar dins del mateix mes - deus canviar una o altra.'
-
-});
-
-
-/*
----
-
-name: Locale.cs-CZ.Date
-
-description: Date messages for Czech.
-
-license: MIT-style license
-
-authors:
-  - Jan Černý chemiX
-  - Christopher Zukowski
-
-requires:
-  - /Locale
-
-provides: [Locale.cs-CZ.Date]
-
-...
-*/
-(function(){
-
-// Czech language pluralization rules, see http://unicode.org/repos/cldr-tmp/trunk/diff/supplemental/language_plural_rules.html
-// one -> n is 1;            1
-// few -> n in 2..4;         2-4
-// other -> everything else  0, 5-999, 1.31, 2.31, 5.31...
-var pluralize = function (n, one, few, other){
-	if (n == 1) return one;
-	else if (n == 2 || n == 3 || n == 4) return few;
-	else return other;
-};
-
-Locale.define('cs-CZ', 'Date', {
-
-	months: ['Leden', 'Únor', 'Březen', 'Duben', 'Květen', 'Červen', 'Červenec', 'Srpen', 'Září', 'Říjen', 'Listopad', 'Prosinec'],
-	months_abbr: ['ledna', 'února', 'března', 'dubna', 'května', 'června', 'července', 'srpna', 'září', 'října', 'listopadu', 'prosince'],
-	days: ['Neděle', 'Pondělí', 'Úterý', 'Středa', 'Čtvrtek', 'Pátek', 'Sobota'],
-	days_abbr: ['ne', 'po', 'út', 'st', 'čt', 'pá', 'so'],
-
-	// Culture's date order: DD.MM.YYYY
-	dateOrder: ['date', 'month', 'year'],
-	shortDate: '%d.%m.%Y',
-	shortTime: '%H:%M',
-	AM: 'dop.',
-	PM: 'odp.',
-	firstDayOfWeek: 1,
-
-	// Date.Extras
-	ordinal: '.',
-
-	lessThanMinuteAgo: 'před chvílí',
-	minuteAgo: 'přibližně před minutou',
-	minutesAgo: function(delta){ return 'před {delta} ' + pluralize(delta, 'minutou', 'minutami', 'minutami'); },
-	hourAgo: 'přibližně před hodinou',
-	hoursAgo: function(delta){ return 'před {delta} ' + pluralize(delta, 'hodinou', 'hodinami', 'hodinami'); },
-	dayAgo: 'před dnem',
-	daysAgo: function(delta){ return 'před {delta} ' + pluralize(delta, 'dnem', 'dny', 'dny'); },
-	weekAgo: 'před týdnem',
-	weeksAgo: function(delta){ return 'před {delta} ' + pluralize(delta, 'týdnem', 'týdny', 'týdny'); },
-	monthAgo: 'před měsícem',
-	monthsAgo: function(delta){ return 'před {delta} ' + pluralize(delta, 'měsícem', 'měsíci', 'měsíci'); },
-	yearAgo: 'před rokem',
-	yearsAgo: function(delta){ return 'před {delta} ' + pluralize(delta, 'rokem', 'lety', 'lety'); },
-
-	lessThanMinuteUntil: 'za chvíli',
-	minuteUntil: 'přibližně za minutu',
-	minutesUntil: function(delta){ return 'za {delta} ' + pluralize(delta, 'minutu', 'minuty', 'minut'); },
-	hourUntil: 'přibližně za hodinu',
-	hoursUntil: function(delta){ return 'za {delta} ' + pluralize(delta, 'hodinu', 'hodiny', 'hodin'); },
-	dayUntil: 'za den',
-	daysUntil: function(delta){ return 'za {delta} ' + pluralize(delta, 'den', 'dny', 'dnů'); },
-	weekUntil: 'za týden',
-	weeksUntil: function(delta){ return 'za {delta} ' + pluralize(delta, 'týden', 'týdny', 'týdnů'); },
-	monthUntil: 'za měsíc',
-	monthsUntil: function(delta){ return 'za {delta} ' + pluralize(delta, 'měsíc', 'měsíce', 'měsíců'); },
-	yearUntil: 'za rok',
-	yearsUntil: function(delta){ return 'za {delta} ' + pluralize(delta, 'rok', 'roky', 'let'); }
-});
-
-})();
-
-
-/*
----
-
-name: Locale.cs-CZ.Form.Validator
-
-description: Form Validator messages for Czech.
-
-license: MIT-style license
-
-authors:
-  - Jan Černý chemiX
-
-requires:
-  - /Locale
-
-provides: [Locale.cs-CZ.Form.Validator]
-
-...
-*/
-
-Locale.define('cs-CZ', 'FormValidator', {
-
-	required: 'Tato položka je povinná.',
-	minLength: 'Zadejte prosím alespoň {minLength} znaků (napsáno {length} znaků).',
-	maxLength: 'Zadejte prosím méně než {maxLength} znaků (nápsáno {length} znaků).',
-	integer: 'Zadejte prosím celé číslo. Desetinná čísla (např. 1.25) nejsou povolena.',
-	numeric: 'Zadejte jen číselné hodnoty (tj. "1" nebo "1.1" nebo "-1" nebo "-1.1").',
-	digits: 'Zadejte prosím pouze čísla a interpunkční znaménka(například telefonní číslo s pomlčkami nebo tečkami je povoleno).',
-	alpha: 'Zadejte prosím pouze písmena (a-z). Mezery nebo jiné znaky nejsou povoleny.',
-	alphanum: 'Zadejte prosím pouze písmena (a-z) nebo číslice (0-9). Mezery nebo jiné znaky nejsou povoleny.',
-	dateSuchAs: 'Zadejte prosím platné datum jako {date}',
-	dateInFormatMDY: 'Zadejte prosím platné datum jako MM / DD / RRRR (tj. "12/31/1999")',
-	email: 'Zadejte prosím platnou e-mailovou adresu. Například "fred@domain.com".',
-	url: 'Zadejte prosím platnou URL adresu jako http://www.example.com.',
-	currencyDollar: 'Zadejte prosím platnou částku. Například $100.00.',
-	oneRequired: 'Zadejte prosím alespoň jednu hodnotu pro tyto položky.',
-	errorPrefix: 'Chyba: ',
-	warningPrefix: 'Upozornění: ',
-
-	// Form.Validator.Extras
-	noSpace: 'V této položce nejsou povoleny mezery',
-	reqChkByNode: 'Nejsou vybrány žádné položky.',
-	requiredChk: 'Tato položka je vyžadována.',
-	reqChkByName: 'Prosím vyberte {label}.',
-	match: 'Tato položka se musí shodovat s položkou {matchName}',
-	startDate: 'datum zahájení',
-	endDate: 'datum ukončení',
-	currendDate: 'aktuální datum',
-	afterDate: 'Datum by mělo být stejné nebo větší než {label}.',
-	beforeDate: 'Datum by mělo být stejné nebo menší než {label}.',
-	startMonth: 'Vyberte počáteční měsíc.',
-	sameMonth: 'Tyto dva datumy musí být ve stejném měsíci - změňte jeden z nich.',
-	creditcard: 'Zadané číslo kreditní karty je neplatné. Prosím opravte ho. Bylo zadáno {length} čísel.'
-
-});
-
-
-/*
----
-
-name: Locale.da-DK.Date
-
-description: Date messages for Danish.
-
-license: MIT-style license
-
-authors:
-  - Martin Overgaard
-  - Henrik Hansen
-
-requires:
-  - /Locale
-
-provides: [Locale.da-DK.Date]
-
-...
-*/
-
-Locale.define('da-DK', 'Date', {
-
-	months: ['Januar', 'Februar', 'Marts', 'April', 'Maj', 'Juni', 'Juli', 'August', 'September', 'Oktober', 'November', 'December'],
-	months_abbr: ['jan.', 'feb.', 'mar.', 'apr.', 'maj.', 'jun.', 'jul.', 'aug.', 'sep.', 'okt.', 'nov.', 'dec.'],
-	days: ['Søndag', 'Mandag', 'Tirsdag', 'Onsdag', 'Torsdag', 'Fredag', 'Lørdag'],
-	days_abbr: ['søn', 'man', 'tir', 'ons', 'tor', 'fre', 'lør'],
-
-	// Culture's date order: DD-MM-YYYY
-	dateOrder: ['date', 'month', 'year'],
-	shortDate: '%d-%m-%Y',
-	shortTime: '%H:%M',
-	AM: 'AM',
-	PM: 'PM',
-	firstDayOfWeek: 1,
-
-	// Date.Extras
-	ordinal: '.',
-
-	lessThanMinuteAgo: 'mindre end et minut siden',
-	minuteAgo: 'omkring et minut siden',
-	minutesAgo: '{delta} minutter siden',
-	hourAgo: 'omkring en time siden',
-	hoursAgo: 'omkring {delta} timer siden',
-	dayAgo: '1 dag siden',
-	daysAgo: '{delta} dage siden',
-	weekAgo: '1 uge siden',
-	weeksAgo: '{delta} uger siden',
-	monthAgo: '1 måned siden',
-	monthsAgo: '{delta} måneder siden',
-	yearAgo: '1 år siden',
-	yearsAgo: '{delta} år siden',
-
-	lessThanMinuteUntil: 'mindre end et minut fra nu',
-	minuteUntil: 'omkring et minut fra nu',
-	minutesUntil: '{delta} minutter fra nu',
-	hourUntil: 'omkring en time fra nu',
-	hoursUntil: 'omkring {delta} timer fra nu',
-	dayUntil: '1 dag fra nu',
-	daysUntil: '{delta} dage fra nu',
-	weekUntil: '1 uge fra nu',
-	weeksUntil: '{delta} uger fra nu',
-	monthUntil: '1 måned fra nu',
-	monthsUntil: '{delta} måneder fra nu',
-	yearUntil: '1 år fra nu',
-	yearsUntil: '{delta} år fra nu'
-
-});
-
-
-/*
----
-
-name: Locale.da-DK.Form.Validator
-
-description: Form Validator messages for Danish.
-
-license: MIT-style license
-
-authors:
-  - Martin Overgaard
-
-requires:
-  - /Locale
-
-provides: [Locale.da-DK.Form.Validator]
-
-...
-*/
-
-Locale.define('da-DK', 'FormValidator', {
-
-	required: 'Feltet skal udfyldes.',
-	minLength: 'Skriv mindst {minLength} tegn (du skrev {length} tegn).',
-	maxLength: 'Skriv maksimalt {maxLength} tegn (du skrev {length} tegn).',
-	integer: 'Skriv et tal i dette felt. Decimal tal (f.eks. 1.25) er ikke tilladt.',
-	numeric: 'Skriv kun tal i dette felt (i.e. "1" eller "1.1" eller "-1" eller "-1.1").',
-	digits: 'Skriv kun tal og tegnsætning i dette felt (eksempel, et telefon nummer med bindestreg eller punktum er tilladt).',
-	alpha: 'Skriv kun bogstaver (a-z) i dette felt. Mellemrum og andre tegn er ikke tilladt.',
-	alphanum: 'Skriv kun bogstaver (a-z) eller tal (0-9) i dette felt. Mellemrum og andre tegn er ikke tilladt.',
-	dateSuchAs: 'Skriv en gyldig dato som {date}',
-	dateInFormatMDY: 'Skriv dato i formatet DD-MM-YYYY (f.eks. "31-12-1999")',
-	email: 'Skriv en gyldig e-mail adresse. F.eks "fred@domain.com".',
-	url: 'Skriv en gyldig URL adresse. F.eks "http://www.example.com".',
-	currencyDollar: 'Skriv et gldigt beløb. F.eks Kr.100.00 .',
-	oneRequired: 'Et eller flere af felterne i denne formular skal udfyldes.',
-	errorPrefix: 'Fejl: ',
-	warningPrefix: 'Advarsel: ',
-
-	// Form.Validator.Extras
-	noSpace: 'Der må ikke benyttes mellemrum i dette felt.',
-	reqChkByNode: 'Foretag et valg.',
-	requiredChk: 'Dette felt skal udfyldes.',
-	reqChkByName: 'Vælg en {label}.',
-	match: 'Dette felt skal matche {matchName} feltet',
-	startDate: 'start dato',
-	endDate: 'slut dato',
-	currendDate: 'dags dato',
-	afterDate: 'Datoen skal være større end eller lig med {label}.',
-	beforeDate: 'Datoen skal være mindre end eller lig med {label}.',
-	startMonth: 'Vælg en start måned',
-	sameMonth: 'De valgte datoer skal være i samme måned - skift en af dem.'
-
-});
-
-
-/*
----
-
-name: Locale.de-DE.Date
-
-description: Date messages for German.
-
-license: MIT-style license
-
-authors:
-  - Christoph Pojer
-  - Frank Rossi
-  - Ulrich Petri
-  - Fabian Beiner
-
-requires:
-  - /Locale
-
-provides: [Locale.de-DE.Date]
-
-...
-*/
-
-Locale.define('de-DE', 'Date', {
-
-	months: ['Januar', 'Februar', 'März', 'April', 'Mai', 'Juni', 'Juli', 'August', 'September', 'Oktober', 'November', 'Dezember'],
-	months_abbr: ['Jan', 'Feb', 'Mär', 'Apr', 'Mai', 'Jun', 'Jul', 'Aug', 'Sep', 'Okt', 'Nov', 'Dez'],
-	days: ['Sonntag', 'Montag', 'Dienstag', 'Mittwoch', 'Donnerstag', 'Freitag', 'Samstag'],
-	days_abbr: ['So.', 'Mo.', 'Di.', 'Mi.', 'Do.', 'Fr.', 'Sa.'],
-
-	// Culture's date order: DD.MM.YYYY
-	dateOrder: ['date', 'month', 'year'],
-	shortDate: '%d.%m.%Y',
-	shortTime: '%H:%M',
-	AM: 'vormittags',
-	PM: 'nachmittags',
-	firstDayOfWeek: 1,
-
-	// Date.Extras
-	ordinal: '.',
-
-	lessThanMinuteAgo: 'vor weniger als einer Minute',
-	minuteAgo: 'vor einer Minute',
-	minutesAgo: 'vor {delta} Minuten',
-	hourAgo: 'vor einer Stunde',
-	hoursAgo: 'vor {delta} Stunden',
-	dayAgo: 'vor einem Tag',
-	daysAgo: 'vor {delta} Tagen',
-	weekAgo: 'vor einer Woche',
-	weeksAgo: 'vor {delta} Wochen',
-	monthAgo: 'vor einem Monat',
-	monthsAgo: 'vor {delta} Monaten',
-	yearAgo: 'vor einem Jahr',
-	yearsAgo: 'vor {delta} Jahren',
-
-	lessThanMinuteUntil: 'in weniger als einer Minute',
-	minuteUntil: 'in einer Minute',
-	minutesUntil: 'in {delta} Minuten',
-	hourUntil: 'in ca. einer Stunde',
-	hoursUntil: 'in ca. {delta} Stunden',
-	dayUntil: 'in einem Tag',
-	daysUntil: 'in {delta} Tagen',
-	weekUntil: 'in einer Woche',
-	weeksUntil: 'in {delta} Wochen',
-	monthUntil: 'in einem Monat',
-	monthsUntil: 'in {delta} Monaten',
-	yearUntil: 'in einem Jahr',
-	yearsUntil: 'in {delta} Jahren'
-
-});
-
-
-/*
----
-
-name: Locale.de-CH.Date
-
-description: Date messages for German (Switzerland).
-
-license: MIT-style license
-
-authors:
-  - Michael van der Weg
-
-requires:
-  - /Locale
-  - /Locale.de-DE.Date
-
-provides: [Locale.de-CH.Date]
-
-...
-*/
-
-Locale.define('de-CH').inherit('de-DE', 'Date');
-
-
-/*
----
-
-name: Locale.de-CH.Form.Validator
-
-description: Form Validator messages for German (Switzerland).
-
-license: MIT-style license
-
-authors:
-  - Michael van der Weg
-
-requires:
-  - /Locale
-
-provides: [Locale.de-CH.Form.Validator]
-
-...
-*/
-
-Locale.define('de-CH', 'FormValidator', {
-
-	required: 'Dieses Feld ist obligatorisch.',
-	minLength: 'Geben Sie bitte mindestens {minLength} Zeichen ein (Sie haben {length} Zeichen eingegeben).',
-	maxLength: 'Bitte geben Sie nicht mehr als {maxLength} Zeichen ein (Sie haben {length} Zeichen eingegeben).',
-	integer: 'Geben Sie bitte eine ganze Zahl ein. Dezimalzahlen (z.B. 1.25) sind nicht erlaubt.',
-	numeric: 'Geben Sie bitte nur Zahlenwerte in dieses Eingabefeld ein (z.B. &quot;1&quot;, &quot;1.1&quot;, &quot;-1&quot; oder &quot;-1.1&quot;).',
-	digits: 'Benutzen Sie bitte nur Zahlen und Satzzeichen in diesem Eingabefeld (erlaubt ist z.B. eine Telefonnummer mit Bindestrichen und Punkten).',
-	alpha: 'Benutzen Sie bitte nur Buchstaben (a-z) in diesem Feld. Leerzeichen und andere Zeichen sind nicht erlaubt.',
-	alphanum: 'Benutzen Sie bitte nur Buchstaben (a-z) und Zahlen (0-9) in diesem Eingabefeld. Leerzeichen und andere Zeichen sind nicht erlaubt.',
-	dateSuchAs: 'Geben Sie bitte ein g&uuml;ltiges Datum ein. Wie zum Beispiel {date}',
-	dateInFormatMDY: 'Geben Sie bitte ein g&uuml;ltiges Datum ein. Wie zum Beispiel TT.MM.JJJJ (z.B. &quot;31.12.1999&quot;)',
-	email: 'Geben Sie bitte eine g&uuml;ltige E-Mail Adresse ein. Wie zum Beispiel &quot;maria@bernasconi.ch&quot;.',
-	url: 'Geben Sie bitte eine g&uuml;ltige URL ein. Wie zum Beispiel http://www.example.com.',
-	currencyDollar: 'Geben Sie bitte einen g&uuml;ltigen Betrag in Schweizer Franken ein. Wie zum Beispiel 100.00 CHF .',
-	oneRequired: 'Machen Sie f&uuml;r mindestens eines der Eingabefelder einen Eintrag.',
-	errorPrefix: 'Fehler: ',
-	warningPrefix: 'Warnung: ',
-
-	// Form.Validator.Extras
-	noSpace: 'In diesem Eingabefeld darf kein Leerzeichen sein.',
-	reqChkByNode: 'Es wurden keine Elemente gew&auml;hlt.',
-	requiredChk: 'Dieses Feld ist obligatorisch.',
-	reqChkByName: 'Bitte w&auml;hlen Sie ein {label}.',
-	match: 'Dieses Eingabefeld muss mit dem Feld {matchName} &uuml;bereinstimmen.',
-	startDate: 'Das Anfangsdatum',
-	endDate: 'Das Enddatum',
-	currendDate: 'Das aktuelle Datum',
-	afterDate: 'Das Datum sollte zur gleichen Zeit oder sp&auml;ter sein {label}.',
-	beforeDate: 'Das Datum sollte zur gleichen Zeit oder fr&uuml;her sein {label}.',
-	startMonth: 'W&auml;hlen Sie bitte einen Anfangsmonat',
-	sameMonth: 'Diese zwei Datumsangaben m&uuml;ssen im selben Monat sein - Sie m&uuml;ssen eine von beiden ver&auml;ndern.',
-	creditcard: 'Die eingegebene Kreditkartennummer ist ung&uuml;ltig. Bitte &uuml;berpr&uuml;fen Sie diese und versuchen Sie es erneut. {length} Zahlen eingegeben.'
-
-});
-
-
-/*
----
-
-name: Locale.de-DE.Form.Validator
-
-description: Form Validator messages for German.
-
-license: MIT-style license
-
-authors:
-  - Frank Rossi
-  - Ulrich Petri
-  - Fabian Beiner
-
-requires:
-  - /Locale
-
-provides: [Locale.de-DE.Form.Validator]
-
-...
-*/
-
-Locale.define('de-DE', 'FormValidator', {
-
-	required: 'Dieses Eingabefeld muss ausgefüllt werden.',
-	minLength: 'Geben Sie bitte mindestens {minLength} Zeichen ein (Sie haben nur {length} Zeichen eingegeben).',
-	maxLength: 'Geben Sie bitte nicht mehr als {maxLength} Zeichen ein (Sie haben {length} Zeichen eingegeben).',
-	integer: 'Geben Sie in diesem Eingabefeld bitte eine ganze Zahl ein. Dezimalzahlen (z.B. "1.25") sind nicht erlaubt.',
-	numeric: 'Geben Sie in diesem Eingabefeld bitte nur Zahlenwerte (z.B. "1", "1.1", "-1" oder "-1.1") ein.',
-	digits: 'Geben Sie in diesem Eingabefeld bitte nur Zahlen und Satzzeichen ein (z.B. eine Telefonnummer mit Bindestrichen und Punkten ist erlaubt).',
-	alpha: 'Geben Sie in diesem Eingabefeld bitte nur Buchstaben (a-z) ein. Leerzeichen und andere Zeichen sind nicht erlaubt.',
-	alphanum: 'Geben Sie in diesem Eingabefeld bitte nur Buchstaben (a-z) und Zahlen (0-9) ein. Leerzeichen oder andere Zeichen sind nicht erlaubt.',
-	dateSuchAs: 'Geben Sie bitte ein gültiges Datum ein (z.B. "{date}").',
-	dateInFormatMDY: 'Geben Sie bitte ein gültiges Datum im Format TT.MM.JJJJ ein (z.B. "31.12.1999").',
-	email: 'Geben Sie bitte eine gültige E-Mail-Adresse ein (z.B. "max@mustermann.de").',
-	url: 'Geben Sie bitte eine gültige URL ein (z.B. "http://www.example.com").',
-	currencyDollar: 'Geben Sie bitte einen gültigen Betrag in EURO ein (z.B. 100.00€).',
-	oneRequired: 'Bitte füllen Sie mindestens ein Eingabefeld aus.',
-	errorPrefix: 'Fehler: ',
-	warningPrefix: 'Warnung: ',
-
-	// Form.Validator.Extras
-	noSpace: 'Es darf kein Leerzeichen in diesem Eingabefeld sein.',
-	reqChkByNode: 'Es wurden keine Elemente gewählt.',
-	requiredChk: 'Dieses Feld muss ausgefüllt werden.',
-	reqChkByName: 'Bitte wählen Sie ein {label}.',
-	match: 'Dieses Eingabefeld muss mit dem {matchName} Eingabefeld übereinstimmen.',
-	startDate: 'Das Anfangsdatum',
-	endDate: 'Das Enddatum',
-	currendDate: 'Das aktuelle Datum',
-	afterDate: 'Das Datum sollte zur gleichen Zeit oder später sein als {label}.',
-	beforeDate: 'Das Datum sollte zur gleichen Zeit oder früher sein als {label}.',
-	startMonth: 'Wählen Sie bitte einen Anfangsmonat',
-	sameMonth: 'Diese zwei Datumsangaben müssen im selben Monat sein - Sie müssen eines von beiden verändern.',
-	creditcard: 'Die eingegebene Kreditkartennummer ist ungültig. Bitte überprüfen Sie diese und versuchen Sie es erneut. {length} Zahlen eingegeben.'
-
-});
-
-
-/*
----
-
-name: Locale.EU.Number
-
-description: Number messages for Europe.
-
-license: MIT-style license
-
-authors:
-  - Arian Stolwijk
-
-requires:
-  - /Locale
-
-provides: [Locale.EU.Number]
-
-...
-*/
-
-Locale.define('EU', 'Number', {
-
-	decimal: ',',
-	group: '.',
-
-	currency: {
-		prefix: '€ '
-	}
-
-});
-
-
-/*
----
-
-name: Locale.de-DE.Number
-
-description: Number messages for German.
-
-license: MIT-style license
-
-authors:
-  - Christoph Pojer
-
-requires:
-  - /Locale
-  - /Locale.EU.Number
-
-provides: [Locale.de-DE.Number]
-
-...
-*/
-
-Locale.define('de-DE').inherit('EU', 'Number');
-
-
-/*
----
-
-name: Locale.en-GB.Date
-
-description: Date messages for British English.
-
-license: MIT-style license
-
-authors:
-  - Aaron Newton
-
-requires:
-  - /Locale
-  - /Locale.en-US.Date
-
-provides: [Locale.en-GB.Date]
-
-...
-*/
-
-Locale.define('en-GB', 'Date', {
-
-	// Culture's date order: DD/MM/YYYY
-	dateOrder: ['date', 'month', 'year'],
-	shortDate: '%d/%m/%Y',
-	shortTime: '%H:%M'
-
-}).inherit('en-US', 'Date');
-
-
-/*
----
-
-name: Locale.es-ES.Date
-
-description: Date messages for Spanish.
-
-license: MIT-style license
-
-authors:
-  - Ãlfons Sanchez
-
-requires:
-  - /Locale
-
-provides: [Locale.es-ES.Date]
-
-...
-*/
-
-Locale.define('es-ES', 'Date', {
-
-	months: ['Enero', 'Febrero', 'Marzo', 'Abril', 'Mayo', 'Junio', 'Julio', 'Agosto', 'Septiembre', 'Octubre', 'Noviembre', 'Diciembre'],
-	months_abbr: ['ene', 'feb', 'mar', 'abr', 'may', 'jun', 'jul', 'ago', 'sep', 'oct', 'nov', 'dic'],
-	days: ['Domingo', 'Lunes', 'Martes', 'Miércoles', 'Jueves', 'Viernes', 'Sábado'],
-	days_abbr: ['dom', 'lun', 'mar', 'mié', 'juv', 'vie', 'sáb'],
-
-	// Culture's date order: DD/MM/YYYY
-	dateOrder: ['date', 'month', 'year'],
-	shortDate: '%d/%m/%Y',
-	shortTime: '%H:%M',
-	AM: 'AM',
-	PM: 'PM',
-	firstDayOfWeek: 1,
-
-	// Date.Extras
-	ordinal: '',
-
-	lessThanMinuteAgo: 'hace menos de un minuto',
-	minuteAgo: 'hace un minuto',
-	minutesAgo: 'hace {delta} minutos',
-	hourAgo: 'hace una hora',
-	hoursAgo: 'hace unas {delta} horas',
-	dayAgo: 'hace un día',
-	daysAgo: 'hace {delta} días',
-	weekAgo: 'hace una semana',
-	weeksAgo: 'hace unas {delta} semanas',
-	monthAgo: 'hace un mes',
-	monthsAgo: 'hace {delta} meses',
-	yearAgo: 'hace un año',
-	yearsAgo: 'hace {delta} años',
-
-	lessThanMinuteUntil: 'menos de un minuto desde ahora',
-	minuteUntil: 'un minuto desde ahora',
-	minutesUntil: '{delta} minutos desde ahora',
-	hourUntil: 'una hora desde ahora',
-	hoursUntil: 'unas {delta} horas desde ahora',
-	dayUntil: 'un día desde ahora',
-	daysUntil: '{delta} días desde ahora',
-	weekUntil: 'una semana desde ahora',
-	weeksUntil: 'unas {delta} semanas desde ahora',
-	monthUntil: 'un mes desde ahora',
-	monthsUntil: '{delta} meses desde ahora',
-	yearUntil: 'un año desde ahora',
-	yearsUntil: '{delta} años desde ahora'
-
-});
-
-
-/*
----
-
-name: Locale.es-AR.Date
-
-description: Date messages for Spanish (Argentina).
-
-license: MIT-style license
-
-authors:
-  - Ãlfons Sanchez
-  - Diego Massanti
-
-requires:
-  - /Locale
-  - /Locale.es-ES.Date
-
-provides: [Locale.es-AR.Date]
-
-...
-*/
-
-Locale.define('es-AR').inherit('es-ES', 'Date');
-
-
-/*
----
-
-name: Locale.es-AR.Form.Validator
-
-description: Form Validator messages for Spanish (Argentina).
-
-license: MIT-style license
-
-authors:
-  - Diego Massanti
-
-requires:
-  - /Locale
-
-provides: [Locale.es-AR.Form.Validator]
-
-...
-*/
-
-Locale.define('es-AR', 'FormValidator', {
-
-	required: 'Este campo es obligatorio.',
-	minLength: 'Por favor ingrese al menos {minLength} caracteres (ha ingresado {length} caracteres).',
-	maxLength: 'Por favor no ingrese más de {maxLength} caracteres (ha ingresado {length} caracteres).',
-	integer: 'Por favor ingrese un número entero en este campo. Números con decimales (p.e. 1,25) no se permiten.',
-	numeric: 'Por favor ingrese solo valores numéricos en este campo (p.e. "1" o "1,1" o "-1" o "-1,1").',
-	digits: 'Por favor use sólo números y puntuación en este campo (por ejemplo, un número de teléfono con guiones y/o puntos no está permitido).',
-	alpha: 'Por favor use sólo letras (a-z) en este campo. No se permiten espacios ni otros caracteres.',
-	alphanum: 'Por favor, usa sólo letras (a-z) o números (0-9) en este campo. No se permiten espacios u otros caracteres.',
-	dateSuchAs: 'Por favor ingrese una fecha válida como {date}',
-	dateInFormatMDY: 'Por favor ingrese una fecha válida, utulizando el formato DD/MM/YYYY (p.e. "31/12/1999")',
-	email: 'Por favor, ingrese una dirección de e-mail válida. Por ejemplo, "fred@dominio.com".',
-	url: 'Por favor ingrese una URL válida como http://www.example.com.',
-	currencyDollar: 'Por favor ingrese una cantidad válida de pesos. Por ejemplo $100,00 .',
-	oneRequired: 'Por favor ingrese algo para por lo menos una de estas entradas.',
-	errorPrefix: 'Error: ',
-	warningPrefix: 'Advertencia: ',
-
-	// Form.Validator.Extras
-	noSpace: 'No se permiten espacios en este campo.',
-	reqChkByNode: 'No hay elementos seleccionados.',
-	requiredChk: 'Este campo es obligatorio.',
-	reqChkByName: 'Por favor selecciona una {label}.',
-	match: 'Este campo necesita coincidir con el campo {matchName}',
-	startDate: 'la fecha de inicio',
-	endDate: 'la fecha de fin',
-	currendDate: 'la fecha actual',
-	afterDate: 'La fecha debe ser igual o posterior a {label}.',
-	beforeDate: 'La fecha debe ser igual o anterior a {label}.',
-	startMonth: 'Por favor selecciona un mes de origen',
-	sameMonth: 'Estas dos fechas deben estar en el mismo mes - debes cambiar una u otra.'
-
-});
-
-
-/*
----
-
-name: Locale.es-ES.Form.Validator
-
-description: Form Validator messages for Spanish.
-
-license: MIT-style license
-
-authors:
-  - Ãlfons Sanchez
-
-requires:
-  - /Locale
-
-provides: [Locale.es-ES.Form.Validator]
-
-...
-*/
-
-Locale.define('es-ES', 'FormValidator', {
-
-	required: 'Este campo es obligatorio.',
-	minLength: 'Por favor introduce al menos {minLength} caracteres (has introducido {length} caracteres).',
-	maxLength: 'Por favor introduce no m&aacute;s de {maxLength} caracteres (has introducido {length} caracteres).',
-	integer: 'Por favor introduce un n&uacute;mero entero en este campo. N&uacute;meros con decimales (p.e. 1,25) no se permiten.',
-	numeric: 'Por favor introduce solo valores num&eacute;ricos en este campo (p.e. "1" o "1,1" o "-1" o "-1,1").',
-	digits: 'Por favor usa solo n&uacute;meros y puntuaci&oacute;n en este campo (por ejemplo, un n&uacute;mero de tel&eacute;fono con guiones y puntos no esta permitido).',
-	alpha: 'Por favor usa letras solo (a-z) en este campo. No se admiten espacios ni otros caracteres.',
-	alphanum: 'Por favor, usa solo letras (a-z) o n&uacute;meros (0-9) en este campo. No se admiten espacios ni otros caracteres.',
-	dateSuchAs: 'Por favor introduce una fecha v&aacute;lida como {date}',
-	dateInFormatMDY: 'Por favor introduce una fecha v&aacute;lida como DD/MM/YYYY (p.e. "31/12/1999")',
-	email: 'Por favor, introduce una direcci&oacute;n de email v&aacute;lida. Por ejemplo, "fred@domain.com".',
-	url: 'Por favor introduce una URL v&aacute;lida como http://www.example.com.',
-	currencyDollar: 'Por favor introduce una cantidad v&aacute;lida de €. Por ejemplo €100,00 .',
-	oneRequired: 'Por favor introduce algo para por lo menos una de estas entradas.',
-	errorPrefix: 'Error: ',
-	warningPrefix: 'Aviso: ',
-
-	// Form.Validator.Extras
-	noSpace: 'No pueden haber espacios en esta entrada.',
-	reqChkByNode: 'No hay elementos seleccionados.',
-	requiredChk: 'Este campo es obligatorio.',
-	reqChkByName: 'Por favor selecciona una {label}.',
-	match: 'Este campo necesita coincidir con el campo {matchName}',
-	startDate: 'la fecha de inicio',
-	endDate: 'la fecha de fin',
-	currendDate: 'la fecha actual',
-	afterDate: 'La fecha debe ser igual o posterior a {label}.',
-	beforeDate: 'La fecha debe ser igual o anterior a {label}.',
-	startMonth: 'Por favor selecciona un mes de origen',
-	sameMonth: 'Estas dos fechas deben estar en el mismo mes - debes cambiar una u otra.'
-
-});
-
-
-/*
----
-
-name: Locale.et-EE.Date
-
-description: Date messages for Estonian.
-
-license: MIT-style license
-
-authors:
-  - Kevin Valdek
-
-requires:
-  - /Locale
-
-provides: [Locale.et-EE.Date]
-
-...
-*/
-
-Locale.define('et-EE', 'Date', {
-
-	months: ['jaanuar', 'veebruar', 'märts', 'aprill', 'mai', 'juuni', 'juuli', 'august', 'september', 'oktoober', 'november', 'detsember'],
-	months_abbr: ['jaan', 'veebr', 'märts', 'apr', 'mai', 'juuni', 'juuli', 'aug', 'sept', 'okt', 'nov', 'dets'],
-	days: ['pühapäev', 'esmaspäev', 'teisipäev', 'kolmapäev', 'neljapäev', 'reede', 'laupäev'],
-	days_abbr: ['pühap', 'esmasp', 'teisip', 'kolmap', 'neljap', 'reede', 'laup'],
-
-	// Culture's date order: MM.DD.YYYY
-	dateOrder: ['month', 'date', 'year'],
-	shortDate: '%m.%d.%Y',
-	shortTime: '%H:%M',
-	AM: 'AM',
-	PM: 'PM',
-	firstDayOfWeek: 1,
-
-	// Date.Extras
-	ordinal: '',
-
-	lessThanMinuteAgo: 'vähem kui minut aega tagasi',
-	minuteAgo: 'umbes minut aega tagasi',
-	minutesAgo: '{delta} minutit tagasi',
-	hourAgo: 'umbes tund aega tagasi',
-	hoursAgo: 'umbes {delta} tundi tagasi',
-	dayAgo: '1 päev tagasi',
-	daysAgo: '{delta} päeva tagasi',
-	weekAgo: '1 nädal tagasi',
-	weeksAgo: '{delta} nädalat tagasi',
-	monthAgo: '1 kuu tagasi',
-	monthsAgo: '{delta} kuud tagasi',
-	yearAgo: '1 aasta tagasi',
-	yearsAgo: '{delta} aastat tagasi',
-
-	lessThanMinuteUntil: 'vähem kui minuti aja pärast',
-	minuteUntil: 'umbes minuti aja pärast',
-	minutesUntil: '{delta} minuti pärast',
-	hourUntil: 'umbes tunni aja pärast',
-	hoursUntil: 'umbes {delta} tunni pärast',
-	dayUntil: '1 päeva pärast',
-	daysUntil: '{delta} päeva pärast',
-	weekUntil: '1 nädala pärast',
-	weeksUntil: '{delta} nädala pärast',
-	monthUntil: '1 kuu pärast',
-	monthsUntil: '{delta} kuu pärast',
-	yearUntil: '1 aasta pärast',
-	yearsUntil: '{delta} aasta pärast'
-
-});
-
-
-/*
----
-
-name: Locale.et-EE.Form.Validator
-
-description: Form Validator messages for Estonian.
-
-license: MIT-style license
-
-authors:
-  - Kevin Valdek
-
-requires:
-  - /Locale
-
-provides: [Locale.et-EE.Form.Validator]
-
-...
-*/
-
-Locale.define('et-EE', 'FormValidator', {
-
-	required: 'Väli peab olema täidetud.',
-	minLength: 'Palun sisestage vähemalt {minLength} tähte (te sisestasite {length} tähte).',
-	maxLength: 'Palun ärge sisestage rohkem kui {maxLength} tähte (te sisestasite {length} tähte).',
-	integer: 'Palun sisestage väljale täisarv. Kümnendarvud (näiteks 1.25) ei ole lubatud.',
-	numeric: 'Palun sisestage ainult numbreid väljale (näiteks "1", "1.1", "-1" või "-1.1").',
-	digits: 'Palun kasutage ainult numbreid ja kirjavahemärke (telefoninumbri sisestamisel on lubatud kasutada kriipse ja punkte).',
-	alpha: 'Palun kasutage ainult tähti (a-z). Tühikud ja teised sümbolid on keelatud.',
-	alphanum: 'Palun kasutage ainult tähti (a-z) või numbreid (0-9). Tühikud ja teised sümbolid on keelatud.',
-	dateSuchAs: 'Palun sisestage kehtiv kuupäev kujul {date}',
-	dateInFormatMDY: 'Palun sisestage kehtiv kuupäev kujul MM.DD.YYYY (näiteks: "12.31.1999").',
-	email: 'Palun sisestage kehtiv e-maili aadress (näiteks: "fred@domain.com").',
-	url: 'Palun sisestage kehtiv URL (näiteks: http://www.example.com).',
-	currencyDollar: 'Palun sisestage kehtiv $ summa (näiteks: $100.00).',
-	oneRequired: 'Palun sisestage midagi vähemalt ühele antud väljadest.',
-	errorPrefix: 'Viga: ',
-	warningPrefix: 'Hoiatus: ',
-
-	// Form.Validator.Extras
-	noSpace: 'Väli ei tohi sisaldada tühikuid.',
-	reqChkByNode: 'Ükski väljadest pole valitud.',
-	requiredChk: 'Välja täitmine on vajalik.',
-	reqChkByName: 'Palun valige üks {label}.',
-	match: 'Väli peab sobima {matchName} väljaga',
-	startDate: 'algkuupäev',
-	endDate: 'lõppkuupäev',
-	currendDate: 'praegune kuupäev',
-	afterDate: 'Kuupäev peab olema võrdne või pärast {label}.',
-	beforeDate: 'Kuupäev peab olema võrdne või enne {label}.',
-	startMonth: 'Palun valige algkuupäev.',
-	sameMonth: 'Antud kaks kuupäeva peavad olema samas kuus - peate muutma ühte kuupäeva.'
-
-});
-
-
-/*
----
-
-name: Locale.fa.Date
-
-description: Date messages for Persian.
-
-license: MIT-style license
-
-authors:
-  - Amir Hossein Hodjaty Pour
-
-requires:
-  - /Locale
-
-provides: [Locale.fa.Date]
-
-...
-*/
-
-Locale.define('fa', 'Date', {
-
-	months: ['ژانویه', 'فوریه', 'مارس', 'آپریل', 'مه', 'ژوئن', 'ژوئیه', 'آگوست', 'سپتامبر', 'اکتبر', 'نوامبر', 'دسامبر'],
-	months_abbr: ['1', '2', '3', '4', '5', '6', '7', '8', '9', '10', '11', '12'],
-	days: ['یکشنبه', 'دوشنبه', 'سه شنبه', 'چهارشنبه', 'پنجشنبه', 'جمعه', 'شنبه'],
-	days_abbr: ['ي', 'د', 'س', 'چ', 'پ', 'ج', 'ش'],
-
-	// Culture's date order: MM/DD/YYYY
-	dateOrder: ['month', 'date', 'year'],
-	shortDate: '%m/%d/%Y',
-	shortTime: '%I:%M%p',
-	AM: 'ق.ظ',
-	PM: 'ب.ظ',
-
-	// Date.Extras
-	ordinal: 'ام',
-
-	lessThanMinuteAgo: 'کمتر از یک دقیقه پیش',
-	minuteAgo: 'حدود یک دقیقه پیش',
-	minutesAgo: '{delta} دقیقه پیش',
-	hourAgo: 'حدود یک ساعت پیش',
-	hoursAgo: 'حدود {delta} ساعت پیش',
-	dayAgo: '1 روز پیش',
-	daysAgo: '{delta} روز پیش',
-	weekAgo: '1 هفته پیش',
-	weeksAgo: '{delta} هفته پیش',
-	monthAgo: '1 ماه پیش',
-	monthsAgo: '{delta} ماه پیش',
-	yearAgo: '1 سال پیش',
-	yearsAgo: '{delta} سال پیش',
-
-	lessThanMinuteUntil: 'کمتر از یک دقیقه از حالا',
-	minuteUntil: 'حدود یک دقیقه از حالا',
-	minutesUntil: '{delta} دقیقه از حالا',
-	hourUntil: 'حدود یک ساعت از حالا',
-	hoursUntil: 'حدود {delta} ساعت از حالا',
-	dayUntil: '1 روز از حالا',
-	daysUntil: '{delta} روز از حالا',
-	weekUntil: '1 هفته از حالا',
-	weeksUntil: '{delta} هفته از حالا',
-	monthUntil: '1 ماه از حالا',
-	monthsUntil: '{delta} ماه از حالا',
-	yearUntil: '1 سال از حالا',
-	yearsUntil: '{delta} سال از حالا'
-
-});
-
-
-/*
----
-
-name: Locale.fa.Form.Validator
-
-description: Form Validator messages for Persian.
-
-license: MIT-style license
-
-authors:
-  - Amir Hossein Hodjaty Pour
-
-requires:
-  - /Locale
-
-provides: [Locale.fa.Form.Validator]
-
-...
-*/
-
-Locale.define('fa', 'FormValidator', {
-
-	required: 'این فیلد الزامی است.',
-	minLength: 'شما باید حداقل {minLength} حرف وارد کنید ({length} حرف وارد کرده اید).',
-	maxLength: 'لطفا حداکثر {maxLength} حرف وارد کنید (شما {length} حرف وارد کرده اید).',
-	integer: 'لطفا از عدد صحیح استفاده کنید. اعداد اعشاری (مانند 1.25) مجاز نیستند.',
-	numeric: 'لطفا فقط داده عددی وارد کنید (مانند "1" یا "1.1" یا "1-" یا "1.1-").',
-	digits: 'لطفا فقط از اعداد و علامتها در این فیلد استفاده کنید (برای مثال شماره تلفن با خط تیره و نقطه قابل قبول است).',
-	alpha: 'لطفا فقط از حروف الفباء برای این بخش استفاده کنید. کاراکترهای دیگر و فاصله مجاز نیستند.',
-	alphanum: 'لطفا فقط از حروف الفباء و اعداد در این بخش استفاده کنید. کاراکترهای دیگر و فاصله مجاز نیستند.',
-	dateSuchAs: 'لطفا یک تاریخ معتبر مانند {date} وارد کنید.',
-	dateInFormatMDY: 'لطفا یک تاریخ معتبر به شکل MM/DD/YYYY وارد کنید (مانند "12/31/1999").',
-	email: 'لطفا یک آدرس ایمیل معتبر وارد کنید. برای مثال "fred@domain.com".',
-	url: 'لطفا یک URL معتبر مانند http://www.example.com وارد کنید.',
-	currencyDollar: 'لطفا یک محدوده معتبر برای این بخش وارد کنید مانند 100.00$ .',
-	oneRequired: 'لطفا حداقل یکی از فیلدها را پر کنید.',
-	errorPrefix: 'خطا: ',
-	warningPrefix: 'هشدار: ',
-
-	// Form.Validator.Extras
-	noSpace: 'استفاده از فاصله در این بخش مجاز نیست.',
-	reqChkByNode: 'موردی انتخاب نشده است.',
-	requiredChk: 'این فیلد الزامی است.',
-	reqChkByName: 'لطفا یک {label} را انتخاب کنید.',
-	match: 'این فیلد باید با فیلد {matchName} مطابقت داشته باشد.',
-	startDate: 'تاریخ شروع',
-	endDate: 'تاریخ پایان',
-	currendDate: 'تاریخ کنونی',
-	afterDate: 'تاریخ میبایست برابر یا بعد از {label} باشد',
-	beforeDate: 'تاریخ میبایست برابر یا قبل از {label} باشد',
-	startMonth: 'لطفا ماه شروع را انتخاب کنید',
-	sameMonth: 'این دو تاریخ باید در یک ماه باشند - شما باید یکی یا هر دو را تغییر دهید.',
-	creditcard: 'شماره کارت اعتباری که وارد کرده اید معتبر نیست. لطفا شماره را بررسی کنید و مجددا تلاش کنید. {length} رقم وارد شده است.'
-
-});
-
-
-/*
----
-
-name: Locale.fi-FI.Date
-
-description: Date messages for Finnish.
-
-license: MIT-style license
-
-authors:
-  - ksel
-
-requires:
-  - /Locale
-
-provides: [Locale.fi-FI.Date]
-
-...
-*/
-
-Locale.define('fi-FI', 'Date', {
-
-	// NOTE: months and days are not capitalized in finnish
-	months: ['tammikuu', 'helmikuu', 'maaliskuu', 'huhtikuu', 'toukokuu', 'kesäkuu', 'heinäkuu', 'elokuu', 'syyskuu', 'lokakuu', 'marraskuu', 'joulukuu'],
-
-	// these abbreviations are really not much used in finnish because they obviously won't abbreviate very much. ;)
-	// NOTE: sometimes one can see forms such as "tammi", "helmi", etc. but that is not proper finnish.
-	months_abbr: ['tammik.', 'helmik.', 'maalisk.', 'huhtik.', 'toukok.', 'kesäk.', 'heinäk.', 'elok.', 'syysk.', 'lokak.', 'marrask.', 'jouluk.'],
-
-	days: ['sunnuntai', 'maanantai', 'tiistai', 'keskiviikko', 'torstai', 'perjantai', 'lauantai'],
-	days_abbr: ['su', 'ma', 'ti', 'ke', 'to', 'pe', 'la'],
-
-	// Culture's date order: DD/MM/YYYY
-	dateOrder: ['date', 'month', 'year'],
-	shortDate: '%d.%m.%Y',
-	shortTime: '%H:%M',
-	AM: 'AM',
-	PM: 'PM',
-	firstDayOfWeek: 1,
-
-	// Date.Extras
-	ordinal: '.',
-
-	lessThanMinuteAgo: 'vajaa minuutti sitten',
-	minuteAgo: 'noin minuutti sitten',
-	minutesAgo: '{delta} minuuttia sitten',
-	hourAgo: 'noin tunti sitten',
-	hoursAgo: 'noin {delta} tuntia sitten',
-	dayAgo: 'päivä sitten',
-	daysAgo: '{delta} päivää sitten',
-	weekAgo: 'viikko sitten',
-	weeksAgo: '{delta} viikkoa sitten',
-	monthAgo: 'kuukausi sitten',
-	monthsAgo: '{delta} kuukautta sitten',
-	yearAgo: 'vuosi sitten',
-	yearsAgo: '{delta} vuotta sitten',
-
-	lessThanMinuteUntil: 'vajaan minuutin kuluttua',
-	minuteUntil: 'noin minuutin kuluttua',
-	minutesUntil: '{delta} minuutin kuluttua',
-	hourUntil: 'noin tunnin kuluttua',
-	hoursUntil: 'noin {delta} tunnin kuluttua',
-	dayUntil: 'päivän kuluttua',
-	daysUntil: '{delta} päivän kuluttua',
-	weekUntil: 'viikon kuluttua',
-	weeksUntil: '{delta} viikon kuluttua',
-	monthUntil: 'kuukauden kuluttua',
-	monthsUntil: '{delta} kuukauden kuluttua',
-	yearUntil: 'vuoden kuluttua',
-	yearsUntil: '{delta} vuoden kuluttua'
-
-});
-
-
-/*
----
-
-name: Locale.fi-FI.Form.Validator
-
-description: Form Validator messages for Finnish.
-
-license: MIT-style license
-
-authors:
-  - ksel
-
-requires:
-  - /Locale
-
-provides: [Locale.fi-FI.Form.Validator]
-
-...
-*/
-
-Locale.define('fi-FI', 'FormValidator', {
-
-	required: 'Tämä kenttä on pakollinen.',
-	minLength: 'Ole hyvä ja anna vähintään {minLength} merkkiä (annoit {length} merkkiä).',
-	maxLength: 'Älä anna enempää kuin {maxLength} merkkiä (annoit {length} merkkiä).',
-	integer: 'Ole hyvä ja anna kokonaisluku. Luvut, joissa on desimaaleja (esim. 1.25) eivät ole sallittuja.',
-	numeric: 'Anna tähän kenttään lukuarvo (kuten "1" tai "1.1" tai "-1" tai "-1.1").',
-	digits: 'Käytä pelkästään numeroita ja välimerkkejä tässä kentässä (syötteet, kuten esim. puhelinnumero, jossa on väliviivoja, pilkkuja tai pisteitä, kelpaa).',
-	alpha: 'Anna tähän kenttään vain kirjaimia (a-z). Välilyönnit tai muut merkit eivät ole sallittuja.',
-	alphanum: 'Anna tähän kenttään vain kirjaimia (a-z) tai numeroita (0-9). Välilyönnit tai muut merkit eivät ole sallittuja.',
-	dateSuchAs: 'Ole hyvä ja anna kelvollinen päivmäärä, kuten esimerkiksi {date}',
-	dateInFormatMDY: 'Ole hyvä ja anna kelvollinen päivämäärä muodossa pp/kk/vvvv (kuten "12/31/1999")',
-	email: 'Ole hyvä ja anna kelvollinen sähköpostiosoite (kuten esimerkiksi "matti@meikalainen.com").',
-	url: 'Ole hyvä ja anna kelvollinen URL, kuten esimerkiksi http://www.example.com.',
-	currencyDollar: 'Ole hyvä ja anna kelvollinen eurosumma (kuten esimerkiksi 100,00 EUR) .',
-	oneRequired: 'Ole hyvä ja syötä jotakin ainakin johonkin näistä kentistä.',
-	errorPrefix: 'Virhe: ',
-	warningPrefix: 'Varoitus: ',
-
-	// Form.Validator.Extras
-	noSpace: 'Tässä syötteessä ei voi olla välilyöntejä',
-	reqChkByNode: 'Ei valintoja.',
-	requiredChk: 'Tämä kenttä on pakollinen.',
-	reqChkByName: 'Ole hyvä ja valitse {label}.',
-	match: 'Tämän kentän tulee vastata kenttää {matchName}',
-	startDate: 'alkupäivämäärä',
-	endDate: 'loppupäivämäärä',
-	currendDate: 'nykyinen päivämäärä',
-	afterDate: 'Päivämäärän tulisi olla sama tai myöhäisempi ajankohta kuin {label}.',
-	beforeDate: 'Päivämäärän tulisi olla sama tai aikaisempi ajankohta kuin {label}.',
-	startMonth: 'Ole hyvä ja valitse aloituskuukausi',
-	sameMonth: 'Näiden kahden päivämäärän tulee olla saman kuun sisällä -- sinun pitää muuttaa jompaa kumpaa.',
-	creditcard: 'Annettu luottokortin numero ei kelpaa. Ole hyvä ja tarkista numero sekä yritä uudelleen. {length} numeroa syötetty.'
-
-});
-
-
-/*
----
-
-name: Locale.fi-FI.Number
-
-description: Finnish number messages
-
-license: MIT-style license
-
-authors:
-  - ksel
-
-requires:
-  - /Locale
-  - /Locale.EU.Number
-
-provides: [Locale.fi-FI.Number]
-
-...
-*/
-
-Locale.define('fi-FI', 'Number', {
-
-	group: ' ' // grouped by space
-
-}).inherit('EU', 'Number');
-
-
-/*
----
-
-name: Locale.fr-FR.Date
-
-description: Date messages for French.
-
-license: MIT-style license
-
-authors:
-  - Nicolas Sorosac
-  - Antoine Abt
-
-requires:
-  - /Locale
-
-provides: [Locale.fr-FR.Date]
-
-...
-*/
-
-Locale.define('fr-FR', 'Date', {
-
-	months: ['Janvier', 'Février', 'Mars', 'Avril', 'Mai', 'Juin', 'Juillet', 'Août', 'Septembre', 'Octobre', 'Novembre', 'Décembre'],
-	months_abbr: ['janv.', 'févr.', 'mars', 'avr.', 'mai', 'juin', 'juil.', 'août', 'sept.', 'oct.', 'nov.', 'déc.'],
-	days: ['Dimanche', 'Lundi', 'Mardi', 'Mercredi', 'Jeudi', 'Vendredi', 'Samedi'],
-	days_abbr: ['dim.', 'lun.', 'mar.', 'mer.', 'jeu.', 'ven.', 'sam.'],
-
-	// Culture's date order: DD/MM/YYYY
-	dateOrder: ['date', 'month', 'year'],
-	shortDate: '%d/%m/%Y',
-	shortTime: '%H:%M',
-	AM: 'AM',
-	PM: 'PM',
-	firstDayOfWeek: 1,
-
-	// Date.Extras
-	ordinal: function(dayOfMonth){
-		return (dayOfMonth > 1) ? '' : 'er';
-	},
-
-	lessThanMinuteAgo: "il y a moins d'une minute",
-	minuteAgo: 'il y a une minute',
-	minutesAgo: 'il y a {delta} minutes',
-	hourAgo: 'il y a une heure',
-	hoursAgo: 'il y a {delta} heures',
-	dayAgo: 'il y a un jour',
-	daysAgo: 'il y a {delta} jours',
-	weekAgo: 'il y a une semaine',
-	weeksAgo: 'il y a {delta} semaines',
-	monthAgo: 'il y a 1 mois',
-	monthsAgo: 'il y a {delta} mois',
-	yearthAgo: 'il y a 1 an',
-	yearsAgo: 'il y a {delta} ans',
-
-	lessThanMinuteUntil: "dans moins d'une minute",
-	minuteUntil: 'dans une minute',
-	minutesUntil: 'dans {delta} minutes',
-	hourUntil: 'dans une heure',
-	hoursUntil: 'dans {delta} heures',
-	dayUntil: 'dans un jour',
-	daysUntil: 'dans {delta} jours',
-	weekUntil: 'dans 1 semaine',
-	weeksUntil: 'dans {delta} semaines',
-	monthUntil: 'dans 1 mois',
-	monthsUntil: 'dans {delta} mois',
-	yearUntil: 'dans 1 an',
-	yearsUntil: 'dans {delta} ans'
-
-});
-
-
-/*
----
-
-name: Locale.fr-FR.Form.Validator
-
-description: Form Validator messages for French.
-
-license: MIT-style license
-
-authors:
-  - Miquel Hudin
-  - Nicolas Sorosac
-
-requires:
-  - /Locale
-
-provides: [Locale.fr-FR.Form.Validator]
-
-...
-*/
-
-Locale.define('fr-FR', 'FormValidator', {
-
-	required: 'Ce champ est obligatoire.',
-	minLength: 'Veuillez saisir un minimum de {minLength} caract&egrave;re(s) (vous avez saisi {length} caract&egrave;re(s)).',
-	maxLength: 'Veuillez saisir un maximum de {maxLength} caract&egrave;re(s) (vous avez saisi {length} caract&egrave;re(s)).',
-	integer: 'Veuillez saisir un nombre entier dans ce champ. Les nombres d&eacute;cimaux (ex : "1,25") ne sont pas autoris&eacute;s.',
-	numeric: 'Veuillez saisir uniquement des chiffres dans ce champ (ex : "1" ou "1,1" ou "-1" ou "-1,1").',
-	digits: "Veuillez saisir uniquement des chiffres et des signes de ponctuation dans ce champ (ex : un num&eacute;ro de t&eacute;l&eacute;phone avec des traits d'union est autoris&eacute;).",
-	alpha: 'Veuillez saisir uniquement des lettres (a-z) dans ce champ. Les espaces ou autres caract&egrave;res ne sont pas autoris&eacute;s.',
-	alphanum: 'Veuillez saisir uniquement des lettres (a-z) ou des chiffres (0-9) dans ce champ. Les espaces ou autres caract&egrave;res ne sont pas autoris&eacute;s.',
-	dateSuchAs: 'Veuillez saisir une date correcte comme {date}',
-	dateInFormatMDY: 'Veuillez saisir une date correcte, au format JJ/MM/AAAA (ex : "31/11/1999").',
-	email: 'Veuillez saisir une adresse de courrier &eacute;lectronique. Par example "fred@domaine.com".',
-	url: 'Veuillez saisir une URL, comme http://www.example.com.',
-	currencyDollar: 'Veuillez saisir une quantit&eacute; correcte. Par example 100,00&euro;.',
-	oneRequired: 'Veuillez s&eacute;lectionner au moins une de ces options.',
-	errorPrefix: 'Erreur : ',
-	warningPrefix: 'Attention : ',
-
-	// Form.Validator.Extras
-	noSpace: "Ce champ n'accepte pas les espaces.",
-	reqChkByNode: "Aucun &eacute;l&eacute;ment n'est s&eacute;lectionn&eacute;.",
-	requiredChk: 'Ce champ est obligatoire.',
-	reqChkByName: 'Veuillez s&eacute;lectionner un(e) {label}.',
-	match: 'Ce champ doit correspondre avec le champ {matchName}.',
-	startDate: 'date de d&eacute;but',
-	endDate: 'date de fin',
-	currendDate: 'date actuelle',
-	afterDate: 'La date doit &ecirc;tre identique ou post&eacute;rieure &agrave; {label}.',
-	beforeDate: 'La date doit &ecirc;tre identique ou ant&eacute;rieure &agrave; {label}.',
-	startMonth: 'Veuillez s&eacute;lectionner un mois de d&eacute;but.',
-	sameMonth: 'Ces deux dates doivent &ecirc;tre dans le m&ecirc;me mois - vous devez en modifier une.',
-	creditcard: 'Le num&eacute;ro de carte de cr&eacute;dit est invalide. Merci de v&eacute;rifier le num&eacute;ro et de r&eacute;essayer. Vous avez entr&eacute; {length} chiffre(s).'
-
-});
-
-
-/*
----
-
-name: Locale.fr-FR.Number
-
-description: Number messages for French.
-
-license: MIT-style license
-
-authors:
-  - Arian Stolwijk
-  - sv1l
-
-requires:
-  - /Locale
-  - /Locale.EU.Number
-
-provides: [Locale.fr-FR.Number]
-
-...
-*/
-
-Locale.define('fr-FR', 'Number', {
-
-	group: ' ' // In fr-FR localization, group character is a blank space
-
-}).inherit('EU', 'Number');
-
-
-/*
----
-
-name: Locale.he-IL.Date
-
-description: Date messages for Hebrew.
-
-license: MIT-style license
-
-authors:
-  - Elad Ossadon
-
-requires:
-  - /Locale
-
-provides: [Locale.he-IL.Date]
-
-...
-*/
-
-Locale.define('he-IL', 'Date', {
-
-	months: ['ינואר', 'פברואר', 'מרץ', 'אפריל', 'מאי', 'יוני', 'יולי', 'אוגוסט', 'ספטמבר', 'אוקטובר', 'נובמבר', 'דצמבר'],
-	months_abbr: ['ינואר', 'פברואר', 'מרץ', 'אפריל', 'מאי', 'יוני', 'יולי', 'אוגוסט', 'ספטמבר', 'אוקטובר', 'נובמבר', 'דצמבר'],
-	days: ['ראשון', 'שני', 'שלישי', 'רביעי', 'חמישי', 'שישי', 'שבת'],
-	days_abbr: ['ראשון', 'שני', 'שלישי', 'רביעי', 'חמישי', 'שישי', 'שבת'],
-
-	// Culture's date order: MM/DD/YYYY
-	dateOrder: ['date', 'month', 'year'],
-	shortDate: '%d/%m/%Y',
-	shortTime: '%H:%M',
-	AM: 'AM',
-	PM: 'PM',
-	firstDayOfWeek: 0,
-
-	// Date.Extras
-	ordinal: '',
-
-	lessThanMinuteAgo: 'לפני פחות מדקה',
-	minuteAgo: 'לפני כדקה',
-	minutesAgo: 'לפני {delta} דקות',
-	hourAgo: 'לפני כשעה',
-	hoursAgo: 'לפני {delta} שעות',
-	dayAgo: 'לפני יום',
-	daysAgo: 'לפני {delta} ימים',
-	weekAgo: 'לפני שבוע',
-	weeksAgo: 'לפני {delta} שבועות',
-	monthAgo: 'לפני חודש',
-	monthsAgo: 'לפני {delta} חודשים',
-	yearAgo: 'לפני שנה',
-	yearsAgo: 'לפני {delta} שנים',
-
-	lessThanMinuteUntil: 'בעוד פחות מדקה',
-	minuteUntil: 'בעוד כדקה',
-	minutesUntil: 'בעוד {delta} דקות',
-	hourUntil: 'בעוד כשעה',
-	hoursUntil: 'בעוד {delta} שעות',
-	dayUntil: 'בעוד יום',
-	daysUntil: 'בעוד {delta} ימים',
-	weekUntil: 'בעוד שבוע',
-	weeksUntil: 'בעוד {delta} שבועות',
-	monthUntil: 'בעוד חודש',
-	monthsUntil: 'בעוד {delta} חודשים',
-	yearUntil: 'בעוד שנה',
-	yearsUntil: 'בעוד {delta} שנים'
-
-});
-
-
-/*
----
-
-name: Locale.he-IL.Form.Validator
-
-description: Form Validator messages for Hebrew.
-
-license: MIT-style license
-
-authors:
-  - Elad Ossadon
-
-requires:
-  - /Locale
-
-provides: [Locale.he-IL.Form.Validator]
-
-...
-*/
-
-Locale.define('he-IL', 'FormValidator', {
-
-	required: 'נא למלא שדה זה.',
-	minLength: 'נא להזין לפחות {minLength} תווים (הזנת {length} תווים).',
-	maxLength: 'נא להזין עד {maxLength} תווים (הזנת {length} תווים).',
-	integer: 'נא להזין מספר שלם לשדה זה. מספרים עשרוניים (כמו 1.25) אינם חוקיים.',
-	numeric: 'נא להזין ערך מספרי בלבד בשדה זה (כמו "1", "1.1", "-1" או "-1.1").',
-	digits: 'נא להזין רק ספרות וסימני הפרדה בשדה זה (למשל, מספר טלפון עם מקפים או נקודות הוא חוקי).',
-	alpha: 'נא להזין רק אותיות באנגלית (a-z) בשדה זה. רווחים או תווים אחרים אינם חוקיים.',
-	alphanum: 'נא להזין רק אותריות באנגלית (a-z) או ספרות (0-9) בשדה זה. אווחרים או תווים אחרים אינם חוקיים.',
-	dateSuchAs: 'נא להזין תאריך חוקי, כמו {date}',
-	dateInFormatMDY: 'נא להזין תאריך חוקי בפורמט MM/DD/YYYY (כמו "12/31/1999")',
-	email: 'נא להזין כתובת אימייל חוקית. לדוגמה: "fred@domain.com".',
-	url: 'נא להזין כתובת אתר חוקית, כמו http://www.example.com.',
-	currencyDollar: 'נא להזין סכום דולרי חוקי. לדוגמה $100.00.',
-	oneRequired: 'נא לבחור לפחות בשדה אחד.',
-	errorPrefix: 'שגיאה: ',
-	warningPrefix: 'אזהרה: ',
-
-	// Form.Validator.Extras
-	noSpace: 'אין להזין רווחים בשדה זה.',
-	reqChkByNode: 'נא לבחור אחת מהאפשרויות.',
-	requiredChk: 'שדה זה נדרש.',
-	reqChkByName: 'נא לבחור {label}.',
-	match: 'שדה זה צריך להתאים לשדה {matchName}',
-	startDate: 'תאריך ההתחלה',
-	endDate: 'תאריך הסיום',
-	currendDate: 'התאריך הנוכחי',
-	afterDate: 'התאריך צריך להיות זהה או אחרי {label}.',
-	beforeDate: 'התאריך צריך להיות זהה או לפני {label}.',
-	startMonth: 'נא לבחור חודש התחלה',
-	sameMonth: 'שני תאריכים אלה צריכים להיות באותו חודש - נא לשנות אחד התאריכים.',
-	creditcard: 'מספר כרטיס האשראי שהוזן אינו חוקי. נא לבדוק שנית. הוזנו {length} ספרות.'
-
-});
-
-
-/*
----
-
-name: Locale.he-IL.Number
-
-description: Number messages for Hebrew.
-
-license: MIT-style license
-
-authors:
-  - Elad Ossadon
-
-requires:
-  - /Locale
-
-provides: [Locale.he-IL.Number]
-
-...
-*/
-
-Locale.define('he-IL', 'Number', {
-
-	decimal: '.',
-	group: ',',
-
-	currency: {
-		suffix: ' ₪'
-	}
-
-});
-
-
-/*
----
-
-name: Locale.hu-HU.Date
-
-description: Date messages for Hungarian.
-
-license: MIT-style license
-
-authors:
-  - Zsolt Szegheő
-
-requires:
-  - /Locale
-
-provides: [Locale.hu-HU.Date]
-
-...
-*/
-
-Locale.define('hu-HU', 'Date', {
-
-	months: ['Január', 'Február', 'Március', 'Április', 'Május', 'Június', 'Július', 'Augusztus', 'Szeptember', 'Október', 'November', 'December'],
-	months_abbr: ['jan.', 'febr.', 'márc.', 'ápr.', 'máj.', 'jún.', 'júl.', 'aug.', 'szept.', 'okt.', 'nov.', 'dec.'],
-	days: ['Vasárnap', 'Hétfő', 'Kedd', 'Szerda', 'Csütörtök', 'Péntek', 'Szombat'],
-	days_abbr: ['V', 'H', 'K', 'Sze', 'Cs', 'P', 'Szo'],
-
-	// Culture's date order: YYYY.MM.DD.
-	dateOrder: ['year', 'month', 'date'],
-	shortDate: '%Y.%m.%d.',
-	shortTime: '%I:%M',
-	AM: 'de.',
-	PM: 'du.',
-	firstDayOfWeek: 1,
-
-	// Date.Extras
-	ordinal: '.',
-
-	lessThanMinuteAgo: 'alig egy perce',
-	minuteAgo: 'egy perce',
-	minutesAgo: '{delta} perce',
-	hourAgo: 'egy órája',
-	hoursAgo: '{delta} órája',
-	dayAgo: '1 napja',
-	daysAgo: '{delta} napja',
-	weekAgo: '1 hete',
-	weeksAgo: '{delta} hete',
-	monthAgo: '1 hónapja',
-	monthsAgo: '{delta} hónapja',
-	yearAgo: '1 éve',
-	yearsAgo: '{delta} éve',
-
-	lessThanMinuteUntil: 'alig egy perc múlva',
-	minuteUntil: 'egy perc múlva',
-	minutesUntil: '{delta} perc múlva',
-	hourUntil: 'egy óra múlva',
-	hoursUntil: '{delta} óra múlva',
-	dayUntil: '1 nap múlva',
-	daysUntil: '{delta} nap múlva',
-	weekUntil: '1 hét múlva',
-	weeksUntil: '{delta} hét múlva',
-	monthUntil: '1 hónap múlva',
-	monthsUntil: '{delta} hónap múlva',
-	yearUntil: '1 év múlva',
-	yearsUntil: '{delta} év múlva'
-
-});
-
-
-/*
----
-
-name: Locale.hu-HU.Form.Validator
-
-description: Form Validator messages for Hungarian.
-
-license: MIT-style license
-
-authors:
-  - Zsolt Szegheő
-
-requires:
-  - /Locale
-
-provides: [Locale.hu-HU.Form.Validator]
-
-...
-*/
-
-Locale.define('hu-HU', 'FormValidator', {
-
-	required: 'A mező kitöltése kötelező.',
-	minLength: 'Legalább {minLength} karakter megadása szükséges (megadva {length} karakter).',
-	maxLength: 'Legfeljebb {maxLength} karakter megadása lehetséges (megadva {length} karakter).',
-	integer: 'Egész szám megadása szükséges. A tizedesjegyek (pl. 1.25) nem engedélyezettek.',
-	numeric: 'Szám megadása szükséges (pl. "1" vagy "1.1" vagy "-1" vagy "-1.1").',
-	digits: 'Csak számok és írásjelek megadása lehetséges (pl. telefonszám kötőjelek és/vagy perjelekkel).',
-	alpha: 'Csak betűk (a-z) megadása lehetséges. Szóköz és egyéb karakterek nem engedélyezettek.',
-	alphanum: 'Csak betűk (a-z) vagy számok (0-9) megadása lehetséges. Szóköz és egyéb karakterek nem engedélyezettek.',
-	dateSuchAs: 'Valós dátum megadása szükséges (pl. {date}).',
-	dateInFormatMDY: 'Valós dátum megadása szükséges ÉÉÉÉ.HH.NN. formában. (pl. "1999.12.31.")',
-	email: 'Valós e-mail cím megadása szükséges (pl. "fred@domain.hu").',
-	url: 'Valós URL megadása szükséges (pl. http://www.example.com).',
-	currencyDollar: 'Valós pénzösszeg megadása szükséges (pl. 100.00 Ft.).',
-	oneRequired: 'Az alábbi mezők legalább egyikének kitöltése kötelező.',
-	errorPrefix: 'Hiba: ',
-	warningPrefix: 'Figyelem: ',
-
-	// Form.Validator.Extras
-	noSpace: 'A mező nem tartalmazhat szóközöket.',
-	reqChkByNode: 'Nincs egyetlen kijelölt elem sem.',
-	requiredChk: 'A mező kitöltése kötelező.',
-	reqChkByName: 'Egy {label} kiválasztása szükséges.',
-	match: 'A mezőnek egyeznie kell a(z) {matchName} mezővel.',
-	startDate: 'a kezdet dátuma',
-	endDate: 'a vég dátuma',
-	currendDate: 'jelenlegi dátum',
-	afterDate: 'A dátum nem lehet kisebb, mint {label}.',
-	beforeDate: 'A dátum nem lehet nagyobb, mint {label}.',
-	startMonth: 'Kezdeti hónap megadása szükséges.',
-	sameMonth: 'A két dátumnak ugyanazon hónapban kell lennie.',
-	creditcard: 'A megadott bankkártyaszám nem valódi (megadva {length} számjegy).'
-
-});
-
-
-/*
----
-
-name: Locale.it-IT.Date
-
-description: Date messages for Italian.
-
-license: MIT-style license.
-
-authors:
-  - Andrea Novero
-  - Valerio Proietti
-
-requires:
-  - /Locale
-
-provides: [Locale.it-IT.Date]
-
-...
-*/
-
-Locale.define('it-IT', 'Date', {
-
-	months: ['Gennaio', 'Febbraio', 'Marzo', 'Aprile', 'Maggio', 'Giugno', 'Luglio', 'Agosto', 'Settembre', 'Ottobre', 'Novembre', 'Dicembre'],
-	months_abbr: ['gen', 'feb', 'mar', 'apr', 'mag', 'giu', 'lug', 'ago', 'set', 'ott', 'nov', 'dic'],
-	days: ['Domenica', 'Lunedì', 'Martedì', 'Mercoledì', 'Giovedì', 'Venerdì', 'Sabato'],
-	days_abbr: ['dom', 'lun', 'mar', 'mer', 'gio', 'ven', 'sab'],
-
-	// Culture's date order: DD/MM/YYYY
-	dateOrder: ['date', 'month', 'year'],
-	shortDate: '%d/%m/%Y',
-	shortTime: '%H.%M',
-	AM: 'AM',
-	PM: 'PM',
-	firstDayOfWeek: 1,
-
-	// Date.Extras
-	ordinal: 'º',
-
-	lessThanMinuteAgo: 'meno di un minuto fa',
-	minuteAgo: 'circa un minuto fa',
-	minutesAgo: 'circa {delta} minuti fa',
-	hourAgo: "circa un'ora fa",
-	hoursAgo: 'circa {delta} ore fa',
-	dayAgo: 'circa 1 giorno fa',
-	daysAgo: 'circa {delta} giorni fa',
-
-	lessThanMinuteUntil: 'tra meno di un minuto',
-	minuteUntil: 'tra circa un minuto',
-	minutesUntil: 'tra circa {delta} minuti',
-	hourUntil: "tra circa un'ora",
-	hoursUntil: 'tra circa {delta} ore',
-	dayUntil: 'tra circa un giorno',
-	daysUntil: 'tra circa {delta} giorni'
-
-});
-
-
-/*
----
-
-name: Locale.it-IT.Form.Validator
-
-description: Form Validator messages for Italian.
-
-license: MIT-style license
-
-authors:
-  - Leonardo Laureti
-  - Andrea Novero
-
-requires:
-  - /Locale
-
-provides: [Locale.it-IT.Form.Validator]
-
-...
-*/
-
-Locale.define('it-IT', 'FormValidator', {
-
-	required: 'Il campo &egrave; obbligatorio.',
-	minLength: 'Inserire almeno {minLength} caratteri (ne sono stati inseriti {length}).',
-	maxLength: 'Inserire al massimo {maxLength} caratteri (ne sono stati inseriti {length}).',
-	integer: 'Inserire un numero intero. Non sono consentiti decimali (es.: 1.25).',
-	numeric: 'Inserire solo valori numerici (es.: "1" oppure "1.1" oppure "-1" oppure "-1.1").',
-	digits: 'Inserire solo numeri e caratteri di punteggiatura. Per esempio &egrave; consentito un numero telefonico con trattini o punti.',
-	alpha: 'Inserire solo lettere (a-z). Non sono consentiti spazi o altri caratteri.',
-	alphanum: 'Inserire solo lettere (a-z) o numeri (0-9). Non sono consentiti spazi o altri caratteri.',
-	dateSuchAs: 'Inserire una data valida del tipo {date}',
-	dateInFormatMDY: 'Inserire una data valida nel formato MM/GG/AAAA (es.: "12/31/1999")',
-	email: 'Inserire un indirizzo email valido. Per esempio "nome@dominio.com".',
-	url: 'Inserire un indirizzo valido. Per esempio "http://www.example.com".',
-	currencyDollar: 'Inserire un importo valido. Per esempio "$100.00".',
-	oneRequired: 'Completare almeno uno dei campi richiesti.',
-	errorPrefix: 'Errore: ',
-	warningPrefix: 'Attenzione: ',
-
-	// Form.Validator.Extras
-	noSpace: 'Non sono consentiti spazi.',
-	reqChkByNode: 'Nessuna voce selezionata.',
-	requiredChk: 'Il campo &egrave; obbligatorio.',
-	reqChkByName: 'Selezionare un(a) {label}.',
-	match: 'Il valore deve corrispondere al campo {matchName}',
-	startDate: "data d'inizio",
-	endDate: 'data di fine',
-	currendDate: 'data attuale',
-	afterDate: 'La data deve corrispondere o essere successiva al {label}.',
-	beforeDate: 'La data deve corrispondere o essere precedente al {label}.',
-	startMonth: "Selezionare un mese d'inizio",
-	sameMonth: 'Le due date devono essere dello stesso mese - occorre modificarne una.'
-
-});
-
-
-/*
----
-
-name: Locale.ja-JP.Date
-
-description: Date messages for Japanese.
-
-license: MIT-style license
-
-authors:
-  - Noritaka Horio
-
-requires:
-  - /Locale
-
-provides: [Locale.ja-JP.Date]
-
-...
-*/
-
-Locale.define('ja-JP', 'Date', {
-
-	months: ['1月', '2月', '3月', '4月', '5月', '6月', '7月', '8月', '9月', '10月', '11月', '12月'],
-	months_abbr: ['1月', '2月', '3月', '4月', '5月', '6月', '7月', '8月', '9月', '10月', '11月', '12月'],
-	days: ['日曜日', '月曜日', '火曜日', '水曜日', '木曜日', '金曜日', '土曜日'],
-	days_abbr: ['日', '月', '火', '水', '木', '金', '土'],
-
-	// Culture's date order: YYYY/MM/DD
-	dateOrder: ['year', 'month', 'date'],
-	shortDate: '%Y/%m/%d',
-	shortTime: '%H:%M',
-	AM: '午前',
-	PM: '午後',
-	firstDayOfWeek: 0,
-
-	// Date.Extras
-	ordinal: '',
-
-	lessThanMinuteAgo: '1分以内前',
-	minuteAgo: '約1分前',
-	minutesAgo: '約{delta}分前',
-	hourAgo: '約1時間前',
-	hoursAgo: '約{delta}時間前',
-	dayAgo: '1日前',
-	daysAgo: '{delta}日前',
-	weekAgo: '1週間前',
-	weeksAgo: '{delta}週間前',
-	monthAgo: '1ヶ月前',
-	monthsAgo: '{delta}ヶ月前',
-	yearAgo: '1年前',
-	yearsAgo: '{delta}年前',
-
-	lessThanMinuteUntil: '今から約1分以内',
-	minuteUntil: '今から約1分',
-	minutesUntil: '今から約{delta}分',
-	hourUntil: '今から約1時間',
-	hoursUntil: '今から約{delta}時間',
-	dayUntil: '今から1日間',
-	daysUntil: '今から{delta}日間',
-	weekUntil: '今から1週間',
-	weeksUntil: '今から{delta}週間',
-	monthUntil: '今から1ヶ月',
-	monthsUntil: '今から{delta}ヶ月',
-	yearUntil: '今から1年',
-	yearsUntil: '今から{delta}年'
-
-});
-
-
-/*
----
-
-name: Locale.ja-JP.Form.Validator
-
-description: Form Validator messages for Japanese.
-
-license: MIT-style license
-
-authors:
-  - Noritaka Horio
-
-requires:
-  - /Locale
-
-provides: [Locale.ja-JP.Form.Validator]
-
-...
-*/
-
-Locale.define("ja-JP", "FormValidator", {
-
-	required: '入力は必須です。',
-	minLength: '入力文字数は{minLength}以上にしてください。({length}文字)',
-	maxLength: '入力文字数は{maxLength}以下にしてください。({length}文字)',
-	integer: '整数を入力してください。',
-	numeric: '入力できるのは数値だけです。(例: "1", "1.1", "-1", "-1.1"....)',
-	digits: '入力できるのは数値と句読記号です。 (例: -や+を含む電話番号など).',
-	alpha: '入力できるのは半角英字だけです。それ以外の文字は入力できません。',
-	alphanum: '入力できるのは半角英数字だけです。それ以外の文字は入力できません。',
-	dateSuchAs: '有効な日付を入力してください。{date}',
-	dateInFormatMDY: '日付の書式に誤りがあります。YYYY/MM/DD (i.e. "1999/12/31")',
-	email: 'メールアドレスに誤りがあります。',
-	url: 'URLアドレスに誤りがあります。',
-	currencyDollar: '金額に誤りがあります。',
-	oneRequired: 'ひとつ以上入力してください。',
-	errorPrefix: 'エラー: ',
-	warningPrefix: '警告: ',
-
-	// FormValidator.Extras
-	noSpace: 'スペースは入力できません。',
-	reqChkByNode: '選択されていません。',
-	requiredChk: 'この項目は必須です。',
-	reqChkByName: '{label}を選択してください。',
-	match: '{matchName}が入力されている場合必須です。',
-	startDate: '開始日',
-	endDate: '終了日',
-	currendDate: '今日',
-	afterDate: '{label}以降の日付にしてください。',
-	beforeDate: '{label}以前の日付にしてください。',
-	startMonth: '開始月を選択してください。',
-	sameMonth: '日付が同一です。どちらかを変更してください。'
-
-});
-
-
-/*
----
-
-name: Locale.ja-JP.Number
-
-description: Number messages for Japanese.
-
-license: MIT-style license
-
-authors:
-  - Noritaka Horio
-
-requires:
-  - /Locale
-
-provides: [Locale.ja-JP.Number]
-
-...
-*/
-
-Locale.define('ja-JP', 'Number', {
-
-	decimal: '.',
-	group: ',',
-
-	currency: {
-		decimals: 0,
-		prefix: '\\'
-	}
-
-});
-
-
-/*
----
-
-name: Locale.nl-NL.Date
-
-description: Date messages for Dutch.
-
-license: MIT-style license
-
-authors:
-  - Lennart Pilon
-  - Tim Wienk
-
-requires:
-  - /Locale
-
-provides: [Locale.nl-NL.Date]
-
-...
-*/
-
-Locale.define('nl-NL', 'Date', {
-
-	months: ['januari', 'februari', 'maart', 'april', 'mei', 'juni', 'juli', 'augustus', 'september', 'oktober', 'november', 'december'],
-	months_abbr: ['jan', 'feb', 'mrt', 'apr', 'mei', 'jun', 'jul', 'aug', 'sep', 'okt', 'nov', 'dec'],
-	days: ['zondag', 'maandag', 'dinsdag', 'woensdag', 'donderdag', 'vrijdag', 'zaterdag'],
-	days_abbr: ['zo', 'ma', 'di', 'wo', 'do', 'vr', 'za'],
-
-	// Culture's date order: DD-MM-YYYY
-	dateOrder: ['date', 'month', 'year'],
-	shortDate: '%d-%m-%Y',
-	shortTime: '%H:%M',
-	AM: 'AM',
-	PM: 'PM',
-	firstDayOfWeek: 1,
-
-	// Date.Extras
-	ordinal: 'e',
-
-	lessThanMinuteAgo: 'minder dan een minuut geleden',
-	minuteAgo: 'ongeveer een minuut geleden',
-	minutesAgo: '{delta} minuten geleden',
-	hourAgo: 'ongeveer een uur geleden',
-	hoursAgo: 'ongeveer {delta} uur geleden',
-	dayAgo: 'een dag geleden',
-	daysAgo: '{delta} dagen geleden',
-	weekAgo: 'een week geleden',
-	weeksAgo: '{delta} weken geleden',
-	monthAgo: 'een maand geleden',
-	monthsAgo: '{delta} maanden geleden',
-	yearAgo: 'een jaar geleden',
-	yearsAgo: '{delta} jaar geleden',
-
-	lessThanMinuteUntil: 'over minder dan een minuut',
-	minuteUntil: 'over ongeveer een minuut',
-	minutesUntil: 'over {delta} minuten',
-	hourUntil: 'over ongeveer een uur',
-	hoursUntil: 'over {delta} uur',
-	dayUntil: 'over ongeveer een dag',
-	daysUntil: 'over {delta} dagen',
-	weekUntil: 'over een week',
-	weeksUntil: 'over {delta} weken',
-	monthUntil: 'over een maand',
-	monthsUntil: 'over {delta} maanden',
-	yearUntil: 'over een jaar',
-	yearsUntil: 'over {delta} jaar'
-
-});
-
-
-/*
----
-
-name: Locale.nl-NL.Form.Validator
-
-description: Form Validator messages for Dutch.
-
-license: MIT-style license
-
-authors:
-  - Lennart Pilon
-  - Arian Stolwijk
-  - Tim Wienk
-
-requires:
-  - /Locale
-
-provides: [Locale.nl-NL.Form.Validator]
-
-...
-*/
-
-Locale.define('nl-NL', 'FormValidator', {
-
-	required: 'Dit veld is verplicht.',
-	minLength: 'Vul minimaal {minLength} karakters in (je hebt {length} karakters ingevoerd).',
-	maxLength: 'Vul niet meer dan {maxLength} karakters in (je hebt {length} karakters ingevoerd).',
-	integer: 'Vul een getal in. Getallen met decimalen (bijvoorbeeld 1.25) zijn niet toegestaan.',
-	numeric: 'Vul alleen numerieke waarden in (bijvoorbeeld "1" of "1.1" of "-1" of "-1.1").',
-	digits: 'Vul alleen nummers en leestekens in (bijvoorbeeld een telefoonnummer met streepjes is toegestaan).',
-	alpha: 'Vul alleen letters in (a-z). Spaties en andere karakters zijn niet toegestaan.',
-	alphanum: 'Vul alleen letters (a-z) of nummers (0-9) in. Spaties en andere karakters zijn niet toegestaan.',
-	dateSuchAs: 'Vul een geldige datum in, zoals {date}',
-	dateInFormatMDY: 'Vul een geldige datum, in het formaat MM/DD/YYYY (bijvoorbeeld "12/31/1999")',
-	email: 'Vul een geldig e-mailadres in. Bijvoorbeeld "fred@domein.nl".',
-	url: 'Vul een geldige URL in, zoals http://www.example.com.',
-	currencyDollar: 'Vul een geldig $ bedrag in. Bijvoorbeeld $100.00 .',
-	oneRequired: 'Vul iets in bij in ieder geval een van deze velden.',
-	warningPrefix: 'Waarschuwing: ',
-	errorPrefix: 'Fout: ',
-
-	// Form.Validator.Extras
-	noSpace: 'Spaties zijn niet toegestaan in dit veld.',
-	reqChkByNode: 'Er zijn geen items geselecteerd.',
-	requiredChk: 'Dit veld is verplicht.',
-	reqChkByName: 'Selecteer een {label}.',
-	match: 'Dit veld moet overeen komen met het {matchName} veld',
-	startDate: 'de begin datum',
-	endDate: 'de eind datum',
-	currendDate: 'de huidige datum',
-	afterDate: 'De datum moet hetzelfde of na {label} zijn.',
-	beforeDate: 'De datum moet hetzelfde of voor {label} zijn.',
-	startMonth: 'Selecteer een begin maand',
-	sameMonth: 'Deze twee data moeten in dezelfde maand zijn - u moet een van beide aanpassen.',
-	creditcard: 'Het ingevulde creditcardnummer is niet geldig. Controleer het nummer en probeer opnieuw. {length} getallen ingevuld.'
-
-});
-
-
-/*
----
-
-name: Locale.nl-NL.Number
-
-description: Number messages for Dutch.
-
-license: MIT-style license
-
-authors:
-  - Arian Stolwijk
-
-requires:
-  - /Locale
-  - /Locale.EU.Number
-
-provides: [Locale.nl-NL.Number]
-
-...
-*/
-
-Locale.define('nl-NL').inherit('EU', 'Number');
-
-
-
-
-
-/*
----
-
-name: Locale.no-NO.Date
-
-description: Date messages for Norwegian.
-
-license: MIT-style license
-
-authors:
-  - Espen 'Rexxars' Hovlandsdal
-
-requires:
-  - /Locale
-
-provides: [Locale.no-NO.Date]
-
-...
-*/
-
-Locale.define('no-NO', 'Date', {
-
-	// Culture's date order: DD.MM.YYYY
-	dateOrder: ['date', 'month', 'year'],
-	shortDate: '%d.%m.%Y',
-	shortTime: '%H:%M',
-	AM: 'AM',
-	PM: 'PM',
-	firstDayOfWeek: 1,
-
-	lessThanMinuteAgo: 'kortere enn et minutt siden',
-	minuteAgo: 'omtrent et minutt siden',
-	minutesAgo: '{delta} minutter siden',
-	hourAgo: 'omtrent en time siden',
-	hoursAgo: 'omtrent {delta} timer siden',
-	dayAgo: '{delta} dag siden',
-	daysAgo: '{delta} dager siden'
-
-});
-
-
-/*
----
-
-name: Locale.no-NO.Form.Validator
-
-description: Form Validator messages for Norwegian.
-
-license: MIT-style license
-
-authors:
-  - Espen 'Rexxars' Hovlandsdal
-
-requires:
-  - /Locale
-
-provides: [Locale.no-NO.Form.Validator]
-
-...
-*/
-
-Locale.define('no-NO', 'FormValidator', {
-
-	required: 'Dette feltet er påkrevd.',
-	minLength: 'Vennligst skriv inn minst {minLength} tegn (du skrev {length} tegn).',
-	maxLength: 'Vennligst skriv inn maksimalt {maxLength} tegn (du skrev {length} tegn).',
-	integer: 'Vennligst skriv inn et tall i dette feltet. Tall med desimaler (for eksempel 1,25) er ikke tillat.',
-	numeric: 'Vennligst skriv inn kun numeriske verdier i dette feltet (for eksempel "1", "1.1", "-1" eller "-1.1").',
-	digits: 'Vennligst bruk kun nummer og skilletegn i dette feltet.',
-	alpha: 'Vennligst bruk kun bokstaver (a-z) i dette feltet. Ingen mellomrom eller andre tegn er tillat.',
-	alphanum: 'Vennligst bruk kun bokstaver (a-z) eller nummer (0-9) i dette feltet. Ingen mellomrom eller andre tegn er tillat.',
-	dateSuchAs: 'Vennligst skriv inn en gyldig dato, som {date}',
-	dateInFormatMDY: 'Vennligst skriv inn en gyldig dato, i formatet MM/DD/YYYY (for eksempel "12/31/1999")',
-	email: 'Vennligst skriv inn en gyldig epost-adresse. For eksempel "espen@domene.no".',
-	url: 'Vennligst skriv inn en gyldig URL, for eksempel http://www.example.com.',
-	currencyDollar: 'Vennligst fyll ut et gyldig $ beløp. For eksempel $100.00 .',
-	oneRequired: 'Vennligst fyll ut noe i minst ett av disse feltene.',
-	errorPrefix: 'Feil: ',
-	warningPrefix: 'Advarsel: '
-
-});
-
-
-/*
----
-
-name: Locale.pl-PL.Date
-
-description: Date messages for Polish.
-
-license: MIT-style license
-
-authors:
-  - Oskar Krawczyk
-
-requires:
-  - /Locale
-
-provides: [Locale.pl-PL.Date]
-
-...
-*/
-
-Locale.define('pl-PL', 'Date', {
-
-	months: ['Styczeń', 'Luty', 'Marzec', 'Kwiecień', 'Maj', 'Czerwiec', 'Lipiec', 'Sierpień', 'Wrzesień', 'Październik', 'Listopad', 'Grudzień'],
-	months_abbr: ['sty', 'lut', 'mar', 'kwi', 'maj', 'cze', 'lip', 'sie', 'wrz', 'paź', 'lis', 'gru'],
-	days: ['Niedziela', 'Poniedziałek', 'Wtorek', 'Środa', 'Czwartek', 'Piątek', 'Sobota'],
-	days_abbr: ['niedz.', 'pon.', 'wt.', 'śr.', 'czw.', 'pt.', 'sob.'],
-
-	// Culture's date order: YYYY-MM-DD
-	dateOrder: ['year', 'month', 'date'],
-	shortDate: '%Y-%m-%d',
-	shortTime: '%H:%M',
-	AM: 'nad ranem',
-	PM: 'po południu',
-	firstDayOfWeek: 1,
-
-	// Date.Extras
-	ordinal: function(dayOfMonth){
-		return (dayOfMonth > 3 && dayOfMonth < 21) ? 'ty' : ['ty', 'szy', 'gi', 'ci', 'ty'][Math.min(dayOfMonth % 10, 4)];
-	},
-
-	lessThanMinuteAgo: 'mniej niż minute temu',
-	minuteAgo: 'około minutę temu',
-	minutesAgo: '{delta} minut temu',
-	hourAgo: 'około godzinę temu',
-	hoursAgo: 'około {delta} godzin temu',
-	dayAgo: 'Wczoraj',
-	daysAgo: '{delta} dni temu',
-
-	lessThanMinuteUntil: 'za niecałą minutę',
-	minuteUntil: 'za około minutę',
-	minutesUntil: 'za {delta} minut',
-	hourUntil: 'za około godzinę',
-	hoursUntil: 'za około {delta} godzin',
-	dayUntil: 'za 1 dzień',
-	daysUntil: 'za {delta} dni'
-
-});
-
-
-/*
----
-
-name: Locale.pl-PL.Form.Validator
-
-description: Form Validator messages for Polish.
-
-license: MIT-style license
-
-authors:
-  - Oskar Krawczyk
-
-requires:
-  - /Locale
-
-provides: [Locale.pl-PL.Form.Validator]
-
-...
-*/
-
-Locale.define('pl-PL', 'FormValidator', {
-
-	required: 'To pole jest wymagane.',
-	minLength: 'Wymagane jest przynajmniej {minLength} znaków (wpisanych zostało tylko {length}).',
-	maxLength: 'Dozwolone jest nie więcej niż {maxLength} znaków (wpisanych zostało {length})',
-	integer: 'To pole wymaga liczb całych. Liczby dziesiętne (np. 1.25) są niedozwolone.',
-	numeric: 'Prosimy używać tylko numerycznych wartości w tym polu (np. "1", "1.1", "-1" lub "-1.1").',
-	digits: 'Prosimy używać liczb oraz zankow punktuacyjnych w typ polu (dla przykładu, przy numerze telefonu myślniki i kropki są dozwolone).',
-	alpha: 'Prosimy używać tylko liter (a-z) w tym polu. Spacje oraz inne znaki są niedozwolone.',
-	alphanum: 'Prosimy używać tylko liter (a-z) lub liczb (0-9) w tym polu. Spacje oraz inne znaki są niedozwolone.',
-	dateSuchAs: 'Prosimy podać prawidłową datę w formacie: {date}',
-	dateInFormatMDY: 'Prosimy podać poprawną date w formacie DD.MM.RRRR (i.e. "12.01.2009")',
-	email: 'Prosimy podać prawidłowy adres e-mail, np. "jan@domena.pl".',
-	url: 'Prosimy podać prawidłowy adres URL, np. http://www.example.com.',
-	currencyDollar: 'Prosimy podać prawidłową sumę w PLN. Dla przykładu: 100.00 PLN.',
-	oneRequired: 'Prosimy wypełnić chociaż jedno z pól.',
-	errorPrefix: 'Błąd: ',
-	warningPrefix: 'Uwaga: ',
-
-	// Form.Validator.Extras
-	noSpace: 'W tym polu nie mogą znajdować się spacje.',
-	reqChkByNode: 'Brak zaznaczonych elementów.',
-	requiredChk: 'To pole jest wymagane.',
-	reqChkByName: 'Prosimy wybrać z {label}.',
-	match: 'To pole musi być takie samo jak {matchName}',
-	startDate: 'data początkowa',
-	endDate: 'data końcowa',
-	currendDate: 'aktualna data',
-	afterDate: 'Podana data poinna być taka sama lub po {label}.',
-	beforeDate: 'Podana data poinna być taka sama lub przed {label}.',
-	startMonth: 'Prosimy wybrać początkowy miesiąc.',
-	sameMonth: 'Te dwie daty muszą być w zakresie tego samego miesiąca - wymagana jest zmiana któregoś z pól.'
-
-});
-
-
-/*
----
-
-name: Locale.pt-PT.Date
-
-description: Date messages for Portuguese.
-
-license: MIT-style license
-
-authors:
-  - Fabio Miranda Costa
-
-requires:
-  - /Locale
-
-provides: [Locale.pt-PT.Date]
-
-...
-*/
-
-Locale.define('pt-PT', 'Date', {
-
-	months: ['Janeiro', 'Fevereiro', 'Março', 'Abril', 'Maio', 'Junho', 'Julho', 'Agosto', 'Setembro', 'Outubro', 'Novembro', 'Dezembro'],
-	months_abbr: ['Jan', 'Fev', 'Mar', 'Abr', 'Mai', 'Jun', 'Jul', 'Ago', 'Set', 'Out', 'Nov', 'Dez'],
-	days: ['Domingo', 'Segunda-feira', 'Terça-feira', 'Quarta-feira', 'Quinta-feira', 'Sexta-feira', 'Sábado'],
-	days_abbr: ['Dom', 'Seg', 'Ter', 'Qua', 'Qui', 'Sex', 'Sáb'],
-
-	// Culture's date order: DD-MM-YYYY
-	dateOrder: ['date', 'month', 'year'],
-	shortDate: '%d-%m-%Y',
-	shortTime: '%H:%M',
-	AM: 'AM',
-	PM: 'PM',
-	firstDayOfWeek: 1,
-
-	// Date.Extras
-	ordinal: 'º',
-
-	lessThanMinuteAgo: 'há menos de um minuto',
-	minuteAgo: 'há cerca de um minuto',
-	minutesAgo: 'há {delta} minutos',
-	hourAgo: 'há cerca de uma hora',
-	hoursAgo: 'há cerca de {delta} horas',
-	dayAgo: 'há um dia',
-	daysAgo: 'há {delta} dias',
-	weekAgo: 'há uma semana',
-	weeksAgo: 'há {delta} semanas',
-	monthAgo: 'há um mês',
-	monthsAgo: 'há {delta} meses',
-	yearAgo: 'há um ano',
-	yearsAgo: 'há {delta} anos',
-
-	lessThanMinuteUntil: 'em menos de um minuto',
-	minuteUntil: 'em um minuto',
-	minutesUntil: 'em {delta} minutos',
-	hourUntil: 'em uma hora',
-	hoursUntil: 'em {delta} horas',
-	dayUntil: 'em um dia',
-	daysUntil: 'em {delta} dias',
-	weekUntil: 'em uma semana',
-	weeksUntil: 'em {delta} semanas',
-	monthUntil: 'em um mês',
-	monthsUntil: 'em {delta} meses',
-	yearUntil: 'em um ano',
-	yearsUntil: 'em {delta} anos'
-
-});
-
-
-/*
----
-
-name: Locale.pt-BR.Date
-
-description: Date messages for Portuguese (Brazil).
-
-license: MIT-style license
-
-authors:
-  - Fabio Miranda Costa
-
-requires:
-  - /Locale
-  - /Locale.pt-PT.Date
-
-provides: [Locale.pt-BR.Date]
-
-...
-*/
-
-Locale.define('pt-BR', 'Date', {
-
-	// Culture's date order: DD/MM/YYYY
-	shortDate: '%d/%m/%Y'
-
-}).inherit('pt-PT', 'Date');
-
-
-/*
----
-
-name: Locale.pt-BR.Form.Validator
-
-description: Form Validator messages for Portuguese (Brazil).
-
-license: MIT-style license
-
-authors:
-  - Fábio Miranda Costa
-
-requires:
-  - /Locale
-
-provides: [Locale.pt-BR.Form.Validator]
-
-...
-*/
-
-Locale.define('pt-BR', 'FormValidator', {
-
-	required: 'Este campo é obrigatório.',
-	minLength: 'Digite pelo menos {minLength} caracteres (tamanho atual: {length}).',
-	maxLength: 'Não digite mais de {maxLength} caracteres (tamanho atual: {length}).',
-	integer: 'Por favor digite apenas um número inteiro neste campo. Não são permitidos números decimais (por exemplo, 1,25).',
-	numeric: 'Por favor digite apenas valores numéricos neste campo (por exemplo, "1" ou "1.1" ou "-1" ou "-1,1").',
-	digits: 'Por favor use apenas números e pontuação neste campo (por exemplo, um número de telefone com traços ou pontos é permitido).',
-	alpha: 'Por favor use somente letras (a-z). Espaço e outros caracteres não são permitidos.',
-	alphanum: 'Use somente letras (a-z) ou números (0-9) neste campo. Espaço e outros caracteres não são permitidos.',
-	dateSuchAs: 'Digite uma data válida, como {date}',
-	dateInFormatMDY: 'Digite uma data válida, como DD/MM/YYYY (por exemplo, "31/12/1999")',
-	email: 'Digite um endereço de email válido. Por exemplo "nome@dominio.com".',
-	url: 'Digite uma URL válida. Exemplo: http://www.example.com.',
-	currencyDollar: 'Digite um valor em dinheiro válido. Exemplo: R$100,00 .',
-	oneRequired: 'Digite algo para pelo menos um desses campos.',
-	errorPrefix: 'Erro: ',
-	warningPrefix: 'Aviso: ',
-
-	// Form.Validator.Extras
-	noSpace: 'Não é possível digitar espaços neste campo.',
-	reqChkByNode: 'Não foi selecionado nenhum item.',
-	requiredChk: 'Este campo é obrigatório.',
-	reqChkByName: 'Por favor digite um {label}.',
-	match: 'Este campo deve ser igual ao campo {matchName}.',
-	startDate: 'a data inicial',
-	endDate: 'a data final',
-	currendDate: 'a data atual',
-	afterDate: 'A data deve ser igual ou posterior a {label}.',
-	beforeDate: 'A data deve ser igual ou anterior a {label}.',
-	startMonth: 'Por favor selecione uma data inicial.',
-	sameMonth: 'Estas duas datas devem ter o mesmo mês - você deve modificar uma das duas.',
-	creditcard: 'O número do cartão de crédito informado é inválido. Por favor verifique o valor e tente novamente. {length} números informados.'
-
-});
-
-
-/*
----
-
-name: Locale.pt-PT.Form.Validator
-
-description: Form Validator messages for Portuguese.
-
-license: MIT-style license
-
-authors:
-  - Miquel Hudin
-
-requires:
-  - /Locale
-
-provides: [Locale.pt-PT.Form.Validator]
-
-...
-*/
-
-Locale.define('pt-PT', 'FormValidator', {
-
-	required: 'Este campo é necessário.',
-	minLength: 'Digite pelo menos{minLength} caracteres (comprimento {length} caracteres).',
-	maxLength: 'Não insira mais de {maxLength} caracteres (comprimento {length} caracteres).',
-	integer: 'Digite um número inteiro neste domínio. Com números decimais (por exemplo, 1,25), não são permitidas.',
-	numeric: 'Digite apenas valores numéricos neste domínio (p.ex., "1" ou "1.1" ou "-1" ou "-1,1").',
-	digits: 'Por favor, use números e pontuação apenas neste campo (p.ex., um número de telefone com traços ou pontos é permitida).',
-	alpha: 'Por favor use somente letras (a-z), com nesta área. Não utilize espaços nem outros caracteres são permitidos.',
-	alphanum: 'Use somente letras (a-z) ou números (0-9) neste campo. Não utilize espaços nem outros caracteres são permitidos.',
-	dateSuchAs: 'Digite uma data válida, como {date}',
-	dateInFormatMDY: 'Digite uma data válida, como DD/MM/YYYY (p.ex. "31/12/1999")',
-	email: 'Digite um endereço de email válido. Por exemplo "fred@domain.com".',
-	url: 'Digite uma URL válida, como http://www.example.com.',
-	currencyDollar: 'Digite um valor válido $. Por exemplo $ 100,00. ',
-	oneRequired: 'Digite algo para pelo menos um desses insumos.',
-	errorPrefix: 'Erro: ',
-	warningPrefix: 'Aviso: '
-
-});
-
-
-/*
----
-
-name: Locale.ru-RU-unicode.Date
-
-description: Date messages for Russian (utf-8).
-
-license: MIT-style license
-
-authors:
-  - Evstigneev Pavel
-  - Kuryanovich Egor
-
-requires:
-  - /Locale
-
-provides: [Locale.ru-RU.Date]
-
-...
-*/
-
-(function(){
-
-// Russian language pluralization rules, taken from CLDR project, http://unicode.org/cldr/
-// one -> n mod 10 is 1 and n mod 100 is not 11;
-// few -> n mod 10 in 2..4 and n mod 100 not in 12..14;
-// many -> n mod 10 is 0 or n mod 10 in 5..9 or n mod 100 in 11..14;
-// other -> everything else (example 3.14)
-var pluralize = function (n, one, few, many, other){
-	var modulo10 = n % 10,
-		modulo100 = n % 100;
-
-	if (modulo10 == 1 && modulo100 != 11){
-		return one;
-	} else if ((modulo10 == 2 || modulo10 == 3 || modulo10 == 4) && !(modulo100 == 12 || modulo100 == 13 || modulo100 == 14)){
-		return few;
-	} else if (modulo10 == 0 || (modulo10 == 5 || modulo10 == 6 || modulo10 == 7 || modulo10 == 8 || modulo10 == 9) || (modulo100 == 11 || modulo100 == 12 || modulo100 == 13 || modulo100 == 14)){
-		return many;
-	} else {
-		return other;
-	}
-};
-
-Locale.define('ru-RU', 'Date', {
-
-	months: ['Январь', 'Февраль', 'Март', 'Апрель', 'Май', 'Июнь', 'Июль', 'Август', 'Сентябрь', 'Октябрь', 'Ноябрь', 'Декабрь'],
-	months_abbr: ['янв', 'февр', 'март', 'апр', 'май','июнь','июль','авг','сент','окт','нояб','дек'],
-	days: ['Воскресенье', 'Понедельник', 'Вторник', 'Среда', 'Четверг', 'Пятница', 'Суббота'],
-	days_abbr: ['Вс', 'Пн', 'Вт', 'Ср', 'Чт', 'Пт', 'Сб'],
-
-	// Culture's date order: DD.MM.YYYY
-	dateOrder: ['date', 'month', 'year'],
-	shortDate: '%d.%m.%Y',
-	shortTime: '%H:%M',
-	AM: 'AM',
-	PM: 'PM',
-	firstDayOfWeek: 1,
-
-	// Date.Extras
-	ordinal: '',
-
-	lessThanMinuteAgo: 'меньше минуты назад',
-	minuteAgo: 'минуту назад',
-	minutesAgo: function(delta){ return '{delta} ' + pluralize(delta, 'минуту', 'минуты', 'минут') + ' назад'; },
-	hourAgo: 'час назад',
-	hoursAgo: function(delta){ return '{delta} ' + pluralize(delta, 'час', 'часа', 'часов') + ' назад'; },
-	dayAgo: 'вчера',
-	daysAgo: function(delta){ return '{delta} ' + pluralize(delta, 'день', 'дня', 'дней') + ' назад'; },
-	weekAgo: 'неделю назад',
-	weeksAgo: function(delta){ return '{delta} ' + pluralize(delta, 'неделя', 'недели', 'недель') + ' назад'; },
-	monthAgo: 'месяц назад',
-	monthsAgo: function(delta){ return '{delta} ' + pluralize(delta, 'месяц', 'месяца', 'месецев') + ' назад'; },
-	yearAgo: 'год назад',
-	yearsAgo: function(delta){ return '{delta} ' + pluralize(delta, 'год', 'года', 'лет') + ' назад'; },
-
-	lessThanMinuteUntil: 'меньше чем через минуту',
-	minuteUntil: 'через минуту',
-	minutesUntil: function(delta){ return 'через {delta} ' + pluralize(delta, 'час', 'часа', 'часов') + ''; },
-	hourUntil: 'через час',
-	hoursUntil: function(delta){ return 'через {delta} ' + pluralize(delta, 'час', 'часа', 'часов') + ''; },
-	dayUntil: 'завтра',
-	daysUntil: function(delta){ return 'через {delta} ' + pluralize(delta, 'день', 'дня', 'дней') + ''; },
-	weekUntil: 'через неделю',
-	weeksUntil: function(delta){ return 'через {delta} ' + pluralize(delta, 'неделю', 'недели', 'недель') + ''; },
-	monthUntil: 'через месяц',
-	monthsUntil: function(delta){ return 'через {delta} ' + pluralize(delta, 'месяц', 'месяца', 'месецев') + ''; },
-	yearUntil: 'через',
-	yearsUntil: function(delta){ return 'через {delta} ' + pluralize(delta, 'год', 'года', 'лет') + ''; }
-
-});
-
-//<1.2compat>
-
-Locale.define('ru-RU-unicode').inherit('ru-RU', 'Date');
-
-//</1.2compat>
-
-})();
-
-
-/*
----
-
-name: Locale.ru-RU-unicode.Form.Validator
-
-description: Form Validator messages for Russian (utf-8).
-
-license: MIT-style license
-
-authors:
-  - Chernodarov Egor
-
-requires:
-  - /Locale
-
-provides: [Locale.ru-RU.Form.Validator]
-
-...
-*/
-
-Locale.define('ru-RU', 'FormValidator', {
-
-	required: 'Это поле обязательно к заполнению.',
-	minLength: 'Пожалуйста, введите хотя бы {minLength} символов (Вы ввели {length}).',
-	maxLength: 'Пожалуйста, введите не больше {maxLength} символов (Вы ввели {length}).',
-	integer: 'Пожалуйста, введите в это поле число. Дробные числа (например 1.25) тут не разрешены.',
-	numeric: 'Пожалуйста, введите в это поле число (например "1" или "1.1", или "-1", или "-1.1").',
-	digits: 'В этом поле Вы можете использовать только цифры и знаки пунктуации (например, телефонный номер со знаками дефиса или с точками).',
-	alpha: 'В этом поле можно использовать только латинские буквы (a-z). Пробелы и другие символы запрещены.',
-	alphanum: 'В этом поле можно использовать только латинские буквы (a-z) и цифры (0-9). Пробелы и другие символы запрещены.',
-	dateSuchAs: 'Пожалуйста, введите корректную дату {date}',
-	dateInFormatMDY: 'Пожалуйста, введите дату в формате ММ/ДД/ГГГГ (например "12/31/1999")',
-	email: 'Пожалуйста, введите корректный емейл-адрес. Для примера "fred@domain.com".',
-	url: 'Пожалуйста, введите правильную ссылку вида http://www.example.com.',
-	currencyDollar: 'Пожалуйста, введите сумму в долларах. Например: $100.00 .',
-	oneRequired: 'Пожалуйста, выберите хоть что-нибудь в одном из этих полей.',
-	errorPrefix: 'Ошибка: ',
-	warningPrefix: 'Внимание: '
-
-});
-
-//<1.2compat>
-
-Locale.define('ru-RU-unicode').inherit('ru-RU', 'FormValidator');
-
-//</1.2compat>
-
-
-/*
----
-
-name: Locale.si-SI.Date
-
-description: Date messages for Slovenian.
-
-license: MIT-style license
-
-authors:
-  - Radovan Lozej
-
-requires:
-  - /Locale
-
-provides: [Locale.si-SI.Date]
-
-...
-*/
-
-(function(){
-
-var pluralize = function(n, one, two, three, other){
-	return (n >= 1 && n <= 3) ? arguments[n] : other;
-};
-
-Locale.define('si-SI', 'Date', {
-
-	months: ['januar', 'februar', 'marec', 'april', 'maj', 'junij', 'julij', 'avgust', 'september', 'oktober', 'november', 'december'],
-	months_abbr: ['jan', 'feb', 'mar', 'apr', 'maj', 'jun', 'jul', 'avg', 'sep', 'okt', 'nov', 'dec'],
-	days: ['nedelja', 'ponedeljek', 'torek', 'sreda', 'četrtek', 'petek', 'sobota'],
-	days_abbr: ['ned', 'pon', 'tor', 'sre', 'čet', 'pet', 'sob'],
-
-	// Culture's date order: DD.MM.YYYY
-	dateOrder: ['date', 'month', 'year'],
-	shortDate: '%d.%m.%Y',
-	shortTime: '%H.%M',
-	AM: 'AM',
-	PM: 'PM',
-	firstDayOfWeek: 1,
-
-	// Date.Extras
-	ordinal: '.',
-
-	lessThanMinuteAgo: 'manj kot minuto nazaj',
-	minuteAgo: 'minuto nazaj',
-	minutesAgo: function(delta){ return '{delta} ' + pluralize(delta, 'minuto', 'minuti', 'minute', 'minut') + ' nazaj'; },
-	hourAgo: 'uro nazaj',
-	hoursAgo: function(delta){ return '{delta} ' + pluralize(delta, 'uro', 'uri', 'ure', 'ur') + ' nazaj'; },
-	dayAgo: 'dan nazaj',
-	daysAgo: function(delta){ return '{delta} ' + pluralize(delta, 'dan', 'dneva', 'dni', 'dni') + ' nazaj'; },
-	weekAgo: 'teden nazaj',
-	weeksAgo: function(delta){ return '{delta} ' + pluralize(delta, 'teden', 'tedna', 'tedne', 'tednov') + ' nazaj'; },
-	monthAgo: 'mesec nazaj',
-	monthsAgo: function(delta){ return '{delta} ' + pluralize(delta, 'mesec', 'meseca', 'mesece', 'mesecov') + ' nazaj'; },
-	yearthAgo: 'leto nazaj',
-	yearsAgo: function(delta){ return '{delta} ' + pluralize(delta, 'leto', 'leti', 'leta', 'let') + ' nazaj'; },
-
-	lessThanMinuteUntil: 'še manj kot minuto',
-	minuteUntil: 'še minuta',
-	minutesUntil: function(delta){ return 'še {delta} ' + pluralize(delta, 'minuta', 'minuti', 'minute', 'minut'); },
-	hourUntil: 'še ura',
-	hoursUntil: function(delta){ return 'še {delta} ' + pluralize(delta, 'ura', 'uri', 'ure', 'ur'); },
-	dayUntil: 'še dan',
-	daysUntil: function(delta){ return 'še {delta} ' + pluralize(delta, 'dan', 'dneva', 'dnevi', 'dni'); },
-	weekUntil: 'še tedn',
-	weeksUntil: function(delta){ return 'še {delta} ' + pluralize(delta, 'teden', 'tedna', 'tedni', 'tednov'); },
-	monthUntil: 'še mesec',
-	monthsUntil: function(delta){ return 'še {delta} ' + pluralize(delta, 'mesec', 'meseca', 'meseci', 'mesecov'); },
-	yearUntil: 'še leto',
-	yearsUntil: function(delta){ return 'še {delta} ' + pluralize(delta, 'leto', 'leti', 'leta', 'let'); }
-
-});
-
-})();
-
-
-/*
----
-
-name: Locale.si-SI.Form.Validator
-
-description: Form Validator messages for Slovenian.
-
-license: MIT-style license
-
-authors:
-  - Radovan Lozej
-
-requires:
-  - /Locale
-
-provides: [Locale.si-SI.Form.Validator]
-
-...
-*/
-
-Locale.define('si-SI', 'FormValidator', {
-
-	required: 'To polje je obvezno',
-	minLength: 'Prosim, vnesite vsaj {minLength} znakov (vnesli ste {length} znakov).',
-	maxLength: 'Prosim, ne vnesite več kot {maxLength} znakov (vnesli ste {length} znakov).',
-	integer: 'Prosim, vnesite celo število. Decimalna števila (kot 1,25) niso dovoljena.',
-	numeric: 'Prosim, vnesite samo numerične vrednosti (kot "1" ali "1.1" ali "-1" ali "-1.1").',
-	digits: 'Prosim, uporabite številke in ločila le na tem polju (na primer, dovoljena je telefonska številka z pomišlaji ali pikami).',
-	alpha: 'Prosim, uporabite le črke v tem plju. Presledki in drugi znaki niso dovoljeni.',
-	alphanum: 'Prosim, uporabite samo črke ali številke v tem polju. Presledki in drugi znaki niso dovoljeni.',
-	dateSuchAs: 'Prosim, vnesite pravilen datum kot {date}',
-	dateInFormatMDY: 'Prosim, vnesite pravilen datum kot MM.DD.YYYY (primer "12.31.1999")',
-	email: 'Prosim, vnesite pravilen email naslov. Na primer "fred@domain.com".',
-	url: 'Prosim, vnesite pravilen URL kot http://www.example.com.',
-	currencyDollar: 'Prosim, vnesit epravilno vrednost €. Primer 100,00€ .',
-	oneRequired: 'Prosimo, vnesite nekaj za vsaj eno izmed teh polj.',
-	errorPrefix: 'Napaka: ',
-	warningPrefix: 'Opozorilo: ',
-
-	// Form.Validator.Extras
-	noSpace: 'To vnosno polje ne dopušča presledkov.',
-	reqChkByNode: 'Nič niste izbrali.',
-	requiredChk: 'To polje je obvezno',
-	reqChkByName: 'Prosim, izberite {label}.',
-	match: 'To polje se mora ujemati z poljem {matchName}',
-	startDate: 'datum začetka',
-	endDate: 'datum konca',
-	currendDate: 'trenuten datum',
-	afterDate: 'Datum bi moral biti isti ali po {label}.',
-	beforeDate: 'Datum bi moral biti isti ali pred {label}.',
-	startMonth: 'Prosim, vnesite začetni datum',
-	sameMonth: 'Ta dva datuma morata biti v istem mesecu - premeniti morate eno ali drugo.',
-	creditcard: 'Številka kreditne kartice ni pravilna. Preverite številko ali poskusite še enkrat. Vnešenih {length} znakov.'
-
-});
-
-
-/*
----
-
-name: Locale.sv-SE.Date
-
-description: Date messages for Swedish.
-
-license: MIT-style license
-
-authors:
-  - Martin Lundgren
-
-requires:
-  - /Locale
-
-provides: [Locale.sv-SE.Date]
-
-...
-*/
-
-Locale.define('sv-SE', 'Date', {
-
-	months: ['januari', 'februari', 'mars', 'april', 'maj', 'juni', 'juli', 'augusti', 'september', 'oktober', 'november', 'december'],
-	months_abbr: ['jan', 'feb', 'mar', 'apr', 'maj', 'jun', 'jul', 'aug', 'sep', 'okt', 'nov', 'dec'],
-	days: ['söndag', 'måndag', 'tisdag', 'onsdag', 'torsdag', 'fredag', 'lördag'],
-	days_abbr: ['sön', 'mån', 'tis', 'ons', 'tor', 'fre', 'lör'],
-
-	// Culture's date order: YYYY-MM-DD
-	dateOrder: ['year', 'month', 'date'],
-	shortDate: '%Y-%m-%d',
-	shortTime: '%H:%M',
-	AM: '',
-	PM: '',
-	firstDayOfWeek: 1,
-
-	// Date.Extras
-	ordinal: '',
-
-	lessThanMinuteAgo: 'mindre än en minut sedan',
-	minuteAgo: 'ungefär en minut sedan',
-	minutesAgo: '{delta} minuter sedan',
-	hourAgo: 'ungefär en timme sedan',
-	hoursAgo: 'ungefär {delta} timmar sedan',
-	dayAgo: '1 dag sedan',
-	daysAgo: '{delta} dagar sedan',
-
-	lessThanMinuteUntil: 'mindre än en minut sedan',
-	minuteUntil: 'ungefär en minut sedan',
-	minutesUntil: '{delta} minuter sedan',
-	hourUntil: 'ungefär en timme sedan',
-	hoursUntil: 'ungefär {delta} timmar sedan',
-	dayUntil: '1 dag sedan',
-	daysUntil: '{delta} dagar sedan'
-
-});
-
-
-/*
----
-
-name: Locale.sv-SE.Form.Validator
-
-description: Form Validator messages for Swedish.
-
-license: MIT-style license
-
-authors:
-  - Martin Lundgren
-
-requires:
-  - /Locale
-
-provides: [Locale.sv-SE.Form.Validator]
-
-...
-*/
-
-Locale.define('sv-SE', 'FormValidator', {
-
-	required: 'Fältet är obligatoriskt.',
-	minLength: 'Ange minst {minLength} tecken (du angav {length} tecken).',
-	maxLength: 'Ange högst {maxLength} tecken (du angav {length} tecken). ',
-	integer: 'Ange ett heltal i fältet. Tal med decimaler (t.ex. 1,25) är inte tillåtna.',
-	numeric: 'Ange endast numeriska värden i detta fält (t.ex. "1" eller "1.1" eller "-1" eller "-1,1").',
-	digits: 'Använd endast siffror och skiljetecken i detta fält (till exempel ett telefonnummer med bindestreck tillåtet).',
-	alpha: 'Använd endast bokstäver (a-ö) i detta fält. Inga mellanslag eller andra tecken är tillåtna.',
-	alphanum: 'Använd endast bokstäver (a-ö) och siffror (0-9) i detta fält. Inga mellanslag eller andra tecken är tillåtna.',
-	dateSuchAs: 'Ange ett giltigt datum som t.ex. {date}',
-	dateInFormatMDY: 'Ange ett giltigt datum som t.ex. YYYY-MM-DD (i.e. "1999-12-31")',
-	email: 'Ange en giltig e-postadress. Till exempel "erik@domain.com".',
-	url: 'Ange en giltig webbadress som http://www.example.com.',
-	currencyDollar: 'Ange en giltig belopp. Exempelvis 100,00.',
-	oneRequired: 'Vänligen ange minst ett av dessa alternativ.',
-	errorPrefix: 'Fel: ',
-	warningPrefix: 'Varning: ',
-
-	// Form.Validator.Extras
-	noSpace: 'Det får inte finnas några mellanslag i detta fält.',
-	reqChkByNode: 'Inga objekt är valda.',
-	requiredChk: 'Detta är ett obligatoriskt fält.',
-	reqChkByName: 'Välj en {label}.',
-	match: 'Detta fält måste matcha {matchName}',
-	startDate: 'startdatumet',
-	endDate: 'slutdatum',
-	currendDate: 'dagens datum',
-	afterDate: 'Datumet bör vara samma eller senare än {label}.',
-	beforeDate: 'Datumet bör vara samma eller tidigare än {label}.',
-	startMonth: 'Välj en start månad',
-	sameMonth: 'Dessa två datum måste vara i samma månad - du måste ändra det ena eller det andra.'
-
-});
-
-
-/*
----
-
-name: Locale.uk-UA.Date
-
-description: Date messages for Ukrainian (utf-8).
-
-license: MIT-style license
-
-authors:
-  - Slik
-
-requires:
-  - /Locale
-
-provides: [Locale.uk-UA.Date]
-
-...
-*/
-
-(function(){
-
-var pluralize = function(n, one, few, many, other){
-	var d = (n / 10).toInt(),
-		z = n % 10,
-		s = (n / 100).toInt();
-
-	if (d == 1 && n > 10) return many;
-	if (z == 1) return one;
-	if (z > 0 && z < 5) return few;
-	return many;
-};
-
-Locale.define('uk-UA', 'Date', {
-
-	months: ['Січень', 'Лютий', 'Березень', 'Квітень', 'Травень', 'Червень', 'Липень', 'Серпень', 'Вересень', 'Жовтень', 'Листопад', 'Грудень'],
-	months_abbr: ['Січ', 'Лют', 'Бер', 'Квіт', 'Трав', 'Черв', 'Лип', 'Серп', 'Вер', 'Жовт', 'Лист', 'Груд' ],
-	days: ['Неділя', 'Понеділок', 'Вівторок', 'Середа', 'Четвер', "П'ятниця", 'Субота'],
-	days_abbr: ['Нд', 'Пн', 'Вт', 'Ср', 'Чт', 'Пт', 'Сб'],
-
-	// Culture's date order: DD/MM/YYYY
-	dateOrder: ['date', 'month', 'year'],
-	shortDate: '%d/%m/%Y',
-	shortTime: '%H:%M',
-	AM: 'до полудня',
-	PM: 'по полудню',
-	firstDayOfWeek: 1,
-
-	// Date.Extras
-	ordinal: '',
-
-	lessThanMinuteAgo: 'меньше хвилини тому',
-	minuteAgo: 'хвилину тому',
-	minutesAgo: function(delta){ return '{delta} ' + pluralize(delta, 'хвилину', 'хвилини', 'хвилин') + ' тому'; },
-	hourAgo: 'годину тому',
-	hoursAgo: function(delta){ return '{delta} ' + pluralize(delta, 'годину', 'години', 'годин') + ' тому'; },
-	dayAgo: 'вчора',
-	daysAgo: function(delta){ return '{delta} ' + pluralize(delta, 'день', 'дня', 'днів') + ' тому'; },
-	weekAgo: 'тиждень тому',
-	weeksAgo: function(delta){ return '{delta} ' + pluralize(delta, 'тиждень', 'тижні', 'тижнів') + ' тому'; },
-	monthAgo: 'місяць тому',
-	monthsAgo: function(delta){ return '{delta} ' + pluralize(delta, 'місяць', 'місяці', 'місяців') + ' тому'; },
-	yearAgo: 'рік тому',
-	yearsAgo: function(delta){ return '{delta} ' + pluralize(delta, 'рік', 'роки', 'років') + ' тому'; },
-
-	lessThanMinuteUntil: 'за мить',
-	minuteUntil: 'через хвилину',
-	minutesUntil: function(delta){ return 'через {delta} ' + pluralize(delta, 'хвилину', 'хвилини', 'хвилин'); },
-	hourUntil: 'через годину',
-	hoursUntil: function(delta){ return 'через {delta} ' + pluralize(delta, 'годину', 'години', 'годин'); },
-	dayUntil: 'завтра',
-	daysUntil: function(delta){ return 'через {delta} ' + pluralize(delta, 'день', 'дня', 'днів'); },
-	weekUntil: 'через тиждень',
-	weeksUntil: function(delta){ return 'через {delta} ' + pluralize(delta, 'тиждень', 'тижні', 'тижнів'); },
-	monthUntil: 'через місяць',
-	monthesUntil: function(delta){ return 'через {delta} ' + pluralize(delta, 'місяць', 'місяці', 'місяців'); },
-	yearUntil: 'через рік',
-	yearsUntil: function(delta){ return 'через {delta} ' + pluralize(delta, 'рік', 'роки', 'років'); }
-
-});
-
-})();
-
-
-/*
----
-
-name: Locale.uk-UA.Form.Validator
-
-description: Form Validator messages for Ukrainian (utf-8).
-
-license: MIT-style license
-
-authors:
-  - Slik
-
-requires:
-  - /Locale
-
-provides: [Locale.uk-UA.Form.Validator]
-
-...
-*/
-
-Locale.define('uk-UA', 'FormValidator', {
-
-	required: 'Це поле повинне бути заповненим.',
-	minLength: 'Введіть хоча б {minLength} символів (Ви ввели {length}).',
-	maxLength: 'Кількість символів не може бути більше {maxLength} (Ви ввели {length}).',
-	integer: 'Введіть в це поле число. Дробові числа (наприклад 1.25) не дозволені.',
-	numeric: 'Введіть в це поле число (наприклад "1" або "1.1", або "-1", або "-1.1").',
-	digits: 'В цьому полі ви можете використовувати лише цифри і знаки пунктіації (наприклад, телефонний номер з знаками дефізу або з крапками).',
-	alpha: 'В цьому полі можна використовувати лише латинські літери (a-z). Пробіли і інші символи заборонені.',
-	alphanum: 'В цьому полі можна використовувати лише латинські літери (a-z) і цифри (0-9). Пробіли і інші символи заборонені.',
-	dateSuchAs: 'Введіть коректну дату {date}.',
-	dateInFormatMDY: 'Введіть дату в форматі ММ/ДД/РРРР (наприклад "12/31/2009").',
-	email: 'Введіть коректну адресу електронної пошти (наприклад "name@domain.com").',
-	url: 'Введіть коректне інтернет-посилання (наприклад http://www.example.com).',
-	currencyDollar: 'Введіть суму в доларах (наприклад "$100.00").',
-	oneRequired: 'Заповніть одне з полів.',
-	errorPrefix: 'Помилка: ',
-	warningPrefix: 'Увага: ',
-
-	noSpace: 'Пробіли заборонені.',
-	reqChkByNode: 'Не відмічено жодного варіанту.',
-	requiredChk: 'Це поле повинне бути віміченим.',
-	reqChkByName: 'Будь ласка, відмітьте {label}.',
-	match: 'Це поле повинно відповідати {matchName}',
-	startDate: 'початкова дата',
-	endDate: 'кінцева дата',
-	currendDate: 'сьогоднішня дата',
-	afterDate: 'Ця дата повинна бути такою ж, або пізнішою за {label}.',
-	beforeDate: 'Ця дата повинна бути такою ж, або ранішою за {label}.',
-	startMonth: 'Будь ласка, виберіть початковий місяць',
-	sameMonth: 'Ці дати повинні відноситись одного і того ж місяця. Будь ласка, змініть одну з них.',
-	creditcard: 'Номер кредитної карти введений неправильно. Будь ласка, перевірте його. Введено {length} символів.'
-
-});
-
-
-/*
----
-
-name: Locale.zh-CH.Date
-
-description: Date messages for Chinese (simplified and traditional).
-
-license: MIT-style license
-
-authors:
-  - YMind Chan
-
-requires:
-  - /Locale
-
-provides: [Locale.zh-CH.Date]
-
-...
-*/
-
-// Simplified Chinese
-Locale.define('zh-CHS', 'Date', {
-
-	months: ['一月', '二月', '三月', '四月', '五月', '六月', '七月', '八月', '九月', '十月', '十一月', '十二月'],
-	months_abbr: ['一', '二', '三', '四', '五', '六', '七', '八', '九', '十', '十一', '十二'],
-	days: ['星期日', '星期一', '星期二', '星期三', '星期四', '星期五', '星期六'],
-	days_abbr: ['日', '一', '二', '三', '四', '五', '六'],
-
-	// Culture's date order: YYYY-MM-DD
-	dateOrder: ['year', 'month', 'date'],
-	shortDate: '%Y-%m-%d',
-	shortTime: '%I:%M%p',
-	AM: 'AM',
-	PM: 'PM',
-	firstDayOfWeek: 1,
-
-	// Date.Extras
-	ordinal: '',
-
-	lessThanMinuteAgo: '不到1分钟前',
-	minuteAgo: '大约1分钟前',
-	minutesAgo: '{delta}分钟之前',
-	hourAgo: '大约1小时前',
-	hoursAgo: '大约{delta}小时前',
-	dayAgo: '1天前',
-	daysAgo: '{delta}天前',
-	weekAgo: '1星期前',
-	weeksAgo: '{delta}星期前',
-	monthAgo: '1个月前',
-	monthsAgo: '{delta}个月前',
-	yearAgo: '1年前',
-	yearsAgo: '{delta}年前',
-
-	lessThanMinuteUntil: '从现在开始不到1分钟',
-	minuteUntil: '从现在开始約1分钟',
-	minutesUntil: '从现在开始约{delta}分钟',
-	hourUntil: '从现在开始1小时',
-	hoursUntil: '从现在开始约{delta}小时',
-	dayUntil: '从现在开始1天',
-	daysUntil: '从现在开始{delta}天',
-	weekUntil: '从现在开始1星期',
-	weeksUntil: '从现在开始{delta}星期',
-	monthUntil: '从现在开始一个月',
-	monthsUntil: '从现在开始{delta}个月',
-	yearUntil: '从现在开始1年',
-	yearsUntil: '从现在开始{delta}年'
-
-});
-
-// Traditional Chinese
-Locale.define('zh-CHT', 'Date', {
-
-	months: ['一月', '二月', '三月', '四月', '五月', '六月', '七月', '八月', '九月', '十月', '十一月', '十二月'],
-	months_abbr: ['一', '二', '三', '四', '五', '六', '七', '八', '九', '十', '十一', '十二'],
-	days: ['星期日', '星期一', '星期二', '星期三', '星期四', '星期五', '星期六'],
-	days_abbr: ['日', '一', '二', '三', '四', '五', '六'],
-
-	// Culture's date order: YYYY-MM-DD
-	dateOrder: ['year', 'month', 'date'],
-	shortDate: '%Y-%m-%d',
-	shortTime: '%I:%M%p',
-	AM: 'AM',
-	PM: 'PM',
-	firstDayOfWeek: 1,
-
-	// Date.Extras
-	ordinal: '',
-
-	lessThanMinuteAgo: '不到1分鐘前',
-	minuteAgo: '大約1分鐘前',
-	minutesAgo: '{delta}分鐘之前',
-	hourAgo: '大約1小時前',
-	hoursAgo: '大約{delta}小時前',
-	dayAgo: '1天前',
-	daysAgo: '{delta}天前',
-	weekAgo: '1星期前',
-	weeksAgo: '{delta}星期前',
-	monthAgo: '1个月前',
-	monthsAgo: '{delta}个月前',
-	yearAgo: '1年前',
-	yearsAgo: '{delta}年前',
-
-	lessThanMinuteUntil: '從現在開始不到1分鐘',
-	minuteUntil: '從現在開始約1分鐘',
-	minutesUntil: '從現在開始約{delta}分鐘',
-	hourUntil: '從現在開始1小時',
-	hoursUntil: '從現在開始約{delta}小時',
-	dayUntil: '從現在開始1天',
-	daysUntil: '從現在開始{delta}天',
-	weekUntil: '從現在開始1星期',
-	weeksUntil: '從現在開始{delta}星期',
-	monthUntil: '從現在開始一個月',
-	monthsUntil: '從現在開始{delta}個月',
-	yearUntil: '從現在開始1年',
-	yearsUntil: '從現在開始{delta}年'
-
-});
-
-
-/*
----
-
-name: Locale.zh-CH.Form.Validator
-
-description: Form Validator messages for Chinese (simplified and traditional).
-
-license: MIT-style license
-
-authors:
-  - YMind Chan
-
-requires:
-  - /Locale
-  - /Form.Validator
-
-provides: [Form.zh-CH.Form.Validator, Form.Validator.CurrencyYuanValidator]
-
-...
-*/
-
-// Simplified Chinese
-Locale.define('zh-CHS', 'FormValidator', {
-
-	required: '此项必填。',
-	minLength: '请至少输入 {minLength} 个字符 (已输入 {length} 个)。',
-	maxLength: '最多只能输入 {maxLength} 个字符 (已输入 {length} 个)。',
-	integer: '请输入一个整数,不能包含小数点。例如:"1", "200"。',
-	numeric: '请输入一个数字,例如:"1", "1.1", "-1", "-1.1"。',
-	digits: '请输入由数字和标点符号组成的内容。例如电话号码。',
-	alpha: '请输入 A-Z 的 26 个字母,不能包含空格或任何其他字符。',
-	alphanum: '请输入 A-Z 的 26 个字母或 0-9 的 10 个数字,不能包含空格或任何其他字符。',
-	dateSuchAs: '请输入合法的日期格式,如:{date}。',
-	dateInFormatMDY: '请输入合法的日期格式,例如:YYYY-MM-DD ("2010-12-31")。',
-	email: '请输入合法的电子信箱地址,例如:"fred@domain.com"。',
-	url: '请输入合法的 Url 地址,例如:http://www.example.com。',
-	currencyDollar: '请输入合法的货币符号,例如:¥100.0',
-	oneRequired: '请至少选择一项。',
-	errorPrefix: '错误:',
-	warningPrefix: '警告:',
-
-	// Form.Validator.Extras
-	noSpace: '不能包含空格。',
-	reqChkByNode: '未选择任何内容。',
-	requiredChk: '此项必填。',
-	reqChkByName: '请选择 {label}.',
-	match: '必须与{matchName}相匹配',
-	startDate: '起始日期',
-	endDate: '结束日期',
-	currendDate: '当前日期',
-	afterDate: '日期必须等于或晚于 {label}.',
-	beforeDate: '日期必须早于或等于 {label}.',
-	startMonth: '请选择起始月份',
-	sameMonth: '您必须修改两个日期中的一个,以确保它们在同一月份。',
-	creditcard: '您输入的信用卡号码不正确。当前已输入{length}个字符。'
-
-});
-
-// Traditional Chinese
-Locale.define('zh-CHT', 'FormValidator', {
-
-	required: '此項必填。 ',
-	minLength: '請至少輸入{minLength} 個字符(已輸入{length} 個)。 ',
-	maxLength: '最多只能輸入{maxLength} 個字符(已輸入{length} 個)。 ',
-	integer: '請輸入一個整數,不能包含小數點。例如:"1", "200"。 ',
-	numeric: '請輸入一個數字,例如:"1", "1.1", "-1", "-1.1"。 ',
-	digits: '請輸入由數字和標點符號組成的內容。例如電話號碼。 ',
-	alpha: '請輸入AZ 的26 個字母,不能包含空格或任何其他字符。 ',
-	alphanum: '請輸入AZ 的26 個字母或0-9 的10 個數字,不能包含空格或任何其他字符。 ',
-	dateSuchAs: '請輸入合法的日期格式,如:{date}。 ',
-	dateInFormatMDY: '請輸入合法的日期格式,例如:YYYY-MM-DD ("2010-12-31")。 ',
-	email: '請輸入合法的電子信箱地址,例如:"fred@domain.com"。 ',
-	url: '請輸入合法的Url 地址,例如:http://www.example.com。 ',
-	currencyDollar: '請輸入合法的貨幣符號,例如:¥100.0',
-	oneRequired: '請至少選擇一項。 ',
-	errorPrefix: '錯誤:',
-	warningPrefix: '警告:',
-
-	// Form.Validator.Extras
-	noSpace: '不能包含空格。 ',
-	reqChkByNode: '未選擇任何內容。 ',
-	requiredChk: '此項必填。 ',
-	reqChkByName: '請選擇 {label}.',
-	match: '必須與{matchName}相匹配',
-	startDate: '起始日期',
-	endDate: '結束日期',
-	currendDate: '當前日期',
-	afterDate: '日期必須等於或晚於{label}.',
-	beforeDate: '日期必須早於或等於{label}.',
-	startMonth: '請選擇起始月份',
-	sameMonth: '您必須修改兩個日期中的一個,以確保它們在同一月份。 ',
-	creditcard: '您輸入的信用卡號碼不正確。當前已輸入{length}個字符。 '
-
-});
-
-Form.Validator.add('validate-currency-yuan', {
-
-	errorMsg: function(){
-		return Form.Validator.getMsg('currencyYuan');
-	},
-
-	test: function(element){
-		// [¥]1[##][,###]+[.##]
-		// [¥]1###+[.##]
-		// [¥]0.##
-		// [¥].##
-		return Form.Validator.getValidator('IsEmpty').test(element) || (/^¥?\-?([1-9]{1}[0-9]{0,2}(\,[0-9]{3})*(\.[0-9]{0,2})?|[1-9]{1}\d*(\.[0-9]{0,2})?|0(\.[0-9]{0,2})?|(\.[0-9]{1,2})?)$/).test(element.get('value'));
-	}
-
-});
-
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/libraries/MooTools-More-1.6.0.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/libraries/MooTools-More-1.6.0.js
deleted file mode 100644
index 520b3d7..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/libraries/MooTools-More-1.6.0.js
+++ /dev/null
@@ -1,14658 +0,0 @@
-/* MooTools: the javascript framework. license: MIT-style license. copyright: Copyright (c) 2006-2018 [Valerio Proietti](https://mootools.net/).*/ 
-/*!
-Web Build: https://mootools.net/more/builder/a3048f4bfdf603b22a69c141dbd0fca9
-*/
-/*
----
-
-script: More.js
-
-name: More
-
-description: MooTools More
-
-license: MIT-style license
-
-authors:
-  - Guillermo Rauch
-  - Thomas Aylott
-  - Scott Kyle
-  - Arian Stolwijk
-  - Tim Wienk
-  - Christoph Pojer
-  - Aaron Newton
-  - Jacob Thornton
-
-requires:
-  - Core/MooTools
-
-provides: [MooTools.More]
-
-...
-*/
-
-MooTools.More = {
-	version: '1.6.0',
-	build: '45b71db70f879781a7e0b0d3fb3bb1307c2521eb'
-};
-
-/*
----
-
-script: Chain.Wait.js
-
-name: Chain.Wait
-
-description: value, Adds a method to inject pauses between chained events.
-
-license: MIT-style license.
-
-authors:
-  - Aaron Newton
-
-requires:
-  - Core/Chain
-  - Core/Element
-  - Core/Fx
-  - MooTools.More
-
-provides: [Chain.Wait]
-
-...
-*/
-
-(function(){
-
-var wait = {
-	wait: function(duration){
-		return this.chain(function(){
-			this.callChain.delay(duration == null ? 500 : duration, this);
-			return this;
-		}.bind(this));
-	}
-};
-
-Chain.implement(wait);
-
-if (this.Fx) Fx.implement(wait);
-
-if (this.Element && Element.implement && this.Fx){
-	Element.implement({
-
-		chains: function(effects){
-			Array.convert(effects || ['tween', 'morph', 'reveal']).each(function(effect){
-				effect = this.get(effect);
-				if (!effect) return;
-				effect.setOptions({
-					link:'chain'
-				});
-			}, this);
-			return this;
-		},
-
-		pauseFx: function(duration, effect){
-			this.chains(effect).get(effect || 'tween').wait(duration);
-			return this;
-		}
-
-	});
-}
-
-})();
-
-/*
----
-
-script: Class.Binds.js
-
-name: Class.Binds
-
-description: Automagically binds specified methods in a class to the instance of the class.
-
-license: MIT-style license
-
-authors:
-  - Aaron Newton
-
-requires:
-  - Core/Class
-  - MooTools.More
-
-provides: [Class.Binds]
-
-...
-*/
-
-Class.Mutators.Binds = function(binds){
-	if (!this.prototype.initialize) this.implement('initialize', function(){});
-	return Array.convert(binds).concat(this.prototype.Binds || []);
-};
-
-Class.Mutators.initialize = function(initialize){
-	return function(){
-		Array.convert(this.Binds).each(function(name){
-			var original = this[name];
-			if (original) this[name] = original.bind(this);
-		}, this);
-		return initialize.apply(this, arguments);
-	};
-};
-
-/*
----
-
-script: Class.Occlude.js
-
-name: Class.Occlude
-
-description: Prevents a class from being applied to a DOM element twice.
-
-license: MIT-style license.
-
-authors:
-  - Aaron Newton
-
-requires:
-  - Core/Class
-  - Core/Element
-  - MooTools.More
-
-provides: [Class.Occlude]
-
-...
-*/
-
-Class.Occlude = new Class({
-
-	occlude: function(property, element){
-		element = document.id(element || this.element);
-		var instance = element.retrieve(property || this.property);
-		if (instance && !this.occluded)
-			return (this.occluded = instance);
-
-		this.occluded = false;
-		element.store(property || this.property, this);
-		return this.occluded;
-	}
-
-});
-
-/*
----
-
-script: Class.Refactor.js
-
-name: Class.Refactor
-
-description: Extends a class onto itself with new property, preserving any items attached to the class's namespace.
-
-license: MIT-style license
-
-authors:
-  - Aaron Newton
-
-requires:
-  - Core/Class
-  - MooTools.More
-
-# Some modules declare themselves dependent on Class.Refactor
-provides: [Class.refactor, Class.Refactor]
-
-...
-*/
-
-Class.refactor = function(original, refactors){
-
-	Object.each(refactors, function(item, name){
-		var origin = original.prototype[name];
-		origin = (origin && origin.$origin) || origin || function(){};
-		original.implement(name, (typeof item == 'function') ? function(){
-			var old = this.previous;
-			this.previous = origin;
-			var value = item.apply(this, arguments);
-			this.previous = old;
-			return value;
-		} : item);
-	});
-
-	return original;
-
-};
-
-/*
----
-
-script: Class.Singleton.js
-
-name: Class.Singleton
-
-description: Always provides a single instance of a class
-
-license: MIT-style license.
-
-authors:
-  - Hristo Chakarov
-
-requires:
-  - Core/Class
-
-provides: [Class.Singleton]
-
-...
-*/
-
-Class.Singleton = new Class({
-
-	initialize : function(descriptor){
-		// here we keep reference of the single instance
-		var singleton;
-		// create a regular Class
-		var constructor = new Class(descriptor);
-		// We return another constructor, because we need to make sure that we
-		// always return the same one and only instance.
-		return function(){
-			if (singleton){
-				return singleton;
-			}
-			// Obviously we instantiate that class for the first time.
-			// Create brand new object & extend it with the prototype of the
-			// original `constructor`.
-			singleton = Object.append({}, constructor.prototype);
-			singleton.constructor = constructor;
-			// We also need to call the constructor as a function, passing the
-			// arguments object.
-			var returnValue = constructor.apply(singleton, arguments);
-			// In case the `constructor` returns something other than `this` -
-			// return that value; otherwise return the `singleton`.
-			singleton = typeof returnValue == 'object' ? returnValue : singleton;
-			return singleton;
-		};
-	}
-
-});
-
-/*
----
-
-name: Events.Pseudos
-
-description: Adds the functionality to add pseudo events
-
-license: MIT-style license
-
-authors:
-  - Arian Stolwijk
-
-requires: [Core/Class.Extras, Core/Slick.Parser, MooTools.More]
-
-provides: [Events.Pseudos]
-
-...
-*/
-
-(function(){
-
-Events.Pseudos = function(pseudos, addEvent, removeEvent){
-
-	var storeKey = '_monitorEvents:';
-
-	var storageOf = function(object){
-		return {
-			store: object.store ? function(key, value){
-				object.store(storeKey + key, value);
-			} : function(key, value){
-				(object._monitorEvents || (object._monitorEvents = {}))[key] = value;
-			},
-			retrieve: object.retrieve ? function(key, dflt){
-				return object.retrieve(storeKey + key, dflt);
-			} : function(key, dflt){
-				if (!object._monitorEvents) return dflt;
-				return object._monitorEvents[key] || dflt;
-			}
-		};
-	};
-
-	var splitType = function(type){
-		if (type.indexOf(':') == -1 || !pseudos) return null;
-
-		var parsed = Slick.parse(type).expressions[0][0],
-			parsedPseudos = parsed.pseudos,
-			l = parsedPseudos.length,
-			splits = [];
-
-		while (l--){
-			var pseudo = parsedPseudos[l].key,
-				listener = pseudos[pseudo];
-			if (listener != null) splits.push({
-				event: parsed.tag,
-				value: parsedPseudos[l].value,
-				pseudo: pseudo,
-				original: type,
-				listener: listener
-			});
-		}
-		return splits.length ? splits : null;
-	};
-
-	return {
-
-		addEvent: function(type, fn, internal){
-			var split = splitType(type);
-			if (!split) return addEvent.call(this, type, fn, internal);
-
-			var storage = storageOf(this),
-				events = storage.retrieve(type, []),
-				eventType = split[0].event,
-				args = Array.slice(arguments, 2),
-				stack = fn,
-				self = this;
-
-			split.each(function(item){
-				var listener = item.listener,
-					stackFn = stack;
-				if (listener == false) eventType += ':' + item.pseudo + '(' + item.value + ')';
-				else stack = function(){
-					listener.call(self, item, stackFn, arguments, stack);
-				};
-			});
-
-			events.include({type: eventType, event: fn, monitor: stack});
-			storage.store(type, events);
-
-			if (type != eventType) addEvent.apply(this, [type, fn].concat(args));
-			return addEvent.apply(this, [eventType, stack].concat(args));
-		},
-
-		removeEvent: function(type, fn){
-			var split = splitType(type);
-			if (!split) return removeEvent.call(this, type, fn);
-
-			var storage = storageOf(this),
-				events = storage.retrieve(type);
-			if (!events) return this;
-
-			var args = Array.slice(arguments, 2);
-
-			removeEvent.apply(this, [type, fn].concat(args));
-			events.each(function(monitor, i){
-				if (!fn || monitor.event == fn) removeEvent.apply(this, [monitor.type, monitor.monitor].concat(args));
-				delete events[i];
-			}, this);
-
-			storage.store(type, events);
-			return this;
-		}
-
-	};
-
-};
-
-var pseudos = {
-
-	once: function(split, fn, args, monitor){
-		fn.apply(this, args);
-		this.removeEvent(split.event, monitor)
-			.removeEvent(split.original, fn);
-	},
-
-	throttle: function(split, fn, args){
-		if (!fn._throttled){
-			fn.apply(this, args);
-			fn._throttled = setTimeout(function(){
-				fn._throttled = false;
-			}, split.value || 250);
-		}
-	},
-
-	pause: function(split, fn, args){
-		clearTimeout(fn._pause);
-		fn._pause = fn.delay(split.value || 250, this, args);
-	}
-
-};
-
-Events.definePseudo = function(key, listener){
-	pseudos[key] = listener;
-	return this;
-};
-
-Events.lookupPseudo = function(key){
-	return pseudos[key];
-};
-
-var proto = Events.prototype;
-Events.implement(Events.Pseudos(pseudos, proto.addEvent, proto.removeEvent));
-
-['Request', 'Fx'].each(function(klass){
-	if (this[klass]) this[klass].implement(Events.prototype);
-});
-
-})();
-
-/*
----
-
-script: Drag.js
-
-name: Drag
-
-description: The base Drag Class. Can be used to drag and resize Elements using mouse events.
-
-license: MIT-style license
-
-authors:
-  - Valerio Proietti
-  - Tom Occhinno
-  - Jan Kassens
-
-requires:
-  - Core/Events
-  - Core/Options
-  - Core/Element.Event
-  - Core/Element.Style
-  - Core/Element.Dimensions
-  - MooTools.More
-
-provides: [Drag]
-...
-
-*/
-(function(){
-
-var Drag = this.Drag = new Class({
-
-	Implements: [Events, Options],
-
-	options: {/*
-		onBeforeStart: function(thisElement){},
-		onStart: function(thisElement, event){},
-		onSnap: function(thisElement){},
-		onDrag: function(thisElement, event){},
-		onCancel: function(thisElement){},
-		onComplete: function(thisElement, event){},*/
-		snap: 6,
-		unit: 'px',
-		grid: false,
-		style: true,
-		limit: false,
-		handle: false,
-		invert: false,
-		unDraggableTags: ['button', 'input', 'a', 'textarea', 'select', 'option'],
-		preventDefault: false,
-		stopPropagation: false,
-		compensateScroll: false,
-		modifiers: {x: 'left', y: 'top'}
-	},
-
-	initialize: function(){
-		var params = Array.link(arguments, {
-			'options': Type.isObject,
-			'element': function(obj){
-				return obj != null;
-			}
-		});
-
-		this.element = document.id(params.element);
-		this.document = this.element.getDocument();
-		this.setOptions(params.options || {});
-		var htype = typeOf(this.options.handle);
-		this.handles = ((htype == 'array' || htype == 'collection') ? $$(this.options.handle) : document.id(this.options.handle)) || this.element;
-		this.mouse = {'now': {}, 'pos': {}};
-		this.value = {'start': {}, 'now': {}};
-		this.offsetParent = (function(el){
-			var offsetParent = el.getOffsetParent();
-			var isBody = !offsetParent || (/^(?:body|html)$/i).test(offsetParent.tagName);
-			return isBody ? window : document.id(offsetParent);
-		})(this.element);
-		this.selection = 'selectstart' in document ? 'selectstart' : 'mousedown';
-
-		this.compensateScroll = {start: {}, diff: {}, last: {}};
-
-		if ('ondragstart' in document && !('FileReader' in window) && !Drag.ondragstartFixed){
-			document.ondragstart = Function.convert(false);
-			Drag.ondragstartFixed = true;
-		}
-
-		this.bound = {
-			start: this.start.bind(this),
-			check: this.check.bind(this),
-			drag: this.drag.bind(this),
-			stop: this.stop.bind(this),
-			cancel: this.cancel.bind(this),
-			eventStop: Function.convert(false),
-			scrollListener: this.scrollListener.bind(this)
-		};
-		this.attach();
-	},
-
-	attach: function(){
-		this.handles.addEvent('mousedown', this.bound.start);
-		this.handles.addEvent('touchstart', this.bound.start);
-		if (this.options.compensateScroll) this.offsetParent.addEvent('scroll', this.bound.scrollListener);
-		return this;
-	},
-
-	detach: function(){
-		this.handles.removeEvent('mousedown', this.bound.start);
-		this.handles.removeEvent('touchstart', this.bound.start);
-		if (this.options.compensateScroll) this.offsetParent.removeEvent('scroll', this.bound.scrollListener);
-		return this;
-	},
-
-	scrollListener: function(){
-
-		if (!this.mouse.start) return;
-		var newScrollValue = this.offsetParent.getScroll();
-
-		if (this.element.getStyle('position') == 'absolute'){
-			var scrollDiff = this.sumValues(newScrollValue, this.compensateScroll.last, -1);
-			this.mouse.now = this.sumValues(this.mouse.now, scrollDiff, 1);
-		} else {
-			this.compensateScroll.diff = this.sumValues(newScrollValue, this.compensateScroll.start, -1);
-		}
-		if (this.offsetParent != window) this.compensateScroll.diff = this.sumValues(this.compensateScroll.start, newScrollValue, -1);
-		this.compensateScroll.last = newScrollValue;
-		this.render(this.options);
-	},
-
-	sumValues: function(alpha, beta, op){
-		var sum = {}, options = this.options;
-		for (var z in options.modifiers){
-			if (!options.modifiers[z]) continue;
-			sum[z] = alpha[z] + beta[z] * op;
-		}
-		return sum;
-	},
-
-	start: function(event){
-		if (this.options.unDraggableTags.contains(event.target.get('tag'))) return;
-
-		var options = this.options;
-
-		if (event.rightClick) return;
-
-		if (options.preventDefault) event.preventDefault();
-		if (options.stopPropagation) event.stopPropagation();
-		this.compensateScroll.start = this.compensateScroll.last = this.offsetParent.getScroll();
-		this.compensateScroll.diff = {x: 0, y: 0};
-		this.mouse.start = event.page;
-		this.fireEvent('beforeStart', this.element);
-
-		var limit = options.limit;
-		this.limit = {x: [], y: []};
-
-		var z, coordinates, offsetParent = this.offsetParent == window ? null : this.offsetParent;
-		for (z in options.modifiers){
-			if (!options.modifiers[z]) continue;
-
-			var style = this.element.getStyle(options.modifiers[z]);
-
-			// Some browsers (IE and Opera) don't always return pixels.
-			if (style && !style.match(/px$/)){
-				if (!coordinates) coordinates = this.element.getCoordinates(offsetParent);
-				style = coordinates[options.modifiers[z]];
-			}
-
-			if (options.style) this.value.now[z] = (style || 0).toInt();
-			else this.value.now[z] = this.element[options.modifiers[z]];
-
-			if (options.invert) this.value.now[z] *= -1;
-
-			this.mouse.pos[z] = event.page[z] - this.value.now[z];
-
-			if (limit && limit[z]){
-				var i = 2;
-				while (i--){
-					var limitZI = limit[z][i];
-					if (limitZI || limitZI === 0) this.limit[z][i] = (typeof limitZI == 'function') ? limitZI() : limitZI;
-				}
-			}
-		}
-
-		if (typeOf(this.options.grid) == 'number') this.options.grid = {
-			x: this.options.grid,
-			y: this.options.grid
-		};
-
-		var events = {
-			mousemove: this.bound.check,
-			mouseup: this.bound.cancel,
-			touchmove: this.bound.check,
-			touchend: this.bound.cancel
-		};
-		events[this.selection] = this.bound.eventStop;
-		this.document.addEvents(events);
-	},
-
-	check: function(event){
-		if (this.options.preventDefault) event.preventDefault();
-		var distance = Math.round(Math.sqrt(Math.pow(event.page.x - this.mouse.start.x, 2) + Math.pow(event.page.y - this.mouse.start.y, 2)));
-		if (distance > this.options.snap){
-			this.cancel();
-			this.document.addEvents({
-				mousemove: this.bound.drag,
-				mouseup: this.bound.stop,
-				touchmove: this.bound.drag,
-				touchend: this.bound.stop
-			});
-			this.fireEvent('start', [this.element, event]).fireEvent('snap', this.element);
-		}
-	},
-
-	drag: function(event){
-		var options = this.options;
-		if (options.preventDefault) event.preventDefault();
-		this.mouse.now = this.sumValues(event.page, this.compensateScroll.diff, -1);
-
-		this.render(options);
-		this.fireEvent('drag', [this.element, event]);
-	},
-
-	render: function(options){
-		for (var z in options.modifiers){
-			if (!options.modifiers[z]) continue;
-			this.value.now[z] = this.mouse.now[z] - this.mouse.pos[z];
-
-			if (options.invert) this.value.now[z] *= -1;
-			if (options.limit && this.limit[z]){
-				if ((this.limit[z][1] || this.limit[z][1] === 0) && (this.value.now[z] > this.limit[z][1])){
-					this.value.now[z] = this.limit[z][1];
-				} else if ((this.limit[z][0] || this.limit[z][0] === 0) && (this.value.now[z] < this.limit[z][0])){
-					this.value.now[z] = this.limit[z][0];
-				}
-			}
-			if (options.grid[z]) this.value.now[z] -= ((this.value.now[z] - (this.limit[z][0]||0)) % options.grid[z]);
-			if (options.style) this.element.setStyle(options.modifiers[z], this.value.now[z] + options.unit);
-			else this.element[options.modifiers[z]] = this.value.now[z];
-		}
-	},
-
-	cancel: function(event){
-		this.document.removeEvents({
-			mousemove: this.bound.check,
-			mouseup: this.bound.cancel,
-			touchmove: this.bound.check,
-			touchend: this.bound.cancel
-		});
-		if (event){
-			this.document.removeEvent(this.selection, this.bound.eventStop);
-			this.fireEvent('cancel', this.element);
-		}
-	},
-
-	stop: function(event){
-		var events = {
-			mousemove: this.bound.drag,
-			mouseup: this.bound.stop,
-			touchmove: this.bound.drag,
-			touchend: this.bound.stop
-		};
-		events[this.selection] = this.bound.eventStop;
-		this.document.removeEvents(events);
-		this.mouse.start = null;
-		if (event) this.fireEvent('complete', [this.element, event]);
-	}
-
-});
-
-})();
-
-
-Element.implement({
-
-	makeResizable: function(options){
-		var drag = new Drag(this, Object.merge({
-			modifiers: {
-				x: 'width',
-				y: 'height'
-			}
-		}, options));
-
-		this.store('resizer', drag);
-		return drag.addEvent('drag', function(){
-			this.fireEvent('resize', drag);
-		}.bind(this));
-	}
-
-});
-
-/*
----
-
-script: Drag.Move.js
-
-name: Drag.Move
-
-description: A Drag extension that provides support for the constraining of draggables to containers and droppables.
-
-license: MIT-style license
-
-authors:
-  - Valerio Proietti
-  - Tom Occhinno
-  - Jan Kassens
-  - Aaron Newton
-  - Scott Kyle
-
-requires:
-  - Core/Element.Dimensions
-  - Drag
-
-provides: [Drag.Move]
-
-...
-*/
-
-Drag.Move = new Class({
-
-	Extends: Drag,
-
-	options: {/*
-		onEnter: function(thisElement, overed){},
-		onLeave: function(thisElement, overed){},
-		onDrop: function(thisElement, overed, event){},*/
-		droppables: [],
-		container: false,
-		precalculate: false,
-		includeMargins: true,
-		checkDroppables: true
-	},
-
-	initialize: function(element, options){
-		this.parent(element, options);
-		element = this.element;
-
-		this.droppables = $$(this.options.droppables);
-		this.setContainer(this.options.container);
-
-		if (this.options.style){
-			if (this.options.modifiers.x == 'left' && this.options.modifiers.y == 'top'){
-				var parent = element.getOffsetParent(),
-					styles = element.getStyles('left', 'top');
-				if (parent && (styles.left == 'auto' || styles.top == 'auto')){
-					element.setPosition(element.getPosition(parent));
-				}
-			}
-
-			if (element.getStyle('position') == 'static') element.setStyle('position', 'absolute');
-		}
-
-		this.addEvent('start', this.checkDroppables, true);
-		this.overed = null;
-	},
-
-	setContainer: function(container){
-		this.container = document.id(container);
-		if (this.container && typeOf(this.container) != 'element'){
-			this.container = document.id(this.container.getDocument().body);
-		}
-	},
-
-	start: function(event){
-		if (this.container) this.options.limit = this.calculateLimit();
-
-		if (this.options.precalculate){
-			this.positions = this.droppables.map(function(el){
-				return el.getCoordinates();
-			});
-		}
-
-		this.parent(event);
-	},
-
-	calculateLimit: function(){
-		var element = this.element,
-			container = this.container,
-
-			offsetParent = document.id(element.getOffsetParent()) || document.body,
-			containerCoordinates = container.getCoordinates(offsetParent),
-			elementMargin = {},
-			elementBorder = {},
-			containerMargin = {},
-			containerBorder = {},
-			offsetParentPadding = {},
-			offsetScroll = offsetParent.getScroll();
-
-		['top', 'right', 'bottom', 'left'].each(function(pad){
-			elementMargin[pad] = element.getStyle('margin-' + pad).toInt();
-			elementBorder[pad] = element.getStyle('border-' + pad).toInt();
-			containerMargin[pad] = container.getStyle('margin-' + pad).toInt();
-			containerBorder[pad] = container.getStyle('border-' + pad).toInt();
-			offsetParentPadding[pad] = offsetParent.getStyle('padding-' + pad).toInt();
-		}, this);
-
-		var width = element.offsetWidth + elementMargin.left + elementMargin.right,
-			height = element.offsetHeight + elementMargin.top + elementMargin.bottom,
-			left = 0 + offsetScroll.x,
-			top = 0 + offsetScroll.y,
-			right = containerCoordinates.right - containerBorder.right - width + offsetScroll.x,
-			bottom = containerCoordinates.bottom - containerBorder.bottom - height + offsetScroll.y;
-
-		if (this.options.includeMargins){
-			left += elementMargin.left;
-			top += elementMargin.top;
-		} else {
-			right += elementMargin.right;
-			bottom += elementMargin.bottom;
-		}
-
-		if (element.getStyle('position') == 'relative'){
-			var coords = element.getCoordinates(offsetParent);
-			coords.left -= element.getStyle('left').toInt();
-			coords.top -= element.getStyle('top').toInt();
-
-			left -= coords.left;
-			top -= coords.top;
-			if (container.getStyle('position') != 'relative'){
-				left += containerBorder.left;
-				top += containerBorder.top;
-			}
-			right += elementMargin.left - coords.left;
-			bottom += elementMargin.top - coords.top;
-
-			if (container != offsetParent){
-				left += containerMargin.left + offsetParentPadding.left;
-				if (!offsetParentPadding.left && left < 0) left = 0;
-				top += offsetParent == document.body ? 0 : containerMargin.top + offsetParentPadding.top;
-				if (!offsetParentPadding.top && top < 0) top = 0;
-			}
-		} else {
-			left -= elementMargin.left;
-			top -= elementMargin.top;
-			if (container != offsetParent){
-				left += containerCoordinates.left + containerBorder.left;
-				top += containerCoordinates.top + containerBorder.top;
-			}
-		}
-
-		return {
-			x: [left, right],
-			y: [top, bottom]
-		};
-	},
-
-	getDroppableCoordinates: function(element){
-		var position = element.getCoordinates();
-		if (element.getStyle('position') == 'fixed'){
-			var scroll = window.getScroll();
-			position.left += scroll.x;
-			position.right += scroll.x;
-			position.top += scroll.y;
-			position.bottom += scroll.y;
-		}
-		return position;
-	},
-
-	checkDroppables: function(){
-		var overed = this.droppables.filter(function(el, i){
-			el = this.positions ? this.positions[i] : this.getDroppableCoordinates(el);
-			var now = this.mouse.now;
-			return (now.x > el.left && now.x < el.right && now.y < el.bottom && now.y > el.top);
-		}, this).getLast();
-
-		if (this.overed != overed){
-			if (this.overed) this.fireEvent('leave', [this.element, this.overed]);
-			if (overed) this.fireEvent('enter', [this.element, overed]);
-			this.overed = overed;
-		}
-	},
-
-	drag: function(event){
-		this.parent(event);
-		if (this.options.checkDroppables && this.droppables.length) this.checkDroppables();
-	},
-
-	stop: function(event){
-		this.checkDroppables();
-		this.fireEvent('drop', [this.element, this.overed, event]);
-		this.overed = null;
-		return this.parent(event);
-	}
-
-});
-
-Element.implement({
-
-	makeDraggable: function(options){
-		var drag = new Drag.Move(this, options);
-		this.store('dragger', drag);
-		return drag;
-	}
-
-});
-
-/*
----
-
-script: Element.Measure.js
-
-name: Element.Measure
-
-description: Extends the Element native object to include methods useful in measuring dimensions.
-
-credits: "Element.measure / .expose methods by Daniel Steigerwald License: MIT-style license. Copyright: Copyright (c) 2008 Daniel Steigerwald, daniel.steigerwald.cz"
-
-license: MIT-style license
-
-authors:
-  - Aaron Newton
-
-requires:
-  - Core/Element.Style
-  - Core/Element.Dimensions
-  - MooTools.More
-
-provides: [Element.Measure]
-
-...
-*/
-
-(function(){
-
-var getStylesList = function(styles, planes){
-	var list = [];
-	Object.each(planes, function(directions){
-		Object.each(directions, function(edge){
-			styles.each(function(style){
-				list.push(style + '-' + edge + (style == 'border' ? '-width' : ''));
-			});
-		});
-	});
-	return list;
-};
-
-var calculateEdgeSize = function(edge, styles){
-	var total = 0;
-	Object.each(styles, function(value, style){
-		if (style.test(edge)) total = total + value.toInt();
-	});
-	return total;
-};
-
-var isVisible = function(el){
-	return !!(!el || el.offsetHeight || el.offsetWidth);
-};
-
-
-Element.implement({
-
-	measure: function(fn){
-		if (isVisible(this)) return fn.call(this);
-		var parent = this.getParent(),
-			toMeasure = [];
-		while (!isVisible(parent) && parent != document.body){
-			toMeasure.push(parent.expose());
-			parent = parent.getParent();
-		}
-		var restore = this.expose(),
-			result = fn.call(this);
-		restore();
-		toMeasure.each(function(restore){
-			restore();
-		});
-		return result;
-	},
-
-	expose: function(){
-		if (this.getStyle('display') != 'none') return function(){};
-		var before = this.style.cssText;
-		this.setStyles({
-			display: 'block',
-			position: 'absolute',
-			visibility: 'hidden'
-		});
-		return function(){
-			this.style.cssText = before;
-		}.bind(this);
-	},
-
-	getDimensions: function(options){
-		options = Object.merge({computeSize: false}, options);
-		var dim = {x: 0, y: 0};
-
-		var getSize = function(el, options){
-			return (options.computeSize) ? el.getComputedSize(options) : el.getSize();
-		};
-
-		var parent = this.getParent('body');
-
-		if (parent && this.getStyle('display') == 'none'){
-			dim = this.measure(function(){
-				return getSize(this, options);
-			});
-		} else if (parent){
-			try { //safari sometimes crashes here, so catch it
-				dim = getSize(this, options);
-			} catch (e){}
-		}
-
-		return Object.append(dim, (dim.x || dim.x === 0) ? {
-			width: dim.x,
-			height: dim.y
-		} : {
-			x: dim.width,
-			y: dim.height
-		});
-	},
-
-	getComputedSize: function(options){
-		
-
-		options = Object.merge({
-			styles: ['padding','border'],
-			planes: {
-				height: ['top','bottom'],
-				width: ['left','right']
-			},
-			mode: 'both'
-		}, options);
-
-		var styles = {},
-			size = {width: 0, height: 0},
-			dimensions;
-
-		if (options.mode == 'vertical'){
-			delete size.width;
-			delete options.planes.width;
-		} else if (options.mode == 'horizontal'){
-			delete size.height;
-			delete options.planes.height;
-		}
-
-		getStylesList(options.styles, options.planes).each(function(style){
-			styles[style] = this.getStyle(style).toInt();
-		}, this);
-
-		Object.each(options.planes, function(edges, plane){
-
-			var capitalized = plane.capitalize(),
-				style = this.getStyle(plane);
-
-			if (style == 'auto' && !dimensions) dimensions = this.getDimensions();
-
-			style = styles[plane] = (style == 'auto') ? dimensions[plane] : style.toInt();
-			size['total' + capitalized] = style;
-
-			edges.each(function(edge){
-				var edgesize = calculateEdgeSize(edge, styles);
-				size['computed' + edge.capitalize()] = edgesize;
-				size['total' + capitalized] += edgesize;
-			});
-
-		}, this);
-
-		return Object.append(size, styles);
-	}
-
-});
-
-})();
-
-/*
----
-
-script: Slider.js
-
-name: Slider
-
-description: Class for creating horizontal and vertical slider controls.
-
-license: MIT-style license
-
-authors:
-  - Valerio Proietti
-
-requires:
-  - Core/Element.Dimensions
-  - Core/Number
-  - Class.Binds
-  - Drag
-  - Element.Measure
-
-provides: [Slider]
-
-...
-*/
-(function(){
-
-var Slider = this.Slider = new Class({
-
-	Implements: [Events, Options],
-
-	Binds: ['clickedElement', 'draggedKnob', 'scrolledElement'],
-
-	options: {/*
-		onTick: function(intPosition){},
-		onMove: function(){},
-		onChange: function(intStep){},
-		onComplete: function(strStep){},*/
-		onTick: function(position){
-			this.setKnobPosition(position);
-		},
-		initialStep: 0,
-		snap: false,
-		offset: 0,
-		range: false,
-		wheel: false,
-		steps: 100,
-		mode: 'horizontal'
-	},
-
-	initialize: function(element, knob, options){
-		this.setOptions(options);
-		options = this.options;
-		this.element = document.id(element);
-		knob = this.knob = document.id(knob);
-		this.previousChange = this.previousEnd = this.step = options.initialStep ? options.initialStep : options.range ? options.range[0] : 0;
-
-		var limit = {},
-			modifiers = {x: false, y: false};
-
-		switch (options.mode){
-			case 'vertical':
-				this.axis = 'y';
-				this.property = 'top';
-				this.offset = 'offsetHeight';
-				break;
-			case 'horizontal':
-				this.axis = 'x';
-				this.property = 'left';
-				this.offset = 'offsetWidth';
-		}
-
-		this.setSliderDimensions();
-		this.setRange(options.range, null, true);
-
-		if (knob.getStyle('position') == 'static') knob.setStyle('position', 'relative');
-		knob.setStyle(this.property, -options.offset);
-		modifiers[this.axis] = this.property;
-		limit[this.axis] = [-options.offset, this.full - options.offset];
-
-		var dragOptions = {
-			snap: 0,
-			limit: limit,
-			modifiers: modifiers,
-			onDrag: this.draggedKnob,
-			onStart: this.draggedKnob,
-			onBeforeStart: (function(){
-				this.isDragging = true;
-			}).bind(this),
-			onCancel: function(){
-				this.isDragging = false;
-			}.bind(this),
-			onComplete: function(){
-				this.isDragging = false;
-				this.draggedKnob();
-				this.end();
-			}.bind(this)
-		};
-		if (options.snap) this.setSnap(dragOptions);
-
-		this.drag = new Drag(knob, dragOptions);
-		if (options.initialStep != null) this.set(options.initialStep, true);
-		this.attach();
-	},
-
-	attach: function(){
-		this.element.addEvent('mousedown', this.clickedElement);
-		if (this.options.wheel) this.element.addEvent('mousewheel', this.scrolledElement);
-		this.drag.attach();
-		return this;
-	},
-
-	detach: function(){
-		this.element.removeEvent('mousedown', this.clickedElement)
-			.removeEvent('mousewheel', this.scrolledElement);
-		this.drag.detach();
-		return this;
-	},
-
-	autosize: function(){
-		this.setSliderDimensions()
-			.setKnobPosition(this.toPosition(this.step));
-		this.drag.options.limit[this.axis] = [-this.options.offset, this.full - this.options.offset];
-		if (this.options.snap) this.setSnap();
-		return this;
-	},
-
-	setSnap: function(options){
-		if (!options) options = this.drag.options;
-		options.grid = Math.ceil(this.stepWidth);
-		options.limit[this.axis][1] = this.element[this.offset];
-		return this;
-	},
-
-	setKnobPosition: function(position){
-		if (this.options.snap) position = this.toPosition(this.step);
-		this.knob.setStyle(this.property, position);
-		return this;
-	},
-
-	setSliderDimensions: function(){
-		this.full = this.element.measure(function(){
-			this.half = this.knob[this.offset] / 2;
-			return this.element[this.offset] - this.knob[this.offset] + (this.options.offset * 2);
-		}.bind(this));
-		return this;
-	},
-
-	set: function(step, silently){
-		if (!((this.range > 0) ^ (step < this.min))) step = this.min;
-		if (!((this.range > 0) ^ (step > this.max))) step = this.max;
-
-		this.step = (step).round(this.modulus.decimalLength);
-		if (silently) this.checkStep().setKnobPosition(this.toPosition(this.step));
-		else this.checkStep().fireEvent('tick', this.toPosition(this.step)).fireEvent('move').end();
-		return this;
-	},
-
-	setRange: function(range, pos, silently){
-		this.min = Array.pick([range[0], 0]);
-		this.max = Array.pick([range[1], this.options.steps]);
-		this.range = this.max - this.min;
-		this.steps = this.options.steps || this.full;
-		var stepSize = this.stepSize = Math.abs(this.range) / this.steps;
-		this.stepWidth = this.stepSize * this.full / Math.abs(this.range);
-		this.setModulus();
-
-		if (range) this.set(Array.pick([pos, this.step]).limit(this.min,this.max), silently);
-		return this;
-	},
-
-	setModulus: function(){
-		var decimals = ((this.stepSize + '').split('.')[1] || []).length,
-			modulus = 1 + '';
-		while (decimals--) modulus += '0';
-		this.modulus = {multiplier: (modulus).toInt(10), decimalLength: modulus.length - 1};
-	},
-
-	clickedElement: function(event){
-		if (this.isDragging || event.target == this.knob) return;
-
-		var dir = this.range < 0 ? -1 : 1,
-			position = event.page[this.axis] - this.element.getPosition()[this.axis] - this.half;
-
-		position = position.limit(-this.options.offset, this.full - this.options.offset);
-
-		this.step = (this.min + dir * this.toStep(position)).round(this.modulus.decimalLength);
-
-		this.checkStep()
-			.fireEvent('tick', position)
-			.fireEvent('move')
-			.end();
-	},
-
-	scrolledElement: function(event){
-		var mode = (this.options.mode == 'horizontal') ? (event.wheel < 0) : (event.wheel > 0);
-		this.set(this.step + (mode ? -1 : 1) * this.stepSize);
-		event.stop();
-	},
-
-	draggedKnob: function(){
-		var dir = this.range < 0 ? -1 : 1,
-			position = this.drag.value.now[this.axis];
-
-		position = position.limit(-this.options.offset, this.full -this.options.offset);
-
-		this.step = (this.min + dir * this.toStep(position)).round(this.modulus.decimalLength);
-		this.checkStep();
-		this.fireEvent('move');
-	},
-
-	checkStep: function(){
-		var step = this.step;
-		if (this.previousChange != step){
-			this.previousChange = step;
-			this.fireEvent('change', step);
-		}
-		return this;
-	},
-
-	end: function(){
-		var step = this.step;
-		if (this.previousEnd !== step){
-			this.previousEnd = step;
-			this.fireEvent('complete', step + '');
-		}
-		return this;
-	},
-
-	toStep: function(position){
-		var step = (position + this.options.offset) * this.stepSize / this.full * this.steps;
-		return this.options.steps ? (step - (step * this.modulus.multiplier) % (this.stepSize * this.modulus.multiplier) / this.modulus.multiplier).round(this.modulus.decimalLength) : step;
-	},
-
-	toPosition: function(step){
-		return (this.full * Math.abs(this.min - step)) / (this.steps * this.stepSize) - this.options.offset || 0;
-	}
-
-});
-
-})();
-
-
-/*
----
-
-script: Sortables.js
-
-name: Sortables
-
-description: Class for creating a drag and drop sorting interface for lists of items.
-
-license: MIT-style license
-
-authors:
-  - Tom Occhino
-
-requires:
-  - Core/Fx.Morph
-  - Drag.Move
-
-provides: [Sortables]
-
-...
-*/
-(function(){
-
-var Sortables = this.Sortables = new Class({
-
-	Implements: [Events, Options],
-
-	options: {/*
-		onSort: function(element, clone){},
-		onStart: function(element, clone){},
-		onComplete: function(element){},*/
-		opacity: 1,
-		clone: false,
-		revert: false,
-		handle: false,
-		dragOptions: {},
-		unDraggableTags: ['button', 'input', 'a', 'textarea', 'select', 'option']
-	},
-
-	initialize: function(lists, options){
-		this.setOptions(options);
-
-		this.elements = [];
-		this.lists = [];
-		this.idle = true;
-
-		this.addLists($$(document.id(lists) || lists));
-
-		if (!this.options.clone) this.options.revert = false;
-		if (this.options.revert) this.effect = new Fx.Morph(null, Object.merge({
-			duration: 250,
-			link: 'cancel'
-		}, this.options.revert));
-	},
-
-	attach: function(){
-		this.addLists(this.lists);
-		return this;
-	},
-
-	detach: function(){
-		this.lists = this.removeLists(this.lists);
-		return this;
-	},
-
-	addItems: function(){
-		Array.flatten(arguments).each(function(element){
-			this.elements.push(element);
-			var start = element.retrieve('sortables:start', function(event){
-				this.start.call(this, event, element);
-			}.bind(this));
-			(this.options.handle ? element.getElement(this.options.handle) || element : element).addEvent('mousedown', start);
-		}, this);
-		return this;
-	},
-
-	addLists: function(){
-		Array.flatten(arguments).each(function(list){
-			this.lists.include(list);
-			this.addItems(list.getChildren());
-		}, this);
-		return this;
-	},
-
-	removeItems: function(){
-		return $$(Array.flatten(arguments).map(function(element){
-			this.elements.erase(element);
-			var start = element.retrieve('sortables:start');
-			(this.options.handle ? element.getElement(this.options.handle) || element : element).removeEvent('mousedown', start);
-
-			return element;
-		}, this));
-	},
-
-	removeLists: function(){
-		return $$(Array.flatten(arguments).map(function(list){
-			this.lists.erase(list);
-			this.removeItems(list.getChildren());
-
-			return list;
-		}, this));
-	},
-
-	getDroppableCoordinates: function(element){
-		var offsetParent = element.getOffsetParent();
-		var position = element.getPosition(offsetParent);
-		var scroll = {
-			w: window.getScroll(),
-			offsetParent: offsetParent.getScroll()
-		};
-		position.x += scroll.offsetParent.x;
-		position.y += scroll.offsetParent.y;
-
-		if (offsetParent.getStyle('position') == 'fixed'){
-			position.x -= scroll.w.x;
-			position.y -= scroll.w.y;
-		}
-
-		return position;
-	},
-
-	getClone: function(event, element){
-		if (!this.options.clone) return new Element(element.tagName).inject(document.body);
-		if (typeOf(this.options.clone) == 'function') return this.options.clone.call(this, event, element, this.list);
-		var clone = element.clone(true).setStyles({
-			margin: 0,
-			position: 'absolute',
-			visibility: 'hidden',
-			width: element.getStyle('width')
-		}).addEvent('mousedown', function(event){
-			element.fireEvent('mousedown', event);
-		});
-		//prevent the duplicated radio inputs from unchecking the real one
-		if (clone.get('html').test('radio')){
-			clone.getElements('input[type=radio]').each(function(input, i){
-				input.set('name', 'clone_' + i);
-				if (input.get('checked')) element.getElements('input[type=radio]')[i].set('checked', true);
-			});
-		}
-
-		return clone.inject(this.list).setPosition(this.getDroppableCoordinates(this.element));
-	},
-
-	getDroppables: function(){
-		var droppables = this.list.getChildren().erase(this.clone).erase(this.element);
-		if (!this.options.constrain) droppables.append(this.lists).erase(this.list);
-		return droppables;
-	},
-
-	insert: function(dragging, element){
-		var where = 'inside';
-		if (this.lists.contains(element)){
-			this.list = element;
-			this.drag.droppables = this.getDroppables();
-		} else {
-			where = this.element.getAllPrevious().contains(element) ? 'before' : 'after';
-		}
-		this.element.inject(element, where);
-		this.fireEvent('sort', [this.element, this.clone]);
-	},
-
-	start: function(event, element){
-		if (
-			!this.idle ||
-			event.rightClick ||
-			(!this.options.handle && this.options.unDraggableTags.contains(event.target.get('tag')))
-		) return;
-
-		this.idle = false;
-		this.element = element;
-		this.opacity = element.getStyle('opacity');
-		this.list = element.getParent();
-		this.clone = this.getClone(event, element);
-
-		this.drag = new Drag.Move(this.clone, Object.merge({
-			
-			droppables: this.getDroppables()
-		}, this.options.dragOptions)).addEvents({
-			onSnap: function(){
-				event.stop();
-				this.clone.setStyle('visibility', 'visible');
-				this.element.setStyle('opacity', this.options.opacity || 0);
-				this.fireEvent('start', [this.element, this.clone]);
-			}.bind(this),
-			onEnter: this.insert.bind(this),
-			onCancel: this.end.bind(this),
-			onComplete: this.end.bind(this)
-		});
-
-		this.clone.inject(this.element, 'before');
-		this.drag.start(event);
-	},
-
-	end: function(){
-		this.drag.detach();
-		this.element.setStyle('opacity', this.opacity);
-		var self = this;
-		if (this.effect){
-			var dim = this.element.getStyles('width', 'height'),
-				clone = this.clone,
-				pos = clone.computePosition(this.getDroppableCoordinates(clone));
-
-			var destroy = function(){
-				this.removeEvent('cancel', destroy);
-				clone.destroy();
-				self.reset();
-			};
-
-			this.effect.element = clone;
-			this.effect.start({
-				top: pos.top,
-				left: pos.left,
-				width: dim.width,
-				height: dim.height,
-				opacity: 0.25
-			}).addEvent('cancel', destroy).chain(destroy);
-		} else {
-			this.clone.destroy();
-			self.reset();
-		}
-
-	},
-
-	reset: function(){
-		this.idle = true;
-		this.fireEvent('complete', this.element);
-	},
-
-	serialize: function(){
-		var params = Array.link(arguments, {
-			modifier: Type.isFunction,
-			index: function(obj){
-				return obj != null;
-			}
-		});
-		var serial = this.lists.map(function(list){
-			return list.getChildren().map(params.modifier || function(element){
-				return element.get('id');
-			}, this);
-		}, this);
-
-		var index = params.index;
-		if (this.lists.length == 1) index = 0;
-		return (index || index === 0) && index >= 0 && index < this.lists.length ? serial[index] : serial;
-	}
-
-});
-
-})();
-
-/*
----
-
-name: Element.Event.Pseudos
-
-description: Adds the functionality to add pseudo events for Elements
-
-license: MIT-style license
-
-authors:
-  - Arian Stolwijk
-
-requires: [Core/Element.Event, Core/Element.Delegation, Events.Pseudos]
-
-provides: [Element.Event.Pseudos, Element.Delegation.Pseudo]
-
-...
-*/
-
-(function(){
-
-var pseudos = {relay: false},
-	copyFromEvents = ['once', 'throttle', 'pause'],
-	count = copyFromEvents.length;
-
-while (count--) pseudos[copyFromEvents[count]] = Events.lookupPseudo(copyFromEvents[count]);
-
-DOMEvent.definePseudo = function(key, listener){
-	pseudos[key] = listener;
-	return this;
-};
-
-var proto = Element.prototype;
-[Element, Window, Document].invoke('implement', Events.Pseudos(pseudos, proto.addEvent, proto.removeEvent));
-
-})();
-
-/*
----
-
-name: Element.Event.Pseudos.Keys
-
-description: Adds functionality fire events if certain keycombinations are pressed
-
-license: MIT-style license
-
-authors:
-  - Arian Stolwijk
-
-requires: [Element.Event.Pseudos]
-
-provides: [Element.Event.Pseudos.Keys]
-
-...
-*/
-
-(function(){
-
-var keysStoreKey = '$moo:keys-pressed',
-	keysKeyupStoreKey = '$moo:keys-keyup';
-
-
-DOMEvent.definePseudo('keys', function(split, fn, args){
-
-	var event = args[0],
-		keys = [],
-		pressed = this.retrieve(keysStoreKey, []),
-		value = split.value;
-
-	if (value != '+') keys.append(value.replace('++', function(){
-		keys.push('+'); // shift++ and shift+++a
-		return '';
-	}).split('+'));
-	else keys = ['+'];
-
-	pressed.include(event.key);
-
-	if (keys.every(function(key){
-		return pressed.contains(key);
-	})) fn.apply(this, args);
-
-	this.store(keysStoreKey, pressed);
-
-	if (!this.retrieve(keysKeyupStoreKey)){
-		var keyup = function(event){
-			(function(){
-				pressed = this.retrieve(keysStoreKey, []).erase(event.key);
-				this.store(keysStoreKey, pressed);
-			}).delay(0, this); // Fix for IE
-		};
-		this.store(keysKeyupStoreKey, keyup).addEvent('keyup', keyup);
-	}
-
-});
-
-DOMEvent.defineKeys({
-	'16': 'shift',
-	'17': 'control',
-	'18': 'alt',
-	'20': 'capslock',
-	'33': 'pageup',
-	'34': 'pagedown',
-	'35': 'end',
-	'36': 'home',
-	'144': 'numlock',
-	'145': 'scrolllock',
-	'186': ';',
-	'187': '=',
-	'188': ',',
-	'190': '.',
-	'191': '/',
-	'192': '`',
-	'219': '[',
-	'220': '\\',
-	'221': ']',
-	'222': "'",
-	'107': '+',
-	'109': '-', // subtract
-	'189': '-'  // dash
-});
-
-})();
-
-/*
----
-
-script: String.Extras.js
-
-name: String.Extras
-
-description: Extends the String native object to include methods useful in managing various kinds of strings (query strings, urls, html, etc).
-
-license: MIT-style license
-
-authors:
-  - Aaron Newton
-  - Guillermo Rauch
-  - Christopher Pitt
-
-requires:
-  - Core/String
-  - Core/Array
-  - MooTools.More
-
-provides: [String.Extras]
-
-...
-*/
-
-(function(){
-
-var special = {
-		'a': /[àáâãäåăą]/g,
-		'A': /[ÀÁÂÃÄÅĂĄ]/g,
-		'c': /[ćčç]/g,
-		'C': /[ĆČÇ]/g,
-		'd': /[ďđ]/g,
-		'D': /[ĎÐ]/g,
-		'e': /[èéêëěę]/g,
-		'E': /[ÈÉÊËĚĘ]/g,
-		'g': /[ğ]/g,
-		'G': /[Ğ]/g,
-		'i': /[ìíîï]/g,
-		'I': /[ÌÍÎÏ]/g,
-		'l': /[ĺľł]/g,
-		'L': /[ĹĽŁ]/g,
-		'n': /[ñňń]/g,
-		'N': /[ÑŇŃ]/g,
-		'o': /[òóôõöøő]/g,
-		'O': /[ÒÓÔÕÖØ]/g,
-		'r': /[řŕ]/g,
-		'R': /[ŘŔ]/g,
-		's': /[ššş]/g,
-		'S': /[ŠŞŚ]/g,
-		't': /[ťţ]/g,
-		'T': /[ŤŢ]/g,
-		'u': /[ùúûůüµ]/g,
-		'U': /[ÙÚÛŮÜ]/g,
-		'y': /[ÿý]/g,
-		'Y': /[ŸÝ]/g,
-		'z': /[žźż]/g,
-		'Z': /[ŽŹŻ]/g,
-		'th': /[þ]/g,
-		'TH': /[Þ]/g,
-		'dh': /[ð]/g,
-		'DH': /[Ð]/g,
-		'ss': /[ß]/g,
-		'oe': /[œ]/g,
-		'OE': /[Œ]/g,
-		'ae': /[æ]/g,
-		'AE': /[Æ]/g
-	},
-
-	tidy = {
-		' ': /[\xa0\u2002\u2003\u2009]/g,
-		'*': /[\xb7]/g,
-		'\'': /[\u2018\u2019]/g,
-		'"': /[\u201c\u201d]/g,
-		'...': /[\u2026]/g,
-		'-': /[\u2013]/g,
-	//	'--': /[\u2014]/g,
-		'&raquo;': /[\uFFFD]/g
-	},
-
-	conversions = {
-		ms: 1,
-		s: 1000,
-		m: 6e4,
-		h: 36e5
-	},
-
-	findUnits = /(\d*.?\d+)([msh]+)/;
-
-var walk = function(string, replacements){
-	var result = string, key;
-	for (key in replacements) result = result.replace(replacements[key], key);
-	return result;
-};
-
-var getRegexForTag = function(tag, contents){
-	tag = tag || (contents ? '' : '\\w+');
-	var regstr = contents ? '<' + tag + '(?!\\w)[^>]*>([\\s\\S]*?)<\/' + tag + '(?!\\w)>' : '<\/?' + tag + '\/?>|<' + tag + '[\\s|\/][^>]*>';
-	return new RegExp(regstr, 'gi');
-};
-
-String.implement({
-
-	standardize: function(){
-		return walk(this, special);
-	},
-
-	repeat: function(times){
-		return new Array(times + 1).join(this);
-	},
-
-	pad: function(length, str, direction){
-		if (this.length >= length) return this;
-
-		var pad = (str == null ? ' ' : '' + str)
-			.repeat(length - this.length)
-			.substr(0, length - this.length);
-
-		if (!direction || direction == 'right') return this + pad;
-		if (direction == 'left') return pad + this;
-
-		return pad.substr(0, (pad.length / 2).floor()) + this + pad.substr(0, (pad.length / 2).ceil());
-	},
-
-	getTags: function(tag, contents){
-		return this.match(getRegexForTag(tag, contents)) || [];
-	},
-
-	stripTags: function(tag, contents){
-		return this.replace(getRegexForTag(tag, contents), '');
-	},
-
-	tidy: function(){
-		return walk(this, tidy);
-	},
-
-	truncate: function(max, trail, atChar){
-		var string = this;
-		if (trail == null && arguments.length == 1) trail = '…';
-		if (string.length > max){
-			string = string.substring(0, max);
-			if (atChar){
-				var index = string.lastIndexOf(atChar);
-				if (index != -1) string = string.substr(0, index);
-			}
-			if (trail) string += trail;
-		}
-		return string;
-	},
-
-	ms: function(){
-		// "Borrowed" from https://gist.github.com/1503944
-		var units = findUnits.exec(this);
-		if (units == null) return Number(this);
-		return Number(units[1]) * conversions[units[2]];
-	}
-
-});
-
-})();
-
-/*
----
-
-script: Element.Forms.js
-
-name: Element.Forms
-
-description: Extends the Element native object to include methods useful in managing inputs.
-
-license: MIT-style license
-
-authors:
-  - Aaron Newton
-
-requires:
-  - Core/Element
-  - String.Extras
-  - MooTools.More
-
-provides: [Element.Forms]
-
-...
-*/
-
-Element.implement({
-
-	tidy: function(){
-		this.set('value', this.get('value').tidy());
-	},
-
-	getTextInRange: function(start, end){
-		return this.get('value').substring(start, end);
-	},
-
-	getSelectedText: function(){
-		if (this.setSelectionRange) return this.getTextInRange(this.getSelectionStart(), this.getSelectionEnd());
-		return document.selection.createRange().text;
-	},
-
-	getSelectedRange: function(){
-		if (this.selectionStart != null){
-			return {
-				start: this.selectionStart,
-				end: this.selectionEnd
-			};
-		}
-
-		var pos = {
-			start: 0,
-			end: 0
-		};
-		var range = this.getDocument().selection.createRange();
-		if (!range || range.parentElement() != this) return pos;
-		var duplicate = range.duplicate();
-
-		if (this.type == 'text'){
-			pos.start = 0 - duplicate.moveStart('character', -100000);
-			pos.end = pos.start + range.text.length;
-		} else {
-			var value = this.get('value');
-			var offset = value.length;
-			duplicate.moveToElementText(this);
-			duplicate.setEndPoint('StartToEnd', range);
-			if (duplicate.text.length) offset -= value.match(/[\n\r]*$/)[0].length;
-			pos.end = offset - duplicate.text.length;
-			duplicate.setEndPoint('StartToStart', range);
-			pos.start = offset - duplicate.text.length;
-		}
-		return pos;
-	},
-
-	getSelectionStart: function(){
-		return this.getSelectedRange().start;
-	},
-
-	getSelectionEnd: function(){
-		return this.getSelectedRange().end;
-	},
-
-	setCaretPosition: function(pos){
-		if (pos == 'end') pos = this.get('value').length;
-		this.selectRange(pos, pos);
-		return this;
-	},
-
-	getCaretPosition: function(){
-		return this.getSelectedRange().start;
-	},
-
-	selectRange: function(start, end){
-		if (this.setSelectionRange){
-			this.focus();
-			this.setSelectionRange(start, end);
-		} else {
-			var value = this.get('value');
-			var diff = value.substr(start, end - start).replace(/\r/g, '').length;
-			start = value.substr(0, start).replace(/\r/g, '').length;
-			var range = this.createTextRange();
-			range.collapse(true);
-			range.moveEnd('character', start + diff);
-			range.moveStart('character', start);
-			range.select();
-		}
-		return this;
-	},
-
-	insertAtCursor: function(value, select){
-		var pos = this.getSelectedRange();
-		var text = this.get('value');
-		this.set('value', text.substring(0, pos.start) + value + text.substring(pos.end, text.length));
-		if (select !== false) this.selectRange(pos.start, pos.start + value.length);
-		else this.setCaretPosition(pos.start + value.length);
-		return this;
-	},
-
-	insertAroundCursor: function(options, select){
-		options = Object.append({
-			before: '',
-			defaultMiddle: '',
-			after: ''
-		}, options);
-
-		var value = this.getSelectedText() || options.defaultMiddle;
-		var pos = this.getSelectedRange();
-		var text = this.get('value');
-
-		if (pos.start == pos.end){
-			this.set('value', text.substring(0, pos.start) + options.before + value + options.after + text.substring(pos.end, text.length));
-			this.selectRange(pos.start + options.before.length, pos.end + options.before.length + value.length);
-		} else {
-			var current = text.substring(pos.start, pos.end);
-			this.set('value', text.substring(0, pos.start) + options.before + current + options.after + text.substring(pos.end, text.length));
-			var selStart = pos.start + options.before.length;
-			if (select !== false) this.selectRange(selStart, selStart + current.length);
-			else this.setCaretPosition(selStart + text.length);
-		}
-		return this;
-	}
-
-});
-
-/*
----
-
-script: Element.Pin.js
-
-name: Element.Pin
-
-description: Extends the Element native object to include the pin method useful for fixed positioning for elements.
-
-license: MIT-style license
-
-authors:
-  - Aaron Newton
-
-requires:
-  - Core/Element.Event
-  - Core/Element.Dimensions
-  - Core/Element.Style
-  - MooTools.More
-
-provides: [Element.Pin]
-
-...
-*/
-
-(function(){
-var supportsPositionFixed = false,
-	supportTested = false;
-
-var testPositionFixed = function(){
-	var test = new Element('div').setStyles({
-		position: 'fixed',
-		top: 0,
-		right: 0
-	}).inject(document.body);
-	supportsPositionFixed = (test.offsetTop === 0);
-	test.dispose();
-	supportTested = true;
-};
-
-Element.implement({
-
-	pin: function(enable, forceScroll){
-		if (!supportTested) testPositionFixed();
-		if (this.getStyle('display') == 'none') return this;
-
-		var pinnedPosition,
-			scroll = window.getScroll(),
-			parent,
-			scrollFixer;
-
-		if (enable !== false){
-			pinnedPosition = this.getPosition();
-			if (!this.retrieve('pin:_pinned')){
-				var currentPosition = {
-					top: pinnedPosition.y - scroll.y,
-					left: pinnedPosition.x - scroll.x,
-					margin: '0px',
-					padding: '0px'
-				};
-
-				if (supportsPositionFixed && !forceScroll){
-					this.setStyle('position', 'fixed').setStyles(currentPosition);
-				} else {
-
-					parent = this.getOffsetParent();
-					var position = this.getPosition(parent),
-						styles = this.getStyles('left', 'top');
-
-					if (parent && styles.left == 'auto' || styles.top == 'auto') this.setPosition(position);
-					if (this.getStyle('position') == 'static') this.setStyle('position', 'absolute');
-
-					position = {
-						x: styles.left.toInt() - scroll.x,
-						y: styles.top.toInt() - scroll.y
-					};
-
-					scrollFixer = function(){
-						if (!this.retrieve('pin:_pinned')) return;
-						var scroll = window.getScroll();
-						this.setStyles({
-							left: position.x + scroll.x,
-							top: position.y + scroll.y
-						});
-					}.bind(this);
-
-					this.store('pin:_scrollFixer', scrollFixer);
-					window.addEvent('scroll', scrollFixer);
-				}
-				this.store('pin:_pinned', true);
-			}
-
-		} else {
-			if (!this.retrieve('pin:_pinned')) return this;
-
-			parent = this.getParent();
-			var offsetParent = (parent.getComputedStyle('position') != 'static' ? parent : parent.getOffsetParent());
-
-			pinnedPosition = this.getPosition();
-
-			this.store('pin:_pinned', false);
-			scrollFixer = this.retrieve('pin:_scrollFixer');
-			if (!scrollFixer){
-				this.setStyles({
-					position: 'absolute',
-					top: pinnedPosition.y + scroll.y,
-					left: pinnedPosition.x + scroll.x
-				});
-			} else {
-				this.store('pin:_scrollFixer', null);
-				window.removeEvent('scroll', scrollFixer);
-			}
-			this.removeClass('isPinned');
-		}
-		return this;
-	},
-
-	unpin: function(){
-		return this.pin(false);
-	},
-
-	togglePin: function(){
-		return this.pin(!this.retrieve('pin:_pinned'));
-	}
-
-});
-
-
-
-})();
-
-/*
----
-
-script: Element.Position.js
-
-name: Element.Position
-
-description: Extends the Element native object to include methods useful positioning elements relative to others.
-
-license: MIT-style license
-
-authors:
-  - Aaron Newton
-  - Jacob Thornton
-
-requires:
-  - Core/Options
-  - Core/Element.Dimensions
-  - Element.Measure
-
-provides: [Element.Position]
-
-...
-*/
-
-(function(original){
-
-var local = Element.Position = {
-
-	options: {/*
-		edge: false,
-		returnPos: false,
-		minimum: {x: 0, y: 0},
-		maximum: {x: 0, y: 0},
-		relFixedPosition: false,
-		ignoreMargins: false,
-		ignoreScroll: false,
-		allowNegative: false,*/
-		relativeTo: document.body,
-		position: {
-			x: 'center', //left, center, right
-			y: 'center' //top, center, bottom
-		},
-		offset: {x: 0, y: 0}
-	},
-
-	getOptions: function(element, options){
-		options = Object.merge({}, local.options, options);
-		local.setPositionOption(options);
-		local.setEdgeOption(options);
-		local.setOffsetOption(element, options);
-		local.setDimensionsOption(element, options);
-		return options;
-	},
-
-	setPositionOption: function(options){
-		options.position = local.getCoordinateFromValue(options.position);
-	},
-
-	setEdgeOption: function(options){
-		var edgeOption = local.getCoordinateFromValue(options.edge);
-		options.edge = edgeOption ? edgeOption :
-			(options.position.x == 'center' && options.position.y == 'center') ? {x: 'center', y: 'center'} :
-			{x: 'left', y: 'top'};
-	},
-
-	setOffsetOption: function(element, options){
-		var parentOffset = {x: 0, y: 0};
-		var parentScroll = {x: 0, y: 0};
-		var offsetParent = element.measure(function(){
-			return document.id(this.getOffsetParent());
-		});
-
-		if (!offsetParent || offsetParent == element.getDocument().body) return;
-
-		parentScroll = offsetParent.getScroll();
-		parentOffset = offsetParent.measure(function(){
-			var position = this.getPosition();
-			if (this.getStyle('position') == 'fixed'){
-				var scroll = window.getScroll();
-				position.x += scroll.x;
-				position.y += scroll.y;
-			}
-			return position;
-		});
-
-		options.offset = {
-			parentPositioned: offsetParent != document.id(options.relativeTo),
-			x: options.offset.x - parentOffset.x + parentScroll.x,
-			y: options.offset.y - parentOffset.y + parentScroll.y
-		};
-	},
-
-	setDimensionsOption: function(element, options){
-		options.dimensions = element.getDimensions({
-			computeSize: true,
-			styles: ['padding', 'border', 'margin']
-		});
-	},
-
-	getPosition: function(element, options){
-		var position = {};
-		options = local.getOptions(element, options);
-		var relativeTo = document.id(options.relativeTo) || document.body;
-
-		local.setPositionCoordinates(options, position, relativeTo);
-		if (options.edge) local.toEdge(position, options);
-
-		var offset = options.offset;
-		position.left = ((position.x >= 0 || offset.parentPositioned || options.allowNegative) ? position.x : 0).toInt();
-		position.top = ((position.y >= 0 || offset.parentPositioned || options.allowNegative) ? position.y : 0).toInt();
-
-		local.toMinMax(position, options);
-
-		if (options.relFixedPosition || relativeTo.getStyle('position') == 'fixed') local.toRelFixedPosition(relativeTo, position);
-		if (options.ignoreScroll) local.toIgnoreScroll(relativeTo, position);
-		if (options.ignoreMargins) local.toIgnoreMargins(position, options);
-
-		position.left = Math.ceil(position.left);
-		position.top = Math.ceil(position.top);
-		delete position.x;
-		delete position.y;
-
-		return position;
-	},
-
-	setPositionCoordinates: function(options, position, relativeTo){
-		var offsetY = options.offset.y,
-			offsetX = options.offset.x,
-			calc = (relativeTo == document.body) ? window.getScroll() : relativeTo.getPosition(),
-			top = calc.y,
-			left = calc.x,
-			winSize = window.getSize();
-
-		switch (options.position.x){
-			case 'left': position.x = left + offsetX; break;
-			case 'right': position.x = left + offsetX + relativeTo.offsetWidth; break;
-			default: position.x = left + ((relativeTo == document.body ? winSize.x : relativeTo.offsetWidth) / 2) + offsetX; break;
-		}
-
-		switch (options.position.y){
-			case 'top': position.y = top + offsetY; break;
-			case 'bottom': position.y = top + offsetY + relativeTo.offsetHeight; break;
-			default: position.y = top + ((relativeTo == document.body ? winSize.y : relativeTo.offsetHeight) / 2) + offsetY; break;
-		}
-	},
-
-	toMinMax: function(position, options){
-		var xy = {left: 'x', top: 'y'}, value;
-		['minimum', 'maximum'].each(function(minmax){
-			['left', 'top'].each(function(lr){
-				value = options[minmax] ? options[minmax][xy[lr]] : null;
-				if (value != null && ((minmax == 'minimum') ? position[lr] < value : position[lr] > value)) position[lr] = value;
-			});
-		});
-	},
-
-	toRelFixedPosition: function(relativeTo, position){
-		var winScroll = window.getScroll();
-		position.top += winScroll.y;
-		position.left += winScroll.x;
-	},
-
-	toIgnoreScroll: function(relativeTo, position){
-		var relScroll = relativeTo.getScroll();
-		position.top -= relScroll.y;
-		position.left -= relScroll.x;
-	},
-
-	toIgnoreMargins: function(position, options){
-		position.left += options.edge.x == 'right'
-			? options.dimensions['margin-right']
-			: (options.edge.x != 'center'
-				? -options.dimensions['margin-left']
-				: -options.dimensions['margin-left'] + ((options.dimensions['margin-right'] + options.dimensions['margin-left']) / 2));
-
-		position.top += options.edge.y == 'bottom'
-			? options.dimensions['margin-bottom']
-			: (options.edge.y != 'center'
-				? -options.dimensions['margin-top']
-				: -options.dimensions['margin-top'] + ((options.dimensions['margin-bottom'] + options.dimensions['margin-top']) / 2));
-	},
-
-	toEdge: function(position, options){
-		var edgeOffset = {},
-			dimensions = options.dimensions,
-			edge = options.edge;
-
-		switch (edge.x){
-			case 'left': edgeOffset.x = 0; break;
-			case 'right': edgeOffset.x = -dimensions.x - dimensions.computedRight - dimensions.computedLeft; break;
-			// center
-			default: edgeOffset.x = -(Math.round(dimensions.totalWidth / 2)); break;
-		}
-
-		switch (edge.y){
-			case 'top': edgeOffset.y = 0; break;
-			case 'bottom': edgeOffset.y = -dimensions.y - dimensions.computedTop - dimensions.computedBottom; break;
-			// center
-			default: edgeOffset.y = -(Math.round(dimensions.totalHeight / 2)); break;
-		}
-
-		position.x += edgeOffset.x;
-		position.y += edgeOffset.y;
-	},
-
-	getCoordinateFromValue: function(option){
-		if (typeOf(option) != 'string') return option;
-		option = option.toLowerCase();
-
-		return {
-			x: option.test('left') ? 'left'
-				: (option.test('right') ? 'right' : 'center'),
-			y: option.test(/upper|top/) ? 'top'
-				: (option.test('bottom') ? 'bottom' : 'center')
-		};
-	}
-
-};
-
-Element.implement({
-
-	position: function(options){
-		if (options && (options.x != null || options.y != null)){
-			return (original ? original.apply(this, arguments) : this);
-		}
-		var position = this.setStyle('position', 'absolute').calculatePosition(options);
-		return (options && options.returnPos) ? position : this.setStyles(position);
-	},
-
-	calculatePosition: function(options){
-		return local.getPosition(this, options);
-	}
-
-});
-
-})(Element.prototype.position);
-
-/*
----
-
-script: Element.Shortcuts.js
-
-name: Element.Shortcuts
-
-description: Extends the Element native object to include some shortcut methods.
-
-license: MIT-style license
-
-authors:
-  - Aaron Newton
-
-requires:
-  - Core/Element.Style
-  - MooTools.More
-
-provides: [Element.Shortcuts]
-
-...
-*/
-
-Element.implement({
-
-	isDisplayed: function(){
-		return this.getStyle('display') != 'none';
-	},
-
-	isVisible: function(){
-		var w = this.offsetWidth,
-			h = this.offsetHeight;
-		return (w == 0 && h == 0) ? false : (w > 0 && h > 0) ? true : this.style.display != 'none';
-	},
-
-	toggle: function(){
-		return this[this.isDisplayed() ? 'hide' : 'show']();
-	},
-
-	hide: function(){
-		var d;
-		try {
-			//IE fails here if the element is not in the dom
-			d = this.getStyle('display');
-		} catch (e){}
-		if (d == 'none') return this;
-		return this.store('element:_originalDisplay', d || '').setStyle('display', 'none');
-	},
-
-	show: function(display){
-		if (!display && this.isDisplayed()) return this;
-		display = display || this.retrieve('element:_originalDisplay') || 'block';
-		return this.setStyle('display', (display == 'none') ? 'block' : display);
-	},
-
-	swapClass: function(remove, add){
-		return this.removeClass(remove).addClass(add);
-	}
-
-});
-
-Document.implement({
-
-	clearSelection: function(){
-		if (window.getSelection){
-			var selection = window.getSelection();
-			if (selection && selection.removeAllRanges) selection.removeAllRanges();
-		} else if (document.selection && document.selection.empty){
-			try {
-				//IE fails here if selected element is not in dom
-				document.selection.empty();
-			} catch (e){}
-		}
-	}
-
-});
-
-/*
----
-
-script: Elements.From.js
-
-name: Elements.From
-
-description: Returns a collection of elements from a string of html.
-
-license: MIT-style license
-
-authors:
-  - Aaron Newton
-
-requires:
-  - Core/String
-  - Core/Element
-  - MooTools.More
-
-provides: [Elements.from, Elements.From]
-
-...
-*/
-
-Elements.from = function(text, excludeScripts){
-	if (excludeScripts || excludeScripts == null) text = text.stripScripts();
-
-	var container, match = text.match(/^\s*(?:<!--.*?-->\s*)*<(t[dhr]|tbody|tfoot|thead)/i);
-
-	if (match){
-		container = new Element('table');
-		var tag = match[1].toLowerCase();
-		if (['td', 'th', 'tr'].contains(tag)){
-			container = new Element('tbody').inject(container);
-			if (tag != 'tr') container = new Element('tr').inject(container);
-		}
-	}
-
-	return (container || new Element('div')).set('html', text).getChildren();
-};
-
-/*
----
-
-script: IframeShim.js
-
-name: IframeShim
-
-description: Defines IframeShim, a class for obscuring select lists and flash objects in IE.
-
-license: MIT-style license
-
-authors:
-  - Aaron Newton
-
-requires:
-  - Core/Element.Event
-  - Core/Element.Style
-  - Core/Options
-  - Core/Events
-  - Element.Position
-  - Class.Occlude
-
-provides: [IframeShim]
-
-...
-*/
-
-(function(){
-
-var browsers = false;
-
-
-var IframeShim = this.IframeShim = new Class({
-
-	Implements: [Options, Events, Class.Occlude],
-
-	options: {
-		className: 'iframeShim',
-		src: 'javascript:false;document.write("");',
-		display: false,
-		zIndex: null,
-		margin: 0,
-		offset: {x: 0, y: 0},
-		browsers: browsers
-	},
-
-	property: 'IframeShim',
-
-	initialize: function(element, options){
-		this.element = document.id(element);
-		if (this.occlude()) return this.occluded;
-		this.setOptions(options);
-		this.makeShim();
-		return this;
-	},
-
-	makeShim: function(){
-		if (this.options.browsers){
-			var zIndex = this.element.getStyle('zIndex').toInt();
-
-			if (!zIndex){
-				zIndex = 1;
-				var pos = this.element.getStyle('position');
-				if (pos == 'static' || !pos) this.element.setStyle('position', 'relative');
-				this.element.setStyle('zIndex', zIndex);
-			}
-			zIndex = ((this.options.zIndex != null || this.options.zIndex === 0) && zIndex > this.options.zIndex) ? this.options.zIndex : zIndex - 1;
-			if (zIndex < 0) zIndex = 1;
-			this.shim = new Element('iframe', {
-				src: this.options.src,
-				scrolling: 'no',
-				frameborder: 0,
-				styles: {
-					zIndex: zIndex,
-					position: 'absolute',
-					border: 'none',
-					filter: 'progid:DXImageTransform.Microsoft.Alpha(style=0,opacity=0)'
-				},
-				'class': this.options.className
-			}).store('IframeShim', this);
-			var inject = (function(){
-				this.shim.inject(this.element, 'after');
-				this[this.options.display ? 'show' : 'hide']();
-				this.fireEvent('inject');
-			}).bind(this);
-			if (!IframeShim.ready) window.addEvent('load', inject);
-			else inject();
-		} else {
-			this.position = this.hide = this.show = this.dispose = Function.convert(this);
-		}
-	},
-
-	position: function(){
-		if (!IframeShim.ready || !this.shim) return this;
-		var size = this.element.measure(function(){
-			return this.getSize();
-		});
-		if (this.options.margin != undefined){
-			size.x = size.x - (this.options.margin * 2);
-			size.y = size.y - (this.options.margin * 2);
-			this.options.offset.x += this.options.margin;
-			this.options.offset.y += this.options.margin;
-		}
-		this.shim.set({width: size.x, height: size.y}).position({
-			relativeTo: this.element,
-			offset: this.options.offset
-		});
-		return this;
-	},
-
-	hide: function(){
-		if (this.shim) this.shim.setStyle('display', 'none');
-		return this;
-	},
-
-	show: function(){
-		if (this.shim) this.shim.setStyle('display', 'block');
-		return this.position();
-	},
-
-	dispose: function(){
-		if (this.shim) this.shim.dispose();
-		return this;
-	},
-
-	destroy: function(){
-		if (this.shim) this.shim.destroy();
-		return this;
-	}
-
-});
-
-})();
-
-window.addEvent('load', function(){
-	IframeShim.ready = true;
-});
-
-/*
----
-
-script: Mask.js
-
-name: Mask
-
-description: Creates a mask element to cover another.
-
-license: MIT-style license
-
-authors:
-  - Aaron Newton
-
-requires:
-  - Core/Options
-  - Core/Events
-  - Core/Element.Event
-  - Class.Binds
-  - Element.Position
-  - IframeShim
-
-provides: [Mask]
-
-...
-*/
-(function(){
-
-var Mask = this.Mask = new Class({
-
-	Implements: [Options, Events],
-
-	Binds: ['position'],
-
-	options: {/*
-		onShow: function(){},
-		onHide: function(){},
-		onDestroy: function(){},
-		onClick: function(event){},
-		inject: {
-			where: 'after',
-			target: null,
-		},
-		hideOnClick: false,
-		id: null,
-		destroyOnHide: false,*/
-		style: {},
-		'class': 'mask',
-		maskMargins: false,
-		useIframeShim: true,
-		iframeShimOptions: {}
-	},
-
-	initialize: function(target, options){
-		this.target = document.id(target) || document.id(document.body);
-		this.target.store('mask', this);
-		this.setOptions(options);
-		this.render();
-		this.inject();
-	},
-
-	render: function(){
-		this.element = new Element('div', {
-			'class': this.options['class'],
-			id: this.options.id || 'mask-' + String.uniqueID(),
-			styles: Object.merge({}, this.options.style, {
-				display: 'none'
-			}),
-			events: {
-				click: function(event){
-					this.fireEvent('click', event);
-					if (this.options.hideOnClick) this.hide();
-				}.bind(this)
-			}
-		});
-
-		this.hidden = true;
-	},
-
-	toElement: function(){
-		return this.element;
-	},
-
-	inject: function(target, where){
-		where = where || (this.options.inject ? this.options.inject.where : '') || (this.target == document.body ? 'inside' : 'after');
-		target = target || (this.options.inject && this.options.inject.target) || this.target;
-
-		this.element.inject(target, where);
-
-		if (this.options.useIframeShim){
-			this.shim = new IframeShim(this.element, this.options.iframeShimOptions);
-
-			this.addEvents({
-				show: this.shim.show.bind(this.shim),
-				hide: this.shim.hide.bind(this.shim),
-				destroy: this.shim.destroy.bind(this.shim)
-			});
-		}
-	},
-
-	position: function(){
-		this.resize(this.options.width, this.options.height);
-
-		this.element.position({
-			relativeTo: this.target,
-			position: 'topLeft',
-			ignoreMargins: !this.options.maskMargins,
-			ignoreScroll: this.target == document.body
-		});
-
-		return this;
-	},
-
-	resize: function(x, y){
-		var opt = {
-			styles: ['padding', 'border']
-		};
-		if (this.options.maskMargins) opt.styles.push('margin');
-
-		var dim = this.target.getComputedSize(opt);
-		if (this.target == document.body){
-			this.element.setStyles({width: 0, height: 0});
-			var win = window.getScrollSize();
-			if (dim.totalHeight < win.y) dim.totalHeight = win.y;
-			if (dim.totalWidth < win.x) dim.totalWidth = win.x;
-		}
-		this.element.setStyles({
-			width: Array.pick([x, dim.totalWidth, dim.x]),
-			height: Array.pick([y, dim.totalHeight, dim.y])
-		});
-
-		return this;
-	},
-
-	show: function(){
-		if (!this.hidden) return this;
-
-		window.addEvent('resize', this.position);
-		this.position();
-		this.showMask.apply(this, arguments);
-
-		return this;
-	},
-
-	showMask: function(){
-		this.element.setStyle('display', 'block');
-		this.hidden = false;
-		this.fireEvent('show');
-	},
-
-	hide: function(){
-		if (this.hidden) return this;
-
-		window.removeEvent('resize', this.position);
-		this.hideMask.apply(this, arguments);
-		if (this.options.destroyOnHide) return this.destroy();
-
-		return this;
-	},
-
-	hideMask: function(){
-		this.element.setStyle('display', 'none');
-		this.hidden = true;
-		this.fireEvent('hide');
-	},
-
-	toggle: function(){
-		this[this.hidden ? 'show' : 'hide']();
-	},
-
-	destroy: function(){
-		this.hide();
-		this.element.destroy();
-		this.fireEvent('destroy');
-		this.target.eliminate('mask');
-	}
-
-});
-
-})();
-
-
-Element.Properties.mask = {
-
-	set: function(options){
-		var mask = this.retrieve('mask');
-		if (mask) mask.destroy();
-		return this.eliminate('mask').store('mask:options', options);
-	},
-
-	get: function(){
-		var mask = this.retrieve('mask');
-		if (!mask){
-			mask = new Mask(this, this.retrieve('mask:options'));
-			this.store('mask', mask);
-		}
-		return mask;
-	}
-
-};
-
-Element.implement({
-
-	mask: function(options){
-		if (options) this.set('mask', options);
-		this.get('mask').show();
-		return this;
-	},
-
-	unmask: function(){
-		this.get('mask').hide();
-		return this;
-	}
-
-});
-
-/*
----
-
-script: Spinner.js
-
-name: Spinner
-
-description: Adds a semi-transparent overlay over a dom element with a spinnin ajax icon.
-
-license: MIT-style license
-
-authors:
-  - Aaron Newton
-
-requires:
-  - Core/Fx.Tween
-  - Core/Request
-  - Class.refactor
-  - Mask
-
-provides: [Spinner]
-
-...
-*/
-(function(){
-
-var Spinner = this.Spinner = new Class({
-
-	Extends: this.Mask,
-
-	Implements: Chain,
-
-	options: {/*
-		message: false,*/
-		'class': 'spinner',
-		containerPosition: {},
-		content: {
-			'class': 'spinner-content'
-		},
-		messageContainer: {
-			'class': 'spinner-msg'
-		},
-		img: {
-			'class': 'spinner-img'
-		},
-		fxOptions: {
-			link: 'chain'
-		}
-	},
-
-	initialize: function(target, options){
-		this.target = document.id(target) || document.id(document.body);
-		this.target.store('spinner', this);
-		this.setOptions(options);
-		this.render();
-		this.inject();
-
-		// Add this to events for when noFx is true; parent methods handle hide/show.
-		var deactivate = function(){ this.active = false; }.bind(this);
-		this.addEvents({
-			hide: deactivate,
-			show: deactivate
-		});
-	},
-
-	render: function(){
-		this.parent();
-
-		this.element.set('id', this.options.id || 'spinner-' + String.uniqueID());
-
-		this.content = document.id(this.options.content) || new Element('div', this.options.content);
-		this.content.inject(this.element);
-
-		if (this.options.message){
-			this.msg = document.id(this.options.message) || new Element('p', this.options.messageContainer).appendText(this.options.message);
-			this.msg.inject(this.content);
-		}
-
-		if (this.options.img){
-			this.img = document.id(this.options.img) || new Element('div', this.options.img);
-			this.img.inject(this.content);
-		}
-
-		this.element.set('tween', this.options.fxOptions);
-	},
-
-	show: function(noFx){
-		if (this.active) return this.chain(this.show.bind(this));
-		if (!this.hidden){
-			this.callChain.delay(20, this);
-			return this;
-		}
-
-		this.target.set('aria-busy', 'true');
-		this.active = true;
-
-		return this.parent(noFx);
-	},
-
-	showMask: function(noFx){
-		var pos = function(){
-			this.content.position(Object.merge({
-				relativeTo: this.element
-			}, this.options.containerPosition));
-		}.bind(this);
-
-		if (noFx){
-			this.parent();
-			pos();
-		} else {
-			if (!this.options.style.opacity) this.options.style.opacity = this.element.getStyle('opacity').toFloat();
-			this.element.setStyles({
-				display: 'block',
-				opacity: 0
-			}).tween('opacity', this.options.style.opacity);
-			pos();
-			this.hidden = false;
-			this.fireEvent('show');
-			this.callChain();
-		}
-	},
-
-	hide: function(noFx){
-		if (this.active) return this.chain(this.hide.bind(this));
-		if (this.hidden){
-			this.callChain.delay(20, this);
-			return this;
-		}
-
-		this.target.set('aria-busy', 'false');
-		this.active = true;
-
-		return this.parent(noFx);
-	},
-
-	hideMask: function(noFx){
-		if (noFx) return this.parent();
-		this.element.tween('opacity', 0).get('tween').chain(function(){
-			this.element.setStyle('display', 'none');
-			this.hidden = true;
-			this.fireEvent('hide');
-			this.callChain();
-		}.bind(this));
-	},
-
-	destroy: function(){
-		this.content.destroy();
-		this.parent();
-		this.target.eliminate('spinner');
-	}
-
-});
-
-})();
-
-Request = Class.refactor(Request, {
-
-	options: {
-		useSpinner: false,
-		spinnerOptions: {},
-		spinnerTarget: false
-	},
-
-	initialize: function(options){
-		this._send = this.send;
-		this.send = function(options){
-			var spinner = this.getSpinner();
-			if (spinner) spinner.chain(this._send.pass(options, this)).show();
-			else this._send(options);
-			return this;
-		};
-		this.previous(options);
-	},
-
-	getSpinner: function(){
-		if (!this.spinner){
-			var update = document.id(this.options.spinnerTarget) || document.id(this.options.update);
-			if (this.options.useSpinner && update){
-				update.set('spinner', this.options.spinnerOptions);
-				var spinner = this.spinner = update.get('spinner');
-				['complete', 'exception', 'cancel'].each(function(event){
-					this.addEvent(event, spinner.hide.bind(spinner));
-				}, this);
-			}
-		}
-		return this.spinner;
-	}
-
-});
-
-Element.Properties.spinner = {
-
-	set: function(options){
-		var spinner = this.retrieve('spinner');
-		if (spinner) spinner.destroy();
-		return this.eliminate('spinner').store('spinner:options', options);
-	},
-
-	get: function(){
-		var spinner = this.retrieve('spinner');
-		if (!spinner){
-			spinner = new Spinner(this, this.retrieve('spinner:options'));
-			this.store('spinner', spinner);
-		}
-		return spinner;
-	}
-
-};
-
-Element.implement({
-
-	spin: function(options){
-		if (options) this.set('spinner', options);
-		this.get('spinner').show();
-		return this;
-	},
-
-	unspin: function(){
-		this.get('spinner').hide();
-		return this;
-	}
-
-});
-
-/*
----
-
-script: String.QueryString.js
-
-name: String.QueryString
-
-description: Methods for dealing with URI query strings.
-
-license: MIT-style license
-
-authors:
-  - Sebastian Markbåge
-  - Aaron Newton
-  - Lennart Pilon
-  - Valerio Proietti
-
-requires:
-  - Core/Array
-  - Core/String
-  - MooTools.More
-
-provides: [String.QueryString]
-
-...
-*/
-
-(function(){
-
-/**
- * decodeURIComponent doesn't do the correct thing with query parameter keys or
- * values. Specifically, it leaves '+' as '+' when it should be converting them
- * to spaces as that's the specification. When browsers submit HTML forms via
- * GET, the values are encoded using 'application/x-www-form-urlencoded'
- * which converts spaces to '+'.
- *
- * See: http://unixpapa.com/js/querystring.html for a description of the
- * problem.
- */
-var decodeComponent = function(str){
-	return decodeURIComponent(str.replace(/\+/g, ' '));
-};
-
-String.implement({
-
-	parseQueryString: function(decodeKeys, decodeValues){
-		if (decodeKeys == null) decodeKeys = true;
-		if (decodeValues == null) decodeValues = true;
-
-		var vars = this.split(/[&;]/),
-			object = {};
-		if (!vars.length) return object;
-
-		vars.each(function(val){
-			var index = val.indexOf('=') + 1,
-				value = index ? val.substr(index) : '',
-				keys = index ? val.substr(0, index - 1).match(/([^\]\[]+|(\B)(?=\]))/g) : [val],
-				obj = object;
-			if (!keys) return;
-			if (decodeValues) value = decodeComponent(value);
-			keys.each(function(key, i){
-				if (decodeKeys) key = decodeComponent(key);
-				var current = obj[key];
-
-				if (i < keys.length - 1) obj = obj[key] = current || {};
-				else if (typeOf(current) == 'array') current.push(value);
-				else obj[key] = current != null ? [current, value] : value;
-			});
-		});
-
-		return object;
-	},
-
-	cleanQueryString: function(method){
-		return this.split('&').filter(function(val){
-			var index = val.indexOf('='),
-				key = index < 0 ? '' : val.substr(0, index),
-				value = val.substr(index + 1);
-
-			return method ? method.call(null, key, value) : (value || value === 0);
-		}).join('&');
-	}
-
-});
-
-})();
-
-/*
----
-
-script: Form.Request.js
-
-name: Form.Request
-
-description: Handles the basic functionality of submitting a form and updating a dom element with the result.
-
-license: MIT-style license
-
-authors:
-  - Aaron Newton
-
-requires:
-  - Core/Request.HTML
-  - Class.Binds
-  - Class.Occlude
-  - Spinner
-  - String.QueryString
-  - Element.Delegation.Pseudo
-
-provides: [Form.Request]
-
-...
-*/
-
-if (!window.Form) window.Form = {};
-
-(function(){
-
-Form.Request = new Class({
-
-	Binds: ['onSubmit', 'onFormValidate'],
-
-	Implements: [Options, Events, Class.Occlude],
-
-	options: {/*
-		onFailure: function(){},
-		onSuccess: function(){}, // aliased to onComplete,
-		onSend: function(){}*/
-		requestOptions: {
-			evalScripts: true,
-			useSpinner: true,
-			emulation: false,
-			link: 'ignore'
-		},
-		sendButtonClicked: true,
-		extraData: {},
-		resetForm: true
-	},
-
-	property: 'form.request',
-
-	initialize: function(form, target, options){
-		this.element = document.id(form);
-		if (this.occlude()) return this.occluded;
-		this.setOptions(options)
-			.setTarget(target)
-			.attach();
-	},
-
-	setTarget: function(target){
-		this.target = document.id(target);
-		if (!this.request){
-			this.makeRequest();
-		} else {
-			this.request.setOptions({
-				update: this.target
-			});
-		}
-		return this;
-	},
-
-	toElement: function(){
-		return this.element;
-	},
-
-	makeRequest: function(){
-		var self = this;
-		this.request = new Request.HTML(Object.merge({
-			update: this.target,
-			emulation: false,
-			spinnerTarget: this.element,
-			method: this.element.get('method') || 'post'
-		}, this.options.requestOptions)).addEvents({
-			success: function(tree, elements, html, javascript){
-				['complete', 'success'].each(function(evt){
-					self.fireEvent(evt, [self.target, tree, elements, html, javascript]);
-				});
-			},
-			failure: function(){
-				self.fireEvent('complete', arguments).fireEvent('failure', arguments);
-			},
-			exception: function(){
-				self.fireEvent('failure', arguments);
-			}
-		});
-		return this.attachReset();
-	},
-
-	attachReset: function(){
-		if (!this.options.resetForm) return this;
-		this.request.addEvent('success', function(){
-			Function.attempt(function(){
-				this.element.reset();
-			}.bind(this));
-			if (window.OverText) OverText.update();
-		}.bind(this));
-		return this;
-	},
-
-	attach: function(attach){
-		var method = (attach != false) ? 'addEvent' : 'removeEvent';
-		this.element[method]('click:relay(button, input[type=submit])', this.saveClickedButton.bind(this));
-
-		var fv = this.element.retrieve('validator');
-		if (fv) fv[method]('onFormValidate', this.onFormValidate);
-		else this.element[method]('submit', this.onSubmit);
-
-		return this;
-	},
-
-	detach: function(){
-		return this.attach(false);
-	},
-
-	//public method
-	enable: function(){
-		return this.attach();
-	},
-
-	//public method
-	disable: function(){
-		return this.detach();
-	},
-
-	onFormValidate: function(valid, form, event){
-		//if there's no event, then this wasn't a submit event
-		if (!event) return;
-		var fv = this.element.retrieve('validator');
-		if (valid || (fv && !fv.options.stopOnFailure)){
-			event.stop();
-			this.send();
-		}
-	},
-
-	onSubmit: function(event){
-		var fv = this.element.retrieve('validator');
-		if (fv){
-			//form validator was created after Form.Request
-			this.element.removeEvent('submit', this.onSubmit);
-			fv.addEvent('onFormValidate', this.onFormValidate);
-			fv.validate(event);
-			return;
-		}
-		if (event) event.stop();
-		this.send();
-	},
-
-	saveClickedButton: function(event, target){
-		var targetName = target.get('name');
-		if (!targetName || !this.options.sendButtonClicked) return;
-		this.options.extraData[targetName] = target.get('value') || true;
-		this.clickedCleaner = function(){
-			delete this.options.extraData[targetName];
-			this.clickedCleaner = function(){};
-		}.bind(this);
-	},
-
-	clickedCleaner: function(){},
-
-	send: function(){
-		var str = this.element.toQueryString().trim(),
-			data = Object.toQueryString(this.options.extraData);
-
-		if (str) str += '&' + data;
-		else str = data;
-
-		this.fireEvent('send', [this.element, str.parseQueryString()]);
-		this.request.send({
-			data: str,
-			url: this.options.requestOptions.url || this.element.get('action')
-		});
-		this.clickedCleaner();
-		return this;
-	}
-
-});
-
-Element.implement('formUpdate', function(update, options){
-	var fq = this.retrieve('form.request');
-	if (!fq){
-		fq = new Form.Request(this, update, options);
-	} else {
-		if (update) fq.setTarget(update);
-		if (options) fq.setOptions(options).makeRequest();
-	}
-	fq.send();
-	return this;
-});
-
-})();
-
-/*
----
-
-script: Fx.Reveal.js
-
-name: Fx.Reveal
-
-description: Defines Fx.Reveal, a class that shows and hides elements with a transition.
-
-license: MIT-style license
-
-authors:
-  - Aaron Newton
-
-requires:
-  - Core/Fx.Morph
-  - Element.Shortcuts
-  - Element.Measure
-
-provides: [Fx.Reveal]
-
-...
-*/
-
-(function(){
-
-
-var hideTheseOf = function(object){
-	var hideThese = object.options.hideInputs;
-	if (window.OverText){
-		var otClasses = [null];
-		OverText.each(function(ot){
-			otClasses.include('.' + ot.options.labelClass);
-		});
-		if (otClasses) hideThese += otClasses.join(', ');
-	}
-	return (hideThese) ? object.element.getElements(hideThese) : null;
-};
-
-
-Fx.Reveal = new Class({
-
-	Extends: Fx.Morph,
-
-	options: {/*
-		onShow: function(thisElement){},
-		onHide: function(thisElement){},
-		onComplete: function(thisElement){},
-		heightOverride: null,
-		widthOverride: null,*/
-		link: 'cancel',
-		styles: ['padding', 'border', 'margin'],
-		transitionOpacity: 'opacity' in document.documentElement,
-		mode: 'vertical',
-		display: function(){
-			return this.element.get('tag') != 'tr' ? 'block' : 'table-row';
-		},
-		opacity: 1,
-		hideInputs: !('opacity' in document.documentElement) ? 'select, input, textarea, object, embed' : null
-	},
-
-	dissolve: function(){
-		if (!this.hiding && !this.showing){
-			if (this.element.getStyle('display') != 'none'){
-				this.hiding = true;
-				this.showing = false;
-				this.hidden = true;
-				this.cssText = this.element.style.cssText;
-
-				var startStyles = this.element.getComputedSize({
-					styles: this.options.styles,
-					mode: this.options.mode
-				});
-				if (this.options.transitionOpacity) startStyles.opacity = this.options.opacity;
-
-				var zero = {};
-				Object.each(startStyles, function(style, name){
-					zero[name] = [style, 0];
-				});
-
-				this.element.setStyles({
-					display: Function.convert(this.options.display).call(this),
-					overflow: 'hidden'
-				});
-
-				var hideThese = hideTheseOf(this);
-				if (hideThese) hideThese.setStyle('visibility', 'hidden');
-
-				this.$chain.unshift(function(){
-					if (this.hidden){
-						this.hiding = false;
-						this.element.style.cssText = this.cssText;
-						this.element.setStyle('display', 'none');
-						if (hideThese) hideThese.setStyle('visibility', 'visible');
-					}
-					this.fireEvent('hide', this.element);
-					this.callChain();
-				}.bind(this));
-
-				this.start(zero);
-			} else {
-				this.callChain.delay(10, this);
-				this.fireEvent('complete', this.element);
-				this.fireEvent('hide', this.element);
-			}
-		} else if (this.options.link == 'chain'){
-			this.chain(this.dissolve.bind(this));
-		} else if (this.options.link == 'cancel' && !this.hiding){
-			this.cancel();
-			this.dissolve();
-		}
-		return this;
-	},
-
-	reveal: function(){
-		if (!this.showing && !this.hiding){
-			if (this.element.getStyle('display') == 'none'){
-				this.hiding = false;
-				this.showing = true;
-				this.hidden = false;
-				this.cssText = this.element.style.cssText;
-
-				var startStyles;
-				this.element.measure(function(){
-					startStyles = this.element.getComputedSize({
-						styles: this.options.styles,
-						mode: this.options.mode
-					});
-				}.bind(this));
-				if (this.options.heightOverride != null) startStyles.height = this.options.heightOverride.toInt();
-				if (this.options.widthOverride != null) startStyles.width = this.options.widthOverride.toInt();
-				if (this.options.transitionOpacity){
-					this.element.setStyle('opacity', 0);
-					startStyles.opacity = this.options.opacity;
-				}
-
-				var zero = {
-					height: 0,
-					display: Function.convert(this.options.display).call(this)
-				};
-				Object.each(startStyles, function(style, name){
-					zero[name] = 0;
-				});
-				zero.overflow = 'hidden';
-
-				this.element.setStyles(zero);
-
-				var hideThese = hideTheseOf(this);
-				if (hideThese) hideThese.setStyle('visibility', 'hidden');
-
-				this.$chain.unshift(function(){
-					this.element.style.cssText = this.cssText;
-					this.element.setStyle('display', Function.convert(this.options.display).call(this));
-					if (!this.hidden) this.showing = false;
-					if (hideThese) hideThese.setStyle('visibility', 'visible');
-					this.callChain();
-					this.fireEvent('show', this.element);
-				}.bind(this));
-
-				this.start(startStyles);
-			} else {
-				this.callChain();
-				this.fireEvent('complete', this.element);
-				this.fireEvent('show', this.element);
-			}
-		} else if (this.options.link == 'chain'){
-			this.chain(this.reveal.bind(this));
-		} else if (this.options.link == 'cancel' && !this.showing){
-			this.cancel();
-			this.reveal();
-		}
-		return this;
-	},
-
-	toggle: function(){
-		if (this.element.getStyle('display') == 'none'){
-			this.reveal();
-		} else {
-			this.dissolve();
-		}
-		return this;
-	},
-
-	cancel: function(){
-		this.parent.apply(this, arguments);
-		if (this.cssText != null) this.element.style.cssText = this.cssText;
-		this.hiding = false;
-		this.showing = false;
-		return this;
-	}
-
-});
-
-Element.Properties.reveal = {
-
-	set: function(options){
-		this.get('reveal').cancel().setOptions(options);
-		return this;
-	},
-
-	get: function(){
-		var reveal = this.retrieve('reveal');
-		if (!reveal){
-			reveal = new Fx.Reveal(this);
-			this.store('reveal', reveal);
-		}
-		return reveal;
-	}
-
-};
-
-Element.Properties.dissolve = Element.Properties.reveal;
-
-Element.implement({
-
-	reveal: function(options){
-		this.get('reveal').setOptions(options).reveal();
-		return this;
-	},
-
-	dissolve: function(options){
-		this.get('reveal').setOptions(options).dissolve();
-		return this;
-	},
-
-	nix: function(options){
-		var params = Array.link(arguments, {destroy: Type.isBoolean, options: Type.isObject});
-		this.get('reveal').setOptions(options).dissolve().chain(function(){
-			this[params.destroy ? 'destroy' : 'dispose']();
-		}.bind(this));
-		return this;
-	},
-
-	wink: function(){
-		var params = Array.link(arguments, {duration: Type.isNumber, options: Type.isObject});
-		var reveal = this.get('reveal').setOptions(params.options);
-		reveal.reveal().chain(function(){
-			(function(){
-				reveal.dissolve();
-			}).delay(params.duration || 2000);
-		});
-	}
-
-});
-
-})();
-
-/*
----
-
-script: Form.Request.Append.js
-
-name: Form.Request.Append
-
-description: Handles the basic functionality of submitting a form and updating a dom element with the result. The result is appended to the DOM element instead of replacing its contents.
-
-license: MIT-style license
-
-authors:
-  - Aaron Newton
-
-requires:
-  - Form.Request
-  - Fx.Reveal
-  - Elements.from
-
-provides: [Form.Request.Append]
-
-...
-*/
-
-Form.Request.Append = new Class({
-
-	Extends: Form.Request,
-
-	options: {
-		//onBeforeEffect: function(){},
-		useReveal: true,
-		revealOptions: {},
-		inject: 'bottom'
-	},
-
-	makeRequest: function(){
-		this.request = new Request.HTML(Object.merge({
-			url: this.element.get('action'),
-			method: this.element.get('method') || 'post',
-			spinnerTarget: this.element
-		}, this.options.requestOptions, {
-			evalScripts: false
-		})).addEvents({
-			success: function(tree, elements, html, javascript){
-				var container;
-				var kids = Elements.from(html);
-				if (kids.length == 1){
-					container = kids[0];
-				} else {
-					container = new Element('div', {
-						styles: {
-							display: 'none'
-						}
-					}).adopt(kids);
-				}
-				container.inject(this.target, this.options.inject);
-				if (this.options.requestOptions.evalScripts) Browser.exec(javascript);
-				this.fireEvent('beforeEffect', container);
-				var finish = function(){
-					this.fireEvent('success', [container, this.target, tree, elements, html, javascript]);
-				}.bind(this);
-				if (this.options.useReveal){
-					container.set('reveal', this.options.revealOptions).get('reveal').chain(finish);
-					container.reveal();
-				} else {
-					finish();
-				}
-			}.bind(this),
-			failure: function(xhr){
-				this.fireEvent('failure', xhr);
-			}.bind(this)
-		});
-		this.attachReset();
-	}
-
-});
-
-/*
----
-
-script: Object.Extras.js
-
-name: Object.Extras
-
-description: Extra Object generics, like getFromPath which allows a path notation to child elements.
-
-license: MIT-style license
-
-authors:
-  - Aaron Newton
-
-requires:
-  - Core/Object
-  - MooTools.More
-
-provides: [Object.Extras]
-
-...
-*/
-
-(function(){
-
-var defined = function(value){
-	return value != null;
-};
-
-var hasOwnProperty = Object.prototype.hasOwnProperty;
-
-Object.extend({
-
-	getFromPath: function(source, parts){
-		if (typeof parts == 'string') parts = parts.split('.');
-		for (var i = 0, l = parts.length; i < l; i++){
-			if (hasOwnProperty.call(source, parts[i])) source = source[parts[i]];
-			else return null;
-		}
-		return source;
-	},
-
-	cleanValues: function(object, method){
-		method = method || defined;
-		for (var key in object) if (!method(object[key])){
-			delete object[key];
-		}
-		return object;
-	},
-
-	erase: function(object, key){
-		if (hasOwnProperty.call(object, key)) delete object[key];
-		return object;
-	},
-
-	run: function(object){
-		var args = Array.slice(arguments, 1);
-		for (var key in object) if (object[key].apply){
-			object[key].apply(object, args);
-		}
-		return object;
-	}
-
-});
-
-})();
-
-/*
----
-
-script: Locale.js
-
-name: Locale
-
-description: Provides methods for localization.
-
-license: MIT-style license
-
-authors:
-  - Aaron Newton
-  - Arian Stolwijk
-
-requires:
-  - Core/Events
-  - Object.Extras
-  - MooTools.More
-
-provides: [Locale, Lang]
-
-...
-*/
-
-(function(){
-
-var current = null,
-	locales = {},
-	inherits = {};
-
-var getSet = function(set){
-	if (instanceOf(set, Locale.Set)) return set;
-	else return locales[set];
-};
-
-var Locale = this.Locale = {
-
-	define: function(locale, set, key, value){
-		var name;
-		if (instanceOf(locale, Locale.Set)){
-			name = locale.name;
-			if (name) locales[name] = locale;
-		} else {
-			name = locale;
-			if (!locales[name]) locales[name] = new Locale.Set(name);
-			locale = locales[name];
-		}
-
-		if (set) locale.define(set, key, value);
-
-		
-
-		if (!current) current = locale;
-
-		return locale;
-	},
-
-	use: function(locale){
-		locale = getSet(locale);
-
-		if (locale){
-			current = locale;
-
-			this.fireEvent('change', locale);
-
-			
-		}
-
-		return this;
-	},
-
-	getCurrent: function(){
-		return current;
-	},
-
-	get: function(key, args){
-		return (current) ? current.get(key, args) : '';
-	},
-
-	inherit: function(locale, inherits, set){
-		locale = getSet(locale);
-
-		if (locale) locale.inherit(inherits, set);
-		return this;
-	},
-
-	list: function(){
-		return Object.keys(locales);
-	}
-
-};
-
-Object.append(Locale, new Events);
-
-Locale.Set = new Class({
-
-	sets: {},
-
-	inherits: {
-		locales: [],
-		sets: {}
-	},
-
-	initialize: function(name){
-		this.name = name || '';
-	},
-
-	define: function(set, key, value){
-		var defineData = this.sets[set];
-		if (!defineData) defineData = {};
-
-		if (key){
-			if (typeOf(key) == 'object') defineData = Object.merge(defineData, key);
-			else defineData[key] = value;
-		}
-		this.sets[set] = defineData;
-
-		return this;
-	},
-
-	get: function(key, args, _base){
-		var value = Object.getFromPath(this.sets, key);
-		if (value != null){
-			var type = typeOf(value);
-			if (type == 'function') value = value.apply(null, Array.convert(args));
-			else if (type == 'object') value = Object.clone(value);
-			return value;
-		}
-
-		// get value of inherited locales
-		var index = key.indexOf('.'),
-			set = index < 0 ? key : key.substr(0, index),
-			names = (this.inherits.sets[set] || []).combine(this.inherits.locales).include('en-US');
-		if (!_base) _base = [];
-
-		for (var i = 0, l = names.length; i < l; i++){
-			if (_base.contains(names[i])) continue;
-			_base.include(names[i]);
-
-			var locale = locales[names[i]];
-			if (!locale) continue;
-
-			value = locale.get(key, args, _base);
-			if (value != null) return value;
-		}
-
-		return '';
-	},
-
-	inherit: function(names, set){
-		names = Array.convert(names);
-
-		if (set && !this.inherits.sets[set]) this.inherits.sets[set] = [];
-
-		var l = names.length;
-		while (l--) (set ? this.inherits.sets[set] : this.inherits.locales).unshift(names[l]);
-
-		return this;
-	}
-
-});
-
-
-
-})();
-
-/*
----
-
-name: Locale.en-US.Date
-
-description: Date messages for US English.
-
-license: MIT-style license
-
-authors:
-  - Aaron Newton
-
-requires:
-  - Locale
-
-provides: [Locale.en-US.Date]
-
-...
-*/
-
-Locale.define('en-US', 'Date', {
-
-	months: ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'],
-	months_abbr: ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'],
-	days: ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'],
-	days_abbr: ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'],
-
-	// Culture's date order: MM/DD/YYYY
-	dateOrder: ['month', 'date', 'year'],
-	shortDate: '%m/%d/%Y',
-	shortTime: '%I:%M%p',
-	AM: 'AM',
-	PM: 'PM',
-	firstDayOfWeek: 0,
-
-	// Date.Extras
-	ordinal: function(dayOfMonth){
-		// 1st, 2nd, 3rd, etc.
-		return (dayOfMonth > 3 && dayOfMonth < 21) ? 'th' : ['th', 'st', 'nd', 'rd', 'th'][Math.min(dayOfMonth % 10, 4)];
-	},
-
-	lessThanMinuteAgo: 'less than a minute ago',
-	minuteAgo: 'about a minute ago',
-	minutesAgo: '{delta} minutes ago',
-	hourAgo: 'about an hour ago',
-	hoursAgo: 'about {delta} hours ago',
-	dayAgo: '1 day ago',
-	daysAgo: '{delta} days ago',
-	weekAgo: '1 week ago',
-	weeksAgo: '{delta} weeks ago',
-	monthAgo: '1 month ago',
-	monthsAgo: '{delta} months ago',
-	yearAgo: '1 year ago',
-	yearsAgo: '{delta} years ago',
-
-	lessThanMinuteUntil: 'less than a minute from now',
-	minuteUntil: 'about a minute from now',
-	minutesUntil: '{delta} minutes from now',
-	hourUntil: 'about an hour from now',
-	hoursUntil: 'about {delta} hours from now',
-	dayUntil: '1 day from now',
-	daysUntil: '{delta} days from now',
-	weekUntil: '1 week from now',
-	weeksUntil: '{delta} weeks from now',
-	monthUntil: '1 month from now',
-	monthsUntil: '{delta} months from now',
-	yearUntil: '1 year from now',
-	yearsUntil: '{delta} years from now'
-
-});
-
-/*
----
-
-script: Date.js
-
-name: Date
-
-description: Extends the Date native object to include methods useful in managing dates.
-
-license: MIT-style license
-
-authors:
-  - Aaron Newton
-  - Nicholas Barthelemy - https://svn.nbarthelemy.com/date-js/
-  - Harald Kirshner - mail [at] digitarald.de; http://digitarald.de
-  - Scott Kyle - scott [at] appden.com; http://appden.com
-
-requires:
-  - Core/Array
-  - Core/String
-  - Core/Number
-  - MooTools.More
-  - Locale
-  - Locale.en-US.Date
-
-provides: [Date]
-
-...
-*/
-
-(function(){
-
-var Date = this.Date;
-
-var DateMethods = Date.Methods = {
-	ms: 'Milliseconds',
-	year: 'FullYear',
-	min: 'Minutes',
-	mo: 'Month',
-	sec: 'Seconds',
-	hr: 'Hours'
-};
-
-[
-	'Date', 'Day', 'FullYear', 'Hours', 'Milliseconds', 'Minutes', 'Month', 'Seconds', 'Time', 'TimezoneOffset',
-	'Week', 'Timezone', 'GMTOffset', 'DayOfYear', 'LastMonth', 'LastDayOfMonth', 'UTCDate', 'UTCDay', 'UTCFullYear',
-	'AMPM', 'Ordinal', 'UTCHours', 'UTCMilliseconds', 'UTCMinutes', 'UTCMonth', 'UTCSeconds', 'UTCMilliseconds'
-].each(function(method){
-	Date.Methods[method.toLowerCase()] = method;
-});
-
-var pad = function(n, digits, string){
-	if (digits == 1) return n;
-	return n < Math.pow(10, digits - 1) ? (string || '0') + pad(n, digits - 1, string) : n;
-};
-
-Date.implement({
-
-	set: function(prop, value){
-		prop = prop.toLowerCase();
-		var method = DateMethods[prop] && 'set' + DateMethods[prop];
-		if (method && this[method]) this[method](value);
-		return this;
-	}.overloadSetter(),
-
-	get: function(prop){
-		prop = prop.toLowerCase();
-		var method = DateMethods[prop] && 'get' + DateMethods[prop];
-		if (method && this[method]) return this[method]();
-		return null;
-	}.overloadGetter(),
-
-	clone: function(){
-		return new Date(this.get('time'));
-	},
-
-	increment: function(interval, times){
-		interval = interval || 'day';
-		times = times != null ? times : 1;
-
-		switch (interval){
-			case 'year':
-				return this.increment('month', times * 12);
-			case 'month':
-				var d = this.get('date');
-				this.set('date', 1).set('mo', this.get('mo') + times);
-				return this.set('date', d.min(this.get('lastdayofmonth')));
-			case 'week':
-				return this.increment('day', times * 7);
-			case 'day':
-				return this.set('date', this.get('date') + times);
-		}
-
-		if (!Date.units[interval]) throw new Error(interval + ' is not a supported interval');
-
-		return this.set('time', this.get('time') + times * Date.units[interval]());
-	},
-
-	decrement: function(interval, times){
-		return this.increment(interval, -1 * (times != null ? times : 1));
-	},
-
-	isLeapYear: function(){
-		return Date.isLeapYear(this.get('year'));
-	},
-
-	clearTime: function(){
-		return this.set({hr: 0, min: 0, sec: 0, ms: 0});
-	},
-
-	diff: function(date, resolution){
-		if (typeOf(date) == 'string') date = Date.parse(date);
-
-		return ((date - this) / Date.units[resolution || 'day'](3, 3)).round(); // non-leap year, 30-day month
-	},
-
-	getLastDayOfMonth: function(){
-		return Date.daysInMonth(this.get('mo'), this.get('year'));
-	},
-
-	getDayOfYear: function(){
-		return (Date.UTC(this.get('year'), this.get('mo'), this.get('date') + 1)
-			- Date.UTC(this.get('year'), 0, 1)) / Date.units.day();
-	},
-
-	setDay: function(day, firstDayOfWeek){
-		if (firstDayOfWeek == null){
-			firstDayOfWeek = Date.getMsg('firstDayOfWeek');
-			if (firstDayOfWeek === '') firstDayOfWeek = 1;
-		}
-
-		day = (7 + Date.parseDay(day, true) - firstDayOfWeek) % 7;
-		var currentDay = (7 + this.get('day') - firstDayOfWeek) % 7;
-
-		return this.increment('day', day - currentDay);
-	},
-
-	getWeek: function(firstDayOfWeek){
-		if (firstDayOfWeek == null){
-			firstDayOfWeek = Date.getMsg('firstDayOfWeek');
-			if (firstDayOfWeek === '') firstDayOfWeek = 1;
-		}
-
-		var date = this,
-			dayOfWeek = (7 + date.get('day') - firstDayOfWeek) % 7,
-			dividend = 0,
-			firstDayOfYear;
-
-		if (firstDayOfWeek == 1){
-			// ISO-8601, week belongs to year that has the most days of the week (i.e. has the thursday of the week)
-			var month = date.get('month'),
-				startOfWeek = date.get('date') - dayOfWeek;
-
-			if (month == 11 && startOfWeek > 28) return 1; // Week 1 of next year
-
-			if (month == 0 && startOfWeek < -2){
-				// Use a date from last year to determine the week
-				date = new Date(date).decrement('day', dayOfWeek);
-				dayOfWeek = 0;
-			}
-
-			firstDayOfYear = new Date(date.get('year'), 0, 1).get('day') || 7;
-			if (firstDayOfYear > 4) dividend = -7; // First week of the year is not week 1
-		} else {
-			// In other cultures the first week of the year is always week 1 and the last week always 53 or 54.
-			// Days in the same week can have a different weeknumber if the week spreads across two years.
-			firstDayOfYear = new Date(date.get('year'), 0, 1).get('day');
-		}
-
-		dividend += date.get('dayofyear');
-		dividend += 6 - dayOfWeek; // Add days so we calculate the current date's week as a full week
-		dividend += (7 + firstDayOfYear - firstDayOfWeek) % 7; // Make up for first week of the year not being a full week
-
-		return (dividend / 7);
-	},
-
-	getOrdinal: function(day){
-		return Date.getMsg('ordinal', day || this.get('date'));
-	},
-
-	getTimezone: function(){
-		return this.toString()
-			.replace(/^.*? ([A-Z]{3}).[0-9]{4}.*$/, '$1')
-			.replace(/^.*?\(([A-Z])[a-z]+ ([A-Z])[a-z]+ ([A-Z])[a-z]+\)$/, '$1$2$3');
-	},
-
-	getGMTOffset: function(){
-		var off = this.get('timezoneOffset');
-		return ((off > 0) ? '-' : '+') + pad((off.abs() / 60).floor(), 2) + pad(off % 60, 2);
-	},
-
-	setAMPM: function(ampm){
-		ampm = ampm.toUpperCase();
-		var hr = this.get('hr');
-		if (hr > 11 && ampm == 'AM') return this.decrement('hour', 12);
-		else if (hr < 12 && ampm == 'PM') return this.increment('hour', 12);
-		return this;
-	},
-
-	getAMPM: function(){
-		return (this.get('hr') < 12) ? 'AM' : 'PM';
-	},
-
-	parse: function(str){
-		this.set('time', Date.parse(str));
-		return this;
-	},
-
-	isValid: function(date){
-		if (!date) date = this;
-		return typeOf(date) == 'date' && !isNaN(date.valueOf());
-	},
-
-	format: function(format){
-		if (!this.isValid()) return 'invalid date';
-
-		if (!format) format = '%x %X';
-		if (typeof format == 'string') format = formats[format.toLowerCase()] || format;
-		if (typeof format == 'function') return format(this);
-
-		var d = this;
-		return format.replace(/%([a-z%])/gi,
-			function($0, $1){
-				switch ($1){
-					case 'a': return Date.getMsg('days_abbr')[d.get('day')];
-					case 'A': return Date.getMsg('days')[d.get('day')];
-					case 'b': return Date.getMsg('months_abbr')[d.get('month')];
-					case 'B': return Date.getMsg('months')[d.get('month')];
-					case 'c': return d.format('%a %b %d %H:%M:%S %Y');
-					case 'd': return pad(d.get('date'), 2);
-					case 'e': return pad(d.get('date'), 2, ' ');
-					case 'H': return pad(d.get('hr'), 2);
-					case 'I': return pad((d.get('hr') % 12) || 12, 2);
-					case 'j': return pad(d.get('dayofyear'), 3);
-					case 'k': return pad(d.get('hr'), 2, ' ');
-					case 'l': return pad((d.get('hr') % 12) || 12, 2, ' ');
-					case 'L': return pad(d.get('ms'), 3);
-					case 'm': return pad((d.get('mo') + 1), 2);
-					case 'M': return pad(d.get('min'), 2);
-					case 'o': return d.get('ordinal');
-					case 'p': return Date.getMsg(d.get('ampm'));
-					case 's': return Math.round(d / 1000);
-					case 'S': return pad(d.get('seconds'), 2);
-					case 'T': return d.format('%H:%M:%S');
-					case 'U': return pad(d.get('week'), 2);
-					case 'w': return d.get('day');
-					case 'x': return d.format(Date.getMsg('shortDate'));
-					case 'X': return d.format(Date.getMsg('shortTime'));
-					case 'y': return d.get('year').toString().substr(2);
-					case 'Y': return d.get('year');
-					case 'z': return d.get('GMTOffset');
-					case 'Z': return d.get('Timezone');
-				}
-				return $1;
-			}
-		);
-	},
-
-	toISOString: function(){
-		return this.format('iso8601');
-	}
-
-}).alias({
-	toJSON: 'toISOString',
-	compare: 'diff',
-	strftime: 'format'
-});
-
-// The day and month abbreviations are standardized, so we cannot use simply %a and %b because they will get localized
-var rfcDayAbbr = ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'],
-	rfcMonthAbbr = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'];
-
-var formats = {
-	db: '%Y-%m-%d %H:%M:%S',
-	compact: '%Y%m%dT%H%M%S',
-	'short': '%d %b %H:%M',
-	'long': '%B %d, %Y %H:%M',
-	rfc822: function(date){
-		return rfcDayAbbr[date.get('day')] + date.format(', %d ') + rfcMonthAbbr[date.get('month')] + date.format(' %Y %H:%M:%S %Z');
-	},
-	rfc2822: function(date){
-		return rfcDayAbbr[date.get('day')] + date.format(', %d ') + rfcMonthAbbr[date.get('month')] + date.format(' %Y %H:%M:%S %z');
-	},
-	iso8601: function(date){
-		return (
-			date.getUTCFullYear() + '-' +
-			pad(date.getUTCMonth() + 1, 2) + '-' +
-			pad(date.getUTCDate(), 2) + 'T' +
-			pad(date.getUTCHours(), 2) + ':' +
-			pad(date.getUTCMinutes(), 2) + ':' +
-			pad(date.getUTCSeconds(), 2) + '.' +
-			pad(date.getUTCMilliseconds(), 3) + 'Z'
-		);
-	}
-};
-
-var parsePatterns = [],
-	nativeParse = Date.parse;
-
-var parseWord = function(type, word, num){
-	var ret = -1,
-		translated = Date.getMsg(type + 's');
-	switch (typeOf(word)){
-		case 'object':
-			ret = translated[word.get(type)];
-			break;
-		case 'number':
-			ret = translated[word];
-			if (!ret) throw new Error('Invalid ' + type + ' index: ' + word);
-			break;
-		case 'string':
-			var match = translated.filter(function(name){
-				return this.test(name);
-			}, new RegExp('^' + word, 'i'));
-			if (!match.length) throw new Error('Invalid ' + type + ' string');
-			if (match.length > 1) throw new Error('Ambiguous ' + type);
-			ret = match[0];
-	}
-
-	return (num) ? translated.indexOf(ret) : ret;
-};
-
-var startCentury = 1900,
-	startYear = 70;
-
-Date.extend({
-
-	getMsg: function(key, args){
-		return Locale.get('Date.' + key, args);
-	},
-
-	units: {
-		ms: Function.convert(1),
-		second: Function.convert(1000),
-		minute: Function.convert(60000),
-		hour: Function.convert(3600000),
-		day: Function.convert(86400000),
-		week: Function.convert(608400000),
-		month: function(month, year){
-			var d = new Date;
-			return Date.daysInMonth(month != null ? month : d.get('mo'), year != null ? year : d.get('year')) * 86400000;
-		},
-		year: function(year){
-			year = year || new Date().get('year');
-			return Date.isLeapYear(year) ? 31622400000 : 31536000000;
-		}
-	},
-
-	daysInMonth: function(month, year){
-		return [31, Date.isLeapYear(year) ? 29 : 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31][month];
-	},
-
-	isLeapYear: function(year){
-		return ((year % 4 === 0) && (year % 100 !== 0)) || (year % 400 === 0);
-	},
-
-	parse: function(from){
-		var t = typeOf(from);
-		if (t == 'number') return new Date(from);
-		if (t != 'string') return from;
-		from = from.clean();
-		if (!from.length) return null;
-
-		var parsed;
-		parsePatterns.some(function(pattern){
-			var bits = pattern.re.exec(from);
-			return (bits) ? (parsed = pattern.handler(bits)) : false;
-		});
-
-		if (!(parsed && parsed.isValid())){
-			parsed = new Date(nativeParse(from));
-			if (!(parsed && parsed.isValid())) parsed = new Date(from.toInt());
-		}
-		return parsed;
-	},
-
-	parseDay: function(day, num){
-		return parseWord('day', day, num);
-	},
-
-	parseMonth: function(month, num){
-		return parseWord('month', month, num);
-	},
-
-	parseUTC: function(value){
-		var localDate = new Date(value);
-		var utcSeconds = Date.UTC(
-			localDate.get('year'),
-			localDate.get('mo'),
-			localDate.get('date'),
-			localDate.get('hr'),
-			localDate.get('min'),
-			localDate.get('sec'),
-			localDate.get('ms')
-		);
-		return new Date(utcSeconds);
-	},
-
-	orderIndex: function(unit){
-		return Date.getMsg('dateOrder').indexOf(unit) + 1;
-	},
-
-	defineFormat: function(name, format){
-		formats[name] = format;
-		return this;
-	},
-
-	
-
-	defineParser: function(pattern){
-		parsePatterns.push((pattern.re && pattern.handler) ? pattern : build(pattern));
-		return this;
-	},
-
-	defineParsers: function(){
-		Array.flatten(arguments).each(Date.defineParser);
-		return this;
-	},
-
-	define2DigitYearStart: function(year){
-		startYear = year % 100;
-		startCentury = year - startYear;
-		return this;
-	}
-
-}).extend({
-	defineFormats: Date.defineFormat.overloadSetter()
-});
-
-var regexOf = function(type){
-	return new RegExp('(?:' + Date.getMsg(type).map(function(name){
-		return name.substr(0, 3);
-	}).join('|') + ')[a-z]*');
-};
-
-var replacers = function(key){
-	switch (key){
-		case 'T':
-			return '%H:%M:%S';
-		case 'x': // iso8601 covers yyyy-mm-dd, so just check if month is first
-			return ((Date.orderIndex('month') == 1) ? '%m[-./]%d' : '%d[-./]%m') + '([-./]%y)?';
-		case 'X':
-			return '%H([.:]%M)?([.:]%S([.:]%s)?)? ?%p? ?%z?';
-	}
-	return null;
-};
-
-var keys = {
-	d: /[0-2]?[0-9]|3[01]/,
-	H: /[01]?[0-9]|2[0-3]/,
-	I: /0?[1-9]|1[0-2]/,
-	M: /[0-5]?\d/,
-	s: /\d+/,
-	o: /[a-z]*/,
-	p: /[ap]\.?m\.?/,
-	y: /\d{2}|\d{4}/,
-	Y: /\d{4}/,
-	z: /Z|[+-]\d{2}(?::?\d{2})?/
-};
-
-keys.m = keys.I;
-keys.S = keys.M;
-
-var currentLanguage;
-
-var recompile = function(language){
-	currentLanguage = language;
-
-	keys.a = keys.A = regexOf('days');
-	keys.b = keys.B = regexOf('months');
-
-	parsePatterns.each(function(pattern, i){
-		if (pattern.format) parsePatterns[i] = build(pattern.format);
-	});
-};
-
-var build = function(format){
-	if (!currentLanguage) return {format: format};
-
-	var parsed = [];
-	var re = (format.source || format) // allow format to be regex
-	.replace(/%([a-z])/gi,
-		function($0, $1){
-			return replacers($1) || $0;
-		}
-	).replace(/\((?!\?)/g, '(?:') // make all groups non-capturing
-	.replace(/ (?!\?|\*)/g, ',? ') // be forgiving with spaces and commas
-	.replace(/%([a-z%])/gi,
-		function($0, $1){
-			var p = keys[$1];
-			if (!p) return $1;
-			parsed.push($1);
-			return '(' + p.source + ')';
-		}
-	).replace(/\[a-z\]/gi, '[a-z\\u00c0-\\uffff;\&]'); // handle unicode words
-
-	return {
-		format: format,
-		re: new RegExp('^' + re + '$', 'i'),
-		handler: function(bits){
-			bits = bits.slice(1).associate(parsed);
-			var date = new Date().clearTime(),
-				year = bits.y || bits.Y;
-
-			if (year != null) handle.call(date, 'y', year); // need to start in the right year
-			if ('d' in bits) handle.call(date, 'd', 1);
-			if ('m' in bits || bits.b || bits.B) handle.call(date, 'm', 1);
-
-			for (var key in bits) handle.call(date, key, bits[key]);
-			return date;
-		}
-	};
-};
-
-var handle = function(key, value){
-	if (!value) return this;
-
-	switch (key){
-		case 'a': case 'A': return this.set('day', Date.parseDay(value, true));
-		case 'b': case 'B': return this.set('mo', Date.parseMonth(value, true));
-		case 'd': return this.set('date', value);
-		case 'H': case 'I': return this.set('hr', value);
-		case 'm': return this.set('mo', value - 1);
-		case 'M': return this.set('min', value);
-		case 'p': return this.set('ampm', value.replace(/\./g, ''));
-		case 'S': return this.set('sec', value);
-		case 's': return this.set('ms', ('0.' + value) * 1000);
-		case 'w': return this.set('day', value);
-		case 'Y': return this.set('year', value);
-		case 'y':
-			value = +value;
-			if (value < 100) value += startCentury + (value < startYear ? 100 : 0);
-			return this.set('year', value);
-		case 'z':
-			if (value == 'Z') value = '+00';
-			var offset = value.match(/([+-])(\d{2}):?(\d{2})?/);
-			offset = (offset[1] + '1') * (offset[2] * 60 + (+offset[3] || 0)) + this.getTimezoneOffset();
-			return this.set('time', this - offset * 60000);
-	}
-
-	return this;
-};
-
-Date.defineParsers(
-	'%Y([-./]%m([-./]%d((T| )%X)?)?)?', // "1999-12-31", "1999-12-31 11:59pm", "1999-12-31 23:59:59", ISO8601
-	'%Y%m%d(T%H(%M%S?)?)?', // "19991231", "19991231T1159", compact
-	'%x( %X)?', // "12/31", "12.31.99", "12-31-1999", "12/31/2008 11:59 PM"
-	'%d%o( %b( %Y)?)?( %X)?', // "31st", "31st December", "31 Dec 1999", "31 Dec 1999 11:59pm"
-	'%b( %d%o)?( %Y)?( %X)?', // Same as above with month and day switched
-	'%Y %b( %d%o( %X)?)?', // Same as above with year coming first
-	'%o %b %d %X %z %Y', // "Thu Oct 22 08:11:23 +0000 2009"
-	'%T', // %H:%M:%S
-	'%H:%M( ?%p)?' // "11:05pm", "11:05 am" and "11:05"
-);
-
-Locale.addEvent('change', function(language){
-	if (Locale.get('Date')) recompile(language);
-}).fireEvent('change', Locale.getCurrent());
-
-})();
-
-/*
----
-
-name: Locale.en-US.Form.Validator
-
-description: Form Validator messages for English.
-
-license: MIT-style license
-
-authors:
-  - Aaron Newton
-
-requires:
-  - Locale
-
-provides: [Locale.en-US.Form.Validator]
-
-...
-*/
-
-Locale.define('en-US', 'FormValidator', {
-
-	required: 'This field is required.',
-	length: 'Please enter {length} characters (you entered {elLength} characters)',
-	minLength: 'Please enter at least {minLength} characters (you entered {length} characters).',
-	maxLength: 'Please enter no more than {maxLength} characters (you entered {length} characters).',
-	integer: 'Please enter an integer in this field. Numbers with decimals (e.g. 1.25) are not permitted.',
-	numeric: 'Please enter only numeric values in this field (i.e. "1" or "1.1" or "-1" or "-1.1").',
-	digits: 'Please use numbers and punctuation only in this field (for example, a phone number with dashes or dots is permitted).',
-	alpha: 'Please use only letters (a-z) within this field. No spaces or other characters are allowed.',
-	alphanum: 'Please use only letters (a-z) or numbers (0-9) in this field. No spaces or other characters are allowed.',
-	dateSuchAs: 'Please enter a valid date such as {date}',
-	dateInFormatMDY: 'Please enter a valid date such as MM/DD/YYYY (i.e. "12/31/1999")',
-	email: 'Please enter a valid email address. For example "fred@domain.com".',
-	url: 'Please enter a valid URL such as http://www.example.com.',
-	currencyDollar: 'Please enter a valid $ amount. For example $100.00 .',
-	oneRequired: 'Please enter something for at least one of these inputs.',
-	errorPrefix: 'Error: ',
-	warningPrefix: 'Warning: ',
-
-	// Form.Validator.Extras
-	noSpace: 'There can be no spaces in this input.',
-	reqChkByNode: 'No items are selected.',
-	requiredChk: 'This field is required.',
-	reqChkByName: 'Please select a {label}.',
-	match: 'This field needs to match the {matchName} field',
-	startDate: 'the start date',
-	endDate: 'the end date',
-	currentDate: 'the current date',
-	afterDate: 'The date should be the same or after {label}.',
-	beforeDate: 'The date should be the same or before {label}.',
-	startMonth: 'Please select a start month',
-	sameMonth: 'These two dates must be in the same month - you must change one or the other.',
-	creditcard: 'The credit card number entered is invalid. Please check the number and try again. {length} digits entered.'
-
-});
-
-/*
----
-
-script: Form.Validator.js
-
-name: Form.Validator
-
-description: A css-class based form validation system.
-
-license: MIT-style license
-
-authors:
-  - Aaron Newton
-
-requires:
-  - Core/Options
-  - Core/Events
-  - Core/Element.Delegation
-  - Core/Slick.Finder
-  - Core/Element.Event
-  - Core/Element.Style
-  - Core/JSON
-  - Locale
-  - Class.Binds
-  - Date
-  - Element.Forms
-  - Locale.en-US.Form.Validator
-  - Element.Shortcuts
-
-provides: [Form.Validator, InputValidator, FormValidator.BaseValidators]
-
-...
-*/
-if (!window.Form) window.Form = {};
-
-var InputValidator = this.InputValidator = new Class({
-
-	Implements: [Options],
-
-	options: {
-		errorMsg: 'Validation failed.',
-		test: Function.convert(true)
-	},
-
-	initialize: function(className, options){
-		this.setOptions(options);
-		this.className = className;
-	},
-
-	test: function(field, props){
-		field = document.id(field);
-		return (field) ? this.options.test(field, props || this.getProps(field)) : false;
-	},
-
-	getError: function(field, props){
-		field = document.id(field);
-		var err = this.options.errorMsg;
-		if (typeOf(err) == 'function') err = err(field, props || this.getProps(field));
-		return err;
-	},
-
-	getProps: function(field){
-		field = document.id(field);
-		return (field) ? field.get('validatorProps') : {};
-	}
-
-});
-
-Element.Properties.validators = {
-
-	get: function(){
-		return (this.get('data-validators') || this.className).clean().replace(/'(\\.|[^'])*'|"(\\.|[^"])*"/g, function(match){
-			return match.replace(' ', '\\x20');
-		}).split(' ');
-	}
-
-};
-
-Element.Properties.validatorProps = {
-
-	set: function(props){
-		return this.eliminate('$moo:validatorProps').store('$moo:validatorProps', props);
-	},
-
-	get: function(props){
-		if (props) this.set(props);
-		if (this.retrieve('$moo:validatorProps')) return this.retrieve('$moo:validatorProps');
-		if (this.getProperty('data-validator-properties') || this.getProperty('validatorProps')){
-			try {
-				this.store('$moo:validatorProps', JSON.decode(this.getProperty('validatorProps') || this.getProperty('data-validator-properties'), false));
-			} catch (e){
-				return {};
-			}
-		} else {
-			var vals = this.get('validators').filter(function(cls){
-				return cls.test(':');
-			});
-			if (!vals.length){
-				this.store('$moo:validatorProps', {});
-			} else {
-				props = {};
-				vals.each(function(cls){
-					var split = cls.split(':');
-					if (split[1]){
-						try {
-							props[split[0]] = JSON.decode(split[1], false);
-						} catch (e){}
-					}
-				});
-				this.store('$moo:validatorProps', props);
-			}
-		}
-		return this.retrieve('$moo:validatorProps');
-	}
-
-};
-
-Form.Validator = new Class({
-
-	Implements: [Options, Events],
-
-	options: {/*
-		onFormValidate: function(isValid, form, event){},
-		onElementValidate: function(isValid, field, className, warn){},
-		onElementPass: function(field){},
-		onElementFail: function(field, validatorsFailed){}, */
-		fieldSelectors: 'input, select, textarea',
-		ignoreHidden: true,
-		ignoreDisabled: true,
-		useTitles: false,
-		evaluateOnSubmit: true,
-		evaluateFieldsOnBlur: true,
-		evaluateFieldsOnChange: true,
-		serial: true,
-		stopOnFailure: true,
-		warningPrefix: function(){
-			return Form.Validator.getMsg('warningPrefix') || 'Warning: ';
-		},
-		errorPrefix: function(){
-			return Form.Validator.getMsg('errorPrefix') || 'Error: ';
-		}
-	},
-
-	initialize: function(form, options){
-		this.setOptions(options);
-		this.element = document.id(form);
-		this.warningPrefix = Function.convert(this.options.warningPrefix)();
-		this.errorPrefix = Function.convert(this.options.errorPrefix)();
-		this._bound = {
-			onSubmit: this.onSubmit.bind(this),
-			blurOrChange: function(event, field){
-				this.validationMonitor(field, true);
-			}.bind(this)
-		};
-		this.enable();
-	},
-
-	toElement: function(){
-		return this.element;
-	},
-
-	getFields: function(){
-		return (this.fields = this.element.getElements(this.options.fieldSelectors));
-	},
-
-	enable: function(){
-		this.element.store('validator', this);
-		if (this.options.evaluateOnSubmit) this.element.addEvent('submit', this._bound.onSubmit);
-		if (this.options.evaluateFieldsOnBlur){
-			this.element.addEvent('blur:relay(input,select,textarea)', this._bound.blurOrChange);
-		}
-		if (this.options.evaluateFieldsOnChange){
-			this.element.addEvent('change:relay(input,select,textarea)', this._bound.blurOrChange);
-		}
-	},
-
-	disable: function(){
-		this.element.eliminate('validator');
-		this.element.removeEvents({
-			submit: this._bound.onSubmit,
-			'blur:relay(input,select,textarea)': this._bound.blurOrChange,
-			'change:relay(input,select,textarea)': this._bound.blurOrChange
-		});
-	},
-
-	validationMonitor: function(){
-		clearTimeout(this.timer);
-		this.timer = this.validateField.delay(50, this, arguments);
-	},
-
-	onSubmit: function(event){
-		if (this.validate(event)) this.reset();
-	},
-
-	reset: function(){
-		this.getFields().each(this.resetField, this);
-		return this;
-	},
-
-	validate: function(event){
-		var result = this.getFields().map(function(field){
-			return this.validateField(field, true);
-		}, this).every(function(v){
-			return v;
-		});
-		this.fireEvent('formValidate', [result, this.element, event]);
-		if (this.options.stopOnFailure && !result && event) event.preventDefault();
-		return result;
-	},
-
-	validateField: function(field, force){
-		if (this.paused) return true;
-		field = document.id(field);
-		var passed = !field.hasClass('validation-failed');
-		var failed, warned;
-		if (this.options.serial && !force){
-			failed = this.element.getElement('.validation-failed');
-			warned = this.element.getElement('.warning');
-		}
-		if (field && (!failed || force || field.hasClass('validation-failed') || (failed && !this.options.serial))){
-			var validationTypes = field.get('validators');
-			var validators = validationTypes.some(function(cn){
-				return this.getValidator(cn);
-			}, this);
-			var validatorsFailed = [];
-			validationTypes.each(function(className){
-				if (className && !this.test(className, field)) validatorsFailed.include(className);
-			}, this);
-			passed = validatorsFailed.length === 0;
-			if (validators && !this.hasValidator(field, 'warnOnly')){
-				if (passed){
-					field.addClass('validation-passed').removeClass('validation-failed');
-					this.fireEvent('elementPass', [field]);
-				} else {
-					field.addClass('validation-failed').removeClass('validation-passed');
-					this.fireEvent('elementFail', [field, validatorsFailed]);
-				}
-			}
-			if (!warned){
-				var warnings = validationTypes.some(function(cn){
-					if (cn.test('^warn'))
-						return this.getValidator(cn.replace(/^warn-/,''));
-					else return null;
-				}, this);
-				field.removeClass('warning');
-				var warnResult = validationTypes.map(function(cn){
-					if (cn.test('^warn'))
-						return this.test(cn.replace(/^warn-/,''), field, true);
-					else return null;
-				}, this);
-			}
-		}
-		return passed;
-	},
-
-	test: function(className, field, warn){
-		field = document.id(field);
-		if ((this.options.ignoreHidden && !field.isVisible()) || (this.options.ignoreDisabled && field.get('disabled'))) return true;
-		var validator = this.getValidator(className);
-		if (warn != null) warn = false;
-		if (this.hasValidator(field, 'warnOnly')) warn = true;
-		var isValid = field.hasClass('ignoreValidation') || (validator ? validator.test(field) : true);
-		if (validator) this.fireEvent('elementValidate', [isValid, field, className, warn]);
-		if (warn) return true;
-		return isValid;
-	},
-
-	hasValidator: function(field, value){
-		return field.get('validators').contains(value);
-	},
-
-	resetField: function(field){
-		field = document.id(field);
-		if (field){
-			field.get('validators').each(function(className){
-				if (className.test('^warn-')) className = className.replace(/^warn-/, '');
-				field.removeClass('validation-failed');
-				field.removeClass('warning');
-				field.removeClass('validation-passed');
-			}, this);
-		}
-		return this;
-	},
-
-	stop: function(){
-		this.paused = true;
-		return this;
-	},
-
-	start: function(){
-		this.paused = false;
-		return this;
-	},
-
-	ignoreField: function(field, warn){
-		field = document.id(field);
-		if (field){
-			this.enforceField(field);
-			if (warn) field.addClass('warnOnly');
-			else field.addClass('ignoreValidation');
-		}
-		return this;
-	},
-
-	enforceField: function(field){
-		field = document.id(field);
-		if (field) field.removeClass('warnOnly').removeClass('ignoreValidation');
-		return this;
-	}
-
-});
-
-Form.Validator.getMsg = function(key){
-	return Locale.get('FormValidator.' + key);
-};
-
-Form.Validator.adders = {
-
-	validators:{},
-
-	add : function(className, options){
-		this.validators[className] = new InputValidator(className, options);
-		//if this is a class (this method is used by instances of Form.Validator and the Form.Validator namespace)
-		//extend these validators into it
-		//this allows validators to be global and/or per instance
-		if (!this.initialize){
-			this.implement({
-				validators: this.validators
-			});
-		}
-	},
-
-	addAllThese : function(validators){
-		Array.convert(validators).each(function(validator){
-			this.add(validator[0], validator[1]);
-		}, this);
-	},
-
-	getValidator: function(className){
-		return this.validators[className.split(':')[0]];
-	}
-
-};
-
-Object.append(Form.Validator, Form.Validator.adders);
-
-Form.Validator.implement(Form.Validator.adders);
-
-Form.Validator.add('IsEmpty', {
-
-	errorMsg: false,
-	test: function(element){
-		if (element.type == 'select-one' || element.type == 'select')
-			return !(element.selectedIndex >= 0 && element.options[element.selectedIndex].value != '');
-		else
-			return ((element.get('value') == null) || (element.get('value').length == 0));
-	}
-
-});
-
-Form.Validator.addAllThese([
-
-	['required', {
-		errorMsg: function(){
-			return Form.Validator.getMsg('required');
-		},
-		test: function(element){
-			return !Form.Validator.getValidator('IsEmpty').test(element);
-		}
-	}],
-
-	['length', {
-		errorMsg: function(element, props){
-			if (typeOf(props.length) != 'null')
-				return Form.Validator.getMsg('length').substitute({length: props.length, elLength: element.get('value').length});
-			else return '';
-		},
-		test: function(element, props){
-			if (typeOf(props.length) != 'null') return (element.get('value').length == props.length || element.get('value').length == 0);
-			else return true;
-		}
-	}],
-
-	['minLength', {
-		errorMsg: function(element, props){
-			if (typeOf(props.minLength) != 'null')
-				return Form.Validator.getMsg('minLength').substitute({minLength: props.minLength, length: element.get('value').length});
-			else return '';
-		},
-		test: function(element, props){
-			if (typeOf(props.minLength) != 'null') return (element.get('value').length >= (props.minLength || 0));
-			else return true;
-		}
-	}],
-
-	['maxLength', {
-		errorMsg: function(element, props){
-			//props is {maxLength:10}
-			if (typeOf(props.maxLength) != 'null')
-				return Form.Validator.getMsg('maxLength').substitute({maxLength: props.maxLength, length: element.get('value').length});
-			else return '';
-		},
-		test: function(element, props){
-			return element.get('value').length <= (props.maxLength || 10000);
-		}
-	}],
-
-	['validate-integer', {
-		errorMsg: Form.Validator.getMsg.pass('integer'),
-		test: function(element){
-			return Form.Validator.getValidator('IsEmpty').test(element) || (/^(-?[1-9]\d*|0)$/).test(element.get('value'));
-		}
-	}],
-
-	['validate-numeric', {
-		errorMsg: Form.Validator.getMsg.pass('numeric'),
-		test: function(element){
-			return Form.Validator.getValidator('IsEmpty').test(element) ||
-				(/^-?(?:0$0(?=\d*\.)|[1-9]|0)\d*(\.\d+)?$/).test(element.get('value'));
-		}
-	}],
-
-	['validate-digits', {
-		errorMsg: Form.Validator.getMsg.pass('digits'),
-		test: function(element){
-			return Form.Validator.getValidator('IsEmpty').test(element) || (/^[\d() .:\-\+#]+$/.test(element.get('value')));
-		}
-	}],
-
-	['validate-alpha', {
-		errorMsg: Form.Validator.getMsg.pass('alpha'),
-		test: function(element){
-			return Form.Validator.getValidator('IsEmpty').test(element) || (/^[a-zA-Z]+$/).test(element.get('value'));
-		}
-	}],
-
-	['validate-alphanum', {
-		errorMsg: Form.Validator.getMsg.pass('alphanum'),
-		test: function(element){
-			return Form.Validator.getValidator('IsEmpty').test(element) || !(/\W/).test(element.get('value'));
-		}
-	}],
-
-	['validate-date', {
-		errorMsg: function(element, props){
-			if (Date.parse){
-				var format = props.dateFormat || '%x';
-				return Form.Validator.getMsg('dateSuchAs').substitute({date: new Date().format(format)});
-			} else {
-				return Form.Validator.getMsg('dateInFormatMDY');
-			}
-		},
-		test: function(element, props){
-			if (Form.Validator.getValidator('IsEmpty').test(element)) return true;
-			var dateLocale = Locale.get('Date'),
-				dateNouns = new RegExp([dateLocale.days, dateLocale.days_abbr, dateLocale.months, dateLocale.months_abbr, dateLocale.AM, dateLocale.PM].flatten().join('|'), 'i'),
-				value = element.get('value'),
-				wordsInValue = value.match(/[a-z]+/gi);
-
-			if (wordsInValue && !wordsInValue.every(dateNouns.exec, dateNouns)) return false;
-
-			var date = Date.parse(value);
-			if (!date) return false;
-
-			var format = props.dateFormat || '%x',
-				formatted = date.format(format);
-			if (formatted != 'invalid date') element.set('value', formatted);
-			return date.isValid();
-		}
-	}],
-
-	['validate-email', {
-		errorMsg: Form.Validator.getMsg.pass('email'),
-		test: function(element){
-			/*
-			var chars = "[a-z0-9!#$%&'*+/=?^_`{|}~-]",
-				local = '(?:' + chars + '\\.?){0,63}' + chars,
-
-				label = '[a-z0-9](?:[a-z0-9-]{0,61}[a-z0-9])?',
-				hostname = '(?:' + label + '\\.)*' + label;
-
-				octet = '(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)',
-				ipv4 = '\\[(?:' + octet + '\\.){3}' + octet + '\\]',
-
-				domain = '(?:' + hostname + '|' + ipv4 + ')';
-
-			var regex = new RegExp('^' + local + '@' + domain + '$', 'i');
-			*/
-			return Form.Validator.getValidator('IsEmpty').test(element) || (/^(?:[a-z0-9!#$%&'*+\/=?^_`{|}~-]\.?){0,63}[a-z0-9!#$%&'*+\/=?^_`{|}~-]@(?:(?:[a-z0-9](?:[a-z0-9-]{0,61}[a-z0-9])?\.)*[a-z0-9](?:[a-z0-9-]{0,61}[a-z0-9])?|\[(?:(?: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]?)\])$/i).test(element.get('value'));
-		}
-	}],
-
-	['validate-url', {
-		errorMsg: Form.Validator.getMsg.pass('url'),
-		test: function(element){
-			return Form.Validator.getValidator('IsEmpty').test(element) || (/^(https?|ftp|rmtp|mms):\/\/(([A-Z0-9][A-Z0-9_-]*)(\.[A-Z0-9][A-Z0-9_-]*)+)(:(\d+))?\/?/i).test(element.get('value'));
-		}
-	}],
-
-	['validate-currency-dollar', {
-		errorMsg: Form.Validator.getMsg.pass('currencyDollar'),
-		test: function(element){
-			return Form.Validator.getValidator('IsEmpty').test(element) || (/^\$?\-?([1-9]{1}[0-9]{0,2}(\,[0-9]{3})*(\.[0-9]{0,2})?|[1-9]{1}\d*(\.[0-9]{0,2})?|0(\.[0-9]{0,2})?|(\.[0-9]{1,2})?)$/).test(element.get('value'));
-		}
-	}],
-
-	['validate-one-required', {
-		errorMsg: Form.Validator.getMsg.pass('oneRequired'),
-		test: function(element, props){
-			var p = document.id(props['validate-one-required']) || element.getParent(props['validate-one-required']);
-			return p.getElements('input').some(function(el){
-				if (['checkbox', 'radio'].contains(el.get('type'))) return el.get('checked');
-				return el.get('value');
-			});
-		}
-	}]
-
-]);
-
-Element.Properties.validator = {
-
-	set: function(options){
-		this.get('validator').setOptions(options);
-	},
-
-	get: function(){
-		var validator = this.retrieve('validator');
-		if (!validator){
-			validator = new Form.Validator(this);
-			this.store('validator', validator);
-		}
-		return validator;
-	}
-
-};
-
-Element.implement({
-
-	validate: function(options){
-		if (options) this.set('validator', options);
-		return this.get('validator').validate();
-	}
-
-});
-
-
-
-
-
-
-/*
----
-
-script: Form.Validator.Extras.js
-
-name: Form.Validator.Extras
-
-description: Additional validators for the Form.Validator class.
-
-license: MIT-style license
-
-authors:
-  - Aaron Newton
-
-requires:
-  - Form.Validator
-
-provides: [Form.Validator.Extras]
-
-...
-*/
-
-(function(){
-
-function getItems(props, preference, children, cssSelector){
-	if (preference && props[preference]) return props[preference];
-	var el = document.id(props[children]);
-	if (!el) return [];
-	return el.getElements(cssSelector);
-}
-
-Form.Validator.addAllThese([
-
-	['validate-enforce-oncheck', {
-		test: function(element, props){
-			var fv = element.getParent('form').retrieve('validator');
-			if (!fv) return true;
-			getItems(props, 'toEnforce', 'enforceChildrenOf', 'input, select, textarea').each(function(item){
-				if (element.checked){
-					fv.enforceField(item);
-				} else {
-					fv.ignoreField(item);
-					fv.resetField(item);
-				}
-			});
-			return true;
-		}
-	}],
-
-	['validate-ignore-oncheck', {
-		test: function(element, props){
-			var fv = element.getParent('form').retrieve('validator');
-			if (!fv) return true;
-			getItems(props, 'toIgnore', 'ignoreChildrenOf', 'input, select, textarea').each(function(item){
-				if (element.checked){
-					fv.ignoreField(item);
-					fv.resetField(item);
-				} else {
-					fv.enforceField(item);
-				}
-			});
-			return true;
-		}
-	}],
-
-	['validate-enforce-onselect-value', {
-		test: function(element, props){
-			if (!props.value) return true;
-			var fv = element.getParent('form').retrieve('validator');
-			if (!fv) return true;
-			getItems(props, 'toEnforce', 'enforceChildrenOf', 'input, select, textarea').each(function(item){
-				if (props.value == element.value){
-					fv.enforceField(item);
-				} else {
-					fv.ignoreField(item);
-					fv.resetField(item);
-				}
-			});
-			return true;
-		}
-	}],
-
-	['validate-nospace', {
-		errorMsg: function(){
-			return Form.Validator.getMsg('noSpace');
-		},
-		test: function(element, props){
-			return !element.get('value').test(/\s/);
-		}
-	}],
-
-	['validate-toggle-oncheck', {
-		test: function(element, props){
-			var fv = element.getParent('form').retrieve('validator');
-			if (!fv) return true;
-			var eleArr = getItems(props, 'toToggle', 'toToggleChildrenOf', 'input, select, textarea');
-			if (!element.checked){
-				eleArr.each(function(item){
-					fv.ignoreField(item);
-					fv.resetField(item);
-				});
-			} else {
-				eleArr.each(function(item){
-					fv.enforceField(item);
-				});
-			}
-			return true;
-		}
-	}],
-
-	['validate-reqchk-bynode', {
-		errorMsg: function(){
-			return Form.Validator.getMsg('reqChkByNode');
-		},
-		test: function(element, props){
-			return getItems(props, false, 'nodeId', props.selector || 'input[type=checkbox], input[type=radio]').some(function(item){
-				return item.checked;
-			});
-		}
-	}],
-
-	['validate-required-check', {
-		errorMsg: function(element, props){
-			return props.useTitle ? element.get('title') : Form.Validator.getMsg('requiredChk');
-		},
-		test: function(element, props){
-			return !!element.checked;
-		}
-	}],
-
-	['validate-reqchk-byname', {
-		errorMsg: function(element, props){
-			return Form.Validator.getMsg('reqChkByName').substitute({label: props.label || element.get('type')});
-		},
-		test: function(element, props){
-			var grpName = props.groupName || element.get('name');
-			var grpNameEls = $$('[name=' + grpName +']');
-			var oneCheckedItem = grpNameEls.some(function(item, index){
-				return item.checked;
-			});
-			var fv = element.getParent('form').retrieve('validator');
-			if (oneCheckedItem && fv){
-				grpNameEls.each(function(item, index){ fv.resetField(item); });
-			}
-			return oneCheckedItem;
-		}
-	}],
-
-	['validate-match', {
-		errorMsg: function(element, props){
-			return Form.Validator.getMsg('match').substitute({matchName: decodeURIComponent((props.matchName+'').replace(/\+/g, '%20')) || document.id(props.matchInput).get('name')});
-		},
-		test: function(element, props){
-			var eleVal = element.get('value');
-			var matchVal = document.id(props.matchInput) && document.id(props.matchInput).get('value');
-			return eleVal && matchVal ? eleVal == matchVal : true;
-		}
-	}],
-
-	['validate-after-date', {
-		errorMsg: function(element, props){
-			return Form.Validator.getMsg('afterDate').substitute({
-				label: props.afterLabel || (props.afterElement ? Form.Validator.getMsg('startDate') : Form.Validator.getMsg('currentDate'))
-			});
-		},
-		test: function(element, props){
-			var start = document.id(props.afterElement) ? Date.parse(document.id(props.afterElement).get('value')) : new Date();
-			var end = Date.parse(element.get('value'));
-			return end && start ? end >= start : true;
-		}
-	}],
-
-	['validate-before-date', {
-		errorMsg: function(element, props){
-			return Form.Validator.getMsg('beforeDate').substitute({
-				label: props.beforeLabel || (props.beforeElement ? Form.Validator.getMsg('endDate') : Form.Validator.getMsg('currentDate'))
-			});
-		},
-		test: function(element, props){
-			var start = Date.parse(element.get('value'));
-			var end = document.id(props.beforeElement) ? Date.parse(document.id(props.beforeElement).get('value')) : new Date();
-			return end && start ? end >= start : true;
-		}
-	}],
-
-	['validate-custom-required', {
-		errorMsg: function(){
-			return Form.Validator.getMsg('required');
-		},
-		test: function(element, props){
-			return element.get('value') != props.emptyValue;
-		}
-	}],
-
-	['validate-same-month', {
-		errorMsg: function(element, props){
-			var startMo = document.id(props.sameMonthAs) && document.id(props.sameMonthAs).get('value');
-			var eleVal = element.get('value');
-			if (eleVal != '') return Form.Validator.getMsg(startMo ? 'sameMonth' : 'startMonth');
-		},
-		test: function(element, props){
-			var d1 = Date.parse(element.get('value'));
-			var d2 = Date.parse(document.id(props.sameMonthAs) && document.id(props.sameMonthAs).get('value'));
-			return d1 && d2 ? d1.format('%B') == d2.format('%B') : true;
-		}
-	}],
-
-
-	['validate-cc-num', {
-		errorMsg: function(element){
-			var ccNum = element.get('value').replace(/[^0-9]/g, '');
-			return Form.Validator.getMsg('creditcard').substitute({length: ccNum.length});
-		},
-		test: function(element){
-			// required is a different test
-			if (Form.Validator.getValidator('IsEmpty').test(element)) return true;
-
-			// Clean number value
-			var ccNum = element.get('value');
-			ccNum = ccNum.replace(/[^0-9]/g, '');
-
-			var validType = false;
-
-			if (ccNum.test(/^4[0-9]{12}([0-9]{3})?$/)) validType = 'Visa';
-			else if (ccNum.test(/^5[1-5]([0-9]{14})$/)) validType = 'Master Card';
-			else if (ccNum.test(/^3[47][0-9]{13}$/)) validType = 'American Express';
-			else if (ccNum.test(/^6(?:011|5[0-9]{2})[0-9]{12}$/)) validType = 'Discover';
-			else if (ccNum.test(/^3(?:0[0-5]|[68][0-9])[0-9]{11}$/)) validType = 'Diners Club';
-
-			if (validType){
-				var sum = 0;
-				var cur = 0;
-
-				for (var i=ccNum.length-1; i>=0; --i){
-					cur = ccNum.charAt(i).toInt();
-					if (cur == 0) continue;
-
-					if ((ccNum.length-i) % 2 == 0) cur += cur;
-					if (cur > 9){
-						cur = cur.toString().charAt(0).toInt() + cur.toString().charAt(1).toInt();
-					}
-
-					sum += cur;
-				}
-				if ((sum % 10) == 0) return true;
-			}
-
-			var chunks = '';
-			while (ccNum != ''){
-				chunks += ' ' + ccNum.substr(0,4);
-				ccNum = ccNum.substr(4);
-			}
-
-			element.getParent('form').retrieve('validator').ignoreField(element);
-			element.set('value', chunks.clean());
-			element.getParent('form').retrieve('validator').enforceField(element);
-			return false;
-		}
-	}]
-
-]);
-
-})();
-
-/*
----
-
-script: Form.Validator.Inline.js
-
-name: Form.Validator.Inline
-
-description: Extends Form.Validator to add inline messages.
-
-license: MIT-style license
-
-authors:
-  - Aaron Newton
-
-requires:
-  - Form.Validator
-
-provides: [Form.Validator.Inline]
-
-...
-*/
-
-Form.Validator.Inline = new Class({
-
-	Extends: Form.Validator,
-
-	options: {
-		showError: function(errorElement){
-			if (errorElement.reveal) errorElement.reveal();
-			else errorElement.setStyle('display', 'block');
-		},
-		hideError: function(errorElement){
-			if (errorElement.dissolve) errorElement.dissolve();
-			else errorElement.setStyle('display', 'none');
-		},
-		scrollToErrorsOnSubmit: true,
-		scrollToErrorsOnBlur: false,
-		scrollToErrorsOnChange: false,
-		scrollFxOptions: {
-			transition: 'quad:out',
-			offset: {
-				y: -20
-			}
-		}
-	},
-
-	initialize: function(form, options){
-		this.parent(form, options);
-		this.addEvent('onElementValidate', function(isValid, field, className, warn){
-			var validator = this.getValidator(className);
-			if (!isValid && validator.getError(field)){
-				if (warn) field.addClass('warning');
-				var advice = this.makeAdvice(className, field, validator.getError(field), warn);
-				this.insertAdvice(advice, field);
-				this.showAdvice(className, field);
-			} else {
-				this.hideAdvice(className, field);
-			}
-		});
-	},
-
-	makeAdvice: function(className, field, error, warn){
-		var errorMsg = (warn) ? this.warningPrefix : this.errorPrefix;
-		errorMsg += (this.options.useTitles) ? field.title || error:error;
-		var cssClass = (warn) ? 'warning-advice' : 'validation-advice';
-		var advice = this.getAdvice(className, field);
-		if (advice){
-			advice = advice.set('html', errorMsg);
-		} else {
-			advice = new Element('div', {
-				html: errorMsg,
-				styles: { display: 'none' },
-				id: 'advice-' + className.split(':')[0] + '-' + this.getFieldId(field)
-			}).addClass(cssClass);
-		}
-		field.store('$moo:advice-' + className, advice);
-		return advice;
-	},
-
-	getFieldId : function(field){
-		return field.id ? field.id : field.id = 'input_' + field.name;
-	},
-
-	showAdvice: function(className, field){
-		var advice = this.getAdvice(className, field);
-		if (
-			advice &&
-			!field.retrieve('$moo:' + this.getPropName(className)) &&
-			(
-				advice.getStyle('display') == 'none' ||
-				advice.getStyle('visibility') == 'hidden' ||
-				advice.getStyle('opacity') == 0
-			)
-		){
-			field.store('$moo:' + this.getPropName(className), true);
-			this.options.showError(advice);
-			this.fireEvent('showAdvice', [field, advice, className]);
-		}
-	},
-
-	hideAdvice: function(className, field){
-		var advice = this.getAdvice(className, field);
-		if (advice && field.retrieve('$moo:' + this.getPropName(className))){
-			field.store('$moo:' + this.getPropName(className), false);
-			this.options.hideError(advice);
-			this.fireEvent('hideAdvice', [field, advice, className]);
-		}
-	},
-
-	getPropName: function(className){
-		return 'advice' + className;
-	},
-
-	resetField: function(field){
-		field = document.id(field);
-		if (!field) return this;
-		this.parent(field);
-		field.get('validators').each(function(className){
-			this.hideAdvice(className, field);
-		}, this);
-		return this;
-	},
-
-	getAllAdviceMessages: function(field, force){
-		var advice = [];
-		if (field.hasClass('ignoreValidation') && !force) return advice;
-		var validators = field.get('validators').some(function(cn){
-			var warner = cn.test('^warn-') || field.hasClass('warnOnly');
-			if (warner) cn = cn.replace(/^warn-/, '');
-			var validator = this.getValidator(cn);
-			if (!validator) return;
-			advice.push({
-				message: validator.getError(field),
-				warnOnly: warner,
-				passed: validator.test(),
-				validator: validator
-			});
-		}, this);
-		return advice;
-	},
-
-	getAdvice: function(className, field){
-		return field.retrieve('$moo:advice-' + className);
-	},
-
-	insertAdvice: function(advice, field){
-		//Check for error position prop
-		var props = field.get('validatorProps');
-		//Build advice
-		if (!props.msgPos || !document.id(props.msgPos)){
-			if (field.type && field.type.toLowerCase() == 'radio') field.getParent().adopt(advice);
-			else advice.inject(document.id(field), 'after');
-		} else {
-			document.id(props.msgPos).grab(advice);
-		}
-	},
-
-	validateField: function(field, force, scroll){
-		var result = this.parent(field, force);
-		if (((this.options.scrollToErrorsOnSubmit && scroll == null) || scroll) && !result){
-			var failed = document.id(this).getElement('.validation-failed');
-			var par = document.id(this).getParent();
-			while (par != document.body && par.getScrollSize().y == par.getSize().y){
-				par = par.getParent();
-			}
-			var fx = par.retrieve('$moo:fvScroller');
-			if (!fx && window.Fx && Fx.Scroll){
-				fx = new Fx.Scroll(par, this.options.scrollFxOptions);
-				par.store('$moo:fvScroller', fx);
-			}
-			if (failed){
-				if (fx) fx.toElement(failed);
-				else par.scrollTo(par.getScroll().x, failed.getPosition(par).y - 20);
-			}
-		}
-		return result;
-	},
-
-	watchFields: function(fields){
-		fields.each(function(el){
-			if (this.options.evaluateFieldsOnBlur){
-				el.addEvent('blur', this.validationMonitor.pass([el, false, this.options.scrollToErrorsOnBlur], this));
-			}
-			if (this.options.evaluateFieldsOnChange){
-				el.addEvent('change', this.validationMonitor.pass([el, true, this.options.scrollToErrorsOnChange], this));
-			}
-		}, this);
-	}
-
-});
-
-/*
----
-
-script: OverText.js
-
-name: OverText
-
-description: Shows text over an input that disappears when the user clicks into it. The text remains hidden if the user adds a value.
-
-license: MIT-style license
-
-authors:
-  - Aaron Newton
-
-requires:
-  - Core/Options
-  - Core/Events
-  - Core/Element.Event
-  - Class.Binds
-  - Class.Occlude
-  - Element.Position
-  - Element.Shortcuts
-
-provides: [OverText]
-
-...
-*/
-(function(){
-
-var OverText = this.OverText = new Class({
-
-	Implements: [Options, Events, Class.Occlude],
-
-	Binds: ['reposition', 'assert', 'focus', 'hide'],
-
-	options: {/*
-		textOverride: null,
-		onFocus: function(){},
-		onTextHide: function(textEl, inputEl){},
-		onTextShow: function(textEl, inputEl){}, */
-		element: 'label',
-		labelClass: 'overTxtLabel',
-		positionOptions: {
-			position: 'upperLeft',
-			edge: 'upperLeft',
-			offset: {
-				x: 4,
-				y: 2
-			}
-		},
-		poll: false,
-		pollInterval: 250,
-		wrap: false
-	},
-
-	property: 'OverText',
-
-	initialize: function(element, options){
-		element = this.element = document.id(element);
-
-		if (this.occlude()) return this.occluded;
-		this.setOptions(options);
-
-		this.attach(element);
-		OverText.instances.push(this);
-
-		if (this.options.poll) this.poll();
-	},
-
-	toElement: function(){
-		return this.element;
-	},
-
-	attach: function(){
-		var element = this.element,
-			options = this.options,
-			value = options.textOverride || element.get('alt') || element.get('title');
-
-		if (!value) return this;
-
-		var text = this.text = new Element(options.element, {
-			'class': options.labelClass,
-			styles: {
-				lineHeight: 'normal',
-				position: 'absolute',
-				cursor: 'text'
-			},
-			html: value,
-			events: {
-				click: this.hide.pass(options.element == 'label', this)
-			}
-		}).inject(element, 'after');
-
-		if (options.element == 'label'){
-			if (!element.get('id')) element.set('id', 'input_' + String.uniqueID());
-			text.set('for', element.get('id'));
-		}
-
-		if (options.wrap){
-			this.textHolder = new Element('div.overTxtWrapper', {
-				styles: {
-					lineHeight: 'normal',
-					position: 'relative'
-				}
-			}).grab(text).inject(element, 'before');
-		}
-
-		return this.enable();
-	},
-
-	destroy: function(){
-		this.element.eliminate(this.property); // Class.Occlude storage
-		this.disable();
-		if (this.text) this.text.destroy();
-		if (this.textHolder) this.textHolder.destroy();
-		return this;
-	},
-
-	disable: function(){
-		this.element.removeEvents({
-			focus: this.focus,
-			blur: this.assert,
-			change: this.assert
-		});
-		window.removeEvent('resize', this.reposition);
-		this.hide(true, true);
-		return this;
-	},
-
-	enable: function(){
-		this.element.addEvents({
-			focus: this.focus,
-			blur: this.assert,
-			change: this.assert
-		});
-		window.addEvent('resize', this.reposition);
-		this.reposition();
-		return this;
-	},
-
-	wrap: function(){
-		if (this.options.element == 'label'){
-			if (!this.element.get('id')) this.element.set('id', 'input_' + String.uniqueID());
-			this.text.set('for', this.element.get('id'));
-		}
-	},
-
-	startPolling: function(){
-		this.pollingPaused = false;
-		return this.poll();
-	},
-
-	poll: function(stop){
-		//start immediately
-		//pause on focus
-		//resumeon blur
-		if (this.poller && !stop) return this;
-		if (stop){
-			clearInterval(this.poller);
-		} else {
-			this.poller = (function(){
-				if (!this.pollingPaused) this.assert(true);
-			}).periodical(this.options.pollInterval, this);
-		}
-
-		return this;
-	},
-
-	stopPolling: function(){
-		this.pollingPaused = true;
-		return this.poll(true);
-	},
-
-	focus: function(){
-		if (this.text && (!this.text.isDisplayed() || this.element.get('disabled'))) return this;
-		return this.hide();
-	},
-
-	hide: function(suppressFocus, force){
-		if (this.text && (this.text.isDisplayed() && (!this.element.get('disabled') || force))){
-			this.text.hide();
-			this.fireEvent('textHide', [this.text, this.element]);
-			this.pollingPaused = true;
-			if (!suppressFocus){
-				try {
-					this.element.fireEvent('focus');
-					this.element.focus();
-				} catch (e){} //IE barfs if you call focus on hidden elements
-			}
-		}
-		return this;
-	},
-
-	show: function(){
-		if (document.id(this.text) && !this.text.isDisplayed()){
-			this.text.show();
-			this.reposition();
-			this.fireEvent('textShow', [this.text, this.element]);
-			this.pollingPaused = false;
-		}
-		return this;
-	},
-
-	test: function(){
-		return !this.element.get('value');
-	},
-
-	assert: function(suppressFocus){
-		return this[this.test() ? 'show' : 'hide'](suppressFocus);
-	},
-
-	reposition: function(){
-		this.assert(true);
-		if (!this.element.isVisible()) return this.stopPolling().hide();
-		if (this.text && this.test()){
-			this.text.position(Object.merge(this.options.positionOptions, {
-				relativeTo: this.element
-			}));
-		}
-		return this;
-	}
-
-});
-
-})();
-
-OverText.instances = [];
-
-Object.append(OverText, {
-
-	each: function(fn){
-		return OverText.instances.each(function(ot, i){
-			if (ot.element && ot.text) fn.call(OverText, ot, i);
-		});
-	},
-
-	update: function(){
-
-		return OverText.each(function(ot){
-			return ot.reposition();
-		});
-
-	},
-
-	hideAll: function(){
-
-		return OverText.each(function(ot){
-			return ot.hide(true, true);
-		});
-
-	},
-
-	showAll: function(){
-		return OverText.each(function(ot){
-			return ot.show();
-		});
-	}
-
-});
-
-
-/*
----
-
-script: Fx.Elements.js
-
-name: Fx.Elements
-
-description: Effect to change any number of CSS properties of any number of Elements.
-
-license: MIT-style license
-
-authors:
-  - Valerio Proietti
-
-requires:
-  - Core/Fx.CSS
-  - MooTools.More
-
-provides: [Fx.Elements]
-
-...
-*/
-
-Fx.Elements = new Class({
-
-	Extends: Fx.CSS,
-
-	initialize: function(elements, options){
-		this.elements = this.subject = $$(elements);
-		this.parent(options);
-	},
-
-	compute: function(from, to, delta){
-		var now = {};
-
-		for (var i in from){
-			var iFrom = from[i], iTo = to[i], iNow = now[i] = {};
-			for (var p in iFrom) iNow[p] = this.parent(iFrom[p], iTo[p], delta);
-		}
-
-		return now;
-	},
-
-	set: function(now){
-		for (var i in now){
-			if (!this.elements[i]) continue;
-
-			var iNow = now[i];
-			for (var p in iNow) this.render(this.elements[i], p, iNow[p], this.options.unit);
-		}
-
-		return this;
-	},
-
-	start: function(obj){
-		if (!this.check(obj)) return this;
-		var from = {}, to = {};
-
-		for (var i in obj){
-			if (!this.elements[i]) continue;
-
-			var iProps = obj[i], iFrom = from[i] = {}, iTo = to[i] = {};
-
-			for (var p in iProps){
-				var parsed = this.prepare(this.elements[i], p, iProps[p]);
-				iFrom[p] = parsed.from;
-				iTo[p] = parsed.to;
-			}
-		}
-
-		return this.parent(from, to);
-	}
-
-});
-
-/*
----
-
-script: Fx.Accordion.js
-
-name: Fx.Accordion
-
-description: An Fx.Elements extension which allows you to easily create accordion type controls.
-
-license: MIT-style license
-
-authors:
-  - Valerio Proietti
-
-requires:
-  - Core/Element.Event
-  - Fx.Elements
-
-provides: [Fx.Accordion]
-
-...
-*/
-
-Fx.Accordion = new Class({
-
-	Extends: Fx.Elements,
-
-	options: {/*
-		onActive: function(toggler, section){},
-		onBackground: function(toggler, section){},*/
-		fixedHeight: false,
-		fixedWidth: false,
-		display: 0,
-		show: false,
-		height: true,
-		width: false,
-		opacity: true,
-		alwaysHide: false,
-		trigger: 'click',
-		initialDisplayFx: true,
-		resetHeight: true,
-		keepOpen: false
-	},
-
-	initialize: function(){
-		var defined = function(obj){
-			return obj != null;
-		};
-
-		var params = Array.link(arguments, {
-			'container': Type.isElement, //deprecated
-			'options': Type.isObject,
-			'togglers': defined,
-			'elements': defined
-		});
-		this.parent(params.elements, params.options);
-
-		var options = this.options,
-			togglers = this.togglers = $$(params.togglers);
-
-		this.previous = -1;
-		this.internalChain = new Chain();
-
-		if (options.alwaysHide) this.options.link = 'chain';
-
-		if (options.show || this.options.show === 0){
-			options.display = false;
-			this.previous = options.show;
-		}
-
-		if (options.start){
-			options.display = false;
-			options.show = false;
-		}
-
-		var effects = this.effects = {};
-
-		if (options.opacity) effects.opacity = 'fullOpacity';
-		if (options.width) effects.width = options.fixedWidth ? 'fullWidth' : 'offsetWidth';
-		if (options.height) effects.height = options.fixedHeight ? 'fullHeight' : 'scrollHeight';
-
-		for (var i = 0, l = togglers.length; i < l; i++) this.addSection(togglers[i], this.elements[i]);
-
-		this.elements.each(function(el, i){
-			if (options.show === i){
-				this.fireEvent('active', [togglers[i], el]);
-			} else {
-				for (var fx in effects) el.setStyle(fx, 0);
-			}
-		}, this);
-
-		if (options.display || options.display === 0 || options.initialDisplayFx === false){
-			this.display(options.display, options.initialDisplayFx);
-		}
-
-		if (options.fixedHeight !== false) options.resetHeight = false;
-		this.addEvent('complete', this.internalChain.callChain.bind(this.internalChain));
-	},
-
-	addSection: function(toggler, element){
-		toggler = document.id(toggler);
-		element = document.id(element);
-		this.togglers.include(toggler);
-		this.elements.include(element);
-
-		var togglers = this.togglers,
-			options = this.options,
-			test = togglers.contains(toggler),
-			idx = togglers.indexOf(toggler),
-			displayer = this.display.pass(idx, this);
-
-		toggler.store('accordion:display', displayer)
-			.addEvent(options.trigger, displayer);
-
-		if (options.height) element.setStyles({'padding-top': 0, 'border-top': 'none', 'padding-bottom': 0, 'border-bottom': 'none'});
-		if (options.width) element.setStyles({'padding-left': 0, 'border-left': 'none', 'padding-right': 0, 'border-right': 'none'});
-
-		element.fullOpacity = 1;
-		if (options.fixedWidth) element.fullWidth = options.fixedWidth;
-		if (options.fixedHeight) element.fullHeight = options.fixedHeight;
-		element.setStyle('overflow', 'hidden');
-
-		if (!test) for (var fx in this.effects){
-			element.setStyle(fx, 0);
-		}
-		return this;
-	},
-
-	removeSection: function(toggler, displayIndex){
-		var togglers = this.togglers,
-			idx = togglers.indexOf(toggler),
-			element = this.elements[idx];
-
-		var remover = function(){
-			togglers.erase(toggler);
-			this.elements.erase(element);
-			this.detach(toggler);
-		}.bind(this);
-
-		if (this.now == idx || displayIndex != null){
-			this.display(displayIndex != null ? displayIndex : (idx - 1 >= 0 ? idx - 1 : 0)).chain(remover);
-		} else {
-			remover();
-		}
-		return this;
-	},
-
-	detach: function(toggler){
-		var remove = function(toggler){
-			toggler.removeEvent(this.options.trigger, toggler.retrieve('accordion:display'));
-		}.bind(this);
-
-		if (!toggler) this.togglers.each(remove);
-		else remove(toggler);
-		return this;
-	},
-
-	display: function(index, useFx){
-		if (!this.check(index, useFx)) return this;
-
-		var obj = {},
-			elements = this.elements,
-			options = this.options,
-			effects = this.effects,
-			keepOpen = options.keepOpen,
-			alwaysHide = options.alwaysHide;
-
-		if (useFx == null) useFx = true;
-		if (typeOf(index) == 'element') index = elements.indexOf(index);
-		if (index == this.current && !alwaysHide && !keepOpen) return this;
-
-		if (options.resetHeight){
-			var prev = elements[this.current];
-			if (prev && !this.selfHidden){
-				for (var fx in effects) prev.setStyle(fx, prev[effects[fx]]);
-			}
-		}
-
-		if (this.timer && options.link == 'chain') return this;
-
-		if (this.current != null) this.previous = this.current;
-		this.current = index;
-		this.selfHidden = false;
-
-		elements.each(function(el, i){
-			obj[i] = {};
-			var hide, isOpen;
-			if (!keepOpen || i == index){
-				if (i == index) isOpen = (el.offsetHeight > 0 && options.height) || (el.offsetWidth > 0 && options.width);
-
-				if (i != index){
-					hide = true;
-				} else if ((alwaysHide || keepOpen) && isOpen){
-					hide = true;
-					this.selfHidden = true;
-				}
-				this.fireEvent(hide ? 'background' : 'active', [this.togglers[i], el]);
-				for (var fx in effects) obj[i][fx] = hide ? 0 : el[effects[fx]];
-				if (!useFx && !hide && options.resetHeight) obj[i].height = 'auto';
-			}
-		}, this);
-
-		this.internalChain.clearChain();
-		this.internalChain.chain(function(){
-			if (options.resetHeight && !this.selfHidden){
-				var el = elements[index];
-				if (el) el.setStyle('height', 'auto');
-			}
-		}.bind(this));
-
-		return useFx ? this.start(obj) : this.set(obj).internalChain.callChain();
-	}
-
-});
-
-
-
-/*
----
-
-script: Fx.Move.js
-
-name: Fx.Move
-
-description: Defines Fx.Move, a class that works with Element.Position.js to transition an element from one location to another.
-
-license: MIT-style license
-
-authors:
-  - Aaron Newton
-
-requires:
-  - Core/Fx.Morph
-  - Element.Position
-
-provides: [Fx.Move]
-
-...
-*/
-
-Fx.Move = new Class({
-
-	Extends: Fx.Morph,
-
-	options: {
-		relativeTo: document.body,
-		position: 'center',
-		edge: false,
-		offset: {x: 0, y: 0}
-	},
-
-	start: function(destination){
-		var element = this.element,
-			topLeft = element.getStyles('top', 'left');
-		if (topLeft.top == 'auto' || topLeft.left == 'auto'){
-			element.setPosition(element.getPosition(element.getOffsetParent()));
-		}
-		return this.parent(element.position(Object.merge({}, this.options, destination, {returnPos: true})));
-	}
-
-});
-
-Element.Properties.move = {
-
-	set: function(options){
-		this.get('move').cancel().setOptions(options);
-		return this;
-	},
-
-	get: function(){
-		var move = this.retrieve('move');
-		if (!move){
-			move = new Fx.Move(this, {link: 'cancel'});
-			this.store('move', move);
-		}
-		return move;
-	}
-
-};
-
-Element.implement({
-
-	move: function(options){
-		this.get('move').start(options);
-		return this;
-	}
-
-});
-
-/*
----
-
-script: Fx.Scroll.js
-
-name: Fx.Scroll
-
-description: Effect to smoothly scroll any element, including the window.
-
-license: MIT-style license
-
-authors:
-  - Valerio Proietti
-
-requires:
-  - Core/Fx
-  - Core/Element.Event
-  - Core/Element.Dimensions
-  - MooTools.More
-
-provides: [Fx.Scroll]
-
-...
-*/
-
-(function(){
-
-Fx.Scroll = new Class({
-
-	Extends: Fx,
-
-	options: {
-		offset: {x: 0, y: 0},
-		wheelStops: true
-	},
-
-	initialize: function(element, options){
-		this.element = this.subject = document.id(element);
-		this.parent(options);
-
-		if (typeOf(this.element) != 'element') this.element = document.id(this.element.getDocument().body);
-
-		if (this.options.wheelStops){
-			var stopper = this.element,
-				cancel = this.cancel.pass(false, this);
-			this.addEvent('start', function(){
-				stopper.addEvent('mousewheel', cancel);
-			}, true);
-			this.addEvent('complete', function(){
-				stopper.removeEvent('mousewheel', cancel);
-			}, true);
-		}
-	},
-
-	set: function(){
-		var now = Array.flatten(arguments);
-		this.element.scrollTo(now[0], now[1]);
-		return this;
-	},
-
-	compute: function(from, to, delta){
-		return [0, 1].map(function(i){
-			return Fx.compute(from[i], to[i], delta);
-		});
-	},
-
-	start: function(x, y){
-		if (!this.check(x, y)) return this;
-		var scroll = this.element.getScroll();
-		return this.parent([scroll.x, scroll.y], [x, y]);
-	},
-
-	calculateScroll: function(x, y){
-		var element = this.element,
-			scrollSize = element.getScrollSize(),
-			scroll = element.getScroll(),
-			size = element.getSize(),
-			offset = this.options.offset,
-			values = {x: x, y: y};
-
-		for (var z in values){
-			if (!values[z] && values[z] !== 0) values[z] = scroll[z];
-			if (typeOf(values[z]) != 'number') values[z] = scrollSize[z] - size[z];
-			values[z] += offset[z];
-		}
-
-		return [values.x, values.y];
-	},
-
-	toTop: function(){
-		return this.start.apply(this, this.calculateScroll(false, 0));
-	},
-
-	toLeft: function(){
-		return this.start.apply(this, this.calculateScroll(0, false));
-	},
-
-	toRight: function(){
-		return this.start.apply(this, this.calculateScroll('right', false));
-	},
-
-	toBottom: function(){
-		return this.start.apply(this, this.calculateScroll(false, 'bottom'));
-	},
-
-	toElement: function(el, axes){
-		axes = axes ? Array.convert(axes) : ['x', 'y'];
-		var scroll = isBody(this.element) ? {x: 0, y: 0} : this.element.getScroll();
-		var position = Object.map(document.id(el).getPosition(this.element), function(value, axis){
-			return axes.contains(axis) ? value + scroll[axis] : false;
-		});
-		return this.start.apply(this, this.calculateScroll(position.x, position.y));
-	},
-
-	toElementEdge: function(el, axes, offset){
-		axes = axes ? Array.convert(axes) : ['x', 'y'];
-		el = document.id(el);
-		var to = {},
-			position = el.getPosition(this.element),
-			size = el.getSize(),
-			scroll = this.element.getScroll(),
-			containerSize = this.element.getSize(),
-			edge = {
-				x: position.x + size.x,
-				y: position.y + size.y
-			};
-
-		['x', 'y'].each(function(axis){
-			if (axes.contains(axis)){
-				if (edge[axis] > scroll[axis] + containerSize[axis]) to[axis] = edge[axis] - containerSize[axis];
-				if (position[axis] < scroll[axis]) to[axis] = position[axis];
-			}
-			if (to[axis] == null) to[axis] = scroll[axis];
-			if (offset && offset[axis]) to[axis] = to[axis] + offset[axis];
-		}, this);
-
-		if (to.x != scroll.x || to.y != scroll.y) this.start(to.x, to.y);
-		return this;
-	},
-
-	toElementCenter: function(el, axes, offset){
-		axes = axes ? Array.convert(axes) : ['x', 'y'];
-		el = document.id(el);
-		var to = {},
-			position = el.getPosition(this.element),
-			size = el.getSize(),
-			scroll = this.element.getScroll(),
-			containerSize = this.element.getSize();
-
-		['x', 'y'].each(function(axis){
-			if (axes.contains(axis)){
-				to[axis] = position[axis] - (containerSize[axis] - size[axis]) / 2;
-			}
-			if (to[axis] == null) to[axis] = scroll[axis];
-			if (offset && offset[axis]) to[axis] = to[axis] + offset[axis];
-		}, this);
-
-		if (to.x != scroll.x || to.y != scroll.y) this.start(to.x, to.y);
-		return this;
-	}
-
-});
-
-
-
-function isBody(element){
-	return (/^(?:body|html)$/i).test(element.tagName);
-}
-
-})();
-
-/*
----
-
-script: Fx.Slide.js
-
-name: Fx.Slide
-
-description: Effect to slide an element in and out of view.
-
-license: MIT-style license
-
-authors:
-  - Valerio Proietti
-
-requires:
-  - Core/Fx
-  - Core/Element.Style
-  - MooTools.More
-
-provides: [Fx.Slide]
-
-...
-*/
-
-Fx.Slide = new Class({
-
-	Extends: Fx,
-
-	options: {
-		mode: 'vertical',
-		wrapper: false,
-		hideOverflow: true,
-		resetHeight: false
-	},
-
-	initialize: function(element, options){
-		element = this.element = this.subject = document.id(element);
-		this.parent(options);
-		options = this.options;
-
-		var wrapper = element.retrieve('wrapper'),
-			styles = element.getStyles('margin', 'position', 'overflow');
-
-		if (options.hideOverflow) styles = Object.append(styles, {overflow: 'hidden'});
-		if (options.wrapper) wrapper = document.id(options.wrapper).setStyles(styles);
-
-		if (!wrapper) wrapper = new Element('div', {
-			styles: styles
-		}).wraps(element);
-
-		element.store('wrapper', wrapper).setStyle('margin', 0);
-		if (element.getStyle('overflow') == 'visible') element.setStyle('overflow', 'hidden');
-
-		this.now = [];
-		this.open = true;
-		this.wrapper = wrapper;
-
-		this.addEvent('complete', function(){
-			this.open = (wrapper['offset' + this.layout.capitalize()] != 0);
-			if (this.open && this.options.resetHeight) wrapper.setStyle('height', '');
-		}, true);
-	},
-
-	vertical: function(){
-		this.margin = 'margin-top';
-		this.layout = 'height';
-		this.offset = this.element.offsetHeight;
-	},
-
-	horizontal: function(){
-		this.margin = 'margin-left';
-		this.layout = 'width';
-		this.offset = this.element.offsetWidth;
-	},
-
-	set: function(now){
-		this.element.setStyle(this.margin, now[0]);
-		this.wrapper.setStyle(this.layout, now[1]);
-		return this;
-	},
-
-	compute: function(from, to, delta){
-		return [0, 1].map(function(i){
-			return Fx.compute(from[i], to[i], delta);
-		});
-	},
-
-	start: function(how, mode){
-		if (!this.check(how, mode)) return this;
-		this[mode || this.options.mode]();
-
-		var margin = this.element.getStyle(this.margin).toInt(),
-			layout = this.wrapper.getStyle(this.layout).toInt(),
-			caseIn = [[margin, layout], [0, this.offset]],
-			caseOut = [[margin, layout], [-this.offset, 0]],
-			start;
-
-		switch (how){
-			case 'in': start = caseIn; break;
-			case 'out': start = caseOut; break;
-			case 'toggle': start = (layout == 0) ? caseIn : caseOut;
-		}
-		return this.parent(start[0], start[1]);
-	},
-
-	slideIn: function(mode){
-		return this.start('in', mode);
-	},
-
-	slideOut: function(mode){
-		return this.start('out', mode);
-	},
-
-	hide: function(mode){
-		this[mode || this.options.mode]();
-		this.open = false;
-		return this.set([-this.offset, 0]);
-	},
-
-	show: function(mode){
-		this[mode || this.options.mode]();
-		this.open = true;
-		return this.set([0, this.offset]);
-	},
-
-	toggle: function(mode){
-		return this.start('toggle', mode);
-	}
-
-});
-
-Element.Properties.slide = {
-
-	set: function(options){
-		this.get('slide').cancel().setOptions(options);
-		return this;
-	},
-
-	get: function(){
-		var slide = this.retrieve('slide');
-		if (!slide){
-			slide = new Fx.Slide(this, {link: 'cancel'});
-			this.store('slide', slide);
-		}
-		return slide;
-	}
-
-};
-
-Element.implement({
-
-	slide: function(how, mode){
-		how = how || 'toggle';
-		var slide = this.get('slide'), toggle;
-		switch (how){
-			case 'hide': slide.hide(mode); break;
-			case 'show': slide.show(mode); break;
-			case 'toggle':
-				var flag = this.retrieve('slide:flag', slide.open);
-				slide[flag ? 'slideOut' : 'slideIn'](mode);
-				this.store('slide:flag', !flag);
-				toggle = true;
-				break;
-			default: slide.start(how, mode);
-		}
-		if (!toggle) this.eliminate('slide:flag');
-		return this;
-	}
-
-});
-
-/*
----
-
-script: Fx.SmoothScroll.js
-
-name: Fx.SmoothScroll
-
-description: Class for creating a smooth scrolling effect to all internal links on the page.
-
-license: MIT-style license
-
-authors:
-  - Valerio Proietti
-
-requires:
-  - Core/Slick.Finder
-  - Fx.Scroll
-
-provides: [Fx.SmoothScroll]
-
-...
-*/
-
-Fx.SmoothScroll = new Class({
-
-	Extends: Fx.Scroll,
-
-	options: {
-		axes: ['x', 'y']
-	},
-
-	initialize: function(options, context){
-		context = context || document;
-		this.doc = context.getDocument();
-		this.parent(this.doc, options);
-
-		var win = context.getWindow(),
-			location = win.location.href.match(/^[^#]*/)[0] + '#',
-			links = $$(this.options.links || this.doc.links);
-
-		links.each(function(link){
-			if (link.href.indexOf(location) != 0) return;
-			var anchor = link.href.substr(location.length);
-			if (anchor) this.useLink(link, anchor);
-		}, this);
-
-		this.addEvent('complete', function(){
-			win.location.hash = this.anchor;
-			this.element.scrollTo(this.to[0], this.to[1]);
-		}, true);
-	},
-
-	useLink: function(link, anchor){
-
-		link.addEvent('click', function(event){
-			var el = document.id(anchor) || this.doc.getElement('a[name=' + anchor + ']');
-			if (!el) return;
-
-			event.preventDefault();
-			this.toElement(el, this.options.axes).chain(function(){
-				this.fireEvent('scrolledTo', [link, el]);
-			}.bind(this));
-
-			this.anchor = anchor;
-
-		}.bind(this));
-
-		return this;
-	}
-});
-
-/*
----
-
-script: Fx.Sort.js
-
-name: Fx.Sort
-
-description: Defines Fx.Sort, a class that reorders lists with a transition.
-
-license: MIT-style license
-
-authors:
-  - Aaron Newton
-
-requires:
-  - Core/Element.Dimensions
-  - Fx.Elements
-  - Element.Measure
-
-provides: [Fx.Sort]
-
-...
-*/
-
-Fx.Sort = new Class({
-
-	Extends: Fx.Elements,
-
-	options: {
-		mode: 'vertical'
-	},
-
-	initialize: function(elements, options){
-		this.parent(elements, options);
-		this.elements.each(function(el){
-			if (el.getStyle('position') == 'static') el.setStyle('position', 'relative');
-		});
-		this.setDefaultOrder();
-	},
-
-	setDefaultOrder: function(){
-		this.currentOrder = this.elements.map(function(el, index){
-			return index;
-		});
-	},
-
-	sort: function(){
-		if (!this.check(arguments)) return this;
-		var newOrder = Array.flatten(arguments);
-
-		var top = 0,
-			left = 0,
-			next = {},
-			zero = {},
-			vert = this.options.mode == 'vertical';
-
-		var current = this.elements.map(function(el, index){
-			var size = el.getComputedSize({styles: ['border', 'padding', 'margin']});
-			var val;
-			if (vert){
-				val = {
-					top: top,
-					margin: size['margin-top'],
-					height: size.totalHeight
-				};
-				top += val.height - size['margin-top'];
-			} else {
-				val = {
-					left: left,
-					margin: size['margin-left'],
-					width: size.totalWidth
-				};
-				left += val.width;
-			}
-			var plane = vert ? 'top' : 'left';
-			zero[index] = {};
-			var start = el.getStyle(plane).toInt();
-			zero[index][plane] = start || 0;
-			return val;
-		}, this);
-
-		this.set(zero);
-		newOrder = newOrder.map(function(i){ return i.toInt(); });
-		if (newOrder.length != this.elements.length){
-			this.currentOrder.each(function(index){
-				if (!newOrder.contains(index)) newOrder.push(index);
-			});
-			if (newOrder.length > this.elements.length)
-				newOrder.splice(this.elements.length-1, newOrder.length - this.elements.length);
-		}
-		var margin = 0;
-		top = left = 0;
-		newOrder.each(function(item){
-			var newPos = {};
-			if (vert){
-				newPos.top = top - current[item].top - margin;
-				top += current[item].height;
-			} else {
-				newPos.left = left - current[item].left;
-				left += current[item].width;
-			}
-			margin = margin + current[item].margin;
-			next[item]=newPos;
-		}, this);
-		var mapped = {};
-		Array.clone(newOrder).sort().each(function(index){
-			mapped[index] = next[index];
-		});
-		this.start(mapped);
-		this.currentOrder = newOrder;
-
-		return this;
-	},
-
-	rearrangeDOM: function(newOrder){
-		newOrder = newOrder || this.currentOrder;
-		var parent = this.elements[0].getParent();
-		var rearranged = [];
-		this.elements.setStyle('opacity', 0);
-		//move each element and store the new default order
-		newOrder.each(function(index){
-			rearranged.push(this.elements[index].inject(parent).setStyles({
-				top: 0,
-				left: 0
-			}));
-		}, this);
-		this.elements.setStyle('opacity', 1);
-		this.elements = $$(rearranged);
-		this.setDefaultOrder();
-		return this;
-	},
-
-	getDefaultOrder: function(){
-		return this.elements.map(function(el, index){
-			return index;
-		});
-	},
-
-	getCurrentOrder: function(){
-		return this.currentOrder;
-	},
-
-	forward: function(){
-		return this.sort(this.getDefaultOrder());
-	},
-
-	backward: function(){
-		return this.sort(this.getDefaultOrder().reverse());
-	},
-
-	reverse: function(){
-		return this.sort(this.currentOrder.reverse());
-	},
-
-	sortByElements: function(elements){
-		return this.sort(elements.map(function(el){
-			return this.elements.indexOf(el);
-		}, this));
-	},
-
-	swap: function(one, two){
-		if (typeOf(one) == 'element') one = this.elements.indexOf(one);
-		if (typeOf(two) == 'element') two = this.elements.indexOf(two);
-
-		var newOrder = Array.clone(this.currentOrder);
-		newOrder[this.currentOrder.indexOf(one)] = two;
-		newOrder[this.currentOrder.indexOf(two)] = one;
-
-		return this.sort(newOrder);
-	}
-
-});
-
-/*
----
-
-script: Keyboard.js
-
-name: Keyboard
-
-description: KeyboardEvents used to intercept events on a class for keyboard and format modifiers in a specific order so as to make alt+shift+c the same as shift+alt+c.
-
-license: MIT-style license
-
-authors:
-  - Perrin Westrich
-  - Aaron Newton
-  - Scott Kyle
-
-requires:
-  - Core/Events
-  - Core/Options
-  - Core/Element.Event
-  - Element.Event.Pseudos.Keys
-
-provides: [Keyboard]
-
-...
-*/
-
-(function(){
-
-var Keyboard = this.Keyboard = new Class({
-
-	Extends: Events,
-
-	Implements: [Options],
-
-	options: {/*
-		onActivate: function(){},
-		onDeactivate: function(){},*/
-		defaultEventType: 'keydown',
-		active: false,
-		manager: null,
-		events: {},
-		nonParsedEvents: ['activate', 'deactivate', 'onactivate', 'ondeactivate', 'changed', 'onchanged']
-	},
-
-	initialize: function(options){
-		if (options && options.manager){
-			this._manager = options.manager;
-			delete options.manager;
-		}
-		this.setOptions(options);
-		this._setup();
-	},
-
-	addEvent: function(type, fn, internal){
-		return this.parent(Keyboard.parse(type, this.options.defaultEventType, this.options.nonParsedEvents), fn, internal);
-	},
-
-	removeEvent: function(type, fn){
-		return this.parent(Keyboard.parse(type, this.options.defaultEventType, this.options.nonParsedEvents), fn);
-	},
-
-	toggleActive: function(){
-		return this[this.isActive() ? 'deactivate' : 'activate']();
-	},
-
-	activate: function(instance){
-		if (instance){
-			if (instance.isActive()) return this;
-			//if we're stealing focus, store the last keyboard to have it so the relinquish command works
-			if (this._activeKB && instance != this._activeKB){
-				this.previous = this._activeKB;
-				this.previous.fireEvent('deactivate');
-			}
-			//if we're enabling a child, assign it so that events are now passed to it
-			this._activeKB = instance.fireEvent('activate');
-			Keyboard.manager.fireEvent('changed');
-		} else if (this._manager){
-			//else we're enabling ourselves, we must ask our parent to do it for us
-			this._manager.activate(this);
-		}
-		return this;
-	},
-
-	isActive: function(){
-		return this._manager ? (this._manager._activeKB == this) : (Keyboard.manager == this);
-	},
-
-	deactivate: function(instance){
-		if (instance){
-			if (instance === this._activeKB){
-				this._activeKB = null;
-				instance.fireEvent('deactivate');
-				Keyboard.manager.fireEvent('changed');
-			}
-		} else if (this._manager){
-			this._manager.deactivate(this);
-		}
-		return this;
-	},
-
-	relinquish: function(){
-		if (this.isActive() && this._manager && this._manager.previous) this._manager.activate(this._manager.previous);
-		else this.deactivate();
-		return this;
-	},
-
-	//management logic
-	manage: function(instance){
-		if (instance._manager) instance._manager.drop(instance);
-		this._instances.push(instance);
-		instance._manager = this;
-		if (!this._activeKB) this.activate(instance);
-		return this;
-	},
-
-	drop: function(instance){
-		instance.relinquish();
-		this._instances.erase(instance);
-		if (this._activeKB == instance){
-			if (this.previous && this._instances.contains(this.previous)) this.activate(this.previous);
-			else this._activeKB = this._instances[0];
-		}
-		return this;
-	},
-
-	trace: function(){
-		Keyboard.trace(this);
-	},
-
-	each: function(fn){
-		Keyboard.each(this, fn);
-	},
-
-	/*
-		PRIVATE METHODS
-	*/
-
-	_instances: [],
-
-	_disable: function(instance){
-		if (this._activeKB == instance) this._activeKB = null;
-	},
-
-	_setup: function(){
-		this.addEvents(this.options.events);
-		//if this is the root manager, nothing manages it
-		if (Keyboard.manager && !this._manager) Keyboard.manager.manage(this);
-		if (this.options.active) this.activate();
-		else this.relinquish();
-	},
-
-	_handle: function(event, type){
-		//Keyboard.stop(event) prevents key propagation
-		if (event.preventKeyboardPropagation) return;
-
-		var bubbles = !!this._manager;
-		if (bubbles && this._activeKB){
-			this._activeKB._handle(event, type);
-			if (event.preventKeyboardPropagation) return;
-		}
-		this.fireEvent(type, event);
-
-		if (!bubbles && this._activeKB) this._activeKB._handle(event, type);
-	}
-
-});
-
-var parsed = {};
-var modifiers = ['shift', 'control', 'alt', 'meta'];
-var regex = /^(?:shift|control|ctrl|alt|meta)$/;
-
-Keyboard.parse = function(type, eventType, ignore){
-	if (ignore && ignore.contains(type.toLowerCase())) return type;
-
-	type = type.toLowerCase().replace(/^(keyup|keydown):/, function($0, $1){
-		eventType = $1;
-		return '';
-	});
-
-	if (!parsed[type]){
-		if (type != '+'){
-			var key, mods = {};
-			type.split('+').each(function(part){
-				if (regex.test(part)) mods[part] = true;
-				else key = part;
-			});
-
-			mods.control = mods.control || mods.ctrl; // allow both control and ctrl
-
-			var keys = [];
-			modifiers.each(function(mod){
-				if (mods[mod]) keys.push(mod);
-			});
-
-			if (key) keys.push(key);
-			parsed[type] = keys.join('+');
-		} else {
-			parsed[type] = type;
-		}
-	}
-
-	return eventType + ':keys(' + parsed[type] + ')';
-};
-
-Keyboard.each = function(keyboard, fn){
-	var current = keyboard || Keyboard.manager;
-	while (current){
-		fn(current);
-		current = current._activeKB;
-	}
-};
-
-Keyboard.stop = function(event){
-	event.preventKeyboardPropagation = true;
-};
-
-Keyboard.manager = new Keyboard({
-	active: true
-});
-
-Keyboard.trace = function(keyboard){
-	keyboard = keyboard || Keyboard.manager;
-	var hasConsole = window.console && console.log;
-	if (hasConsole) console.log('the following items have focus: ');
-	Keyboard.each(keyboard, function(current){
-		if (hasConsole) console.log(document.id(current.widget) || current.wiget || current);
-	});
-};
-
-var handler = function(event){
-	var keys = [];
-	modifiers.each(function(mod){
-		if (event[mod]) keys.push(mod);
-	});
-
-	if (!regex.test(event.key)) keys.push(event.key);
-	Keyboard.manager._handle(event, event.type + ':keys(' + keys.join('+') + ')');
-};
-
-document.addEvents({
-	'keyup': handler,
-	'keydown': handler
-});
-
-})();
-
-/*
----
-
-script: Keyboard.Extras.js
-
-name: Keyboard.Extras
-
-description: Enhances Keyboard by adding the ability to name and describe keyboard shortcuts, and the ability to grab shortcuts by name and bind the shortcut to different keys.
-
-license: MIT-style license
-
-authors:
-  - Perrin Westrich
-
-requires:
-  - Keyboard
-  - MooTools.More
-
-provides: [Keyboard.Extras]
-
-...
-*/
-Keyboard.prototype.options.nonParsedEvents.combine(['rebound', 'onrebound']);
-
-Keyboard.implement({
-
-	/*
-		shortcut should be in the format of:
-		{
-			'keys': 'shift+s', // the default to add as an event.
-			'description': 'blah blah blah', // a brief description of the functionality.
-			'handler': function(){} // the event handler to run when keys are pressed.
-		}
-	*/
-	addShortcut: function(name, shortcut){
-		this._shortcuts = this._shortcuts || [];
-		this._shortcutIndex = this._shortcutIndex || {};
-
-		shortcut.getKeyboard = Function.convert(this);
-		shortcut.name = name;
-		this._shortcutIndex[name] = shortcut;
-		this._shortcuts.push(shortcut);
-		if (shortcut.keys) this.addEvent(shortcut.keys, shortcut.handler);
-		return this;
-	},
-
-	addShortcuts: function(obj){
-		for (var name in obj) this.addShortcut(name, obj[name]);
-		return this;
-	},
-
-	removeShortcut: function(name){
-		var shortcut = this.getShortcut(name);
-		if (shortcut && shortcut.keys){
-			this.removeEvent(shortcut.keys, shortcut.handler);
-			delete this._shortcutIndex[name];
-			this._shortcuts.erase(shortcut);
-		}
-		return this;
-	},
-
-	removeShortcuts: function(names){
-		names.each(this.removeShortcut, this);
-		return this;
-	},
-
-	getShortcuts: function(){
-		return this._shortcuts || [];
-	},
-
-	getShortcut: function(name){
-		return (this._shortcutIndex || {})[name];
-	}
-
-});
-
-Keyboard.rebind = function(newKeys, shortcuts){
-	Array.convert(shortcuts).each(function(shortcut){
-		shortcut.getKeyboard().removeEvent(shortcut.keys, shortcut.handler);
-		shortcut.getKeyboard().addEvent(newKeys, shortcut.handler);
-		shortcut.keys = newKeys;
-		shortcut.getKeyboard().fireEvent('rebound');
-	});
-};
-
-
-Keyboard.getActiveShortcuts = function(keyboard){
-	var activeKBS = [], activeSCS = [];
-	Keyboard.each(keyboard, [].push.bind(activeKBS));
-	activeKBS.each(function(kb){ activeSCS.extend(kb.getShortcuts()); });
-	return activeSCS;
-};
-
-Keyboard.getShortcut = function(name, keyboard, opts){
-	opts = opts || {};
-	var shortcuts = opts.many ? [] : null,
-		set = opts.many ? function(kb){
-			var shortcut = kb.getShortcut(name);
-			if (shortcut) shortcuts.push(shortcut);
-		} : function(kb){
-			if (!shortcuts) shortcuts = kb.getShortcut(name);
-		};
-	Keyboard.each(keyboard, set);
-	return shortcuts;
-};
-
-Keyboard.getShortcuts = function(name, keyboard){
-	return Keyboard.getShortcut(name, keyboard, { many: true });
-};
-
-/*
----
-
-script: HtmlTable.js
-
-name: HtmlTable
-
-description: Builds table elements with methods to add rows.
-
-license: MIT-style license
-
-authors:
-  - Aaron Newton
-
-requires:
-  - Core/Options
-  - Core/Events
-  - Class.Occlude
-
-provides: [HtmlTable]
-
-...
-*/
-(function(){
-
-var HtmlTable = this.HtmlTable = new Class({
-
-	Implements: [Options, Events, Class.Occlude],
-
-	options: {
-		properties: {
-			cellpadding: 0,
-			cellspacing: 0,
-			border: 0
-		},
-		rows: [],
-		headers: [],
-		footers: []
-	},
-
-	property: 'HtmlTable',
-
-	initialize: function(){
-		var params = Array.link(arguments, {options: Type.isObject, table: Type.isElement, id: Type.isString});
-		this.setOptions(params.options);
-		if (!params.table && params.id) params.table = document.id(params.id);
-		this.element = params.table || new Element('table', this.options.properties);
-		if (this.occlude()) return this.occluded;
-		this.build();
-	},
-
-	build: function(){
-		this.element.store('HtmlTable', this);
-
-		this.body = document.id(this.element.tBodies[0]) || new Element('tbody').inject(this.element);
-		$$(this.body.rows);
-
-		if (this.options.headers.length) this.setHeaders(this.options.headers);
-		else this.thead = document.id(this.element.tHead);
-
-		if (this.thead) this.head = this.getHead();
-		if (this.options.footers.length) this.setFooters(this.options.footers);
-
-		this.tfoot = document.id(this.element.tFoot);
-		if (this.tfoot) this.foot = document.id(this.tfoot.rows[0]);
-
-		this.options.rows.each(function(row){
-			this.push(row);
-		}, this);
-	},
-
-	toElement: function(){
-		return this.element;
-	},
-
-	empty: function(){
-		this.body.empty();
-		return this;
-	},
-
-	set: function(what, items){
-		var target = (what == 'headers') ? 'tHead' : 'tFoot',
-			lower = target.toLowerCase();
-
-		this[lower] = (document.id(this.element[target]) || new Element(lower).inject(this.element, 'top')).empty();
-		var data = this.push(items, {}, this[lower], what == 'headers' ? 'th' : 'td');
-
-		if (what == 'headers') this.head = this.getHead();
-		else this.foot = this.getHead();
-
-		return data;
-	},
-
-	getHead: function(){
-		var rows = this.thead.rows;
-		return rows.length > 1 ? $$(rows) : rows.length ? document.id(rows[0]) : false;
-	},
-
-	setHeaders: function(headers){
-		this.set('headers', headers);
-		return this;
-	},
-
-	setFooters: function(footers){
-		this.set('footers', footers);
-		return this;
-	},
-
-	update: function(tr, row, tag){
-		var tds = tr.getChildren(tag || 'td'), last = tds.length - 1;
-
-		row.each(function(data, index){
-			var td = tds[index] || new Element(tag || 'td').inject(tr),
-				content = ((data && Object.prototype.hasOwnProperty.call(data, 'content')) ? data.content : '') || data,
-				type = typeOf(content);
-
-			if (data && Object.prototype.hasOwnProperty.call(data, 'properties')) td.set(data.properties);
-			if (/(element(s?)|array|collection)/.test(type)) td.empty().adopt(content);
-			else td.set('html', content);
-
-			if (index > last) tds.push(td);
-			else tds[index] = td;
-		});
-
-		return {
-			tr: tr,
-			tds: tds
-		};
-	},
-
-	push: function(row, rowProperties, target, tag, where){
-		if (typeOf(row) == 'element' && row.get('tag') == 'tr'){
-			row.inject(target || this.body, where);
-			return {
-				tr: row,
-				tds: row.getChildren('td')
-			};
-		}
-		return this.update(new Element('tr', rowProperties).inject(target || this.body, where), row, tag);
-	},
-
-	pushMany: function(rows, rowProperties, target, tag, where){
-		return rows.map(function(row){
-			return this.push(row, rowProperties, target, tag, where);
-		}, this);
-	}
-
-});
-
-})();
-
-
-['adopt', 'inject', 'wraps', 'grab', 'replaces', 'dispose'].each(function(method){
-	HtmlTable.implement(method, function(){
-		this.element[method].apply(this.element, arguments);
-		return this;
-	});
-});
-
-
-
-/*
----
-
-script: HtmlTable.Select.js
-
-name: HtmlTable.Select
-
-description: Builds a stripy, sortable table with methods to add rows. Rows can be selected with the mouse or keyboard navigation.
-
-license: MIT-style license
-
-authors:
-  - Harald Kirschner
-  - Aaron Newton
-
-requires:
-  - Keyboard
-  - Keyboard.Extras
-  - HtmlTable
-  - Class.refactor
-  - Element.Delegation.Pseudo
-  - Element.Shortcuts
-
-provides: [HtmlTable.Select]
-
-...
-*/
-
-HtmlTable = Class.refactor(HtmlTable, {
-
-	options: {
-		/*onRowFocus: function(){},
-		onRowUnfocus: function(){},*/
-		useKeyboard: true,
-		classRowSelected: 'table-tr-selected',
-		classRowHovered: 'table-tr-hovered',
-		classSelectable: 'table-selectable',
-		shiftForMultiSelect: true,
-		allowMultiSelect: true,
-		selectable: false,
-		selectHiddenRows: false
-	},
-
-	initialize: function(){
-		this.previous.apply(this, arguments);
-		if (this.occluded) return this.occluded;
-
-		this.selectedRows = new Elements();
-
-		if (!this.bound) this.bound = {};
-		this.bound.mouseleave = this.mouseleave.bind(this);
-		this.bound.clickRow = this.clickRow.bind(this);
-		this.bound.activateKeyboard = function(){
-			if (this.keyboard && this.selectEnabled) this.keyboard.activate();
-		}.bind(this);
-
-		if (this.options.selectable) this.enableSelect();
-	},
-
-	empty: function(){
-		if (this.body.rows.length) this.selectNone();
-		return this.previous();
-	},
-
-	enableSelect: function(){
-		this.selectEnabled = true;
-		this.attachSelects();
-		this.element.addClass(this.options.classSelectable);
-		return this;
-	},
-
-	disableSelect: function(){
-		this.selectEnabled = false;
-		this.attachSelects(false);
-		this.element.removeClass(this.options.classSelectable);
-		return this;
-	},
-
-	push: function(){
-		var ret = this.previous.apply(this, arguments);
-		this.updateSelects();
-		return ret;
-	},
-
-	toggleRow: function(row){
-		return this[(this.isSelected(row) ? 'de' : '') + 'selectRow'](row);
-	},
-
-	selectRow: function(row, _nocheck){
-		//private variable _nocheck: boolean whether or not to confirm the row is in the table body
-		//added here for optimization when selecting ranges
-		if (this.isSelected(row) || (!_nocheck && !this.body.getChildren().contains(row))) return;
-		if (!this.options.allowMultiSelect) this.selectNone();
-
-		if (!this.isSelected(row)){
-			this.selectedRows.push(row);
-			row.addClass(this.options.classRowSelected);
-			this.fireEvent('rowFocus', [row, this.selectedRows]);
-			this.fireEvent('stateChanged');
-		}
-
-		this.focused = row;
-		document.clearSelection();
-
-		return this;
-	},
-
-	isSelected: function(row){
-		return this.selectedRows.contains(row);
-	},
-
-	getSelected: function(){
-		return this.selectedRows;
-	},
-
-	serialize: function(){
-		var previousSerialization = this.previous.apply(this, arguments) || {};
-		if (this.options.selectable){
-			previousSerialization.selectedRows = this.selectedRows.map(function(row){
-				return Array.indexOf(this.body.rows, row);
-			}.bind(this));
-		}
-		return previousSerialization;
-	},
-
-	restore: function(tableState){
-		if (this.options.selectable && tableState.selectedRows){
-			tableState.selectedRows.each(function(index){
-				this.selectRow(this.body.rows[index]);
-			}.bind(this));
-		}
-		this.previous.apply(this, arguments);
-	},
-
-	deselectRow: function(row, _nocheck){
-		if (!this.isSelected(row) || (!_nocheck && !this.body.getChildren().contains(row))) return;
-
-		this.selectedRows = new Elements(Array.convert(this.selectedRows).erase(row));
-		row.removeClass(this.options.classRowSelected);
-		this.fireEvent('rowUnfocus', [row, this.selectedRows]);
-		this.fireEvent('stateChanged');
-		return this;
-	},
-
-	selectAll: function(selectNone){
-		if (!selectNone && !this.options.allowMultiSelect) return;
-		this.selectRange(0, this.body.rows.length, selectNone);
-		return this;
-	},
-
-	selectNone: function(){
-		return this.selectAll(true);
-	},
-
-	selectRange: function(startRow, endRow, _deselect){
-		if (!this.options.allowMultiSelect && !_deselect) return;
-		var method = _deselect ? 'deselectRow' : 'selectRow',
-			rows = Array.clone(this.body.rows);
-
-		if (typeOf(startRow) == 'element') startRow = rows.indexOf(startRow);
-		if (typeOf(endRow) == 'element') endRow = rows.indexOf(endRow);
-		endRow = endRow < rows.length - 1 ? endRow : rows.length - 1;
-
-		if (endRow < startRow){
-			var tmp = startRow;
-			startRow = endRow;
-			endRow = tmp;
-		}
-
-		for (var i = startRow; i <= endRow; i++){
-			if (this.options.selectHiddenRows || rows[i].isDisplayed()) this[method](rows[i], true);
-		}
-
-		return this;
-	},
-
-	deselectRange: function(startRow, endRow){
-		this.selectRange(startRow, endRow, true);
-	},
-
-/*
-	Private methods:
-*/
-
-	enterRow: function(row){
-		if (this.hovered) this.hovered = this.leaveRow(this.hovered);
-		this.hovered = row.addClass(this.options.classRowHovered);
-	},
-
-	leaveRow: function(row){
-		row.removeClass(this.options.classRowHovered);
-	},
-
-	updateSelects: function(){
-		Array.each(this.body.rows, function(row){
-			var binders = row.retrieve('binders');
-			if (!binders && !this.selectEnabled) return;
-			if (!binders){
-				binders = {
-					mouseenter: this.enterRow.pass([row], this),
-					mouseleave: this.leaveRow.pass([row], this)
-				};
-				row.store('binders', binders);
-			}
-			if (this.selectEnabled) row.addEvents(binders);
-			else row.removeEvents(binders);
-		}, this);
-	},
-
-	shiftFocus: function(offset, event){
-		if (!this.focused) return this.selectRow(this.body.rows[0], event);
-		var to = this.getRowByOffset(offset, this.options.selectHiddenRows);
-		if (to === null || this.focused == this.body.rows[to]) return this;
-		this.toggleRow(this.body.rows[to], event);
-	},
-
-	clickRow: function(event, row){
-		var selecting = (event.shift || event.meta || event.control) && this.options.shiftForMultiSelect;
-		if (!selecting && !(event.rightClick && this.isSelected(row) && this.options.allowMultiSelect)) this.selectNone();
-
-		if (event.rightClick) this.selectRow(row);
-		else this.toggleRow(row);
-
-		if (event.shift){
-			this.selectRange(this.rangeStart || this.body.rows[0], row, this.rangeStart ? !this.isSelected(row) : true);
-			this.focused = row;
-		}
-		this.rangeStart = row;
-	},
-
-	getRowByOffset: function(offset, includeHiddenRows){
-		if (!this.focused) return 0;
-		var index = Array.indexOf(this.body.rows, this.focused);
-		if ((index == 0 && offset < 0) || (index == this.body.rows.length -1 && offset > 0)) return null;
-		if (includeHiddenRows){
-			index += offset;
-		} else {
-			var limit = 0,
-				count = 0;
-			if (offset > 0){
-				while (count < offset && index < this.body.rows.length -1){
-					if (this.body.rows[++index].isDisplayed()) count++;
-				}
-			} else {
-				while (count > offset && index > 0){
-					if (this.body.rows[--index].isDisplayed()) count--;
-				}
-			}
-		}
-		return index;
-	},
-
-	attachSelects: function(attach){
-		attach = attach != null ? attach : true;
-
-		var method = attach ? 'addEvents' : 'removeEvents';
-		this.element[method]({
-			mouseleave: this.bound.mouseleave,
-			click: this.bound.activateKeyboard
-		});
-
-		this.body[method]({
-			'click:relay(tr)': this.bound.clickRow,
-			'contextmenu:relay(tr)': this.bound.clickRow
-		});
-
-		if (this.options.useKeyboard || this.keyboard){
-			if (!this.keyboard) this.keyboard = new Keyboard();
-			if (!this.selectKeysDefined){
-				this.selectKeysDefined = true;
-				var timer, held;
-
-				var move = function(offset){
-					var mover = function(e){
-						clearTimeout(timer);
-						e.preventDefault();
-						var to = this.body.rows[this.getRowByOffset(offset, this.options.selectHiddenRows)];
-						if (e.shift && to && this.isSelected(to)){
-							this.deselectRow(this.focused);
-							this.focused = to;
-						} else {
-							if (to && (!this.options.allowMultiSelect || !e.shift)){
-								this.selectNone();
-							}
-							this.shiftFocus(offset, e);
-						}
-
-						if (held){
-							timer = mover.delay(100, this, e);
-						} else {
-							timer = (function(){
-								held = true;
-								mover(e);
-							}).delay(400);
-						}
-					}.bind(this);
-					return mover;
-				}.bind(this);
-
-				var clear = function(){
-					clearTimeout(timer);
-					held = false;
-				};
-
-				this.keyboard.addEvents({
-					'keydown:shift+up': move(-1),
-					'keydown:shift+down': move(1),
-					'keyup:shift+up': clear,
-					'keyup:shift+down': clear,
-					'keyup:up': clear,
-					'keyup:down': clear
-				});
-
-				var shiftHint = '';
-				if (this.options.allowMultiSelect && this.options.shiftForMultiSelect && this.options.useKeyboard){
-					shiftHint = ' (Shift multi-selects).';
-				}
-
-				this.keyboard.addShortcuts({
-					'Select Previous Row': {
-						keys: 'up',
-						shortcut: 'up arrow',
-						handler: move(-1),
-						description: 'Select the previous row in the table.' + shiftHint
-					},
-					'Select Next Row': {
-						keys: 'down',
-						shortcut: 'down arrow',
-						handler: move(1),
-						description: 'Select the next row in the table.' + shiftHint
-					}
-				});
-
-			}
-			this.keyboard[attach ? 'activate' : 'deactivate']();
-		}
-		this.updateSelects();
-	},
-
-	mouseleave: function(){
-		if (this.hovered) this.leaveRow(this.hovered);
-	}
-
-});
-
-/*
----
-
-script: HtmlTable.Sort.js
-
-name: HtmlTable.Sort
-
-description: Builds a stripy, sortable table with methods to add rows.
-
-license: MIT-style license
-
-authors:
-  - Harald Kirschner
-  - Aaron Newton
-  - Jacob Thornton
-
-requires:
-  - Core/Hash
-  - HtmlTable
-  - Class.refactor
-  - Element.Delegation.Pseudo
-  - String.Extras
-  - Date
-
-provides: [HtmlTable.Sort]
-
-...
-*/
-(function(){
-
-var readOnlyNess = document.createElement('table');
-try {
-	readOnlyNess.innerHTML = '<tr><td></td></tr>';
-	readOnlyNess = readOnlyNess.childNodes.length === 0;
-} catch (e){
-	readOnlyNess = true;
-}
-
-HtmlTable = Class.refactor(HtmlTable, {
-
-	options: {/*
-		onSort: function(){}, */
-		sortIndex: 0,
-		sortReverse: false,
-		parsers: [],
-		defaultParser: 'string',
-		classSortable: 'table-sortable',
-		classHeadSort: 'table-th-sort',
-		classHeadSortRev: 'table-th-sort-rev',
-		classNoSort: 'table-th-nosort',
-		classGroupHead: 'table-tr-group-head',
-		classGroup: 'table-tr-group',
-		classCellSort: 'table-td-sort',
-		classSortSpan: 'table-th-sort-span',
-		sortable: false,
-		thSelector: 'th'
-	},
-
-	initialize: function(){
-		this.previous.apply(this, arguments);
-		if (this.occluded) return this.occluded;
-		this.sorted = {index: null, dir: 1};
-		if (!this.bound) this.bound = {};
-		this.bound.headClick = this.headClick.bind(this);
-		this.sortSpans = new Elements();
-		if (this.options.sortable){
-			this.enableSort();
-			if (this.options.sortIndex != null) this.sort(this.options.sortIndex, this.options.sortReverse);
-		}
-	},
-
-	attachSorts: function(attach){
-		this.detachSorts();
-		if (attach !== false) this.element.addEvent('click:relay(' + this.options.thSelector + ')', this.bound.headClick);
-	},
-
-	detachSorts: function(){
-		this.element.removeEvents('click:relay(' + this.options.thSelector + ')');
-	},
-
-	setHeaders: function(){
-		this.previous.apply(this, arguments);
-		if (this.sortable) this.setParsers();
-	},
-
-	setParsers: function(){
-		this.parsers = this.detectParsers();
-	},
-
-	detectParsers: function(){
-		return this.head && this.head.getElements(this.options.thSelector).flatten().map(this.detectParser, this);
-	},
-
-	detectParser: function(cell, index){
-		if (cell.hasClass(this.options.classNoSort) || cell.retrieve('htmltable-parser')) return cell.retrieve('htmltable-parser');
-		var thDiv = new Element('div');
-		thDiv.adopt(cell.childNodes).inject(cell);
-		var sortSpan = new Element('span', {'class': this.options.classSortSpan}).inject(thDiv, 'top');
-		this.sortSpans.push(sortSpan);
-		var parser = this.options.parsers[index],
-			rows = this.body.rows,
-			cancel;
-		switch (typeOf(parser)){
-			case 'function': parser = {convert: parser}; cancel = true; break;
-			case 'string': parser = parser; cancel = true; break;
-		}
-		if (!cancel){
-			HtmlTable.ParserPriority.some(function(parserName){
-				var current = HtmlTable.Parsers[parserName],
-					match = current.match;
-				if (!match) return false;
-				for (var i = 0, j = rows.length; i < j; i++){
-					var cell = document.id(rows[i].cells[index]),
-						text = cell ? cell.get('html').clean() : '';
-					if (text && match.test(text)){
-						parser = current;
-						return true;
-					}
-				}
-			});
-		}
-		if (!parser) parser = this.options.defaultParser;
-		cell.store('htmltable-parser', parser);
-		return parser;
-	},
-
-	headClick: function(event, el){
-		if (!this.head || el.hasClass(this.options.classNoSort)) return;
-		return this.sort(Array.indexOf(this.head.getElements(this.options.thSelector).flatten(), el) % this.body.rows[0].cells.length);
-	},
-
-	serialize: function(){
-		var previousSerialization = this.previous.apply(this, arguments) || {};
-		if (this.options.sortable){
-			previousSerialization.sortIndex = this.sorted.index;
-			previousSerialization.sortReverse = this.sorted.reverse;
-		}
-		return previousSerialization;
-	},
-
-	restore: function(tableState){
-		if (this.options.sortable && tableState.sortIndex){
-			this.sort(tableState.sortIndex, tableState.sortReverse);
-		}
-		this.previous.apply(this, arguments);
-	},
-
-	setSortedState: function(index, reverse){
-		if (reverse != null) this.sorted.reverse = reverse;
-		else if (this.sorted.index == index) this.sorted.reverse = !this.sorted.reverse;
-		else this.sorted.reverse = this.sorted.index == null;
-
-		if (index != null) this.sorted.index = index;
-	},
-
-	setHeadSort: function(sorted){
-		var head = $$(!this.head.length ? this.head.cells[this.sorted.index] : this.head.map(function(row){
-			return row.getElements(this.options.thSelector)[this.sorted.index];
-		}, this).clean());
-		if (!head.length) return;
-		if (sorted){
-			head.addClass(this.options.classHeadSort);
-			if (this.sorted.reverse) head.addClass(this.options.classHeadSortRev);
-			else head.removeClass(this.options.classHeadSortRev);
-		} else {
-			head.removeClass(this.options.classHeadSort).removeClass(this.options.classHeadSortRev);
-		}
-	},
-
-	setRowSort: function(data, pre){
-		var count = data.length,
-			body = this.body,
-			group,
-			rowIndex;
-
-		while (count){
-			var item = data[--count],
-				position = item.position,
-				row = body.rows[position];
-
-			if (row.disabled) continue;
-			if (!pre){
-				group = this.setGroupSort(group, row, item);
-				this.setRowStyle(row, count);
-			}
-			body.appendChild(row);
-
-			for (rowIndex = 0; rowIndex < count; rowIndex++){
-				if (data[rowIndex].position > position) data[rowIndex].position--;
-			}
-		}
-	},
-
-	setRowStyle: function(row, i){
-		this.previous(row, i);
-		row.cells[this.sorted.index].addClass(this.options.classCellSort);
-	},
-
-	setGroupSort: function(group, row, item){
-		if (group == item.value) row.removeClass(this.options.classGroupHead).addClass(this.options.classGroup);
-		else row.removeClass(this.options.classGroup).addClass(this.options.classGroupHead);
-		return item.value;
-	},
-
-	getParser: function(){
-		var parser = this.parsers[this.sorted.index];
-		return typeOf(parser) == 'string' ? HtmlTable.Parsers[parser] : parser;
-	},
-
-	sort: function(index, reverse, pre, sortFunction){
-		if (!this.head) return;
-
-		if (!pre){
-			this.clearSort();
-			this.setSortedState(index, reverse);
-			this.setHeadSort(true);
-		}
-
-		var parser = this.getParser();
-		if (!parser) return;
-
-		var rel;
-		if (!readOnlyNess){
-			rel = this.body.getParent();
-			this.body.dispose();
-		}
-
-		var data = this.parseData(parser).sort(sortFunction ? sortFunction : function(a, b){
-			if (a.value === b.value) return 0;
-			return a.value > b.value ? 1 : -1;
-		});
-
-		var reversed = this.sorted.reverse == (parser == HtmlTable.Parsers['input-checked']);
-		if (reversed) data.reverse(true);
-		this.setRowSort(data, pre);
-
-		if (rel) rel.grab(this.body);
-		this.fireEvent('stateChanged');
-		return this.fireEvent('sort', [this.body, this.sorted.index, reversed ? 'asc' : 'desc']);
-	},
-
-	parseData: function(parser){
-		return Array.map(this.body.rows, function(row, i){
-			var value = parser.convert.call(document.id(row.cells[this.sorted.index]));
-			return {
-				position: i,
-				value: value
-			};
-		}, this);
-	},
-
-	clearSort: function(){
-		this.setHeadSort(false);
-		this.body.getElements('td').removeClass(this.options.classCellSort);
-	},
-
-	reSort: function(){
-		if (this.sortable) this.sort.call(this, this.sorted.index, this.sorted.reverse);
-		return this;
-	},
-
-	enableSort: function(){
-		this.element.addClass(this.options.classSortable);
-		this.attachSorts(true);
-		this.setParsers();
-		this.sortable = true;
-		return this;
-	},
-
-	disableSort: function(){
-		this.element.removeClass(this.options.classSortable);
-		this.attachSorts(false);
-		this.sortSpans.each(function(span){
-			span.destroy();
-		});
-		this.sortSpans.empty();
-		this.sortable = false;
-		return this;
-	}
-
-});
-
-HtmlTable.ParserPriority = ['date', 'input-checked', 'input-value', 'float', 'number'];
-
-HtmlTable.Parsers = {
-
-	'date': {
-		match: /^\d{2}[-\/ ]\d{2}[-\/ ]\d{2,4}$/,
-		convert: function(){
-			var d = Date.parse(this.get('text').stripTags());
-			return (typeOf(d) == 'date') ? d.format('db') : '';
-		},
-		type: 'date'
-	},
-	'input-checked': {
-		match: / type="(radio|checkbox)"/,
-		convert: function(){
-			return this.getElement('input').checked;
-		}
-	},
-	'input-value': {
-		match: /<input/,
-		convert: function(){
-			return this.getElement('input').value;
-		}
-	},
-	'number': {
-		match: /^\d+[^\d.,]*$/,
-		convert: function(){
-			return this.get('text').stripTags().toInt();
-		},
-		number: true
-	},
-	'numberLax': {
-		match: /^[^\d]+\d+$/,
-		convert: function(){
-			return this.get('text').replace(/[^-?^0-9]/, '').stripTags().toInt();
-		},
-		number: true
-	},
-	'float': {
-		match: /^[\d]+\.[\d]+/,
-		convert: function(){
-			return this.get('text').replace(/[^-?^\d.e]/, '').stripTags().toFloat();
-		},
-		number: true
-	},
-	'floatLax': {
-		match: /^[^\d]+[\d]+\.[\d]+$/,
-		convert: function(){
-			return this.get('text').replace(/[^-?^\d.]/, '').stripTags().toFloat();
-		},
-		number: true
-	},
-	'string': {
-		match: null,
-		convert: function(){
-			return this.get('text').stripTags().toLowerCase();
-		}
-	},
-	'title': {
-		match: null,
-		convert: function(){
-			return this.title;
-		}
-	}
-
-};
-
-
-
-HtmlTable.defineParsers = function(parsers){
-	HtmlTable.Parsers = Object.append(HtmlTable.Parsers, parsers);
-	for (var parser in parsers){
-		HtmlTable.ParserPriority.unshift(parser);
-	}
-};
-
-})();
-
-
-/*
----
-
-script: HtmlTable.Zebra.js
-
-name: HtmlTable.Zebra
-
-description: Builds a stripy table with methods to add rows.
-
-license: MIT-style license
-
-authors:
-  - Harald Kirschner
-  - Aaron Newton
-
-requires:
-  - HtmlTable
-  - Element.Shortcuts
-  - Class.refactor
-
-provides: [HtmlTable.Zebra]
-
-...
-*/
-
-HtmlTable = Class.refactor(HtmlTable, {
-
-	options: {
-		classZebra: 'table-tr-odd',
-		zebra: true,
-		zebraOnlyVisibleRows: true
-	},
-
-	initialize: function(){
-		this.previous.apply(this, arguments);
-		if (this.occluded) return this.occluded;
-		if (this.options.zebra) this.updateZebras();
-	},
-
-	updateZebras: function(){
-		var index = 0;
-		Array.each(this.body.rows, function(row){
-			if (!this.options.zebraOnlyVisibleRows || row.isDisplayed()){
-				this.zebra(row, index++);
-			}
-		}, this);
-	},
-
-	setRowStyle: function(row, i){
-		if (this.previous) this.previous(row, i);
-		this.zebra(row, i);
-	},
-
-	zebra: function(row, i){
-		return row[((i % 2) ? 'remove' : 'add')+'Class'](this.options.classZebra);
-	},
-
-	push: function(){
-		var pushed = this.previous.apply(this, arguments);
-		if (this.options.zebra) this.updateZebras();
-		return pushed;
-	}
-
-});
-
-/*
----
-
-script: Scroller.js
-
-name: Scroller
-
-description: Class which scrolls the contents of any Element (including the window) when the mouse reaches the Element's boundaries.
-
-license: MIT-style license
-
-authors:
-  - Valerio Proietti
-
-requires:
-  - Core/Events
-  - Core/Options
-  - Core/Element.Event
-  - Core/Element.Dimensions
-  - MooTools.More
-
-provides: [Scroller]
-
-...
-*/
-(function(){
-
-var Scroller = this.Scroller = new Class({
-
-	Implements: [Events, Options],
-
-	options: {
-		area: 20,
-		velocity: 1,
-		onChange: function(x, y){
-			this.element.scrollTo(x, y);
-		},
-		fps: 50
-	},
-
-	initialize: function(element, options){
-		this.setOptions(options);
-		this.element = document.id(element);
-		this.docBody = document.id(this.element.getDocument().body);
-		this.listener = (typeOf(this.element) != 'element') ? this.docBody : this.element;
-		this.timer = null;
-		this.bound = {
-			attach: this.attach.bind(this),
-			detach: this.detach.bind(this),
-			getCoords: this.getCoords.bind(this)
-		};
-	},
-
-	start: function(){
-		this.listener.addEvents({
-			mouseover: this.bound.attach,
-			mouseleave: this.bound.detach
-		});
-		return this;
-	},
-
-	stop: function(){
-		this.listener.removeEvents({
-			mouseover: this.bound.attach,
-			mouseleave: this.bound.detach
-		});
-		this.detach();
-		this.timer = clearInterval(this.timer);
-		return this;
-	},
-
-	attach: function(){
-		this.listener.addEvent('mousemove', this.bound.getCoords);
-	},
-
-	detach: function(){
-		this.listener.removeEvent('mousemove', this.bound.getCoords);
-		this.timer = clearInterval(this.timer);
-	},
-
-	getCoords: function(event){
-		this.page = (this.listener.get('tag') == 'body') ? event.client : event.page;
-		if (!this.timer) this.timer = this.scroll.periodical(Math.round(1000 / this.options.fps), this);
-	},
-
-	scroll: function(){
-		var size = this.element.getSize(),
-			scroll = this.element.getScroll(),
-			pos = ((this.element != this.docBody) && (this.element != window)) ? this.element.getOffsets() : {x: 0, y: 0},
-			scrollSize = this.element.getScrollSize(),
-			change = {x: 0, y: 0},
-			top = this.options.area.top || this.options.area,
-			bottom = this.options.area.bottom || this.options.area;
-		for (var z in this.page){
-			if (this.page[z] < (top + pos[z]) && scroll[z] != 0){
-				change[z] = (this.page[z] - top - pos[z]) * this.options.velocity;
-			} else if (this.page[z] + bottom > (size[z] + pos[z]) && scroll[z] + size[z] != scrollSize[z]){
-				change[z] = (this.page[z] - size[z] + bottom - pos[z]) * this.options.velocity;
-			}
-			change[z] = change[z].round();
-		}
-		if (change.y || change.x) this.fireEvent('change', [scroll.x + change.x, scroll.y + change.y]);
-	}
-
-});
-
-})();
-
-
-/*
----
-
-script: Tips.js
-
-name: Tips
-
-description: Class for creating nice tips that follow the mouse cursor when hovering an element.
-
-license: MIT-style license
-
-authors:
-  - Valerio Proietti
-  - Christoph Pojer
-  - Luis Merino
-
-requires:
-  - Core/Options
-  - Core/Events
-  - Core/Element.Event
-  - Core/Element.Style
-  - Core/Element.Dimensions
-  - MooTools.More
-
-provides: [Tips]
-
-...
-*/
-
-(function(){
-
-var read = function(option, element){
-	return (option) ? (typeOf(option) == 'function' ? option(element) : element.get(option)) : '';
-};
-
-var Tips = this.Tips = new Class({
-
-	Implements: [Events, Options],
-
-	options: {/*
-		id: null,
-		onAttach: function(element){},
-		onDetach: function(element){},
-		onBound: function(coords){},*/
-		onShow: function(){
-			this.tip.setStyle('display', 'block');
-		},
-		onHide: function(){
-			this.tip.setStyle('display', 'none');
-		},
-		title: 'title',
-		text: function(element){
-			return element.get('rel') || element.get('href');
-		},
-		showDelay: 100,
-		hideDelay: 100,
-		className: 'tip-wrap',
-		offset: {x: 16, y: 16},
-		windowPadding: {x:0, y:0},
-		fixed: false,
-		waiAria: true,
-		hideEmpty: false
-	},
-
-	initialize: function(){
-		var params = Array.link(arguments, {
-			options: Type.isObject,
-			elements: function(obj){
-				return obj != null;
-			}
-		});
-		this.setOptions(params.options);
-		if (params.elements) this.attach(params.elements);
-		this.container = new Element('div', {'class': 'tip'});
-
-		if (this.options.id){
-			this.container.set('id', this.options.id);
-			if (this.options.waiAria) this.attachWaiAria();
-		}
-	},
-
-	toElement: function(){
-		if (this.tip) return this.tip;
-
-		this.tip = new Element('div', {
-			'class': this.options.className,
-			styles: {
-				position: 'absolute',
-				top: 0,
-				left: 0,
-				display: 'none'
-			}
-		}).adopt(
-			new Element('div', {'class': 'tip-top'}),
-			this.container,
-			new Element('div', {'class': 'tip-bottom'})
-		);
-
-		return this.tip;
-	},
-
-	attachWaiAria: function(){
-		var id = this.options.id;
-		this.container.set('role', 'tooltip');
-
-		if (!this.waiAria){
-			this.waiAria = {
-				show: function(element){
-					if (id) element.set('aria-describedby', id);
-					this.container.set('aria-hidden', 'false');
-				},
-				hide: function(element){
-					if (id) element.erase('aria-describedby');
-					this.container.set('aria-hidden', 'true');
-				}
-			};
-		}
-		this.addEvents(this.waiAria);
-	},
-
-	detachWaiAria: function(){
-		if (this.waiAria){
-			this.container.erase('role');
-			this.container.erase('aria-hidden');
-			this.removeEvents(this.waiAria);
-		}
-	},
-
-	attach: function(elements){
-		$$(elements).each(function(element){
-			var title = read(this.options.title, element),
-				text = read(this.options.text, element);
-
-			element.set('title', '').store('tip:native', title).retrieve('tip:title', title);
-			element.retrieve('tip:text', text);
-			this.fireEvent('attach', [element]);
-
-			var events = ['enter', 'leave'];
-			if (!this.options.fixed) events.push('move');
-
-			events.each(function(value){
-				var event = element.retrieve('tip:' + value);
-				if (!event) event = function(event){
-					this['element' + value.capitalize()].apply(this, [event, element]);
-				}.bind(this);
-
-				element.store('tip:' + value, event).addEvent('mouse' + value, event);
-			}, this);
-		}, this);
-
-		return this;
-	},
-
-	detach: function(elements){
-		$$(elements).each(function(element){
-			['enter', 'leave', 'move'].each(function(value){
-				element.removeEvent('mouse' + value, element.retrieve('tip:' + value)).eliminate('tip:' + value);
-			});
-
-			this.fireEvent('detach', [element]);
-
-			if (this.options.title == 'title'){ // This is necessary to check if we can revert the title
-				var original = element.retrieve('tip:native');
-				if (original) element.set('title', original);
-			}
-		}, this);
-
-		return this;
-	},
-
-	elementEnter: function(event, element){
-		clearTimeout(this.timer);
-		this.timer = (function(){
-			this.container.empty();
-			var showTip = !this.options.hideEmpty;
-			['title', 'text'].each(function(value){
-				var content = element.retrieve('tip:' + value);
-				var div = this['_' + value + 'Element'] = new Element('div', {
-					'class': 'tip-' + value
-				}).inject(this.container);
-				if (content){
-					this.fill(div, content);
-					showTip = true;
-				}
-			}, this);
-			if (showTip){
-				this.show(element);
-			} else {
-				this.hide(element);
-			}
-			this.position((this.options.fixed) ? {page: element.getPosition()} : event);
-		}).delay(this.options.showDelay, this);
-	},
-
-	elementLeave: function(event, element){
-		clearTimeout(this.timer);
-		this.timer = this.hide.delay(this.options.hideDelay, this, element);
-		this.fireForParent(event, element);
-	},
-
-	setTitle: function(title){
-		if (this._titleElement){
-			this._titleElement.empty();
-			this.fill(this._titleElement, title);
-		}
-		return this;
-	},
-
-	setText: function(text){
-		if (this._textElement){
-			this._textElement.empty();
-			this.fill(this._textElement, text);
-		}
-		return this;
-	},
-
-	fireForParent: function(event, element){
-		element = element.getParent();
-		if (!element || element == document.body) return;
-		if (element.retrieve('tip:enter')) element.fireEvent('mouseenter', event);
-		else this.fireForParent(event, element);
-	},
-
-	elementMove: function(event, element){
-		this.position(event);
-	},
-
-	position: function(event){
-		if (!this.tip) document.id(this);
-
-		var size = window.getSize(), scroll = window.getScroll(),
-			tip = {x: this.tip.offsetWidth, y: this.tip.offsetHeight},
-			props = {x: 'left', y: 'top'},
-			bounds = {y: false, x2: false, y2: false, x: false},
-			obj = {};
-
-		for (var z in props){
-			obj[props[z]] = event.page[z] + this.options.offset[z];
-			if (obj[props[z]] < 0) bounds[z] = true;
-			if ((obj[props[z]] + tip[z] - scroll[z]) > size[z] - this.options.windowPadding[z]){
-				obj[props[z]] = event.page[z] - this.options.offset[z] - tip[z];
-				bounds[z+'2'] = true;
-			}
-		}
-
-		this.fireEvent('bound', bounds);
-		this.tip.setStyles(obj);
-	},
-
-	fill: function(element, contents){
-		if (typeof contents == 'string') element.set('html', contents);
-		else element.adopt(contents);
-	},
-
-	show: function(element){
-		if (!this.tip) document.id(this);
-		if (!this.tip.getParent()) this.tip.inject(document.body);
-		this.fireEvent('show', [this.tip, element]);
-	},
-
-	hide: function(element){
-		if (!this.tip) document.id(this);
-		this.fireEvent('hide', [this.tip, element]);
-	}
-
-});
-
-})();
-
-/*
----
-name: Locale.CH.Number
-description: Number messages for Switzerland.
-license: MIT-style license
-authors:
-  - Kim D. Jeker
-requires:
-  - Locale
-provides: [Locale.CH.Number]
-...
-*/
-
-Locale.define('CH', 'Number', {
-
-	decimal: ',',
-	group: '\'',
-
-	currency: {
-		decimal: '.',
-		suffix: ' CHF'
-	}
-
-});
-
-/*
----
-
-name: Locale.EU.Number
-
-description: Number messages for Europe.
-
-license: MIT-style license
-
-authors:
-  - Arian Stolwijk
-
-requires:
-  - Locale
-
-provides: [Locale.EU.Number]
-
-...
-*/
-
-Locale.define('EU', 'Number', {
-
-	decimal: ',',
-	group: '.',
-
-	currency: {
-		prefix: '€ '
-	}
-
-});
-
-/*
----
-
-script: Locale.Set.From.js
-
-name: Locale.Set.From
-
-description: Provides an alternative way to create Locale.Set objects.
-
-license: MIT-style license
-
-authors:
-  - Tim Wienk
-
-requires:
-  - Core/JSON
-  - Locale
-
-provides: Locale.Set.From
-
-...
-*/
-
-(function(){
-
-var parsers = {
-	'json': JSON.decode
-};
-
-Locale.Set.defineParser = function(name, fn){
-	parsers[name] = fn;
-};
-
-Locale.Set.from = function(set, type){
-	if (instanceOf(set, Locale.Set)) return set;
-
-	if (!type && typeOf(set) == 'string') type = 'json';
-	if (parsers[type]) set = parsers[type](set);
-
-	var locale = new Locale.Set;
-
-	locale.sets = set.sets || {};
-
-	if (set.inherits){
-		locale.inherits.locales = Array.convert(set.inherits.locales);
-		locale.inherits.sets = set.inherits.sets || {};
-	}
-
-	return locale;
-};
-
-})();
-
-/*
----
-
-name: Locale.ZA.Number
-
-description: Number messages for ZA.
-
-license: MIT-style license
-
-authors:
-  - Werner Mollentze
-
-requires:
-  - Locale
-
-provides: [Locale.ZA.Number]
-
-...
-*/
-
-Locale.define('ZA', 'Number', {
-
-	decimal: '.',
-	group: ',',
-
-	currency: {
-		prefix: 'R '
-	}
-
-});
-
-
-
-/*
----
-
-name: Locale.af-ZA.Date
-
-description: Date messages for ZA Afrikaans.
-
-license: MIT-style license
-
-authors:
-  - Werner Mollentze
-
-requires:
-  - Locale
-
-provides: [Locale.af-ZA.Date]
-
-...
-*/
-
-Locale.define('af-ZA', 'Date', {
-
-	months: ['Januarie', 'Februarie', 'Maart', 'April', 'Mei', 'Junie', 'Julie', 'Augustus', 'September', 'Oktober', 'November', 'Desember'],
-	months_abbr: ['Jan', 'Feb', 'Mrt', 'Apr', 'Mei', 'Jun', 'Jul', 'Aug', 'Sep', 'Okt', 'Nov', 'Des'],
-	days: ['Sondag', 'Maandag', 'Dinsdag', 'Woensdag', 'Donderdag', 'Vrydag', 'Saterdag'],
-	days_abbr: ['Son', 'Maa', 'Din', 'Woe', 'Don', 'Vry', 'Sat'],
-
-	// Culture's date order: MM/DD/YYYY
-	dateOrder: ['date', 'month', 'year'],
-	shortDate: '%d-%m-%Y',
-	shortTime: '%H:%M',
-	AM: 'VM',
-	PM: 'NM',
-	firstDayOfWeek: 1,
-
-	// Date.Extras
-	ordinal: function(dayOfMonth){
-		return ((dayOfMonth > 1 && dayOfMonth < 20 && dayOfMonth != 8) || (dayOfMonth > 100 && dayOfMonth.toString().substr(-2, 1) == '1')) ? 'de' : 'ste';
-	},
-
-	lessThanMinuteAgo: 'minder as \'n minuut gelede',
-	minuteAgo: 'ongeveer \'n minuut gelede',
-	minutesAgo: '{delta} minute gelede',
-	hourAgo: 'omtret \'n uur gelede',
-	hoursAgo: 'ongeveer {delta} ure gelede',
-	dayAgo: '1 dag gelede',
-	daysAgo: '{delta} dae gelede',
-	weekAgo: '1 week gelede',
-	weeksAgo: '{delta} weke gelede',
-	monthAgo: '1 maand gelede',
-	monthsAgo: '{delta} maande gelede',
-	yearAgo: '1 jaar gelede',
-	yearsAgo: '{delta} jare gelede',
-
-	lessThanMinuteUntil: 'oor minder as \'n minuut',
-	minuteUntil: 'oor ongeveer \'n minuut',
-	minutesUntil: 'oor {delta} minute',
-	hourUntil: 'oor ongeveer \'n uur',
-	hoursUntil: 'oor {delta} uur',
-	dayUntil: 'oor ongeveer \'n dag',
-	daysUntil: 'oor {delta} dae',
-	weekUntil: 'oor \'n week',
-	weeksUntil: 'oor {delta} weke',
-	monthUntil: 'oor \'n maand',
-	monthsUntil: 'oor {delta} maande',
-	yearUntil: 'oor \'n jaar',
-	yearsUntil: 'oor {delta} jaar'
-
-});
-
-/*
----
-
-name: Locale.af-ZA.Form.Validator
-
-description: Form Validator messages for Afrikaans.
-
-license: MIT-style license
-
-authors:
-  - Werner Mollentze
-
-requires:
-  - Locale
-
-provides: [Locale.af-ZA.Form.Validator]
-
-...
-*/
-
-Locale.define('af-ZA', 'FormValidator', {
-
-	required: 'Hierdie veld word vereis.',
-	length: 'Voer asseblief {length} karakters in (u het {elLength} karakters ingevoer)',
-	minLength: 'Voer asseblief ten minste {minLength} karakters in (u het {length} karakters ingevoer).',
-	maxLength: 'Moet asseblief nie meer as {maxLength} karakters invoer nie (u het {length} karakters ingevoer).',
-	integer: 'Voer asseblief \'n heelgetal in hierdie veld in. Getalle met desimale (bv. 1.25) word nie toegelaat nie.',
-	numeric: 'Voer asseblief slegs numeriese waardes in hierdie veld in (bv. "1" of "1.1" of "-1" of "-1.1").',
-	digits: 'Gebruik asseblief slegs nommers en punktuasie in hierdie veld. (by voorbeeld, \'n telefoon nommer wat koppeltekens en punte bevat is toelaatbaar).',
-	alpha: 'Gebruik asseblief slegs letters (a-z) binne-in hierdie veld. Geen spasies of ander karakters word toegelaat nie.',
-	alphanum: 'Gebruik asseblief slegs letters (a-z) en nommers (0-9) binne-in hierdie veld. Geen spasies of ander karakters word toegelaat nie.',
-	dateSuchAs: 'Voer asseblief \'n geldige datum soos {date} in',
-	dateInFormatMDY: 'Voer asseblief \'n geldige datum soos MM/DD/YYYY in (bv. "12/31/1999")',
-	email: 'Voer asseblief \'n geldige e-pos adres in. Byvoorbeeld "fred@domain.com".',
-	url: 'Voer asseblief \'n geldige bronadres (URL) soos http://www.example.com in.',
-	currencyDollar: 'Voer asseblief \'n geldige $ bedrag in. Byvoorbeeld $100.00 .',
-	oneRequired: 'Voer asseblief iets in vir ten minste een van hierdie velde.',
-	errorPrefix: 'Fout: ',
-	warningPrefix: 'Waarskuwing: ',
-
-	// Form.Validator.Extras
-	noSpace: 'Daar mag geen spasies in hierdie toevoer wees nie.',
-	reqChkByNode: 'Geen items is gekies nie.',
-	requiredChk: 'Hierdie veld word vereis.',
-	reqChkByName: 'Kies asseblief \'n {label}.',
-	match: 'Hierdie veld moet by die {matchName} veld pas',
-	startDate: 'die begin datum',
-	endDate: 'die eind datum',
-	currentDate: 'die huidige datum',
-	afterDate: 'Die datum moet dieselfde of na {label} wees.',
-	beforeDate: 'Die datum moet dieselfde of voor {label} wees.',
-	startMonth: 'Kies asseblief \'n begin maand',
-	sameMonth: 'Hierdie twee datums moet in dieselfde maand wees - u moet een of beide verander.',
-	creditcard: 'Die ingevoerde kredietkaart nommer is ongeldig. Bevestig asseblief die nommer en probeer weer. {length} syfers is ingevoer.'
-
-});
-
-/*
----
-
-name: Locale.af-ZA.Number
-
-description: Number messages for ZA Afrikaans.
-
-license: MIT-style license
-
-authors:
-  - Werner Mollentze
-
-requires:
-  - Locale
-  - Locale.ZA.Number
-
-provides: [Locale.af-ZA.Number]
-
-...
-*/
-
-Locale.define('af-ZA').inherit('ZA', 'Number');
-
-/*
----
-
-name: Locale.ar.Date
-
-description: Date messages for Arabic.
-
-license: MIT-style license
-
-authors:
-  - Chafik Barbar
-
-requires:
-  - Locale
-
-provides: [Locale.ar.Date]
-
-...
-*/
-
-Locale.define('ar', 'Date', {
-
-	// Culture's date order: DD/MM/YYYY
-	dateOrder: ['date', 'month', 'year'],
-	shortDate: '%d/%m/%Y',
-	shortTime: '%H:%M'
-
-});
-
-/*
----
-
-name: Locale.ar.Form.Validator
-
-description: Form Validator messages for Arabic.
-
-license: MIT-style license
-
-authors:
-  - Chafik Barbar
-
-requires:
-  - Locale
-
-provides: [Locale.ar.Form.Validator]
-
-...
-*/
-
-Locale.define('ar', 'FormValidator', {
-
-	required: 'هذا الحقل مطلوب.',
-	minLength: 'رجاءً إدخال {minLength} أحرف على الأقل (تم إدخال {length} أحرف).',
-	maxLength: 'الرجاء عدم إدخال أكثر من {maxLength} أحرف (تم إدخال {length} أحرف).',
-	integer: 'الرجاء إدخال عدد صحيح في هذا الحقل. أي رقم ذو كسر عشري أو مئوي (مثال 1.25 ) غير مسموح.',
-	numeric: 'الرجاء إدخال قيم رقمية في هذا الحقل (مثال "1" أو "1.1" أو "-1" أو "-1.1").',
-	digits: 'الرجاء أستخدام قيم رقمية وعلامات ترقيمية فقط في هذا الحقل (مثال, رقم هاتف مع نقطة أو شحطة)',
-	alpha: 'الرجاء أستخدام أحرف فقط (ا-ي) في هذا الحقل. أي فراغات أو علامات غير مسموحة.',
-	alphanum: 'الرجاء أستخدام أحرف فقط (ا-ي) أو أرقام (0-9) فقط في هذا الحقل. أي فراغات أو علامات غير مسموحة.',
-	dateSuchAs: 'الرجاء إدخال تاريخ صحيح كالتالي {date}',
-	dateInFormatMDY: 'الرجاء إدخال تاريخ صحيح (مثال, 31-12-1999)',
-	email: 'الرجاء إدخال بريد إلكتروني صحيح.',
-	url: 'الرجاء إدخال عنوان إلكتروني صحيح مثل http://www.example.com',
-	currencyDollar: 'الرجاء إدخال قيمة $ صحيحة. مثال, 100.00$',
-	oneRequired: 'الرجاء إدخال قيمة في أحد هذه الحقول على الأقل.',
-	errorPrefix: 'خطأ: ',
-	warningPrefix: 'تحذير: '
-
-});
-
-/*
----
-
-name: Locale.ca-CA.Date
-
-description: Date messages for Catalan.
-
-license: MIT-style license
-
-authors:
-  - Ãlfons Sanchez
-
-requires:
-  - Locale
-
-provides: [Locale.ca-CA.Date]
-
-...
-*/
-
-Locale.define('ca-CA', 'Date', {
-
-	months: ['Gener', 'Febrer', 'Març', 'Abril', 'Maig', 'Juny', 'Juli', 'Agost', 'Setembre', 'Octubre', 'Novembre', 'Desembre'],
-	months_abbr: ['gen.', 'febr.', 'març', 'abr.', 'maig', 'juny', 'jul.', 'ag.', 'set.', 'oct.', 'nov.', 'des.'],
-	days: ['Diumenge', 'Dilluns', 'Dimarts', 'Dimecres', 'Dijous', 'Divendres', 'Dissabte'],
-	days_abbr: ['dg', 'dl', 'dt', 'dc', 'dj', 'dv', 'ds'],
-
-	// Culture's date order: DD/MM/YYYY
-	dateOrder: ['date', 'month', 'year'],
-	shortDate: '%d/%m/%Y',
-	shortTime: '%H:%M',
-	AM: 'AM',
-	PM: 'PM',
-	firstDayOfWeek: 0,
-
-	// Date.Extras
-	ordinal: '',
-
-	lessThanMinuteAgo: 'fa menys d`un minut',
-	minuteAgo: 'fa un minut',
-	minutesAgo: 'fa {delta} minuts',
-	hourAgo: 'fa un hora',
-	hoursAgo: 'fa unes {delta} hores',
-	dayAgo: 'fa un dia',
-	daysAgo: 'fa {delta} dies',
-
-	lessThanMinuteUntil: 'menys d`un minut des d`ara',
-	minuteUntil: 'un minut des d`ara',
-	minutesUntil: '{delta} minuts des d`ara',
-	hourUntil: 'un hora des d`ara',
-	hoursUntil: 'unes {delta} hores des d`ara',
-	dayUntil: '1 dia des d`ara',
-	daysUntil: '{delta} dies des d`ara'
-
-});
-
-/*
----
-
-name: Locale.ca-CA.Form.Validator
-
-description: Form Validator messages for Catalan.
-
-license: MIT-style license
-
-authors:
-  - Miquel Hudin
-  - Ãlfons Sanchez
-
-requires:
-  - Locale
-
-provides: [Locale.ca-CA.Form.Validator]
-
-...
-*/
-
-Locale.define('ca-CA', 'FormValidator', {
-
-	required: 'Aquest camp es obligatori.',
-	minLength: 'Per favor introdueix al menys {minLength} caracters (has introduit {length} caracters).',
-	maxLength: 'Per favor introdueix no mes de {maxLength} caracters (has introduit {length} caracters).',
-	integer: 'Per favor introdueix un nombre enter en aquest camp. Nombres amb decimals (p.e. 1,25) no estan permesos.',
-	numeric: 'Per favor introdueix sols valors numerics en aquest camp (p.e. "1" o "1,1" o "-1" o "-1,1").',
-	digits: 'Per favor usa sols numeros i puntuacio en aquest camp (per exemple, un nombre de telefon amb guions i punts no esta permes).',
-	alpha: 'Per favor utilitza lletres nomes (a-z) en aquest camp. No s´admiteixen espais ni altres caracters.',
-	alphanum: 'Per favor, utilitza nomes lletres (a-z) o numeros (0-9) en aquest camp. No s´admiteixen espais ni altres caracters.',
-	dateSuchAs: 'Per favor introdueix una data valida com {date}',
-	dateInFormatMDY: 'Per favor introdueix una data valida com DD/MM/YYYY (p.e. "31/12/1999")',
-	email: 'Per favor, introdueix una adreça de correu electronic valida. Per exemple, "fred@domain.com".',
-	url: 'Per favor introdueix una URL valida com http://www.example.com.',
-	currencyDollar: 'Per favor introdueix una quantitat valida de €. Per exemple €100,00 .',
-	oneRequired: 'Per favor introdueix alguna cosa per al menys una d´aquestes entrades.',
-	errorPrefix: 'Error: ',
-	warningPrefix: 'Avis: ',
-
-	// Form.Validator.Extras
-	noSpace: 'No poden haver espais en aquesta entrada.',
-	reqChkByNode: 'No hi han elements seleccionats.',
-	requiredChk: 'Aquest camp es obligatori.',
-	reqChkByName: 'Per favor selecciona una {label}.',
-	match: 'Aquest camp necessita coincidir amb el camp {matchName}',
-	startDate: 'la data de inici',
-	endDate: 'la data de fi',
-	currentDate: 'la data actual',
-	afterDate: 'La data deu ser igual o posterior a {label}.',
-	beforeDate: 'La data deu ser igual o anterior a {label}.',
-	startMonth: 'Per favor selecciona un mes d´orige',
-	sameMonth: 'Aquestes dos dates deuen estar dins del mateix mes - deus canviar una o altra.'
-
-});
-
-/*
----
-
-name: Locale.cs-CZ.Date
-
-description: Date messages for Czech.
-
-license: MIT-style license
-
-authors:
-  - Jan Černý chemiX
-  - Christopher Zukowski
-
-requires:
-  - Locale
-
-provides: [Locale.cs-CZ.Date]
-
-...
-*/
-(function(){
-
-// Czech language pluralization rules, see http://unicode.org/repos/cldr-tmp/trunk/diff/supplemental/language_plural_rules.html
-// one -> n is 1;            1
-// few -> n in 2..4;         2-4
-// other -> everything else  0, 5-999, 1.31, 2.31, 5.31...
-var pluralize = function(n, one, few, other){
-	if (n == 1) return one;
-	else if (n == 2 || n == 3 || n == 4) return few;
-	else return other;
-};
-
-Locale.define('cs-CZ', 'Date', {
-
-	months: ['Leden', 'Únor', 'Březen', 'Duben', 'Květen', 'Červen', 'Červenec', 'Srpen', 'Září', 'Říjen', 'Listopad', 'Prosinec'],
-	months_abbr: ['ledna', 'února', 'března', 'dubna', 'května', 'června', 'července', 'srpna', 'září', 'října', 'listopadu', 'prosince'],
-	days: ['Neděle', 'Pondělí', 'Úterý', 'Středa', 'Čtvrtek', 'Pátek', 'Sobota'],
-	days_abbr: ['ne', 'po', 'út', 'st', 'čt', 'pá', 'so'],
-
-	// Culture's date order: DD.MM.YYYY
-	dateOrder: ['date', 'month', 'year'],
-	shortDate: '%d.%m.%Y',
-	shortTime: '%H:%M',
-	AM: 'dop.',
-	PM: 'odp.',
-	firstDayOfWeek: 1,
-
-	// Date.Extras
-	ordinal: '.',
-
-	lessThanMinuteAgo: 'před chvílí',
-	minuteAgo: 'přibližně před minutou',
-	minutesAgo: function(delta){ return 'před {delta} ' + pluralize(delta, 'minutou', 'minutami', 'minutami'); },
-	hourAgo: 'přibližně před hodinou',
-	hoursAgo: function(delta){ return 'před {delta} ' + pluralize(delta, 'hodinou', 'hodinami', 'hodinami'); },
-	dayAgo: 'před dnem',
-	daysAgo: function(delta){ return 'před {delta} ' + pluralize(delta, 'dnem', 'dny', 'dny'); },
-	weekAgo: 'před týdnem',
-	weeksAgo: function(delta){ return 'před {delta} ' + pluralize(delta, 'týdnem', 'týdny', 'týdny'); },
-	monthAgo: 'před měsícem',
-	monthsAgo: function(delta){ return 'před {delta} ' + pluralize(delta, 'měsícem', 'měsíci', 'měsíci'); },
-	yearAgo: 'před rokem',
-	yearsAgo: function(delta){ return 'před {delta} ' + pluralize(delta, 'rokem', 'lety', 'lety'); },
-
-	lessThanMinuteUntil: 'za chvíli',
-	minuteUntil: 'přibližně za minutu',
-	minutesUntil: function(delta){ return 'za {delta} ' + pluralize(delta, 'minutu', 'minuty', 'minut'); },
-	hourUntil: 'přibližně za hodinu',
-	hoursUntil: function(delta){ return 'za {delta} ' + pluralize(delta, 'hodinu', 'hodiny', 'hodin'); },
-	dayUntil: 'za den',
-	daysUntil: function(delta){ return 'za {delta} ' + pluralize(delta, 'den', 'dny', 'dnů'); },
-	weekUntil: 'za týden',
-	weeksUntil: function(delta){ return 'za {delta} ' + pluralize(delta, 'týden', 'týdny', 'týdnů'); },
-	monthUntil: 'za měsíc',
-	monthsUntil: function(delta){ return 'za {delta} ' + pluralize(delta, 'měsíc', 'měsíce', 'měsíců'); },
-	yearUntil: 'za rok',
-	yearsUntil: function(delta){ return 'za {delta} ' + pluralize(delta, 'rok', 'roky', 'let'); }
-});
-
-})();
-
-/*
----
-
-name: Locale.cs-CZ.Form.Validator
-
-description: Form Validator messages for Czech.
-
-license: MIT-style license
-
-authors:
-  - Jan Černý chemiX
-
-requires:
-  - Locale
-
-provides: [Locale.cs-CZ.Form.Validator]
-
-...
-*/
-
-Locale.define('cs-CZ', 'FormValidator', {
-
-	required: 'Tato položka je povinná.',
-	minLength: 'Zadejte prosím alespoň {minLength} znaků (napsáno {length} znaků).',
-	maxLength: 'Zadejte prosím méně než {maxLength} znaků (nápsáno {length} znaků).',
-	integer: 'Zadejte prosím celé číslo. Desetinná čísla (např. 1.25) nejsou povolena.',
-	numeric: 'Zadejte jen číselné hodnoty (tj. "1" nebo "1.1" nebo "-1" nebo "-1.1").',
-	digits: 'Zadejte prosím pouze čísla a interpunkční znaménka(například telefonní číslo s pomlčkami nebo tečkami je povoleno).',
-	alpha: 'Zadejte prosím pouze písmena (a-z). Mezery nebo jiné znaky nejsou povoleny.',
-	alphanum: 'Zadejte prosím pouze písmena (a-z) nebo číslice (0-9). Mezery nebo jiné znaky nejsou povoleny.',
-	dateSuchAs: 'Zadejte prosím platné datum jako {date}',
-	dateInFormatMDY: 'Zadejte prosím platné datum jako MM / DD / RRRR (tj. "12/31/1999")',
-	email: 'Zadejte prosím platnou e-mailovou adresu. Například "fred@domain.com".',
-	url: 'Zadejte prosím platnou URL adresu jako http://www.example.com.',
-	currencyDollar: 'Zadejte prosím platnou částku. Například $100.00.',
-	oneRequired: 'Zadejte prosím alespoň jednu hodnotu pro tyto položky.',
-	errorPrefix: 'Chyba: ',
-	warningPrefix: 'Upozornění: ',
-
-	// Form.Validator.Extras
-	noSpace: 'V této položce nejsou povoleny mezery',
-	reqChkByNode: 'Nejsou vybrány žádné položky.',
-	requiredChk: 'Tato položka je vyžadována.',
-	reqChkByName: 'Prosím vyberte {label}.',
-	match: 'Tato položka se musí shodovat s položkou {matchName}',
-	startDate: 'datum zahájení',
-	endDate: 'datum ukončení',
-	currentDate: 'aktuální datum',
-	afterDate: 'Datum by mělo být stejné nebo větší než {label}.',
-	beforeDate: 'Datum by mělo být stejné nebo menší než {label}.',
-	startMonth: 'Vyberte počáteční měsíc.',
-	sameMonth: 'Tyto dva datumy musí být ve stejném měsíci - změňte jeden z nich.',
-	creditcard: 'Zadané číslo kreditní karty je neplatné. Prosím opravte ho. Bylo zadáno {length} čísel.'
-
-});
-
-/*
----
-
-name: Locale.da-DK.Date
-
-description: Date messages for Danish.
-
-license: MIT-style license
-
-authors:
-  - Martin Overgaard
-  - Henrik Hansen
-
-requires:
-  - Locale
-
-provides: [Locale.da-DK.Date]
-
-...
-*/
-
-Locale.define('da-DK', 'Date', {
-
-	months: ['Januar', 'Februar', 'Marts', 'April', 'Maj', 'Juni', 'Juli', 'August', 'September', 'Oktober', 'November', 'December'],
-	months_abbr: ['jan.', 'feb.', 'mar.', 'apr.', 'maj.', 'jun.', 'jul.', 'aug.', 'sep.', 'okt.', 'nov.', 'dec.'],
-	days: ['Søndag', 'Mandag', 'Tirsdag', 'Onsdag', 'Torsdag', 'Fredag', 'Lørdag'],
-	days_abbr: ['søn', 'man', 'tir', 'ons', 'tor', 'fre', 'lør'],
-
-	// Culture's date order: DD-MM-YYYY
-	dateOrder: ['date', 'month', 'year'],
-	shortDate: '%d-%m-%Y',
-	shortTime: '%H:%M',
-	AM: 'AM',
-	PM: 'PM',
-	firstDayOfWeek: 1,
-
-	// Date.Extras
-	ordinal: '.',
-
-	lessThanMinuteAgo: 'mindre end et minut siden',
-	minuteAgo: 'omkring et minut siden',
-	minutesAgo: '{delta} minutter siden',
-	hourAgo: 'omkring en time siden',
-	hoursAgo: 'omkring {delta} timer siden',
-	dayAgo: '1 dag siden',
-	daysAgo: '{delta} dage siden',
-	weekAgo: '1 uge siden',
-	weeksAgo: '{delta} uger siden',
-	monthAgo: '1 måned siden',
-	monthsAgo: '{delta} måneder siden',
-	yearAgo: '1 år siden',
-	yearsAgo: '{delta} år siden',
-
-	lessThanMinuteUntil: 'mindre end et minut fra nu',
-	minuteUntil: 'omkring et minut fra nu',
-	minutesUntil: '{delta} minutter fra nu',
-	hourUntil: 'omkring en time fra nu',
-	hoursUntil: 'omkring {delta} timer fra nu',
-	dayUntil: '1 dag fra nu',
-	daysUntil: '{delta} dage fra nu',
-	weekUntil: '1 uge fra nu',
-	weeksUntil: '{delta} uger fra nu',
-	monthUntil: '1 måned fra nu',
-	monthsUntil: '{delta} måneder fra nu',
-	yearUntil: '1 år fra nu',
-	yearsUntil: '{delta} år fra nu'
-
-});
-
-/*
----
-
-name: Locale.da-DK.Form.Validator
-
-description: Form Validator messages for Danish.
-
-license: MIT-style license
-
-authors:
-  - Martin Overgaard
-
-requires:
-  - Locale
-
-provides: [Locale.da-DK.Form.Validator]
-
-...
-*/
-
-Locale.define('da-DK', 'FormValidator', {
-
-	required: 'Feltet skal udfyldes.',
-	minLength: 'Skriv mindst {minLength} tegn (du skrev {length} tegn).',
-	maxLength: 'Skriv maksimalt {maxLength} tegn (du skrev {length} tegn).',
-	integer: 'Skriv et tal i dette felt. Decimal tal (f.eks. 1.25) er ikke tilladt.',
-	numeric: 'Skriv kun tal i dette felt (i.e. "1" eller "1.1" eller "-1" eller "-1.1").',
-	digits: 'Skriv kun tal og tegnsætning i dette felt (eksempel, et telefon nummer med bindestreg eller punktum er tilladt).',
-	alpha: 'Skriv kun bogstaver (a-z) i dette felt. Mellemrum og andre tegn er ikke tilladt.',
-	alphanum: 'Skriv kun bogstaver (a-z) eller tal (0-9) i dette felt. Mellemrum og andre tegn er ikke tilladt.',
-	dateSuchAs: 'Skriv en gyldig dato som {date}',
-	dateInFormatMDY: 'Skriv dato i formatet DD-MM-YYYY (f.eks. "31-12-1999")',
-	email: 'Skriv en gyldig e-mail adresse. F.eks "fred@domain.com".',
-	url: 'Skriv en gyldig URL adresse. F.eks "http://www.example.com".',
-	currencyDollar: 'Skriv et gldigt beløb. F.eks Kr.100.00 .',
-	oneRequired: 'Et eller flere af felterne i denne formular skal udfyldes.',
-	errorPrefix: 'Fejl: ',
-	warningPrefix: 'Advarsel: ',
-
-	// Form.Validator.Extras
-	noSpace: 'Der må ikke benyttes mellemrum i dette felt.',
-	reqChkByNode: 'Foretag et valg.',
-	requiredChk: 'Dette felt skal udfyldes.',
-	reqChkByName: 'Vælg en {label}.',
-	match: 'Dette felt skal matche {matchName} feltet',
-	startDate: 'start dato',
-	endDate: 'slut dato',
-	currentDate: 'dags dato',
-	afterDate: 'Datoen skal være større end eller lig med {label}.',
-	beforeDate: 'Datoen skal være mindre end eller lig med {label}.',
-	startMonth: 'Vælg en start måned',
-	sameMonth: 'De valgte datoer skal være i samme måned - skift en af dem.'
-
-});
-
-/*
----
-
-name: Locale.de-DE.Date
-
-description: Date messages for German.
-
-license: MIT-style license
-
-authors:
-  - Christoph Pojer
-  - Frank Rossi
-  - Ulrich Petri
-  - Fabian Beiner
-
-requires:
-  - Locale
-
-provides: [Locale.de-DE.Date]
-
-...
-*/
-
-Locale.define('de-DE', 'Date', {
-
-	months: ['Januar', 'Februar', 'März', 'April', 'Mai', 'Juni', 'Juli', 'August', 'September', 'Oktober', 'November', 'Dezember'],
-	months_abbr: ['Jan', 'Feb', 'Mär', 'Apr', 'Mai', 'Jun', 'Jul', 'Aug', 'Sep', 'Okt', 'Nov', 'Dez'],
-	days: ['Sonntag', 'Montag', 'Dienstag', 'Mittwoch', 'Donnerstag', 'Freitag', 'Samstag'],
-	days_abbr: ['So', 'Mo', 'Di', 'Mi', 'Do', 'Fr', 'Sa'],
-
-	// Culture's date order: DD.MM.YYYY
-	dateOrder: ['date', 'month', 'year'],
-	shortDate: '%d.%m.%Y',
-	shortTime: '%H:%M',
-	AM: 'vormittags',
-	PM: 'nachmittags',
-	firstDayOfWeek: 1,
-
-	// Date.Extras
-	ordinal: '.',
-
-	lessThanMinuteAgo: 'vor weniger als einer Minute',
-	minuteAgo: 'vor einer Minute',
-	minutesAgo: 'vor {delta} Minuten',
-	hourAgo: 'vor einer Stunde',
-	hoursAgo: 'vor {delta} Stunden',
-	dayAgo: 'vor einem Tag',
-	daysAgo: 'vor {delta} Tagen',
-	weekAgo: 'vor einer Woche',
-	weeksAgo: 'vor {delta} Wochen',
-	monthAgo: 'vor einem Monat',
-	monthsAgo: 'vor {delta} Monaten',
-	yearAgo: 'vor einem Jahr',
-	yearsAgo: 'vor {delta} Jahren',
-
-	lessThanMinuteUntil: 'in weniger als einer Minute',
-	minuteUntil: 'in einer Minute',
-	minutesUntil: 'in {delta} Minuten',
-	hourUntil: 'in ca. einer Stunde',
-	hoursUntil: 'in ca. {delta} Stunden',
-	dayUntil: 'in einem Tag',
-	daysUntil: 'in {delta} Tagen',
-	weekUntil: 'in einer Woche',
-	weeksUntil: 'in {delta} Wochen',
-	monthUntil: 'in einem Monat',
-	monthsUntil: 'in {delta} Monaten',
-	yearUntil: 'in einem Jahr',
-	yearsUntil: 'in {delta} Jahren'
-
-});
-
-/*
----
-
-name: Locale.de-CH.Date
-
-description: Date messages for German (Switzerland).
-
-license: MIT-style license
-
-authors:
-  - Michael van der Weg
-
-requires:
-  - Locale
-  - Locale.de-DE.Date
-
-provides: [Locale.de-CH.Date]
-
-...
-*/
-
-Locale.define('de-CH').inherit('de-DE', 'Date');
-
-/*
----
-
-name: Locale.de-CH.Form.Validator
-
-description: Form Validator messages for German (Switzerland).
-
-license: MIT-style license
-
-authors:
-  - Michael van der Weg
-
-requires:
-  - Locale
-
-provides: [Locale.de-CH.Form.Validator]
-
-...
-*/
-
-Locale.define('de-CH', 'FormValidator', {
-
-	required: 'Dieses Feld ist obligatorisch.',
-	minLength: 'Geben Sie bitte mindestens {minLength} Zeichen ein (Sie haben {length} Zeichen eingegeben).',
-	maxLength: 'Bitte geben Sie nicht mehr als {maxLength} Zeichen ein (Sie haben {length} Zeichen eingegeben).',
-	integer: 'Geben Sie bitte eine ganze Zahl ein. Dezimalzahlen (z.B. 1.25) sind nicht erlaubt.',
-	numeric: 'Geben Sie bitte nur Zahlenwerte in dieses Eingabefeld ein (z.B. &quot;1&quot;, &quot;1.1&quot;, &quot;-1&quot; oder &quot;-1.1&quot;).',
-	digits: 'Benutzen Sie bitte nur Zahlen und Satzzeichen in diesem Eingabefeld (erlaubt ist z.B. eine Telefonnummer mit Bindestrichen und Punkten).',
-	alpha: 'Benutzen Sie bitte nur Buchstaben (a-z) in diesem Feld. Leerzeichen und andere Zeichen sind nicht erlaubt.',
-	alphanum: 'Benutzen Sie bitte nur Buchstaben (a-z) und Zahlen (0-9) in diesem Eingabefeld. Leerzeichen und andere Zeichen sind nicht erlaubt.',
-	dateSuchAs: 'Geben Sie bitte ein g&uuml;ltiges Datum ein. Wie zum Beispiel {date}',
-	dateInFormatMDY: 'Geben Sie bitte ein g&uuml;ltiges Datum ein. Wie zum Beispiel TT.MM.JJJJ (z.B. &quot;31.12.1999&quot;)',
-	email: 'Geben Sie bitte eine g&uuml;ltige E-Mail Adresse ein. Wie zum Beispiel &quot;maria@bernasconi.ch&quot;.',
-	url: 'Geben Sie bitte eine g&uuml;ltige URL ein. Wie zum Beispiel http://www.example.com.',
-	currencyDollar: 'Geben Sie bitte einen g&uuml;ltigen Betrag in Schweizer Franken ein. Wie zum Beispiel 100.00 CHF .',
-	oneRequired: 'Machen Sie f&uuml;r mindestens eines der Eingabefelder einen Eintrag.',
-	errorPrefix: 'Fehler: ',
-	warningPrefix: 'Warnung: ',
-
-	// Form.Validator.Extras
-	noSpace: 'In diesem Eingabefeld darf kein Leerzeichen sein.',
-	reqChkByNode: 'Es wurden keine Elemente gew&auml;hlt.',
-	requiredChk: 'Dieses Feld ist obligatorisch.',
-	reqChkByName: 'Bitte w&auml;hlen Sie ein {label}.',
-	match: 'Dieses Eingabefeld muss mit dem Feld {matchName} &uuml;bereinstimmen.',
-	startDate: 'Das Anfangsdatum',
-	endDate: 'Das Enddatum',
-	currentDate: 'Das aktuelle Datum',
-	afterDate: 'Das Datum sollte zur gleichen Zeit oder sp&auml;ter sein {label}.',
-	beforeDate: 'Das Datum sollte zur gleichen Zeit oder fr&uuml;her sein {label}.',
-	startMonth: 'W&auml;hlen Sie bitte einen Anfangsmonat',
-	sameMonth: 'Diese zwei Datumsangaben m&uuml;ssen im selben Monat sein - Sie m&uuml;ssen eine von beiden ver&auml;ndern.',
-	creditcard: 'Die eingegebene Kreditkartennummer ist ung&uuml;ltig. Bitte &uuml;berpr&uuml;fen Sie diese und versuchen Sie es erneut. {length} Zahlen eingegeben.'
-
-});
-
-/*
----
-name: Locale.de-CH.Number
-description: Number messages for Switzerland.
-license: MIT-style license
-authors:
-  - Kim D. Jeker
-requires:
-  - Locale
-  - Locale.CH.Number
-provides: [Locale.de-CH.Number]
-...
-*/
-
-Locale.define('de-CH').inherit('CH', 'Number');
-
-/*
----
-
-name: Locale.de-DE.Form.Validator
-
-description: Form Validator messages for German.
-
-license: MIT-style license
-
-authors:
-  - Frank Rossi
-  - Ulrich Petri
-  - Fabian Beiner
-
-requires:
-  - Locale
-
-provides: [Locale.de-DE.Form.Validator]
-
-...
-*/
-
-Locale.define('de-DE', 'FormValidator', {
-
-	required: 'Dieses Eingabefeld muss ausgefüllt werden.',
-	minLength: 'Geben Sie bitte mindestens {minLength} Zeichen ein (Sie haben nur {length} Zeichen eingegeben).',
-	maxLength: 'Geben Sie bitte nicht mehr als {maxLength} Zeichen ein (Sie haben {length} Zeichen eingegeben).',
-	integer: 'Geben Sie in diesem Eingabefeld bitte eine ganze Zahl ein. Dezimalzahlen (z.B. "1.25") sind nicht erlaubt.',
-	numeric: 'Geben Sie in diesem Eingabefeld bitte nur Zahlenwerte (z.B. "1", "1.1", "-1" oder "-1.1") ein.',
-	digits: 'Geben Sie in diesem Eingabefeld bitte nur Zahlen und Satzzeichen ein (z.B. eine Telefonnummer mit Bindestrichen und Punkten ist erlaubt).',
-	alpha: 'Geben Sie in diesem Eingabefeld bitte nur Buchstaben (a-z) ein. Leerzeichen und andere Zeichen sind nicht erlaubt.',
-	alphanum: 'Geben Sie in diesem Eingabefeld bitte nur Buchstaben (a-z) und Zahlen (0-9) ein. Leerzeichen oder andere Zeichen sind nicht erlaubt.',
-	dateSuchAs: 'Geben Sie bitte ein gültiges Datum ein (z.B. "{date}").',
-	dateInFormatMDY: 'Geben Sie bitte ein gültiges Datum im Format TT.MM.JJJJ ein (z.B. "31.12.1999").',
-	email: 'Geben Sie bitte eine gültige E-Mail-Adresse ein (z.B. "max@mustermann.de").',
-	url: 'Geben Sie bitte eine gültige URL ein (z.B. "http://www.example.com").',
-	currencyDollar: 'Geben Sie bitte einen gültigen Betrag in EURO ein (z.B. 100.00€).',
-	oneRequired: 'Bitte füllen Sie mindestens ein Eingabefeld aus.',
-	errorPrefix: 'Fehler: ',
-	warningPrefix: 'Warnung: ',
-
-	// Form.Validator.Extras
-	noSpace: 'Es darf kein Leerzeichen in diesem Eingabefeld sein.',
-	reqChkByNode: 'Es wurden keine Elemente gewählt.',
-	requiredChk: 'Dieses Feld muss ausgefüllt werden.',
-	reqChkByName: 'Bitte wählen Sie ein {label}.',
-	match: 'Dieses Eingabefeld muss mit dem {matchName} Eingabefeld übereinstimmen.',
-	startDate: 'Das Anfangsdatum',
-	endDate: 'Das Enddatum',
-	currentDate: 'Das aktuelle Datum',
-	afterDate: 'Das Datum sollte zur gleichen Zeit oder später sein als {label}.',
-	beforeDate: 'Das Datum sollte zur gleichen Zeit oder früher sein als {label}.',
-	startMonth: 'Wählen Sie bitte einen Anfangsmonat',
-	sameMonth: 'Diese zwei Datumsangaben müssen im selben Monat sein - Sie müssen eines von beiden verändern.',
-	creditcard: 'Die eingegebene Kreditkartennummer ist ungültig. Bitte überprüfen Sie diese und versuchen Sie es erneut. {length} Zahlen eingegeben.'
-
-});
-
-/*
----
-
-name: Locale.de-DE.Number
-
-description: Number messages for German.
-
-license: MIT-style license
-
-authors:
-  - Christoph Pojer
-
-requires:
-  - Locale
-  - Locale.EU.Number
-
-provides: [Locale.de-DE.Number]
-
-...
-*/
-
-Locale.define('de-DE').inherit('EU', 'Number');
-
-/*
----
-
-name: Locale.el-GR.Date
-
-description: Date messages for Greek language.
-
-license: MIT-style license
-
-authors:
-  - Periklis Argiriadis
-
-requires:
-  - Locale
-
-provides: [Locale.el-GR.Date]
-
-...
-*/
-
-Locale.define('el-GR', 'Date', {
-
-	months: ['Ιανουάριος', 'Φεβρουάριος', 'Μάρτιος', 'Απρίλιος', 'Μάιος', 'Ιούνιος', 'Ιούλιος', 'Αύγουστος', 'Σεπτέμβριος', 'Οκτώβριος', 'Νοέμβριος', 'Δεκέμβριος'],
-	months_abbr: ['Ιαν', 'Φεβ', 'Μαρ', 'Απρ', 'Μάι', 'Ιουν', 'Ιουλ', 'Αυγ', 'Σεπ', 'Οκτ', 'Νοε', 'Δεκ'],
-	days: ['Κυριακή', 'Δευτέρα', 'Τρίτη', 'Τετάρτη', 'Πέμπτη', 'Παρασκευή', 'Σάββατο'],
-	days_abbr: ['Κυρ', 'Δευ', 'Τρι', 'Τετ', 'Πεμ', 'Παρ', 'Σαβ'],
-
-	// Culture's date order: DD/MM/YYYY
-	dateOrder: ['date', 'month', 'year'],
-	shortDate: '%d/%m/%Y',
-	shortTime: '%I:%M%p',
-	AM: 'πμ',
-	PM: 'μμ',
-	firstDayOfWeek: 1,
-
-	// Date.Extras
-	ordinal: function(dayOfMonth){
-		// 1st, 2nd, 3rd, etc.
-		return (dayOfMonth > 3 && dayOfMonth < 21) ? 'ος' : ['ος'][Math.min(dayOfMonth % 10, 4)];
-	},
-
-	lessThanMinuteAgo: 'λιγότερο από ένα λεπτό πριν',
-	minuteAgo: 'περίπου ένα λεπτό πριν',
-	minutesAgo: '{delta} λεπτά πριν',
-	hourAgo: 'περίπου μια ώρα πριν',
-	hoursAgo: 'περίπου {delta} ώρες πριν',
-	dayAgo: '1 ημέρα πριν',
-	daysAgo: '{delta} ημέρες πριν',
-	weekAgo: '1 εβδομάδα πριν',
-	weeksAgo: '{delta} εβδομάδες πριν',
-	monthAgo: '1 μήνα πριν',
-	monthsAgo: '{delta} μήνες πριν',
-	yearAgo: '1 χρόνο πριν',
-	yearsAgo: '{delta} χρόνια πριν',
-
-	lessThanMinuteUntil: 'λιγότερο από λεπτό από τώρα',
-	minuteUntil: 'περίπου ένα λεπτό από τώρα',
-	minutesUntil: '{delta} λεπτά από τώρα',
-	hourUntil: 'περίπου μια ώρα από τώρα',
-	hoursUntil: 'περίπου {delta} ώρες από τώρα',
-	dayUntil: '1 ημέρα από τώρα',
-	daysUntil: '{delta} ημέρες από τώρα',
-	weekUntil: '1 εβδομάδα από τώρα',
-	weeksUntil: '{delta} εβδομάδες από τώρα',
-	monthUntil: '1 μήνας από τώρα',
-	monthsUntil: '{delta} μήνες από τώρα',
-	yearUntil: '1 χρόνος από τώρα',
-	yearsUntil: '{delta} χρόνια από τώρα'
-
-});
-
-/*
----
-
-name: Locale.el-GR.Form.Validator
-
-description: Form Validator messages for Greek language.
-
-license: MIT-style license
-
-authors:
-  - Dimitris Tsironis
-
-requires:
-  - Locale
-
-provides: [Locale.el-GR.Form.Validator]
-
-...
-*/
-
-Locale.define('el-GR', 'FormValidator', {
-
-	required: 'Αυτό το πεδίο είναι απαραίτητο.',
-	length: 'Παρακαλούμε, εισάγετε {length} χαρακτήρες (έχετε ήδη εισάγει {elLength} χαρακτήρες).',
-	minLength: 'Παρακαλούμε, εισάγετε τουλάχιστον {minLength} χαρακτήρες (έχετε ήδη εισάγε {length} χαρακτήρες).',
-	maxlength: 'Παρακαλούμε, εισάγετε εώς {maxlength} χαρακτήρες (έχετε ήδη εισάγε {length} χαρακτήρες).',
-	integer: 'Παρακαλούμε, εισάγετε έναν ακέραιο αριθμό σε αυτό το πεδίο. Οι αριθμοί με δεκαδικά ψηφία (π.χ. 1.25) δεν επιτρέπονται.',
-	numeric: 'Παρακαλούμε, εισάγετε μόνο αριθμητικές τιμές σε αυτό το πεδίο (π.χ." 1 " ή " 1.1 " ή " -1 " ή " -1.1 " ).',
-	digits: 'Παρακαλούμε, χρησιμοποιήστε μόνο αριθμούς και σημεία στίξης σε αυτόν τον τομέα (π.χ. επιτρέπεται αριθμός τηλεφώνου με παύλες ή τελείες).',
-	alpha: 'Παρακαλούμε, χρησιμοποιήστε μόνο γράμματα (a-z) σε αυτό το πεδίο. Δεν επιτρέπονται κενά ή άλλοι χαρακτήρες.',
-	alphanum: 'Παρακαλούμε, χρησιμοποιήστε μόνο γράμματα (a-z) ή αριθμούς (0-9) σε αυτόν τον τομέα. Δεν επιτρέπονται κενά ή άλλοι χαρακτήρες.',
-	dateSuchAs: 'Παρακαλούμε, εισάγετε μια έγκυρη ημερομηνία, όπως {date}',
-	dateInFormatMDY: 'Παρακαλώ εισάγετε μια έγκυρη ημερομηνία, όπως ΜΜ/ΗΗ/ΕΕΕΕ (π.χ. "12/31/1999").',
-	email: 'Παρακαλούμε, εισάγετε μια έγκυρη διεύθυνση ηλεκτρονικού ταχυδρομείου (π.χ. "fred@domain.com").',
-	url: 'Παρακαλούμε, εισάγετε μια έγκυρη URL διεύθυνση, όπως http://www.example.com',
-	currencyDollar: 'Παρακαλούμε, εισάγετε ένα έγκυρο ποσό σε δολλάρια (π.χ. $100.00).',
-	oneRequired: 'Παρακαλούμε, εισάγετε κάτι για τουλάχιστον ένα από αυτά τα πεδία.',
-	errorPrefix: 'Σφάλμα: ',
-	warningPrefix: 'Προσοχή: ',
-
-	// Form.Validator.Extras
-	noSpace: 'Δεν επιτρέπονται τα κενά σε αυτό το πεδίο.',
-	reqChkByNode: 'Δεν έχει επιλεγεί κάποιο αντικείμενο',
-	requiredChk: 'Αυτό το πεδίο είναι απαραίτητο.',
-	reqChkByName: 'Παρακαλούμε, επιλέξτε μια ετικέτα {label}.',
-	match: 'Αυτό το πεδίο πρέπει να ταιριάζει με το πεδίο {matchName}.',
-	startDate: 'η ημερομηνία έναρξης',
-	endDate: 'η ημερομηνία λήξης',
-	currentDate: 'η τρέχουσα ημερομηνία',
-	afterDate: 'Η ημερομηνία πρέπει να είναι η ίδια ή μετά από την {label}.',
-	beforeDate: 'Η ημερομηνία πρέπει να είναι η ίδια ή πριν από την {label}.',
-	startMonth: 'Παρακαλώ επιλέξτε ένα μήνα αρχής.',
-	sameMonth: 'Αυτές οι δύο ημερομηνίες πρέπει να έχουν τον ίδιο μήνα - θα πρέπει να αλλάξετε ή το ένα ή το άλλο',
-	creditcard: 'Ο αριθμός της πιστωτικής κάρτας δεν είναι έγκυρος. Παρακαλούμε ελέγξτε τον αριθμό και δοκιμάστε ξανά. {length} μήκος ψηφίων.'
-
-});
-
-/*
----
-
-name: Locale.en-GB.Date
-
-description: Date messages for British English.
-
-license: MIT-style license
-
-authors:
-  - Aaron Newton
-
-requires:
-  - Locale
-  - Locale.en-US.Date
-
-provides: [Locale.en-GB.Date]
-
-...
-*/
-
-Locale.define('en-GB', 'Date', {
-
-	// Culture's date order: DD/MM/YYYY
-	dateOrder: ['date', 'month', 'year'],
-	shortDate: '%d/%m/%Y',
-	shortTime: '%H:%M'
-
-}).inherit('en-US', 'Date');
-
-/*
----
-
-name: Locale.en-US.Number
-
-description: Number messages for US English.
-
-license: MIT-style license
-
-authors:
-  - Arian Stolwijk
-
-requires:
-  - Locale
-
-provides: [Locale.en-US.Number]
-
-...
-*/
-
-Locale.define('en-US', 'Number', {
-
-	decimal: '.',
-	group: ',',
-
-/* 	Commented properties are the defaults for Number.format
-	decimals: 0,
-	precision: 0,
-	scientific: null,
-
-	prefix: null,
-	suffic: null,
-
-	// Negative/Currency/percentage will mixin Number
-	negative: {
-		prefix: '-'
-	},*/
-
-	currency: {
-//		decimals: 2,
-		prefix: '$ '
-	}/*,
-
-	percentage: {
-		decimals: 2,
-		suffix: '%'
-	}*/
-
-});
-
-
-
-/*
----
-
-name: Locale.es-ES.Date
-
-description: Date messages for Spanish.
-
-license: MIT-style license
-
-authors:
-  - Ãlfons Sanchez
-
-requires:
-  - Locale
-
-provides: [Locale.es-ES.Date]
-
-...
-*/
-
-Locale.define('es-ES', 'Date', {
-
-	months: ['Enero', 'Febrero', 'Marzo', 'Abril', 'Mayo', 'Junio', 'Julio', 'Agosto', 'Septiembre', 'Octubre', 'Noviembre', 'Diciembre'],
-	months_abbr: ['ene', 'feb', 'mar', 'abr', 'may', 'jun', 'jul', 'ago', 'sep', 'oct', 'nov', 'dic'],
-	days: ['Domingo', 'Lunes', 'Martes', 'Miércoles', 'Jueves', 'Viernes', 'Sábado'],
-	days_abbr: ['dom', 'lun', 'mar', 'mié', 'juv', 'vie', 'sáb'],
-
-	// Culture's date order: DD/MM/YYYY
-	dateOrder: ['date', 'month', 'year'],
-	shortDate: '%d/%m/%Y',
-	shortTime: '%H:%M',
-	AM: 'AM',
-	PM: 'PM',
-	firstDayOfWeek: 1,
-
-	// Date.Extras
-	ordinal: '',
-
-	lessThanMinuteAgo: 'hace menos de un minuto',
-	minuteAgo: 'hace un minuto',
-	minutesAgo: 'hace {delta} minutos',
-	hourAgo: 'hace una hora',
-	hoursAgo: 'hace unas {delta} horas',
-	dayAgo: 'hace un día',
-	daysAgo: 'hace {delta} días',
-	weekAgo: 'hace una semana',
-	weeksAgo: 'hace unas {delta} semanas',
-	monthAgo: 'hace un mes',
-	monthsAgo: 'hace {delta} meses',
-	yearAgo: 'hace un año',
-	yearsAgo: 'hace {delta} años',
-
-	lessThanMinuteUntil: 'menos de un minuto desde ahora',
-	minuteUntil: 'un minuto desde ahora',
-	minutesUntil: '{delta} minutos desde ahora',
-	hourUntil: 'una hora desde ahora',
-	hoursUntil: 'unas {delta} horas desde ahora',
-	dayUntil: 'un día desde ahora',
-	daysUntil: '{delta} días desde ahora',
-	weekUntil: 'una semana desde ahora',
-	weeksUntil: 'unas {delta} semanas desde ahora',
-	monthUntil: 'un mes desde ahora',
-	monthsUntil: '{delta} meses desde ahora',
-	yearUntil: 'un año desde ahora',
-	yearsUntil: '{delta} años desde ahora'
-
-});
-
-/*
----
-
-name: Locale.es-AR.Date
-
-description: Date messages for Spanish (Argentina).
-
-license: MIT-style license
-
-authors:
-  - Ãlfons Sanchez
-  - Diego Massanti
-
-requires:
-  - Locale
-  - Locale.es-ES.Date
-
-provides: [Locale.es-AR.Date]
-
-...
-*/
-
-Locale.define('es-AR').inherit('es-ES', 'Date');
-
-/*
----
-
-name: Locale.es-AR.Form.Validator
-
-description: Form Validator messages for Spanish (Argentina).
-
-license: MIT-style license
-
-authors:
-  - Diego Massanti
-
-requires:
-  - Locale
-
-provides: [Locale.es-AR.Form.Validator]
-
-...
-*/
-
-Locale.define('es-AR', 'FormValidator', {
-
-	required: 'Este campo es obligatorio.',
-	minLength: 'Por favor ingrese al menos {minLength} caracteres (ha ingresado {length} caracteres).',
-	maxLength: 'Por favor no ingrese más de {maxLength} caracteres (ha ingresado {length} caracteres).',
-	integer: 'Por favor ingrese un número entero en este campo. Números con decimales (p.e. 1,25) no se permiten.',
-	numeric: 'Por favor ingrese solo valores numéricos en este campo (p.e. "1" o "1,1" o "-1" o "-1,1").',
-	digits: 'Por favor use sólo números y puntuación en este campo (por ejemplo, un número de teléfono con guiones y/o puntos no está permitido).',
-	alpha: 'Por favor use sólo letras (a-z) en este campo. No se permiten espacios ni otros caracteres.',
-	alphanum: 'Por favor, usa sólo letras (a-z) o números (0-9) en este campo. No se permiten espacios u otros caracteres.',
-	dateSuchAs: 'Por favor ingrese una fecha válida como {date}',
-	dateInFormatMDY: 'Por favor ingrese una fecha válida, utulizando el formato DD/MM/YYYY (p.e. "31/12/1999")',
-	email: 'Por favor, ingrese una dirección de e-mail válida. Por ejemplo, "fred@dominio.com".',
-	url: 'Por favor ingrese una URL válida como http://www.example.com.',
-	currencyDollar: 'Por favor ingrese una cantidad válida de pesos. Por ejemplo $100,00 .',
-	oneRequired: 'Por favor ingrese algo para por lo menos una de estas entradas.',
-	errorPrefix: 'Error: ',
-	warningPrefix: 'Advertencia: ',
-
-	// Form.Validator.Extras
-	noSpace: 'No se permiten espacios en este campo.',
-	reqChkByNode: 'No hay elementos seleccionados.',
-	requiredChk: 'Este campo es obligatorio.',
-	reqChkByName: 'Por favor selecciona una {label}.',
-	match: 'Este campo necesita coincidir con el campo {matchName}',
-	startDate: 'la fecha de inicio',
-	endDate: 'la fecha de fin',
-	currentDate: 'la fecha actual',
-	afterDate: 'La fecha debe ser igual o posterior a {label}.',
-	beforeDate: 'La fecha debe ser igual o anterior a {label}.',
-	startMonth: 'Por favor selecciona un mes de origen',
-	sameMonth: 'Estas dos fechas deben estar en el mismo mes - debes cambiar una u otra.'
-
-});
-
-/*
----
-
-name: Locale.es-AR.Number
-
-description: Number messages for es Argentina.
-
-license: MIT-style license
-
-authors:
-  - Oscar Kuchuk
-
-requires:
-  - Locale
-
-provides: [Locale.es-AR.Number]
-
-...
-*/
-
-Locale.define('es-AR', 'Number', {
-
-	decimal: ',',
-	group: '.',
-
-/* 	Commented properties are the defaults for Number.format
-	decimals: 0,
-	precision: 0,
-	scientific: null,
-
-	prefix: null,
-	suffic: null,
-
-	// Negative/Currency/percentage will mixin Number
-	negative: {
-		prefix: '-'
-	},*/
-
-	currency: {
-		decimals: 2,
-		prefix: '$ '
-	}/*,
-
-	percentage: {
-		decimals: 2,
-		suffix: '%'
-	}*/
-
-});
-
-
-/*
----
-
-name: Locale.es-ES.Form.Validator
-
-description: Form Validator messages for Spanish.
-
-license: MIT-style license
-
-authors:
-  - Ãlfons Sanchez
-
-requires:
-  - Locale
-
-provides: [Locale.es-ES.Form.Validator]
-
-...
-*/
-
-Locale.define('es-ES', 'FormValidator', {
-
-	required: 'Este campo es obligatorio.',
-	minLength: 'Por favor introduce al menos {minLength} caracteres (has introducido {length} caracteres).',
-	maxLength: 'Por favor introduce no m&aacute;s de {maxLength} caracteres (has introducido {length} caracteres).',
-	integer: 'Por favor introduce un n&uacute;mero entero en este campo. N&uacute;meros con decimales (p.e. 1,25) no se permiten.',
-	numeric: 'Por favor introduce solo valores num&eacute;ricos en este campo (p.e. "1" o "1,1" o "-1" o "-1,1").',
-	digits: 'Por favor usa solo n&uacute;meros y puntuaci&oacute;n en este campo (por ejemplo, un n&uacute;mero de tel&eacute;fono con guiones y puntos no esta permitido).',
-	alpha: 'Por favor usa letras solo (a-z) en este campo. No se admiten espacios ni otros caracteres.',
-	alphanum: 'Por favor, usa solo letras (a-z) o n&uacute;meros (0-9) en este campo. No se admiten espacios ni otros caracteres.',
-	dateSuchAs: 'Por favor introduce una fecha v&aacute;lida como {date}',
-	dateInFormatMDY: 'Por favor introduce una fecha v&aacute;lida como DD/MM/YYYY (p.e. "31/12/1999")',
-	email: 'Por favor, introduce una direcci&oacute;n de email v&aacute;lida. Por ejemplo, "fred@domain.com".',
-	url: 'Por favor introduce una URL v&aacute;lida como http://www.example.com.',
-	currencyDollar: 'Por favor introduce una cantidad v&aacute;lida de €. Por ejemplo €100,00 .',
-	oneRequired: 'Por favor introduce algo para por lo menos una de estas entradas.',
-	errorPrefix: 'Error: ',
-	warningPrefix: 'Aviso: ',
-
-	// Form.Validator.Extras
-	noSpace: 'No pueden haber espacios en esta entrada.',
-	reqChkByNode: 'No hay elementos seleccionados.',
-	requiredChk: 'Este campo es obligatorio.',
-	reqChkByName: 'Por favor selecciona una {label}.',
-	match: 'Este campo necesita coincidir con el campo {matchName}',
-	startDate: 'la fecha de inicio',
-	endDate: 'la fecha de fin',
-	currentDate: 'la fecha actual',
-	afterDate: 'La fecha debe ser igual o posterior a {label}.',
-	beforeDate: 'La fecha debe ser igual o anterior a {label}.',
-	startMonth: 'Por favor selecciona un mes de origen',
-	sameMonth: 'Estas dos fechas deben estar en el mismo mes - debes cambiar una u otra.'
-
-});
-
-/*
----
-
-name: Locale.es-VE.Date
-
-description: Date messages for Spanish (Venezuela).
-
-license: MIT-style license
-
-authors:
-  - Daniel Barreto
-
-requires:
-  - Locale
-  - Locale.es-ES.Date
-
-provides: [Locale.es-VE.Date]
-
-...
-*/
-
-Locale.define('es-VE').inherit('es-ES', 'Date');
-
-/*
----
-
-name: Locale.es-VE.Form.Validator
-
-description: Form Validator messages for Spanish (Venezuela).
-
-license: MIT-style license
-
-authors:
-  - Daniel Barreto
-
-requires:
-  - Locale
-  - Locale.es-ES.Form.Validator
-
-provides: [Locale.es-VE.Form.Validator]
-
-...
-*/
-
-Locale.define('es-VE', 'FormValidator', {
-
-	digits: 'Por favor usa solo n&uacute;meros y puntuaci&oacute;n en este campo. Por ejemplo, un n&uacute;mero de tel&eacute;fono con guiones y puntos no esta permitido.',
-	alpha: 'Por favor usa solo letras (a-z) en este campo. No se admiten espacios ni otros caracteres.',
-	currencyDollar: 'Por favor introduce una cantidad v&aacute;lida de Bs. Por ejemplo Bs. 100,00 .',
-	oneRequired: 'Por favor introduce un valor para por lo menos una de estas entradas.',
-
-	// Form.Validator.Extras
-	startDate: 'La fecha de inicio',
-	endDate: 'La fecha de fin',
-	currentDate: 'La fecha actual'
-
-}).inherit('es-ES', 'FormValidator');
-
-/*
----
-
-name: Locale.es-VE.Number
-
-description: Number messages for Spanish (Venezuela).
-
-license: MIT-style license
-
-authors:
-  - Daniel Barreto
-
-requires:
-  - Locale
-
-provides: [Locale.es-VE.Number]
-
-...
-*/
-
-Locale.define('es-VE', 'Number', {
-
-	decimal: ',',
-	group: '.',
-/*
-	decimals: 0,
-	precision: 0,
-*/
-	// Negative/Currency/percentage will mixin Number
-	negative: {
-		prefix: '-'
-	},
-
-	currency: {
-		decimals: 2,
-		prefix: 'Bs. '
-	},
-
-	percentage: {
-		decimals: 2,
-		suffix: '%'
-	}
-
-});
-
-/*
----
-
-name: Locale.et-EE.Date
-
-description: Date messages for Estonian.
-
-license: MIT-style license
-
-authors:
-  - Kevin Valdek
-
-requires:
-  - Locale
-
-provides: [Locale.et-EE.Date]
-
-...
-*/
-
-Locale.define('et-EE', 'Date', {
-
-	months: ['jaanuar', 'veebruar', 'märts', 'aprill', 'mai', 'juuni', 'juuli', 'august', 'september', 'oktoober', 'november', 'detsember'],
-	months_abbr: ['jaan', 'veebr', 'märts', 'apr', 'mai', 'juuni', 'juuli', 'aug', 'sept', 'okt', 'nov', 'dets'],
-	days: ['pühapäev', 'esmaspäev', 'teisipäev', 'kolmapäev', 'neljapäev', 'reede', 'laupäev'],
-	days_abbr: ['pühap', 'esmasp', 'teisip', 'kolmap', 'neljap', 'reede', 'laup'],
-
-	// Culture's date order: MM.DD.YYYY
-	dateOrder: ['month', 'date', 'year'],
-	shortDate: '%m.%d.%Y',
-	shortTime: '%H:%M',
-	AM: 'AM',
-	PM: 'PM',
-	firstDayOfWeek: 1,
-
-	// Date.Extras
-	ordinal: '',
-
-	lessThanMinuteAgo: 'vähem kui minut aega tagasi',
-	minuteAgo: 'umbes minut aega tagasi',
-	minutesAgo: '{delta} minutit tagasi',
-	hourAgo: 'umbes tund aega tagasi',
-	hoursAgo: 'umbes {delta} tundi tagasi',
-	dayAgo: '1 päev tagasi',
-	daysAgo: '{delta} päeva tagasi',
-	weekAgo: '1 nädal tagasi',
-	weeksAgo: '{delta} nädalat tagasi',
-	monthAgo: '1 kuu tagasi',
-	monthsAgo: '{delta} kuud tagasi',
-	yearAgo: '1 aasta tagasi',
-	yearsAgo: '{delta} aastat tagasi',
-
-	lessThanMinuteUntil: 'vähem kui minuti aja pärast',
-	minuteUntil: 'umbes minuti aja pärast',
-	minutesUntil: '{delta} minuti pärast',
-	hourUntil: 'umbes tunni aja pärast',
-	hoursUntil: 'umbes {delta} tunni pärast',
-	dayUntil: '1 päeva pärast',
-	daysUntil: '{delta} päeva pärast',
-	weekUntil: '1 nädala pärast',
-	weeksUntil: '{delta} nädala pärast',
-	monthUntil: '1 kuu pärast',
-	monthsUntil: '{delta} kuu pärast',
-	yearUntil: '1 aasta pärast',
-	yearsUntil: '{delta} aasta pärast'
-
-});
-
-/*
----
-
-name: Locale.et-EE.Form.Validator
-
-description: Form Validator messages for Estonian.
-
-license: MIT-style license
-
-authors:
-  - Kevin Valdek
-
-requires:
-  - Locale
-
-provides: [Locale.et-EE.Form.Validator]
-
-...
-*/
-
-Locale.define('et-EE', 'FormValidator', {
-
-	required: 'Väli peab olema täidetud.',
-	minLength: 'Palun sisestage vähemalt {minLength} tähte (te sisestasite {length} tähte).',
-	maxLength: 'Palun ärge sisestage rohkem kui {maxLength} tähte (te sisestasite {length} tähte).',
-	integer: 'Palun sisestage väljale täisarv. Kümnendarvud (näiteks 1.25) ei ole lubatud.',
-	numeric: 'Palun sisestage ainult numbreid väljale (näiteks "1", "1.1", "-1" või "-1.1").',
-	digits: 'Palun kasutage ainult numbreid ja kirjavahemärke (telefoninumbri sisestamisel on lubatud kasutada kriipse ja punkte).',
-	alpha: 'Palun kasutage ainult tähti (a-z). Tühikud ja teised sümbolid on keelatud.',
-	alphanum: 'Palun kasutage ainult tähti (a-z) või numbreid (0-9). Tühikud ja teised sümbolid on keelatud.',
-	dateSuchAs: 'Palun sisestage kehtiv kuupäev kujul {date}',
-	dateInFormatMDY: 'Palun sisestage kehtiv kuupäev kujul MM.DD.YYYY (näiteks: "12.31.1999").',
-	email: 'Palun sisestage kehtiv e-maili aadress (näiteks: "fred@domain.com").',
-	url: 'Palun sisestage kehtiv URL (näiteks: http://www.example.com).',
-	currencyDollar: 'Palun sisestage kehtiv $ summa (näiteks: $100.00).',
-	oneRequired: 'Palun sisestage midagi vähemalt ühele antud väljadest.',
-	errorPrefix: 'Viga: ',
-	warningPrefix: 'Hoiatus: ',
-
-	// Form.Validator.Extras
-	noSpace: 'Väli ei tohi sisaldada tühikuid.',
-	reqChkByNode: 'Ükski väljadest pole valitud.',
-	requiredChk: 'Välja täitmine on vajalik.',
-	reqChkByName: 'Palun valige üks {label}.',
-	match: 'Väli peab sobima {matchName} väljaga',
-	startDate: 'algkuupäev',
-	endDate: 'lõppkuupäev',
-	currentDate: 'praegune kuupäev',
-	afterDate: 'Kuupäev peab olema võrdne või pärast {label}.',
-	beforeDate: 'Kuupäev peab olema võrdne või enne {label}.',
-	startMonth: 'Palun valige algkuupäev.',
-	sameMonth: 'Antud kaks kuupäeva peavad olema samas kuus - peate muutma ühte kuupäeva.'
-
-});
-
-/*
----
-
-name: Locale.fa.Date
-
-description: Date messages for Persian.
-
-license: MIT-style license
-
-authors:
-  - Amir Hossein Hodjaty Pour
-
-requires:
-  - Locale
-
-provides: [Locale.fa.Date]
-
-...
-*/
-
-Locale.define('fa', 'Date', {
-
-	months: ['ژانویه', 'فوریه', 'مارس', 'آپریل', 'مه', 'ژوئن', 'ژوئیه', 'آگوست', 'سپتامبر', 'اکتبر', 'نوامبر', 'دسامبر'],
-	months_abbr: ['1', '2', '3', '4', '5', '6', '7', '8', '9', '10', '11', '12'],
-	days: ['یکشنبه', 'دوشنبه', 'سه شنبه', 'چهارشنبه', 'پنجشنبه', 'جمعه', 'شنبه'],
-	days_abbr: ['ي', 'د', 'س', 'چ', 'پ', 'ج', 'ش'],
-
-	// Culture's date order: MM/DD/YYYY
-	dateOrder: ['month', 'date', 'year'],
-	shortDate: '%m/%d/%Y',
-	shortTime: '%I:%M%p',
-	AM: 'ق.ظ',
-	PM: 'ب.ظ',
-
-	// Date.Extras
-	ordinal: 'ام',
-
-	lessThanMinuteAgo: 'کمتر از یک دقیقه پیش',
-	minuteAgo: 'حدود یک دقیقه پیش',
-	minutesAgo: '{delta} دقیقه پیش',
-	hourAgo: 'حدود یک ساعت پیش',
-	hoursAgo: 'حدود {delta} ساعت پیش',
-	dayAgo: '1 روز پیش',
-	daysAgo: '{delta} روز پیش',
-	weekAgo: '1 هفته پیش',
-	weeksAgo: '{delta} هفته پیش',
-	monthAgo: '1 ماه پیش',
-	monthsAgo: '{delta} ماه پیش',
-	yearAgo: '1 سال پیش',
-	yearsAgo: '{delta} سال پیش',
-
-	lessThanMinuteUntil: 'کمتر از یک دقیقه از حالا',
-	minuteUntil: 'حدود یک دقیقه از حالا',
-	minutesUntil: '{delta} دقیقه از حالا',
-	hourUntil: 'حدود یک ساعت از حالا',
-	hoursUntil: 'حدود {delta} ساعت از حالا',
-	dayUntil: '1 روز از حالا',
-	daysUntil: '{delta} روز از حالا',
-	weekUntil: '1 هفته از حالا',
-	weeksUntil: '{delta} هفته از حالا',
-	monthUntil: '1 ماه از حالا',
-	monthsUntil: '{delta} ماه از حالا',
-	yearUntil: '1 سال از حالا',
-	yearsUntil: '{delta} سال از حالا'
-
-});
-
-/*
----
-
-name: Locale.fa.Form.Validator
-
-description: Form Validator messages for Persian.
-
-license: MIT-style license
-
-authors:
-  - Amir Hossein Hodjaty Pour
-
-requires:
-  - Locale
-
-provides: [Locale.fa.Form.Validator]
-
-...
-*/
-
-Locale.define('fa', 'FormValidator', {
-
-	required: 'این فیلد الزامی است.',
-	minLength: 'شما باید حداقل {minLength} حرف وارد کنید ({length} حرف وارد کرده اید).',
-	maxLength: 'لطفا حداکثر {maxLength} حرف وارد کنید (شما {length} حرف وارد کرده اید).',
-	integer: 'لطفا از عدد صحیح استفاده کنید. اعداد اعشاری (مانند 1.25) مجاز نیستند.',
-	numeric: 'لطفا فقط داده عددی وارد کنید (مانند "1" یا "1.1" یا "1-" یا "1.1-").',
-	digits: 'لطفا فقط از اعداد و علامتها در این فیلد استفاده کنید (برای مثال شماره تلفن با خط تیره و نقطه قابل قبول است).',
-	alpha: 'لطفا فقط از حروف الفباء برای این بخش استفاده کنید. کاراکترهای دیگر و فاصله مجاز نیستند.',
-	alphanum: 'لطفا فقط از حروف الفباء و اعداد در این بخش استفاده کنید. کاراکترهای دیگر و فاصله مجاز نیستند.',
-	dateSuchAs: 'لطفا یک تاریخ معتبر مانند {date} وارد کنید.',
-	dateInFormatMDY: 'لطفا یک تاریخ معتبر به شکل MM/DD/YYYY وارد کنید (مانند "12/31/1999").',
-	email: 'لطفا یک آدرس ایمیل معتبر وارد کنید. برای مثال "fred@domain.com".',
-	url: 'لطفا یک URL معتبر مانند http://www.example.com وارد کنید.',
-	currencyDollar: 'لطفا یک محدوده معتبر برای این بخش وارد کنید مانند 100.00$ .',
-	oneRequired: 'لطفا حداقل یکی از فیلدها را پر کنید.',
-	errorPrefix: 'خطا: ',
-	warningPrefix: 'هشدار: ',
-
-	// Form.Validator.Extras
-	noSpace: 'استفاده از فاصله در این بخش مجاز نیست.',
-	reqChkByNode: 'موردی انتخاب نشده است.',
-	requiredChk: 'این فیلد الزامی است.',
-	reqChkByName: 'لطفا یک {label} را انتخاب کنید.',
-	match: 'این فیلد باید با فیلد {matchName} مطابقت داشته باشد.',
-	startDate: 'تاریخ شروع',
-	endDate: 'تاریخ پایان',
-	currentDate: 'تاریخ کنونی',
-	afterDate: 'تاریخ میبایست برابر یا بعد از {label} باشد',
-	beforeDate: 'تاریخ میبایست برابر یا قبل از {label} باشد',
-	startMonth: 'لطفا ماه شروع را انتخاب کنید',
-	sameMonth: 'این دو تاریخ باید در یک ماه باشند - شما باید یکی یا هر دو را تغییر دهید.',
-	creditcard: 'شماره کارت اعتباری که وارد کرده اید معتبر نیست. لطفا شماره را بررسی کنید و مجددا تلاش کنید. {length} رقم وارد شده است.'
-
-});
-
-/*
----
-
-name: Locale.fi-FI.Date
-
-description: Date messages for Finnish.
-
-license: MIT-style license
-
-authors:
-  - ksel
-
-requires:
-  - Locale
-
-provides: [Locale.fi-FI.Date]
-
-...
-*/
-
-Locale.define('fi-FI', 'Date', {
-
-	// NOTE: months and days are not capitalized in finnish
-	months: ['tammikuu', 'helmikuu', 'maaliskuu', 'huhtikuu', 'toukokuu', 'kesäkuu', 'heinäkuu', 'elokuu', 'syyskuu', 'lokakuu', 'marraskuu', 'joulukuu'],
-
-	// these abbreviations are really not much used in finnish because they obviously won't abbreviate very much. ;)
-	// NOTE: sometimes one can see forms such as "tammi", "helmi", etc. but that is not proper finnish.
-	months_abbr: ['tammik.', 'helmik.', 'maalisk.', 'huhtik.', 'toukok.', 'kesäk.', 'heinäk.', 'elok.', 'syysk.', 'lokak.', 'marrask.', 'jouluk.'],
-
-	days: ['sunnuntai', 'maanantai', 'tiistai', 'keskiviikko', 'torstai', 'perjantai', 'lauantai'],
-	days_abbr: ['su', 'ma', 'ti', 'ke', 'to', 'pe', 'la'],
-
-	// Culture's date order: DD/MM/YYYY
-	dateOrder: ['date', 'month', 'year'],
-	shortDate: '%d.%m.%Y',
-	shortTime: '%H:%M',
-	AM: 'AM',
-	PM: 'PM',
-	firstDayOfWeek: 1,
-
-	// Date.Extras
-	ordinal: '.',
-
-	lessThanMinuteAgo: 'vajaa minuutti sitten',
-	minuteAgo: 'noin minuutti sitten',
-	minutesAgo: '{delta} minuuttia sitten',
-	hourAgo: 'noin tunti sitten',
-	hoursAgo: 'noin {delta} tuntia sitten',
-	dayAgo: 'päivä sitten',
-	daysAgo: '{delta} päivää sitten',
-	weekAgo: 'viikko sitten',
-	weeksAgo: '{delta} viikkoa sitten',
-	monthAgo: 'kuukausi sitten',
-	monthsAgo: '{delta} kuukautta sitten',
-	yearAgo: 'vuosi sitten',
-	yearsAgo: '{delta} vuotta sitten',
-
-	lessThanMinuteUntil: 'vajaan minuutin kuluttua',
-	minuteUntil: 'noin minuutin kuluttua',
-	minutesUntil: '{delta} minuutin kuluttua',
-	hourUntil: 'noin tunnin kuluttua',
-	hoursUntil: 'noin {delta} tunnin kuluttua',
-	dayUntil: 'päivän kuluttua',
-	daysUntil: '{delta} päivän kuluttua',
-	weekUntil: 'viikon kuluttua',
-	weeksUntil: '{delta} viikon kuluttua',
-	monthUntil: 'kuukauden kuluttua',
-	monthsUntil: '{delta} kuukauden kuluttua',
-	yearUntil: 'vuoden kuluttua',
-	yearsUntil: '{delta} vuoden kuluttua'
-
-});
-
-/*
----
-
-name: Locale.fi-FI.Form.Validator
-
-description: Form Validator messages for Finnish.
-
-license: MIT-style license
-
-authors:
-  - ksel
-
-requires:
-  - Locale
-
-provides: [Locale.fi-FI.Form.Validator]
-
-...
-*/
-
-Locale.define('fi-FI', 'FormValidator', {
-
-	required: 'Tämä kenttä on pakollinen.',
-	minLength: 'Ole hyvä ja anna vähintään {minLength} merkkiä (annoit {length} merkkiä).',
-	maxLength: 'Älä anna enempää kuin {maxLength} merkkiä (annoit {length} merkkiä).',
-	integer: 'Ole hyvä ja anna kokonaisluku. Luvut, joissa on desimaaleja (esim. 1.25) eivät ole sallittuja.',
-	numeric: 'Anna tähän kenttään lukuarvo (kuten "1" tai "1.1" tai "-1" tai "-1.1").',
-	digits: 'Käytä pelkästään numeroita ja välimerkkejä tässä kentässä (syötteet, kuten esim. puhelinnumero, jossa on väliviivoja, pilkkuja tai pisteitä, kelpaa).',
-	alpha: 'Anna tähän kenttään vain kirjaimia (a-z). Välilyönnit tai muut merkit eivät ole sallittuja.',
-	alphanum: 'Anna tähän kenttään vain kirjaimia (a-z) tai numeroita (0-9). Välilyönnit tai muut merkit eivät ole sallittuja.',
-	dateSuchAs: 'Ole hyvä ja anna kelvollinen päivmäärä, kuten esimerkiksi {date}',
-	dateInFormatMDY: 'Ole hyvä ja anna kelvollinen päivämäärä muodossa pp/kk/vvvv (kuten "12/31/1999")',
-	email: 'Ole hyvä ja anna kelvollinen sähköpostiosoite (kuten esimerkiksi "matti@meikalainen.com").',
-	url: 'Ole hyvä ja anna kelvollinen URL, kuten esimerkiksi http://www.example.com.',
-	currencyDollar: 'Ole hyvä ja anna kelvollinen eurosumma (kuten esimerkiksi 100,00 EUR) .',
-	oneRequired: 'Ole hyvä ja syötä jotakin ainakin johonkin näistä kentistä.',
-	errorPrefix: 'Virhe: ',
-	warningPrefix: 'Varoitus: ',
-
-	// Form.Validator.Extras
-	noSpace: 'Tässä syötteessä ei voi olla välilyöntejä',
-	reqChkByNode: 'Ei valintoja.',
-	requiredChk: 'Tämä kenttä on pakollinen.',
-	reqChkByName: 'Ole hyvä ja valitse {label}.',
-	match: 'Tämän kentän tulee vastata kenttää {matchName}',
-	startDate: 'alkupäivämäärä',
-	endDate: 'loppupäivämäärä',
-	currentDate: 'nykyinen päivämäärä',
-	afterDate: 'Päivämäärän tulisi olla sama tai myöhäisempi ajankohta kuin {label}.',
-	beforeDate: 'Päivämäärän tulisi olla sama tai aikaisempi ajankohta kuin {label}.',
-	startMonth: 'Ole hyvä ja valitse aloituskuukausi',
-	sameMonth: 'Näiden kahden päivämäärän tulee olla saman kuun sisällä -- sinun pitää muuttaa jompaa kumpaa.',
-	creditcard: 'Annettu luottokortin numero ei kelpaa. Ole hyvä ja tarkista numero sekä yritä uudelleen. {length} numeroa syötetty.'
-
-});
-
-/*
----
-
-name: Locale.fi-FI.Number
-
-description: Finnish number messages
-
-license: MIT-style license
-
-authors:
-  - ksel
-
-requires:
-  - Locale
-  - Locale.EU.Number
-
-provides: [Locale.fi-FI.Number]
-
-...
-*/
-
-Locale.define('fi-FI', 'Number', {
-
-	group: ' ' // grouped by space
-
-}).inherit('EU', 'Number');
-
-/*
----
-
-name: Locale.fr-FR.Date
-
-description: Date messages for French.
-
-license: MIT-style license
-
-authors:
-  - Nicolas Sorosac
-  - Antoine Abt
-
-requires:
-  - Locale
-
-provides: [Locale.fr-FR.Date]
-
-...
-*/
-
-Locale.define('fr-FR', 'Date', {
-
-	months: ['Janvier', 'Février', 'Mars', 'Avril', 'Mai', 'Juin', 'Juillet', 'Août', 'Septembre', 'Octobre', 'Novembre', 'Décembre'],
-	months_abbr: ['janv.', 'févr.', 'mars', 'avr.', 'mai', 'juin', 'juil.', 'août', 'sept.', 'oct.', 'nov.', 'déc.'],
-	days: ['Dimanche', 'Lundi', 'Mardi', 'Mercredi', 'Jeudi', 'Vendredi', 'Samedi'],
-	days_abbr: ['dim.', 'lun.', 'mar.', 'mer.', 'jeu.', 'ven.', 'sam.'],
-
-	// Culture's date order: DD/MM/YYYY
-	dateOrder: ['date', 'month', 'year'],
-	shortDate: '%d/%m/%Y',
-	shortTime: '%H:%M',
-	AM: 'AM',
-	PM: 'PM',
-	firstDayOfWeek: 1,
-
-	// Date.Extras
-	ordinal: function(dayOfMonth){
-		return (dayOfMonth > 1) ? '' : 'er';
-	},
-
-	lessThanMinuteAgo: "il y a moins d'une minute",
-	minuteAgo: 'il y a une minute',
-	minutesAgo: 'il y a {delta} minutes',
-	hourAgo: 'il y a une heure',
-	hoursAgo: 'il y a {delta} heures',
-	dayAgo: 'il y a un jour',
-	daysAgo: 'il y a {delta} jours',
-	weekAgo: 'il y a une semaine',
-	weeksAgo: 'il y a {delta} semaines',
-	monthAgo: 'il y a 1 mois',
-	monthsAgo: 'il y a {delta} mois',
-	yearthAgo: 'il y a 1 an',
-	yearsAgo: 'il y a {delta} ans',
-
-	lessThanMinuteUntil: "dans moins d'une minute",
-	minuteUntil: 'dans une minute',
-	minutesUntil: 'dans {delta} minutes',
-	hourUntil: 'dans une heure',
-	hoursUntil: 'dans {delta} heures',
-	dayUntil: 'dans un jour',
-	daysUntil: 'dans {delta} jours',
-	weekUntil: 'dans 1 semaine',
-	weeksUntil: 'dans {delta} semaines',
-	monthUntil: 'dans 1 mois',
-	monthsUntil: 'dans {delta} mois',
-	yearUntil: 'dans 1 an',
-	yearsUntil: 'dans {delta} ans'
-
-});
-
-/*
----
-
-name: Locale.fr-FR.Form.Validator
-
-description: Form Validator messages for French.
-
-license: MIT-style license
-
-authors:
-  - Miquel Hudin
-  - Nicolas Sorosac
-
-requires:
-  - Locale
-
-provides: [Locale.fr-FR.Form.Validator]
-
-...
-*/
-
-/*eslint mootools-whitespace:0*/
-
-Locale.define('fr-FR', 'FormValidator', {
-
-	required: 'Ce champ est obligatoire.',
-	length: 'Veuillez saisir {length} caract&egrave;re(s) (vous avez saisi {elLength} caract&egrave;re(s)',
-	minLength: 'Veuillez saisir un minimum de {minLength} caract&egrave;re(s) (vous avez saisi {length} caract&egrave;re(s)).',
-	maxLength: 'Veuillez saisir un maximum de {maxLength} caract&egrave;re(s) (vous avez saisi {length} caract&egrave;re(s)).',
-	integer: 'Veuillez saisir un nombre entier dans ce champ. Les nombres d&eacute;cimaux (ex : "1,25") ne sont pas autoris&eacute;s.',
-	numeric: 'Veuillez saisir uniquement des chiffres dans ce champ (ex : "1" ou "1,1" ou "-1" ou "-1,1").',
-	digits: "Veuillez saisir uniquement des chiffres et des signes de ponctuation dans ce champ (ex : un num&eacute;ro de t&eacute;l&eacute;phone avec des traits d'union est autoris&eacute;).",
-	alpha: 'Veuillez saisir uniquement des lettres (a-z) dans ce champ. Les espaces ou autres caract&egrave;res ne sont pas autoris&eacute;s.',
-	alphanum: 'Veuillez saisir uniquement des lettres (a-z) ou des chiffres (0-9) dans ce champ. Les espaces ou autres caract&egrave;res ne sont pas autoris&eacute;s.',
-	dateSuchAs: 'Veuillez saisir une date correcte comme {date}',
-	dateInFormatMDY: 'Veuillez saisir une date correcte, au format JJ/MM/AAAA (ex : "31/11/1999").',
-	email: 'Veuillez saisir une adresse de courrier &eacute;lectronique. Par exemple "fred@domaine.com".',
-	url: 'Veuillez saisir une URL, comme http://www.exemple.com.',
-	currencyDollar: 'Veuillez saisir une quantit&eacute; correcte. Par exemple 100,00&euro;.',
-	oneRequired: 'Veuillez s&eacute;lectionner au moins une de ces options.',
-	errorPrefix: 'Erreur : ',
-	warningPrefix: 'Attention : ',
-
-	// Form.Validator.Extras
-	noSpace: "Ce champ n'accepte pas les espaces.",
-	reqChkByNode: "Aucun &eacute;l&eacute;ment n'est s&eacute;lectionn&eacute;.",
-	requiredChk: 'Ce champ est obligatoire.',
-	reqChkByName: 'Veuillez s&eacute;lectionner un(e) {label}.',
-	match: 'Ce champ doit correspondre avec le champ {matchName}.',
-	startDate: 'date de d&eacute;but',
-	endDate: 'date de fin',
-	currentDate: 'date actuelle',
-	afterDate: 'La date doit &ecirc;tre identique ou post&eacute;rieure &agrave; {label}.',
-	beforeDate: 'La date doit &ecirc;tre identique ou ant&eacute;rieure &agrave; {label}.',
-	startMonth: 'Veuillez s&eacute;lectionner un mois de d&eacute;but.',
-	sameMonth: 'Ces deux dates doivent &ecirc;tre dans le m&ecirc;me mois - vous devez en modifier une.',
-	creditcard: 'Le num&eacute;ro de carte de cr&eacute;dit est invalide. Merci de v&eacute;rifier le num&eacute;ro et de r&eacute;essayer. Vous avez entr&eacute; {length} chiffre(s).'
-
-});
-
-/*
----
-
-name: Locale.fr-FR.Number
-
-description: Number messages for French.
-
-license: MIT-style license
-
-authors:
-  - Arian Stolwijk
-  - sv1l
-
-requires:
-  - Locale
-  - Locale.EU.Number
-
-provides: [Locale.fr-FR.Number]
-
-...
-*/
-
-Locale.define('fr-FR', 'Number', {
-
-	group: ' ' // In fr-FR localization, group character is a blank space
-
-}).inherit('EU', 'Number');
-
-/*
----
-
-name: Locale.he-IL.Date
-
-description: Date messages for Hebrew.
-
-license: MIT-style license
-
-authors:
-  - Elad Ossadon
-
-requires:
-  - Locale
-
-provides: [Locale.he-IL.Date]
-
-...
-*/
-
-Locale.define('he-IL', 'Date', {
-
-	months: ['ינואר', 'פברואר', 'מרץ', 'אפריל', 'מאי', 'יוני', 'יולי', 'אוגוסט', 'ספטמבר', 'אוקטובר', 'נובמבר', 'דצמבר'],
-	months_abbr: ['ינואר', 'פברואר', 'מרץ', 'אפריל', 'מאי', 'יוני', 'יולי', 'אוגוסט', 'ספטמבר', 'אוקטובר', 'נובמבר', 'דצמבר'],
-	days: ['ראשון', 'שני', 'שלישי', 'רביעי', 'חמישי', 'שישי', 'שבת'],
-	days_abbr: ['ראשון', 'שני', 'שלישי', 'רביעי', 'חמישי', 'שישי', 'שבת'],
-
-	// Culture's date order: MM/DD/YYYY
-	dateOrder: ['date', 'month', 'year'],
-	shortDate: '%d/%m/%Y',
-	shortTime: '%H:%M',
-	AM: 'AM',
-	PM: 'PM',
-	firstDayOfWeek: 0,
-
-	// Date.Extras
-	ordinal: '',
-
-	lessThanMinuteAgo: 'לפני פחות מדקה',
-	minuteAgo: 'לפני כדקה',
-	minutesAgo: 'לפני {delta} דקות',
-	hourAgo: 'לפני כשעה',
-	hoursAgo: 'לפני {delta} שעות',
-	dayAgo: 'לפני יום',
-	daysAgo: 'לפני {delta} ימים',
-	weekAgo: 'לפני שבוע',
-	weeksAgo: 'לפני {delta} שבועות',
-	monthAgo: 'לפני חודש',
-	monthsAgo: 'לפני {delta} חודשים',
-	yearAgo: 'לפני שנה',
-	yearsAgo: 'לפני {delta} שנים',
-
-	lessThanMinuteUntil: 'בעוד פחות מדקה',
-	minuteUntil: 'בעוד כדקה',
-	minutesUntil: 'בעוד {delta} דקות',
-	hourUntil: 'בעוד כשעה',
-	hoursUntil: 'בעוד {delta} שעות',
-	dayUntil: 'בעוד יום',
-	daysUntil: 'בעוד {delta} ימים',
-	weekUntil: 'בעוד שבוע',
-	weeksUntil: 'בעוד {delta} שבועות',
-	monthUntil: 'בעוד חודש',
-	monthsUntil: 'בעוד {delta} חודשים',
-	yearUntil: 'בעוד שנה',
-	yearsUntil: 'בעוד {delta} שנים'
-
-});
-
-/*
----
-
-name: Locale.he-IL.Form.Validator
-
-description: Form Validator messages for Hebrew.
-
-license: MIT-style license
-
-authors:
-  - Elad Ossadon
-
-requires:
-  - Locale
-
-provides: [Locale.he-IL.Form.Validator]
-
-...
-*/
-
-Locale.define('he-IL', 'FormValidator', {
-
-	required: 'נא למלא שדה זה.',
-	minLength: 'נא להזין לפחות {minLength} תווים (הזנת {length} תווים).',
-	maxLength: 'נא להזין עד {maxLength} תווים (הזנת {length} תווים).',
-	integer: 'נא להזין מספר שלם לשדה זה. מספרים עשרוניים (כמו 1.25) אינם חוקיים.',
-	numeric: 'נא להזין ערך מספרי בלבד בשדה זה (כמו "1", "1.1", "-1" או "-1.1").',
-	digits: 'נא להזין רק ספרות וסימני הפרדה בשדה זה (למשל, מספר טלפון עם מקפים או נקודות הוא חוקי).',
-	alpha: 'נא להזין רק אותיות באנגלית (a-z) בשדה זה. רווחים או תווים אחרים אינם חוקיים.',
-	alphanum: 'נא להזין רק אותריות באנגלית (a-z) או ספרות (0-9) בשדה זה. אווחרים או תווים אחרים אינם חוקיים.',
-	dateSuchAs: 'נא להזין תאריך חוקי, כמו {date}',
-	dateInFormatMDY: 'נא להזין תאריך חוקי בפורמט MM/DD/YYYY (כמו "12/31/1999")',
-	email: 'נא להזין כתובת אימייל חוקית. לדוגמה: "fred@domain.com".',
-	url: 'נא להזין כתובת אתר חוקית, כמו http://www.example.com.',
-	currencyDollar: 'נא להזין סכום דולרי חוקי. לדוגמה $100.00.',
-	oneRequired: 'נא לבחור לפחות בשדה אחד.',
-	errorPrefix: 'שגיאה: ',
-	warningPrefix: 'אזהרה: ',
-
-	// Form.Validator.Extras
-	noSpace: 'אין להזין רווחים בשדה זה.',
-	reqChkByNode: 'נא לבחור אחת מהאפשרויות.',
-	requiredChk: 'שדה זה נדרש.',
-	reqChkByName: 'נא לבחור {label}.',
-	match: 'שדה זה צריך להתאים לשדה {matchName}',
-	startDate: 'תאריך ההתחלה',
-	endDate: 'תאריך הסיום',
-	currentDate: 'התאריך הנוכחי',
-	afterDate: 'התאריך צריך להיות זהה או אחרי {label}.',
-	beforeDate: 'התאריך צריך להיות זהה או לפני {label}.',
-	startMonth: 'נא לבחור חודש התחלה',
-	sameMonth: 'שני תאריכים אלה צריכים להיות באותו חודש - נא לשנות אחד התאריכים.',
-	creditcard: 'מספר כרטיס האשראי שהוזן אינו חוקי. נא לבדוק שנית. הוזנו {length} ספרות.'
-
-});
-
-/*
----
-
-name: Locale.he-IL.Number
-
-description: Number messages for Hebrew.
-
-license: MIT-style license
-
-authors:
-  - Elad Ossadon
-
-requires:
-  - Locale
-
-provides: [Locale.he-IL.Number]
-
-...
-*/
-
-Locale.define('he-IL', 'Number', {
-
-	decimal: '.',
-	group: ',',
-
-	currency: {
-		suffix: ' ₪'
-	}
-
-});
-
-/*
----
-
-name: Locale.hu-HU.Date
-
-description: Date messages for Hungarian.
-
-license: MIT-style license
-
-authors:
-  - Zsolt Szegheő
-
-requires:
-  - Locale
-
-provides: [Locale.hu-HU.Date]
-
-...
-*/
-
-Locale.define('hu-HU', 'Date', {
-
-	months: ['Január', 'Február', 'Március', 'Április', 'Május', 'Június', 'Július', 'Augusztus', 'Szeptember', 'Október', 'November', 'December'],
-	months_abbr: ['jan.', 'febr.', 'márc.', 'ápr.', 'máj.', 'jún.', 'júl.', 'aug.', 'szept.', 'okt.', 'nov.', 'dec.'],
-	days: ['Vasárnap', 'Hétfő', 'Kedd', 'Szerda', 'Csütörtök', 'Péntek', 'Szombat'],
-	days_abbr: ['V', 'H', 'K', 'Sze', 'Cs', 'P', 'Szo'],
-
-	// Culture's date order: YYYY.MM.DD.
-	dateOrder: ['year', 'month', 'date'],
-	shortDate: '%Y.%m.%d.',
-	shortTime: '%I:%M',
-	AM: 'de.',
-	PM: 'du.',
-	firstDayOfWeek: 1,
-
-	// Date.Extras
-	ordinal: '.',
-
-	lessThanMinuteAgo: 'alig egy perce',
-	minuteAgo: 'egy perce',
-	minutesAgo: '{delta} perce',
-	hourAgo: 'egy órája',
-	hoursAgo: '{delta} órája',
-	dayAgo: '1 napja',
-	daysAgo: '{delta} napja',
-	weekAgo: '1 hete',
-	weeksAgo: '{delta} hete',
-	monthAgo: '1 hónapja',
-	monthsAgo: '{delta} hónapja',
-	yearAgo: '1 éve',
-	yearsAgo: '{delta} éve',
-
-	lessThanMinuteUntil: 'alig egy perc múlva',
-	minuteUntil: 'egy perc múlva',
-	minutesUntil: '{delta} perc múlva',
-	hourUntil: 'egy óra múlva',
-	hoursUntil: '{delta} óra múlva',
-	dayUntil: '1 nap múlva',
-	daysUntil: '{delta} nap múlva',
-	weekUntil: '1 hét múlva',
-	weeksUntil: '{delta} hét múlva',
-	monthUntil: '1 hónap múlva',
-	monthsUntil: '{delta} hónap múlva',
-	yearUntil: '1 év múlva',
-	yearsUntil: '{delta} év múlva'
-
-});
-
-/*
----
-
-name: Locale.hu-HU.Form.Validator
-
-description: Form Validator messages for Hungarian.
-
-license: MIT-style license
-
-authors:
-  - Zsolt Szegheő
-
-requires:
-  - Locale
-
-provides: [Locale.hu-HU.Form.Validator]
-
-...
-*/
-
-/*eslint mootools-whitespace:0*/
-
-Locale.define('hu-HU', 'FormValidator', {
-
-	required: 'A mező kitöltése kötelező.',
-	minLength: 'Legalább {minLength} karakter megadása szükséges (megadva {length} karakter).',
-	maxLength: 'Legfeljebb {maxLength} karakter megadása lehetséges (megadva {length} karakter).',
-	integer: 'Egész szám megadása szükséges. A tizedesjegyek (pl. 1.25) nem engedélyezettek.',
-	numeric: 'Szám megadása szükséges (pl. "1" vagy "1.1" vagy "-1" vagy "-1.1").',
-	digits: 'Csak számok és írásjelek megadása lehetséges (pl. telefonszám kötőjelek és/vagy perjelekkel).',
-	alpha: 'Csak betűk (a-z) megadása lehetséges. Szóköz és egyéb karakterek nem engedélyezettek.',
-	alphanum: 'Csak betűk (a-z) vagy számok (0-9) megadása lehetséges. Szóköz és egyéb karakterek nem engedélyezettek.',
-	dateSuchAs: 'Valós dátum megadása szükséges (pl. {date}).',
-	dateInFormatMDY: 'Valós dátum megadása szükséges ÉÉÉÉ.HH.NN. formában. (pl. "1999.12.31.")',
-	email: 'Valós e-mail cím megadása szükséges (pl. "fred@domain.hu").',
-	url: 'Valós URL megadása szükséges (pl. http://www.example.com).',
-	currencyDollar: 'Valós pénzösszeg megadása szükséges (pl. 100.00 Ft.).',
-	oneRequired: 'Az alábbi mezők legalább egyikének kitöltése kötelező.',
-	errorPrefix: 'Hiba: ',
-	warningPrefix: 'Figyelem: ',
-
-	// Form.Validator.Extras
-	noSpace: 'A mező nem tartalmazhat szóközöket.',
-	reqChkByNode: 'Nincs egyetlen kijelölt elem sem.',
-	requiredChk: 'A mező kitöltése kötelező.',
-	reqChkByName: 'Egy {label} kiválasztása szükséges.',
-	match: 'A mezőnek egyeznie kell a(z) {matchName} mezővel.',
-	startDate: 'a kezdet dátuma',
-	endDate: 'a vég dátuma',
-	currentDate: 'jelenlegi dátum',
-	afterDate: 'A dátum nem lehet kisebb, mint {label}.',
-	beforeDate: 'A dátum nem lehet nagyobb, mint {label}.',
-	startMonth: 'Kezdeti hónap megadása szükséges.',
-	sameMonth: 'A két dátumnak ugyanazon hónapban kell lennie.',
-	creditcard: 'A megadott bankkártyaszám nem valódi (megadva {length} számjegy).'
-
-});
-
-/*
----
-
-name: Locale.it-IT.Date
-
-description: Date messages for Italian.
-
-license: MIT-style license.
-
-authors:
-  - Andrea Novero
-  - Valerio Proietti
-
-requires:
-  - Locale
-
-provides: [Locale.it-IT.Date]
-
-...
-*/
-
-Locale.define('it-IT', 'Date', {
-
-	months: ['Gennaio', 'Febbraio', 'Marzo', 'Aprile', 'Maggio', 'Giugno', 'Luglio', 'Agosto', 'Settembre', 'Ottobre', 'Novembre', 'Dicembre'],
-	months_abbr: ['gen', 'feb', 'mar', 'apr', 'mag', 'giu', 'lug', 'ago', 'set', 'ott', 'nov', 'dic'],
-	days: ['Domenica', 'Lunedì', 'Martedì', 'Mercoledì', 'Giovedì', 'Venerdì', 'Sabato'],
-	days_abbr: ['dom', 'lun', 'mar', 'mer', 'gio', 'ven', 'sab'],
-
-	// Culture's date order: DD/MM/YYYY
-	dateOrder: ['date', 'month', 'year'],
-	shortDate: '%d/%m/%Y',
-	shortTime: '%H.%M',
-	AM: 'AM',
-	PM: 'PM',
-	firstDayOfWeek: 1,
-
-	// Date.Extras
-	ordinal: 'º',
-
-	lessThanMinuteAgo: 'meno di un minuto fa',
-	minuteAgo: 'circa un minuto fa',
-	minutesAgo: 'circa {delta} minuti fa',
-	hourAgo: "circa un'ora fa",
-	hoursAgo: 'circa {delta} ore fa',
-	dayAgo: 'circa 1 giorno fa',
-	daysAgo: 'circa {delta} giorni fa',
-	weekAgo: 'una settimana fa',
-	weeksAgo: '{delta} settimane fa',
-	monthAgo: 'un mese fa',
-	monthsAgo: '{delta} mesi fa',
-	yearAgo: 'un anno fa',
-	yearsAgo: '{delta} anni fa',
-
-	lessThanMinuteUntil: 'tra meno di un minuto',
-	minuteUntil: 'tra circa un minuto',
-	minutesUntil: 'tra circa {delta} minuti',
-	hourUntil: "tra circa un'ora",
-	hoursUntil: 'tra circa {delta} ore',
-	dayUntil: 'tra circa un giorno',
-	daysUntil: 'tra circa {delta} giorni',
-	weekUntil: 'tra una settimana',
-	weeksUntil: 'tra {delta} settimane',
-	monthUntil: 'tra un mese',
-	monthsUntil: 'tra {delta} mesi',
-	yearUntil: 'tra un anno',
-	yearsUntil: 'tra {delta} anni'
-
-});
-
-/*
----
-
-name: Locale.it-IT.Form.Validator
-
-description: Form Validator messages for Italian.
-
-license: MIT-style license
-
-authors:
-  - Leonardo Laureti
-  - Andrea Novero
-
-requires:
-  - Locale
-
-provides: [Locale.it-IT.Form.Validator]
-
-...
-*/
-
-/*eslint mootools-whitespace:0*/
-
-Locale.define('it-IT', 'FormValidator', {
-
-	required: 'Il campo &egrave; obbligatorio.',
-	minLength: 'Inserire almeno {minLength} caratteri (ne sono stati inseriti {length}).',
-	maxLength: 'Inserire al massimo {maxLength} caratteri (ne sono stati inseriti {length}).',
-	integer: 'Inserire un numero intero. Non sono consentiti decimali (es.: 1.25).',
-	numeric: 'Inserire solo valori numerici (es.: "1" oppure "1.1" oppure "-1" oppure "-1.1").',
-	digits: 'Inserire solo numeri e caratteri di punteggiatura. Per esempio &egrave; consentito un numero telefonico con trattini o punti.',
-	alpha: 'Inserire solo lettere (a-z). Non sono consentiti spazi o altri caratteri.',
-	alphanum: 'Inserire solo lettere (a-z) o numeri (0-9). Non sono consentiti spazi o altri caratteri.',
-	dateSuchAs: 'Inserire una data valida del tipo {date}',
-	dateInFormatMDY: 'Inserire una data valida nel formato MM/GG/AAAA (es.: "12/31/1999")',
-	email: 'Inserire un indirizzo email valido. Per esempio "nome@dominio.com".',
-	url: 'Inserire un indirizzo valido. Per esempio "http://www.example.com".',
-	currencyDollar: 'Inserire un importo valido. Per esempio "$100.00".',
-	oneRequired: 'Completare almeno uno dei campi richiesti.',
-	errorPrefix: 'Errore: ',
-	warningPrefix: 'Attenzione: ',
-
-	// Form.Validator.Extras
-	noSpace: 'Non sono consentiti spazi.',
-	reqChkByNode: 'Nessuna voce selezionata.',
-	requiredChk: 'Il campo &egrave; obbligatorio.',
-	reqChkByName: 'Selezionare un(a) {label}.',
-	match: 'Il valore deve corrispondere al campo {matchName}',
-	startDate: "data d'inizio",
-	endDate: 'data di fine',
-	currentDate: 'data attuale',
-	afterDate: 'La data deve corrispondere o essere successiva al {label}.',
-	beforeDate: 'La data deve corrispondere o essere precedente al {label}.',
-	startMonth: "Selezionare un mese d'inizio",
-	sameMonth: 'Le due date devono essere dello stesso mese - occorre modificarne una.'
-
-});
-
-/*
----
-
-name: Locale.ja-JP.Date
-
-description: Date messages for Japanese.
-
-license: MIT-style license
-
-authors:
-  - Noritaka Horio
-
-requires:
-  - Locale
-
-provides: [Locale.ja-JP.Date]
-
-...
-*/
-
-Locale.define('ja-JP', 'Date', {
-
-	months: ['1月', '2月', '3月', '4月', '5月', '6月', '7月', '8月', '9月', '10月', '11月', '12月'],
-	months_abbr: ['1月', '2月', '3月', '4月', '5月', '6月', '7月', '8月', '9月', '10月', '11月', '12月'],
-	days: ['日曜日', '月曜日', '火曜日', '水曜日', '木曜日', '金曜日', '土曜日'],
-	days_abbr: ['日', '月', '火', '水', '木', '金', '土'],
-
-	// Culture's date order: YYYY/MM/DD
-	dateOrder: ['year', 'month', 'date'],
-	shortDate: '%Y/%m/%d',
-	shortTime: '%H:%M',
-	AM: '午前',
-	PM: '午後',
-	firstDayOfWeek: 0,
-
-	// Date.Extras
-	ordinal: '',
-
-	lessThanMinuteAgo: '1分以内前',
-	minuteAgo: '約1分前',
-	minutesAgo: '約{delta}分前',
-	hourAgo: '約1時間前',
-	hoursAgo: '約{delta}時間前',
-	dayAgo: '1日前',
-	daysAgo: '{delta}日前',
-	weekAgo: '1週間前',
-	weeksAgo: '{delta}週間前',
-	monthAgo: '1ヶ月前',
-	monthsAgo: '{delta}ヶ月前',
-	yearAgo: '1年前',
-	yearsAgo: '{delta}年前',
-
-	lessThanMinuteUntil: '今から約1分以内',
-	minuteUntil: '今から約1分',
-	minutesUntil: '今から約{delta}分',
-	hourUntil: '今から約1時間',
-	hoursUntil: '今から約{delta}時間',
-	dayUntil: '今から1日間',
-	daysUntil: '今から{delta}日間',
-	weekUntil: '今から1週間',
-	weeksUntil: '今から{delta}週間',
-	monthUntil: '今から1ヶ月',
-	monthsUntil: '今から{delta}ヶ月',
-	yearUntil: '今から1年',
-	yearsUntil: '今から{delta}年'
-
-});
-
-/*
----
-
-name: Locale.ja-JP.Form.Validator
-
-description: Form Validator messages for Japanese.
-
-license: MIT-style license
-
-authors:
-  - Noritaka Horio
-
-requires:
-  - Locale
-
-provides: [Locale.ja-JP.Form.Validator]
-
-...
-*/
-
-Locale.define('ja-JP', 'FormValidator', {
-
-	required: '入力は必須です。',
-	minLength: '入力文字数は{minLength}以上にしてください。({length}文字)',
-	maxLength: '入力文字数は{maxLength}以下にしてください。({length}文字)',
-	integer: '整数を入力してください。',
-	numeric: '入力できるのは数値だけです。(例: "1", "1.1", "-1", "-1.1"....)',
-	digits: '入力できるのは数値と句読記号です。 (例: -や+を含む電話番号など).',
-	alpha: '入力できるのは半角英字だけです。それ以外の文字は入力できません。',
-	alphanum: '入力できるのは半角英数字だけです。それ以外の文字は入力できません。',
-	dateSuchAs: '有効な日付を入力してください。{date}',
-	dateInFormatMDY: '日付の書式に誤りがあります。YYYY/MM/DD (i.e. "1999/12/31")',
-	email: 'メールアドレスに誤りがあります。',
-	url: 'URLアドレスに誤りがあります。',
-	currencyDollar: '金額に誤りがあります。',
-	oneRequired: 'ひとつ以上入力してください。',
-	errorPrefix: 'エラー: ',
-	warningPrefix: '警告: ',
-
-	// FormValidator.Extras
-	noSpace: 'スペースは入力できません。',
-	reqChkByNode: '選択されていません。',
-	requiredChk: 'この項目は必須です。',
-	reqChkByName: '{label}を選択してください。',
-	match: '{matchName}が入力されている場合必須です。',
-	startDate: '開始日',
-	endDate: '終了日',
-	currentDate: '今日',
-	afterDate: '{label}以降の日付にしてください。',
-	beforeDate: '{label}以前の日付にしてください。',
-	startMonth: '開始月を選択してください。',
-	sameMonth: '日付が同一です。どちらかを変更してください。'
-
-});
-
-/*
----
-
-name: Locale.ja-JP.Number
-
-description: Number messages for Japanese.
-
-license: MIT-style license
-
-authors:
-  - Noritaka Horio
-
-requires:
-  - Locale
-
-provides: [Locale.ja-JP.Number]
-
-...
-*/
-
-Locale.define('ja-JP', 'Number', {
-
-	decimal: '.',
-	group: ',',
-
-	currency: {
-		decimals: 0,
-		prefix: '\\'
-	}
-
-});
-
-/*
----
-
-name: Locale.nl-NL.Date
-
-description: Date messages for Dutch.
-
-license: MIT-style license
-
-authors:
-  - Lennart Pilon
-  - Tim Wienk
-
-requires:
-  - Locale
-
-provides: [Locale.nl-NL.Date]
-
-...
-*/
-
-Locale.define('nl-NL', 'Date', {
-
-	months: ['januari', 'februari', 'maart', 'april', 'mei', 'juni', 'juli', 'augustus', 'september', 'oktober', 'november', 'december'],
-	months_abbr: ['jan', 'feb', 'mrt', 'apr', 'mei', 'jun', 'jul', 'aug', 'sep', 'okt', 'nov', 'dec'],
-	days: ['zondag', 'maandag', 'dinsdag', 'woensdag', 'donderdag', 'vrijdag', 'zaterdag'],
-	days_abbr: ['zo', 'ma', 'di', 'wo', 'do', 'vr', 'za'],
-
-	// Culture's date order: DD-MM-YYYY
-	dateOrder: ['date', 'month', 'year'],
-	shortDate: '%d-%m-%Y',
-	shortTime: '%H:%M',
-	AM: 'AM',
-	PM: 'PM',
-	firstDayOfWeek: 1,
-
-	// Date.Extras
-	ordinal: 'e',
-
-	lessThanMinuteAgo: 'minder dan een minuut geleden',
-	minuteAgo: 'ongeveer een minuut geleden',
-	minutesAgo: '{delta} minuten geleden',
-	hourAgo: 'ongeveer een uur geleden',
-	hoursAgo: 'ongeveer {delta} uur geleden',
-	dayAgo: 'een dag geleden',
-	daysAgo: '{delta} dagen geleden',
-	weekAgo: 'een week geleden',
-	weeksAgo: '{delta} weken geleden',
-	monthAgo: 'een maand geleden',
-	monthsAgo: '{delta} maanden geleden',
-	yearAgo: 'een jaar geleden',
-	yearsAgo: '{delta} jaar geleden',
-
-	lessThanMinuteUntil: 'over minder dan een minuut',
-	minuteUntil: 'over ongeveer een minuut',
-	minutesUntil: 'over {delta} minuten',
-	hourUntil: 'over ongeveer een uur',
-	hoursUntil: 'over {delta} uur',
-	dayUntil: 'over ongeveer een dag',
-	daysUntil: 'over {delta} dagen',
-	weekUntil: 'over een week',
-	weeksUntil: 'over {delta} weken',
-	monthUntil: 'over een maand',
-	monthsUntil: 'over {delta} maanden',
-	yearUntil: 'over een jaar',
-	yearsUntil: 'over {delta} jaar'
-
-});
-
-/*
----
-
-name: Locale.nl-NL.Form.Validator
-
-description: Form Validator messages for Dutch.
-
-license: MIT-style license
-
-authors:
-  - Lennart Pilon
-  - Arian Stolwijk
-  - Tim Wienk
-
-requires:
-  - Locale
-
-provides: [Locale.nl-NL.Form.Validator]
-
-...
-*/
-
-Locale.define('nl-NL', 'FormValidator', {
-
-	required: 'Dit veld is verplicht.',
-	length: 'Vul precies {length} karakters in (je hebt {elLength} karakters ingevoerd).',
-	minLength: 'Vul minimaal {minLength} karakters in (je hebt {length} karakters ingevoerd).',
-	maxLength: 'Vul niet meer dan {maxLength} karakters in (je hebt {length} karakters ingevoerd).',
-	integer: 'Vul een getal in. Getallen met decimalen (bijvoorbeeld 1.25) zijn niet toegestaan.',
-	numeric: 'Vul alleen numerieke waarden in (bijvoorbeeld "1" of "1.1" of "-1" of "-1.1").',
-	digits: 'Vul alleen nummers en leestekens in (bijvoorbeeld een telefoonnummer met streepjes is toegestaan).',
-	alpha: 'Vul alleen letters in (a-z). Spaties en andere karakters zijn niet toegestaan.',
-	alphanum: 'Vul alleen letters (a-z) of nummers (0-9) in. Spaties en andere karakters zijn niet toegestaan.',
-	dateSuchAs: 'Vul een geldige datum in, zoals {date}',
-	dateInFormatMDY: 'Vul een geldige datum, in het formaat MM/DD/YYYY (bijvoorbeeld "12/31/1999")',
-	email: 'Vul een geldig e-mailadres in. Bijvoorbeeld "fred@domein.nl".',
-	url: 'Vul een geldige URL in, zoals http://www.example.com.',
-	currencyDollar: 'Vul een geldig $ bedrag in. Bijvoorbeeld $100.00 .',
-	oneRequired: 'Vul iets in bij in ieder geval een van deze velden.',
-	warningPrefix: 'Waarschuwing: ',
-	errorPrefix: 'Fout: ',
-
-	// Form.Validator.Extras
-	noSpace: 'Spaties zijn niet toegestaan in dit veld.',
-	reqChkByNode: 'Er zijn geen items geselecteerd.',
-	requiredChk: 'Dit veld is verplicht.',
-	reqChkByName: 'Selecteer een {label}.',
-	match: 'Dit veld moet overeen komen met het {matchName} veld',
-	startDate: 'de begin datum',
-	endDate: 'de eind datum',
-	currentDate: 'de huidige datum',
-	afterDate: 'De datum moet hetzelfde of na {label} zijn.',
-	beforeDate: 'De datum moet hetzelfde of voor {label} zijn.',
-	startMonth: 'Selecteer een begin maand',
-	sameMonth: 'Deze twee data moeten in dezelfde maand zijn - u moet een van beide aanpassen.',
-	creditcard: 'Het ingevulde creditcardnummer is niet geldig. Controleer het nummer en probeer opnieuw. {length} getallen ingevuld.'
-
-});
-
-/*
----
-
-name: Locale.nl-NL.Number
-
-description: Number messages for Dutch.
-
-license: MIT-style license
-
-authors:
-  - Arian Stolwijk
-
-requires:
-  - Locale
-  - Locale.EU.Number
-
-provides: [Locale.nl-NL.Number]
-
-...
-*/
-
-Locale.define('nl-NL').inherit('EU', 'Number');
-
-
-
-
-/*
----
-
-name: Locale.no-NO.Date
-
-description: Date messages for Norwegian.
-
-license: MIT-style license
-
-authors:
-  - Espen 'Rexxars' Hovlandsdal
-  - Ole Tøsse Kolvik
-requires:
-  - Locale
-
-provides: [Locale.no-NO.Date]
-
-...
-*/
-
-Locale.define('no-NO', 'Date', {
-	months: ['Januar', 'Februar', 'Mars', 'April', 'Mai', 'Juni', 'Juli', 'August', 'September', 'Oktober', 'November', 'Desember'],
-	months_abbr: ['Jan', 'Feb', 'Mar', 'Apr', 'Mai', 'Jun', 'Jul', 'Aug', 'Sep', 'Okt', 'Nov', 'Des'],
-	days: ['Søndag', 'Mandag', 'Tirsdag', 'Onsdag', 'Torsdag', 'Fredag', 'Lørdag'],
-	days_abbr: ['Søn', 'Man', 'Tir', 'Ons', 'Tor', 'Fre', 'Lør'],
-
-	// Culture's date order: DD.MM.YYYY
-	dateOrder: ['date', 'month', 'year'],
-	shortDate: '%d.%m.%Y',
-	shortTime: '%H:%M',
-	AM: 'AM',
-	PM: 'PM',
-	firstDayOfWeek: 1,
-
-	lessThanMinuteAgo: 'mindre enn et minutt siden',
-	minuteAgo: 'omtrent et minutt siden',
-	minutesAgo: '{delta} minutter siden',
-	hourAgo: 'omtrent en time siden',
-	hoursAgo: 'omtrent {delta} timer siden',
-	dayAgo: '{delta} dag siden',
-	daysAgo: '{delta} dager siden',
-	weekAgo: 'en uke siden',
-	weeksAgo: '{delta} uker siden',
-	monthAgo: 'en måned siden',
-	monthsAgo: '{delta} måneder siden',
-	yearAgo: 'ett år siden',
-	yearsAgo: '{delta} år siden',
-
-	lessThanMinuteUntil: 'mindre enn et minutt til',
-	minuteUntil: 'omtrent et minutt til',
-	minutesUntil: '{delta} minutter til',
-	hourUntil: 'omtrent en time til',
-	hoursUntil: 'omtrent {delta} timer til',
-	dayUntil: 'en dag til',
-	daysUntil: '{delta} dager til',
-	weekUntil: 'en uke til',
-	weeksUntil: '{delta} uker til',
-	monthUntil: 'en måned til',
-	monthsUntil: '{delta} måneder til',
-	yearUntil: 'et år til',
-	yearsUntil: '{delta} år til'
-});
-
-/*
----
-
-name: Locale.no-NO.Form.Validator
-
-description: Form Validator messages for Norwegian.
-
-license: MIT-style license
-
-authors:
-  - Aaron Newton
-  - Espen 'Rexxars' Hovlandsdal
-  - Ole Tøsse Kolvik
-
-requires:
-  - Locale
-
-provides: [Locale.no-NO.Form.Validator]
-
-...
-*/
-
-Locale.define('no-NO', 'FormValidator', {
-
-	required: 'Dette feltet er påkrevd.',
-	length: 'Skriv inn {length} tegn (du skrev {elLength} tegn)',
-	minLength: 'Skriv inn minst {minLength} tegn (du skrev {length} tegn).',
-	maxLength: 'Ikke skriv mer enn {maxLength} tegn (du skrev {length} tegn).',
-	integer: 'Skriv inn et tall i dette feltet. Tall med desimaler (f.eks. 1,25) er ikke tillat.',
-	numeric: 'Skriv kun inn numeriske verdier i dette feltet (f.eks. "1", "1.1", "-1" eller "-1.1").',
-	digits: 'Skriv kun nummer og skilletegn i dette feltet.',
-	alpha: 'Skriv kun bokstaver (a-å) i dette feltet. Ingen mellomrom eller andre tegn er tillat.',
-	alphanum: 'Skriv kun bokstaver (a-å) eller nummer (0-9) i dette feltet. Ingen mellomrom eller andre tegn er tillat.',
-	dateSuchAs: 'Skriv inn en gyldig dato, som f.eks. {date}',
-	dateInFormatMDY: 'Skriv inn en gyldig dato, f.eks. DD/MM/YYYY ("31/12/1999")',
-	email: 'Skriv inn en gyldig epost-adresse. F.eks. "ola.nordmann@example.com".',
-	url: 'Skriv inn en gyldig URL, f.eks. http://www.example.com.',
-	currencyDollar: 'Skriv inn et gyldig beløp. F.eks. 100,00.',
-	oneRequired: 'Minst ett av disse feltene må fylles ut.',
-	errorPrefix: 'Feil: ',
-	warningPrefix: 'Advarsel: ',
-
-	// Form.Validator.Extras
-	noSpace: 'Mellomrom er ikke tillatt i dette feltet.',
-	reqChkByNode: 'Ingen objekter er valgt.',
-	requiredChk: 'Dette feltet er påkrevd.',
-	reqChkByName: 'Velg en {label}.',
-	match: 'Dette feltet må være lik {matchName}',
-	startDate: 'startdato',
-	endDate: 'sluttdato',
-	currentDate: 'dagens dato',
-	afterDate: 'Datoen må være den samme som eller etter {label}.',
-	beforeDate: 'Datoen må være den samme som eller før {label}.',
-	startMonth: 'Velg en startmåned',
-	sameMonth: 'Datoene må være i den samme måneden - velg den ene eller den andre.',
-	creditcard: 'Kortnummeret du skrev inn er ikke gyldig. Prøv igjen. Du skrev {length} siffer.'
-
-});
-
-/*
----
-
-name: Locale.no-NO.Number
-
-description: Number messages for Norwegian.
-
-license: MIT-style license
-
-authors:
-  - Arian Stolwijk
-  - Martin Lundgren
-  - Ole T�sse Kolvik
-
-requires:
-  - Locale
-  - Locale.EU.Number
-
-provides: [Locale.no-NO.Number]
-
-...
-*/
-
-Locale.define('no-NO', 'Number', {
-
-	currency: {
-		prefix: 'NOK '
-	}
-
-}).inherit('EU', 'Number');
-
-/*
----
-
-name: Locale.pl-PL.Date
-
-description: Date messages for Polish.
-
-license: MIT-style license
-
-authors:
-  - Oskar Krawczyk
-
-requires:
-  - Locale
-
-provides: [Locale.pl-PL.Date]
-
-...
-*/
-
-Locale.define('pl-PL', 'Date', {
-
-	months: ['Styczeń', 'Luty', 'Marzec', 'Kwiecień', 'Maj', 'Czerwiec', 'Lipiec', 'Sierpień', 'Wrzesień', 'Październik', 'Listopad', 'Grudzień'],
-	months_abbr: ['sty', 'lut', 'mar', 'kwi', 'maj', 'cze', 'lip', 'sie', 'wrz', 'paź', 'lis', 'gru'],
-	days: ['Niedziela', 'Poniedziałek', 'Wtorek', 'Środa', 'Czwartek', 'Piątek', 'Sobota'],
-	days_abbr: ['niedz.', 'pon.', 'wt.', 'śr.', 'czw.', 'pt.', 'sob.'],
-
-	// Culture's date order: YYYY-MM-DD
-	dateOrder: ['year', 'month', 'date'],
-	shortDate: '%Y-%m-%d',
-	shortTime: '%H:%M',
-	AM: 'nad ranem',
-	PM: 'po południu',
-	firstDayOfWeek: 1,
-
-	// Date.Extras
-	ordinal: function(dayOfMonth){
-		return (dayOfMonth > 3 && dayOfMonth < 21) ? 'ty' : ['ty', 'szy', 'gi', 'ci', 'ty'][Math.min(dayOfMonth % 10, 4)];
-	},
-
-	lessThanMinuteAgo: 'mniej niż minute temu',
-	minuteAgo: 'około minutę temu',
-	minutesAgo: '{delta} minut temu',
-	hourAgo: 'około godzinę temu',
-	hoursAgo: 'około {delta} godzin temu',
-	dayAgo: 'Wczoraj',
-	daysAgo: '{delta} dni temu',
-
-	lessThanMinuteUntil: 'za niecałą minutę',
-	minuteUntil: 'za około minutę',
-	minutesUntil: 'za {delta} minut',
-	hourUntil: 'za około godzinę',
-	hoursUntil: 'za około {delta} godzin',
-	dayUntil: 'za 1 dzień',
-	daysUntil: 'za {delta} dni'
-
-});
-
-/*
----
-
-name: Locale.pl-PL.Form.Validator
-
-description: Form Validator messages for Polish.
-
-license: MIT-style license
-
-authors:
-  - Oskar Krawczyk
-
-requires:
-  - Locale
-
-provides: [Locale.pl-PL.Form.Validator]
-
-...
-*/
-
-Locale.define('pl-PL', 'FormValidator', {
-
-	required: 'To pole jest wymagane.',
-	minLength: 'Wymagane jest przynajmniej {minLength} znaków (wpisanych zostało tylko {length}).',
-	maxLength: 'Dozwolone jest nie więcej niż {maxLength} znaków (wpisanych zostało {length})',
-	integer: 'To pole wymaga liczb całych. Liczby dziesiętne (np. 1.25) są niedozwolone.',
-	numeric: 'Prosimy używać tylko numerycznych wartości w tym polu (np. "1", "1.1", "-1" lub "-1.1").',
-	digits: 'Prosimy używać liczb oraz zankow punktuacyjnych w typ polu (dla przykładu, przy numerze telefonu myślniki i kropki są dozwolone).',
-	alpha: 'Prosimy używać tylko liter (a-z) w tym polu. Spacje oraz inne znaki są niedozwolone.',
-	alphanum: 'Prosimy używać tylko liter (a-z) lub liczb (0-9) w tym polu. Spacje oraz inne znaki są niedozwolone.',
-	dateSuchAs: 'Prosimy podać prawidłową datę w formacie: {date}',
-	dateInFormatMDY: 'Prosimy podać poprawną date w formacie DD.MM.RRRR (i.e. "12.01.2009")',
-	email: 'Prosimy podać prawidłowy adres e-mail, np. "jan@domena.pl".',
-	url: 'Prosimy podać prawidłowy adres URL, np. http://www.example.com.',
-	currencyDollar: 'Prosimy podać prawidłową sumę w PLN. Dla przykładu: 100.00 PLN.',
-	oneRequired: 'Prosimy wypełnić chociaż jedno z pól.',
-	errorPrefix: 'Błąd: ',
-	warningPrefix: 'Uwaga: ',
-
-	// Form.Validator.Extras
-	noSpace: 'W tym polu nie mogą znajdować się spacje.',
-	reqChkByNode: 'Brak zaznaczonych elementów.',
-	requiredChk: 'To pole jest wymagane.',
-	reqChkByName: 'Prosimy wybrać z {label}.',
-	match: 'To pole musi być takie samo jak {matchName}',
-	startDate: 'data początkowa',
-	endDate: 'data końcowa',
-	currentDate: 'aktualna data',
-	afterDate: 'Podana data poinna być taka sama lub po {label}.',
-	beforeDate: 'Podana data poinna być taka sama lub przed {label}.',
-	startMonth: 'Prosimy wybrać początkowy miesiąc.',
-	sameMonth: 'Te dwie daty muszą być w zakresie tego samego miesiąca - wymagana jest zmiana któregoś z pól.'
-
-});
-
-/*
----
-
-name: Locale.pt-PT.Date
-
-description: Date messages for Portuguese.
-
-license: MIT-style license
-
-authors:
-  - Fabio Miranda Costa
-
-requires:
-  - Locale
-
-provides: [Locale.pt-PT.Date]
-
-...
-*/
-
-Locale.define('pt-PT', 'Date', {
-
-	months: ['Janeiro', 'Fevereiro', 'Março', 'Abril', 'Maio', 'Junho', 'Julho', 'Agosto', 'Setembro', 'Outubro', 'Novembro', 'Dezembro'],
-	months_abbr: ['Jan', 'Fev', 'Mar', 'Abr', 'Mai', 'Jun', 'Jul', 'Ago', 'Set', 'Out', 'Nov', 'Dez'],
-	days: ['Domingo', 'Segunda-feira', 'Terça-feira', 'Quarta-feira', 'Quinta-feira', 'Sexta-feira', 'Sábado'],
-	days_abbr: ['Dom', 'Seg', 'Ter', 'Qua', 'Qui', 'Sex', 'Sáb'],
-
-	// Culture's date order: DD-MM-YYYY
-	dateOrder: ['date', 'month', 'year'],
-	shortDate: '%d-%m-%Y',
-	shortTime: '%H:%M',
-	AM: 'AM',
-	PM: 'PM',
-	firstDayOfWeek: 1,
-
-	// Date.Extras
-	ordinal: 'º',
-
-	lessThanMinuteAgo: 'há menos de um minuto',
-	minuteAgo: 'há cerca de um minuto',
-	minutesAgo: 'há {delta} minutos',
-	hourAgo: 'há cerca de uma hora',
-	hoursAgo: 'há cerca de {delta} horas',
-	dayAgo: 'há um dia',
-	daysAgo: 'há {delta} dias',
-	weekAgo: 'há uma semana',
-	weeksAgo: 'há {delta} semanas',
-	monthAgo: 'há um mês',
-	monthsAgo: 'há {delta} meses',
-	yearAgo: 'há um ano',
-	yearsAgo: 'há {delta} anos',
-
-	lessThanMinuteUntil: 'em menos de um minuto',
-	minuteUntil: 'em um minuto',
-	minutesUntil: 'em {delta} minutos',
-	hourUntil: 'em uma hora',
-	hoursUntil: 'em {delta} horas',
-	dayUntil: 'em um dia',
-	daysUntil: 'em {delta} dias',
-	weekUntil: 'em uma semana',
-	weeksUntil: 'em {delta} semanas',
-	monthUntil: 'em um mês',
-	monthsUntil: 'em {delta} meses',
-	yearUntil: 'em um ano',
-	yearsUntil: 'em {delta} anos'
-
-});
-
-/*
----
-
-name: Locale.pt-BR.Date
-
-description: Date messages for Portuguese (Brazil).
-
-license: MIT-style license
-
-authors:
-  - Fabio Miranda Costa
-
-requires:
-  - Locale
-  - Locale.pt-PT.Date
-
-provides: [Locale.pt-BR.Date]
-
-...
-*/
-
-Locale.define('pt-BR', 'Date', {
-
-	// Culture's date order: DD/MM/YYYY
-	shortDate: '%d/%m/%Y'
-
-}).inherit('pt-PT', 'Date');
-
-/*
----
-
-name: Locale.pt-BR.Form.Validator
-
-description: Form Validator messages for Portuguese (Brazil).
-
-license: MIT-style license
-
-authors:
-  - Fábio Miranda Costa
-
-requires:
-  - Locale
-
-provides: [Locale.pt-BR.Form.Validator]
-
-...
-*/
-
-Locale.define('pt-BR', 'FormValidator', {
-
-	required: 'Este campo é obrigatório.',
-	minLength: 'Digite pelo menos {minLength} caracteres (tamanho atual: {length}).',
-	maxLength: 'Não digite mais de {maxLength} caracteres (tamanho atual: {length}).',
-	integer: 'Por favor digite apenas um número inteiro neste campo. Não são permitidos números decimais (por exemplo, 1,25).',
-	numeric: 'Por favor digite apenas valores numéricos neste campo (por exemplo, "1" ou "1.1" ou "-1" ou "-1,1").',
-	digits: 'Por favor use apenas números e pontuação neste campo (por exemplo, um número de telefone com traços ou pontos é permitido).',
-	alpha: 'Por favor use somente letras (a-z). Espaço e outros caracteres não são permitidos.',
-	alphanum: 'Use somente letras (a-z) ou números (0-9) neste campo. Espaço e outros caracteres não são permitidos.',
-	dateSuchAs: 'Digite uma data válida, como {date}',
-	dateInFormatMDY: 'Digite uma data válida, como DD/MM/YYYY (por exemplo, "31/12/1999")',
-	email: 'Digite um endereço de email válido. Por exemplo "nome@dominio.com".',
-	url: 'Digite uma URL válida. Exemplo: http://www.example.com.',
-	currencyDollar: 'Digite um valor em dinheiro válido. Exemplo: R$100,00 .',
-	oneRequired: 'Digite algo para pelo menos um desses campos.',
-	errorPrefix: 'Erro: ',
-	warningPrefix: 'Aviso: ',
-
-	// Form.Validator.Extras
-	noSpace: 'Não é possível digitar espaços neste campo.',
-	reqChkByNode: 'Não foi selecionado nenhum item.',
-	requiredChk: 'Este campo é obrigatório.',
-	reqChkByName: 'Por favor digite um {label}.',
-	match: 'Este campo deve ser igual ao campo {matchName}.',
-	startDate: 'a data inicial',
-	endDate: 'a data final',
-	currentDate: 'a data atual',
-	afterDate: 'A data deve ser igual ou posterior a {label}.',
-	beforeDate: 'A data deve ser igual ou anterior a {label}.',
-	startMonth: 'Por favor selecione uma data inicial.',
-	sameMonth: 'Estas duas datas devem ter o mesmo mês - você deve modificar uma das duas.',
-	creditcard: 'O número do cartão de crédito informado é inválido. Por favor verifique o valor e tente novamente. {length} números informados.'
-
-});
-
-/*
----
-
-name: Locale.pt-BR.Number
-
-description: Number messages for PT Brazilian.
-
-license: MIT-style license
-
-authors:
-  - Arian Stolwijk
-  - Danillo César
-
-requires:
-  - Locale
-
-provides: [Locale.pt-BR.Number]
-
-...
-*/
-
-Locale.define('pt-BR', 'Number', {
-
-	decimal: ',',
-	group: '.',
-
-	currency: {
-		prefix: 'R$ '
-	}
-
-});
-
-
-
-/*
----
-
-name: Locale.pt-PT.Form.Validator
-
-description: Form Validator messages for Portuguese.
-
-license: MIT-style license
-
-authors:
-  - Miquel Hudin
-
-requires:
-  - Locale
-
-provides: [Locale.pt-PT.Form.Validator]
-
-...
-*/
-
-Locale.define('pt-PT', 'FormValidator', {
-
-	required: 'Este campo é necessário.',
-	minLength: 'Digite pelo menos{minLength} caracteres (comprimento {length} caracteres).',
-	maxLength: 'Não insira mais de {maxLength} caracteres (comprimento {length} caracteres).',
-	integer: 'Digite um número inteiro neste domínio. Com números decimais (por exemplo, 1,25), não são permitidas.',
-	numeric: 'Digite apenas valores numéricos neste domínio (p.ex., "1" ou "1.1" ou "-1" ou "-1,1").',
-	digits: 'Por favor, use números e pontuação apenas neste campo (p.ex., um número de telefone com traços ou pontos é permitida).',
-	alpha: 'Por favor use somente letras (a-z), com nesta área. Não utilize espaços nem outros caracteres são permitidos.',
-	alphanum: 'Use somente letras (a-z) ou números (0-9) neste campo. Não utilize espaços nem outros caracteres são permitidos.',
-	dateSuchAs: 'Digite uma data válida, como {date}',
-	dateInFormatMDY: 'Digite uma data válida, como DD/MM/YYYY (p.ex. "31/12/1999")',
-	email: 'Digite um endereço de email válido. Por exemplo "fred@domain.com".',
-	url: 'Digite uma URL válida, como http://www.example.com.',
-	currencyDollar: 'Digite um valor válido $. Por exemplo $ 100,00. ',
-	oneRequired: 'Digite algo para pelo menos um desses insumos.',
-	errorPrefix: 'Erro: ',
-	warningPrefix: 'Aviso: '
-
-});
-
-/*
----
-
-name: Locale.ru-RU-unicode.Date
-
-description: Date messages for Russian (utf-8).
-
-license: MIT-style license
-
-authors:
-  - Evstigneev Pavel
-  - Kuryanovich Egor
-
-requires:
-  - Locale
-
-provides: [Locale.ru-RU.Date]
-
-...
-*/
-
-(function(){
-
-// Russian language pluralization rules, taken from CLDR project, http://unicode.org/cldr/
-// one -> n mod 10 is 1 and n mod 100 is not 11;
-// few -> n mod 10 in 2..4 and n mod 100 not in 12..14;
-// many -> n mod 10 is 0 or n mod 10 in 5..9 or n mod 100 in 11..14;
-// other -> everything else (example 3.14)
-var pluralize = function(n, one, few, many, other){
-	var modulo10 = n % 10,
-		modulo100 = n % 100;
-
-	if (modulo10 == 1 && modulo100 != 11){
-		return one;
-	} else if ((modulo10 == 2 || modulo10 == 3 || modulo10 == 4) && !(modulo100 == 12 || modulo100 == 13 || modulo100 == 14)){
-		return few;
-	} else if (modulo10 == 0 || (modulo10 == 5 || modulo10 == 6 || modulo10 == 7 || modulo10 == 8 || modulo10 == 9) || (modulo100 == 11 || modulo100 == 12 || modulo100 == 13 || modulo100 == 14)){
-		return many;
-	} else {
-		return other;
-	}
-};
-
-Locale.define('ru-RU', 'Date', {
-
-	months: ['Январь', 'Февраль', 'Март', 'Апрель', 'Май', 'Июнь', 'Июль', 'Август', 'Сентябрь', 'Октябрь', 'Ноябрь', 'Декабрь'],
-	months_abbr: ['янв', 'февр', 'март', 'апр', 'май','июнь','июль','авг','сент','окт','нояб','дек'],
-	days: ['Воскресенье', 'Понедельник', 'Вторник', 'Среда', 'Четверг', 'Пятница', 'Суббота'],
-	days_abbr: ['Вс', 'Пн', 'Вт', 'Ср', 'Чт', 'Пт', 'Сб'],
-
-	// Culture's date order: DD.MM.YYYY
-	dateOrder: ['date', 'month', 'year'],
-	shortDate: '%d.%m.%Y',
-	shortTime: '%H:%M',
-	AM: 'AM',
-	PM: 'PM',
-	firstDayOfWeek: 1,
-
-	// Date.Extras
-	ordinal: '',
-
-	lessThanMinuteAgo: 'меньше минуты назад',
-	minuteAgo: 'минуту назад',
-	minutesAgo: function(delta){ return '{delta} ' + pluralize(delta, 'минуту', 'минуты', 'минут') + ' назад'; },
-	hourAgo: 'час назад',
-	hoursAgo: function(delta){ return '{delta} ' + pluralize(delta, 'час', 'часа', 'часов') + ' назад'; },
-	dayAgo: 'вчера',
-	daysAgo: function(delta){ return '{delta} ' + pluralize(delta, 'день', 'дня', 'дней') + ' назад'; },
-	weekAgo: 'неделю назад',
-	weeksAgo: function(delta){ return '{delta} ' + pluralize(delta, 'неделя', 'недели', 'недель') + ' назад'; },
-	monthAgo: 'месяц назад',
-	monthsAgo: function(delta){ return '{delta} ' + pluralize(delta, 'месяц', 'месяца', 'месяцев') + ' назад'; },
-	yearAgo: 'год назад',
-	yearsAgo: function(delta){ return '{delta} ' + pluralize(delta, 'год', 'года', 'лет') + ' назад'; },
-
-	lessThanMinuteUntil: 'меньше чем через минуту',
-	minuteUntil: 'через минуту',
-	minutesUntil: function(delta){ return 'через {delta} ' + pluralize(delta, 'минуту', 'минуты', 'минут') + ''; },
-	hourUntil: 'через час',
-	hoursUntil: function(delta){ return 'через {delta} ' + pluralize(delta, 'час', 'часа', 'часов') + ''; },
-	dayUntil: 'завтра',
-	daysUntil: function(delta){ return 'через {delta} ' + pluralize(delta, 'день', 'дня', 'дней') + ''; },
-	weekUntil: 'через неделю',
-	weeksUntil: function(delta){ return 'через {delta} ' + pluralize(delta, 'неделю', 'недели', 'недель') + ''; },
-	monthUntil: 'через месяц',
-	monthsUntil: function(delta){ return 'через {delta} ' + pluralize(delta, 'месяц', 'месяца', 'месяцев') + ''; },
-	yearUntil: 'через',
-	yearsUntil: function(delta){ return 'через {delta} ' + pluralize(delta, 'год', 'года', 'лет') + ''; }
-
-});
-
-
-
-})();
-
-/*
----
-
-name: Locale.ru-RU-unicode.Form.Validator
-
-description: Form Validator messages for Russian (utf-8).
-
-license: MIT-style license
-
-authors:
-  - Chernodarov Egor
-
-requires:
-  - Locale
-
-provides: [Locale.ru-RU.Form.Validator]
-
-...
-*/
-
-Locale.define('ru-RU', 'FormValidator', {
-
-	required: 'Это поле обязательно к заполнению.',
-	minLength: 'Пожалуйста, введите хотя бы {minLength} символов (Вы ввели {length}).',
-	maxLength: 'Пожалуйста, введите не больше {maxLength} символов (Вы ввели {length}).',
-	integer: 'Пожалуйста, введите в это поле число. Дробные числа (например 1.25) тут не разрешены.',
-	numeric: 'Пожалуйста, введите в это поле число (например "1" или "1.1", или "-1", или "-1.1").',
-	digits: 'В этом поле Вы можете использовать только цифры и знаки пунктуации (например, телефонный номер со знаками дефиса или с точками).',
-	alpha: 'В этом поле можно использовать только латинские буквы (a-z). Пробелы и другие символы запрещены.',
-	alphanum: 'В этом поле можно использовать только латинские буквы (a-z) и цифры (0-9). Пробелы и другие символы запрещены.',
-	dateSuchAs: 'Пожалуйста, введите корректную дату {date}',
-	dateInFormatMDY: 'Пожалуйста, введите дату в формате ММ/ДД/ГГГГ (например "12/31/1999")',
-	email: 'Пожалуйста, введите корректный емейл-адрес. Для примера "fred@domain.com".',
-	url: 'Пожалуйста, введите правильную ссылку вида http://www.example.com.',
-	currencyDollar: 'Пожалуйста, введите сумму в долларах. Например: $100.00 .',
-	oneRequired: 'Пожалуйста, выберите хоть что-нибудь в одном из этих полей.',
-	errorPrefix: 'Ошибка: ',
-	warningPrefix: 'Внимание: '
-
-});
-
-
-
-/*
----
-
-name: Locale.sk-SK.Date
-
-description: Date messages for Slovak.
-
-license: MIT-style license
-
-authors:
-  - Ivan Masár
-
-requires:
-  - Locale
-
-provides: [Locale.sk-SK.Date]
-
-...
-*/
-(function(){
-
-// Slovak language pluralization rules, see http://unicode.org/repos/cldr-tmp/trunk/diff/supplemental/language_plural_rules.html
-// one -> n is 1;            1
-// few -> n in 2..4;         2-4
-// other -> everything else  0, 5-999, 1.31, 2.31, 5.31...
-var pluralize = function(n, one, few, other){
-	if (n == 1) return one;
-	else if (n == 2 || n == 3 || n == 4) return few;
-	else return other;
-};
-
-Locale.define('sk-SK', 'Date', {
-
-	months: ['Január', 'Február', 'Marec', 'Apríl', 'Máj', 'Jún', 'Júl', 'August', 'September', 'Október', 'November', 'December'],
-	months_abbr: ['januára', 'februára', 'marca', 'apríla', 'mája', 'júna', 'júla', 'augusta', 'septembra', 'októbra', 'novembra', 'decembra'],
-	days: ['Nedele', 'Pondelí', 'Úterý', 'Streda', 'Čtvrtek', 'Pátek', 'Sobota'],
-	days_abbr: ['ne', 'po', 'ut', 'st', 'št', 'pi', 'so'],
-
-	// Culture's date order: DD.MM.YYYY
-	dateOrder: ['date', 'month', 'year'],
-	shortDate: '%d.%m.%Y',
-	shortTime: '%H:%M',
-	AM: 'dop.',
-	PM: 'pop.',
-	firstDayOfWeek: 1,
-
-	// Date.Extras
-	ordinal: '.',
-
-	lessThanMinuteAgo: 'pred chvíľou',
-	minuteAgo: 'približne pred minútou',
-	minutesAgo: function(delta){ return 'pred {delta} ' + pluralize(delta, 'minútou', 'minútami', 'minútami'); },
-	hourAgo: 'približne pred hodinou',
-	hoursAgo: function(delta){ return 'pred {delta} ' + pluralize(delta, 'hodinou', 'hodinami', 'hodinami'); },
-	dayAgo: 'pred dňom',
-	daysAgo: function(delta){ return 'pred {delta} ' + pluralize(delta, 'dňom', 'dňami', 'dňami'); },
-	weekAgo: 'pred týždňom',
-	weeksAgo: function(delta){ return 'pred {delta} ' + pluralize(delta, 'týždňom', 'týždňami', 'týždňami'); },
-	monthAgo: 'pred mesiacom',
-	monthsAgo: function(delta){ return 'pred {delta} ' + pluralize(delta, 'mesiacom', 'mesiacmi', 'mesiacmi'); },
-	yearAgo: 'pred rokom',
-	yearsAgo: function(delta){ return 'pred {delta} ' + pluralize(delta, 'rokom', 'rokmi', 'rokmi'); },
-
-	lessThanMinuteUntil: 'o chvíľu',
-	minuteUntil: 'približne o minútu',
-	minutesUntil: function(delta){ return 'o {delta} ' + pluralize(delta, 'minútu', 'minúty', 'minúty'); },
-	hourUntil: 'približne o hodinu',
-	hoursUntil: function(delta){ return 'o {delta} ' + pluralize(delta, 'hodinu', 'hodiny', 'hodín'); },
-	dayUntil: 'o deň',
-	daysUntil: function(delta){ return 'o {delta} ' + pluralize(delta, 'deň', 'dni', 'dní'); },
-	weekUntil: 'o týždeň',
-	weeksUntil: function(delta){ return 'o {delta} ' + pluralize(delta, 'týždeň', 'týždne', 'týždňov'); },
-	monthUntil: 'o mesiac',
-	monthsUntil: function(delta){ return 'o {delta} ' + pluralize(delta, 'mesiac', 'mesiace', 'mesiacov'); },
-	yearUntil: 'o rok',
-	yearsUntil: function(delta){ return 'o {delta} ' + pluralize(delta, 'rok', 'roky', 'rokov'); }
-});
-
-})();
-
-/*
----
-
-name: Locale.sk-SK.Form.Validator
-
-description: Form Validator messages for Czech.
-
-license: MIT-style license
-
-authors:
-  - Ivan Masár
-
-requires:
-  - Locale
-
-provides: [Locale.sk-SK.Form.Validator]
-
-...
-*/
-
-Locale.define('sk-SK', 'FormValidator', {
-
-	required: 'Táto položka je povinná.',
-	minLength: 'Zadajte prosím aspoň {minLength} znakov (momentálne {length} znakov).',
-	maxLength: 'Zadajte prosím menej ako {maxLength} znakov (momentálne {length} znakov).',
-	integer: 'Zadajte prosím celé číslo. Desetinné čísla (napr. 1.25) nie sú povolené.',
-	numeric: 'Zadajte len číselné hodnoty (t.j. „1“ alebo „1.1“ alebo „-1“ alebo „-1.1“).',
-	digits: 'Zadajte prosím len čísla a interpunkčné znamienka (napríklad telefónne číslo s pomlčkami albo bodkami je povolené).',
-	alpha: 'Zadajte prosím len písmená (a-z). Medzery alebo iné znaky nie sú povolené.',
-	alphanum: 'Zadajte prosím len písmená (a-z) alebo číslice (0-9). Medzery alebo iné znaky nie sú povolené.',
-	dateSuchAs: 'Zadajte prosím platný dátum v tvare {date}',
-	dateInFormatMDY: 'Zadajte prosím platný datum v tvare MM / DD / RRRR (t.j. „12/31/1999“)',
-	email: 'Zadajte prosím platnú emailovú adresu. Napríklad „fred@domain.com“.',
-	url: 'Zadajte prosím platnoú adresu URL v tvare http://www.example.com.',
-	currencyDollar: 'Zadajte prosím platnú čiastku. Napríklad $100.00.',
-	oneRequired: 'Zadajte prosím aspoň jednu hodnotu z týchto položiek.',
-	errorPrefix: 'Chyba: ',
-	warningPrefix: 'Upozornenie: ',
-
-	// Form.Validator.Extras
-	noSpace: 'V tejto položle nie sú povolené medzery',
-	reqChkByNode: 'Nie sú vybrané žiadne položky.',
-	requiredChk: 'Táto položka je povinná.',
-	reqChkByName: 'Prosím vyberte {label}.',
-	match: 'Táto položka sa musí zhodovať s položkou {matchName}',
-	startDate: 'dátum začiatku',
-	endDate: 'dátum ukončenia',
-	currendDate: 'aktuálny dátum',
-	afterDate: 'Dátum by mal býť rovnaký alebo väčší ako {label}.',
-	beforeDate: 'Dátum by mal byť rovnaký alebo menší ako {label}.',
-	startMonth: 'Vyberte počiatočný mesiac.',
-	sameMonth: 'Tieto dva dátumy musia býť v rovnakom mesiaci - zmeňte jeden z nich.',
-	creditcard: 'Zadané číslo kreditnej karty je neplatné. Prosím, opravte ho. Bolo zadaných {length} číslic.'
-
-});
-
-/*
----
-
-name: Locale.si-SI.Date
-
-description: Date messages for Slovenian.
-
-license: MIT-style license
-
-authors:
-  - Radovan Lozej
-
-requires:
-  - Locale
-
-provides: [Locale.si-SI.Date]
-
-...
-*/
-
-(function(){
-
-var pluralize = function(n, one, two, three, other){
-	return (n >= 1 && n <= 3) ? arguments[n] : other;
-};
-
-Locale.define('sl-SI', 'Date', {
-
-	months: ['januar', 'februar', 'marec', 'april', 'maj', 'junij', 'julij', 'avgust', 'september', 'oktober', 'november', 'december'],
-	months_abbr: ['jan', 'feb', 'mar', 'apr', 'maj', 'jun', 'jul', 'avg', 'sep', 'okt', 'nov', 'dec'],
-	days: ['nedelja', 'ponedeljek', 'torek', 'sreda', 'četrtek', 'petek', 'sobota'],
-	days_abbr: ['ned', 'pon', 'tor', 'sre', 'čet', 'pet', 'sob'],
-
-	// Culture's date order: DD.MM.YYYY
-	dateOrder: ['date', 'month', 'year'],
-	shortDate: '%d.%m.%Y',
-	shortTime: '%H.%M',
-	AM: 'AM',
-	PM: 'PM',
-	firstDayOfWeek: 1,
-
-	// Date.Extras
-	ordinal: '.',
-
-	lessThanMinuteAgo: 'manj kot minuto nazaj',
-	minuteAgo: 'minuto nazaj',
-	minutesAgo: function(delta){ return '{delta} ' + pluralize(delta, 'minuto', 'minuti', 'minute', 'minut') + ' nazaj'; },
-	hourAgo: 'uro nazaj',
-	hoursAgo: function(delta){ return '{delta} ' + pluralize(delta, 'uro', 'uri', 'ure', 'ur') + ' nazaj'; },
-	dayAgo: 'dan nazaj',
-	daysAgo: function(delta){ return '{delta} ' + pluralize(delta, 'dan', 'dneva', 'dni', 'dni') + ' nazaj'; },
-	weekAgo: 'teden nazaj',
-	weeksAgo: function(delta){ return '{delta} ' + pluralize(delta, 'teden', 'tedna', 'tedne', 'tednov') + ' nazaj'; },
-	monthAgo: 'mesec nazaj',
-	monthsAgo: function(delta){ return '{delta} ' + pluralize(delta, 'mesec', 'meseca', 'mesece', 'mesecov') + ' nazaj'; },
-	yearthAgo: 'leto nazaj',
-	yearsAgo: function(delta){ return '{delta} ' + pluralize(delta, 'leto', 'leti', 'leta', 'let') + ' nazaj'; },
-
-	lessThanMinuteUntil: 'še manj kot minuto',
-	minuteUntil: 'še minuta',
-	minutesUntil: function(delta){ return 'še {delta} ' + pluralize(delta, 'minuta', 'minuti', 'minute', 'minut'); },
-	hourUntil: 'še ura',
-	hoursUntil: function(delta){ return 'še {delta} ' + pluralize(delta, 'ura', 'uri', 'ure', 'ur'); },
-	dayUntil: 'še dan',
-	daysUntil: function(delta){ return 'še {delta} ' + pluralize(delta, 'dan', 'dneva', 'dnevi', 'dni'); },
-	weekUntil: 'še tedn',
-	weeksUntil: function(delta){ return 'še {delta} ' + pluralize(delta, 'teden', 'tedna', 'tedni', 'tednov'); },
-	monthUntil: 'še mesec',
-	monthsUntil: function(delta){ return 'še {delta} ' + pluralize(delta, 'mesec', 'meseca', 'meseci', 'mesecov'); },
-	yearUntil: 'še leto',
-	yearsUntil: function(delta){ return 'še {delta} ' + pluralize(delta, 'leto', 'leti', 'leta', 'let'); }
-
-});
-
-})();
-
-/*
----
-
-name: Locale.si-SI.Form.Validator
-
-description: Form Validator messages for Slovenian.
-
-license: MIT-style license
-
-authors:
-  - Radovan Lozej
-
-requires:
-  - Locale
-
-provides: [Locale.si-SI.Form.Validator]
-
-...
-*/
-
-Locale.define('sl-SI', 'FormValidator', {
-
-	required: 'To polje je obvezno',
-	minLength: 'Prosim, vnesite vsaj {minLength} znakov (vnesli ste {length} znakov).',
-	maxLength: 'Prosim, ne vnesite več kot {maxLength} znakov (vnesli ste {length} znakov).',
-	integer: 'Prosim, vnesite celo število. Decimalna števila (kot 1,25) niso dovoljena.',
-	numeric: 'Prosim, vnesite samo numerične vrednosti (kot "1" ali "1.1" ali "-1" ali "-1.1").',
-	digits: 'Prosim, uporabite številke in ločila le na tem polju (na primer, dovoljena je telefonska številka z pomišlaji ali pikami).',
-	alpha: 'Prosim, uporabite le črke v tem plju. Presledki in drugi znaki niso dovoljeni.',
-	alphanum: 'Prosim, uporabite samo črke ali številke v tem polju. Presledki in drugi znaki niso dovoljeni.',
-	dateSuchAs: 'Prosim, vnesite pravilen datum kot {date}',
-	dateInFormatMDY: 'Prosim, vnesite pravilen datum kot MM.DD.YYYY (primer "12.31.1999")',
-	email: 'Prosim, vnesite pravilen email naslov. Na primer "fred@domain.com".',
-	url: 'Prosim, vnesite pravilen URL kot http://www.example.com.',
-	currencyDollar: 'Prosim, vnesit epravilno vrednost €. Primer 100,00€ .',
-	oneRequired: 'Prosimo, vnesite nekaj za vsaj eno izmed teh polj.',
-	errorPrefix: 'Napaka: ',
-	warningPrefix: 'Opozorilo: ',
-
-	// Form.Validator.Extras
-	noSpace: 'To vnosno polje ne dopušča presledkov.',
-	reqChkByNode: 'Nič niste izbrali.',
-	requiredChk: 'To polje je obvezno',
-	reqChkByName: 'Prosim, izberite {label}.',
-	match: 'To polje se mora ujemati z poljem {matchName}',
-	startDate: 'datum začetka',
-	endDate: 'datum konca',
-	currentDate: 'trenuten datum',
-	afterDate: 'Datum bi moral biti isti ali po {label}.',
-	beforeDate: 'Datum bi moral biti isti ali pred {label}.',
-	startMonth: 'Prosim, vnesite začetni datum',
-	sameMonth: 'Ta dva datuma morata biti v istem mesecu - premeniti morate eno ali drugo.',
-	creditcard: 'Številka kreditne kartice ni pravilna. Preverite številko ali poskusite še enkrat. Vnešenih {length} znakov.'
-
-});
-
-/*
----
-
-name: Locale.sv-SE.Date
-
-description: Date messages for Swedish.
-
-license: MIT-style license
-
-authors:
-  - Martin Lundgren
-
-requires:
-  - Locale
-
-provides: [Locale.sv-SE.Date]
-
-...
-*/
-
-Locale.define('sv-SE', 'Date', {
-
-	months: ['januari', 'februari', 'mars', 'april', 'maj', 'juni', 'juli', 'augusti', 'september', 'oktober', 'november', 'december'],
-	months_abbr: ['jan', 'feb', 'mar', 'apr', 'maj', 'jun', 'jul', 'aug', 'sep', 'okt', 'nov', 'dec'],
-	days: ['söndag', 'måndag', 'tisdag', 'onsdag', 'torsdag', 'fredag', 'lördag'],
-	days_abbr: ['sön', 'mån', 'tis', 'ons', 'tor', 'fre', 'lör'],
-
-	// Culture's date order: YYYY-MM-DD
-	dateOrder: ['year', 'month', 'date'],
-	shortDate: '%Y-%m-%d',
-	shortTime: '%H:%M',
-	AM: '',
-	PM: '',
-	firstDayOfWeek: 1,
-
-	// Date.Extras
-	ordinal: '',
-
-	lessThanMinuteAgo: 'mindre än en minut sedan',
-	minuteAgo: 'ungefär en minut sedan',
-	minutesAgo: '{delta} minuter sedan',
-	hourAgo: 'ungefär en timme sedan',
-	hoursAgo: 'ungefär {delta} timmar sedan',
-	dayAgo: '1 dag sedan',
-	daysAgo: '{delta} dagar sedan',
-
-	lessThanMinuteUntil: 'mindre än en minut sedan',
-	minuteUntil: 'ungefär en minut sedan',
-	minutesUntil: '{delta} minuter sedan',
-	hourUntil: 'ungefär en timme sedan',
-	hoursUntil: 'ungefär {delta} timmar sedan',
-	dayUntil: '1 dag sedan',
-	daysUntil: '{delta} dagar sedan'
-
-});
-
-/*
----
-
-name: Locale.sv-SE.Form.Validator
-
-description: Form Validator messages for Swedish.
-
-license: MIT-style license
-
-authors:
-  - Martin Lundgren
-
-requires:
-  - Locale
-
-provides: [Locale.sv-SE.Form.Validator]
-
-...
-*/
-
-Locale.define('sv-SE', 'FormValidator', {
-
-	required: 'Fältet är obligatoriskt.',
-	minLength: 'Ange minst {minLength} tecken (du angav {length} tecken).',
-	maxLength: 'Ange högst {maxLength} tecken (du angav {length} tecken). ',
-	integer: 'Ange ett heltal i fältet. Tal med decimaler (t.ex. 1,25) är inte tillåtna.',
-	numeric: 'Ange endast numeriska värden i detta fält (t.ex. "1" eller "1.1" eller "-1" eller "-1,1").',
-	digits: 'Använd endast siffror och skiljetecken i detta fält (till exempel ett telefonnummer med bindestreck tillåtet).',
-	alpha: 'Använd endast bokstäver (a-ö) i detta fält. Inga mellanslag eller andra tecken är tillåtna.',
-	alphanum: 'Använd endast bokstäver (a-ö) och siffror (0-9) i detta fält. Inga mellanslag eller andra tecken är tillåtna.',
-	dateSuchAs: 'Ange ett giltigt datum som t.ex. {date}',
-	dateInFormatMDY: 'Ange ett giltigt datum som t.ex. YYYY-MM-DD (i.e. "1999-12-31")',
-	email: 'Ange en giltig e-postadress. Till exempel "erik@domain.com".',
-	url: 'Ange en giltig webbadress som http://www.example.com.',
-	currencyDollar: 'Ange en giltig belopp. Exempelvis 100,00.',
-	oneRequired: 'Vänligen ange minst ett av dessa alternativ.',
-	errorPrefix: 'Fel: ',
-	warningPrefix: 'Varning: ',
-
-	// Form.Validator.Extras
-	noSpace: 'Det får inte finnas några mellanslag i detta fält.',
-	reqChkByNode: 'Inga objekt är valda.',
-	requiredChk: 'Detta är ett obligatoriskt fält.',
-	reqChkByName: 'Välj en {label}.',
-	match: 'Detta fält måste matcha {matchName}',
-	startDate: 'startdatumet',
-	endDate: 'slutdatum',
-	currentDate: 'dagens datum',
-	afterDate: 'Datumet bör vara samma eller senare än {label}.',
-	beforeDate: 'Datumet bör vara samma eller tidigare än {label}.',
-	startMonth: 'Välj en start månad',
-	sameMonth: 'Dessa två datum måste vara i samma månad - du måste ändra det ena eller det andra.'
-
-});
-
-/*
----
-
-name: Locale.sv-SE.Number
-
-description: Number messages for Swedish.
-
-license: MIT-style license
-
-authors:
-  - Arian Stolwijk
-  - Martin Lundgren
-
-requires:
-  - Locale
-  - Locale.EU.Number
-
-provides: [Locale.sv-SE.Number]
-
-...
-*/
-
-Locale.define('sv-SE', 'Number', {
-
-	currency: {
-		prefix: 'SEK '
-	}
-
-}).inherit('EU', 'Number');
-
-/*
----
-
-name: Locale.tr-TR.Date
-
-description: Date messages for Turkish.
-
-license: MIT-style license
-
-authors:
-  - Faruk Can Bilir
-
-requires:
-  - Locale
-
-provides: [Locale.tr-TR.Date]
-
-...
-*/
-
-Locale.define('tr-TR', 'Date', {
-
-	months: ['Ocak', 'Şubat', 'Mart', 'Nisan', 'Mayıs', 'Haziran', 'Temmuz', 'Ağustos', 'Eylül', 'Ekim', 'Kasım', 'Aralık'],
-	months_abbr: ['Oca', 'Şub', 'Mar', 'Nis', 'May', 'Haz', 'Tem', 'Ağu', 'Eyl', 'Eki', 'Kas', 'Ara'],
-	days: ['Pazar', 'Pazartesi', 'Salı', 'Çarşamba', 'Perşembe', 'Cuma', 'Cumartesi'],
-	days_abbr: ['Pa', 'Pzt', 'Sa', 'Ça', 'Pe', 'Cu', 'Cmt'],
-
-	// Culture's date order: MM/DD/YYYY
-	dateOrder: ['date', 'month', 'year'],
-	shortDate: '%d/%m/%Y',
-	shortTime: '%H.%M',
-	AM: 'AM',
-	PM: 'PM',
-	firstDayOfWeek: 1,
-
-	// Date.Extras
-	ordinal: '',
-
-	lessThanMinuteAgo: 'bir dakikadan önce',
-	minuteAgo: 'yaklaşık bir dakika önce',
-	minutesAgo: '{delta} dakika önce',
-	hourAgo: 'bir saat kadar önce',
-	hoursAgo: '{delta} saat kadar önce',
-	dayAgo: 'bir gün önce',
-	daysAgo: '{delta} gün önce',
-	weekAgo: 'bir hafta önce',
-	weeksAgo: '{delta} hafta önce',
-	monthAgo: 'bir ay önce',
-	monthsAgo: '{delta} ay önce',
-	yearAgo: 'bir yıl önce',
-	yearsAgo: '{delta} yıl önce',
-
-	lessThanMinuteUntil: 'bir dakikadan az sonra',
-	minuteUntil: 'bir dakika kadar sonra',
-	minutesUntil: '{delta} dakika sonra',
-	hourUntil: 'bir saat kadar sonra',
-	hoursUntil: '{delta} saat kadar sonra',
-	dayUntil: 'bir gün sonra',
-	daysUntil: '{delta} gün sonra',
-	weekUntil: 'bir hafta sonra',
-	weeksUntil: '{delta} hafta sonra',
-	monthUntil: 'bir ay sonra',
-	monthsUntil: '{delta} ay sonra',
-	yearUntil: 'bir yıl sonra',
-	yearsUntil: '{delta} yıl sonra'
-
-});
-
-/*
----
-
-name: Locale.tr-TR.Form.Validator
-
-description: Form Validator messages for Turkish.
-
-license: MIT-style license
-
-authors:
-  - Faruk Can Bilir
-
-requires:
-  - Locale
-
-provides: [Locale.tr-TR.Form.Validator]
-
-...
-*/
-
-Locale.define('tr-TR', 'FormValidator', {
-
-	required: 'Bu alan zorunlu.',
-	minLength: 'Lütfen en az {minLength} karakter girin (siz {length} karakter girdiniz).',
-	maxLength: 'Lütfen en fazla {maxLength} karakter girin (siz {length} karakter girdiniz).',
-	integer: 'Lütfen bu alana sadece tamsayı girin. Ondalıklı sayılar (ör: 1.25) kullanılamaz.',
-	numeric: 'Lütfen bu alana sadece sayısal değer girin (ör: "1", "1.1", "-1" ya da "-1.1").',
-	digits: 'Lütfen bu alana sadece sayısal değer ve noktalama işareti girin (örneğin, nokta ve tire içeren bir telefon numarası kullanılabilir).',
-	alpha: 'Lütfen bu alanda yalnızca harf kullanın. Boşluk ve diğer karakterler kullanılamaz.',
-	alphanum: 'Lütfen bu alanda sadece harf ve rakam kullanın. Boşluk ve diğer karakterler kullanılamaz.',
-	dateSuchAs: 'Lütfen geçerli bir tarih girin (Ör: {date})',
-	dateInFormatMDY: 'Lütfen geçerli bir tarih girin (GG/AA/YYYY, ör: "31/12/1999")',
-	email: 'Lütfen geçerli bir email adresi girin. Ör: "kemal@etikan.com".',
-	url: 'Lütfen geçerli bir URL girin. Ör: http://www.example.com.',
-	currencyDollar: 'Lütfen geçerli bir TL miktarı girin. Ör: 100,00 TL .',
-	oneRequired: 'Lütfen en az bir tanesini doldurun.',
-	errorPrefix: 'Hata: ',
-	warningPrefix: 'Uyarı: ',
-
-	// Form.Validator.Extras
-	noSpace: 'Bu alanda boşluk kullanılamaz.',
-	reqChkByNode: 'Hiçbir öğe seçilmemiş.',
-	requiredChk: 'Bu alan zorunlu.',
-	reqChkByName: 'Lütfen bir {label} girin.',
-	match: 'Bu alan, {matchName} alanıyla uyuşmalı',
-	startDate: 'başlangıç tarihi',
-	endDate: 'bitiş tarihi',
-	currentDate: 'bugünün tarihi',
-	afterDate: 'Tarih, {label} tarihiyle aynı gün ya da ondan sonra olmalıdır.',
-	beforeDate: 'Tarih, {label} tarihiyle aynı gün ya da ondan önce olmalıdır.',
-	startMonth: 'Lütfen bir başlangıç ayı seçin',
-	sameMonth: 'Bu iki tarih aynı ayda olmalı - bir tanesini değiştirmeniz gerekiyor.',
-	creditcard: 'Girdiğiniz kredi kartı numarası geçersiz. Lütfen kontrol edip tekrar deneyin. {length} hane girildi.'
-
-});
-
-/*
----
-
-name: Locale.tr-TR.Number
-
-description: Number messages for Turkish.
-
-license: MIT-style license
-
-authors:
-  - Faruk Can Bilir
-
-requires:
-  - Locale
-  - Locale.EU.Number
-
-provides: [Locale.tr-TR.Number]
-
-...
-*/
-
-Locale.define('tr-TR', 'Number', {
-
-	currency: {
-		decimals: 0,
-		suffix: ' TL'
-	}
-
-}).inherit('EU', 'Number');
-
-/*
----
-
-name: Locale.uk-UA.Date
-
-description: Date messages for Ukrainian (utf-8).
-
-license: MIT-style license
-
-authors:
-  - Slik
-
-requires:
-  - Locale
-
-provides: [Locale.uk-UA.Date]
-
-...
-*/
-
-(function(){
-
-var pluralize = function(n, one, few, many, other){
-	var d = (n / 10).toInt(),
-		z = n % 10,
-		s = (n / 100).toInt();
-
-	if (d == 1 && n > 10) return many;
-	if (z == 1) return one;
-	if (z > 0 && z < 5) return few;
-	return many;
-};
-
-Locale.define('uk-UA', 'Date', {
-
-	months: ['Січень', 'Лютий', 'Березень', 'Квітень', 'Травень', 'Червень', 'Липень', 'Серпень', 'Вересень', 'Жовтень', 'Листопад', 'Грудень'],
-	months_abbr: ['Січ', 'Лют', 'Бер', 'Квіт', 'Трав', 'Черв', 'Лип', 'Серп', 'Вер', 'Жовт', 'Лист', 'Груд' ],
-	days: ['Неділя', 'Понеділок', 'Вівторок', 'Середа', 'Четвер', "П'ятниця", 'Субота'],
-	days_abbr: ['Нд', 'Пн', 'Вт', 'Ср', 'Чт', 'Пт', 'Сб'],
-
-	// Culture's date order: DD/MM/YYYY
-	dateOrder: ['date', 'month', 'year'],
-	shortDate: '%d/%m/%Y',
-	shortTime: '%H:%M',
-	AM: 'до полудня',
-	PM: 'по полудню',
-	firstDayOfWeek: 1,
-
-	// Date.Extras
-	ordinal: '',
-
-	lessThanMinuteAgo: 'меньше хвилини тому',
-	minuteAgo: 'хвилину тому',
-	minutesAgo: function(delta){ return '{delta} ' + pluralize(delta, 'хвилину', 'хвилини', 'хвилин') + ' тому'; },
-	hourAgo: 'годину тому',
-	hoursAgo: function(delta){ return '{delta} ' + pluralize(delta, 'годину', 'години', 'годин') + ' тому'; },
-	dayAgo: 'вчора',
-	daysAgo: function(delta){ return '{delta} ' + pluralize(delta, 'день', 'дня', 'днів') + ' тому'; },
-	weekAgo: 'тиждень тому',
-	weeksAgo: function(delta){ return '{delta} ' + pluralize(delta, 'тиждень', 'тижні', 'тижнів') + ' тому'; },
-	monthAgo: 'місяць тому',
-	monthsAgo: function(delta){ return '{delta} ' + pluralize(delta, 'місяць', 'місяці', 'місяців') + ' тому'; },
-	yearAgo: 'рік тому',
-	yearsAgo: function(delta){ return '{delta} ' + pluralize(delta, 'рік', 'роки', 'років') + ' тому'; },
-
-	lessThanMinuteUntil: 'за мить',
-	minuteUntil: 'через хвилину',
-	minutesUntil: function(delta){ return 'через {delta} ' + pluralize(delta, 'хвилину', 'хвилини', 'хвилин'); },
-	hourUntil: 'через годину',
-	hoursUntil: function(delta){ return 'через {delta} ' + pluralize(delta, 'годину', 'години', 'годин'); },
-	dayUntil: 'завтра',
-	daysUntil: function(delta){ return 'через {delta} ' + pluralize(delta, 'день', 'дня', 'днів'); },
-	weekUntil: 'через тиждень',
-	weeksUntil: function(delta){ return 'через {delta} ' + pluralize(delta, 'тиждень', 'тижні', 'тижнів'); },
-	monthUntil: 'через місяць',
-	monthesUntil: function(delta){ return 'через {delta} ' + pluralize(delta, 'місяць', 'місяці', 'місяців'); },
-	yearUntil: 'через рік',
-	yearsUntil: function(delta){ return 'через {delta} ' + pluralize(delta, 'рік', 'роки', 'років'); }
-
-});
-
-})();
-
-/*
----
-
-name: Locale.uk-UA.Form.Validator
-
-description: Form Validator messages for Ukrainian (utf-8).
-
-license: MIT-style license
-
-authors:
-  - Slik
-
-requires:
-  - Locale
-
-provides: [Locale.uk-UA.Form.Validator]
-
-...
-*/
-
-Locale.define('uk-UA', 'FormValidator', {
-
-	required: 'Це поле повинне бути заповненим.',
-	minLength: 'Введіть хоча б {minLength} символів (Ви ввели {length}).',
-	maxLength: 'Кількість символів не може бути більше {maxLength} (Ви ввели {length}).',
-	integer: 'Введіть в це поле число. Дробові числа (наприклад 1.25) не дозволені.',
-	numeric: 'Введіть в це поле число (наприклад "1" або "1.1", або "-1", або "-1.1").',
-	digits: 'В цьому полі ви можете використовувати лише цифри і знаки пунктіації (наприклад, телефонний номер з знаками дефізу або з крапками).',
-	alpha: 'В цьому полі можна використовувати лише латинські літери (a-z). Пробіли і інші символи заборонені.',
-	alphanum: 'В цьому полі можна використовувати лише латинські літери (a-z) і цифри (0-9). Пробіли і інші символи заборонені.',
-	dateSuchAs: 'Введіть коректну дату {date}.',
-	dateInFormatMDY: 'Введіть дату в форматі ММ/ДД/РРРР (наприклад "12/31/2009").',
-	email: 'Введіть коректну адресу електронної пошти (наприклад "name@domain.com").',
-	url: 'Введіть коректне інтернет-посилання (наприклад http://www.example.com).',
-	currencyDollar: 'Введіть суму в доларах (наприклад "$100.00").',
-	oneRequired: 'Заповніть одне з полів.',
-	errorPrefix: 'Помилка: ',
-	warningPrefix: 'Увага: ',
-
-	noSpace: 'Пробіли заборонені.',
-	reqChkByNode: 'Не відмічено жодного варіанту.',
-	requiredChk: 'Це поле повинне бути віміченим.',
-	reqChkByName: 'Будь ласка, відмітьте {label}.',
-	match: 'Це поле повинно відповідати {matchName}',
-	startDate: 'початкова дата',
-	endDate: 'кінцева дата',
-	currentDate: 'сьогоднішня дата',
-	afterDate: 'Ця дата повинна бути такою ж, або пізнішою за {label}.',
-	beforeDate: 'Ця дата повинна бути такою ж, або ранішою за {label}.',
-	startMonth: 'Будь ласка, виберіть початковий місяць',
-	sameMonth: 'Ці дати повинні відноситись одного і того ж місяця. Будь ласка, змініть одну з них.',
-	creditcard: 'Номер кредитної карти введений неправильно. Будь ласка, перевірте його. Введено {length} символів.'
-
-});
-
-/*
----
-
-name: Locale.zh-CH.Date
-
-description: Date messages for Chinese (simplified and traditional).
-
-license: MIT-style license
-
-authors:
-  - YMind Chan
-
-requires:
-  - Locale
-
-provides: [Locale.zh-CH.Date]
-
-...
-*/
-
-// Simplified Chinese
-Locale.define('zh-CHS', 'Date', {
-
-	months: ['一月', '二月', '三月', '四月', '五月', '六月', '七月', '八月', '九月', '十月', '十一月', '十二月'],
-	months_abbr: ['一', '二', '三', '四', '五', '六', '七', '八', '九', '十', '十一', '十二'],
-	days: ['星期日', '星期一', '星期二', '星期三', '星期四', '星期五', '星期六'],
-	days_abbr: ['日', '一', '二', '三', '四', '五', '六'],
-
-	// Culture's date order: YYYY-MM-DD
-	dateOrder: ['year', 'month', 'date'],
-	shortDate: '%Y-%m-%d',
-	shortTime: '%I:%M%p',
-	AM: 'AM',
-	PM: 'PM',
-	firstDayOfWeek: 1,
-
-	// Date.Extras
-	ordinal: '',
-
-	lessThanMinuteAgo: '不到1分钟前',
-	minuteAgo: '大约1分钟前',
-	minutesAgo: '{delta}分钟之前',
-	hourAgo: '大约1小时前',
-	hoursAgo: '大约{delta}小时前',
-	dayAgo: '1天前',
-	daysAgo: '{delta}天前',
-	weekAgo: '1星期前',
-	weeksAgo: '{delta}星期前',
-	monthAgo: '1个月前',
-	monthsAgo: '{delta}个月前',
-	yearAgo: '1年前',
-	yearsAgo: '{delta}年前',
-
-	lessThanMinuteUntil: '从现在开始不到1分钟',
-	minuteUntil: '从现在开始約1分钟',
-	minutesUntil: '从现在开始约{delta}分钟',
-	hourUntil: '从现在开始1小时',
-	hoursUntil: '从现在开始约{delta}小时',
-	dayUntil: '从现在开始1天',
-	daysUntil: '从现在开始{delta}天',
-	weekUntil: '从现在开始1星期',
-	weeksUntil: '从现在开始{delta}星期',
-	monthUntil: '从现在开始一个月',
-	monthsUntil: '从现在开始{delta}个月',
-	yearUntil: '从现在开始1年',
-	yearsUntil: '从现在开始{delta}年'
-
-});
-
-// Traditional Chinese
-Locale.define('zh-CHT', 'Date', {
-
-	months: ['一月', '二月', '三月', '四月', '五月', '六月', '七月', '八月', '九月', '十月', '十一月', '十二月'],
-	months_abbr: ['一', '二', '三', '四', '五', '六', '七', '八', '九', '十', '十一', '十二'],
-	days: ['星期日', '星期一', '星期二', '星期三', '星期四', '星期五', '星期六'],
-	days_abbr: ['日', '一', '二', '三', '四', '五', '六'],
-
-	// Culture's date order: YYYY-MM-DD
-	dateOrder: ['year', 'month', 'date'],
-	shortDate: '%Y-%m-%d',
-	shortTime: '%I:%M%p',
-	AM: 'AM',
-	PM: 'PM',
-	firstDayOfWeek: 1,
-
-	// Date.Extras
-	ordinal: '',
-
-	lessThanMinuteAgo: '不到1分鐘前',
-	minuteAgo: '大約1分鐘前',
-	minutesAgo: '{delta}分鐘之前',
-	hourAgo: '大約1小時前',
-	hoursAgo: '大約{delta}小時前',
-	dayAgo: '1天前',
-	daysAgo: '{delta}天前',
-	weekAgo: '1星期前',
-	weeksAgo: '{delta}星期前',
-	monthAgo: '1个月前',
-	monthsAgo: '{delta}个月前',
-	yearAgo: '1年前',
-	yearsAgo: '{delta}年前',
-
-	lessThanMinuteUntil: '從現在開始不到1分鐘',
-	minuteUntil: '從現在開始約1分鐘',
-	minutesUntil: '從現在開始約{delta}分鐘',
-	hourUntil: '從現在開始1小時',
-	hoursUntil: '從現在開始約{delta}小時',
-	dayUntil: '從現在開始1天',
-	daysUntil: '從現在開始{delta}天',
-	weekUntil: '從現在開始1星期',
-	weeksUntil: '從現在開始{delta}星期',
-	monthUntil: '從現在開始一個月',
-	monthsUntil: '從現在開始{delta}個月',
-	yearUntil: '從現在開始1年',
-	yearsUntil: '從現在開始{delta}年'
-
-});
-
-/*
----
-
-name: Locale.zh-CH.Form.Validator
-
-description: Form Validator messages for Chinese (simplified and traditional).
-
-license: MIT-style license
-
-authors:
-  - YMind Chan
-
-requires:
-  - Locale
-  - Form.Validator
-
-provides: [Form.zh-CH.Form.Validator, Form.Validator.CurrencyYuanValidator]
-
-...
-*/
-
-// Simplified Chinese
-Locale.define('zh-CHS', 'FormValidator', {
-
-	required: '此项必填。',
-	minLength: '请至少输入 {minLength} 个字符 (已输入 {length} 个)。',
-	maxLength: '最多只能输入 {maxLength} 个字符 (已输入 {length} 个)。',
-	integer: '请输入一个整数,不能包含小数点。例如:"1", "200"。',
-	numeric: '请输入一个数字,例如:"1", "1.1", "-1", "-1.1"。',
-	digits: '请输入由数字和标点符号组成的内容。例如电话号码。',
-	alpha: '请输入 A-Z 的 26 个字母,不能包含空格或任何其他字符。',
-	alphanum: '请输入 A-Z 的 26 个字母或 0-9 的 10 个数字,不能包含空格或任何其他字符。',
-	dateSuchAs: '请输入合法的日期格式,如:{date}。',
-	dateInFormatMDY: '请输入合法的日期格式,例如:YYYY-MM-DD ("2010-12-31")。',
-	email: '请输入合法的电子信箱地址,例如:"fred@domain.com"。',
-	url: '请输入合法的 Url 地址,例如:http://www.example.com。',
-	currencyDollar: '请输入合法的货币符号,例如:¥100.0',
-	oneRequired: '请至少选择一项。',
-	errorPrefix: '错误:',
-	warningPrefix: '警告:',
-
-	// Form.Validator.Extras
-	noSpace: '不能包含空格。',
-	reqChkByNode: '未选择任何内容。',
-	requiredChk: '此项必填。',
-	reqChkByName: '请选择 {label}.',
-	match: '必须与{matchName}相匹配',
-	startDate: '起始日期',
-	endDate: '结束日期',
-	currentDate: '当前日期',
-	afterDate: '日期必须等于或晚于 {label}.',
-	beforeDate: '日期必须早于或等于 {label}.',
-	startMonth: '请选择起始月份',
-	sameMonth: '您必须修改两个日期中的一个,以确保它们在同一月份。',
-	creditcard: '您输入的信用卡号码不正确。当前已输入{length}个字符。'
-
-});
-
-// Traditional Chinese
-Locale.define('zh-CHT', 'FormValidator', {
-
-	required: '此項必填。 ',
-	minLength: '請至少輸入{minLength} 個字符(已輸入{length} 個)。 ',
-	maxLength: '最多只能輸入{maxLength} 個字符(已輸入{length} 個)。 ',
-	integer: '請輸入一個整數,不能包含小數點。例如:"1", "200"。 ',
-	numeric: '請輸入一個數字,例如:"1", "1.1", "-1", "-1.1"。 ',
-	digits: '請輸入由數字和標點符號組成的內容。例如電話號碼。 ',
-	alpha: '請輸入AZ 的26 個字母,不能包含空格或任何其他字符。 ',
-	alphanum: '請輸入AZ 的26 個字母或0-9 的10 個數字,不能包含空格或任何其他字符。 ',
-	dateSuchAs: '請輸入合法的日期格式,如:{date}。 ',
-	dateInFormatMDY: '請輸入合法的日期格式,例如:YYYY-MM-DD ("2010-12-31")。 ',
-	email: '請輸入合法的電子信箱地址,例如:"fred@domain.com"。 ',
-	url: '請輸入合法的Url 地址,例如:http://www.example.com。 ',
-	currencyDollar: '請輸入合法的貨幣符號,例如:¥100.0',
-	oneRequired: '請至少選擇一項。 ',
-	errorPrefix: '錯誤:',
-	warningPrefix: '警告:',
-
-	// Form.Validator.Extras
-	noSpace: '不能包含空格。 ',
-	reqChkByNode: '未選擇任何內容。 ',
-	requiredChk: '此項必填。 ',
-	reqChkByName: '請選擇 {label}.',
-	match: '必須與{matchName}相匹配',
-	startDate: '起始日期',
-	endDate: '結束日期',
-	currentDate: '當前日期',
-	afterDate: '日期必須等於或晚於{label}.',
-	beforeDate: '日期必須早於或等於{label}.',
-	startMonth: '請選擇起始月份',
-	sameMonth: '您必須修改兩個日期中的一個,以確保它們在同一月份。 ',
-	creditcard: '您輸入的信用卡號碼不正確。當前已輸入{length}個字符。 '
-
-});
-
-Form.Validator.add('validate-currency-yuan', {
-
-	errorMsg: function(){
-		return Form.Validator.getMsg('currencyYuan');
-	},
-
-	test: function(element){
-		// [¥]1[##][,###]+[.##]
-		// [¥]1###+[.##]
-		// [¥]0.##
-		// [¥].##
-		return Form.Validator.getValidator('IsEmpty').test(element) || (/^¥?\-?([1-9]{1}[0-9]{0,2}(\,[0-9]{3})*(\.[0-9]{0,2})?|[1-9]{1}\d*(\.[0-9]{0,2})?|0(\.[0-9]{0,2})?|(\.[0-9]{1,2})?)$/).test(element.get('value'));
-	}
-
-});
-
-/*
----
-
-name: Locale.zh-CH.Number
-
-description: Number messages for for Chinese (simplified and traditional).
-
-license: MIT-style license
-
-authors:
-  - YMind Chan
-
-requires:
-  - Locale
-  - Locale.en-US.Number
-
-provides: [Locale.zh-CH.Number]
-
-...
-*/
-
-// Simplified Chinese
-Locale.define('zh-CHS', 'Number', {
-
-	currency: {
-		prefix: '¥ '
-	}
-
-}).inherit('en-US', 'Number');
-
-// Traditional Chinese
-Locale.define('zh-CHT').inherit('zh-CHS', 'Number');
-
-/*
----
-
-script: Request.JSONP.js
-
-name: Request.JSONP
-
-description: Defines Request.JSONP, a class for cross domain javascript via script injection.
-
-license: MIT-style license
-
-authors:
-  - Aaron Newton
-  - Guillermo Rauch
-  - Arian Stolwijk
-
-requires:
-  - Core/Element
-  - Core/Request
-  - MooTools.More
-
-provides: [Request.JSONP]
-
-...
-*/
-
-Request.JSONP = new Class({
-
-	Implements: [Chain, Events, Options],
-
-	options: {/*
-		onRequest: function(src, scriptElement){},
-		onComplete: function(data){},
-		onSuccess: function(data){},
-		onCancel: function(){},
-		onTimeout: function(){},
-		onError: function(){}, */
-		onRequest: function(src){
-			if (this.options.log && window.console && console.log){
-				console.log('JSONP retrieving script with url:' + src);
-			}
-		},
-		onError: function(src){
-			if (this.options.log && window.console && console.warn){
-				console.warn('JSONP '+ src +' will fail in Internet Explorer, which enforces a 2083 bytes length limit on URIs');
-			}
-		},
-		url: '',
-		callbackKey: 'callback',
-		injectScript: document.head,
-		data: '',
-		link: 'ignore',
-		timeout: 0,
-		log: false
-	},
-
-	initialize: function(options){
-		this.setOptions(options);
-	},
-
-	send: function(options){
-		if (!Request.prototype.check.call(this, options)) return this;
-		this.running = true;
-
-		var type = typeOf(options);
-		if (type == 'string' || type == 'element') options = {data: options};
-		options = Object.merge(this.options, options || {});
-
-		var data = options.data;
-		switch (typeOf(data)){
-			case 'element': data = document.id(data).toQueryString(); break;
-			case 'object': case 'hash': data = Object.toQueryString(data);
-		}
-
-		var index = this.index = Request.JSONP.counter++,
-			key = 'request_' + index;
-
-		var src = options.url +
-			(options.url.test('\\?') ? '&' :'?') +
-			(options.callbackKey) +
-			'=Request.JSONP.request_map.request_'+ index +
-			(data ? '&' + data : '');
-
-		if (src.length > 2083) this.fireEvent('error', src);
-
-		Request.JSONP.request_map[key] = function(){
-			delete Request.JSONP.request_map[key];
-			this.success(arguments, index);
-		}.bind(this);
-
-		var script = this.getScript(src).inject(options.injectScript);
-		this.fireEvent('request', [src, script]);
-
-		if (options.timeout) this.timeout.delay(options.timeout, this);
-
-		return this;
-	},
-
-	getScript: function(src){
-		if (!this.script) this.script = new Element('script', {
-			type: 'text/javascript',
-			async: true,
-			src: src
-		});
-		return this.script;
-	},
-
-	success: function(args){
-		if (!this.running) return;
-		this.clear()
-			.fireEvent('complete', args).fireEvent('success', args)
-			.callChain();
-	},
-
-	cancel: function(){
-		if (this.running) this.clear().fireEvent('cancel');
-		return this;
-	},
-
-	isRunning: function(){
-		return !!this.running;
-	},
-
-	clear: function(){
-		this.running = false;
-		if (this.script){
-			this.script.destroy();
-			this.script = null;
-		}
-		return this;
-	},
-
-	timeout: function(){
-		if (this.running){
-			this.running = false;
-			this.fireEvent('timeout', [this.script.get('src'), this.script]).fireEvent('failure').cancel();
-		}
-		return this;
-	}
-
-});
-
-Request.JSONP.counter = 0;
-Request.JSONP.request_map = {};
-
-/*
----
-
-script: Request.Periodical.js
-
-name: Request.Periodical
-
-description: Requests the same URL to pull data from a server but increases the intervals if no data is returned to reduce the load
-
-license: MIT-style license
-
-authors:
-  - Christoph Pojer
-
-requires:
-  - Core/Request
-  - MooTools.More
-
-provides: [Request.Periodical]
-
-...
-*/
-
-Request.implement({
-
-	options: {
-		initialDelay: 5000,
-		delay: 5000,
-		limit: 60000
-	},
-
-	startTimer: function(data){
-		var fn = function(){
-			if (!this.running) this.send({data: data});
-		};
-		this.lastDelay = this.options.initialDelay;
-		this.timer = fn.delay(this.lastDelay, this);
-		this.completeCheck = function(response){
-			clearTimeout(this.timer);
-			this.lastDelay = (response) ? this.options.delay : (this.lastDelay + this.options.delay).min(this.options.limit);
-			this.timer = fn.delay(this.lastDelay, this);
-		};
-		return this.addEvent('complete', this.completeCheck);
-	},
-
-	stopTimer: function(){
-		clearTimeout(this.timer);
-		return this.removeEvent('complete', this.completeCheck);
-	}
-
-});
-
-/*
----
-
-script: Request.Queue.js
-
-name: Request.Queue
-
-description: Controls several instances of Request and its variants to run only one request at a time.
-
-license: MIT-style license
-
-authors:
-  - Aaron Newton
-
-requires:
-  - Core/Element
-  - Core/Request
-  - Class.Binds
-
-provides: [Request.Queue]
-
-...
-*/
-
-Request.Queue = new Class({
-
-	Implements: [Options, Events],
-
-	Binds: ['attach', 'request', 'complete', 'cancel', 'success', 'failure', 'exception'],
-
-	options: {/*
-		onRequest: function(argsPassedToOnRequest){},
-		onSuccess: function(argsPassedToOnSuccess){},
-		onComplete: function(argsPassedToOnComplete){},
-		onCancel: function(argsPassedToOnCancel){},
-		onException: function(argsPassedToOnException){},
-		onFailure: function(argsPassedToOnFailure){},
-		onEnd: function(){},
-		*/
-		stopOnFailure: true,
-		autoAdvance: true,
-		concurrent: 1,
-		requests: {}
-	},
-
-	initialize: function(options){
-		var requests;
-		if (options){
-			requests = options.requests;
-			delete options.requests;
-		}
-		this.setOptions(options);
-		this.requests = {};
-		this.queue = [];
-		this.reqBinders = {};
-
-		if (requests) this.addRequests(requests);
-	},
-
-	addRequest: function(name, request){
-		this.requests[name] = request;
-		this.attach(name, request);
-		return this;
-	},
-
-	addRequests: function(obj){
-		Object.each(obj, function(req, name){
-			this.addRequest(name, req);
-		}, this);
-		return this;
-	},
-
-	getName: function(req){
-		return Object.keyOf(this.requests, req);
-	},
-
-	attach: function(name, req){
-		if (req._groupSend) return this;
-		['request', 'complete', 'cancel', 'success', 'failure', 'exception'].each(function(evt){
-			if (!this.reqBinders[name]) this.reqBinders[name] = {};
-			this.reqBinders[name][evt] = function(){
-				this['on' + evt.capitalize()].apply(this, [name, req].append(arguments));
-			}.bind(this);
-			req.addEvent(evt, this.reqBinders[name][evt]);
-		}, this);
-		req._groupSend = req.send;
-		req.send = function(options){
-			this.send(name, options);
-			return req;
-		}.bind(this);
-		return this;
-	},
-
-	removeRequest: function(req){
-		var name = typeOf(req) == 'object' ? this.getName(req) : req;
-		if (!name && typeOf(name) != 'string') return this;
-		req = this.requests[name];
-		if (!req) return this;
-		['request', 'complete', 'cancel', 'success', 'failure', 'exception'].each(function(evt){
-			req.removeEvent(evt, this.reqBinders[name][evt]);
-		}, this);
-		req.send = req._groupSend;
-		delete req._groupSend;
-		return this;
-	},
-
-	getRunning: function(){
-		return Object.filter(this.requests, function(r){
-			return r.running;
-		});
-	},
-
-	isRunning: function(){
-		return !!(Object.keys(this.getRunning()).length);
-	},
-
-	send: function(name, options){
-		var q = function(){
-			this.requests[name]._groupSend(options);
-			this.queue.erase(q);
-		}.bind(this);
-
-		q.name = name;
-		if (Object.keys(this.getRunning()).length >= this.options.concurrent || (this.error && this.options.stopOnFailure)) this.queue.push(q);
-		else q();
-		return this;
-	},
-
-	hasNext: function(name){
-		return (!name) ? !!this.queue.length : !!this.queue.filter(function(q){ return q.name == name; }).length;
-	},
-
-	resume: function(){
-		this.error = false;
-		(this.options.concurrent - Object.keys(this.getRunning()).length).times(this.runNext, this);
-		return this;
-	},
-
-	runNext: function(name){
-		if (!this.queue.length) return this;
-		if (!name){
-			this.queue[0]();
-		} else {
-			var found;
-			this.queue.each(function(q){
-				if (!found && q.name == name){
-					found = true;
-					q();
-				}
-			});
-		}
-		return this;
-	},
-
-	runAll: function(){
-		this.queue.each(function(q){
-			q();
-		});
-		return this;
-	},
-
-	clear: function(name){
-		if (!name){
-			this.queue.empty();
-		} else {
-			this.queue = this.queue.map(function(q){
-				if (q.name != name) return q;
-				else return false;
-			}).filter(function(q){
-				return q;
-			});
-		}
-		return this;
-	},
-
-	cancel: function(name){
-		this.requests[name].cancel();
-		return this;
-	},
-
-	onRequest: function(){
-		this.fireEvent('request', arguments);
-	},
-
-	onComplete: function(){
-		this.fireEvent('complete', arguments);
-		if (!this.queue.length) this.fireEvent('end');
-	},
-
-	onCancel: function(){
-		if (this.options.autoAdvance && !this.error) this.runNext();
-		this.fireEvent('cancel', arguments);
-	},
-
-	onSuccess: function(){
-		if (this.options.autoAdvance && !this.error) this.runNext();
-		this.fireEvent('success', arguments);
-	},
-
-	onFailure: function(){
-		this.error = true;
-		if (!this.options.stopOnFailure && this.options.autoAdvance) this.runNext();
-		this.fireEvent('failure', arguments);
-	},
-
-	onException: function(){
-		this.error = true;
-		if (!this.options.stopOnFailure && this.options.autoAdvance) this.runNext();
-		this.fireEvent('exception', arguments);
-	}
-
-});
-
-/*
----
-
-script: Array.Extras.js
-
-name: Array.Extras
-
-description: Extends the Array native object to include useful methods to work with arrays.
-
-license: MIT-style license
-
-authors:
-  - Christoph Pojer
-  - Sebastian Markbåge
-
-requires:
-  - Core/Array
-  - MooTools.More
-
-provides: [Array.Extras]
-
-...
-*/
-
-(function(nil){
-
-Array.implement({
-
-	min: function(){
-		return Math.min.apply(null, this);
-	},
-
-	max: function(){
-		return Math.max.apply(null, this);
-	},
-
-	average: function(){
-		return this.length ? this.sum() / this.length : 0;
-	},
-
-	sum: function(){
-		var result = 0, l = this.length;
-		if (l){
-			while (l--){
-				if (this[l] != null) result += parseFloat(this[l]);
-			}
-		}
-		return result;
-	},
-
-	unique: function(){
-		return [].combine(this);
-	},
-
-	shuffle: function(){
-		for (var i = this.length; i && --i;){
-			var temp = this[i], r = Math.floor(Math.random() * ( i + 1 ));
-			this[i] = this[r];
-			this[r] = temp;
-		}
-		return this;
-	},
-
-	reduce: function(fn, value){
-		for (var i = 0, l = this.length; i < l; i++){
-			if (i in this) value = value === nil ? this[i] : fn.call(null, value, this[i], i, this);
-		}
-		return value;
-	},
-
-	reduceRight: function(fn, value){
-		var i = this.length;
-		while (i--){
-			if (i in this) value = value === nil ? this[i] : fn.call(null, value, this[i], i, this);
-		}
-		return value;
-	},
-
-	pluck: function(prop){
-		return this.map(function(item){
-			return item[prop];
-		});
-	}
-
-});
-
-})();
-
-/*
----
-
-script: Date.Extras.js
-
-name: Date.Extras
-
-description: Extends the Date native object to include extra methods (on top of those in Date.js).
-
-license: MIT-style license
-
-authors:
-  - Aaron Newton
-  - Scott Kyle
-
-requires:
-  - Date
-
-provides: [Date.Extras]
-
-...
-*/
-
-Date.implement({
-
-	timeDiffInWords: function(to){
-		return Date.distanceOfTimeInWords(this, to || new Date);
-	},
-
-	timeDiff: function(to, separator){
-		if (to == null) to = new Date;
-		var delta = ((to - this) / 1000).floor().abs();
-
-		var vals = [],
-			durations = [60, 60, 24, 365, 0],
-			names = ['s', 'm', 'h', 'd', 'y'],
-			value, duration;
-
-		for (var item = 0; item < durations.length; item++){
-			if (item && !delta) break;
-			value = delta;
-			if ((duration = durations[item])){
-				value = (delta % duration);
-				delta = (delta / duration).floor();
-			}
-			vals.unshift(value + (names[item] || ''));
-		}
-
-		return vals.join(separator || ':');
-	}
-
-}).extend({
-
-	distanceOfTimeInWords: function(from, to){
-		return Date.getTimePhrase(((to - from) / 1000).toInt());
-	},
-
-	getTimePhrase: function(delta){
-		var suffix = (delta < 0) ? 'Until' : 'Ago';
-		if (delta < 0) delta *= -1;
-
-		var units = {
-			minute: 60,
-			hour: 60,
-			day: 24,
-			week: 7,
-			month: 52 / 12,
-			year: 12,
-			eon: Infinity
-		};
-
-		var msg = 'lessThanMinute';
-
-		for (var unit in units){
-			var interval = units[unit];
-			if (delta < 1.5 * interval){
-				if (delta > 0.75 * interval) msg = unit;
-				break;
-			}
-			delta /= interval;
-			msg = unit + 's';
-		}
-
-		delta = delta.round();
-		return Date.getMsg(msg + suffix, delta).substitute({delta: delta});
-	}
-
-}).defineParsers(
-
-	{
-		// "today", "tomorrow", "yesterday"
-		re: /^(?:tod|tom|yes)/i,
-		handler: function(bits){
-			var d = new Date().clearTime();
-			switch (bits[0]){
-				case 'tom': return d.increment();
-				case 'yes': return d.decrement();
-				default: return d;
-			}
-		}
-	},
-
-	{
-		// "next Wednesday", "last Thursday"
-		re: /^(next|last) ([a-z]+)$/i,
-		handler: function(bits){
-			var d = new Date().clearTime();
-			var day = d.getDay();
-			var newDay = Date.parseDay(bits[2], true);
-			var addDays = newDay - day;
-			if (newDay <= day) addDays += 7;
-			if (bits[1] == 'last') addDays -= 7;
-			return d.set('date', d.getDate() + addDays);
-		}
-	}
-
-).alias('timeAgoInWords', 'timeDiffInWords');
-
-/*
----
-
-name: Hash
-
-description: Contains Hash Prototypes. Provides a means for overcoming the JavaScript practical impossibility of extending native Objects.
-
-license: MIT-style license.
-
-requires:
-  - Core/Object
-  - MooTools.More
-
-provides: [Hash]
-
-...
-*/
-
-(function(){
-
-if (this.Hash) return;
-
-var Hash = this.Hash = new Type('Hash', function(object){
-	if (typeOf(object) == 'hash') object = Object.clone(object.getClean());
-	for (var key in object) this[key] = object[key];
-	return this;
-});
-
-this.$H = function(object){
-	return new Hash(object);
-};
-
-Hash.implement({
-
-	forEach: function(fn, bind){
-		Object.forEach(this, fn, bind);
-	},
-
-	getClean: function(){
-		var clean = {};
-		for (var key in this){
-			if (this.hasOwnProperty(key)) clean[key] = this[key];
-		}
-		return clean;
-	},
-
-	getLength: function(){
-		var length = 0;
-		for (var key in this){
-			if (this.hasOwnProperty(key)) length++;
-		}
-		return length;
-	}
-
-});
-
-Hash.alias('each', 'forEach');
-
-Hash.implement({
-
-	has: Object.prototype.hasOwnProperty,
-
-	keyOf: function(value){
-		return Object.keyOf(this, value);
-	},
-
-	hasValue: function(value){
-		return Object.contains(this, value);
-	},
-
-	extend: function(properties){
-		Hash.each(properties || {}, function(value, key){
-			Hash.set(this, key, value);
-		}, this);
-		return this;
-	},
-
-	combine: function(properties){
-		Hash.each(properties || {}, function(value, key){
-			Hash.include(this, key, value);
-		}, this);
-		return this;
-	},
-
-	erase: function(key){
-		if (this.hasOwnProperty(key)) delete this[key];
-		return this;
-	},
-
-	get: function(key){
-		return (this.hasOwnProperty(key)) ? this[key] : null;
-	},
-
-	set: function(key, value){
-		if (!this[key] || this.hasOwnProperty(key)) this[key] = value;
-		return this;
-	},
-
-	empty: function(){
-		Hash.each(this, function(value, key){
-			delete this[key];
-		}, this);
-		return this;
-	},
-
-	include: function(key, value){
-		if (this[key] == undefined) this[key] = value;
-		return this;
-	},
-
-	map: function(fn, bind){
-		return new Hash(Object.map(this, fn, bind));
-	},
-
-	filter: function(fn, bind){
-		return new Hash(Object.filter(this, fn, bind));
-	},
-
-	every: function(fn, bind){
-		return Object.every(this, fn, bind);
-	},
-
-	some: function(fn, bind){
-		return Object.some(this, fn, bind);
-	},
-
-	getKeys: function(){
-		return Object.keys(this);
-	},
-
-	getValues: function(){
-		return Object.values(this);
-	},
-
-	toQueryString: function(base){
-		return Object.toQueryString(this, base);
-	}
-
-});
-
-Hash.alias({indexOf: 'keyOf', contains: 'hasValue'});
-
-
-})();
-
-
-/*
----
-
-script: Hash.Extras.js
-
-name: Hash.Extras
-
-description: Extends the Hash Type to include getFromPath which allows a path notation to child elements.
-
-license: MIT-style license
-
-authors:
-  - Aaron Newton
-
-requires:
-  - Hash
-  - Object.Extras
-
-provides: [Hash.Extras]
-
-...
-*/
-
-Hash.implement({
-
-	getFromPath: function(notation){
-		return Object.getFromPath(this, notation);
-	},
-
-	cleanValues: function(method){
-		return new Hash(Object.cleanValues(this, method));
-	},
-
-	run: function(){
-		Object.run(arguments);
-	}
-
-});
-
-/*
----
-name: Number.Format
-description: Extends the Number Type object to include a number formatting method.
-license: MIT-style license
-authors: [Arian Stolwijk]
-requires: [Core/Number, Locale.en-US.Number]
-# Number.Extras is for compatibility
-provides: [Number.Format, Number.Extras]
-...
-*/
-
-
-Number.implement({
-
-	format: function(options){
-		// Thanks dojo and YUI for some inspiration
-		var value = this;
-		options = options ? Object.clone(options) : {};
-		var getOption = function(key){
-			if (options[key] != null) return options[key];
-			return Locale.get('Number.' + key);
-		};
-
-		var negative = value < 0,
-			decimal = getOption('decimal'),
-			precision = getOption('precision'),
-			group = getOption('group'),
-			decimals = getOption('decimals');
-
-		if (negative){
-			var negativeLocale = getOption('negative') || {};
-			if (negativeLocale.prefix == null && negativeLocale.suffix == null) negativeLocale.prefix = '-';
-			['prefix', 'suffix'].each(function(key){
-				if (negativeLocale[key]) options[key] = getOption(key) + negativeLocale[key];
-			});
-
-			value = -value;
-		}
-
-		var prefix = getOption('prefix'),
-			suffix = getOption('suffix');
-
-		if (decimals !== '' && decimals >= 0 && decimals <= 20) value = value.toFixed(decimals);
-		if (precision >= 1 && precision <= 21) value = (+value).toPrecision(precision);
-
-		value += '';
-		var index;
-		if (getOption('scientific') === false && value.indexOf('e') > -1){
-			var match = value.split('e'),
-				zeros = +match[1];
-			value = match[0].replace('.', '');
-
-			if (zeros < 0){
-				zeros = -zeros - 1;
-				index = match[0].indexOf('.');
-				if (index > -1) zeros -= index - 1;
-				while (zeros--) value = '0' + value;
-				value = '0.' + value;
-			} else {
-				index = match[0].lastIndexOf('.');
-				if (index > -1) zeros -= match[0].length - index - 1;
-				while (zeros--) value += '0';
-			}
-		}
-
-		if (decimal != '.') value = value.replace('.', decimal);
-
-		if (group){
-			index = value.lastIndexOf(decimal);
-			index = (index > -1) ? index : value.length;
-			var newOutput = value.substring(index),
-				i = index;
-
-			while (i--){
-				if ((index - i - 1) % 3 == 0 && i != (index - 1)) newOutput = group + newOutput;
-				newOutput = value.charAt(i) + newOutput;
-			}
-
-			value = newOutput;
-		}
-
-		if (prefix) value = prefix + value;
-		if (suffix) value += suffix;
-
-		return value;
-	},
-
-	formatCurrency: function(decimals){
-		var locale = Locale.get('Number.currency') || {};
-		if (locale.scientific == null) locale.scientific = false;
-		locale.decimals = decimals != null ? decimals
-			: (locale.decimals == null ? 2 : locale.decimals);
-
-		return this.format(locale);
-	},
-
-	formatPercentage: function(decimals){
-		var locale = Locale.get('Number.percentage') || {};
-		if (locale.suffix == null) locale.suffix = '%';
-		locale.decimals = decimals != null ? decimals
-			: (locale.decimals == null ? 2 : locale.decimals);
-
-		return this.format(locale);
-	}
-
-});
-
-/*
----
-
-script: URI.js
-
-name: URI
-
-description: Provides methods useful in managing the window location and uris.
-
-license: MIT-style license
-
-authors:
-  - Sebastian Markbåge
-  - Aaron Newton
-
-requires:
-  - Core/Object
-  - Core/Class
-  - Core/Class.Extras
-  - Core/Element
-  - String.QueryString
-
-provides: [URI]
-
-...
-*/
-
-(function(){
-
-var toString = function(){
-	return this.get('value');
-};
-
-var URI = this.URI = new Class({
-
-	Implements: Options,
-
-	options: {
-		/*base: false*/
-	},
-
-	regex: /^(?:(\w+):)?(?:\/\/(?:(?:([^:@\/]*):?([^:@\/]*))?@)?(\[[A-Fa-f0-9:]+\]|[^:\/?#]*)(?::(\d*))?)?(\.\.?$|(?:[^?#\/]*\/)*)([^?#]*)(?:\?([^#]*))?(?:#(.*))?/,
-	parts: ['scheme', 'user', 'password', 'host', 'port', 'directory', 'file', 'query', 'fragment'],
-	schemes: {http: 80, https: 443, ftp: 21, rtsp: 554, mms: 1755, file: 0},
-
-	initialize: function(uri, options){
-		this.setOptions(options);
-		var base = this.options.base || URI.base;
-		if (!uri) uri = base;
-
-		if (uri && uri.parsed) this.parsed = Object.clone(uri.parsed);
-		else this.set('value', uri.href || uri.toString(), base ? new URI(base) : false);
-	},
-
-	parse: function(value, base){
-		var bits = value.match(this.regex);
-		if (!bits) return false;
-		bits.shift();
-		return this.merge(bits.associate(this.parts), base);
-	},
-
-	merge: function(bits, base){
-		if ((!bits || !bits.scheme) && (!base || !base.scheme)) return false;
-		if (base){
-			this.parts.every(function(part){
-				if (bits[part]) return false;
-				bits[part] = base[part] || '';
-				return true;
-			});
-		}
-		bits.port = bits.port || this.schemes[bits.scheme.toLowerCase()];
-		bits.directory = bits.directory ? this.parseDirectory(bits.directory, base ? base.directory : '') : '/';
-		return bits;
-	},
-
-	parseDirectory: function(directory, baseDirectory){
-		directory = (directory.substr(0, 1) == '/' ? '' : (baseDirectory || '/')) + directory;
-		if (!directory.test(URI.regs.directoryDot)) return directory;
-		var result = [];
-		directory.replace(URI.regs.endSlash, '').split('/').each(function(dir){
-			if (dir == '..' && result.length > 0) result.pop();
-			else if (dir != '.') result.push(dir);
-		});
-		return result.join('/') + '/';
-	},
-
-	combine: function(bits){
-		return bits.value || bits.scheme + '://' +
-			(bits.user ? bits.user + (bits.password ? ':' + bits.password : '') + '@' : '') +
-			(bits.host || '') + (bits.port && bits.port != this.schemes[bits.scheme] ? ':' + bits.port : '') +
-			(bits.directory || '/') + (bits.file || '') +
-			(bits.query ? '?' + bits.query : '') +
-			(bits.fragment ? '#' + bits.fragment : '');
-	},
-
-	set: function(part, value, base){
-		if (part == 'value'){
-			var scheme = value.match(URI.regs.scheme);
-			if (scheme) scheme = scheme[1];
-			if (scheme && this.schemes[scheme.toLowerCase()] == null) this.parsed = { scheme: scheme, value: value };
-			else this.parsed = this.parse(value, (base || this).parsed) || (scheme ? { scheme: scheme, value: value } : { value: value });
-		} else if (part == 'data'){
-			this.setData(value);
-		} else {
-			this.parsed[part] = value;
-		}
-		return this;
-	},
-
-	get: function(part, base){
-		switch (part){
-			case 'value': return this.combine(this.parsed, base ? base.parsed : false);
-			case 'data' : return this.getData();
-		}
-		return this.parsed[part] || '';
-	},
-
-	go: function(){
-		document.location.href = this.toString();
-	},
-
-	toURI: function(){
-		return this;
-	},
-
-	getData: function(key, part){
-		var qs = this.get(part || 'query');
-		if (!(qs || qs === 0)) return key ? null : {};
-		var obj = qs.parseQueryString();
-		return key ? obj[key] : obj;
-	},
-
-	setData: function(values, merge, part){
-		if (typeof values == 'string'){
-			var data = this.getData();
-			data[arguments[0]] = arguments[1];
-			values = data;
-		} else if (merge){
-			values = Object.merge(this.getData(null, part), values);
-		}
-		return this.set(part || 'query', Object.toQueryString(values));
-	},
-
-	clearData: function(part){
-		return this.set(part || 'query', '');
-	},
-
-	toString: toString,
-	valueOf: toString
-
-});
-
-URI.regs = {
-	endSlash: /\/$/,
-	scheme: /^(\w+):/,
-	directoryDot: /\.\/|\.$/
-};
-
-URI.base = new URI(Array.convert(document.getElements('base[href]', true)).getLast(), {base: document.location});
-
-String.implement({
-
-	toURI: function(options){
-		return new URI(this, options);
-	}
-
-});
-
-})();
-
-/*
----
-
-script: URI.Relative.js
-
-name: URI.Relative
-
-description: Extends the URI class to add methods for computing relative and absolute urls.
-
-license: MIT-style license
-
-authors:
-  - Sebastian Markbåge
-
-
-requires:
-  - Class.refactor
-  - URI
-
-provides: [URI.Relative]
-
-...
-*/
-
-URI = Class.refactor(URI, {
-
-	combine: function(bits, base){
-		if (!base || bits.scheme != base.scheme || bits.host != base.host || bits.port != base.port)
-			return this.previous.apply(this, arguments);
-		var end = bits.file + (bits.query ? '?' + bits.query : '') + (bits.fragment ? '#' + bits.fragment : '');
-
-		if (!base.directory) return (bits.directory || (bits.file ? '' : './')) + end;
-
-		var baseDir = base.directory.split('/'),
-			relDir = bits.directory.split('/'),
-			path = '',
-			offset;
-
-		var i = 0;
-		for (offset = 0; offset < baseDir.length && offset < relDir.length && baseDir[offset] == relDir[offset]; offset++);
-		for (i = 0; i < baseDir.length - offset - 1; i++) path += '../';
-		for (i = offset; i < relDir.length - 1; i++) path += relDir[i] + '/';
-
-		return (path || (bits.file ? '' : './')) + end;
-	},
-
-	toAbsolute: function(base){
-		base = new URI(base);
-		if (base) base.set('directory', '').set('file', '');
-		return this.toRelative(base);
-	},
-
-	toRelative: function(base){
-		return this.get('value', new URI(base));
-	}
-
-});
-
-/*
----
-
-script: Assets.js
-
-name: Assets
-
-description: Provides methods to dynamically load JavaScript, CSS, and Image files into the document.
-
-license: MIT-style license
-
-authors:
-  - Valerio Proietti
-
-requires:
-  - Core/Element.Event
-  - MooTools.More
-
-provides: [Assets, Asset.javascript, Asset.css, Asset.image, Asset.images]
-
-...
-*/
-;(function(){
-
-var Asset = this.Asset = {
-
-	javascript: function(source, properties){
-		if (!properties) properties = {};
-
-		var script = new Element('script', {src: source, type: 'text/javascript'}),
-			doc = properties.document || document,
-			load = properties.onload || properties.onLoad;
-
-		delete properties.onload;
-		delete properties.onLoad;
-		delete properties.document;
-
-		if (load){
-			if (!script.addEventListener){
-				script.addEvent('readystatechange', function(){
-					if (['loaded', 'complete'].contains(this.readyState)) load.call(this);
-				});
-			} else {
-				script.addEvent('load', load);
-			}
-		}
-
-		return script.set(properties).inject(doc.head);
-	},
-
-	css: function(source, properties){
-		if (!properties) properties = {};
-
-		var load = properties.onload || properties.onLoad,
-			doc = properties.document || document,
-			timeout = properties.timeout || 3000;
-
-		['onload', 'onLoad', 'document'].each(function(prop){
-			delete properties[prop];
-		});
-
-		var link = new Element('link', {
-			type: 'text/css',
-			rel: 'stylesheet',
-			media: 'screen',
-			href: source
-		}).setProperties(properties).inject(doc.head);
-
-		if (load){
-			// based on article at http://www.yearofmoo.com/2011/03/cross-browser-stylesheet-preloading.html
-			var loaded = false, retries = 0;
-			var check = function(){
-				var stylesheets = document.styleSheets;
-				for (var i = 0; i < stylesheets.length; i++){
-					var file = stylesheets[i];
-					var owner = file.ownerNode ? file.ownerNode : file.owningElement;
-					if (owner && owner == link){
-						loaded = true;
-						return load.call(link);
-					}
-				}
-				retries++;
-				if (!loaded && retries < timeout / 50) return setTimeout(check, 50);
-			};
-			setTimeout(check, 0);
-		}
-		return link;
-	},
-
-	image: function(source, properties){
-		if (!properties) properties = {};
-
-		var image = new Image(),
-			element = document.id(image) || new Element('img');
-
-		['load', 'abort', 'error'].each(function(name){
-			var type = 'on' + name,
-				cap = 'on' + name.capitalize(),
-				event = properties[type] || properties[cap] || function(){};
-
-			delete properties[cap];
-			delete properties[type];
-
-			image[type] = function(){
-				if (!image) return;
-				if (!element.parentNode){
-					element.width = image.width;
-					element.height = image.height;
-				}
-				image = image.onload = image.onabort = image.onerror = null;
-				event.delay(1, element, element);
-				element.fireEvent(name, element, 1);
-			};
-		});
-
-		image.src = element.src = source;
-		if (image && image.complete) image.onload.delay(1);
-		return element.set(properties);
-	},
-
-	images: function(sources, options){
-		sources = Array.convert(sources);
-
-		var fn = function(){},
-			counter = 0;
-
-		options = Object.merge({
-			onComplete: fn,
-			onProgress: fn,
-			onError: fn,
-			properties: {}
-		}, options);
-
-		return new Elements(sources.map(function(source, index){
-			return Asset.image(source, Object.append(options.properties, {
-				onload: function(){
-					counter++;
-					options.onProgress.call(this, counter, index, source);
-					if (counter == sources.length) options.onComplete();
-				},
-				onerror: function(){
-					counter++;
-					options.onError.call(this, counter, index, source);
-					if (counter == sources.length) options.onComplete();
-				}
-			}));
-		}));
-	}
-
-};
-
-})();
-
-/*
----
-
-script: Color.js
-
-name: Color
-
-description: Class for creating and manipulating colors in JavaScript. Supports HSB -> RGB Conversions and vice versa.
-
-license: MIT-style license
-
-authors:
-  - Valerio Proietti
-
-requires:
-  - Core/Array
-  - Core/String
-  - Core/Number
-  - Core/Hash
-  - Core/Function
-  - MooTools.More
-
-provides: [Color]
-
-...
-*/
-
-(function(){
-
-var Color = this.Color = new Type('Color', function(color, type){
-	if (arguments.length >= 3){
-		type = 'rgb'; color = Array.slice(arguments, 0, 3);
-	} else if (typeof color == 'string'){
-		if (color.match(/rgb/)) color = color.rgbToHex().hexToRgb(true);
-		else if (color.match(/hsb/)) color = color.hsbToRgb();
-		else color = color.hexToRgb(true);
-	}
-	type = type || 'rgb';
-	switch (type){
-		case 'hsb':
-			var old = color;
-			color = color.hsbToRgb();
-			color.hsb = old;
-			break;
-		case 'hex': color = color.hexToRgb(true); break;
-	}
-	color.rgb = color.slice(0, 3);
-	color.hsb = color.hsb || color.rgbToHsb();
-	color.hex = color.rgbToHex();
-	return Object.append(color, this);
-});
-
-Color.implement({
-
-	mix: function(){
-		var colors = Array.slice(arguments);
-		var alpha = (typeOf(colors.getLast()) == 'number') ? colors.pop() : 50;
-		var rgb = this.slice();
-		colors.each(function(color){
-			color = new Color(color);
-			for (var i = 0; i < 3; i++) rgb[i] = Math.round((rgb[i] / 100 * (100 - alpha)) + (color[i] / 100 * alpha));
-		});
-		return new Color(rgb, 'rgb');
-	},
-
-	invert: function(){
-		return new Color(this.map(function(value){
-			return 255 - value;
-		}));
-	},
-
-	setHue: function(value){
-		return new Color([value, this.hsb[1], this.hsb[2]], 'hsb');
-	},
-
-	setSaturation: function(percent){
-		return new Color([this.hsb[0], percent, this.hsb[2]], 'hsb');
-	},
-
-	setBrightness: function(percent){
-		return new Color([this.hsb[0], this.hsb[1], percent], 'hsb');
-	}
-
-});
-
-this.$RGB = function(r, g, b){
-	return new Color([r, g, b], 'rgb');
-};
-
-this.$HSB = function(h, s, b){
-	return new Color([h, s, b], 'hsb');
-};
-
-this.$HEX = function(hex){
-	return new Color(hex, 'hex');
-};
-
-Array.implement({
-
-	rgbToHsb: function(){
-		var red = this[0],
-			green = this[1],
-			blue = this[2],
-			hue = 0,
-			max = Math.max(red, green, blue),
-			min = Math.min(red, green, blue),
-			delta = max - min,
-			brightness = max / 255,
-			saturation = (max != 0) ? delta / max : 0;
-
-		if (saturation != 0){
-			var rr = (max - red) / delta;
-			var gr = (max - green) / delta;
-			var br = (max - blue) / delta;
-			if (red == max) hue = br - gr;
-			else if (green == max) hue = 2 + rr - br;
-			else hue = 4 + gr - rr;
-			hue /= 6;
-			if (hue < 0) hue++;
-		}
-		return [Math.round(hue * 360), Math.round(saturation * 100), Math.round(brightness * 100)];
-	},
-
-	hsbToRgb: function(){
-		var br = Math.round(this[2] / 100 * 255);
-		if (this[1] == 0){
-			return [br, br, br];
-		} else {
-			var hue = this[0] % 360;
-			var f = hue % 60;
-			var p = Math.round((this[2] * (100 - this[1])) / 10000 * 255);
-			var q = Math.round((this[2] * (6000 - this[1] * f)) / 600000 * 255);
-			var t = Math.round((this[2] * (6000 - this[1] * (60 - f))) / 600000 * 255);
-			switch (Math.floor(hue / 60)){
-				case 0: return [br, t, p];
-				case 1: return [q, br, p];
-				case 2: return [p, br, t];
-				case 3: return [p, q, br];
-				case 4: return [t, p, br];
-				case 5: return [br, p, q];
-			}
-		}
-		return false;
-	}
-
-});
-
-String.implement({
-
-	rgbToHsb: function(){
-		var rgb = this.match(/\d{1,3}/g);
-		return (rgb) ? rgb.rgbToHsb() : null;
-	},
-
-	hsbToRgb: function(){
-		var hsb = this.match(/\d{1,3}/g);
-		return (hsb) ? hsb.hsbToRgb() : null;
-	}
-
-});
-
-})();
-
-
-/*
----
-
-script: Group.js
-
-name: Group
-
-description: Class for monitoring collections of events
-
-license: MIT-style license
-
-authors:
-  - Valerio Proietti
-
-requires:
-  - Core/Events
-  - MooTools.More
-
-provides: [Group]
-
-...
-*/
-
-(function(){
-
-var Group = this.Group = new Class({
-
-	initialize: function(){
-		this.instances = Array.flatten(arguments);
-	},
-
-	addEvent: function(type, fn){
-		var instances = this.instances,
-			len = instances.length,
-			togo = len,
-			args = new Array(len),
-			self = this;
-
-		instances.each(function(instance, i){
-			instance.addEvent(type, function(){
-				if (!args[i]) togo--;
-				args[i] = arguments;
-				if (!togo){
-					fn.call(self, instances, instance, args);
-					togo = len;
-					args = new Array(len);
-				}
-			});
-		});
-	}
-
-});
-
-})();
-
-/*
----
-
-script: Hash.Cookie.js
-
-name: Hash.Cookie
-
-description: Class for creating, reading, and deleting Cookies in JSON format.
-
-license: MIT-style license
-
-authors:
-  - Valerio Proietti
-  - Aaron Newton
-
-requires:
-  - Core/Cookie
-  - Core/JSON
-  - MooTools.More
-  - Hash
-
-provides: [Hash.Cookie]
-
-...
-*/
-
-Hash.Cookie = new Class({
-
-	Extends: Cookie,
-
-	options: {
-		autoSave: true
-	},
-
-	initialize: function(name, options){
-		this.parent(name, options);
-		this.load();
-	},
-
-	save: function(){
-		var value = JSON.encode(this.hash);
-		if (!value || value.length > 4096) return false; //cookie would be truncated!
-		if (value == '{}') this.dispose();
-		else this.write(value);
-		return true;
-	},
-
-	load: function(){
-		this.hash = new Hash(JSON.decode(this.read(), true));
-		return this;
-	}
-
-});
-
-Hash.each(Hash.prototype, function(method, name){
-	if (typeof method == 'function') Hash.Cookie.implement(name, function(){
-		var value = method.apply(this.hash, arguments);
-		if (this.options.autoSave) this.save();
-		return value;
-	});
-});
-
-/*
----
-
-name: Swiff
-
-description: Wrapper for embedding SWF movies. Supports External Interface Communication.
-
-license: MIT-style license.
-
-credits:
-  - Flash detection & Internet Explorer + Flash Player 9 fix inspired by SWFObject.
-
-requires: [Core/Options, Core/Object, Core/Element]
-
-provides: Swiff
-
-...
-*/
-
-(function(){
-
-var Swiff = this.Swiff = new Class({
-
-	Implements: Options,
-
-	options: {
-		id: null,
-		height: 1,
-		width: 1,
-		container: null,
-		properties: {},
-		params: {
-			quality: 'high',
-			allowScriptAccess: 'always',
-			wMode: 'window',
-			swLiveConnect: true
-		},
-		callBacks: {},
-		vars: {}
-	},
-
-	toElement: function(){
-		return this.object;
-	},
-
-	initialize: function(path, options){
-		this.instance = 'Swiff_' + String.uniqueID();
-
-		this.setOptions(options);
-		options = this.options;
-		var id = this.id = options.id || this.instance;
-		var container = document.id(options.container);
-
-		Swiff.CallBacks[this.instance] = {};
-
-		var params = options.params, vars = options.vars, callBacks = options.callBacks;
-		var properties = Object.append({height: options.height, width: options.width}, options.properties);
-
-		var self = this;
-
-		for (var callBack in callBacks){
-			Swiff.CallBacks[this.instance][callBack] = (function(option){
-				return function(){
-					return option.apply(self.object, arguments);
-				};
-			})(callBacks[callBack]);
-			vars[callBack] = 'Swiff.CallBacks.' + this.instance + '.' + callBack;
-		}
-
-		params.flashVars = Object.toQueryString(vars);
-		if ('ActiveXObject' in window){
-			properties.classid = 'clsid:D27CDB6E-AE6D-11cf-96B8-444553540000';
-			params.movie = path;
-		} else {
-			properties.type = 'application/x-shockwave-flash';
-		}
-		properties.data = path;
-
-		var build = '<object id="' + id + '"';
-		for (var property in properties) build += ' ' + property + '="' + properties[property] + '"';
-		build += '>';
-		for (var param in params){
-			if (params[param]) build += '<param name="' + param + '" value="' + params[param] + '" />';
-		}
-		build += '</object>';
-		this.object = ((container) ? container.empty() : new Element('div')).set('html', build).firstChild;
-	},
-
-	replaces: function(element){
-		element = document.id(element, true);
-		element.parentNode.replaceChild(this.toElement(), element);
-		return this;
-	},
-
-	inject: function(element){
-		document.id(element, true).appendChild(this.toElement());
-		return this;
-	},
-
-	remote: function(){
-		return Swiff.remote.apply(Swiff, [this.toElement()].append(arguments));
-	}
-
-});
-
-Swiff.CallBacks = {};
-
-Swiff.remote = function(obj, fn){
-	var rs = obj.CallFunction('<invoke name="' + fn + '" returntype="javascript">' + __flash__argumentsToXML(arguments, 2) + '</invoke>');
-	return eval(rs);
-};
-
-})();
-
-/*
----
-name: Table
-description: LUA-Style table implementation.
-license: MIT-style license
-authors:
-  - Valerio Proietti
-requires: [Core/Array]
-provides: [Table]
-...
-*/
-
-(function(){
-
-var Table = this.Table = function(){
-
-	this.length = 0;
-	var keys = [],
-		values = [];
-
-	this.set = function(key, value){
-		var index = keys.indexOf(key);
-		if (index == -1){
-			var length = keys.length;
-			keys[length] = key;
-			values[length] = value;
-			this.length++;
-		} else {
-			values[index] = value;
-		}
-		return this;
-	};
-
-	this.get = function(key){
-		var index = keys.indexOf(key);
-		return (index == -1) ? null : values[index];
-	};
-
-	this.erase = function(key){
-		var index = keys.indexOf(key);
-		if (index != -1){
-			this.length--;
-			keys.splice(index, 1);
-			return values.splice(index, 1)[0];
-		}
-		return null;
-	};
-
-	this.each = this.forEach = function(fn, bind){
-		for (var i = 0, l = this.length; i < l; i++) fn.call(bind, keys[i], values[i], this);
-	};
-
-};
-
-if (this.Type) new Type('Table', Table);
-
-})();
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/libraries/jquery-1.12.4.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/libraries/jquery-1.12.4.js
deleted file mode 100644
index 7fc60fc..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/libraries/jquery-1.12.4.js
+++ /dev/null
@@ -1,11008 +0,0 @@
-/*!
- * jQuery JavaScript Library v1.12.4
- * http://jquery.com/
- *
- * Includes Sizzle.js
- * http://sizzlejs.com/
- *
- * Copyright jQuery Foundation and other contributors
- * Released under the MIT license
- * http://jquery.org/license
- *
- * Date: 2016-05-20T17:17Z
- */
-
-(function( global, factory ) {
-
-	if ( typeof module === "object" && typeof module.exports === "object" ) {
-		// For CommonJS and CommonJS-like environments where a proper `window`
-		// is present, execute the factory and get jQuery.
-		// For environments that do not have a `window` with a `document`
-		// (such as Node.js), expose a factory as module.exports.
-		// This accentuates the need for the creation of a real `window`.
-		// e.g. var jQuery = require("jquery")(window);
-		// See ticket #14549 for more info.
-		module.exports = global.document ?
-			factory( global, true ) :
-			function( w ) {
-				if ( !w.document ) {
-					throw new Error( "jQuery requires a window with a document" );
-				}
-				return factory( w );
-			};
-	} else {
-		factory( global );
-	}
-
-// Pass this if window is not defined yet
-}(typeof window !== "undefined" ? window : this, function( window, noGlobal ) {
-
-// Support: Firefox 18+
-// Can't be in strict mode, several libs including ASP.NET trace
-// the stack via arguments.caller.callee and Firefox dies if
-// you try to trace through "use strict" call chains. (#13335)
-//"use strict";
-var deletedIds = [];
-
-var document = window.document;
-
-var slice = deletedIds.slice;
-
-var concat = deletedIds.concat;
-
-var push = deletedIds.push;
-
-var indexOf = deletedIds.indexOf;
-
-var class2type = {};
-
-var toString = class2type.toString;
-
-var hasOwn = class2type.hasOwnProperty;
-
-var support = {};
-
-
-
-var
-	version = "1.12.4",
-
-	// Define a local copy of jQuery
-	jQuery = function( selector, context ) {
-
-		// The jQuery object is actually just the init constructor 'enhanced'
-		// Need init if jQuery is called (just allow error to be thrown if not included)
-		return new jQuery.fn.init( selector, context );
-	},
-
-	// Support: Android<4.1, IE<9
-	// Make sure we trim BOM and NBSP
-	rtrim = /^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,
-
-	// Matches dashed string for camelizing
-	rmsPrefix = /^-ms-/,
-	rdashAlpha = /-([\da-z])/gi,
-
-	// Used by jQuery.camelCase as callback to replace()
-	fcamelCase = function( all, letter ) {
-		return letter.toUpperCase();
-	};
-
-jQuery.fn = jQuery.prototype = {
-
-	// The current version of jQuery being used
-	jquery: version,
-
-	constructor: jQuery,
-
-	// Start with an empty selector
-	selector: "",
-
-	// The default length of a jQuery object is 0
-	length: 0,
-
-	toArray: function() {
-		return slice.call( this );
-	},
-
-	// Get the Nth element in the matched element set OR
-	// Get the whole matched element set as a clean array
-	get: function( num ) {
-		return num != null ?
-
-			// Return just the one element from the set
-			( num < 0 ? this[ num + this.length ] : this[ num ] ) :
-
-			// Return all the elements in a clean array
-			slice.call( this );
-	},
-
-	// Take an array of elements and push it onto the stack
-	// (returning the new matched element set)
-	pushStack: function( elems ) {
-
-		// Build a new jQuery matched element set
-		var ret = jQuery.merge( this.constructor(), elems );
-
-		// Add the old object onto the stack (as a reference)
-		ret.prevObject = this;
-		ret.context = this.context;
-
-		// Return the newly-formed element set
-		return ret;
-	},
-
-	// Execute a callback for every element in the matched set.
-	each: function( callback ) {
-		return jQuery.each( this, callback );
-	},
-
-	map: function( callback ) {
-		return this.pushStack( jQuery.map( this, function( elem, i ) {
-			return callback.call( elem, i, elem );
-		} ) );
-	},
-
-	slice: function() {
-		return this.pushStack( slice.apply( this, arguments ) );
-	},
-
-	first: function() {
-		return this.eq( 0 );
-	},
-
-	last: function() {
-		return this.eq( -1 );
-	},
-
-	eq: function( i ) {
-		var len = this.length,
-			j = +i + ( i < 0 ? len : 0 );
-		return this.pushStack( j >= 0 && j < len ? [ this[ j ] ] : [] );
-	},
-
-	end: function() {
-		return this.prevObject || this.constructor();
-	},
-
-	// For internal use only.
-	// Behaves like an Array's method, not like a jQuery method.
-	push: push,
-	sort: deletedIds.sort,
-	splice: deletedIds.splice
-};
-
-jQuery.extend = jQuery.fn.extend = function() {
-	var src, copyIsArray, copy, name, options, clone,
-		target = arguments[ 0 ] || {},
-		i = 1,
-		length = arguments.length,
-		deep = false;
-
-	// Handle a deep copy situation
-	if ( typeof target === "boolean" ) {
-		deep = target;
-
-		// skip the boolean and the target
-		target = arguments[ i ] || {};
-		i++;
-	}
-
-	// Handle case when target is a string or something (possible in deep copy)
-	if ( typeof target !== "object" && !jQuery.isFunction( target ) ) {
-		target = {};
-	}
-
-	// extend jQuery itself if only one argument is passed
-	if ( i === length ) {
-		target = this;
-		i--;
-	}
-
-	for ( ; i < length; i++ ) {
-
-		// Only deal with non-null/undefined values
-		if ( ( options = arguments[ i ] ) != null ) {
-
-			// Extend the base object
-			for ( name in options ) {
-				src = target[ name ];
-				copy = options[ name ];
-
-				// Prevent never-ending loop
-				if ( target === copy ) {
-					continue;
-				}
-
-				// Recurse if we're merging plain objects or arrays
-				if ( deep && copy && ( jQuery.isPlainObject( copy ) ||
-					( copyIsArray = jQuery.isArray( copy ) ) ) ) {
-
-					if ( copyIsArray ) {
-						copyIsArray = false;
-						clone = src && jQuery.isArray( src ) ? src : [];
-
-					} else {
-						clone = src && jQuery.isPlainObject( src ) ? src : {};
-					}
-
-					// Never move original objects, clone them
-					target[ name ] = jQuery.extend( deep, clone, copy );
-
-				// Don't bring in undefined values
-				} else if ( copy !== undefined ) {
-					target[ name ] = copy;
-				}
-			}
-		}
-	}
-
-	// Return the modified object
-	return target;
-};
-
-jQuery.extend( {
-
-	// Unique for each copy of jQuery on the page
-	expando: "jQuery" + ( version + Math.random() ).replace( /\D/g, "" ),
-
-	// Assume jQuery is ready without the ready module
-	isReady: true,
-
-	error: function( msg ) {
-		throw new Error( msg );
-	},
-
-	noop: function() {},
-
-	// See test/unit/core.js for details concerning isFunction.
-	// Since version 1.3, DOM methods and functions like alert
-	// aren't supported. They return false on IE (#2968).
-	isFunction: function( obj ) {
-		return jQuery.type( obj ) === "function";
-	},
-
-	isArray: Array.isArray || function( obj ) {
-		return jQuery.type( obj ) === "array";
-	},
-
-	isWindow: function( obj ) {
-		/* jshint eqeqeq: false */
-		return obj != null && obj == obj.window;
-	},
-
-	isNumeric: function( obj ) {
-
-		// parseFloat NaNs numeric-cast false positives (null|true|false|"")
-		// ...but misinterprets leading-number strings, particularly hex literals ("0x...")
-		// subtraction forces infinities to NaN
-		// adding 1 corrects loss of precision from parseFloat (#15100)
-		var realStringObj = obj && obj.toString();
-		return !jQuery.isArray( obj ) && ( realStringObj - parseFloat( realStringObj ) + 1 ) >= 0;
-	},
-
-	isEmptyObject: function( obj ) {
-		var name;
-		for ( name in obj ) {
-			return false;
-		}
-		return true;
-	},
-
-	isPlainObject: function( obj ) {
-		var key;
-
-		// Must be an Object.
-		// Because of IE, we also have to check the presence of the constructor property.
-		// Make sure that DOM nodes and window objects don't pass through, as well
-		if ( !obj || jQuery.type( obj ) !== "object" || obj.nodeType || jQuery.isWindow( obj ) ) {
-			return false;
-		}
-
-		try {
-
-			// Not own constructor property must be Object
-			if ( obj.constructor &&
-				!hasOwn.call( obj, "constructor" ) &&
-				!hasOwn.call( obj.constructor.prototype, "isPrototypeOf" ) ) {
-				return false;
-			}
-		} catch ( e ) {
-
-			// IE8,9 Will throw exceptions on certain host objects #9897
-			return false;
-		}
-
-		// Support: IE<9
-		// Handle iteration over inherited properties before own properties.
-		if ( !support.ownFirst ) {
-			for ( key in obj ) {
-				return hasOwn.call( obj, key );
-			}
-		}
-
-		// Own properties are enumerated firstly, so to speed up,
-		// if last one is own, then all properties are own.
-		for ( key in obj ) {}
-
-		return key === undefined || hasOwn.call( obj, key );
-	},
-
-	type: function( obj ) {
-		if ( obj == null ) {
-			return obj + "";
-		}
-		return typeof obj === "object" || typeof obj === "function" ?
-			class2type[ toString.call( obj ) ] || "object" :
-			typeof obj;
-	},
-
-	// Workarounds based on findings by Jim Driscoll
-	// http://weblogs.java.net/blog/driscoll/archive/2009/09/08/eval-javascript-global-context
-	globalEval: function( data ) {
-		if ( data && jQuery.trim( data ) ) {
-
-			// We use execScript on Internet Explorer
-			// We use an anonymous function so that context is window
-			// rather than jQuery in Firefox
-			( window.execScript || function( data ) {
-				window[ "eval" ].call( window, data ); // jscs:ignore requireDotNotation
-			} )( data );
-		}
-	},
-
-	// Convert dashed to camelCase; used by the css and data modules
-	// Microsoft forgot to hump their vendor prefix (#9572)
-	camelCase: function( string ) {
-		return string.replace( rmsPrefix, "ms-" ).replace( rdashAlpha, fcamelCase );
-	},
-
-	nodeName: function( elem, name ) {
-		return elem.nodeName && elem.nodeName.toLowerCase() === name.toLowerCase();
-	},
-
-	each: function( obj, callback ) {
-		var length, i = 0;
-
-		if ( isArrayLike( obj ) ) {
-			length = obj.length;
-			for ( ; i < length; i++ ) {
-				if ( callback.call( obj[ i ], i, obj[ i ] ) === false ) {
-					break;
-				}
-			}
-		} else {
-			for ( i in obj ) {
-				if ( callback.call( obj[ i ], i, obj[ i ] ) === false ) {
-					break;
-				}
-			}
-		}
-
-		return obj;
-	},
-
-	// Support: Android<4.1, IE<9
-	trim: function( text ) {
-		return text == null ?
-			"" :
-			( text + "" ).replace( rtrim, "" );
-	},
-
-	// results is for internal usage only
-	makeArray: function( arr, results ) {
-		var ret = results || [];
-
-		if ( arr != null ) {
-			if ( isArrayLike( Object( arr ) ) ) {
-				jQuery.merge( ret,
-					typeof arr === "string" ?
-					[ arr ] : arr
-				);
-			} else {
-				push.call( ret, arr );
-			}
-		}
-
-		return ret;
-	},
-
-	inArray: function( elem, arr, i ) {
-		var len;
-
-		if ( arr ) {
-			if ( indexOf ) {
-				return indexOf.call( arr, elem, i );
-			}
-
-			len = arr.length;
-			i = i ? i < 0 ? Math.max( 0, len + i ) : i : 0;
-
-			for ( ; i < len; i++ ) {
-
-				// Skip accessing in sparse arrays
-				if ( i in arr && arr[ i ] === elem ) {
-					return i;
-				}
-			}
-		}
-
-		return -1;
-	},
-
-	merge: function( first, second ) {
-		var len = +second.length,
-			j = 0,
-			i = first.length;
-
-		while ( j < len ) {
-			first[ i++ ] = second[ j++ ];
-		}
-
-		// Support: IE<9
-		// Workaround casting of .length to NaN on otherwise arraylike objects (e.g., NodeLists)
-		if ( len !== len ) {
-			while ( second[ j ] !== undefined ) {
-				first[ i++ ] = second[ j++ ];
-			}
-		}
-
-		first.length = i;
-
-		return first;
-	},
-
-	grep: function( elems, callback, invert ) {
-		var callbackInverse,
-			matches = [],
-			i = 0,
-			length = elems.length,
-			callbackExpect = !invert;
-
-		// Go through the array, only saving the items
-		// that pass the validator function
-		for ( ; i < length; i++ ) {
-			callbackInverse = !callback( elems[ i ], i );
-			if ( callbackInverse !== callbackExpect ) {
-				matches.push( elems[ i ] );
-			}
-		}
-
-		return matches;
-	},
-
-	// arg is for internal usage only
-	map: function( elems, callback, arg ) {
-		var length, value,
-			i = 0,
-			ret = [];
-
-		// Go through the array, translating each of the items to their new values
-		if ( isArrayLike( elems ) ) {
-			length = elems.length;
-			for ( ; i < length; i++ ) {
-				value = callback( elems[ i ], i, arg );
-
-				if ( value != null ) {
-					ret.push( value );
-				}
-			}
-
-		// Go through every key on the object,
-		} else {
-			for ( i in elems ) {
-				value = callback( elems[ i ], i, arg );
-
-				if ( value != null ) {
-					ret.push( value );
-				}
-			}
-		}
-
-		// Flatten any nested arrays
-		return concat.apply( [], ret );
-	},
-
-	// A global GUID counter for objects
-	guid: 1,
-
-	// Bind a function to a context, optionally partially applying any
-	// arguments.
-	proxy: function( fn, context ) {
-		var args, proxy, tmp;
-
-		if ( typeof context === "string" ) {
-			tmp = fn[ context ];
-			context = fn;
-			fn = tmp;
-		}
-
-		// Quick check to determine if target is callable, in the spec
-		// this throws a TypeError, but we will just return undefined.
-		if ( !jQuery.isFunction( fn ) ) {
-			return undefined;
-		}
-
-		// Simulated bind
-		args = slice.call( arguments, 2 );
-		proxy = function() {
-			return fn.apply( context || this, args.concat( slice.call( arguments ) ) );
-		};
-
-		// Set the guid of unique handler to the same of original handler, so it can be removed
-		proxy.guid = fn.guid = fn.guid || jQuery.guid++;
-
-		return proxy;
-	},
-
-	now: function() {
-		return +( new Date() );
-	},
-
-	// jQuery.support is not used in Core but other projects attach their
-	// properties to it so it needs to exist.
-	support: support
-} );
-
-// JSHint would error on this code due to the Symbol not being defined in ES5.
-// Defining this global in .jshintrc would create a danger of using the global
-// unguarded in another place, it seems safer to just disable JSHint for these
-// three lines.
-/* jshint ignore: start */
-if ( typeof Symbol === "function" ) {
-	jQuery.fn[ Symbol.iterator ] = deletedIds[ Symbol.iterator ];
-}
-/* jshint ignore: end */
-
-// Populate the class2type map
-jQuery.each( "Boolean Number String Function Array Date RegExp Object Error Symbol".split( " " ),
-function( i, name ) {
-	class2type[ "[object " + name + "]" ] = name.toLowerCase();
-} );
-
-function isArrayLike( obj ) {
-
-	// Support: iOS 8.2 (not reproducible in simulator)
-	// `in` check used to prevent JIT error (gh-2145)
-	// hasOwn isn't used here due to false negatives
-	// regarding Nodelist length in IE
-	var length = !!obj && "length" in obj && obj.length,
-		type = jQuery.type( obj );
-
-	if ( type === "function" || jQuery.isWindow( obj ) ) {
-		return false;
-	}
-
-	return type === "array" || length === 0 ||
-		typeof length === "number" && length > 0 && ( length - 1 ) in obj;
-}
-var Sizzle =
-/*!
- * Sizzle CSS Selector Engine v2.2.1
- * http://sizzlejs.com/
- *
- * Copyright jQuery Foundation and other contributors
- * Released under the MIT license
- * http://jquery.org/license
- *
- * Date: 2015-10-17
- */
-(function( window ) {
-
-var i,
-	support,
-	Expr,
-	getText,
-	isXML,
-	tokenize,
-	compile,
-	select,
-	outermostContext,
-	sortInput,
-	hasDuplicate,
-
-	// Local document vars
-	setDocument,
-	document,
-	docElem,
-	documentIsHTML,
-	rbuggyQSA,
-	rbuggyMatches,
-	matches,
-	contains,
-
-	// Instance-specific data
-	expando = "sizzle" + 1 * new Date(),
-	preferredDoc = window.document,
-	dirruns = 0,
-	done = 0,
-	classCache = createCache(),
-	tokenCache = createCache(),
-	compilerCache = createCache(),
-	sortOrder = function( a, b ) {
-		if ( a === b ) {
-			hasDuplicate = true;
-		}
-		return 0;
-	},
-
-	// General-purpose constants
-	MAX_NEGATIVE = 1 << 31,
-
-	// Instance methods
-	hasOwn = ({}).hasOwnProperty,
-	arr = [],
-	pop = arr.pop,
-	push_native = arr.push,
-	push = arr.push,
-	slice = arr.slice,
-	// Use a stripped-down indexOf as it's faster than native
-	// http://jsperf.com/thor-indexof-vs-for/5
-	indexOf = function( list, elem ) {
-		var i = 0,
-			len = list.length;
-		for ( ; i < len; i++ ) {
-			if ( list[i] === elem ) {
-				return i;
-			}
-		}
-		return -1;
-	},
-
-	booleans = "checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped",
-
-	// Regular expressions
-
-	// http://www.w3.org/TR/css3-selectors/#whitespace
-	whitespace = "[\\x20\\t\\r\\n\\f]",
-
-	// http://www.w3.org/TR/CSS21/syndata.html#value-def-identifier
-	identifier = "(?:\\\\.|[\\w-]|[^\\x00-\\xa0])+",
-
-	// Attribute selectors: http://www.w3.org/TR/selectors/#attribute-selectors
-	attributes = "\\[" + whitespace + "*(" + identifier + ")(?:" + whitespace +
-		// Operator (capture 2)
-		"*([*^$|!~]?=)" + whitespace +
-		// "Attribute values must be CSS identifiers [capture 5] or strings [capture 3 or capture 4]"
-		"*(?:'((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\"|(" + identifier + "))|)" + whitespace +
-		"*\\]",
-
-	pseudos = ":(" + identifier + ")(?:\\((" +
-		// To reduce the number of selectors needing tokenize in the preFilter, prefer arguments:
-		// 1. quoted (capture 3; capture 4 or capture 5)
-		"('((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\")|" +
-		// 2. simple (capture 6)
-		"((?:\\\\.|[^\\\\()[\\]]|" + attributes + ")*)|" +
-		// 3. anything else (capture 2)
-		".*" +
-		")\\)|)",
-
-	// Leading and non-escaped trailing whitespace, capturing some non-whitespace characters preceding the latter
-	rwhitespace = new RegExp( whitespace + "+", "g" ),
-	rtrim = new RegExp( "^" + whitespace + "+|((?:^|[^\\\\])(?:\\\\.)*)" + whitespace + "+$", "g" ),
-
-	rcomma = new RegExp( "^" + whitespace + "*," + whitespace + "*" ),
-	rcombinators = new RegExp( "^" + whitespace + "*([>+~]|" + whitespace + ")" + whitespace + "*" ),
-
-	rattributeQuotes = new RegExp( "=" + whitespace + "*([^\\]'\"]*?)" + whitespace + "*\\]", "g" ),
-
-	rpseudo = new RegExp( pseudos ),
-	ridentifier = new RegExp( "^" + identifier + "$" ),
-
-	matchExpr = {
-		"ID": new RegExp( "^#(" + identifier + ")" ),
-		"CLASS": new RegExp( "^\\.(" + identifier + ")" ),
-		"TAG": new RegExp( "^(" + identifier + "|[*])" ),
-		"ATTR": new RegExp( "^" + attributes ),
-		"PSEUDO": new RegExp( "^" + pseudos ),
-		"CHILD": new RegExp( "^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\(" + whitespace +
-			"*(even|odd|(([+-]|)(\\d*)n|)" + whitespace + "*(?:([+-]|)" + whitespace +
-			"*(\\d+)|))" + whitespace + "*\\)|)", "i" ),
-		"bool": new RegExp( "^(?:" + booleans + ")$", "i" ),
-		// For use in libraries implementing .is()
-		// We use this for POS matching in `select`
-		"needsContext": new RegExp( "^" + whitespace + "*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\(" +
-			whitespace + "*((?:-\\d)?\\d*)" + whitespace + "*\\)|)(?=[^-]|$)", "i" )
-	},
-
-	rinputs = /^(?:input|select|textarea|button)$/i,
-	rheader = /^h\d$/i,
-
-	rnative = /^[^{]+\{\s*\[native \w/,
-
-	// Easily-parseable/retrievable ID or TAG or CLASS selectors
-	rquickExpr = /^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,
-
-	rsibling = /[+~]/,
-	rescape = /'|\\/g,
-
-	// CSS escapes http://www.w3.org/TR/CSS21/syndata.html#escaped-characters
-	runescape = new RegExp( "\\\\([\\da-f]{1,6}" + whitespace + "?|(" + whitespace + ")|.)", "ig" ),
-	funescape = function( _, escaped, escapedWhitespace ) {
-		var high = "0x" + escaped - 0x10000;
-		// NaN means non-codepoint
-		// Support: Firefox<24
-		// Workaround erroneous numeric interpretation of +"0x"
-		return high !== high || escapedWhitespace ?
-			escaped :
-			high < 0 ?
-				// BMP codepoint
-				String.fromCharCode( high + 0x10000 ) :
-				// Supplemental Plane codepoint (surrogate pair)
-				String.fromCharCode( high >> 10 | 0xD800, high & 0x3FF | 0xDC00 );
-	},
-
-	// Used for iframes
-	// See setDocument()
-	// Removing the function wrapper causes a "Permission Denied"
-	// error in IE
-	unloadHandler = function() {
-		setDocument();
-	};
-
-// Optimize for push.apply( _, NodeList )
-try {
-	push.apply(
-		(arr = slice.call( preferredDoc.childNodes )),
-		preferredDoc.childNodes
-	);
-	// Support: Android<4.0
-	// Detect silently failing push.apply
-	arr[ preferredDoc.childNodes.length ].nodeType;
-} catch ( e ) {
-	push = { apply: arr.length ?
-
-		// Leverage slice if possible
-		function( target, els ) {
-			push_native.apply( target, slice.call(els) );
-		} :
-
-		// Support: IE<9
-		// Otherwise append directly
-		function( target, els ) {
-			var j = target.length,
-				i = 0;
-			// Can't trust NodeList.length
-			while ( (target[j++] = els[i++]) ) {}
-			target.length = j - 1;
-		}
-	};
-}
-
-function Sizzle( selector, context, results, seed ) {
-	var m, i, elem, nid, nidselect, match, groups, newSelector,
-		newContext = context && context.ownerDocument,
-
-		// nodeType defaults to 9, since context defaults to document
-		nodeType = context ? context.nodeType : 9;
-
-	results = results || [];
-
-	// Return early from calls with invalid selector or context
-	if ( typeof selector !== "string" || !selector ||
-		nodeType !== 1 && nodeType !== 9 && nodeType !== 11 ) {
-
-		return results;
-	}
-
-	// Try to shortcut find operations (as opposed to filters) in HTML documents
-	if ( !seed ) {
-
-		if ( ( context ? context.ownerDocument || context : preferredDoc ) !== document ) {
-			setDocument( context );
-		}
-		context = context || document;
-
-		if ( documentIsHTML ) {
-
-			// If the selector is sufficiently simple, try using a "get*By*" DOM method
-			// (excepting DocumentFragment context, where the methods don't exist)
-			if ( nodeType !== 11 && (match = rquickExpr.exec( selector )) ) {
-
-				// ID selector
-				if ( (m = match[1]) ) {
-
-					// Document context
-					if ( nodeType === 9 ) {
-						if ( (elem = context.getElementById( m )) ) {
-
-							// Support: IE, Opera, Webkit
-							// TODO: identify versions
-							// getElementById can match elements by name instead of ID
-							if ( elem.id === m ) {
-								results.push( elem );
-								return results;
-							}
-						} else {
-							return results;
-						}
-
-					// Element context
-					} else {
-
-						// Support: IE, Opera, Webkit
-						// TODO: identify versions
-						// getElementById can match elements by name instead of ID
-						if ( newContext && (elem = newContext.getElementById( m )) &&
-							contains( context, elem ) &&
-							elem.id === m ) {
-
-							results.push( elem );
-							return results;
-						}
-					}
-
-				// Type selector
-				} else if ( match[2] ) {
-					push.apply( results, context.getElementsByTagName( selector ) );
-					return results;
-
-				// Class selector
-				} else if ( (m = match[3]) && support.getElementsByClassName &&
-					context.getElementsByClassName ) {
-
-					push.apply( results, context.getElementsByClassName( m ) );
-					return results;
-				}
-			}
-
-			// Take advantage of querySelectorAll
-			if ( support.qsa &&
-				!compilerCache[ selector + " " ] &&
-				(!rbuggyQSA || !rbuggyQSA.test( selector )) ) {
-
-				if ( nodeType !== 1 ) {
-					newContext = context;
-					newSelector = selector;
-
-				// qSA looks outside Element context, which is not what we want
-				// Thanks to Andrew Dupont for this workaround technique
-				// Support: IE <=8
-				// Exclude object elements
-				} else if ( context.nodeName.toLowerCase() !== "object" ) {
-
-					// Capture the context ID, setting it first if necessary
-					if ( (nid = context.getAttribute( "id" )) ) {
-						nid = nid.replace( rescape, "\\$&" );
-					} else {
-						context.setAttribute( "id", (nid = expando) );
-					}
-
-					// Prefix every selector in the list
-					groups = tokenize( selector );
-					i = groups.length;
-					nidselect = ridentifier.test( nid ) ? "#" + nid : "[id='" + nid + "']";
-					while ( i-- ) {
-						groups[i] = nidselect + " " + toSelector( groups[i] );
-					}
-					newSelector = groups.join( "," );
-
-					// Expand context for sibling selectors
-					newContext = rsibling.test( selector ) && testContext( context.parentNode ) ||
-						context;
-				}
-
-				if ( newSelector ) {
-					try {
-						push.apply( results,
-							newContext.querySelectorAll( newSelector )
-						);
-						return results;
-					} catch ( qsaError ) {
-					} finally {
-						if ( nid === expando ) {
-							context.removeAttribute( "id" );
-						}
-					}
-				}
-			}
-		}
-	}
-
-	// All others
-	return select( selector.replace( rtrim, "$1" ), context, results, seed );
-}
-
-/**
- * Create key-value caches of limited size
- * @returns {function(string, object)} Returns the Object data after storing it on itself with
- *	property name the (space-suffixed) string and (if the cache is larger than Expr.cacheLength)
- *	deleting the oldest entry
- */
-function createCache() {
-	var keys = [];
-
-	function cache( key, value ) {
-		// Use (key + " ") to avoid collision with native prototype properties (see Issue #157)
-		if ( keys.push( key + " " ) > Expr.cacheLength ) {
-			// Only keep the most recent entries
-			delete cache[ keys.shift() ];
-		}
-		return (cache[ key + " " ] = value);
-	}
-	return cache;
-}
-
-/**
- * Mark a function for special use by Sizzle
- * @param {Function} fn The function to mark
- */
-function markFunction( fn ) {
-	fn[ expando ] = true;
-	return fn;
-}
-
-/**
- * Support testing using an element
- * @param {Function} fn Passed the created div and expects a boolean result
- */
-function assert( fn ) {
-	var div = document.createElement("div");
-
-	try {
-		return !!fn( div );
-	} catch (e) {
-		return false;
-	} finally {
-		// Remove from its parent by default
-		if ( div.parentNode ) {
-			div.parentNode.removeChild( div );
-		}
-		// release memory in IE
-		div = null;
-	}
-}
-
-/**
- * Adds the same handler for all of the specified attrs
- * @param {String} attrs Pipe-separated list of attributes
- * @param {Function} handler The method that will be applied
- */
-function addHandle( attrs, handler ) {
-	var arr = attrs.split("|"),
-		i = arr.length;
-
-	while ( i-- ) {
-		Expr.attrHandle[ arr[i] ] = handler;
-	}
-}
-
-/**
- * Checks document order of two siblings
- * @param {Element} a
- * @param {Element} b
- * @returns {Number} Returns less than 0 if a precedes b, greater than 0 if a follows b
- */
-function siblingCheck( a, b ) {
-	var cur = b && a,
-		diff = cur && a.nodeType === 1 && b.nodeType === 1 &&
-			( ~b.sourceIndex || MAX_NEGATIVE ) -
-			( ~a.sourceIndex || MAX_NEGATIVE );
-
-	// Use IE sourceIndex if available on both nodes
-	if ( diff ) {
-		return diff;
-	}
-
-	// Check if b follows a
-	if ( cur ) {
-		while ( (cur = cur.nextSibling) ) {
-			if ( cur === b ) {
-				return -1;
-			}
-		}
-	}
-
-	return a ? 1 : -1;
-}
-
-/**
- * Returns a function to use in pseudos for input types
- * @param {String} type
- */
-function createInputPseudo( type ) {
-	return function( elem ) {
-		var name = elem.nodeName.toLowerCase();
-		return name === "input" && elem.type === type;
-	};
-}
-
-/**
- * Returns a function to use in pseudos for buttons
- * @param {String} type
- */
-function createButtonPseudo( type ) {
-	return function( elem ) {
-		var name = elem.nodeName.toLowerCase();
-		return (name === "input" || name === "button") && elem.type === type;
-	};
-}
-
-/**
- * Returns a function to use in pseudos for positionals
- * @param {Function} fn
- */
-function createPositionalPseudo( fn ) {
-	return markFunction(function( argument ) {
-		argument = +argument;
-		return markFunction(function( seed, matches ) {
-			var j,
-				matchIndexes = fn( [], seed.length, argument ),
-				i = matchIndexes.length;
-
-			// Match elements found at the specified indexes
-			while ( i-- ) {
-				if ( seed[ (j = matchIndexes[i]) ] ) {
-					seed[j] = !(matches[j] = seed[j]);
-				}
-			}
-		});
-	});
-}
-
-/**
- * Checks a node for validity as a Sizzle context
- * @param {Element|Object=} context
- * @returns {Element|Object|Boolean} The input node if acceptable, otherwise a falsy value
- */
-function testContext( context ) {
-	return context && typeof context.getElementsByTagName !== "undefined" && context;
-}
-
-// Expose support vars for convenience
-support = Sizzle.support = {};
-
-/**
- * Detects XML nodes
- * @param {Element|Object} elem An element or a document
- * @returns {Boolean} True iff elem is a non-HTML XML node
- */
-isXML = Sizzle.isXML = function( elem ) {
-	// documentElement is verified for cases where it doesn't yet exist
-	// (such as loading iframes in IE - #4833)
-	var documentElement = elem && (elem.ownerDocument || elem).documentElement;
-	return documentElement ? documentElement.nodeName !== "HTML" : false;
-};
-
-/**
- * Sets document-related variables once based on the current document
- * @param {Element|Object} [doc] An element or document object to use to set the document
- * @returns {Object} Returns the current document
- */
-setDocument = Sizzle.setDocument = function( node ) {
-	var hasCompare, parent,
-		doc = node ? node.ownerDocument || node : preferredDoc;
-
-	// Return early if doc is invalid or already selected
-	if ( doc === document || doc.nodeType !== 9 || !doc.documentElement ) {
-		return document;
-	}
-
-	// Update global variables
-	document = doc;
-	docElem = document.documentElement;
-	documentIsHTML = !isXML( document );
-
-	// Support: IE 9-11, Edge
-	// Accessing iframe documents after unload throws "permission denied" errors (jQuery #13936)
-	if ( (parent = document.defaultView) && parent.top !== parent ) {
-		// Support: IE 11
-		if ( parent.addEventListener ) {
-			parent.addEventListener( "unload", unloadHandler, false );
-
-		// Support: IE 9 - 10 only
-		} else if ( parent.attachEvent ) {
-			parent.attachEvent( "onunload", unloadHandler );
-		}
-	}
-
-	/* Attributes
-	---------------------------------------------------------------------- */
-
-	// Support: IE<8
-	// Verify that getAttribute really returns attributes and not properties
-	// (excepting IE8 booleans)
-	support.attributes = assert(function( div ) {
-		div.className = "i";
-		return !div.getAttribute("className");
-	});
-
-	/* getElement(s)By*
-	---------------------------------------------------------------------- */
-
-	// Check if getElementsByTagName("*") returns only elements
-	support.getElementsByTagName = assert(function( div ) {
-		div.appendChild( document.createComment("") );
-		return !div.getElementsByTagName("*").length;
-	});
-
-	// Support: IE<9
-	support.getElementsByClassName = rnative.test( document.getElementsByClassName );
-
-	// Support: IE<10
-	// Check if getElementById returns elements by name
-	// The broken getElementById methods don't pick up programatically-set names,
-	// so use a roundabout getElementsByName test
-	support.getById = assert(function( div ) {
-		docElem.appendChild( div ).id = expando;
-		return !document.getElementsByName || !document.getElementsByName( expando ).length;
-	});
-
-	// ID find and filter
-	if ( support.getById ) {
-		Expr.find["ID"] = function( id, context ) {
-			if ( typeof context.getElementById !== "undefined" && documentIsHTML ) {
-				var m = context.getElementById( id );
-				return m ? [ m ] : [];
-			}
-		};
-		Expr.filter["ID"] = function( id ) {
-			var attrId = id.replace( runescape, funescape );
-			return function( elem ) {
-				return elem.getAttribute("id") === attrId;
-			};
-		};
-	} else {
-		// Support: IE6/7
-		// getElementById is not reliable as a find shortcut
-		delete Expr.find["ID"];
-
-		Expr.filter["ID"] =  function( id ) {
-			var attrId = id.replace( runescape, funescape );
-			return function( elem ) {
-				var node = typeof elem.getAttributeNode !== "undefined" &&
-					elem.getAttributeNode("id");
-				return node && node.value === attrId;
-			};
-		};
-	}
-
-	// Tag
-	Expr.find["TAG"] = support.getElementsByTagName ?
-		function( tag, context ) {
-			if ( typeof context.getElementsByTagName !== "undefined" ) {
-				return context.getElementsByTagName( tag );
-
-			// DocumentFragment nodes don't have gEBTN
-			} else if ( support.qsa ) {
-				return context.querySelectorAll( tag );
-			}
-		} :
-
-		function( tag, context ) {
-			var elem,
-				tmp = [],
-				i = 0,
-				// By happy coincidence, a (broken) gEBTN appears on DocumentFragment nodes too
-				results = context.getElementsByTagName( tag );
-
-			// Filter out possible comments
-			if ( tag === "*" ) {
-				while ( (elem = results[i++]) ) {
-					if ( elem.nodeType === 1 ) {
-						tmp.push( elem );
-					}
-				}
-
-				return tmp;
-			}
-			return results;
-		};
-
-	// Class
-	Expr.find["CLASS"] = support.getElementsByClassName && function( className, context ) {
-		if ( typeof context.getElementsByClassName !== "undefined" && documentIsHTML ) {
-			return context.getElementsByClassName( className );
-		}
-	};
-
-	/* QSA/matchesSelector
-	---------------------------------------------------------------------- */
-
-	// QSA and matchesSelector support
-
-	// matchesSelector(:active) reports false when true (IE9/Opera 11.5)
-	rbuggyMatches = [];
-
-	// qSa(:focus) reports false when true (Chrome 21)
-	// We allow this because of a bug in IE8/9 that throws an error
-	// whenever `document.activeElement` is accessed on an iframe
-	// So, we allow :focus to pass through QSA all the time to avoid the IE error
-	// See http://bugs.jquery.com/ticket/13378
-	rbuggyQSA = [];
-
-	if ( (support.qsa = rnative.test( document.querySelectorAll )) ) {
-		// Build QSA regex
-		// Regex strategy adopted from Diego Perini
-		assert(function( div ) {
-			// Select is set to empty string on purpose
-			// This is to test IE's treatment of not explicitly
-			// setting a boolean content attribute,
-			// since its presence should be enough
-			// http://bugs.jquery.com/ticket/12359
-			docElem.appendChild( div ).innerHTML = "<a id='" + expando + "'></a>" +
-				"<select id='" + expando + "-\r\\' msallowcapture=''>" +
-				"<option selected=''></option></select>";
-
-			// Support: IE8, Opera 11-12.16
-			// Nothing should be selected when empty strings follow ^= or $= or *=
-			// The test attribute must be unknown in Opera but "safe" for WinRT
-			// http://msdn.microsoft.com/en-us/library/ie/hh465388.aspx#attribute_section
-			if ( div.querySelectorAll("[msallowcapture^='']").length ) {
-				rbuggyQSA.push( "[*^$]=" + whitespace + "*(?:''|\"\")" );
-			}
-
-			// Support: IE8
-			// Boolean attributes and "value" are not treated correctly
-			if ( !div.querySelectorAll("[selected]").length ) {
-				rbuggyQSA.push( "\\[" + whitespace + "*(?:value|" + booleans + ")" );
-			}
-
-			// Support: Chrome<29, Android<4.4, Safari<7.0+, iOS<7.0+, PhantomJS<1.9.8+
-			if ( !div.querySelectorAll( "[id~=" + expando + "-]" ).length ) {
-				rbuggyQSA.push("~=");
-			}
-
-			// Webkit/Opera - :checked should return selected option elements
-			// http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked
-			// IE8 throws error here and will not see later tests
-			if ( !div.querySelectorAll(":checked").length ) {
-				rbuggyQSA.push(":checked");
-			}
-
-			// Support: Safari 8+, iOS 8+
-			// https://bugs.webkit.org/show_bug.cgi?id=136851
-			// In-page `selector#id sibing-combinator selector` fails
-			if ( !div.querySelectorAll( "a#" + expando + "+*" ).length ) {
-				rbuggyQSA.push(".#.+[+~]");
-			}
-		});
-
-		assert(function( div ) {
-			// Support: Windows 8 Native Apps
-			// The type and name attributes are restricted during .innerHTML assignment
-			var input = document.createElement("input");
-			input.setAttribute( "type", "hidden" );
-			div.appendChild( input ).setAttribute( "name", "D" );
-
-			// Support: IE8
-			// Enforce case-sensitivity of name attribute
-			if ( div.querySelectorAll("[name=d]").length ) {
-				rbuggyQSA.push( "name" + whitespace + "*[*^$|!~]?=" );
-			}
-
-			// FF 3.5 - :enabled/:disabled and hidden elements (hidden elements are still enabled)
-			// IE8 throws error here and will not see later tests
-			if ( !div.querySelectorAll(":enabled").length ) {
-				rbuggyQSA.push( ":enabled", ":disabled" );
-			}
-
-			// Opera 10-11 does not throw on post-comma invalid pseudos
-			div.querySelectorAll("*,:x");
-			rbuggyQSA.push(",.*:");
-		});
-	}
-
-	if ( (support.matchesSelector = rnative.test( (matches = docElem.matches ||
-		docElem.webkitMatchesSelector ||
-		docElem.mozMatchesSelector ||
-		docElem.oMatchesSelector ||
-		docElem.msMatchesSelector) )) ) {
-
-		assert(function( div ) {
-			// Check to see if it's possible to do matchesSelector
-			// on a disconnected node (IE 9)
-			support.disconnectedMatch = matches.call( div, "div" );
-
-			// This should fail with an exception
-			// Gecko does not error, returns false instead
-			matches.call( div, "[s!='']:x" );
-			rbuggyMatches.push( "!=", pseudos );
-		});
-	}
-
-	rbuggyQSA = rbuggyQSA.length && new RegExp( rbuggyQSA.join("|") );
-	rbuggyMatches = rbuggyMatches.length && new RegExp( rbuggyMatches.join("|") );
-
-	/* Contains
-	---------------------------------------------------------------------- */
-	hasCompare = rnative.test( docElem.compareDocumentPosition );
-
-	// Element contains another
-	// Purposefully self-exclusive
-	// As in, an element does not contain itself
-	contains = hasCompare || rnative.test( docElem.contains ) ?
-		function( a, b ) {
-			var adown = a.nodeType === 9 ? a.documentElement : a,
-				bup = b && b.parentNode;
-			return a === bup || !!( bup && bup.nodeType === 1 && (
-				adown.contains ?
-					adown.contains( bup ) :
-					a.compareDocumentPosition && a.compareDocumentPosition( bup ) & 16
-			));
-		} :
-		function( a, b ) {
-			if ( b ) {
-				while ( (b = b.parentNode) ) {
-					if ( b === a ) {
-						return true;
-					}
-				}
-			}
-			return false;
-		};
-
-	/* Sorting
-	---------------------------------------------------------------------- */
-
-	// Document order sorting
-	sortOrder = hasCompare ?
-	function( a, b ) {
-
-		// Flag for duplicate removal
-		if ( a === b ) {
-			hasDuplicate = true;
-			return 0;
-		}
-
-		// Sort on method existence if only one input has compareDocumentPosition
-		var compare = !a.compareDocumentPosition - !b.compareDocumentPosition;
-		if ( compare ) {
-			return compare;
-		}
-
-		// Calculate position if both inputs belong to the same document
-		compare = ( a.ownerDocument || a ) === ( b.ownerDocument || b ) ?
-			a.compareDocumentPosition( b ) :
-
-			// Otherwise we know they are disconnected
-			1;
-
-		// Disconnected nodes
-		if ( compare & 1 ||
-			(!support.sortDetached && b.compareDocumentPosition( a ) === compare) ) {
-
-			// Choose the first element that is related to our preferred document
-			if ( a === document || a.ownerDocument === preferredDoc && contains(preferredDoc, a) ) {
-				return -1;
-			}
-			if ( b === document || b.ownerDocument === preferredDoc && contains(preferredDoc, b) ) {
-				return 1;
-			}
-
-			// Maintain original order
-			return sortInput ?
-				( indexOf( sortInput, a ) - indexOf( sortInput, b ) ) :
-				0;
-		}
-
-		return compare & 4 ? -1 : 1;
-	} :
-	function( a, b ) {
-		// Exit early if the nodes are identical
-		if ( a === b ) {
-			hasDuplicate = true;
-			return 0;
-		}
-
-		var cur,
-			i = 0,
-			aup = a.parentNode,
-			bup = b.parentNode,
-			ap = [ a ],
-			bp = [ b ];
-
-		// Parentless nodes are either documents or disconnected
-		if ( !aup || !bup ) {
-			return a === document ? -1 :
-				b === document ? 1 :
-				aup ? -1 :
-				bup ? 1 :
-				sortInput ?
-				( indexOf( sortInput, a ) - indexOf( sortInput, b ) ) :
-				0;
-
-		// If the nodes are siblings, we can do a quick check
-		} else if ( aup === bup ) {
-			return siblingCheck( a, b );
-		}
-
-		// Otherwise we need full lists of their ancestors for comparison
-		cur = a;
-		while ( (cur = cur.parentNode) ) {
-			ap.unshift( cur );
-		}
-		cur = b;
-		while ( (cur = cur.parentNode) ) {
-			bp.unshift( cur );
-		}
-
-		// Walk down the tree looking for a discrepancy
-		while ( ap[i] === bp[i] ) {
-			i++;
-		}
-
-		return i ?
-			// Do a sibling check if the nodes have a common ancestor
-			siblingCheck( ap[i], bp[i] ) :
-
-			// Otherwise nodes in our document sort first
-			ap[i] === preferredDoc ? -1 :
-			bp[i] === preferredDoc ? 1 :
-			0;
-	};
-
-	return document;
-};
-
-Sizzle.matches = function( expr, elements ) {
-	return Sizzle( expr, null, null, elements );
-};
-
-Sizzle.matchesSelector = function( elem, expr ) {
-	// Set document vars if needed
-	if ( ( elem.ownerDocument || elem ) !== document ) {
-		setDocument( elem );
-	}
-
-	// Make sure that attribute selectors are quoted
-	expr = expr.replace( rattributeQuotes, "='$1']" );
-
-	if ( support.matchesSelector && documentIsHTML &&
-		!compilerCache[ expr + " " ] &&
-		( !rbuggyMatches || !rbuggyMatches.test( expr ) ) &&
-		( !rbuggyQSA     || !rbuggyQSA.test( expr ) ) ) {
-
-		try {
-			var ret = matches.call( elem, expr );
-
-			// IE 9's matchesSelector returns false on disconnected nodes
-			if ( ret || support.disconnectedMatch ||
-					// As well, disconnected nodes are said to be in a document
-					// fragment in IE 9
-					elem.document && elem.document.nodeType !== 11 ) {
-				return ret;
-			}
-		} catch (e) {}
-	}
-
-	return Sizzle( expr, document, null, [ elem ] ).length > 0;
-};
-
-Sizzle.contains = function( context, elem ) {
-	// Set document vars if needed
-	if ( ( context.ownerDocument || context ) !== document ) {
-		setDocument( context );
-	}
-	return contains( context, elem );
-};
-
-Sizzle.attr = function( elem, name ) {
-	// Set document vars if needed
-	if ( ( elem.ownerDocument || elem ) !== document ) {
-		setDocument( elem );
-	}
-
-	var fn = Expr.attrHandle[ name.toLowerCase() ],
-		// Don't get fooled by Object.prototype properties (jQuery #13807)
-		val = fn && hasOwn.call( Expr.attrHandle, name.toLowerCase() ) ?
-			fn( elem, name, !documentIsHTML ) :
-			undefined;
-
-	return val !== undefined ?
-		val :
-		support.attributes || !documentIsHTML ?
-			elem.getAttribute( name ) :
-			(val = elem.getAttributeNode(name)) && val.specified ?
-				val.value :
-				null;
-};
-
-Sizzle.error = function( msg ) {
-	throw new Error( "Syntax error, unrecognized expression: " + msg );
-};
-
-/**
- * Document sorting and removing duplicates
- * @param {ArrayLike} results
- */
-Sizzle.uniqueSort = function( results ) {
-	var elem,
-		duplicates = [],
-		j = 0,
-		i = 0;
-
-	// Unless we *know* we can detect duplicates, assume their presence
-	hasDuplicate = !support.detectDuplicates;
-	sortInput = !support.sortStable && results.slice( 0 );
-	results.sort( sortOrder );
-
-	if ( hasDuplicate ) {
-		while ( (elem = results[i++]) ) {
-			if ( elem === results[ i ] ) {
-				j = duplicates.push( i );
-			}
-		}
-		while ( j-- ) {
-			results.splice( duplicates[ j ], 1 );
-		}
-	}
-
-	// Clear input after sorting to release objects
-	// See https://github.com/jquery/sizzle/pull/225
-	sortInput = null;
-
-	return results;
-};
-
-/**
- * Utility function for retrieving the text value of an array of DOM nodes
- * @param {Array|Element} elem
- */
-getText = Sizzle.getText = function( elem ) {
-	var node,
-		ret = "",
-		i = 0,
-		nodeType = elem.nodeType;
-
-	if ( !nodeType ) {
-		// If no nodeType, this is expected to be an array
-		while ( (node = elem[i++]) ) {
-			// Do not traverse comment nodes
-			ret += getText( node );
-		}
-	} else if ( nodeType === 1 || nodeType === 9 || nodeType === 11 ) {
-		// Use textContent for elements
-		// innerText usage removed for consistency of new lines (jQuery #11153)
-		if ( typeof elem.textContent === "string" ) {
-			return elem.textContent;
-		} else {
-			// Traverse its children
-			for ( elem = elem.firstChild; elem; elem = elem.nextSibling ) {
-				ret += getText( elem );
-			}
-		}
-	} else if ( nodeType === 3 || nodeType === 4 ) {
-		return elem.nodeValue;
-	}
-	// Do not include comment or processing instruction nodes
-
-	return ret;
-};
-
-Expr = Sizzle.selectors = {
-
-	// Can be adjusted by the user
-	cacheLength: 50,
-
-	createPseudo: markFunction,
-
-	match: matchExpr,
-
-	attrHandle: {},
-
-	find: {},
-
-	relative: {
-		">": { dir: "parentNode", first: true },
-		" ": { dir: "parentNode" },
-		"+": { dir: "previousSibling", first: true },
-		"~": { dir: "previousSibling" }
-	},
-
-	preFilter: {
-		"ATTR": function( match ) {
-			match[1] = match[1].replace( runescape, funescape );
-
-			// Move the given value to match[3] whether quoted or unquoted
-			match[3] = ( match[3] || match[4] || match[5] || "" ).replace( runescape, funescape );
-
-			if ( match[2] === "~=" ) {
-				match[3] = " " + match[3] + " ";
-			}
-
-			return match.slice( 0, 4 );
-		},
-
-		"CHILD": function( match ) {
-			/* matches from matchExpr["CHILD"]
-				1 type (only|nth|...)
-				2 what (child|of-type)
-				3 argument (even|odd|\d*|\d*n([+-]\d+)?|...)
-				4 xn-component of xn+y argument ([+-]?\d*n|)
-				5 sign of xn-component
-				6 x of xn-component
-				7 sign of y-component
-				8 y of y-component
-			*/
-			match[1] = match[1].toLowerCase();
-
-			if ( match[1].slice( 0, 3 ) === "nth" ) {
-				// nth-* requires argument
-				if ( !match[3] ) {
-					Sizzle.error( match[0] );
-				}
-
-				// numeric x and y parameters for Expr.filter.CHILD
-				// remember that false/true cast respectively to 0/1
-				match[4] = +( match[4] ? match[5] + (match[6] || 1) : 2 * ( match[3] === "even" || match[3] === "odd" ) );
-				match[5] = +( ( match[7] + match[8] ) || match[3] === "odd" );
-
-			// other types prohibit arguments
-			} else if ( match[3] ) {
-				Sizzle.error( match[0] );
-			}
-
-			return match;
-		},
-
-		"PSEUDO": function( match ) {
-			var excess,
-				unquoted = !match[6] && match[2];
-
-			if ( matchExpr["CHILD"].test( match[0] ) ) {
-				return null;
-			}
-
-			// Accept quoted arguments as-is
-			if ( match[3] ) {
-				match[2] = match[4] || match[5] || "";
-
-			// Strip excess characters from unquoted arguments
-			} else if ( unquoted && rpseudo.test( unquoted ) &&
-				// Get excess from tokenize (recursively)
-				(excess = tokenize( unquoted, true )) &&
-				// advance to the next closing parenthesis
-				(excess = unquoted.indexOf( ")", unquoted.length - excess ) - unquoted.length) ) {
-
-				// excess is a negative index
-				match[0] = match[0].slice( 0, excess );
-				match[2] = unquoted.slice( 0, excess );
-			}
-
-			// Return only captures needed by the pseudo filter method (type and argument)
-			return match.slice( 0, 3 );
-		}
-	},
-
-	filter: {
-
-		"TAG": function( nodeNameSelector ) {
-			var nodeName = nodeNameSelector.replace( runescape, funescape ).toLowerCase();
-			return nodeNameSelector === "*" ?
-				function() { return true; } :
-				function( elem ) {
-					return elem.nodeName && elem.nodeName.toLowerCase() === nodeName;
-				};
-		},
-
-		"CLASS": function( className ) {
-			var pattern = classCache[ className + " " ];
-
-			return pattern ||
-				(pattern = new RegExp( "(^|" + whitespace + ")" + className + "(" + whitespace + "|$)" )) &&
-				classCache( className, function( elem ) {
-					return pattern.test( typeof elem.className === "string" && elem.className || typeof elem.getAttribute !== "undefined" && elem.getAttribute("class") || "" );
-				});
-		},
-
-		"ATTR": function( name, operator, check ) {
-			return function( elem ) {
-				var result = Sizzle.attr( elem, name );
-
-				if ( result == null ) {
-					return operator === "!=";
-				}
-				if ( !operator ) {
-					return true;
-				}
-
-				result += "";
-
-				return operator === "=" ? result === check :
-					operator === "!=" ? result !== check :
-					operator === "^=" ? check && result.indexOf( check ) === 0 :
-					operator === "*=" ? check && result.indexOf( check ) > -1 :
-					operator === "$=" ? check && result.slice( -check.length ) === check :
-					operator === "~=" ? ( " " + result.replace( rwhitespace, " " ) + " " ).indexOf( check ) > -1 :
-					operator === "|=" ? result === check || result.slice( 0, check.length + 1 ) === check + "-" :
-					false;
-			};
-		},
-
-		"CHILD": function( type, what, argument, first, last ) {
-			var simple = type.slice( 0, 3 ) !== "nth",
-				forward = type.slice( -4 ) !== "last",
-				ofType = what === "of-type";
-
-			return first === 1 && last === 0 ?
-
-				// Shortcut for :nth-*(n)
-				function( elem ) {
-					return !!elem.parentNode;
-				} :
-
-				function( elem, context, xml ) {
-					var cache, uniqueCache, outerCache, node, nodeIndex, start,
-						dir = simple !== forward ? "nextSibling" : "previousSibling",
-						parent = elem.parentNode,
-						name = ofType && elem.nodeName.toLowerCase(),
-						useCache = !xml && !ofType,
-						diff = false;
-
-					if ( parent ) {
-
-						// :(first|last|only)-(child|of-type)
-						if ( simple ) {
-							while ( dir ) {
-								node = elem;
-								while ( (node = node[ dir ]) ) {
-									if ( ofType ?
-										node.nodeName.toLowerCase() === name :
-										node.nodeType === 1 ) {
-
-										return false;
-									}
-								}
-								// Reverse direction for :only-* (if we haven't yet done so)
-								start = dir = type === "only" && !start && "nextSibling";
-							}
-							return true;
-						}
-
-						start = [ forward ? parent.firstChild : parent.lastChild ];
-
-						// non-xml :nth-child(...) stores cache data on `parent`
-						if ( forward && useCache ) {
-
-							// Seek `elem` from a previously-cached index
-
-							// ...in a gzip-friendly way
-							node = parent;
-							outerCache = node[ expando ] || (node[ expando ] = {});
-
-							// Support: IE <9 only
-							// Defend against cloned attroperties (jQuery gh-1709)
-							uniqueCache = outerCache[ node.uniqueID ] ||
-								(outerCache[ node.uniqueID ] = {});
-
-							cache = uniqueCache[ type ] || [];
-							nodeIndex = cache[ 0 ] === dirruns && cache[ 1 ];
-							diff = nodeIndex && cache[ 2 ];
-							node = nodeIndex && parent.childNodes[ nodeIndex ];
-
-							while ( (node = ++nodeIndex && node && node[ dir ] ||
-
-								// Fallback to seeking `elem` from the start
-								(diff = nodeIndex = 0) || start.pop()) ) {
-
-								// When found, cache indexes on `parent` and break
-								if ( node.nodeType === 1 && ++diff && node === elem ) {
-									uniqueCache[ type ] = [ dirruns, nodeIndex, diff ];
-									break;
-								}
-							}
-
-						} else {
-							// Use previously-cached element index if available
-							if ( useCache ) {
-								// ...in a gzip-friendly way
-								node = elem;
-								outerCache = node[ expando ] || (node[ expando ] = {});
-
-								// Support: IE <9 only
-								// Defend against cloned attroperties (jQuery gh-1709)
-								uniqueCache = outerCache[ node.uniqueID ] ||
-									(outerCache[ node.uniqueID ] = {});
-
-								cache = uniqueCache[ type ] || [];
-								nodeIndex = cache[ 0 ] === dirruns && cache[ 1 ];
-								diff = nodeIndex;
-							}
-
-							// xml :nth-child(...)
-							// or :nth-last-child(...) or :nth(-last)?-of-type(...)
-							if ( diff === false ) {
-								// Use the same loop as above to seek `elem` from the start
-								while ( (node = ++nodeIndex && node && node[ dir ] ||
-									(diff = nodeIndex = 0) || start.pop()) ) {
-
-									if ( ( ofType ?
-										node.nodeName.toLowerCase() === name :
-										node.nodeType === 1 ) &&
-										++diff ) {
-
-										// Cache the index of each encountered element
-										if ( useCache ) {
-											outerCache = node[ expando ] || (node[ expando ] = {});
-
-											// Support: IE <9 only
-											// Defend against cloned attroperties (jQuery gh-1709)
-											uniqueCache = outerCache[ node.uniqueID ] ||
-												(outerCache[ node.uniqueID ] = {});
-
-											uniqueCache[ type ] = [ dirruns, diff ];
-										}
-
-										if ( node === elem ) {
-											break;
-										}
-									}
-								}
-							}
-						}
-
-						// Incorporate the offset, then check against cycle size
-						diff -= last;
-						return diff === first || ( diff % first === 0 && diff / first >= 0 );
-					}
-				};
-		},
-
-		"PSEUDO": function( pseudo, argument ) {
-			// pseudo-class names are case-insensitive
-			// http://www.w3.org/TR/selectors/#pseudo-classes
-			// Prioritize by case sensitivity in case custom pseudos are added with uppercase letters
-			// Remember that setFilters inherits from pseudos
-			var args,
-				fn = Expr.pseudos[ pseudo ] || Expr.setFilters[ pseudo.toLowerCase() ] ||
-					Sizzle.error( "unsupported pseudo: " + pseudo );
-
-			// The user may use createPseudo to indicate that
-			// arguments are needed to create the filter function
-			// just as Sizzle does
-			if ( fn[ expando ] ) {
-				return fn( argument );
-			}
-
-			// But maintain support for old signatures
-			if ( fn.length > 1 ) {
-				args = [ pseudo, pseudo, "", argument ];
-				return Expr.setFilters.hasOwnProperty( pseudo.toLowerCase() ) ?
-					markFunction(function( seed, matches ) {
-						var idx,
-							matched = fn( seed, argument ),
-							i = matched.length;
-						while ( i-- ) {
-							idx = indexOf( seed, matched[i] );
-							seed[ idx ] = !( matches[ idx ] = matched[i] );
-						}
-					}) :
-					function( elem ) {
-						return fn( elem, 0, args );
-					};
-			}
-
-			return fn;
-		}
-	},
-
-	pseudos: {
-		// Potentially complex pseudos
-		"not": markFunction(function( selector ) {
-			// Trim the selector passed to compile
-			// to avoid treating leading and trailing
-			// spaces as combinators
-			var input = [],
-				results = [],
-				matcher = compile( selector.replace( rtrim, "$1" ) );
-
-			return matcher[ expando ] ?
-				markFunction(function( seed, matches, context, xml ) {
-					var elem,
-						unmatched = matcher( seed, null, xml, [] ),
-						i = seed.length;
-
-					// Match elements unmatched by `matcher`
-					while ( i-- ) {
-						if ( (elem = unmatched[i]) ) {
-							seed[i] = !(matches[i] = elem);
-						}
-					}
-				}) :
-				function( elem, context, xml ) {
-					input[0] = elem;
-					matcher( input, null, xml, results );
-					// Don't keep the element (issue #299)
-					input[0] = null;
-					return !results.pop();
-				};
-		}),
-
-		"has": markFunction(function( selector ) {
-			return function( elem ) {
-				return Sizzle( selector, elem ).length > 0;
-			};
-		}),
-
-		"contains": markFunction(function( text ) {
-			text = text.replace( runescape, funescape );
-			return function( elem ) {
-				return ( elem.textContent || elem.innerText || getText( elem ) ).indexOf( text ) > -1;
-			};
-		}),
-
-		// "Whether an element is represented by a :lang() selector
-		// is based solely on the element's language value
-		// being equal to the identifier C,
-		// or beginning with the identifier C immediately followed by "-".
-		// The matching of C against the element's language value is performed case-insensitively.
-		// The identifier C does not have to be a valid language name."
-		// http://www.w3.org/TR/selectors/#lang-pseudo
-		"lang": markFunction( function( lang ) {
-			// lang value must be a valid identifier
-			if ( !ridentifier.test(lang || "") ) {
-				Sizzle.error( "unsupported lang: " + lang );
-			}
-			lang = lang.replace( runescape, funescape ).toLowerCase();
-			return function( elem ) {
-				var elemLang;
-				do {
-					if ( (elemLang = documentIsHTML ?
-						elem.lang :
-						elem.getAttribute("xml:lang") || elem.getAttribute("lang")) ) {
-
-						elemLang = elemLang.toLowerCase();
-						return elemLang === lang || elemLang.indexOf( lang + "-" ) === 0;
-					}
-				} while ( (elem = elem.parentNode) && elem.nodeType === 1 );
-				return false;
-			};
-		}),
-
-		// Miscellaneous
-		"target": function( elem ) {
-			var hash = window.location && window.location.hash;
-			return hash && hash.slice( 1 ) === elem.id;
-		},
-
-		"root": function( elem ) {
-			return elem === docElem;
-		},
-
-		"focus": function( elem ) {
-			return elem === document.activeElement && (!document.hasFocus || document.hasFocus()) && !!(elem.type || elem.href || ~elem.tabIndex);
-		},
-
-		// Boolean properties
-		"enabled": function( elem ) {
-			return elem.disabled === false;
-		},
-
-		"disabled": function( elem ) {
-			return elem.disabled === true;
-		},
-
-		"checked": function( elem ) {
-			// In CSS3, :checked should return both checked and selected elements
-			// http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked
-			var nodeName = elem.nodeName.toLowerCase();
-			return (nodeName === "input" && !!elem.checked) || (nodeName === "option" && !!elem.selected);
-		},
-
-		"selected": function( elem ) {
-			// Accessing this property makes selected-by-default
-			// options in Safari work properly
-			if ( elem.parentNode ) {
-				elem.parentNode.selectedIndex;
-			}
-
-			return elem.selected === true;
-		},
-
-		// Contents
-		"empty": function( elem ) {
-			// http://www.w3.org/TR/selectors/#empty-pseudo
-			// :empty is negated by element (1) or content nodes (text: 3; cdata: 4; entity ref: 5),
-			//   but not by others (comment: 8; processing instruction: 7; etc.)
-			// nodeType < 6 works because attributes (2) do not appear as children
-			for ( elem = elem.firstChild; elem; elem = elem.nextSibling ) {
-				if ( elem.nodeType < 6 ) {
-					return false;
-				}
-			}
-			return true;
-		},
-
-		"parent": function( elem ) {
-			return !Expr.pseudos["empty"]( elem );
-		},
-
-		// Element/input types
-		"header": function( elem ) {
-			return rheader.test( elem.nodeName );
-		},
-
-		"input": function( elem ) {
-			return rinputs.test( elem.nodeName );
-		},
-
-		"button": function( elem ) {
-			var name = elem.nodeName.toLowerCase();
-			return name === "input" && elem.type === "button" || name === "button";
-		},
-
-		"text": function( elem ) {
-			var attr;
-			return elem.nodeName.toLowerCase() === "input" &&
-				elem.type === "text" &&
-
-				// Support: IE<8
-				// New HTML5 attribute values (e.g., "search") appear with elem.type === "text"
-				( (attr = elem.getAttribute("type")) == null || attr.toLowerCase() === "text" );
-		},
-
-		// Position-in-collection
-		"first": createPositionalPseudo(function() {
-			return [ 0 ];
-		}),
-
-		"last": createPositionalPseudo(function( matchIndexes, length ) {
-			return [ length - 1 ];
-		}),
-
-		"eq": createPositionalPseudo(function( matchIndexes, length, argument ) {
-			return [ argument < 0 ? argument + length : argument ];
-		}),
-
-		"even": createPositionalPseudo(function( matchIndexes, length ) {
-			var i = 0;
-			for ( ; i < length; i += 2 ) {
-				matchIndexes.push( i );
-			}
-			return matchIndexes;
-		}),
-
-		"odd": createPositionalPseudo(function( matchIndexes, length ) {
-			var i = 1;
-			for ( ; i < length; i += 2 ) {
-				matchIndexes.push( i );
-			}
-			return matchIndexes;
-		}),
-
-		"lt": createPositionalPseudo(function( matchIndexes, length, argument ) {
-			var i = argument < 0 ? argument + length : argument;
-			for ( ; --i >= 0; ) {
-				matchIndexes.push( i );
-			}
-			return matchIndexes;
-		}),
-
-		"gt": createPositionalPseudo(function( matchIndexes, length, argument ) {
-			var i = argument < 0 ? argument + length : argument;
-			for ( ; ++i < length; ) {
-				matchIndexes.push( i );
-			}
-			return matchIndexes;
-		})
-	}
-};
-
-Expr.pseudos["nth"] = Expr.pseudos["eq"];
-
-// Add button/input type pseudos
-for ( i in { radio: true, checkbox: true, file: true, password: true, image: true } ) {
-	Expr.pseudos[ i ] = createInputPseudo( i );
-}
-for ( i in { submit: true, reset: true } ) {
-	Expr.pseudos[ i ] = createButtonPseudo( i );
-}
-
-// Easy API for creating new setFilters
-function setFilters() {}
-setFilters.prototype = Expr.filters = Expr.pseudos;
-Expr.setFilters = new setFilters();
-
-tokenize = Sizzle.tokenize = function( selector, parseOnly ) {
-	var matched, match, tokens, type,
-		soFar, groups, preFilters,
-		cached = tokenCache[ selector + " " ];
-
-	if ( cached ) {
-		return parseOnly ? 0 : cached.slice( 0 );
-	}
-
-	soFar = selector;
-	groups = [];
-	preFilters = Expr.preFilter;
-
-	while ( soFar ) {
-
-		// Comma and first run
-		if ( !matched || (match = rcomma.exec( soFar )) ) {
-			if ( match ) {
-				// Don't consume trailing commas as valid
-				soFar = soFar.slice( match[0].length ) || soFar;
-			}
-			groups.push( (tokens = []) );
-		}
-
-		matched = false;
-
-		// Combinators
-		if ( (match = rcombinators.exec( soFar )) ) {
-			matched = match.shift();
-			tokens.push({
-				value: matched,
-				// Cast descendant combinators to space
-				type: match[0].replace( rtrim, " " )
-			});
-			soFar = soFar.slice( matched.length );
-		}
-
-		// Filters
-		for ( type in Expr.filter ) {
-			if ( (match = matchExpr[ type ].exec( soFar )) && (!preFilters[ type ] ||
-				(match = preFilters[ type ]( match ))) ) {
-				matched = match.shift();
-				tokens.push({
-					value: matched,
-					type: type,
-					matches: match
-				});
-				soFar = soFar.slice( matched.length );
-			}
-		}
-
-		if ( !matched ) {
-			break;
-		}
-	}
-
-	// Return the length of the invalid excess
-	// if we're just parsing
-	// Otherwise, throw an error or return tokens
-	return parseOnly ?
-		soFar.length :
-		soFar ?
-			Sizzle.error( selector ) :
-			// Cache the tokens
-			tokenCache( selector, groups ).slice( 0 );
-};
-
-function toSelector( tokens ) {
-	var i = 0,
-		len = tokens.length,
-		selector = "";
-	for ( ; i < len; i++ ) {
-		selector += tokens[i].value;
-	}
-	return selector;
-}
-
-function addCombinator( matcher, combinator, base ) {
-	var dir = combinator.dir,
-		checkNonElements = base && dir === "parentNode",
-		doneName = done++;
-
-	return combinator.first ?
-		// Check against closest ancestor/preceding element
-		function( elem, context, xml ) {
-			while ( (elem = elem[ dir ]) ) {
-				if ( elem.nodeType === 1 || checkNonElements ) {
-					return matcher( elem, context, xml );
-				}
-			}
-		} :
-
-		// Check against all ancestor/preceding elements
-		function( elem, context, xml ) {
-			var oldCache, uniqueCache, outerCache,
-				newCache = [ dirruns, doneName ];
-
-			// We can't set arbitrary data on XML nodes, so they don't benefit from combinator caching
-			if ( xml ) {
-				while ( (elem = elem[ dir ]) ) {
-					if ( elem.nodeType === 1 || checkNonElements ) {
-						if ( matcher( elem, context, xml ) ) {
-							return true;
-						}
-					}
-				}
-			} else {
-				while ( (elem = elem[ dir ]) ) {
-					if ( elem.nodeType === 1 || checkNonElements ) {
-						outerCache = elem[ expando ] || (elem[ expando ] = {});
-
-						// Support: IE <9 only
-						// Defend against cloned attroperties (jQuery gh-1709)
-						uniqueCache = outerCache[ elem.uniqueID ] || (outerCache[ elem.uniqueID ] = {});
-
-						if ( (oldCache = uniqueCache[ dir ]) &&
-							oldCache[ 0 ] === dirruns && oldCache[ 1 ] === doneName ) {
-
-							// Assign to newCache so results back-propagate to previous elements
-							return (newCache[ 2 ] = oldCache[ 2 ]);
-						} else {
-							// Reuse newcache so results back-propagate to previous elements
-							uniqueCache[ dir ] = newCache;
-
-							// A match means we're done; a fail means we have to keep checking
-							if ( (newCache[ 2 ] = matcher( elem, context, xml )) ) {
-								return true;
-							}
-						}
-					}
-				}
-			}
-		};
-}
-
-function elementMatcher( matchers ) {
-	return matchers.length > 1 ?
-		function( elem, context, xml ) {
-			var i = matchers.length;
-			while ( i-- ) {
-				if ( !matchers[i]( elem, context, xml ) ) {
-					return false;
-				}
-			}
-			return true;
-		} :
-		matchers[0];
-}
-
-function multipleContexts( selector, contexts, results ) {
-	var i = 0,
-		len = contexts.length;
-	for ( ; i < len; i++ ) {
-		Sizzle( selector, contexts[i], results );
-	}
-	return results;
-}
-
-function condense( unmatched, map, filter, context, xml ) {
-	var elem,
-		newUnmatched = [],
-		i = 0,
-		len = unmatched.length,
-		mapped = map != null;
-
-	for ( ; i < len; i++ ) {
-		if ( (elem = unmatched[i]) ) {
-			if ( !filter || filter( elem, context, xml ) ) {
-				newUnmatched.push( elem );
-				if ( mapped ) {
-					map.push( i );
-				}
-			}
-		}
-	}
-
-	return newUnmatched;
-}
-
-function setMatcher( preFilter, selector, matcher, postFilter, postFinder, postSelector ) {
-	if ( postFilter && !postFilter[ expando ] ) {
-		postFilter = setMatcher( postFilter );
-	}
-	if ( postFinder && !postFinder[ expando ] ) {
-		postFinder = setMatcher( postFinder, postSelector );
-	}
-	return markFunction(function( seed, results, context, xml ) {
-		var temp, i, elem,
-			preMap = [],
-			postMap = [],
-			preexisting = results.length,
-
-			// Get initial elements from seed or context
-			elems = seed || multipleContexts( selector || "*", context.nodeType ? [ context ] : context, [] ),
-
-			// Prefilter to get matcher input, preserving a map for seed-results synchronization
-			matcherIn = preFilter && ( seed || !selector ) ?
-				condense( elems, preMap, preFilter, context, xml ) :
-				elems,
-
-			matcherOut = matcher ?
-				// If we have a postFinder, or filtered seed, or non-seed postFilter or preexisting results,
-				postFinder || ( seed ? preFilter : preexisting || postFilter ) ?
-
-					// ...intermediate processing is necessary
-					[] :
-
-					// ...otherwise use results directly
-					results :
-				matcherIn;
-
-		// Find primary matches
-		if ( matcher ) {
-			matcher( matcherIn, matcherOut, context, xml );
-		}
-
-		// Apply postFilter
-		if ( postFilter ) {
-			temp = condense( matcherOut, postMap );
-			postFilter( temp, [], context, xml );
-
-			// Un-match failing elements by moving them back to matcherIn
-			i = temp.length;
-			while ( i-- ) {
-				if ( (elem = temp[i]) ) {
-					matcherOut[ postMap[i] ] = !(matcherIn[ postMap[i] ] = elem);
-				}
-			}
-		}
-
-		if ( seed ) {
-			if ( postFinder || preFilter ) {
-				if ( postFinder ) {
-					// Get the final matcherOut by condensing this intermediate into postFinder contexts
-					temp = [];
-					i = matcherOut.length;
-					while ( i-- ) {
-						if ( (elem = matcherOut[i]) ) {
-							// Restore matcherIn since elem is not yet a final match
-							temp.push( (matcherIn[i] = elem) );
-						}
-					}
-					postFinder( null, (matcherOut = []), temp, xml );
-				}
-
-				// Move matched elements from seed to results to keep them synchronized
-				i = matcherOut.length;
-				while ( i-- ) {
-					if ( (elem = matcherOut[i]) &&
-						(temp = postFinder ? indexOf( seed, elem ) : preMap[i]) > -1 ) {
-
-						seed[temp] = !(results[temp] = elem);
-					}
-				}
-			}
-
-		// Add elements to results, through postFinder if defined
-		} else {
-			matcherOut = condense(
-				matcherOut === results ?
-					matcherOut.splice( preexisting, matcherOut.length ) :
-					matcherOut
-			);
-			if ( postFinder ) {
-				postFinder( null, results, matcherOut, xml );
-			} else {
-				push.apply( results, matcherOut );
-			}
-		}
-	});
-}
-
-function matcherFromTokens( tokens ) {
-	var checkContext, matcher, j,
-		len = tokens.length,
-		leadingRelative = Expr.relative[ tokens[0].type ],
-		implicitRelative = leadingRelative || Expr.relative[" "],
-		i = leadingRelative ? 1 : 0,
-
-		// The foundational matcher ensures that elements are reachable from top-level context(s)
-		matchContext = addCombinator( function( elem ) {
-			return elem === checkContext;
-		}, implicitRelative, true ),
-		matchAnyContext = addCombinator( function( elem ) {
-			return indexOf( checkContext, elem ) > -1;
-		}, implicitRelative, true ),
-		matchers = [ function( elem, context, xml ) {
-			var ret = ( !leadingRelative && ( xml || context !== outermostContext ) ) || (
-				(checkContext = context).nodeType ?
-					matchContext( elem, context, xml ) :
-					matchAnyContext( elem, context, xml ) );
-			// Avoid hanging onto element (issue #299)
-			checkContext = null;
-			return ret;
-		} ];
-
-	for ( ; i < len; i++ ) {
-		if ( (matcher = Expr.relative[ tokens[i].type ]) ) {
-			matchers = [ addCombinator(elementMatcher( matchers ), matcher) ];
-		} else {
-			matcher = Expr.filter[ tokens[i].type ].apply( null, tokens[i].matches );
-
-			// Return special upon seeing a positional matcher
-			if ( matcher[ expando ] ) {
-				// Find the next relative operator (if any) for proper handling
-				j = ++i;
-				for ( ; j < len; j++ ) {
-					if ( Expr.relative[ tokens[j].type ] ) {
-						break;
-					}
-				}
-				return setMatcher(
-					i > 1 && elementMatcher( matchers ),
-					i > 1 && toSelector(
-						// If the preceding token was a descendant combinator, insert an implicit any-element `*`
-						tokens.slice( 0, i - 1 ).concat({ value: tokens[ i - 2 ].type === " " ? "*" : "" })
-					).replace( rtrim, "$1" ),
-					matcher,
-					i < j && matcherFromTokens( tokens.slice( i, j ) ),
-					j < len && matcherFromTokens( (tokens = tokens.slice( j )) ),
-					j < len && toSelector( tokens )
-				);
-			}
-			matchers.push( matcher );
-		}
-	}
-
-	return elementMatcher( matchers );
-}
-
-function matcherFromGroupMatchers( elementMatchers, setMatchers ) {
-	var bySet = setMatchers.length > 0,
-		byElement = elementMatchers.length > 0,
-		superMatcher = function( seed, context, xml, results, outermost ) {
-			var elem, j, matcher,
-				matchedCount = 0,
-				i = "0",
-				unmatched = seed && [],
-				setMatched = [],
-				contextBackup = outermostContext,
-				// We must always have either seed elements or outermost context
-				elems = seed || byElement && Expr.find["TAG"]( "*", outermost ),
-				// Use integer dirruns iff this is the outermost matcher
-				dirrunsUnique = (dirruns += contextBackup == null ? 1 : Math.random() || 0.1),
-				len = elems.length;
-
-			if ( outermost ) {
-				outermostContext = context === document || context || outermost;
-			}
-
-			// Add elements passing elementMatchers directly to results
-			// Support: IE<9, Safari
-			// Tolerate NodeList properties (IE: "length"; Safari: <number>) matching elements by id
-			for ( ; i !== len && (elem = elems[i]) != null; i++ ) {
-				if ( byElement && elem ) {
-					j = 0;
-					if ( !context && elem.ownerDocument !== document ) {
-						setDocument( elem );
-						xml = !documentIsHTML;
-					}
-					while ( (matcher = elementMatchers[j++]) ) {
-						if ( matcher( elem, context || document, xml) ) {
-							results.push( elem );
-							break;
-						}
-					}
-					if ( outermost ) {
-						dirruns = dirrunsUnique;
-					}
-				}
-
-				// Track unmatched elements for set filters
-				if ( bySet ) {
-					// They will have gone through all possible matchers
-					if ( (elem = !matcher && elem) ) {
-						matchedCount--;
-					}
-
-					// Lengthen the array for every element, matched or not
-					if ( seed ) {
-						unmatched.push( elem );
-					}
-				}
-			}
-
-			// `i` is now the count of elements visited above, and adding it to `matchedCount`
-			// makes the latter nonnegative.
-			matchedCount += i;
-
-			// Apply set filters to unmatched elements
-			// NOTE: This can be skipped if there are no unmatched elements (i.e., `matchedCount`
-			// equals `i`), unless we didn't visit _any_ elements in the above loop because we have
-			// no element matchers and no seed.
-			// Incrementing an initially-string "0" `i` allows `i` to remain a string only in that
-			// case, which will result in a "00" `matchedCount` that differs from `i` but is also
-			// numerically zero.
-			if ( bySet && i !== matchedCount ) {
-				j = 0;
-				while ( (matcher = setMatchers[j++]) ) {
-					matcher( unmatched, setMatched, context, xml );
-				}
-
-				if ( seed ) {
-					// Reintegrate element matches to eliminate the need for sorting
-					if ( matchedCount > 0 ) {
-						while ( i-- ) {
-							if ( !(unmatched[i] || setMatched[i]) ) {
-								setMatched[i] = pop.call( results );
-							}
-						}
-					}
-
-					// Discard index placeholder values to get only actual matches
-					setMatched = condense( setMatched );
-				}
-
-				// Add matches to results
-				push.apply( results, setMatched );
-
-				// Seedless set matches succeeding multiple successful matchers stipulate sorting
-				if ( outermost && !seed && setMatched.length > 0 &&
-					( matchedCount + setMatchers.length ) > 1 ) {
-
-					Sizzle.uniqueSort( results );
-				}
-			}
-
-			// Override manipulation of globals by nested matchers
-			if ( outermost ) {
-				dirruns = dirrunsUnique;
-				outermostContext = contextBackup;
-			}
-
-			return unmatched;
-		};
-
-	return bySet ?
-		markFunction( superMatcher ) :
-		superMatcher;
-}
-
-compile = Sizzle.compile = function( selector, match /* Internal Use Only */ ) {
-	var i,
-		setMatchers = [],
-		elementMatchers = [],
-		cached = compilerCache[ selector + " " ];
-
-	if ( !cached ) {
-		// Generate a function of recursive functions that can be used to check each element
-		if ( !match ) {
-			match = tokenize( selector );
-		}
-		i = match.length;
-		while ( i-- ) {
-			cached = matcherFromTokens( match[i] );
-			if ( cached[ expando ] ) {
-				setMatchers.push( cached );
-			} else {
-				elementMatchers.push( cached );
-			}
-		}
-
-		// Cache the compiled function
-		cached = compilerCache( selector, matcherFromGroupMatchers( elementMatchers, setMatchers ) );
-
-		// Save selector and tokenization
-		cached.selector = selector;
-	}
-	return cached;
-};
-
-/**
- * A low-level selection function that works with Sizzle's compiled
- *  selector functions
- * @param {String|Function} selector A selector or a pre-compiled
- *  selector function built with Sizzle.compile
- * @param {Element} context
- * @param {Array} [results]
- * @param {Array} [seed] A set of elements to match against
- */
-select = Sizzle.select = function( selector, context, results, seed ) {
-	var i, tokens, token, type, find,
-		compiled = typeof selector === "function" && selector,
-		match = !seed && tokenize( (selector = compiled.selector || selector) );
-
-	results = results || [];
-
-	// Try to minimize operations if there is only one selector in the list and no seed
-	// (the latter of which guarantees us context)
-	if ( match.length === 1 ) {
-
-		// Reduce context if the leading compound selector is an ID
-		tokens = match[0] = match[0].slice( 0 );
-		if ( tokens.length > 2 && (token = tokens[0]).type === "ID" &&
-				support.getById && context.nodeType === 9 && documentIsHTML &&
-				Expr.relative[ tokens[1].type ] ) {
-
-			context = ( Expr.find["ID"]( token.matches[0].replace(runescape, funescape), context ) || [] )[0];
-			if ( !context ) {
-				return results;
-
-			// Precompiled matchers will still verify ancestry, so step up a level
-			} else if ( compiled ) {
-				context = context.parentNode;
-			}
-
-			selector = selector.slice( tokens.shift().value.length );
-		}
-
-		// Fetch a seed set for right-to-left matching
-		i = matchExpr["needsContext"].test( selector ) ? 0 : tokens.length;
-		while ( i-- ) {
-			token = tokens[i];
-
-			// Abort if we hit a combinator
-			if ( Expr.relative[ (type = token.type) ] ) {
-				break;
-			}
-			if ( (find = Expr.find[ type ]) ) {
-				// Search, expanding context for leading sibling combinators
-				if ( (seed = find(
-					token.matches[0].replace( runescape, funescape ),
-					rsibling.test( tokens[0].type ) && testContext( context.parentNode ) || context
-				)) ) {
-
-					// If seed is empty or no tokens remain, we can return early
-					tokens.splice( i, 1 );
-					selector = seed.length && toSelector( tokens );
-					if ( !selector ) {
-						push.apply( results, seed );
-						return results;
-					}
-
-					break;
-				}
-			}
-		}
-	}
-
-	// Compile and execute a filtering function if one is not provided
-	// Provide `match` to avoid retokenization if we modified the selector above
-	( compiled || compile( selector, match ) )(
-		seed,
-		context,
-		!documentIsHTML,
-		results,
-		!context || rsibling.test( selector ) && testContext( context.parentNode ) || context
-	);
-	return results;
-};
-
-// One-time assignments
-
-// Sort stability
-support.sortStable = expando.split("").sort( sortOrder ).join("") === expando;
-
-// Support: Chrome 14-35+
-// Always assume duplicates if they aren't passed to the comparison function
-support.detectDuplicates = !!hasDuplicate;
-
-// Initialize against the default document
-setDocument();
-
-// Support: Webkit<537.32 - Safari 6.0.3/Chrome 25 (fixed in Chrome 27)
-// Detached nodes confoundingly follow *each other*
-support.sortDetached = assert(function( div1 ) {
-	// Should return 1, but returns 4 (following)
-	return div1.compareDocumentPosition( document.createElement("div") ) & 1;
-});
-
-// Support: IE<8
-// Prevent attribute/property "interpolation"
-// http://msdn.microsoft.com/en-us/library/ms536429%28VS.85%29.aspx
-if ( !assert(function( div ) {
-	div.innerHTML = "<a href='#'></a>";
-	return div.firstChild.getAttribute("href") === "#" ;
-}) ) {
-	addHandle( "type|href|height|width", function( elem, name, isXML ) {
-		if ( !isXML ) {
-			return elem.getAttribute( name, name.toLowerCase() === "type" ? 1 : 2 );
-		}
-	});
-}
-
-// Support: IE<9
-// Use defaultValue in place of getAttribute("value")
-if ( !support.attributes || !assert(function( div ) {
-	div.innerHTML = "<input/>";
-	div.firstChild.setAttribute( "value", "" );
-	return div.firstChild.getAttribute( "value" ) === "";
-}) ) {
-	addHandle( "value", function( elem, name, isXML ) {
-		if ( !isXML && elem.nodeName.toLowerCase() === "input" ) {
-			return elem.defaultValue;
-		}
-	});
-}
-
-// Support: IE<9
-// Use getAttributeNode to fetch booleans when getAttribute lies
-if ( !assert(function( div ) {
-	return div.getAttribute("disabled") == null;
-}) ) {
-	addHandle( booleans, function( elem, name, isXML ) {
-		var val;
-		if ( !isXML ) {
-			return elem[ name ] === true ? name.toLowerCase() :
-					(val = elem.getAttributeNode( name )) && val.specified ?
-					val.value :
-				null;
-		}
-	});
-}
-
-return Sizzle;
-
-})( window );
-
-
-
-jQuery.find = Sizzle;
-jQuery.expr = Sizzle.selectors;
-jQuery.expr[ ":" ] = jQuery.expr.pseudos;
-jQuery.uniqueSort = jQuery.unique = Sizzle.uniqueSort;
-jQuery.text = Sizzle.getText;
-jQuery.isXMLDoc = Sizzle.isXML;
-jQuery.contains = Sizzle.contains;
-
-
-
-var dir = function( elem, dir, until ) {
-	var matched = [],
-		truncate = until !== undefined;
-
-	while ( ( elem = elem[ dir ] ) && elem.nodeType !== 9 ) {
-		if ( elem.nodeType === 1 ) {
-			if ( truncate && jQuery( elem ).is( until ) ) {
-				break;
-			}
-			matched.push( elem );
-		}
-	}
-	return matched;
-};
-
-
-var siblings = function( n, elem ) {
-	var matched = [];
-
-	for ( ; n; n = n.nextSibling ) {
-		if ( n.nodeType === 1 && n !== elem ) {
-			matched.push( n );
-		}
-	}
-
-	return matched;
-};
-
-
-var rneedsContext = jQuery.expr.match.needsContext;
-
-var rsingleTag = ( /^<([\w-]+)\s*\/?>(?:<\/\1>|)$/ );
-
-
-
-var risSimple = /^.[^:#\[\.,]*$/;
-
-// Implement the identical functionality for filter and not
-function winnow( elements, qualifier, not ) {
-	if ( jQuery.isFunction( qualifier ) ) {
-		return jQuery.grep( elements, function( elem, i ) {
-			/* jshint -W018 */
-			return !!qualifier.call( elem, i, elem ) !== not;
-		} );
-
-	}
-
-	if ( qualifier.nodeType ) {
-		return jQuery.grep( elements, function( elem ) {
-			return ( elem === qualifier ) !== not;
-		} );
-
-	}
-
-	if ( typeof qualifier === "string" ) {
-		if ( risSimple.test( qualifier ) ) {
-			return jQuery.filter( qualifier, elements, not );
-		}
-
-		qualifier = jQuery.filter( qualifier, elements );
-	}
-
-	return jQuery.grep( elements, function( elem ) {
-		return ( jQuery.inArray( elem, qualifier ) > -1 ) !== not;
-	} );
-}
-
-jQuery.filter = function( expr, elems, not ) {
-	var elem = elems[ 0 ];
-
-	if ( not ) {
-		expr = ":not(" + expr + ")";
-	}
-
-	return elems.length === 1 && elem.nodeType === 1 ?
-		jQuery.find.matchesSelector( elem, expr ) ? [ elem ] : [] :
-		jQuery.find.matches( expr, jQuery.grep( elems, function( elem ) {
-			return elem.nodeType === 1;
-		} ) );
-};
-
-jQuery.fn.extend( {
-	find: function( selector ) {
-		var i,
-			ret = [],
-			self = this,
-			len = self.length;
-
-		if ( typeof selector !== "string" ) {
-			return this.pushStack( jQuery( selector ).filter( function() {
-				for ( i = 0; i < len; i++ ) {
-					if ( jQuery.contains( self[ i ], this ) ) {
-						return true;
-					}
-				}
-			} ) );
-		}
-
-		for ( i = 0; i < len; i++ ) {
-			jQuery.find( selector, self[ i ], ret );
-		}
-
-		// Needed because $( selector, context ) becomes $( context ).find( selector )
-		ret = this.pushStack( len > 1 ? jQuery.unique( ret ) : ret );
-		ret.selector = this.selector ? this.selector + " " + selector : selector;
-		return ret;
-	},
-	filter: function( selector ) {
-		return this.pushStack( winnow( this, selector || [], false ) );
-	},
-	not: function( selector ) {
-		return this.pushStack( winnow( this, selector || [], true ) );
-	},
-	is: function( selector ) {
-		return !!winnow(
-			this,
-
-			// If this is a positional/relative selector, check membership in the returned set
-			// so $("p:first").is("p:last") won't return true for a doc with two "p".
-			typeof selector === "string" && rneedsContext.test( selector ) ?
-				jQuery( selector ) :
-				selector || [],
-			false
-		).length;
-	}
-} );
-
-
-// Initialize a jQuery object
-
-
-// A central reference to the root jQuery(document)
-var rootjQuery,
-
-	// A simple way to check for HTML strings
-	// Prioritize #id over <tag> to avoid XSS via location.hash (#9521)
-	// Strict HTML recognition (#11290: must start with <)
-	rquickExpr = /^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]*))$/,
-
-	init = jQuery.fn.init = function( selector, context, root ) {
-		var match, elem;
-
-		// HANDLE: $(""), $(null), $(undefined), $(false)
-		if ( !selector ) {
-			return this;
-		}
-
-		// init accepts an alternate rootjQuery
-		// so migrate can support jQuery.sub (gh-2101)
-		root = root || rootjQuery;
-
-		// Handle HTML strings
-		if ( typeof selector === "string" ) {
-			if ( selector.charAt( 0 ) === "<" &&
-				selector.charAt( selector.length - 1 ) === ">" &&
-				selector.length >= 3 ) {
-
-				// Assume that strings that start and end with <> are HTML and skip the regex check
-				match = [ null, selector, null ];
-
-			} else {
-				match = rquickExpr.exec( selector );
-			}
-
-			// Match html or make sure no context is specified for #id
-			if ( match && ( match[ 1 ] || !context ) ) {
-
-				// HANDLE: $(html) -> $(array)
-				if ( match[ 1 ] ) {
-					context = context instanceof jQuery ? context[ 0 ] : context;
-
-					// scripts is true for back-compat
-					// Intentionally let the error be thrown if parseHTML is not present
-					jQuery.merge( this, jQuery.parseHTML(
-						match[ 1 ],
-						context && context.nodeType ? context.ownerDocument || context : document,
-						true
-					) );
-
-					// HANDLE: $(html, props)
-					if ( rsingleTag.test( match[ 1 ] ) && jQuery.isPlainObject( context ) ) {
-						for ( match in context ) {
-
-							// Properties of context are called as methods if possible
-							if ( jQuery.isFunction( this[ match ] ) ) {
-								this[ match ]( context[ match ] );
-
-							// ...and otherwise set as attributes
-							} else {
-								this.attr( match, context[ match ] );
-							}
-						}
-					}
-
-					return this;
-
-				// HANDLE: $(#id)
-				} else {
-					elem = document.getElementById( match[ 2 ] );
-
-					// Check parentNode to catch when Blackberry 4.6 returns
-					// nodes that are no longer in the document #6963
-					if ( elem && elem.parentNode ) {
-
-						// Handle the case where IE and Opera return items
-						// by name instead of ID
-						if ( elem.id !== match[ 2 ] ) {
-							return rootjQuery.find( selector );
-						}
-
-						// Otherwise, we inject the element directly into the jQuery object
-						this.length = 1;
-						this[ 0 ] = elem;
-					}
-
-					this.context = document;
-					this.selector = selector;
-					return this;
-				}
-
-			// HANDLE: $(expr, $(...))
-			} else if ( !context || context.jquery ) {
-				return ( context || root ).find( selector );
-
-			// HANDLE: $(expr, context)
-			// (which is just equivalent to: $(context).find(expr)
-			} else {
-				return this.constructor( context ).find( selector );
-			}
-
-		// HANDLE: $(DOMElement)
-		} else if ( selector.nodeType ) {
-			this.context = this[ 0 ] = selector;
-			this.length = 1;
-			return this;
-
-		// HANDLE: $(function)
-		// Shortcut for document ready
-		} else if ( jQuery.isFunction( selector ) ) {
-			return typeof root.ready !== "undefined" ?
-				root.ready( selector ) :
-
-				// Execute immediately if ready is not present
-				selector( jQuery );
-		}
-
-		if ( selector.selector !== undefined ) {
-			this.selector = selector.selector;
-			this.context = selector.context;
-		}
-
-		return jQuery.makeArray( selector, this );
-	};
-
-// Give the init function the jQuery prototype for later instantiation
-init.prototype = jQuery.fn;
-
-// Initialize central reference
-rootjQuery = jQuery( document );
-
-
-var rparentsprev = /^(?:parents|prev(?:Until|All))/,
-
-	// methods guaranteed to produce a unique set when starting from a unique set
-	guaranteedUnique = {
-		children: true,
-		contents: true,
-		next: true,
-		prev: true
-	};
-
-jQuery.fn.extend( {
-	has: function( target ) {
-		var i,
-			targets = jQuery( target, this ),
-			len = targets.length;
-
-		return this.filter( function() {
-			for ( i = 0; i < len; i++ ) {
-				if ( jQuery.contains( this, targets[ i ] ) ) {
-					return true;
-				}
-			}
-		} );
-	},
-
-	closest: function( selectors, context ) {
-		var cur,
-			i = 0,
-			l = this.length,
-			matched = [],
-			pos = rneedsContext.test( selectors ) || typeof selectors !== "string" ?
-				jQuery( selectors, context || this.context ) :
-				0;
-
-		for ( ; i < l; i++ ) {
-			for ( cur = this[ i ]; cur && cur !== context; cur = cur.parentNode ) {
-
-				// Always skip document fragments
-				if ( cur.nodeType < 11 && ( pos ?
-					pos.index( cur ) > -1 :
-
-					// Don't pass non-elements to Sizzle
-					cur.nodeType === 1 &&
-						jQuery.find.matchesSelector( cur, selectors ) ) ) {
-
-					matched.push( cur );
-					break;
-				}
-			}
-		}
-
-		return this.pushStack( matched.length > 1 ? jQuery.uniqueSort( matched ) : matched );
-	},
-
-	// Determine the position of an element within
-	// the matched set of elements
-	index: function( elem ) {
-
-		// No argument, return index in parent
-		if ( !elem ) {
-			return ( this[ 0 ] && this[ 0 ].parentNode ) ? this.first().prevAll().length : -1;
-		}
-
-		// index in selector
-		if ( typeof elem === "string" ) {
-			return jQuery.inArray( this[ 0 ], jQuery( elem ) );
-		}
-
-		// Locate the position of the desired element
-		return jQuery.inArray(
-
-			// If it receives a jQuery object, the first element is used
-			elem.jquery ? elem[ 0 ] : elem, this );
-	},
-
-	add: function( selector, context ) {
-		return this.pushStack(
-			jQuery.uniqueSort(
-				jQuery.merge( this.get(), jQuery( selector, context ) )
-			)
-		);
-	},
-
-	addBack: function( selector ) {
-		return this.add( selector == null ?
-			this.prevObject : this.prevObject.filter( selector )
-		);
-	}
-} );
-
-function sibling( cur, dir ) {
-	do {
-		cur = cur[ dir ];
-	} while ( cur && cur.nodeType !== 1 );
-
-	return cur;
-}
-
-jQuery.each( {
-	parent: function( elem ) {
-		var parent = elem.parentNode;
-		return parent && parent.nodeType !== 11 ? parent : null;
-	},
-	parents: function( elem ) {
-		return dir( elem, "parentNode" );
-	},
-	parentsUntil: function( elem, i, until ) {
-		return dir( elem, "parentNode", until );
-	},
-	next: function( elem ) {
-		return sibling( elem, "nextSibling" );
-	},
-	prev: function( elem ) {
-		return sibling( elem, "previousSibling" );
-	},
-	nextAll: function( elem ) {
-		return dir( elem, "nextSibling" );
-	},
-	prevAll: function( elem ) {
-		return dir( elem, "previousSibling" );
-	},
-	nextUntil: function( elem, i, until ) {
-		return dir( elem, "nextSibling", until );
-	},
-	prevUntil: function( elem, i, until ) {
-		return dir( elem, "previousSibling", until );
-	},
-	siblings: function( elem ) {
-		return siblings( ( elem.parentNode || {} ).firstChild, elem );
-	},
-	children: function( elem ) {
-		return siblings( elem.firstChild );
-	},
-	contents: function( elem ) {
-		return jQuery.nodeName( elem, "iframe" ) ?
-			elem.contentDocument || elem.contentWindow.document :
-			jQuery.merge( [], elem.childNodes );
-	}
-}, function( name, fn ) {
-	jQuery.fn[ name ] = function( until, selector ) {
-		var ret = jQuery.map( this, fn, until );
-
-		if ( name.slice( -5 ) !== "Until" ) {
-			selector = until;
-		}
-
-		if ( selector && typeof selector === "string" ) {
-			ret = jQuery.filter( selector, ret );
-		}
-
-		if ( this.length > 1 ) {
-
-			// Remove duplicates
-			if ( !guaranteedUnique[ name ] ) {
-				ret = jQuery.uniqueSort( ret );
-			}
-
-			// Reverse order for parents* and prev-derivatives
-			if ( rparentsprev.test( name ) ) {
-				ret = ret.reverse();
-			}
-		}
-
-		return this.pushStack( ret );
-	};
-} );
-var rnotwhite = ( /\S+/g );
-
-
-
-// Convert String-formatted options into Object-formatted ones
-function createOptions( options ) {
-	var object = {};
-	jQuery.each( options.match( rnotwhite ) || [], function( _, flag ) {
-		object[ flag ] = true;
-	} );
-	return object;
-}
-
-/*
- * Create a callback list using the following parameters:
- *
- *	options: an optional list of space-separated options that will change how
- *			the callback list behaves or a more traditional option object
- *
- * By default a callback list will act like an event callback list and can be
- * "fired" multiple times.
- *
- * Possible options:
- *
- *	once:			will ensure the callback list can only be fired once (like a Deferred)
- *
- *	memory:			will keep track of previous values and will call any callback added
- *					after the list has been fired right away with the latest "memorized"
- *					values (like a Deferred)
- *
- *	unique:			will ensure a callback can only be added once (no duplicate in the list)
- *
- *	stopOnFalse:	interrupt callings when a callback returns false
- *
- */
-jQuery.Callbacks = function( options ) {
-
-	// Convert options from String-formatted to Object-formatted if needed
-	// (we check in cache first)
-	options = typeof options === "string" ?
-		createOptions( options ) :
-		jQuery.extend( {}, options );
-
-	var // Flag to know if list is currently firing
-		firing,
-
-		// Last fire value for non-forgettable lists
-		memory,
-
-		// Flag to know if list was already fired
-		fired,
-
-		// Flag to prevent firing
-		locked,
-
-		// Actual callback list
-		list = [],
-
-		// Queue of execution data for repeatable lists
-		queue = [],
-
-		// Index of currently firing callback (modified by add/remove as needed)
-		firingIndex = -1,
-
-		// Fire callbacks
-		fire = function() {
-
-			// Enforce single-firing
-			locked = options.once;
-
-			// Execute callbacks for all pending executions,
-			// respecting firingIndex overrides and runtime changes
-			fired = firing = true;
-			for ( ; queue.length; firingIndex = -1 ) {
-				memory = queue.shift();
-				while ( ++firingIndex < list.length ) {
-
-					// Run callback and check for early termination
-					if ( list[ firingIndex ].apply( memory[ 0 ], memory[ 1 ] ) === false &&
-						options.stopOnFalse ) {
-
-						// Jump to end and forget the data so .add doesn't re-fire
-						firingIndex = list.length;
-						memory = false;
-					}
-				}
-			}
-
-			// Forget the data if we're done with it
-			if ( !options.memory ) {
-				memory = false;
-			}
-
-			firing = false;
-
-			// Clean up if we're done firing for good
-			if ( locked ) {
-
-				// Keep an empty list if we have data for future add calls
-				if ( memory ) {
-					list = [];
-
-				// Otherwise, this object is spent
-				} else {
-					list = "";
-				}
-			}
-		},
-
-		// Actual Callbacks object
-		self = {
-
-			// Add a callback or a collection of callbacks to the list
-			add: function() {
-				if ( list ) {
-
-					// If we have memory from a past run, we should fire after adding
-					if ( memory && !firing ) {
-						firingIndex = list.length - 1;
-						queue.push( memory );
-					}
-
-					( function add( args ) {
-						jQuery.each( args, function( _, arg ) {
-							if ( jQuery.isFunction( arg ) ) {
-								if ( !options.unique || !self.has( arg ) ) {
-									list.push( arg );
-								}
-							} else if ( arg && arg.length && jQuery.type( arg ) !== "string" ) {
-
-								// Inspect recursively
-								add( arg );
-							}
-						} );
-					} )( arguments );
-
-					if ( memory && !firing ) {
-						fire();
-					}
-				}
-				return this;
-			},
-
-			// Remove a callback from the list
-			remove: function() {
-				jQuery.each( arguments, function( _, arg ) {
-					var index;
-					while ( ( index = jQuery.inArray( arg, list, index ) ) > -1 ) {
-						list.splice( index, 1 );
-
-						// Handle firing indexes
-						if ( index <= firingIndex ) {
-							firingIndex--;
-						}
-					}
-				} );
-				return this;
-			},
-
-			// Check if a given callback is in the list.
-			// If no argument is given, return whether or not list has callbacks attached.
-			has: function( fn ) {
-				return fn ?
-					jQuery.inArray( fn, list ) > -1 :
-					list.length > 0;
-			},
-
-			// Remove all callbacks from the list
-			empty: function() {
-				if ( list ) {
-					list = [];
-				}
-				return this;
-			},
-
-			// Disable .fire and .add
-			// Abort any current/pending executions
-			// Clear all callbacks and values
-			disable: function() {
-				locked = queue = [];
-				list = memory = "";
-				return this;
-			},
-			disabled: function() {
-				return !list;
-			},
-
-			// Disable .fire
-			// Also disable .add unless we have memory (since it would have no effect)
-			// Abort any pending executions
-			lock: function() {
-				locked = true;
-				if ( !memory ) {
-					self.disable();
-				}
-				return this;
-			},
-			locked: function() {
-				return !!locked;
-			},
-
-			// Call all callbacks with the given context and arguments
-			fireWith: function( context, args ) {
-				if ( !locked ) {
-					args = args || [];
-					args = [ context, args.slice ? args.slice() : args ];
-					queue.push( args );
-					if ( !firing ) {
-						fire();
-					}
-				}
-				return this;
-			},
-
-			// Call all the callbacks with the given arguments
-			fire: function() {
-				self.fireWith( this, arguments );
-				return this;
-			},
-
-			// To know if the callbacks have already been called at least once
-			fired: function() {
-				return !!fired;
-			}
-		};
-
-	return self;
-};
-
-
-jQuery.extend( {
-
-	Deferred: function( func ) {
-		var tuples = [
-
-				// action, add listener, listener list, final state
-				[ "resolve", "done", jQuery.Callbacks( "once memory" ), "resolved" ],
-				[ "reject", "fail", jQuery.Callbacks( "once memory" ), "rejected" ],
-				[ "notify", "progress", jQuery.Callbacks( "memory" ) ]
-			],
-			state = "pending",
-			promise = {
-				state: function() {
-					return state;
-				},
-				always: function() {
-					deferred.done( arguments ).fail( arguments );
-					return this;
-				},
-				then: function( /* fnDone, fnFail, fnProgress */ ) {
-					var fns = arguments;
-					return jQuery.Deferred( function( newDefer ) {
-						jQuery.each( tuples, function( i, tuple ) {
-							var fn = jQuery.isFunction( fns[ i ] ) && fns[ i ];
-
-							// deferred[ done | fail | progress ] for forwarding actions to newDefer
-							deferred[ tuple[ 1 ] ]( function() {
-								var returned = fn && fn.apply( this, arguments );
-								if ( returned && jQuery.isFunction( returned.promise ) ) {
-									returned.promise()
-										.progress( newDefer.notify )
-										.done( newDefer.resolve )
-										.fail( newDefer.reject );
-								} else {
-									newDefer[ tuple[ 0 ] + "With" ](
-										this === promise ? newDefer.promise() : this,
-										fn ? [ returned ] : arguments
-									);
-								}
-							} );
-						} );
-						fns = null;
-					} ).promise();
-				},
-
-				// Get a promise for this deferred
-				// If obj is provided, the promise aspect is added to the object
-				promise: function( obj ) {
-					return obj != null ? jQuery.extend( obj, promise ) : promise;
-				}
-			},
-			deferred = {};
-
-		// Keep pipe for back-compat
-		promise.pipe = promise.then;
-
-		// Add list-specific methods
-		jQuery.each( tuples, function( i, tuple ) {
-			var list = tuple[ 2 ],
-				stateString = tuple[ 3 ];
-
-			// promise[ done | fail | progress ] = list.add
-			promise[ tuple[ 1 ] ] = list.add;
-
-			// Handle state
-			if ( stateString ) {
-				list.add( function() {
-
-					// state = [ resolved | rejected ]
-					state = stateString;
-
-				// [ reject_list | resolve_list ].disable; progress_list.lock
-				}, tuples[ i ^ 1 ][ 2 ].disable, tuples[ 2 ][ 2 ].lock );
-			}
-
-			// deferred[ resolve | reject | notify ]
-			deferred[ tuple[ 0 ] ] = function() {
-				deferred[ tuple[ 0 ] + "With" ]( this === deferred ? promise : this, arguments );
-				return this;
-			};
-			deferred[ tuple[ 0 ] + "With" ] = list.fireWith;
-		} );
-
-		// Make the deferred a promise
-		promise.promise( deferred );
-
-		// Call given func if any
-		if ( func ) {
-			func.call( deferred, deferred );
-		}
-
-		// All done!
-		return deferred;
-	},
-
-	// Deferred helper
-	when: function( subordinate /* , ..., subordinateN */ ) {
-		var i = 0,
-			resolveValues = slice.call( arguments ),
-			length = resolveValues.length,
-
-			// the count of uncompleted subordinates
-			remaining = length !== 1 ||
-				( subordinate && jQuery.isFunction( subordinate.promise ) ) ? length : 0,
-
-			// the master Deferred.
-			// If resolveValues consist of only a single Deferred, just use that.
-			deferred = remaining === 1 ? subordinate : jQuery.Deferred(),
-
-			// Update function for both resolve and progress values
-			updateFunc = function( i, contexts, values ) {
-				return function( value ) {
-					contexts[ i ] = this;
-					values[ i ] = arguments.length > 1 ? slice.call( arguments ) : value;
-					if ( values === progressValues ) {
-						deferred.notifyWith( contexts, values );
-
-					} else if ( !( --remaining ) ) {
-						deferred.resolveWith( contexts, values );
-					}
-				};
-			},
-
-			progressValues, progressContexts, resolveContexts;
-
-		// add listeners to Deferred subordinates; treat others as resolved
-		if ( length > 1 ) {
-			progressValues = new Array( length );
-			progressContexts = new Array( length );
-			resolveContexts = new Array( length );
-			for ( ; i < length; i++ ) {
-				if ( resolveValues[ i ] && jQuery.isFunction( resolveValues[ i ].promise ) ) {
-					resolveValues[ i ].promise()
-						.progress( updateFunc( i, progressContexts, progressValues ) )
-						.done( updateFunc( i, resolveContexts, resolveValues ) )
-						.fail( deferred.reject );
-				} else {
-					--remaining;
-				}
-			}
-		}
-
-		// if we're not waiting on anything, resolve the master
-		if ( !remaining ) {
-			deferred.resolveWith( resolveContexts, resolveValues );
-		}
-
-		return deferred.promise();
-	}
-} );
-
-
-// The deferred used on DOM ready
-var readyList;
-
-jQuery.fn.ready = function( fn ) {
-
-	// Add the callback
-	jQuery.ready.promise().done( fn );
-
-	return this;
-};
-
-jQuery.extend( {
-
-	// Is the DOM ready to be used? Set to true once it occurs.
-	isReady: false,
-
-	// A counter to track how many items to wait for before
-	// the ready event fires. See #6781
-	readyWait: 1,
-
-	// Hold (or release) the ready event
-	holdReady: function( hold ) {
-		if ( hold ) {
-			jQuery.readyWait++;
-		} else {
-			jQuery.ready( true );
-		}
-	},
-
-	// Handle when the DOM is ready
-	ready: function( wait ) {
-
-		// Abort if there are pending holds or we're already ready
-		if ( wait === true ? --jQuery.readyWait : jQuery.isReady ) {
-			return;
-		}
-
-		// Remember that the DOM is ready
-		jQuery.isReady = true;
-
-		// If a normal DOM Ready event fired, decrement, and wait if need be
-		if ( wait !== true && --jQuery.readyWait > 0 ) {
-			return;
-		}
-
-		// If there are functions bound, to execute
-		readyList.resolveWith( document, [ jQuery ] );
-
-		// Trigger any bound ready events
-		if ( jQuery.fn.triggerHandler ) {
-			jQuery( document ).triggerHandler( "ready" );
-			jQuery( document ).off( "ready" );
-		}
-	}
-} );
-
-/**
- * Clean-up method for dom ready events
- */
-function detach() {
-	if ( document.addEventListener ) {
-		document.removeEventListener( "DOMContentLoaded", completed );
-		window.removeEventListener( "load", completed );
-
-	} else {
-		document.detachEvent( "onreadystatechange", completed );
-		window.detachEvent( "onload", completed );
-	}
-}
-
-/**
- * The ready event handler and self cleanup method
- */
-function completed() {
-
-	// readyState === "complete" is good enough for us to call the dom ready in oldIE
-	if ( document.addEventListener ||
-		window.event.type === "load" ||
-		document.readyState === "complete" ) {
-
-		detach();
-		jQuery.ready();
-	}
-}
-
-jQuery.ready.promise = function( obj ) {
-	if ( !readyList ) {
-
-		readyList = jQuery.Deferred();
-
-		// Catch cases where $(document).ready() is called
-		// after the browser event has already occurred.
-		// Support: IE6-10
-		// Older IE sometimes signals "interactive" too soon
-		if ( document.readyState === "complete" ||
-			( document.readyState !== "loading" && !document.documentElement.doScroll ) ) {
-
-			// Handle it asynchronously to allow scripts the opportunity to delay ready
-			window.setTimeout( jQuery.ready );
-
-		// Standards-based browsers support DOMContentLoaded
-		} else if ( document.addEventListener ) {
-
-			// Use the handy event callback
-			document.addEventListener( "DOMContentLoaded", completed );
-
-			// A fallback to window.onload, that will always work
-			window.addEventListener( "load", completed );
-
-		// If IE event model is used
-		} else {
-
-			// Ensure firing before onload, maybe late but safe also for iframes
-			document.attachEvent( "onreadystatechange", completed );
-
-			// A fallback to window.onload, that will always work
-			window.attachEvent( "onload", completed );
-
-			// If IE and not a frame
-			// continually check to see if the document is ready
-			var top = false;
-
-			try {
-				top = window.frameElement == null && document.documentElement;
-			} catch ( e ) {}
-
-			if ( top && top.doScroll ) {
-				( function doScrollCheck() {
-					if ( !jQuery.isReady ) {
-
-						try {
-
-							// Use the trick by Diego Perini
-							// http://javascript.nwbox.com/IEContentLoaded/
-							top.doScroll( "left" );
-						} catch ( e ) {
-							return window.setTimeout( doScrollCheck, 50 );
-						}
-
-						// detach all dom ready events
-						detach();
-
-						// and execute any waiting functions
-						jQuery.ready();
-					}
-				} )();
-			}
-		}
-	}
-	return readyList.promise( obj );
-};
-
-// Kick off the DOM ready check even if the user does not
-jQuery.ready.promise();
-
-
-
-
-// Support: IE<9
-// Iteration over object's inherited properties before its own
-var i;
-for ( i in jQuery( support ) ) {
-	break;
-}
-support.ownFirst = i === "0";
-
-// Note: most support tests are defined in their respective modules.
-// false until the test is run
-support.inlineBlockNeedsLayout = false;
-
-// Execute ASAP in case we need to set body.style.zoom
-jQuery( function() {
-
-	// Minified: var a,b,c,d
-	var val, div, body, container;
-
-	body = document.getElementsByTagName( "body" )[ 0 ];
-	if ( !body || !body.style ) {
-
-		// Return for frameset docs that don't have a body
-		return;
-	}
-
-	// Setup
-	div = document.createElement( "div" );
-	container = document.createElement( "div" );
-	container.style.cssText = "position:absolute;border:0;width:0;height:0;top:0;left:-9999px";
-	body.appendChild( container ).appendChild( div );
-
-	if ( typeof div.style.zoom !== "undefined" ) {
-
-		// Support: IE<8
-		// Check if natively block-level elements act like inline-block
-		// elements when setting their display to 'inline' and giving
-		// them layout
-		div.style.cssText = "display:inline;margin:0;border:0;padding:1px;width:1px;zoom:1";
-
-		support.inlineBlockNeedsLayout = val = div.offsetWidth === 3;
-		if ( val ) {
-
-			// Prevent IE 6 from affecting layout for positioned elements #11048
-			// Prevent IE from shrinking the body in IE 7 mode #12869
-			// Support: IE<8
-			body.style.zoom = 1;
-		}
-	}
-
-	body.removeChild( container );
-} );
-
-
-( function() {
-	var div = document.createElement( "div" );
-
-	// Support: IE<9
-	support.deleteExpando = true;
-	try {
-		delete div.test;
-	} catch ( e ) {
-		support.deleteExpando = false;
-	}
-
-	// Null elements to avoid leaks in IE.
-	div = null;
-} )();
-var acceptData = function( elem ) {
-	var noData = jQuery.noData[ ( elem.nodeName + " " ).toLowerCase() ],
-		nodeType = +elem.nodeType || 1;
-
-	// Do not set data on non-element DOM nodes because it will not be cleared (#8335).
-	return nodeType !== 1 && nodeType !== 9 ?
-		false :
-
-		// Nodes accept data unless otherwise specified; rejection can be conditional
-		!noData || noData !== true && elem.getAttribute( "classid" ) === noData;
-};
-
-
-
-
-var rbrace = /^(?:\{[\w\W]*\}|\[[\w\W]*\])$/,
-	rmultiDash = /([A-Z])/g;
-
-function dataAttr( elem, key, data ) {
-
-	// If nothing was found internally, try to fetch any
-	// data from the HTML5 data-* attribute
-	if ( data === undefined && elem.nodeType === 1 ) {
-
-		var name = "data-" + key.replace( rmultiDash, "-$1" ).toLowerCase();
-
-		data = elem.getAttribute( name );
-
-		if ( typeof data === "string" ) {
-			try {
-				data = data === "true" ? true :
-					data === "false" ? false :
-					data === "null" ? null :
-
-					// Only convert to a number if it doesn't change the string
-					+data + "" === data ? +data :
-					rbrace.test( data ) ? jQuery.parseJSON( data ) :
-					data;
-			} catch ( e ) {}
-
-			// Make sure we set the data so it isn't changed later
-			jQuery.data( elem, key, data );
-
-		} else {
-			data = undefined;
-		}
-	}
-
-	return data;
-}
-
-// checks a cache object for emptiness
-function isEmptyDataObject( obj ) {
-	var name;
-	for ( name in obj ) {
-
-		// if the public data object is empty, the private is still empty
-		if ( name === "data" && jQuery.isEmptyObject( obj[ name ] ) ) {
-			continue;
-		}
-		if ( name !== "toJSON" ) {
-			return false;
-		}
-	}
-
-	return true;
-}
-
-function internalData( elem, name, data, pvt /* Internal Use Only */ ) {
-	if ( !acceptData( elem ) ) {
-		return;
-	}
-
-	var ret, thisCache,
-		internalKey = jQuery.expando,
-
-		// We have to handle DOM nodes and JS objects differently because IE6-7
-		// can't GC object references properly across the DOM-JS boundary
-		isNode = elem.nodeType,
-
-		// Only DOM nodes need the global jQuery cache; JS object data is
-		// attached directly to the object so GC can occur automatically
-		cache = isNode ? jQuery.cache : elem,
-
-		// Only defining an ID for JS objects if its cache already exists allows
-		// the code to shortcut on the same path as a DOM node with no cache
-		id = isNode ? elem[ internalKey ] : elem[ internalKey ] && internalKey;
-
-	// Avoid doing any more work than we need to when trying to get data on an
-	// object that has no data at all
-	if ( ( !id || !cache[ id ] || ( !pvt && !cache[ id ].data ) ) &&
-		data === undefined && typeof name === "string" ) {
-		return;
-	}
-
-	if ( !id ) {
-
-		// Only DOM nodes need a new unique ID for each element since their data
-		// ends up in the global cache
-		if ( isNode ) {
-			id = elem[ internalKey ] = deletedIds.pop() || jQuery.guid++;
-		} else {
-			id = internalKey;
-		}
-	}
-
-	if ( !cache[ id ] ) {
-
-		// Avoid exposing jQuery metadata on plain JS objects when the object
-		// is serialized using JSON.stringify
-		cache[ id ] = isNode ? {} : { toJSON: jQuery.noop };
-	}
-
-	// An object can be passed to jQuery.data instead of a key/value pair; this gets
-	// shallow copied over onto the existing cache
-	if ( typeof name === "object" || typeof name === "function" ) {
-		if ( pvt ) {
-			cache[ id ] = jQuery.extend( cache[ id ], name );
-		} else {
-			cache[ id ].data = jQuery.extend( cache[ id ].data, name );
-		}
-	}
-
-	thisCache = cache[ id ];
-
-	// jQuery data() is stored in a separate object inside the object's internal data
-	// cache in order to avoid key collisions between internal data and user-defined
-	// data.
-	if ( !pvt ) {
-		if ( !thisCache.data ) {
-			thisCache.data = {};
-		}
-
-		thisCache = thisCache.data;
-	}
-
-	if ( data !== undefined ) {
-		thisCache[ jQuery.camelCase( name ) ] = data;
-	}
-
-	// Check for both converted-to-camel and non-converted data property names
-	// If a data property was specified
-	if ( typeof name === "string" ) {
-
-		// First Try to find as-is property data
-		ret = thisCache[ name ];
-
-		// Test for null|undefined property data
-		if ( ret == null ) {
-
-			// Try to find the camelCased property
-			ret = thisCache[ jQuery.camelCase( name ) ];
-		}
-	} else {
-		ret = thisCache;
-	}
-
-	return ret;
-}
-
-function internalRemoveData( elem, name, pvt ) {
-	if ( !acceptData( elem ) ) {
-		return;
-	}
-
-	var thisCache, i,
-		isNode = elem.nodeType,
-
-		// See jQuery.data for more information
-		cache = isNode ? jQuery.cache : elem,
-		id = isNode ? elem[ jQuery.expando ] : jQuery.expando;
-
-	// If there is already no cache entry for this object, there is no
-	// purpose in continuing
-	if ( !cache[ id ] ) {
-		return;
-	}
-
-	if ( name ) {
-
-		thisCache = pvt ? cache[ id ] : cache[ id ].data;
-
-		if ( thisCache ) {
-
-			// Support array or space separated string names for data keys
-			if ( !jQuery.isArray( name ) ) {
-
-				// try the string as a key before any manipulation
-				if ( name in thisCache ) {
-					name = [ name ];
-				} else {
-
-					// split the camel cased version by spaces unless a key with the spaces exists
-					name = jQuery.camelCase( name );
-					if ( name in thisCache ) {
-						name = [ name ];
-					} else {
-						name = name.split( " " );
-					}
-				}
-			} else {
-
-				// If "name" is an array of keys...
-				// When data is initially created, via ("key", "val") signature,
-				// keys will be converted to camelCase.
-				// Since there is no way to tell _how_ a key was added, remove
-				// both plain key and camelCase key. #12786
-				// This will only penalize the array argument path.
-				name = name.concat( jQuery.map( name, jQuery.camelCase ) );
-			}
-
-			i = name.length;
-			while ( i-- ) {
-				delete thisCache[ name[ i ] ];
-			}
-
-			// If there is no data left in the cache, we want to continue
-			// and let the cache object itself get destroyed
-			if ( pvt ? !isEmptyDataObject( thisCache ) : !jQuery.isEmptyObject( thisCache ) ) {
-				return;
-			}
-		}
-	}
-
-	// See jQuery.data for more information
-	if ( !pvt ) {
-		delete cache[ id ].data;
-
-		// Don't destroy the parent cache unless the internal data object
-		// had been the only thing left in it
-		if ( !isEmptyDataObject( cache[ id ] ) ) {
-			return;
-		}
-	}
-
-	// Destroy the cache
-	if ( isNode ) {
-		jQuery.cleanData( [ elem ], true );
-
-	// Use delete when supported for expandos or `cache` is not a window per isWindow (#10080)
-	/* jshint eqeqeq: false */
-	} else if ( support.deleteExpando || cache != cache.window ) {
-		/* jshint eqeqeq: true */
-		delete cache[ id ];
-
-	// When all else fails, undefined
-	} else {
-		cache[ id ] = undefined;
-	}
-}
-
-jQuery.extend( {
-	cache: {},
-
-	// The following elements (space-suffixed to avoid Object.prototype collisions)
-	// throw uncatchable exceptions if you attempt to set expando properties
-	noData: {
-		"applet ": true,
-		"embed ": true,
-
-		// ...but Flash objects (which have this classid) *can* handle expandos
-		"object ": "clsid:D27CDB6E-AE6D-11cf-96B8-444553540000"
-	},
-
-	hasData: function( elem ) {
-		elem = elem.nodeType ? jQuery.cache[ elem[ jQuery.expando ] ] : elem[ jQuery.expando ];
-		return !!elem && !isEmptyDataObject( elem );
-	},
-
-	data: function( elem, name, data ) {
-		return internalData( elem, name, data );
-	},
-
-	removeData: function( elem, name ) {
-		return internalRemoveData( elem, name );
-	},
-
-	// For internal use only.
-	_data: function( elem, name, data ) {
-		return internalData( elem, name, data, true );
-	},
-
-	_removeData: function( elem, name ) {
-		return internalRemoveData( elem, name, true );
-	}
-} );
-
-jQuery.fn.extend( {
-	data: function( key, value ) {
-		var i, name, data,
-			elem = this[ 0 ],
-			attrs = elem && elem.attributes;
-
-		// Special expections of .data basically thwart jQuery.access,
-		// so implement the relevant behavior ourselves
-
-		// Gets all values
-		if ( key === undefined ) {
-			if ( this.length ) {
-				data = jQuery.data( elem );
-
-				if ( elem.nodeType === 1 && !jQuery._data( elem, "parsedAttrs" ) ) {
-					i = attrs.length;
-					while ( i-- ) {
-
-						// Support: IE11+
-						// The attrs elements can be null (#14894)
-						if ( attrs[ i ] ) {
-							name = attrs[ i ].name;
-							if ( name.indexOf( "data-" ) === 0 ) {
-								name = jQuery.camelCase( name.slice( 5 ) );
-								dataAttr( elem, name, data[ name ] );
-							}
-						}
-					}
-					jQuery._data( elem, "parsedAttrs", true );
-				}
-			}
-
-			return data;
-		}
-
-		// Sets multiple values
-		if ( typeof key === "object" ) {
-			return this.each( function() {
-				jQuery.data( this, key );
-			} );
-		}
-
-		return arguments.length > 1 ?
-
-			// Sets one value
-			this.each( function() {
-				jQuery.data( this, key, value );
-			} ) :
-
-			// Gets one value
-			// Try to fetch any internally stored data first
-			elem ? dataAttr( elem, key, jQuery.data( elem, key ) ) : undefined;
-	},
-
-	removeData: function( key ) {
-		return this.each( function() {
-			jQuery.removeData( this, key );
-		} );
-	}
-} );
-
-
-jQuery.extend( {
-	queue: function( elem, type, data ) {
-		var queue;
-
-		if ( elem ) {
-			type = ( type || "fx" ) + "queue";
-			queue = jQuery._data( elem, type );
-
-			// Speed up dequeue by getting out quickly if this is just a lookup
-			if ( data ) {
-				if ( !queue || jQuery.isArray( data ) ) {
-					queue = jQuery._data( elem, type, jQuery.makeArray( data ) );
-				} else {
-					queue.push( data );
-				}
-			}
-			return queue || [];
-		}
-	},
-
-	dequeue: function( elem, type ) {
-		type = type || "fx";
-
-		var queue = jQuery.queue( elem, type ),
-			startLength = queue.length,
-			fn = queue.shift(),
-			hooks = jQuery._queueHooks( elem, type ),
-			next = function() {
-				jQuery.dequeue( elem, type );
-			};
-
-		// If the fx queue is dequeued, always remove the progress sentinel
-		if ( fn === "inprogress" ) {
-			fn = queue.shift();
-			startLength--;
-		}
-
-		if ( fn ) {
-
-			// Add a progress sentinel to prevent the fx queue from being
-			// automatically dequeued
-			if ( type === "fx" ) {
-				queue.unshift( "inprogress" );
-			}
-
-			// clear up the last queue stop function
-			delete hooks.stop;
-			fn.call( elem, next, hooks );
-		}
-
-		if ( !startLength && hooks ) {
-			hooks.empty.fire();
-		}
-	},
-
-	// not intended for public consumption - generates a queueHooks object,
-	// or returns the current one
-	_queueHooks: function( elem, type ) {
-		var key = type + "queueHooks";
-		return jQuery._data( elem, key ) || jQuery._data( elem, key, {
-			empty: jQuery.Callbacks( "once memory" ).add( function() {
-				jQuery._removeData( elem, type + "queue" );
-				jQuery._removeData( elem, key );
-			} )
-		} );
-	}
-} );
-
-jQuery.fn.extend( {
-	queue: function( type, data ) {
-		var setter = 2;
-
-		if ( typeof type !== "string" ) {
-			data = type;
-			type = "fx";
-			setter--;
-		}
-
-		if ( arguments.length < setter ) {
-			return jQuery.queue( this[ 0 ], type );
-		}
-
-		return data === undefined ?
-			this :
-			this.each( function() {
-				var queue = jQuery.queue( this, type, data );
-
-				// ensure a hooks for this queue
-				jQuery._queueHooks( this, type );
-
-				if ( type === "fx" && queue[ 0 ] !== "inprogress" ) {
-					jQuery.dequeue( this, type );
-				}
-			} );
-	},
-	dequeue: function( type ) {
-		return this.each( function() {
-			jQuery.dequeue( this, type );
-		} );
-	},
-	clearQueue: function( type ) {
-		return this.queue( type || "fx", [] );
-	},
-
-	// Get a promise resolved when queues of a certain type
-	// are emptied (fx is the type by default)
-	promise: function( type, obj ) {
-		var tmp,
-			count = 1,
-			defer = jQuery.Deferred(),
-			elements = this,
-			i = this.length,
-			resolve = function() {
-				if ( !( --count ) ) {
-					defer.resolveWith( elements, [ elements ] );
-				}
-			};
-
-		if ( typeof type !== "string" ) {
-			obj = type;
-			type = undefined;
-		}
-		type = type || "fx";
-
-		while ( i-- ) {
-			tmp = jQuery._data( elements[ i ], type + "queueHooks" );
-			if ( tmp && tmp.empty ) {
-				count++;
-				tmp.empty.add( resolve );
-			}
-		}
-		resolve();
-		return defer.promise( obj );
-	}
-} );
-
-
-( function() {
-	var shrinkWrapBlocksVal;
-
-	support.shrinkWrapBlocks = function() {
-		if ( shrinkWrapBlocksVal != null ) {
-			return shrinkWrapBlocksVal;
-		}
-
-		// Will be changed later if needed.
-		shrinkWrapBlocksVal = false;
-
-		// Minified: var b,c,d
-		var div, body, container;
-
-		body = document.getElementsByTagName( "body" )[ 0 ];
-		if ( !body || !body.style ) {
-
-			// Test fired too early or in an unsupported environment, exit.
-			return;
-		}
-
-		// Setup
-		div = document.createElement( "div" );
-		container = document.createElement( "div" );
-		container.style.cssText = "position:absolute;border:0;width:0;height:0;top:0;left:-9999px";
-		body.appendChild( container ).appendChild( div );
-
-		// Support: IE6
-		// Check if elements with layout shrink-wrap their children
-		if ( typeof div.style.zoom !== "undefined" ) {
-
-			// Reset CSS: box-sizing; display; margin; border
-			div.style.cssText =
-
-				// Support: Firefox<29, Android 2.3
-				// Vendor-prefix box-sizing
-				"-webkit-box-sizing:content-box;-moz-box-sizing:content-box;" +
-				"box-sizing:content-box;display:block;margin:0;border:0;" +
-				"padding:1px;width:1px;zoom:1";
-			div.appendChild( document.createElement( "div" ) ).style.width = "5px";
-			shrinkWrapBlocksVal = div.offsetWidth !== 3;
-		}
-
-		body.removeChild( container );
-
-		return shrinkWrapBlocksVal;
-	};
-
-} )();
-var pnum = ( /[+-]?(?:\d*\.|)\d+(?:[eE][+-]?\d+|)/ ).source;
-
-var rcssNum = new RegExp( "^(?:([+-])=|)(" + pnum + ")([a-z%]*)$", "i" );
-
-
-var cssExpand = [ "Top", "Right", "Bottom", "Left" ];
-
-var isHidden = function( elem, el ) {
-
-		// isHidden might be called from jQuery#filter function;
-		// in that case, element will be second argument
-		elem = el || elem;
-		return jQuery.css( elem, "display" ) === "none" ||
-			!jQuery.contains( elem.ownerDocument, elem );
-	};
-
-
-
-function adjustCSS( elem, prop, valueParts, tween ) {
-	var adjusted,
-		scale = 1,
-		maxIterations = 20,
-		currentValue = tween ?
-			function() { return tween.cur(); } :
-			function() { return jQuery.css( elem, prop, "" ); },
-		initial = currentValue(),
-		unit = valueParts && valueParts[ 3 ] || ( jQuery.cssNumber[ prop ] ? "" : "px" ),
-
-		// Starting value computation is required for potential unit mismatches
-		initialInUnit = ( jQuery.cssNumber[ prop ] || unit !== "px" && +initial ) &&
-			rcssNum.exec( jQuery.css( elem, prop ) );
-
-	if ( initialInUnit && initialInUnit[ 3 ] !== unit ) {
-
-		// Trust units reported by jQuery.css
-		unit = unit || initialInUnit[ 3 ];
-
-		// Make sure we update the tween properties later on
-		valueParts = valueParts || [];
-
-		// Iteratively approximate from a nonzero starting point
-		initialInUnit = +initial || 1;
-
-		do {
-
-			// If previous iteration zeroed out, double until we get *something*.
-			// Use string for doubling so we don't accidentally see scale as unchanged below
-			scale = scale || ".5";
-
-			// Adjust and apply
-			initialInUnit = initialInUnit / scale;
-			jQuery.style( elem, prop, initialInUnit + unit );
-
-		// Update scale, tolerating zero or NaN from tween.cur()
-		// Break the loop if scale is unchanged or perfect, or if we've just had enough.
-		} while (
-			scale !== ( scale = currentValue() / initial ) && scale !== 1 && --maxIterations
-		);
-	}
-
-	if ( valueParts ) {
-		initialInUnit = +initialInUnit || +initial || 0;
-
-		// Apply relative offset (+=/-=) if specified
-		adjusted = valueParts[ 1 ] ?
-			initialInUnit + ( valueParts[ 1 ] + 1 ) * valueParts[ 2 ] :
-			+valueParts[ 2 ];
-		if ( tween ) {
-			tween.unit = unit;
-			tween.start = initialInUnit;
-			tween.end = adjusted;
-		}
-	}
-	return adjusted;
-}
-
-
-// Multifunctional method to get and set values of a collection
-// The value/s can optionally be executed if it's a function
-var access = function( elems, fn, key, value, chainable, emptyGet, raw ) {
-	var i = 0,
-		length = elems.length,
-		bulk = key == null;
-
-	// Sets many values
-	if ( jQuery.type( key ) === "object" ) {
-		chainable = true;
-		for ( i in key ) {
-			access( elems, fn, i, key[ i ], true, emptyGet, raw );
-		}
-
-	// Sets one value
-	} else if ( value !== undefined ) {
-		chainable = true;
-
-		if ( !jQuery.isFunction( value ) ) {
-			raw = true;
-		}
-
-		if ( bulk ) {
-
-			// Bulk operations run against the entire set
-			if ( raw ) {
-				fn.call( elems, value );
-				fn = null;
-
-			// ...except when executing function values
-			} else {
-				bulk = fn;
-				fn = function( elem, key, value ) {
-					return bulk.call( jQuery( elem ), value );
-				};
-			}
-		}
-
-		if ( fn ) {
-			for ( ; i < length; i++ ) {
-				fn(
-					elems[ i ],
-					key,
-					raw ? value : value.call( elems[ i ], i, fn( elems[ i ], key ) )
-				);
-			}
-		}
-	}
-
-	return chainable ?
-		elems :
-
-		// Gets
-		bulk ?
-			fn.call( elems ) :
-			length ? fn( elems[ 0 ], key ) : emptyGet;
-};
-var rcheckableType = ( /^(?:checkbox|radio)$/i );
-
-var rtagName = ( /<([\w:-]+)/ );
-
-var rscriptType = ( /^$|\/(?:java|ecma)script/i );
-
-var rleadingWhitespace = ( /^\s+/ );
-
-var nodeNames = "abbr|article|aside|audio|bdi|canvas|data|datalist|" +
-		"details|dialog|figcaption|figure|footer|header|hgroup|main|" +
-		"mark|meter|nav|output|picture|progress|section|summary|template|time|video";
-
-
-
-function createSafeFragment( document ) {
-	var list = nodeNames.split( "|" ),
-		safeFrag = document.createDocumentFragment();
-
-	if ( safeFrag.createElement ) {
-		while ( list.length ) {
-			safeFrag.createElement(
-				list.pop()
-			);
-		}
-	}
-	return safeFrag;
-}
-
-
-( function() {
-	var div = document.createElement( "div" ),
-		fragment = document.createDocumentFragment(),
-		input = document.createElement( "input" );
-
-	// Setup
-	div.innerHTML = "  <link/><table></table><a href='/a'>a</a><input type='checkbox'/>";
-
-	// IE strips leading whitespace when .innerHTML is used
-	support.leadingWhitespace = div.firstChild.nodeType === 3;
-
-	// Make sure that tbody elements aren't automatically inserted
-	// IE will insert them into empty tables
-	support.tbody = !div.getElementsByTagName( "tbody" ).length;
-
-	// Make sure that link elements get serialized correctly by innerHTML
-	// This requires a wrapper element in IE
-	support.htmlSerialize = !!div.getElementsByTagName( "link" ).length;
-
-	// Makes sure cloning an html5 element does not cause problems
-	// Where outerHTML is undefined, this still works
-	support.html5Clone =
-		document.createElement( "nav" ).cloneNode( true ).outerHTML !== "<:nav></:nav>";
-
-	// Check if a disconnected checkbox will retain its checked
-	// value of true after appended to the DOM (IE6/7)
-	input.type = "checkbox";
-	input.checked = true;
-	fragment.appendChild( input );
-	support.appendChecked = input.checked;
-
-	// Make sure textarea (and checkbox) defaultValue is properly cloned
-	// Support: IE6-IE11+
-	div.innerHTML = "<textarea>x</textarea>";
-	support.noCloneChecked = !!div.cloneNode( true ).lastChild.defaultValue;
-
-	// #11217 - WebKit loses check when the name is after the checked attribute
-	fragment.appendChild( div );
-
-	// Support: Windows Web Apps (WWA)
-	// `name` and `type` must use .setAttribute for WWA (#14901)
-	input = document.createElement( "input" );
-	input.setAttribute( "type", "radio" );
-	input.setAttribute( "checked", "checked" );
-	input.setAttribute( "name", "t" );
-
-	div.appendChild( input );
-
-	// Support: Safari 5.1, iOS 5.1, Android 4.x, Android 2.3
-	// old WebKit doesn't clone checked state correctly in fragments
-	support.checkClone = div.cloneNode( true ).cloneNode( true ).lastChild.checked;
-
-	// Support: IE<9
-	// Cloned elements keep attachEvent handlers, we use addEventListener on IE9+
-	support.noCloneEvent = !!div.addEventListener;
-
-	// Support: IE<9
-	// Since attributes and properties are the same in IE,
-	// cleanData must set properties to undefined rather than use removeAttribute
-	div[ jQuery.expando ] = 1;
-	support.attributes = !div.getAttribute( jQuery.expando );
-} )();
-
-
-// We have to close these tags to support XHTML (#13200)
-var wrapMap = {
-	option: [ 1, "<select multiple='multiple'>", "</select>" ],
-	legend: [ 1, "<fieldset>", "</fieldset>" ],
-	area: [ 1, "<map>", "</map>" ],
-
-	// Support: IE8
-	param: [ 1, "<object>", "</object>" ],
-	thead: [ 1, "<table>", "</table>" ],
-	tr: [ 2, "<table><tbody>", "</tbody></table>" ],
-	col: [ 2, "<table><tbody></tbody><colgroup>", "</colgroup></table>" ],
-	td: [ 3, "<table><tbody><tr>", "</tr></tbody></table>" ],
-
-	// IE6-8 can't serialize link, script, style, or any html5 (NoScope) tags,
-	// unless wrapped in a div with non-breaking characters in front of it.
-	_default: support.htmlSerialize ? [ 0, "", "" ] : [ 1, "X<div>", "</div>" ]
-};
-
-// Support: IE8-IE9
-wrapMap.optgroup = wrapMap.option;
-
-wrapMap.tbody = wrapMap.tfoot = wrapMap.colgroup = wrapMap.caption = wrapMap.thead;
-wrapMap.th = wrapMap.td;
-
-
-function getAll( context, tag ) {
-	var elems, elem,
-		i = 0,
-		found = typeof context.getElementsByTagName !== "undefined" ?
-			context.getElementsByTagName( tag || "*" ) :
-			typeof context.querySelectorAll !== "undefined" ?
-				context.querySelectorAll( tag || "*" ) :
-				undefined;
-
-	if ( !found ) {
-		for ( found = [], elems = context.childNodes || context;
-			( elem = elems[ i ] ) != null;
-			i++
-		) {
-			if ( !tag || jQuery.nodeName( elem, tag ) ) {
-				found.push( elem );
-			} else {
-				jQuery.merge( found, getAll( elem, tag ) );
-			}
-		}
-	}
-
-	return tag === undefined || tag && jQuery.nodeName( context, tag ) ?
-		jQuery.merge( [ context ], found ) :
-		found;
-}
-
-
-// Mark scripts as having already been evaluated
-function setGlobalEval( elems, refElements ) {
-	var elem,
-		i = 0;
-	for ( ; ( elem = elems[ i ] ) != null; i++ ) {
-		jQuery._data(
-			elem,
-			"globalEval",
-			!refElements || jQuery._data( refElements[ i ], "globalEval" )
-		);
-	}
-}
-
-
-var rhtml = /<|&#?\w+;/,
-	rtbody = /<tbody/i;
-
-function fixDefaultChecked( elem ) {
-	if ( rcheckableType.test( elem.type ) ) {
-		elem.defaultChecked = elem.checked;
-	}
-}
-
-function buildFragment( elems, context, scripts, selection, ignored ) {
-	var j, elem, contains,
-		tmp, tag, tbody, wrap,
-		l = elems.length,
-
-		// Ensure a safe fragment
-		safe = createSafeFragment( context ),
-
-		nodes = [],
-		i = 0;
-
-	for ( ; i < l; i++ ) {
-		elem = elems[ i ];
-
-		if ( elem || elem === 0 ) {
-
-			// Add nodes directly
-			if ( jQuery.type( elem ) === "object" ) {
-				jQuery.merge( nodes, elem.nodeType ? [ elem ] : elem );
-
-			// Convert non-html into a text node
-			} else if ( !rhtml.test( elem ) ) {
-				nodes.push( context.createTextNode( elem ) );
-
-			// Convert html into DOM nodes
-			} else {
-				tmp = tmp || safe.appendChild( context.createElement( "div" ) );
-
-				// Deserialize a standard representation
-				tag = ( rtagName.exec( elem ) || [ "", "" ] )[ 1 ].toLowerCase();
-				wrap = wrapMap[ tag ] || wrapMap._default;
-
-				tmp.innerHTML = wrap[ 1 ] + jQuery.htmlPrefilter( elem ) + wrap[ 2 ];
-
-				// Descend through wrappers to the right content
-				j = wrap[ 0 ];
-				while ( j-- ) {
-					tmp = tmp.lastChild;
-				}
-
-				// Manually add leading whitespace removed by IE
-				if ( !support.leadingWhitespace && rleadingWhitespace.test( elem ) ) {
-					nodes.push( context.createTextNode( rleadingWhitespace.exec( elem )[ 0 ] ) );
-				}
-
-				// Remove IE's autoinserted <tbody> from table fragments
-				if ( !support.tbody ) {
-
-					// String was a <table>, *may* have spurious <tbody>
-					elem = tag === "table" && !rtbody.test( elem ) ?
-						tmp.firstChild :
-
-						// String was a bare <thead> or <tfoot>
-						wrap[ 1 ] === "<table>" && !rtbody.test( elem ) ?
-							tmp :
-							0;
-
-					j = elem && elem.childNodes.length;
-					while ( j-- ) {
-						if ( jQuery.nodeName( ( tbody = elem.childNodes[ j ] ), "tbody" ) &&
-							!tbody.childNodes.length ) {
-
-							elem.removeChild( tbody );
-						}
-					}
-				}
-
-				jQuery.merge( nodes, tmp.childNodes );
-
-				// Fix #12392 for WebKit and IE > 9
-				tmp.textContent = "";
-
-				// Fix #12392 for oldIE
-				while ( tmp.firstChild ) {
-					tmp.removeChild( tmp.firstChild );
-				}
-
-				// Remember the top-level container for proper cleanup
-				tmp = safe.lastChild;
-			}
-		}
-	}
-
-	// Fix #11356: Clear elements from fragment
-	if ( tmp ) {
-		safe.removeChild( tmp );
-	}
-
-	// Reset defaultChecked for any radios and checkboxes
-	// about to be appended to the DOM in IE 6/7 (#8060)
-	if ( !support.appendChecked ) {
-		jQuery.grep( getAll( nodes, "input" ), fixDefaultChecked );
-	}
-
-	i = 0;
-	while ( ( elem = nodes[ i++ ] ) ) {
-
-		// Skip elements already in the context collection (trac-4087)
-		if ( selection && jQuery.inArray( elem, selection ) > -1 ) {
-			if ( ignored ) {
-				ignored.push( elem );
-			}
-
-			continue;
-		}
-
-		contains = jQuery.contains( elem.ownerDocument, elem );
-
-		// Append to fragment
-		tmp = getAll( safe.appendChild( elem ), "script" );
-
-		// Preserve script evaluation history
-		if ( contains ) {
-			setGlobalEval( tmp );
-		}
-
-		// Capture executables
-		if ( scripts ) {
-			j = 0;
-			while ( ( elem = tmp[ j++ ] ) ) {
-				if ( rscriptType.test( elem.type || "" ) ) {
-					scripts.push( elem );
-				}
-			}
-		}
-	}
-
-	tmp = null;
-
-	return safe;
-}
-
-
-( function() {
-	var i, eventName,
-		div = document.createElement( "div" );
-
-	// Support: IE<9 (lack submit/change bubble), Firefox (lack focus(in | out) events)
-	for ( i in { submit: true, change: true, focusin: true } ) {
-		eventName = "on" + i;
-
-		if ( !( support[ i ] = eventName in window ) ) {
-
-			// Beware of CSP restrictions (https://developer.mozilla.org/en/Security/CSP)
-			div.setAttribute( eventName, "t" );
-			support[ i ] = div.attributes[ eventName ].expando === false;
-		}
-	}
-
-	// Null elements to avoid leaks in IE.
-	div = null;
-} )();
-
-
-var rformElems = /^(?:input|select|textarea)$/i,
-	rkeyEvent = /^key/,
-	rmouseEvent = /^(?:mouse|pointer|contextmenu|drag|drop)|click/,
-	rfocusMorph = /^(?:focusinfocus|focusoutblur)$/,
-	rtypenamespace = /^([^.]*)(?:\.(.+)|)/;
-
-function returnTrue() {
-	return true;
-}
-
-function returnFalse() {
-	return false;
-}
-
-// Support: IE9
-// See #13393 for more info
-function safeActiveElement() {
-	try {
-		return document.activeElement;
-	} catch ( err ) { }
-}
-
-function on( elem, types, selector, data, fn, one ) {
-	var origFn, type;
-
-	// Types can be a map of types/handlers
-	if ( typeof types === "object" ) {
-
-		// ( types-Object, selector, data )
-		if ( typeof selector !== "string" ) {
-
-			// ( types-Object, data )
-			data = data || selector;
-			selector = undefined;
-		}
-		for ( type in types ) {
-			on( elem, type, selector, data, types[ type ], one );
-		}
-		return elem;
-	}
-
-	if ( data == null && fn == null ) {
-
-		// ( types, fn )
-		fn = selector;
-		data = selector = undefined;
-	} else if ( fn == null ) {
-		if ( typeof selector === "string" ) {
-
-			// ( types, selector, fn )
-			fn = data;
-			data = undefined;
-		} else {
-
-			// ( types, data, fn )
-			fn = data;
-			data = selector;
-			selector = undefined;
-		}
-	}
-	if ( fn === false ) {
-		fn = returnFalse;
-	} else if ( !fn ) {
-		return elem;
-	}
-
-	if ( one === 1 ) {
-		origFn = fn;
-		fn = function( event ) {
-
-			// Can use an empty set, since event contains the info
-			jQuery().off( event );
-			return origFn.apply( this, arguments );
-		};
-
-		// Use same guid so caller can remove using origFn
-		fn.guid = origFn.guid || ( origFn.guid = jQuery.guid++ );
-	}
-	return elem.each( function() {
-		jQuery.event.add( this, types, fn, data, selector );
-	} );
-}
-
-/*
- * Helper functions for managing events -- not part of the public interface.
- * Props to Dean Edwards' addEvent library for many of the ideas.
- */
-jQuery.event = {
-
-	global: {},
-
-	add: function( elem, types, handler, data, selector ) {
-		var tmp, events, t, handleObjIn,
-			special, eventHandle, handleObj,
-			handlers, type, namespaces, origType,
-			elemData = jQuery._data( elem );
-
-		// Don't attach events to noData or text/comment nodes (but allow plain objects)
-		if ( !elemData ) {
-			return;
-		}
-
-		// Caller can pass in an object of custom data in lieu of the handler
-		if ( handler.handler ) {
-			handleObjIn = handler;
-			handler = handleObjIn.handler;
-			selector = handleObjIn.selector;
-		}
-
-		// Make sure that the handler has a unique ID, used to find/remove it later
-		if ( !handler.guid ) {
-			handler.guid = jQuery.guid++;
-		}
-
-		// Init the element's event structure and main handler, if this is the first
-		if ( !( events = elemData.events ) ) {
-			events = elemData.events = {};
-		}
-		if ( !( eventHandle = elemData.handle ) ) {
-			eventHandle = elemData.handle = function( e ) {
-
-				// Discard the second event of a jQuery.event.trigger() and
-				// when an event is called after a page has unloaded
-				return typeof jQuery !== "undefined" &&
-					( !e || jQuery.event.triggered !== e.type ) ?
-					jQuery.event.dispatch.apply( eventHandle.elem, arguments ) :
-					undefined;
-			};
-
-			// Add elem as a property of the handle fn to prevent a memory leak
-			// with IE non-native events
-			eventHandle.elem = elem;
-		}
-
-		// Handle multiple events separated by a space
-		types = ( types || "" ).match( rnotwhite ) || [ "" ];
-		t = types.length;
-		while ( t-- ) {
-			tmp = rtypenamespace.exec( types[ t ] ) || [];
-			type = origType = tmp[ 1 ];
-			namespaces = ( tmp[ 2 ] || "" ).split( "." ).sort();
-
-			// There *must* be a type, no attaching namespace-only handlers
-			if ( !type ) {
-				continue;
-			}
-
-			// If event changes its type, use the special event handlers for the changed type
-			special = jQuery.event.special[ type ] || {};
-
-			// If selector defined, determine special event api type, otherwise given type
-			type = ( selector ? special.delegateType : special.bindType ) || type;
-
-			// Update special based on newly reset type
-			special = jQuery.event.special[ type ] || {};
-
-			// handleObj is passed to all event handlers
-			handleObj = jQuery.extend( {
-				type: type,
-				origType: origType,
-				data: data,
-				handler: handler,
-				guid: handler.guid,
-				selector: selector,
-				needsContext: selector && jQuery.expr.match.needsContext.test( selector ),
-				namespace: namespaces.join( "." )
-			}, handleObjIn );
-
-			// Init the event handler queue if we're the first
-			if ( !( handlers = events[ type ] ) ) {
-				handlers = events[ type ] = [];
-				handlers.delegateCount = 0;
-
-				// Only use addEventListener/attachEvent if the special events handler returns false
-				if ( !special.setup ||
-					special.setup.call( elem, data, namespaces, eventHandle ) === false ) {
-
-					// Bind the global event handler to the element
-					if ( elem.addEventListener ) {
-						elem.addEventListener( type, eventHandle, false );
-
-					} else if ( elem.attachEvent ) {
-						elem.attachEvent( "on" + type, eventHandle );
-					}
-				}
-			}
-
-			if ( special.add ) {
-				special.add.call( elem, handleObj );
-
-				if ( !handleObj.handler.guid ) {
-					handleObj.handler.guid = handler.guid;
-				}
-			}
-
-			// Add to the element's handler list, delegates in front
-			if ( selector ) {
-				handlers.splice( handlers.delegateCount++, 0, handleObj );
-			} else {
-				handlers.push( handleObj );
-			}
-
-			// Keep track of which events have ever been used, for event optimization
-			jQuery.event.global[ type ] = true;
-		}
-
-		// Nullify elem to prevent memory leaks in IE
-		elem = null;
-	},
-
-	// Detach an event or set of events from an element
-	remove: function( elem, types, handler, selector, mappedTypes ) {
-		var j, handleObj, tmp,
-			origCount, t, events,
-			special, handlers, type,
-			namespaces, origType,
-			elemData = jQuery.hasData( elem ) && jQuery._data( elem );
-
-		if ( !elemData || !( events = elemData.events ) ) {
-			return;
-		}
-
-		// Once for each type.namespace in types; type may be omitted
-		types = ( types || "" ).match( rnotwhite ) || [ "" ];
-		t = types.length;
-		while ( t-- ) {
-			tmp = rtypenamespace.exec( types[ t ] ) || [];
-			type = origType = tmp[ 1 ];
-			namespaces = ( tmp[ 2 ] || "" ).split( "." ).sort();
-
-			// Unbind all events (on this namespace, if provided) for the element
-			if ( !type ) {
-				for ( type in events ) {
-					jQuery.event.remove( elem, type + types[ t ], handler, selector, true );
-				}
-				continue;
-			}
-
-			special = jQuery.event.special[ type ] || {};
-			type = ( selector ? special.delegateType : special.bindType ) || type;
-			handlers = events[ type ] || [];
-			tmp = tmp[ 2 ] &&
-				new RegExp( "(^|\\.)" + namespaces.join( "\\.(?:.*\\.|)" ) + "(\\.|$)" );
-
-			// Remove matching events
-			origCount = j = handlers.length;
-			while ( j-- ) {
-				handleObj = handlers[ j ];
-
-				if ( ( mappedTypes || origType === handleObj.origType ) &&
-					( !handler || handler.guid === handleObj.guid ) &&
-					( !tmp || tmp.test( handleObj.namespace ) ) &&
-					( !selector || selector === handleObj.selector ||
-						selector === "**" && handleObj.selector ) ) {
-					handlers.splice( j, 1 );
-
-					if ( handleObj.selector ) {
-						handlers.delegateCount--;
-					}
-					if ( special.remove ) {
-						special.remove.call( elem, handleObj );
-					}
-				}
-			}
-
-			// Remove generic event handler if we removed something and no more handlers exist
-			// (avoids potential for endless recursion during removal of special event handlers)
-			if ( origCount && !handlers.length ) {
-				if ( !special.teardown ||
-					special.teardown.call( elem, namespaces, elemData.handle ) === false ) {
-
-					jQuery.removeEvent( elem, type, elemData.handle );
-				}
-
-				delete events[ type ];
-			}
-		}
-
-		// Remove the expando if it's no longer used
-		if ( jQuery.isEmptyObject( events ) ) {
-			delete elemData.handle;
-
-			// removeData also checks for emptiness and clears the expando if empty
-			// so use it instead of delete
-			jQuery._removeData( elem, "events" );
-		}
-	},
-
-	trigger: function( event, data, elem, onlyHandlers ) {
-		var handle, ontype, cur,
-			bubbleType, special, tmp, i,
-			eventPath = [ elem || document ],
-			type = hasOwn.call( event, "type" ) ? event.type : event,
-			namespaces = hasOwn.call( event, "namespace" ) ? event.namespace.split( "." ) : [];
-
-		cur = tmp = elem = elem || document;
-
-		// Don't do events on text and comment nodes
-		if ( elem.nodeType === 3 || elem.nodeType === 8 ) {
-			return;
-		}
-
-		// focus/blur morphs to focusin/out; ensure we're not firing them right now
-		if ( rfocusMorph.test( type + jQuery.event.triggered ) ) {
-			return;
-		}
-
-		if ( type.indexOf( "." ) > -1 ) {
-
-			// Namespaced trigger; create a regexp to match event type in handle()
-			namespaces = type.split( "." );
-			type = namespaces.shift();
-			namespaces.sort();
-		}
-		ontype = type.indexOf( ":" ) < 0 && "on" + type;
-
-		// Caller can pass in a jQuery.Event object, Object, or just an event type string
-		event = event[ jQuery.expando ] ?
-			event :
-			new jQuery.Event( type, typeof event === "object" && event );
-
-		// Trigger bitmask: & 1 for native handlers; & 2 for jQuery (always true)
-		event.isTrigger = onlyHandlers ? 2 : 3;
-		event.namespace = namespaces.join( "." );
-		event.rnamespace = event.namespace ?
-			new RegExp( "(^|\\.)" + namespaces.join( "\\.(?:.*\\.|)" ) + "(\\.|$)" ) :
-			null;
-
-		// Clean up the event in case it is being reused
-		event.result = undefined;
-		if ( !event.target ) {
-			event.target = elem;
-		}
-
-		// Clone any incoming data and prepend the event, creating the handler arg list
-		data = data == null ?
-			[ event ] :
-			jQuery.makeArray( data, [ event ] );
-
-		// Allow special events to draw outside the lines
-		special = jQuery.event.special[ type ] || {};
-		if ( !onlyHandlers && special.trigger && special.trigger.apply( elem, data ) === false ) {
-			return;
-		}
-
-		// Determine event propagation path in advance, per W3C events spec (#9951)
-		// Bubble up to document, then to window; watch for a global ownerDocument var (#9724)
-		if ( !onlyHandlers && !special.noBubble && !jQuery.isWindow( elem ) ) {
-
-			bubbleType = special.delegateType || type;
-			if ( !rfocusMorph.test( bubbleType + type ) ) {
-				cur = cur.parentNode;
-			}
-			for ( ; cur; cur = cur.parentNode ) {
-				eventPath.push( cur );
-				tmp = cur;
-			}
-
-			// Only add window if we got to document (e.g., not plain obj or detached DOM)
-			if ( tmp === ( elem.ownerDocument || document ) ) {
-				eventPath.push( tmp.defaultView || tmp.parentWindow || window );
-			}
-		}
-
-		// Fire handlers on the event path
-		i = 0;
-		while ( ( cur = eventPath[ i++ ] ) && !event.isPropagationStopped() ) {
-
-			event.type = i > 1 ?
-				bubbleType :
-				special.bindType || type;
-
-			// jQuery handler
-			handle = ( jQuery._data( cur, "events" ) || {} )[ event.type ] &&
-				jQuery._data( cur, "handle" );
-
-			if ( handle ) {
-				handle.apply( cur, data );
-			}
-
-			// Native handler
-			handle = ontype && cur[ ontype ];
-			if ( handle && handle.apply && acceptData( cur ) ) {
-				event.result = handle.apply( cur, data );
-				if ( event.result === false ) {
-					event.preventDefault();
-				}
-			}
-		}
-		event.type = type;
-
-		// If nobody prevented the default action, do it now
-		if ( !onlyHandlers && !event.isDefaultPrevented() ) {
-
-			if (
-				( !special._default ||
-				 special._default.apply( eventPath.pop(), data ) === false
-				) && acceptData( elem )
-			) {
-
-				// Call a native DOM method on the target with the same name name as the event.
-				// Can't use an .isFunction() check here because IE6/7 fails that test.
-				// Don't do default actions on window, that's where global variables be (#6170)
-				if ( ontype && elem[ type ] && !jQuery.isWindow( elem ) ) {
-
-					// Don't re-trigger an onFOO event when we call its FOO() method
-					tmp = elem[ ontype ];
-
-					if ( tmp ) {
-						elem[ ontype ] = null;
-					}
-
-					// Prevent re-triggering of the same event, since we already bubbled it above
-					jQuery.event.triggered = type;
-					try {
-						elem[ type ]();
-					} catch ( e ) {
-
-						// IE<9 dies on focus/blur to hidden element (#1486,#12518)
-						// only reproducible on winXP IE8 native, not IE9 in IE8 mode
-					}
-					jQuery.event.triggered = undefined;
-
-					if ( tmp ) {
-						elem[ ontype ] = tmp;
-					}
-				}
-			}
-		}
-
-		return event.result;
-	},
-
-	dispatch: function( event ) {
-
-		// Make a writable jQuery.Event from the native event object
-		event = jQuery.event.fix( event );
-
-		var i, j, ret, matched, handleObj,
-			handlerQueue = [],
-			args = slice.call( arguments ),
-			handlers = ( jQuery._data( this, "events" ) || {} )[ event.type ] || [],
-			special = jQuery.event.special[ event.type ] || {};
-
-		// Use the fix-ed jQuery.Event rather than the (read-only) native event
-		args[ 0 ] = event;
-		event.delegateTarget = this;
-
-		// Call the preDispatch hook for the mapped type, and let it bail if desired
-		if ( special.preDispatch && special.preDispatch.call( this, event ) === false ) {
-			return;
-		}
-
-		// Determine handlers
-		handlerQueue = jQuery.event.handlers.call( this, event, handlers );
-
-		// Run delegates first; they may want to stop propagation beneath us
-		i = 0;
-		while ( ( matched = handlerQueue[ i++ ] ) && !event.isPropagationStopped() ) {
-			event.currentTarget = matched.elem;
-
-			j = 0;
-			while ( ( handleObj = matched.handlers[ j++ ] ) &&
-				!event.isImmediatePropagationStopped() ) {
-
-				// Triggered event must either 1) have no namespace, or 2) have namespace(s)
-				// a subset or equal to those in the bound event (both can have no namespace).
-				if ( !event.rnamespace || event.rnamespace.test( handleObj.namespace ) ) {
-
-					event.handleObj = handleObj;
-					event.data = handleObj.data;
-
-					ret = ( ( jQuery.event.special[ handleObj.origType ] || {} ).handle ||
-						handleObj.handler ).apply( matched.elem, args );
-
-					if ( ret !== undefined ) {
-						if ( ( event.result = ret ) === false ) {
-							event.preventDefault();
-							event.stopPropagation();
-						}
-					}
-				}
-			}
-		}
-
-		// Call the postDispatch hook for the mapped type
-		if ( special.postDispatch ) {
-			special.postDispatch.call( this, event );
-		}
-
-		return event.result;
-	},
-
-	handlers: function( event, handlers ) {
-		var i, matches, sel, handleObj,
-			handlerQueue = [],
-			delegateCount = handlers.delegateCount,
-			cur = event.target;
-
-		// Support (at least): Chrome, IE9
-		// Find delegate handlers
-		// Black-hole SVG <use> instance trees (#13180)
-		//
-		// Support: Firefox<=42+
-		// Avoid non-left-click in FF but don't block IE radio events (#3861, gh-2343)
-		if ( delegateCount && cur.nodeType &&
-			( event.type !== "click" || isNaN( event.button ) || event.button < 1 ) ) {
-
-			/* jshint eqeqeq: false */
-			for ( ; cur != this; cur = cur.parentNode || this ) {
-				/* jshint eqeqeq: true */
-
-				// Don't check non-elements (#13208)
-				// Don't process clicks on disabled elements (#6911, #8165, #11382, #11764)
-				if ( cur.nodeType === 1 && ( cur.disabled !== true || event.type !== "click" ) ) {
-					matches = [];
-					for ( i = 0; i < delegateCount; i++ ) {
-						handleObj = handlers[ i ];
-
-						// Don't conflict with Object.prototype properties (#13203)
-						sel = handleObj.selector + " ";
-
-						if ( matches[ sel ] === undefined ) {
-							matches[ sel ] = handleObj.needsContext ?
-								jQuery( sel, this ).index( cur ) > -1 :
-								jQuery.find( sel, this, null, [ cur ] ).length;
-						}
-						if ( matches[ sel ] ) {
-							matches.push( handleObj );
-						}
-					}
-					if ( matches.length ) {
-						handlerQueue.push( { elem: cur, handlers: matches } );
-					}
-				}
-			}
-		}
-
-		// Add the remaining (directly-bound) handlers
-		if ( delegateCount < handlers.length ) {
-			handlerQueue.push( { elem: this, handlers: handlers.slice( delegateCount ) } );
-		}
-
-		return handlerQueue;
-	},
-
-	fix: function( event ) {
-		if ( event[ jQuery.expando ] ) {
-			return event;
-		}
-
-		// Create a writable copy of the event object and normalize some properties
-		var i, prop, copy,
-			type = event.type,
-			originalEvent = event,
-			fixHook = this.fixHooks[ type ];
-
-		if ( !fixHook ) {
-			this.fixHooks[ type ] = fixHook =
-				rmouseEvent.test( type ) ? this.mouseHooks :
-				rkeyEvent.test( type ) ? this.keyHooks :
-				{};
-		}
-		copy = fixHook.props ? this.props.concat( fixHook.props ) : this.props;
-
-		event = new jQuery.Event( originalEvent );
-
-		i = copy.length;
-		while ( i-- ) {
-			prop = copy[ i ];
-			event[ prop ] = originalEvent[ prop ];
-		}
-
-		// Support: IE<9
-		// Fix target property (#1925)
-		if ( !event.target ) {
-			event.target = originalEvent.srcElement || document;
-		}
-
-		// Support: Safari 6-8+
-		// Target should not be a text node (#504, #13143)
-		if ( event.target.nodeType === 3 ) {
-			event.target = event.target.parentNode;
-		}
-
-		// Support: IE<9
-		// For mouse/key events, metaKey==false if it's undefined (#3368, #11328)
-		event.metaKey = !!event.metaKey;
-
-		return fixHook.filter ? fixHook.filter( event, originalEvent ) : event;
-	},
-
-	// Includes some event props shared by KeyEvent and MouseEvent
-	props: ( "altKey bubbles cancelable ctrlKey currentTarget detail eventPhase " +
-		"metaKey relatedTarget shiftKey target timeStamp view which" ).split( " " ),
-
-	fixHooks: {},
-
-	keyHooks: {
-		props: "char charCode key keyCode".split( " " ),
-		filter: function( event, original ) {
-
-			// Add which for key events
-			if ( event.which == null ) {
-				event.which = original.charCode != null ? original.charCode : original.keyCode;
-			}
-
-			return event;
-		}
-	},
-
-	mouseHooks: {
-		props: ( "button buttons clientX clientY fromElement offsetX offsetY " +
-			"pageX pageY screenX screenY toElement" ).split( " " ),
-		filter: function( event, original ) {
-			var body, eventDoc, doc,
-				button = original.button,
-				fromElement = original.fromElement;
-
-			// Calculate pageX/Y if missing and clientX/Y available
-			if ( event.pageX == null && original.clientX != null ) {
-				eventDoc = event.target.ownerDocument || document;
-				doc = eventDoc.documentElement;
-				body = eventDoc.body;
-
-				event.pageX = original.clientX +
-					( doc && doc.scrollLeft || body && body.scrollLeft || 0 ) -
-					( doc && doc.clientLeft || body && body.clientLeft || 0 );
-				event.pageY = original.clientY +
-					( doc && doc.scrollTop  || body && body.scrollTop  || 0 ) -
-					( doc && doc.clientTop  || body && body.clientTop  || 0 );
-			}
-
-			// Add relatedTarget, if necessary
-			if ( !event.relatedTarget && fromElement ) {
-				event.relatedTarget = fromElement === event.target ?
-					original.toElement :
-					fromElement;
-			}
-
-			// Add which for click: 1 === left; 2 === middle; 3 === right
-			// Note: button is not normalized, so don't use it
-			if ( !event.which && button !== undefined ) {
-				event.which = ( button & 1 ? 1 : ( button & 2 ? 3 : ( button & 4 ? 2 : 0 ) ) );
-			}
-
-			return event;
-		}
-	},
-
-	special: {
-		load: {
-
-			// Prevent triggered image.load events from bubbling to window.load
-			noBubble: true
-		},
-		focus: {
-
-			// Fire native event if possible so blur/focus sequence is correct
-			trigger: function() {
-				if ( this !== safeActiveElement() && this.focus ) {
-					try {
-						this.focus();
-						return false;
-					} catch ( e ) {
-
-						// Support: IE<9
-						// If we error on focus to hidden element (#1486, #12518),
-						// let .trigger() run the handlers
-					}
-				}
-			},
-			delegateType: "focusin"
-		},
-		blur: {
-			trigger: function() {
-				if ( this === safeActiveElement() && this.blur ) {
-					this.blur();
-					return false;
-				}
-			},
-			delegateType: "focusout"
-		},
-		click: {
-
-			// For checkbox, fire native event so checked state will be right
-			trigger: function() {
-				if ( jQuery.nodeName( this, "input" ) && this.type === "checkbox" && this.click ) {
-					this.click();
-					return false;
-				}
-			},
-
-			// For cross-browser consistency, don't fire native .click() on links
-			_default: function( event ) {
-				return jQuery.nodeName( event.target, "a" );
-			}
-		},
-
-		beforeunload: {
-			postDispatch: function( event ) {
-
-				// Support: Firefox 20+
-				// Firefox doesn't alert if the returnValue field is not set.
-				if ( event.result !== undefined && event.originalEvent ) {
-					event.originalEvent.returnValue = event.result;
-				}
-			}
-		}
-	},
-
-	// Piggyback on a donor event to simulate a different one
-	simulate: function( type, elem, event ) {
-		var e = jQuery.extend(
-			new jQuery.Event(),
-			event,
-			{
-				type: type,
-				isSimulated: true
-
-				// Previously, `originalEvent: {}` was set here, so stopPropagation call
-				// would not be triggered on donor event, since in our own
-				// jQuery.event.stopPropagation function we had a check for existence of
-				// originalEvent.stopPropagation method, so, consequently it would be a noop.
-				//
-				// Guard for simulated events was moved to jQuery.event.stopPropagation function
-				// since `originalEvent` should point to the original event for the
-				// constancy with other events and for more focused logic
-			}
-		);
-
-		jQuery.event.trigger( e, null, elem );
-
-		if ( e.isDefaultPrevented() ) {
-			event.preventDefault();
-		}
-	}
-};
-
-jQuery.removeEvent = document.removeEventListener ?
-	function( elem, type, handle ) {
-
-		// This "if" is needed for plain objects
-		if ( elem.removeEventListener ) {
-			elem.removeEventListener( type, handle );
-		}
-	} :
-	function( elem, type, handle ) {
-		var name = "on" + type;
-
-		if ( elem.detachEvent ) {
-
-			// #8545, #7054, preventing memory leaks for custom events in IE6-8
-			// detachEvent needed property on element, by name of that event,
-			// to properly expose it to GC
-			if ( typeof elem[ name ] === "undefined" ) {
-				elem[ name ] = null;
-			}
-
-			elem.detachEvent( name, handle );
-		}
-	};
-
-jQuery.Event = function( src, props ) {
-
-	// Allow instantiation without the 'new' keyword
-	if ( !( this instanceof jQuery.Event ) ) {
-		return new jQuery.Event( src, props );
-	}
-
-	// Event object
-	if ( src && src.type ) {
-		this.originalEvent = src;
-		this.type = src.type;
-
-		// Events bubbling up the document may have been marked as prevented
-		// by a handler lower down the tree; reflect the correct value.
-		this.isDefaultPrevented = src.defaultPrevented ||
-				src.defaultPrevented === undefined &&
-
-				// Support: IE < 9, Android < 4.0
-				src.returnValue === false ?
-			returnTrue :
-			returnFalse;
-
-	// Event type
-	} else {
-		this.type = src;
-	}
-
-	// Put explicitly provided properties onto the event object
-	if ( props ) {
-		jQuery.extend( this, props );
-	}
-
-	// Create a timestamp if incoming event doesn't have one
-	this.timeStamp = src && src.timeStamp || jQuery.now();
-
-	// Mark it as fixed
-	this[ jQuery.expando ] = true;
-};
-
-// jQuery.Event is based on DOM3 Events as specified by the ECMAScript Language Binding
-// http://www.w3.org/TR/2003/WD-DOM-Level-3-Events-20030331/ecma-script-binding.html
-jQuery.Event.prototype = {
-	constructor: jQuery.Event,
-	isDefaultPrevented: returnFalse,
-	isPropagationStopped: returnFalse,
-	isImmediatePropagationStopped: returnFalse,
-
-	preventDefault: function() {
-		var e = this.originalEvent;
-
-		this.isDefaultPrevented = returnTrue;
-		if ( !e ) {
-			return;
-		}
-
-		// If preventDefault exists, run it on the original event
-		if ( e.preventDefault ) {
-			e.preventDefault();
-
-		// Support: IE
-		// Otherwise set the returnValue property of the original event to false
-		} else {
-			e.returnValue = false;
-		}
-	},
-	stopPropagation: function() {
-		var e = this.originalEvent;
-
-		this.isPropagationStopped = returnTrue;
-
-		if ( !e || this.isSimulated ) {
-			return;
-		}
-
-		// If stopPropagation exists, run it on the original event
-		if ( e.stopPropagation ) {
-			e.stopPropagation();
-		}
-
-		// Support: IE
-		// Set the cancelBubble property of the original event to true
-		e.cancelBubble = true;
-	},
-	stopImmediatePropagation: function() {
-		var e = this.originalEvent;
-
-		this.isImmediatePropagationStopped = returnTrue;
-
-		if ( e && e.stopImmediatePropagation ) {
-			e.stopImmediatePropagation();
-		}
-
-		this.stopPropagation();
-	}
-};
-
-// Create mouseenter/leave events using mouseover/out and event-time checks
-// so that event delegation works in jQuery.
-// Do the same for pointerenter/pointerleave and pointerover/pointerout
-//
-// Support: Safari 7 only
-// Safari sends mouseenter too often; see:
-// https://code.google.com/p/chromium/issues/detail?id=470258
-// for the description of the bug (it existed in older Chrome versions as well).
-jQuery.each( {
-	mouseenter: "mouseover",
-	mouseleave: "mouseout",
-	pointerenter: "pointerover",
-	pointerleave: "pointerout"
-}, function( orig, fix ) {
-	jQuery.event.special[ orig ] = {
-		delegateType: fix,
-		bindType: fix,
-
-		handle: function( event ) {
-			var ret,
-				target = this,
-				related = event.relatedTarget,
-				handleObj = event.handleObj;
-
-			// For mouseenter/leave call the handler if related is outside the target.
-			// NB: No relatedTarget if the mouse left/entered the browser window
-			if ( !related || ( related !== target && !jQuery.contains( target, related ) ) ) {
-				event.type = handleObj.origType;
-				ret = handleObj.handler.apply( this, arguments );
-				event.type = fix;
-			}
-			return ret;
-		}
-	};
-} );
-
-// IE submit delegation
-if ( !support.submit ) {
-
-	jQuery.event.special.submit = {
-		setup: function() {
-
-			// Only need this for delegated form submit events
-			if ( jQuery.nodeName( this, "form" ) ) {
-				return false;
-			}
-
-			// Lazy-add a submit handler when a descendant form may potentially be submitted
-			jQuery.event.add( this, "click._submit keypress._submit", function( e ) {
-
-				// Node name check avoids a VML-related crash in IE (#9807)
-				var elem = e.target,
-					form = jQuery.nodeName( elem, "input" ) || jQuery.nodeName( elem, "button" ) ?
-
-						// Support: IE <=8
-						// We use jQuery.prop instead of elem.form
-						// to allow fixing the IE8 delegated submit issue (gh-2332)
-						// by 3rd party polyfills/workarounds.
-						jQuery.prop( elem, "form" ) :
-						undefined;
-
-				if ( form && !jQuery._data( form, "submit" ) ) {
-					jQuery.event.add( form, "submit._submit", function( event ) {
-						event._submitBubble = true;
-					} );
-					jQuery._data( form, "submit", true );
-				}
-			} );
-
-			// return undefined since we don't need an event listener
-		},
-
-		postDispatch: function( event ) {
-
-			// If form was submitted by the user, bubble the event up the tree
-			if ( event._submitBubble ) {
-				delete event._submitBubble;
-				if ( this.parentNode && !event.isTrigger ) {
-					jQuery.event.simulate( "submit", this.parentNode, event );
-				}
-			}
-		},
-
-		teardown: function() {
-
-			// Only need this for delegated form submit events
-			if ( jQuery.nodeName( this, "form" ) ) {
-				return false;
-			}
-
-			// Remove delegated handlers; cleanData eventually reaps submit handlers attached above
-			jQuery.event.remove( this, "._submit" );
-		}
-	};
-}
-
-// IE change delegation and checkbox/radio fix
-if ( !support.change ) {
-
-	jQuery.event.special.change = {
-
-		setup: function() {
-
-			if ( rformElems.test( this.nodeName ) ) {
-
-				// IE doesn't fire change on a check/radio until blur; trigger it on click
-				// after a propertychange. Eat the blur-change in special.change.handle.
-				// This still fires onchange a second time for check/radio after blur.
-				if ( this.type === "checkbox" || this.type === "radio" ) {
-					jQuery.event.add( this, "propertychange._change", function( event ) {
-						if ( event.originalEvent.propertyName === "checked" ) {
-							this._justChanged = true;
-						}
-					} );
-					jQuery.event.add( this, "click._change", function( event ) {
-						if ( this._justChanged && !event.isTrigger ) {
-							this._justChanged = false;
-						}
-
-						// Allow triggered, simulated change events (#11500)
-						jQuery.event.simulate( "change", this, event );
-					} );
-				}
-				return false;
-			}
-
-			// Delegated event; lazy-add a change handler on descendant inputs
-			jQuery.event.add( this, "beforeactivate._change", function( e ) {
-				var elem = e.target;
-
-				if ( rformElems.test( elem.nodeName ) && !jQuery._data( elem, "change" ) ) {
-					jQuery.event.add( elem, "change._change", function( event ) {
-						if ( this.parentNode && !event.isSimulated && !event.isTrigger ) {
-							jQuery.event.simulate( "change", this.parentNode, event );
-						}
-					} );
-					jQuery._data( elem, "change", true );
-				}
-			} );
-		},
-
-		handle: function( event ) {
-			var elem = event.target;
-
-			// Swallow native change events from checkbox/radio, we already triggered them above
-			if ( this !== elem || event.isSimulated || event.isTrigger ||
-				( elem.type !== "radio" && elem.type !== "checkbox" ) ) {
-
-				return event.handleObj.handler.apply( this, arguments );
-			}
-		},
-
-		teardown: function() {
-			jQuery.event.remove( this, "._change" );
-
-			return !rformElems.test( this.nodeName );
-		}
-	};
-}
-
-// Support: Firefox
-// Firefox doesn't have focus(in | out) events
-// Related ticket - https://bugzilla.mozilla.org/show_bug.cgi?id=687787
-//
-// Support: Chrome, Safari
-// focus(in | out) events fire after focus & blur events,
-// which is spec violation - http://www.w3.org/TR/DOM-Level-3-Events/#events-focusevent-event-order
-// Related ticket - https://code.google.com/p/chromium/issues/detail?id=449857
-if ( !support.focusin ) {
-	jQuery.each( { focus: "focusin", blur: "focusout" }, function( orig, fix ) {
-
-		// Attach a single capturing handler on the document while someone wants focusin/focusout
-		var handler = function( event ) {
-			jQuery.event.simulate( fix, event.target, jQuery.event.fix( event ) );
-		};
-
-		jQuery.event.special[ fix ] = {
-			setup: function() {
-				var doc = this.ownerDocument || this,
-					attaches = jQuery._data( doc, fix );
-
-				if ( !attaches ) {
-					doc.addEventListener( orig, handler, true );
-				}
-				jQuery._data( doc, fix, ( attaches || 0 ) + 1 );
-			},
-			teardown: function() {
-				var doc = this.ownerDocument || this,
-					attaches = jQuery._data( doc, fix ) - 1;
-
-				if ( !attaches ) {
-					doc.removeEventListener( orig, handler, true );
-					jQuery._removeData( doc, fix );
-				} else {
-					jQuery._data( doc, fix, attaches );
-				}
-			}
-		};
-	} );
-}
-
-jQuery.fn.extend( {
-
-	on: function( types, selector, data, fn ) {
-		return on( this, types, selector, data, fn );
-	},
-	one: function( types, selector, data, fn ) {
-		return on( this, types, selector, data, fn, 1 );
-	},
-	off: function( types, selector, fn ) {
-		var handleObj, type;
-		if ( types && types.preventDefault && types.handleObj ) {
-
-			// ( event )  dispatched jQuery.Event
-			handleObj = types.handleObj;
-			jQuery( types.delegateTarget ).off(
-				handleObj.namespace ?
-					handleObj.origType + "." + handleObj.namespace :
-					handleObj.origType,
-				handleObj.selector,
-				handleObj.handler
-			);
-			return this;
-		}
-		if ( typeof types === "object" ) {
-
-			// ( types-object [, selector] )
-			for ( type in types ) {
-				this.off( type, selector, types[ type ] );
-			}
-			return this;
-		}
-		if ( selector === false || typeof selector === "function" ) {
-
-			// ( types [, fn] )
-			fn = selector;
-			selector = undefined;
-		}
-		if ( fn === false ) {
-			fn = returnFalse;
-		}
-		return this.each( function() {
-			jQuery.event.remove( this, types, fn, selector );
-		} );
-	},
-
-	trigger: function( type, data ) {
-		return this.each( function() {
-			jQuery.event.trigger( type, data, this );
-		} );
-	},
-	triggerHandler: function( type, data ) {
-		var elem = this[ 0 ];
-		if ( elem ) {
-			return jQuery.event.trigger( type, data, elem, true );
-		}
-	}
-} );
-
-
-var rinlinejQuery = / jQuery\d+="(?:null|\d+)"/g,
-	rnoshimcache = new RegExp( "<(?:" + nodeNames + ")[\\s/>]", "i" ),
-	rxhtmlTag = /<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:-]+)[^>]*)\/>/gi,
-
-	// Support: IE 10-11, Edge 10240+
-	// In IE/Edge using regex groups here causes severe slowdowns.
-	// See https://connect.microsoft.com/IE/feedback/details/1736512/
-	rnoInnerhtml = /<script|<style|<link/i,
-
-	// checked="checked" or checked
-	rchecked = /checked\s*(?:[^=]|=\s*.checked.)/i,
-	rscriptTypeMasked = /^true\/(.*)/,
-	rcleanScript = /^\s*<!(?:\[CDATA\[|--)|(?:\]\]|--)>\s*$/g,
-	safeFragment = createSafeFragment( document ),
-	fragmentDiv = safeFragment.appendChild( document.createElement( "div" ) );
-
-// Support: IE<8
-// Manipulating tables requires a tbody
-function manipulationTarget( elem, content ) {
-	return jQuery.nodeName( elem, "table" ) &&
-		jQuery.nodeName( content.nodeType !== 11 ? content : content.firstChild, "tr" ) ?
-
-		elem.getElementsByTagName( "tbody" )[ 0 ] ||
-			elem.appendChild( elem.ownerDocument.createElement( "tbody" ) ) :
-		elem;
-}
-
-// Replace/restore the type attribute of script elements for safe DOM manipulation
-function disableScript( elem ) {
-	elem.type = ( jQuery.find.attr( elem, "type" ) !== null ) + "/" + elem.type;
-	return elem;
-}
-function restoreScript( elem ) {
-	var match = rscriptTypeMasked.exec( elem.type );
-	if ( match ) {
-		elem.type = match[ 1 ];
-	} else {
-		elem.removeAttribute( "type" );
-	}
-	return elem;
-}
-
-function cloneCopyEvent( src, dest ) {
-	if ( dest.nodeType !== 1 || !jQuery.hasData( src ) ) {
-		return;
-	}
-
-	var type, i, l,
-		oldData = jQuery._data( src ),
-		curData = jQuery._data( dest, oldData ),
-		events = oldData.events;
-
-	if ( events ) {
-		delete curData.handle;
-		curData.events = {};
-
-		for ( type in events ) {
-			for ( i = 0, l = events[ type ].length; i < l; i++ ) {
-				jQuery.event.add( dest, type, events[ type ][ i ] );
-			}
-		}
-	}
-
-	// make the cloned public data object a copy from the original
-	if ( curData.data ) {
-		curData.data = jQuery.extend( {}, curData.data );
-	}
-}
-
-function fixCloneNodeIssues( src, dest ) {
-	var nodeName, e, data;
-
-	// We do not need to do anything for non-Elements
-	if ( dest.nodeType !== 1 ) {
-		return;
-	}
-
-	nodeName = dest.nodeName.toLowerCase();
-
-	// IE6-8 copies events bound via attachEvent when using cloneNode.
-	if ( !support.noCloneEvent && dest[ jQuery.expando ] ) {
-		data = jQuery._data( dest );
-
-		for ( e in data.events ) {
-			jQuery.removeEvent( dest, e, data.handle );
-		}
-
-		// Event data gets referenced instead of copied if the expando gets copied too
-		dest.removeAttribute( jQuery.expando );
-	}
-
-	// IE blanks contents when cloning scripts, and tries to evaluate newly-set text
-	if ( nodeName === "script" && dest.text !== src.text ) {
-		disableScript( dest ).text = src.text;
-		restoreScript( dest );
-
-	// IE6-10 improperly clones children of object elements using classid.
-	// IE10 throws NoModificationAllowedError if parent is null, #12132.
-	} else if ( nodeName === "object" ) {
-		if ( dest.parentNode ) {
-			dest.outerHTML = src.outerHTML;
-		}
-
-		// This path appears unavoidable for IE9. When cloning an object
-		// element in IE9, the outerHTML strategy above is not sufficient.
-		// If the src has innerHTML and the destination does not,
-		// copy the src.innerHTML into the dest.innerHTML. #10324
-		if ( support.html5Clone && ( src.innerHTML && !jQuery.trim( dest.innerHTML ) ) ) {
-			dest.innerHTML = src.innerHTML;
-		}
-
-	} else if ( nodeName === "input" && rcheckableType.test( src.type ) ) {
-
-		// IE6-8 fails to persist the checked state of a cloned checkbox
-		// or radio button. Worse, IE6-7 fail to give the cloned element
-		// a checked appearance if the defaultChecked value isn't also set
-
-		dest.defaultChecked = dest.checked = src.checked;
-
-		// IE6-7 get confused and end up setting the value of a cloned
-		// checkbox/radio button to an empty string instead of "on"
-		if ( dest.value !== src.value ) {
-			dest.value = src.value;
-		}
-
-	// IE6-8 fails to return the selected option to the default selected
-	// state when cloning options
-	} else if ( nodeName === "option" ) {
-		dest.defaultSelected = dest.selected = src.defaultSelected;
-
-	// IE6-8 fails to set the defaultValue to the correct value when
-	// cloning other types of input fields
-	} else if ( nodeName === "input" || nodeName === "textarea" ) {
-		dest.defaultValue = src.defaultValue;
-	}
-}
-
-function domManip( collection, args, callback, ignored ) {
-
-	// Flatten any nested arrays
-	args = concat.apply( [], args );
-
-	var first, node, hasScripts,
-		scripts, doc, fragment,
-		i = 0,
-		l = collection.length,
-		iNoClone = l - 1,
-		value = args[ 0 ],
-		isFunction = jQuery.isFunction( value );
-
-	// We can't cloneNode fragments that contain checked, in WebKit
-	if ( isFunction ||
-			( l > 1 && typeof value === "string" &&
-				!support.checkClone && rchecked.test( value ) ) ) {
-		return collection.each( function( index ) {
-			var self = collection.eq( index );
-			if ( isFunction ) {
-				args[ 0 ] = value.call( this, index, self.html() );
-			}
-			domManip( self, args, callback, ignored );
-		} );
-	}
-
-	if ( l ) {
-		fragment = buildFragment( args, collection[ 0 ].ownerDocument, false, collection, ignored );
-		first = fragment.firstChild;
-
-		if ( fragment.childNodes.length === 1 ) {
-			fragment = first;
-		}
-
-		// Require either new content or an interest in ignored elements to invoke the callback
-		if ( first || ignored ) {
-			scripts = jQuery.map( getAll( fragment, "script" ), disableScript );
-			hasScripts = scripts.length;
-
-			// Use the original fragment for the last item
-			// instead of the first because it can end up
-			// being emptied incorrectly in certain situations (#8070).
-			for ( ; i < l; i++ ) {
-				node = fragment;
-
-				if ( i !== iNoClone ) {
-					node = jQuery.clone( node, true, true );
-
-					// Keep references to cloned scripts for later restoration
-					if ( hasScripts ) {
-
-						// Support: Android<4.1, PhantomJS<2
-						// push.apply(_, arraylike) throws on ancient WebKit
-						jQuery.merge( scripts, getAll( node, "script" ) );
-					}
-				}
-
-				callback.call( collection[ i ], node, i );
-			}
-
-			if ( hasScripts ) {
-				doc = scripts[ scripts.length - 1 ].ownerDocument;
-
-				// Reenable scripts
-				jQuery.map( scripts, restoreScript );
-
-				// Evaluate executable scripts on first document insertion
-				for ( i = 0; i < hasScripts; i++ ) {
-					node = scripts[ i ];
-					if ( rscriptType.test( node.type || "" ) &&
-						!jQuery._data( node, "globalEval" ) &&
-						jQuery.contains( doc, node ) ) {
-
-						if ( node.src ) {
-
-							// Optional AJAX dependency, but won't run scripts if not present
-							if ( jQuery._evalUrl ) {
-								jQuery._evalUrl( node.src );
-							}
-						} else {
-							jQuery.globalEval(
-								( node.text || node.textContent || node.innerHTML || "" )
-									.replace( rcleanScript, "" )
-							);
-						}
-					}
-				}
-			}
-
-			// Fix #11809: Avoid leaking memory
-			fragment = first = null;
-		}
-	}
-
-	return collection;
-}
-
-function remove( elem, selector, keepData ) {
-	var node,
-		elems = selector ? jQuery.filter( selector, elem ) : elem,
-		i = 0;
-
-	for ( ; ( node = elems[ i ] ) != null; i++ ) {
-
-		if ( !keepData && node.nodeType === 1 ) {
-			jQuery.cleanData( getAll( node ) );
-		}
-
-		if ( node.parentNode ) {
-			if ( keepData && jQuery.contains( node.ownerDocument, node ) ) {
-				setGlobalEval( getAll( node, "script" ) );
-			}
-			node.parentNode.removeChild( node );
-		}
-	}
-
-	return elem;
-}
-
-jQuery.extend( {
-	htmlPrefilter: function( html ) {
-		return html.replace( rxhtmlTag, "<$1></$2>" );
-	},
-
-	clone: function( elem, dataAndEvents, deepDataAndEvents ) {
-		var destElements, node, clone, i, srcElements,
-			inPage = jQuery.contains( elem.ownerDocument, elem );
-
-		if ( support.html5Clone || jQuery.isXMLDoc( elem ) ||
-			!rnoshimcache.test( "<" + elem.nodeName + ">" ) ) {
-
-			clone = elem.cloneNode( true );
-
-		// IE<=8 does not properly clone detached, unknown element nodes
-		} else {
-			fragmentDiv.innerHTML = elem.outerHTML;
-			fragmentDiv.removeChild( clone = fragmentDiv.firstChild );
-		}
-
-		if ( ( !support.noCloneEvent || !support.noCloneChecked ) &&
-				( elem.nodeType === 1 || elem.nodeType === 11 ) && !jQuery.isXMLDoc( elem ) ) {
-
-			// We eschew Sizzle here for performance reasons: http://jsperf.com/getall-vs-sizzle/2
-			destElements = getAll( clone );
-			srcElements = getAll( elem );
-
-			// Fix all IE cloning issues
-			for ( i = 0; ( node = srcElements[ i ] ) != null; ++i ) {
-
-				// Ensure that the destination node is not null; Fixes #9587
-				if ( destElements[ i ] ) {
-					fixCloneNodeIssues( node, destElements[ i ] );
-				}
-			}
-		}
-
-		// Copy the events from the original to the clone
-		if ( dataAndEvents ) {
-			if ( deepDataAndEvents ) {
-				srcElements = srcElements || getAll( elem );
-				destElements = destElements || getAll( clone );
-
-				for ( i = 0; ( node = srcElements[ i ] ) != null; i++ ) {
-					cloneCopyEvent( node, destElements[ i ] );
-				}
-			} else {
-				cloneCopyEvent( elem, clone );
-			}
-		}
-
-		// Preserve script evaluation history
-		destElements = getAll( clone, "script" );
-		if ( destElements.length > 0 ) {
-			setGlobalEval( destElements, !inPage && getAll( elem, "script" ) );
-		}
-
-		destElements = srcElements = node = null;
-
-		// Return the cloned set
-		return clone;
-	},
-
-	cleanData: function( elems, /* internal */ forceAcceptData ) {
-		var elem, type, id, data,
-			i = 0,
-			internalKey = jQuery.expando,
-			cache = jQuery.cache,
-			attributes = support.attributes,
-			special = jQuery.event.special;
-
-		for ( ; ( elem = elems[ i ] ) != null; i++ ) {
-			if ( forceAcceptData || acceptData( elem ) ) {
-
-				id = elem[ internalKey ];
-				data = id && cache[ id ];
-
-				if ( data ) {
-					if ( data.events ) {
-						for ( type in data.events ) {
-							if ( special[ type ] ) {
-								jQuery.event.remove( elem, type );
-
-							// This is a shortcut to avoid jQuery.event.remove's overhead
-							} else {
-								jQuery.removeEvent( elem, type, data.handle );
-							}
-						}
-					}
-
-					// Remove cache only if it was not already removed by jQuery.event.remove
-					if ( cache[ id ] ) {
-
-						delete cache[ id ];
-
-						// Support: IE<9
-						// IE does not allow us to delete expando properties from nodes
-						// IE creates expando attributes along with the property
-						// IE does not have a removeAttribute function on Document nodes
-						if ( !attributes && typeof elem.removeAttribute !== "undefined" ) {
-							elem.removeAttribute( internalKey );
-
-						// Webkit & Blink performance suffers when deleting properties
-						// from DOM nodes, so set to undefined instead
-						// https://code.google.com/p/chromium/issues/detail?id=378607
-						} else {
-							elem[ internalKey ] = undefined;
-						}
-
-						deletedIds.push( id );
-					}
-				}
-			}
-		}
-	}
-} );
-
-jQuery.fn.extend( {
-
-	// Keep domManip exposed until 3.0 (gh-2225)
-	domManip: domManip,
-
-	detach: function( selector ) {
-		return remove( this, selector, true );
-	},
-
-	remove: function( selector ) {
-		return remove( this, selector );
-	},
-
-	text: function( value ) {
-		return access( this, function( value ) {
-			return value === undefined ?
-				jQuery.text( this ) :
-				this.empty().append(
-					( this[ 0 ] && this[ 0 ].ownerDocument || document ).createTextNode( value )
-				);
-		}, null, value, arguments.length );
-	},
-
-	append: function() {
-		return domManip( this, arguments, function( elem ) {
-			if ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) {
-				var target = manipulationTarget( this, elem );
-				target.appendChild( elem );
-			}
-		} );
-	},
-
-	prepend: function() {
-		return domManip( this, arguments, function( elem ) {
-			if ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) {
-				var target = manipulationTarget( this, elem );
-				target.insertBefore( elem, target.firstChild );
-			}
-		} );
-	},
-
-	before: function() {
-		return domManip( this, arguments, function( elem ) {
-			if ( this.parentNode ) {
-				this.parentNode.insertBefore( elem, this );
-			}
-		} );
-	},
-
-	after: function() {
-		return domManip( this, arguments, function( elem ) {
-			if ( this.parentNode ) {
-				this.parentNode.insertBefore( elem, this.nextSibling );
-			}
-		} );
-	},
-
-	empty: function() {
-		var elem,
-			i = 0;
-
-		for ( ; ( elem = this[ i ] ) != null; i++ ) {
-
-			// Remove element nodes and prevent memory leaks
-			if ( elem.nodeType === 1 ) {
-				jQuery.cleanData( getAll( elem, false ) );
-			}
-
-			// Remove any remaining nodes
-			while ( elem.firstChild ) {
-				elem.removeChild( elem.firstChild );
-			}
-
-			// If this is a select, ensure that it displays empty (#12336)
-			// Support: IE<9
-			if ( elem.options && jQuery.nodeName( elem, "select" ) ) {
-				elem.options.length = 0;
-			}
-		}
-
-		return this;
-	},
-
-	clone: function( dataAndEvents, deepDataAndEvents ) {
-		dataAndEvents = dataAndEvents == null ? false : dataAndEvents;
-		deepDataAndEvents = deepDataAndEvents == null ? dataAndEvents : deepDataAndEvents;
-
-		return this.map( function() {
-			return jQuery.clone( this, dataAndEvents, deepDataAndEvents );
-		} );
-	},
-
-	html: function( value ) {
-		return access( this, function( value ) {
-			var elem = this[ 0 ] || {},
-				i = 0,
-				l = this.length;
-
-			if ( value === undefined ) {
-				return elem.nodeType === 1 ?
-					elem.innerHTML.replace( rinlinejQuery, "" ) :
-					undefined;
-			}
-
-			// See if we can take a shortcut and just use innerHTML
-			if ( typeof value === "string" && !rnoInnerhtml.test( value ) &&
-				( support.htmlSerialize || !rnoshimcache.test( value )  ) &&
-				( support.leadingWhitespace || !rleadingWhitespace.test( value ) ) &&
-				!wrapMap[ ( rtagName.exec( value ) || [ "", "" ] )[ 1 ].toLowerCase() ] ) {
-
-				value = jQuery.htmlPrefilter( value );
-
-				try {
-					for ( ; i < l; i++ ) {
-
-						// Remove element nodes and prevent memory leaks
-						elem = this[ i ] || {};
-						if ( elem.nodeType === 1 ) {
-							jQuery.cleanData( getAll( elem, false ) );
-							elem.innerHTML = value;
-						}
-					}
-
-					elem = 0;
-
-				// If using innerHTML throws an exception, use the fallback method
-				} catch ( e ) {}
-			}
-
-			if ( elem ) {
-				this.empty().append( value );
-			}
-		}, null, value, arguments.length );
-	},
-
-	replaceWith: function() {
-		var ignored = [];
-
-		// Make the changes, replacing each non-ignored context element with the new content
-		return domManip( this, arguments, function( elem ) {
-			var parent = this.parentNode;
-
-			if ( jQuery.inArray( this, ignored ) < 0 ) {
-				jQuery.cleanData( getAll( this ) );
-				if ( parent ) {
-					parent.replaceChild( elem, this );
-				}
-			}
-
-		// Force callback invocation
-		}, ignored );
-	}
-} );
-
-jQuery.each( {
-	appendTo: "append",
-	prependTo: "prepend",
-	insertBefore: "before",
-	insertAfter: "after",
-	replaceAll: "replaceWith"
-}, function( name, original ) {
-	jQuery.fn[ name ] = function( selector ) {
-		var elems,
-			i = 0,
-			ret = [],
-			insert = jQuery( selector ),
-			last = insert.length - 1;
-
-		for ( ; i <= last; i++ ) {
-			elems = i === last ? this : this.clone( true );
-			jQuery( insert[ i ] )[ original ]( elems );
-
-			// Modern browsers can apply jQuery collections as arrays, but oldIE needs a .get()
-			push.apply( ret, elems.get() );
-		}
-
-		return this.pushStack( ret );
-	};
-} );
-
-
-var iframe,
-	elemdisplay = {
-
-		// Support: Firefox
-		// We have to pre-define these values for FF (#10227)
-		HTML: "block",
-		BODY: "block"
-	};
-
-/**
- * Retrieve the actual display of a element
- * @param {String} name nodeName of the element
- * @param {Object} doc Document object
- */
-
-// Called only from within defaultDisplay
-function actualDisplay( name, doc ) {
-	var elem = jQuery( doc.createElement( name ) ).appendTo( doc.body ),
-
-		display = jQuery.css( elem[ 0 ], "display" );
-
-	// We don't have any data stored on the element,
-	// so use "detach" method as fast way to get rid of the element
-	elem.detach();
-
-	return display;
-}
-
-/**
- * Try to determine the default display value of an element
- * @param {String} nodeName
- */
-function defaultDisplay( nodeName ) {
-	var doc = document,
-		display = elemdisplay[ nodeName ];
-
-	if ( !display ) {
-		display = actualDisplay( nodeName, doc );
-
-		// If the simple way fails, read from inside an iframe
-		if ( display === "none" || !display ) {
-
-			// Use the already-created iframe if possible
-			iframe = ( iframe || jQuery( "<iframe frameborder='0' width='0' height='0'/>" ) )
-				.appendTo( doc.documentElement );
-
-			// Always write a new HTML skeleton so Webkit and Firefox don't choke on reuse
-			doc = ( iframe[ 0 ].contentWindow || iframe[ 0 ].contentDocument ).document;
-
-			// Support: IE
-			doc.write();
-			doc.close();
-
-			display = actualDisplay( nodeName, doc );
-			iframe.detach();
-		}
-
-		// Store the correct default display
-		elemdisplay[ nodeName ] = display;
-	}
-
-	return display;
-}
-var rmargin = ( /^margin/ );
-
-var rnumnonpx = new RegExp( "^(" + pnum + ")(?!px)[a-z%]+$", "i" );
-
-var swap = function( elem, options, callback, args ) {
-	var ret, name,
-		old = {};
-
-	// Remember the old values, and insert the new ones
-	for ( name in options ) {
-		old[ name ] = elem.style[ name ];
-		elem.style[ name ] = options[ name ];
-	}
-
-	ret = callback.apply( elem, args || [] );
-
-	// Revert the old values
-	for ( name in options ) {
-		elem.style[ name ] = old[ name ];
-	}
-
-	return ret;
-};
-
-
-var documentElement = document.documentElement;
-
-
-
-( function() {
-	var pixelPositionVal, pixelMarginRightVal, boxSizingReliableVal,
-		reliableHiddenOffsetsVal, reliableMarginRightVal, reliableMarginLeftVal,
-		container = document.createElement( "div" ),
-		div = document.createElement( "div" );
-
-	// Finish early in limited (non-browser) environments
-	if ( !div.style ) {
-		return;
-	}
-
-	div.style.cssText = "float:left;opacity:.5";
-
-	// Support: IE<9
-	// Make sure that element opacity exists (as opposed to filter)
-	support.opacity = div.style.opacity === "0.5";
-
-	// Verify style float existence
-	// (IE uses styleFloat instead of cssFloat)
-	support.cssFloat = !!div.style.cssFloat;
-
-	div.style.backgroundClip = "content-box";
-	div.cloneNode( true ).style.backgroundClip = "";
-	support.clearCloneStyle = div.style.backgroundClip === "content-box";
-
-	container = document.createElement( "div" );
-	container.style.cssText = "border:0;width:8px;height:0;top:0;left:-9999px;" +
-		"padding:0;margin-top:1px;position:absolute";
-	div.innerHTML = "";
-	container.appendChild( div );
-
-	// Support: Firefox<29, Android 2.3
-	// Vendor-prefix box-sizing
-	support.boxSizing = div.style.boxSizing === "" || div.style.MozBoxSizing === "" ||
-		div.style.WebkitBoxSizing === "";
-
-	jQuery.extend( support, {
-		reliableHiddenOffsets: function() {
-			if ( pixelPositionVal == null ) {
-				computeStyleTests();
-			}
-			return reliableHiddenOffsetsVal;
-		},
-
-		boxSizingReliable: function() {
-
-			// We're checking for pixelPositionVal here instead of boxSizingReliableVal
-			// since that compresses better and they're computed together anyway.
-			if ( pixelPositionVal == null ) {
-				computeStyleTests();
-			}
-			return boxSizingReliableVal;
-		},
-
-		pixelMarginRight: function() {
-
-			// Support: Android 4.0-4.3
-			if ( pixelPositionVal == null ) {
-				computeStyleTests();
-			}
-			return pixelMarginRightVal;
-		},
-
-		pixelPosition: function() {
-			if ( pixelPositionVal == null ) {
-				computeStyleTests();
-			}
-			return pixelPositionVal;
-		},
-
-		reliableMarginRight: function() {
-
-			// Support: Android 2.3
-			if ( pixelPositionVal == null ) {
-				computeStyleTests();
-			}
-			return reliableMarginRightVal;
-		},
-
-		reliableMarginLeft: function() {
-
-			// Support: IE <=8 only, Android 4.0 - 4.3 only, Firefox <=3 - 37
-			if ( pixelPositionVal == null ) {
-				computeStyleTests();
-			}
-			return reliableMarginLeftVal;
-		}
-	} );
-
-	function computeStyleTests() {
-		var contents, divStyle,
-			documentElement = document.documentElement;
-
-		// Setup
-		documentElement.appendChild( container );
-
-		div.style.cssText =
-
-			// Support: Android 2.3
-			// Vendor-prefix box-sizing
-			"-webkit-box-sizing:border-box;box-sizing:border-box;" +
-			"position:relative;display:block;" +
-			"margin:auto;border:1px;padding:1px;" +
-			"top:1%;width:50%";
-
-		// Support: IE<9
-		// Assume reasonable values in the absence of getComputedStyle
-		pixelPositionVal = boxSizingReliableVal = reliableMarginLeftVal = false;
-		pixelMarginRightVal = reliableMarginRightVal = true;
-
-		// Check for getComputedStyle so that this code is not run in IE<9.
-		if ( window.getComputedStyle ) {
-			divStyle = window.getComputedStyle( div );
-			pixelPositionVal = ( divStyle || {} ).top !== "1%";
-			reliableMarginLeftVal = ( divStyle || {} ).marginLeft === "2px";
-			boxSizingReliableVal = ( divStyle || { width: "4px" } ).width === "4px";
-
-			// Support: Android 4.0 - 4.3 only
-			// Some styles come back with percentage values, even though they shouldn't
-			div.style.marginRight = "50%";
-			pixelMarginRightVal = ( divStyle || { marginRight: "4px" } ).marginRight === "4px";
-
-			// Support: Android 2.3 only
-			// Div with explicit width and no margin-right incorrectly
-			// gets computed margin-right based on width of container (#3333)
-			// WebKit Bug 13343 - getComputedStyle returns wrong value for margin-right
-			contents = div.appendChild( document.createElement( "div" ) );
-
-			// Reset CSS: box-sizing; display; margin; border; padding
-			contents.style.cssText = div.style.cssText =
-
-				// Support: Android 2.3
-				// Vendor-prefix box-sizing
-				"-webkit-box-sizing:content-box;-moz-box-sizing:content-box;" +
-				"box-sizing:content-box;display:block;margin:0;border:0;padding:0";
-			contents.style.marginRight = contents.style.width = "0";
-			div.style.width = "1px";
-
-			reliableMarginRightVal =
-				!parseFloat( ( window.getComputedStyle( contents ) || {} ).marginRight );
-
-			div.removeChild( contents );
-		}
-
-		// Support: IE6-8
-		// First check that getClientRects works as expected
-		// Check if table cells still have offsetWidth/Height when they are set
-		// to display:none and there are still other visible table cells in a
-		// table row; if so, offsetWidth/Height are not reliable for use when
-		// determining if an element has been hidden directly using
-		// display:none (it is still safe to use offsets if a parent element is
-		// hidden; don safety goggles and see bug #4512 for more information).
-		div.style.display = "none";
-		reliableHiddenOffsetsVal = div.getClientRects().length === 0;
-		if ( reliableHiddenOffsetsVal ) {
-			div.style.display = "";
-			div.innerHTML = "<table><tr><td></td><td>t</td></tr></table>";
-			div.childNodes[ 0 ].style.borderCollapse = "separate";
-			contents = div.getElementsByTagName( "td" );
-			contents[ 0 ].style.cssText = "margin:0;border:0;padding:0;display:none";
-			reliableHiddenOffsetsVal = contents[ 0 ].offsetHeight === 0;
-			if ( reliableHiddenOffsetsVal ) {
-				contents[ 0 ].style.display = "";
-				contents[ 1 ].style.display = "none";
-				reliableHiddenOffsetsVal = contents[ 0 ].offsetHeight === 0;
-			}
-		}
-
-		// Teardown
-		documentElement.removeChild( container );
-	}
-
-} )();
-
-
-var getStyles, curCSS,
-	rposition = /^(top|right|bottom|left)$/;
-
-if ( window.getComputedStyle ) {
-	getStyles = function( elem ) {
-
-		// Support: IE<=11+, Firefox<=30+ (#15098, #14150)
-		// IE throws on elements created in popups
-		// FF meanwhile throws on frame elements through "defaultView.getComputedStyle"
-		var view = elem.ownerDocument.defaultView;
-
-		if ( !view || !view.opener ) {
-			view = window;
-		}
-
-		return view.getComputedStyle( elem );
-	};
-
-	curCSS = function( elem, name, computed ) {
-		var width, minWidth, maxWidth, ret,
-			style = elem.style;
-
-		computed = computed || getStyles( elem );
-
-		// getPropertyValue is only needed for .css('filter') in IE9, see #12537
-		ret = computed ? computed.getPropertyValue( name ) || computed[ name ] : undefined;
-
-		// Support: Opera 12.1x only
-		// Fall back to style even without computed
-		// computed is undefined for elems on document fragments
-		if ( ( ret === "" || ret === undefined ) && !jQuery.contains( elem.ownerDocument, elem ) ) {
-			ret = jQuery.style( elem, name );
-		}
-
-		if ( computed ) {
-
-			// A tribute to the "awesome hack by Dean Edwards"
-			// Chrome < 17 and Safari 5.0 uses "computed value"
-			// instead of "used value" for margin-right
-			// Safari 5.1.7 (at least) returns percentage for a larger set of values,
-			// but width seems to be reliably pixels
-			// this is against the CSSOM draft spec:
-			// http://dev.w3.org/csswg/cssom/#resolved-values
-			if ( !support.pixelMarginRight() && rnumnonpx.test( ret ) && rmargin.test( name ) ) {
-
-				// Remember the original values
-				width = style.width;
-				minWidth = style.minWidth;
-				maxWidth = style.maxWidth;
-
-				// Put in the new values to get a computed value out
-				style.minWidth = style.maxWidth = style.width = ret;
-				ret = computed.width;
-
-				// Revert the changed values
-				style.width = width;
-				style.minWidth = minWidth;
-				style.maxWidth = maxWidth;
-			}
-		}
-
-		// Support: IE
-		// IE returns zIndex value as an integer.
-		return ret === undefined ?
-			ret :
-			ret + "";
-	};
-} else if ( documentElement.currentStyle ) {
-	getStyles = function( elem ) {
-		return elem.currentStyle;
-	};
-
-	curCSS = function( elem, name, computed ) {
-		var left, rs, rsLeft, ret,
-			style = elem.style;
-
-		computed = computed || getStyles( elem );
-		ret = computed ? computed[ name ] : undefined;
-
-		// Avoid setting ret to empty string here
-		// so we don't default to auto
-		if ( ret == null && style && style[ name ] ) {
-			ret = style[ name ];
-		}
-
-		// From the awesome hack by Dean Edwards
-		// http://erik.eae.net/archives/2007/07/27/18.54.15/#comment-102291
-
-		// If we're not dealing with a regular pixel number
-		// but a number that has a weird ending, we need to convert it to pixels
-		// but not position css attributes, as those are
-		// proportional to the parent element instead
-		// and we can't measure the parent instead because it
-		// might trigger a "stacking dolls" problem
-		if ( rnumnonpx.test( ret ) && !rposition.test( name ) ) {
-
-			// Remember the original values
-			left = style.left;
-			rs = elem.runtimeStyle;
-			rsLeft = rs && rs.left;
-
-			// Put in the new values to get a computed value out
-			if ( rsLeft ) {
-				rs.left = elem.currentStyle.left;
-			}
-			style.left = name === "fontSize" ? "1em" : ret;
-			ret = style.pixelLeft + "px";
-
-			// Revert the changed values
-			style.left = left;
-			if ( rsLeft ) {
-				rs.left = rsLeft;
-			}
-		}
-
-		// Support: IE
-		// IE returns zIndex value as an integer.
-		return ret === undefined ?
-			ret :
-			ret + "" || "auto";
-	};
-}
-
-
-
-
-function addGetHookIf( conditionFn, hookFn ) {
-
-	// Define the hook, we'll check on the first run if it's really needed.
-	return {
-		get: function() {
-			if ( conditionFn() ) {
-
-				// Hook not needed (or it's not possible to use it due
-				// to missing dependency), remove it.
-				delete this.get;
-				return;
-			}
-
-			// Hook needed; redefine it so that the support test is not executed again.
-			return ( this.get = hookFn ).apply( this, arguments );
-		}
-	};
-}
-
-
-var
-
-		ralpha = /alpha\([^)]*\)/i,
-	ropacity = /opacity\s*=\s*([^)]*)/i,
-
-	// swappable if display is none or starts with table except
-	// "table", "table-cell", or "table-caption"
-	// see here for display values:
-	// https://developer.mozilla.org/en-US/docs/CSS/display
-	rdisplayswap = /^(none|table(?!-c[ea]).+)/,
-	rnumsplit = new RegExp( "^(" + pnum + ")(.*)$", "i" ),
-
-	cssShow = { position: "absolute", visibility: "hidden", display: "block" },
-	cssNormalTransform = {
-		letterSpacing: "0",
-		fontWeight: "400"
-	},
-
-	cssPrefixes = [ "Webkit", "O", "Moz", "ms" ],
-	emptyStyle = document.createElement( "div" ).style;
-
-
-// return a css property mapped to a potentially vendor prefixed property
-function vendorPropName( name ) {
-
-	// shortcut for names that are not vendor prefixed
-	if ( name in emptyStyle ) {
-		return name;
-	}
-
-	// check for vendor prefixed names
-	var capName = name.charAt( 0 ).toUpperCase() + name.slice( 1 ),
-		i = cssPrefixes.length;
-
-	while ( i-- ) {
-		name = cssPrefixes[ i ] + capName;
-		if ( name in emptyStyle ) {
-			return name;
-		}
-	}
-}
-
-function showHide( elements, show ) {
-	var display, elem, hidden,
-		values = [],
-		index = 0,
-		length = elements.length;
-
-	for ( ; index < length; index++ ) {
-		elem = elements[ index ];
-		if ( !elem.style ) {
-			continue;
-		}
-
-		values[ index ] = jQuery._data( elem, "olddisplay" );
-		display = elem.style.display;
-		if ( show ) {
-
-			// Reset the inline display of this element to learn if it is
-			// being hidden by cascaded rules or not
-			if ( !values[ index ] && display === "none" ) {
-				elem.style.display = "";
-			}
-
-			// Set elements which have been overridden with display: none
-			// in a stylesheet to whatever the default browser style is
-			// for such an element
-			if ( elem.style.display === "" && isHidden( elem ) ) {
-				values[ index ] =
-					jQuery._data( elem, "olddisplay", defaultDisplay( elem.nodeName ) );
-			}
-		} else {
-			hidden = isHidden( elem );
-
-			if ( display && display !== "none" || !hidden ) {
-				jQuery._data(
-					elem,
-					"olddisplay",
-					hidden ? display : jQuery.css( elem, "display" )
-				);
-			}
-		}
-	}
-
-	// Set the display of most of the elements in a second loop
-	// to avoid the constant reflow
-	for ( index = 0; index < length; index++ ) {
-		elem = elements[ index ];
-		if ( !elem.style ) {
-			continue;
-		}
-		if ( !show || elem.style.display === "none" || elem.style.display === "" ) {
-			elem.style.display = show ? values[ index ] || "" : "none";
-		}
-	}
-
-	return elements;
-}
-
-function setPositiveNumber( elem, value, subtract ) {
-	var matches = rnumsplit.exec( value );
-	return matches ?
-
-		// Guard against undefined "subtract", e.g., when used as in cssHooks
-		Math.max( 0, matches[ 1 ] - ( subtract || 0 ) ) + ( matches[ 2 ] || "px" ) :
-		value;
-}
-
-function augmentWidthOrHeight( elem, name, extra, isBorderBox, styles ) {
-	var i = extra === ( isBorderBox ? "border" : "content" ) ?
-
-		// If we already have the right measurement, avoid augmentation
-		4 :
-
-		// Otherwise initialize for horizontal or vertical properties
-		name === "width" ? 1 : 0,
-
-		val = 0;
-
-	for ( ; i < 4; i += 2 ) {
-
-		// both box models exclude margin, so add it if we want it
-		if ( extra === "margin" ) {
-			val += jQuery.css( elem, extra + cssExpand[ i ], true, styles );
-		}
-
-		if ( isBorderBox ) {
-
-			// border-box includes padding, so remove it if we want content
-			if ( extra === "content" ) {
-				val -= jQuery.css( elem, "padding" + cssExpand[ i ], true, styles );
-			}
-
-			// at this point, extra isn't border nor margin, so remove border
-			if ( extra !== "margin" ) {
-				val -= jQuery.css( elem, "border" + cssExpand[ i ] + "Width", true, styles );
-			}
-		} else {
-
-			// at this point, extra isn't content, so add padding
-			val += jQuery.css( elem, "padding" + cssExpand[ i ], true, styles );
-
-			// at this point, extra isn't content nor padding, so add border
-			if ( extra !== "padding" ) {
-				val += jQuery.css( elem, "border" + cssExpand[ i ] + "Width", true, styles );
-			}
-		}
-	}
-
-	return val;
-}
-
-function getWidthOrHeight( elem, name, extra ) {
-
-	// Start with offset property, which is equivalent to the border-box value
-	var valueIsBorderBox = true,
-		val = name === "width" ? elem.offsetWidth : elem.offsetHeight,
-		styles = getStyles( elem ),
-		isBorderBox = support.boxSizing &&
-			jQuery.css( elem, "boxSizing", false, styles ) === "border-box";
-
-	// some non-html elements return undefined for offsetWidth, so check for null/undefined
-	// svg - https://bugzilla.mozilla.org/show_bug.cgi?id=649285
-	// MathML - https://bugzilla.mozilla.org/show_bug.cgi?id=491668
-	if ( val <= 0 || val == null ) {
-
-		// Fall back to computed then uncomputed css if necessary
-		val = curCSS( elem, name, styles );
-		if ( val < 0 || val == null ) {
-			val = elem.style[ name ];
-		}
-
-		// Computed unit is not pixels. Stop here and return.
-		if ( rnumnonpx.test( val ) ) {
-			return val;
-		}
-
-		// we need the check for style in case a browser which returns unreliable values
-		// for getComputedStyle silently falls back to the reliable elem.style
-		valueIsBorderBox = isBorderBox &&
-			( support.boxSizingReliable() || val === elem.style[ name ] );
-
-		// Normalize "", auto, and prepare for extra
-		val = parseFloat( val ) || 0;
-	}
-
-	// use the active box-sizing model to add/subtract irrelevant styles
-	return ( val +
-		augmentWidthOrHeight(
-			elem,
-			name,
-			extra || ( isBorderBox ? "border" : "content" ),
-			valueIsBorderBox,
-			styles
-		)
-	) + "px";
-}
-
-jQuery.extend( {
-
-	// Add in style property hooks for overriding the default
-	// behavior of getting and setting a style property
-	cssHooks: {
-		opacity: {
-			get: function( elem, computed ) {
-				if ( computed ) {
-
-					// We should always get a number back from opacity
-					var ret = curCSS( elem, "opacity" );
-					return ret === "" ? "1" : ret;
-				}
-			}
-		}
-	},
-
-	// Don't automatically add "px" to these possibly-unitless properties
-	cssNumber: {
-		"animationIterationCount": true,
-		"columnCount": true,
-		"fillOpacity": true,
-		"flexGrow": true,
-		"flexShrink": true,
-		"fontWeight": true,
-		"lineHeight": true,
-		"opacity": true,
-		"order": true,
-		"orphans": true,
-		"widows": true,
-		"zIndex": true,
-		"zoom": true
-	},
-
-	// Add in properties whose names you wish to fix before
-	// setting or getting the value
-	cssProps: {
-
-		// normalize float css property
-		"float": support.cssFloat ? "cssFloat" : "styleFloat"
-	},
-
-	// Get and set the style property on a DOM Node
-	style: function( elem, name, value, extra ) {
-
-		// Don't set styles on text and comment nodes
-		if ( !elem || elem.nodeType === 3 || elem.nodeType === 8 || !elem.style ) {
-			return;
-		}
-
-		// Make sure that we're working with the right name
-		var ret, type, hooks,
-			origName = jQuery.camelCase( name ),
-			style = elem.style;
-
-		name = jQuery.cssProps[ origName ] ||
-			( jQuery.cssProps[ origName ] = vendorPropName( origName ) || origName );
-
-		// gets hook for the prefixed version
-		// followed by the unprefixed version
-		hooks = jQuery.cssHooks[ name ] || jQuery.cssHooks[ origName ];
-
-		// Check if we're setting a value
-		if ( value !== undefined ) {
-			type = typeof value;
-
-			// Convert "+=" or "-=" to relative numbers (#7345)
-			if ( type === "string" && ( ret = rcssNum.exec( value ) ) && ret[ 1 ] ) {
-				value = adjustCSS( elem, name, ret );
-
-				// Fixes bug #9237
-				type = "number";
-			}
-
-			// Make sure that null and NaN values aren't set. See: #7116
-			if ( value == null || value !== value ) {
-				return;
-			}
-
-			// If a number was passed in, add the unit (except for certain CSS properties)
-			if ( type === "number" ) {
-				value += ret && ret[ 3 ] || ( jQuery.cssNumber[ origName ] ? "" : "px" );
-			}
-
-			// Fixes #8908, it can be done more correctly by specifing setters in cssHooks,
-			// but it would mean to define eight
-			// (for every problematic property) identical functions
-			if ( !support.clearCloneStyle && value === "" && name.indexOf( "background" ) === 0 ) {
-				style[ name ] = "inherit";
-			}
-
-			// If a hook was provided, use that value, otherwise just set the specified value
-			if ( !hooks || !( "set" in hooks ) ||
-				( value = hooks.set( elem, value, extra ) ) !== undefined ) {
-
-				// Support: IE
-				// Swallow errors from 'invalid' CSS values (#5509)
-				try {
-					style[ name ] = value;
-				} catch ( e ) {}
-			}
-
-		} else {
-
-			// If a hook was provided get the non-computed value from there
-			if ( hooks && "get" in hooks &&
-				( ret = hooks.get( elem, false, extra ) ) !== undefined ) {
-
-				return ret;
-			}
-
-			// Otherwise just get the value from the style object
-			return style[ name ];
-		}
-	},
-
-	css: function( elem, name, extra, styles ) {
-		var num, val, hooks,
-			origName = jQuery.camelCase( name );
-
-		// Make sure that we're working with the right name
-		name = jQuery.cssProps[ origName ] ||
-			( jQuery.cssProps[ origName ] = vendorPropName( origName ) || origName );
-
-		// gets hook for the prefixed version
-		// followed by the unprefixed version
-		hooks = jQuery.cssHooks[ name ] || jQuery.cssHooks[ origName ];
-
-		// If a hook was provided get the computed value from there
-		if ( hooks && "get" in hooks ) {
-			val = hooks.get( elem, true, extra );
-		}
-
-		// Otherwise, if a way to get the computed value exists, use that
-		if ( val === undefined ) {
-			val = curCSS( elem, name, styles );
-		}
-
-		//convert "normal" to computed value
-		if ( val === "normal" && name in cssNormalTransform ) {
-			val = cssNormalTransform[ name ];
-		}
-
-		// Return, converting to number if forced or a qualifier was provided and val looks numeric
-		if ( extra === "" || extra ) {
-			num = parseFloat( val );
-			return extra === true || isFinite( num ) ? num || 0 : val;
-		}
-		return val;
-	}
-} );
-
-jQuery.each( [ "height", "width" ], function( i, name ) {
-	jQuery.cssHooks[ name ] = {
-		get: function( elem, computed, extra ) {
-			if ( computed ) {
-
-				// certain elements can have dimension info if we invisibly show them
-				// however, it must have a current display style that would benefit from this
-				return rdisplayswap.test( jQuery.css( elem, "display" ) ) &&
-					elem.offsetWidth === 0 ?
-						swap( elem, cssShow, function() {
-							return getWidthOrHeight( elem, name, extra );
-						} ) :
-						getWidthOrHeight( elem, name, extra );
-			}
-		},
-
-		set: function( elem, value, extra ) {
-			var styles = extra && getStyles( elem );
-			return setPositiveNumber( elem, value, extra ?
-				augmentWidthOrHeight(
-					elem,
-					name,
-					extra,
-					support.boxSizing &&
-						jQuery.css( elem, "boxSizing", false, styles ) === "border-box",
-					styles
-				) : 0
-			);
-		}
-	};
-} );
-
-if ( !support.opacity ) {
-	jQuery.cssHooks.opacity = {
-		get: function( elem, computed ) {
-
-			// IE uses filters for opacity
-			return ropacity.test( ( computed && elem.currentStyle ?
-				elem.currentStyle.filter :
-				elem.style.filter ) || "" ) ?
-					( 0.01 * parseFloat( RegExp.$1 ) ) + "" :
-					computed ? "1" : "";
-		},
-
-		set: function( elem, value ) {
-			var style = elem.style,
-				currentStyle = elem.currentStyle,
-				opacity = jQuery.isNumeric( value ) ? "alpha(opacity=" + value * 100 + ")" : "",
-				filter = currentStyle && currentStyle.filter || style.filter || "";
-
-			// IE has trouble with opacity if it does not have layout
-			// Force it by setting the zoom level
-			style.zoom = 1;
-
-			// if setting opacity to 1, and no other filters exist -
-			// attempt to remove filter attribute #6652
-			// if value === "", then remove inline opacity #12685
-			if ( ( value >= 1 || value === "" ) &&
-					jQuery.trim( filter.replace( ralpha, "" ) ) === "" &&
-					style.removeAttribute ) {
-
-				// Setting style.filter to null, "" & " " still leave "filter:" in the cssText
-				// if "filter:" is present at all, clearType is disabled, we want to avoid this
-				// style.removeAttribute is IE Only, but so apparently is this code path...
-				style.removeAttribute( "filter" );
-
-				// if there is no filter style applied in a css rule
-				// or unset inline opacity, we are done
-				if ( value === "" || currentStyle && !currentStyle.filter ) {
-					return;
-				}
-			}
-
-			// otherwise, set new filter values
-			style.filter = ralpha.test( filter ) ?
-				filter.replace( ralpha, opacity ) :
-				filter + " " + opacity;
-		}
-	};
-}
-
-jQuery.cssHooks.marginRight = addGetHookIf( support.reliableMarginRight,
-	function( elem, computed ) {
-		if ( computed ) {
-			return swap( elem, { "display": "inline-block" },
-				curCSS, [ elem, "marginRight" ] );
-		}
-	}
-);
-
-jQuery.cssHooks.marginLeft = addGetHookIf( support.reliableMarginLeft,
-	function( elem, computed ) {
-		if ( computed ) {
-			return (
-				parseFloat( curCSS( elem, "marginLeft" ) ) ||
-
-				// Support: IE<=11+
-				// Running getBoundingClientRect on a disconnected node in IE throws an error
-				// Support: IE8 only
-				// getClientRects() errors on disconnected elems
-				( jQuery.contains( elem.ownerDocument, elem ) ?
-					elem.getBoundingClientRect().left -
-						swap( elem, { marginLeft: 0 }, function() {
-							return elem.getBoundingClientRect().left;
-						} ) :
-					0
-				)
-			) + "px";
-		}
-	}
-);
-
-// These hooks are used by animate to expand properties
-jQuery.each( {
-	margin: "",
-	padding: "",
-	border: "Width"
-}, function( prefix, suffix ) {
-	jQuery.cssHooks[ prefix + suffix ] = {
-		expand: function( value ) {
-			var i = 0,
-				expanded = {},
-
-				// assumes a single number if not a string
-				parts = typeof value === "string" ? value.split( " " ) : [ value ];
-
-			for ( ; i < 4; i++ ) {
-				expanded[ prefix + cssExpand[ i ] + suffix ] =
-					parts[ i ] || parts[ i - 2 ] || parts[ 0 ];
-			}
-
-			return expanded;
-		}
-	};
-
-	if ( !rmargin.test( prefix ) ) {
-		jQuery.cssHooks[ prefix + suffix ].set = setPositiveNumber;
-	}
-} );
-
-jQuery.fn.extend( {
-	css: function( name, value ) {
-		return access( this, function( elem, name, value ) {
-			var styles, len,
-				map = {},
-				i = 0;
-
-			if ( jQuery.isArray( name ) ) {
-				styles = getStyles( elem );
-				len = name.length;
-
-				for ( ; i < len; i++ ) {
-					map[ name[ i ] ] = jQuery.css( elem, name[ i ], false, styles );
-				}
-
-				return map;
-			}
-
-			return value !== undefined ?
-				jQuery.style( elem, name, value ) :
-				jQuery.css( elem, name );
-		}, name, value, arguments.length > 1 );
-	},
-	show: function() {
-		return showHide( this, true );
-	},
-	hide: function() {
-		return showHide( this );
-	},
-	toggle: function( state ) {
-		if ( typeof state === "boolean" ) {
-			return state ? this.show() : this.hide();
-		}
-
-		return this.each( function() {
-			if ( isHidden( this ) ) {
-				jQuery( this ).show();
-			} else {
-				jQuery( this ).hide();
-			}
-		} );
-	}
-} );
-
-
-function Tween( elem, options, prop, end, easing ) {
-	return new Tween.prototype.init( elem, options, prop, end, easing );
-}
-jQuery.Tween = Tween;
-
-Tween.prototype = {
-	constructor: Tween,
-	init: function( elem, options, prop, end, easing, unit ) {
-		this.elem = elem;
-		this.prop = prop;
-		this.easing = easing || jQuery.easing._default;
-		this.options = options;
-		this.start = this.now = this.cur();
-		this.end = end;
-		this.unit = unit || ( jQuery.cssNumber[ prop ] ? "" : "px" );
-	},
-	cur: function() {
-		var hooks = Tween.propHooks[ this.prop ];
-
-		return hooks && hooks.get ?
-			hooks.get( this ) :
-			Tween.propHooks._default.get( this );
-	},
-	run: function( percent ) {
-		var eased,
-			hooks = Tween.propHooks[ this.prop ];
-
-		if ( this.options.duration ) {
-			this.pos = eased = jQuery.easing[ this.easing ](
-				percent, this.options.duration * percent, 0, 1, this.options.duration
-			);
-		} else {
-			this.pos = eased = percent;
-		}
-		this.now = ( this.end - this.start ) * eased + this.start;
-
-		if ( this.options.step ) {
-			this.options.step.call( this.elem, this.now, this );
-		}
-
-		if ( hooks && hooks.set ) {
-			hooks.set( this );
-		} else {
-			Tween.propHooks._default.set( this );
-		}
-		return this;
-	}
-};
-
-Tween.prototype.init.prototype = Tween.prototype;
-
-Tween.propHooks = {
-	_default: {
-		get: function( tween ) {
-			var result;
-
-			// Use a property on the element directly when it is not a DOM element,
-			// or when there is no matching style property that exists.
-			if ( tween.elem.nodeType !== 1 ||
-				tween.elem[ tween.prop ] != null && tween.elem.style[ tween.prop ] == null ) {
-				return tween.elem[ tween.prop ];
-			}
-
-			// passing an empty string as a 3rd parameter to .css will automatically
-			// attempt a parseFloat and fallback to a string if the parse fails
-			// so, simple values such as "10px" are parsed to Float.
-			// complex values such as "rotate(1rad)" are returned as is.
-			result = jQuery.css( tween.elem, tween.prop, "" );
-
-			// Empty strings, null, undefined and "auto" are converted to 0.
-			return !result || result === "auto" ? 0 : result;
-		},
-		set: function( tween ) {
-
-			// use step hook for back compat - use cssHook if its there - use .style if its
-			// available and use plain properties where available
-			if ( jQuery.fx.step[ tween.prop ] ) {
-				jQuery.fx.step[ tween.prop ]( tween );
-			} else if ( tween.elem.nodeType === 1 &&
-				( tween.elem.style[ jQuery.cssProps[ tween.prop ] ] != null ||
-					jQuery.cssHooks[ tween.prop ] ) ) {
-				jQuery.style( tween.elem, tween.prop, tween.now + tween.unit );
-			} else {
-				tween.elem[ tween.prop ] = tween.now;
-			}
-		}
-	}
-};
-
-// Support: IE <=9
-// Panic based approach to setting things on disconnected nodes
-
-Tween.propHooks.scrollTop = Tween.propHooks.scrollLeft = {
-	set: function( tween ) {
-		if ( tween.elem.nodeType && tween.elem.parentNode ) {
-			tween.elem[ tween.prop ] = tween.now;
-		}
-	}
-};
-
-jQuery.easing = {
-	linear: function( p ) {
-		return p;
-	},
-	swing: function( p ) {
-		return 0.5 - Math.cos( p * Math.PI ) / 2;
-	},
-	_default: "swing"
-};
-
-jQuery.fx = Tween.prototype.init;
-
-// Back Compat <1.8 extension point
-jQuery.fx.step = {};
-
-
-
-
-var
-	fxNow, timerId,
-	rfxtypes = /^(?:toggle|show|hide)$/,
-	rrun = /queueHooks$/;
-
-// Animations created synchronously will run synchronously
-function createFxNow() {
-	window.setTimeout( function() {
-		fxNow = undefined;
-	} );
-	return ( fxNow = jQuery.now() );
-}
-
-// Generate parameters to create a standard animation
-function genFx( type, includeWidth ) {
-	var which,
-		attrs = { height: type },
-		i = 0;
-
-	// if we include width, step value is 1 to do all cssExpand values,
-	// if we don't include width, step value is 2 to skip over Left and Right
-	includeWidth = includeWidth ? 1 : 0;
-	for ( ; i < 4 ; i += 2 - includeWidth ) {
-		which = cssExpand[ i ];
-		attrs[ "margin" + which ] = attrs[ "padding" + which ] = type;
-	}
-
-	if ( includeWidth ) {
-		attrs.opacity = attrs.width = type;
-	}
-
-	return attrs;
-}
-
-function createTween( value, prop, animation ) {
-	var tween,
-		collection = ( Animation.tweeners[ prop ] || [] ).concat( Animation.tweeners[ "*" ] ),
-		index = 0,
-		length = collection.length;
-	for ( ; index < length; index++ ) {
-		if ( ( tween = collection[ index ].call( animation, prop, value ) ) ) {
-
-			// we're done with this property
-			return tween;
-		}
-	}
-}
-
-function defaultPrefilter( elem, props, opts ) {
-	/* jshint validthis: true */
-	var prop, value, toggle, tween, hooks, oldfire, display, checkDisplay,
-		anim = this,
-		orig = {},
-		style = elem.style,
-		hidden = elem.nodeType && isHidden( elem ),
-		dataShow = jQuery._data( elem, "fxshow" );
-
-	// handle queue: false promises
-	if ( !opts.queue ) {
-		hooks = jQuery._queueHooks( elem, "fx" );
-		if ( hooks.unqueued == null ) {
-			hooks.unqueued = 0;
-			oldfire = hooks.empty.fire;
-			hooks.empty.fire = function() {
-				if ( !hooks.unqueued ) {
-					oldfire();
-				}
-			};
-		}
-		hooks.unqueued++;
-
-		anim.always( function() {
-
-			// doing this makes sure that the complete handler will be called
-			// before this completes
-			anim.always( function() {
-				hooks.unqueued--;
-				if ( !jQuery.queue( elem, "fx" ).length ) {
-					hooks.empty.fire();
-				}
-			} );
-		} );
-	}
-
-	// height/width overflow pass
-	if ( elem.nodeType === 1 && ( "height" in props || "width" in props ) ) {
-
-		// Make sure that nothing sneaks out
-		// Record all 3 overflow attributes because IE does not
-		// change the overflow attribute when overflowX and
-		// overflowY are set to the same value
-		opts.overflow = [ style.overflow, style.overflowX, style.overflowY ];
-
-		// Set display property to inline-block for height/width
-		// animations on inline elements that are having width/height animated
-		display = jQuery.css( elem, "display" );
-
-		// Test default display if display is currently "none"
-		checkDisplay = display === "none" ?
-			jQuery._data( elem, "olddisplay" ) || defaultDisplay( elem.nodeName ) : display;
-
-		if ( checkDisplay === "inline" && jQuery.css( elem, "float" ) === "none" ) {
-
-			// inline-level elements accept inline-block;
-			// block-level elements need to be inline with layout
-			if ( !support.inlineBlockNeedsLayout || defaultDisplay( elem.nodeName ) === "inline" ) {
-				style.display = "inline-block";
-			} else {
-				style.zoom = 1;
-			}
-		}
-	}
-
-	if ( opts.overflow ) {
-		style.overflow = "hidden";
-		if ( !support.shrinkWrapBlocks() ) {
-			anim.always( function() {
-				style.overflow = opts.overflow[ 0 ];
-				style.overflowX = opts.overflow[ 1 ];
-				style.overflowY = opts.overflow[ 2 ];
-			} );
-		}
-	}
-
-	// show/hide pass
-	for ( prop in props ) {
-		value = props[ prop ];
-		if ( rfxtypes.exec( value ) ) {
-			delete props[ prop ];
-			toggle = toggle || value === "toggle";
-			if ( value === ( hidden ? "hide" : "show" ) ) {
-
-				// If there is dataShow left over from a stopped hide or show
-				// and we are going to proceed with show, we should pretend to be hidden
-				if ( value === "show" && dataShow && dataShow[ prop ] !== undefined ) {
-					hidden = true;
-				} else {
-					continue;
-				}
-			}
-			orig[ prop ] = dataShow && dataShow[ prop ] || jQuery.style( elem, prop );
-
-		// Any non-fx value stops us from restoring the original display value
-		} else {
-			display = undefined;
-		}
-	}
-
-	if ( !jQuery.isEmptyObject( orig ) ) {
-		if ( dataShow ) {
-			if ( "hidden" in dataShow ) {
-				hidden = dataShow.hidden;
-			}
-		} else {
-			dataShow = jQuery._data( elem, "fxshow", {} );
-		}
-
-		// store state if its toggle - enables .stop().toggle() to "reverse"
-		if ( toggle ) {
-			dataShow.hidden = !hidden;
-		}
-		if ( hidden ) {
-			jQuery( elem ).show();
-		} else {
-			anim.done( function() {
-				jQuery( elem ).hide();
-			} );
-		}
-		anim.done( function() {
-			var prop;
-			jQuery._removeData( elem, "fxshow" );
-			for ( prop in orig ) {
-				jQuery.style( elem, prop, orig[ prop ] );
-			}
-		} );
-		for ( prop in orig ) {
-			tween = createTween( hidden ? dataShow[ prop ] : 0, prop, anim );
-
-			if ( !( prop in dataShow ) ) {
-				dataShow[ prop ] = tween.start;
-				if ( hidden ) {
-					tween.end = tween.start;
-					tween.start = prop === "width" || prop === "height" ? 1 : 0;
-				}
-			}
-		}
-
-	// If this is a noop like .hide().hide(), restore an overwritten display value
-	} else if ( ( display === "none" ? defaultDisplay( elem.nodeName ) : display ) === "inline" ) {
-		style.display = display;
-	}
-}
-
-function propFilter( props, specialEasing ) {
-	var index, name, easing, value, hooks;
-
-	// camelCase, specialEasing and expand cssHook pass
-	for ( index in props ) {
-		name = jQuery.camelCase( index );
-		easing = specialEasing[ name ];
-		value = props[ index ];
-		if ( jQuery.isArray( value ) ) {
-			easing = value[ 1 ];
-			value = props[ index ] = value[ 0 ];
-		}
-
-		if ( index !== name ) {
-			props[ name ] = value;
-			delete props[ index ];
-		}
-
-		hooks = jQuery.cssHooks[ name ];
-		if ( hooks && "expand" in hooks ) {
-			value = hooks.expand( value );
-			delete props[ name ];
-
-			// not quite $.extend, this wont overwrite keys already present.
-			// also - reusing 'index' from above because we have the correct "name"
-			for ( index in value ) {
-				if ( !( index in props ) ) {
-					props[ index ] = value[ index ];
-					specialEasing[ index ] = easing;
-				}
-			}
-		} else {
-			specialEasing[ name ] = easing;
-		}
-	}
-}
-
-function Animation( elem, properties, options ) {
-	var result,
-		stopped,
-		index = 0,
-		length = Animation.prefilters.length,
-		deferred = jQuery.Deferred().always( function() {
-
-			// don't match elem in the :animated selector
-			delete tick.elem;
-		} ),
-		tick = function() {
-			if ( stopped ) {
-				return false;
-			}
-			var currentTime = fxNow || createFxNow(),
-				remaining = Math.max( 0, animation.startTime + animation.duration - currentTime ),
-
-				// Support: Android 2.3
-				// Archaic crash bug won't allow us to use `1 - ( 0.5 || 0 )` (#12497)
-				temp = remaining / animation.duration || 0,
-				percent = 1 - temp,
-				index = 0,
-				length = animation.tweens.length;
-
-			for ( ; index < length ; index++ ) {
-				animation.tweens[ index ].run( percent );
-			}
-
-			deferred.notifyWith( elem, [ animation, percent, remaining ] );
-
-			if ( percent < 1 && length ) {
-				return remaining;
-			} else {
-				deferred.resolveWith( elem, [ animation ] );
-				return false;
-			}
-		},
-		animation = deferred.promise( {
-			elem: elem,
-			props: jQuery.extend( {}, properties ),
-			opts: jQuery.extend( true, {
-				specialEasing: {},
-				easing: jQuery.easing._default
-			}, options ),
-			originalProperties: properties,
-			originalOptions: options,
-			startTime: fxNow || createFxNow(),
-			duration: options.duration,
-			tweens: [],
-			createTween: function( prop, end ) {
-				var tween = jQuery.Tween( elem, animation.opts, prop, end,
-						animation.opts.specialEasing[ prop ] || animation.opts.easing );
-				animation.tweens.push( tween );
-				return tween;
-			},
-			stop: function( gotoEnd ) {
-				var index = 0,
-
-					// if we are going to the end, we want to run all the tweens
-					// otherwise we skip this part
-					length = gotoEnd ? animation.tweens.length : 0;
-				if ( stopped ) {
-					return this;
-				}
-				stopped = true;
-				for ( ; index < length ; index++ ) {
-					animation.tweens[ index ].run( 1 );
-				}
-
-				// resolve when we played the last frame
-				// otherwise, reject
-				if ( gotoEnd ) {
-					deferred.notifyWith( elem, [ animation, 1, 0 ] );
-					deferred.resolveWith( elem, [ animation, gotoEnd ] );
-				} else {
-					deferred.rejectWith( elem, [ animation, gotoEnd ] );
-				}
-				return this;
-			}
-		} ),
-		props = animation.props;
-
-	propFilter( props, animation.opts.specialEasing );
-
-	for ( ; index < length ; index++ ) {
-		result = Animation.prefilters[ index ].call( animation, elem, props, animation.opts );
-		if ( result ) {
-			if ( jQuery.isFunction( result.stop ) ) {
-				jQuery._queueHooks( animation.elem, animation.opts.queue ).stop =
-					jQuery.proxy( result.stop, result );
-			}
-			return result;
-		}
-	}
-
-	jQuery.map( props, createTween, animation );
-
-	if ( jQuery.isFunction( animation.opts.start ) ) {
-		animation.opts.start.call( elem, animation );
-	}
-
-	jQuery.fx.timer(
-		jQuery.extend( tick, {
-			elem: elem,
-			anim: animation,
-			queue: animation.opts.queue
-		} )
-	);
-
-	// attach callbacks from options
-	return animation.progress( animation.opts.progress )
-		.done( animation.opts.done, animation.opts.complete )
-		.fail( animation.opts.fail )
-		.always( animation.opts.always );
-}
-
-jQuery.Animation = jQuery.extend( Animation, {
-
-	tweeners: {
-		"*": [ function( prop, value ) {
-			var tween = this.createTween( prop, value );
-			adjustCSS( tween.elem, prop, rcssNum.exec( value ), tween );
-			return tween;
-		} ]
-	},
-
-	tweener: function( props, callback ) {
-		if ( jQuery.isFunction( props ) ) {
-			callback = props;
-			props = [ "*" ];
-		} else {
-			props = props.match( rnotwhite );
-		}
-
-		var prop,
-			index = 0,
-			length = props.length;
-
-		for ( ; index < length ; index++ ) {
-			prop = props[ index ];
-			Animation.tweeners[ prop ] = Animation.tweeners[ prop ] || [];
-			Animation.tweeners[ prop ].unshift( callback );
-		}
-	},
-
-	prefilters: [ defaultPrefilter ],
-
-	prefilter: function( callback, prepend ) {
-		if ( prepend ) {
-			Animation.prefilters.unshift( callback );
-		} else {
-			Animation.prefilters.push( callback );
-		}
-	}
-} );
-
-jQuery.speed = function( speed, easing, fn ) {
-	var opt = speed && typeof speed === "object" ? jQuery.extend( {}, speed ) : {
-		complete: fn || !fn && easing ||
-			jQuery.isFunction( speed ) && speed,
-		duration: speed,
-		easing: fn && easing || easing && !jQuery.isFunction( easing ) && easing
-	};
-
-	opt.duration = jQuery.fx.off ? 0 : typeof opt.duration === "number" ? opt.duration :
-		opt.duration in jQuery.fx.speeds ?
-			jQuery.fx.speeds[ opt.duration ] : jQuery.fx.speeds._default;
-
-	// normalize opt.queue - true/undefined/null -> "fx"
-	if ( opt.queue == null || opt.queue === true ) {
-		opt.queue = "fx";
-	}
-
-	// Queueing
-	opt.old = opt.complete;
-
-	opt.complete = function() {
-		if ( jQuery.isFunction( opt.old ) ) {
-			opt.old.call( this );
-		}
-
-		if ( opt.queue ) {
-			jQuery.dequeue( this, opt.queue );
-		}
-	};
-
-	return opt;
-};
-
-jQuery.fn.extend( {
-	fadeTo: function( speed, to, easing, callback ) {
-
-		// show any hidden elements after setting opacity to 0
-		return this.filter( isHidden ).css( "opacity", 0 ).show()
-
-			// animate to the value specified
-			.end().animate( { opacity: to }, speed, easing, callback );
-	},
-	animate: function( prop, speed, easing, callback ) {
-		var empty = jQuery.isEmptyObject( prop ),
-			optall = jQuery.speed( speed, easing, callback ),
-			doAnimation = function() {
-
-				// Operate on a copy of prop so per-property easing won't be lost
-				var anim = Animation( this, jQuery.extend( {}, prop ), optall );
-
-				// Empty animations, or finishing resolves immediately
-				if ( empty || jQuery._data( this, "finish" ) ) {
-					anim.stop( true );
-				}
-			};
-			doAnimation.finish = doAnimation;
-
-		return empty || optall.queue === false ?
-			this.each( doAnimation ) :
-			this.queue( optall.queue, doAnimation );
-	},
-	stop: function( type, clearQueue, gotoEnd ) {
-		var stopQueue = function( hooks ) {
-			var stop = hooks.stop;
-			delete hooks.stop;
-			stop( gotoEnd );
-		};
-
-		if ( typeof type !== "string" ) {
-			gotoEnd = clearQueue;
-			clearQueue = type;
-			type = undefined;
-		}
-		if ( clearQueue && type !== false ) {
-			this.queue( type || "fx", [] );
-		}
-
-		return this.each( function() {
-			var dequeue = true,
-				index = type != null && type + "queueHooks",
-				timers = jQuery.timers,
-				data = jQuery._data( this );
-
-			if ( index ) {
-				if ( data[ index ] && data[ index ].stop ) {
-					stopQueue( data[ index ] );
-				}
-			} else {
-				for ( index in data ) {
-					if ( data[ index ] && data[ index ].stop && rrun.test( index ) ) {
-						stopQueue( data[ index ] );
-					}
-				}
-			}
-
-			for ( index = timers.length; index--; ) {
-				if ( timers[ index ].elem === this &&
-					( type == null || timers[ index ].queue === type ) ) {
-
-					timers[ index ].anim.stop( gotoEnd );
-					dequeue = false;
-					timers.splice( index, 1 );
-				}
-			}
-
-			// start the next in the queue if the last step wasn't forced
-			// timers currently will call their complete callbacks, which will dequeue
-			// but only if they were gotoEnd
-			if ( dequeue || !gotoEnd ) {
-				jQuery.dequeue( this, type );
-			}
-		} );
-	},
-	finish: function( type ) {
-		if ( type !== false ) {
-			type = type || "fx";
-		}
-		return this.each( function() {
-			var index,
-				data = jQuery._data( this ),
-				queue = data[ type + "queue" ],
-				hooks = data[ type + "queueHooks" ],
-				timers = jQuery.timers,
-				length = queue ? queue.length : 0;
-
-			// enable finishing flag on private data
-			data.finish = true;
-
-			// empty the queue first
-			jQuery.queue( this, type, [] );
-
-			if ( hooks && hooks.stop ) {
-				hooks.stop.call( this, true );
-			}
-
-			// look for any active animations, and finish them
-			for ( index = timers.length; index--; ) {
-				if ( timers[ index ].elem === this && timers[ index ].queue === type ) {
-					timers[ index ].anim.stop( true );
-					timers.splice( index, 1 );
-				}
-			}
-
-			// look for any animations in the old queue and finish them
-			for ( index = 0; index < length; index++ ) {
-				if ( queue[ index ] && queue[ index ].finish ) {
-					queue[ index ].finish.call( this );
-				}
-			}
-
-			// turn off finishing flag
-			delete data.finish;
-		} );
-	}
-} );
-
-jQuery.each( [ "toggle", "show", "hide" ], function( i, name ) {
-	var cssFn = jQuery.fn[ name ];
-	jQuery.fn[ name ] = function( speed, easing, callback ) {
-		return speed == null || typeof speed === "boolean" ?
-			cssFn.apply( this, arguments ) :
-			this.animate( genFx( name, true ), speed, easing, callback );
-	};
-} );
-
-// Generate shortcuts for custom animations
-jQuery.each( {
-	slideDown: genFx( "show" ),
-	slideUp: genFx( "hide" ),
-	slideToggle: genFx( "toggle" ),
-	fadeIn: { opacity: "show" },
-	fadeOut: { opacity: "hide" },
-	fadeToggle: { opacity: "toggle" }
-}, function( name, props ) {
-	jQuery.fn[ name ] = function( speed, easing, callback ) {
-		return this.animate( props, speed, easing, callback );
-	};
-} );
-
-jQuery.timers = [];
-jQuery.fx.tick = function() {
-	var timer,
-		timers = jQuery.timers,
-		i = 0;
-
-	fxNow = jQuery.now();
-
-	for ( ; i < timers.length; i++ ) {
-		timer = timers[ i ];
-
-		// Checks the timer has not already been removed
-		if ( !timer() && timers[ i ] === timer ) {
-			timers.splice( i--, 1 );
-		}
-	}
-
-	if ( !timers.length ) {
-		jQuery.fx.stop();
-	}
-	fxNow = undefined;
-};
-
-jQuery.fx.timer = function( timer ) {
-	jQuery.timers.push( timer );
-	if ( timer() ) {
-		jQuery.fx.start();
-	} else {
-		jQuery.timers.pop();
-	}
-};
-
-jQuery.fx.interval = 13;
-
-jQuery.fx.start = function() {
-	if ( !timerId ) {
-		timerId = window.setInterval( jQuery.fx.tick, jQuery.fx.interval );
-	}
-};
-
-jQuery.fx.stop = function() {
-	window.clearInterval( timerId );
-	timerId = null;
-};
-
-jQuery.fx.speeds = {
-	slow: 600,
-	fast: 200,
-
-	// Default speed
-	_default: 400
-};
-
-
-// Based off of the plugin by Clint Helfers, with permission.
-// http://web.archive.org/web/20100324014747/http://blindsignals.com/index.php/2009/07/jquery-delay/
-jQuery.fn.delay = function( time, type ) {
-	time = jQuery.fx ? jQuery.fx.speeds[ time ] || time : time;
-	type = type || "fx";
-
-	return this.queue( type, function( next, hooks ) {
-		var timeout = window.setTimeout( next, time );
-		hooks.stop = function() {
-			window.clearTimeout( timeout );
-		};
-	} );
-};
-
-
-( function() {
-	var a,
-		input = document.createElement( "input" ),
-		div = document.createElement( "div" ),
-		select = document.createElement( "select" ),
-		opt = select.appendChild( document.createElement( "option" ) );
-
-	// Setup
-	div = document.createElement( "div" );
-	div.setAttribute( "className", "t" );
-	div.innerHTML = "  <link/><table></table><a href='/a'>a</a><input type='checkbox'/>";
-	a = div.getElementsByTagName( "a" )[ 0 ];
-
-	// Support: Windows Web Apps (WWA)
-	// `type` must use .setAttribute for WWA (#14901)
-	input.setAttribute( "type", "checkbox" );
-	div.appendChild( input );
-
-	a = div.getElementsByTagName( "a" )[ 0 ];
-
-	// First batch of tests.
-	a.style.cssText = "top:1px";
-
-	// Test setAttribute on camelCase class.
-	// If it works, we need attrFixes when doing get/setAttribute (ie6/7)
-	support.getSetAttribute = div.className !== "t";
-
-	// Get the style information from getAttribute
-	// (IE uses .cssText instead)
-	support.style = /top/.test( a.getAttribute( "style" ) );
-
-	// Make sure that URLs aren't manipulated
-	// (IE normalizes it by default)
-	support.hrefNormalized = a.getAttribute( "href" ) === "/a";
-
-	// Check the default checkbox/radio value ("" on WebKit; "on" elsewhere)
-	support.checkOn = !!input.value;
-
-	// Make sure that a selected-by-default option has a working selected property.
-	// (WebKit defaults to false instead of true, IE too, if it's in an optgroup)
-	support.optSelected = opt.selected;
-
-	// Tests for enctype support on a form (#6743)
-	support.enctype = !!document.createElement( "form" ).enctype;
-
-	// Make sure that the options inside disabled selects aren't marked as disabled
-	// (WebKit marks them as disabled)
-	select.disabled = true;
-	support.optDisabled = !opt.disabled;
-
-	// Support: IE8 only
-	// Check if we can trust getAttribute("value")
-	input = document.createElement( "input" );
-	input.setAttribute( "value", "" );
-	support.input = input.getAttribute( "value" ) === "";
-
-	// Check if an input maintains its value after becoming a radio
-	input.value = "t";
-	input.setAttribute( "type", "radio" );
-	support.radioValue = input.value === "t";
-} )();
-
-
-var rreturn = /\r/g,
-	rspaces = /[\x20\t\r\n\f]+/g;
-
-jQuery.fn.extend( {
-	val: function( value ) {
-		var hooks, ret, isFunction,
-			elem = this[ 0 ];
-
-		if ( !arguments.length ) {
-			if ( elem ) {
-				hooks = jQuery.valHooks[ elem.type ] ||
-					jQuery.valHooks[ elem.nodeName.toLowerCase() ];
-
-				if (
-					hooks &&
-					"get" in hooks &&
-					( ret = hooks.get( elem, "value" ) ) !== undefined
-				) {
-					return ret;
-				}
-
-				ret = elem.value;
-
-				return typeof ret === "string" ?
-
-					// handle most common string cases
-					ret.replace( rreturn, "" ) :
-
-					// handle cases where value is null/undef or number
-					ret == null ? "" : ret;
-			}
-
-			return;
-		}
-
-		isFunction = jQuery.isFunction( value );
-
-		return this.each( function( i ) {
-			var val;
-
-			if ( this.nodeType !== 1 ) {
-				return;
-			}
-
-			if ( isFunction ) {
-				val = value.call( this, i, jQuery( this ).val() );
-			} else {
-				val = value;
-			}
-
-			// Treat null/undefined as ""; convert numbers to string
-			if ( val == null ) {
-				val = "";
-			} else if ( typeof val === "number" ) {
-				val += "";
-			} else if ( jQuery.isArray( val ) ) {
-				val = jQuery.map( val, function( value ) {
-					return value == null ? "" : value + "";
-				} );
-			}
-
-			hooks = jQuery.valHooks[ this.type ] || jQuery.valHooks[ this.nodeName.toLowerCase() ];
-
-			// If set returns undefined, fall back to normal setting
-			if ( !hooks || !( "set" in hooks ) || hooks.set( this, val, "value" ) === undefined ) {
-				this.value = val;
-			}
-		} );
-	}
-} );
-
-jQuery.extend( {
-	valHooks: {
-		option: {
-			get: function( elem ) {
-				var val = jQuery.find.attr( elem, "value" );
-				return val != null ?
-					val :
-
-					// Support: IE10-11+
-					// option.text throws exceptions (#14686, #14858)
-					// Strip and collapse whitespace
-					// https://html.spec.whatwg.org/#strip-and-collapse-whitespace
-					jQuery.trim( jQuery.text( elem ) ).replace( rspaces, " " );
-			}
-		},
-		select: {
-			get: function( elem ) {
-				var value, option,
-					options = elem.options,
-					index = elem.selectedIndex,
-					one = elem.type === "select-one" || index < 0,
-					values = one ? null : [],
-					max = one ? index + 1 : options.length,
-					i = index < 0 ?
-						max :
-						one ? index : 0;
-
-				// Loop through all the selected options
-				for ( ; i < max; i++ ) {
-					option = options[ i ];
-
-					// oldIE doesn't update selected after form reset (#2551)
-					if ( ( option.selected || i === index ) &&
-
-							// Don't return options that are disabled or in a disabled optgroup
-							( support.optDisabled ?
-								!option.disabled :
-								option.getAttribute( "disabled" ) === null ) &&
-							( !option.parentNode.disabled ||
-								!jQuery.nodeName( option.parentNode, "optgroup" ) ) ) {
-
-						// Get the specific value for the option
-						value = jQuery( option ).val();
-
-						// We don't need an array for one selects
-						if ( one ) {
-							return value;
-						}
-
-						// Multi-Selects return an array
-						values.push( value );
-					}
-				}
-
-				return values;
-			},
-
-			set: function( elem, value ) {
-				var optionSet, option,
-					options = elem.options,
-					values = jQuery.makeArray( value ),
-					i = options.length;
-
-				while ( i-- ) {
-					option = options[ i ];
-
-					if ( jQuery.inArray( jQuery.valHooks.option.get( option ), values ) > -1 ) {
-
-						// Support: IE6
-						// When new option element is added to select box we need to
-						// force reflow of newly added node in order to workaround delay
-						// of initialization properties
-						try {
-							option.selected = optionSet = true;
-
-						} catch ( _ ) {
-
-							// Will be executed only in IE6
-							option.scrollHeight;
-						}
-
-					} else {
-						option.selected = false;
-					}
-				}
-
-				// Force browsers to behave consistently when non-matching value is set
-				if ( !optionSet ) {
-					elem.selectedIndex = -1;
-				}
-
-				return options;
-			}
-		}
-	}
-} );
-
-// Radios and checkboxes getter/setter
-jQuery.each( [ "radio", "checkbox" ], function() {
-	jQuery.valHooks[ this ] = {
-		set: function( elem, value ) {
-			if ( jQuery.isArray( value ) ) {
-				return ( elem.checked = jQuery.inArray( jQuery( elem ).val(), value ) > -1 );
-			}
-		}
-	};
-	if ( !support.checkOn ) {
-		jQuery.valHooks[ this ].get = function( elem ) {
-			return elem.getAttribute( "value" ) === null ? "on" : elem.value;
-		};
-	}
-} );
-
-
-
-
-var nodeHook, boolHook,
-	attrHandle = jQuery.expr.attrHandle,
-	ruseDefault = /^(?:checked|selected)$/i,
-	getSetAttribute = support.getSetAttribute,
-	getSetInput = support.input;
-
-jQuery.fn.extend( {
-	attr: function( name, value ) {
-		return access( this, jQuery.attr, name, value, arguments.length > 1 );
-	},
-
-	removeAttr: function( name ) {
-		return this.each( function() {
-			jQuery.removeAttr( this, name );
-		} );
-	}
-} );
-
-jQuery.extend( {
-	attr: function( elem, name, value ) {
-		var ret, hooks,
-			nType = elem.nodeType;
-
-		// Don't get/set attributes on text, comment and attribute nodes
-		if ( nType === 3 || nType === 8 || nType === 2 ) {
-			return;
-		}
-
-		// Fallback to prop when attributes are not supported
-		if ( typeof elem.getAttribute === "undefined" ) {
-			return jQuery.prop( elem, name, value );
-		}
-
-		// All attributes are lowercase
-		// Grab necessary hook if one is defined
-		if ( nType !== 1 || !jQuery.isXMLDoc( elem ) ) {
-			name = name.toLowerCase();
-			hooks = jQuery.attrHooks[ name ] ||
-				( jQuery.expr.match.bool.test( name ) ? boolHook : nodeHook );
-		}
-
-		if ( value !== undefined ) {
-			if ( value === null ) {
-				jQuery.removeAttr( elem, name );
-				return;
-			}
-
-			if ( hooks && "set" in hooks &&
-				( ret = hooks.set( elem, value, name ) ) !== undefined ) {
-				return ret;
-			}
-
-			elem.setAttribute( name, value + "" );
-			return value;
-		}
-
-		if ( hooks && "get" in hooks && ( ret = hooks.get( elem, name ) ) !== null ) {
-			return ret;
-		}
-
-		ret = jQuery.find.attr( elem, name );
-
-		// Non-existent attributes return null, we normalize to undefined
-		return ret == null ? undefined : ret;
-	},
-
-	attrHooks: {
-		type: {
-			set: function( elem, value ) {
-				if ( !support.radioValue && value === "radio" &&
-					jQuery.nodeName( elem, "input" ) ) {
-
-					// Setting the type on a radio button after the value resets the value in IE8-9
-					// Reset value to default in case type is set after value during creation
-					var val = elem.value;
-					elem.setAttribute( "type", value );
-					if ( val ) {
-						elem.value = val;
-					}
-					return value;
-				}
-			}
-		}
-	},
-
-	removeAttr: function( elem, value ) {
-		var name, propName,
-			i = 0,
-			attrNames = value && value.match( rnotwhite );
-
-		if ( attrNames && elem.nodeType === 1 ) {
-			while ( ( name = attrNames[ i++ ] ) ) {
-				propName = jQuery.propFix[ name ] || name;
-
-				// Boolean attributes get special treatment (#10870)
-				if ( jQuery.expr.match.bool.test( name ) ) {
-
-					// Set corresponding property to false
-					if ( getSetInput && getSetAttribute || !ruseDefault.test( name ) ) {
-						elem[ propName ] = false;
-
-					// Support: IE<9
-					// Also clear defaultChecked/defaultSelected (if appropriate)
-					} else {
-						elem[ jQuery.camelCase( "default-" + name ) ] =
-							elem[ propName ] = false;
-					}
-
-				// See #9699 for explanation of this approach (setting first, then removal)
-				} else {
-					jQuery.attr( elem, name, "" );
-				}
-
-				elem.removeAttribute( getSetAttribute ? name : propName );
-			}
-		}
-	}
-} );
-
-// Hooks for boolean attributes
-boolHook = {
-	set: function( elem, value, name ) {
-		if ( value === false ) {
-
-			// Remove boolean attributes when set to false
-			jQuery.removeAttr( elem, name );
-		} else if ( getSetInput && getSetAttribute || !ruseDefault.test( name ) ) {
-
-			// IE<8 needs the *property* name
-			elem.setAttribute( !getSetAttribute && jQuery.propFix[ name ] || name, name );
-
-		} else {
-
-			// Support: IE<9
-			// Use defaultChecked and defaultSelected for oldIE
-			elem[ jQuery.camelCase( "default-" + name ) ] = elem[ name ] = true;
-		}
-		return name;
-	}
-};
-
-jQuery.each( jQuery.expr.match.bool.source.match( /\w+/g ), function( i, name ) {
-	var getter = attrHandle[ name ] || jQuery.find.attr;
-
-	if ( getSetInput && getSetAttribute || !ruseDefault.test( name ) ) {
-		attrHandle[ name ] = function( elem, name, isXML ) {
-			var ret, handle;
-			if ( !isXML ) {
-
-				// Avoid an infinite loop by temporarily removing this function from the getter
-				handle = attrHandle[ name ];
-				attrHandle[ name ] = ret;
-				ret = getter( elem, name, isXML ) != null ?
-					name.toLowerCase() :
-					null;
-				attrHandle[ name ] = handle;
-			}
-			return ret;
-		};
-	} else {
-		attrHandle[ name ] = function( elem, name, isXML ) {
-			if ( !isXML ) {
-				return elem[ jQuery.camelCase( "default-" + name ) ] ?
-					name.toLowerCase() :
-					null;
-			}
-		};
-	}
-} );
-
-// fix oldIE attroperties
-if ( !getSetInput || !getSetAttribute ) {
-	jQuery.attrHooks.value = {
-		set: function( elem, value, name ) {
-			if ( jQuery.nodeName( elem, "input" ) ) {
-
-				// Does not return so that setAttribute is also used
-				elem.defaultValue = value;
-			} else {
-
-				// Use nodeHook if defined (#1954); otherwise setAttribute is fine
-				return nodeHook && nodeHook.set( elem, value, name );
-			}
-		}
-	};
-}
-
-// IE6/7 do not support getting/setting some attributes with get/setAttribute
-if ( !getSetAttribute ) {
-
-	// Use this for any attribute in IE6/7
-	// This fixes almost every IE6/7 issue
-	nodeHook = {
-		set: function( elem, value, name ) {
-
-			// Set the existing or create a new attribute node
-			var ret = elem.getAttributeNode( name );
-			if ( !ret ) {
-				elem.setAttributeNode(
-					( ret = elem.ownerDocument.createAttribute( name ) )
-				);
-			}
-
-			ret.value = value += "";
-
-			// Break association with cloned elements by also using setAttribute (#9646)
-			if ( name === "value" || value === elem.getAttribute( name ) ) {
-				return value;
-			}
-		}
-	};
-
-	// Some attributes are constructed with empty-string values when not defined
-	attrHandle.id = attrHandle.name = attrHandle.coords =
-		function( elem, name, isXML ) {
-			var ret;
-			if ( !isXML ) {
-				return ( ret = elem.getAttributeNode( name ) ) && ret.value !== "" ?
-					ret.value :
-					null;
-			}
-		};
-
-	// Fixing value retrieval on a button requires this module
-	jQuery.valHooks.button = {
-		get: function( elem, name ) {
-			var ret = elem.getAttributeNode( name );
-			if ( ret && ret.specified ) {
-				return ret.value;
-			}
-		},
-		set: nodeHook.set
-	};
-
-	// Set contenteditable to false on removals(#10429)
-	// Setting to empty string throws an error as an invalid value
-	jQuery.attrHooks.contenteditable = {
-		set: function( elem, value, name ) {
-			nodeHook.set( elem, value === "" ? false : value, name );
-		}
-	};
-
-	// Set width and height to auto instead of 0 on empty string( Bug #8150 )
-	// This is for removals
-	jQuery.each( [ "width", "height" ], function( i, name ) {
-		jQuery.attrHooks[ name ] = {
-			set: function( elem, value ) {
-				if ( value === "" ) {
-					elem.setAttribute( name, "auto" );
-					return value;
-				}
-			}
-		};
-	} );
-}
-
-if ( !support.style ) {
-	jQuery.attrHooks.style = {
-		get: function( elem ) {
-
-			// Return undefined in the case of empty string
-			// Note: IE uppercases css property names, but if we were to .toLowerCase()
-			// .cssText, that would destroy case sensitivity in URL's, like in "background"
-			return elem.style.cssText || undefined;
-		},
-		set: function( elem, value ) {
-			return ( elem.style.cssText = value + "" );
-		}
-	};
-}
-
-
-
-
-var rfocusable = /^(?:input|select|textarea|button|object)$/i,
-	rclickable = /^(?:a|area)$/i;
-
-jQuery.fn.extend( {
-	prop: function( name, value ) {
-		return access( this, jQuery.prop, name, value, arguments.length > 1 );
-	},
-
-	removeProp: function( name ) {
-		name = jQuery.propFix[ name ] || name;
-		return this.each( function() {
-
-			// try/catch handles cases where IE balks (such as removing a property on window)
-			try {
-				this[ name ] = undefined;
-				delete this[ name ];
-			} catch ( e ) {}
-		} );
-	}
-} );
-
-jQuery.extend( {
-	prop: function( elem, name, value ) {
-		var ret, hooks,
-			nType = elem.nodeType;
-
-		// Don't get/set properties on text, comment and attribute nodes
-		if ( nType === 3 || nType === 8 || nType === 2 ) {
-			return;
-		}
-
-		if ( nType !== 1 || !jQuery.isXMLDoc( elem ) ) {
-
-			// Fix name and attach hooks
-			name = jQuery.propFix[ name ] || name;
-			hooks = jQuery.propHooks[ name ];
-		}
-
-		if ( value !== undefined ) {
-			if ( hooks && "set" in hooks &&
-				( ret = hooks.set( elem, value, name ) ) !== undefined ) {
-				return ret;
-			}
-
-			return ( elem[ name ] = value );
-		}
-
-		if ( hooks && "get" in hooks && ( ret = hooks.get( elem, name ) ) !== null ) {
-			return ret;
-		}
-
-		return elem[ name ];
-	},
-
-	propHooks: {
-		tabIndex: {
-			get: function( elem ) {
-
-				// elem.tabIndex doesn't always return the
-				// correct value when it hasn't been explicitly set
-				// http://fluidproject.org/blog/2008/01/09/getting-setting-and-removing-tabindex-values-with-javascript/
-				// Use proper attribute retrieval(#12072)
-				var tabindex = jQuery.find.attr( elem, "tabindex" );
-
-				return tabindex ?
-					parseInt( tabindex, 10 ) :
-					rfocusable.test( elem.nodeName ) ||
-						rclickable.test( elem.nodeName ) && elem.href ?
-							0 :
-							-1;
-			}
-		}
-	},
-
-	propFix: {
-		"for": "htmlFor",
-		"class": "className"
-	}
-} );
-
-// Some attributes require a special call on IE
-// http://msdn.microsoft.com/en-us/library/ms536429%28VS.85%29.aspx
-if ( !support.hrefNormalized ) {
-
-	// href/src property should get the full normalized URL (#10299/#12915)
-	jQuery.each( [ "href", "src" ], function( i, name ) {
-		jQuery.propHooks[ name ] = {
-			get: function( elem ) {
-				return elem.getAttribute( name, 4 );
-			}
-		};
-	} );
-}
-
-// Support: Safari, IE9+
-// Accessing the selectedIndex property
-// forces the browser to respect setting selected
-// on the option
-// The getter ensures a default option is selected
-// when in an optgroup
-if ( !support.optSelected ) {
-	jQuery.propHooks.selected = {
-		get: function( elem ) {
-			var parent = elem.parentNode;
-
-			if ( parent ) {
-				parent.selectedIndex;
-
-				// Make sure that it also works with optgroups, see #5701
-				if ( parent.parentNode ) {
-					parent.parentNode.selectedIndex;
-				}
-			}
-			return null;
-		},
-		set: function( elem ) {
-			var parent = elem.parentNode;
-			if ( parent ) {
-				parent.selectedIndex;
-
-				if ( parent.parentNode ) {
-					parent.parentNode.selectedIndex;
-				}
-			}
-		}
-	};
-}
-
-jQuery.each( [
-	"tabIndex",
-	"readOnly",
-	"maxLength",
-	"cellSpacing",
-	"cellPadding",
-	"rowSpan",
-	"colSpan",
-	"useMap",
-	"frameBorder",
-	"contentEditable"
-], function() {
-	jQuery.propFix[ this.toLowerCase() ] = this;
-} );
-
-// IE6/7 call enctype encoding
-if ( !support.enctype ) {
-	jQuery.propFix.enctype = "encoding";
-}
-
-
-
-
-var rclass = /[\t\r\n\f]/g;
-
-function getClass( elem ) {
-	return jQuery.attr( elem, "class" ) || "";
-}
-
-jQuery.fn.extend( {
-	addClass: function( value ) {
-		var classes, elem, cur, curValue, clazz, j, finalValue,
-			i = 0;
-
-		if ( jQuery.isFunction( value ) ) {
-			return this.each( function( j ) {
-				jQuery( this ).addClass( value.call( this, j, getClass( this ) ) );
-			} );
-		}
-
-		if ( typeof value === "string" && value ) {
-			classes = value.match( rnotwhite ) || [];
-
-			while ( ( elem = this[ i++ ] ) ) {
-				curValue = getClass( elem );
-				cur = elem.nodeType === 1 &&
-					( " " + curValue + " " ).replace( rclass, " " );
-
-				if ( cur ) {
-					j = 0;
-					while ( ( clazz = classes[ j++ ] ) ) {
-						if ( cur.indexOf( " " + clazz + " " ) < 0 ) {
-							cur += clazz + " ";
-						}
-					}
-
-					// only assign if different to avoid unneeded rendering.
-					finalValue = jQuery.trim( cur );
-					if ( curValue !== finalValue ) {
-						jQuery.attr( elem, "class", finalValue );
-					}
-				}
-			}
-		}
-
-		return this;
-	},
-
-	removeClass: function( value ) {
-		var classes, elem, cur, curValue, clazz, j, finalValue,
-			i = 0;
-
-		if ( jQuery.isFunction( value ) ) {
-			return this.each( function( j ) {
-				jQuery( this ).removeClass( value.call( this, j, getClass( this ) ) );
-			} );
-		}
-
-		if ( !arguments.length ) {
-			return this.attr( "class", "" );
-		}
-
-		if ( typeof value === "string" && value ) {
-			classes = value.match( rnotwhite ) || [];
-
-			while ( ( elem = this[ i++ ] ) ) {
-				curValue = getClass( elem );
-
-				// This expression is here for better compressibility (see addClass)
-				cur = elem.nodeType === 1 &&
-					( " " + curValue + " " ).replace( rclass, " " );
-
-				if ( cur ) {
-					j = 0;
-					while ( ( clazz = classes[ j++ ] ) ) {
-
-						// Remove *all* instances
-						while ( cur.indexOf( " " + clazz + " " ) > -1 ) {
-							cur = cur.replace( " " + clazz + " ", " " );
-						}
-					}
-
-					// Only assign if different to avoid unneeded rendering.
-					finalValue = jQuery.trim( cur );
-					if ( curValue !== finalValue ) {
-						jQuery.attr( elem, "class", finalValue );
-					}
-				}
-			}
-		}
-
-		return this;
-	},
-
-	toggleClass: function( value, stateVal ) {
-		var type = typeof value;
-
-		if ( typeof stateVal === "boolean" && type === "string" ) {
-			return stateVal ? this.addClass( value ) : this.removeClass( value );
-		}
-
-		if ( jQuery.isFunction( value ) ) {
-			return this.each( function( i ) {
-				jQuery( this ).toggleClass(
-					value.call( this, i, getClass( this ), stateVal ),
-					stateVal
-				);
-			} );
-		}
-
-		return this.each( function() {
-			var className, i, self, classNames;
-
-			if ( type === "string" ) {
-
-				// Toggle individual class names
-				i = 0;
-				self = jQuery( this );
-				classNames = value.match( rnotwhite ) || [];
-
-				while ( ( className = classNames[ i++ ] ) ) {
-
-					// Check each className given, space separated list
-					if ( self.hasClass( className ) ) {
-						self.removeClass( className );
-					} else {
-						self.addClass( className );
-					}
-				}
-
-			// Toggle whole class name
-			} else if ( value === undefined || type === "boolean" ) {
-				className = getClass( this );
-				if ( className ) {
-
-					// store className if set
-					jQuery._data( this, "__className__", className );
-				}
-
-				// If the element has a class name or if we're passed "false",
-				// then remove the whole classname (if there was one, the above saved it).
-				// Otherwise bring back whatever was previously saved (if anything),
-				// falling back to the empty string if nothing was stored.
-				jQuery.attr( this, "class",
-					className || value === false ?
-					"" :
-					jQuery._data( this, "__className__" ) || ""
-				);
-			}
-		} );
-	},
-
-	hasClass: function( selector ) {
-		var className, elem,
-			i = 0;
-
-		className = " " + selector + " ";
-		while ( ( elem = this[ i++ ] ) ) {
-			if ( elem.nodeType === 1 &&
-				( " " + getClass( elem ) + " " ).replace( rclass, " " )
-					.indexOf( className ) > -1
-			) {
-				return true;
-			}
-		}
-
-		return false;
-	}
-} );
-
-
-
-
-// Return jQuery for attributes-only inclusion
-
-
-jQuery.each( ( "blur focus focusin focusout load resize scroll unload click dblclick " +
-	"mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave " +
-	"change select submit keydown keypress keyup error contextmenu" ).split( " " ),
-	function( i, name ) {
-
-	// Handle event binding
-	jQuery.fn[ name ] = function( data, fn ) {
-		return arguments.length > 0 ?
-			this.on( name, null, data, fn ) :
-			this.trigger( name );
-	};
-} );
-
-jQuery.fn.extend( {
-	hover: function( fnOver, fnOut ) {
-		return this.mouseenter( fnOver ).mouseleave( fnOut || fnOver );
-	}
-} );
-
-
-var location = window.location;
-
-var nonce = jQuery.now();
-
-var rquery = ( /\?/ );
-
-
-
-var rvalidtokens = /(,)|(\[|{)|(}|])|"(?:[^"\\\r\n]|\\["\\\/bfnrt]|\\u[\da-fA-F]{4})*"\s*:?|true|false|null|-?(?!0\d)\d+(?:\.\d+|)(?:[eE][+-]?\d+|)/g;
-
-jQuery.parseJSON = function( data ) {
-
-	// Attempt to parse using the native JSON parser first
-	if ( window.JSON && window.JSON.parse ) {
-
-		// Support: Android 2.3
-		// Workaround failure to string-cast null input
-		return window.JSON.parse( data + "" );
-	}
-
-	var requireNonComma,
-		depth = null,
-		str = jQuery.trim( data + "" );
-
-	// Guard against invalid (and possibly dangerous) input by ensuring that nothing remains
-	// after removing valid tokens
-	return str && !jQuery.trim( str.replace( rvalidtokens, function( token, comma, open, close ) {
-
-		// Force termination if we see a misplaced comma
-		if ( requireNonComma && comma ) {
-			depth = 0;
-		}
-
-		// Perform no more replacements after returning to outermost depth
-		if ( depth === 0 ) {
-			return token;
-		}
-
-		// Commas must not follow "[", "{", or ","
-		requireNonComma = open || comma;
-
-		// Determine new depth
-		// array/object open ("[" or "{"): depth += true - false (increment)
-		// array/object close ("]" or "}"): depth += false - true (decrement)
-		// other cases ("," or primitive): depth += true - true (numeric cast)
-		depth += !close - !open;
-
-		// Remove this token
-		return "";
-	} ) ) ?
-		( Function( "return " + str ) )() :
-		jQuery.error( "Invalid JSON: " + data );
-};
-
-
-// Cross-browser xml parsing
-jQuery.parseXML = function( data ) {
-	var xml, tmp;
-	if ( !data || typeof data !== "string" ) {
-		return null;
-	}
-	try {
-		if ( window.DOMParser ) { // Standard
-			tmp = new window.DOMParser();
-			xml = tmp.parseFromString( data, "text/xml" );
-		} else { // IE
-			xml = new window.ActiveXObject( "Microsoft.XMLDOM" );
-			xml.async = "false";
-			xml.loadXML( data );
-		}
-	} catch ( e ) {
-		xml = undefined;
-	}
-	if ( !xml || !xml.documentElement || xml.getElementsByTagName( "parsererror" ).length ) {
-		jQuery.error( "Invalid XML: " + data );
-	}
-	return xml;
-};
-
-
-var
-	rhash = /#.*$/,
-	rts = /([?&])_=[^&]*/,
-
-	// IE leaves an \r character at EOL
-	rheaders = /^(.*?):[ \t]*([^\r\n]*)\r?$/mg,
-
-	// #7653, #8125, #8152: local protocol detection
-	rlocalProtocol = /^(?:about|app|app-storage|.+-extension|file|res|widget):$/,
-	rnoContent = /^(?:GET|HEAD)$/,
-	rprotocol = /^\/\//,
-	rurl = /^([\w.+-]+:)(?:\/\/(?:[^\/?#]*@|)([^\/?#:]*)(?::(\d+)|)|)/,
-
-	/* Prefilters
-	 * 1) They are useful to introduce custom dataTypes (see ajax/jsonp.js for an example)
-	 * 2) These are called:
-	 *    - BEFORE asking for a transport
-	 *    - AFTER param serialization (s.data is a string if s.processData is true)
-	 * 3) key is the dataType
-	 * 4) the catchall symbol "*" can be used
-	 * 5) execution will start with transport dataType and THEN continue down to "*" if needed
-	 */
-	prefilters = {},
-
-	/* Transports bindings
-	 * 1) key is the dataType
-	 * 2) the catchall symbol "*" can be used
-	 * 3) selection will start with transport dataType and THEN go to "*" if needed
-	 */
-	transports = {},
-
-	// Avoid comment-prolog char sequence (#10098); must appease lint and evade compression
-	allTypes = "*/".concat( "*" ),
-
-	// Document location
-	ajaxLocation = location.href,
-
-	// Segment location into parts
-	ajaxLocParts = rurl.exec( ajaxLocation.toLowerCase() ) || [];
-
-// Base "constructor" for jQuery.ajaxPrefilter and jQuery.ajaxTransport
-function addToPrefiltersOrTransports( structure ) {
-
-	// dataTypeExpression is optional and defaults to "*"
-	return function( dataTypeExpression, func ) {
-
-		if ( typeof dataTypeExpression !== "string" ) {
-			func = dataTypeExpression;
-			dataTypeExpression = "*";
-		}
-
-		var dataType,
-			i = 0,
-			dataTypes = dataTypeExpression.toLowerCase().match( rnotwhite ) || [];
-
-		if ( jQuery.isFunction( func ) ) {
-
-			// For each dataType in the dataTypeExpression
-			while ( ( dataType = dataTypes[ i++ ] ) ) {
-
-				// Prepend if requested
-				if ( dataType.charAt( 0 ) === "+" ) {
-					dataType = dataType.slice( 1 ) || "*";
-					( structure[ dataType ] = structure[ dataType ] || [] ).unshift( func );
-
-				// Otherwise append
-				} else {
-					( structure[ dataType ] = structure[ dataType ] || [] ).push( func );
-				}
-			}
-		}
-	};
-}
-
-// Base inspection function for prefilters and transports
-function inspectPrefiltersOrTransports( structure, options, originalOptions, jqXHR ) {
-
-	var inspected = {},
-		seekingTransport = ( structure === transports );
-
-	function inspect( dataType ) {
-		var selected;
-		inspected[ dataType ] = true;
-		jQuery.each( structure[ dataType ] || [], function( _, prefilterOrFactory ) {
-			var dataTypeOrTransport = prefilterOrFactory( options, originalOptions, jqXHR );
-			if ( typeof dataTypeOrTransport === "string" &&
-				!seekingTransport && !inspected[ dataTypeOrTransport ] ) {
-
-				options.dataTypes.unshift( dataTypeOrTransport );
-				inspect( dataTypeOrTransport );
-				return false;
-			} else if ( seekingTransport ) {
-				return !( selected = dataTypeOrTransport );
-			}
-		} );
-		return selected;
-	}
-
-	return inspect( options.dataTypes[ 0 ] ) || !inspected[ "*" ] && inspect( "*" );
-}
-
-// A special extend for ajax options
-// that takes "flat" options (not to be deep extended)
-// Fixes #9887
-function ajaxExtend( target, src ) {
-	var deep, key,
-		flatOptions = jQuery.ajaxSettings.flatOptions || {};
-
-	for ( key in src ) {
-		if ( src[ key ] !== undefined ) {
-			( flatOptions[ key ] ? target : ( deep || ( deep = {} ) ) )[ key ] = src[ key ];
-		}
-	}
-	if ( deep ) {
-		jQuery.extend( true, target, deep );
-	}
-
-	return target;
-}
-
-/* Handles responses to an ajax request:
- * - finds the right dataType (mediates between content-type and expected dataType)
- * - returns the corresponding response
- */
-function ajaxHandleResponses( s, jqXHR, responses ) {
-	var firstDataType, ct, finalDataType, type,
-		contents = s.contents,
-		dataTypes = s.dataTypes;
-
-	// Remove auto dataType and get content-type in the process
-	while ( dataTypes[ 0 ] === "*" ) {
-		dataTypes.shift();
-		if ( ct === undefined ) {
-			ct = s.mimeType || jqXHR.getResponseHeader( "Content-Type" );
-		}
-	}
-
-	// Check if we're dealing with a known content-type
-	if ( ct ) {
-		for ( type in contents ) {
-			if ( contents[ type ] && contents[ type ].test( ct ) ) {
-				dataTypes.unshift( type );
-				break;
-			}
-		}
-	}
-
-	// Check to see if we have a response for the expected dataType
-	if ( dataTypes[ 0 ] in responses ) {
-		finalDataType = dataTypes[ 0 ];
-	} else {
-
-		// Try convertible dataTypes
-		for ( type in responses ) {
-			if ( !dataTypes[ 0 ] || s.converters[ type + " " + dataTypes[ 0 ] ] ) {
-				finalDataType = type;
-				break;
-			}
-			if ( !firstDataType ) {
-				firstDataType = type;
-			}
-		}
-
-		// Or just use first one
-		finalDataType = finalDataType || firstDataType;
-	}
-
-	// If we found a dataType
-	// We add the dataType to the list if needed
-	// and return the corresponding response
-	if ( finalDataType ) {
-		if ( finalDataType !== dataTypes[ 0 ] ) {
-			dataTypes.unshift( finalDataType );
-		}
-		return responses[ finalDataType ];
-	}
-}
-
-/* Chain conversions given the request and the original response
- * Also sets the responseXXX fields on the jqXHR instance
- */
-function ajaxConvert( s, response, jqXHR, isSuccess ) {
-	var conv2, current, conv, tmp, prev,
-		converters = {},
-
-		// Work with a copy of dataTypes in case we need to modify it for conversion
-		dataTypes = s.dataTypes.slice();
-
-	// Create converters map with lowercased keys
-	if ( dataTypes[ 1 ] ) {
-		for ( conv in s.converters ) {
-			converters[ conv.toLowerCase() ] = s.converters[ conv ];
-		}
-	}
-
-	current = dataTypes.shift();
-
-	// Convert to each sequential dataType
-	while ( current ) {
-
-		if ( s.responseFields[ current ] ) {
-			jqXHR[ s.responseFields[ current ] ] = response;
-		}
-
-		// Apply the dataFilter if provided
-		if ( !prev && isSuccess && s.dataFilter ) {
-			response = s.dataFilter( response, s.dataType );
-		}
-
-		prev = current;
-		current = dataTypes.shift();
-
-		if ( current ) {
-
-			// There's only work to do if current dataType is non-auto
-			if ( current === "*" ) {
-
-				current = prev;
-
-			// Convert response if prev dataType is non-auto and differs from current
-			} else if ( prev !== "*" && prev !== current ) {
-
-				// Seek a direct converter
-				conv = converters[ prev + " " + current ] || converters[ "* " + current ];
-
-				// If none found, seek a pair
-				if ( !conv ) {
-					for ( conv2 in converters ) {
-
-						// If conv2 outputs current
-						tmp = conv2.split( " " );
-						if ( tmp[ 1 ] === current ) {
-
-							// If prev can be converted to accepted input
-							conv = converters[ prev + " " + tmp[ 0 ] ] ||
-								converters[ "* " + tmp[ 0 ] ];
-							if ( conv ) {
-
-								// Condense equivalence converters
-								if ( conv === true ) {
-									conv = converters[ conv2 ];
-
-								// Otherwise, insert the intermediate dataType
-								} else if ( converters[ conv2 ] !== true ) {
-									current = tmp[ 0 ];
-									dataTypes.unshift( tmp[ 1 ] );
-								}
-								break;
-							}
-						}
-					}
-				}
-
-				// Apply converter (if not an equivalence)
-				if ( conv !== true ) {
-
-					// Unless errors are allowed to bubble, catch and return them
-					if ( conv && s[ "throws" ] ) { // jscs:ignore requireDotNotation
-						response = conv( response );
-					} else {
-						try {
-							response = conv( response );
-						} catch ( e ) {
-							return {
-								state: "parsererror",
-								error: conv ? e : "No conversion from " + prev + " to " + current
-							};
-						}
-					}
-				}
-			}
-		}
-	}
-
-	return { state: "success", data: response };
-}
-
-jQuery.extend( {
-
-	// Counter for holding the number of active queries
-	active: 0,
-
-	// Last-Modified header cache for next request
-	lastModified: {},
-	etag: {},
-
-	ajaxSettings: {
-		url: ajaxLocation,
-		type: "GET",
-		isLocal: rlocalProtocol.test( ajaxLocParts[ 1 ] ),
-		global: true,
-		processData: true,
-		async: true,
-		contentType: "application/x-www-form-urlencoded; charset=UTF-8",
-		/*
-		timeout: 0,
-		data: null,
-		dataType: null,
-		username: null,
-		password: null,
-		cache: null,
-		throws: false,
-		traditional: false,
-		headers: {},
-		*/
-
-		accepts: {
-			"*": allTypes,
-			text: "text/plain",
-			html: "text/html",
-			xml: "application/xml, text/xml",
-			json: "application/json, text/javascript"
-		},
-
-		contents: {
-			xml: /\bxml\b/,
-			html: /\bhtml/,
-			json: /\bjson\b/
-		},
-
-		responseFields: {
-			xml: "responseXML",
-			text: "responseText",
-			json: "responseJSON"
-		},
-
-		// Data converters
-		// Keys separate source (or catchall "*") and destination types with a single space
-		converters: {
-
-			// Convert anything to text
-			"* text": String,
-
-			// Text to html (true = no transformation)
-			"text html": true,
-
-			// Evaluate text as a json expression
-			"text json": jQuery.parseJSON,
-
-			// Parse text as xml
-			"text xml": jQuery.parseXML
-		},
-
-		// For options that shouldn't be deep extended:
-		// you can add your own custom options here if
-		// and when you create one that shouldn't be
-		// deep extended (see ajaxExtend)
-		flatOptions: {
-			url: true,
-			context: true
-		}
-	},
-
-	// Creates a full fledged settings object into target
-	// with both ajaxSettings and settings fields.
-	// If target is omitted, writes into ajaxSettings.
-	ajaxSetup: function( target, settings ) {
-		return settings ?
-
-			// Building a settings object
-			ajaxExtend( ajaxExtend( target, jQuery.ajaxSettings ), settings ) :
-
-			// Extending ajaxSettings
-			ajaxExtend( jQuery.ajaxSettings, target );
-	},
-
-	ajaxPrefilter: addToPrefiltersOrTransports( prefilters ),
-	ajaxTransport: addToPrefiltersOrTransports( transports ),
-
-	// Main method
-	ajax: function( url, options ) {
-
-		// If url is an object, simulate pre-1.5 signature
-		if ( typeof url === "object" ) {
-			options = url;
-			url = undefined;
-		}
-
-		// Force options to be an object
-		options = options || {};
-
-		var
-
-			// Cross-domain detection vars
-			parts,
-
-			// Loop variable
-			i,
-
-			// URL without anti-cache param
-			cacheURL,
-
-			// Response headers as string
-			responseHeadersString,
-
-			// timeout handle
-			timeoutTimer,
-
-			// To know if global events are to be dispatched
-			fireGlobals,
-
-			transport,
-
-			// Response headers
-			responseHeaders,
-
-			// Create the final options object
-			s = jQuery.ajaxSetup( {}, options ),
-
-			// Callbacks context
-			callbackContext = s.context || s,
-
-			// Context for global events is callbackContext if it is a DOM node or jQuery collection
-			globalEventContext = s.context &&
-				( callbackContext.nodeType || callbackContext.jquery ) ?
-					jQuery( callbackContext ) :
-					jQuery.event,
-
-			// Deferreds
-			deferred = jQuery.Deferred(),
-			completeDeferred = jQuery.Callbacks( "once memory" ),
-
-			// Status-dependent callbacks
-			statusCode = s.statusCode || {},
-
-			// Headers (they are sent all at once)
-			requestHeaders = {},
-			requestHeadersNames = {},
-
-			// The jqXHR state
-			state = 0,
-
-			// Default abort message
-			strAbort = "canceled",
-
-			// Fake xhr
-			jqXHR = {
-				readyState: 0,
-
-				// Builds headers hashtable if needed
-				getResponseHeader: function( key ) {
-					var match;
-					if ( state === 2 ) {
-						if ( !responseHeaders ) {
-							responseHeaders = {};
-							while ( ( match = rheaders.exec( responseHeadersString ) ) ) {
-								responseHeaders[ match[ 1 ].toLowerCase() ] = match[ 2 ];
-							}
-						}
-						match = responseHeaders[ key.toLowerCase() ];
-					}
-					return match == null ? null : match;
-				},
-
-				// Raw string
-				getAllResponseHeaders: function() {
-					return state === 2 ? responseHeadersString : null;
-				},
-
-				// Caches the header
-				setRequestHeader: function( name, value ) {
-					var lname = name.toLowerCase();
-					if ( !state ) {
-						name = requestHeadersNames[ lname ] = requestHeadersNames[ lname ] || name;
-						requestHeaders[ name ] = value;
-					}
-					return this;
-				},
-
-				// Overrides response content-type header
-				overrideMimeType: function( type ) {
-					if ( !state ) {
-						s.mimeType = type;
-					}
-					return this;
-				},
-
-				// Status-dependent callbacks
-				statusCode: function( map ) {
-					var code;
-					if ( map ) {
-						if ( state < 2 ) {
-							for ( code in map ) {
-
-								// Lazy-add the new callback in a way that preserves old ones
-								statusCode[ code ] = [ statusCode[ code ], map[ code ] ];
-							}
-						} else {
-
-							// Execute the appropriate callbacks
-							jqXHR.always( map[ jqXHR.status ] );
-						}
-					}
-					return this;
-				},
-
-				// Cancel the request
-				abort: function( statusText ) {
-					var finalText = statusText || strAbort;
-					if ( transport ) {
-						transport.abort( finalText );
-					}
-					done( 0, finalText );
-					return this;
-				}
-			};
-
-		// Attach deferreds
-		deferred.promise( jqXHR ).complete = completeDeferred.add;
-		jqXHR.success = jqXHR.done;
-		jqXHR.error = jqXHR.fail;
-
-		// Remove hash character (#7531: and string promotion)
-		// Add protocol if not provided (#5866: IE7 issue with protocol-less urls)
-		// Handle falsy url in the settings object (#10093: consistency with old signature)
-		// We also use the url parameter if available
-		s.url = ( ( url || s.url || ajaxLocation ) + "" )
-			.replace( rhash, "" )
-			.replace( rprotocol, ajaxLocParts[ 1 ] + "//" );
-
-		// Alias method option to type as per ticket #12004
-		s.type = options.method || options.type || s.method || s.type;
-
-		// Extract dataTypes list
-		s.dataTypes = jQuery.trim( s.dataType || "*" ).toLowerCase().match( rnotwhite ) || [ "" ];
-
-		// A cross-domain request is in order when we have a protocol:host:port mismatch
-		if ( s.crossDomain == null ) {
-			parts = rurl.exec( s.url.toLowerCase() );
-			s.crossDomain = !!( parts &&
-				( parts[ 1 ] !== ajaxLocParts[ 1 ] || parts[ 2 ] !== ajaxLocParts[ 2 ] ||
-					( parts[ 3 ] || ( parts[ 1 ] === "http:" ? "80" : "443" ) ) !==
-						( ajaxLocParts[ 3 ] || ( ajaxLocParts[ 1 ] === "http:" ? "80" : "443" ) ) )
-			);
-		}
-
-		// Convert data if not already a string
-		if ( s.data && s.processData && typeof s.data !== "string" ) {
-			s.data = jQuery.param( s.data, s.traditional );
-		}
-
-		// Apply prefilters
-		inspectPrefiltersOrTransports( prefilters, s, options, jqXHR );
-
-		// If request was aborted inside a prefilter, stop there
-		if ( state === 2 ) {
-			return jqXHR;
-		}
-
-		// We can fire global events as of now if asked to
-		// Don't fire events if jQuery.event is undefined in an AMD-usage scenario (#15118)
-		fireGlobals = jQuery.event && s.global;
-
-		// Watch for a new set of requests
-		if ( fireGlobals && jQuery.active++ === 0 ) {
-			jQuery.event.trigger( "ajaxStart" );
-		}
-
-		// Uppercase the type
-		s.type = s.type.toUpperCase();
-
-		// Determine if request has content
-		s.hasContent = !rnoContent.test( s.type );
-
-		// Save the URL in case we're toying with the If-Modified-Since
-		// and/or If-None-Match header later on
-		cacheURL = s.url;
-
-		// More options handling for requests with no content
-		if ( !s.hasContent ) {
-
-			// If data is available, append data to url
-			if ( s.data ) {
-				cacheURL = ( s.url += ( rquery.test( cacheURL ) ? "&" : "?" ) + s.data );
-
-				// #9682: remove data so that it's not used in an eventual retry
-				delete s.data;
-			}
-
-			// Add anti-cache in url if needed
-			if ( s.cache === false ) {
-				s.url = rts.test( cacheURL ) ?
-
-					// If there is already a '_' parameter, set its value
-					cacheURL.replace( rts, "$1_=" + nonce++ ) :
-
-					// Otherwise add one to the end
-					cacheURL + ( rquery.test( cacheURL ) ? "&" : "?" ) + "_=" + nonce++;
-			}
-		}
-
-		// Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode.
-		if ( s.ifModified ) {
-			if ( jQuery.lastModified[ cacheURL ] ) {
-				jqXHR.setRequestHeader( "If-Modified-Since", jQuery.lastModified[ cacheURL ] );
-			}
-			if ( jQuery.etag[ cacheURL ] ) {
-				jqXHR.setRequestHeader( "If-None-Match", jQuery.etag[ cacheURL ] );
-			}
-		}
-
-		// Set the correct header, if data is being sent
-		if ( s.data && s.hasContent && s.contentType !== false || options.contentType ) {
-			jqXHR.setRequestHeader( "Content-Type", s.contentType );
-		}
-
-		// Set the Accepts header for the server, depending on the dataType
-		jqXHR.setRequestHeader(
-			"Accept",
-			s.dataTypes[ 0 ] && s.accepts[ s.dataTypes[ 0 ] ] ?
-				s.accepts[ s.dataTypes[ 0 ] ] +
-					( s.dataTypes[ 0 ] !== "*" ? ", " + allTypes + "; q=0.01" : "" ) :
-				s.accepts[ "*" ]
-		);
-
-		// Check for headers option
-		for ( i in s.headers ) {
-			jqXHR.setRequestHeader( i, s.headers[ i ] );
-		}
-
-		// Allow custom headers/mimetypes and early abort
-		if ( s.beforeSend &&
-			( s.beforeSend.call( callbackContext, jqXHR, s ) === false || state === 2 ) ) {
-
-			// Abort if not done already and return
-			return jqXHR.abort();
-		}
-
-		// aborting is no longer a cancellation
-		strAbort = "abort";
-
-		// Install callbacks on deferreds
-		for ( i in { success: 1, error: 1, complete: 1 } ) {
-			jqXHR[ i ]( s[ i ] );
-		}
-
-		// Get transport
-		transport = inspectPrefiltersOrTransports( transports, s, options, jqXHR );
-
-		// If no transport, we auto-abort
-		if ( !transport ) {
-			done( -1, "No Transport" );
-		} else {
-			jqXHR.readyState = 1;
-
-			// Send global event
-			if ( fireGlobals ) {
-				globalEventContext.trigger( "ajaxSend", [ jqXHR, s ] );
-			}
-
-			// If request was aborted inside ajaxSend, stop there
-			if ( state === 2 ) {
-				return jqXHR;
-			}
-
-			// Timeout
-			if ( s.async && s.timeout > 0 ) {
-				timeoutTimer = window.setTimeout( function() {
-					jqXHR.abort( "timeout" );
-				}, s.timeout );
-			}
-
-			try {
-				state = 1;
-				transport.send( requestHeaders, done );
-			} catch ( e ) {
-
-				// Propagate exception as error if not done
-				if ( state < 2 ) {
-					done( -1, e );
-
-				// Simply rethrow otherwise
-				} else {
-					throw e;
-				}
-			}
-		}
-
-		// Callback for when everything is done
-		function done( status, nativeStatusText, responses, headers ) {
-			var isSuccess, success, error, response, modified,
-				statusText = nativeStatusText;
-
-			// Called once
-			if ( state === 2 ) {
-				return;
-			}
-
-			// State is "done" now
-			state = 2;
-
-			// Clear timeout if it exists
-			if ( timeoutTimer ) {
-				window.clearTimeout( timeoutTimer );
-			}
-
-			// Dereference transport for early garbage collection
-			// (no matter how long the jqXHR object will be used)
-			transport = undefined;
-
-			// Cache response headers
-			responseHeadersString = headers || "";
-
-			// Set readyState
-			jqXHR.readyState = status > 0 ? 4 : 0;
-
-			// Determine if successful
-			isSuccess = status >= 200 && status < 300 || status === 304;
-
-			// Get response data
-			if ( responses ) {
-				response = ajaxHandleResponses( s, jqXHR, responses );
-			}
-
-			// Convert no matter what (that way responseXXX fields are always set)
-			response = ajaxConvert( s, response, jqXHR, isSuccess );
-
-			// If successful, handle type chaining
-			if ( isSuccess ) {
-
-				// Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode.
-				if ( s.ifModified ) {
-					modified = jqXHR.getResponseHeader( "Last-Modified" );
-					if ( modified ) {
-						jQuery.lastModified[ cacheURL ] = modified;
-					}
-					modified = jqXHR.getResponseHeader( "etag" );
-					if ( modified ) {
-						jQuery.etag[ cacheURL ] = modified;
-					}
-				}
-
-				// if no content
-				if ( status === 204 || s.type === "HEAD" ) {
-					statusText = "nocontent";
-
-				// if not modified
-				} else if ( status === 304 ) {
-					statusText = "notmodified";
-
-				// If we have data, let's convert it
-				} else {
-					statusText = response.state;
-					success = response.data;
-					error = response.error;
-					isSuccess = !error;
-				}
-			} else {
-
-				// We extract error from statusText
-				// then normalize statusText and status for non-aborts
-				error = statusText;
-				if ( status || !statusText ) {
-					statusText = "error";
-					if ( status < 0 ) {
-						status = 0;
-					}
-				}
-			}
-
-			// Set data for the fake xhr object
-			jqXHR.status = status;
-			jqXHR.statusText = ( nativeStatusText || statusText ) + "";
-
-			// Success/Error
-			if ( isSuccess ) {
-				deferred.resolveWith( callbackContext, [ success, statusText, jqXHR ] );
-			} else {
-				deferred.rejectWith( callbackContext, [ jqXHR, statusText, error ] );
-			}
-
-			// Status-dependent callbacks
-			jqXHR.statusCode( statusCode );
-			statusCode = undefined;
-
-			if ( fireGlobals ) {
-				globalEventContext.trigger( isSuccess ? "ajaxSuccess" : "ajaxError",
-					[ jqXHR, s, isSuccess ? success : error ] );
-			}
-
-			// Complete
-			completeDeferred.fireWith( callbackContext, [ jqXHR, statusText ] );
-
-			if ( fireGlobals ) {
-				globalEventContext.trigger( "ajaxComplete", [ jqXHR, s ] );
-
-				// Handle the global AJAX counter
-				if ( !( --jQuery.active ) ) {
-					jQuery.event.trigger( "ajaxStop" );
-				}
-			}
-		}
-
-		return jqXHR;
-	},
-
-	getJSON: function( url, data, callback ) {
-		return jQuery.get( url, data, callback, "json" );
-	},
-
-	getScript: function( url, callback ) {
-		return jQuery.get( url, undefined, callback, "script" );
-	}
-} );
-
-jQuery.each( [ "get", "post" ], function( i, method ) {
-	jQuery[ method ] = function( url, data, callback, type ) {
-
-		// shift arguments if data argument was omitted
-		if ( jQuery.isFunction( data ) ) {
-			type = type || callback;
-			callback = data;
-			data = undefined;
-		}
-
-		// The url can be an options object (which then must have .url)
-		return jQuery.ajax( jQuery.extend( {
-			url: url,
-			type: method,
-			dataType: type,
-			data: data,
-			success: callback
-		}, jQuery.isPlainObject( url ) && url ) );
-	};
-} );
-
-
-jQuery._evalUrl = function( url ) {
-	return jQuery.ajax( {
-		url: url,
-
-		// Make this explicit, since user can override this through ajaxSetup (#11264)
-		type: "GET",
-		dataType: "script",
-		cache: true,
-		async: false,
-		global: false,
-		"throws": true
-	} );
-};
-
-
-jQuery.fn.extend( {
-	wrapAll: function( html ) {
-		if ( jQuery.isFunction( html ) ) {
-			return this.each( function( i ) {
-				jQuery( this ).wrapAll( html.call( this, i ) );
-			} );
-		}
-
-		if ( this[ 0 ] ) {
-
-			// The elements to wrap the target around
-			var wrap = jQuery( html, this[ 0 ].ownerDocument ).eq( 0 ).clone( true );
-
-			if ( this[ 0 ].parentNode ) {
-				wrap.insertBefore( this[ 0 ] );
-			}
-
-			wrap.map( function() {
-				var elem = this;
-
-				while ( elem.firstChild && elem.firstChild.nodeType === 1 ) {
-					elem = elem.firstChild;
-				}
-
-				return elem;
-			} ).append( this );
-		}
-
-		return this;
-	},
-
-	wrapInner: function( html ) {
-		if ( jQuery.isFunction( html ) ) {
-			return this.each( function( i ) {
-				jQuery( this ).wrapInner( html.call( this, i ) );
-			} );
-		}
-
-		return this.each( function() {
-			var self = jQuery( this ),
-				contents = self.contents();
-
-			if ( contents.length ) {
-				contents.wrapAll( html );
-
-			} else {
-				self.append( html );
-			}
-		} );
-	},
-
-	wrap: function( html ) {
-		var isFunction = jQuery.isFunction( html );
-
-		return this.each( function( i ) {
-			jQuery( this ).wrapAll( isFunction ? html.call( this, i ) : html );
-		} );
-	},
-
-	unwrap: function() {
-		return this.parent().each( function() {
-			if ( !jQuery.nodeName( this, "body" ) ) {
-				jQuery( this ).replaceWith( this.childNodes );
-			}
-		} ).end();
-	}
-} );
-
-
-function getDisplay( elem ) {
-	return elem.style && elem.style.display || jQuery.css( elem, "display" );
-}
-
-function filterHidden( elem ) {
-
-	// Disconnected elements are considered hidden
-	if ( !jQuery.contains( elem.ownerDocument || document, elem ) ) {
-		return true;
-	}
-	while ( elem && elem.nodeType === 1 ) {
-		if ( getDisplay( elem ) === "none" || elem.type === "hidden" ) {
-			return true;
-		}
-		elem = elem.parentNode;
-	}
-	return false;
-}
-
-jQuery.expr.filters.hidden = function( elem ) {
-
-	// Support: Opera <= 12.12
-	// Opera reports offsetWidths and offsetHeights less than zero on some elements
-	return support.reliableHiddenOffsets() ?
-		( elem.offsetWidth <= 0 && elem.offsetHeight <= 0 &&
-			!elem.getClientRects().length ) :
-			filterHidden( elem );
-};
-
-jQuery.expr.filters.visible = function( elem ) {
-	return !jQuery.expr.filters.hidden( elem );
-};
-
-
-
-
-var r20 = /%20/g,
-	rbracket = /\[\]$/,
-	rCRLF = /\r?\n/g,
-	rsubmitterTypes = /^(?:submit|button|image|reset|file)$/i,
-	rsubmittable = /^(?:input|select|textarea|keygen)/i;
-
-function buildParams( prefix, obj, traditional, add ) {
-	var name;
-
-	if ( jQuery.isArray( obj ) ) {
-
-		// Serialize array item.
-		jQuery.each( obj, function( i, v ) {
-			if ( traditional || rbracket.test( prefix ) ) {
-
-				// Treat each array item as a scalar.
-				add( prefix, v );
-
-			} else {
-
-				// Item is non-scalar (array or object), encode its numeric index.
-				buildParams(
-					prefix + "[" + ( typeof v === "object" && v != null ? i : "" ) + "]",
-					v,
-					traditional,
-					add
-				);
-			}
-		} );
-
-	} else if ( !traditional && jQuery.type( obj ) === "object" ) {
-
-		// Serialize object item.
-		for ( name in obj ) {
-			buildParams( prefix + "[" + name + "]", obj[ name ], traditional, add );
-		}
-
-	} else {
-
-		// Serialize scalar item.
-		add( prefix, obj );
-	}
-}
-
-// Serialize an array of form elements or a set of
-// key/values into a query string
-jQuery.param = function( a, traditional ) {
-	var prefix,
-		s = [],
-		add = function( key, value ) {
-
-			// If value is a function, invoke it and return its value
-			value = jQuery.isFunction( value ) ? value() : ( value == null ? "" : value );
-			s[ s.length ] = encodeURIComponent( key ) + "=" + encodeURIComponent( value );
-		};
-
-	// Set traditional to true for jQuery <= 1.3.2 behavior.
-	if ( traditional === undefined ) {
-		traditional = jQuery.ajaxSettings && jQuery.ajaxSettings.traditional;
-	}
-
-	// If an array was passed in, assume that it is an array of form elements.
-	if ( jQuery.isArray( a ) || ( a.jquery && !jQuery.isPlainObject( a ) ) ) {
-
-		// Serialize the form elements
-		jQuery.each( a, function() {
-			add( this.name, this.value );
-		} );
-
-	} else {
-
-		// If traditional, encode the "old" way (the way 1.3.2 or older
-		// did it), otherwise encode params recursively.
-		for ( prefix in a ) {
-			buildParams( prefix, a[ prefix ], traditional, add );
-		}
-	}
-
-	// Return the resulting serialization
-	return s.join( "&" ).replace( r20, "+" );
-};
-
-jQuery.fn.extend( {
-	serialize: function() {
-		return jQuery.param( this.serializeArray() );
-	},
-	serializeArray: function() {
-		return this.map( function() {
-
-			// Can add propHook for "elements" to filter or add form elements
-			var elements = jQuery.prop( this, "elements" );
-			return elements ? jQuery.makeArray( elements ) : this;
-		} )
-		.filter( function() {
-			var type = this.type;
-
-			// Use .is(":disabled") so that fieldset[disabled] works
-			return this.name && !jQuery( this ).is( ":disabled" ) &&
-				rsubmittable.test( this.nodeName ) && !rsubmitterTypes.test( type ) &&
-				( this.checked || !rcheckableType.test( type ) );
-		} )
-		.map( function( i, elem ) {
-			var val = jQuery( this ).val();
-
-			return val == null ?
-				null :
-				jQuery.isArray( val ) ?
-					jQuery.map( val, function( val ) {
-						return { name: elem.name, value: val.replace( rCRLF, "\r\n" ) };
-					} ) :
-					{ name: elem.name, value: val.replace( rCRLF, "\r\n" ) };
-		} ).get();
-	}
-} );
-
-
-// Create the request object
-// (This is still attached to ajaxSettings for backward compatibility)
-jQuery.ajaxSettings.xhr = window.ActiveXObject !== undefined ?
-
-	// Support: IE6-IE8
-	function() {
-
-		// XHR cannot access local files, always use ActiveX for that case
-		if ( this.isLocal ) {
-			return createActiveXHR();
-		}
-
-		// Support: IE 9-11
-		// IE seems to error on cross-domain PATCH requests when ActiveX XHR
-		// is used. In IE 9+ always use the native XHR.
-		// Note: this condition won't catch Edge as it doesn't define
-		// document.documentMode but it also doesn't support ActiveX so it won't
-		// reach this code.
-		if ( document.documentMode > 8 ) {
-			return createStandardXHR();
-		}
-
-		// Support: IE<9
-		// oldIE XHR does not support non-RFC2616 methods (#13240)
-		// See http://msdn.microsoft.com/en-us/library/ie/ms536648(v=vs.85).aspx
-		// and http://www.w3.org/Protocols/rfc2616/rfc2616-sec9.html#sec9
-		// Although this check for six methods instead of eight
-		// since IE also does not support "trace" and "connect"
-		return /^(get|post|head|put|delete|options)$/i.test( this.type ) &&
-			createStandardXHR() || createActiveXHR();
-	} :
-
-	// For all other browsers, use the standard XMLHttpRequest object
-	createStandardXHR;
-
-var xhrId = 0,
-	xhrCallbacks = {},
-	xhrSupported = jQuery.ajaxSettings.xhr();
-
-// Support: IE<10
-// Open requests must be manually aborted on unload (#5280)
-// See https://support.microsoft.com/kb/2856746 for more info
-if ( window.attachEvent ) {
-	window.attachEvent( "onunload", function() {
-		for ( var key in xhrCallbacks ) {
-			xhrCallbacks[ key ]( undefined, true );
-		}
-	} );
-}
-
-// Determine support properties
-support.cors = !!xhrSupported && ( "withCredentials" in xhrSupported );
-xhrSupported = support.ajax = !!xhrSupported;
-
-// Create transport if the browser can provide an xhr
-if ( xhrSupported ) {
-
-	jQuery.ajaxTransport( function( options ) {
-
-		// Cross domain only allowed if supported through XMLHttpRequest
-		if ( !options.crossDomain || support.cors ) {
-
-			var callback;
-
-			return {
-				send: function( headers, complete ) {
-					var i,
-						xhr = options.xhr(),
-						id = ++xhrId;
-
-					// Open the socket
-					xhr.open(
-						options.type,
-						options.url,
-						options.async,
-						options.username,
-						options.password
-					);
-
-					// Apply custom fields if provided
-					if ( options.xhrFields ) {
-						for ( i in options.xhrFields ) {
-							xhr[ i ] = options.xhrFields[ i ];
-						}
-					}
-
-					// Override mime type if needed
-					if ( options.mimeType && xhr.overrideMimeType ) {
-						xhr.overrideMimeType( options.mimeType );
-					}
-
-					// X-Requested-With header
-					// For cross-domain requests, seeing as conditions for a preflight are
-					// akin to a jigsaw puzzle, we simply never set it to be sure.
-					// (it can always be set on a per-request basis or even using ajaxSetup)
-					// For same-domain requests, won't change header if already provided.
-					if ( !options.crossDomain && !headers[ "X-Requested-With" ] ) {
-						headers[ "X-Requested-With" ] = "XMLHttpRequest";
-					}
-
-					// Set headers
-					for ( i in headers ) {
-
-						// Support: IE<9
-						// IE's ActiveXObject throws a 'Type Mismatch' exception when setting
-						// request header to a null-value.
-						//
-						// To keep consistent with other XHR implementations, cast the value
-						// to string and ignore `undefined`.
-						if ( headers[ i ] !== undefined ) {
-							xhr.setRequestHeader( i, headers[ i ] + "" );
-						}
-					}
-
-					// Do send the request
-					// This may raise an exception which is actually
-					// handled in jQuery.ajax (so no try/catch here)
-					xhr.send( ( options.hasContent && options.data ) || null );
-
-					// Listener
-					callback = function( _, isAbort ) {
-						var status, statusText, responses;
-
-						// Was never called and is aborted or complete
-						if ( callback && ( isAbort || xhr.readyState === 4 ) ) {
-
-							// Clean up
-							delete xhrCallbacks[ id ];
-							callback = undefined;
-							xhr.onreadystatechange = jQuery.noop;
-
-							// Abort manually if needed
-							if ( isAbort ) {
-								if ( xhr.readyState !== 4 ) {
-									xhr.abort();
-								}
-							} else {
-								responses = {};
-								status = xhr.status;
-
-								// Support: IE<10
-								// Accessing binary-data responseText throws an exception
-								// (#11426)
-								if ( typeof xhr.responseText === "string" ) {
-									responses.text = xhr.responseText;
-								}
-
-								// Firefox throws an exception when accessing
-								// statusText for faulty cross-domain requests
-								try {
-									statusText = xhr.statusText;
-								} catch ( e ) {
-
-									// We normalize with Webkit giving an empty statusText
-									statusText = "";
-								}
-
-								// Filter status for non standard behaviors
-
-								// If the request is local and we have data: assume a success
-								// (success with no data won't get notified, that's the best we
-								// can do given current implementations)
-								if ( !status && options.isLocal && !options.crossDomain ) {
-									status = responses.text ? 200 : 404;
-
-								// IE - #1450: sometimes returns 1223 when it should be 204
-								} else if ( status === 1223 ) {
-									status = 204;
-								}
-							}
-						}
-
-						// Call complete if needed
-						if ( responses ) {
-							complete( status, statusText, responses, xhr.getAllResponseHeaders() );
-						}
-					};
-
-					// Do send the request
-					// `xhr.send` may raise an exception, but it will be
-					// handled in jQuery.ajax (so no try/catch here)
-					if ( !options.async ) {
-
-						// If we're in sync mode we fire the callback
-						callback();
-					} else if ( xhr.readyState === 4 ) {
-
-						// (IE6 & IE7) if it's in cache and has been
-						// retrieved directly we need to fire the callback
-						window.setTimeout( callback );
-					} else {
-
-						// Register the callback, but delay it in case `xhr.send` throws
-						// Add to the list of active xhr callbacks
-						xhr.onreadystatechange = xhrCallbacks[ id ] = callback;
-					}
-				},
-
-				abort: function() {
-					if ( callback ) {
-						callback( undefined, true );
-					}
-				}
-			};
-		}
-	} );
-}
-
-// Functions to create xhrs
-function createStandardXHR() {
-	try {
-		return new window.XMLHttpRequest();
-	} catch ( e ) {}
-}
-
-function createActiveXHR() {
-	try {
-		return new window.ActiveXObject( "Microsoft.XMLHTTP" );
-	} catch ( e ) {}
-}
-
-
-
-
-// Install script dataType
-jQuery.ajaxSetup( {
-	accepts: {
-		script: "text/javascript, application/javascript, " +
-			"application/ecmascript, application/x-ecmascript"
-	},
-	contents: {
-		script: /\b(?:java|ecma)script\b/
-	},
-	converters: {
-		"text script": function( text ) {
-			jQuery.globalEval( text );
-			return text;
-		}
-	}
-} );
-
-// Handle cache's special case and global
-jQuery.ajaxPrefilter( "script", function( s ) {
-	if ( s.cache === undefined ) {
-		s.cache = false;
-	}
-	if ( s.crossDomain ) {
-		s.type = "GET";
-		s.global = false;
-	}
-} );
-
-// Bind script tag hack transport
-jQuery.ajaxTransport( "script", function( s ) {
-
-	// This transport only deals with cross domain requests
-	if ( s.crossDomain ) {
-
-		var script,
-			head = document.head || jQuery( "head" )[ 0 ] || document.documentElement;
-
-		return {
-
-			send: function( _, callback ) {
-
-				script = document.createElement( "script" );
-
-				script.async = true;
-
-				if ( s.scriptCharset ) {
-					script.charset = s.scriptCharset;
-				}
-
-				script.src = s.url;
-
-				// Attach handlers for all browsers
-				script.onload = script.onreadystatechange = function( _, isAbort ) {
-
-					if ( isAbort || !script.readyState || /loaded|complete/.test( script.readyState ) ) {
-
-						// Handle memory leak in IE
-						script.onload = script.onreadystatechange = null;
-
-						// Remove the script
-						if ( script.parentNode ) {
-							script.parentNode.removeChild( script );
-						}
-
-						// Dereference the script
-						script = null;
-
-						// Callback if not abort
-						if ( !isAbort ) {
-							callback( 200, "success" );
-						}
-					}
-				};
-
-				// Circumvent IE6 bugs with base elements (#2709 and #4378) by prepending
-				// Use native DOM manipulation to avoid our domManip AJAX trickery
-				head.insertBefore( script, head.firstChild );
-			},
-
-			abort: function() {
-				if ( script ) {
-					script.onload( undefined, true );
-				}
-			}
-		};
-	}
-} );
-
-
-
-
-var oldCallbacks = [],
-	rjsonp = /(=)\?(?=&|$)|\?\?/;
-
-// Default jsonp settings
-jQuery.ajaxSetup( {
-	jsonp: "callback",
-	jsonpCallback: function() {
-		var callback = oldCallbacks.pop() || ( jQuery.expando + "_" + ( nonce++ ) );
-		this[ callback ] = true;
-		return callback;
-	}
-} );
-
-// Detect, normalize options and install callbacks for jsonp requests
-jQuery.ajaxPrefilter( "json jsonp", function( s, originalSettings, jqXHR ) {
-
-	var callbackName, overwritten, responseContainer,
-		jsonProp = s.jsonp !== false && ( rjsonp.test( s.url ) ?
-			"url" :
-			typeof s.data === "string" &&
-				( s.contentType || "" )
-					.indexOf( "application/x-www-form-urlencoded" ) === 0 &&
-				rjsonp.test( s.data ) && "data"
-		);
-
-	// Handle iff the expected data type is "jsonp" or we have a parameter to set
-	if ( jsonProp || s.dataTypes[ 0 ] === "jsonp" ) {
-
-		// Get callback name, remembering preexisting value associated with it
-		callbackName = s.jsonpCallback = jQuery.isFunction( s.jsonpCallback ) ?
-			s.jsonpCallback() :
-			s.jsonpCallback;
-
-		// Insert callback into url or form data
-		if ( jsonProp ) {
-			s[ jsonProp ] = s[ jsonProp ].replace( rjsonp, "$1" + callbackName );
-		} else if ( s.jsonp !== false ) {
-			s.url += ( rquery.test( s.url ) ? "&" : "?" ) + s.jsonp + "=" + callbackName;
-		}
-
-		// Use data converter to retrieve json after script execution
-		s.converters[ "script json" ] = function() {
-			if ( !responseContainer ) {
-				jQuery.error( callbackName + " was not called" );
-			}
-			return responseContainer[ 0 ];
-		};
-
-		// force json dataType
-		s.dataTypes[ 0 ] = "json";
-
-		// Install callback
-		overwritten = window[ callbackName ];
-		window[ callbackName ] = function() {
-			responseContainer = arguments;
-		};
-
-		// Clean-up function (fires after converters)
-		jqXHR.always( function() {
-
-			// If previous value didn't exist - remove it
-			if ( overwritten === undefined ) {
-				jQuery( window ).removeProp( callbackName );
-
-			// Otherwise restore preexisting value
-			} else {
-				window[ callbackName ] = overwritten;
-			}
-
-			// Save back as free
-			if ( s[ callbackName ] ) {
-
-				// make sure that re-using the options doesn't screw things around
-				s.jsonpCallback = originalSettings.jsonpCallback;
-
-				// save the callback name for future use
-				oldCallbacks.push( callbackName );
-			}
-
-			// Call if it was a function and we have a response
-			if ( responseContainer && jQuery.isFunction( overwritten ) ) {
-				overwritten( responseContainer[ 0 ] );
-			}
-
-			responseContainer = overwritten = undefined;
-		} );
-
-		// Delegate to script
-		return "script";
-	}
-} );
-
-
-
-
-// data: string of html
-// context (optional): If specified, the fragment will be created in this context,
-// defaults to document
-// keepScripts (optional): If true, will include scripts passed in the html string
-jQuery.parseHTML = function( data, context, keepScripts ) {
-	if ( !data || typeof data !== "string" ) {
-		return null;
-	}
-	if ( typeof context === "boolean" ) {
-		keepScripts = context;
-		context = false;
-	}
-	context = context || document;
-
-	var parsed = rsingleTag.exec( data ),
-		scripts = !keepScripts && [];
-
-	// Single tag
-	if ( parsed ) {
-		return [ context.createElement( parsed[ 1 ] ) ];
-	}
-
-	parsed = buildFragment( [ data ], context, scripts );
-
-	if ( scripts && scripts.length ) {
-		jQuery( scripts ).remove();
-	}
-
-	return jQuery.merge( [], parsed.childNodes );
-};
-
-
-// Keep a copy of the old load method
-var _load = jQuery.fn.load;
-
-/**
- * Load a url into a page
- */
-jQuery.fn.load = function( url, params, callback ) {
-	if ( typeof url !== "string" && _load ) {
-		return _load.apply( this, arguments );
-	}
-
-	var selector, type, response,
-		self = this,
-		off = url.indexOf( " " );
-
-	if ( off > -1 ) {
-		selector = jQuery.trim( url.slice( off, url.length ) );
-		url = url.slice( 0, off );
-	}
-
-	// If it's a function
-	if ( jQuery.isFunction( params ) ) {
-
-		// We assume that it's the callback
-		callback = params;
-		params = undefined;
-
-	// Otherwise, build a param string
-	} else if ( params && typeof params === "object" ) {
-		type = "POST";
-	}
-
-	// If we have elements to modify, make the request
-	if ( self.length > 0 ) {
-		jQuery.ajax( {
-			url: url,
-
-			// If "type" variable is undefined, then "GET" method will be used.
-			// Make value of this field explicit since
-			// user can override it through ajaxSetup method
-			type: type || "GET",
-			dataType: "html",
-			data: params
-		} ).done( function( responseText ) {
-
-			// Save response for use in complete callback
-			response = arguments;
-
-			self.html( selector ?
-
-				// If a selector was specified, locate the right elements in a dummy div
-				// Exclude scripts to avoid IE 'Permission Denied' errors
-				jQuery( "<div>" ).append( jQuery.parseHTML( responseText ) ).find( selector ) :
-
-				// Otherwise use the full result
-				responseText );
-
-		// If the request succeeds, this function gets "data", "status", "jqXHR"
-		// but they are ignored because response was set above.
-		// If it fails, this function gets "jqXHR", "status", "error"
-		} ).always( callback && function( jqXHR, status ) {
-			self.each( function() {
-				callback.apply( this, response || [ jqXHR.responseText, status, jqXHR ] );
-			} );
-		} );
-	}
-
-	return this;
-};
-
-
-
-
-// Attach a bunch of functions for handling common AJAX events
-jQuery.each( [
-	"ajaxStart",
-	"ajaxStop",
-	"ajaxComplete",
-	"ajaxError",
-	"ajaxSuccess",
-	"ajaxSend"
-], function( i, type ) {
-	jQuery.fn[ type ] = function( fn ) {
-		return this.on( type, fn );
-	};
-} );
-
-
-
-
-jQuery.expr.filters.animated = function( elem ) {
-	return jQuery.grep( jQuery.timers, function( fn ) {
-		return elem === fn.elem;
-	} ).length;
-};
-
-
-
-
-
-/**
- * Gets a window from an element
- */
-function getWindow( elem ) {
-	return jQuery.isWindow( elem ) ?
-		elem :
-		elem.nodeType === 9 ?
-			elem.defaultView || elem.parentWindow :
-			false;
-}
-
-jQuery.offset = {
-	setOffset: function( elem, options, i ) {
-		var curPosition, curLeft, curCSSTop, curTop, curOffset, curCSSLeft, calculatePosition,
-			position = jQuery.css( elem, "position" ),
-			curElem = jQuery( elem ),
-			props = {};
-
-		// set position first, in-case top/left are set even on static elem
-		if ( position === "static" ) {
-			elem.style.position = "relative";
-		}
-
-		curOffset = curElem.offset();
-		curCSSTop = jQuery.css( elem, "top" );
-		curCSSLeft = jQuery.css( elem, "left" );
-		calculatePosition = ( position === "absolute" || position === "fixed" ) &&
-			jQuery.inArray( "auto", [ curCSSTop, curCSSLeft ] ) > -1;
-
-		// need to be able to calculate position if either top or left
-		// is auto and position is either absolute or fixed
-		if ( calculatePosition ) {
-			curPosition = curElem.position();
-			curTop = curPosition.top;
-			curLeft = curPosition.left;
-		} else {
-			curTop = parseFloat( curCSSTop ) || 0;
-			curLeft = parseFloat( curCSSLeft ) || 0;
-		}
-
-		if ( jQuery.isFunction( options ) ) {
-
-			// Use jQuery.extend here to allow modification of coordinates argument (gh-1848)
-			options = options.call( elem, i, jQuery.extend( {}, curOffset ) );
-		}
-
-		if ( options.top != null ) {
-			props.top = ( options.top - curOffset.top ) + curTop;
-		}
-		if ( options.left != null ) {
-			props.left = ( options.left - curOffset.left ) + curLeft;
-		}
-
-		if ( "using" in options ) {
-			options.using.call( elem, props );
-		} else {
-			curElem.css( props );
-		}
-	}
-};
-
-jQuery.fn.extend( {
-	offset: function( options ) {
-		if ( arguments.length ) {
-			return options === undefined ?
-				this :
-				this.each( function( i ) {
-					jQuery.offset.setOffset( this, options, i );
-				} );
-		}
-
-		var docElem, win,
-			box = { top: 0, left: 0 },
-			elem = this[ 0 ],
-			doc = elem && elem.ownerDocument;
-
-		if ( !doc ) {
-			return;
-		}
-
-		docElem = doc.documentElement;
-
-		// Make sure it's not a disconnected DOM node
-		if ( !jQuery.contains( docElem, elem ) ) {
-			return box;
-		}
-
-		// If we don't have gBCR, just use 0,0 rather than error
-		// BlackBerry 5, iOS 3 (original iPhone)
-		if ( typeof elem.getBoundingClientRect !== "undefined" ) {
-			box = elem.getBoundingClientRect();
-		}
-		win = getWindow( doc );
-		return {
-			top: box.top  + ( win.pageYOffset || docElem.scrollTop )  - ( docElem.clientTop  || 0 ),
-			left: box.left + ( win.pageXOffset || docElem.scrollLeft ) - ( docElem.clientLeft || 0 )
-		};
-	},
-
-	position: function() {
-		if ( !this[ 0 ] ) {
-			return;
-		}
-
-		var offsetParent, offset,
-			parentOffset = { top: 0, left: 0 },
-			elem = this[ 0 ];
-
-		// Fixed elements are offset from window (parentOffset = {top:0, left: 0},
-		// because it is its only offset parent
-		if ( jQuery.css( elem, "position" ) === "fixed" ) {
-
-			// we assume that getBoundingClientRect is available when computed position is fixed
-			offset = elem.getBoundingClientRect();
-		} else {
-
-			// Get *real* offsetParent
-			offsetParent = this.offsetParent();
-
-			// Get correct offsets
-			offset = this.offset();
-			if ( !jQuery.nodeName( offsetParent[ 0 ], "html" ) ) {
-				parentOffset = offsetParent.offset();
-			}
-
-			// Add offsetParent borders
-			parentOffset.top  += jQuery.css( offsetParent[ 0 ], "borderTopWidth", true );
-			parentOffset.left += jQuery.css( offsetParent[ 0 ], "borderLeftWidth", true );
-		}
-
-		// Subtract parent offsets and element margins
-		// note: when an element has margin: auto the offsetLeft and marginLeft
-		// are the same in Safari causing offset.left to incorrectly be 0
-		return {
-			top:  offset.top  - parentOffset.top - jQuery.css( elem, "marginTop", true ),
-			left: offset.left - parentOffset.left - jQuery.css( elem, "marginLeft", true )
-		};
-	},
-
-	offsetParent: function() {
-		return this.map( function() {
-			var offsetParent = this.offsetParent;
-
-			while ( offsetParent && ( !jQuery.nodeName( offsetParent, "html" ) &&
-				jQuery.css( offsetParent, "position" ) === "static" ) ) {
-				offsetParent = offsetParent.offsetParent;
-			}
-			return offsetParent || documentElement;
-		} );
-	}
-} );
-
-// Create scrollLeft and scrollTop methods
-jQuery.each( { scrollLeft: "pageXOffset", scrollTop: "pageYOffset" }, function( method, prop ) {
-	var top = /Y/.test( prop );
-
-	jQuery.fn[ method ] = function( val ) {
-		return access( this, function( elem, method, val ) {
-			var win = getWindow( elem );
-
-			if ( val === undefined ) {
-				return win ? ( prop in win ) ? win[ prop ] :
-					win.document.documentElement[ method ] :
-					elem[ method ];
-			}
-
-			if ( win ) {
-				win.scrollTo(
-					!top ? val : jQuery( win ).scrollLeft(),
-					top ? val : jQuery( win ).scrollTop()
-				);
-
-			} else {
-				elem[ method ] = val;
-			}
-		}, method, val, arguments.length, null );
-	};
-} );
-
-// Support: Safari<7-8+, Chrome<37-44+
-// Add the top/left cssHooks using jQuery.fn.position
-// Webkit bug: https://bugs.webkit.org/show_bug.cgi?id=29084
-// getComputedStyle returns percent when specified for top/left/bottom/right
-// rather than make the css module depend on the offset module, we just check for it here
-jQuery.each( [ "top", "left" ], function( i, prop ) {
-	jQuery.cssHooks[ prop ] = addGetHookIf( support.pixelPosition,
-		function( elem, computed ) {
-			if ( computed ) {
-				computed = curCSS( elem, prop );
-
-				// if curCSS returns percentage, fallback to offset
-				return rnumnonpx.test( computed ) ?
-					jQuery( elem ).position()[ prop ] + "px" :
-					computed;
-			}
-		}
-	);
-} );
-
-
-// Create innerHeight, innerWidth, height, width, outerHeight and outerWidth methods
-jQuery.each( { Height: "height", Width: "width" }, function( name, type ) {
-	jQuery.each( { padding: "inner" + name, content: type, "": "outer" + name },
-	function( defaultExtra, funcName ) {
-
-		// margin is only for outerHeight, outerWidth
-		jQuery.fn[ funcName ] = function( margin, value ) {
-			var chainable = arguments.length && ( defaultExtra || typeof margin !== "boolean" ),
-				extra = defaultExtra || ( margin === true || value === true ? "margin" : "border" );
-
-			return access( this, function( elem, type, value ) {
-				var doc;
-
-				if ( jQuery.isWindow( elem ) ) {
-
-					// As of 5/8/2012 this will yield incorrect results for Mobile Safari, but there
-					// isn't a whole lot we can do. See pull request at this URL for discussion:
-					// https://github.com/jquery/jquery/pull/764
-					return elem.document.documentElement[ "client" + name ];
-				}
-
-				// Get document width or height
-				if ( elem.nodeType === 9 ) {
-					doc = elem.documentElement;
-
-					// Either scroll[Width/Height] or offset[Width/Height] or client[Width/Height],
-					// whichever is greatest
-					// unfortunately, this causes bug #3838 in IE6/8 only,
-					// but there is currently no good, small way to fix it.
-					return Math.max(
-						elem.body[ "scroll" + name ], doc[ "scroll" + name ],
-						elem.body[ "offset" + name ], doc[ "offset" + name ],
-						doc[ "client" + name ]
-					);
-				}
-
-				return value === undefined ?
-
-					// Get width or height on the element, requesting but not forcing parseFloat
-					jQuery.css( elem, type, extra ) :
-
-					// Set width or height on the element
-					jQuery.style( elem, type, value, extra );
-			}, type, chainable ? margin : undefined, chainable, null );
-		};
-	} );
-} );
-
-
-jQuery.fn.extend( {
-
-	bind: function( types, data, fn ) {
-		return this.on( types, null, data, fn );
-	},
-	unbind: function( types, fn ) {
-		return this.off( types, null, fn );
-	},
-
-	delegate: function( selector, types, data, fn ) {
-		return this.on( types, selector, data, fn );
-	},
-	undelegate: function( selector, types, fn ) {
-
-		// ( namespace ) or ( selector, types [, fn] )
-		return arguments.length === 1 ?
-			this.off( selector, "**" ) :
-			this.off( types, selector || "**", fn );
-	}
-} );
-
-// The number of elements contained in the matched element set
-jQuery.fn.size = function() {
-	return this.length;
-};
-
-jQuery.fn.andSelf = jQuery.fn.addBack;
-
-
-
-
-// Register as a named AMD module, since jQuery can be concatenated with other
-// files that may use define, but not via a proper concatenation script that
-// understands anonymous AMD modules. A named AMD is safest and most robust
-// way to register. Lowercase jquery is used because AMD module names are
-// derived from file names, and jQuery is normally delivered in a lowercase
-// file name. Do this after creating the global so that if an AMD module wants
-// to call noConflict to hide this version of jQuery, it will work.
-
-// Note that for maximum portability, libraries that are not jQuery should
-// declare themselves as anonymous modules, and avoid setting a global if an
-// AMD loader is present. jQuery is a special case. For more information, see
-// https://github.com/jrburke/requirejs/wiki/Updating-existing-libraries#wiki-anon
-
-if ( typeof define === "function" && define.amd ) {
-	define( "jquery", [], function() {
-		return jQuery;
-	} );
-}
-
-
-
-var
-
-	// Map over jQuery in case of overwrite
-	_jQuery = window.jQuery,
-
-	// Map over the $ in case of overwrite
-	_$ = window.$;
-
-jQuery.noConflict = function( deep ) {
-	if ( window.$ === jQuery ) {
-		window.$ = _$;
-	}
-
-	if ( deep && window.jQuery === jQuery ) {
-		window.jQuery = _jQuery;
-	}
-
-	return jQuery;
-};
-
-// Expose jQuery and $ identifiers, even in
-// AMD (#7102#comment:10, https://github.com/jquery/jquery/pull/557)
-// and CommonJS for browser emulators (#13566)
-if ( !noGlobal ) {
-	window.jQuery = window.$ = jQuery;
-}
-
-return jQuery;
-}));
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/libraries/jquery-2.2.4.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/libraries/jquery-2.2.4.js
deleted file mode 100644
index 5c3c456..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/libraries/jquery-2.2.4.js
+++ /dev/null
@@ -1,9814 +0,0 @@
-/*!
- * jQuery JavaScript Library v2.2.4
- * http://jquery.com/
- *
- * Includes Sizzle.js
- * http://sizzlejs.com/
- *
- * Copyright jQuery Foundation and other contributors
- * Released under the MIT license
- * http://jquery.org/license
- *
- * Date: 2016-05-20T17:23Z
- */
-
-(function( global, factory ) {
-
-	if ( typeof module === "object" && typeof module.exports === "object" ) {
-		// For CommonJS and CommonJS-like environments where a proper `window`
-		// is present, execute the factory and get jQuery.
-		// For environments that do not have a `window` with a `document`
-		// (such as Node.js), expose a factory as module.exports.
-		// This accentuates the need for the creation of a real `window`.
-		// e.g. var jQuery = require("jquery")(window);
-		// See ticket #14549 for more info.
-		module.exports = global.document ?
-			factory( global, true ) :
-			function( w ) {
-				if ( !w.document ) {
-					throw new Error( "jQuery requires a window with a document" );
-				}
-				return factory( w );
-			};
-	} else {
-		factory( global );
-	}
-
-// Pass this if window is not defined yet
-}(typeof window !== "undefined" ? window : this, function( window, noGlobal ) {
-
-// Support: Firefox 18+
-// Can't be in strict mode, several libs including ASP.NET trace
-// the stack via arguments.caller.callee and Firefox dies if
-// you try to trace through "use strict" call chains. (#13335)
-//"use strict";
-var arr = [];
-
-var document = window.document;
-
-var slice = arr.slice;
-
-var concat = arr.concat;
-
-var push = arr.push;
-
-var indexOf = arr.indexOf;
-
-var class2type = {};
-
-var toString = class2type.toString;
-
-var hasOwn = class2type.hasOwnProperty;
-
-var support = {};
-
-
-
-var
-	version = "2.2.4",
-
-	// Define a local copy of jQuery
-	jQuery = function( selector, context ) {
-
-		// The jQuery object is actually just the init constructor 'enhanced'
-		// Need init if jQuery is called (just allow error to be thrown if not included)
-		return new jQuery.fn.init( selector, context );
-	},
-
-	// Support: Android<4.1
-	// Make sure we trim BOM and NBSP
-	rtrim = /^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,
-
-	// Matches dashed string for camelizing
-	rmsPrefix = /^-ms-/,
-	rdashAlpha = /-([\da-z])/gi,
-
-	// Used by jQuery.camelCase as callback to replace()
-	fcamelCase = function( all, letter ) {
-		return letter.toUpperCase();
-	};
-
-jQuery.fn = jQuery.prototype = {
-
-	// The current version of jQuery being used
-	jquery: version,
-
-	constructor: jQuery,
-
-	// Start with an empty selector
-	selector: "",
-
-	// The default length of a jQuery object is 0
-	length: 0,
-
-	toArray: function() {
-		return slice.call( this );
-	},
-
-	// Get the Nth element in the matched element set OR
-	// Get the whole matched element set as a clean array
-	get: function( num ) {
-		return num != null ?
-
-			// Return just the one element from the set
-			( num < 0 ? this[ num + this.length ] : this[ num ] ) :
-
-			// Return all the elements in a clean array
-			slice.call( this );
-	},
-
-	// Take an array of elements and push it onto the stack
-	// (returning the new matched element set)
-	pushStack: function( elems ) {
-
-		// Build a new jQuery matched element set
-		var ret = jQuery.merge( this.constructor(), elems );
-
-		// Add the old object onto the stack (as a reference)
-		ret.prevObject = this;
-		ret.context = this.context;
-
-		// Return the newly-formed element set
-		return ret;
-	},
-
-	// Execute a callback for every element in the matched set.
-	each: function( callback ) {
-		return jQuery.each( this, callback );
-	},
-
-	map: function( callback ) {
-		return this.pushStack( jQuery.map( this, function( elem, i ) {
-			return callback.call( elem, i, elem );
-		} ) );
-	},
-
-	slice: function() {
-		return this.pushStack( slice.apply( this, arguments ) );
-	},
-
-	first: function() {
-		return this.eq( 0 );
-	},
-
-	last: function() {
-		return this.eq( -1 );
-	},
-
-	eq: function( i ) {
-		var len = this.length,
-			j = +i + ( i < 0 ? len : 0 );
-		return this.pushStack( j >= 0 && j < len ? [ this[ j ] ] : [] );
-	},
-
-	end: function() {
-		return this.prevObject || this.constructor();
-	},
-
-	// For internal use only.
-	// Behaves like an Array's method, not like a jQuery method.
-	push: push,
-	sort: arr.sort,
-	splice: arr.splice
-};
-
-jQuery.extend = jQuery.fn.extend = function() {
-	var options, name, src, copy, copyIsArray, clone,
-		target = arguments[ 0 ] || {},
-		i = 1,
-		length = arguments.length,
-		deep = false;
-
-	// Handle a deep copy situation
-	if ( typeof target === "boolean" ) {
-		deep = target;
-
-		// Skip the boolean and the target
-		target = arguments[ i ] || {};
-		i++;
-	}
-
-	// Handle case when target is a string or something (possible in deep copy)
-	if ( typeof target !== "object" && !jQuery.isFunction( target ) ) {
-		target = {};
-	}
-
-	// Extend jQuery itself if only one argument is passed
-	if ( i === length ) {
-		target = this;
-		i--;
-	}
-
-	for ( ; i < length; i++ ) {
-
-		// Only deal with non-null/undefined values
-		if ( ( options = arguments[ i ] ) != null ) {
-
-			// Extend the base object
-			for ( name in options ) {
-				src = target[ name ];
-				copy = options[ name ];
-
-				// Prevent never-ending loop
-				if ( target === copy ) {
-					continue;
-				}
-
-				// Recurse if we're merging plain objects or arrays
-				if ( deep && copy && ( jQuery.isPlainObject( copy ) ||
-					( copyIsArray = jQuery.isArray( copy ) ) ) ) {
-
-					if ( copyIsArray ) {
-						copyIsArray = false;
-						clone = src && jQuery.isArray( src ) ? src : [];
-
-					} else {
-						clone = src && jQuery.isPlainObject( src ) ? src : {};
-					}
-
-					// Never move original objects, clone them
-					target[ name ] = jQuery.extend( deep, clone, copy );
-
-				// Don't bring in undefined values
-				} else if ( copy !== undefined ) {
-					target[ name ] = copy;
-				}
-			}
-		}
-	}
-
-	// Return the modified object
-	return target;
-};
-
-jQuery.extend( {
-
-	// Unique for each copy of jQuery on the page
-	expando: "jQuery" + ( version + Math.random() ).replace( /\D/g, "" ),
-
-	// Assume jQuery is ready without the ready module
-	isReady: true,
-
-	error: function( msg ) {
-		throw new Error( msg );
-	},
-
-	noop: function() {},
-
-	isFunction: function( obj ) {
-		return jQuery.type( obj ) === "function";
-	},
-
-	isArray: Array.isArray,
-
-	isWindow: function( obj ) {
-		return obj != null && obj === obj.window;
-	},
-
-	isNumeric: function( obj ) {
-
-		// parseFloat NaNs numeric-cast false positives (null|true|false|"")
-		// ...but misinterprets leading-number strings, particularly hex literals ("0x...")
-		// subtraction forces infinities to NaN
-		// adding 1 corrects loss of precision from parseFloat (#15100)
-		var realStringObj = obj && obj.toString();
-		return !jQuery.isArray( obj ) && ( realStringObj - parseFloat( realStringObj ) + 1 ) >= 0;
-	},
-
-	isPlainObject: function( obj ) {
-		var key;
-
-		// Not plain objects:
-		// - Any object or value whose internal [[Class]] property is not "[object Object]"
-		// - DOM nodes
-		// - window
-		if ( jQuery.type( obj ) !== "object" || obj.nodeType || jQuery.isWindow( obj ) ) {
-			return false;
-		}
-
-		// Not own constructor property must be Object
-		if ( obj.constructor &&
-				!hasOwn.call( obj, "constructor" ) &&
-				!hasOwn.call( obj.constructor.prototype || {}, "isPrototypeOf" ) ) {
-			return false;
-		}
-
-		// Own properties are enumerated firstly, so to speed up,
-		// if last one is own, then all properties are own
-		for ( key in obj ) {}
-
-		return key === undefined || hasOwn.call( obj, key );
-	},
-
-	isEmptyObject: function( obj ) {
-		var name;
-		for ( name in obj ) {
-			return false;
-		}
-		return true;
-	},
-
-	type: function( obj ) {
-		if ( obj == null ) {
-			return obj + "";
-		}
-
-		// Support: Android<4.0, iOS<6 (functionish RegExp)
-		return typeof obj === "object" || typeof obj === "function" ?
-			class2type[ toString.call( obj ) ] || "object" :
-			typeof obj;
-	},
-
-	// Evaluates a script in a global context
-	globalEval: function( code ) {
-		var script,
-			indirect = eval;
-
-		code = jQuery.trim( code );
-
-		if ( code ) {
-
-			// If the code includes a valid, prologue position
-			// strict mode pragma, execute code by injecting a
-			// script tag into the document.
-			if ( code.indexOf( "use strict" ) === 1 ) {
-				script = document.createElement( "script" );
-				script.text = code;
-				document.head.appendChild( script ).parentNode.removeChild( script );
-			} else {
-
-				// Otherwise, avoid the DOM node creation, insertion
-				// and removal by using an indirect global eval
-
-				indirect( code );
-			}
-		}
-	},
-
-	// Convert dashed to camelCase; used by the css and data modules
-	// Support: IE9-11+
-	// Microsoft forgot to hump their vendor prefix (#9572)
-	camelCase: function( string ) {
-		return string.replace( rmsPrefix, "ms-" ).replace( rdashAlpha, fcamelCase );
-	},
-
-	nodeName: function( elem, name ) {
-		return elem.nodeName && elem.nodeName.toLowerCase() === name.toLowerCase();
-	},
-
-	each: function( obj, callback ) {
-		var length, i = 0;
-
-		if ( isArrayLike( obj ) ) {
-			length = obj.length;
-			for ( ; i < length; i++ ) {
-				if ( callback.call( obj[ i ], i, obj[ i ] ) === false ) {
-					break;
-				}
-			}
-		} else {
-			for ( i in obj ) {
-				if ( callback.call( obj[ i ], i, obj[ i ] ) === false ) {
-					break;
-				}
-			}
-		}
-
-		return obj;
-	},
-
-	// Support: Android<4.1
-	trim: function( text ) {
-		return text == null ?
-			"" :
-			( text + "" ).replace( rtrim, "" );
-	},
-
-	// results is for internal usage only
-	makeArray: function( arr, results ) {
-		var ret = results || [];
-
-		if ( arr != null ) {
-			if ( isArrayLike( Object( arr ) ) ) {
-				jQuery.merge( ret,
-					typeof arr === "string" ?
-					[ arr ] : arr
-				);
-			} else {
-				push.call( ret, arr );
-			}
-		}
-
-		return ret;
-	},
-
-	inArray: function( elem, arr, i ) {
-		return arr == null ? -1 : indexOf.call( arr, elem, i );
-	},
-
-	merge: function( first, second ) {
-		var len = +second.length,
-			j = 0,
-			i = first.length;
-
-		for ( ; j < len; j++ ) {
-			first[ i++ ] = second[ j ];
-		}
-
-		first.length = i;
-
-		return first;
-	},
-
-	grep: function( elems, callback, invert ) {
-		var callbackInverse,
-			matches = [],
-			i = 0,
-			length = elems.length,
-			callbackExpect = !invert;
-
-		// Go through the array, only saving the items
-		// that pass the validator function
-		for ( ; i < length; i++ ) {
-			callbackInverse = !callback( elems[ i ], i );
-			if ( callbackInverse !== callbackExpect ) {
-				matches.push( elems[ i ] );
-			}
-		}
-
-		return matches;
-	},
-
-	// arg is for internal usage only
-	map: function( elems, callback, arg ) {
-		var length, value,
-			i = 0,
-			ret = [];
-
-		// Go through the array, translating each of the items to their new values
-		if ( isArrayLike( elems ) ) {
-			length = elems.length;
-			for ( ; i < length; i++ ) {
-				value = callback( elems[ i ], i, arg );
-
-				if ( value != null ) {
-					ret.push( value );
-				}
-			}
-
-		// Go through every key on the object,
-		} else {
-			for ( i in elems ) {
-				value = callback( elems[ i ], i, arg );
-
-				if ( value != null ) {
-					ret.push( value );
-				}
-			}
-		}
-
-		// Flatten any nested arrays
-		return concat.apply( [], ret );
-	},
-
-	// A global GUID counter for objects
-	guid: 1,
-
-	// Bind a function to a context, optionally partially applying any
-	// arguments.
-	proxy: function( fn, context ) {
-		var tmp, args, proxy;
-
-		if ( typeof context === "string" ) {
-			tmp = fn[ context ];
-			context = fn;
-			fn = tmp;
-		}
-
-		// Quick check to determine if target is callable, in the spec
-		// this throws a TypeError, but we will just return undefined.
-		if ( !jQuery.isFunction( fn ) ) {
-			return undefined;
-		}
-
-		// Simulated bind
-		args = slice.call( arguments, 2 );
-		proxy = function() {
-			return fn.apply( context || this, args.concat( slice.call( arguments ) ) );
-		};
-
-		// Set the guid of unique handler to the same of original handler, so it can be removed
-		proxy.guid = fn.guid = fn.guid || jQuery.guid++;
-
-		return proxy;
-	},
-
-	now: Date.now,
-
-	// jQuery.support is not used in Core but other projects attach their
-	// properties to it so it needs to exist.
-	support: support
-} );
-
-// JSHint would error on this code due to the Symbol not being defined in ES5.
-// Defining this global in .jshintrc would create a danger of using the global
-// unguarded in another place, it seems safer to just disable JSHint for these
-// three lines.
-/* jshint ignore: start */
-if ( typeof Symbol === "function" ) {
-	jQuery.fn[ Symbol.iterator ] = arr[ Symbol.iterator ];
-}
-/* jshint ignore: end */
-
-// Populate the class2type map
-jQuery.each( "Boolean Number String Function Array Date RegExp Object Error Symbol".split( " " ),
-function( i, name ) {
-	class2type[ "[object " + name + "]" ] = name.toLowerCase();
-} );
-
-function isArrayLike( obj ) {
-
-	// Support: iOS 8.2 (not reproducible in simulator)
-	// `in` check used to prevent JIT error (gh-2145)
-	// hasOwn isn't used here due to false negatives
-	// regarding Nodelist length in IE
-	var length = !!obj && "length" in obj && obj.length,
-		type = jQuery.type( obj );
-
-	if ( type === "function" || jQuery.isWindow( obj ) ) {
-		return false;
-	}
-
-	return type === "array" || length === 0 ||
-		typeof length === "number" && length > 0 && ( length - 1 ) in obj;
-}
-var Sizzle =
-/*!
- * Sizzle CSS Selector Engine v2.2.1
- * http://sizzlejs.com/
- *
- * Copyright jQuery Foundation and other contributors
- * Released under the MIT license
- * http://jquery.org/license
- *
- * Date: 2015-10-17
- */
-(function( window ) {
-
-var i,
-	support,
-	Expr,
-	getText,
-	isXML,
-	tokenize,
-	compile,
-	select,
-	outermostContext,
-	sortInput,
-	hasDuplicate,
-
-	// Local document vars
-	setDocument,
-	document,
-	docElem,
-	documentIsHTML,
-	rbuggyQSA,
-	rbuggyMatches,
-	matches,
-	contains,
-
-	// Instance-specific data
-	expando = "sizzle" + 1 * new Date(),
-	preferredDoc = window.document,
-	dirruns = 0,
-	done = 0,
-	classCache = createCache(),
-	tokenCache = createCache(),
-	compilerCache = createCache(),
-	sortOrder = function( a, b ) {
-		if ( a === b ) {
-			hasDuplicate = true;
-		}
-		return 0;
-	},
-
-	// General-purpose constants
-	MAX_NEGATIVE = 1 << 31,
-
-	// Instance methods
-	hasOwn = ({}).hasOwnProperty,
-	arr = [],
-	pop = arr.pop,
-	push_native = arr.push,
-	push = arr.push,
-	slice = arr.slice,
-	// Use a stripped-down indexOf as it's faster than native
-	// http://jsperf.com/thor-indexof-vs-for/5
-	indexOf = function( list, elem ) {
-		var i = 0,
-			len = list.length;
-		for ( ; i < len; i++ ) {
-			if ( list[i] === elem ) {
-				return i;
-			}
-		}
-		return -1;
-	},
-
-	booleans = "checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped",
-
-	// Regular expressions
-
-	// http://www.w3.org/TR/css3-selectors/#whitespace
-	whitespace = "[\\x20\\t\\r\\n\\f]",
-
-	// http://www.w3.org/TR/CSS21/syndata.html#value-def-identifier
-	identifier = "(?:\\\\.|[\\w-]|[^\\x00-\\xa0])+",
-
-	// Attribute selectors: http://www.w3.org/TR/selectors/#attribute-selectors
-	attributes = "\\[" + whitespace + "*(" + identifier + ")(?:" + whitespace +
-		// Operator (capture 2)
-		"*([*^$|!~]?=)" + whitespace +
-		// "Attribute values must be CSS identifiers [capture 5] or strings [capture 3 or capture 4]"
-		"*(?:'((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\"|(" + identifier + "))|)" + whitespace +
-		"*\\]",
-
-	pseudos = ":(" + identifier + ")(?:\\((" +
-		// To reduce the number of selectors needing tokenize in the preFilter, prefer arguments:
-		// 1. quoted (capture 3; capture 4 or capture 5)
-		"('((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\")|" +
-		// 2. simple (capture 6)
-		"((?:\\\\.|[^\\\\()[\\]]|" + attributes + ")*)|" +
-		// 3. anything else (capture 2)
-		".*" +
-		")\\)|)",
-
-	// Leading and non-escaped trailing whitespace, capturing some non-whitespace characters preceding the latter
-	rwhitespace = new RegExp( whitespace + "+", "g" ),
-	rtrim = new RegExp( "^" + whitespace + "+|((?:^|[^\\\\])(?:\\\\.)*)" + whitespace + "+$", "g" ),
-
-	rcomma = new RegExp( "^" + whitespace + "*," + whitespace + "*" ),
-	rcombinators = new RegExp( "^" + whitespace + "*([>+~]|" + whitespace + ")" + whitespace + "*" ),
-
-	rattributeQuotes = new RegExp( "=" + whitespace + "*([^\\]'\"]*?)" + whitespace + "*\\]", "g" ),
-
-	rpseudo = new RegExp( pseudos ),
-	ridentifier = new RegExp( "^" + identifier + "$" ),
-
-	matchExpr = {
-		"ID": new RegExp( "^#(" + identifier + ")" ),
-		"CLASS": new RegExp( "^\\.(" + identifier + ")" ),
-		"TAG": new RegExp( "^(" + identifier + "|[*])" ),
-		"ATTR": new RegExp( "^" + attributes ),
-		"PSEUDO": new RegExp( "^" + pseudos ),
-		"CHILD": new RegExp( "^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\(" + whitespace +
-			"*(even|odd|(([+-]|)(\\d*)n|)" + whitespace + "*(?:([+-]|)" + whitespace +
-			"*(\\d+)|))" + whitespace + "*\\)|)", "i" ),
-		"bool": new RegExp( "^(?:" + booleans + ")$", "i" ),
-		// For use in libraries implementing .is()
-		// We use this for POS matching in `select`
-		"needsContext": new RegExp( "^" + whitespace + "*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\(" +
-			whitespace + "*((?:-\\d)?\\d*)" + whitespace + "*\\)|)(?=[^-]|$)", "i" )
-	},
-
-	rinputs = /^(?:input|select|textarea|button)$/i,
-	rheader = /^h\d$/i,
-
-	rnative = /^[^{]+\{\s*\[native \w/,
-
-	// Easily-parseable/retrievable ID or TAG or CLASS selectors
-	rquickExpr = /^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,
-
-	rsibling = /[+~]/,
-	rescape = /'|\\/g,
-
-	// CSS escapes http://www.w3.org/TR/CSS21/syndata.html#escaped-characters
-	runescape = new RegExp( "\\\\([\\da-f]{1,6}" + whitespace + "?|(" + whitespace + ")|.)", "ig" ),
-	funescape = function( _, escaped, escapedWhitespace ) {
-		var high = "0x" + escaped - 0x10000;
-		// NaN means non-codepoint
-		// Support: Firefox<24
-		// Workaround erroneous numeric interpretation of +"0x"
-		return high !== high || escapedWhitespace ?
-			escaped :
-			high < 0 ?
-				// BMP codepoint
-				String.fromCharCode( high + 0x10000 ) :
-				// Supplemental Plane codepoint (surrogate pair)
-				String.fromCharCode( high >> 10 | 0xD800, high & 0x3FF | 0xDC00 );
-	},
-
-	// Used for iframes
-	// See setDocument()
-	// Removing the function wrapper causes a "Permission Denied"
-	// error in IE
-	unloadHandler = function() {
-		setDocument();
-	};
-
-// Optimize for push.apply( _, NodeList )
-try {
-	push.apply(
-		(arr = slice.call( preferredDoc.childNodes )),
-		preferredDoc.childNodes
-	);
-	// Support: Android<4.0
-	// Detect silently failing push.apply
-	arr[ preferredDoc.childNodes.length ].nodeType;
-} catch ( e ) {
-	push = { apply: arr.length ?
-
-		// Leverage slice if possible
-		function( target, els ) {
-			push_native.apply( target, slice.call(els) );
-		} :
-
-		// Support: IE<9
-		// Otherwise append directly
-		function( target, els ) {
-			var j = target.length,
-				i = 0;
-			// Can't trust NodeList.length
-			while ( (target[j++] = els[i++]) ) {}
-			target.length = j - 1;
-		}
-	};
-}
-
-function Sizzle( selector, context, results, seed ) {
-	var m, i, elem, nid, nidselect, match, groups, newSelector,
-		newContext = context && context.ownerDocument,
-
-		// nodeType defaults to 9, since context defaults to document
-		nodeType = context ? context.nodeType : 9;
-
-	results = results || [];
-
-	// Return early from calls with invalid selector or context
-	if ( typeof selector !== "string" || !selector ||
-		nodeType !== 1 && nodeType !== 9 && nodeType !== 11 ) {
-
-		return results;
-	}
-
-	// Try to shortcut find operations (as opposed to filters) in HTML documents
-	if ( !seed ) {
-
-		if ( ( context ? context.ownerDocument || context : preferredDoc ) !== document ) {
-			setDocument( context );
-		}
-		context = context || document;
-
-		if ( documentIsHTML ) {
-
-			// If the selector is sufficiently simple, try using a "get*By*" DOM method
-			// (excepting DocumentFragment context, where the methods don't exist)
-			if ( nodeType !== 11 && (match = rquickExpr.exec( selector )) ) {
-
-				// ID selector
-				if ( (m = match[1]) ) {
-
-					// Document context
-					if ( nodeType === 9 ) {
-						if ( (elem = context.getElementById( m )) ) {
-
-							// Support: IE, Opera, Webkit
-							// TODO: identify versions
-							// getElementById can match elements by name instead of ID
-							if ( elem.id === m ) {
-								results.push( elem );
-								return results;
-							}
-						} else {
-							return results;
-						}
-
-					// Element context
-					} else {
-
-						// Support: IE, Opera, Webkit
-						// TODO: identify versions
-						// getElementById can match elements by name instead of ID
-						if ( newContext && (elem = newContext.getElementById( m )) &&
-							contains( context, elem ) &&
-							elem.id === m ) {
-
-							results.push( elem );
-							return results;
-						}
-					}
-
-				// Type selector
-				} else if ( match[2] ) {
-					push.apply( results, context.getElementsByTagName( selector ) );
-					return results;
-
-				// Class selector
-				} else if ( (m = match[3]) && support.getElementsByClassName &&
-					context.getElementsByClassName ) {
-
-					push.apply( results, context.getElementsByClassName( m ) );
-					return results;
-				}
-			}
-
-			// Take advantage of querySelectorAll
-			if ( support.qsa &&
-				!compilerCache[ selector + " " ] &&
-				(!rbuggyQSA || !rbuggyQSA.test( selector )) ) {
-
-				if ( nodeType !== 1 ) {
-					newContext = context;
-					newSelector = selector;
-
-				// qSA looks outside Element context, which is not what we want
-				// Thanks to Andrew Dupont for this workaround technique
-				// Support: IE <=8
-				// Exclude object elements
-				} else if ( context.nodeName.toLowerCase() !== "object" ) {
-
-					// Capture the context ID, setting it first if necessary
-					if ( (nid = context.getAttribute( "id" )) ) {
-						nid = nid.replace( rescape, "\\$&" );
-					} else {
-						context.setAttribute( "id", (nid = expando) );
-					}
-
-					// Prefix every selector in the list
-					groups = tokenize( selector );
-					i = groups.length;
-					nidselect = ridentifier.test( nid ) ? "#" + nid : "[id='" + nid + "']";
-					while ( i-- ) {
-						groups[i] = nidselect + " " + toSelector( groups[i] );
-					}
-					newSelector = groups.join( "," );
-
-					// Expand context for sibling selectors
-					newContext = rsibling.test( selector ) && testContext( context.parentNode ) ||
-						context;
-				}
-
-				if ( newSelector ) {
-					try {
-						push.apply( results,
-							newContext.querySelectorAll( newSelector )
-						);
-						return results;
-					} catch ( qsaError ) {
-					} finally {
-						if ( nid === expando ) {
-							context.removeAttribute( "id" );
-						}
-					}
-				}
-			}
-		}
-	}
-
-	// All others
-	return select( selector.replace( rtrim, "$1" ), context, results, seed );
-}
-
-/**
- * Create key-value caches of limited size
- * @returns {function(string, object)} Returns the Object data after storing it on itself with
- *	property name the (space-suffixed) string and (if the cache is larger than Expr.cacheLength)
- *	deleting the oldest entry
- */
-function createCache() {
-	var keys = [];
-
-	function cache( key, value ) {
-		// Use (key + " ") to avoid collision with native prototype properties (see Issue #157)
-		if ( keys.push( key + " " ) > Expr.cacheLength ) {
-			// Only keep the most recent entries
-			delete cache[ keys.shift() ];
-		}
-		return (cache[ key + " " ] = value);
-	}
-	return cache;
-}
-
-/**
- * Mark a function for special use by Sizzle
- * @param {Function} fn The function to mark
- */
-function markFunction( fn ) {
-	fn[ expando ] = true;
-	return fn;
-}
-
-/**
- * Support testing using an element
- * @param {Function} fn Passed the created div and expects a boolean result
- */
-function assert( fn ) {
-	var div = document.createElement("div");
-
-	try {
-		return !!fn( div );
-	} catch (e) {
-		return false;
-	} finally {
-		// Remove from its parent by default
-		if ( div.parentNode ) {
-			div.parentNode.removeChild( div );
-		}
-		// release memory in IE
-		div = null;
-	}
-}
-
-/**
- * Adds the same handler for all of the specified attrs
- * @param {String} attrs Pipe-separated list of attributes
- * @param {Function} handler The method that will be applied
- */
-function addHandle( attrs, handler ) {
-	var arr = attrs.split("|"),
-		i = arr.length;
-
-	while ( i-- ) {
-		Expr.attrHandle[ arr[i] ] = handler;
-	}
-}
-
-/**
- * Checks document order of two siblings
- * @param {Element} a
- * @param {Element} b
- * @returns {Number} Returns less than 0 if a precedes b, greater than 0 if a follows b
- */
-function siblingCheck( a, b ) {
-	var cur = b && a,
-		diff = cur && a.nodeType === 1 && b.nodeType === 1 &&
-			( ~b.sourceIndex || MAX_NEGATIVE ) -
-			( ~a.sourceIndex || MAX_NEGATIVE );
-
-	// Use IE sourceIndex if available on both nodes
-	if ( diff ) {
-		return diff;
-	}
-
-	// Check if b follows a
-	if ( cur ) {
-		while ( (cur = cur.nextSibling) ) {
-			if ( cur === b ) {
-				return -1;
-			}
-		}
-	}
-
-	return a ? 1 : -1;
-}
-
-/**
- * Returns a function to use in pseudos for input types
- * @param {String} type
- */
-function createInputPseudo( type ) {
-	return function( elem ) {
-		var name = elem.nodeName.toLowerCase();
-		return name === "input" && elem.type === type;
-	};
-}
-
-/**
- * Returns a function to use in pseudos for buttons
- * @param {String} type
- */
-function createButtonPseudo( type ) {
-	return function( elem ) {
-		var name = elem.nodeName.toLowerCase();
-		return (name === "input" || name === "button") && elem.type === type;
-	};
-}
-
-/**
- * Returns a function to use in pseudos for positionals
- * @param {Function} fn
- */
-function createPositionalPseudo( fn ) {
-	return markFunction(function( argument ) {
-		argument = +argument;
-		return markFunction(function( seed, matches ) {
-			var j,
-				matchIndexes = fn( [], seed.length, argument ),
-				i = matchIndexes.length;
-
-			// Match elements found at the specified indexes
-			while ( i-- ) {
-				if ( seed[ (j = matchIndexes[i]) ] ) {
-					seed[j] = !(matches[j] = seed[j]);
-				}
-			}
-		});
-	});
-}
-
-/**
- * Checks a node for validity as a Sizzle context
- * @param {Element|Object=} context
- * @returns {Element|Object|Boolean} The input node if acceptable, otherwise a falsy value
- */
-function testContext( context ) {
-	return context && typeof context.getElementsByTagName !== "undefined" && context;
-}
-
-// Expose support vars for convenience
-support = Sizzle.support = {};
-
-/**
- * Detects XML nodes
- * @param {Element|Object} elem An element or a document
- * @returns {Boolean} True iff elem is a non-HTML XML node
- */
-isXML = Sizzle.isXML = function( elem ) {
-	// documentElement is verified for cases where it doesn't yet exist
-	// (such as loading iframes in IE - #4833)
-	var documentElement = elem && (elem.ownerDocument || elem).documentElement;
-	return documentElement ? documentElement.nodeName !== "HTML" : false;
-};
-
-/**
- * Sets document-related variables once based on the current document
- * @param {Element|Object} [doc] An element or document object to use to set the document
- * @returns {Object} Returns the current document
- */
-setDocument = Sizzle.setDocument = function( node ) {
-	var hasCompare, parent,
-		doc = node ? node.ownerDocument || node : preferredDoc;
-
-	// Return early if doc is invalid or already selected
-	if ( doc === document || doc.nodeType !== 9 || !doc.documentElement ) {
-		return document;
-	}
-
-	// Update global variables
-	document = doc;
-	docElem = document.documentElement;
-	documentIsHTML = !isXML( document );
-
-	// Support: IE 9-11, Edge
-	// Accessing iframe documents after unload throws "permission denied" errors (jQuery #13936)
-	if ( (parent = document.defaultView) && parent.top !== parent ) {
-		// Support: IE 11
-		if ( parent.addEventListener ) {
-			parent.addEventListener( "unload", unloadHandler, false );
-
-		// Support: IE 9 - 10 only
-		} else if ( parent.attachEvent ) {
-			parent.attachEvent( "onunload", unloadHandler );
-		}
-	}
-
-	/* Attributes
-	---------------------------------------------------------------------- */
-
-	// Support: IE<8
-	// Verify that getAttribute really returns attributes and not properties
-	// (excepting IE8 booleans)
-	support.attributes = assert(function( div ) {
-		div.className = "i";
-		return !div.getAttribute("className");
-	});
-
-	/* getElement(s)By*
-	---------------------------------------------------------------------- */
-
-	// Check if getElementsByTagName("*") returns only elements
-	support.getElementsByTagName = assert(function( div ) {
-		div.appendChild( document.createComment("") );
-		return !div.getElementsByTagName("*").length;
-	});
-
-	// Support: IE<9
-	support.getElementsByClassName = rnative.test( document.getElementsByClassName );
-
-	// Support: IE<10
-	// Check if getElementById returns elements by name
-	// The broken getElementById methods don't pick up programatically-set names,
-	// so use a roundabout getElementsByName test
-	support.getById = assert(function( div ) {
-		docElem.appendChild( div ).id = expando;
-		return !document.getElementsByName || !document.getElementsByName( expando ).length;
-	});
-
-	// ID find and filter
-	if ( support.getById ) {
-		Expr.find["ID"] = function( id, context ) {
-			if ( typeof context.getElementById !== "undefined" && documentIsHTML ) {
-				var m = context.getElementById( id );
-				return m ? [ m ] : [];
-			}
-		};
-		Expr.filter["ID"] = function( id ) {
-			var attrId = id.replace( runescape, funescape );
-			return function( elem ) {
-				return elem.getAttribute("id") === attrId;
-			};
-		};
-	} else {
-		// Support: IE6/7
-		// getElementById is not reliable as a find shortcut
-		delete Expr.find["ID"];
-
-		Expr.filter["ID"] =  function( id ) {
-			var attrId = id.replace( runescape, funescape );
-			return function( elem ) {
-				var node = typeof elem.getAttributeNode !== "undefined" &&
-					elem.getAttributeNode("id");
-				return node && node.value === attrId;
-			};
-		};
-	}
-
-	// Tag
-	Expr.find["TAG"] = support.getElementsByTagName ?
-		function( tag, context ) {
-			if ( typeof context.getElementsByTagName !== "undefined" ) {
-				return context.getElementsByTagName( tag );
-
-			// DocumentFragment nodes don't have gEBTN
-			} else if ( support.qsa ) {
-				return context.querySelectorAll( tag );
-			}
-		} :
-
-		function( tag, context ) {
-			var elem,
-				tmp = [],
-				i = 0,
-				// By happy coincidence, a (broken) gEBTN appears on DocumentFragment nodes too
-				results = context.getElementsByTagName( tag );
-
-			// Filter out possible comments
-			if ( tag === "*" ) {
-				while ( (elem = results[i++]) ) {
-					if ( elem.nodeType === 1 ) {
-						tmp.push( elem );
-					}
-				}
-
-				return tmp;
-			}
-			return results;
-		};
-
-	// Class
-	Expr.find["CLASS"] = support.getElementsByClassName && function( className, context ) {
-		if ( typeof context.getElementsByClassName !== "undefined" && documentIsHTML ) {
-			return context.getElementsByClassName( className );
-		}
-	};
-
-	/* QSA/matchesSelector
-	---------------------------------------------------------------------- */
-
-	// QSA and matchesSelector support
-
-	// matchesSelector(:active) reports false when true (IE9/Opera 11.5)
-	rbuggyMatches = [];
-
-	// qSa(:focus) reports false when true (Chrome 21)
-	// We allow this because of a bug in IE8/9 that throws an error
-	// whenever `document.activeElement` is accessed on an iframe
-	// So, we allow :focus to pass through QSA all the time to avoid the IE error
-	// See http://bugs.jquery.com/ticket/13378
-	rbuggyQSA = [];
-
-	if ( (support.qsa = rnative.test( document.querySelectorAll )) ) {
-		// Build QSA regex
-		// Regex strategy adopted from Diego Perini
-		assert(function( div ) {
-			// Select is set to empty string on purpose
-			// This is to test IE's treatment of not explicitly
-			// setting a boolean content attribute,
-			// since its presence should be enough
-			// http://bugs.jquery.com/ticket/12359
-			docElem.appendChild( div ).innerHTML = "<a id='" + expando + "'></a>" +
-				"<select id='" + expando + "-\r\\' msallowcapture=''>" +
-				"<option selected=''></option></select>";
-
-			// Support: IE8, Opera 11-12.16
-			// Nothing should be selected when empty strings follow ^= or $= or *=
-			// The test attribute must be unknown in Opera but "safe" for WinRT
-			// http://msdn.microsoft.com/en-us/library/ie/hh465388.aspx#attribute_section
-			if ( div.querySelectorAll("[msallowcapture^='']").length ) {
-				rbuggyQSA.push( "[*^$]=" + whitespace + "*(?:''|\"\")" );
-			}
-
-			// Support: IE8
-			// Boolean attributes and "value" are not treated correctly
-			if ( !div.querySelectorAll("[selected]").length ) {
-				rbuggyQSA.push( "\\[" + whitespace + "*(?:value|" + booleans + ")" );
-			}
-
-			// Support: Chrome<29, Android<4.4, Safari<7.0+, iOS<7.0+, PhantomJS<1.9.8+
-			if ( !div.querySelectorAll( "[id~=" + expando + "-]" ).length ) {
-				rbuggyQSA.push("~=");
-			}
-
-			// Webkit/Opera - :checked should return selected option elements
-			// http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked
-			// IE8 throws error here and will not see later tests
-			if ( !div.querySelectorAll(":checked").length ) {
-				rbuggyQSA.push(":checked");
-			}
-
-			// Support: Safari 8+, iOS 8+
-			// https://bugs.webkit.org/show_bug.cgi?id=136851
-			// In-page `selector#id sibing-combinator selector` fails
-			if ( !div.querySelectorAll( "a#" + expando + "+*" ).length ) {
-				rbuggyQSA.push(".#.+[+~]");
-			}
-		});
-
-		assert(function( div ) {
-			// Support: Windows 8 Native Apps
-			// The type and name attributes are restricted during .innerHTML assignment
-			var input = document.createElement("input");
-			input.setAttribute( "type", "hidden" );
-			div.appendChild( input ).setAttribute( "name", "D" );
-
-			// Support: IE8
-			// Enforce case-sensitivity of name attribute
-			if ( div.querySelectorAll("[name=d]").length ) {
-				rbuggyQSA.push( "name" + whitespace + "*[*^$|!~]?=" );
-			}
-
-			// FF 3.5 - :enabled/:disabled and hidden elements (hidden elements are still enabled)
-			// IE8 throws error here and will not see later tests
-			if ( !div.querySelectorAll(":enabled").length ) {
-				rbuggyQSA.push( ":enabled", ":disabled" );
-			}
-
-			// Opera 10-11 does not throw on post-comma invalid pseudos
-			div.querySelectorAll("*,:x");
-			rbuggyQSA.push(",.*:");
-		});
-	}
-
-	if ( (support.matchesSelector = rnative.test( (matches = docElem.matches ||
-		docElem.webkitMatchesSelector ||
-		docElem.mozMatchesSelector ||
-		docElem.oMatchesSelector ||
-		docElem.msMatchesSelector) )) ) {
-
-		assert(function( div ) {
-			// Check to see if it's possible to do matchesSelector
-			// on a disconnected node (IE 9)
-			support.disconnectedMatch = matches.call( div, "div" );
-
-			// This should fail with an exception
-			// Gecko does not error, returns false instead
-			matches.call( div, "[s!='']:x" );
-			rbuggyMatches.push( "!=", pseudos );
-		});
-	}
-
-	rbuggyQSA = rbuggyQSA.length && new RegExp( rbuggyQSA.join("|") );
-	rbuggyMatches = rbuggyMatches.length && new RegExp( rbuggyMatches.join("|") );
-
-	/* Contains
-	---------------------------------------------------------------------- */
-	hasCompare = rnative.test( docElem.compareDocumentPosition );
-
-	// Element contains another
-	// Purposefully self-exclusive
-	// As in, an element does not contain itself
-	contains = hasCompare || rnative.test( docElem.contains ) ?
-		function( a, b ) {
-			var adown = a.nodeType === 9 ? a.documentElement : a,
-				bup = b && b.parentNode;
-			return a === bup || !!( bup && bup.nodeType === 1 && (
-				adown.contains ?
-					adown.contains( bup ) :
-					a.compareDocumentPosition && a.compareDocumentPosition( bup ) & 16
-			));
-		} :
-		function( a, b ) {
-			if ( b ) {
-				while ( (b = b.parentNode) ) {
-					if ( b === a ) {
-						return true;
-					}
-				}
-			}
-			return false;
-		};
-
-	/* Sorting
-	---------------------------------------------------------------------- */
-
-	// Document order sorting
-	sortOrder = hasCompare ?
-	function( a, b ) {
-
-		// Flag for duplicate removal
-		if ( a === b ) {
-			hasDuplicate = true;
-			return 0;
-		}
-
-		// Sort on method existence if only one input has compareDocumentPosition
-		var compare = !a.compareDocumentPosition - !b.compareDocumentPosition;
-		if ( compare ) {
-			return compare;
-		}
-
-		// Calculate position if both inputs belong to the same document
-		compare = ( a.ownerDocument || a ) === ( b.ownerDocument || b ) ?
-			a.compareDocumentPosition( b ) :
-
-			// Otherwise we know they are disconnected
-			1;
-
-		// Disconnected nodes
-		if ( compare & 1 ||
-			(!support.sortDetached && b.compareDocumentPosition( a ) === compare) ) {
-
-			// Choose the first element that is related to our preferred document
-			if ( a === document || a.ownerDocument === preferredDoc && contains(preferredDoc, a) ) {
-				return -1;
-			}
-			if ( b === document || b.ownerDocument === preferredDoc && contains(preferredDoc, b) ) {
-				return 1;
-			}
-
-			// Maintain original order
-			return sortInput ?
-				( indexOf( sortInput, a ) - indexOf( sortInput, b ) ) :
-				0;
-		}
-
-		return compare & 4 ? -1 : 1;
-	} :
-	function( a, b ) {
-		// Exit early if the nodes are identical
-		if ( a === b ) {
-			hasDuplicate = true;
-			return 0;
-		}
-
-		var cur,
-			i = 0,
-			aup = a.parentNode,
-			bup = b.parentNode,
-			ap = [ a ],
-			bp = [ b ];
-
-		// Parentless nodes are either documents or disconnected
-		if ( !aup || !bup ) {
-			return a === document ? -1 :
-				b === document ? 1 :
-				aup ? -1 :
-				bup ? 1 :
-				sortInput ?
-				( indexOf( sortInput, a ) - indexOf( sortInput, b ) ) :
-				0;
-
-		// If the nodes are siblings, we can do a quick check
-		} else if ( aup === bup ) {
-			return siblingCheck( a, b );
-		}
-
-		// Otherwise we need full lists of their ancestors for comparison
-		cur = a;
-		while ( (cur = cur.parentNode) ) {
-			ap.unshift( cur );
-		}
-		cur = b;
-		while ( (cur = cur.parentNode) ) {
-			bp.unshift( cur );
-		}
-
-		// Walk down the tree looking for a discrepancy
-		while ( ap[i] === bp[i] ) {
-			i++;
-		}
-
-		return i ?
-			// Do a sibling check if the nodes have a common ancestor
-			siblingCheck( ap[i], bp[i] ) :
-
-			// Otherwise nodes in our document sort first
-			ap[i] === preferredDoc ? -1 :
-			bp[i] === preferredDoc ? 1 :
-			0;
-	};
-
-	return document;
-};
-
-Sizzle.matches = function( expr, elements ) {
-	return Sizzle( expr, null, null, elements );
-};
-
-Sizzle.matchesSelector = function( elem, expr ) {
-	// Set document vars if needed
-	if ( ( elem.ownerDocument || elem ) !== document ) {
-		setDocument( elem );
-	}
-
-	// Make sure that attribute selectors are quoted
-	expr = expr.replace( rattributeQuotes, "='$1']" );
-
-	if ( support.matchesSelector && documentIsHTML &&
-		!compilerCache[ expr + " " ] &&
-		( !rbuggyMatches || !rbuggyMatches.test( expr ) ) &&
-		( !rbuggyQSA     || !rbuggyQSA.test( expr ) ) ) {
-
-		try {
-			var ret = matches.call( elem, expr );
-
-			// IE 9's matchesSelector returns false on disconnected nodes
-			if ( ret || support.disconnectedMatch ||
-					// As well, disconnected nodes are said to be in a document
-					// fragment in IE 9
-					elem.document && elem.document.nodeType !== 11 ) {
-				return ret;
-			}
-		} catch (e) {}
-	}
-
-	return Sizzle( expr, document, null, [ elem ] ).length > 0;
-};
-
-Sizzle.contains = function( context, elem ) {
-	// Set document vars if needed
-	if ( ( context.ownerDocument || context ) !== document ) {
-		setDocument( context );
-	}
-	return contains( context, elem );
-};
-
-Sizzle.attr = function( elem, name ) {
-	// Set document vars if needed
-	if ( ( elem.ownerDocument || elem ) !== document ) {
-		setDocument( elem );
-	}
-
-	var fn = Expr.attrHandle[ name.toLowerCase() ],
-		// Don't get fooled by Object.prototype properties (jQuery #13807)
-		val = fn && hasOwn.call( Expr.attrHandle, name.toLowerCase() ) ?
-			fn( elem, name, !documentIsHTML ) :
-			undefined;
-
-	return val !== undefined ?
-		val :
-		support.attributes || !documentIsHTML ?
-			elem.getAttribute( name ) :
-			(val = elem.getAttributeNode(name)) && val.specified ?
-				val.value :
-				null;
-};
-
-Sizzle.error = function( msg ) {
-	throw new Error( "Syntax error, unrecognized expression: " + msg );
-};
-
-/**
- * Document sorting and removing duplicates
- * @param {ArrayLike} results
- */
-Sizzle.uniqueSort = function( results ) {
-	var elem,
-		duplicates = [],
-		j = 0,
-		i = 0;
-
-	// Unless we *know* we can detect duplicates, assume their presence
-	hasDuplicate = !support.detectDuplicates;
-	sortInput = !support.sortStable && results.slice( 0 );
-	results.sort( sortOrder );
-
-	if ( hasDuplicate ) {
-		while ( (elem = results[i++]) ) {
-			if ( elem === results[ i ] ) {
-				j = duplicates.push( i );
-			}
-		}
-		while ( j-- ) {
-			results.splice( duplicates[ j ], 1 );
-		}
-	}
-
-	// Clear input after sorting to release objects
-	// See https://github.com/jquery/sizzle/pull/225
-	sortInput = null;
-
-	return results;
-};
-
-/**
- * Utility function for retrieving the text value of an array of DOM nodes
- * @param {Array|Element} elem
- */
-getText = Sizzle.getText = function( elem ) {
-	var node,
-		ret = "",
-		i = 0,
-		nodeType = elem.nodeType;
-
-	if ( !nodeType ) {
-		// If no nodeType, this is expected to be an array
-		while ( (node = elem[i++]) ) {
-			// Do not traverse comment nodes
-			ret += getText( node );
-		}
-	} else if ( nodeType === 1 || nodeType === 9 || nodeType === 11 ) {
-		// Use textContent for elements
-		// innerText usage removed for consistency of new lines (jQuery #11153)
-		if ( typeof elem.textContent === "string" ) {
-			return elem.textContent;
-		} else {
-			// Traverse its children
-			for ( elem = elem.firstChild; elem; elem = elem.nextSibling ) {
-				ret += getText( elem );
-			}
-		}
-	} else if ( nodeType === 3 || nodeType === 4 ) {
-		return elem.nodeValue;
-	}
-	// Do not include comment or processing instruction nodes
-
-	return ret;
-};
-
-Expr = Sizzle.selectors = {
-
-	// Can be adjusted by the user
-	cacheLength: 50,
-
-	createPseudo: markFunction,
-
-	match: matchExpr,
-
-	attrHandle: {},
-
-	find: {},
-
-	relative: {
-		">": { dir: "parentNode", first: true },
-		" ": { dir: "parentNode" },
-		"+": { dir: "previousSibling", first: true },
-		"~": { dir: "previousSibling" }
-	},
-
-	preFilter: {
-		"ATTR": function( match ) {
-			match[1] = match[1].replace( runescape, funescape );
-
-			// Move the given value to match[3] whether quoted or unquoted
-			match[3] = ( match[3] || match[4] || match[5] || "" ).replace( runescape, funescape );
-
-			if ( match[2] === "~=" ) {
-				match[3] = " " + match[3] + " ";
-			}
-
-			return match.slice( 0, 4 );
-		},
-
-		"CHILD": function( match ) {
-			/* matches from matchExpr["CHILD"]
-				1 type (only|nth|...)
-				2 what (child|of-type)
-				3 argument (even|odd|\d*|\d*n([+-]\d+)?|...)
-				4 xn-component of xn+y argument ([+-]?\d*n|)
-				5 sign of xn-component
-				6 x of xn-component
-				7 sign of y-component
-				8 y of y-component
-			*/
-			match[1] = match[1].toLowerCase();
-
-			if ( match[1].slice( 0, 3 ) === "nth" ) {
-				// nth-* requires argument
-				if ( !match[3] ) {
-					Sizzle.error( match[0] );
-				}
-
-				// numeric x and y parameters for Expr.filter.CHILD
-				// remember that false/true cast respectively to 0/1
-				match[4] = +( match[4] ? match[5] + (match[6] || 1) : 2 * ( match[3] === "even" || match[3] === "odd" ) );
-				match[5] = +( ( match[7] + match[8] ) || match[3] === "odd" );
-
-			// other types prohibit arguments
-			} else if ( match[3] ) {
-				Sizzle.error( match[0] );
-			}
-
-			return match;
-		},
-
-		"PSEUDO": function( match ) {
-			var excess,
-				unquoted = !match[6] && match[2];
-
-			if ( matchExpr["CHILD"].test( match[0] ) ) {
-				return null;
-			}
-
-			// Accept quoted arguments as-is
-			if ( match[3] ) {
-				match[2] = match[4] || match[5] || "";
-
-			// Strip excess characters from unquoted arguments
-			} else if ( unquoted && rpseudo.test( unquoted ) &&
-				// Get excess from tokenize (recursively)
-				(excess = tokenize( unquoted, true )) &&
-				// advance to the next closing parenthesis
-				(excess = unquoted.indexOf( ")", unquoted.length - excess ) - unquoted.length) ) {
-
-				// excess is a negative index
-				match[0] = match[0].slice( 0, excess );
-				match[2] = unquoted.slice( 0, excess );
-			}
-
-			// Return only captures needed by the pseudo filter method (type and argument)
-			return match.slice( 0, 3 );
-		}
-	},
-
-	filter: {
-
-		"TAG": function( nodeNameSelector ) {
-			var nodeName = nodeNameSelector.replace( runescape, funescape ).toLowerCase();
-			return nodeNameSelector === "*" ?
-				function() { return true; } :
-				function( elem ) {
-					return elem.nodeName && elem.nodeName.toLowerCase() === nodeName;
-				};
-		},
-
-		"CLASS": function( className ) {
-			var pattern = classCache[ className + " " ];
-
-			return pattern ||
-				(pattern = new RegExp( "(^|" + whitespace + ")" + className + "(" + whitespace + "|$)" )) &&
-				classCache( className, function( elem ) {
-					return pattern.test( typeof elem.className === "string" && elem.className || typeof elem.getAttribute !== "undefined" && elem.getAttribute("class") || "" );
-				});
-		},
-
-		"ATTR": function( name, operator, check ) {
-			return function( elem ) {
-				var result = Sizzle.attr( elem, name );
-
-				if ( result == null ) {
-					return operator === "!=";
-				}
-				if ( !operator ) {
-					return true;
-				}
-
-				result += "";
-
-				return operator === "=" ? result === check :
-					operator === "!=" ? result !== check :
-					operator === "^=" ? check && result.indexOf( check ) === 0 :
-					operator === "*=" ? check && result.indexOf( check ) > -1 :
-					operator === "$=" ? check && result.slice( -check.length ) === check :
-					operator === "~=" ? ( " " + result.replace( rwhitespace, " " ) + " " ).indexOf( check ) > -1 :
-					operator === "|=" ? result === check || result.slice( 0, check.length + 1 ) === check + "-" :
-					false;
-			};
-		},
-
-		"CHILD": function( type, what, argument, first, last ) {
-			var simple = type.slice( 0, 3 ) !== "nth",
-				forward = type.slice( -4 ) !== "last",
-				ofType = what === "of-type";
-
-			return first === 1 && last === 0 ?
-
-				// Shortcut for :nth-*(n)
-				function( elem ) {
-					return !!elem.parentNode;
-				} :
-
-				function( elem, context, xml ) {
-					var cache, uniqueCache, outerCache, node, nodeIndex, start,
-						dir = simple !== forward ? "nextSibling" : "previousSibling",
-						parent = elem.parentNode,
-						name = ofType && elem.nodeName.toLowerCase(),
-						useCache = !xml && !ofType,
-						diff = false;
-
-					if ( parent ) {
-
-						// :(first|last|only)-(child|of-type)
-						if ( simple ) {
-							while ( dir ) {
-								node = elem;
-								while ( (node = node[ dir ]) ) {
-									if ( ofType ?
-										node.nodeName.toLowerCase() === name :
-										node.nodeType === 1 ) {
-
-										return false;
-									}
-								}
-								// Reverse direction for :only-* (if we haven't yet done so)
-								start = dir = type === "only" && !start && "nextSibling";
-							}
-							return true;
-						}
-
-						start = [ forward ? parent.firstChild : parent.lastChild ];
-
-						// non-xml :nth-child(...) stores cache data on `parent`
-						if ( forward && useCache ) {
-
-							// Seek `elem` from a previously-cached index
-
-							// ...in a gzip-friendly way
-							node = parent;
-							outerCache = node[ expando ] || (node[ expando ] = {});
-
-							// Support: IE <9 only
-							// Defend against cloned attroperties (jQuery gh-1709)
-							uniqueCache = outerCache[ node.uniqueID ] ||
-								(outerCache[ node.uniqueID ] = {});
-
-							cache = uniqueCache[ type ] || [];
-							nodeIndex = cache[ 0 ] === dirruns && cache[ 1 ];
-							diff = nodeIndex && cache[ 2 ];
-							node = nodeIndex && parent.childNodes[ nodeIndex ];
-
-							while ( (node = ++nodeIndex && node && node[ dir ] ||
-
-								// Fallback to seeking `elem` from the start
-								(diff = nodeIndex = 0) || start.pop()) ) {
-
-								// When found, cache indexes on `parent` and break
-								if ( node.nodeType === 1 && ++diff && node === elem ) {
-									uniqueCache[ type ] = [ dirruns, nodeIndex, diff ];
-									break;
-								}
-							}
-
-						} else {
-							// Use previously-cached element index if available
-							if ( useCache ) {
-								// ...in a gzip-friendly way
-								node = elem;
-								outerCache = node[ expando ] || (node[ expando ] = {});
-
-								// Support: IE <9 only
-								// Defend against cloned attroperties (jQuery gh-1709)
-								uniqueCache = outerCache[ node.uniqueID ] ||
-									(outerCache[ node.uniqueID ] = {});
-
-								cache = uniqueCache[ type ] || [];
-								nodeIndex = cache[ 0 ] === dirruns && cache[ 1 ];
-								diff = nodeIndex;
-							}
-
-							// xml :nth-child(...)
-							// or :nth-last-child(...) or :nth(-last)?-of-type(...)
-							if ( diff === false ) {
-								// Use the same loop as above to seek `elem` from the start
-								while ( (node = ++nodeIndex && node && node[ dir ] ||
-									(diff = nodeIndex = 0) || start.pop()) ) {
-
-									if ( ( ofType ?
-										node.nodeName.toLowerCase() === name :
-										node.nodeType === 1 ) &&
-										++diff ) {
-
-										// Cache the index of each encountered element
-										if ( useCache ) {
-											outerCache = node[ expando ] || (node[ expando ] = {});
-
-											// Support: IE <9 only
-											// Defend against cloned attroperties (jQuery gh-1709)
-											uniqueCache = outerCache[ node.uniqueID ] ||
-												(outerCache[ node.uniqueID ] = {});
-
-											uniqueCache[ type ] = [ dirruns, diff ];
-										}
-
-										if ( node === elem ) {
-											break;
-										}
-									}
-								}
-							}
-						}
-
-						// Incorporate the offset, then check against cycle size
-						diff -= last;
-						return diff === first || ( diff % first === 0 && diff / first >= 0 );
-					}
-				};
-		},
-
-		"PSEUDO": function( pseudo, argument ) {
-			// pseudo-class names are case-insensitive
-			// http://www.w3.org/TR/selectors/#pseudo-classes
-			// Prioritize by case sensitivity in case custom pseudos are added with uppercase letters
-			// Remember that setFilters inherits from pseudos
-			var args,
-				fn = Expr.pseudos[ pseudo ] || Expr.setFilters[ pseudo.toLowerCase() ] ||
-					Sizzle.error( "unsupported pseudo: " + pseudo );
-
-			// The user may use createPseudo to indicate that
-			// arguments are needed to create the filter function
-			// just as Sizzle does
-			if ( fn[ expando ] ) {
-				return fn( argument );
-			}
-
-			// But maintain support for old signatures
-			if ( fn.length > 1 ) {
-				args = [ pseudo, pseudo, "", argument ];
-				return Expr.setFilters.hasOwnProperty( pseudo.toLowerCase() ) ?
-					markFunction(function( seed, matches ) {
-						var idx,
-							matched = fn( seed, argument ),
-							i = matched.length;
-						while ( i-- ) {
-							idx = indexOf( seed, matched[i] );
-							seed[ idx ] = !( matches[ idx ] = matched[i] );
-						}
-					}) :
-					function( elem ) {
-						return fn( elem, 0, args );
-					};
-			}
-
-			return fn;
-		}
-	},
-
-	pseudos: {
-		// Potentially complex pseudos
-		"not": markFunction(function( selector ) {
-			// Trim the selector passed to compile
-			// to avoid treating leading and trailing
-			// spaces as combinators
-			var input = [],
-				results = [],
-				matcher = compile( selector.replace( rtrim, "$1" ) );
-
-			return matcher[ expando ] ?
-				markFunction(function( seed, matches, context, xml ) {
-					var elem,
-						unmatched = matcher( seed, null, xml, [] ),
-						i = seed.length;
-
-					// Match elements unmatched by `matcher`
-					while ( i-- ) {
-						if ( (elem = unmatched[i]) ) {
-							seed[i] = !(matches[i] = elem);
-						}
-					}
-				}) :
-				function( elem, context, xml ) {
-					input[0] = elem;
-					matcher( input, null, xml, results );
-					// Don't keep the element (issue #299)
-					input[0] = null;
-					return !results.pop();
-				};
-		}),
-
-		"has": markFunction(function( selector ) {
-			return function( elem ) {
-				return Sizzle( selector, elem ).length > 0;
-			};
-		}),
-
-		"contains": markFunction(function( text ) {
-			text = text.replace( runescape, funescape );
-			return function( elem ) {
-				return ( elem.textContent || elem.innerText || getText( elem ) ).indexOf( text ) > -1;
-			};
-		}),
-
-		// "Whether an element is represented by a :lang() selector
-		// is based solely on the element's language value
-		// being equal to the identifier C,
-		// or beginning with the identifier C immediately followed by "-".
-		// The matching of C against the element's language value is performed case-insensitively.
-		// The identifier C does not have to be a valid language name."
-		// http://www.w3.org/TR/selectors/#lang-pseudo
-		"lang": markFunction( function( lang ) {
-			// lang value must be a valid identifier
-			if ( !ridentifier.test(lang || "") ) {
-				Sizzle.error( "unsupported lang: " + lang );
-			}
-			lang = lang.replace( runescape, funescape ).toLowerCase();
-			return function( elem ) {
-				var elemLang;
-				do {
-					if ( (elemLang = documentIsHTML ?
-						elem.lang :
-						elem.getAttribute("xml:lang") || elem.getAttribute("lang")) ) {
-
-						elemLang = elemLang.toLowerCase();
-						return elemLang === lang || elemLang.indexOf( lang + "-" ) === 0;
-					}
-				} while ( (elem = elem.parentNode) && elem.nodeType === 1 );
-				return false;
-			};
-		}),
-
-		// Miscellaneous
-		"target": function( elem ) {
-			var hash = window.location && window.location.hash;
-			return hash && hash.slice( 1 ) === elem.id;
-		},
-
-		"root": function( elem ) {
-			return elem === docElem;
-		},
-
-		"focus": function( elem ) {
-			return elem === document.activeElement && (!document.hasFocus || document.hasFocus()) && !!(elem.type || elem.href || ~elem.tabIndex);
-		},
-
-		// Boolean properties
-		"enabled": function( elem ) {
-			return elem.disabled === false;
-		},
-
-		"disabled": function( elem ) {
-			return elem.disabled === true;
-		},
-
-		"checked": function( elem ) {
-			// In CSS3, :checked should return both checked and selected elements
-			// http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked
-			var nodeName = elem.nodeName.toLowerCase();
-			return (nodeName === "input" && !!elem.checked) || (nodeName === "option" && !!elem.selected);
-		},
-
-		"selected": function( elem ) {
-			// Accessing this property makes selected-by-default
-			// options in Safari work properly
-			if ( elem.parentNode ) {
-				elem.parentNode.selectedIndex;
-			}
-
-			return elem.selected === true;
-		},
-
-		// Contents
-		"empty": function( elem ) {
-			// http://www.w3.org/TR/selectors/#empty-pseudo
-			// :empty is negated by element (1) or content nodes (text: 3; cdata: 4; entity ref: 5),
-			//   but not by others (comment: 8; processing instruction: 7; etc.)
-			// nodeType < 6 works because attributes (2) do not appear as children
-			for ( elem = elem.firstChild; elem; elem = elem.nextSibling ) {
-				if ( elem.nodeType < 6 ) {
-					return false;
-				}
-			}
-			return true;
-		},
-
-		"parent": function( elem ) {
-			return !Expr.pseudos["empty"]( elem );
-		},
-
-		// Element/input types
-		"header": function( elem ) {
-			return rheader.test( elem.nodeName );
-		},
-
-		"input": function( elem ) {
-			return rinputs.test( elem.nodeName );
-		},
-
-		"button": function( elem ) {
-			var name = elem.nodeName.toLowerCase();
-			return name === "input" && elem.type === "button" || name === "button";
-		},
-
-		"text": function( elem ) {
-			var attr;
-			return elem.nodeName.toLowerCase() === "input" &&
-				elem.type === "text" &&
-
-				// Support: IE<8
-				// New HTML5 attribute values (e.g., "search") appear with elem.type === "text"
-				( (attr = elem.getAttribute("type")) == null || attr.toLowerCase() === "text" );
-		},
-
-		// Position-in-collection
-		"first": createPositionalPseudo(function() {
-			return [ 0 ];
-		}),
-
-		"last": createPositionalPseudo(function( matchIndexes, length ) {
-			return [ length - 1 ];
-		}),
-
-		"eq": createPositionalPseudo(function( matchIndexes, length, argument ) {
-			return [ argument < 0 ? argument + length : argument ];
-		}),
-
-		"even": createPositionalPseudo(function( matchIndexes, length ) {
-			var i = 0;
-			for ( ; i < length; i += 2 ) {
-				matchIndexes.push( i );
-			}
-			return matchIndexes;
-		}),
-
-		"odd": createPositionalPseudo(function( matchIndexes, length ) {
-			var i = 1;
-			for ( ; i < length; i += 2 ) {
-				matchIndexes.push( i );
-			}
-			return matchIndexes;
-		}),
-
-		"lt": createPositionalPseudo(function( matchIndexes, length, argument ) {
-			var i = argument < 0 ? argument + length : argument;
-			for ( ; --i >= 0; ) {
-				matchIndexes.push( i );
-			}
-			return matchIndexes;
-		}),
-
-		"gt": createPositionalPseudo(function( matchIndexes, length, argument ) {
-			var i = argument < 0 ? argument + length : argument;
-			for ( ; ++i < length; ) {
-				matchIndexes.push( i );
-			}
-			return matchIndexes;
-		})
-	}
-};
-
-Expr.pseudos["nth"] = Expr.pseudos["eq"];
-
-// Add button/input type pseudos
-for ( i in { radio: true, checkbox: true, file: true, password: true, image: true } ) {
-	Expr.pseudos[ i ] = createInputPseudo( i );
-}
-for ( i in { submit: true, reset: true } ) {
-	Expr.pseudos[ i ] = createButtonPseudo( i );
-}
-
-// Easy API for creating new setFilters
-function setFilters() {}
-setFilters.prototype = Expr.filters = Expr.pseudos;
-Expr.setFilters = new setFilters();
-
-tokenize = Sizzle.tokenize = function( selector, parseOnly ) {
-	var matched, match, tokens, type,
-		soFar, groups, preFilters,
-		cached = tokenCache[ selector + " " ];
-
-	if ( cached ) {
-		return parseOnly ? 0 : cached.slice( 0 );
-	}
-
-	soFar = selector;
-	groups = [];
-	preFilters = Expr.preFilter;
-
-	while ( soFar ) {
-
-		// Comma and first run
-		if ( !matched || (match = rcomma.exec( soFar )) ) {
-			if ( match ) {
-				// Don't consume trailing commas as valid
-				soFar = soFar.slice( match[0].length ) || soFar;
-			}
-			groups.push( (tokens = []) );
-		}
-
-		matched = false;
-
-		// Combinators
-		if ( (match = rcombinators.exec( soFar )) ) {
-			matched = match.shift();
-			tokens.push({
-				value: matched,
-				// Cast descendant combinators to space
-				type: match[0].replace( rtrim, " " )
-			});
-			soFar = soFar.slice( matched.length );
-		}
-
-		// Filters
-		for ( type in Expr.filter ) {
-			if ( (match = matchExpr[ type ].exec( soFar )) && (!preFilters[ type ] ||
-				(match = preFilters[ type ]( match ))) ) {
-				matched = match.shift();
-				tokens.push({
-					value: matched,
-					type: type,
-					matches: match
-				});
-				soFar = soFar.slice( matched.length );
-			}
-		}
-
-		if ( !matched ) {
-			break;
-		}
-	}
-
-	// Return the length of the invalid excess
-	// if we're just parsing
-	// Otherwise, throw an error or return tokens
-	return parseOnly ?
-		soFar.length :
-		soFar ?
-			Sizzle.error( selector ) :
-			// Cache the tokens
-			tokenCache( selector, groups ).slice( 0 );
-};
-
-function toSelector( tokens ) {
-	var i = 0,
-		len = tokens.length,
-		selector = "";
-	for ( ; i < len; i++ ) {
-		selector += tokens[i].value;
-	}
-	return selector;
-}
-
-function addCombinator( matcher, combinator, base ) {
-	var dir = combinator.dir,
-		checkNonElements = base && dir === "parentNode",
-		doneName = done++;
-
-	return combinator.first ?
-		// Check against closest ancestor/preceding element
-		function( elem, context, xml ) {
-			while ( (elem = elem[ dir ]) ) {
-				if ( elem.nodeType === 1 || checkNonElements ) {
-					return matcher( elem, context, xml );
-				}
-			}
-		} :
-
-		// Check against all ancestor/preceding elements
-		function( elem, context, xml ) {
-			var oldCache, uniqueCache, outerCache,
-				newCache = [ dirruns, doneName ];
-
-			// We can't set arbitrary data on XML nodes, so they don't benefit from combinator caching
-			if ( xml ) {
-				while ( (elem = elem[ dir ]) ) {
-					if ( elem.nodeType === 1 || checkNonElements ) {
-						if ( matcher( elem, context, xml ) ) {
-							return true;
-						}
-					}
-				}
-			} else {
-				while ( (elem = elem[ dir ]) ) {
-					if ( elem.nodeType === 1 || checkNonElements ) {
-						outerCache = elem[ expando ] || (elem[ expando ] = {});
-
-						// Support: IE <9 only
-						// Defend against cloned attroperties (jQuery gh-1709)
-						uniqueCache = outerCache[ elem.uniqueID ] || (outerCache[ elem.uniqueID ] = {});
-
-						if ( (oldCache = uniqueCache[ dir ]) &&
-							oldCache[ 0 ] === dirruns && oldCache[ 1 ] === doneName ) {
-
-							// Assign to newCache so results back-propagate to previous elements
-							return (newCache[ 2 ] = oldCache[ 2 ]);
-						} else {
-							// Reuse newcache so results back-propagate to previous elements
-							uniqueCache[ dir ] = newCache;
-
-							// A match means we're done; a fail means we have to keep checking
-							if ( (newCache[ 2 ] = matcher( elem, context, xml )) ) {
-								return true;
-							}
-						}
-					}
-				}
-			}
-		};
-}
-
-function elementMatcher( matchers ) {
-	return matchers.length > 1 ?
-		function( elem, context, xml ) {
-			var i = matchers.length;
-			while ( i-- ) {
-				if ( !matchers[i]( elem, context, xml ) ) {
-					return false;
-				}
-			}
-			return true;
-		} :
-		matchers[0];
-}
-
-function multipleContexts( selector, contexts, results ) {
-	var i = 0,
-		len = contexts.length;
-	for ( ; i < len; i++ ) {
-		Sizzle( selector, contexts[i], results );
-	}
-	return results;
-}
-
-function condense( unmatched, map, filter, context, xml ) {
-	var elem,
-		newUnmatched = [],
-		i = 0,
-		len = unmatched.length,
-		mapped = map != null;
-
-	for ( ; i < len; i++ ) {
-		if ( (elem = unmatched[i]) ) {
-			if ( !filter || filter( elem, context, xml ) ) {
-				newUnmatched.push( elem );
-				if ( mapped ) {
-					map.push( i );
-				}
-			}
-		}
-	}
-
-	return newUnmatched;
-}
-
-function setMatcher( preFilter, selector, matcher, postFilter, postFinder, postSelector ) {
-	if ( postFilter && !postFilter[ expando ] ) {
-		postFilter = setMatcher( postFilter );
-	}
-	if ( postFinder && !postFinder[ expando ] ) {
-		postFinder = setMatcher( postFinder, postSelector );
-	}
-	return markFunction(function( seed, results, context, xml ) {
-		var temp, i, elem,
-			preMap = [],
-			postMap = [],
-			preexisting = results.length,
-
-			// Get initial elements from seed or context
-			elems = seed || multipleContexts( selector || "*", context.nodeType ? [ context ] : context, [] ),
-
-			// Prefilter to get matcher input, preserving a map for seed-results synchronization
-			matcherIn = preFilter && ( seed || !selector ) ?
-				condense( elems, preMap, preFilter, context, xml ) :
-				elems,
-
-			matcherOut = matcher ?
-				// If we have a postFinder, or filtered seed, or non-seed postFilter or preexisting results,
-				postFinder || ( seed ? preFilter : preexisting || postFilter ) ?
-
-					// ...intermediate processing is necessary
-					[] :
-
-					// ...otherwise use results directly
-					results :
-				matcherIn;
-
-		// Find primary matches
-		if ( matcher ) {
-			matcher( matcherIn, matcherOut, context, xml );
-		}
-
-		// Apply postFilter
-		if ( postFilter ) {
-			temp = condense( matcherOut, postMap );
-			postFilter( temp, [], context, xml );
-
-			// Un-match failing elements by moving them back to matcherIn
-			i = temp.length;
-			while ( i-- ) {
-				if ( (elem = temp[i]) ) {
-					matcherOut[ postMap[i] ] = !(matcherIn[ postMap[i] ] = elem);
-				}
-			}
-		}
-
-		if ( seed ) {
-			if ( postFinder || preFilter ) {
-				if ( postFinder ) {
-					// Get the final matcherOut by condensing this intermediate into postFinder contexts
-					temp = [];
-					i = matcherOut.length;
-					while ( i-- ) {
-						if ( (elem = matcherOut[i]) ) {
-							// Restore matcherIn since elem is not yet a final match
-							temp.push( (matcherIn[i] = elem) );
-						}
-					}
-					postFinder( null, (matcherOut = []), temp, xml );
-				}
-
-				// Move matched elements from seed to results to keep them synchronized
-				i = matcherOut.length;
-				while ( i-- ) {
-					if ( (elem = matcherOut[i]) &&
-						(temp = postFinder ? indexOf( seed, elem ) : preMap[i]) > -1 ) {
-
-						seed[temp] = !(results[temp] = elem);
-					}
-				}
-			}
-
-		// Add elements to results, through postFinder if defined
-		} else {
-			matcherOut = condense(
-				matcherOut === results ?
-					matcherOut.splice( preexisting, matcherOut.length ) :
-					matcherOut
-			);
-			if ( postFinder ) {
-				postFinder( null, results, matcherOut, xml );
-			} else {
-				push.apply( results, matcherOut );
-			}
-		}
-	});
-}
-
-function matcherFromTokens( tokens ) {
-	var checkContext, matcher, j,
-		len = tokens.length,
-		leadingRelative = Expr.relative[ tokens[0].type ],
-		implicitRelative = leadingRelative || Expr.relative[" "],
-		i = leadingRelative ? 1 : 0,
-
-		// The foundational matcher ensures that elements are reachable from top-level context(s)
-		matchContext = addCombinator( function( elem ) {
-			return elem === checkContext;
-		}, implicitRelative, true ),
-		matchAnyContext = addCombinator( function( elem ) {
-			return indexOf( checkContext, elem ) > -1;
-		}, implicitRelative, true ),
-		matchers = [ function( elem, context, xml ) {
-			var ret = ( !leadingRelative && ( xml || context !== outermostContext ) ) || (
-				(checkContext = context).nodeType ?
-					matchContext( elem, context, xml ) :
-					matchAnyContext( elem, context, xml ) );
-			// Avoid hanging onto element (issue #299)
-			checkContext = null;
-			return ret;
-		} ];
-
-	for ( ; i < len; i++ ) {
-		if ( (matcher = Expr.relative[ tokens[i].type ]) ) {
-			matchers = [ addCombinator(elementMatcher( matchers ), matcher) ];
-		} else {
-			matcher = Expr.filter[ tokens[i].type ].apply( null, tokens[i].matches );
-
-			// Return special upon seeing a positional matcher
-			if ( matcher[ expando ] ) {
-				// Find the next relative operator (if any) for proper handling
-				j = ++i;
-				for ( ; j < len; j++ ) {
-					if ( Expr.relative[ tokens[j].type ] ) {
-						break;
-					}
-				}
-				return setMatcher(
-					i > 1 && elementMatcher( matchers ),
-					i > 1 && toSelector(
-						// If the preceding token was a descendant combinator, insert an implicit any-element `*`
-						tokens.slice( 0, i - 1 ).concat({ value: tokens[ i - 2 ].type === " " ? "*" : "" })
-					).replace( rtrim, "$1" ),
-					matcher,
-					i < j && matcherFromTokens( tokens.slice( i, j ) ),
-					j < len && matcherFromTokens( (tokens = tokens.slice( j )) ),
-					j < len && toSelector( tokens )
-				);
-			}
-			matchers.push( matcher );
-		}
-	}
-
-	return elementMatcher( matchers );
-}
-
-function matcherFromGroupMatchers( elementMatchers, setMatchers ) {
-	var bySet = setMatchers.length > 0,
-		byElement = elementMatchers.length > 0,
-		superMatcher = function( seed, context, xml, results, outermost ) {
-			var elem, j, matcher,
-				matchedCount = 0,
-				i = "0",
-				unmatched = seed && [],
-				setMatched = [],
-				contextBackup = outermostContext,
-				// We must always have either seed elements or outermost context
-				elems = seed || byElement && Expr.find["TAG"]( "*", outermost ),
-				// Use integer dirruns iff this is the outermost matcher
-				dirrunsUnique = (dirruns += contextBackup == null ? 1 : Math.random() || 0.1),
-				len = elems.length;
-
-			if ( outermost ) {
-				outermostContext = context === document || context || outermost;
-			}
-
-			// Add elements passing elementMatchers directly to results
-			// Support: IE<9, Safari
-			// Tolerate NodeList properties (IE: "length"; Safari: <number>) matching elements by id
-			for ( ; i !== len && (elem = elems[i]) != null; i++ ) {
-				if ( byElement && elem ) {
-					j = 0;
-					if ( !context && elem.ownerDocument !== document ) {
-						setDocument( elem );
-						xml = !documentIsHTML;
-					}
-					while ( (matcher = elementMatchers[j++]) ) {
-						if ( matcher( elem, context || document, xml) ) {
-							results.push( elem );
-							break;
-						}
-					}
-					if ( outermost ) {
-						dirruns = dirrunsUnique;
-					}
-				}
-
-				// Track unmatched elements for set filters
-				if ( bySet ) {
-					// They will have gone through all possible matchers
-					if ( (elem = !matcher && elem) ) {
-						matchedCount--;
-					}
-
-					// Lengthen the array for every element, matched or not
-					if ( seed ) {
-						unmatched.push( elem );
-					}
-				}
-			}
-
-			// `i` is now the count of elements visited above, and adding it to `matchedCount`
-			// makes the latter nonnegative.
-			matchedCount += i;
-
-			// Apply set filters to unmatched elements
-			// NOTE: This can be skipped if there are no unmatched elements (i.e., `matchedCount`
-			// equals `i`), unless we didn't visit _any_ elements in the above loop because we have
-			// no element matchers and no seed.
-			// Incrementing an initially-string "0" `i` allows `i` to remain a string only in that
-			// case, which will result in a "00" `matchedCount` that differs from `i` but is also
-			// numerically zero.
-			if ( bySet && i !== matchedCount ) {
-				j = 0;
-				while ( (matcher = setMatchers[j++]) ) {
-					matcher( unmatched, setMatched, context, xml );
-				}
-
-				if ( seed ) {
-					// Reintegrate element matches to eliminate the need for sorting
-					if ( matchedCount > 0 ) {
-						while ( i-- ) {
-							if ( !(unmatched[i] || setMatched[i]) ) {
-								setMatched[i] = pop.call( results );
-							}
-						}
-					}
-
-					// Discard index placeholder values to get only actual matches
-					setMatched = condense( setMatched );
-				}
-
-				// Add matches to results
-				push.apply( results, setMatched );
-
-				// Seedless set matches succeeding multiple successful matchers stipulate sorting
-				if ( outermost && !seed && setMatched.length > 0 &&
-					( matchedCount + setMatchers.length ) > 1 ) {
-
-					Sizzle.uniqueSort( results );
-				}
-			}
-
-			// Override manipulation of globals by nested matchers
-			if ( outermost ) {
-				dirruns = dirrunsUnique;
-				outermostContext = contextBackup;
-			}
-
-			return unmatched;
-		};
-
-	return bySet ?
-		markFunction( superMatcher ) :
-		superMatcher;
-}
-
-compile = Sizzle.compile = function( selector, match /* Internal Use Only */ ) {
-	var i,
-		setMatchers = [],
-		elementMatchers = [],
-		cached = compilerCache[ selector + " " ];
-
-	if ( !cached ) {
-		// Generate a function of recursive functions that can be used to check each element
-		if ( !match ) {
-			match = tokenize( selector );
-		}
-		i = match.length;
-		while ( i-- ) {
-			cached = matcherFromTokens( match[i] );
-			if ( cached[ expando ] ) {
-				setMatchers.push( cached );
-			} else {
-				elementMatchers.push( cached );
-			}
-		}
-
-		// Cache the compiled function
-		cached = compilerCache( selector, matcherFromGroupMatchers( elementMatchers, setMatchers ) );
-
-		// Save selector and tokenization
-		cached.selector = selector;
-	}
-	return cached;
-};
-
-/**
- * A low-level selection function that works with Sizzle's compiled
- *  selector functions
- * @param {String|Function} selector A selector or a pre-compiled
- *  selector function built with Sizzle.compile
- * @param {Element} context
- * @param {Array} [results]
- * @param {Array} [seed] A set of elements to match against
- */
-select = Sizzle.select = function( selector, context, results, seed ) {
-	var i, tokens, token, type, find,
-		compiled = typeof selector === "function" && selector,
-		match = !seed && tokenize( (selector = compiled.selector || selector) );
-
-	results = results || [];
-
-	// Try to minimize operations if there is only one selector in the list and no seed
-	// (the latter of which guarantees us context)
-	if ( match.length === 1 ) {
-
-		// Reduce context if the leading compound selector is an ID
-		tokens = match[0] = match[0].slice( 0 );
-		if ( tokens.length > 2 && (token = tokens[0]).type === "ID" &&
-				support.getById && context.nodeType === 9 && documentIsHTML &&
-				Expr.relative[ tokens[1].type ] ) {
-
-			context = ( Expr.find["ID"]( token.matches[0].replace(runescape, funescape), context ) || [] )[0];
-			if ( !context ) {
-				return results;
-
-			// Precompiled matchers will still verify ancestry, so step up a level
-			} else if ( compiled ) {
-				context = context.parentNode;
-			}
-
-			selector = selector.slice( tokens.shift().value.length );
-		}
-
-		// Fetch a seed set for right-to-left matching
-		i = matchExpr["needsContext"].test( selector ) ? 0 : tokens.length;
-		while ( i-- ) {
-			token = tokens[i];
-
-			// Abort if we hit a combinator
-			if ( Expr.relative[ (type = token.type) ] ) {
-				break;
-			}
-			if ( (find = Expr.find[ type ]) ) {
-				// Search, expanding context for leading sibling combinators
-				if ( (seed = find(
-					token.matches[0].replace( runescape, funescape ),
-					rsibling.test( tokens[0].type ) && testContext( context.parentNode ) || context
-				)) ) {
-
-					// If seed is empty or no tokens remain, we can return early
-					tokens.splice( i, 1 );
-					selector = seed.length && toSelector( tokens );
-					if ( !selector ) {
-						push.apply( results, seed );
-						return results;
-					}
-
-					break;
-				}
-			}
-		}
-	}
-
-	// Compile and execute a filtering function if one is not provided
-	// Provide `match` to avoid retokenization if we modified the selector above
-	( compiled || compile( selector, match ) )(
-		seed,
-		context,
-		!documentIsHTML,
-		results,
-		!context || rsibling.test( selector ) && testContext( context.parentNode ) || context
-	);
-	return results;
-};
-
-// One-time assignments
-
-// Sort stability
-support.sortStable = expando.split("").sort( sortOrder ).join("") === expando;
-
-// Support: Chrome 14-35+
-// Always assume duplicates if they aren't passed to the comparison function
-support.detectDuplicates = !!hasDuplicate;
-
-// Initialize against the default document
-setDocument();
-
-// Support: Webkit<537.32 - Safari 6.0.3/Chrome 25 (fixed in Chrome 27)
-// Detached nodes confoundingly follow *each other*
-support.sortDetached = assert(function( div1 ) {
-	// Should return 1, but returns 4 (following)
-	return div1.compareDocumentPosition( document.createElement("div") ) & 1;
-});
-
-// Support: IE<8
-// Prevent attribute/property "interpolation"
-// http://msdn.microsoft.com/en-us/library/ms536429%28VS.85%29.aspx
-if ( !assert(function( div ) {
-	div.innerHTML = "<a href='#'></a>";
-	return div.firstChild.getAttribute("href") === "#" ;
-}) ) {
-	addHandle( "type|href|height|width", function( elem, name, isXML ) {
-		if ( !isXML ) {
-			return elem.getAttribute( name, name.toLowerCase() === "type" ? 1 : 2 );
-		}
-	});
-}
-
-// Support: IE<9
-// Use defaultValue in place of getAttribute("value")
-if ( !support.attributes || !assert(function( div ) {
-	div.innerHTML = "<input/>";
-	div.firstChild.setAttribute( "value", "" );
-	return div.firstChild.getAttribute( "value" ) === "";
-}) ) {
-	addHandle( "value", function( elem, name, isXML ) {
-		if ( !isXML && elem.nodeName.toLowerCase() === "input" ) {
-			return elem.defaultValue;
-		}
-	});
-}
-
-// Support: IE<9
-// Use getAttributeNode to fetch booleans when getAttribute lies
-if ( !assert(function( div ) {
-	return div.getAttribute("disabled") == null;
-}) ) {
-	addHandle( booleans, function( elem, name, isXML ) {
-		var val;
-		if ( !isXML ) {
-			return elem[ name ] === true ? name.toLowerCase() :
-					(val = elem.getAttributeNode( name )) && val.specified ?
-					val.value :
-				null;
-		}
-	});
-}
-
-return Sizzle;
-
-})( window );
-
-
-
-jQuery.find = Sizzle;
-jQuery.expr = Sizzle.selectors;
-jQuery.expr[ ":" ] = jQuery.expr.pseudos;
-jQuery.uniqueSort = jQuery.unique = Sizzle.uniqueSort;
-jQuery.text = Sizzle.getText;
-jQuery.isXMLDoc = Sizzle.isXML;
-jQuery.contains = Sizzle.contains;
-
-
-
-var dir = function( elem, dir, until ) {
-	var matched = [],
-		truncate = until !== undefined;
-
-	while ( ( elem = elem[ dir ] ) && elem.nodeType !== 9 ) {
-		if ( elem.nodeType === 1 ) {
-			if ( truncate && jQuery( elem ).is( until ) ) {
-				break;
-			}
-			matched.push( elem );
-		}
-	}
-	return matched;
-};
-
-
-var siblings = function( n, elem ) {
-	var matched = [];
-
-	for ( ; n; n = n.nextSibling ) {
-		if ( n.nodeType === 1 && n !== elem ) {
-			matched.push( n );
-		}
-	}
-
-	return matched;
-};
-
-
-var rneedsContext = jQuery.expr.match.needsContext;
-
-var rsingleTag = ( /^<([\w-]+)\s*\/?>(?:<\/\1>|)$/ );
-
-
-
-var risSimple = /^.[^:#\[\.,]*$/;
-
-// Implement the identical functionality for filter and not
-function winnow( elements, qualifier, not ) {
-	if ( jQuery.isFunction( qualifier ) ) {
-		return jQuery.grep( elements, function( elem, i ) {
-			/* jshint -W018 */
-			return !!qualifier.call( elem, i, elem ) !== not;
-		} );
-
-	}
-
-	if ( qualifier.nodeType ) {
-		return jQuery.grep( elements, function( elem ) {
-			return ( elem === qualifier ) !== not;
-		} );
-
-	}
-
-	if ( typeof qualifier === "string" ) {
-		if ( risSimple.test( qualifier ) ) {
-			return jQuery.filter( qualifier, elements, not );
-		}
-
-		qualifier = jQuery.filter( qualifier, elements );
-	}
-
-	return jQuery.grep( elements, function( elem ) {
-		return ( indexOf.call( qualifier, elem ) > -1 ) !== not;
-	} );
-}
-
-jQuery.filter = function( expr, elems, not ) {
-	var elem = elems[ 0 ];
-
-	if ( not ) {
-		expr = ":not(" + expr + ")";
-	}
-
-	return elems.length === 1 && elem.nodeType === 1 ?
-		jQuery.find.matchesSelector( elem, expr ) ? [ elem ] : [] :
-		jQuery.find.matches( expr, jQuery.grep( elems, function( elem ) {
-			return elem.nodeType === 1;
-		} ) );
-};
-
-jQuery.fn.extend( {
-	find: function( selector ) {
-		var i,
-			len = this.length,
-			ret = [],
-			self = this;
-
-		if ( typeof selector !== "string" ) {
-			return this.pushStack( jQuery( selector ).filter( function() {
-				for ( i = 0; i < len; i++ ) {
-					if ( jQuery.contains( self[ i ], this ) ) {
-						return true;
-					}
-				}
-			} ) );
-		}
-
-		for ( i = 0; i < len; i++ ) {
-			jQuery.find( selector, self[ i ], ret );
-		}
-
-		// Needed because $( selector, context ) becomes $( context ).find( selector )
-		ret = this.pushStack( len > 1 ? jQuery.unique( ret ) : ret );
-		ret.selector = this.selector ? this.selector + " " + selector : selector;
-		return ret;
-	},
-	filter: function( selector ) {
-		return this.pushStack( winnow( this, selector || [], false ) );
-	},
-	not: function( selector ) {
-		return this.pushStack( winnow( this, selector || [], true ) );
-	},
-	is: function( selector ) {
-		return !!winnow(
-			this,
-
-			// If this is a positional/relative selector, check membership in the returned set
-			// so $("p:first").is("p:last") won't return true for a doc with two "p".
-			typeof selector === "string" && rneedsContext.test( selector ) ?
-				jQuery( selector ) :
-				selector || [],
-			false
-		).length;
-	}
-} );
-
-
-// Initialize a jQuery object
-
-
-// A central reference to the root jQuery(document)
-var rootjQuery,
-
-	// A simple way to check for HTML strings
-	// Prioritize #id over <tag> to avoid XSS via location.hash (#9521)
-	// Strict HTML recognition (#11290: must start with <)
-	rquickExpr = /^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]*))$/,
-
-	init = jQuery.fn.init = function( selector, context, root ) {
-		var match, elem;
-
-		// HANDLE: $(""), $(null), $(undefined), $(false)
-		if ( !selector ) {
-			return this;
-		}
-
-		// Method init() accepts an alternate rootjQuery
-		// so migrate can support jQuery.sub (gh-2101)
-		root = root || rootjQuery;
-
-		// Handle HTML strings
-		if ( typeof selector === "string" ) {
-			if ( selector[ 0 ] === "<" &&
-				selector[ selector.length - 1 ] === ">" &&
-				selector.length >= 3 ) {
-
-				// Assume that strings that start and end with <> are HTML and skip the regex check
-				match = [ null, selector, null ];
-
-			} else {
-				match = rquickExpr.exec( selector );
-			}
-
-			// Match html or make sure no context is specified for #id
-			if ( match && ( match[ 1 ] || !context ) ) {
-
-				// HANDLE: $(html) -> $(array)
-				if ( match[ 1 ] ) {
-					context = context instanceof jQuery ? context[ 0 ] : context;
-
-					// Option to run scripts is true for back-compat
-					// Intentionally let the error be thrown if parseHTML is not present
-					jQuery.merge( this, jQuery.parseHTML(
-						match[ 1 ],
-						context && context.nodeType ? context.ownerDocument || context : document,
-						true
-					) );
-
-					// HANDLE: $(html, props)
-					if ( rsingleTag.test( match[ 1 ] ) && jQuery.isPlainObject( context ) ) {
-						for ( match in context ) {
-
-							// Properties of context are called as methods if possible
-							if ( jQuery.isFunction( this[ match ] ) ) {
-								this[ match ]( context[ match ] );
-
-							// ...and otherwise set as attributes
-							} else {
-								this.attr( match, context[ match ] );
-							}
-						}
-					}
-
-					return this;
-
-				// HANDLE: $(#id)
-				} else {
-					elem = document.getElementById( match[ 2 ] );
-
-					// Support: Blackberry 4.6
-					// gEBID returns nodes no longer in the document (#6963)
-					if ( elem && elem.parentNode ) {
-
-						// Inject the element directly into the jQuery object
-						this.length = 1;
-						this[ 0 ] = elem;
-					}
-
-					this.context = document;
-					this.selector = selector;
-					return this;
-				}
-
-			// HANDLE: $(expr, $(...))
-			} else if ( !context || context.jquery ) {
-				return ( context || root ).find( selector );
-
-			// HANDLE: $(expr, context)
-			// (which is just equivalent to: $(context).find(expr)
-			} else {
-				return this.constructor( context ).find( selector );
-			}
-
-		// HANDLE: $(DOMElement)
-		} else if ( selector.nodeType ) {
-			this.context = this[ 0 ] = selector;
-			this.length = 1;
-			return this;
-
-		// HANDLE: $(function)
-		// Shortcut for document ready
-		} else if ( jQuery.isFunction( selector ) ) {
-			return root.ready !== undefined ?
-				root.ready( selector ) :
-
-				// Execute immediately if ready is not present
-				selector( jQuery );
-		}
-
-		if ( selector.selector !== undefined ) {
-			this.selector = selector.selector;
-			this.context = selector.context;
-		}
-
-		return jQuery.makeArray( selector, this );
-	};
-
-// Give the init function the jQuery prototype for later instantiation
-init.prototype = jQuery.fn;
-
-// Initialize central reference
-rootjQuery = jQuery( document );
-
-
-var rparentsprev = /^(?:parents|prev(?:Until|All))/,
-
-	// Methods guaranteed to produce a unique set when starting from a unique set
-	guaranteedUnique = {
-		children: true,
-		contents: true,
-		next: true,
-		prev: true
-	};
-
-jQuery.fn.extend( {
-	has: function( target ) {
-		var targets = jQuery( target, this ),
-			l = targets.length;
-
-		return this.filter( function() {
-			var i = 0;
-			for ( ; i < l; i++ ) {
-				if ( jQuery.contains( this, targets[ i ] ) ) {
-					return true;
-				}
-			}
-		} );
-	},
-
-	closest: function( selectors, context ) {
-		var cur,
-			i = 0,
-			l = this.length,
-			matched = [],
-			pos = rneedsContext.test( selectors ) || typeof selectors !== "string" ?
-				jQuery( selectors, context || this.context ) :
-				0;
-
-		for ( ; i < l; i++ ) {
-			for ( cur = this[ i ]; cur && cur !== context; cur = cur.parentNode ) {
-
-				// Always skip document fragments
-				if ( cur.nodeType < 11 && ( pos ?
-					pos.index( cur ) > -1 :
-
-					// Don't pass non-elements to Sizzle
-					cur.nodeType === 1 &&
-						jQuery.find.matchesSelector( cur, selectors ) ) ) {
-
-					matched.push( cur );
-					break;
-				}
-			}
-		}
-
-		return this.pushStack( matched.length > 1 ? jQuery.uniqueSort( matched ) : matched );
-	},
-
-	// Determine the position of an element within the set
-	index: function( elem ) {
-
-		// No argument, return index in parent
-		if ( !elem ) {
-			return ( this[ 0 ] && this[ 0 ].parentNode ) ? this.first().prevAll().length : -1;
-		}
-
-		// Index in selector
-		if ( typeof elem === "string" ) {
-			return indexOf.call( jQuery( elem ), this[ 0 ] );
-		}
-
-		// Locate the position of the desired element
-		return indexOf.call( this,
-
-			// If it receives a jQuery object, the first element is used
-			elem.jquery ? elem[ 0 ] : elem
-		);
-	},
-
-	add: function( selector, context ) {
-		return this.pushStack(
-			jQuery.uniqueSort(
-				jQuery.merge( this.get(), jQuery( selector, context ) )
-			)
-		);
-	},
-
-	addBack: function( selector ) {
-		return this.add( selector == null ?
-			this.prevObject : this.prevObject.filter( selector )
-		);
-	}
-} );
-
-function sibling( cur, dir ) {
-	while ( ( cur = cur[ dir ] ) && cur.nodeType !== 1 ) {}
-	return cur;
-}
-
-jQuery.each( {
-	parent: function( elem ) {
-		var parent = elem.parentNode;
-		return parent && parent.nodeType !== 11 ? parent : null;
-	},
-	parents: function( elem ) {
-		return dir( elem, "parentNode" );
-	},
-	parentsUntil: function( elem, i, until ) {
-		return dir( elem, "parentNode", until );
-	},
-	next: function( elem ) {
-		return sibling( elem, "nextSibling" );
-	},
-	prev: function( elem ) {
-		return sibling( elem, "previousSibling" );
-	},
-	nextAll: function( elem ) {
-		return dir( elem, "nextSibling" );
-	},
-	prevAll: function( elem ) {
-		return dir( elem, "previousSibling" );
-	},
-	nextUntil: function( elem, i, until ) {
-		return dir( elem, "nextSibling", until );
-	},
-	prevUntil: function( elem, i, until ) {
-		return dir( elem, "previousSibling", until );
-	},
-	siblings: function( elem ) {
-		return siblings( ( elem.parentNode || {} ).firstChild, elem );
-	},
-	children: function( elem ) {
-		return siblings( elem.firstChild );
-	},
-	contents: function( elem ) {
-		return elem.contentDocument || jQuery.merge( [], elem.childNodes );
-	}
-}, function( name, fn ) {
-	jQuery.fn[ name ] = function( until, selector ) {
-		var matched = jQuery.map( this, fn, until );
-
-		if ( name.slice( -5 ) !== "Until" ) {
-			selector = until;
-		}
-
-		if ( selector && typeof selector === "string" ) {
-			matched = jQuery.filter( selector, matched );
-		}
-
-		if ( this.length > 1 ) {
-
-			// Remove duplicates
-			if ( !guaranteedUnique[ name ] ) {
-				jQuery.uniqueSort( matched );
-			}
-
-			// Reverse order for parents* and prev-derivatives
-			if ( rparentsprev.test( name ) ) {
-				matched.reverse();
-			}
-		}
-
-		return this.pushStack( matched );
-	};
-} );
-var rnotwhite = ( /\S+/g );
-
-
-
-// Convert String-formatted options into Object-formatted ones
-function createOptions( options ) {
-	var object = {};
-	jQuery.each( options.match( rnotwhite ) || [], function( _, flag ) {
-		object[ flag ] = true;
-	} );
-	return object;
-}
-
-/*
- * Create a callback list using the following parameters:
- *
- *	options: an optional list of space-separated options that will change how
- *			the callback list behaves or a more traditional option object
- *
- * By default a callback list will act like an event callback list and can be
- * "fired" multiple times.
- *
- * Possible options:
- *
- *	once:			will ensure the callback list can only be fired once (like a Deferred)
- *
- *	memory:			will keep track of previous values and will call any callback added
- *					after the list has been fired right away with the latest "memorized"
- *					values (like a Deferred)
- *
- *	unique:			will ensure a callback can only be added once (no duplicate in the list)
- *
- *	stopOnFalse:	interrupt callings when a callback returns false
- *
- */
-jQuery.Callbacks = function( options ) {
-
-	// Convert options from String-formatted to Object-formatted if needed
-	// (we check in cache first)
-	options = typeof options === "string" ?
-		createOptions( options ) :
-		jQuery.extend( {}, options );
-
-	var // Flag to know if list is currently firing
-		firing,
-
-		// Last fire value for non-forgettable lists
-		memory,
-
-		// Flag to know if list was already fired
-		fired,
-
-		// Flag to prevent firing
-		locked,
-
-		// Actual callback list
-		list = [],
-
-		// Queue of execution data for repeatable lists
-		queue = [],
-
-		// Index of currently firing callback (modified by add/remove as needed)
-		firingIndex = -1,
-
-		// Fire callbacks
-		fire = function() {
-
-			// Enforce single-firing
-			locked = options.once;
-
-			// Execute callbacks for all pending executions,
-			// respecting firingIndex overrides and runtime changes
-			fired = firing = true;
-			for ( ; queue.length; firingIndex = -1 ) {
-				memory = queue.shift();
-				while ( ++firingIndex < list.length ) {
-
-					// Run callback and check for early termination
-					if ( list[ firingIndex ].apply( memory[ 0 ], memory[ 1 ] ) === false &&
-						options.stopOnFalse ) {
-
-						// Jump to end and forget the data so .add doesn't re-fire
-						firingIndex = list.length;
-						memory = false;
-					}
-				}
-			}
-
-			// Forget the data if we're done with it
-			if ( !options.memory ) {
-				memory = false;
-			}
-
-			firing = false;
-
-			// Clean up if we're done firing for good
-			if ( locked ) {
-
-				// Keep an empty list if we have data for future add calls
-				if ( memory ) {
-					list = [];
-
-				// Otherwise, this object is spent
-				} else {
-					list = "";
-				}
-			}
-		},
-
-		// Actual Callbacks object
-		self = {
-
-			// Add a callback or a collection of callbacks to the list
-			add: function() {
-				if ( list ) {
-
-					// If we have memory from a past run, we should fire after adding
-					if ( memory && !firing ) {
-						firingIndex = list.length - 1;
-						queue.push( memory );
-					}
-
-					( function add( args ) {
-						jQuery.each( args, function( _, arg ) {
-							if ( jQuery.isFunction( arg ) ) {
-								if ( !options.unique || !self.has( arg ) ) {
-									list.push( arg );
-								}
-							} else if ( arg && arg.length && jQuery.type( arg ) !== "string" ) {
-
-								// Inspect recursively
-								add( arg );
-							}
-						} );
-					} )( arguments );
-
-					if ( memory && !firing ) {
-						fire();
-					}
-				}
-				return this;
-			},
-
-			// Remove a callback from the list
-			remove: function() {
-				jQuery.each( arguments, function( _, arg ) {
-					var index;
-					while ( ( index = jQuery.inArray( arg, list, index ) ) > -1 ) {
-						list.splice( index, 1 );
-
-						// Handle firing indexes
-						if ( index <= firingIndex ) {
-							firingIndex--;
-						}
-					}
-				} );
-				return this;
-			},
-
-			// Check if a given callback is in the list.
-			// If no argument is given, return whether or not list has callbacks attached.
-			has: function( fn ) {
-				return fn ?
-					jQuery.inArray( fn, list ) > -1 :
-					list.length > 0;
-			},
-
-			// Remove all callbacks from the list
-			empty: function() {
-				if ( list ) {
-					list = [];
-				}
-				return this;
-			},
-
-			// Disable .fire and .add
-			// Abort any current/pending executions
-			// Clear all callbacks and values
-			disable: function() {
-				locked = queue = [];
-				list = memory = "";
-				return this;
-			},
-			disabled: function() {
-				return !list;
-			},
-
-			// Disable .fire
-			// Also disable .add unless we have memory (since it would have no effect)
-			// Abort any pending executions
-			lock: function() {
-				locked = queue = [];
-				if ( !memory ) {
-					list = memory = "";
-				}
-				return this;
-			},
-			locked: function() {
-				return !!locked;
-			},
-
-			// Call all callbacks with the given context and arguments
-			fireWith: function( context, args ) {
-				if ( !locked ) {
-					args = args || [];
-					args = [ context, args.slice ? args.slice() : args ];
-					queue.push( args );
-					if ( !firing ) {
-						fire();
-					}
-				}
-				return this;
-			},
-
-			// Call all the callbacks with the given arguments
-			fire: function() {
-				self.fireWith( this, arguments );
-				return this;
-			},
-
-			// To know if the callbacks have already been called at least once
-			fired: function() {
-				return !!fired;
-			}
-		};
-
-	return self;
-};
-
-
-jQuery.extend( {
-
-	Deferred: function( func ) {
-		var tuples = [
-
-				// action, add listener, listener list, final state
-				[ "resolve", "done", jQuery.Callbacks( "once memory" ), "resolved" ],
-				[ "reject", "fail", jQuery.Callbacks( "once memory" ), "rejected" ],
-				[ "notify", "progress", jQuery.Callbacks( "memory" ) ]
-			],
-			state = "pending",
-			promise = {
-				state: function() {
-					return state;
-				},
-				always: function() {
-					deferred.done( arguments ).fail( arguments );
-					return this;
-				},
-				then: function( /* fnDone, fnFail, fnProgress */ ) {
-					var fns = arguments;
-					return jQuery.Deferred( function( newDefer ) {
-						jQuery.each( tuples, function( i, tuple ) {
-							var fn = jQuery.isFunction( fns[ i ] ) && fns[ i ];
-
-							// deferred[ done | fail | progress ] for forwarding actions to newDefer
-							deferred[ tuple[ 1 ] ]( function() {
-								var returned = fn && fn.apply( this, arguments );
-								if ( returned && jQuery.isFunction( returned.promise ) ) {
-									returned.promise()
-										.progress( newDefer.notify )
-										.done( newDefer.resolve )
-										.fail( newDefer.reject );
-								} else {
-									newDefer[ tuple[ 0 ] + "With" ](
-										this === promise ? newDefer.promise() : this,
-										fn ? [ returned ] : arguments
-									);
-								}
-							} );
-						} );
-						fns = null;
-					} ).promise();
-				},
-
-				// Get a promise for this deferred
-				// If obj is provided, the promise aspect is added to the object
-				promise: function( obj ) {
-					return obj != null ? jQuery.extend( obj, promise ) : promise;
-				}
-			},
-			deferred = {};
-
-		// Keep pipe for back-compat
-		promise.pipe = promise.then;
-
-		// Add list-specific methods
-		jQuery.each( tuples, function( i, tuple ) {
-			var list = tuple[ 2 ],
-				stateString = tuple[ 3 ];
-
-			// promise[ done | fail | progress ] = list.add
-			promise[ tuple[ 1 ] ] = list.add;
-
-			// Handle state
-			if ( stateString ) {
-				list.add( function() {
-
-					// state = [ resolved | rejected ]
-					state = stateString;
-
-				// [ reject_list | resolve_list ].disable; progress_list.lock
-				}, tuples[ i ^ 1 ][ 2 ].disable, tuples[ 2 ][ 2 ].lock );
-			}
-
-			// deferred[ resolve | reject | notify ]
-			deferred[ tuple[ 0 ] ] = function() {
-				deferred[ tuple[ 0 ] + "With" ]( this === deferred ? promise : this, arguments );
-				return this;
-			};
-			deferred[ tuple[ 0 ] + "With" ] = list.fireWith;
-		} );
-
-		// Make the deferred a promise
-		promise.promise( deferred );
-
-		// Call given func if any
-		if ( func ) {
-			func.call( deferred, deferred );
-		}
-
-		// All done!
-		return deferred;
-	},
-
-	// Deferred helper
-	when: function( subordinate /* , ..., subordinateN */ ) {
-		var i = 0,
-			resolveValues = slice.call( arguments ),
-			length = resolveValues.length,
-
-			// the count of uncompleted subordinates
-			remaining = length !== 1 ||
-				( subordinate && jQuery.isFunction( subordinate.promise ) ) ? length : 0,
-
-			// the master Deferred.
-			// If resolveValues consist of only a single Deferred, just use that.
-			deferred = remaining === 1 ? subordinate : jQuery.Deferred(),
-
-			// Update function for both resolve and progress values
-			updateFunc = function( i, contexts, values ) {
-				return function( value ) {
-					contexts[ i ] = this;
-					values[ i ] = arguments.length > 1 ? slice.call( arguments ) : value;
-					if ( values === progressValues ) {
-						deferred.notifyWith( contexts, values );
-					} else if ( !( --remaining ) ) {
-						deferred.resolveWith( contexts, values );
-					}
-				};
-			},
-
-			progressValues, progressContexts, resolveContexts;
-
-		// Add listeners to Deferred subordinates; treat others as resolved
-		if ( length > 1 ) {
-			progressValues = new Array( length );
-			progressContexts = new Array( length );
-			resolveContexts = new Array( length );
-			for ( ; i < length; i++ ) {
-				if ( resolveValues[ i ] && jQuery.isFunction( resolveValues[ i ].promise ) ) {
-					resolveValues[ i ].promise()
-						.progress( updateFunc( i, progressContexts, progressValues ) )
-						.done( updateFunc( i, resolveContexts, resolveValues ) )
-						.fail( deferred.reject );
-				} else {
-					--remaining;
-				}
-			}
-		}
-
-		// If we're not waiting on anything, resolve the master
-		if ( !remaining ) {
-			deferred.resolveWith( resolveContexts, resolveValues );
-		}
-
-		return deferred.promise();
-	}
-} );
-
-
-// The deferred used on DOM ready
-var readyList;
-
-jQuery.fn.ready = function( fn ) {
-
-	// Add the callback
-	jQuery.ready.promise().done( fn );
-
-	return this;
-};
-
-jQuery.extend( {
-
-	// Is the DOM ready to be used? Set to true once it occurs.
-	isReady: false,
-
-	// A counter to track how many items to wait for before
-	// the ready event fires. See #6781
-	readyWait: 1,
-
-	// Hold (or release) the ready event
-	holdReady: function( hold ) {
-		if ( hold ) {
-			jQuery.readyWait++;
-		} else {
-			jQuery.ready( true );
-		}
-	},
-
-	// Handle when the DOM is ready
-	ready: function( wait ) {
-
-		// Abort if there are pending holds or we're already ready
-		if ( wait === true ? --jQuery.readyWait : jQuery.isReady ) {
-			return;
-		}
-
-		// Remember that the DOM is ready
-		jQuery.isReady = true;
-
-		// If a normal DOM Ready event fired, decrement, and wait if need be
-		if ( wait !== true && --jQuery.readyWait > 0 ) {
-			return;
-		}
-
-		// If there are functions bound, to execute
-		readyList.resolveWith( document, [ jQuery ] );
-
-		// Trigger any bound ready events
-		if ( jQuery.fn.triggerHandler ) {
-			jQuery( document ).triggerHandler( "ready" );
-			jQuery( document ).off( "ready" );
-		}
-	}
-} );
-
-/**
- * The ready event handler and self cleanup method
- */
-function completed() {
-	document.removeEventListener( "DOMContentLoaded", completed );
-	window.removeEventListener( "load", completed );
-	jQuery.ready();
-}
-
-jQuery.ready.promise = function( obj ) {
-	if ( !readyList ) {
-
-		readyList = jQuery.Deferred();
-
-		// Catch cases where $(document).ready() is called
-		// after the browser event has already occurred.
-		// Support: IE9-10 only
-		// Older IE sometimes signals "interactive" too soon
-		if ( document.readyState === "complete" ||
-			( document.readyState !== "loading" && !document.documentElement.doScroll ) ) {
-
-			// Handle it asynchronously to allow scripts the opportunity to delay ready
-			window.setTimeout( jQuery.ready );
-
-		} else {
-
-			// Use the handy event callback
-			document.addEventListener( "DOMContentLoaded", completed );
-
-			// A fallback to window.onload, that will always work
-			window.addEventListener( "load", completed );
-		}
-	}
-	return readyList.promise( obj );
-};
-
-// Kick off the DOM ready check even if the user does not
-jQuery.ready.promise();
-
-
-
-
-// Multifunctional method to get and set values of a collection
-// The value/s can optionally be executed if it's a function
-var access = function( elems, fn, key, value, chainable, emptyGet, raw ) {
-	var i = 0,
-		len = elems.length,
-		bulk = key == null;
-
-	// Sets many values
-	if ( jQuery.type( key ) === "object" ) {
-		chainable = true;
-		for ( i in key ) {
-			access( elems, fn, i, key[ i ], true, emptyGet, raw );
-		}
-
-	// Sets one value
-	} else if ( value !== undefined ) {
-		chainable = true;
-
-		if ( !jQuery.isFunction( value ) ) {
-			raw = true;
-		}
-
-		if ( bulk ) {
-
-			// Bulk operations run against the entire set
-			if ( raw ) {
-				fn.call( elems, value );
-				fn = null;
-
-			// ...except when executing function values
-			} else {
-				bulk = fn;
-				fn = function( elem, key, value ) {
-					return bulk.call( jQuery( elem ), value );
-				};
-			}
-		}
-
-		if ( fn ) {
-			for ( ; i < len; i++ ) {
-				fn(
-					elems[ i ], key, raw ?
-					value :
-					value.call( elems[ i ], i, fn( elems[ i ], key ) )
-				);
-			}
-		}
-	}
-
-	return chainable ?
-		elems :
-
-		// Gets
-		bulk ?
-			fn.call( elems ) :
-			len ? fn( elems[ 0 ], key ) : emptyGet;
-};
-var acceptData = function( owner ) {
-
-	// Accepts only:
-	//  - Node
-	//    - Node.ELEMENT_NODE
-	//    - Node.DOCUMENT_NODE
-	//  - Object
-	//    - Any
-	/* jshint -W018 */
-	return owner.nodeType === 1 || owner.nodeType === 9 || !( +owner.nodeType );
-};
-
-
-
-
-function Data() {
-	this.expando = jQuery.expando + Data.uid++;
-}
-
-Data.uid = 1;
-
-Data.prototype = {
-
-	register: function( owner, initial ) {
-		var value = initial || {};
-
-		// If it is a node unlikely to be stringify-ed or looped over
-		// use plain assignment
-		if ( owner.nodeType ) {
-			owner[ this.expando ] = value;
-
-		// Otherwise secure it in a non-enumerable, non-writable property
-		// configurability must be true to allow the property to be
-		// deleted with the delete operator
-		} else {
-			Object.defineProperty( owner, this.expando, {
-				value: value,
-				writable: true,
-				configurable: true
-			} );
-		}
-		return owner[ this.expando ];
-	},
-	cache: function( owner ) {
-
-		// We can accept data for non-element nodes in modern browsers,
-		// but we should not, see #8335.
-		// Always return an empty object.
-		if ( !acceptData( owner ) ) {
-			return {};
-		}
-
-		// Check if the owner object already has a cache
-		var value = owner[ this.expando ];
-
-		// If not, create one
-		if ( !value ) {
-			value = {};
-
-			// We can accept data for non-element nodes in modern browsers,
-			// but we should not, see #8335.
-			// Always return an empty object.
-			if ( acceptData( owner ) ) {
-
-				// If it is a node unlikely to be stringify-ed or looped over
-				// use plain assignment
-				if ( owner.nodeType ) {
-					owner[ this.expando ] = value;
-
-				// Otherwise secure it in a non-enumerable property
-				// configurable must be true to allow the property to be
-				// deleted when data is removed
-				} else {
-					Object.defineProperty( owner, this.expando, {
-						value: value,
-						configurable: true
-					} );
-				}
-			}
-		}
-
-		return value;
-	},
-	set: function( owner, data, value ) {
-		var prop,
-			cache = this.cache( owner );
-
-		// Handle: [ owner, key, value ] args
-		if ( typeof data === "string" ) {
-			cache[ data ] = value;
-
-		// Handle: [ owner, { properties } ] args
-		} else {
-
-			// Copy the properties one-by-one to the cache object
-			for ( prop in data ) {
-				cache[ prop ] = data[ prop ];
-			}
-		}
-		return cache;
-	},
-	get: function( owner, key ) {
-		return key === undefined ?
-			this.cache( owner ) :
-			owner[ this.expando ] && owner[ this.expando ][ key ];
-	},
-	access: function( owner, key, value ) {
-		var stored;
-
-		// In cases where either:
-		//
-		//   1. No key was specified
-		//   2. A string key was specified, but no value provided
-		//
-		// Take the "read" path and allow the get method to determine
-		// which value to return, respectively either:
-		//
-		//   1. The entire cache object
-		//   2. The data stored at the key
-		//
-		if ( key === undefined ||
-				( ( key && typeof key === "string" ) && value === undefined ) ) {
-
-			stored = this.get( owner, key );
-
-			return stored !== undefined ?
-				stored : this.get( owner, jQuery.camelCase( key ) );
-		}
-
-		// When the key is not a string, or both a key and value
-		// are specified, set or extend (existing objects) with either:
-		//
-		//   1. An object of properties
-		//   2. A key and value
-		//
-		this.set( owner, key, value );
-
-		// Since the "set" path can have two possible entry points
-		// return the expected data based on which path was taken[*]
-		return value !== undefined ? value : key;
-	},
-	remove: function( owner, key ) {
-		var i, name, camel,
-			cache = owner[ this.expando ];
-
-		if ( cache === undefined ) {
-			return;
-		}
-
-		if ( key === undefined ) {
-			this.register( owner );
-
-		} else {
-
-			// Support array or space separated string of keys
-			if ( jQuery.isArray( key ) ) {
-
-				// If "name" is an array of keys...
-				// When data is initially created, via ("key", "val") signature,
-				// keys will be converted to camelCase.
-				// Since there is no way to tell _how_ a key was added, remove
-				// both plain key and camelCase key. #12786
-				// This will only penalize the array argument path.
-				name = key.concat( key.map( jQuery.camelCase ) );
-			} else {
-				camel = jQuery.camelCase( key );
-
-				// Try the string as a key before any manipulation
-				if ( key in cache ) {
-					name = [ key, camel ];
-				} else {
-
-					// If a key with the spaces exists, use it.
-					// Otherwise, create an array by matching non-whitespace
-					name = camel;
-					name = name in cache ?
-						[ name ] : ( name.match( rnotwhite ) || [] );
-				}
-			}
-
-			i = name.length;
-
-			while ( i-- ) {
-				delete cache[ name[ i ] ];
-			}
-		}
-
-		// Remove the expando if there's no more data
-		if ( key === undefined || jQuery.isEmptyObject( cache ) ) {
-
-			// Support: Chrome <= 35-45+
-			// Webkit & Blink performance suffers when deleting properties
-			// from DOM nodes, so set to undefined instead
-			// https://code.google.com/p/chromium/issues/detail?id=378607
-			if ( owner.nodeType ) {
-				owner[ this.expando ] = undefined;
-			} else {
-				delete owner[ this.expando ];
-			}
-		}
-	},
-	hasData: function( owner ) {
-		var cache = owner[ this.expando ];
-		return cache !== undefined && !jQuery.isEmptyObject( cache );
-	}
-};
-var dataPriv = new Data();
-
-var dataUser = new Data();
-
-
-
-//	Implementation Summary
-//
-//	1. Enforce API surface and semantic compatibility with 1.9.x branch
-//	2. Improve the module's maintainability by reducing the storage
-//		paths to a single mechanism.
-//	3. Use the same single mechanism to support "private" and "user" data.
-//	4. _Never_ expose "private" data to user code (TODO: Drop _data, _removeData)
-//	5. Avoid exposing implementation details on user objects (eg. expando properties)
-//	6. Provide a clear path for implementation upgrade to WeakMap in 2014
-
-var rbrace = /^(?:\{[\w\W]*\}|\[[\w\W]*\])$/,
-	rmultiDash = /[A-Z]/g;
-
-function dataAttr( elem, key, data ) {
-	var name;
-
-	// If nothing was found internally, try to fetch any
-	// data from the HTML5 data-* attribute
-	if ( data === undefined && elem.nodeType === 1 ) {
-		name = "data-" + key.replace( rmultiDash, "-$&" ).toLowerCase();
-		data = elem.getAttribute( name );
-
-		if ( typeof data === "string" ) {
-			try {
-				data = data === "true" ? true :
-					data === "false" ? false :
-					data === "null" ? null :
-
-					// Only convert to a number if it doesn't change the string
-					+data + "" === data ? +data :
-					rbrace.test( data ) ? jQuery.parseJSON( data ) :
-					data;
-			} catch ( e ) {}
-
-			// Make sure we set the data so it isn't changed later
-			dataUser.set( elem, key, data );
-		} else {
-			data = undefined;
-		}
-	}
-	return data;
-}
-
-jQuery.extend( {
-	hasData: function( elem ) {
-		return dataUser.hasData( elem ) || dataPriv.hasData( elem );
-	},
-
-	data: function( elem, name, data ) {
-		return dataUser.access( elem, name, data );
-	},
-
-	removeData: function( elem, name ) {
-		dataUser.remove( elem, name );
-	},
-
-	// TODO: Now that all calls to _data and _removeData have been replaced
-	// with direct calls to dataPriv methods, these can be deprecated.
-	_data: function( elem, name, data ) {
-		return dataPriv.access( elem, name, data );
-	},
-
-	_removeData: function( elem, name ) {
-		dataPriv.remove( elem, name );
-	}
-} );
-
-jQuery.fn.extend( {
-	data: function( key, value ) {
-		var i, name, data,
-			elem = this[ 0 ],
-			attrs = elem && elem.attributes;
-
-		// Gets all values
-		if ( key === undefined ) {
-			if ( this.length ) {
-				data = dataUser.get( elem );
-
-				if ( elem.nodeType === 1 && !dataPriv.get( elem, "hasDataAttrs" ) ) {
-					i = attrs.length;
-					while ( i-- ) {
-
-						// Support: IE11+
-						// The attrs elements can be null (#14894)
-						if ( attrs[ i ] ) {
-							name = attrs[ i ].name;
-							if ( name.indexOf( "data-" ) === 0 ) {
-								name = jQuery.camelCase( name.slice( 5 ) );
-								dataAttr( elem, name, data[ name ] );
-							}
-						}
-					}
-					dataPriv.set( elem, "hasDataAttrs", true );
-				}
-			}
-
-			return data;
-		}
-
-		// Sets multiple values
-		if ( typeof key === "object" ) {
-			return this.each( function() {
-				dataUser.set( this, key );
-			} );
-		}
-
-		return access( this, function( value ) {
-			var data, camelKey;
-
-			// The calling jQuery object (element matches) is not empty
-			// (and therefore has an element appears at this[ 0 ]) and the
-			// `value` parameter was not undefined. An empty jQuery object
-			// will result in `undefined` for elem = this[ 0 ] which will
-			// throw an exception if an attempt to read a data cache is made.
-			if ( elem && value === undefined ) {
-
-				// Attempt to get data from the cache
-				// with the key as-is
-				data = dataUser.get( elem, key ) ||
-
-					// Try to find dashed key if it exists (gh-2779)
-					// This is for 2.2.x only
-					dataUser.get( elem, key.replace( rmultiDash, "-$&" ).toLowerCase() );
-
-				if ( data !== undefined ) {
-					return data;
-				}
-
-				camelKey = jQuery.camelCase( key );
-
-				// Attempt to get data from the cache
-				// with the key camelized
-				data = dataUser.get( elem, camelKey );
-				if ( data !== undefined ) {
-					return data;
-				}
-
-				// Attempt to "discover" the data in
-				// HTML5 custom data-* attrs
-				data = dataAttr( elem, camelKey, undefined );
-				if ( data !== undefined ) {
-					return data;
-				}
-
-				// We tried really hard, but the data doesn't exist.
-				return;
-			}
-
-			// Set the data...
-			camelKey = jQuery.camelCase( key );
-			this.each( function() {
-
-				// First, attempt to store a copy or reference of any
-				// data that might've been store with a camelCased key.
-				var data = dataUser.get( this, camelKey );
-
-				// For HTML5 data-* attribute interop, we have to
-				// store property names with dashes in a camelCase form.
-				// This might not apply to all properties...*
-				dataUser.set( this, camelKey, value );
-
-				// *... In the case of properties that might _actually_
-				// have dashes, we need to also store a copy of that
-				// unchanged property.
-				if ( key.indexOf( "-" ) > -1 && data !== undefined ) {
-					dataUser.set( this, key, value );
-				}
-			} );
-		}, null, value, arguments.length > 1, null, true );
-	},
-
-	removeData: function( key ) {
-		return this.each( function() {
-			dataUser.remove( this, key );
-		} );
-	}
-} );
-
-
-jQuery.extend( {
-	queue: function( elem, type, data ) {
-		var queue;
-
-		if ( elem ) {
-			type = ( type || "fx" ) + "queue";
-			queue = dataPriv.get( elem, type );
-
-			// Speed up dequeue by getting out quickly if this is just a lookup
-			if ( data ) {
-				if ( !queue || jQuery.isArray( data ) ) {
-					queue = dataPriv.access( elem, type, jQuery.makeArray( data ) );
-				} else {
-					queue.push( data );
-				}
-			}
-			return queue || [];
-		}
-	},
-
-	dequeue: function( elem, type ) {
-		type = type || "fx";
-
-		var queue = jQuery.queue( elem, type ),
-			startLength = queue.length,
-			fn = queue.shift(),
-			hooks = jQuery._queueHooks( elem, type ),
-			next = function() {
-				jQuery.dequeue( elem, type );
-			};
-
-		// If the fx queue is dequeued, always remove the progress sentinel
-		if ( fn === "inprogress" ) {
-			fn = queue.shift();
-			startLength--;
-		}
-
-		if ( fn ) {
-
-			// Add a progress sentinel to prevent the fx queue from being
-			// automatically dequeued
-			if ( type === "fx" ) {
-				queue.unshift( "inprogress" );
-			}
-
-			// Clear up the last queue stop function
-			delete hooks.stop;
-			fn.call( elem, next, hooks );
-		}
-
-		if ( !startLength && hooks ) {
-			hooks.empty.fire();
-		}
-	},
-
-	// Not public - generate a queueHooks object, or return the current one
-	_queueHooks: function( elem, type ) {
-		var key = type + "queueHooks";
-		return dataPriv.get( elem, key ) || dataPriv.access( elem, key, {
-			empty: jQuery.Callbacks( "once memory" ).add( function() {
-				dataPriv.remove( elem, [ type + "queue", key ] );
-			} )
-		} );
-	}
-} );
-
-jQuery.fn.extend( {
-	queue: function( type, data ) {
-		var setter = 2;
-
-		if ( typeof type !== "string" ) {
-			data = type;
-			type = "fx";
-			setter--;
-		}
-
-		if ( arguments.length < setter ) {
-			return jQuery.queue( this[ 0 ], type );
-		}
-
-		return data === undefined ?
-			this :
-			this.each( function() {
-				var queue = jQuery.queue( this, type, data );
-
-				// Ensure a hooks for this queue
-				jQuery._queueHooks( this, type );
-
-				if ( type === "fx" && queue[ 0 ] !== "inprogress" ) {
-					jQuery.dequeue( this, type );
-				}
-			} );
-	},
-	dequeue: function( type ) {
-		return this.each( function() {
-			jQuery.dequeue( this, type );
-		} );
-	},
-	clearQueue: function( type ) {
-		return this.queue( type || "fx", [] );
-	},
-
-	// Get a promise resolved when queues of a certain type
-	// are emptied (fx is the type by default)
-	promise: function( type, obj ) {
-		var tmp,
-			count = 1,
-			defer = jQuery.Deferred(),
-			elements = this,
-			i = this.length,
-			resolve = function() {
-				if ( !( --count ) ) {
-					defer.resolveWith( elements, [ elements ] );
-				}
-			};
-
-		if ( typeof type !== "string" ) {
-			obj = type;
-			type = undefined;
-		}
-		type = type || "fx";
-
-		while ( i-- ) {
-			tmp = dataPriv.get( elements[ i ], type + "queueHooks" );
-			if ( tmp && tmp.empty ) {
-				count++;
-				tmp.empty.add( resolve );
-			}
-		}
-		resolve();
-		return defer.promise( obj );
-	}
-} );
-var pnum = ( /[+-]?(?:\d*\.|)\d+(?:[eE][+-]?\d+|)/ ).source;
-
-var rcssNum = new RegExp( "^(?:([+-])=|)(" + pnum + ")([a-z%]*)$", "i" );
-
-
-var cssExpand = [ "Top", "Right", "Bottom", "Left" ];
-
-var isHidden = function( elem, el ) {
-
-		// isHidden might be called from jQuery#filter function;
-		// in that case, element will be second argument
-		elem = el || elem;
-		return jQuery.css( elem, "display" ) === "none" ||
-			!jQuery.contains( elem.ownerDocument, elem );
-	};
-
-
-
-function adjustCSS( elem, prop, valueParts, tween ) {
-	var adjusted,
-		scale = 1,
-		maxIterations = 20,
-		currentValue = tween ?
-			function() { return tween.cur(); } :
-			function() { return jQuery.css( elem, prop, "" ); },
-		initial = currentValue(),
-		unit = valueParts && valueParts[ 3 ] || ( jQuery.cssNumber[ prop ] ? "" : "px" ),
-
-		// Starting value computation is required for potential unit mismatches
-		initialInUnit = ( jQuery.cssNumber[ prop ] || unit !== "px" && +initial ) &&
-			rcssNum.exec( jQuery.css( elem, prop ) );
-
-	if ( initialInUnit && initialInUnit[ 3 ] !== unit ) {
-
-		// Trust units reported by jQuery.css
-		unit = unit || initialInUnit[ 3 ];
-
-		// Make sure we update the tween properties later on
-		valueParts = valueParts || [];
-
-		// Iteratively approximate from a nonzero starting point
-		initialInUnit = +initial || 1;
-
-		do {
-
-			// If previous iteration zeroed out, double until we get *something*.
-			// Use string for doubling so we don't accidentally see scale as unchanged below
-			scale = scale || ".5";
-
-			// Adjust and apply
-			initialInUnit = initialInUnit / scale;
-			jQuery.style( elem, prop, initialInUnit + unit );
-
-		// Update scale, tolerating zero or NaN from tween.cur()
-		// Break the loop if scale is unchanged or perfect, or if we've just had enough.
-		} while (
-			scale !== ( scale = currentValue() / initial ) && scale !== 1 && --maxIterations
-		);
-	}
-
-	if ( valueParts ) {
-		initialInUnit = +initialInUnit || +initial || 0;
-
-		// Apply relative offset (+=/-=) if specified
-		adjusted = valueParts[ 1 ] ?
-			initialInUnit + ( valueParts[ 1 ] + 1 ) * valueParts[ 2 ] :
-			+valueParts[ 2 ];
-		if ( tween ) {
-			tween.unit = unit;
-			tween.start = initialInUnit;
-			tween.end = adjusted;
-		}
-	}
-	return adjusted;
-}
-var rcheckableType = ( /^(?:checkbox|radio)$/i );
-
-var rtagName = ( /<([\w:-]+)/ );
-
-var rscriptType = ( /^$|\/(?:java|ecma)script/i );
-
-
-
-// We have to close these tags to support XHTML (#13200)
-var wrapMap = {
-
-	// Support: IE9
-	option: [ 1, "<select multiple='multiple'>", "</select>" ],
-
-	// XHTML parsers do not magically insert elements in the
-	// same way that tag soup parsers do. So we cannot shorten
-	// this by omitting <tbody> or other required elements.
-	thead: [ 1, "<table>", "</table>" ],
-	col: [ 2, "<table><colgroup>", "</colgroup></table>" ],
-	tr: [ 2, "<table><tbody>", "</tbody></table>" ],
-	td: [ 3, "<table><tbody><tr>", "</tr></tbody></table>" ],
-
-	_default: [ 0, "", "" ]
-};
-
-// Support: IE9
-wrapMap.optgroup = wrapMap.option;
-
-wrapMap.tbody = wrapMap.tfoot = wrapMap.colgroup = wrapMap.caption = wrapMap.thead;
-wrapMap.th = wrapMap.td;
-
-
-function getAll( context, tag ) {
-
-	// Support: IE9-11+
-	// Use typeof to avoid zero-argument method invocation on host objects (#15151)
-	var ret = typeof context.getElementsByTagName !== "undefined" ?
-			context.getElementsByTagName( tag || "*" ) :
-			typeof context.querySelectorAll !== "undefined" ?
-				context.querySelectorAll( tag || "*" ) :
-			[];
-
-	return tag === undefined || tag && jQuery.nodeName( context, tag ) ?
-		jQuery.merge( [ context ], ret ) :
-		ret;
-}
-
-
-// Mark scripts as having already been evaluated
-function setGlobalEval( elems, refElements ) {
-	var i = 0,
-		l = elems.length;
-
-	for ( ; i < l; i++ ) {
-		dataPriv.set(
-			elems[ i ],
-			"globalEval",
-			!refElements || dataPriv.get( refElements[ i ], "globalEval" )
-		);
-	}
-}
-
-
-var rhtml = /<|&#?\w+;/;
-
-function buildFragment( elems, context, scripts, selection, ignored ) {
-	var elem, tmp, tag, wrap, contains, j,
-		fragment = context.createDocumentFragment(),
-		nodes = [],
-		i = 0,
-		l = elems.length;
-
-	for ( ; i < l; i++ ) {
-		elem = elems[ i ];
-
-		if ( elem || elem === 0 ) {
-
-			// Add nodes directly
-			if ( jQuery.type( elem ) === "object" ) {
-
-				// Support: Android<4.1, PhantomJS<2
-				// push.apply(_, arraylike) throws on ancient WebKit
-				jQuery.merge( nodes, elem.nodeType ? [ elem ] : elem );
-
-			// Convert non-html into a text node
-			} else if ( !rhtml.test( elem ) ) {
-				nodes.push( context.createTextNode( elem ) );
-
-			// Convert html into DOM nodes
-			} else {
-				tmp = tmp || fragment.appendChild( context.createElement( "div" ) );
-
-				// Deserialize a standard representation
-				tag = ( rtagName.exec( elem ) || [ "", "" ] )[ 1 ].toLowerCase();
-				wrap = wrapMap[ tag ] || wrapMap._default;
-				tmp.innerHTML = wrap[ 1 ] + jQuery.htmlPrefilter( elem ) + wrap[ 2 ];
-
-				// Descend through wrappers to the right content
-				j = wrap[ 0 ];
-				while ( j-- ) {
-					tmp = tmp.lastChild;
-				}
-
-				// Support: Android<4.1, PhantomJS<2
-				// push.apply(_, arraylike) throws on ancient WebKit
-				jQuery.merge( nodes, tmp.childNodes );
-
-				// Remember the top-level container
-				tmp = fragment.firstChild;
-
-				// Ensure the created nodes are orphaned (#12392)
-				tmp.textContent = "";
-			}
-		}
-	}
-
-	// Remove wrapper from fragment
-	fragment.textContent = "";
-
-	i = 0;
-	while ( ( elem = nodes[ i++ ] ) ) {
-
-		// Skip elements already in the context collection (trac-4087)
-		if ( selection && jQuery.inArray( elem, selection ) > -1 ) {
-			if ( ignored ) {
-				ignored.push( elem );
-			}
-			continue;
-		}
-
-		contains = jQuery.contains( elem.ownerDocument, elem );
-
-		// Append to fragment
-		tmp = getAll( fragment.appendChild( elem ), "script" );
-
-		// Preserve script evaluation history
-		if ( contains ) {
-			setGlobalEval( tmp );
-		}
-
-		// Capture executables
-		if ( scripts ) {
-			j = 0;
-			while ( ( elem = tmp[ j++ ] ) ) {
-				if ( rscriptType.test( elem.type || "" ) ) {
-					scripts.push( elem );
-				}
-			}
-		}
-	}
-
-	return fragment;
-}
-
-
-( function() {
-	var fragment = document.createDocumentFragment(),
-		div = fragment.appendChild( document.createElement( "div" ) ),
-		input = document.createElement( "input" );
-
-	// Support: Android 4.0-4.3, Safari<=5.1
-	// Check state lost if the name is set (#11217)
-	// Support: Windows Web Apps (WWA)
-	// `name` and `type` must use .setAttribute for WWA (#14901)
-	input.setAttribute( "type", "radio" );
-	input.setAttribute( "checked", "checked" );
-	input.setAttribute( "name", "t" );
-
-	div.appendChild( input );
-
-	// Support: Safari<=5.1, Android<4.2
-	// Older WebKit doesn't clone checked state correctly in fragments
-	support.checkClone = div.cloneNode( true ).cloneNode( true ).lastChild.checked;
-
-	// Support: IE<=11+
-	// Make sure textarea (and checkbox) defaultValue is properly cloned
-	div.innerHTML = "<textarea>x</textarea>";
-	support.noCloneChecked = !!div.cloneNode( true ).lastChild.defaultValue;
-} )();
-
-
-var
-	rkeyEvent = /^key/,
-	rmouseEvent = /^(?:mouse|pointer|contextmenu|drag|drop)|click/,
-	rtypenamespace = /^([^.]*)(?:\.(.+)|)/;
-
-function returnTrue() {
-	return true;
-}
-
-function returnFalse() {
-	return false;
-}
-
-// Support: IE9
-// See #13393 for more info
-function safeActiveElement() {
-	try {
-		return document.activeElement;
-	} catch ( err ) { }
-}
-
-function on( elem, types, selector, data, fn, one ) {
-	var origFn, type;
-
-	// Types can be a map of types/handlers
-	if ( typeof types === "object" ) {
-
-		// ( types-Object, selector, data )
-		if ( typeof selector !== "string" ) {
-
-			// ( types-Object, data )
-			data = data || selector;
-			selector = undefined;
-		}
-		for ( type in types ) {
-			on( elem, type, selector, data, types[ type ], one );
-		}
-		return elem;
-	}
-
-	if ( data == null && fn == null ) {
-
-		// ( types, fn )
-		fn = selector;
-		data = selector = undefined;
-	} else if ( fn == null ) {
-		if ( typeof selector === "string" ) {
-
-			// ( types, selector, fn )
-			fn = data;
-			data = undefined;
-		} else {
-
-			// ( types, data, fn )
-			fn = data;
-			data = selector;
-			selector = undefined;
-		}
-	}
-	if ( fn === false ) {
-		fn = returnFalse;
-	} else if ( !fn ) {
-		return elem;
-	}
-
-	if ( one === 1 ) {
-		origFn = fn;
-		fn = function( event ) {
-
-			// Can use an empty set, since event contains the info
-			jQuery().off( event );
-			return origFn.apply( this, arguments );
-		};
-
-		// Use same guid so caller can remove using origFn
-		fn.guid = origFn.guid || ( origFn.guid = jQuery.guid++ );
-	}
-	return elem.each( function() {
-		jQuery.event.add( this, types, fn, data, selector );
-	} );
-}
-
-/*
- * Helper functions for managing events -- not part of the public interface.
- * Props to Dean Edwards' addEvent library for many of the ideas.
- */
-jQuery.event = {
-
-	global: {},
-
-	add: function( elem, types, handler, data, selector ) {
-
-		var handleObjIn, eventHandle, tmp,
-			events, t, handleObj,
-			special, handlers, type, namespaces, origType,
-			elemData = dataPriv.get( elem );
-
-		// Don't attach events to noData or text/comment nodes (but allow plain objects)
-		if ( !elemData ) {
-			return;
-		}
-
-		// Caller can pass in an object of custom data in lieu of the handler
-		if ( handler.handler ) {
-			handleObjIn = handler;
-			handler = handleObjIn.handler;
-			selector = handleObjIn.selector;
-		}
-
-		// Make sure that the handler has a unique ID, used to find/remove it later
-		if ( !handler.guid ) {
-			handler.guid = jQuery.guid++;
-		}
-
-		// Init the element's event structure and main handler, if this is the first
-		if ( !( events = elemData.events ) ) {
-			events = elemData.events = {};
-		}
-		if ( !( eventHandle = elemData.handle ) ) {
-			eventHandle = elemData.handle = function( e ) {
-
-				// Discard the second event of a jQuery.event.trigger() and
-				// when an event is called after a page has unloaded
-				return typeof jQuery !== "undefined" && jQuery.event.triggered !== e.type ?
-					jQuery.event.dispatch.apply( elem, arguments ) : undefined;
-			};
-		}
-
-		// Handle multiple events separated by a space
-		types = ( types || "" ).match( rnotwhite ) || [ "" ];
-		t = types.length;
-		while ( t-- ) {
-			tmp = rtypenamespace.exec( types[ t ] ) || [];
-			type = origType = tmp[ 1 ];
-			namespaces = ( tmp[ 2 ] || "" ).split( "." ).sort();
-
-			// There *must* be a type, no attaching namespace-only handlers
-			if ( !type ) {
-				continue;
-			}
-
-			// If event changes its type, use the special event handlers for the changed type
-			special = jQuery.event.special[ type ] || {};
-
-			// If selector defined, determine special event api type, otherwise given type
-			type = ( selector ? special.delegateType : special.bindType ) || type;
-
-			// Update special based on newly reset type
-			special = jQuery.event.special[ type ] || {};
-
-			// handleObj is passed to all event handlers
-			handleObj = jQuery.extend( {
-				type: type,
-				origType: origType,
-				data: data,
-				handler: handler,
-				guid: handler.guid,
-				selector: selector,
-				needsContext: selector && jQuery.expr.match.needsContext.test( selector ),
-				namespace: namespaces.join( "." )
-			}, handleObjIn );
-
-			// Init the event handler queue if we're the first
-			if ( !( handlers = events[ type ] ) ) {
-				handlers = events[ type ] = [];
-				handlers.delegateCount = 0;
-
-				// Only use addEventListener if the special events handler returns false
-				if ( !special.setup ||
-					special.setup.call( elem, data, namespaces, eventHandle ) === false ) {
-
-					if ( elem.addEventListener ) {
-						elem.addEventListener( type, eventHandle );
-					}
-				}
-			}
-
-			if ( special.add ) {
-				special.add.call( elem, handleObj );
-
-				if ( !handleObj.handler.guid ) {
-					handleObj.handler.guid = handler.guid;
-				}
-			}
-
-			// Add to the element's handler list, delegates in front
-			if ( selector ) {
-				handlers.splice( handlers.delegateCount++, 0, handleObj );
-			} else {
-				handlers.push( handleObj );
-			}
-
-			// Keep track of which events have ever been used, for event optimization
-			jQuery.event.global[ type ] = true;
-		}
-
-	},
-
-	// Detach an event or set of events from an element
-	remove: function( elem, types, handler, selector, mappedTypes ) {
-
-		var j, origCount, tmp,
-			events, t, handleObj,
-			special, handlers, type, namespaces, origType,
-			elemData = dataPriv.hasData( elem ) && dataPriv.get( elem );
-
-		if ( !elemData || !( events = elemData.events ) ) {
-			return;
-		}
-
-		// Once for each type.namespace in types; type may be omitted
-		types = ( types || "" ).match( rnotwhite ) || [ "" ];
-		t = types.length;
-		while ( t-- ) {
-			tmp = rtypenamespace.exec( types[ t ] ) || [];
-			type = origType = tmp[ 1 ];
-			namespaces = ( tmp[ 2 ] || "" ).split( "." ).sort();
-
-			// Unbind all events (on this namespace, if provided) for the element
-			if ( !type ) {
-				for ( type in events ) {
-					jQuery.event.remove( elem, type + types[ t ], handler, selector, true );
-				}
-				continue;
-			}
-
-			special = jQuery.event.special[ type ] || {};
-			type = ( selector ? special.delegateType : special.bindType ) || type;
-			handlers = events[ type ] || [];
-			tmp = tmp[ 2 ] &&
-				new RegExp( "(^|\\.)" + namespaces.join( "\\.(?:.*\\.|)" ) + "(\\.|$)" );
-
-			// Remove matching events
-			origCount = j = handlers.length;
-			while ( j-- ) {
-				handleObj = handlers[ j ];
-
-				if ( ( mappedTypes || origType === handleObj.origType ) &&
-					( !handler || handler.guid === handleObj.guid ) &&
-					( !tmp || tmp.test( handleObj.namespace ) ) &&
-					( !selector || selector === handleObj.selector ||
-						selector === "**" && handleObj.selector ) ) {
-					handlers.splice( j, 1 );
-
-					if ( handleObj.selector ) {
-						handlers.delegateCount--;
-					}
-					if ( special.remove ) {
-						special.remove.call( elem, handleObj );
-					}
-				}
-			}
-
-			// Remove generic event handler if we removed something and no more handlers exist
-			// (avoids potential for endless recursion during removal of special event handlers)
-			if ( origCount && !handlers.length ) {
-				if ( !special.teardown ||
-					special.teardown.call( elem, namespaces, elemData.handle ) === false ) {
-
-					jQuery.removeEvent( elem, type, elemData.handle );
-				}
-
-				delete events[ type ];
-			}
-		}
-
-		// Remove data and the expando if it's no longer used
-		if ( jQuery.isEmptyObject( events ) ) {
-			dataPriv.remove( elem, "handle events" );
-		}
-	},
-
-	dispatch: function( event ) {
-
-		// Make a writable jQuery.Event from the native event object
-		event = jQuery.event.fix( event );
-
-		var i, j, ret, matched, handleObj,
-			handlerQueue = [],
-			args = slice.call( arguments ),
-			handlers = ( dataPriv.get( this, "events" ) || {} )[ event.type ] || [],
-			special = jQuery.event.special[ event.type ] || {};
-
-		// Use the fix-ed jQuery.Event rather than the (read-only) native event
-		args[ 0 ] = event;
-		event.delegateTarget = this;
-
-		// Call the preDispatch hook for the mapped type, and let it bail if desired
-		if ( special.preDispatch && special.preDispatch.call( this, event ) === false ) {
-			return;
-		}
-
-		// Determine handlers
-		handlerQueue = jQuery.event.handlers.call( this, event, handlers );
-
-		// Run delegates first; they may want to stop propagation beneath us
-		i = 0;
-		while ( ( matched = handlerQueue[ i++ ] ) && !event.isPropagationStopped() ) {
-			event.currentTarget = matched.elem;
-
-			j = 0;
-			while ( ( handleObj = matched.handlers[ j++ ] ) &&
-				!event.isImmediatePropagationStopped() ) {
-
-				// Triggered event must either 1) have no namespace, or 2) have namespace(s)
-				// a subset or equal to those in the bound event (both can have no namespace).
-				if ( !event.rnamespace || event.rnamespace.test( handleObj.namespace ) ) {
-
-					event.handleObj = handleObj;
-					event.data = handleObj.data;
-
-					ret = ( ( jQuery.event.special[ handleObj.origType ] || {} ).handle ||
-						handleObj.handler ).apply( matched.elem, args );
-
-					if ( ret !== undefined ) {
-						if ( ( event.result = ret ) === false ) {
-							event.preventDefault();
-							event.stopPropagation();
-						}
-					}
-				}
-			}
-		}
-
-		// Call the postDispatch hook for the mapped type
-		if ( special.postDispatch ) {
-			special.postDispatch.call( this, event );
-		}
-
-		return event.result;
-	},
-
-	handlers: function( event, handlers ) {
-		var i, matches, sel, handleObj,
-			handlerQueue = [],
-			delegateCount = handlers.delegateCount,
-			cur = event.target;
-
-		// Support (at least): Chrome, IE9
-		// Find delegate handlers
-		// Black-hole SVG <use> instance trees (#13180)
-		//
-		// Support: Firefox<=42+
-		// Avoid non-left-click in FF but don't block IE radio events (#3861, gh-2343)
-		if ( delegateCount && cur.nodeType &&
-			( event.type !== "click" || isNaN( event.button ) || event.button < 1 ) ) {
-
-			for ( ; cur !== this; cur = cur.parentNode || this ) {
-
-				// Don't check non-elements (#13208)
-				// Don't process clicks on disabled elements (#6911, #8165, #11382, #11764)
-				if ( cur.nodeType === 1 && ( cur.disabled !== true || event.type !== "click" ) ) {
-					matches = [];
-					for ( i = 0; i < delegateCount; i++ ) {
-						handleObj = handlers[ i ];
-
-						// Don't conflict with Object.prototype properties (#13203)
-						sel = handleObj.selector + " ";
-
-						if ( matches[ sel ] === undefined ) {
-							matches[ sel ] = handleObj.needsContext ?
-								jQuery( sel, this ).index( cur ) > -1 :
-								jQuery.find( sel, this, null, [ cur ] ).length;
-						}
-						if ( matches[ sel ] ) {
-							matches.push( handleObj );
-						}
-					}
-					if ( matches.length ) {
-						handlerQueue.push( { elem: cur, handlers: matches } );
-					}
-				}
-			}
-		}
-
-		// Add the remaining (directly-bound) handlers
-		if ( delegateCount < handlers.length ) {
-			handlerQueue.push( { elem: this, handlers: handlers.slice( delegateCount ) } );
-		}
-
-		return handlerQueue;
-	},
-
-	// Includes some event props shared by KeyEvent and MouseEvent
-	props: ( "altKey bubbles cancelable ctrlKey currentTarget detail eventPhase " +
-		"metaKey relatedTarget shiftKey target timeStamp view which" ).split( " " ),
-
-	fixHooks: {},
-
-	keyHooks: {
-		props: "char charCode key keyCode".split( " " ),
-		filter: function( event, original ) {
-
-			// Add which for key events
-			if ( event.which == null ) {
-				event.which = original.charCode != null ? original.charCode : original.keyCode;
-			}
-
-			return event;
-		}
-	},
-
-	mouseHooks: {
-		props: ( "button buttons clientX clientY offsetX offsetY pageX pageY " +
-			"screenX screenY toElement" ).split( " " ),
-		filter: function( event, original ) {
-			var eventDoc, doc, body,
-				button = original.button;
-
-			// Calculate pageX/Y if missing and clientX/Y available
-			if ( event.pageX == null && original.clientX != null ) {
-				eventDoc = event.target.ownerDocument || document;
-				doc = eventDoc.documentElement;
-				body = eventDoc.body;
-
-				event.pageX = original.clientX +
-					( doc && doc.scrollLeft || body && body.scrollLeft || 0 ) -
-					( doc && doc.clientLeft || body && body.clientLeft || 0 );
-				event.pageY = original.clientY +
-					( doc && doc.scrollTop  || body && body.scrollTop  || 0 ) -
-					( doc && doc.clientTop  || body && body.clientTop  || 0 );
-			}
-
-			// Add which for click: 1 === left; 2 === middle; 3 === right
-			// Note: button is not normalized, so don't use it
-			if ( !event.which && button !== undefined ) {
-				event.which = ( button & 1 ? 1 : ( button & 2 ? 3 : ( button & 4 ? 2 : 0 ) ) );
-			}
-
-			return event;
-		}
-	},
-
-	fix: function( event ) {
-		if ( event[ jQuery.expando ] ) {
-			return event;
-		}
-
-		// Create a writable copy of the event object and normalize some properties
-		var i, prop, copy,
-			type = event.type,
-			originalEvent = event,
-			fixHook = this.fixHooks[ type ];
-
-		if ( !fixHook ) {
-			this.fixHooks[ type ] = fixHook =
-				rmouseEvent.test( type ) ? this.mouseHooks :
-				rkeyEvent.test( type ) ? this.keyHooks :
-				{};
-		}
-		copy = fixHook.props ? this.props.concat( fixHook.props ) : this.props;
-
-		event = new jQuery.Event( originalEvent );
-
-		i = copy.length;
-		while ( i-- ) {
-			prop = copy[ i ];
-			event[ prop ] = originalEvent[ prop ];
-		}
-
-		// Support: Cordova 2.5 (WebKit) (#13255)
-		// All events should have a target; Cordova deviceready doesn't
-		if ( !event.target ) {
-			event.target = document;
-		}
-
-		// Support: Safari 6.0+, Chrome<28
-		// Target should not be a text node (#504, #13143)
-		if ( event.target.nodeType === 3 ) {
-			event.target = event.target.parentNode;
-		}
-
-		return fixHook.filter ? fixHook.filter( event, originalEvent ) : event;
-	},
-
-	special: {
-		load: {
-
-			// Prevent triggered image.load events from bubbling to window.load
-			noBubble: true
-		},
-		focus: {
-
-			// Fire native event if possible so blur/focus sequence is correct
-			trigger: function() {
-				if ( this !== safeActiveElement() && this.focus ) {
-					this.focus();
-					return false;
-				}
-			},
-			delegateType: "focusin"
-		},
-		blur: {
-			trigger: function() {
-				if ( this === safeActiveElement() && this.blur ) {
-					this.blur();
-					return false;
-				}
-			},
-			delegateType: "focusout"
-		},
-		click: {
-
-			// For checkbox, fire native event so checked state will be right
-			trigger: function() {
-				if ( this.type === "checkbox" && this.click && jQuery.nodeName( this, "input" ) ) {
-					this.click();
-					return false;
-				}
-			},
-
-			// For cross-browser consistency, don't fire native .click() on links
-			_default: function( event ) {
-				return jQuery.nodeName( event.target, "a" );
-			}
-		},
-
-		beforeunload: {
-			postDispatch: function( event ) {
-
-				// Support: Firefox 20+
-				// Firefox doesn't alert if the returnValue field is not set.
-				if ( event.result !== undefined && event.originalEvent ) {
-					event.originalEvent.returnValue = event.result;
-				}
-			}
-		}
-	}
-};
-
-jQuery.removeEvent = function( elem, type, handle ) {
-
-	// This "if" is needed for plain objects
-	if ( elem.removeEventListener ) {
-		elem.removeEventListener( type, handle );
-	}
-};
-
-jQuery.Event = function( src, props ) {
-
-	// Allow instantiation without the 'new' keyword
-	if ( !( this instanceof jQuery.Event ) ) {
-		return new jQuery.Event( src, props );
-	}
-
-	// Event object
-	if ( src && src.type ) {
-		this.originalEvent = src;
-		this.type = src.type;
-
-		// Events bubbling up the document may have been marked as prevented
-		// by a handler lower down the tree; reflect the correct value.
-		this.isDefaultPrevented = src.defaultPrevented ||
-				src.defaultPrevented === undefined &&
-
-				// Support: Android<4.0
-				src.returnValue === false ?
-			returnTrue :
-			returnFalse;
-
-	// Event type
-	} else {
-		this.type = src;
-	}
-
-	// Put explicitly provided properties onto the event object
-	if ( props ) {
-		jQuery.extend( this, props );
-	}
-
-	// Create a timestamp if incoming event doesn't have one
-	this.timeStamp = src && src.timeStamp || jQuery.now();
-
-	// Mark it as fixed
-	this[ jQuery.expando ] = true;
-};
-
-// jQuery.Event is based on DOM3 Events as specified by the ECMAScript Language Binding
-// http://www.w3.org/TR/2003/WD-DOM-Level-3-Events-20030331/ecma-script-binding.html
-jQuery.Event.prototype = {
-	constructor: jQuery.Event,
-	isDefaultPrevented: returnFalse,
-	isPropagationStopped: returnFalse,
-	isImmediatePropagationStopped: returnFalse,
-	isSimulated: false,
-
-	preventDefault: function() {
-		var e = this.originalEvent;
-
-		this.isDefaultPrevented = returnTrue;
-
-		if ( e && !this.isSimulated ) {
-			e.preventDefault();
-		}
-	},
-	stopPropagation: function() {
-		var e = this.originalEvent;
-
-		this.isPropagationStopped = returnTrue;
-
-		if ( e && !this.isSimulated ) {
-			e.stopPropagation();
-		}
-	},
-	stopImmediatePropagation: function() {
-		var e = this.originalEvent;
-
-		this.isImmediatePropagationStopped = returnTrue;
-
-		if ( e && !this.isSimulated ) {
-			e.stopImmediatePropagation();
-		}
-
-		this.stopPropagation();
-	}
-};
-
-// Create mouseenter/leave events using mouseover/out and event-time checks
-// so that event delegation works in jQuery.
-// Do the same for pointerenter/pointerleave and pointerover/pointerout
-//
-// Support: Safari 7 only
-// Safari sends mouseenter too often; see:
-// https://code.google.com/p/chromium/issues/detail?id=470258
-// for the description of the bug (it existed in older Chrome versions as well).
-jQuery.each( {
-	mouseenter: "mouseover",
-	mouseleave: "mouseout",
-	pointerenter: "pointerover",
-	pointerleave: "pointerout"
-}, function( orig, fix ) {
-	jQuery.event.special[ orig ] = {
-		delegateType: fix,
-		bindType: fix,
-
-		handle: function( event ) {
-			var ret,
-				target = this,
-				related = event.relatedTarget,
-				handleObj = event.handleObj;
-
-			// For mouseenter/leave call the handler if related is outside the target.
-			// NB: No relatedTarget if the mouse left/entered the browser window
-			if ( !related || ( related !== target && !jQuery.contains( target, related ) ) ) {
-				event.type = handleObj.origType;
-				ret = handleObj.handler.apply( this, arguments );
-				event.type = fix;
-			}
-			return ret;
-		}
-	};
-} );
-
-jQuery.fn.extend( {
-	on: function( types, selector, data, fn ) {
-		return on( this, types, selector, data, fn );
-	},
-	one: function( types, selector, data, fn ) {
-		return on( this, types, selector, data, fn, 1 );
-	},
-	off: function( types, selector, fn ) {
-		var handleObj, type;
-		if ( types && types.preventDefault && types.handleObj ) {
-
-			// ( event )  dispatched jQuery.Event
-			handleObj = types.handleObj;
-			jQuery( types.delegateTarget ).off(
-				handleObj.namespace ?
-					handleObj.origType + "." + handleObj.namespace :
-					handleObj.origType,
-				handleObj.selector,
-				handleObj.handler
-			);
-			return this;
-		}
-		if ( typeof types === "object" ) {
-
-			// ( types-object [, selector] )
-			for ( type in types ) {
-				this.off( type, selector, types[ type ] );
-			}
-			return this;
-		}
-		if ( selector === false || typeof selector === "function" ) {
-
-			// ( types [, fn] )
-			fn = selector;
-			selector = undefined;
-		}
-		if ( fn === false ) {
-			fn = returnFalse;
-		}
-		return this.each( function() {
-			jQuery.event.remove( this, types, fn, selector );
-		} );
-	}
-} );
-
-
-var
-	rxhtmlTag = /<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:-]+)[^>]*)\/>/gi,
-
-	// Support: IE 10-11, Edge 10240+
-	// In IE/Edge using regex groups here causes severe slowdowns.
-	// See https://connect.microsoft.com/IE/feedback/details/1736512/
-	rnoInnerhtml = /<script|<style|<link/i,
-
-	// checked="checked" or checked
-	rchecked = /checked\s*(?:[^=]|=\s*.checked.)/i,
-	rscriptTypeMasked = /^true\/(.*)/,
-	rcleanScript = /^\s*<!(?:\[CDATA\[|--)|(?:\]\]|--)>\s*$/g;
-
-// Manipulating tables requires a tbody
-function manipulationTarget( elem, content ) {
-	return jQuery.nodeName( elem, "table" ) &&
-		jQuery.nodeName( content.nodeType !== 11 ? content : content.firstChild, "tr" ) ?
-
-		elem.getElementsByTagName( "tbody" )[ 0 ] ||
-			elem.appendChild( elem.ownerDocument.createElement( "tbody" ) ) :
-		elem;
-}
-
-// Replace/restore the type attribute of script elements for safe DOM manipulation
-function disableScript( elem ) {
-	elem.type = ( elem.getAttribute( "type" ) !== null ) + "/" + elem.type;
-	return elem;
-}
-function restoreScript( elem ) {
-	var match = rscriptTypeMasked.exec( elem.type );
-
-	if ( match ) {
-		elem.type = match[ 1 ];
-	} else {
-		elem.removeAttribute( "type" );
-	}
-
-	return elem;
-}
-
-function cloneCopyEvent( src, dest ) {
-	var i, l, type, pdataOld, pdataCur, udataOld, udataCur, events;
-
-	if ( dest.nodeType !== 1 ) {
-		return;
-	}
-
-	// 1. Copy private data: events, handlers, etc.
-	if ( dataPriv.hasData( src ) ) {
-		pdataOld = dataPriv.access( src );
-		pdataCur = dataPriv.set( dest, pdataOld );
-		events = pdataOld.events;
-
-		if ( events ) {
-			delete pdataCur.handle;
-			pdataCur.events = {};
-
-			for ( type in events ) {
-				for ( i = 0, l = events[ type ].length; i < l; i++ ) {
-					jQuery.event.add( dest, type, events[ type ][ i ] );
-				}
-			}
-		}
-	}
-
-	// 2. Copy user data
-	if ( dataUser.hasData( src ) ) {
-		udataOld = dataUser.access( src );
-		udataCur = jQuery.extend( {}, udataOld );
-
-		dataUser.set( dest, udataCur );
-	}
-}
-
-// Fix IE bugs, see support tests
-function fixInput( src, dest ) {
-	var nodeName = dest.nodeName.toLowerCase();
-
-	// Fails to persist the checked state of a cloned checkbox or radio button.
-	if ( nodeName === "input" && rcheckableType.test( src.type ) ) {
-		dest.checked = src.checked;
-
-	// Fails to return the selected option to the default selected state when cloning options
-	} else if ( nodeName === "input" || nodeName === "textarea" ) {
-		dest.defaultValue = src.defaultValue;
-	}
-}
-
-function domManip( collection, args, callback, ignored ) {
-
-	// Flatten any nested arrays
-	args = concat.apply( [], args );
-
-	var fragment, first, scripts, hasScripts, node, doc,
-		i = 0,
-		l = collection.length,
-		iNoClone = l - 1,
-		value = args[ 0 ],
-		isFunction = jQuery.isFunction( value );
-
-	// We can't cloneNode fragments that contain checked, in WebKit
-	if ( isFunction ||
-			( l > 1 && typeof value === "string" &&
-				!support.checkClone && rchecked.test( value ) ) ) {
-		return collection.each( function( index ) {
-			var self = collection.eq( index );
-			if ( isFunction ) {
-				args[ 0 ] = value.call( this, index, self.html() );
-			}
-			domManip( self, args, callback, ignored );
-		} );
-	}
-
-	if ( l ) {
-		fragment = buildFragment( args, collection[ 0 ].ownerDocument, false, collection, ignored );
-		first = fragment.firstChild;
-
-		if ( fragment.childNodes.length === 1 ) {
-			fragment = first;
-		}
-
-		// Require either new content or an interest in ignored elements to invoke the callback
-		if ( first || ignored ) {
-			scripts = jQuery.map( getAll( fragment, "script" ), disableScript );
-			hasScripts = scripts.length;
-
-			// Use the original fragment for the last item
-			// instead of the first because it can end up
-			// being emptied incorrectly in certain situations (#8070).
-			for ( ; i < l; i++ ) {
-				node = fragment;
-
-				if ( i !== iNoClone ) {
-					node = jQuery.clone( node, true, true );
-
-					// Keep references to cloned scripts for later restoration
-					if ( hasScripts ) {
-
-						// Support: Android<4.1, PhantomJS<2
-						// push.apply(_, arraylike) throws on ancient WebKit
-						jQuery.merge( scripts, getAll( node, "script" ) );
-					}
-				}
-
-				callback.call( collection[ i ], node, i );
-			}
-
-			if ( hasScripts ) {
-				doc = scripts[ scripts.length - 1 ].ownerDocument;
-
-				// Reenable scripts
-				jQuery.map( scripts, restoreScript );
-
-				// Evaluate executable scripts on first document insertion
-				for ( i = 0; i < hasScripts; i++ ) {
-					node = scripts[ i ];
-					if ( rscriptType.test( node.type || "" ) &&
-						!dataPriv.access( node, "globalEval" ) &&
-						jQuery.contains( doc, node ) ) {
-
-						if ( node.src ) {
-
-							// Optional AJAX dependency, but won't run scripts if not present
-							if ( jQuery._evalUrl ) {
-								jQuery._evalUrl( node.src );
-							}
-						} else {
-							jQuery.globalEval( node.textContent.replace( rcleanScript, "" ) );
-						}
-					}
-				}
-			}
-		}
-	}
-
-	return collection;
-}
-
-function remove( elem, selector, keepData ) {
-	var node,
-		nodes = selector ? jQuery.filter( selector, elem ) : elem,
-		i = 0;
-
-	for ( ; ( node = nodes[ i ] ) != null; i++ ) {
-		if ( !keepData && node.nodeType === 1 ) {
-			jQuery.cleanData( getAll( node ) );
-		}
-
-		if ( node.parentNode ) {
-			if ( keepData && jQuery.contains( node.ownerDocument, node ) ) {
-				setGlobalEval( getAll( node, "script" ) );
-			}
-			node.parentNode.removeChild( node );
-		}
-	}
-
-	return elem;
-}
-
-jQuery.extend( {
-	htmlPrefilter: function( html ) {
-		return html.replace( rxhtmlTag, "<$1></$2>" );
-	},
-
-	clone: function( elem, dataAndEvents, deepDataAndEvents ) {
-		var i, l, srcElements, destElements,
-			clone = elem.cloneNode( true ),
-			inPage = jQuery.contains( elem.ownerDocument, elem );
-
-		// Fix IE cloning issues
-		if ( !support.noCloneChecked && ( elem.nodeType === 1 || elem.nodeType === 11 ) &&
-				!jQuery.isXMLDoc( elem ) ) {
-
-			// We eschew Sizzle here for performance reasons: http://jsperf.com/getall-vs-sizzle/2
-			destElements = getAll( clone );
-			srcElements = getAll( elem );
-
-			for ( i = 0, l = srcElements.length; i < l; i++ ) {
-				fixInput( srcElements[ i ], destElements[ i ] );
-			}
-		}
-
-		// Copy the events from the original to the clone
-		if ( dataAndEvents ) {
-			if ( deepDataAndEvents ) {
-				srcElements = srcElements || getAll( elem );
-				destElements = destElements || getAll( clone );
-
-				for ( i = 0, l = srcElements.length; i < l; i++ ) {
-					cloneCopyEvent( srcElements[ i ], destElements[ i ] );
-				}
-			} else {
-				cloneCopyEvent( elem, clone );
-			}
-		}
-
-		// Preserve script evaluation history
-		destElements = getAll( clone, "script" );
-		if ( destElements.length > 0 ) {
-			setGlobalEval( destElements, !inPage && getAll( elem, "script" ) );
-		}
-
-		// Return the cloned set
-		return clone;
-	},
-
-	cleanData: function( elems ) {
-		var data, elem, type,
-			special = jQuery.event.special,
-			i = 0;
-
-		for ( ; ( elem = elems[ i ] ) !== undefined; i++ ) {
-			if ( acceptData( elem ) ) {
-				if ( ( data = elem[ dataPriv.expando ] ) ) {
-					if ( data.events ) {
-						for ( type in data.events ) {
-							if ( special[ type ] ) {
-								jQuery.event.remove( elem, type );
-
-							// This is a shortcut to avoid jQuery.event.remove's overhead
-							} else {
-								jQuery.removeEvent( elem, type, data.handle );
-							}
-						}
-					}
-
-					// Support: Chrome <= 35-45+
-					// Assign undefined instead of using delete, see Data#remove
-					elem[ dataPriv.expando ] = undefined;
-				}
-				if ( elem[ dataUser.expando ] ) {
-
-					// Support: Chrome <= 35-45+
-					// Assign undefined instead of using delete, see Data#remove
-					elem[ dataUser.expando ] = undefined;
-				}
-			}
-		}
-	}
-} );
-
-jQuery.fn.extend( {
-
-	// Keep domManip exposed until 3.0 (gh-2225)
-	domManip: domManip,
-
-	detach: function( selector ) {
-		return remove( this, selector, true );
-	},
-
-	remove: function( selector ) {
-		return remove( this, selector );
-	},
-
-	text: function( value ) {
-		return access( this, function( value ) {
-			return value === undefined ?
-				jQuery.text( this ) :
-				this.empty().each( function() {
-					if ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) {
-						this.textContent = value;
-					}
-				} );
-		}, null, value, arguments.length );
-	},
-
-	append: function() {
-		return domManip( this, arguments, function( elem ) {
-			if ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) {
-				var target = manipulationTarget( this, elem );
-				target.appendChild( elem );
-			}
-		} );
-	},
-
-	prepend: function() {
-		return domManip( this, arguments, function( elem ) {
-			if ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) {
-				var target = manipulationTarget( this, elem );
-				target.insertBefore( elem, target.firstChild );
-			}
-		} );
-	},
-
-	before: function() {
-		return domManip( this, arguments, function( elem ) {
-			if ( this.parentNode ) {
-				this.parentNode.insertBefore( elem, this );
-			}
-		} );
-	},
-
-	after: function() {
-		return domManip( this, arguments, function( elem ) {
-			if ( this.parentNode ) {
-				this.parentNode.insertBefore( elem, this.nextSibling );
-			}
-		} );
-	},
-
-	empty: function() {
-		var elem,
-			i = 0;
-
-		for ( ; ( elem = this[ i ] ) != null; i++ ) {
-			if ( elem.nodeType === 1 ) {
-
-				// Prevent memory leaks
-				jQuery.cleanData( getAll( elem, false ) );
-
-				// Remove any remaining nodes
-				elem.textContent = "";
-			}
-		}
-
-		return this;
-	},
-
-	clone: function( dataAndEvents, deepDataAndEvents ) {
-		dataAndEvents = dataAndEvents == null ? false : dataAndEvents;
-		deepDataAndEvents = deepDataAndEvents == null ? dataAndEvents : deepDataAndEvents;
-
-		return this.map( function() {
-			return jQuery.clone( this, dataAndEvents, deepDataAndEvents );
-		} );
-	},
-
-	html: function( value ) {
-		return access( this, function( value ) {
-			var elem = this[ 0 ] || {},
-				i = 0,
-				l = this.length;
-
-			if ( value === undefined && elem.nodeType === 1 ) {
-				return elem.innerHTML;
-			}
-
-			// See if we can take a shortcut and just use innerHTML
-			if ( typeof value === "string" && !rnoInnerhtml.test( value ) &&
-				!wrapMap[ ( rtagName.exec( value ) || [ "", "" ] )[ 1 ].toLowerCase() ] ) {
-
-				value = jQuery.htmlPrefilter( value );
-
-				try {
-					for ( ; i < l; i++ ) {
-						elem = this[ i ] || {};
-
-						// Remove element nodes and prevent memory leaks
-						if ( elem.nodeType === 1 ) {
-							jQuery.cleanData( getAll( elem, false ) );
-							elem.innerHTML = value;
-						}
-					}
-
-					elem = 0;
-
-				// If using innerHTML throws an exception, use the fallback method
-				} catch ( e ) {}
-			}
-
-			if ( elem ) {
-				this.empty().append( value );
-			}
-		}, null, value, arguments.length );
-	},
-
-	replaceWith: function() {
-		var ignored = [];
-
-		// Make the changes, replacing each non-ignored context element with the new content
-		return domManip( this, arguments, function( elem ) {
-			var parent = this.parentNode;
-
-			if ( jQuery.inArray( this, ignored ) < 0 ) {
-				jQuery.cleanData( getAll( this ) );
-				if ( parent ) {
-					parent.replaceChild( elem, this );
-				}
-			}
-
-		// Force callback invocation
-		}, ignored );
-	}
-} );
-
-jQuery.each( {
-	appendTo: "append",
-	prependTo: "prepend",
-	insertBefore: "before",
-	insertAfter: "after",
-	replaceAll: "replaceWith"
-}, function( name, original ) {
-	jQuery.fn[ name ] = function( selector ) {
-		var elems,
-			ret = [],
-			insert = jQuery( selector ),
-			last = insert.length - 1,
-			i = 0;
-
-		for ( ; i <= last; i++ ) {
-			elems = i === last ? this : this.clone( true );
-			jQuery( insert[ i ] )[ original ]( elems );
-
-			// Support: QtWebKit
-			// .get() because push.apply(_, arraylike) throws
-			push.apply( ret, elems.get() );
-		}
-
-		return this.pushStack( ret );
-	};
-} );
-
-
-var iframe,
-	elemdisplay = {
-
-		// Support: Firefox
-		// We have to pre-define these values for FF (#10227)
-		HTML: "block",
-		BODY: "block"
-	};
-
-/**
- * Retrieve the actual display of a element
- * @param {String} name nodeName of the element
- * @param {Object} doc Document object
- */
-
-// Called only from within defaultDisplay
-function actualDisplay( name, doc ) {
-	var elem = jQuery( doc.createElement( name ) ).appendTo( doc.body ),
-
-		display = jQuery.css( elem[ 0 ], "display" );
-
-	// We don't have any data stored on the element,
-	// so use "detach" method as fast way to get rid of the element
-	elem.detach();
-
-	return display;
-}
-
-/**
- * Try to determine the default display value of an element
- * @param {String} nodeName
- */
-function defaultDisplay( nodeName ) {
-	var doc = document,
-		display = elemdisplay[ nodeName ];
-
-	if ( !display ) {
-		display = actualDisplay( nodeName, doc );
-
-		// If the simple way fails, read from inside an iframe
-		if ( display === "none" || !display ) {
-
-			// Use the already-created iframe if possible
-			iframe = ( iframe || jQuery( "<iframe frameborder='0' width='0' height='0'/>" ) )
-				.appendTo( doc.documentElement );
-
-			// Always write a new HTML skeleton so Webkit and Firefox don't choke on reuse
-			doc = iframe[ 0 ].contentDocument;
-
-			// Support: IE
-			doc.write();
-			doc.close();
-
-			display = actualDisplay( nodeName, doc );
-			iframe.detach();
-		}
-
-		// Store the correct default display
-		elemdisplay[ nodeName ] = display;
-	}
-
-	return display;
-}
-var rmargin = ( /^margin/ );
-
-var rnumnonpx = new RegExp( "^(" + pnum + ")(?!px)[a-z%]+$", "i" );
-
-var getStyles = function( elem ) {
-
-		// Support: IE<=11+, Firefox<=30+ (#15098, #14150)
-		// IE throws on elements created in popups
-		// FF meanwhile throws on frame elements through "defaultView.getComputedStyle"
-		var view = elem.ownerDocument.defaultView;
-
-		if ( !view || !view.opener ) {
-			view = window;
-		}
-
-		return view.getComputedStyle( elem );
-	};
-
-var swap = function( elem, options, callback, args ) {
-	var ret, name,
-		old = {};
-
-	// Remember the old values, and insert the new ones
-	for ( name in options ) {
-		old[ name ] = elem.style[ name ];
-		elem.style[ name ] = options[ name ];
-	}
-
-	ret = callback.apply( elem, args || [] );
-
-	// Revert the old values
-	for ( name in options ) {
-		elem.style[ name ] = old[ name ];
-	}
-
-	return ret;
-};
-
-
-var documentElement = document.documentElement;
-
-
-
-( function() {
-	var pixelPositionVal, boxSizingReliableVal, pixelMarginRightVal, reliableMarginLeftVal,
-		container = document.createElement( "div" ),
-		div = document.createElement( "div" );
-
-	// Finish early in limited (non-browser) environments
-	if ( !div.style ) {
-		return;
-	}
-
-	// Support: IE9-11+
-	// Style of cloned element affects source element cloned (#8908)
-	div.style.backgroundClip = "content-box";
-	div.cloneNode( true ).style.backgroundClip = "";
-	support.clearCloneStyle = div.style.backgroundClip === "content-box";
-
-	container.style.cssText = "border:0;width:8px;height:0;top:0;left:-9999px;" +
-		"padding:0;margin-top:1px;position:absolute";
-	container.appendChild( div );
-
-	// Executing both pixelPosition & boxSizingReliable tests require only one layout
-	// so they're executed at the same time to save the second computation.
-	function computeStyleTests() {
-		div.style.cssText =
-
-			// Support: Firefox<29, Android 2.3
-			// Vendor-prefix box-sizing
-			"-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;" +
-			"position:relative;display:block;" +
-			"margin:auto;border:1px;padding:1px;" +
-			"top:1%;width:50%";
-		div.innerHTML = "";
-		documentElement.appendChild( container );
-
-		var divStyle = window.getComputedStyle( div );
-		pixelPositionVal = divStyle.top !== "1%";
-		reliableMarginLeftVal = divStyle.marginLeft === "2px";
-		boxSizingReliableVal = divStyle.width === "4px";
-
-		// Support: Android 4.0 - 4.3 only
-		// Some styles come back with percentage values, even though they shouldn't
-		div.style.marginRight = "50%";
-		pixelMarginRightVal = divStyle.marginRight === "4px";
-
-		documentElement.removeChild( container );
-	}
-
-	jQuery.extend( support, {
-		pixelPosition: function() {
-
-			// This test is executed only once but we still do memoizing
-			// since we can use the boxSizingReliable pre-computing.
-			// No need to check if the test was already performed, though.
-			computeStyleTests();
-			return pixelPositionVal;
-		},
-		boxSizingReliable: function() {
-			if ( boxSizingReliableVal == null ) {
-				computeStyleTests();
-			}
-			return boxSizingReliableVal;
-		},
-		pixelMarginRight: function() {
-
-			// Support: Android 4.0-4.3
-			// We're checking for boxSizingReliableVal here instead of pixelMarginRightVal
-			// since that compresses better and they're computed together anyway.
-			if ( boxSizingReliableVal == null ) {
-				computeStyleTests();
-			}
-			return pixelMarginRightVal;
-		},
-		reliableMarginLeft: function() {
-
-			// Support: IE <=8 only, Android 4.0 - 4.3 only, Firefox <=3 - 37
-			if ( boxSizingReliableVal == null ) {
-				computeStyleTests();
-			}
-			return reliableMarginLeftVal;
-		},
-		reliableMarginRight: function() {
-
-			// Support: Android 2.3
-			// Check if div with explicit width and no margin-right incorrectly
-			// gets computed margin-right based on width of container. (#3333)
-			// WebKit Bug 13343 - getComputedStyle returns wrong value for margin-right
-			// This support function is only executed once so no memoizing is needed.
-			var ret,
-				marginDiv = div.appendChild( document.createElement( "div" ) );
-
-			// Reset CSS: box-sizing; display; margin; border; padding
-			marginDiv.style.cssText = div.style.cssText =
-
-				// Support: Android 2.3
-				// Vendor-prefix box-sizing
-				"-webkit-box-sizing:content-box;box-sizing:content-box;" +
-				"display:block;margin:0;border:0;padding:0";
-			marginDiv.style.marginRight = marginDiv.style.width = "0";
-			div.style.width = "1px";
-			documentElement.appendChild( container );
-
-			ret = !parseFloat( window.getComputedStyle( marginDiv ).marginRight );
-
-			documentElement.removeChild( container );
-			div.removeChild( marginDiv );
-
-			return ret;
-		}
-	} );
-} )();
-
-
-function curCSS( elem, name, computed ) {
-	var width, minWidth, maxWidth, ret,
-		style = elem.style;
-
-	computed = computed || getStyles( elem );
-	ret = computed ? computed.getPropertyValue( name ) || computed[ name ] : undefined;
-
-	// Support: Opera 12.1x only
-	// Fall back to style even without computed
-	// computed is undefined for elems on document fragments
-	if ( ( ret === "" || ret === undefined ) && !jQuery.contains( elem.ownerDocument, elem ) ) {
-		ret = jQuery.style( elem, name );
-	}
-
-	// Support: IE9
-	// getPropertyValue is only needed for .css('filter') (#12537)
-	if ( computed ) {
-
-		// A tribute to the "awesome hack by Dean Edwards"
-		// Android Browser returns percentage for some values,
-		// but width seems to be reliably pixels.
-		// This is against the CSSOM draft spec:
-		// http://dev.w3.org/csswg/cssom/#resolved-values
-		if ( !support.pixelMarginRight() && rnumnonpx.test( ret ) && rmargin.test( name ) ) {
-
-			// Remember the original values
-			width = style.width;
-			minWidth = style.minWidth;
-			maxWidth = style.maxWidth;
-
-			// Put in the new values to get a computed value out
-			style.minWidth = style.maxWidth = style.width = ret;
-			ret = computed.width;
-
-			// Revert the changed values
-			style.width = width;
-			style.minWidth = minWidth;
-			style.maxWidth = maxWidth;
-		}
-	}
-
-	return ret !== undefined ?
-
-		// Support: IE9-11+
-		// IE returns zIndex value as an integer.
-		ret + "" :
-		ret;
-}
-
-
-function addGetHookIf( conditionFn, hookFn ) {
-
-	// Define the hook, we'll check on the first run if it's really needed.
-	return {
-		get: function() {
-			if ( conditionFn() ) {
-
-				// Hook not needed (or it's not possible to use it due
-				// to missing dependency), remove it.
-				delete this.get;
-				return;
-			}
-
-			// Hook needed; redefine it so that the support test is not executed again.
-			return ( this.get = hookFn ).apply( this, arguments );
-		}
-	};
-}
-
-
-var
-
-	// Swappable if display is none or starts with table
-	// except "table", "table-cell", or "table-caption"
-	// See here for display values: https://developer.mozilla.org/en-US/docs/CSS/display
-	rdisplayswap = /^(none|table(?!-c[ea]).+)/,
-
-	cssShow = { position: "absolute", visibility: "hidden", display: "block" },
-	cssNormalTransform = {
-		letterSpacing: "0",
-		fontWeight: "400"
-	},
-
-	cssPrefixes = [ "Webkit", "O", "Moz", "ms" ],
-	emptyStyle = document.createElement( "div" ).style;
-
-// Return a css property mapped to a potentially vendor prefixed property
-function vendorPropName( name ) {
-
-	// Shortcut for names that are not vendor prefixed
-	if ( name in emptyStyle ) {
-		return name;
-	}
-
-	// Check for vendor prefixed names
-	var capName = name[ 0 ].toUpperCase() + name.slice( 1 ),
-		i = cssPrefixes.length;
-
-	while ( i-- ) {
-		name = cssPrefixes[ i ] + capName;
-		if ( name in emptyStyle ) {
-			return name;
-		}
-	}
-}
-
-function setPositiveNumber( elem, value, subtract ) {
-
-	// Any relative (+/-) values have already been
-	// normalized at this point
-	var matches = rcssNum.exec( value );
-	return matches ?
-
-		// Guard against undefined "subtract", e.g., when used as in cssHooks
-		Math.max( 0, matches[ 2 ] - ( subtract || 0 ) ) + ( matches[ 3 ] || "px" ) :
-		value;
-}
-
-function augmentWidthOrHeight( elem, name, extra, isBorderBox, styles ) {
-	var i = extra === ( isBorderBox ? "border" : "content" ) ?
-
-		// If we already have the right measurement, avoid augmentation
-		4 :
-
-		// Otherwise initialize for horizontal or vertical properties
-		name === "width" ? 1 : 0,
-
-		val = 0;
-
-	for ( ; i < 4; i += 2 ) {
-
-		// Both box models exclude margin, so add it if we want it
-		if ( extra === "margin" ) {
-			val += jQuery.css( elem, extra + cssExpand[ i ], true, styles );
-		}
-
-		if ( isBorderBox ) {
-
-			// border-box includes padding, so remove it if we want content
-			if ( extra === "content" ) {
-				val -= jQuery.css( elem, "padding" + cssExpand[ i ], true, styles );
-			}
-
-			// At this point, extra isn't border nor margin, so remove border
-			if ( extra !== "margin" ) {
-				val -= jQuery.css( elem, "border" + cssExpand[ i ] + "Width", true, styles );
-			}
-		} else {
-
-			// At this point, extra isn't content, so add padding
-			val += jQuery.css( elem, "padding" + cssExpand[ i ], true, styles );
-
-			// At this point, extra isn't content nor padding, so add border
-			if ( extra !== "padding" ) {
-				val += jQuery.css( elem, "border" + cssExpand[ i ] + "Width", true, styles );
-			}
-		}
-	}
-
-	return val;
-}
-
-function getWidthOrHeight( elem, name, extra ) {
-
-	// Start with offset property, which is equivalent to the border-box value
-	var valueIsBorderBox = true,
-		val = name === "width" ? elem.offsetWidth : elem.offsetHeight,
-		styles = getStyles( elem ),
-		isBorderBox = jQuery.css( elem, "boxSizing", false, styles ) === "border-box";
-
-	// Some non-html elements return undefined for offsetWidth, so check for null/undefined
-	// svg - https://bugzilla.mozilla.org/show_bug.cgi?id=649285
-	// MathML - https://bugzilla.mozilla.org/show_bug.cgi?id=491668
-	if ( val <= 0 || val == null ) {
-
-		// Fall back to computed then uncomputed css if necessary
-		val = curCSS( elem, name, styles );
-		if ( val < 0 || val == null ) {
-			val = elem.style[ name ];
-		}
-
-		// Computed unit is not pixels. Stop here and return.
-		if ( rnumnonpx.test( val ) ) {
-			return val;
-		}
-
-		// Check for style in case a browser which returns unreliable values
-		// for getComputedStyle silently falls back to the reliable elem.style
-		valueIsBorderBox = isBorderBox &&
-			( support.boxSizingReliable() || val === elem.style[ name ] );
-
-		// Normalize "", auto, and prepare for extra
-		val = parseFloat( val ) || 0;
-	}
-
-	// Use the active box-sizing model to add/subtract irrelevant styles
-	return ( val +
-		augmentWidthOrHeight(
-			elem,
-			name,
-			extra || ( isBorderBox ? "border" : "content" ),
-			valueIsBorderBox,
-			styles
-		)
-	) + "px";
-}
-
-function showHide( elements, show ) {
-	var display, elem, hidden,
-		values = [],
-		index = 0,
-		length = elements.length;
-
-	for ( ; index < length; index++ ) {
-		elem = elements[ index ];
-		if ( !elem.style ) {
-			continue;
-		}
-
-		values[ index ] = dataPriv.get( elem, "olddisplay" );
-		display = elem.style.display;
-		if ( show ) {
-
-			// Reset the inline display of this element to learn if it is
-			// being hidden by cascaded rules or not
-			if ( !values[ index ] && display === "none" ) {
-				elem.style.display = "";
-			}
-
-			// Set elements which have been overridden with display: none
-			// in a stylesheet to whatever the default browser style is
-			// for such an element
-			if ( elem.style.display === "" && isHidden( elem ) ) {
-				values[ index ] = dataPriv.access(
-					elem,
-					"olddisplay",
-					defaultDisplay( elem.nodeName )
-				);
-			}
-		} else {
-			hidden = isHidden( elem );
-
-			if ( display !== "none" || !hidden ) {
-				dataPriv.set(
-					elem,
-					"olddisplay",
-					hidden ? display : jQuery.css( elem, "display" )
-				);
-			}
-		}
-	}
-
-	// Set the display of most of the elements in a second loop
-	// to avoid the constant reflow
-	for ( index = 0; index < length; index++ ) {
-		elem = elements[ index ];
-		if ( !elem.style ) {
-			continue;
-		}
-		if ( !show || elem.style.display === "none" || elem.style.display === "" ) {
-			elem.style.display = show ? values[ index ] || "" : "none";
-		}
-	}
-
-	return elements;
-}
-
-jQuery.extend( {
-
-	// Add in style property hooks for overriding the default
-	// behavior of getting and setting a style property
-	cssHooks: {
-		opacity: {
-			get: function( elem, computed ) {
-				if ( computed ) {
-
-					// We should always get a number back from opacity
-					var ret = curCSS( elem, "opacity" );
-					return ret === "" ? "1" : ret;
-				}
-			}
-		}
-	},
-
-	// Don't automatically add "px" to these possibly-unitless properties
-	cssNumber: {
-		"animationIterationCount": true,
-		"columnCount": true,
-		"fillOpacity": true,
-		"flexGrow": true,
-		"flexShrink": true,
-		"fontWeight": true,
-		"lineHeight": true,
-		"opacity": true,
-		"order": true,
-		"orphans": true,
-		"widows": true,
-		"zIndex": true,
-		"zoom": true
-	},
-
-	// Add in properties whose names you wish to fix before
-	// setting or getting the value
-	cssProps: {
-		"float": "cssFloat"
-	},
-
-	// Get and set the style property on a DOM Node
-	style: function( elem, name, value, extra ) {
-
-		// Don't set styles on text and comment nodes
-		if ( !elem || elem.nodeType === 3 || elem.nodeType === 8 || !elem.style ) {
-			return;
-		}
-
-		// Make sure that we're working with the right name
-		var ret, type, hooks,
-			origName = jQuery.camelCase( name ),
-			style = elem.style;
-
-		name = jQuery.cssProps[ origName ] ||
-			( jQuery.cssProps[ origName ] = vendorPropName( origName ) || origName );
-
-		// Gets hook for the prefixed version, then unprefixed version
-		hooks = jQuery.cssHooks[ name ] || jQuery.cssHooks[ origName ];
-
-		// Check if we're setting a value
-		if ( value !== undefined ) {
-			type = typeof value;
-
-			// Convert "+=" or "-=" to relative numbers (#7345)
-			if ( type === "string" && ( ret = rcssNum.exec( value ) ) && ret[ 1 ] ) {
-				value = adjustCSS( elem, name, ret );
-
-				// Fixes bug #9237
-				type = "number";
-			}
-
-			// Make sure that null and NaN values aren't set (#7116)
-			if ( value == null || value !== value ) {
-				return;
-			}
-
-			// If a number was passed in, add the unit (except for certain CSS properties)
-			if ( type === "number" ) {
-				value += ret && ret[ 3 ] || ( jQuery.cssNumber[ origName ] ? "" : "px" );
-			}
-
-			// Support: IE9-11+
-			// background-* props affect original clone's values
-			if ( !support.clearCloneStyle && value === "" && name.indexOf( "background" ) === 0 ) {
-				style[ name ] = "inherit";
-			}
-
-			// If a hook was provided, use that value, otherwise just set the specified value
-			if ( !hooks || !( "set" in hooks ) ||
-				( value = hooks.set( elem, value, extra ) ) !== undefined ) {
-
-				style[ name ] = value;
-			}
-
-		} else {
-
-			// If a hook was provided get the non-computed value from there
-			if ( hooks && "get" in hooks &&
-				( ret = hooks.get( elem, false, extra ) ) !== undefined ) {
-
-				return ret;
-			}
-
-			// Otherwise just get the value from the style object
-			return style[ name ];
-		}
-	},
-
-	css: function( elem, name, extra, styles ) {
-		var val, num, hooks,
-			origName = jQuery.camelCase( name );
-
-		// Make sure that we're working with the right name
-		name = jQuery.cssProps[ origName ] ||
-			( jQuery.cssProps[ origName ] = vendorPropName( origName ) || origName );
-
-		// Try prefixed name followed by the unprefixed name
-		hooks = jQuery.cssHooks[ name ] || jQuery.cssHooks[ origName ];
-
-		// If a hook was provided get the computed value from there
-		if ( hooks && "get" in hooks ) {
-			val = hooks.get( elem, true, extra );
-		}
-
-		// Otherwise, if a way to get the computed value exists, use that
-		if ( val === undefined ) {
-			val = curCSS( elem, name, styles );
-		}
-
-		// Convert "normal" to computed value
-		if ( val === "normal" && name in cssNormalTransform ) {
-			val = cssNormalTransform[ name ];
-		}
-
-		// Make numeric if forced or a qualifier was provided and val looks numeric
-		if ( extra === "" || extra ) {
-			num = parseFloat( val );
-			return extra === true || isFinite( num ) ? num || 0 : val;
-		}
-		return val;
-	}
-} );
-
-jQuery.each( [ "height", "width" ], function( i, name ) {
-	jQuery.cssHooks[ name ] = {
-		get: function( elem, computed, extra ) {
-			if ( computed ) {
-
-				// Certain elements can have dimension info if we invisibly show them
-				// but it must have a current display style that would benefit
-				return rdisplayswap.test( jQuery.css( elem, "display" ) ) &&
-					elem.offsetWidth === 0 ?
-						swap( elem, cssShow, function() {
-							return getWidthOrHeight( elem, name, extra );
-						} ) :
-						getWidthOrHeight( elem, name, extra );
-			}
-		},
-
-		set: function( elem, value, extra ) {
-			var matches,
-				styles = extra && getStyles( elem ),
-				subtract = extra && augmentWidthOrHeight(
-					elem,
-					name,
-					extra,
-					jQuery.css( elem, "boxSizing", false, styles ) === "border-box",
-					styles
-				);
-
-			// Convert to pixels if value adjustment is needed
-			if ( subtract && ( matches = rcssNum.exec( value ) ) &&
-				( matches[ 3 ] || "px" ) !== "px" ) {
-
-				elem.style[ name ] = value;
-				value = jQuery.css( elem, name );
-			}
-
-			return setPositiveNumber( elem, value, subtract );
-		}
-	};
-} );
-
-jQuery.cssHooks.marginLeft = addGetHookIf( support.reliableMarginLeft,
-	function( elem, computed ) {
-		if ( computed ) {
-			return ( parseFloat( curCSS( elem, "marginLeft" ) ) ||
-				elem.getBoundingClientRect().left -
-					swap( elem, { marginLeft: 0 }, function() {
-						return elem.getBoundingClientRect().left;
-					} )
-				) + "px";
-		}
-	}
-);
-
-// Support: Android 2.3
-jQuery.cssHooks.marginRight = addGetHookIf( support.reliableMarginRight,
-	function( elem, computed ) {
-		if ( computed ) {
-			return swap( elem, { "display": "inline-block" },
-				curCSS, [ elem, "marginRight" ] );
-		}
-	}
-);
-
-// These hooks are used by animate to expand properties
-jQuery.each( {
-	margin: "",
-	padding: "",
-	border: "Width"
-}, function( prefix, suffix ) {
-	jQuery.cssHooks[ prefix + suffix ] = {
-		expand: function( value ) {
-			var i = 0,
-				expanded = {},
-
-				// Assumes a single number if not a string
-				parts = typeof value === "string" ? value.split( " " ) : [ value ];
-
-			for ( ; i < 4; i++ ) {
-				expanded[ prefix + cssExpand[ i ] + suffix ] =
-					parts[ i ] || parts[ i - 2 ] || parts[ 0 ];
-			}
-
-			return expanded;
-		}
-	};
-
-	if ( !rmargin.test( prefix ) ) {
-		jQuery.cssHooks[ prefix + suffix ].set = setPositiveNumber;
-	}
-} );
-
-jQuery.fn.extend( {
-	css: function( name, value ) {
-		return access( this, function( elem, name, value ) {
-			var styles, len,
-				map = {},
-				i = 0;
-
-			if ( jQuery.isArray( name ) ) {
-				styles = getStyles( elem );
-				len = name.length;
-
-				for ( ; i < len; i++ ) {
-					map[ name[ i ] ] = jQuery.css( elem, name[ i ], false, styles );
-				}
-
-				return map;
-			}
-
-			return value !== undefined ?
-				jQuery.style( elem, name, value ) :
-				jQuery.css( elem, name );
-		}, name, value, arguments.length > 1 );
-	},
-	show: function() {
-		return showHide( this, true );
-	},
-	hide: function() {
-		return showHide( this );
-	},
-	toggle: function( state ) {
-		if ( typeof state === "boolean" ) {
-			return state ? this.show() : this.hide();
-		}
-
-		return this.each( function() {
-			if ( isHidden( this ) ) {
-				jQuery( this ).show();
-			} else {
-				jQuery( this ).hide();
-			}
-		} );
-	}
-} );
-
-
-function Tween( elem, options, prop, end, easing ) {
-	return new Tween.prototype.init( elem, options, prop, end, easing );
-}
-jQuery.Tween = Tween;
-
-Tween.prototype = {
-	constructor: Tween,
-	init: function( elem, options, prop, end, easing, unit ) {
-		this.elem = elem;
-		this.prop = prop;
-		this.easing = easing || jQuery.easing._default;
-		this.options = options;
-		this.start = this.now = this.cur();
-		this.end = end;
-		this.unit = unit || ( jQuery.cssNumber[ prop ] ? "" : "px" );
-	},
-	cur: function() {
-		var hooks = Tween.propHooks[ this.prop ];
-
-		return hooks && hooks.get ?
-			hooks.get( this ) :
-			Tween.propHooks._default.get( this );
-	},
-	run: function( percent ) {
-		var eased,
-			hooks = Tween.propHooks[ this.prop ];
-
-		if ( this.options.duration ) {
-			this.pos = eased = jQuery.easing[ this.easing ](
-				percent, this.options.duration * percent, 0, 1, this.options.duration
-			);
-		} else {
-			this.pos = eased = percent;
-		}
-		this.now = ( this.end - this.start ) * eased + this.start;
-
-		if ( this.options.step ) {
-			this.options.step.call( this.elem, this.now, this );
-		}
-
-		if ( hooks && hooks.set ) {
-			hooks.set( this );
-		} else {
-			Tween.propHooks._default.set( this );
-		}
-		return this;
-	}
-};
-
-Tween.prototype.init.prototype = Tween.prototype;
-
-Tween.propHooks = {
-	_default: {
-		get: function( tween ) {
-			var result;
-
-			// Use a property on the element directly when it is not a DOM element,
-			// or when there is no matching style property that exists.
-			if ( tween.elem.nodeType !== 1 ||
-				tween.elem[ tween.prop ] != null && tween.elem.style[ tween.prop ] == null ) {
-				return tween.elem[ tween.prop ];
-			}
-
-			// Passing an empty string as a 3rd parameter to .css will automatically
-			// attempt a parseFloat and fallback to a string if the parse fails.
-			// Simple values such as "10px" are parsed to Float;
-			// complex values such as "rotate(1rad)" are returned as-is.
-			result = jQuery.css( tween.elem, tween.prop, "" );
-
-			// Empty strings, null, undefined and "auto" are converted to 0.
-			return !result || result === "auto" ? 0 : result;
-		},
-		set: function( tween ) {
-
-			// Use step hook for back compat.
-			// Use cssHook if its there.
-			// Use .style if available and use plain properties where available.
-			if ( jQuery.fx.step[ tween.prop ] ) {
-				jQuery.fx.step[ tween.prop ]( tween );
-			} else if ( tween.elem.nodeType === 1 &&
-				( tween.elem.style[ jQuery.cssProps[ tween.prop ] ] != null ||
-					jQuery.cssHooks[ tween.prop ] ) ) {
-				jQuery.style( tween.elem, tween.prop, tween.now + tween.unit );
-			} else {
-				tween.elem[ tween.prop ] = tween.now;
-			}
-		}
-	}
-};
-
-// Support: IE9
-// Panic based approach to setting things on disconnected nodes
-Tween.propHooks.scrollTop = Tween.propHooks.scrollLeft = {
-	set: function( tween ) {
-		if ( tween.elem.nodeType && tween.elem.parentNode ) {
-			tween.elem[ tween.prop ] = tween.now;
-		}
-	}
-};
-
-jQuery.easing = {
-	linear: function( p ) {
-		return p;
-	},
-	swing: function( p ) {
-		return 0.5 - Math.cos( p * Math.PI ) / 2;
-	},
-	_default: "swing"
-};
-
-jQuery.fx = Tween.prototype.init;
-
-// Back Compat <1.8 extension point
-jQuery.fx.step = {};
-
-
-
-
-var
-	fxNow, timerId,
-	rfxtypes = /^(?:toggle|show|hide)$/,
-	rrun = /queueHooks$/;
-
-// Animations created synchronously will run synchronously
-function createFxNow() {
-	window.setTimeout( function() {
-		fxNow = undefined;
-	} );
-	return ( fxNow = jQuery.now() );
-}
-
-// Generate parameters to create a standard animation
-function genFx( type, includeWidth ) {
-	var which,
-		i = 0,
-		attrs = { height: type };
-
-	// If we include width, step value is 1 to do all cssExpand values,
-	// otherwise step value is 2 to skip over Left and Right
-	includeWidth = includeWidth ? 1 : 0;
-	for ( ; i < 4 ; i += 2 - includeWidth ) {
-		which = cssExpand[ i ];
-		attrs[ "margin" + which ] = attrs[ "padding" + which ] = type;
-	}
-
-	if ( includeWidth ) {
-		attrs.opacity = attrs.width = type;
-	}
-
-	return attrs;
-}
-
-function createTween( value, prop, animation ) {
-	var tween,
-		collection = ( Animation.tweeners[ prop ] || [] ).concat( Animation.tweeners[ "*" ] ),
-		index = 0,
-		length = collection.length;
-	for ( ; index < length; index++ ) {
-		if ( ( tween = collection[ index ].call( animation, prop, value ) ) ) {
-
-			// We're done with this property
-			return tween;
-		}
-	}
-}
-
-function defaultPrefilter( elem, props, opts ) {
-	/* jshint validthis: true */
-	var prop, value, toggle, tween, hooks, oldfire, display, checkDisplay,
-		anim = this,
-		orig = {},
-		style = elem.style,
-		hidden = elem.nodeType && isHidden( elem ),
-		dataShow = dataPriv.get( elem, "fxshow" );
-
-	// Handle queue: false promises
-	if ( !opts.queue ) {
-		hooks = jQuery._queueHooks( elem, "fx" );
-		if ( hooks.unqueued == null ) {
-			hooks.unqueued = 0;
-			oldfire = hooks.empty.fire;
-			hooks.empty.fire = function() {
-				if ( !hooks.unqueued ) {
-					oldfire();
-				}
-			};
-		}
-		hooks.unqueued++;
-
-		anim.always( function() {
-
-			// Ensure the complete handler is called before this completes
-			anim.always( function() {
-				hooks.unqueued--;
-				if ( !jQuery.queue( elem, "fx" ).length ) {
-					hooks.empty.fire();
-				}
-			} );
-		} );
-	}
-
-	// Height/width overflow pass
-	if ( elem.nodeType === 1 && ( "height" in props || "width" in props ) ) {
-
-		// Make sure that nothing sneaks out
-		// Record all 3 overflow attributes because IE9-10 do not
-		// change the overflow attribute when overflowX and
-		// overflowY are set to the same value
-		opts.overflow = [ style.overflow, style.overflowX, style.overflowY ];
-
-		// Set display property to inline-block for height/width
-		// animations on inline elements that are having width/height animated
-		display = jQuery.css( elem, "display" );
-
-		// Test default display if display is currently "none"
-		checkDisplay = display === "none" ?
-			dataPriv.get( elem, "olddisplay" ) || defaultDisplay( elem.nodeName ) : display;
-
-		if ( checkDisplay === "inline" && jQuery.css( elem, "float" ) === "none" ) {
-			style.display = "inline-block";
-		}
-	}
-
-	if ( opts.overflow ) {
-		style.overflow = "hidden";
-		anim.always( function() {
-			style.overflow = opts.overflow[ 0 ];
-			style.overflowX = opts.overflow[ 1 ];
-			style.overflowY = opts.overflow[ 2 ];
-		} );
-	}
-
-	// show/hide pass
-	for ( prop in props ) {
-		value = props[ prop ];
-		if ( rfxtypes.exec( value ) ) {
-			delete props[ prop ];
-			toggle = toggle || value === "toggle";
-			if ( value === ( hidden ? "hide" : "show" ) ) {
-
-				// If there is dataShow left over from a stopped hide or show
-				// and we are going to proceed with show, we should pretend to be hidden
-				if ( value === "show" && dataShow && dataShow[ prop ] !== undefined ) {
-					hidden = true;
-				} else {
-					continue;
-				}
-			}
-			orig[ prop ] = dataShow && dataShow[ prop ] || jQuery.style( elem, prop );
-
-		// Any non-fx value stops us from restoring the original display value
-		} else {
-			display = undefined;
-		}
-	}
-
-	if ( !jQuery.isEmptyObject( orig ) ) {
-		if ( dataShow ) {
-			if ( "hidden" in dataShow ) {
-				hidden = dataShow.hidden;
-			}
-		} else {
-			dataShow = dataPriv.access( elem, "fxshow", {} );
-		}
-
-		// Store state if its toggle - enables .stop().toggle() to "reverse"
-		if ( toggle ) {
-			dataShow.hidden = !hidden;
-		}
-		if ( hidden ) {
-			jQuery( elem ).show();
-		} else {
-			anim.done( function() {
-				jQuery( elem ).hide();
-			} );
-		}
-		anim.done( function() {
-			var prop;
-
-			dataPriv.remove( elem, "fxshow" );
-			for ( prop in orig ) {
-				jQuery.style( elem, prop, orig[ prop ] );
-			}
-		} );
-		for ( prop in orig ) {
-			tween = createTween( hidden ? dataShow[ prop ] : 0, prop, anim );
-
-			if ( !( prop in dataShow ) ) {
-				dataShow[ prop ] = tween.start;
-				if ( hidden ) {
-					tween.end = tween.start;
-					tween.start = prop === "width" || prop === "height" ? 1 : 0;
-				}
-			}
-		}
-
-	// If this is a noop like .hide().hide(), restore an overwritten display value
-	} else if ( ( display === "none" ? defaultDisplay( elem.nodeName ) : display ) === "inline" ) {
-		style.display = display;
-	}
-}
-
-function propFilter( props, specialEasing ) {
-	var index, name, easing, value, hooks;
-
-	// camelCase, specialEasing and expand cssHook pass
-	for ( index in props ) {
-		name = jQuery.camelCase( index );
-		easing = specialEasing[ name ];
-		value = props[ index ];
-		if ( jQuery.isArray( value ) ) {
-			easing = value[ 1 ];
-			value = props[ index ] = value[ 0 ];
-		}
-
-		if ( index !== name ) {
-			props[ name ] = value;
-			delete props[ index ];
-		}
-
-		hooks = jQuery.cssHooks[ name ];
-		if ( hooks && "expand" in hooks ) {
-			value = hooks.expand( value );
-			delete props[ name ];
-
-			// Not quite $.extend, this won't overwrite existing keys.
-			// Reusing 'index' because we have the correct "name"
-			for ( index in value ) {
-				if ( !( index in props ) ) {
-					props[ index ] = value[ index ];
-					specialEasing[ index ] = easing;
-				}
-			}
-		} else {
-			specialEasing[ name ] = easing;
-		}
-	}
-}
-
-function Animation( elem, properties, options ) {
-	var result,
-		stopped,
-		index = 0,
-		length = Animation.prefilters.length,
-		deferred = jQuery.Deferred().always( function() {
-
-			// Don't match elem in the :animated selector
-			delete tick.elem;
-		} ),
-		tick = function() {
-			if ( stopped ) {
-				return false;
-			}
-			var currentTime = fxNow || createFxNow(),
-				remaining = Math.max( 0, animation.startTime + animation.duration - currentTime ),
-
-				// Support: Android 2.3
-				// Archaic crash bug won't allow us to use `1 - ( 0.5 || 0 )` (#12497)
-				temp = remaining / animation.duration || 0,
-				percent = 1 - temp,
-				index = 0,
-				length = animation.tweens.length;
-
-			for ( ; index < length ; index++ ) {
-				animation.tweens[ index ].run( percent );
-			}
-
-			deferred.notifyWith( elem, [ animation, percent, remaining ] );
-
-			if ( percent < 1 && length ) {
-				return remaining;
-			} else {
-				deferred.resolveWith( elem, [ animation ] );
-				return false;
-			}
-		},
-		animation = deferred.promise( {
-			elem: elem,
-			props: jQuery.extend( {}, properties ),
-			opts: jQuery.extend( true, {
-				specialEasing: {},
-				easing: jQuery.easing._default
-			}, options ),
-			originalProperties: properties,
-			originalOptions: options,
-			startTime: fxNow || createFxNow(),
-			duration: options.duration,
-			tweens: [],
-			createTween: function( prop, end ) {
-				var tween = jQuery.Tween( elem, animation.opts, prop, end,
-						animation.opts.specialEasing[ prop ] || animation.opts.easing );
-				animation.tweens.push( tween );
-				return tween;
-			},
-			stop: function( gotoEnd ) {
-				var index = 0,
-
-					// If we are going to the end, we want to run all the tweens
-					// otherwise we skip this part
-					length = gotoEnd ? animation.tweens.length : 0;
-				if ( stopped ) {
-					return this;
-				}
-				stopped = true;
-				for ( ; index < length ; index++ ) {
-					animation.tweens[ index ].run( 1 );
-				}
-
-				// Resolve when we played the last frame; otherwise, reject
-				if ( gotoEnd ) {
-					deferred.notifyWith( elem, [ animation, 1, 0 ] );
-					deferred.resolveWith( elem, [ animation, gotoEnd ] );
-				} else {
-					deferred.rejectWith( elem, [ animation, gotoEnd ] );
-				}
-				return this;
-			}
-		} ),
-		props = animation.props;
-
-	propFilter( props, animation.opts.specialEasing );
-
-	for ( ; index < length ; index++ ) {
-		result = Animation.prefilters[ index ].call( animation, elem, props, animation.opts );
-		if ( result ) {
-			if ( jQuery.isFunction( result.stop ) ) {
-				jQuery._queueHooks( animation.elem, animation.opts.queue ).stop =
-					jQuery.proxy( result.stop, result );
-			}
-			return result;
-		}
-	}
-
-	jQuery.map( props, createTween, animation );
-
-	if ( jQuery.isFunction( animation.opts.start ) ) {
-		animation.opts.start.call( elem, animation );
-	}
-
-	jQuery.fx.timer(
-		jQuery.extend( tick, {
-			elem: elem,
-			anim: animation,
-			queue: animation.opts.queue
-		} )
-	);
-
-	// attach callbacks from options
-	return animation.progress( animation.opts.progress )
-		.done( animation.opts.done, animation.opts.complete )
-		.fail( animation.opts.fail )
-		.always( animation.opts.always );
-}
-
-jQuery.Animation = jQuery.extend( Animation, {
-	tweeners: {
-		"*": [ function( prop, value ) {
-			var tween = this.createTween( prop, value );
-			adjustCSS( tween.elem, prop, rcssNum.exec( value ), tween );
-			return tween;
-		} ]
-	},
-
-	tweener: function( props, callback ) {
-		if ( jQuery.isFunction( props ) ) {
-			callback = props;
-			props = [ "*" ];
-		} else {
-			props = props.match( rnotwhite );
-		}
-
-		var prop,
-			index = 0,
-			length = props.length;
-
-		for ( ; index < length ; index++ ) {
-			prop = props[ index ];
-			Animation.tweeners[ prop ] = Animation.tweeners[ prop ] || [];
-			Animation.tweeners[ prop ].unshift( callback );
-		}
-	},
-
-	prefilters: [ defaultPrefilter ],
-
-	prefilter: function( callback, prepend ) {
-		if ( prepend ) {
-			Animation.prefilters.unshift( callback );
-		} else {
-			Animation.prefilters.push( callback );
-		}
-	}
-} );
-
-jQuery.speed = function( speed, easing, fn ) {
-	var opt = speed && typeof speed === "object" ? jQuery.extend( {}, speed ) : {
-		complete: fn || !fn && easing ||
-			jQuery.isFunction( speed ) && speed,
-		duration: speed,
-		easing: fn && easing || easing && !jQuery.isFunction( easing ) && easing
-	};
-
-	opt.duration = jQuery.fx.off ? 0 : typeof opt.duration === "number" ?
-		opt.duration : opt.duration in jQuery.fx.speeds ?
-			jQuery.fx.speeds[ opt.duration ] : jQuery.fx.speeds._default;
-
-	// Normalize opt.queue - true/undefined/null -> "fx"
-	if ( opt.queue == null || opt.queue === true ) {
-		opt.queue = "fx";
-	}
-
-	// Queueing
-	opt.old = opt.complete;
-
-	opt.complete = function() {
-		if ( jQuery.isFunction( opt.old ) ) {
-			opt.old.call( this );
-		}
-
-		if ( opt.queue ) {
-			jQuery.dequeue( this, opt.queue );
-		}
-	};
-
-	return opt;
-};
-
-jQuery.fn.extend( {
-	fadeTo: function( speed, to, easing, callback ) {
-
-		// Show any hidden elements after setting opacity to 0
-		return this.filter( isHidden ).css( "opacity", 0 ).show()
-
-			// Animate to the value specified
-			.end().animate( { opacity: to }, speed, easing, callback );
-	},
-	animate: function( prop, speed, easing, callback ) {
-		var empty = jQuery.isEmptyObject( prop ),
-			optall = jQuery.speed( speed, easing, callback ),
-			doAnimation = function() {
-
-				// Operate on a copy of prop so per-property easing won't be lost
-				var anim = Animation( this, jQuery.extend( {}, prop ), optall );
-
-				// Empty animations, or finishing resolves immediately
-				if ( empty || dataPriv.get( this, "finish" ) ) {
-					anim.stop( true );
-				}
-			};
-			doAnimation.finish = doAnimation;
-
-		return empty || optall.queue === false ?
-			this.each( doAnimation ) :
-			this.queue( optall.queue, doAnimation );
-	},
-	stop: function( type, clearQueue, gotoEnd ) {
-		var stopQueue = function( hooks ) {
-			var stop = hooks.stop;
-			delete hooks.stop;
-			stop( gotoEnd );
-		};
-
-		if ( typeof type !== "string" ) {
-			gotoEnd = clearQueue;
-			clearQueue = type;
-			type = undefined;
-		}
-		if ( clearQueue && type !== false ) {
-			this.queue( type || "fx", [] );
-		}
-
-		return this.each( function() {
-			var dequeue = true,
-				index = type != null && type + "queueHooks",
-				timers = jQuery.timers,
-				data = dataPriv.get( this );
-
-			if ( index ) {
-				if ( data[ index ] && data[ index ].stop ) {
-					stopQueue( data[ index ] );
-				}
-			} else {
-				for ( index in data ) {
-					if ( data[ index ] && data[ index ].stop && rrun.test( index ) ) {
-						stopQueue( data[ index ] );
-					}
-				}
-			}
-
-			for ( index = timers.length; index--; ) {
-				if ( timers[ index ].elem === this &&
-					( type == null || timers[ index ].queue === type ) ) {
-
-					timers[ index ].anim.stop( gotoEnd );
-					dequeue = false;
-					timers.splice( index, 1 );
-				}
-			}
-
-			// Start the next in the queue if the last step wasn't forced.
-			// Timers currently will call their complete callbacks, which
-			// will dequeue but only if they were gotoEnd.
-			if ( dequeue || !gotoEnd ) {
-				jQuery.dequeue( this, type );
-			}
-		} );
-	},
-	finish: function( type ) {
-		if ( type !== false ) {
-			type = type || "fx";
-		}
-		return this.each( function() {
-			var index,
-				data = dataPriv.get( this ),
-				queue = data[ type + "queue" ],
-				hooks = data[ type + "queueHooks" ],
-				timers = jQuery.timers,
-				length = queue ? queue.length : 0;
-
-			// Enable finishing flag on private data
-			data.finish = true;
-
-			// Empty the queue first
-			jQuery.queue( this, type, [] );
-
-			if ( hooks && hooks.stop ) {
-				hooks.stop.call( this, true );
-			}
-
-			// Look for any active animations, and finish them
-			for ( index = timers.length; index--; ) {
-				if ( timers[ index ].elem === this && timers[ index ].queue === type ) {
-					timers[ index ].anim.stop( true );
-					timers.splice( index, 1 );
-				}
-			}
-
-			// Look for any animations in the old queue and finish them
-			for ( index = 0; index < length; index++ ) {
-				if ( queue[ index ] && queue[ index ].finish ) {
-					queue[ index ].finish.call( this );
-				}
-			}
-
-			// Turn off finishing flag
-			delete data.finish;
-		} );
-	}
-} );
-
-jQuery.each( [ "toggle", "show", "hide" ], function( i, name ) {
-	var cssFn = jQuery.fn[ name ];
-	jQuery.fn[ name ] = function( speed, easing, callback ) {
-		return speed == null || typeof speed === "boolean" ?
-			cssFn.apply( this, arguments ) :
-			this.animate( genFx( name, true ), speed, easing, callback );
-	};
-} );
-
-// Generate shortcuts for custom animations
-jQuery.each( {
-	slideDown: genFx( "show" ),
-	slideUp: genFx( "hide" ),
-	slideToggle: genFx( "toggle" ),
-	fadeIn: { opacity: "show" },
-	fadeOut: { opacity: "hide" },
-	fadeToggle: { opacity: "toggle" }
-}, function( name, props ) {
-	jQuery.fn[ name ] = function( speed, easing, callback ) {
-		return this.animate( props, speed, easing, callback );
-	};
-} );
-
-jQuery.timers = [];
-jQuery.fx.tick = function() {
-	var timer,
-		i = 0,
-		timers = jQuery.timers;
-
-	fxNow = jQuery.now();
-
-	for ( ; i < timers.length; i++ ) {
-		timer = timers[ i ];
-
-		// Checks the timer has not already been removed
-		if ( !timer() && timers[ i ] === timer ) {
-			timers.splice( i--, 1 );
-		}
-	}
-
-	if ( !timers.length ) {
-		jQuery.fx.stop();
-	}
-	fxNow = undefined;
-};
-
-jQuery.fx.timer = function( timer ) {
-	jQuery.timers.push( timer );
-	if ( timer() ) {
-		jQuery.fx.start();
-	} else {
-		jQuery.timers.pop();
-	}
-};
-
-jQuery.fx.interval = 13;
-jQuery.fx.start = function() {
-	if ( !timerId ) {
-		timerId = window.setInterval( jQuery.fx.tick, jQuery.fx.interval );
-	}
-};
-
-jQuery.fx.stop = function() {
-	window.clearInterval( timerId );
-
-	timerId = null;
-};
-
-jQuery.fx.speeds = {
-	slow: 600,
-	fast: 200,
-
-	// Default speed
-	_default: 400
-};
-
-
-// Based off of the plugin by Clint Helfers, with permission.
-// http://web.archive.org/web/20100324014747/http://blindsignals.com/index.php/2009/07/jquery-delay/
-jQuery.fn.delay = function( time, type ) {
-	time = jQuery.fx ? jQuery.fx.speeds[ time ] || time : time;
-	type = type || "fx";
-
-	return this.queue( type, function( next, hooks ) {
-		var timeout = window.setTimeout( next, time );
-		hooks.stop = function() {
-			window.clearTimeout( timeout );
-		};
-	} );
-};
-
-
-( function() {
-	var input = document.createElement( "input" ),
-		select = document.createElement( "select" ),
-		opt = select.appendChild( document.createElement( "option" ) );
-
-	input.type = "checkbox";
-
-	// Support: iOS<=5.1, Android<=4.2+
-	// Default value for a checkbox should be "on"
-	support.checkOn = input.value !== "";
-
-	// Support: IE<=11+
-	// Must access selectedIndex to make default options select
-	support.optSelected = opt.selected;
-
-	// Support: Android<=2.3
-	// Options inside disabled selects are incorrectly marked as disabled
-	select.disabled = true;
-	support.optDisabled = !opt.disabled;
-
-	// Support: IE<=11+
-	// An input loses its value after becoming a radio
-	input = document.createElement( "input" );
-	input.value = "t";
-	input.type = "radio";
-	support.radioValue = input.value === "t";
-} )();
-
-
-var boolHook,
-	attrHandle = jQuery.expr.attrHandle;
-
-jQuery.fn.extend( {
-	attr: function( name, value ) {
-		return access( this, jQuery.attr, name, value, arguments.length > 1 );
-	},
-
-	removeAttr: function( name ) {
-		return this.each( function() {
-			jQuery.removeAttr( this, name );
-		} );
-	}
-} );
-
-jQuery.extend( {
-	attr: function( elem, name, value ) {
-		var ret, hooks,
-			nType = elem.nodeType;
-
-		// Don't get/set attributes on text, comment and attribute nodes
-		if ( nType === 3 || nType === 8 || nType === 2 ) {
-			return;
-		}
-
-		// Fallback to prop when attributes are not supported
-		if ( typeof elem.getAttribute === "undefined" ) {
-			return jQuery.prop( elem, name, value );
-		}
-
-		// All attributes are lowercase
-		// Grab necessary hook if one is defined
-		if ( nType !== 1 || !jQuery.isXMLDoc( elem ) ) {
-			name = name.toLowerCase();
-			hooks = jQuery.attrHooks[ name ] ||
-				( jQuery.expr.match.bool.test( name ) ? boolHook : undefined );
-		}
-
-		if ( value !== undefined ) {
-			if ( value === null ) {
-				jQuery.removeAttr( elem, name );
-				return;
-			}
-
-			if ( hooks && "set" in hooks &&
-				( ret = hooks.set( elem, value, name ) ) !== undefined ) {
-				return ret;
-			}
-
-			elem.setAttribute( name, value + "" );
-			return value;
-		}
-
-		if ( hooks && "get" in hooks && ( ret = hooks.get( elem, name ) ) !== null ) {
-			return ret;
-		}
-
-		ret = jQuery.find.attr( elem, name );
-
-		// Non-existent attributes return null, we normalize to undefined
-		return ret == null ? undefined : ret;
-	},
-
-	attrHooks: {
-		type: {
-			set: function( elem, value ) {
-				if ( !support.radioValue && value === "radio" &&
-					jQuery.nodeName( elem, "input" ) ) {
-					var val = elem.value;
-					elem.setAttribute( "type", value );
-					if ( val ) {
-						elem.value = val;
-					}
-					return value;
-				}
-			}
-		}
-	},
-
-	removeAttr: function( elem, value ) {
-		var name, propName,
-			i = 0,
-			attrNames = value && value.match( rnotwhite );
-
-		if ( attrNames && elem.nodeType === 1 ) {
-			while ( ( name = attrNames[ i++ ] ) ) {
-				propName = jQuery.propFix[ name ] || name;
-
-				// Boolean attributes get special treatment (#10870)
-				if ( jQuery.expr.match.bool.test( name ) ) {
-
-					// Set corresponding property to false
-					elem[ propName ] = false;
-				}
-
-				elem.removeAttribute( name );
-			}
-		}
-	}
-} );
-
-// Hooks for boolean attributes
-boolHook = {
-	set: function( elem, value, name ) {
-		if ( value === false ) {
-
-			// Remove boolean attributes when set to false
-			jQuery.removeAttr( elem, name );
-		} else {
-			elem.setAttribute( name, name );
-		}
-		return name;
-	}
-};
-jQuery.each( jQuery.expr.match.bool.source.match( /\w+/g ), function( i, name ) {
-	var getter = attrHandle[ name ] || jQuery.find.attr;
-
-	attrHandle[ name ] = function( elem, name, isXML ) {
-		var ret, handle;
-		if ( !isXML ) {
-
-			// Avoid an infinite loop by temporarily removing this function from the getter
-			handle = attrHandle[ name ];
-			attrHandle[ name ] = ret;
-			ret = getter( elem, name, isXML ) != null ?
-				name.toLowerCase() :
-				null;
-			attrHandle[ name ] = handle;
-		}
-		return ret;
-	};
-} );
-
-
-
-
-var rfocusable = /^(?:input|select|textarea|button)$/i,
-	rclickable = /^(?:a|area)$/i;
-
-jQuery.fn.extend( {
-	prop: function( name, value ) {
-		return access( this, jQuery.prop, name, value, arguments.length > 1 );
-	},
-
-	removeProp: function( name ) {
-		return this.each( function() {
-			delete this[ jQuery.propFix[ name ] || name ];
-		} );
-	}
-} );
-
-jQuery.extend( {
-	prop: function( elem, name, value ) {
-		var ret, hooks,
-			nType = elem.nodeType;
-
-		// Don't get/set properties on text, comment and attribute nodes
-		if ( nType === 3 || nType === 8 || nType === 2 ) {
-			return;
-		}
-
-		if ( nType !== 1 || !jQuery.isXMLDoc( elem ) ) {
-
-			// Fix name and attach hooks
-			name = jQuery.propFix[ name ] || name;
-			hooks = jQuery.propHooks[ name ];
-		}
-
-		if ( value !== undefined ) {
-			if ( hooks && "set" in hooks &&
-				( ret = hooks.set( elem, value, name ) ) !== undefined ) {
-				return ret;
-			}
-
-			return ( elem[ name ] = value );
-		}
-
-		if ( hooks && "get" in hooks && ( ret = hooks.get( elem, name ) ) !== null ) {
-			return ret;
-		}
-
-		return elem[ name ];
-	},
-
-	propHooks: {
-		tabIndex: {
-			get: function( elem ) {
-
-				// elem.tabIndex doesn't always return the
-				// correct value when it hasn't been explicitly set
-				// http://fluidproject.org/blog/2008/01/09/getting-setting-and-removing-tabindex-values-with-javascript/
-				// Use proper attribute retrieval(#12072)
-				var tabindex = jQuery.find.attr( elem, "tabindex" );
-
-				return tabindex ?
-					parseInt( tabindex, 10 ) :
-					rfocusable.test( elem.nodeName ) ||
-						rclickable.test( elem.nodeName ) && elem.href ?
-							0 :
-							-1;
-			}
-		}
-	},
-
-	propFix: {
-		"for": "htmlFor",
-		"class": "className"
-	}
-} );
-
-// Support: IE <=11 only
-// Accessing the selectedIndex property
-// forces the browser to respect setting selected
-// on the option
-// The getter ensures a default option is selected
-// when in an optgroup
-if ( !support.optSelected ) {
-	jQuery.propHooks.selected = {
-		get: function( elem ) {
-			var parent = elem.parentNode;
-			if ( parent && parent.parentNode ) {
-				parent.parentNode.selectedIndex;
-			}
-			return null;
-		},
-		set: function( elem ) {
-			var parent = elem.parentNode;
-			if ( parent ) {
-				parent.selectedIndex;
-
-				if ( parent.parentNode ) {
-					parent.parentNode.selectedIndex;
-				}
-			}
-		}
-	};
-}
-
-jQuery.each( [
-	"tabIndex",
-	"readOnly",
-	"maxLength",
-	"cellSpacing",
-	"cellPadding",
-	"rowSpan",
-	"colSpan",
-	"useMap",
-	"frameBorder",
-	"contentEditable"
-], function() {
-	jQuery.propFix[ this.toLowerCase() ] = this;
-} );
-
-
-
-
-var rclass = /[\t\r\n\f]/g;
-
-function getClass( elem ) {
-	return elem.getAttribute && elem.getAttribute( "class" ) || "";
-}
-
-jQuery.fn.extend( {
-	addClass: function( value ) {
-		var classes, elem, cur, curValue, clazz, j, finalValue,
-			i = 0;
-
-		if ( jQuery.isFunction( value ) ) {
-			return this.each( function( j ) {
-				jQuery( this ).addClass( value.call( this, j, getClass( this ) ) );
-			} );
-		}
-
-		if ( typeof value === "string" && value ) {
-			classes = value.match( rnotwhite ) || [];
-
-			while ( ( elem = this[ i++ ] ) ) {
-				curValue = getClass( elem );
-				cur = elem.nodeType === 1 &&
-					( " " + curValue + " " ).replace( rclass, " " );
-
-				if ( cur ) {
-					j = 0;
-					while ( ( clazz = classes[ j++ ] ) ) {
-						if ( cur.indexOf( " " + clazz + " " ) < 0 ) {
-							cur += clazz + " ";
-						}
-					}
-
-					// Only assign if different to avoid unneeded rendering.
-					finalValue = jQuery.trim( cur );
-					if ( curValue !== finalValue ) {
-						elem.setAttribute( "class", finalValue );
-					}
-				}
-			}
-		}
-
-		return this;
-	},
-
-	removeClass: function( value ) {
-		var classes, elem, cur, curValue, clazz, j, finalValue,
-			i = 0;
-
-		if ( jQuery.isFunction( value ) ) {
-			return this.each( function( j ) {
-				jQuery( this ).removeClass( value.call( this, j, getClass( this ) ) );
-			} );
-		}
-
-		if ( !arguments.length ) {
-			return this.attr( "class", "" );
-		}
-
-		if ( typeof value === "string" && value ) {
-			classes = value.match( rnotwhite ) || [];
-
-			while ( ( elem = this[ i++ ] ) ) {
-				curValue = getClass( elem );
-
-				// This expression is here for better compressibility (see addClass)
-				cur = elem.nodeType === 1 &&
-					( " " + curValue + " " ).replace( rclass, " " );
-
-				if ( cur ) {
-					j = 0;
-					while ( ( clazz = classes[ j++ ] ) ) {
-
-						// Remove *all* instances
-						while ( cur.indexOf( " " + clazz + " " ) > -1 ) {
-							cur = cur.replace( " " + clazz + " ", " " );
-						}
-					}
-
-					// Only assign if different to avoid unneeded rendering.
-					finalValue = jQuery.trim( cur );
-					if ( curValue !== finalValue ) {
-						elem.setAttribute( "class", finalValue );
-					}
-				}
-			}
-		}
-
-		return this;
-	},
-
-	toggleClass: function( value, stateVal ) {
-		var type = typeof value;
-
-		if ( typeof stateVal === "boolean" && type === "string" ) {
-			return stateVal ? this.addClass( value ) : this.removeClass( value );
-		}
-
-		if ( jQuery.isFunction( value ) ) {
-			return this.each( function( i ) {
-				jQuery( this ).toggleClass(
-					value.call( this, i, getClass( this ), stateVal ),
-					stateVal
-				);
-			} );
-		}
-
-		return this.each( function() {
-			var className, i, self, classNames;
-
-			if ( type === "string" ) {
-
-				// Toggle individual class names
-				i = 0;
-				self = jQuery( this );
-				classNames = value.match( rnotwhite ) || [];
-
-				while ( ( className = classNames[ i++ ] ) ) {
-
-					// Check each className given, space separated list
-					if ( self.hasClass( className ) ) {
-						self.removeClass( className );
-					} else {
-						self.addClass( className );
-					}
-				}
-
-			// Toggle whole class name
-			} else if ( value === undefined || type === "boolean" ) {
-				className = getClass( this );
-				if ( className ) {
-
-					// Store className if set
-					dataPriv.set( this, "__className__", className );
-				}
-
-				// If the element has a class name or if we're passed `false`,
-				// then remove the whole classname (if there was one, the above saved it).
-				// Otherwise bring back whatever was previously saved (if anything),
-				// falling back to the empty string if nothing was stored.
-				if ( this.setAttribute ) {
-					this.setAttribute( "class",
-						className || value === false ?
-						"" :
-						dataPriv.get( this, "__className__" ) || ""
-					);
-				}
-			}
-		} );
-	},
-
-	hasClass: function( selector ) {
-		var className, elem,
-			i = 0;
-
-		className = " " + selector + " ";
-		while ( ( elem = this[ i++ ] ) ) {
-			if ( elem.nodeType === 1 &&
-				( " " + getClass( elem ) + " " ).replace( rclass, " " )
-					.indexOf( className ) > -1
-			) {
-				return true;
-			}
-		}
-
-		return false;
-	}
-} );
-
-
-
-
-var rreturn = /\r/g,
-	rspaces = /[\x20\t\r\n\f]+/g;
-
-jQuery.fn.extend( {
-	val: function( value ) {
-		var hooks, ret, isFunction,
-			elem = this[ 0 ];
-
-		if ( !arguments.length ) {
-			if ( elem ) {
-				hooks = jQuery.valHooks[ elem.type ] ||
-					jQuery.valHooks[ elem.nodeName.toLowerCase() ];
-
-				if ( hooks &&
-					"get" in hooks &&
-					( ret = hooks.get( elem, "value" ) ) !== undefined
-				) {
-					return ret;
-				}
-
-				ret = elem.value;
-
-				return typeof ret === "string" ?
-
-					// Handle most common string cases
-					ret.replace( rreturn, "" ) :
-
-					// Handle cases where value is null/undef or number
-					ret == null ? "" : ret;
-			}
-
-			return;
-		}
-
-		isFunction = jQuery.isFunction( value );
-
-		return this.each( function( i ) {
-			var val;
-
-			if ( this.nodeType !== 1 ) {
-				return;
-			}
-
-			if ( isFunction ) {
-				val = value.call( this, i, jQuery( this ).val() );
-			} else {
-				val = value;
-			}
-
-			// Treat null/undefined as ""; convert numbers to string
-			if ( val == null ) {
-				val = "";
-
-			} else if ( typeof val === "number" ) {
-				val += "";
-
-			} else if ( jQuery.isArray( val ) ) {
-				val = jQuery.map( val, function( value ) {
-					return value == null ? "" : value + "";
-				} );
-			}
-
-			hooks = jQuery.valHooks[ this.type ] || jQuery.valHooks[ this.nodeName.toLowerCase() ];
-
-			// If set returns undefined, fall back to normal setting
-			if ( !hooks || !( "set" in hooks ) || hooks.set( this, val, "value" ) === undefined ) {
-				this.value = val;
-			}
-		} );
-	}
-} );
-
-jQuery.extend( {
-	valHooks: {
-		option: {
-			get: function( elem ) {
-
-				var val = jQuery.find.attr( elem, "value" );
-				return val != null ?
-					val :
-
-					// Support: IE10-11+
-					// option.text throws exceptions (#14686, #14858)
-					// Strip and collapse whitespace
-					// https://html.spec.whatwg.org/#strip-and-collapse-whitespace
-					jQuery.trim( jQuery.text( elem ) ).replace( rspaces, " " );
-			}
-		},
-		select: {
-			get: function( elem ) {
-				var value, option,
-					options = elem.options,
-					index = elem.selectedIndex,
-					one = elem.type === "select-one" || index < 0,
-					values = one ? null : [],
-					max = one ? index + 1 : options.length,
-					i = index < 0 ?
-						max :
-						one ? index : 0;
-
-				// Loop through all the selected options
-				for ( ; i < max; i++ ) {
-					option = options[ i ];
-
-					// IE8-9 doesn't update selected after form reset (#2551)
-					if ( ( option.selected || i === index ) &&
-
-							// Don't return options that are disabled or in a disabled optgroup
-							( support.optDisabled ?
-								!option.disabled : option.getAttribute( "disabled" ) === null ) &&
-							( !option.parentNode.disabled ||
-								!jQuery.nodeName( option.parentNode, "optgroup" ) ) ) {
-
-						// Get the specific value for the option
-						value = jQuery( option ).val();
-
-						// We don't need an array for one selects
-						if ( one ) {
-							return value;
-						}
-
-						// Multi-Selects return an array
-						values.push( value );
-					}
-				}
-
-				return values;
-			},
-
-			set: function( elem, value ) {
-				var optionSet, option,
-					options = elem.options,
-					values = jQuery.makeArray( value ),
-					i = options.length;
-
-				while ( i-- ) {
-					option = options[ i ];
-					if ( option.selected =
-						jQuery.inArray( jQuery.valHooks.option.get( option ), values ) > -1
-					) {
-						optionSet = true;
-					}
-				}
-
-				// Force browsers to behave consistently when non-matching value is set
-				if ( !optionSet ) {
-					elem.selectedIndex = -1;
-				}
-				return values;
-			}
-		}
-	}
-} );
-
-// Radios and checkboxes getter/setter
-jQuery.each( [ "radio", "checkbox" ], function() {
-	jQuery.valHooks[ this ] = {
-		set: function( elem, value ) {
-			if ( jQuery.isArray( value ) ) {
-				return ( elem.checked = jQuery.inArray( jQuery( elem ).val(), value ) > -1 );
-			}
-		}
-	};
-	if ( !support.checkOn ) {
-		jQuery.valHooks[ this ].get = function( elem ) {
-			return elem.getAttribute( "value" ) === null ? "on" : elem.value;
-		};
-	}
-} );
-
-
-
-
-// Return jQuery for attributes-only inclusion
-
-
-var rfocusMorph = /^(?:focusinfocus|focusoutblur)$/;
-
-jQuery.extend( jQuery.event, {
-
-	trigger: function( event, data, elem, onlyHandlers ) {
-
-		var i, cur, tmp, bubbleType, ontype, handle, special,
-			eventPath = [ elem || document ],
-			type = hasOwn.call( event, "type" ) ? event.type : event,
-			namespaces = hasOwn.call( event, "namespace" ) ? event.namespace.split( "." ) : [];
-
-		cur = tmp = elem = elem || document;
-
-		// Don't do events on text and comment nodes
-		if ( elem.nodeType === 3 || elem.nodeType === 8 ) {
-			return;
-		}
-
-		// focus/blur morphs to focusin/out; ensure we're not firing them right now
-		if ( rfocusMorph.test( type + jQuery.event.triggered ) ) {
-			return;
-		}
-
-		if ( type.indexOf( "." ) > -1 ) {
-
-			// Namespaced trigger; create a regexp to match event type in handle()
-			namespaces = type.split( "." );
-			type = namespaces.shift();
-			namespaces.sort();
-		}
-		ontype = type.indexOf( ":" ) < 0 && "on" + type;
-
-		// Caller can pass in a jQuery.Event object, Object, or just an event type string
-		event = event[ jQuery.expando ] ?
-			event :
-			new jQuery.Event( type, typeof event === "object" && event );
-
-		// Trigger bitmask: & 1 for native handlers; & 2 for jQuery (always true)
-		event.isTrigger = onlyHandlers ? 2 : 3;
-		event.namespace = namespaces.join( "." );
-		event.rnamespace = event.namespace ?
-			new RegExp( "(^|\\.)" + namespaces.join( "\\.(?:.*\\.|)" ) + "(\\.|$)" ) :
-			null;
-
-		// Clean up the event in case it is being reused
-		event.result = undefined;
-		if ( !event.target ) {
-			event.target = elem;
-		}
-
-		// Clone any incoming data and prepend the event, creating the handler arg list
-		data = data == null ?
-			[ event ] :
-			jQuery.makeArray( data, [ event ] );
-
-		// Allow special events to draw outside the lines
-		special = jQuery.event.special[ type ] || {};
-		if ( !onlyHandlers && special.trigger && special.trigger.apply( elem, data ) === false ) {
-			return;
-		}
-
-		// Determine event propagation path in advance, per W3C events spec (#9951)
-		// Bubble up to document, then to window; watch for a global ownerDocument var (#9724)
-		if ( !onlyHandlers && !special.noBubble && !jQuery.isWindow( elem ) ) {
-
-			bubbleType = special.delegateType || type;
-			if ( !rfocusMorph.test( bubbleType + type ) ) {
-				cur = cur.parentNode;
-			}
-			for ( ; cur; cur = cur.parentNode ) {
-				eventPath.push( cur );
-				tmp = cur;
-			}
-
-			// Only add window if we got to document (e.g., not plain obj or detached DOM)
-			if ( tmp === ( elem.ownerDocument || document ) ) {
-				eventPath.push( tmp.defaultView || tmp.parentWindow || window );
-			}
-		}
-
-		// Fire handlers on the event path
-		i = 0;
-		while ( ( cur = eventPath[ i++ ] ) && !event.isPropagationStopped() ) {
-
-			event.type = i > 1 ?
-				bubbleType :
-				special.bindType || type;
-
-			// jQuery handler
-			handle = ( dataPriv.get( cur, "events" ) || {} )[ event.type ] &&
-				dataPriv.get( cur, "handle" );
-			if ( handle ) {
-				handle.apply( cur, data );
-			}
-
-			// Native handler
-			handle = ontype && cur[ ontype ];
-			if ( handle && handle.apply && acceptData( cur ) ) {
-				event.result = handle.apply( cur, data );
-				if ( event.result === false ) {
-					event.preventDefault();
-				}
-			}
-		}
-		event.type = type;
-
-		// If nobody prevented the default action, do it now
-		if ( !onlyHandlers && !event.isDefaultPrevented() ) {
-
-			if ( ( !special._default ||
-				special._default.apply( eventPath.pop(), data ) === false ) &&
-				acceptData( elem ) ) {
-
-				// Call a native DOM method on the target with the same name name as the event.
-				// Don't do default actions on window, that's where global variables be (#6170)
-				if ( ontype && jQuery.isFunction( elem[ type ] ) && !jQuery.isWindow( elem ) ) {
-
-					// Don't re-trigger an onFOO event when we call its FOO() method
-					tmp = elem[ ontype ];
-
-					if ( tmp ) {
-						elem[ ontype ] = null;
-					}
-
-					// Prevent re-triggering of the same event, since we already bubbled it above
-					jQuery.event.triggered = type;
-					elem[ type ]();
-					jQuery.event.triggered = undefined;
-
-					if ( tmp ) {
-						elem[ ontype ] = tmp;
-					}
-				}
-			}
-		}
-
-		return event.result;
-	},
-
-	// Piggyback on a donor event to simulate a different one
-	// Used only for `focus(in | out)` events
-	simulate: function( type, elem, event ) {
-		var e = jQuery.extend(
-			new jQuery.Event(),
-			event,
-			{
-				type: type,
-				isSimulated: true
-			}
-		);
-
-		jQuery.event.trigger( e, null, elem );
-	}
-
-} );
-
-jQuery.fn.extend( {
-
-	trigger: function( type, data ) {
-		return this.each( function() {
-			jQuery.event.trigger( type, data, this );
-		} );
-	},
-	triggerHandler: function( type, data ) {
-		var elem = this[ 0 ];
-		if ( elem ) {
-			return jQuery.event.trigger( type, data, elem, true );
-		}
-	}
-} );
-
-
-jQuery.each( ( "blur focus focusin focusout load resize scroll unload click dblclick " +
-	"mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave " +
-	"change select submit keydown keypress keyup error contextmenu" ).split( " " ),
-	function( i, name ) {
-
-	// Handle event binding
-	jQuery.fn[ name ] = function( data, fn ) {
-		return arguments.length > 0 ?
-			this.on( name, null, data, fn ) :
-			this.trigger( name );
-	};
-} );
-
-jQuery.fn.extend( {
-	hover: function( fnOver, fnOut ) {
-		return this.mouseenter( fnOver ).mouseleave( fnOut || fnOver );
-	}
-} );
-
-
-
-
-support.focusin = "onfocusin" in window;
-
-
-// Support: Firefox
-// Firefox doesn't have focus(in | out) events
-// Related ticket - https://bugzilla.mozilla.org/show_bug.cgi?id=687787
-//
-// Support: Chrome, Safari
-// focus(in | out) events fire after focus & blur events,
-// which is spec violation - http://www.w3.org/TR/DOM-Level-3-Events/#events-focusevent-event-order
-// Related ticket - https://code.google.com/p/chromium/issues/detail?id=449857
-if ( !support.focusin ) {
-	jQuery.each( { focus: "focusin", blur: "focusout" }, function( orig, fix ) {
-
-		// Attach a single capturing handler on the document while someone wants focusin/focusout
-		var handler = function( event ) {
-			jQuery.event.simulate( fix, event.target, jQuery.event.fix( event ) );
-		};
-
-		jQuery.event.special[ fix ] = {
-			setup: function() {
-				var doc = this.ownerDocument || this,
-					attaches = dataPriv.access( doc, fix );
-
-				if ( !attaches ) {
-					doc.addEventListener( orig, handler, true );
-				}
-				dataPriv.access( doc, fix, ( attaches || 0 ) + 1 );
-			},
-			teardown: function() {
-				var doc = this.ownerDocument || this,
-					attaches = dataPriv.access( doc, fix ) - 1;
-
-				if ( !attaches ) {
-					doc.removeEventListener( orig, handler, true );
-					dataPriv.remove( doc, fix );
-
-				} else {
-					dataPriv.access( doc, fix, attaches );
-				}
-			}
-		};
-	} );
-}
-var location = window.location;
-
-var nonce = jQuery.now();
-
-var rquery = ( /\?/ );
-
-
-
-// Support: Android 2.3
-// Workaround failure to string-cast null input
-jQuery.parseJSON = function( data ) {
-	return JSON.parse( data + "" );
-};
-
-
-// Cross-browser xml parsing
-jQuery.parseXML = function( data ) {
-	var xml;
-	if ( !data || typeof data !== "string" ) {
-		return null;
-	}
-
-	// Support: IE9
-	try {
-		xml = ( new window.DOMParser() ).parseFromString( data, "text/xml" );
-	} catch ( e ) {
-		xml = undefined;
-	}
-
-	if ( !xml || xml.getElementsByTagName( "parsererror" ).length ) {
-		jQuery.error( "Invalid XML: " + data );
-	}
-	return xml;
-};
-
-
-var
-	rhash = /#.*$/,
-	rts = /([?&])_=[^&]*/,
-	rheaders = /^(.*?):[ \t]*([^\r\n]*)$/mg,
-
-	// #7653, #8125, #8152: local protocol detection
-	rlocalProtocol = /^(?:about|app|app-storage|.+-extension|file|res|widget):$/,
-	rnoContent = /^(?:GET|HEAD)$/,
-	rprotocol = /^\/\//,
-
-	/* Prefilters
-	 * 1) They are useful to introduce custom dataTypes (see ajax/jsonp.js for an example)
-	 * 2) These are called:
-	 *    - BEFORE asking for a transport
-	 *    - AFTER param serialization (s.data is a string if s.processData is true)
-	 * 3) key is the dataType
-	 * 4) the catchall symbol "*" can be used
-	 * 5) execution will start with transport dataType and THEN continue down to "*" if needed
-	 */
-	prefilters = {},
-
-	/* Transports bindings
-	 * 1) key is the dataType
-	 * 2) the catchall symbol "*" can be used
-	 * 3) selection will start with transport dataType and THEN go to "*" if needed
-	 */
-	transports = {},
-
-	// Avoid comment-prolog char sequence (#10098); must appease lint and evade compression
-	allTypes = "*/".concat( "*" ),
-
-	// Anchor tag for parsing the document origin
-	originAnchor = document.createElement( "a" );
-	originAnchor.href = location.href;
-
-// Base "constructor" for jQuery.ajaxPrefilter and jQuery.ajaxTransport
-function addToPrefiltersOrTransports( structure ) {
-
-	// dataTypeExpression is optional and defaults to "*"
-	return function( dataTypeExpression, func ) {
-
-		if ( typeof dataTypeExpression !== "string" ) {
-			func = dataTypeExpression;
-			dataTypeExpression = "*";
-		}
-
-		var dataType,
-			i = 0,
-			dataTypes = dataTypeExpression.toLowerCase().match( rnotwhite ) || [];
-
-		if ( jQuery.isFunction( func ) ) {
-
-			// For each dataType in the dataTypeExpression
-			while ( ( dataType = dataTypes[ i++ ] ) ) {
-
-				// Prepend if requested
-				if ( dataType[ 0 ] === "+" ) {
-					dataType = dataType.slice( 1 ) || "*";
-					( structure[ dataType ] = structure[ dataType ] || [] ).unshift( func );
-
-				// Otherwise append
-				} else {
-					( structure[ dataType ] = structure[ dataType ] || [] ).push( func );
-				}
-			}
-		}
-	};
-}
-
-// Base inspection function for prefilters and transports
-function inspectPrefiltersOrTransports( structure, options, originalOptions, jqXHR ) {
-
-	var inspected = {},
-		seekingTransport = ( structure === transports );
-
-	function inspect( dataType ) {
-		var selected;
-		inspected[ dataType ] = true;
-		jQuery.each( structure[ dataType ] || [], function( _, prefilterOrFactory ) {
-			var dataTypeOrTransport = prefilterOrFactory( options, originalOptions, jqXHR );
-			if ( typeof dataTypeOrTransport === "string" &&
-				!seekingTransport && !inspected[ dataTypeOrTransport ] ) {
-
-				options.dataTypes.unshift( dataTypeOrTransport );
-				inspect( dataTypeOrTransport );
-				return false;
-			} else if ( seekingTransport ) {
-				return !( selected = dataTypeOrTransport );
-			}
-		} );
-		return selected;
-	}
-
-	return inspect( options.dataTypes[ 0 ] ) || !inspected[ "*" ] && inspect( "*" );
-}
-
-// A special extend for ajax options
-// that takes "flat" options (not to be deep extended)
-// Fixes #9887
-function ajaxExtend( target, src ) {
-	var key, deep,
-		flatOptions = jQuery.ajaxSettings.flatOptions || {};
-
-	for ( key in src ) {
-		if ( src[ key ] !== undefined ) {
-			( flatOptions[ key ] ? target : ( deep || ( deep = {} ) ) )[ key ] = src[ key ];
-		}
-	}
-	if ( deep ) {
-		jQuery.extend( true, target, deep );
-	}
-
-	return target;
-}
-
-/* Handles responses to an ajax request:
- * - finds the right dataType (mediates between content-type and expected dataType)
- * - returns the corresponding response
- */
-function ajaxHandleResponses( s, jqXHR, responses ) {
-
-	var ct, type, finalDataType, firstDataType,
-		contents = s.contents,
-		dataTypes = s.dataTypes;
-
-	// Remove auto dataType and get content-type in the process
-	while ( dataTypes[ 0 ] === "*" ) {
-		dataTypes.shift();
-		if ( ct === undefined ) {
-			ct = s.mimeType || jqXHR.getResponseHeader( "Content-Type" );
-		}
-	}
-
-	// Check if we're dealing with a known content-type
-	if ( ct ) {
-		for ( type in contents ) {
-			if ( contents[ type ] && contents[ type ].test( ct ) ) {
-				dataTypes.unshift( type );
-				break;
-			}
-		}
-	}
-
-	// Check to see if we have a response for the expected dataType
-	if ( dataTypes[ 0 ] in responses ) {
-		finalDataType = dataTypes[ 0 ];
-	} else {
-
-		// Try convertible dataTypes
-		for ( type in responses ) {
-			if ( !dataTypes[ 0 ] || s.converters[ type + " " + dataTypes[ 0 ] ] ) {
-				finalDataType = type;
-				break;
-			}
-			if ( !firstDataType ) {
-				firstDataType = type;
-			}
-		}
-
-		// Or just use first one
-		finalDataType = finalDataType || firstDataType;
-	}
-
-	// If we found a dataType
-	// We add the dataType to the list if needed
-	// and return the corresponding response
-	if ( finalDataType ) {
-		if ( finalDataType !== dataTypes[ 0 ] ) {
-			dataTypes.unshift( finalDataType );
-		}
-		return responses[ finalDataType ];
-	}
-}
-
-/* Chain conversions given the request and the original response
- * Also sets the responseXXX fields on the jqXHR instance
- */
-function ajaxConvert( s, response, jqXHR, isSuccess ) {
-	var conv2, current, conv, tmp, prev,
-		converters = {},
-
-		// Work with a copy of dataTypes in case we need to modify it for conversion
-		dataTypes = s.dataTypes.slice();
-
-	// Create converters map with lowercased keys
-	if ( dataTypes[ 1 ] ) {
-		for ( conv in s.converters ) {
-			converters[ conv.toLowerCase() ] = s.converters[ conv ];
-		}
-	}
-
-	current = dataTypes.shift();
-
-	// Convert to each sequential dataType
-	while ( current ) {
-
-		if ( s.responseFields[ current ] ) {
-			jqXHR[ s.responseFields[ current ] ] = response;
-		}
-
-		// Apply the dataFilter if provided
-		if ( !prev && isSuccess && s.dataFilter ) {
-			response = s.dataFilter( response, s.dataType );
-		}
-
-		prev = current;
-		current = dataTypes.shift();
-
-		if ( current ) {
-
-		// There's only work to do if current dataType is non-auto
-			if ( current === "*" ) {
-
-				current = prev;
-
-			// Convert response if prev dataType is non-auto and differs from current
-			} else if ( prev !== "*" && prev !== current ) {
-
-				// Seek a direct converter
-				conv = converters[ prev + " " + current ] || converters[ "* " + current ];
-
-				// If none found, seek a pair
-				if ( !conv ) {
-					for ( conv2 in converters ) {
-
-						// If conv2 outputs current
-						tmp = conv2.split( " " );
-						if ( tmp[ 1 ] === current ) {
-
-							// If prev can be converted to accepted input
-							conv = converters[ prev + " " + tmp[ 0 ] ] ||
-								converters[ "* " + tmp[ 0 ] ];
-							if ( conv ) {
-
-								// Condense equivalence converters
-								if ( conv === true ) {
-									conv = converters[ conv2 ];
-
-								// Otherwise, insert the intermediate dataType
-								} else if ( converters[ conv2 ] !== true ) {
-									current = tmp[ 0 ];
-									dataTypes.unshift( tmp[ 1 ] );
-								}
-								break;
-							}
-						}
-					}
-				}
-
-				// Apply converter (if not an equivalence)
-				if ( conv !== true ) {
-
-					// Unless errors are allowed to bubble, catch and return them
-					if ( conv && s.throws ) {
-						response = conv( response );
-					} else {
-						try {
-							response = conv( response );
-						} catch ( e ) {
-							return {
-								state: "parsererror",
-								error: conv ? e : "No conversion from " + prev + " to " + current
-							};
-						}
-					}
-				}
-			}
-		}
-	}
-
-	return { state: "success", data: response };
-}
-
-jQuery.extend( {
-
-	// Counter for holding the number of active queries
-	active: 0,
-
-	// Last-Modified header cache for next request
-	lastModified: {},
-	etag: {},
-
-	ajaxSettings: {
-		url: location.href,
-		type: "GET",
-		isLocal: rlocalProtocol.test( location.protocol ),
-		global: true,
-		processData: true,
-		async: true,
-		contentType: "application/x-www-form-urlencoded; charset=UTF-8",
-		/*
-		timeout: 0,
-		data: null,
-		dataType: null,
-		username: null,
-		password: null,
-		cache: null,
-		throws: false,
-		traditional: false,
-		headers: {},
-		*/
-
-		accepts: {
-			"*": allTypes,
-			text: "text/plain",
-			html: "text/html",
-			xml: "application/xml, text/xml",
-			json: "application/json, text/javascript"
-		},
-
-		contents: {
-			xml: /\bxml\b/,
-			html: /\bhtml/,
-			json: /\bjson\b/
-		},
-
-		responseFields: {
-			xml: "responseXML",
-			text: "responseText",
-			json: "responseJSON"
-		},
-
-		// Data converters
-		// Keys separate source (or catchall "*") and destination types with a single space
-		converters: {
-
-			// Convert anything to text
-			"* text": String,
-
-			// Text to html (true = no transformation)
-			"text html": true,
-
-			// Evaluate text as a json expression
-			"text json": jQuery.parseJSON,
-
-			// Parse text as xml
-			"text xml": jQuery.parseXML
-		},
-
-		// For options that shouldn't be deep extended:
-		// you can add your own custom options here if
-		// and when you create one that shouldn't be
-		// deep extended (see ajaxExtend)
-		flatOptions: {
-			url: true,
-			context: true
-		}
-	},
-
-	// Creates a full fledged settings object into target
-	// with both ajaxSettings and settings fields.
-	// If target is omitted, writes into ajaxSettings.
-	ajaxSetup: function( target, settings ) {
-		return settings ?
-
-			// Building a settings object
-			ajaxExtend( ajaxExtend( target, jQuery.ajaxSettings ), settings ) :
-
-			// Extending ajaxSettings
-			ajaxExtend( jQuery.ajaxSettings, target );
-	},
-
-	ajaxPrefilter: addToPrefiltersOrTransports( prefilters ),
-	ajaxTransport: addToPrefiltersOrTransports( transports ),
-
-	// Main method
-	ajax: function( url, options ) {
-
-		// If url is an object, simulate pre-1.5 signature
-		if ( typeof url === "object" ) {
-			options = url;
-			url = undefined;
-		}
-
-		// Force options to be an object
-		options = options || {};
-
-		var transport,
-
-			// URL without anti-cache param
-			cacheURL,
-
-			// Response headers
-			responseHeadersString,
-			responseHeaders,
-
-			// timeout handle
-			timeoutTimer,
-
-			// Url cleanup var
-			urlAnchor,
-
-			// To know if global events are to be dispatched
-			fireGlobals,
-
-			// Loop variable
-			i,
-
-			// Create the final options object
-			s = jQuery.ajaxSetup( {}, options ),
-
-			// Callbacks context
-			callbackContext = s.context || s,
-
-			// Context for global events is callbackContext if it is a DOM node or jQuery collection
-			globalEventContext = s.context &&
-				( callbackContext.nodeType || callbackContext.jquery ) ?
-					jQuery( callbackContext ) :
-					jQuery.event,
-
-			// Deferreds
-			deferred = jQuery.Deferred(),
-			completeDeferred = jQuery.Callbacks( "once memory" ),
-
-			// Status-dependent callbacks
-			statusCode = s.statusCode || {},
-
-			// Headers (they are sent all at once)
-			requestHeaders = {},
-			requestHeadersNames = {},
-
-			// The jqXHR state
-			state = 0,
-
-			// Default abort message
-			strAbort = "canceled",
-
-			// Fake xhr
-			jqXHR = {
-				readyState: 0,
-
-				// Builds headers hashtable if needed
-				getResponseHeader: function( key ) {
-					var match;
-					if ( state === 2 ) {
-						if ( !responseHeaders ) {
-							responseHeaders = {};
-							while ( ( match = rheaders.exec( responseHeadersString ) ) ) {
-								responseHeaders[ match[ 1 ].toLowerCase() ] = match[ 2 ];
-							}
-						}
-						match = responseHeaders[ key.toLowerCase() ];
-					}
-					return match == null ? null : match;
-				},
-
-				// Raw string
-				getAllResponseHeaders: function() {
-					return state === 2 ? responseHeadersString : null;
-				},
-
-				// Caches the header
-				setRequestHeader: function( name, value ) {
-					var lname = name.toLowerCase();
-					if ( !state ) {
-						name = requestHeadersNames[ lname ] = requestHeadersNames[ lname ] || name;
-						requestHeaders[ name ] = value;
-					}
-					return this;
-				},
-
-				// Overrides response content-type header
-				overrideMimeType: function( type ) {
-					if ( !state ) {
-						s.mimeType = type;
-					}
-					return this;
-				},
-
-				// Status-dependent callbacks
-				statusCode: function( map ) {
-					var code;
-					if ( map ) {
-						if ( state < 2 ) {
-							for ( code in map ) {
-
-								// Lazy-add the new callback in a way that preserves old ones
-								statusCode[ code ] = [ statusCode[ code ], map[ code ] ];
-							}
-						} else {
-
-							// Execute the appropriate callbacks
-							jqXHR.always( map[ jqXHR.status ] );
-						}
-					}
-					return this;
-				},
-
-				// Cancel the request
-				abort: function( statusText ) {
-					var finalText = statusText || strAbort;
-					if ( transport ) {
-						transport.abort( finalText );
-					}
-					done( 0, finalText );
-					return this;
-				}
-			};
-
-		// Attach deferreds
-		deferred.promise( jqXHR ).complete = completeDeferred.add;
-		jqXHR.success = jqXHR.done;
-		jqXHR.error = jqXHR.fail;
-
-		// Remove hash character (#7531: and string promotion)
-		// Add protocol if not provided (prefilters might expect it)
-		// Handle falsy url in the settings object (#10093: consistency with old signature)
-		// We also use the url parameter if available
-		s.url = ( ( url || s.url || location.href ) + "" ).replace( rhash, "" )
-			.replace( rprotocol, location.protocol + "//" );
-
-		// Alias method option to type as per ticket #12004
-		s.type = options.method || options.type || s.method || s.type;
-
-		// Extract dataTypes list
-		s.dataTypes = jQuery.trim( s.dataType || "*" ).toLowerCase().match( rnotwhite ) || [ "" ];
-
-		// A cross-domain request is in order when the origin doesn't match the current origin.
-		if ( s.crossDomain == null ) {
-			urlAnchor = document.createElement( "a" );
-
-			// Support: IE8-11+
-			// IE throws exception if url is malformed, e.g. http://example.com:80x/
-			try {
-				urlAnchor.href = s.url;
-
-				// Support: IE8-11+
-				// Anchor's host property isn't correctly set when s.url is relative
-				urlAnchor.href = urlAnchor.href;
-				s.crossDomain = originAnchor.protocol + "//" + originAnchor.host !==
-					urlAnchor.protocol + "//" + urlAnchor.host;
-			} catch ( e ) {
-
-				// If there is an error parsing the URL, assume it is crossDomain,
-				// it can be rejected by the transport if it is invalid
-				s.crossDomain = true;
-			}
-		}
-
-		// Convert data if not already a string
-		if ( s.data && s.processData && typeof s.data !== "string" ) {
-			s.data = jQuery.param( s.data, s.traditional );
-		}
-
-		// Apply prefilters
-		inspectPrefiltersOrTransports( prefilters, s, options, jqXHR );
-
-		// If request was aborted inside a prefilter, stop there
-		if ( state === 2 ) {
-			return jqXHR;
-		}
-
-		// We can fire global events as of now if asked to
-		// Don't fire events if jQuery.event is undefined in an AMD-usage scenario (#15118)
-		fireGlobals = jQuery.event && s.global;
-
-		// Watch for a new set of requests
-		if ( fireGlobals && jQuery.active++ === 0 ) {
-			jQuery.event.trigger( "ajaxStart" );
-		}
-
-		// Uppercase the type
-		s.type = s.type.toUpperCase();
-
-		// Determine if request has content
-		s.hasContent = !rnoContent.test( s.type );
-
-		// Save the URL in case we're toying with the If-Modified-Since
-		// and/or If-None-Match header later on
-		cacheURL = s.url;
-
-		// More options handling for requests with no content
-		if ( !s.hasContent ) {
-
-			// If data is available, append data to url
-			if ( s.data ) {
-				cacheURL = ( s.url += ( rquery.test( cacheURL ) ? "&" : "?" ) + s.data );
-
-				// #9682: remove data so that it's not used in an eventual retry
-				delete s.data;
-			}
-
-			// Add anti-cache in url if needed
-			if ( s.cache === false ) {
-				s.url = rts.test( cacheURL ) ?
-
-					// If there is already a '_' parameter, set its value
-					cacheURL.replace( rts, "$1_=" + nonce++ ) :
-
-					// Otherwise add one to the end
-					cacheURL + ( rquery.test( cacheURL ) ? "&" : "?" ) + "_=" + nonce++;
-			}
-		}
-
-		// Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode.
-		if ( s.ifModified ) {
-			if ( jQuery.lastModified[ cacheURL ] ) {
-				jqXHR.setRequestHeader( "If-Modified-Since", jQuery.lastModified[ cacheURL ] );
-			}
-			if ( jQuery.etag[ cacheURL ] ) {
-				jqXHR.setRequestHeader( "If-None-Match", jQuery.etag[ cacheURL ] );
-			}
-		}
-
-		// Set the correct header, if data is being sent
-		if ( s.data && s.hasContent && s.contentType !== false || options.contentType ) {
-			jqXHR.setRequestHeader( "Content-Type", s.contentType );
-		}
-
-		// Set the Accepts header for the server, depending on the dataType
-		jqXHR.setRequestHeader(
-			"Accept",
-			s.dataTypes[ 0 ] && s.accepts[ s.dataTypes[ 0 ] ] ?
-				s.accepts[ s.dataTypes[ 0 ] ] +
-					( s.dataTypes[ 0 ] !== "*" ? ", " + allTypes + "; q=0.01" : "" ) :
-				s.accepts[ "*" ]
-		);
-
-		// Check for headers option
-		for ( i in s.headers ) {
-			jqXHR.setRequestHeader( i, s.headers[ i ] );
-		}
-
-		// Allow custom headers/mimetypes and early abort
-		if ( s.beforeSend &&
-			( s.beforeSend.call( callbackContext, jqXHR, s ) === false || state === 2 ) ) {
-
-			// Abort if not done already and return
-			return jqXHR.abort();
-		}
-
-		// Aborting is no longer a cancellation
-		strAbort = "abort";
-
-		// Install callbacks on deferreds
-		for ( i in { success: 1, error: 1, complete: 1 } ) {
-			jqXHR[ i ]( s[ i ] );
-		}
-
-		// Get transport
-		transport = inspectPrefiltersOrTransports( transports, s, options, jqXHR );
-
-		// If no transport, we auto-abort
-		if ( !transport ) {
-			done( -1, "No Transport" );
-		} else {
-			jqXHR.readyState = 1;
-
-			// Send global event
-			if ( fireGlobals ) {
-				globalEventContext.trigger( "ajaxSend", [ jqXHR, s ] );
-			}
-
-			// If request was aborted inside ajaxSend, stop there
-			if ( state === 2 ) {
-				return jqXHR;
-			}
-
-			// Timeout
-			if ( s.async && s.timeout > 0 ) {
-				timeoutTimer = window.setTimeout( function() {
-					jqXHR.abort( "timeout" );
-				}, s.timeout );
-			}
-
-			try {
-				state = 1;
-				transport.send( requestHeaders, done );
-			} catch ( e ) {
-
-				// Propagate exception as error if not done
-				if ( state < 2 ) {
-					done( -1, e );
-
-				// Simply rethrow otherwise
-				} else {
-					throw e;
-				}
-			}
-		}
-
-		// Callback for when everything is done
-		function done( status, nativeStatusText, responses, headers ) {
-			var isSuccess, success, error, response, modified,
-				statusText = nativeStatusText;
-
-			// Called once
-			if ( state === 2 ) {
-				return;
-			}
-
-			// State is "done" now
-			state = 2;
-
-			// Clear timeout if it exists
-			if ( timeoutTimer ) {
-				window.clearTimeout( timeoutTimer );
-			}
-
-			// Dereference transport for early garbage collection
-			// (no matter how long the jqXHR object will be used)
-			transport = undefined;
-
-			// Cache response headers
-			responseHeadersString = headers || "";
-
-			// Set readyState
-			jqXHR.readyState = status > 0 ? 4 : 0;
-
-			// Determine if successful
-			isSuccess = status >= 200 && status < 300 || status === 304;
-
-			// Get response data
-			if ( responses ) {
-				response = ajaxHandleResponses( s, jqXHR, responses );
-			}
-
-			// Convert no matter what (that way responseXXX fields are always set)
-			response = ajaxConvert( s, response, jqXHR, isSuccess );
-
-			// If successful, handle type chaining
-			if ( isSuccess ) {
-
-				// Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode.
-				if ( s.ifModified ) {
-					modified = jqXHR.getResponseHeader( "Last-Modified" );
-					if ( modified ) {
-						jQuery.lastModified[ cacheURL ] = modified;
-					}
-					modified = jqXHR.getResponseHeader( "etag" );
-					if ( modified ) {
-						jQuery.etag[ cacheURL ] = modified;
-					}
-				}
-
-				// if no content
-				if ( status === 204 || s.type === "HEAD" ) {
-					statusText = "nocontent";
-
-				// if not modified
-				} else if ( status === 304 ) {
-					statusText = "notmodified";
-
-				// If we have data, let's convert it
-				} else {
-					statusText = response.state;
-					success = response.data;
-					error = response.error;
-					isSuccess = !error;
-				}
-			} else {
-
-				// Extract error from statusText and normalize for non-aborts
-				error = statusText;
-				if ( status || !statusText ) {
-					statusText = "error";
-					if ( status < 0 ) {
-						status = 0;
-					}
-				}
-			}
-
-			// Set data for the fake xhr object
-			jqXHR.status = status;
-			jqXHR.statusText = ( nativeStatusText || statusText ) + "";
-
-			// Success/Error
-			if ( isSuccess ) {
-				deferred.resolveWith( callbackContext, [ success, statusText, jqXHR ] );
-			} else {
-				deferred.rejectWith( callbackContext, [ jqXHR, statusText, error ] );
-			}
-
-			// Status-dependent callbacks
-			jqXHR.statusCode( statusCode );
-			statusCode = undefined;
-
-			if ( fireGlobals ) {
-				globalEventContext.trigger( isSuccess ? "ajaxSuccess" : "ajaxError",
-					[ jqXHR, s, isSuccess ? success : error ] );
-			}
-
-			// Complete
-			completeDeferred.fireWith( callbackContext, [ jqXHR, statusText ] );
-
-			if ( fireGlobals ) {
-				globalEventContext.trigger( "ajaxComplete", [ jqXHR, s ] );
-
-				// Handle the global AJAX counter
-				if ( !( --jQuery.active ) ) {
-					jQuery.event.trigger( "ajaxStop" );
-				}
-			}
-		}
-
-		return jqXHR;
-	},
-
-	getJSON: function( url, data, callback ) {
-		return jQuery.get( url, data, callback, "json" );
-	},
-
-	getScript: function( url, callback ) {
-		return jQuery.get( url, undefined, callback, "script" );
-	}
-} );
-
-jQuery.each( [ "get", "post" ], function( i, method ) {
-	jQuery[ method ] = function( url, data, callback, type ) {
-
-		// Shift arguments if data argument was omitted
-		if ( jQuery.isFunction( data ) ) {
-			type = type || callback;
-			callback = data;
-			data = undefined;
-		}
-
-		// The url can be an options object (which then must have .url)
-		return jQuery.ajax( jQuery.extend( {
-			url: url,
-			type: method,
-			dataType: type,
-			data: data,
-			success: callback
-		}, jQuery.isPlainObject( url ) && url ) );
-	};
-} );
-
-
-jQuery._evalUrl = function( url ) {
-	return jQuery.ajax( {
-		url: url,
-
-		// Make this explicit, since user can override this through ajaxSetup (#11264)
-		type: "GET",
-		dataType: "script",
-		async: false,
-		global: false,
-		"throws": true
-	} );
-};
-
-
-jQuery.fn.extend( {
-	wrapAll: function( html ) {
-		var wrap;
-
-		if ( jQuery.isFunction( html ) ) {
-			return this.each( function( i ) {
-				jQuery( this ).wrapAll( html.call( this, i ) );
-			} );
-		}
-
-		if ( this[ 0 ] ) {
-
-			// The elements to wrap the target around
-			wrap = jQuery( html, this[ 0 ].ownerDocument ).eq( 0 ).clone( true );
-
-			if ( this[ 0 ].parentNode ) {
-				wrap.insertBefore( this[ 0 ] );
-			}
-
-			wrap.map( function() {
-				var elem = this;
-
-				while ( elem.firstElementChild ) {
-					elem = elem.firstElementChild;
-				}
-
-				return elem;
-			} ).append( this );
-		}
-
-		return this;
-	},
-
-	wrapInner: function( html ) {
-		if ( jQuery.isFunction( html ) ) {
-			return this.each( function( i ) {
-				jQuery( this ).wrapInner( html.call( this, i ) );
-			} );
-		}
-
-		return this.each( function() {
-			var self = jQuery( this ),
-				contents = self.contents();
-
-			if ( contents.length ) {
-				contents.wrapAll( html );
-
-			} else {
-				self.append( html );
-			}
-		} );
-	},
-
-	wrap: function( html ) {
-		var isFunction = jQuery.isFunction( html );
-
-		return this.each( function( i ) {
-			jQuery( this ).wrapAll( isFunction ? html.call( this, i ) : html );
-		} );
-	},
-
-	unwrap: function() {
-		return this.parent().each( function() {
-			if ( !jQuery.nodeName( this, "body" ) ) {
-				jQuery( this ).replaceWith( this.childNodes );
-			}
-		} ).end();
-	}
-} );
-
-
-jQuery.expr.filters.hidden = function( elem ) {
-	return !jQuery.expr.filters.visible( elem );
-};
-jQuery.expr.filters.visible = function( elem ) {
-
-	// Support: Opera <= 12.12
-	// Opera reports offsetWidths and offsetHeights less than zero on some elements
-	// Use OR instead of AND as the element is not visible if either is true
-	// See tickets #10406 and #13132
-	return elem.offsetWidth > 0 || elem.offsetHeight > 0 || elem.getClientRects().length > 0;
-};
-
-
-
-
-var r20 = /%20/g,
-	rbracket = /\[\]$/,
-	rCRLF = /\r?\n/g,
-	rsubmitterTypes = /^(?:submit|button|image|reset|file)$/i,
-	rsubmittable = /^(?:input|select|textarea|keygen)/i;
-
-function buildParams( prefix, obj, traditional, add ) {
-	var name;
-
-	if ( jQuery.isArray( obj ) ) {
-
-		// Serialize array item.
-		jQuery.each( obj, function( i, v ) {
-			if ( traditional || rbracket.test( prefix ) ) {
-
-				// Treat each array item as a scalar.
-				add( prefix, v );
-
-			} else {
-
-				// Item is non-scalar (array or object), encode its numeric index.
-				buildParams(
-					prefix + "[" + ( typeof v === "object" && v != null ? i : "" ) + "]",
-					v,
-					traditional,
-					add
-				);
-			}
-		} );
-
-	} else if ( !traditional && jQuery.type( obj ) === "object" ) {
-
-		// Serialize object item.
-		for ( name in obj ) {
-			buildParams( prefix + "[" + name + "]", obj[ name ], traditional, add );
-		}
-
-	} else {
-
-		// Serialize scalar item.
-		add( prefix, obj );
-	}
-}
-
-// Serialize an array of form elements or a set of
-// key/values into a query string
-jQuery.param = function( a, traditional ) {
-	var prefix,
-		s = [],
-		add = function( key, value ) {
-
-			// If value is a function, invoke it and return its value
-			value = jQuery.isFunction( value ) ? value() : ( value == null ? "" : value );
-			s[ s.length ] = encodeURIComponent( key ) + "=" + encodeURIComponent( value );
-		};
-
-	// Set traditional to true for jQuery <= 1.3.2 behavior.
-	if ( traditional === undefined ) {
-		traditional = jQuery.ajaxSettings && jQuery.ajaxSettings.traditional;
-	}
-
-	// If an array was passed in, assume that it is an array of form elements.
-	if ( jQuery.isArray( a ) || ( a.jquery && !jQuery.isPlainObject( a ) ) ) {
-
-		// Serialize the form elements
-		jQuery.each( a, function() {
-			add( this.name, this.value );
-		} );
-
-	} else {
-
-		// If traditional, encode the "old" way (the way 1.3.2 or older
-		// did it), otherwise encode params recursively.
-		for ( prefix in a ) {
-			buildParams( prefix, a[ prefix ], traditional, add );
-		}
-	}
-
-	// Return the resulting serialization
-	return s.join( "&" ).replace( r20, "+" );
-};
-
-jQuery.fn.extend( {
-	serialize: function() {
-		return jQuery.param( this.serializeArray() );
-	},
-	serializeArray: function() {
-		return this.map( function() {
-
-			// Can add propHook for "elements" to filter or add form elements
-			var elements = jQuery.prop( this, "elements" );
-			return elements ? jQuery.makeArray( elements ) : this;
-		} )
-		.filter( function() {
-			var type = this.type;
-
-			// Use .is( ":disabled" ) so that fieldset[disabled] works
-			return this.name && !jQuery( this ).is( ":disabled" ) &&
-				rsubmittable.test( this.nodeName ) && !rsubmitterTypes.test( type ) &&
-				( this.checked || !rcheckableType.test( type ) );
-		} )
-		.map( function( i, elem ) {
-			var val = jQuery( this ).val();
-
-			return val == null ?
-				null :
-				jQuery.isArray( val ) ?
-					jQuery.map( val, function( val ) {
-						return { name: elem.name, value: val.replace( rCRLF, "\r\n" ) };
-					} ) :
-					{ name: elem.name, value: val.replace( rCRLF, "\r\n" ) };
-		} ).get();
-	}
-} );
-
-
-jQuery.ajaxSettings.xhr = function() {
-	try {
-		return new window.XMLHttpRequest();
-	} catch ( e ) {}
-};
-
-var xhrSuccessStatus = {
-
-		// File protocol always yields status code 0, assume 200
-		0: 200,
-
-		// Support: IE9
-		// #1450: sometimes IE returns 1223 when it should be 204
-		1223: 204
-	},
-	xhrSupported = jQuery.ajaxSettings.xhr();
-
-support.cors = !!xhrSupported && ( "withCredentials" in xhrSupported );
-support.ajax = xhrSupported = !!xhrSupported;
-
-jQuery.ajaxTransport( function( options ) {
-	var callback, errorCallback;
-
-	// Cross domain only allowed if supported through XMLHttpRequest
-	if ( support.cors || xhrSupported && !options.crossDomain ) {
-		return {
-			send: function( headers, complete ) {
-				var i,
-					xhr = options.xhr();
-
-				xhr.open(
-					options.type,
-					options.url,
-					options.async,
-					options.username,
-					options.password
-				);
-
-				// Apply custom fields if provided
-				if ( options.xhrFields ) {
-					for ( i in options.xhrFields ) {
-						xhr[ i ] = options.xhrFields[ i ];
-					}
-				}
-
-				// Override mime type if needed
-				if ( options.mimeType && xhr.overrideMimeType ) {
-					xhr.overrideMimeType( options.mimeType );
-				}
-
-				// X-Requested-With header
-				// For cross-domain requests, seeing as conditions for a preflight are
-				// akin to a jigsaw puzzle, we simply never set it to be sure.
-				// (it can always be set on a per-request basis or even using ajaxSetup)
-				// For same-domain requests, won't change header if already provided.
-				if ( !options.crossDomain && !headers[ "X-Requested-With" ] ) {
-					headers[ "X-Requested-With" ] = "XMLHttpRequest";
-				}
-
-				// Set headers
-				for ( i in headers ) {
-					xhr.setRequestHeader( i, headers[ i ] );
-				}
-
-				// Callback
-				callback = function( type ) {
-					return function() {
-						if ( callback ) {
-							callback = errorCallback = xhr.onload =
-								xhr.onerror = xhr.onabort = xhr.onreadystatechange = null;
-
-							if ( type === "abort" ) {
-								xhr.abort();
-							} else if ( type === "error" ) {
-
-								// Support: IE9
-								// On a manual native abort, IE9 throws
-								// errors on any property access that is not readyState
-								if ( typeof xhr.status !== "number" ) {
-									complete( 0, "error" );
-								} else {
-									complete(
-
-										// File: protocol always yields status 0; see #8605, #14207
-										xhr.status,
-										xhr.statusText
-									);
-								}
-							} else {
-								complete(
-									xhrSuccessStatus[ xhr.status ] || xhr.status,
-									xhr.statusText,
-
-									// Support: IE9 only
-									// IE9 has no XHR2 but throws on binary (trac-11426)
-									// For XHR2 non-text, let the caller handle it (gh-2498)
-									( xhr.responseType || "text" ) !== "text"  ||
-									typeof xhr.responseText !== "string" ?
-										{ binary: xhr.response } :
-										{ text: xhr.responseText },
-									xhr.getAllResponseHeaders()
-								);
-							}
-						}
-					};
-				};
-
-				// Listen to events
-				xhr.onload = callback();
-				errorCallback = xhr.onerror = callback( "error" );
-
-				// Support: IE9
-				// Use onreadystatechange to replace onabort
-				// to handle uncaught aborts
-				if ( xhr.onabort !== undefined ) {
-					xhr.onabort = errorCallback;
-				} else {
-					xhr.onreadystatechange = function() {
-
-						// Check readyState before timeout as it changes
-						if ( xhr.readyState === 4 ) {
-
-							// Allow onerror to be called first,
-							// but that will not handle a native abort
-							// Also, save errorCallback to a variable
-							// as xhr.onerror cannot be accessed
-							window.setTimeout( function() {
-								if ( callback ) {
-									errorCallback();
-								}
-							} );
-						}
-					};
-				}
-
-				// Create the abort callback
-				callback = callback( "abort" );
-
-				try {
-
-					// Do send the request (this may raise an exception)
-					xhr.send( options.hasContent && options.data || null );
-				} catch ( e ) {
-
-					// #14683: Only rethrow if this hasn't been notified as an error yet
-					if ( callback ) {
-						throw e;
-					}
-				}
-			},
-
-			abort: function() {
-				if ( callback ) {
-					callback();
-				}
-			}
-		};
-	}
-} );
-
-
-
-
-// Install script dataType
-jQuery.ajaxSetup( {
-	accepts: {
-		script: "text/javascript, application/javascript, " +
-			"application/ecmascript, application/x-ecmascript"
-	},
-	contents: {
-		script: /\b(?:java|ecma)script\b/
-	},
-	converters: {
-		"text script": function( text ) {
-			jQuery.globalEval( text );
-			return text;
-		}
-	}
-} );
-
-// Handle cache's special case and crossDomain
-jQuery.ajaxPrefilter( "script", function( s ) {
-	if ( s.cache === undefined ) {
-		s.cache = false;
-	}
-	if ( s.crossDomain ) {
-		s.type = "GET";
-	}
-} );
-
-// Bind script tag hack transport
-jQuery.ajaxTransport( "script", function( s ) {
-
-	// This transport only deals with cross domain requests
-	if ( s.crossDomain ) {
-		var script, callback;
-		return {
-			send: function( _, complete ) {
-				script = jQuery( "<script>" ).prop( {
-					charset: s.scriptCharset,
-					src: s.url
-				} ).on(
-					"load error",
-					callback = function( evt ) {
-						script.remove();
-						callback = null;
-						if ( evt ) {
-							complete( evt.type === "error" ? 404 : 200, evt.type );
-						}
-					}
-				);
-
-				// Use native DOM manipulation to avoid our domManip AJAX trickery
-				document.head.appendChild( script[ 0 ] );
-			},
-			abort: function() {
-				if ( callback ) {
-					callback();
-				}
-			}
-		};
-	}
-} );
-
-
-
-
-var oldCallbacks = [],
-	rjsonp = /(=)\?(?=&|$)|\?\?/;
-
-// Default jsonp settings
-jQuery.ajaxSetup( {
-	jsonp: "callback",
-	jsonpCallback: function() {
-		var callback = oldCallbacks.pop() || ( jQuery.expando + "_" + ( nonce++ ) );
-		this[ callback ] = true;
-		return callback;
-	}
-} );
-
-// Detect, normalize options and install callbacks for jsonp requests
-jQuery.ajaxPrefilter( "json jsonp", function( s, originalSettings, jqXHR ) {
-
-	var callbackName, overwritten, responseContainer,
-		jsonProp = s.jsonp !== false && ( rjsonp.test( s.url ) ?
-			"url" :
-			typeof s.data === "string" &&
-				( s.contentType || "" )
-					.indexOf( "application/x-www-form-urlencoded" ) === 0 &&
-				rjsonp.test( s.data ) && "data"
-		);
-
-	// Handle iff the expected data type is "jsonp" or we have a parameter to set
-	if ( jsonProp || s.dataTypes[ 0 ] === "jsonp" ) {
-
-		// Get callback name, remembering preexisting value associated with it
-		callbackName = s.jsonpCallback = jQuery.isFunction( s.jsonpCallback ) ?
-			s.jsonpCallback() :
-			s.jsonpCallback;
-
-		// Insert callback into url or form data
-		if ( jsonProp ) {
-			s[ jsonProp ] = s[ jsonProp ].replace( rjsonp, "$1" + callbackName );
-		} else if ( s.jsonp !== false ) {
-			s.url += ( rquery.test( s.url ) ? "&" : "?" ) + s.jsonp + "=" + callbackName;
-		}
-
-		// Use data converter to retrieve json after script execution
-		s.converters[ "script json" ] = function() {
-			if ( !responseContainer ) {
-				jQuery.error( callbackName + " was not called" );
-			}
-			return responseContainer[ 0 ];
-		};
-
-		// Force json dataType
-		s.dataTypes[ 0 ] = "json";
-
-		// Install callback
-		overwritten = window[ callbackName ];
-		window[ callbackName ] = function() {
-			responseContainer = arguments;
-		};
-
-		// Clean-up function (fires after converters)
-		jqXHR.always( function() {
-
-			// If previous value didn't exist - remove it
-			if ( overwritten === undefined ) {
-				jQuery( window ).removeProp( callbackName );
-
-			// Otherwise restore preexisting value
-			} else {
-				window[ callbackName ] = overwritten;
-			}
-
-			// Save back as free
-			if ( s[ callbackName ] ) {
-
-				// Make sure that re-using the options doesn't screw things around
-				s.jsonpCallback = originalSettings.jsonpCallback;
-
-				// Save the callback name for future use
-				oldCallbacks.push( callbackName );
-			}
-
-			// Call if it was a function and we have a response
-			if ( responseContainer && jQuery.isFunction( overwritten ) ) {
-				overwritten( responseContainer[ 0 ] );
-			}
-
-			responseContainer = overwritten = undefined;
-		} );
-
-		// Delegate to script
-		return "script";
-	}
-} );
-
-
-
-
-// Argument "data" should be string of html
-// context (optional): If specified, the fragment will be created in this context,
-// defaults to document
-// keepScripts (optional): If true, will include scripts passed in the html string
-jQuery.parseHTML = function( data, context, keepScripts ) {
-	if ( !data || typeof data !== "string" ) {
-		return null;
-	}
-	if ( typeof context === "boolean" ) {
-		keepScripts = context;
-		context = false;
-	}
-	context = context || document;
-
-	var parsed = rsingleTag.exec( data ),
-		scripts = !keepScripts && [];
-
-	// Single tag
-	if ( parsed ) {
-		return [ context.createElement( parsed[ 1 ] ) ];
-	}
-
-	parsed = buildFragment( [ data ], context, scripts );
-
-	if ( scripts && scripts.length ) {
-		jQuery( scripts ).remove();
-	}
-
-	return jQuery.merge( [], parsed.childNodes );
-};
-
-
-// Keep a copy of the old load method
-var _load = jQuery.fn.load;
-
-/**
- * Load a url into a page
- */
-jQuery.fn.load = function( url, params, callback ) {
-	if ( typeof url !== "string" && _load ) {
-		return _load.apply( this, arguments );
-	}
-
-	var selector, type, response,
-		self = this,
-		off = url.indexOf( " " );
-
-	if ( off > -1 ) {
-		selector = jQuery.trim( url.slice( off ) );
-		url = url.slice( 0, off );
-	}
-
-	// If it's a function
-	if ( jQuery.isFunction( params ) ) {
-
-		// We assume that it's the callback
-		callback = params;
-		params = undefined;
-
-	// Otherwise, build a param string
-	} else if ( params && typeof params === "object" ) {
-		type = "POST";
-	}
-
-	// If we have elements to modify, make the request
-	if ( self.length > 0 ) {
-		jQuery.ajax( {
-			url: url,
-
-			// If "type" variable is undefined, then "GET" method will be used.
-			// Make value of this field explicit since
-			// user can override it through ajaxSetup method
-			type: type || "GET",
-			dataType: "html",
-			data: params
-		} ).done( function( responseText ) {
-
-			// Save response for use in complete callback
-			response = arguments;
-
-			self.html( selector ?
-
-				// If a selector was specified, locate the right elements in a dummy div
-				// Exclude scripts to avoid IE 'Permission Denied' errors
-				jQuery( "<div>" ).append( jQuery.parseHTML( responseText ) ).find( selector ) :
-
-				// Otherwise use the full result
-				responseText );
-
-		// If the request succeeds, this function gets "data", "status", "jqXHR"
-		// but they are ignored because response was set above.
-		// If it fails, this function gets "jqXHR", "status", "error"
-		} ).always( callback && function( jqXHR, status ) {
-			self.each( function() {
-				callback.apply( this, response || [ jqXHR.responseText, status, jqXHR ] );
-			} );
-		} );
-	}
-
-	return this;
-};
-
-
-
-
-// Attach a bunch of functions for handling common AJAX events
-jQuery.each( [
-	"ajaxStart",
-	"ajaxStop",
-	"ajaxComplete",
-	"ajaxError",
-	"ajaxSuccess",
-	"ajaxSend"
-], function( i, type ) {
-	jQuery.fn[ type ] = function( fn ) {
-		return this.on( type, fn );
-	};
-} );
-
-
-
-
-jQuery.expr.filters.animated = function( elem ) {
-	return jQuery.grep( jQuery.timers, function( fn ) {
-		return elem === fn.elem;
-	} ).length;
-};
-
-
-
-
-/**
- * Gets a window from an element
- */
-function getWindow( elem ) {
-	return jQuery.isWindow( elem ) ? elem : elem.nodeType === 9 && elem.defaultView;
-}
-
-jQuery.offset = {
-	setOffset: function( elem, options, i ) {
-		var curPosition, curLeft, curCSSTop, curTop, curOffset, curCSSLeft, calculatePosition,
-			position = jQuery.css( elem, "position" ),
-			curElem = jQuery( elem ),
-			props = {};
-
-		// Set position first, in-case top/left are set even on static elem
-		if ( position === "static" ) {
-			elem.style.position = "relative";
-		}
-
-		curOffset = curElem.offset();
-		curCSSTop = jQuery.css( elem, "top" );
-		curCSSLeft = jQuery.css( elem, "left" );
-		calculatePosition = ( position === "absolute" || position === "fixed" ) &&
-			( curCSSTop + curCSSLeft ).indexOf( "auto" ) > -1;
-
-		// Need to be able to calculate position if either
-		// top or left is auto and position is either absolute or fixed
-		if ( calculatePosition ) {
-			curPosition = curElem.position();
-			curTop = curPosition.top;
-			curLeft = curPosition.left;
-
-		} else {
-			curTop = parseFloat( curCSSTop ) || 0;
-			curLeft = parseFloat( curCSSLeft ) || 0;
-		}
-
-		if ( jQuery.isFunction( options ) ) {
-
-			// Use jQuery.extend here to allow modification of coordinates argument (gh-1848)
-			options = options.call( elem, i, jQuery.extend( {}, curOffset ) );
-		}
-
-		if ( options.top != null ) {
-			props.top = ( options.top - curOffset.top ) + curTop;
-		}
-		if ( options.left != null ) {
-			props.left = ( options.left - curOffset.left ) + curLeft;
-		}
-
-		if ( "using" in options ) {
-			options.using.call( elem, props );
-
-		} else {
-			curElem.css( props );
-		}
-	}
-};
-
-jQuery.fn.extend( {
-	offset: function( options ) {
-		if ( arguments.length ) {
-			return options === undefined ?
-				this :
-				this.each( function( i ) {
-					jQuery.offset.setOffset( this, options, i );
-				} );
-		}
-
-		var docElem, win,
-			elem = this[ 0 ],
-			box = { top: 0, left: 0 },
-			doc = elem && elem.ownerDocument;
-
-		if ( !doc ) {
-			return;
-		}
-
-		docElem = doc.documentElement;
-
-		// Make sure it's not a disconnected DOM node
-		if ( !jQuery.contains( docElem, elem ) ) {
-			return box;
-		}
-
-		box = elem.getBoundingClientRect();
-		win = getWindow( doc );
-		return {
-			top: box.top + win.pageYOffset - docElem.clientTop,
-			left: box.left + win.pageXOffset - docElem.clientLeft
-		};
-	},
-
-	position: function() {
-		if ( !this[ 0 ] ) {
-			return;
-		}
-
-		var offsetParent, offset,
-			elem = this[ 0 ],
-			parentOffset = { top: 0, left: 0 };
-
-		// Fixed elements are offset from window (parentOffset = {top:0, left: 0},
-		// because it is its only offset parent
-		if ( jQuery.css( elem, "position" ) === "fixed" ) {
-
-			// Assume getBoundingClientRect is there when computed position is fixed
-			offset = elem.getBoundingClientRect();
-
-		} else {
-
-			// Get *real* offsetParent
-			offsetParent = this.offsetParent();
-
-			// Get correct offsets
-			offset = this.offset();
-			if ( !jQuery.nodeName( offsetParent[ 0 ], "html" ) ) {
-				parentOffset = offsetParent.offset();
-			}
-
-			// Add offsetParent borders
-			parentOffset.top += jQuery.css( offsetParent[ 0 ], "borderTopWidth", true );
-			parentOffset.left += jQuery.css( offsetParent[ 0 ], "borderLeftWidth", true );
-		}
-
-		// Subtract parent offsets and element margins
-		return {
-			top: offset.top - parentOffset.top - jQuery.css( elem, "marginTop", true ),
-			left: offset.left - parentOffset.left - jQuery.css( elem, "marginLeft", true )
-		};
-	},
-
-	// This method will return documentElement in the following cases:
-	// 1) For the element inside the iframe without offsetParent, this method will return
-	//    documentElement of the parent window
-	// 2) For the hidden or detached element
-	// 3) For body or html element, i.e. in case of the html node - it will return itself
-	//
-	// but those exceptions were never presented as a real life use-cases
-	// and might be considered as more preferable results.
-	//
-	// This logic, however, is not guaranteed and can change at any point in the future
-	offsetParent: function() {
-		return this.map( function() {
-			var offsetParent = this.offsetParent;
-
-			while ( offsetParent && jQuery.css( offsetParent, "position" ) === "static" ) {
-				offsetParent = offsetParent.offsetParent;
-			}
-
-			return offsetParent || documentElement;
-		} );
-	}
-} );
-
-// Create scrollLeft and scrollTop methods
-jQuery.each( { scrollLeft: "pageXOffset", scrollTop: "pageYOffset" }, function( method, prop ) {
-	var top = "pageYOffset" === prop;
-
-	jQuery.fn[ method ] = function( val ) {
-		return access( this, function( elem, method, val ) {
-			var win = getWindow( elem );
-
-			if ( val === undefined ) {
-				return win ? win[ prop ] : elem[ method ];
-			}
-
-			if ( win ) {
-				win.scrollTo(
-					!top ? val : win.pageXOffset,
-					top ? val : win.pageYOffset
-				);
-
-			} else {
-				elem[ method ] = val;
-			}
-		}, method, val, arguments.length );
-	};
-} );
-
-// Support: Safari<7-8+, Chrome<37-44+
-// Add the top/left cssHooks using jQuery.fn.position
-// Webkit bug: https://bugs.webkit.org/show_bug.cgi?id=29084
-// Blink bug: https://code.google.com/p/chromium/issues/detail?id=229280
-// getComputedStyle returns percent when specified for top/left/bottom/right;
-// rather than make the css module depend on the offset module, just check for it here
-jQuery.each( [ "top", "left" ], function( i, prop ) {
-	jQuery.cssHooks[ prop ] = addGetHookIf( support.pixelPosition,
-		function( elem, computed ) {
-			if ( computed ) {
-				computed = curCSS( elem, prop );
-
-				// If curCSS returns percentage, fallback to offset
-				return rnumnonpx.test( computed ) ?
-					jQuery( elem ).position()[ prop ] + "px" :
-					computed;
-			}
-		}
-	);
-} );
-
-
-// Create innerHeight, innerWidth, height, width, outerHeight and outerWidth methods
-jQuery.each( { Height: "height", Width: "width" }, function( name, type ) {
-	jQuery.each( { padding: "inner" + name, content: type, "": "outer" + name },
-		function( defaultExtra, funcName ) {
-
-		// Margin is only for outerHeight, outerWidth
-		jQuery.fn[ funcName ] = function( margin, value ) {
-			var chainable = arguments.length && ( defaultExtra || typeof margin !== "boolean" ),
-				extra = defaultExtra || ( margin === true || value === true ? "margin" : "border" );
-
-			return access( this, function( elem, type, value ) {
-				var doc;
-
-				if ( jQuery.isWindow( elem ) ) {
-
-					// As of 5/8/2012 this will yield incorrect results for Mobile Safari, but there
-					// isn't a whole lot we can do. See pull request at this URL for discussion:
-					// https://github.com/jquery/jquery/pull/764
-					return elem.document.documentElement[ "client" + name ];
-				}
-
-				// Get document width or height
-				if ( elem.nodeType === 9 ) {
-					doc = elem.documentElement;
-
-					// Either scroll[Width/Height] or offset[Width/Height] or client[Width/Height],
-					// whichever is greatest
-					return Math.max(
-						elem.body[ "scroll" + name ], doc[ "scroll" + name ],
-						elem.body[ "offset" + name ], doc[ "offset" + name ],
-						doc[ "client" + name ]
-					);
-				}
-
-				return value === undefined ?
-
-					// Get width or height on the element, requesting but not forcing parseFloat
-					jQuery.css( elem, type, extra ) :
-
-					// Set width or height on the element
-					jQuery.style( elem, type, value, extra );
-			}, type, chainable ? margin : undefined, chainable, null );
-		};
-	} );
-} );
-
-
-jQuery.fn.extend( {
-
-	bind: function( types, data, fn ) {
-		return this.on( types, null, data, fn );
-	},
-	unbind: function( types, fn ) {
-		return this.off( types, null, fn );
-	},
-
-	delegate: function( selector, types, data, fn ) {
-		return this.on( types, selector, data, fn );
-	},
-	undelegate: function( selector, types, fn ) {
-
-		// ( namespace ) or ( selector, types [, fn] )
-		return arguments.length === 1 ?
-			this.off( selector, "**" ) :
-			this.off( types, selector || "**", fn );
-	},
-	size: function() {
-		return this.length;
-	}
-} );
-
-jQuery.fn.andSelf = jQuery.fn.addBack;
-
-
-
-
-// Register as a named AMD module, since jQuery can be concatenated with other
-// files that may use define, but not via a proper concatenation script that
-// understands anonymous AMD modules. A named AMD is safest and most robust
-// way to register. Lowercase jquery is used because AMD module names are
-// derived from file names, and jQuery is normally delivered in a lowercase
-// file name. Do this after creating the global so that if an AMD module wants
-// to call noConflict to hide this version of jQuery, it will work.
-
-// Note that for maximum portability, libraries that are not jQuery should
-// declare themselves as anonymous modules, and avoid setting a global if an
-// AMD loader is present. jQuery is a special case. For more information, see
-// https://github.com/jrburke/requirejs/wiki/Updating-existing-libraries#wiki-anon
-
-if ( typeof define === "function" && define.amd ) {
-	define( "jquery", [], function() {
-		return jQuery;
-	} );
-}
-
-
-
-var
-
-	// Map over jQuery in case of overwrite
-	_jQuery = window.jQuery,
-
-	// Map over the $ in case of overwrite
-	_$ = window.$;
-
-jQuery.noConflict = function( deep ) {
-	if ( window.$ === jQuery ) {
-		window.$ = _$;
-	}
-
-	if ( deep && window.jQuery === jQuery ) {
-		window.jQuery = _jQuery;
-	}
-
-	return jQuery;
-};
-
-// Expose jQuery and $ identifiers, even in AMD
-// (#7102#comment:10, https://github.com/jquery/jquery/pull/557)
-// and CommonJS for browser emulators (#13566)
-if ( !noGlobal ) {
-	window.jQuery = window.$ = jQuery;
-}
-
-return jQuery;
-}));
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/libraries/jquery-3.3.1.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/libraries/jquery-3.3.1.js
deleted file mode 100644
index 9b5206b..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/libraries/jquery-3.3.1.js
+++ /dev/null
@@ -1,10364 +0,0 @@
-/*!
- * jQuery JavaScript Library v3.3.1
- * https://jquery.com/
- *
- * Includes Sizzle.js
- * https://sizzlejs.com/
- *
- * Copyright JS Foundation and other contributors
- * Released under the MIT license
- * https://jquery.org/license
- *
- * Date: 2018-01-20T17:24Z
- */
-( function( global, factory ) {
-
-	"use strict";
-
-	if ( typeof module === "object" && typeof module.exports === "object" ) {
-
-		// For CommonJS and CommonJS-like environments where a proper `window`
-		// is present, execute the factory and get jQuery.
-		// For environments that do not have a `window` with a `document`
-		// (such as Node.js), expose a factory as module.exports.
-		// This accentuates the need for the creation of a real `window`.
-		// e.g. var jQuery = require("jquery")(window);
-		// See ticket #14549 for more info.
-		module.exports = global.document ?
-			factory( global, true ) :
-			function( w ) {
-				if ( !w.document ) {
-					throw new Error( "jQuery requires a window with a document" );
-				}
-				return factory( w );
-			};
-	} else {
-		factory( global );
-	}
-
-// Pass this if window is not defined yet
-} )( typeof window !== "undefined" ? window : this, function( window, noGlobal ) {
-
-// Edge <= 12 - 13+, Firefox <=18 - 45+, IE 10 - 11, Safari 5.1 - 9+, iOS 6 - 9.1
-// throw exceptions when non-strict code (e.g., ASP.NET 4.5) accesses strict mode
-// arguments.callee.caller (trac-13335). But as of jQuery 3.0 (2016), strict mode should be common
-// enough that all such attempts are guarded in a try block.
-"use strict";
-
-var arr = [];
-
-var document = window.document;
-
-var getProto = Object.getPrototypeOf;
-
-var slice = arr.slice;
-
-var concat = arr.concat;
-
-var push = arr.push;
-
-var indexOf = arr.indexOf;
-
-var class2type = {};
-
-var toString = class2type.toString;
-
-var hasOwn = class2type.hasOwnProperty;
-
-var fnToString = hasOwn.toString;
-
-var ObjectFunctionString = fnToString.call( Object );
-
-var support = {};
-
-var isFunction = function isFunction( obj ) {
-
-      // Support: Chrome <=57, Firefox <=52
-      // In some browsers, typeof returns "function" for HTML <object> elements
-      // (i.e., `typeof document.createElement( "object" ) === "function"`).
-      // We don't want to classify *any* DOM node as a function.
-      return typeof obj === "function" && typeof obj.nodeType !== "number";
-  };
-
-
-var isWindow = function isWindow( obj ) {
-		return obj != null && obj === obj.window;
-	};
-
-
-
-
-	var preservedScriptAttributes = {
-		type: true,
-		src: true,
-		noModule: true
-	};
-
-	function DOMEval( code, doc, node ) {
-		doc = doc || document;
-
-		var i,
-			script = doc.createElement( "script" );
-
-		script.text = code;
-		if ( node ) {
-			for ( i in preservedScriptAttributes ) {
-				if ( node[ i ] ) {
-					script[ i ] = node[ i ];
-				}
-			}
-		}
-		doc.head.appendChild( script ).parentNode.removeChild( script );
-	}
-
-
-function toType( obj ) {
-	if ( obj == null ) {
-		return obj + "";
-	}
-
-	// Support: Android <=2.3 only (functionish RegExp)
-	return typeof obj === "object" || typeof obj === "function" ?
-		class2type[ toString.call( obj ) ] || "object" :
-		typeof obj;
-}
-/* global Symbol */
-// Defining this global in .eslintrc.json would create a danger of using the global
-// unguarded in another place, it seems safer to define global only for this module
-
-
-
-var
-	version = "3.3.1",
-
-	// Define a local copy of jQuery
-	jQuery = function( selector, context ) {
-
-		// The jQuery object is actually just the init constructor 'enhanced'
-		// Need init if jQuery is called (just allow error to be thrown if not included)
-		return new jQuery.fn.init( selector, context );
-	},
-
-	// Support: Android <=4.0 only
-	// Make sure we trim BOM and NBSP
-	rtrim = /^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g;
-
-jQuery.fn = jQuery.prototype = {
-
-	// The current version of jQuery being used
-	jquery: version,
-
-	constructor: jQuery,
-
-	// The default length of a jQuery object is 0
-	length: 0,
-
-	toArray: function() {
-		return slice.call( this );
-	},
-
-	// Get the Nth element in the matched element set OR
-	// Get the whole matched element set as a clean array
-	get: function( num ) {
-
-		// Return all the elements in a clean array
-		if ( num == null ) {
-			return slice.call( this );
-		}
-
-		// Return just the one element from the set
-		return num < 0 ? this[ num + this.length ] : this[ num ];
-	},
-
-	// Take an array of elements and push it onto the stack
-	// (returning the new matched element set)
-	pushStack: function( elems ) {
-
-		// Build a new jQuery matched element set
-		var ret = jQuery.merge( this.constructor(), elems );
-
-		// Add the old object onto the stack (as a reference)
-		ret.prevObject = this;
-
-		// Return the newly-formed element set
-		return ret;
-	},
-
-	// Execute a callback for every element in the matched set.
-	each: function( callback ) {
-		return jQuery.each( this, callback );
-	},
-
-	map: function( callback ) {
-		return this.pushStack( jQuery.map( this, function( elem, i ) {
-			return callback.call( elem, i, elem );
-		} ) );
-	},
-
-	slice: function() {
-		return this.pushStack( slice.apply( this, arguments ) );
-	},
-
-	first: function() {
-		return this.eq( 0 );
-	},
-
-	last: function() {
-		return this.eq( -1 );
-	},
-
-	eq: function( i ) {
-		var len = this.length,
-			j = +i + ( i < 0 ? len : 0 );
-		return this.pushStack( j >= 0 && j < len ? [ this[ j ] ] : [] );
-	},
-
-	end: function() {
-		return this.prevObject || this.constructor();
-	},
-
-	// For internal use only.
-	// Behaves like an Array's method, not like a jQuery method.
-	push: push,
-	sort: arr.sort,
-	splice: arr.splice
-};
-
-jQuery.extend = jQuery.fn.extend = function() {
-	var options, name, src, copy, copyIsArray, clone,
-		target = arguments[ 0 ] || {},
-		i = 1,
-		length = arguments.length,
-		deep = false;
-
-	// Handle a deep copy situation
-	if ( typeof target === "boolean" ) {
-		deep = target;
-
-		// Skip the boolean and the target
-		target = arguments[ i ] || {};
-		i++;
-	}
-
-	// Handle case when target is a string or something (possible in deep copy)
-	if ( typeof target !== "object" && !isFunction( target ) ) {
-		target = {};
-	}
-
-	// Extend jQuery itself if only one argument is passed
-	if ( i === length ) {
-		target = this;
-		i--;
-	}
-
-	for ( ; i < length; i++ ) {
-
-		// Only deal with non-null/undefined values
-		if ( ( options = arguments[ i ] ) != null ) {
-
-			// Extend the base object
-			for ( name in options ) {
-				src = target[ name ];
-				copy = options[ name ];
-
-				// Prevent never-ending loop
-				if ( target === copy ) {
-					continue;
-				}
-
-				// Recurse if we're merging plain objects or arrays
-				if ( deep && copy && ( jQuery.isPlainObject( copy ) ||
-					( copyIsArray = Array.isArray( copy ) ) ) ) {
-
-					if ( copyIsArray ) {
-						copyIsArray = false;
-						clone = src && Array.isArray( src ) ? src : [];
-
-					} else {
-						clone = src && jQuery.isPlainObject( src ) ? src : {};
-					}
-
-					// Never move original objects, clone them
-					target[ name ] = jQuery.extend( deep, clone, copy );
-
-				// Don't bring in undefined values
-				} else if ( copy !== undefined ) {
-					target[ name ] = copy;
-				}
-			}
-		}
-	}
-
-	// Return the modified object
-	return target;
-};
-
-jQuery.extend( {
-
-	// Unique for each copy of jQuery on the page
-	expando: "jQuery" + ( version + Math.random() ).replace( /\D/g, "" ),
-
-	// Assume jQuery is ready without the ready module
-	isReady: true,
-
-	error: function( msg ) {
-		throw new Error( msg );
-	},
-
-	noop: function() {},
-
-	isPlainObject: function( obj ) {
-		var proto, Ctor;
-
-		// Detect obvious negatives
-		// Use toString instead of jQuery.type to catch host objects
-		if ( !obj || toString.call( obj ) !== "[object Object]" ) {
-			return false;
-		}
-
-		proto = getProto( obj );
-
-		// Objects with no prototype (e.g., `Object.create( null )`) are plain
-		if ( !proto ) {
-			return true;
-		}
-
-		// Objects with prototype are plain iff they were constructed by a global Object function
-		Ctor = hasOwn.call( proto, "constructor" ) && proto.constructor;
-		return typeof Ctor === "function" && fnToString.call( Ctor ) === ObjectFunctionString;
-	},
-
-	isEmptyObject: function( obj ) {
-
-		/* eslint-disable no-unused-vars */
-		// See https://github.com/eslint/eslint/issues/6125
-		var name;
-
-		for ( name in obj ) {
-			return false;
-		}
-		return true;
-	},
-
-	// Evaluates a script in a global context
-	globalEval: function( code ) {
-		DOMEval( code );
-	},
-
-	each: function( obj, callback ) {
-		var length, i = 0;
-
-		if ( isArrayLike( obj ) ) {
-			length = obj.length;
-			for ( ; i < length; i++ ) {
-				if ( callback.call( obj[ i ], i, obj[ i ] ) === false ) {
-					break;
-				}
-			}
-		} else {
-			for ( i in obj ) {
-				if ( callback.call( obj[ i ], i, obj[ i ] ) === false ) {
-					break;
-				}
-			}
-		}
-
-		return obj;
-	},
-
-	// Support: Android <=4.0 only
-	trim: function( text ) {
-		return text == null ?
-			"" :
-			( text + "" ).replace( rtrim, "" );
-	},
-
-	// results is for internal usage only
-	makeArray: function( arr, results ) {
-		var ret = results || [];
-
-		if ( arr != null ) {
-			if ( isArrayLike( Object( arr ) ) ) {
-				jQuery.merge( ret,
-					typeof arr === "string" ?
-					[ arr ] : arr
-				);
-			} else {
-				push.call( ret, arr );
-			}
-		}
-
-		return ret;
-	},
-
-	inArray: function( elem, arr, i ) {
-		return arr == null ? -1 : indexOf.call( arr, elem, i );
-	},
-
-	// Support: Android <=4.0 only, PhantomJS 1 only
-	// push.apply(_, arraylike) throws on ancient WebKit
-	merge: function( first, second ) {
-		var len = +second.length,
-			j = 0,
-			i = first.length;
-
-		for ( ; j < len; j++ ) {
-			first[ i++ ] = second[ j ];
-		}
-
-		first.length = i;
-
-		return first;
-	},
-
-	grep: function( elems, callback, invert ) {
-		var callbackInverse,
-			matches = [],
-			i = 0,
-			length = elems.length,
-			callbackExpect = !invert;
-
-		// Go through the array, only saving the items
-		// that pass the validator function
-		for ( ; i < length; i++ ) {
-			callbackInverse = !callback( elems[ i ], i );
-			if ( callbackInverse !== callbackExpect ) {
-				matches.push( elems[ i ] );
-			}
-		}
-
-		return matches;
-	},
-
-	// arg is for internal usage only
-	map: function( elems, callback, arg ) {
-		var length, value,
-			i = 0,
-			ret = [];
-
-		// Go through the array, translating each of the items to their new values
-		if ( isArrayLike( elems ) ) {
-			length = elems.length;
-			for ( ; i < length; i++ ) {
-				value = callback( elems[ i ], i, arg );
-
-				if ( value != null ) {
-					ret.push( value );
-				}
-			}
-
-		// Go through every key on the object,
-		} else {
-			for ( i in elems ) {
-				value = callback( elems[ i ], i, arg );
-
-				if ( value != null ) {
-					ret.push( value );
-				}
-			}
-		}
-
-		// Flatten any nested arrays
-		return concat.apply( [], ret );
-	},
-
-	// A global GUID counter for objects
-	guid: 1,
-
-	// jQuery.support is not used in Core but other projects attach their
-	// properties to it so it needs to exist.
-	support: support
-} );
-
-if ( typeof Symbol === "function" ) {
-	jQuery.fn[ Symbol.iterator ] = arr[ Symbol.iterator ];
-}
-
-// Populate the class2type map
-jQuery.each( "Boolean Number String Function Array Date RegExp Object Error Symbol".split( " " ),
-function( i, name ) {
-	class2type[ "[object " + name + "]" ] = name.toLowerCase();
-} );
-
-function isArrayLike( obj ) {
-
-	// Support: real iOS 8.2 only (not reproducible in simulator)
-	// `in` check used to prevent JIT error (gh-2145)
-	// hasOwn isn't used here due to false negatives
-	// regarding Nodelist length in IE
-	var length = !!obj && "length" in obj && obj.length,
-		type = toType( obj );
-
-	if ( isFunction( obj ) || isWindow( obj ) ) {
-		return false;
-	}
-
-	return type === "array" || length === 0 ||
-		typeof length === "number" && length > 0 && ( length - 1 ) in obj;
-}
-var Sizzle =
-/*!
- * Sizzle CSS Selector Engine v2.3.3
- * https://sizzlejs.com/
- *
- * Copyright jQuery Foundation and other contributors
- * Released under the MIT license
- * http://jquery.org/license
- *
- * Date: 2016-08-08
- */
-(function( window ) {
-
-var i,
-	support,
-	Expr,
-	getText,
-	isXML,
-	tokenize,
-	compile,
-	select,
-	outermostContext,
-	sortInput,
-	hasDuplicate,
-
-	// Local document vars
-	setDocument,
-	document,
-	docElem,
-	documentIsHTML,
-	rbuggyQSA,
-	rbuggyMatches,
-	matches,
-	contains,
-
-	// Instance-specific data
-	expando = "sizzle" + 1 * new Date(),
-	preferredDoc = window.document,
-	dirruns = 0,
-	done = 0,
-	classCache = createCache(),
-	tokenCache = createCache(),
-	compilerCache = createCache(),
-	sortOrder = function( a, b ) {
-		if ( a === b ) {
-			hasDuplicate = true;
-		}
-		return 0;
-	},
-
-	// Instance methods
-	hasOwn = ({}).hasOwnProperty,
-	arr = [],
-	pop = arr.pop,
-	push_native = arr.push,
-	push = arr.push,
-	slice = arr.slice,
-	// Use a stripped-down indexOf as it's faster than native
-	// https://jsperf.com/thor-indexof-vs-for/5
-	indexOf = function( list, elem ) {
-		var i = 0,
-			len = list.length;
-		for ( ; i < len; i++ ) {
-			if ( list[i] === elem ) {
-				return i;
-			}
-		}
-		return -1;
-	},
-
-	booleans = "checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped",
-
-	// Regular expressions
-
-	// http://www.w3.org/TR/css3-selectors/#whitespace
-	whitespace = "[\\x20\\t\\r\\n\\f]",
-
-	// http://www.w3.org/TR/CSS21/syndata.html#value-def-identifier
-	identifier = "(?:\\\\.|[\\w-]|[^\0-\\xa0])+",
-
-	// Attribute selectors: http://www.w3.org/TR/selectors/#attribute-selectors
-	attributes = "\\[" + whitespace + "*(" + identifier + ")(?:" + whitespace +
-		// Operator (capture 2)
-		"*([*^$|!~]?=)" + whitespace +
-		// "Attribute values must be CSS identifiers [capture 5] or strings [capture 3 or capture 4]"
-		"*(?:'((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\"|(" + identifier + "))|)" + whitespace +
-		"*\\]",
-
-	pseudos = ":(" + identifier + ")(?:\\((" +
-		// To reduce the number of selectors needing tokenize in the preFilter, prefer arguments:
-		// 1. quoted (capture 3; capture 4 or capture 5)
-		"('((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\")|" +
-		// 2. simple (capture 6)
-		"((?:\\\\.|[^\\\\()[\\]]|" + attributes + ")*)|" +
-		// 3. anything else (capture 2)
-		".*" +
-		")\\)|)",
-
-	// Leading and non-escaped trailing whitespace, capturing some non-whitespace characters preceding the latter
-	rwhitespace = new RegExp( whitespace + "+", "g" ),
-	rtrim = new RegExp( "^" + whitespace + "+|((?:^|[^\\\\])(?:\\\\.)*)" + whitespace + "+$", "g" ),
-
-	rcomma = new RegExp( "^" + whitespace + "*," + whitespace + "*" ),
-	rcombinators = new RegExp( "^" + whitespace + "*([>+~]|" + whitespace + ")" + whitespace + "*" ),
-
-	rattributeQuotes = new RegExp( "=" + whitespace + "*([^\\]'\"]*?)" + whitespace + "*\\]", "g" ),
-
-	rpseudo = new RegExp( pseudos ),
-	ridentifier = new RegExp( "^" + identifier + "$" ),
-
-	matchExpr = {
-		"ID": new RegExp( "^#(" + identifier + ")" ),
-		"CLASS": new RegExp( "^\\.(" + identifier + ")" ),
-		"TAG": new RegExp( "^(" + identifier + "|[*])" ),
-		"ATTR": new RegExp( "^" + attributes ),
-		"PSEUDO": new RegExp( "^" + pseudos ),
-		"CHILD": new RegExp( "^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\(" + whitespace +
-			"*(even|odd|(([+-]|)(\\d*)n|)" + whitespace + "*(?:([+-]|)" + whitespace +
-			"*(\\d+)|))" + whitespace + "*\\)|)", "i" ),
-		"bool": new RegExp( "^(?:" + booleans + ")$", "i" ),
-		// For use in libraries implementing .is()
-		// We use this for POS matching in `select`
-		"needsContext": new RegExp( "^" + whitespace + "*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\(" +
-			whitespace + "*((?:-\\d)?\\d*)" + whitespace + "*\\)|)(?=[^-]|$)", "i" )
-	},
-
-	rinputs = /^(?:input|select|textarea|button)$/i,
-	rheader = /^h\d$/i,
-
-	rnative = /^[^{]+\{\s*\[native \w/,
-
-	// Easily-parseable/retrievable ID or TAG or CLASS selectors
-	rquickExpr = /^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,
-
-	rsibling = /[+~]/,
-
-	// CSS escapes
-	// http://www.w3.org/TR/CSS21/syndata.html#escaped-characters
-	runescape = new RegExp( "\\\\([\\da-f]{1,6}" + whitespace + "?|(" + whitespace + ")|.)", "ig" ),
-	funescape = function( _, escaped, escapedWhitespace ) {
-		var high = "0x" + escaped - 0x10000;
-		// NaN means non-codepoint
-		// Support: Firefox<24
-		// Workaround erroneous numeric interpretation of +"0x"
-		return high !== high || escapedWhitespace ?
-			escaped :
-			high < 0 ?
-				// BMP codepoint
-				String.fromCharCode( high + 0x10000 ) :
-				// Supplemental Plane codepoint (surrogate pair)
-				String.fromCharCode( high >> 10 | 0xD800, high & 0x3FF | 0xDC00 );
-	},
-
-	// CSS string/identifier serialization
-	// https://drafts.csswg.org/cssom/#common-serializing-idioms
-	rcssescape = /([\0-\x1f\x7f]|^-?\d)|^-$|[^\0-\x1f\x7f-\uFFFF\w-]/g,
-	fcssescape = function( ch, asCodePoint ) {
-		if ( asCodePoint ) {
-
-			// U+0000 NULL becomes U+FFFD REPLACEMENT CHARACTER
-			if ( ch === "\0" ) {
-				return "\uFFFD";
-			}
-
-			// Control characters and (dependent upon position) numbers get escaped as code points
-			return ch.slice( 0, -1 ) + "\\" + ch.charCodeAt( ch.length - 1 ).toString( 16 ) + " ";
-		}
-
-		// Other potentially-special ASCII characters get backslash-escaped
-		return "\\" + ch;
-	},
-
-	// Used for iframes
-	// See setDocument()
-	// Removing the function wrapper causes a "Permission Denied"
-	// error in IE
-	unloadHandler = function() {
-		setDocument();
-	},
-
-	disabledAncestor = addCombinator(
-		function( elem ) {
-			return elem.disabled === true && ("form" in elem || "label" in elem);
-		},
-		{ dir: "parentNode", next: "legend" }
-	);
-
-// Optimize for push.apply( _, NodeList )
-try {
-	push.apply(
-		(arr = slice.call( preferredDoc.childNodes )),
-		preferredDoc.childNodes
-	);
-	// Support: Android<4.0
-	// Detect silently failing push.apply
-	arr[ preferredDoc.childNodes.length ].nodeType;
-} catch ( e ) {
-	push = { apply: arr.length ?
-
-		// Leverage slice if possible
-		function( target, els ) {
-			push_native.apply( target, slice.call(els) );
-		} :
-
-		// Support: IE<9
-		// Otherwise append directly
-		function( target, els ) {
-			var j = target.length,
-				i = 0;
-			// Can't trust NodeList.length
-			while ( (target[j++] = els[i++]) ) {}
-			target.length = j - 1;
-		}
-	};
-}
-
-function Sizzle( selector, context, results, seed ) {
-	var m, i, elem, nid, match, groups, newSelector,
-		newContext = context && context.ownerDocument,
-
-		// nodeType defaults to 9, since context defaults to document
-		nodeType = context ? context.nodeType : 9;
-
-	results = results || [];
-
-	// Return early from calls with invalid selector or context
-	if ( typeof selector !== "string" || !selector ||
-		nodeType !== 1 && nodeType !== 9 && nodeType !== 11 ) {
-
-		return results;
-	}
-
-	// Try to shortcut find operations (as opposed to filters) in HTML documents
-	if ( !seed ) {
-
-		if ( ( context ? context.ownerDocument || context : preferredDoc ) !== document ) {
-			setDocument( context );
-		}
-		context = context || document;
-
-		if ( documentIsHTML ) {
-
-			// If the selector is sufficiently simple, try using a "get*By*" DOM method
-			// (excepting DocumentFragment context, where the methods don't exist)
-			if ( nodeType !== 11 && (match = rquickExpr.exec( selector )) ) {
-
-				// ID selector
-				if ( (m = match[1]) ) {
-
-					// Document context
-					if ( nodeType === 9 ) {
-						if ( (elem = context.getElementById( m )) ) {
-
-							// Support: IE, Opera, Webkit
-							// TODO: identify versions
-							// getElementById can match elements by name instead of ID
-							if ( elem.id === m ) {
-								results.push( elem );
-								return results;
-							}
-						} else {
-							return results;
-						}
-
-					// Element context
-					} else {
-
-						// Support: IE, Opera, Webkit
-						// TODO: identify versions
-						// getElementById can match elements by name instead of ID
-						if ( newContext && (elem = newContext.getElementById( m )) &&
-							contains( context, elem ) &&
-							elem.id === m ) {
-
-							results.push( elem );
-							return results;
-						}
-					}
-
-				// Type selector
-				} else if ( match[2] ) {
-					push.apply( results, context.getElementsByTagName( selector ) );
-					return results;
-
-				// Class selector
-				} else if ( (m = match[3]) && support.getElementsByClassName &&
-					context.getElementsByClassName ) {
-
-					push.apply( results, context.getElementsByClassName( m ) );
-					return results;
-				}
-			}
-
-			// Take advantage of querySelectorAll
-			if ( support.qsa &&
-				!compilerCache[ selector + " " ] &&
-				(!rbuggyQSA || !rbuggyQSA.test( selector )) ) {
-
-				if ( nodeType !== 1 ) {
-					newContext = context;
-					newSelector = selector;
-
-				// qSA looks outside Element context, which is not what we want
-				// Thanks to Andrew Dupont for this workaround technique
-				// Support: IE <=8
-				// Exclude object elements
-				} else if ( context.nodeName.toLowerCase() !== "object" ) {
-
-					// Capture the context ID, setting it first if necessary
-					if ( (nid = context.getAttribute( "id" )) ) {
-						nid = nid.replace( rcssescape, fcssescape );
-					} else {
-						context.setAttribute( "id", (nid = expando) );
-					}
-
-					// Prefix every selector in the list
-					groups = tokenize( selector );
-					i = groups.length;
-					while ( i-- ) {
-						groups[i] = "#" + nid + " " + toSelector( groups[i] );
-					}
-					newSelector = groups.join( "," );
-
-					// Expand context for sibling selectors
-					newContext = rsibling.test( selector ) && testContext( context.parentNode ) ||
-						context;
-				}
-
-				if ( newSelector ) {
-					try {
-						push.apply( results,
-							newContext.querySelectorAll( newSelector )
-						);
-						return results;
-					} catch ( qsaError ) {
-					} finally {
-						if ( nid === expando ) {
-							context.removeAttribute( "id" );
-						}
-					}
-				}
-			}
-		}
-	}
-
-	// All others
-	return select( selector.replace( rtrim, "$1" ), context, results, seed );
-}
-
-/**
- * Create key-value caches of limited size
- * @returns {function(string, object)} Returns the Object data after storing it on itself with
- *	property name the (space-suffixed) string and (if the cache is larger than Expr.cacheLength)
- *	deleting the oldest entry
- */
-function createCache() {
-	var keys = [];
-
-	function cache( key, value ) {
-		// Use (key + " ") to avoid collision with native prototype properties (see Issue #157)
-		if ( keys.push( key + " " ) > Expr.cacheLength ) {
-			// Only keep the most recent entries
-			delete cache[ keys.shift() ];
-		}
-		return (cache[ key + " " ] = value);
-	}
-	return cache;
-}
-
-/**
- * Mark a function for special use by Sizzle
- * @param {Function} fn The function to mark
- */
-function markFunction( fn ) {
-	fn[ expando ] = true;
-	return fn;
-}
-
-/**
- * Support testing using an element
- * @param {Function} fn Passed the created element and returns a boolean result
- */
-function assert( fn ) {
-	var el = document.createElement("fieldset");
-
-	try {
-		return !!fn( el );
-	} catch (e) {
-		return false;
-	} finally {
-		// Remove from its parent by default
-		if ( el.parentNode ) {
-			el.parentNode.removeChild( el );
-		}
-		// release memory in IE
-		el = null;
-	}
-}
-
-/**
- * Adds the same handler for all of the specified attrs
- * @param {String} attrs Pipe-separated list of attributes
- * @param {Function} handler The method that will be applied
- */
-function addHandle( attrs, handler ) {
-	var arr = attrs.split("|"),
-		i = arr.length;
-
-	while ( i-- ) {
-		Expr.attrHandle[ arr[i] ] = handler;
-	}
-}
-
-/**
- * Checks document order of two siblings
- * @param {Element} a
- * @param {Element} b
- * @returns {Number} Returns less than 0 if a precedes b, greater than 0 if a follows b
- */
-function siblingCheck( a, b ) {
-	var cur = b && a,
-		diff = cur && a.nodeType === 1 && b.nodeType === 1 &&
-			a.sourceIndex - b.sourceIndex;
-
-	// Use IE sourceIndex if available on both nodes
-	if ( diff ) {
-		return diff;
-	}
-
-	// Check if b follows a
-	if ( cur ) {
-		while ( (cur = cur.nextSibling) ) {
-			if ( cur === b ) {
-				return -1;
-			}
-		}
-	}
-
-	return a ? 1 : -1;
-}
-
-/**
- * Returns a function to use in pseudos for input types
- * @param {String} type
- */
-function createInputPseudo( type ) {
-	return function( elem ) {
-		var name = elem.nodeName.toLowerCase();
-		return name === "input" && elem.type === type;
-	};
-}
-
-/**
- * Returns a function to use in pseudos for buttons
- * @param {String} type
- */
-function createButtonPseudo( type ) {
-	return function( elem ) {
-		var name = elem.nodeName.toLowerCase();
-		return (name === "input" || name === "button") && elem.type === type;
-	};
-}
-
-/**
- * Returns a function to use in pseudos for :enabled/:disabled
- * @param {Boolean} disabled true for :disabled; false for :enabled
- */
-function createDisabledPseudo( disabled ) {
-
-	// Known :disabled false positives: fieldset[disabled] > legend:nth-of-type(n+2) :can-disable
-	return function( elem ) {
-
-		// Only certain elements can match :enabled or :disabled
-		// https://html.spec.whatwg.org/multipage/scripting.html#selector-enabled
-		// https://html.spec.whatwg.org/multipage/scripting.html#selector-disabled
-		if ( "form" in elem ) {
-
-			// Check for inherited disabledness on relevant non-disabled elements:
-			// * listed form-associated elements in a disabled fieldset
-			//   https://html.spec.whatwg.org/multipage/forms.html#category-listed
-			//   https://html.spec.whatwg.org/multipage/forms.html#concept-fe-disabled
-			// * option elements in a disabled optgroup
-			//   https://html.spec.whatwg.org/multipage/forms.html#concept-option-disabled
-			// All such elements have a "form" property.
-			if ( elem.parentNode && elem.disabled === false ) {
-
-				// Option elements defer to a parent optgroup if present
-				if ( "label" in elem ) {
-					if ( "label" in elem.parentNode ) {
-						return elem.parentNode.disabled === disabled;
-					} else {
-						return elem.disabled === disabled;
-					}
-				}
-
-				// Support: IE 6 - 11
-				// Use the isDisabled shortcut property to check for disabled fieldset ancestors
-				return elem.isDisabled === disabled ||
-
-					// Where there is no isDisabled, check manually
-					/* jshint -W018 */
-					elem.isDisabled !== !disabled &&
-						disabledAncestor( elem ) === disabled;
-			}
-
-			return elem.disabled === disabled;
-
-		// Try to winnow out elements that can't be disabled before trusting the disabled property.
-		// Some victims get caught in our net (label, legend, menu, track), but it shouldn't
-		// even exist on them, let alone have a boolean value.
-		} else if ( "label" in elem ) {
-			return elem.disabled === disabled;
-		}
-
-		// Remaining elements are neither :enabled nor :disabled
-		return false;
-	};
-}
-
-/**
- * Returns a function to use in pseudos for positionals
- * @param {Function} fn
- */
-function createPositionalPseudo( fn ) {
-	return markFunction(function( argument ) {
-		argument = +argument;
-		return markFunction(function( seed, matches ) {
-			var j,
-				matchIndexes = fn( [], seed.length, argument ),
-				i = matchIndexes.length;
-
-			// Match elements found at the specified indexes
-			while ( i-- ) {
-				if ( seed[ (j = matchIndexes[i]) ] ) {
-					seed[j] = !(matches[j] = seed[j]);
-				}
-			}
-		});
-	});
-}
-
-/**
- * Checks a node for validity as a Sizzle context
- * @param {Element|Object=} context
- * @returns {Element|Object|Boolean} The input node if acceptable, otherwise a falsy value
- */
-function testContext( context ) {
-	return context && typeof context.getElementsByTagName !== "undefined" && context;
-}
-
-// Expose support vars for convenience
-support = Sizzle.support = {};
-
-/**
- * Detects XML nodes
- * @param {Element|Object} elem An element or a document
- * @returns {Boolean} True iff elem is a non-HTML XML node
- */
-isXML = Sizzle.isXML = function( elem ) {
-	// documentElement is verified for cases where it doesn't yet exist
-	// (such as loading iframes in IE - #4833)
-	var documentElement = elem && (elem.ownerDocument || elem).documentElement;
-	return documentElement ? documentElement.nodeName !== "HTML" : false;
-};
-
-/**
- * Sets document-related variables once based on the current document
- * @param {Element|Object} [doc] An element or document object to use to set the document
- * @returns {Object} Returns the current document
- */
-setDocument = Sizzle.setDocument = function( node ) {
-	var hasCompare, subWindow,
-		doc = node ? node.ownerDocument || node : preferredDoc;
-
-	// Return early if doc is invalid or already selected
-	if ( doc === document || doc.nodeType !== 9 || !doc.documentElement ) {
-		return document;
-	}
-
-	// Update global variables
-	document = doc;
-	docElem = document.documentElement;
-	documentIsHTML = !isXML( document );
-
-	// Support: IE 9-11, Edge
-	// Accessing iframe documents after unload throws "permission denied" errors (jQuery #13936)
-	if ( preferredDoc !== document &&
-		(subWindow = document.defaultView) && subWindow.top !== subWindow ) {
-
-		// Support: IE 11, Edge
-		if ( subWindow.addEventListener ) {
-			subWindow.addEventListener( "unload", unloadHandler, false );
-
-		// Support: IE 9 - 10 only
-		} else if ( subWindow.attachEvent ) {
-			subWindow.attachEvent( "onunload", unloadHandler );
-		}
-	}
-
-	/* Attributes
-	---------------------------------------------------------------------- */
-
-	// Support: IE<8
-	// Verify that getAttribute really returns attributes and not properties
-	// (excepting IE8 booleans)
-	support.attributes = assert(function( el ) {
-		el.className = "i";
-		return !el.getAttribute("className");
-	});
-
-	/* getElement(s)By*
-	---------------------------------------------------------------------- */
-
-	// Check if getElementsByTagName("*") returns only elements
-	support.getElementsByTagName = assert(function( el ) {
-		el.appendChild( document.createComment("") );
-		return !el.getElementsByTagName("*").length;
-	});
-
-	// Support: IE<9
-	support.getElementsByClassName = rnative.test( document.getElementsByClassName );
-
-	// Support: IE<10
-	// Check if getElementById returns elements by name
-	// The broken getElementById methods don't pick up programmatically-set names,
-	// so use a roundabout getElementsByName test
-	support.getById = assert(function( el ) {
-		docElem.appendChild( el ).id = expando;
-		return !document.getElementsByName || !document.getElementsByName( expando ).length;
-	});
-
-	// ID filter and find
-	if ( support.getById ) {
-		Expr.filter["ID"] = function( id ) {
-			var attrId = id.replace( runescape, funescape );
-			return function( elem ) {
-				return elem.getAttribute("id") === attrId;
-			};
-		};
-		Expr.find["ID"] = function( id, context ) {
-			if ( typeof context.getElementById !== "undefined" && documentIsHTML ) {
-				var elem = context.getElementById( id );
-				return elem ? [ elem ] : [];
-			}
-		};
-	} else {
-		Expr.filter["ID"] =  function( id ) {
-			var attrId = id.replace( runescape, funescape );
-			return function( elem ) {
-				var node = typeof elem.getAttributeNode !== "undefined" &&
-					elem.getAttributeNode("id");
-				return node && node.value === attrId;
-			};
-		};
-
-		// Support: IE 6 - 7 only
-		// getElementById is not reliable as a find shortcut
-		Expr.find["ID"] = function( id, context ) {
-			if ( typeof context.getElementById !== "undefined" && documentIsHTML ) {
-				var node, i, elems,
-					elem = context.getElementById( id );
-
-				if ( elem ) {
-
-					// Verify the id attribute
-					node = elem.getAttributeNode("id");
-					if ( node && node.value === id ) {
-						return [ elem ];
-					}
-
-					// Fall back on getElementsByName
-					elems = context.getElementsByName( id );
-					i = 0;
-					while ( (elem = elems[i++]) ) {
-						node = elem.getAttributeNode("id");
-						if ( node && node.value === id ) {
-							return [ elem ];
-						}
-					}
-				}
-
-				return [];
-			}
-		};
-	}
-
-	// Tag
-	Expr.find["TAG"] = support.getElementsByTagName ?
-		function( tag, context ) {
-			if ( typeof context.getElementsByTagName !== "undefined" ) {
-				return context.getElementsByTagName( tag );
-
-			// DocumentFragment nodes don't have gEBTN
-			} else if ( support.qsa ) {
-				return context.querySelectorAll( tag );
-			}
-		} :
-
-		function( tag, context ) {
-			var elem,
-				tmp = [],
-				i = 0,
-				// By happy coincidence, a (broken) gEBTN appears on DocumentFragment nodes too
-				results = context.getElementsByTagName( tag );
-
-			// Filter out possible comments
-			if ( tag === "*" ) {
-				while ( (elem = results[i++]) ) {
-					if ( elem.nodeType === 1 ) {
-						tmp.push( elem );
-					}
-				}
-
-				return tmp;
-			}
-			return results;
-		};
-
-	// Class
-	Expr.find["CLASS"] = support.getElementsByClassName && function( className, context ) {
-		if ( typeof context.getElementsByClassName !== "undefined" && documentIsHTML ) {
-			return context.getElementsByClassName( className );
-		}
-	};
-
-	/* QSA/matchesSelector
-	---------------------------------------------------------------------- */
-
-	// QSA and matchesSelector support
-
-	// matchesSelector(:active) reports false when true (IE9/Opera 11.5)
-	rbuggyMatches = [];
-
-	// qSa(:focus) reports false when true (Chrome 21)
-	// We allow this because of a bug in IE8/9 that throws an error
-	// whenever `document.activeElement` is accessed on an iframe
-	// So, we allow :focus to pass through QSA all the time to avoid the IE error
-	// See https://bugs.jquery.com/ticket/13378
-	rbuggyQSA = [];
-
-	if ( (support.qsa = rnative.test( document.querySelectorAll )) ) {
-		// Build QSA regex
-		// Regex strategy adopted from Diego Perini
-		assert(function( el ) {
-			// Select is set to empty string on purpose
-			// This is to test IE's treatment of not explicitly
-			// setting a boolean content attribute,
-			// since its presence should be enough
-			// https://bugs.jquery.com/ticket/12359
-			docElem.appendChild( el ).innerHTML = "<a id='" + expando + "'></a>" +
-				"<select id='" + expando + "-\r\\' msallowcapture=''>" +
-				"<option selected=''></option></select>";
-
-			// Support: IE8, Opera 11-12.16
-			// Nothing should be selected when empty strings follow ^= or $= or *=
-			// The test attribute must be unknown in Opera but "safe" for WinRT
-			// https://msdn.microsoft.com/en-us/library/ie/hh465388.aspx#attribute_section
-			if ( el.querySelectorAll("[msallowcapture^='']").length ) {
-				rbuggyQSA.push( "[*^$]=" + whitespace + "*(?:''|\"\")" );
-			}
-
-			// Support: IE8
-			// Boolean attributes and "value" are not treated correctly
-			if ( !el.querySelectorAll("[selected]").length ) {
-				rbuggyQSA.push( "\\[" + whitespace + "*(?:value|" + booleans + ")" );
-			}
-
-			// Support: Chrome<29, Android<4.4, Safari<7.0+, iOS<7.0+, PhantomJS<1.9.8+
-			if ( !el.querySelectorAll( "[id~=" + expando + "-]" ).length ) {
-				rbuggyQSA.push("~=");
-			}
-
-			// Webkit/Opera - :checked should return selected option elements
-			// http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked
-			// IE8 throws error here and will not see later tests
-			if ( !el.querySelectorAll(":checked").length ) {
-				rbuggyQSA.push(":checked");
-			}
-
-			// Support: Safari 8+, iOS 8+
-			// https://bugs.webkit.org/show_bug.cgi?id=136851
-			// In-page `selector#id sibling-combinator selector` fails
-			if ( !el.querySelectorAll( "a#" + expando + "+*" ).length ) {
-				rbuggyQSA.push(".#.+[+~]");
-			}
-		});
-
-		assert(function( el ) {
-			el.innerHTML = "<a href='' disabled='disabled'></a>" +
-				"<select disabled='disabled'><option/></select>";
-
-			// Support: Windows 8 Native Apps
-			// The type and name attributes are restricted during .innerHTML assignment
-			var input = document.createElement("input");
-			input.setAttribute( "type", "hidden" );
-			el.appendChild( input ).setAttribute( "name", "D" );
-
-			// Support: IE8
-			// Enforce case-sensitivity of name attribute
-			if ( el.querySelectorAll("[name=d]").length ) {
-				rbuggyQSA.push( "name" + whitespace + "*[*^$|!~]?=" );
-			}
-
-			// FF 3.5 - :enabled/:disabled and hidden elements (hidden elements are still enabled)
-			// IE8 throws error here and will not see later tests
-			if ( el.querySelectorAll(":enabled").length !== 2 ) {
-				rbuggyQSA.push( ":enabled", ":disabled" );
-			}
-
-			// Support: IE9-11+
-			// IE's :disabled selector does not pick up the children of disabled fieldsets
-			docElem.appendChild( el ).disabled = true;
-			if ( el.querySelectorAll(":disabled").length !== 2 ) {
-				rbuggyQSA.push( ":enabled", ":disabled" );
-			}
-
-			// Opera 10-11 does not throw on post-comma invalid pseudos
-			el.querySelectorAll("*,:x");
-			rbuggyQSA.push(",.*:");
-		});
-	}
-
-	if ( (support.matchesSelector = rnative.test( (matches = docElem.matches ||
-		docElem.webkitMatchesSelector ||
-		docElem.mozMatchesSelector ||
-		docElem.oMatchesSelector ||
-		docElem.msMatchesSelector) )) ) {
-
-		assert(function( el ) {
-			// Check to see if it's possible to do matchesSelector
-			// on a disconnected node (IE 9)
-			support.disconnectedMatch = matches.call( el, "*" );
-
-			// This should fail with an exception
-			// Gecko does not error, returns false instead
-			matches.call( el, "[s!='']:x" );
-			rbuggyMatches.push( "!=", pseudos );
-		});
-	}
-
-	rbuggyQSA = rbuggyQSA.length && new RegExp( rbuggyQSA.join("|") );
-	rbuggyMatches = rbuggyMatches.length && new RegExp( rbuggyMatches.join("|") );
-
-	/* Contains
-	---------------------------------------------------------------------- */
-	hasCompare = rnative.test( docElem.compareDocumentPosition );
-
-	// Element contains another
-	// Purposefully self-exclusive
-	// As in, an element does not contain itself
-	contains = hasCompare || rnative.test( docElem.contains ) ?
-		function( a, b ) {
-			var adown = a.nodeType === 9 ? a.documentElement : a,
-				bup = b && b.parentNode;
-			return a === bup || !!( bup && bup.nodeType === 1 && (
-				adown.contains ?
-					adown.contains( bup ) :
-					a.compareDocumentPosition && a.compareDocumentPosition( bup ) & 16
-			));
-		} :
-		function( a, b ) {
-			if ( b ) {
-				while ( (b = b.parentNode) ) {
-					if ( b === a ) {
-						return true;
-					}
-				}
-			}
-			return false;
-		};
-
-	/* Sorting
-	---------------------------------------------------------------------- */
-
-	// Document order sorting
-	sortOrder = hasCompare ?
-	function( a, b ) {
-
-		// Flag for duplicate removal
-		if ( a === b ) {
-			hasDuplicate = true;
-			return 0;
-		}
-
-		// Sort on method existence if only one input has compareDocumentPosition
-		var compare = !a.compareDocumentPosition - !b.compareDocumentPosition;
-		if ( compare ) {
-			return compare;
-		}
-
-		// Calculate position if both inputs belong to the same document
-		compare = ( a.ownerDocument || a ) === ( b.ownerDocument || b ) ?
-			a.compareDocumentPosition( b ) :
-
-			// Otherwise we know they are disconnected
-			1;
-
-		// Disconnected nodes
-		if ( compare & 1 ||
-			(!support.sortDetached && b.compareDocumentPosition( a ) === compare) ) {
-
-			// Choose the first element that is related to our preferred document
-			if ( a === document || a.ownerDocument === preferredDoc && contains(preferredDoc, a) ) {
-				return -1;
-			}
-			if ( b === document || b.ownerDocument === preferredDoc && contains(preferredDoc, b) ) {
-				return 1;
-			}
-
-			// Maintain original order
-			return sortInput ?
-				( indexOf( sortInput, a ) - indexOf( sortInput, b ) ) :
-				0;
-		}
-
-		return compare & 4 ? -1 : 1;
-	} :
-	function( a, b ) {
-		// Exit early if the nodes are identical
-		if ( a === b ) {
-			hasDuplicate = true;
-			return 0;
-		}
-
-		var cur,
-			i = 0,
-			aup = a.parentNode,
-			bup = b.parentNode,
-			ap = [ a ],
-			bp = [ b ];
-
-		// Parentless nodes are either documents or disconnected
-		if ( !aup || !bup ) {
-			return a === document ? -1 :
-				b === document ? 1 :
-				aup ? -1 :
-				bup ? 1 :
-				sortInput ?
-				( indexOf( sortInput, a ) - indexOf( sortInput, b ) ) :
-				0;
-
-		// If the nodes are siblings, we can do a quick check
-		} else if ( aup === bup ) {
-			return siblingCheck( a, b );
-		}
-
-		// Otherwise we need full lists of their ancestors for comparison
-		cur = a;
-		while ( (cur = cur.parentNode) ) {
-			ap.unshift( cur );
-		}
-		cur = b;
-		while ( (cur = cur.parentNode) ) {
-			bp.unshift( cur );
-		}
-
-		// Walk down the tree looking for a discrepancy
-		while ( ap[i] === bp[i] ) {
-			i++;
-		}
-
-		return i ?
-			// Do a sibling check if the nodes have a common ancestor
-			siblingCheck( ap[i], bp[i] ) :
-
-			// Otherwise nodes in our document sort first
-			ap[i] === preferredDoc ? -1 :
-			bp[i] === preferredDoc ? 1 :
-			0;
-	};
-
-	return document;
-};
-
-Sizzle.matches = function( expr, elements ) {
-	return Sizzle( expr, null, null, elements );
-};
-
-Sizzle.matchesSelector = function( elem, expr ) {
-	// Set document vars if needed
-	if ( ( elem.ownerDocument || elem ) !== document ) {
-		setDocument( elem );
-	}
-
-	// Make sure that attribute selectors are quoted
-	expr = expr.replace( rattributeQuotes, "='$1']" );
-
-	if ( support.matchesSelector && documentIsHTML &&
-		!compilerCache[ expr + " " ] &&
-		( !rbuggyMatches || !rbuggyMatches.test( expr ) ) &&
-		( !rbuggyQSA     || !rbuggyQSA.test( expr ) ) ) {
-
-		try {
-			var ret = matches.call( elem, expr );
-
-			// IE 9's matchesSelector returns false on disconnected nodes
-			if ( ret || support.disconnectedMatch ||
-					// As well, disconnected nodes are said to be in a document
-					// fragment in IE 9
-					elem.document && elem.document.nodeType !== 11 ) {
-				return ret;
-			}
-		} catch (e) {}
-	}
-
-	return Sizzle( expr, document, null, [ elem ] ).length > 0;
-};
-
-Sizzle.contains = function( context, elem ) {
-	// Set document vars if needed
-	if ( ( context.ownerDocument || context ) !== document ) {
-		setDocument( context );
-	}
-	return contains( context, elem );
-};
-
-Sizzle.attr = function( elem, name ) {
-	// Set document vars if needed
-	if ( ( elem.ownerDocument || elem ) !== document ) {
-		setDocument( elem );
-	}
-
-	var fn = Expr.attrHandle[ name.toLowerCase() ],
-		// Don't get fooled by Object.prototype properties (jQuery #13807)
-		val = fn && hasOwn.call( Expr.attrHandle, name.toLowerCase() ) ?
-			fn( elem, name, !documentIsHTML ) :
-			undefined;
-
-	return val !== undefined ?
-		val :
-		support.attributes || !documentIsHTML ?
-			elem.getAttribute( name ) :
-			(val = elem.getAttributeNode(name)) && val.specified ?
-				val.value :
-				null;
-};
-
-Sizzle.escape = function( sel ) {
-	return (sel + "").replace( rcssescape, fcssescape );
-};
-
-Sizzle.error = function( msg ) {
-	throw new Error( "Syntax error, unrecognized expression: " + msg );
-};
-
-/**
- * Document sorting and removing duplicates
- * @param {ArrayLike} results
- */
-Sizzle.uniqueSort = function( results ) {
-	var elem,
-		duplicates = [],
-		j = 0,
-		i = 0;
-
-	// Unless we *know* we can detect duplicates, assume their presence
-	hasDuplicate = !support.detectDuplicates;
-	sortInput = !support.sortStable && results.slice( 0 );
-	results.sort( sortOrder );
-
-	if ( hasDuplicate ) {
-		while ( (elem = results[i++]) ) {
-			if ( elem === results[ i ] ) {
-				j = duplicates.push( i );
-			}
-		}
-		while ( j-- ) {
-			results.splice( duplicates[ j ], 1 );
-		}
-	}
-
-	// Clear input after sorting to release objects
-	// See https://github.com/jquery/sizzle/pull/225
-	sortInput = null;
-
-	return results;
-};
-
-/**
- * Utility function for retrieving the text value of an array of DOM nodes
- * @param {Array|Element} elem
- */
-getText = Sizzle.getText = function( elem ) {
-	var node,
-		ret = "",
-		i = 0,
-		nodeType = elem.nodeType;
-
-	if ( !nodeType ) {
-		// If no nodeType, this is expected to be an array
-		while ( (node = elem[i++]) ) {
-			// Do not traverse comment nodes
-			ret += getText( node );
-		}
-	} else if ( nodeType === 1 || nodeType === 9 || nodeType === 11 ) {
-		// Use textContent for elements
-		// innerText usage removed for consistency of new lines (jQuery #11153)
-		if ( typeof elem.textContent === "string" ) {
-			return elem.textContent;
-		} else {
-			// Traverse its children
-			for ( elem = elem.firstChild; elem; elem = elem.nextSibling ) {
-				ret += getText( elem );
-			}
-		}
-	} else if ( nodeType === 3 || nodeType === 4 ) {
-		return elem.nodeValue;
-	}
-	// Do not include comment or processing instruction nodes
-
-	return ret;
-};
-
-Expr = Sizzle.selectors = {
-
-	// Can be adjusted by the user
-	cacheLength: 50,
-
-	createPseudo: markFunction,
-
-	match: matchExpr,
-
-	attrHandle: {},
-
-	find: {},
-
-	relative: {
-		">": { dir: "parentNode", first: true },
-		" ": { dir: "parentNode" },
-		"+": { dir: "previousSibling", first: true },
-		"~": { dir: "previousSibling" }
-	},
-
-	preFilter: {
-		"ATTR": function( match ) {
-			match[1] = match[1].replace( runescape, funescape );
-
-			// Move the given value to match[3] whether quoted or unquoted
-			match[3] = ( match[3] || match[4] || match[5] || "" ).replace( runescape, funescape );
-
-			if ( match[2] === "~=" ) {
-				match[3] = " " + match[3] + " ";
-			}
-
-			return match.slice( 0, 4 );
-		},
-
-		"CHILD": function( match ) {
-			/* matches from matchExpr["CHILD"]
-				1 type (only|nth|...)
-				2 what (child|of-type)
-				3 argument (even|odd|\d*|\d*n([+-]\d+)?|...)
-				4 xn-component of xn+y argument ([+-]?\d*n|)
-				5 sign of xn-component
-				6 x of xn-component
-				7 sign of y-component
-				8 y of y-component
-			*/
-			match[1] = match[1].toLowerCase();
-
-			if ( match[1].slice( 0, 3 ) === "nth" ) {
-				// nth-* requires argument
-				if ( !match[3] ) {
-					Sizzle.error( match[0] );
-				}
-
-				// numeric x and y parameters for Expr.filter.CHILD
-				// remember that false/true cast respectively to 0/1
-				match[4] = +( match[4] ? match[5] + (match[6] || 1) : 2 * ( match[3] === "even" || match[3] === "odd" ) );
-				match[5] = +( ( match[7] + match[8] ) || match[3] === "odd" );
-
-			// other types prohibit arguments
-			} else if ( match[3] ) {
-				Sizzle.error( match[0] );
-			}
-
-			return match;
-		},
-
-		"PSEUDO": function( match ) {
-			var excess,
-				unquoted = !match[6] && match[2];
-
-			if ( matchExpr["CHILD"].test( match[0] ) ) {
-				return null;
-			}
-
-			// Accept quoted arguments as-is
-			if ( match[3] ) {
-				match[2] = match[4] || match[5] || "";
-
-			// Strip excess characters from unquoted arguments
-			} else if ( unquoted && rpseudo.test( unquoted ) &&
-				// Get excess from tokenize (recursively)
-				(excess = tokenize( unquoted, true )) &&
-				// advance to the next closing parenthesis
-				(excess = unquoted.indexOf( ")", unquoted.length - excess ) - unquoted.length) ) {
-
-				// excess is a negative index
-				match[0] = match[0].slice( 0, excess );
-				match[2] = unquoted.slice( 0, excess );
-			}
-
-			// Return only captures needed by the pseudo filter method (type and argument)
-			return match.slice( 0, 3 );
-		}
-	},
-
-	filter: {
-
-		"TAG": function( nodeNameSelector ) {
-			var nodeName = nodeNameSelector.replace( runescape, funescape ).toLowerCase();
-			return nodeNameSelector === "*" ?
-				function() { return true; } :
-				function( elem ) {
-					return elem.nodeName && elem.nodeName.toLowerCase() === nodeName;
-				};
-		},
-
-		"CLASS": function( className ) {
-			var pattern = classCache[ className + " " ];
-
-			return pattern ||
-				(pattern = new RegExp( "(^|" + whitespace + ")" + className + "(" + whitespace + "|$)" )) &&
-				classCache( className, function( elem ) {
-					return pattern.test( typeof elem.className === "string" && elem.className || typeof elem.getAttribute !== "undefined" && elem.getAttribute("class") || "" );
-				});
-		},
-
-		"ATTR": function( name, operator, check ) {
-			return function( elem ) {
-				var result = Sizzle.attr( elem, name );
-
-				if ( result == null ) {
-					return operator === "!=";
-				}
-				if ( !operator ) {
-					return true;
-				}
-
-				result += "";
-
-				return operator === "=" ? result === check :
-					operator === "!=" ? result !== check :
-					operator === "^=" ? check && result.indexOf( check ) === 0 :
-					operator === "*=" ? check && result.indexOf( check ) > -1 :
-					operator === "$=" ? check && result.slice( -check.length ) === check :
-					operator === "~=" ? ( " " + result.replace( rwhitespace, " " ) + " " ).indexOf( check ) > -1 :
-					operator === "|=" ? result === check || result.slice( 0, check.length + 1 ) === check + "-" :
-					false;
-			};
-		},
-
-		"CHILD": function( type, what, argument, first, last ) {
-			var simple = type.slice( 0, 3 ) !== "nth",
-				forward = type.slice( -4 ) !== "last",
-				ofType = what === "of-type";
-
-			return first === 1 && last === 0 ?
-
-				// Shortcut for :nth-*(n)
-				function( elem ) {
-					return !!elem.parentNode;
-				} :
-
-				function( elem, context, xml ) {
-					var cache, uniqueCache, outerCache, node, nodeIndex, start,
-						dir = simple !== forward ? "nextSibling" : "previousSibling",
-						parent = elem.parentNode,
-						name = ofType && elem.nodeName.toLowerCase(),
-						useCache = !xml && !ofType,
-						diff = false;
-
-					if ( parent ) {
-
-						// :(first|last|only)-(child|of-type)
-						if ( simple ) {
-							while ( dir ) {
-								node = elem;
-								while ( (node = node[ dir ]) ) {
-									if ( ofType ?
-										node.nodeName.toLowerCase() === name :
-										node.nodeType === 1 ) {
-
-										return false;
-									}
-								}
-								// Reverse direction for :only-* (if we haven't yet done so)
-								start = dir = type === "only" && !start && "nextSibling";
-							}
-							return true;
-						}
-
-						start = [ forward ? parent.firstChild : parent.lastChild ];
-
-						// non-xml :nth-child(...) stores cache data on `parent`
-						if ( forward && useCache ) {
-
-							// Seek `elem` from a previously-cached index
-
-							// ...in a gzip-friendly way
-							node = parent;
-							outerCache = node[ expando ] || (node[ expando ] = {});
-
-							// Support: IE <9 only
-							// Defend against cloned attroperties (jQuery gh-1709)
-							uniqueCache = outerCache[ node.uniqueID ] ||
-								(outerCache[ node.uniqueID ] = {});
-
-							cache = uniqueCache[ type ] || [];
-							nodeIndex = cache[ 0 ] === dirruns && cache[ 1 ];
-							diff = nodeIndex && cache[ 2 ];
-							node = nodeIndex && parent.childNodes[ nodeIndex ];
-
-							while ( (node = ++nodeIndex && node && node[ dir ] ||
-
-								// Fallback to seeking `elem` from the start
-								(diff = nodeIndex = 0) || start.pop()) ) {
-
-								// When found, cache indexes on `parent` and break
-								if ( node.nodeType === 1 && ++diff && node === elem ) {
-									uniqueCache[ type ] = [ dirruns, nodeIndex, diff ];
-									break;
-								}
-							}
-
-						} else {
-							// Use previously-cached element index if available
-							if ( useCache ) {
-								// ...in a gzip-friendly way
-								node = elem;
-								outerCache = node[ expando ] || (node[ expando ] = {});
-
-								// Support: IE <9 only
-								// Defend against cloned attroperties (jQuery gh-1709)
-								uniqueCache = outerCache[ node.uniqueID ] ||
-									(outerCache[ node.uniqueID ] = {});
-
-								cache = uniqueCache[ type ] || [];
-								nodeIndex = cache[ 0 ] === dirruns && cache[ 1 ];
-								diff = nodeIndex;
-							}
-
-							// xml :nth-child(...)
-							// or :nth-last-child(...) or :nth(-last)?-of-type(...)
-							if ( diff === false ) {
-								// Use the same loop as above to seek `elem` from the start
-								while ( (node = ++nodeIndex && node && node[ dir ] ||
-									(diff = nodeIndex = 0) || start.pop()) ) {
-
-									if ( ( ofType ?
-										node.nodeName.toLowerCase() === name :
-										node.nodeType === 1 ) &&
-										++diff ) {
-
-										// Cache the index of each encountered element
-										if ( useCache ) {
-											outerCache = node[ expando ] || (node[ expando ] = {});
-
-											// Support: IE <9 only
-											// Defend against cloned attroperties (jQuery gh-1709)
-											uniqueCache = outerCache[ node.uniqueID ] ||
-												(outerCache[ node.uniqueID ] = {});
-
-											uniqueCache[ type ] = [ dirruns, diff ];
-										}
-
-										if ( node === elem ) {
-											break;
-										}
-									}
-								}
-							}
-						}
-
-						// Incorporate the offset, then check against cycle size
-						diff -= last;
-						return diff === first || ( diff % first === 0 && diff / first >= 0 );
-					}
-				};
-		},
-
-		"PSEUDO": function( pseudo, argument ) {
-			// pseudo-class names are case-insensitive
-			// http://www.w3.org/TR/selectors/#pseudo-classes
-			// Prioritize by case sensitivity in case custom pseudos are added with uppercase letters
-			// Remember that setFilters inherits from pseudos
-			var args,
-				fn = Expr.pseudos[ pseudo ] || Expr.setFilters[ pseudo.toLowerCase() ] ||
-					Sizzle.error( "unsupported pseudo: " + pseudo );
-
-			// The user may use createPseudo to indicate that
-			// arguments are needed to create the filter function
-			// just as Sizzle does
-			if ( fn[ expando ] ) {
-				return fn( argument );
-			}
-
-			// But maintain support for old signatures
-			if ( fn.length > 1 ) {
-				args = [ pseudo, pseudo, "", argument ];
-				return Expr.setFilters.hasOwnProperty( pseudo.toLowerCase() ) ?
-					markFunction(function( seed, matches ) {
-						var idx,
-							matched = fn( seed, argument ),
-							i = matched.length;
-						while ( i-- ) {
-							idx = indexOf( seed, matched[i] );
-							seed[ idx ] = !( matches[ idx ] = matched[i] );
-						}
-					}) :
-					function( elem ) {
-						return fn( elem, 0, args );
-					};
-			}
-
-			return fn;
-		}
-	},
-
-	pseudos: {
-		// Potentially complex pseudos
-		"not": markFunction(function( selector ) {
-			// Trim the selector passed to compile
-			// to avoid treating leading and trailing
-			// spaces as combinators
-			var input = [],
-				results = [],
-				matcher = compile( selector.replace( rtrim, "$1" ) );
-
-			return matcher[ expando ] ?
-				markFunction(function( seed, matches, context, xml ) {
-					var elem,
-						unmatched = matcher( seed, null, xml, [] ),
-						i = seed.length;
-
-					// Match elements unmatched by `matcher`
-					while ( i-- ) {
-						if ( (elem = unmatched[i]) ) {
-							seed[i] = !(matches[i] = elem);
-						}
-					}
-				}) :
-				function( elem, context, xml ) {
-					input[0] = elem;
-					matcher( input, null, xml, results );
-					// Don't keep the element (issue #299)
-					input[0] = null;
-					return !results.pop();
-				};
-		}),
-
-		"has": markFunction(function( selector ) {
-			return function( elem ) {
-				return Sizzle( selector, elem ).length > 0;
-			};
-		}),
-
-		"contains": markFunction(function( text ) {
-			text = text.replace( runescape, funescape );
-			return function( elem ) {
-				return ( elem.textContent || elem.innerText || getText( elem ) ).indexOf( text ) > -1;
-			};
-		}),
-
-		// "Whether an element is represented by a :lang() selector
-		// is based solely on the element's language value
-		// being equal to the identifier C,
-		// or beginning with the identifier C immediately followed by "-".
-		// The matching of C against the element's language value is performed case-insensitively.
-		// The identifier C does not have to be a valid language name."
-		// http://www.w3.org/TR/selectors/#lang-pseudo
-		"lang": markFunction( function( lang ) {
-			// lang value must be a valid identifier
-			if ( !ridentifier.test(lang || "") ) {
-				Sizzle.error( "unsupported lang: " + lang );
-			}
-			lang = lang.replace( runescape, funescape ).toLowerCase();
-			return function( elem ) {
-				var elemLang;
-				do {
-					if ( (elemLang = documentIsHTML ?
-						elem.lang :
-						elem.getAttribute("xml:lang") || elem.getAttribute("lang")) ) {
-
-						elemLang = elemLang.toLowerCase();
-						return elemLang === lang || elemLang.indexOf( lang + "-" ) === 0;
-					}
-				} while ( (elem = elem.parentNode) && elem.nodeType === 1 );
-				return false;
-			};
-		}),
-
-		// Miscellaneous
-		"target": function( elem ) {
-			var hash = window.location && window.location.hash;
-			return hash && hash.slice( 1 ) === elem.id;
-		},
-
-		"root": function( elem ) {
-			return elem === docElem;
-		},
-
-		"focus": function( elem ) {
-			return elem === document.activeElement && (!document.hasFocus || document.hasFocus()) && !!(elem.type || elem.href || ~elem.tabIndex);
-		},
-
-		// Boolean properties
-		"enabled": createDisabledPseudo( false ),
-		"disabled": createDisabledPseudo( true ),
-
-		"checked": function( elem ) {
-			// In CSS3, :checked should return both checked and selected elements
-			// http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked
-			var nodeName = elem.nodeName.toLowerCase();
-			return (nodeName === "input" && !!elem.checked) || (nodeName === "option" && !!elem.selected);
-		},
-
-		"selected": function( elem ) {
-			// Accessing this property makes selected-by-default
-			// options in Safari work properly
-			if ( elem.parentNode ) {
-				elem.parentNode.selectedIndex;
-			}
-
-			return elem.selected === true;
-		},
-
-		// Contents
-		"empty": function( elem ) {
-			// http://www.w3.org/TR/selectors/#empty-pseudo
-			// :empty is negated by element (1) or content nodes (text: 3; cdata: 4; entity ref: 5),
-			//   but not by others (comment: 8; processing instruction: 7; etc.)
-			// nodeType < 6 works because attributes (2) do not appear as children
-			for ( elem = elem.firstChild; elem; elem = elem.nextSibling ) {
-				if ( elem.nodeType < 6 ) {
-					return false;
-				}
-			}
-			return true;
-		},
-
-		"parent": function( elem ) {
-			return !Expr.pseudos["empty"]( elem );
-		},
-
-		// Element/input types
-		"header": function( elem ) {
-			return rheader.test( elem.nodeName );
-		},
-
-		"input": function( elem ) {
-			return rinputs.test( elem.nodeName );
-		},
-
-		"button": function( elem ) {
-			var name = elem.nodeName.toLowerCase();
-			return name === "input" && elem.type === "button" || name === "button";
-		},
-
-		"text": function( elem ) {
-			var attr;
-			return elem.nodeName.toLowerCase() === "input" &&
-				elem.type === "text" &&
-
-				// Support: IE<8
-				// New HTML5 attribute values (e.g., "search") appear with elem.type === "text"
-				( (attr = elem.getAttribute("type")) == null || attr.toLowerCase() === "text" );
-		},
-
-		// Position-in-collection
-		"first": createPositionalPseudo(function() {
-			return [ 0 ];
-		}),
-
-		"last": createPositionalPseudo(function( matchIndexes, length ) {
-			return [ length - 1 ];
-		}),
-
-		"eq": createPositionalPseudo(function( matchIndexes, length, argument ) {
-			return [ argument < 0 ? argument + length : argument ];
-		}),
-
-		"even": createPositionalPseudo(function( matchIndexes, length ) {
-			var i = 0;
-			for ( ; i < length; i += 2 ) {
-				matchIndexes.push( i );
-			}
-			return matchIndexes;
-		}),
-
-		"odd": createPositionalPseudo(function( matchIndexes, length ) {
-			var i = 1;
-			for ( ; i < length; i += 2 ) {
-				matchIndexes.push( i );
-			}
-			return matchIndexes;
-		}),
-
-		"lt": createPositionalPseudo(function( matchIndexes, length, argument ) {
-			var i = argument < 0 ? argument + length : argument;
-			for ( ; --i >= 0; ) {
-				matchIndexes.push( i );
-			}
-			return matchIndexes;
-		}),
-
-		"gt": createPositionalPseudo(function( matchIndexes, length, argument ) {
-			var i = argument < 0 ? argument + length : argument;
-			for ( ; ++i < length; ) {
-				matchIndexes.push( i );
-			}
-			return matchIndexes;
-		})
-	}
-};
-
-Expr.pseudos["nth"] = Expr.pseudos["eq"];
-
-// Add button/input type pseudos
-for ( i in { radio: true, checkbox: true, file: true, password: true, image: true } ) {
-	Expr.pseudos[ i ] = createInputPseudo( i );
-}
-for ( i in { submit: true, reset: true } ) {
-	Expr.pseudos[ i ] = createButtonPseudo( i );
-}
-
-// Easy API for creating new setFilters
-function setFilters() {}
-setFilters.prototype = Expr.filters = Expr.pseudos;
-Expr.setFilters = new setFilters();
-
-tokenize = Sizzle.tokenize = function( selector, parseOnly ) {
-	var matched, match, tokens, type,
-		soFar, groups, preFilters,
-		cached = tokenCache[ selector + " " ];
-
-	if ( cached ) {
-		return parseOnly ? 0 : cached.slice( 0 );
-	}
-
-	soFar = selector;
-	groups = [];
-	preFilters = Expr.preFilter;
-
-	while ( soFar ) {
-
-		// Comma and first run
-		if ( !matched || (match = rcomma.exec( soFar )) ) {
-			if ( match ) {
-				// Don't consume trailing commas as valid
-				soFar = soFar.slice( match[0].length ) || soFar;
-			}
-			groups.push( (tokens = []) );
-		}
-
-		matched = false;
-
-		// Combinators
-		if ( (match = rcombinators.exec( soFar )) ) {
-			matched = match.shift();
-			tokens.push({
-				value: matched,
-				// Cast descendant combinators to space
-				type: match[0].replace( rtrim, " " )
-			});
-			soFar = soFar.slice( matched.length );
-		}
-
-		// Filters
-		for ( type in Expr.filter ) {
-			if ( (match = matchExpr[ type ].exec( soFar )) && (!preFilters[ type ] ||
-				(match = preFilters[ type ]( match ))) ) {
-				matched = match.shift();
-				tokens.push({
-					value: matched,
-					type: type,
-					matches: match
-				});
-				soFar = soFar.slice( matched.length );
-			}
-		}
-
-		if ( !matched ) {
-			break;
-		}
-	}
-
-	// Return the length of the invalid excess
-	// if we're just parsing
-	// Otherwise, throw an error or return tokens
-	return parseOnly ?
-		soFar.length :
-		soFar ?
-			Sizzle.error( selector ) :
-			// Cache the tokens
-			tokenCache( selector, groups ).slice( 0 );
-};
-
-function toSelector( tokens ) {
-	var i = 0,
-		len = tokens.length,
-		selector = "";
-	for ( ; i < len; i++ ) {
-		selector += tokens[i].value;
-	}
-	return selector;
-}
-
-function addCombinator( matcher, combinator, base ) {
-	var dir = combinator.dir,
-		skip = combinator.next,
-		key = skip || dir,
-		checkNonElements = base && key === "parentNode",
-		doneName = done++;
-
-	return combinator.first ?
-		// Check against closest ancestor/preceding element
-		function( elem, context, xml ) {
-			while ( (elem = elem[ dir ]) ) {
-				if ( elem.nodeType === 1 || checkNonElements ) {
-					return matcher( elem, context, xml );
-				}
-			}
-			return false;
-		} :
-
-		// Check against all ancestor/preceding elements
-		function( elem, context, xml ) {
-			var oldCache, uniqueCache, outerCache,
-				newCache = [ dirruns, doneName ];
-
-			// We can't set arbitrary data on XML nodes, so they don't benefit from combinator caching
-			if ( xml ) {
-				while ( (elem = elem[ dir ]) ) {
-					if ( elem.nodeType === 1 || checkNonElements ) {
-						if ( matcher( elem, context, xml ) ) {
-							return true;
-						}
-					}
-				}
-			} else {
-				while ( (elem = elem[ dir ]) ) {
-					if ( elem.nodeType === 1 || checkNonElements ) {
-						outerCache = elem[ expando ] || (elem[ expando ] = {});
-
-						// Support: IE <9 only
-						// Defend against cloned attroperties (jQuery gh-1709)
-						uniqueCache = outerCache[ elem.uniqueID ] || (outerCache[ elem.uniqueID ] = {});
-
-						if ( skip && skip === elem.nodeName.toLowerCase() ) {
-							elem = elem[ dir ] || elem;
-						} else if ( (oldCache = uniqueCache[ key ]) &&
-							oldCache[ 0 ] === dirruns && oldCache[ 1 ] === doneName ) {
-
-							// Assign to newCache so results back-propagate to previous elements
-							return (newCache[ 2 ] = oldCache[ 2 ]);
-						} else {
-							// Reuse newcache so results back-propagate to previous elements
-							uniqueCache[ key ] = newCache;
-
-							// A match means we're done; a fail means we have to keep checking
-							if ( (newCache[ 2 ] = matcher( elem, context, xml )) ) {
-								return true;
-							}
-						}
-					}
-				}
-			}
-			return false;
-		};
-}
-
-function elementMatcher( matchers ) {
-	return matchers.length > 1 ?
-		function( elem, context, xml ) {
-			var i = matchers.length;
-			while ( i-- ) {
-				if ( !matchers[i]( elem, context, xml ) ) {
-					return false;
-				}
-			}
-			return true;
-		} :
-		matchers[0];
-}
-
-function multipleContexts( selector, contexts, results ) {
-	var i = 0,
-		len = contexts.length;
-	for ( ; i < len; i++ ) {
-		Sizzle( selector, contexts[i], results );
-	}
-	return results;
-}
-
-function condense( unmatched, map, filter, context, xml ) {
-	var elem,
-		newUnmatched = [],
-		i = 0,
-		len = unmatched.length,
-		mapped = map != null;
-
-	for ( ; i < len; i++ ) {
-		if ( (elem = unmatched[i]) ) {
-			if ( !filter || filter( elem, context, xml ) ) {
-				newUnmatched.push( elem );
-				if ( mapped ) {
-					map.push( i );
-				}
-			}
-		}
-	}
-
-	return newUnmatched;
-}
-
-function setMatcher( preFilter, selector, matcher, postFilter, postFinder, postSelector ) {
-	if ( postFilter && !postFilter[ expando ] ) {
-		postFilter = setMatcher( postFilter );
-	}
-	if ( postFinder && !postFinder[ expando ] ) {
-		postFinder = setMatcher( postFinder, postSelector );
-	}
-	return markFunction(function( seed, results, context, xml ) {
-		var temp, i, elem,
-			preMap = [],
-			postMap = [],
-			preexisting = results.length,
-
-			// Get initial elements from seed or context
-			elems = seed || multipleContexts( selector || "*", context.nodeType ? [ context ] : context, [] ),
-
-			// Prefilter to get matcher input, preserving a map for seed-results synchronization
-			matcherIn = preFilter && ( seed || !selector ) ?
-				condense( elems, preMap, preFilter, context, xml ) :
-				elems,
-
-			matcherOut = matcher ?
-				// If we have a postFinder, or filtered seed, or non-seed postFilter or preexisting results,
-				postFinder || ( seed ? preFilter : preexisting || postFilter ) ?
-
-					// ...intermediate processing is necessary
-					[] :
-
-					// ...otherwise use results directly
-					results :
-				matcherIn;
-
-		// Find primary matches
-		if ( matcher ) {
-			matcher( matcherIn, matcherOut, context, xml );
-		}
-
-		// Apply postFilter
-		if ( postFilter ) {
-			temp = condense( matcherOut, postMap );
-			postFilter( temp, [], context, xml );
-
-			// Un-match failing elements by moving them back to matcherIn
-			i = temp.length;
-			while ( i-- ) {
-				if ( (elem = temp[i]) ) {
-					matcherOut[ postMap[i] ] = !(matcherIn[ postMap[i] ] = elem);
-				}
-			}
-		}
-
-		if ( seed ) {
-			if ( postFinder || preFilter ) {
-				if ( postFinder ) {
-					// Get the final matcherOut by condensing this intermediate into postFinder contexts
-					temp = [];
-					i = matcherOut.length;
-					while ( i-- ) {
-						if ( (elem = matcherOut[i]) ) {
-							// Restore matcherIn since elem is not yet a final match
-							temp.push( (matcherIn[i] = elem) );
-						}
-					}
-					postFinder( null, (matcherOut = []), temp, xml );
-				}
-
-				// Move matched elements from seed to results to keep them synchronized
-				i = matcherOut.length;
-				while ( i-- ) {
-					if ( (elem = matcherOut[i]) &&
-						(temp = postFinder ? indexOf( seed, elem ) : preMap[i]) > -1 ) {
-
-						seed[temp] = !(results[temp] = elem);
-					}
-				}
-			}
-
-		// Add elements to results, through postFinder if defined
-		} else {
-			matcherOut = condense(
-				matcherOut === results ?
-					matcherOut.splice( preexisting, matcherOut.length ) :
-					matcherOut
-			);
-			if ( postFinder ) {
-				postFinder( null, results, matcherOut, xml );
-			} else {
-				push.apply( results, matcherOut );
-			}
-		}
-	});
-}
-
-function matcherFromTokens( tokens ) {
-	var checkContext, matcher, j,
-		len = tokens.length,
-		leadingRelative = Expr.relative[ tokens[0].type ],
-		implicitRelative = leadingRelative || Expr.relative[" "],
-		i = leadingRelative ? 1 : 0,
-
-		// The foundational matcher ensures that elements are reachable from top-level context(s)
-		matchContext = addCombinator( function( elem ) {
-			return elem === checkContext;
-		}, implicitRelative, true ),
-		matchAnyContext = addCombinator( function( elem ) {
-			return indexOf( checkContext, elem ) > -1;
-		}, implicitRelative, true ),
-		matchers = [ function( elem, context, xml ) {
-			var ret = ( !leadingRelative && ( xml || context !== outermostContext ) ) || (
-				(checkContext = context).nodeType ?
-					matchContext( elem, context, xml ) :
-					matchAnyContext( elem, context, xml ) );
-			// Avoid hanging onto element (issue #299)
-			checkContext = null;
-			return ret;
-		} ];
-
-	for ( ; i < len; i++ ) {
-		if ( (matcher = Expr.relative[ tokens[i].type ]) ) {
-			matchers = [ addCombinator(elementMatcher( matchers ), matcher) ];
-		} else {
-			matcher = Expr.filter[ tokens[i].type ].apply( null, tokens[i].matches );
-
-			// Return special upon seeing a positional matcher
-			if ( matcher[ expando ] ) {
-				// Find the next relative operator (if any) for proper handling
-				j = ++i;
-				for ( ; j < len; j++ ) {
-					if ( Expr.relative[ tokens[j].type ] ) {
-						break;
-					}
-				}
-				return setMatcher(
-					i > 1 && elementMatcher( matchers ),
-					i > 1 && toSelector(
-						// If the preceding token was a descendant combinator, insert an implicit any-element `*`
-						tokens.slice( 0, i - 1 ).concat({ value: tokens[ i - 2 ].type === " " ? "*" : "" })
-					).replace( rtrim, "$1" ),
-					matcher,
-					i < j && matcherFromTokens( tokens.slice( i, j ) ),
-					j < len && matcherFromTokens( (tokens = tokens.slice( j )) ),
-					j < len && toSelector( tokens )
-				);
-			}
-			matchers.push( matcher );
-		}
-	}
-
-	return elementMatcher( matchers );
-}
-
-function matcherFromGroupMatchers( elementMatchers, setMatchers ) {
-	var bySet = setMatchers.length > 0,
-		byElement = elementMatchers.length > 0,
-		superMatcher = function( seed, context, xml, results, outermost ) {
-			var elem, j, matcher,
-				matchedCount = 0,
-				i = "0",
-				unmatched = seed && [],
-				setMatched = [],
-				contextBackup = outermostContext,
-				// We must always have either seed elements or outermost context
-				elems = seed || byElement && Expr.find["TAG"]( "*", outermost ),
-				// Use integer dirruns iff this is the outermost matcher
-				dirrunsUnique = (dirruns += contextBackup == null ? 1 : Math.random() || 0.1),
-				len = elems.length;
-
-			if ( outermost ) {
-				outermostContext = context === document || context || outermost;
-			}
-
-			// Add elements passing elementMatchers directly to results
-			// Support: IE<9, Safari
-			// Tolerate NodeList properties (IE: "length"; Safari: <number>) matching elements by id
-			for ( ; i !== len && (elem = elems[i]) != null; i++ ) {
-				if ( byElement && elem ) {
-					j = 0;
-					if ( !context && elem.ownerDocument !== document ) {
-						setDocument( elem );
-						xml = !documentIsHTML;
-					}
-					while ( (matcher = elementMatchers[j++]) ) {
-						if ( matcher( elem, context || document, xml) ) {
-							results.push( elem );
-							break;
-						}
-					}
-					if ( outermost ) {
-						dirruns = dirrunsUnique;
-					}
-				}
-
-				// Track unmatched elements for set filters
-				if ( bySet ) {
-					// They will have gone through all possible matchers
-					if ( (elem = !matcher && elem) ) {
-						matchedCount--;
-					}
-
-					// Lengthen the array for every element, matched or not
-					if ( seed ) {
-						unmatched.push( elem );
-					}
-				}
-			}
-
-			// `i` is now the count of elements visited above, and adding it to `matchedCount`
-			// makes the latter nonnegative.
-			matchedCount += i;
-
-			// Apply set filters to unmatched elements
-			// NOTE: This can be skipped if there are no unmatched elements (i.e., `matchedCount`
-			// equals `i`), unless we didn't visit _any_ elements in the above loop because we have
-			// no element matchers and no seed.
-			// Incrementing an initially-string "0" `i` allows `i` to remain a string only in that
-			// case, which will result in a "00" `matchedCount` that differs from `i` but is also
-			// numerically zero.
-			if ( bySet && i !== matchedCount ) {
-				j = 0;
-				while ( (matcher = setMatchers[j++]) ) {
-					matcher( unmatched, setMatched, context, xml );
-				}
-
-				if ( seed ) {
-					// Reintegrate element matches to eliminate the need for sorting
-					if ( matchedCount > 0 ) {
-						while ( i-- ) {
-							if ( !(unmatched[i] || setMatched[i]) ) {
-								setMatched[i] = pop.call( results );
-							}
-						}
-					}
-
-					// Discard index placeholder values to get only actual matches
-					setMatched = condense( setMatched );
-				}
-
-				// Add matches to results
-				push.apply( results, setMatched );
-
-				// Seedless set matches succeeding multiple successful matchers stipulate sorting
-				if ( outermost && !seed && setMatched.length > 0 &&
-					( matchedCount + setMatchers.length ) > 1 ) {
-
-					Sizzle.uniqueSort( results );
-				}
-			}
-
-			// Override manipulation of globals by nested matchers
-			if ( outermost ) {
-				dirruns = dirrunsUnique;
-				outermostContext = contextBackup;
-			}
-
-			return unmatched;
-		};
-
-	return bySet ?
-		markFunction( superMatcher ) :
-		superMatcher;
-}
-
-compile = Sizzle.compile = function( selector, match /* Internal Use Only */ ) {
-	var i,
-		setMatchers = [],
-		elementMatchers = [],
-		cached = compilerCache[ selector + " " ];
-
-	if ( !cached ) {
-		// Generate a function of recursive functions that can be used to check each element
-		if ( !match ) {
-			match = tokenize( selector );
-		}
-		i = match.length;
-		while ( i-- ) {
-			cached = matcherFromTokens( match[i] );
-			if ( cached[ expando ] ) {
-				setMatchers.push( cached );
-			} else {
-				elementMatchers.push( cached );
-			}
-		}
-
-		// Cache the compiled function
-		cached = compilerCache( selector, matcherFromGroupMatchers( elementMatchers, setMatchers ) );
-
-		// Save selector and tokenization
-		cached.selector = selector;
-	}
-	return cached;
-};
-
-/**
- * A low-level selection function that works with Sizzle's compiled
- *  selector functions
- * @param {String|Function} selector A selector or a pre-compiled
- *  selector function built with Sizzle.compile
- * @param {Element} context
- * @param {Array} [results]
- * @param {Array} [seed] A set of elements to match against
- */
-select = Sizzle.select = function( selector, context, results, seed ) {
-	var i, tokens, token, type, find,
-		compiled = typeof selector === "function" && selector,
-		match = !seed && tokenize( (selector = compiled.selector || selector) );
-
-	results = results || [];
-
-	// Try to minimize operations if there is only one selector in the list and no seed
-	// (the latter of which guarantees us context)
-	if ( match.length === 1 ) {
-
-		// Reduce context if the leading compound selector is an ID
-		tokens = match[0] = match[0].slice( 0 );
-		if ( tokens.length > 2 && (token = tokens[0]).type === "ID" &&
-				context.nodeType === 9 && documentIsHTML && Expr.relative[ tokens[1].type ] ) {
-
-			context = ( Expr.find["ID"]( token.matches[0].replace(runescape, funescape), context ) || [] )[0];
-			if ( !context ) {
-				return results;
-
-			// Precompiled matchers will still verify ancestry, so step up a level
-			} else if ( compiled ) {
-				context = context.parentNode;
-			}
-
-			selector = selector.slice( tokens.shift().value.length );
-		}
-
-		// Fetch a seed set for right-to-left matching
-		i = matchExpr["needsContext"].test( selector ) ? 0 : tokens.length;
-		while ( i-- ) {
-			token = tokens[i];
-
-			// Abort if we hit a combinator
-			if ( Expr.relative[ (type = token.type) ] ) {
-				break;
-			}
-			if ( (find = Expr.find[ type ]) ) {
-				// Search, expanding context for leading sibling combinators
-				if ( (seed = find(
-					token.matches[0].replace( runescape, funescape ),
-					rsibling.test( tokens[0].type ) && testContext( context.parentNode ) || context
-				)) ) {
-
-					// If seed is empty or no tokens remain, we can return early
-					tokens.splice( i, 1 );
-					selector = seed.length && toSelector( tokens );
-					if ( !selector ) {
-						push.apply( results, seed );
-						return results;
-					}
-
-					break;
-				}
-			}
-		}
-	}
-
-	// Compile and execute a filtering function if one is not provided
-	// Provide `match` to avoid retokenization if we modified the selector above
-	( compiled || compile( selector, match ) )(
-		seed,
-		context,
-		!documentIsHTML,
-		results,
-		!context || rsibling.test( selector ) && testContext( context.parentNode ) || context
-	);
-	return results;
-};
-
-// One-time assignments
-
-// Sort stability
-support.sortStable = expando.split("").sort( sortOrder ).join("") === expando;
-
-// Support: Chrome 14-35+
-// Always assume duplicates if they aren't passed to the comparison function
-support.detectDuplicates = !!hasDuplicate;
-
-// Initialize against the default document
-setDocument();
-
-// Support: Webkit<537.32 - Safari 6.0.3/Chrome 25 (fixed in Chrome 27)
-// Detached nodes confoundingly follow *each other*
-support.sortDetached = assert(function( el ) {
-	// Should return 1, but returns 4 (following)
-	return el.compareDocumentPosition( document.createElement("fieldset") ) & 1;
-});
-
-// Support: IE<8
-// Prevent attribute/property "interpolation"
-// https://msdn.microsoft.com/en-us/library/ms536429%28VS.85%29.aspx
-if ( !assert(function( el ) {
-	el.innerHTML = "<a href='#'></a>";
-	return el.firstChild.getAttribute("href") === "#" ;
-}) ) {
-	addHandle( "type|href|height|width", function( elem, name, isXML ) {
-		if ( !isXML ) {
-			return elem.getAttribute( name, name.toLowerCase() === "type" ? 1 : 2 );
-		}
-	});
-}
-
-// Support: IE<9
-// Use defaultValue in place of getAttribute("value")
-if ( !support.attributes || !assert(function( el ) {
-	el.innerHTML = "<input/>";
-	el.firstChild.setAttribute( "value", "" );
-	return el.firstChild.getAttribute( "value" ) === "";
-}) ) {
-	addHandle( "value", function( elem, name, isXML ) {
-		if ( !isXML && elem.nodeName.toLowerCase() === "input" ) {
-			return elem.defaultValue;
-		}
-	});
-}
-
-// Support: IE<9
-// Use getAttributeNode to fetch booleans when getAttribute lies
-if ( !assert(function( el ) {
-	return el.getAttribute("disabled") == null;
-}) ) {
-	addHandle( booleans, function( elem, name, isXML ) {
-		var val;
-		if ( !isXML ) {
-			return elem[ name ] === true ? name.toLowerCase() :
-					(val = elem.getAttributeNode( name )) && val.specified ?
-					val.value :
-				null;
-		}
-	});
-}
-
-return Sizzle;
-
-})( window );
-
-
-
-jQuery.find = Sizzle;
-jQuery.expr = Sizzle.selectors;
-
-// Deprecated
-jQuery.expr[ ":" ] = jQuery.expr.pseudos;
-jQuery.uniqueSort = jQuery.unique = Sizzle.uniqueSort;
-jQuery.text = Sizzle.getText;
-jQuery.isXMLDoc = Sizzle.isXML;
-jQuery.contains = Sizzle.contains;
-jQuery.escapeSelector = Sizzle.escape;
-
-
-
-
-var dir = function( elem, dir, until ) {
-	var matched = [],
-		truncate = until !== undefined;
-
-	while ( ( elem = elem[ dir ] ) && elem.nodeType !== 9 ) {
-		if ( elem.nodeType === 1 ) {
-			if ( truncate && jQuery( elem ).is( until ) ) {
-				break;
-			}
-			matched.push( elem );
-		}
-	}
-	return matched;
-};
-
-
-var siblings = function( n, elem ) {
-	var matched = [];
-
-	for ( ; n; n = n.nextSibling ) {
-		if ( n.nodeType === 1 && n !== elem ) {
-			matched.push( n );
-		}
-	}
-
-	return matched;
-};
-
-
-var rneedsContext = jQuery.expr.match.needsContext;
-
-
-
-function nodeName( elem, name ) {
-
-  return elem.nodeName && elem.nodeName.toLowerCase() === name.toLowerCase();
-
-};
-var rsingleTag = ( /^<([a-z][^\/\0>:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i );
-
-
-
-// Implement the identical functionality for filter and not
-function winnow( elements, qualifier, not ) {
-	if ( isFunction( qualifier ) ) {
-		return jQuery.grep( elements, function( elem, i ) {
-			return !!qualifier.call( elem, i, elem ) !== not;
-		} );
-	}
-
-	// Single element
-	if ( qualifier.nodeType ) {
-		return jQuery.grep( elements, function( elem ) {
-			return ( elem === qualifier ) !== not;
-		} );
-	}
-
-	// Arraylike of elements (jQuery, arguments, Array)
-	if ( typeof qualifier !== "string" ) {
-		return jQuery.grep( elements, function( elem ) {
-			return ( indexOf.call( qualifier, elem ) > -1 ) !== not;
-		} );
-	}
-
-	// Filtered directly for both simple and complex selectors
-	return jQuery.filter( qualifier, elements, not );
-}
-
-jQuery.filter = function( expr, elems, not ) {
-	var elem = elems[ 0 ];
-
-	if ( not ) {
-		expr = ":not(" + expr + ")";
-	}
-
-	if ( elems.length === 1 && elem.nodeType === 1 ) {
-		return jQuery.find.matchesSelector( elem, expr ) ? [ elem ] : [];
-	}
-
-	return jQuery.find.matches( expr, jQuery.grep( elems, function( elem ) {
-		return elem.nodeType === 1;
-	} ) );
-};
-
-jQuery.fn.extend( {
-	find: function( selector ) {
-		var i, ret,
-			len = this.length,
-			self = this;
-
-		if ( typeof selector !== "string" ) {
-			return this.pushStack( jQuery( selector ).filter( function() {
-				for ( i = 0; i < len; i++ ) {
-					if ( jQuery.contains( self[ i ], this ) ) {
-						return true;
-					}
-				}
-			} ) );
-		}
-
-		ret = this.pushStack( [] );
-
-		for ( i = 0; i < len; i++ ) {
-			jQuery.find( selector, self[ i ], ret );
-		}
-
-		return len > 1 ? jQuery.uniqueSort( ret ) : ret;
-	},
-	filter: function( selector ) {
-		return this.pushStack( winnow( this, selector || [], false ) );
-	},
-	not: function( selector ) {
-		return this.pushStack( winnow( this, selector || [], true ) );
-	},
-	is: function( selector ) {
-		return !!winnow(
-			this,
-
-			// If this is a positional/relative selector, check membership in the returned set
-			// so $("p:first").is("p:last") won't return true for a doc with two "p".
-			typeof selector === "string" && rneedsContext.test( selector ) ?
-				jQuery( selector ) :
-				selector || [],
-			false
-		).length;
-	}
-} );
-
-
-// Initialize a jQuery object
-
-
-// A central reference to the root jQuery(document)
-var rootjQuery,
-
-	// A simple way to check for HTML strings
-	// Prioritize #id over <tag> to avoid XSS via location.hash (#9521)
-	// Strict HTML recognition (#11290: must start with <)
-	// Shortcut simple #id case for speed
-	rquickExpr = /^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]+))$/,
-
-	init = jQuery.fn.init = function( selector, context, root ) {
-		var match, elem;
-
-		// HANDLE: $(""), $(null), $(undefined), $(false)
-		if ( !selector ) {
-			return this;
-		}
-
-		// Method init() accepts an alternate rootjQuery
-		// so migrate can support jQuery.sub (gh-2101)
-		root = root || rootjQuery;
-
-		// Handle HTML strings
-		if ( typeof selector === "string" ) {
-			if ( selector[ 0 ] === "<" &&
-				selector[ selector.length - 1 ] === ">" &&
-				selector.length >= 3 ) {
-
-				// Assume that strings that start and end with <> are HTML and skip the regex check
-				match = [ null, selector, null ];
-
-			} else {
-				match = rquickExpr.exec( selector );
-			}
-
-			// Match html or make sure no context is specified for #id
-			if ( match && ( match[ 1 ] || !context ) ) {
-
-				// HANDLE: $(html) -> $(array)
-				if ( match[ 1 ] ) {
-					context = context instanceof jQuery ? context[ 0 ] : context;
-
-					// Option to run scripts is true for back-compat
-					// Intentionally let the error be thrown if parseHTML is not present
-					jQuery.merge( this, jQuery.parseHTML(
-						match[ 1 ],
-						context && context.nodeType ? context.ownerDocument || context : document,
-						true
-					) );
-
-					// HANDLE: $(html, props)
-					if ( rsingleTag.test( match[ 1 ] ) && jQuery.isPlainObject( context ) ) {
-						for ( match in context ) {
-
-							// Properties of context are called as methods if possible
-							if ( isFunction( this[ match ] ) ) {
-								this[ match ]( context[ match ] );
-
-							// ...and otherwise set as attributes
-							} else {
-								this.attr( match, context[ match ] );
-							}
-						}
-					}
-
-					return this;
-
-				// HANDLE: $(#id)
-				} else {
-					elem = document.getElementById( match[ 2 ] );
-
-					if ( elem ) {
-
-						// Inject the element directly into the jQuery object
-						this[ 0 ] = elem;
-						this.length = 1;
-					}
-					return this;
-				}
-
-			// HANDLE: $(expr, $(...))
-			} else if ( !context || context.jquery ) {
-				return ( context || root ).find( selector );
-
-			// HANDLE: $(expr, context)
-			// (which is just equivalent to: $(context).find(expr)
-			} else {
-				return this.constructor( context ).find( selector );
-			}
-
-		// HANDLE: $(DOMElement)
-		} else if ( selector.nodeType ) {
-			this[ 0 ] = selector;
-			this.length = 1;
-			return this;
-
-		// HANDLE: $(function)
-		// Shortcut for document ready
-		} else if ( isFunction( selector ) ) {
-			return root.ready !== undefined ?
-				root.ready( selector ) :
-
-				// Execute immediately if ready is not present
-				selector( jQuery );
-		}
-
-		return jQuery.makeArray( selector, this );
-	};
-
-// Give the init function the jQuery prototype for later instantiation
-init.prototype = jQuery.fn;
-
-// Initialize central reference
-rootjQuery = jQuery( document );
-
-
-var rparentsprev = /^(?:parents|prev(?:Until|All))/,
-
-	// Methods guaranteed to produce a unique set when starting from a unique set
-	guaranteedUnique = {
-		children: true,
-		contents: true,
-		next: true,
-		prev: true
-	};
-
-jQuery.fn.extend( {
-	has: function( target ) {
-		var targets = jQuery( target, this ),
-			l = targets.length;
-
-		return this.filter( function() {
-			var i = 0;
-			for ( ; i < l; i++ ) {
-				if ( jQuery.contains( this, targets[ i ] ) ) {
-					return true;
-				}
-			}
-		} );
-	},
-
-	closest: function( selectors, context ) {
-		var cur,
-			i = 0,
-			l = this.length,
-			matched = [],
-			targets = typeof selectors !== "string" && jQuery( selectors );
-
-		// Positional selectors never match, since there's no _selection_ context
-		if ( !rneedsContext.test( selectors ) ) {
-			for ( ; i < l; i++ ) {
-				for ( cur = this[ i ]; cur && cur !== context; cur = cur.parentNode ) {
-
-					// Always skip document fragments
-					if ( cur.nodeType < 11 && ( targets ?
-						targets.index( cur ) > -1 :
-
-						// Don't pass non-elements to Sizzle
-						cur.nodeType === 1 &&
-							jQuery.find.matchesSelector( cur, selectors ) ) ) {
-
-						matched.push( cur );
-						break;
-					}
-				}
-			}
-		}
-
-		return this.pushStack( matched.length > 1 ? jQuery.uniqueSort( matched ) : matched );
-	},
-
-	// Determine the position of an element within the set
-	index: function( elem ) {
-
-		// No argument, return index in parent
-		if ( !elem ) {
-			return ( this[ 0 ] && this[ 0 ].parentNode ) ? this.first().prevAll().length : -1;
-		}
-
-		// Index in selector
-		if ( typeof elem === "string" ) {
-			return indexOf.call( jQuery( elem ), this[ 0 ] );
-		}
-
-		// Locate the position of the desired element
-		return indexOf.call( this,
-
-			// If it receives a jQuery object, the first element is used
-			elem.jquery ? elem[ 0 ] : elem
-		);
-	},
-
-	add: function( selector, context ) {
-		return this.pushStack(
-			jQuery.uniqueSort(
-				jQuery.merge( this.get(), jQuery( selector, context ) )
-			)
-		);
-	},
-
-	addBack: function( selector ) {
-		return this.add( selector == null ?
-			this.prevObject : this.prevObject.filter( selector )
-		);
-	}
-} );
-
-function sibling( cur, dir ) {
-	while ( ( cur = cur[ dir ] ) && cur.nodeType !== 1 ) {}
-	return cur;
-}
-
-jQuery.each( {
-	parent: function( elem ) {
-		var parent = elem.parentNode;
-		return parent && parent.nodeType !== 11 ? parent : null;
-	},
-	parents: function( elem ) {
-		return dir( elem, "parentNode" );
-	},
-	parentsUntil: function( elem, i, until ) {
-		return dir( elem, "parentNode", until );
-	},
-	next: function( elem ) {
-		return sibling( elem, "nextSibling" );
-	},
-	prev: function( elem ) {
-		return sibling( elem, "previousSibling" );
-	},
-	nextAll: function( elem ) {
-		return dir( elem, "nextSibling" );
-	},
-	prevAll: function( elem ) {
-		return dir( elem, "previousSibling" );
-	},
-	nextUntil: function( elem, i, until ) {
-		return dir( elem, "nextSibling", until );
-	},
-	prevUntil: function( elem, i, until ) {
-		return dir( elem, "previousSibling", until );
-	},
-	siblings: function( elem ) {
-		return siblings( ( elem.parentNode || {} ).firstChild, elem );
-	},
-	children: function( elem ) {
-		return siblings( elem.firstChild );
-	},
-	contents: function( elem ) {
-        if ( nodeName( elem, "iframe" ) ) {
-            return elem.contentDocument;
-        }
-
-        // Support: IE 9 - 11 only, iOS 7 only, Android Browser <=4.3 only
-        // Treat the template element as a regular one in browsers that
-        // don't support it.
-        if ( nodeName( elem, "template" ) ) {
-            elem = elem.content || elem;
-        }
-
-        return jQuery.merge( [], elem.childNodes );
-	}
-}, function( name, fn ) {
-	jQuery.fn[ name ] = function( until, selector ) {
-		var matched = jQuery.map( this, fn, until );
-
-		if ( name.slice( -5 ) !== "Until" ) {
-			selector = until;
-		}
-
-		if ( selector && typeof selector === "string" ) {
-			matched = jQuery.filter( selector, matched );
-		}
-
-		if ( this.length > 1 ) {
-
-			// Remove duplicates
-			if ( !guaranteedUnique[ name ] ) {
-				jQuery.uniqueSort( matched );
-			}
-
-			// Reverse order for parents* and prev-derivatives
-			if ( rparentsprev.test( name ) ) {
-				matched.reverse();
-			}
-		}
-
-		return this.pushStack( matched );
-	};
-} );
-var rnothtmlwhite = ( /[^\x20\t\r\n\f]+/g );
-
-
-
-// Convert String-formatted options into Object-formatted ones
-function createOptions( options ) {
-	var object = {};
-	jQuery.each( options.match( rnothtmlwhite ) || [], function( _, flag ) {
-		object[ flag ] = true;
-	} );
-	return object;
-}
-
-/*
- * Create a callback list using the following parameters:
- *
- *	options: an optional list of space-separated options that will change how
- *			the callback list behaves or a more traditional option object
- *
- * By default a callback list will act like an event callback list and can be
- * "fired" multiple times.
- *
- * Possible options:
- *
- *	once:			will ensure the callback list can only be fired once (like a Deferred)
- *
- *	memory:			will keep track of previous values and will call any callback added
- *					after the list has been fired right away with the latest "memorized"
- *					values (like a Deferred)
- *
- *	unique:			will ensure a callback can only be added once (no duplicate in the list)
- *
- *	stopOnFalse:	interrupt callings when a callback returns false
- *
- */
-jQuery.Callbacks = function( options ) {
-
-	// Convert options from String-formatted to Object-formatted if needed
-	// (we check in cache first)
-	options = typeof options === "string" ?
-		createOptions( options ) :
-		jQuery.extend( {}, options );
-
-	var // Flag to know if list is currently firing
-		firing,
-
-		// Last fire value for non-forgettable lists
-		memory,
-
-		// Flag to know if list was already fired
-		fired,
-
-		// Flag to prevent firing
-		locked,
-
-		// Actual callback list
-		list = [],
-
-		// Queue of execution data for repeatable lists
-		queue = [],
-
-		// Index of currently firing callback (modified by add/remove as needed)
-		firingIndex = -1,
-
-		// Fire callbacks
-		fire = function() {
-
-			// Enforce single-firing
-			locked = locked || options.once;
-
-			// Execute callbacks for all pending executions,
-			// respecting firingIndex overrides and runtime changes
-			fired = firing = true;
-			for ( ; queue.length; firingIndex = -1 ) {
-				memory = queue.shift();
-				while ( ++firingIndex < list.length ) {
-
-					// Run callback and check for early termination
-					if ( list[ firingIndex ].apply( memory[ 0 ], memory[ 1 ] ) === false &&
-						options.stopOnFalse ) {
-
-						// Jump to end and forget the data so .add doesn't re-fire
-						firingIndex = list.length;
-						memory = false;
-					}
-				}
-			}
-
-			// Forget the data if we're done with it
-			if ( !options.memory ) {
-				memory = false;
-			}
-
-			firing = false;
-
-			// Clean up if we're done firing for good
-			if ( locked ) {
-
-				// Keep an empty list if we have data for future add calls
-				if ( memory ) {
-					list = [];
-
-				// Otherwise, this object is spent
-				} else {
-					list = "";
-				}
-			}
-		},
-
-		// Actual Callbacks object
-		self = {
-
-			// Add a callback or a collection of callbacks to the list
-			add: function() {
-				if ( list ) {
-
-					// If we have memory from a past run, we should fire after adding
-					if ( memory && !firing ) {
-						firingIndex = list.length - 1;
-						queue.push( memory );
-					}
-
-					( function add( args ) {
-						jQuery.each( args, function( _, arg ) {
-							if ( isFunction( arg ) ) {
-								if ( !options.unique || !self.has( arg ) ) {
-									list.push( arg );
-								}
-							} else if ( arg && arg.length && toType( arg ) !== "string" ) {
-
-								// Inspect recursively
-								add( arg );
-							}
-						} );
-					} )( arguments );
-
-					if ( memory && !firing ) {
-						fire();
-					}
-				}
-				return this;
-			},
-
-			// Remove a callback from the list
-			remove: function() {
-				jQuery.each( arguments, function( _, arg ) {
-					var index;
-					while ( ( index = jQuery.inArray( arg, list, index ) ) > -1 ) {
-						list.splice( index, 1 );
-
-						// Handle firing indexes
-						if ( index <= firingIndex ) {
-							firingIndex--;
-						}
-					}
-				} );
-				return this;
-			},
-
-			// Check if a given callback is in the list.
-			// If no argument is given, return whether or not list has callbacks attached.
-			has: function( fn ) {
-				return fn ?
-					jQuery.inArray( fn, list ) > -1 :
-					list.length > 0;
-			},
-
-			// Remove all callbacks from the list
-			empty: function() {
-				if ( list ) {
-					list = [];
-				}
-				return this;
-			},
-
-			// Disable .fire and .add
-			// Abort any current/pending executions
-			// Clear all callbacks and values
-			disable: function() {
-				locked = queue = [];
-				list = memory = "";
-				return this;
-			},
-			disabled: function() {
-				return !list;
-			},
-
-			// Disable .fire
-			// Also disable .add unless we have memory (since it would have no effect)
-			// Abort any pending executions
-			lock: function() {
-				locked = queue = [];
-				if ( !memory && !firing ) {
-					list = memory = "";
-				}
-				return this;
-			},
-			locked: function() {
-				return !!locked;
-			},
-
-			// Call all callbacks with the given context and arguments
-			fireWith: function( context, args ) {
-				if ( !locked ) {
-					args = args || [];
-					args = [ context, args.slice ? args.slice() : args ];
-					queue.push( args );
-					if ( !firing ) {
-						fire();
-					}
-				}
-				return this;
-			},
-
-			// Call all the callbacks with the given arguments
-			fire: function() {
-				self.fireWith( this, arguments );
-				return this;
-			},
-
-			// To know if the callbacks have already been called at least once
-			fired: function() {
-				return !!fired;
-			}
-		};
-
-	return self;
-};
-
-
-function Identity( v ) {
-	return v;
-}
-function Thrower( ex ) {
-	throw ex;
-}
-
-function adoptValue( value, resolve, reject, noValue ) {
-	var method;
-
-	try {
-
-		// Check for promise aspect first to privilege synchronous behavior
-		if ( value && isFunction( ( method = value.promise ) ) ) {
-			method.call( value ).done( resolve ).fail( reject );
-
-		// Other thenables
-		} else if ( value && isFunction( ( method = value.then ) ) ) {
-			method.call( value, resolve, reject );
-
-		// Other non-thenables
-		} else {
-
-			// Control `resolve` arguments by letting Array#slice cast boolean `noValue` to integer:
-			// * false: [ value ].slice( 0 ) => resolve( value )
-			// * true: [ value ].slice( 1 ) => resolve()
-			resolve.apply( undefined, [ value ].slice( noValue ) );
-		}
-
-	// For Promises/A+, convert exceptions into rejections
-	// Since jQuery.when doesn't unwrap thenables, we can skip the extra checks appearing in
-	// Deferred#then to conditionally suppress rejection.
-	} catch ( value ) {
-
-		// Support: Android 4.0 only
-		// Strict mode functions invoked without .call/.apply get global-object context
-		reject.apply( undefined, [ value ] );
-	}
-}
-
-jQuery.extend( {
-
-	Deferred: function( func ) {
-		var tuples = [
-
-				// action, add listener, callbacks,
-				// ... .then handlers, argument index, [final state]
-				[ "notify", "progress", jQuery.Callbacks( "memory" ),
-					jQuery.Callbacks( "memory" ), 2 ],
-				[ "resolve", "done", jQuery.Callbacks( "once memory" ),
-					jQuery.Callbacks( "once memory" ), 0, "resolved" ],
-				[ "reject", "fail", jQuery.Callbacks( "once memory" ),
-					jQuery.Callbacks( "once memory" ), 1, "rejected" ]
-			],
-			state = "pending",
-			promise = {
-				state: function() {
-					return state;
-				},
-				always: function() {
-					deferred.done( arguments ).fail( arguments );
-					return this;
-				},
-				"catch": function( fn ) {
-					return promise.then( null, fn );
-				},
-
-				// Keep pipe for back-compat
-				pipe: function( /* fnDone, fnFail, fnProgress */ ) {
-					var fns = arguments;
-
-					return jQuery.Deferred( function( newDefer ) {
-						jQuery.each( tuples, function( i, tuple ) {
-
-							// Map tuples (progress, done, fail) to arguments (done, fail, progress)
-							var fn = isFunction( fns[ tuple[ 4 ] ] ) && fns[ tuple[ 4 ] ];
-
-							// deferred.progress(function() { bind to newDefer or newDefer.notify })
-							// deferred.done(function() { bind to newDefer or newDefer.resolve })
-							// deferred.fail(function() { bind to newDefer or newDefer.reject })
-							deferred[ tuple[ 1 ] ]( function() {
-								var returned = fn && fn.apply( this, arguments );
-								if ( returned && isFunction( returned.promise ) ) {
-									returned.promise()
-										.progress( newDefer.notify )
-										.done( newDefer.resolve )
-										.fail( newDefer.reject );
-								} else {
-									newDefer[ tuple[ 0 ] + "With" ](
-										this,
-										fn ? [ returned ] : arguments
-									);
-								}
-							} );
-						} );
-						fns = null;
-					} ).promise();
-				},
-				then: function( onFulfilled, onRejected, onProgress ) {
-					var maxDepth = 0;
-					function resolve( depth, deferred, handler, special ) {
-						return function() {
-							var that = this,
-								args = arguments,
-								mightThrow = function() {
-									var returned, then;
-
-									// Support: Promises/A+ section 2.3.3.3.3
-									// https://promisesaplus.com/#point-59
-									// Ignore double-resolution attempts
-									if ( depth < maxDepth ) {
-										return;
-									}
-
-									returned = handler.apply( that, args );
-
-									// Support: Promises/A+ section 2.3.1
-									// https://promisesaplus.com/#point-48
-									if ( returned === deferred.promise() ) {
-										throw new TypeError( "Thenable self-resolution" );
-									}
-
-									// Support: Promises/A+ sections 2.3.3.1, 3.5
-									// https://promisesaplus.com/#point-54
-									// https://promisesaplus.com/#point-75
-									// Retrieve `then` only once
-									then = returned &&
-
-										// Support: Promises/A+ section 2.3.4
-										// https://promisesaplus.com/#point-64
-										// Only check objects and functions for thenability
-										( typeof returned === "object" ||
-											typeof returned === "function" ) &&
-										returned.then;
-
-									// Handle a returned thenable
-									if ( isFunction( then ) ) {
-
-										// Special processors (notify) just wait for resolution
-										if ( special ) {
-											then.call(
-												returned,
-												resolve( maxDepth, deferred, Identity, special ),
-												resolve( maxDepth, deferred, Thrower, special )
-											);
-
-										// Normal processors (resolve) also hook into progress
-										} else {
-
-											// ...and disregard older resolution values
-											maxDepth++;
-
-											then.call(
-												returned,
-												resolve( maxDepth, deferred, Identity, special ),
-												resolve( maxDepth, deferred, Thrower, special ),
-												resolve( maxDepth, deferred, Identity,
-													deferred.notifyWith )
-											);
-										}
-
-									// Handle all other returned values
-									} else {
-
-										// Only substitute handlers pass on context
-										// and multiple values (non-spec behavior)
-										if ( handler !== Identity ) {
-											that = undefined;
-											args = [ returned ];
-										}
-
-										// Process the value(s)
-										// Default process is resolve
-										( special || deferred.resolveWith )( that, args );
-									}
-								},
-
-								// Only normal processors (resolve) catch and reject exceptions
-								process = special ?
-									mightThrow :
-									function() {
-										try {
-											mightThrow();
-										} catch ( e ) {
-
-											if ( jQuery.Deferred.exceptionHook ) {
-												jQuery.Deferred.exceptionHook( e,
-													process.stackTrace );
-											}
-
-											// Support: Promises/A+ section 2.3.3.3.4.1
-											// https://promisesaplus.com/#point-61
-											// Ignore post-resolution exceptions
-											if ( depth + 1 >= maxDepth ) {
-
-												// Only substitute handlers pass on context
-												// and multiple values (non-spec behavior)
-												if ( handler !== Thrower ) {
-													that = undefined;
-													args = [ e ];
-												}
-
-												deferred.rejectWith( that, args );
-											}
-										}
-									};
-
-							// Support: Promises/A+ section 2.3.3.3.1
-							// https://promisesaplus.com/#point-57
-							// Re-resolve promises immediately to dodge false rejection from
-							// subsequent errors
-							if ( depth ) {
-								process();
-							} else {
-
-								// Call an optional hook to record the stack, in case of exception
-								// since it's otherwise lost when execution goes async
-								if ( jQuery.Deferred.getStackHook ) {
-									process.stackTrace = jQuery.Deferred.getStackHook();
-								}
-								window.setTimeout( process );
-							}
-						};
-					}
-
-					return jQuery.Deferred( function( newDefer ) {
-
-						// progress_handlers.add( ... )
-						tuples[ 0 ][ 3 ].add(
-							resolve(
-								0,
-								newDefer,
-								isFunction( onProgress ) ?
-									onProgress :
-									Identity,
-								newDefer.notifyWith
-							)
-						);
-
-						// fulfilled_handlers.add( ... )
-						tuples[ 1 ][ 3 ].add(
-							resolve(
-								0,
-								newDefer,
-								isFunction( onFulfilled ) ?
-									onFulfilled :
-									Identity
-							)
-						);
-
-						// rejected_handlers.add( ... )
-						tuples[ 2 ][ 3 ].add(
-							resolve(
-								0,
-								newDefer,
-								isFunction( onRejected ) ?
-									onRejected :
-									Thrower
-							)
-						);
-					} ).promise();
-				},
-
-				// Get a promise for this deferred
-				// If obj is provided, the promise aspect is added to the object
-				promise: function( obj ) {
-					return obj != null ? jQuery.extend( obj, promise ) : promise;
-				}
-			},
-			deferred = {};
-
-		// Add list-specific methods
-		jQuery.each( tuples, function( i, tuple ) {
-			var list = tuple[ 2 ],
-				stateString = tuple[ 5 ];
-
-			// promise.progress = list.add
-			// promise.done = list.add
-			// promise.fail = list.add
-			promise[ tuple[ 1 ] ] = list.add;
-
-			// Handle state
-			if ( stateString ) {
-				list.add(
-					function() {
-
-						// state = "resolved" (i.e., fulfilled)
-						// state = "rejected"
-						state = stateString;
-					},
-
-					// rejected_callbacks.disable
-					// fulfilled_callbacks.disable
-					tuples[ 3 - i ][ 2 ].disable,
-
-					// rejected_handlers.disable
-					// fulfilled_handlers.disable
-					tuples[ 3 - i ][ 3 ].disable,
-
-					// progress_callbacks.lock
-					tuples[ 0 ][ 2 ].lock,
-
-					// progress_handlers.lock
-					tuples[ 0 ][ 3 ].lock
-				);
-			}
-
-			// progress_handlers.fire
-			// fulfilled_handlers.fire
-			// rejected_handlers.fire
-			list.add( tuple[ 3 ].fire );
-
-			// deferred.notify = function() { deferred.notifyWith(...) }
-			// deferred.resolve = function() { deferred.resolveWith(...) }
-			// deferred.reject = function() { deferred.rejectWith(...) }
-			deferred[ tuple[ 0 ] ] = function() {
-				deferred[ tuple[ 0 ] + "With" ]( this === deferred ? undefined : this, arguments );
-				return this;
-			};
-
-			// deferred.notifyWith = list.fireWith
-			// deferred.resolveWith = list.fireWith
-			// deferred.rejectWith = list.fireWith
-			deferred[ tuple[ 0 ] + "With" ] = list.fireWith;
-		} );
-
-		// Make the deferred a promise
-		promise.promise( deferred );
-
-		// Call given func if any
-		if ( func ) {
-			func.call( deferred, deferred );
-		}
-
-		// All done!
-		return deferred;
-	},
-
-	// Deferred helper
-	when: function( singleValue ) {
-		var
-
-			// count of uncompleted subordinates
-			remaining = arguments.length,
-
-			// count of unprocessed arguments
-			i = remaining,
-
-			// subordinate fulfillment data
-			resolveContexts = Array( i ),
-			resolveValues = slice.call( arguments ),
-
-			// the master Deferred
-			master = jQuery.Deferred(),
-
-			// subordinate callback factory
-			updateFunc = function( i ) {
-				return function( value ) {
-					resolveContexts[ i ] = this;
-					resolveValues[ i ] = arguments.length > 1 ? slice.call( arguments ) : value;
-					if ( !( --remaining ) ) {
-						master.resolveWith( resolveContexts, resolveValues );
-					}
-				};
-			};
-
-		// Single- and empty arguments are adopted like Promise.resolve
-		if ( remaining <= 1 ) {
-			adoptValue( singleValue, master.done( updateFunc( i ) ).resolve, master.reject,
-				!remaining );
-
-			// Use .then() to unwrap secondary thenables (cf. gh-3000)
-			if ( master.state() === "pending" ||
-				isFunction( resolveValues[ i ] && resolveValues[ i ].then ) ) {
-
-				return master.then();
-			}
-		}
-
-		// Multiple arguments are aggregated like Promise.all array elements
-		while ( i-- ) {
-			adoptValue( resolveValues[ i ], updateFunc( i ), master.reject );
-		}
-
-		return master.promise();
-	}
-} );
-
-
-// These usually indicate a programmer mistake during development,
-// warn about them ASAP rather than swallowing them by default.
-var rerrorNames = /^(Eval|Internal|Range|Reference|Syntax|Type|URI)Error$/;
-
-jQuery.Deferred.exceptionHook = function( error, stack ) {
-
-	// Support: IE 8 - 9 only
-	// Console exists when dev tools are open, which can happen at any time
-	if ( window.console && window.console.warn && error && rerrorNames.test( error.name ) ) {
-		window.console.warn( "jQuery.Deferred exception: " + error.message, error.stack, stack );
-	}
-};
-
-
-
-
-jQuery.readyException = function( error ) {
-	window.setTimeout( function() {
-		throw error;
-	} );
-};
-
-
-
-
-// The deferred used on DOM ready
-var readyList = jQuery.Deferred();
-
-jQuery.fn.ready = function( fn ) {
-
-	readyList
-		.then( fn )
-
-		// Wrap jQuery.readyException in a function so that the lookup
-		// happens at the time of error handling instead of callback
-		// registration.
-		.catch( function( error ) {
-			jQuery.readyException( error );
-		} );
-
-	return this;
-};
-
-jQuery.extend( {
-
-	// Is the DOM ready to be used? Set to true once it occurs.
-	isReady: false,
-
-	// A counter to track how many items to wait for before
-	// the ready event fires. See #6781
-	readyWait: 1,
-
-	// Handle when the DOM is ready
-	ready: function( wait ) {
-
-		// Abort if there are pending holds or we're already ready
-		if ( wait === true ? --jQuery.readyWait : jQuery.isReady ) {
-			return;
-		}
-
-		// Remember that the DOM is ready
-		jQuery.isReady = true;
-
-		// If a normal DOM Ready event fired, decrement, and wait if need be
-		if ( wait !== true && --jQuery.readyWait > 0 ) {
-			return;
-		}
-
-		// If there are functions bound, to execute
-		readyList.resolveWith( document, [ jQuery ] );
-	}
-} );
-
-jQuery.ready.then = readyList.then;
-
-// The ready event handler and self cleanup method
-function completed() {
-	document.removeEventListener( "DOMContentLoaded", completed );
-	window.removeEventListener( "load", completed );
-	jQuery.ready();
-}
-
-// Catch cases where $(document).ready() is called
-// after the browser event has already occurred.
-// Support: IE <=9 - 10 only
-// Older IE sometimes signals "interactive" too soon
-if ( document.readyState === "complete" ||
-	( document.readyState !== "loading" && !document.documentElement.doScroll ) ) {
-
-	// Handle it asynchronously to allow scripts the opportunity to delay ready
-	window.setTimeout( jQuery.ready );
-
-} else {
-
-	// Use the handy event callback
-	document.addEventListener( "DOMContentLoaded", completed );
-
-	// A fallback to window.onload, that will always work
-	window.addEventListener( "load", completed );
-}
-
-
-
-
-// Multifunctional method to get and set values of a collection
-// The value/s can optionally be executed if it's a function
-var access = function( elems, fn, key, value, chainable, emptyGet, raw ) {
-	var i = 0,
-		len = elems.length,
-		bulk = key == null;
-
-	// Sets many values
-	if ( toType( key ) === "object" ) {
-		chainable = true;
-		for ( i in key ) {
-			access( elems, fn, i, key[ i ], true, emptyGet, raw );
-		}
-
-	// Sets one value
-	} else if ( value !== undefined ) {
-		chainable = true;
-
-		if ( !isFunction( value ) ) {
-			raw = true;
-		}
-
-		if ( bulk ) {
-
-			// Bulk operations run against the entire set
-			if ( raw ) {
-				fn.call( elems, value );
-				fn = null;
-
-			// ...except when executing function values
-			} else {
-				bulk = fn;
-				fn = function( elem, key, value ) {
-					return bulk.call( jQuery( elem ), value );
-				};
-			}
-		}
-
-		if ( fn ) {
-			for ( ; i < len; i++ ) {
-				fn(
-					elems[ i ], key, raw ?
-					value :
-					value.call( elems[ i ], i, fn( elems[ i ], key ) )
-				);
-			}
-		}
-	}
-
-	if ( chainable ) {
-		return elems;
-	}
-
-	// Gets
-	if ( bulk ) {
-		return fn.call( elems );
-	}
-
-	return len ? fn( elems[ 0 ], key ) : emptyGet;
-};
-
-
-// Matches dashed string for camelizing
-var rmsPrefix = /^-ms-/,
-	rdashAlpha = /-([a-z])/g;
-
-// Used by camelCase as callback to replace()
-function fcamelCase( all, letter ) {
-	return letter.toUpperCase();
-}
-
-// Convert dashed to camelCase; used by the css and data modules
-// Support: IE <=9 - 11, Edge 12 - 15
-// Microsoft forgot to hump their vendor prefix (#9572)
-function camelCase( string ) {
-	return string.replace( rmsPrefix, "ms-" ).replace( rdashAlpha, fcamelCase );
-}
-var acceptData = function( owner ) {
-
-	// Accepts only:
-	//  - Node
-	//    - Node.ELEMENT_NODE
-	//    - Node.DOCUMENT_NODE
-	//  - Object
-	//    - Any
-	return owner.nodeType === 1 || owner.nodeType === 9 || !( +owner.nodeType );
-};
-
-
-
-
-function Data() {
-	this.expando = jQuery.expando + Data.uid++;
-}
-
-Data.uid = 1;
-
-Data.prototype = {
-
-	cache: function( owner ) {
-
-		// Check if the owner object already has a cache
-		var value = owner[ this.expando ];
-
-		// If not, create one
-		if ( !value ) {
-			value = {};
-
-			// We can accept data for non-element nodes in modern browsers,
-			// but we should not, see #8335.
-			// Always return an empty object.
-			if ( acceptData( owner ) ) {
-
-				// If it is a node unlikely to be stringify-ed or looped over
-				// use plain assignment
-				if ( owner.nodeType ) {
-					owner[ this.expando ] = value;
-
-				// Otherwise secure it in a non-enumerable property
-				// configurable must be true to allow the property to be
-				// deleted when data is removed
-				} else {
-					Object.defineProperty( owner, this.expando, {
-						value: value,
-						configurable: true
-					} );
-				}
-			}
-		}
-
-		return value;
-	},
-	set: function( owner, data, value ) {
-		var prop,
-			cache = this.cache( owner );
-
-		// Handle: [ owner, key, value ] args
-		// Always use camelCase key (gh-2257)
-		if ( typeof data === "string" ) {
-			cache[ camelCase( data ) ] = value;
-
-		// Handle: [ owner, { properties } ] args
-		} else {
-
-			// Copy the properties one-by-one to the cache object
-			for ( prop in data ) {
-				cache[ camelCase( prop ) ] = data[ prop ];
-			}
-		}
-		return cache;
-	},
-	get: function( owner, key ) {
-		return key === undefined ?
-			this.cache( owner ) :
-
-			// Always use camelCase key (gh-2257)
-			owner[ this.expando ] && owner[ this.expando ][ camelCase( key ) ];
-	},
-	access: function( owner, key, value ) {
-
-		// In cases where either:
-		//
-		//   1. No key was specified
-		//   2. A string key was specified, but no value provided
-		//
-		// Take the "read" path and allow the get method to determine
-		// which value to return, respectively either:
-		//
-		//   1. The entire cache object
-		//   2. The data stored at the key
-		//
-		if ( key === undefined ||
-				( ( key && typeof key === "string" ) && value === undefined ) ) {
-
-			return this.get( owner, key );
-		}
-
-		// When the key is not a string, or both a key and value
-		// are specified, set or extend (existing objects) with either:
-		//
-		//   1. An object of properties
-		//   2. A key and value
-		//
-		this.set( owner, key, value );
-
-		// Since the "set" path can have two possible entry points
-		// return the expected data based on which path was taken[*]
-		return value !== undefined ? value : key;
-	},
-	remove: function( owner, key ) {
-		var i,
-			cache = owner[ this.expando ];
-
-		if ( cache === undefined ) {
-			return;
-		}
-
-		if ( key !== undefined ) {
-
-			// Support array or space separated string of keys
-			if ( Array.isArray( key ) ) {
-
-				// If key is an array of keys...
-				// We always set camelCase keys, so remove that.
-				key = key.map( camelCase );
-			} else {
-				key = camelCase( key );
-
-				// If a key with the spaces exists, use it.
-				// Otherwise, create an array by matching non-whitespace
-				key = key in cache ?
-					[ key ] :
-					( key.match( rnothtmlwhite ) || [] );
-			}
-
-			i = key.length;
-
-			while ( i-- ) {
-				delete cache[ key[ i ] ];
-			}
-		}
-
-		// Remove the expando if there's no more data
-		if ( key === undefined || jQuery.isEmptyObject( cache ) ) {
-
-			// Support: Chrome <=35 - 45
-			// Webkit & Blink performance suffers when deleting properties
-			// from DOM nodes, so set to undefined instead
-			// https://bugs.chromium.org/p/chromium/issues/detail?id=378607 (bug restricted)
-			if ( owner.nodeType ) {
-				owner[ this.expando ] = undefined;
-			} else {
-				delete owner[ this.expando ];
-			}
-		}
-	},
-	hasData: function( owner ) {
-		var cache = owner[ this.expando ];
-		return cache !== undefined && !jQuery.isEmptyObject( cache );
-	}
-};
-var dataPriv = new Data();
-
-var dataUser = new Data();
-
-
-
-//	Implementation Summary
-//
-//	1. Enforce API surface and semantic compatibility with 1.9.x branch
-//	2. Improve the module's maintainability by reducing the storage
-//		paths to a single mechanism.
-//	3. Use the same single mechanism to support "private" and "user" data.
-//	4. _Never_ expose "private" data to user code (TODO: Drop _data, _removeData)
-//	5. Avoid exposing implementation details on user objects (eg. expando properties)
-//	6. Provide a clear path for implementation upgrade to WeakMap in 2014
-
-var rbrace = /^(?:\{[\w\W]*\}|\[[\w\W]*\])$/,
-	rmultiDash = /[A-Z]/g;
-
-function getData( data ) {
-	if ( data === "true" ) {
-		return true;
-	}
-
-	if ( data === "false" ) {
-		return false;
-	}
-
-	if ( data === "null" ) {
-		return null;
-	}
-
-	// Only convert to a number if it doesn't change the string
-	if ( data === +data + "" ) {
-		return +data;
-	}
-
-	if ( rbrace.test( data ) ) {
-		return JSON.parse( data );
-	}
-
-	return data;
-}
-
-function dataAttr( elem, key, data ) {
-	var name;
-
-	// If nothing was found internally, try to fetch any
-	// data from the HTML5 data-* attribute
-	if ( data === undefined && elem.nodeType === 1 ) {
-		name = "data-" + key.replace( rmultiDash, "-$&" ).toLowerCase();
-		data = elem.getAttribute( name );
-
-		if ( typeof data === "string" ) {
-			try {
-				data = getData( data );
-			} catch ( e ) {}
-
-			// Make sure we set the data so it isn't changed later
-			dataUser.set( elem, key, data );
-		} else {
-			data = undefined;
-		}
-	}
-	return data;
-}
-
-jQuery.extend( {
-	hasData: function( elem ) {
-		return dataUser.hasData( elem ) || dataPriv.hasData( elem );
-	},
-
-	data: function( elem, name, data ) {
-		return dataUser.access( elem, name, data );
-	},
-
-	removeData: function( elem, name ) {
-		dataUser.remove( elem, name );
-	},
-
-	// TODO: Now that all calls to _data and _removeData have been replaced
-	// with direct calls to dataPriv methods, these can be deprecated.
-	_data: function( elem, name, data ) {
-		return dataPriv.access( elem, name, data );
-	},
-
-	_removeData: function( elem, name ) {
-		dataPriv.remove( elem, name );
-	}
-} );
-
-jQuery.fn.extend( {
-	data: function( key, value ) {
-		var i, name, data,
-			elem = this[ 0 ],
-			attrs = elem && elem.attributes;
-
-		// Gets all values
-		if ( key === undefined ) {
-			if ( this.length ) {
-				data = dataUser.get( elem );
-
-				if ( elem.nodeType === 1 && !dataPriv.get( elem, "hasDataAttrs" ) ) {
-					i = attrs.length;
-					while ( i-- ) {
-
-						// Support: IE 11 only
-						// The attrs elements can be null (#14894)
-						if ( attrs[ i ] ) {
-							name = attrs[ i ].name;
-							if ( name.indexOf( "data-" ) === 0 ) {
-								name = camelCase( name.slice( 5 ) );
-								dataAttr( elem, name, data[ name ] );
-							}
-						}
-					}
-					dataPriv.set( elem, "hasDataAttrs", true );
-				}
-			}
-
-			return data;
-		}
-
-		// Sets multiple values
-		if ( typeof key === "object" ) {
-			return this.each( function() {
-				dataUser.set( this, key );
-			} );
-		}
-
-		return access( this, function( value ) {
-			var data;
-
-			// The calling jQuery object (element matches) is not empty
-			// (and therefore has an element appears at this[ 0 ]) and the
-			// `value` parameter was not undefined. An empty jQuery object
-			// will result in `undefined` for elem = this[ 0 ] which will
-			// throw an exception if an attempt to read a data cache is made.
-			if ( elem && value === undefined ) {
-
-				// Attempt to get data from the cache
-				// The key will always be camelCased in Data
-				data = dataUser.get( elem, key );
-				if ( data !== undefined ) {
-					return data;
-				}
-
-				// Attempt to "discover" the data in
-				// HTML5 custom data-* attrs
-				data = dataAttr( elem, key );
-				if ( data !== undefined ) {
-					return data;
-				}
-
-				// We tried really hard, but the data doesn't exist.
-				return;
-			}
-
-			// Set the data...
-			this.each( function() {
-
-				// We always store the camelCased key
-				dataUser.set( this, key, value );
-			} );
-		}, null, value, arguments.length > 1, null, true );
-	},
-
-	removeData: function( key ) {
-		return this.each( function() {
-			dataUser.remove( this, key );
-		} );
-	}
-} );
-
-
-jQuery.extend( {
-	queue: function( elem, type, data ) {
-		var queue;
-
-		if ( elem ) {
-			type = ( type || "fx" ) + "queue";
-			queue = dataPriv.get( elem, type );
-
-			// Speed up dequeue by getting out quickly if this is just a lookup
-			if ( data ) {
-				if ( !queue || Array.isArray( data ) ) {
-					queue = dataPriv.access( elem, type, jQuery.makeArray( data ) );
-				} else {
-					queue.push( data );
-				}
-			}
-			return queue || [];
-		}
-	},
-
-	dequeue: function( elem, type ) {
-		type = type || "fx";
-
-		var queue = jQuery.queue( elem, type ),
-			startLength = queue.length,
-			fn = queue.shift(),
-			hooks = jQuery._queueHooks( elem, type ),
-			next = function() {
-				jQuery.dequeue( elem, type );
-			};
-
-		// If the fx queue is dequeued, always remove the progress sentinel
-		if ( fn === "inprogress" ) {
-			fn = queue.shift();
-			startLength--;
-		}
-
-		if ( fn ) {
-
-			// Add a progress sentinel to prevent the fx queue from being
-			// automatically dequeued
-			if ( type === "fx" ) {
-				queue.unshift( "inprogress" );
-			}
-
-			// Clear up the last queue stop function
-			delete hooks.stop;
-			fn.call( elem, next, hooks );
-		}
-
-		if ( !startLength && hooks ) {
-			hooks.empty.fire();
-		}
-	},
-
-	// Not public - generate a queueHooks object, or return the current one
-	_queueHooks: function( elem, type ) {
-		var key = type + "queueHooks";
-		return dataPriv.get( elem, key ) || dataPriv.access( elem, key, {
-			empty: jQuery.Callbacks( "once memory" ).add( function() {
-				dataPriv.remove( elem, [ type + "queue", key ] );
-			} )
-		} );
-	}
-} );
-
-jQuery.fn.extend( {
-	queue: function( type, data ) {
-		var setter = 2;
-
-		if ( typeof type !== "string" ) {
-			data = type;
-			type = "fx";
-			setter--;
-		}
-
-		if ( arguments.length < setter ) {
-			return jQuery.queue( this[ 0 ], type );
-		}
-
-		return data === undefined ?
-			this :
-			this.each( function() {
-				var queue = jQuery.queue( this, type, data );
-
-				// Ensure a hooks for this queue
-				jQuery._queueHooks( this, type );
-
-				if ( type === "fx" && queue[ 0 ] !== "inprogress" ) {
-					jQuery.dequeue( this, type );
-				}
-			} );
-	},
-	dequeue: function( type ) {
-		return this.each( function() {
-			jQuery.dequeue( this, type );
-		} );
-	},
-	clearQueue: function( type ) {
-		return this.queue( type || "fx", [] );
-	},
-
-	// Get a promise resolved when queues of a certain type
-	// are emptied (fx is the type by default)
-	promise: function( type, obj ) {
-		var tmp,
-			count = 1,
-			defer = jQuery.Deferred(),
-			elements = this,
-			i = this.length,
-			resolve = function() {
-				if ( !( --count ) ) {
-					defer.resolveWith( elements, [ elements ] );
-				}
-			};
-
-		if ( typeof type !== "string" ) {
-			obj = type;
-			type = undefined;
-		}
-		type = type || "fx";
-
-		while ( i-- ) {
-			tmp = dataPriv.get( elements[ i ], type + "queueHooks" );
-			if ( tmp && tmp.empty ) {
-				count++;
-				tmp.empty.add( resolve );
-			}
-		}
-		resolve();
-		return defer.promise( obj );
-	}
-} );
-var pnum = ( /[+-]?(?:\d*\.|)\d+(?:[eE][+-]?\d+|)/ ).source;
-
-var rcssNum = new RegExp( "^(?:([+-])=|)(" + pnum + ")([a-z%]*)$", "i" );
-
-
-var cssExpand = [ "Top", "Right", "Bottom", "Left" ];
-
-var isHiddenWithinTree = function( elem, el ) {
-
-		// isHiddenWithinTree might be called from jQuery#filter function;
-		// in that case, element will be second argument
-		elem = el || elem;
-
-		// Inline style trumps all
-		return elem.style.display === "none" ||
-			elem.style.display === "" &&
-
-			// Otherwise, check computed style
-			// Support: Firefox <=43 - 45
-			// Disconnected elements can have computed display: none, so first confirm that elem is
-			// in the document.
-			jQuery.contains( elem.ownerDocument, elem ) &&
-
-			jQuery.css( elem, "display" ) === "none";
-	};
-
-var swap = function( elem, options, callback, args ) {
-	var ret, name,
-		old = {};
-
-	// Remember the old values, and insert the new ones
-	for ( name in options ) {
-		old[ name ] = elem.style[ name ];
-		elem.style[ name ] = options[ name ];
-	}
-
-	ret = callback.apply( elem, args || [] );
-
-	// Revert the old values
-	for ( name in options ) {
-		elem.style[ name ] = old[ name ];
-	}
-
-	return ret;
-};
-
-
-
-
-function adjustCSS( elem, prop, valueParts, tween ) {
-	var adjusted, scale,
-		maxIterations = 20,
-		currentValue = tween ?
-			function() {
-				return tween.cur();
-			} :
-			function() {
-				return jQuery.css( elem, prop, "" );
-			},
-		initial = currentValue(),
-		unit = valueParts && valueParts[ 3 ] || ( jQuery.cssNumber[ prop ] ? "" : "px" ),
-
-		// Starting value computation is required for potential unit mismatches
-		initialInUnit = ( jQuery.cssNumber[ prop ] || unit !== "px" && +initial ) &&
-			rcssNum.exec( jQuery.css( elem, prop ) );
-
-	if ( initialInUnit && initialInUnit[ 3 ] !== unit ) {
-
-		// Support: Firefox <=54
-		// Halve the iteration target value to prevent interference from CSS upper bounds (gh-2144)
-		initial = initial / 2;
-
-		// Trust units reported by jQuery.css
-		unit = unit || initialInUnit[ 3 ];
-
-		// Iteratively approximate from a nonzero starting point
-		initialInUnit = +initial || 1;
-
-		while ( maxIterations-- ) {
-
-			// Evaluate and update our best guess (doubling guesses that zero out).
-			// Finish if the scale equals or crosses 1 (making the old*new product non-positive).
-			jQuery.style( elem, prop, initialInUnit + unit );
-			if ( ( 1 - scale ) * ( 1 - ( scale = currentValue() / initial || 0.5 ) ) <= 0 ) {
-				maxIterations = 0;
-			}
-			initialInUnit = initialInUnit / scale;
-
-		}
-
-		initialInUnit = initialInUnit * 2;
-		jQuery.style( elem, prop, initialInUnit + unit );
-
-		// Make sure we update the tween properties later on
-		valueParts = valueParts || [];
-	}
-
-	if ( valueParts ) {
-		initialInUnit = +initialInUnit || +initial || 0;
-
-		// Apply relative offset (+=/-=) if specified
-		adjusted = valueParts[ 1 ] ?
-			initialInUnit + ( valueParts[ 1 ] + 1 ) * valueParts[ 2 ] :
-			+valueParts[ 2 ];
-		if ( tween ) {
-			tween.unit = unit;
-			tween.start = initialInUnit;
-			tween.end = adjusted;
-		}
-	}
-	return adjusted;
-}
-
-
-var defaultDisplayMap = {};
-
-function getDefaultDisplay( elem ) {
-	var temp,
-		doc = elem.ownerDocument,
-		nodeName = elem.nodeName,
-		display = defaultDisplayMap[ nodeName ];
-
-	if ( display ) {
-		return display;
-	}
-
-	temp = doc.body.appendChild( doc.createElement( nodeName ) );
-	display = jQuery.css( temp, "display" );
-
-	temp.parentNode.removeChild( temp );
-
-	if ( display === "none" ) {
-		display = "block";
-	}
-	defaultDisplayMap[ nodeName ] = display;
-
-	return display;
-}
-
-function showHide( elements, show ) {
-	var display, elem,
-		values = [],
-		index = 0,
-		length = elements.length;
-
-	// Determine new display value for elements that need to change
-	for ( ; index < length; index++ ) {
-		elem = elements[ index ];
-		if ( !elem.style ) {
-			continue;
-		}
-
-		display = elem.style.display;
-		if ( show ) {
-
-			// Since we force visibility upon cascade-hidden elements, an immediate (and slow)
-			// check is required in this first loop unless we have a nonempty display value (either
-			// inline or about-to-be-restored)
-			if ( display === "none" ) {
-				values[ index ] = dataPriv.get( elem, "display" ) || null;
-				if ( !values[ index ] ) {
-					elem.style.display = "";
-				}
-			}
-			if ( elem.style.display === "" && isHiddenWithinTree( elem ) ) {
-				values[ index ] = getDefaultDisplay( elem );
-			}
-		} else {
-			if ( display !== "none" ) {
-				values[ index ] = "none";
-
-				// Remember what we're overwriting
-				dataPriv.set( elem, "display", display );
-			}
-		}
-	}
-
-	// Set the display of the elements in a second loop to avoid constant reflow
-	for ( index = 0; index < length; index++ ) {
-		if ( values[ index ] != null ) {
-			elements[ index ].style.display = values[ index ];
-		}
-	}
-
-	return elements;
-}
-
-jQuery.fn.extend( {
-	show: function() {
-		return showHide( this, true );
-	},
-	hide: function() {
-		return showHide( this );
-	},
-	toggle: function( state ) {
-		if ( typeof state === "boolean" ) {
-			return state ? this.show() : this.hide();
-		}
-
-		return this.each( function() {
-			if ( isHiddenWithinTree( this ) ) {
-				jQuery( this ).show();
-			} else {
-				jQuery( this ).hide();
-			}
-		} );
-	}
-} );
-var rcheckableType = ( /^(?:checkbox|radio)$/i );
-
-var rtagName = ( /<([a-z][^\/\0>\x20\t\r\n\f]+)/i );
-
-var rscriptType = ( /^$|^module$|\/(?:java|ecma)script/i );
-
-
-
-// We have to close these tags to support XHTML (#13200)
-var wrapMap = {
-
-	// Support: IE <=9 only
-	option: [ 1, "<select multiple='multiple'>", "</select>" ],
-
-	// XHTML parsers do not magically insert elements in the
-	// same way that tag soup parsers do. So we cannot shorten
-	// this by omitting <tbody> or other required elements.
-	thead: [ 1, "<table>", "</table>" ],
-	col: [ 2, "<table><colgroup>", "</colgroup></table>" ],
-	tr: [ 2, "<table><tbody>", "</tbody></table>" ],
-	td: [ 3, "<table><tbody><tr>", "</tr></tbody></table>" ],
-
-	_default: [ 0, "", "" ]
-};
-
-// Support: IE <=9 only
-wrapMap.optgroup = wrapMap.option;
-
-wrapMap.tbody = wrapMap.tfoot = wrapMap.colgroup = wrapMap.caption = wrapMap.thead;
-wrapMap.th = wrapMap.td;
-
-
-function getAll( context, tag ) {
-
-	// Support: IE <=9 - 11 only
-	// Use typeof to avoid zero-argument method invocation on host objects (#15151)
-	var ret;
-
-	if ( typeof context.getElementsByTagName !== "undefined" ) {
-		ret = context.getElementsByTagName( tag || "*" );
-
-	} else if ( typeof context.querySelectorAll !== "undefined" ) {
-		ret = context.querySelectorAll( tag || "*" );
-
-	} else {
-		ret = [];
-	}
-
-	if ( tag === undefined || tag && nodeName( context, tag ) ) {
-		return jQuery.merge( [ context ], ret );
-	}
-
-	return ret;
-}
-
-
-// Mark scripts as having already been evaluated
-function setGlobalEval( elems, refElements ) {
-	var i = 0,
-		l = elems.length;
-
-	for ( ; i < l; i++ ) {
-		dataPriv.set(
-			elems[ i ],
-			"globalEval",
-			!refElements || dataPriv.get( refElements[ i ], "globalEval" )
-		);
-	}
-}
-
-
-var rhtml = /<|&#?\w+;/;
-
-function buildFragment( elems, context, scripts, selection, ignored ) {
-	var elem, tmp, tag, wrap, contains, j,
-		fragment = context.createDocumentFragment(),
-		nodes = [],
-		i = 0,
-		l = elems.length;
-
-	for ( ; i < l; i++ ) {
-		elem = elems[ i ];
-
-		if ( elem || elem === 0 ) {
-
-			// Add nodes directly
-			if ( toType( elem ) === "object" ) {
-
-				// Support: Android <=4.0 only, PhantomJS 1 only
-				// push.apply(_, arraylike) throws on ancient WebKit
-				jQuery.merge( nodes, elem.nodeType ? [ elem ] : elem );
-
-			// Convert non-html into a text node
-			} else if ( !rhtml.test( elem ) ) {
-				nodes.push( context.createTextNode( elem ) );
-
-			// Convert html into DOM nodes
-			} else {
-				tmp = tmp || fragment.appendChild( context.createElement( "div" ) );
-
-				// Deserialize a standard representation
-				tag = ( rtagName.exec( elem ) || [ "", "" ] )[ 1 ].toLowerCase();
-				wrap = wrapMap[ tag ] || wrapMap._default;
-				tmp.innerHTML = wrap[ 1 ] + jQuery.htmlPrefilter( elem ) + wrap[ 2 ];
-
-				// Descend through wrappers to the right content
-				j = wrap[ 0 ];
-				while ( j-- ) {
-					tmp = tmp.lastChild;
-				}
-
-				// Support: Android <=4.0 only, PhantomJS 1 only
-				// push.apply(_, arraylike) throws on ancient WebKit
-				jQuery.merge( nodes, tmp.childNodes );
-
-				// Remember the top-level container
-				tmp = fragment.firstChild;
-
-				// Ensure the created nodes are orphaned (#12392)
-				tmp.textContent = "";
-			}
-		}
-	}
-
-	// Remove wrapper from fragment
-	fragment.textContent = "";
-
-	i = 0;
-	while ( ( elem = nodes[ i++ ] ) ) {
-
-		// Skip elements already in the context collection (trac-4087)
-		if ( selection && jQuery.inArray( elem, selection ) > -1 ) {
-			if ( ignored ) {
-				ignored.push( elem );
-			}
-			continue;
-		}
-
-		contains = jQuery.contains( elem.ownerDocument, elem );
-
-		// Append to fragment
-		tmp = getAll( fragment.appendChild( elem ), "script" );
-
-		// Preserve script evaluation history
-		if ( contains ) {
-			setGlobalEval( tmp );
-		}
-
-		// Capture executables
-		if ( scripts ) {
-			j = 0;
-			while ( ( elem = tmp[ j++ ] ) ) {
-				if ( rscriptType.test( elem.type || "" ) ) {
-					scripts.push( elem );
-				}
-			}
-		}
-	}
-
-	return fragment;
-}
-
-
-( function() {
-	var fragment = document.createDocumentFragment(),
-		div = fragment.appendChild( document.createElement( "div" ) ),
-		input = document.createElement( "input" );
-
-	// Support: Android 4.0 - 4.3 only
-	// Check state lost if the name is set (#11217)
-	// Support: Windows Web Apps (WWA)
-	// `name` and `type` must use .setAttribute for WWA (#14901)
-	input.setAttribute( "type", "radio" );
-	input.setAttribute( "checked", "checked" );
-	input.setAttribute( "name", "t" );
-
-	div.appendChild( input );
-
-	// Support: Android <=4.1 only
-	// Older WebKit doesn't clone checked state correctly in fragments
-	support.checkClone = div.cloneNode( true ).cloneNode( true ).lastChild.checked;
-
-	// Support: IE <=11 only
-	// Make sure textarea (and checkbox) defaultValue is properly cloned
-	div.innerHTML = "<textarea>x</textarea>";
-	support.noCloneChecked = !!div.cloneNode( true ).lastChild.defaultValue;
-} )();
-var documentElement = document.documentElement;
-
-
-
-var
-	rkeyEvent = /^key/,
-	rmouseEvent = /^(?:mouse|pointer|contextmenu|drag|drop)|click/,
-	rtypenamespace = /^([^.]*)(?:\.(.+)|)/;
-
-function returnTrue() {
-	return true;
-}
-
-function returnFalse() {
-	return false;
-}
-
-// Support: IE <=9 only
-// See #13393 for more info
-function safeActiveElement() {
-	try {
-		return document.activeElement;
-	} catch ( err ) { }
-}
-
-function on( elem, types, selector, data, fn, one ) {
-	var origFn, type;
-
-	// Types can be a map of types/handlers
-	if ( typeof types === "object" ) {
-
-		// ( types-Object, selector, data )
-		if ( typeof selector !== "string" ) {
-
-			// ( types-Object, data )
-			data = data || selector;
-			selector = undefined;
-		}
-		for ( type in types ) {
-			on( elem, type, selector, data, types[ type ], one );
-		}
-		return elem;
-	}
-
-	if ( data == null && fn == null ) {
-
-		// ( types, fn )
-		fn = selector;
-		data = selector = undefined;
-	} else if ( fn == null ) {
-		if ( typeof selector === "string" ) {
-
-			// ( types, selector, fn )
-			fn = data;
-			data = undefined;
-		} else {
-
-			// ( types, data, fn )
-			fn = data;
-			data = selector;
-			selector = undefined;
-		}
-	}
-	if ( fn === false ) {
-		fn = returnFalse;
-	} else if ( !fn ) {
-		return elem;
-	}
-
-	if ( one === 1 ) {
-		origFn = fn;
-		fn = function( event ) {
-
-			// Can use an empty set, since event contains the info
-			jQuery().off( event );
-			return origFn.apply( this, arguments );
-		};
-
-		// Use same guid so caller can remove using origFn
-		fn.guid = origFn.guid || ( origFn.guid = jQuery.guid++ );
-	}
-	return elem.each( function() {
-		jQuery.event.add( this, types, fn, data, selector );
-	} );
-}
-
-/*
- * Helper functions for managing events -- not part of the public interface.
- * Props to Dean Edwards' addEvent library for many of the ideas.
- */
-jQuery.event = {
-
-	global: {},
-
-	add: function( elem, types, handler, data, selector ) {
-
-		var handleObjIn, eventHandle, tmp,
-			events, t, handleObj,
-			special, handlers, type, namespaces, origType,
-			elemData = dataPriv.get( elem );
-
-		// Don't attach events to noData or text/comment nodes (but allow plain objects)
-		if ( !elemData ) {
-			return;
-		}
-
-		// Caller can pass in an object of custom data in lieu of the handler
-		if ( handler.handler ) {
-			handleObjIn = handler;
-			handler = handleObjIn.handler;
-			selector = handleObjIn.selector;
-		}
-
-		// Ensure that invalid selectors throw exceptions at attach time
-		// Evaluate against documentElement in case elem is a non-element node (e.g., document)
-		if ( selector ) {
-			jQuery.find.matchesSelector( documentElement, selector );
-		}
-
-		// Make sure that the handler has a unique ID, used to find/remove it later
-		if ( !handler.guid ) {
-			handler.guid = jQuery.guid++;
-		}
-
-		// Init the element's event structure and main handler, if this is the first
-		if ( !( events = elemData.events ) ) {
-			events = elemData.events = {};
-		}
-		if ( !( eventHandle = elemData.handle ) ) {
-			eventHandle = elemData.handle = function( e ) {
-
-				// Discard the second event of a jQuery.event.trigger() and
-				// when an event is called after a page has unloaded
-				return typeof jQuery !== "undefined" && jQuery.event.triggered !== e.type ?
-					jQuery.event.dispatch.apply( elem, arguments ) : undefined;
-			};
-		}
-
-		// Handle multiple events separated by a space
-		types = ( types || "" ).match( rnothtmlwhite ) || [ "" ];
-		t = types.length;
-		while ( t-- ) {
-			tmp = rtypenamespace.exec( types[ t ] ) || [];
-			type = origType = tmp[ 1 ];
-			namespaces = ( tmp[ 2 ] || "" ).split( "." ).sort();
-
-			// There *must* be a type, no attaching namespace-only handlers
-			if ( !type ) {
-				continue;
-			}
-
-			// If event changes its type, use the special event handlers for the changed type
-			special = jQuery.event.special[ type ] || {};
-
-			// If selector defined, determine special event api type, otherwise given type
-			type = ( selector ? special.delegateType : special.bindType ) || type;
-
-			// Update special based on newly reset type
-			special = jQuery.event.special[ type ] || {};
-
-			// handleObj is passed to all event handlers
-			handleObj = jQuery.extend( {
-				type: type,
-				origType: origType,
-				data: data,
-				handler: handler,
-				guid: handler.guid,
-				selector: selector,
-				needsContext: selector && jQuery.expr.match.needsContext.test( selector ),
-				namespace: namespaces.join( "." )
-			}, handleObjIn );
-
-			// Init the event handler queue if we're the first
-			if ( !( handlers = events[ type ] ) ) {
-				handlers = events[ type ] = [];
-				handlers.delegateCount = 0;
-
-				// Only use addEventListener if the special events handler returns false
-				if ( !special.setup ||
-					special.setup.call( elem, data, namespaces, eventHandle ) === false ) {
-
-					if ( elem.addEventListener ) {
-						elem.addEventListener( type, eventHandle );
-					}
-				}
-			}
-
-			if ( special.add ) {
-				special.add.call( elem, handleObj );
-
-				if ( !handleObj.handler.guid ) {
-					handleObj.handler.guid = handler.guid;
-				}
-			}
-
-			// Add to the element's handler list, delegates in front
-			if ( selector ) {
-				handlers.splice( handlers.delegateCount++, 0, handleObj );
-			} else {
-				handlers.push( handleObj );
-			}
-
-			// Keep track of which events have ever been used, for event optimization
-			jQuery.event.global[ type ] = true;
-		}
-
-	},
-
-	// Detach an event or set of events from an element
-	remove: function( elem, types, handler, selector, mappedTypes ) {
-
-		var j, origCount, tmp,
-			events, t, handleObj,
-			special, handlers, type, namespaces, origType,
-			elemData = dataPriv.hasData( elem ) && dataPriv.get( elem );
-
-		if ( !elemData || !( events = elemData.events ) ) {
-			return;
-		}
-
-		// Once for each type.namespace in types; type may be omitted
-		types = ( types || "" ).match( rnothtmlwhite ) || [ "" ];
-		t = types.length;
-		while ( t-- ) {
-			tmp = rtypenamespace.exec( types[ t ] ) || [];
-			type = origType = tmp[ 1 ];
-			namespaces = ( tmp[ 2 ] || "" ).split( "." ).sort();
-
-			// Unbind all events (on this namespace, if provided) for the element
-			if ( !type ) {
-				for ( type in events ) {
-					jQuery.event.remove( elem, type + types[ t ], handler, selector, true );
-				}
-				continue;
-			}
-
-			special = jQuery.event.special[ type ] || {};
-			type = ( selector ? special.delegateType : special.bindType ) || type;
-			handlers = events[ type ] || [];
-			tmp = tmp[ 2 ] &&
-				new RegExp( "(^|\\.)" + namespaces.join( "\\.(?:.*\\.|)" ) + "(\\.|$)" );
-
-			// Remove matching events
-			origCount = j = handlers.length;
-			while ( j-- ) {
-				handleObj = handlers[ j ];
-
-				if ( ( mappedTypes || origType === handleObj.origType ) &&
-					( !handler || handler.guid === handleObj.guid ) &&
-					( !tmp || tmp.test( handleObj.namespace ) ) &&
-					( !selector || selector === handleObj.selector ||
-						selector === "**" && handleObj.selector ) ) {
-					handlers.splice( j, 1 );
-
-					if ( handleObj.selector ) {
-						handlers.delegateCount--;
-					}
-					if ( special.remove ) {
-						special.remove.call( elem, handleObj );
-					}
-				}
-			}
-
-			// Remove generic event handler if we removed something and no more handlers exist
-			// (avoids potential for endless recursion during removal of special event handlers)
-			if ( origCount && !handlers.length ) {
-				if ( !special.teardown ||
-					special.teardown.call( elem, namespaces, elemData.handle ) === false ) {
-
-					jQuery.removeEvent( elem, type, elemData.handle );
-				}
-
-				delete events[ type ];
-			}
-		}
-
-		// Remove data and the expando if it's no longer used
-		if ( jQuery.isEmptyObject( events ) ) {
-			dataPriv.remove( elem, "handle events" );
-		}
-	},
-
-	dispatch: function( nativeEvent ) {
-
-		// Make a writable jQuery.Event from the native event object
-		var event = jQuery.event.fix( nativeEvent );
-
-		var i, j, ret, matched, handleObj, handlerQueue,
-			args = new Array( arguments.length ),
-			handlers = ( dataPriv.get( this, "events" ) || {} )[ event.type ] || [],
-			special = jQuery.event.special[ event.type ] || {};
-
-		// Use the fix-ed jQuery.Event rather than the (read-only) native event
-		args[ 0 ] = event;
-
-		for ( i = 1; i < arguments.length; i++ ) {
-			args[ i ] = arguments[ i ];
-		}
-
-		event.delegateTarget = this;
-
-		// Call the preDispatch hook for the mapped type, and let it bail if desired
-		if ( special.preDispatch && special.preDispatch.call( this, event ) === false ) {
-			return;
-		}
-
-		// Determine handlers
-		handlerQueue = jQuery.event.handlers.call( this, event, handlers );
-
-		// Run delegates first; they may want to stop propagation beneath us
-		i = 0;
-		while ( ( matched = handlerQueue[ i++ ] ) && !event.isPropagationStopped() ) {
-			event.currentTarget = matched.elem;
-
-			j = 0;
-			while ( ( handleObj = matched.handlers[ j++ ] ) &&
-				!event.isImmediatePropagationStopped() ) {
-
-				// Triggered event must either 1) have no namespace, or 2) have namespace(s)
-				// a subset or equal to those in the bound event (both can have no namespace).
-				if ( !event.rnamespace || event.rnamespace.test( handleObj.namespace ) ) {
-
-					event.handleObj = handleObj;
-					event.data = handleObj.data;
-
-					ret = ( ( jQuery.event.special[ handleObj.origType ] || {} ).handle ||
-						handleObj.handler ).apply( matched.elem, args );
-
-					if ( ret !== undefined ) {
-						if ( ( event.result = ret ) === false ) {
-							event.preventDefault();
-							event.stopPropagation();
-						}
-					}
-				}
-			}
-		}
-
-		// Call the postDispatch hook for the mapped type
-		if ( special.postDispatch ) {
-			special.postDispatch.call( this, event );
-		}
-
-		return event.result;
-	},
-
-	handlers: function( event, handlers ) {
-		var i, handleObj, sel, matchedHandlers, matchedSelectors,
-			handlerQueue = [],
-			delegateCount = handlers.delegateCount,
-			cur = event.target;
-
-		// Find delegate handlers
-		if ( delegateCount &&
-
-			// Support: IE <=9
-			// Black-hole SVG <use> instance trees (trac-13180)
-			cur.nodeType &&
-
-			// Support: Firefox <=42
-			// Suppress spec-violating clicks indicating a non-primary pointer button (trac-3861)
-			// https://www.w3.org/TR/DOM-Level-3-Events/#event-type-click
-			// Support: IE 11 only
-			// ...but not arrow key "clicks" of radio inputs, which can have `button` -1 (gh-2343)
-			!( event.type === "click" && event.button >= 1 ) ) {
-
-			for ( ; cur !== this; cur = cur.parentNode || this ) {
-
-				// Don't check non-elements (#13208)
-				// Don't process clicks on disabled elements (#6911, #8165, #11382, #11764)
-				if ( cur.nodeType === 1 && !( event.type === "click" && cur.disabled === true ) ) {
-					matchedHandlers = [];
-					matchedSelectors = {};
-					for ( i = 0; i < delegateCount; i++ ) {
-						handleObj = handlers[ i ];
-
-						// Don't conflict with Object.prototype properties (#13203)
-						sel = handleObj.selector + " ";
-
-						if ( matchedSelectors[ sel ] === undefined ) {
-							matchedSelectors[ sel ] = handleObj.needsContext ?
-								jQuery( sel, this ).index( cur ) > -1 :
-								jQuery.find( sel, this, null, [ cur ] ).length;
-						}
-						if ( matchedSelectors[ sel ] ) {
-							matchedHandlers.push( handleObj );
-						}
-					}
-					if ( matchedHandlers.length ) {
-						handlerQueue.push( { elem: cur, handlers: matchedHandlers } );
-					}
-				}
-			}
-		}
-
-		// Add the remaining (directly-bound) handlers
-		cur = this;
-		if ( delegateCount < handlers.length ) {
-			handlerQueue.push( { elem: cur, handlers: handlers.slice( delegateCount ) } );
-		}
-
-		return handlerQueue;
-	},
-
-	addProp: function( name, hook ) {
-		Object.defineProperty( jQuery.Event.prototype, name, {
-			enumerable: true,
-			configurable: true,
-
-			get: isFunction( hook ) ?
-				function() {
-					if ( this.originalEvent ) {
-							return hook( this.originalEvent );
-					}
-				} :
-				function() {
-					if ( this.originalEvent ) {
-							return this.originalEvent[ name ];
-					}
-				},
-
-			set: function( value ) {
-				Object.defineProperty( this, name, {
-					enumerable: true,
-					configurable: true,
-					writable: true,
-					value: value
-				} );
-			}
-		} );
-	},
-
-	fix: function( originalEvent ) {
-		return originalEvent[ jQuery.expando ] ?
-			originalEvent :
-			new jQuery.Event( originalEvent );
-	},
-
-	special: {
-		load: {
-
-			// Prevent triggered image.load events from bubbling to window.load
-			noBubble: true
-		},
-		focus: {
-
-			// Fire native event if possible so blur/focus sequence is correct
-			trigger: function() {
-				if ( this !== safeActiveElement() && this.focus ) {
-					this.focus();
-					return false;
-				}
-			},
-			delegateType: "focusin"
-		},
-		blur: {
-			trigger: function() {
-				if ( this === safeActiveElement() && this.blur ) {
-					this.blur();
-					return false;
-				}
-			},
-			delegateType: "focusout"
-		},
-		click: {
-
-			// For checkbox, fire native event so checked state will be right
-			trigger: function() {
-				if ( this.type === "checkbox" && this.click && nodeName( this, "input" ) ) {
-					this.click();
-					return false;
-				}
-			},
-
-			// For cross-browser consistency, don't fire native .click() on links
-			_default: function( event ) {
-				return nodeName( event.target, "a" );
-			}
-		},
-
-		beforeunload: {
-			postDispatch: function( event ) {
-
-				// Support: Firefox 20+
-				// Firefox doesn't alert if the returnValue field is not set.
-				if ( event.result !== undefined && event.originalEvent ) {
-					event.originalEvent.returnValue = event.result;
-				}
-			}
-		}
-	}
-};
-
-jQuery.removeEvent = function( elem, type, handle ) {
-
-	// This "if" is needed for plain objects
-	if ( elem.removeEventListener ) {
-		elem.removeEventListener( type, handle );
-	}
-};
-
-jQuery.Event = function( src, props ) {
-
-	// Allow instantiation without the 'new' keyword
-	if ( !( this instanceof jQuery.Event ) ) {
-		return new jQuery.Event( src, props );
-	}
-
-	// Event object
-	if ( src && src.type ) {
-		this.originalEvent = src;
-		this.type = src.type;
-
-		// Events bubbling up the document may have been marked as prevented
-		// by a handler lower down the tree; reflect the correct value.
-		this.isDefaultPrevented = src.defaultPrevented ||
-				src.defaultPrevented === undefined &&
-
-				// Support: Android <=2.3 only
-				src.returnValue === false ?
-			returnTrue :
-			returnFalse;
-
-		// Create target properties
-		// Support: Safari <=6 - 7 only
-		// Target should not be a text node (#504, #13143)
-		this.target = ( src.target && src.target.nodeType === 3 ) ?
-			src.target.parentNode :
-			src.target;
-
-		this.currentTarget = src.currentTarget;
-		this.relatedTarget = src.relatedTarget;
-
-	// Event type
-	} else {
-		this.type = src;
-	}
-
-	// Put explicitly provided properties onto the event object
-	if ( props ) {
-		jQuery.extend( this, props );
-	}
-
-	// Create a timestamp if incoming event doesn't have one
-	this.timeStamp = src && src.timeStamp || Date.now();
-
-	// Mark it as fixed
-	this[ jQuery.expando ] = true;
-};
-
-// jQuery.Event is based on DOM3 Events as specified by the ECMAScript Language Binding
-// https://www.w3.org/TR/2003/WD-DOM-Level-3-Events-20030331/ecma-script-binding.html
-jQuery.Event.prototype = {
-	constructor: jQuery.Event,
-	isDefaultPrevented: returnFalse,
-	isPropagationStopped: returnFalse,
-	isImmediatePropagationStopped: returnFalse,
-	isSimulated: false,
-
-	preventDefault: function() {
-		var e = this.originalEvent;
-
-		this.isDefaultPrevented = returnTrue;
-
-		if ( e && !this.isSimulated ) {
-			e.preventDefault();
-		}
-	},
-	stopPropagation: function() {
-		var e = this.originalEvent;
-
-		this.isPropagationStopped = returnTrue;
-
-		if ( e && !this.isSimulated ) {
-			e.stopPropagation();
-		}
-	},
-	stopImmediatePropagation: function() {
-		var e = this.originalEvent;
-
-		this.isImmediatePropagationStopped = returnTrue;
-
-		if ( e && !this.isSimulated ) {
-			e.stopImmediatePropagation();
-		}
-
-		this.stopPropagation();
-	}
-};
-
-// Includes all common event props including KeyEvent and MouseEvent specific props
-jQuery.each( {
-	altKey: true,
-	bubbles: true,
-	cancelable: true,
-	changedTouches: true,
-	ctrlKey: true,
-	detail: true,
-	eventPhase: true,
-	metaKey: true,
-	pageX: true,
-	pageY: true,
-	shiftKey: true,
-	view: true,
-	"char": true,
-	charCode: true,
-	key: true,
-	keyCode: true,
-	button: true,
-	buttons: true,
-	clientX: true,
-	clientY: true,
-	offsetX: true,
-	offsetY: true,
-	pointerId: true,
-	pointerType: true,
-	screenX: true,
-	screenY: true,
-	targetTouches: true,
-	toElement: true,
-	touches: true,
-
-	which: function( event ) {
-		var button = event.button;
-
-		// Add which for key events
-		if ( event.which == null && rkeyEvent.test( event.type ) ) {
-			return event.charCode != null ? event.charCode : event.keyCode;
-		}
-
-		// Add which for click: 1 === left; 2 === middle; 3 === right
-		if ( !event.which && button !== undefined && rmouseEvent.test( event.type ) ) {
-			if ( button & 1 ) {
-				return 1;
-			}
-
-			if ( button & 2 ) {
-				return 3;
-			}
-
-			if ( button & 4 ) {
-				return 2;
-			}
-
-			return 0;
-		}
-
-		return event.which;
-	}
-}, jQuery.event.addProp );
-
-// Create mouseenter/leave events using mouseover/out and event-time checks
-// so that event delegation works in jQuery.
-// Do the same for pointerenter/pointerleave and pointerover/pointerout
-//
-// Support: Safari 7 only
-// Safari sends mouseenter too often; see:
-// https://bugs.chromium.org/p/chromium/issues/detail?id=470258
-// for the description of the bug (it existed in older Chrome versions as well).
-jQuery.each( {
-	mouseenter: "mouseover",
-	mouseleave: "mouseout",
-	pointerenter: "pointerover",
-	pointerleave: "pointerout"
-}, function( orig, fix ) {
-	jQuery.event.special[ orig ] = {
-		delegateType: fix,
-		bindType: fix,
-
-		handle: function( event ) {
-			var ret,
-				target = this,
-				related = event.relatedTarget,
-				handleObj = event.handleObj;
-
-			// For mouseenter/leave call the handler if related is outside the target.
-			// NB: No relatedTarget if the mouse left/entered the browser window
-			if ( !related || ( related !== target && !jQuery.contains( target, related ) ) ) {
-				event.type = handleObj.origType;
-				ret = handleObj.handler.apply( this, arguments );
-				event.type = fix;
-			}
-			return ret;
-		}
-	};
-} );
-
-jQuery.fn.extend( {
-
-	on: function( types, selector, data, fn ) {
-		return on( this, types, selector, data, fn );
-	},
-	one: function( types, selector, data, fn ) {
-		return on( this, types, selector, data, fn, 1 );
-	},
-	off: function( types, selector, fn ) {
-		var handleObj, type;
-		if ( types && types.preventDefault && types.handleObj ) {
-
-			// ( event )  dispatched jQuery.Event
-			handleObj = types.handleObj;
-			jQuery( types.delegateTarget ).off(
-				handleObj.namespace ?
-					handleObj.origType + "." + handleObj.namespace :
-					handleObj.origType,
-				handleObj.selector,
-				handleObj.handler
-			);
-			return this;
-		}
-		if ( typeof types === "object" ) {
-
-			// ( types-object [, selector] )
-			for ( type in types ) {
-				this.off( type, selector, types[ type ] );
-			}
-			return this;
-		}
-		if ( selector === false || typeof selector === "function" ) {
-
-			// ( types [, fn] )
-			fn = selector;
-			selector = undefined;
-		}
-		if ( fn === false ) {
-			fn = returnFalse;
-		}
-		return this.each( function() {
-			jQuery.event.remove( this, types, fn, selector );
-		} );
-	}
-} );
-
-
-var
-
-	/* eslint-disable max-len */
-
-	// See https://github.com/eslint/eslint/issues/3229
-	rxhtmlTag = /<(?!area|br|col|embed|hr|img|input|link|meta|param)(([a-z][^\/\0>\x20\t\r\n\f]*)[^>]*)\/>/gi,
-
-	/* eslint-enable */
-
-	// Support: IE <=10 - 11, Edge 12 - 13 only
-	// In IE/Edge using regex groups here causes severe slowdowns.
-	// See https://connect.microsoft.com/IE/feedback/details/1736512/
-	rnoInnerhtml = /<script|<style|<link/i,
-
-	// checked="checked" or checked
-	rchecked = /checked\s*(?:[^=]|=\s*.checked.)/i,
-	rcleanScript = /^\s*<!(?:\[CDATA\[|--)|(?:\]\]|--)>\s*$/g;
-
-// Prefer a tbody over its parent table for containing new rows
-function manipulationTarget( elem, content ) {
-	if ( nodeName( elem, "table" ) &&
-		nodeName( content.nodeType !== 11 ? content : content.firstChild, "tr" ) ) {
-
-		return jQuery( elem ).children( "tbody" )[ 0 ] || elem;
-	}
-
-	return elem;
-}
-
-// Replace/restore the type attribute of script elements for safe DOM manipulation
-function disableScript( elem ) {
-	elem.type = ( elem.getAttribute( "type" ) !== null ) + "/" + elem.type;
-	return elem;
-}
-function restoreScript( elem ) {
-	if ( ( elem.type || "" ).slice( 0, 5 ) === "true/" ) {
-		elem.type = elem.type.slice( 5 );
-	} else {
-		elem.removeAttribute( "type" );
-	}
-
-	return elem;
-}
-
-function cloneCopyEvent( src, dest ) {
-	var i, l, type, pdataOld, pdataCur, udataOld, udataCur, events;
-
-	if ( dest.nodeType !== 1 ) {
-		return;
-	}
-
-	// 1. Copy private data: events, handlers, etc.
-	if ( dataPriv.hasData( src ) ) {
-		pdataOld = dataPriv.access( src );
-		pdataCur = dataPriv.set( dest, pdataOld );
-		events = pdataOld.events;
-
-		if ( events ) {
-			delete pdataCur.handle;
-			pdataCur.events = {};
-
-			for ( type in events ) {
-				for ( i = 0, l = events[ type ].length; i < l; i++ ) {
-					jQuery.event.add( dest, type, events[ type ][ i ] );
-				}
-			}
-		}
-	}
-
-	// 2. Copy user data
-	if ( dataUser.hasData( src ) ) {
-		udataOld = dataUser.access( src );
-		udataCur = jQuery.extend( {}, udataOld );
-
-		dataUser.set( dest, udataCur );
-	}
-}
-
-// Fix IE bugs, see support tests
-function fixInput( src, dest ) {
-	var nodeName = dest.nodeName.toLowerCase();
-
-	// Fails to persist the checked state of a cloned checkbox or radio button.
-	if ( nodeName === "input" && rcheckableType.test( src.type ) ) {
-		dest.checked = src.checked;
-
-	// Fails to return the selected option to the default selected state when cloning options
-	} else if ( nodeName === "input" || nodeName === "textarea" ) {
-		dest.defaultValue = src.defaultValue;
-	}
-}
-
-function domManip( collection, args, callback, ignored ) {
-
-	// Flatten any nested arrays
-	args = concat.apply( [], args );
-
-	var fragment, first, scripts, hasScripts, node, doc,
-		i = 0,
-		l = collection.length,
-		iNoClone = l - 1,
-		value = args[ 0 ],
-		valueIsFunction = isFunction( value );
-
-	// We can't cloneNode fragments that contain checked, in WebKit
-	if ( valueIsFunction ||
-			( l > 1 && typeof value === "string" &&
-				!support.checkClone && rchecked.test( value ) ) ) {
-		return collection.each( function( index ) {
-			var self = collection.eq( index );
-			if ( valueIsFunction ) {
-				args[ 0 ] = value.call( this, index, self.html() );
-			}
-			domManip( self, args, callback, ignored );
-		} );
-	}
-
-	if ( l ) {
-		fragment = buildFragment( args, collection[ 0 ].ownerDocument, false, collection, ignored );
-		first = fragment.firstChild;
-
-		if ( fragment.childNodes.length === 1 ) {
-			fragment = first;
-		}
-
-		// Require either new content or an interest in ignored elements to invoke the callback
-		if ( first || ignored ) {
-			scripts = jQuery.map( getAll( fragment, "script" ), disableScript );
-			hasScripts = scripts.length;
-
-			// Use the original fragment for the last item
-			// instead of the first because it can end up
-			// being emptied incorrectly in certain situations (#8070).
-			for ( ; i < l; i++ ) {
-				node = fragment;
-
-				if ( i !== iNoClone ) {
-					node = jQuery.clone( node, true, true );
-
-					// Keep references to cloned scripts for later restoration
-					if ( hasScripts ) {
-
-						// Support: Android <=4.0 only, PhantomJS 1 only
-						// push.apply(_, arraylike) throws on ancient WebKit
-						jQuery.merge( scripts, getAll( node, "script" ) );
-					}
-				}
-
-				callback.call( collection[ i ], node, i );
-			}
-
-			if ( hasScripts ) {
-				doc = scripts[ scripts.length - 1 ].ownerDocument;
-
-				// Reenable scripts
-				jQuery.map( scripts, restoreScript );
-
-				// Evaluate executable scripts on first document insertion
-				for ( i = 0; i < hasScripts; i++ ) {
-					node = scripts[ i ];
-					if ( rscriptType.test( node.type || "" ) &&
-						!dataPriv.access( node, "globalEval" ) &&
-						jQuery.contains( doc, node ) ) {
-
-						if ( node.src && ( node.type || "" ).toLowerCase()  !== "module" ) {
-
-							// Optional AJAX dependency, but won't run scripts if not present
-							if ( jQuery._evalUrl ) {
-								jQuery._evalUrl( node.src );
-							}
-						} else {
-							DOMEval( node.textContent.replace( rcleanScript, "" ), doc, node );
-						}
-					}
-				}
-			}
-		}
-	}
-
-	return collection;
-}
-
-function remove( elem, selector, keepData ) {
-	var node,
-		nodes = selector ? jQuery.filter( selector, elem ) : elem,
-		i = 0;
-
-	for ( ; ( node = nodes[ i ] ) != null; i++ ) {
-		if ( !keepData && node.nodeType === 1 ) {
-			jQuery.cleanData( getAll( node ) );
-		}
-
-		if ( node.parentNode ) {
-			if ( keepData && jQuery.contains( node.ownerDocument, node ) ) {
-				setGlobalEval( getAll( node, "script" ) );
-			}
-			node.parentNode.removeChild( node );
-		}
-	}
-
-	return elem;
-}
-
-jQuery.extend( {
-	htmlPrefilter: function( html ) {
-		return html.replace( rxhtmlTag, "<$1></$2>" );
-	},
-
-	clone: function( elem, dataAndEvents, deepDataAndEvents ) {
-		var i, l, srcElements, destElements,
-			clone = elem.cloneNode( true ),
-			inPage = jQuery.contains( elem.ownerDocument, elem );
-
-		// Fix IE cloning issues
-		if ( !support.noCloneChecked && ( elem.nodeType === 1 || elem.nodeType === 11 ) &&
-				!jQuery.isXMLDoc( elem ) ) {
-
-			// We eschew Sizzle here for performance reasons: https://jsperf.com/getall-vs-sizzle/2
-			destElements = getAll( clone );
-			srcElements = getAll( elem );
-
-			for ( i = 0, l = srcElements.length; i < l; i++ ) {
-				fixInput( srcElements[ i ], destElements[ i ] );
-			}
-		}
-
-		// Copy the events from the original to the clone
-		if ( dataAndEvents ) {
-			if ( deepDataAndEvents ) {
-				srcElements = srcElements || getAll( elem );
-				destElements = destElements || getAll( clone );
-
-				for ( i = 0, l = srcElements.length; i < l; i++ ) {
-					cloneCopyEvent( srcElements[ i ], destElements[ i ] );
-				}
-			} else {
-				cloneCopyEvent( elem, clone );
-			}
-		}
-
-		// Preserve script evaluation history
-		destElements = getAll( clone, "script" );
-		if ( destElements.length > 0 ) {
-			setGlobalEval( destElements, !inPage && getAll( elem, "script" ) );
-		}
-
-		// Return the cloned set
-		return clone;
-	},
-
-	cleanData: function( elems ) {
-		var data, elem, type,
-			special = jQuery.event.special,
-			i = 0;
-
-		for ( ; ( elem = elems[ i ] ) !== undefined; i++ ) {
-			if ( acceptData( elem ) ) {
-				if ( ( data = elem[ dataPriv.expando ] ) ) {
-					if ( data.events ) {
-						for ( type in data.events ) {
-							if ( special[ type ] ) {
-								jQuery.event.remove( elem, type );
-
-							// This is a shortcut to avoid jQuery.event.remove's overhead
-							} else {
-								jQuery.removeEvent( elem, type, data.handle );
-							}
-						}
-					}
-
-					// Support: Chrome <=35 - 45+
-					// Assign undefined instead of using delete, see Data#remove
-					elem[ dataPriv.expando ] = undefined;
-				}
-				if ( elem[ dataUser.expando ] ) {
-
-					// Support: Chrome <=35 - 45+
-					// Assign undefined instead of using delete, see Data#remove
-					elem[ dataUser.expando ] = undefined;
-				}
-			}
-		}
-	}
-} );
-
-jQuery.fn.extend( {
-	detach: function( selector ) {
-		return remove( this, selector, true );
-	},
-
-	remove: function( selector ) {
-		return remove( this, selector );
-	},
-
-	text: function( value ) {
-		return access( this, function( value ) {
-			return value === undefined ?
-				jQuery.text( this ) :
-				this.empty().each( function() {
-					if ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) {
-						this.textContent = value;
-					}
-				} );
-		}, null, value, arguments.length );
-	},
-
-	append: function() {
-		return domManip( this, arguments, function( elem ) {
-			if ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) {
-				var target = manipulationTarget( this, elem );
-				target.appendChild( elem );
-			}
-		} );
-	},
-
-	prepend: function() {
-		return domManip( this, arguments, function( elem ) {
-			if ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) {
-				var target = manipulationTarget( this, elem );
-				target.insertBefore( elem, target.firstChild );
-			}
-		} );
-	},
-
-	before: function() {
-		return domManip( this, arguments, function( elem ) {
-			if ( this.parentNode ) {
-				this.parentNode.insertBefore( elem, this );
-			}
-		} );
-	},
-
-	after: function() {
-		return domManip( this, arguments, function( elem ) {
-			if ( this.parentNode ) {
-				this.parentNode.insertBefore( elem, this.nextSibling );
-			}
-		} );
-	},
-
-	empty: function() {
-		var elem,
-			i = 0;
-
-		for ( ; ( elem = this[ i ] ) != null; i++ ) {
-			if ( elem.nodeType === 1 ) {
-
-				// Prevent memory leaks
-				jQuery.cleanData( getAll( elem, false ) );
-
-				// Remove any remaining nodes
-				elem.textContent = "";
-			}
-		}
-
-		return this;
-	},
-
-	clone: function( dataAndEvents, deepDataAndEvents ) {
-		dataAndEvents = dataAndEvents == null ? false : dataAndEvents;
-		deepDataAndEvents = deepDataAndEvents == null ? dataAndEvents : deepDataAndEvents;
-
-		return this.map( function() {
-			return jQuery.clone( this, dataAndEvents, deepDataAndEvents );
-		} );
-	},
-
-	html: function( value ) {
-		return access( this, function( value ) {
-			var elem = this[ 0 ] || {},
-				i = 0,
-				l = this.length;
-
-			if ( value === undefined && elem.nodeType === 1 ) {
-				return elem.innerHTML;
-			}
-
-			// See if we can take a shortcut and just use innerHTML
-			if ( typeof value === "string" && !rnoInnerhtml.test( value ) &&
-				!wrapMap[ ( rtagName.exec( value ) || [ "", "" ] )[ 1 ].toLowerCase() ] ) {
-
-				value = jQuery.htmlPrefilter( value );
-
-				try {
-					for ( ; i < l; i++ ) {
-						elem = this[ i ] || {};
-
-						// Remove element nodes and prevent memory leaks
-						if ( elem.nodeType === 1 ) {
-							jQuery.cleanData( getAll( elem, false ) );
-							elem.innerHTML = value;
-						}
-					}
-
-					elem = 0;
-
-				// If using innerHTML throws an exception, use the fallback method
-				} catch ( e ) {}
-			}
-
-			if ( elem ) {
-				this.empty().append( value );
-			}
-		}, null, value, arguments.length );
-	},
-
-	replaceWith: function() {
-		var ignored = [];
-
-		// Make the changes, replacing each non-ignored context element with the new content
-		return domManip( this, arguments, function( elem ) {
-			var parent = this.parentNode;
-
-			if ( jQuery.inArray( this, ignored ) < 0 ) {
-				jQuery.cleanData( getAll( this ) );
-				if ( parent ) {
-					parent.replaceChild( elem, this );
-				}
-			}
-
-		// Force callback invocation
-		}, ignored );
-	}
-} );
-
-jQuery.each( {
-	appendTo: "append",
-	prependTo: "prepend",
-	insertBefore: "before",
-	insertAfter: "after",
-	replaceAll: "replaceWith"
-}, function( name, original ) {
-	jQuery.fn[ name ] = function( selector ) {
-		var elems,
-			ret = [],
-			insert = jQuery( selector ),
-			last = insert.length - 1,
-			i = 0;
-
-		for ( ; i <= last; i++ ) {
-			elems = i === last ? this : this.clone( true );
-			jQuery( insert[ i ] )[ original ]( elems );
-
-			// Support: Android <=4.0 only, PhantomJS 1 only
-			// .get() because push.apply(_, arraylike) throws on ancient WebKit
-			push.apply( ret, elems.get() );
-		}
-
-		return this.pushStack( ret );
-	};
-} );
-var rnumnonpx = new RegExp( "^(" + pnum + ")(?!px)[a-z%]+$", "i" );
-
-var getStyles = function( elem ) {
-
-		// Support: IE <=11 only, Firefox <=30 (#15098, #14150)
-		// IE throws on elements created in popups
-		// FF meanwhile throws on frame elements through "defaultView.getComputedStyle"
-		var view = elem.ownerDocument.defaultView;
-
-		if ( !view || !view.opener ) {
-			view = window;
-		}
-
-		return view.getComputedStyle( elem );
-	};
-
-var rboxStyle = new RegExp( cssExpand.join( "|" ), "i" );
-
-
-
-( function() {
-
-	// Executing both pixelPosition & boxSizingReliable tests require only one layout
-	// so they're executed at the same time to save the second computation.
-	function computeStyleTests() {
-
-		// This is a singleton, we need to execute it only once
-		if ( !div ) {
-			return;
-		}
-
-		container.style.cssText = "position:absolute;left:-11111px;width:60px;" +
-			"margin-top:1px;padding:0;border:0";
-		div.style.cssText =
-			"position:relative;display:block;box-sizing:border-box;overflow:scroll;" +
-			"margin:auto;border:1px;padding:1px;" +
-			"width:60%;top:1%";
-		documentElement.appendChild( container ).appendChild( div );
-
-		var divStyle = window.getComputedStyle( div );
-		pixelPositionVal = divStyle.top !== "1%";
-
-		// Support: Android 4.0 - 4.3 only, Firefox <=3 - 44
-		reliableMarginLeftVal = roundPixelMeasures( divStyle.marginLeft ) === 12;
-
-		// Support: Android 4.0 - 4.3 only, Safari <=9.1 - 10.1, iOS <=7.0 - 9.3
-		// Some styles come back with percentage values, even though they shouldn't
-		div.style.right = "60%";
-		pixelBoxStylesVal = roundPixelMeasures( divStyle.right ) === 36;
-
-		// Support: IE 9 - 11 only
-		// Detect misreporting of content dimensions for box-sizing:border-box elements
-		boxSizingReliableVal = roundPixelMeasures( divStyle.width ) === 36;
-
-		// Support: IE 9 only
-		// Detect overflow:scroll screwiness (gh-3699)
-		div.style.position = "absolute";
-		scrollboxSizeVal = div.offsetWidth === 36 || "absolute";
-
-		documentElement.removeChild( container );
-
-		// Nullify the div so it wouldn't be stored in the memory and
-		// it will also be a sign that checks already performed
-		div = null;
-	}
-
-	function roundPixelMeasures( measure ) {
-		return Math.round( parseFloat( measure ) );
-	}
-
-	var pixelPositionVal, boxSizingReliableVal, scrollboxSizeVal, pixelBoxStylesVal,
-		reliableMarginLeftVal,
-		container = document.createElement( "div" ),
-		div = document.createElement( "div" );
-
-	// Finish early in limited (non-browser) environments
-	if ( !div.style ) {
-		return;
-	}
-
-	// Support: IE <=9 - 11 only
-	// Style of cloned element affects source element cloned (#8908)
-	div.style.backgroundClip = "content-box";
-	div.cloneNode( true ).style.backgroundClip = "";
-	support.clearCloneStyle = div.style.backgroundClip === "content-box";
-
-	jQuery.extend( support, {
-		boxSizingReliable: function() {
-			computeStyleTests();
-			return boxSizingReliableVal;
-		},
-		pixelBoxStyles: function() {
-			computeStyleTests();
-			return pixelBoxStylesVal;
-		},
-		pixelPosition: function() {
-			computeStyleTests();
-			return pixelPositionVal;
-		},
-		reliableMarginLeft: function() {
-			computeStyleTests();
-			return reliableMarginLeftVal;
-		},
-		scrollboxSize: function() {
-			computeStyleTests();
-			return scrollboxSizeVal;
-		}
-	} );
-} )();
-
-
-function curCSS( elem, name, computed ) {
-	var width, minWidth, maxWidth, ret,
-
-		// Support: Firefox 51+
-		// Retrieving style before computed somehow
-		// fixes an issue with getting wrong values
-		// on detached elements
-		style = elem.style;
-
-	computed = computed || getStyles( elem );
-
-	// getPropertyValue is needed for:
-	//   .css('filter') (IE 9 only, #12537)
-	//   .css('--customProperty) (#3144)
-	if ( computed ) {
-		ret = computed.getPropertyValue( name ) || computed[ name ];
-
-		if ( ret === "" && !jQuery.contains( elem.ownerDocument, elem ) ) {
-			ret = jQuery.style( elem, name );
-		}
-
-		// A tribute to the "awesome hack by Dean Edwards"
-		// Android Browser returns percentage for some values,
-		// but width seems to be reliably pixels.
-		// This is against the CSSOM draft spec:
-		// https://drafts.csswg.org/cssom/#resolved-values
-		if ( !support.pixelBoxStyles() && rnumnonpx.test( ret ) && rboxStyle.test( name ) ) {
-
-			// Remember the original values
-			width = style.width;
-			minWidth = style.minWidth;
-			maxWidth = style.maxWidth;
-
-			// Put in the new values to get a computed value out
-			style.minWidth = style.maxWidth = style.width = ret;
-			ret = computed.width;
-
-			// Revert the changed values
-			style.width = width;
-			style.minWidth = minWidth;
-			style.maxWidth = maxWidth;
-		}
-	}
-
-	return ret !== undefined ?
-
-		// Support: IE <=9 - 11 only
-		// IE returns zIndex value as an integer.
-		ret + "" :
-		ret;
-}
-
-
-function addGetHookIf( conditionFn, hookFn ) {
-
-	// Define the hook, we'll check on the first run if it's really needed.
-	return {
-		get: function() {
-			if ( conditionFn() ) {
-
-				// Hook not needed (or it's not possible to use it due
-				// to missing dependency), remove it.
-				delete this.get;
-				return;
-			}
-
-			// Hook needed; redefine it so that the support test is not executed again.
-			return ( this.get = hookFn ).apply( this, arguments );
-		}
-	};
-}
-
-
-var
-
-	// Swappable if display is none or starts with table
-	// except "table", "table-cell", or "table-caption"
-	// See here for display values: https://developer.mozilla.org/en-US/docs/CSS/display
-	rdisplayswap = /^(none|table(?!-c[ea]).+)/,
-	rcustomProp = /^--/,
-	cssShow = { position: "absolute", visibility: "hidden", display: "block" },
-	cssNormalTransform = {
-		letterSpacing: "0",
-		fontWeight: "400"
-	},
-
-	cssPrefixes = [ "Webkit", "Moz", "ms" ],
-	emptyStyle = document.createElement( "div" ).style;
-
-// Return a css property mapped to a potentially vendor prefixed property
-function vendorPropName( name ) {
-
-	// Shortcut for names that are not vendor prefixed
-	if ( name in emptyStyle ) {
-		return name;
-	}
-
-	// Check for vendor prefixed names
-	var capName = name[ 0 ].toUpperCase() + name.slice( 1 ),
-		i = cssPrefixes.length;
-
-	while ( i-- ) {
-		name = cssPrefixes[ i ] + capName;
-		if ( name in emptyStyle ) {
-			return name;
-		}
-	}
-}
-
-// Return a property mapped along what jQuery.cssProps suggests or to
-// a vendor prefixed property.
-function finalPropName( name ) {
-	var ret = jQuery.cssProps[ name ];
-	if ( !ret ) {
-		ret = jQuery.cssProps[ name ] = vendorPropName( name ) || name;
-	}
-	return ret;
-}
-
-function setPositiveNumber( elem, value, subtract ) {
-
-	// Any relative (+/-) values have already been
-	// normalized at this point
-	var matches = rcssNum.exec( value );
-	return matches ?
-
-		// Guard against undefined "subtract", e.g., when used as in cssHooks
-		Math.max( 0, matches[ 2 ] - ( subtract || 0 ) ) + ( matches[ 3 ] || "px" ) :
-		value;
-}
-
-function boxModelAdjustment( elem, dimension, box, isBorderBox, styles, computedVal ) {
-	var i = dimension === "width" ? 1 : 0,
-		extra = 0,
-		delta = 0;
-
-	// Adjustment may not be necessary
-	if ( box === ( isBorderBox ? "border" : "content" ) ) {
-		return 0;
-	}
-
-	for ( ; i < 4; i += 2 ) {
-
-		// Both box models exclude margin
-		if ( box === "margin" ) {
-			delta += jQuery.css( elem, box + cssExpand[ i ], true, styles );
-		}
-
-		// If we get here with a content-box, we're seeking "padding" or "border" or "margin"
-		if ( !isBorderBox ) {
-
-			// Add padding
-			delta += jQuery.css( elem, "padding" + cssExpand[ i ], true, styles );
-
-			// For "border" or "margin", add border
-			if ( box !== "padding" ) {
-				delta += jQuery.css( elem, "border" + cssExpand[ i ] + "Width", true, styles );
-
-			// But still keep track of it otherwise
-			} else {
-				extra += jQuery.css( elem, "border" + cssExpand[ i ] + "Width", true, styles );
-			}
-
-		// If we get here with a border-box (content + padding + border), we're seeking "content" or
-		// "padding" or "margin"
-		} else {
-
-			// For "content", subtract padding
-			if ( box === "content" ) {
-				delta -= jQuery.css( elem, "padding" + cssExpand[ i ], true, styles );
-			}
-
-			// For "content" or "padding", subtract border
-			if ( box !== "margin" ) {
-				delta -= jQuery.css( elem, "border" + cssExpand[ i ] + "Width", true, styles );
-			}
-		}
-	}
-
-	// Account for positive content-box scroll gutter when requested by providing computedVal
-	if ( !isBorderBox && computedVal >= 0 ) {
-
-		// offsetWidth/offsetHeight is a rounded sum of content, padding, scroll gutter, and border
-		// Assuming integer scroll gutter, subtract the rest and round down
-		delta += Math.max( 0, Math.ceil(
-			elem[ "offset" + dimension[ 0 ].toUpperCase() + dimension.slice( 1 ) ] -
-			computedVal -
-			delta -
-			extra -
-			0.5
-		) );
-	}
-
-	return delta;
-}
-
-function getWidthOrHeight( elem, dimension, extra ) {
-
-	// Start with computed style
-	var styles = getStyles( elem ),
-		val = curCSS( elem, dimension, styles ),
-		isBorderBox = jQuery.css( elem, "boxSizing", false, styles ) === "border-box",
-		valueIsBorderBox = isBorderBox;
-
-	// Support: Firefox <=54
-	// Return a confounding non-pixel value or feign ignorance, as appropriate.
-	if ( rnumnonpx.test( val ) ) {
-		if ( !extra ) {
-			return val;
-		}
-		val = "auto";
-	}
-
-	// Check for style in case a browser which returns unreliable values
-	// for getComputedStyle silently falls back to the reliable elem.style
-	valueIsBorderBox = valueIsBorderBox &&
-		( support.boxSizingReliable() || val === elem.style[ dimension ] );
-
-	// Fall back to offsetWidth/offsetHeight when value is "auto"
-	// This happens for inline elements with no explicit setting (gh-3571)
-	// Support: Android <=4.1 - 4.3 only
-	// Also use offsetWidth/offsetHeight for misreported inline dimensions (gh-3602)
-	if ( val === "auto" ||
-		!parseFloat( val ) && jQuery.css( elem, "display", false, styles ) === "inline" ) {
-
-		val = elem[ "offset" + dimension[ 0 ].toUpperCase() + dimension.slice( 1 ) ];
-
-		// offsetWidth/offsetHeight provide border-box values
-		valueIsBorderBox = true;
-	}
-
-	// Normalize "" and auto
-	val = parseFloat( val ) || 0;
-
-	// Adjust for the element's box model
-	return ( val +
-		boxModelAdjustment(
-			elem,
-			dimension,
-			extra || ( isBorderBox ? "border" : "content" ),
-			valueIsBorderBox,
-			styles,
-
-			// Provide the current computed size to request scroll gutter calculation (gh-3589)
-			val
-		)
-	) + "px";
-}
-
-jQuery.extend( {
-
-	// Add in style property hooks for overriding the default
-	// behavior of getting and setting a style property
-	cssHooks: {
-		opacity: {
-			get: function( elem, computed ) {
-				if ( computed ) {
-
-					// We should always get a number back from opacity
-					var ret = curCSS( elem, "opacity" );
-					return ret === "" ? "1" : ret;
-				}
-			}
-		}
-	},
-
-	// Don't automatically add "px" to these possibly-unitless properties
-	cssNumber: {
-		"animationIterationCount": true,
-		"columnCount": true,
-		"fillOpacity": true,
-		"flexGrow": true,
-		"flexShrink": true,
-		"fontWeight": true,
-		"lineHeight": true,
-		"opacity": true,
-		"order": true,
-		"orphans": true,
-		"widows": true,
-		"zIndex": true,
-		"zoom": true
-	},
-
-	// Add in properties whose names you wish to fix before
-	// setting or getting the value
-	cssProps: {},
-
-	// Get and set the style property on a DOM Node
-	style: function( elem, name, value, extra ) {
-
-		// Don't set styles on text and comment nodes
-		if ( !elem || elem.nodeType === 3 || elem.nodeType === 8 || !elem.style ) {
-			return;
-		}
-
-		// Make sure that we're working with the right name
-		var ret, type, hooks,
-			origName = camelCase( name ),
-			isCustomProp = rcustomProp.test( name ),
-			style = elem.style;
-
-		// Make sure that we're working with the right name. We don't
-		// want to query the value if it is a CSS custom property
-		// since they are user-defined.
-		if ( !isCustomProp ) {
-			name = finalPropName( origName );
-		}
-
-		// Gets hook for the prefixed version, then unprefixed version
-		hooks = jQuery.cssHooks[ name ] || jQuery.cssHooks[ origName ];
-
-		// Check if we're setting a value
-		if ( value !== undefined ) {
-			type = typeof value;
-
-			// Convert "+=" or "-=" to relative numbers (#7345)
-			if ( type === "string" && ( ret = rcssNum.exec( value ) ) && ret[ 1 ] ) {
-				value = adjustCSS( elem, name, ret );
-
-				// Fixes bug #9237
-				type = "number";
-			}
-
-			// Make sure that null and NaN values aren't set (#7116)
-			if ( value == null || value !== value ) {
-				return;
-			}
-
-			// If a number was passed in, add the unit (except for certain CSS properties)
-			if ( type === "number" ) {
-				value += ret && ret[ 3 ] || ( jQuery.cssNumber[ origName ] ? "" : "px" );
-			}
-
-			// background-* props affect original clone's values
-			if ( !support.clearCloneStyle && value === "" && name.indexOf( "background" ) === 0 ) {
-				style[ name ] = "inherit";
-			}
-
-			// If a hook was provided, use that value, otherwise just set the specified value
-			if ( !hooks || !( "set" in hooks ) ||
-				( value = hooks.set( elem, value, extra ) ) !== undefined ) {
-
-				if ( isCustomProp ) {
-					style.setProperty( name, value );
-				} else {
-					style[ name ] = value;
-				}
-			}
-
-		} else {
-
-			// If a hook was provided get the non-computed value from there
-			if ( hooks && "get" in hooks &&
-				( ret = hooks.get( elem, false, extra ) ) !== undefined ) {
-
-				return ret;
-			}
-
-			// Otherwise just get the value from the style object
-			return style[ name ];
-		}
-	},
-
-	css: function( elem, name, extra, styles ) {
-		var val, num, hooks,
-			origName = camelCase( name ),
-			isCustomProp = rcustomProp.test( name );
-
-		// Make sure that we're working with the right name. We don't
-		// want to modify the value if it is a CSS custom property
-		// since they are user-defined.
-		if ( !isCustomProp ) {
-			name = finalPropName( origName );
-		}
-
-		// Try prefixed name followed by the unprefixed name
-		hooks = jQuery.cssHooks[ name ] || jQuery.cssHooks[ origName ];
-
-		// If a hook was provided get the computed value from there
-		if ( hooks && "get" in hooks ) {
-			val = hooks.get( elem, true, extra );
-		}
-
-		// Otherwise, if a way to get the computed value exists, use that
-		if ( val === undefined ) {
-			val = curCSS( elem, name, styles );
-		}
-
-		// Convert "normal" to computed value
-		if ( val === "normal" && name in cssNormalTransform ) {
-			val = cssNormalTransform[ name ];
-		}
-
-		// Make numeric if forced or a qualifier was provided and val looks numeric
-		if ( extra === "" || extra ) {
-			num = parseFloat( val );
-			return extra === true || isFinite( num ) ? num || 0 : val;
-		}
-
-		return val;
-	}
-} );
-
-jQuery.each( [ "height", "width" ], function( i, dimension ) {
-	jQuery.cssHooks[ dimension ] = {
-		get: function( elem, computed, extra ) {
-			if ( computed ) {
-
-				// Certain elements can have dimension info if we invisibly show them
-				// but it must have a current display style that would benefit
-				return rdisplayswap.test( jQuery.css( elem, "display" ) ) &&
-
-					// Support: Safari 8+
-					// Table columns in Safari have non-zero offsetWidth & zero
-					// getBoundingClientRect().width unless display is changed.
-					// Support: IE <=11 only
-					// Running getBoundingClientRect on a disconnected node
-					// in IE throws an error.
-					( !elem.getClientRects().length || !elem.getBoundingClientRect().width ) ?
-						swap( elem, cssShow, function() {
-							return getWidthOrHeight( elem, dimension, extra );
-						} ) :
-						getWidthOrHeight( elem, dimension, extra );
-			}
-		},
-
-		set: function( elem, value, extra ) {
-			var matches,
-				styles = getStyles( elem ),
-				isBorderBox = jQuery.css( elem, "boxSizing", false, styles ) === "border-box",
-				subtract = extra && boxModelAdjustment(
-					elem,
-					dimension,
-					extra,
-					isBorderBox,
-					styles
-				);
-
-			// Account for unreliable border-box dimensions by comparing offset* to computed and
-			// faking a content-box to get border and padding (gh-3699)
-			if ( isBorderBox && support.scrollboxSize() === styles.position ) {
-				subtract -= Math.ceil(
-					elem[ "offset" + dimension[ 0 ].toUpperCase() + dimension.slice( 1 ) ] -
-					parseFloat( styles[ dimension ] ) -
-					boxModelAdjustment( elem, dimension, "border", false, styles ) -
-					0.5
-				);
-			}
-
-			// Convert to pixels if value adjustment is needed
-			if ( subtract && ( matches = rcssNum.exec( value ) ) &&
-				( matches[ 3 ] || "px" ) !== "px" ) {
-
-				elem.style[ dimension ] = value;
-				value = jQuery.css( elem, dimension );
-			}
-
-			return setPositiveNumber( elem, value, subtract );
-		}
-	};
-} );
-
-jQuery.cssHooks.marginLeft = addGetHookIf( support.reliableMarginLeft,
-	function( elem, computed ) {
-		if ( computed ) {
-			return ( parseFloat( curCSS( elem, "marginLeft" ) ) ||
-				elem.getBoundingClientRect().left -
-					swap( elem, { marginLeft: 0 }, function() {
-						return elem.getBoundingClientRect().left;
-					} )
-				) + "px";
-		}
-	}
-);
-
-// These hooks are used by animate to expand properties
-jQuery.each( {
-	margin: "",
-	padding: "",
-	border: "Width"
-}, function( prefix, suffix ) {
-	jQuery.cssHooks[ prefix + suffix ] = {
-		expand: function( value ) {
-			var i = 0,
-				expanded = {},
-
-				// Assumes a single number if not a string
-				parts = typeof value === "string" ? value.split( " " ) : [ value ];
-
-			for ( ; i < 4; i++ ) {
-				expanded[ prefix + cssExpand[ i ] + suffix ] =
-					parts[ i ] || parts[ i - 2 ] || parts[ 0 ];
-			}
-
-			return expanded;
-		}
-	};
-
-	if ( prefix !== "margin" ) {
-		jQuery.cssHooks[ prefix + suffix ].set = setPositiveNumber;
-	}
-} );
-
-jQuery.fn.extend( {
-	css: function( name, value ) {
-		return access( this, function( elem, name, value ) {
-			var styles, len,
-				map = {},
-				i = 0;
-
-			if ( Array.isArray( name ) ) {
-				styles = getStyles( elem );
-				len = name.length;
-
-				for ( ; i < len; i++ ) {
-					map[ name[ i ] ] = jQuery.css( elem, name[ i ], false, styles );
-				}
-
-				return map;
-			}
-
-			return value !== undefined ?
-				jQuery.style( elem, name, value ) :
-				jQuery.css( elem, name );
-		}, name, value, arguments.length > 1 );
-	}
-} );
-
-
-function Tween( elem, options, prop, end, easing ) {
-	return new Tween.prototype.init( elem, options, prop, end, easing );
-}
-jQuery.Tween = Tween;
-
-Tween.prototype = {
-	constructor: Tween,
-	init: function( elem, options, prop, end, easing, unit ) {
-		this.elem = elem;
-		this.prop = prop;
-		this.easing = easing || jQuery.easing._default;
-		this.options = options;
-		this.start = this.now = this.cur();
-		this.end = end;
-		this.unit = unit || ( jQuery.cssNumber[ prop ] ? "" : "px" );
-	},
-	cur: function() {
-		var hooks = Tween.propHooks[ this.prop ];
-
-		return hooks && hooks.get ?
-			hooks.get( this ) :
-			Tween.propHooks._default.get( this );
-	},
-	run: function( percent ) {
-		var eased,
-			hooks = Tween.propHooks[ this.prop ];
-
-		if ( this.options.duration ) {
-			this.pos = eased = jQuery.easing[ this.easing ](
-				percent, this.options.duration * percent, 0, 1, this.options.duration
-			);
-		} else {
-			this.pos = eased = percent;
-		}
-		this.now = ( this.end - this.start ) * eased + this.start;
-
-		if ( this.options.step ) {
-			this.options.step.call( this.elem, this.now, this );
-		}
-
-		if ( hooks && hooks.set ) {
-			hooks.set( this );
-		} else {
-			Tween.propHooks._default.set( this );
-		}
-		return this;
-	}
-};
-
-Tween.prototype.init.prototype = Tween.prototype;
-
-Tween.propHooks = {
-	_default: {
-		get: function( tween ) {
-			var result;
-
-			// Use a property on the element directly when it is not a DOM element,
-			// or when there is no matching style property that exists.
-			if ( tween.elem.nodeType !== 1 ||
-				tween.elem[ tween.prop ] != null && tween.elem.style[ tween.prop ] == null ) {
-				return tween.elem[ tween.prop ];
-			}
-
-			// Passing an empty string as a 3rd parameter to .css will automatically
-			// attempt a parseFloat and fallback to a string if the parse fails.
-			// Simple values such as "10px" are parsed to Float;
-			// complex values such as "rotate(1rad)" are returned as-is.
-			result = jQuery.css( tween.elem, tween.prop, "" );
-
-			// Empty strings, null, undefined and "auto" are converted to 0.
-			return !result || result === "auto" ? 0 : result;
-		},
-		set: function( tween ) {
-
-			// Use step hook for back compat.
-			// Use cssHook if its there.
-			// Use .style if available and use plain properties where available.
-			if ( jQuery.fx.step[ tween.prop ] ) {
-				jQuery.fx.step[ tween.prop ]( tween );
-			} else if ( tween.elem.nodeType === 1 &&
-				( tween.elem.style[ jQuery.cssProps[ tween.prop ] ] != null ||
-					jQuery.cssHooks[ tween.prop ] ) ) {
-				jQuery.style( tween.elem, tween.prop, tween.now + tween.unit );
-			} else {
-				tween.elem[ tween.prop ] = tween.now;
-			}
-		}
-	}
-};
-
-// Support: IE <=9 only
-// Panic based approach to setting things on disconnected nodes
-Tween.propHooks.scrollTop = Tween.propHooks.scrollLeft = {
-	set: function( tween ) {
-		if ( tween.elem.nodeType && tween.elem.parentNode ) {
-			tween.elem[ tween.prop ] = tween.now;
-		}
-	}
-};
-
-jQuery.easing = {
-	linear: function( p ) {
-		return p;
-	},
-	swing: function( p ) {
-		return 0.5 - Math.cos( p * Math.PI ) / 2;
-	},
-	_default: "swing"
-};
-
-jQuery.fx = Tween.prototype.init;
-
-// Back compat <1.8 extension point
-jQuery.fx.step = {};
-
-
-
-
-var
-	fxNow, inProgress,
-	rfxtypes = /^(?:toggle|show|hide)$/,
-	rrun = /queueHooks$/;
-
-function schedule() {
-	if ( inProgress ) {
-		if ( document.hidden === false && window.requestAnimationFrame ) {
-			window.requestAnimationFrame( schedule );
-		} else {
-			window.setTimeout( schedule, jQuery.fx.interval );
-		}
-
-		jQuery.fx.tick();
-	}
-}
-
-// Animations created synchronously will run synchronously
-function createFxNow() {
-	window.setTimeout( function() {
-		fxNow = undefined;
-	} );
-	return ( fxNow = Date.now() );
-}
-
-// Generate parameters to create a standard animation
-function genFx( type, includeWidth ) {
-	var which,
-		i = 0,
-		attrs = { height: type };
-
-	// If we include width, step value is 1 to do all cssExpand values,
-	// otherwise step value is 2 to skip over Left and Right
-	includeWidth = includeWidth ? 1 : 0;
-	for ( ; i < 4; i += 2 - includeWidth ) {
-		which = cssExpand[ i ];
-		attrs[ "margin" + which ] = attrs[ "padding" + which ] = type;
-	}
-
-	if ( includeWidth ) {
-		attrs.opacity = attrs.width = type;
-	}
-
-	return attrs;
-}
-
-function createTween( value, prop, animation ) {
-	var tween,
-		collection = ( Animation.tweeners[ prop ] || [] ).concat( Animation.tweeners[ "*" ] ),
-		index = 0,
-		length = collection.length;
-	for ( ; index < length; index++ ) {
-		if ( ( tween = collection[ index ].call( animation, prop, value ) ) ) {
-
-			// We're done with this property
-			return tween;
-		}
-	}
-}
-
-function defaultPrefilter( elem, props, opts ) {
-	var prop, value, toggle, hooks, oldfire, propTween, restoreDisplay, display,
-		isBox = "width" in props || "height" in props,
-		anim = this,
-		orig = {},
-		style = elem.style,
-		hidden = elem.nodeType && isHiddenWithinTree( elem ),
-		dataShow = dataPriv.get( elem, "fxshow" );
-
-	// Queue-skipping animations hijack the fx hooks
-	if ( !opts.queue ) {
-		hooks = jQuery._queueHooks( elem, "fx" );
-		if ( hooks.unqueued == null ) {
-			hooks.unqueued = 0;
-			oldfire = hooks.empty.fire;
-			hooks.empty.fire = function() {
-				if ( !hooks.unqueued ) {
-					oldfire();
-				}
-			};
-		}
-		hooks.unqueued++;
-
-		anim.always( function() {
-
-			// Ensure the complete handler is called before this completes
-			anim.always( function() {
-				hooks.unqueued--;
-				if ( !jQuery.queue( elem, "fx" ).length ) {
-					hooks.empty.fire();
-				}
-			} );
-		} );
-	}
-
-	// Detect show/hide animations
-	for ( prop in props ) {
-		value = props[ prop ];
-		if ( rfxtypes.test( value ) ) {
-			delete props[ prop ];
-			toggle = toggle || value === "toggle";
-			if ( value === ( hidden ? "hide" : "show" ) ) {
-
-				// Pretend to be hidden if this is a "show" and
-				// there is still data from a stopped show/hide
-				if ( value === "show" && dataShow && dataShow[ prop ] !== undefined ) {
-					hidden = true;
-
-				// Ignore all other no-op show/hide data
-				} else {
-					continue;
-				}
-			}
-			orig[ prop ] = dataShow && dataShow[ prop ] || jQuery.style( elem, prop );
-		}
-	}
-
-	// Bail out if this is a no-op like .hide().hide()
-	propTween = !jQuery.isEmptyObject( props );
-	if ( !propTween && jQuery.isEmptyObject( orig ) ) {
-		return;
-	}
-
-	// Restrict "overflow" and "display" styles during box animations
-	if ( isBox && elem.nodeType === 1 ) {
-
-		// Support: IE <=9 - 11, Edge 12 - 15
-		// Record all 3 overflow attributes because IE does not infer the shorthand
-		// from identically-valued overflowX and overflowY and Edge just mirrors
-		// the overflowX value there.
-		opts.overflow = [ style.overflow, style.overflowX, style.overflowY ];
-
-		// Identify a display type, preferring old show/hide data over the CSS cascade
-		restoreDisplay = dataShow && dataShow.display;
-		if ( restoreDisplay == null ) {
-			restoreDisplay = dataPriv.get( elem, "display" );
-		}
-		display = jQuery.css( elem, "display" );
-		if ( display === "none" ) {
-			if ( restoreDisplay ) {
-				display = restoreDisplay;
-			} else {
-
-				// Get nonempty value(s) by temporarily forcing visibility
-				showHide( [ elem ], true );
-				restoreDisplay = elem.style.display || restoreDisplay;
-				display = jQuery.css( elem, "display" );
-				showHide( [ elem ] );
-			}
-		}
-
-		// Animate inline elements as inline-block
-		if ( display === "inline" || display === "inline-block" && restoreDisplay != null ) {
-			if ( jQuery.css( elem, "float" ) === "none" ) {
-
-				// Restore the original display value at the end of pure show/hide animations
-				if ( !propTween ) {
-					anim.done( function() {
-						style.display = restoreDisplay;
-					} );
-					if ( restoreDisplay == null ) {
-						display = style.display;
-						restoreDisplay = display === "none" ? "" : display;
-					}
-				}
-				style.display = "inline-block";
-			}
-		}
-	}
-
-	if ( opts.overflow ) {
-		style.overflow = "hidden";
-		anim.always( function() {
-			style.overflow = opts.overflow[ 0 ];
-			style.overflowX = opts.overflow[ 1 ];
-			style.overflowY = opts.overflow[ 2 ];
-		} );
-	}
-
-	// Implement show/hide animations
-	propTween = false;
-	for ( prop in orig ) {
-
-		// General show/hide setup for this element animation
-		if ( !propTween ) {
-			if ( dataShow ) {
-				if ( "hidden" in dataShow ) {
-					hidden = dataShow.hidden;
-				}
-			} else {
-				dataShow = dataPriv.access( elem, "fxshow", { display: restoreDisplay } );
-			}
-
-			// Store hidden/visible for toggle so `.stop().toggle()` "reverses"
-			if ( toggle ) {
-				dataShow.hidden = !hidden;
-			}
-
-			// Show elements before animating them
-			if ( hidden ) {
-				showHide( [ elem ], true );
-			}
-
-			/* eslint-disable no-loop-func */
-
-			anim.done( function() {
-
-			/* eslint-enable no-loop-func */
-
-				// The final step of a "hide" animation is actually hiding the element
-				if ( !hidden ) {
-					showHide( [ elem ] );
-				}
-				dataPriv.remove( elem, "fxshow" );
-				for ( prop in orig ) {
-					jQuery.style( elem, prop, orig[ prop ] );
-				}
-			} );
-		}
-
-		// Per-property setup
-		propTween = createTween( hidden ? dataShow[ prop ] : 0, prop, anim );
-		if ( !( prop in dataShow ) ) {
-			dataShow[ prop ] = propTween.start;
-			if ( hidden ) {
-				propTween.end = propTween.start;
-				propTween.start = 0;
-			}
-		}
-	}
-}
-
-function propFilter( props, specialEasing ) {
-	var index, name, easing, value, hooks;
-
-	// camelCase, specialEasing and expand cssHook pass
-	for ( index in props ) {
-		name = camelCase( index );
-		easing = specialEasing[ name ];
-		value = props[ index ];
-		if ( Array.isArray( value ) ) {
-			easing = value[ 1 ];
-			value = props[ index ] = value[ 0 ];
-		}
-
-		if ( index !== name ) {
-			props[ name ] = value;
-			delete props[ index ];
-		}
-
-		hooks = jQuery.cssHooks[ name ];
-		if ( hooks && "expand" in hooks ) {
-			value = hooks.expand( value );
-			delete props[ name ];
-
-			// Not quite $.extend, this won't overwrite existing keys.
-			// Reusing 'index' because we have the correct "name"
-			for ( index in value ) {
-				if ( !( index in props ) ) {
-					props[ index ] = value[ index ];
-					specialEasing[ index ] = easing;
-				}
-			}
-		} else {
-			specialEasing[ name ] = easing;
-		}
-	}
-}
-
-function Animation( elem, properties, options ) {
-	var result,
-		stopped,
-		index = 0,
-		length = Animation.prefilters.length,
-		deferred = jQuery.Deferred().always( function() {
-
-			// Don't match elem in the :animated selector
-			delete tick.elem;
-		} ),
-		tick = function() {
-			if ( stopped ) {
-				return false;
-			}
-			var currentTime = fxNow || createFxNow(),
-				remaining = Math.max( 0, animation.startTime + animation.duration - currentTime ),
-
-				// Support: Android 2.3 only
-				// Archaic crash bug won't allow us to use `1 - ( 0.5 || 0 )` (#12497)
-				temp = remaining / animation.duration || 0,
-				percent = 1 - temp,
-				index = 0,
-				length = animation.tweens.length;
-
-			for ( ; index < length; index++ ) {
-				animation.tweens[ index ].run( percent );
-			}
-
-			deferred.notifyWith( elem, [ animation, percent, remaining ] );
-
-			// If there's more to do, yield
-			if ( percent < 1 && length ) {
-				return remaining;
-			}
-
-			// If this was an empty animation, synthesize a final progress notification
-			if ( !length ) {
-				deferred.notifyWith( elem, [ animation, 1, 0 ] );
-			}
-
-			// Resolve the animation and report its conclusion
-			deferred.resolveWith( elem, [ animation ] );
-			return false;
-		},
-		animation = deferred.promise( {
-			elem: elem,
-			props: jQuery.extend( {}, properties ),
-			opts: jQuery.extend( true, {
-				specialEasing: {},
-				easing: jQuery.easing._default
-			}, options ),
-			originalProperties: properties,
-			originalOptions: options,
-			startTime: fxNow || createFxNow(),
-			duration: options.duration,
-			tweens: [],
-			createTween: function( prop, end ) {
-				var tween = jQuery.Tween( elem, animation.opts, prop, end,
-						animation.opts.specialEasing[ prop ] || animation.opts.easing );
-				animation.tweens.push( tween );
-				return tween;
-			},
-			stop: function( gotoEnd ) {
-				var index = 0,
-
-					// If we are going to the end, we want to run all the tweens
-					// otherwise we skip this part
-					length = gotoEnd ? animation.tweens.length : 0;
-				if ( stopped ) {
-					return this;
-				}
-				stopped = true;
-				for ( ; index < length; index++ ) {
-					animation.tweens[ index ].run( 1 );
-				}
-
-				// Resolve when we played the last frame; otherwise, reject
-				if ( gotoEnd ) {
-					deferred.notifyWith( elem, [ animation, 1, 0 ] );
-					deferred.resolveWith( elem, [ animation, gotoEnd ] );
-				} else {
-					deferred.rejectWith( elem, [ animation, gotoEnd ] );
-				}
-				return this;
-			}
-		} ),
-		props = animation.props;
-
-	propFilter( props, animation.opts.specialEasing );
-
-	for ( ; index < length; index++ ) {
-		result = Animation.prefilters[ index ].call( animation, elem, props, animation.opts );
-		if ( result ) {
-			if ( isFunction( result.stop ) ) {
-				jQuery._queueHooks( animation.elem, animation.opts.queue ).stop =
-					result.stop.bind( result );
-			}
-			return result;
-		}
-	}
-
-	jQuery.map( props, createTween, animation );
-
-	if ( isFunction( animation.opts.start ) ) {
-		animation.opts.start.call( elem, animation );
-	}
-
-	// Attach callbacks from options
-	animation
-		.progress( animation.opts.progress )
-		.done( animation.opts.done, animation.opts.complete )
-		.fail( animation.opts.fail )
-		.always( animation.opts.always );
-
-	jQuery.fx.timer(
-		jQuery.extend( tick, {
-			elem: elem,
-			anim: animation,
-			queue: animation.opts.queue
-		} )
-	);
-
-	return animation;
-}
-
-jQuery.Animation = jQuery.extend( Animation, {
-
-	tweeners: {
-		"*": [ function( prop, value ) {
-			var tween = this.createTween( prop, value );
-			adjustCSS( tween.elem, prop, rcssNum.exec( value ), tween );
-			return tween;
-		} ]
-	},
-
-	tweener: function( props, callback ) {
-		if ( isFunction( props ) ) {
-			callback = props;
-			props = [ "*" ];
-		} else {
-			props = props.match( rnothtmlwhite );
-		}
-
-		var prop,
-			index = 0,
-			length = props.length;
-
-		for ( ; index < length; index++ ) {
-			prop = props[ index ];
-			Animation.tweeners[ prop ] = Animation.tweeners[ prop ] || [];
-			Animation.tweeners[ prop ].unshift( callback );
-		}
-	},
-
-	prefilters: [ defaultPrefilter ],
-
-	prefilter: function( callback, prepend ) {
-		if ( prepend ) {
-			Animation.prefilters.unshift( callback );
-		} else {
-			Animation.prefilters.push( callback );
-		}
-	}
-} );
-
-jQuery.speed = function( speed, easing, fn ) {
-	var opt = speed && typeof speed === "object" ? jQuery.extend( {}, speed ) : {
-		complete: fn || !fn && easing ||
-			isFunction( speed ) && speed,
-		duration: speed,
-		easing: fn && easing || easing && !isFunction( easing ) && easing
-	};
-
-	// Go to the end state if fx are off
-	if ( jQuery.fx.off ) {
-		opt.duration = 0;
-
-	} else {
-		if ( typeof opt.duration !== "number" ) {
-			if ( opt.duration in jQuery.fx.speeds ) {
-				opt.duration = jQuery.fx.speeds[ opt.duration ];
-
-			} else {
-				opt.duration = jQuery.fx.speeds._default;
-			}
-		}
-	}
-
-	// Normalize opt.queue - true/undefined/null -> "fx"
-	if ( opt.queue == null || opt.queue === true ) {
-		opt.queue = "fx";
-	}
-
-	// Queueing
-	opt.old = opt.complete;
-
-	opt.complete = function() {
-		if ( isFunction( opt.old ) ) {
-			opt.old.call( this );
-		}
-
-		if ( opt.queue ) {
-			jQuery.dequeue( this, opt.queue );
-		}
-	};
-
-	return opt;
-};
-
-jQuery.fn.extend( {
-	fadeTo: function( speed, to, easing, callback ) {
-
-		// Show any hidden elements after setting opacity to 0
-		return this.filter( isHiddenWithinTree ).css( "opacity", 0 ).show()
-
-			// Animate to the value specified
-			.end().animate( { opacity: to }, speed, easing, callback );
-	},
-	animate: function( prop, speed, easing, callback ) {
-		var empty = jQuery.isEmptyObject( prop ),
-			optall = jQuery.speed( speed, easing, callback ),
-			doAnimation = function() {
-
-				// Operate on a copy of prop so per-property easing won't be lost
-				var anim = Animation( this, jQuery.extend( {}, prop ), optall );
-
-				// Empty animations, or finishing resolves immediately
-				if ( empty || dataPriv.get( this, "finish" ) ) {
-					anim.stop( true );
-				}
-			};
-			doAnimation.finish = doAnimation;
-
-		return empty || optall.queue === false ?
-			this.each( doAnimation ) :
-			this.queue( optall.queue, doAnimation );
-	},
-	stop: function( type, clearQueue, gotoEnd ) {
-		var stopQueue = function( hooks ) {
-			var stop = hooks.stop;
-			delete hooks.stop;
-			stop( gotoEnd );
-		};
-
-		if ( typeof type !== "string" ) {
-			gotoEnd = clearQueue;
-			clearQueue = type;
-			type = undefined;
-		}
-		if ( clearQueue && type !== false ) {
-			this.queue( type || "fx", [] );
-		}
-
-		return this.each( function() {
-			var dequeue = true,
-				index = type != null && type + "queueHooks",
-				timers = jQuery.timers,
-				data = dataPriv.get( this );
-
-			if ( index ) {
-				if ( data[ index ] && data[ index ].stop ) {
-					stopQueue( data[ index ] );
-				}
-			} else {
-				for ( index in data ) {
-					if ( data[ index ] && data[ index ].stop && rrun.test( index ) ) {
-						stopQueue( data[ index ] );
-					}
-				}
-			}
-
-			for ( index = timers.length; index--; ) {
-				if ( timers[ index ].elem === this &&
-					( type == null || timers[ index ].queue === type ) ) {
-
-					timers[ index ].anim.stop( gotoEnd );
-					dequeue = false;
-					timers.splice( index, 1 );
-				}
-			}
-
-			// Start the next in the queue if the last step wasn't forced.
-			// Timers currently will call their complete callbacks, which
-			// will dequeue but only if they were gotoEnd.
-			if ( dequeue || !gotoEnd ) {
-				jQuery.dequeue( this, type );
-			}
-		} );
-	},
-	finish: function( type ) {
-		if ( type !== false ) {
-			type = type || "fx";
-		}
-		return this.each( function() {
-			var index,
-				data = dataPriv.get( this ),
-				queue = data[ type + "queue" ],
-				hooks = data[ type + "queueHooks" ],
-				timers = jQuery.timers,
-				length = queue ? queue.length : 0;
-
-			// Enable finishing flag on private data
-			data.finish = true;
-
-			// Empty the queue first
-			jQuery.queue( this, type, [] );
-
-			if ( hooks && hooks.stop ) {
-				hooks.stop.call( this, true );
-			}
-
-			// Look for any active animations, and finish them
-			for ( index = timers.length; index--; ) {
-				if ( timers[ index ].elem === this && timers[ index ].queue === type ) {
-					timers[ index ].anim.stop( true );
-					timers.splice( index, 1 );
-				}
-			}
-
-			// Look for any animations in the old queue and finish them
-			for ( index = 0; index < length; index++ ) {
-				if ( queue[ index ] && queue[ index ].finish ) {
-					queue[ index ].finish.call( this );
-				}
-			}
-
-			// Turn off finishing flag
-			delete data.finish;
-		} );
-	}
-} );
-
-jQuery.each( [ "toggle", "show", "hide" ], function( i, name ) {
-	var cssFn = jQuery.fn[ name ];
-	jQuery.fn[ name ] = function( speed, easing, callback ) {
-		return speed == null || typeof speed === "boolean" ?
-			cssFn.apply( this, arguments ) :
-			this.animate( genFx( name, true ), speed, easing, callback );
-	};
-} );
-
-// Generate shortcuts for custom animations
-jQuery.each( {
-	slideDown: genFx( "show" ),
-	slideUp: genFx( "hide" ),
-	slideToggle: genFx( "toggle" ),
-	fadeIn: { opacity: "show" },
-	fadeOut: { opacity: "hide" },
-	fadeToggle: { opacity: "toggle" }
-}, function( name, props ) {
-	jQuery.fn[ name ] = function( speed, easing, callback ) {
-		return this.animate( props, speed, easing, callback );
-	};
-} );
-
-jQuery.timers = [];
-jQuery.fx.tick = function() {
-	var timer,
-		i = 0,
-		timers = jQuery.timers;
-
-	fxNow = Date.now();
-
-	for ( ; i < timers.length; i++ ) {
-		timer = timers[ i ];
-
-		// Run the timer and safely remove it when done (allowing for external removal)
-		if ( !timer() && timers[ i ] === timer ) {
-			timers.splice( i--, 1 );
-		}
-	}
-
-	if ( !timers.length ) {
-		jQuery.fx.stop();
-	}
-	fxNow = undefined;
-};
-
-jQuery.fx.timer = function( timer ) {
-	jQuery.timers.push( timer );
-	jQuery.fx.start();
-};
-
-jQuery.fx.interval = 13;
-jQuery.fx.start = function() {
-	if ( inProgress ) {
-		return;
-	}
-
-	inProgress = true;
-	schedule();
-};
-
-jQuery.fx.stop = function() {
-	inProgress = null;
-};
-
-jQuery.fx.speeds = {
-	slow: 600,
-	fast: 200,
-
-	// Default speed
-	_default: 400
-};
-
-
-// Based off of the plugin by Clint Helfers, with permission.
-// https://web.archive.org/web/20100324014747/http://blindsignals.com/index.php/2009/07/jquery-delay/
-jQuery.fn.delay = function( time, type ) {
-	time = jQuery.fx ? jQuery.fx.speeds[ time ] || time : time;
-	type = type || "fx";
-
-	return this.queue( type, function( next, hooks ) {
-		var timeout = window.setTimeout( next, time );
-		hooks.stop = function() {
-			window.clearTimeout( timeout );
-		};
-	} );
-};
-
-
-( function() {
-	var input = document.createElement( "input" ),
-		select = document.createElement( "select" ),
-		opt = select.appendChild( document.createElement( "option" ) );
-
-	input.type = "checkbox";
-
-	// Support: Android <=4.3 only
-	// Default value for a checkbox should be "on"
-	support.checkOn = input.value !== "";
-
-	// Support: IE <=11 only
-	// Must access selectedIndex to make default options select
-	support.optSelected = opt.selected;
-
-	// Support: IE <=11 only
-	// An input loses its value after becoming a radio
-	input = document.createElement( "input" );
-	input.value = "t";
-	input.type = "radio";
-	support.radioValue = input.value === "t";
-} )();
-
-
-var boolHook,
-	attrHandle = jQuery.expr.attrHandle;
-
-jQuery.fn.extend( {
-	attr: function( name, value ) {
-		return access( this, jQuery.attr, name, value, arguments.length > 1 );
-	},
-
-	removeAttr: function( name ) {
-		return this.each( function() {
-			jQuery.removeAttr( this, name );
-		} );
-	}
-} );
-
-jQuery.extend( {
-	attr: function( elem, name, value ) {
-		var ret, hooks,
-			nType = elem.nodeType;
-
-		// Don't get/set attributes on text, comment and attribute nodes
-		if ( nType === 3 || nType === 8 || nType === 2 ) {
-			return;
-		}
-
-		// Fallback to prop when attributes are not supported
-		if ( typeof elem.getAttribute === "undefined" ) {
-			return jQuery.prop( elem, name, value );
-		}
-
-		// Attribute hooks are determined by the lowercase version
-		// Grab necessary hook if one is defined
-		if ( nType !== 1 || !jQuery.isXMLDoc( elem ) ) {
-			hooks = jQuery.attrHooks[ name.toLowerCase() ] ||
-				( jQuery.expr.match.bool.test( name ) ? boolHook : undefined );
-		}
-
-		if ( value !== undefined ) {
-			if ( value === null ) {
-				jQuery.removeAttr( elem, name );
-				return;
-			}
-
-			if ( hooks && "set" in hooks &&
-				( ret = hooks.set( elem, value, name ) ) !== undefined ) {
-				return ret;
-			}
-
-			elem.setAttribute( name, value + "" );
-			return value;
-		}
-
-		if ( hooks && "get" in hooks && ( ret = hooks.get( elem, name ) ) !== null ) {
-			return ret;
-		}
-
-		ret = jQuery.find.attr( elem, name );
-
-		// Non-existent attributes return null, we normalize to undefined
-		return ret == null ? undefined : ret;
-	},
-
-	attrHooks: {
-		type: {
-			set: function( elem, value ) {
-				if ( !support.radioValue && value === "radio" &&
-					nodeName( elem, "input" ) ) {
-					var val = elem.value;
-					elem.setAttribute( "type", value );
-					if ( val ) {
-						elem.value = val;
-					}
-					return value;
-				}
-			}
-		}
-	},
-
-	removeAttr: function( elem, value ) {
-		var name,
-			i = 0,
-
-			// Attribute names can contain non-HTML whitespace characters
-			// https://html.spec.whatwg.org/multipage/syntax.html#attributes-2
-			attrNames = value && value.match( rnothtmlwhite );
-
-		if ( attrNames && elem.nodeType === 1 ) {
-			while ( ( name = attrNames[ i++ ] ) ) {
-				elem.removeAttribute( name );
-			}
-		}
-	}
-} );
-
-// Hooks for boolean attributes
-boolHook = {
-	set: function( elem, value, name ) {
-		if ( value === false ) {
-
-			// Remove boolean attributes when set to false
-			jQuery.removeAttr( elem, name );
-		} else {
-			elem.setAttribute( name, name );
-		}
-		return name;
-	}
-};
-
-jQuery.each( jQuery.expr.match.bool.source.match( /\w+/g ), function( i, name ) {
-	var getter = attrHandle[ name ] || jQuery.find.attr;
-
-	attrHandle[ name ] = function( elem, name, isXML ) {
-		var ret, handle,
-			lowercaseName = name.toLowerCase();
-
-		if ( !isXML ) {
-
-			// Avoid an infinite loop by temporarily removing this function from the getter
-			handle = attrHandle[ lowercaseName ];
-			attrHandle[ lowercaseName ] = ret;
-			ret = getter( elem, name, isXML ) != null ?
-				lowercaseName :
-				null;
-			attrHandle[ lowercaseName ] = handle;
-		}
-		return ret;
-	};
-} );
-
-
-
-
-var rfocusable = /^(?:input|select|textarea|button)$/i,
-	rclickable = /^(?:a|area)$/i;
-
-jQuery.fn.extend( {
-	prop: function( name, value ) {
-		return access( this, jQuery.prop, name, value, arguments.length > 1 );
-	},
-
-	removeProp: function( name ) {
-		return this.each( function() {
-			delete this[ jQuery.propFix[ name ] || name ];
-		} );
-	}
-} );
-
-jQuery.extend( {
-	prop: function( elem, name, value ) {
-		var ret, hooks,
-			nType = elem.nodeType;
-
-		// Don't get/set properties on text, comment and attribute nodes
-		if ( nType === 3 || nType === 8 || nType === 2 ) {
-			return;
-		}
-
-		if ( nType !== 1 || !jQuery.isXMLDoc( elem ) ) {
-
-			// Fix name and attach hooks
-			name = jQuery.propFix[ name ] || name;
-			hooks = jQuery.propHooks[ name ];
-		}
-
-		if ( value !== undefined ) {
-			if ( hooks && "set" in hooks &&
-				( ret = hooks.set( elem, value, name ) ) !== undefined ) {
-				return ret;
-			}
-
-			return ( elem[ name ] = value );
-		}
-
-		if ( hooks && "get" in hooks && ( ret = hooks.get( elem, name ) ) !== null ) {
-			return ret;
-		}
-
-		return elem[ name ];
-	},
-
-	propHooks: {
-		tabIndex: {
-			get: function( elem ) {
-
-				// Support: IE <=9 - 11 only
-				// elem.tabIndex doesn't always return the
-				// correct value when it hasn't been explicitly set
-				// https://web.archive.org/web/20141116233347/http://fluidproject.org/blog/2008/01/09/getting-setting-and-removing-tabindex-values-with-javascript/
-				// Use proper attribute retrieval(#12072)
-				var tabindex = jQuery.find.attr( elem, "tabindex" );
-
-				if ( tabindex ) {
-					return parseInt( tabindex, 10 );
-				}
-
-				if (
-					rfocusable.test( elem.nodeName ) ||
-					rclickable.test( elem.nodeName ) &&
-					elem.href
-				) {
-					return 0;
-				}
-
-				return -1;
-			}
-		}
-	},
-
-	propFix: {
-		"for": "htmlFor",
-		"class": "className"
-	}
-} );
-
-// Support: IE <=11 only
-// Accessing the selectedIndex property
-// forces the browser to respect setting selected
-// on the option
-// The getter ensures a default option is selected
-// when in an optgroup
-// eslint rule "no-unused-expressions" is disabled for this code
-// since it considers such accessions noop
-if ( !support.optSelected ) {
-	jQuery.propHooks.selected = {
-		get: function( elem ) {
-
-			/* eslint no-unused-expressions: "off" */
-
-			var parent = elem.parentNode;
-			if ( parent && parent.parentNode ) {
-				parent.parentNode.selectedIndex;
-			}
-			return null;
-		},
-		set: function( elem ) {
-
-			/* eslint no-unused-expressions: "off" */
-
-			var parent = elem.parentNode;
-			if ( parent ) {
-				parent.selectedIndex;
-
-				if ( parent.parentNode ) {
-					parent.parentNode.selectedIndex;
-				}
-			}
-		}
-	};
-}
-
-jQuery.each( [
-	"tabIndex",
-	"readOnly",
-	"maxLength",
-	"cellSpacing",
-	"cellPadding",
-	"rowSpan",
-	"colSpan",
-	"useMap",
-	"frameBorder",
-	"contentEditable"
-], function() {
-	jQuery.propFix[ this.toLowerCase() ] = this;
-} );
-
-
-
-
-	// Strip and collapse whitespace according to HTML spec
-	// https://infra.spec.whatwg.org/#strip-and-collapse-ascii-whitespace
-	function stripAndCollapse( value ) {
-		var tokens = value.match( rnothtmlwhite ) || [];
-		return tokens.join( " " );
-	}
-
-
-function getClass( elem ) {
-	return elem.getAttribute && elem.getAttribute( "class" ) || "";
-}
-
-function classesToArray( value ) {
-	if ( Array.isArray( value ) ) {
-		return value;
-	}
-	if ( typeof value === "string" ) {
-		return value.match( rnothtmlwhite ) || [];
-	}
-	return [];
-}
-
-jQuery.fn.extend( {
-	addClass: function( value ) {
-		var classes, elem, cur, curValue, clazz, j, finalValue,
-			i = 0;
-
-		if ( isFunction( value ) ) {
-			return this.each( function( j ) {
-				jQuery( this ).addClass( value.call( this, j, getClass( this ) ) );
-			} );
-		}
-
-		classes = classesToArray( value );
-
-		if ( classes.length ) {
-			while ( ( elem = this[ i++ ] ) ) {
-				curValue = getClass( elem );
-				cur = elem.nodeType === 1 && ( " " + stripAndCollapse( curValue ) + " " );
-
-				if ( cur ) {
-					j = 0;
-					while ( ( clazz = classes[ j++ ] ) ) {
-						if ( cur.indexOf( " " + clazz + " " ) < 0 ) {
-							cur += clazz + " ";
-						}
-					}
-
-					// Only assign if different to avoid unneeded rendering.
-					finalValue = stripAndCollapse( cur );
-					if ( curValue !== finalValue ) {
-						elem.setAttribute( "class", finalValue );
-					}
-				}
-			}
-		}
-
-		return this;
-	},
-
-	removeClass: function( value ) {
-		var classes, elem, cur, curValue, clazz, j, finalValue,
-			i = 0;
-
-		if ( isFunction( value ) ) {
-			return this.each( function( j ) {
-				jQuery( this ).removeClass( value.call( this, j, getClass( this ) ) );
-			} );
-		}
-
-		if ( !arguments.length ) {
-			return this.attr( "class", "" );
-		}
-
-		classes = classesToArray( value );
-
-		if ( classes.length ) {
-			while ( ( elem = this[ i++ ] ) ) {
-				curValue = getClass( elem );
-
-				// This expression is here for better compressibility (see addClass)
-				cur = elem.nodeType === 1 && ( " " + stripAndCollapse( curValue ) + " " );
-
-				if ( cur ) {
-					j = 0;
-					while ( ( clazz = classes[ j++ ] ) ) {
-
-						// Remove *all* instances
-						while ( cur.indexOf( " " + clazz + " " ) > -1 ) {
-							cur = cur.replace( " " + clazz + " ", " " );
-						}
-					}
-
-					// Only assign if different to avoid unneeded rendering.
-					finalValue = stripAndCollapse( cur );
-					if ( curValue !== finalValue ) {
-						elem.setAttribute( "class", finalValue );
-					}
-				}
-			}
-		}
-
-		return this;
-	},
-
-	toggleClass: function( value, stateVal ) {
-		var type = typeof value,
-			isValidValue = type === "string" || Array.isArray( value );
-
-		if ( typeof stateVal === "boolean" && isValidValue ) {
-			return stateVal ? this.addClass( value ) : this.removeClass( value );
-		}
-
-		if ( isFunction( value ) ) {
-			return this.each( function( i ) {
-				jQuery( this ).toggleClass(
-					value.call( this, i, getClass( this ), stateVal ),
-					stateVal
-				);
-			} );
-		}
-
-		return this.each( function() {
-			var className, i, self, classNames;
-
-			if ( isValidValue ) {
-
-				// Toggle individual class names
-				i = 0;
-				self = jQuery( this );
-				classNames = classesToArray( value );
-
-				while ( ( className = classNames[ i++ ] ) ) {
-
-					// Check each className given, space separated list
-					if ( self.hasClass( className ) ) {
-						self.removeClass( className );
-					} else {
-						self.addClass( className );
-					}
-				}
-
-			// Toggle whole class name
-			} else if ( value === undefined || type === "boolean" ) {
-				className = getClass( this );
-				if ( className ) {
-
-					// Store className if set
-					dataPriv.set( this, "__className__", className );
-				}
-
-				// If the element has a class name or if we're passed `false`,
-				// then remove the whole classname (if there was one, the above saved it).
-				// Otherwise bring back whatever was previously saved (if anything),
-				// falling back to the empty string if nothing was stored.
-				if ( this.setAttribute ) {
-					this.setAttribute( "class",
-						className || value === false ?
-						"" :
-						dataPriv.get( this, "__className__" ) || ""
-					);
-				}
-			}
-		} );
-	},
-
-	hasClass: function( selector ) {
-		var className, elem,
-			i = 0;
-
-		className = " " + selector + " ";
-		while ( ( elem = this[ i++ ] ) ) {
-			if ( elem.nodeType === 1 &&
-				( " " + stripAndCollapse( getClass( elem ) ) + " " ).indexOf( className ) > -1 ) {
-					return true;
-			}
-		}
-
-		return false;
-	}
-} );
-
-
-
-
-var rreturn = /\r/g;
-
-jQuery.fn.extend( {
-	val: function( value ) {
-		var hooks, ret, valueIsFunction,
-			elem = this[ 0 ];
-
-		if ( !arguments.length ) {
-			if ( elem ) {
-				hooks = jQuery.valHooks[ elem.type ] ||
-					jQuery.valHooks[ elem.nodeName.toLowerCase() ];
-
-				if ( hooks &&
-					"get" in hooks &&
-					( ret = hooks.get( elem, "value" ) ) !== undefined
-				) {
-					return ret;
-				}
-
-				ret = elem.value;
-
-				// Handle most common string cases
-				if ( typeof ret === "string" ) {
-					return ret.replace( rreturn, "" );
-				}
-
-				// Handle cases where value is null/undef or number
-				return ret == null ? "" : ret;
-			}
-
-			return;
-		}
-
-		valueIsFunction = isFunction( value );
-
-		return this.each( function( i ) {
-			var val;
-
-			if ( this.nodeType !== 1 ) {
-				return;
-			}
-
-			if ( valueIsFunction ) {
-				val = value.call( this, i, jQuery( this ).val() );
-			} else {
-				val = value;
-			}
-
-			// Treat null/undefined as ""; convert numbers to string
-			if ( val == null ) {
-				val = "";
-
-			} else if ( typeof val === "number" ) {
-				val += "";
-
-			} else if ( Array.isArray( val ) ) {
-				val = jQuery.map( val, function( value ) {
-					return value == null ? "" : value + "";
-				} );
-			}
-
-			hooks = jQuery.valHooks[ this.type ] || jQuery.valHooks[ this.nodeName.toLowerCase() ];
-
-			// If set returns undefined, fall back to normal setting
-			if ( !hooks || !( "set" in hooks ) || hooks.set( this, val, "value" ) === undefined ) {
-				this.value = val;
-			}
-		} );
-	}
-} );
-
-jQuery.extend( {
-	valHooks: {
-		option: {
-			get: function( elem ) {
-
-				var val = jQuery.find.attr( elem, "value" );
-				return val != null ?
-					val :
-
-					// Support: IE <=10 - 11 only
-					// option.text throws exceptions (#14686, #14858)
-					// Strip and collapse whitespace
-					// https://html.spec.whatwg.org/#strip-and-collapse-whitespace
-					stripAndCollapse( jQuery.text( elem ) );
-			}
-		},
-		select: {
-			get: function( elem ) {
-				var value, option, i,
-					options = elem.options,
-					index = elem.selectedIndex,
-					one = elem.type === "select-one",
-					values = one ? null : [],
-					max = one ? index + 1 : options.length;
-
-				if ( index < 0 ) {
-					i = max;
-
-				} else {
-					i = one ? index : 0;
-				}
-
-				// Loop through all the selected options
-				for ( ; i < max; i++ ) {
-					option = options[ i ];
-
-					// Support: IE <=9 only
-					// IE8-9 doesn't update selected after form reset (#2551)
-					if ( ( option.selected || i === index ) &&
-
-							// Don't return options that are disabled or in a disabled optgroup
-							!option.disabled &&
-							( !option.parentNode.disabled ||
-								!nodeName( option.parentNode, "optgroup" ) ) ) {
-
-						// Get the specific value for the option
-						value = jQuery( option ).val();
-
-						// We don't need an array for one selects
-						if ( one ) {
-							return value;
-						}
-
-						// Multi-Selects return an array
-						values.push( value );
-					}
-				}
-
-				return values;
-			},
-
-			set: function( elem, value ) {
-				var optionSet, option,
-					options = elem.options,
-					values = jQuery.makeArray( value ),
-					i = options.length;
-
-				while ( i-- ) {
-					option = options[ i ];
-
-					/* eslint-disable no-cond-assign */
-
-					if ( option.selected =
-						jQuery.inArray( jQuery.valHooks.option.get( option ), values ) > -1
-					) {
-						optionSet = true;
-					}
-
-					/* eslint-enable no-cond-assign */
-				}
-
-				// Force browsers to behave consistently when non-matching value is set
-				if ( !optionSet ) {
-					elem.selectedIndex = -1;
-				}
-				return values;
-			}
-		}
-	}
-} );
-
-// Radios and checkboxes getter/setter
-jQuery.each( [ "radio", "checkbox" ], function() {
-	jQuery.valHooks[ this ] = {
-		set: function( elem, value ) {
-			if ( Array.isArray( value ) ) {
-				return ( elem.checked = jQuery.inArray( jQuery( elem ).val(), value ) > -1 );
-			}
-		}
-	};
-	if ( !support.checkOn ) {
-		jQuery.valHooks[ this ].get = function( elem ) {
-			return elem.getAttribute( "value" ) === null ? "on" : elem.value;
-		};
-	}
-} );
-
-
-
-
-// Return jQuery for attributes-only inclusion
-
-
-support.focusin = "onfocusin" in window;
-
-
-var rfocusMorph = /^(?:focusinfocus|focusoutblur)$/,
-	stopPropagationCallback = function( e ) {
-		e.stopPropagation();
-	};
-
-jQuery.extend( jQuery.event, {
-
-	trigger: function( event, data, elem, onlyHandlers ) {
-
-		var i, cur, tmp, bubbleType, ontype, handle, special, lastElement,
-			eventPath = [ elem || document ],
-			type = hasOwn.call( event, "type" ) ? event.type : event,
-			namespaces = hasOwn.call( event, "namespace" ) ? event.namespace.split( "." ) : [];
-
-		cur = lastElement = tmp = elem = elem || document;
-
-		// Don't do events on text and comment nodes
-		if ( elem.nodeType === 3 || elem.nodeType === 8 ) {
-			return;
-		}
-
-		// focus/blur morphs to focusin/out; ensure we're not firing them right now
-		if ( rfocusMorph.test( type + jQuery.event.triggered ) ) {
-			return;
-		}
-
-		if ( type.indexOf( "." ) > -1 ) {
-
-			// Namespaced trigger; create a regexp to match event type in handle()
-			namespaces = type.split( "." );
-			type = namespaces.shift();
-			namespaces.sort();
-		}
-		ontype = type.indexOf( ":" ) < 0 && "on" + type;
-
-		// Caller can pass in a jQuery.Event object, Object, or just an event type string
-		event = event[ jQuery.expando ] ?
-			event :
-			new jQuery.Event( type, typeof event === "object" && event );
-
-		// Trigger bitmask: & 1 for native handlers; & 2 for jQuery (always true)
-		event.isTrigger = onlyHandlers ? 2 : 3;
-		event.namespace = namespaces.join( "." );
-		event.rnamespace = event.namespace ?
-			new RegExp( "(^|\\.)" + namespaces.join( "\\.(?:.*\\.|)" ) + "(\\.|$)" ) :
-			null;
-
-		// Clean up the event in case it is being reused
-		event.result = undefined;
-		if ( !event.target ) {
-			event.target = elem;
-		}
-
-		// Clone any incoming data and prepend the event, creating the handler arg list
-		data = data == null ?
-			[ event ] :
-			jQuery.makeArray( data, [ event ] );
-
-		// Allow special events to draw outside the lines
-		special = jQuery.event.special[ type ] || {};
-		if ( !onlyHandlers && special.trigger && special.trigger.apply( elem, data ) === false ) {
-			return;
-		}
-
-		// Determine event propagation path in advance, per W3C events spec (#9951)
-		// Bubble up to document, then to window; watch for a global ownerDocument var (#9724)
-		if ( !onlyHandlers && !special.noBubble && !isWindow( elem ) ) {
-
-			bubbleType = special.delegateType || type;
-			if ( !rfocusMorph.test( bubbleType + type ) ) {
-				cur = cur.parentNode;
-			}
-			for ( ; cur; cur = cur.parentNode ) {
-				eventPath.push( cur );
-				tmp = cur;
-			}
-
-			// Only add window if we got to document (e.g., not plain obj or detached DOM)
-			if ( tmp === ( elem.ownerDocument || document ) ) {
-				eventPath.push( tmp.defaultView || tmp.parentWindow || window );
-			}
-		}
-
-		// Fire handlers on the event path
-		i = 0;
-		while ( ( cur = eventPath[ i++ ] ) && !event.isPropagationStopped() ) {
-			lastElement = cur;
-			event.type = i > 1 ?
-				bubbleType :
-				special.bindType || type;
-
-			// jQuery handler
-			handle = ( dataPriv.get( cur, "events" ) || {} )[ event.type ] &&
-				dataPriv.get( cur, "handle" );
-			if ( handle ) {
-				handle.apply( cur, data );
-			}
-
-			// Native handler
-			handle = ontype && cur[ ontype ];
-			if ( handle && handle.apply && acceptData( cur ) ) {
-				event.result = handle.apply( cur, data );
-				if ( event.result === false ) {
-					event.preventDefault();
-				}
-			}
-		}
-		event.type = type;
-
-		// If nobody prevented the default action, do it now
-		if ( !onlyHandlers && !event.isDefaultPrevented() ) {
-
-			if ( ( !special._default ||
-				special._default.apply( eventPath.pop(), data ) === false ) &&
-				acceptData( elem ) ) {
-
-				// Call a native DOM method on the target with the same name as the event.
-				// Don't do default actions on window, that's where global variables be (#6170)
-				if ( ontype && isFunction( elem[ type ] ) && !isWindow( elem ) ) {
-
-					// Don't re-trigger an onFOO event when we call its FOO() method
-					tmp = elem[ ontype ];
-
-					if ( tmp ) {
-						elem[ ontype ] = null;
-					}
-
-					// Prevent re-triggering of the same event, since we already bubbled it above
-					jQuery.event.triggered = type;
-
-					if ( event.isPropagationStopped() ) {
-						lastElement.addEventListener( type, stopPropagationCallback );
-					}
-
-					elem[ type ]();
-
-					if ( event.isPropagationStopped() ) {
-						lastElement.removeEventListener( type, stopPropagationCallback );
-					}
-
-					jQuery.event.triggered = undefined;
-
-					if ( tmp ) {
-						elem[ ontype ] = tmp;
-					}
-				}
-			}
-		}
-
-		return event.result;
-	},
-
-	// Piggyback on a donor event to simulate a different one
-	// Used only for `focus(in | out)` events
-	simulate: function( type, elem, event ) {
-		var e = jQuery.extend(
-			new jQuery.Event(),
-			event,
-			{
-				type: type,
-				isSimulated: true
-			}
-		);
-
-		jQuery.event.trigger( e, null, elem );
-	}
-
-} );
-
-jQuery.fn.extend( {
-
-	trigger: function( type, data ) {
-		return this.each( function() {
-			jQuery.event.trigger( type, data, this );
-		} );
-	},
-	triggerHandler: function( type, data ) {
-		var elem = this[ 0 ];
-		if ( elem ) {
-			return jQuery.event.trigger( type, data, elem, true );
-		}
-	}
-} );
-
-
-// Support: Firefox <=44
-// Firefox doesn't have focus(in | out) events
-// Related ticket - https://bugzilla.mozilla.org/show_bug.cgi?id=687787
-//
-// Support: Chrome <=48 - 49, Safari <=9.0 - 9.1
-// focus(in | out) events fire after focus & blur events,
-// which is spec violation - http://www.w3.org/TR/DOM-Level-3-Events/#events-focusevent-event-order
-// Related ticket - https://bugs.chromium.org/p/chromium/issues/detail?id=449857
-if ( !support.focusin ) {
-	jQuery.each( { focus: "focusin", blur: "focusout" }, function( orig, fix ) {
-
-		// Attach a single capturing handler on the document while someone wants focusin/focusout
-		var handler = function( event ) {
-			jQuery.event.simulate( fix, event.target, jQuery.event.fix( event ) );
-		};
-
-		jQuery.event.special[ fix ] = {
-			setup: function() {
-				var doc = this.ownerDocument || this,
-					attaches = dataPriv.access( doc, fix );
-
-				if ( !attaches ) {
-					doc.addEventListener( orig, handler, true );
-				}
-				dataPriv.access( doc, fix, ( attaches || 0 ) + 1 );
-			},
-			teardown: function() {
-				var doc = this.ownerDocument || this,
-					attaches = dataPriv.access( doc, fix ) - 1;
-
-				if ( !attaches ) {
-					doc.removeEventListener( orig, handler, true );
-					dataPriv.remove( doc, fix );
-
-				} else {
-					dataPriv.access( doc, fix, attaches );
-				}
-			}
-		};
-	} );
-}
-var location = window.location;
-
-var nonce = Date.now();
-
-var rquery = ( /\?/ );
-
-
-
-// Cross-browser xml parsing
-jQuery.parseXML = function( data ) {
-	var xml;
-	if ( !data || typeof data !== "string" ) {
-		return null;
-	}
-
-	// Support: IE 9 - 11 only
-	// IE throws on parseFromString with invalid input.
-	try {
-		xml = ( new window.DOMParser() ).parseFromString( data, "text/xml" );
-	} catch ( e ) {
-		xml = undefined;
-	}
-
-	if ( !xml || xml.getElementsByTagName( "parsererror" ).length ) {
-		jQuery.error( "Invalid XML: " + data );
-	}
-	return xml;
-};
-
-
-var
-	rbracket = /\[\]$/,
-	rCRLF = /\r?\n/g,
-	rsubmitterTypes = /^(?:submit|button|image|reset|file)$/i,
-	rsubmittable = /^(?:input|select|textarea|keygen)/i;
-
-function buildParams( prefix, obj, traditional, add ) {
-	var name;
-
-	if ( Array.isArray( obj ) ) {
-
-		// Serialize array item.
-		jQuery.each( obj, function( i, v ) {
-			if ( traditional || rbracket.test( prefix ) ) {
-
-				// Treat each array item as a scalar.
-				add( prefix, v );
-
-			} else {
-
-				// Item is non-scalar (array or object), encode its numeric index.
-				buildParams(
-					prefix + "[" + ( typeof v === "object" && v != null ? i : "" ) + "]",
-					v,
-					traditional,
-					add
-				);
-			}
-		} );
-
-	} else if ( !traditional && toType( obj ) === "object" ) {
-
-		// Serialize object item.
-		for ( name in obj ) {
-			buildParams( prefix + "[" + name + "]", obj[ name ], traditional, add );
-		}
-
-	} else {
-
-		// Serialize scalar item.
-		add( prefix, obj );
-	}
-}
-
-// Serialize an array of form elements or a set of
-// key/values into a query string
-jQuery.param = function( a, traditional ) {
-	var prefix,
-		s = [],
-		add = function( key, valueOrFunction ) {
-
-			// If value is a function, invoke it and use its return value
-			var value = isFunction( valueOrFunction ) ?
-				valueOrFunction() :
-				valueOrFunction;
-
-			s[ s.length ] = encodeURIComponent( key ) + "=" +
-				encodeURIComponent( value == null ? "" : value );
-		};
-
-	// If an array was passed in, assume that it is an array of form elements.
-	if ( Array.isArray( a ) || ( a.jquery && !jQuery.isPlainObject( a ) ) ) {
-
-		// Serialize the form elements
-		jQuery.each( a, function() {
-			add( this.name, this.value );
-		} );
-
-	} else {
-
-		// If traditional, encode the "old" way (the way 1.3.2 or older
-		// did it), otherwise encode params recursively.
-		for ( prefix in a ) {
-			buildParams( prefix, a[ prefix ], traditional, add );
-		}
-	}
-
-	// Return the resulting serialization
-	return s.join( "&" );
-};
-
-jQuery.fn.extend( {
-	serialize: function() {
-		return jQuery.param( this.serializeArray() );
-	},
-	serializeArray: function() {
-		return this.map( function() {
-
-			// Can add propHook for "elements" to filter or add form elements
-			var elements = jQuery.prop( this, "elements" );
-			return elements ? jQuery.makeArray( elements ) : this;
-		} )
-		.filter( function() {
-			var type = this.type;
-
-			// Use .is( ":disabled" ) so that fieldset[disabled] works
-			return this.name && !jQuery( this ).is( ":disabled" ) &&
-				rsubmittable.test( this.nodeName ) && !rsubmitterTypes.test( type ) &&
-				( this.checked || !rcheckableType.test( type ) );
-		} )
-		.map( function( i, elem ) {
-			var val = jQuery( this ).val();
-
-			if ( val == null ) {
-				return null;
-			}
-
-			if ( Array.isArray( val ) ) {
-				return jQuery.map( val, function( val ) {
-					return { name: elem.name, value: val.replace( rCRLF, "\r\n" ) };
-				} );
-			}
-
-			return { name: elem.name, value: val.replace( rCRLF, "\r\n" ) };
-		} ).get();
-	}
-} );
-
-
-var
-	r20 = /%20/g,
-	rhash = /#.*$/,
-	rantiCache = /([?&])_=[^&]*/,
-	rheaders = /^(.*?):[ \t]*([^\r\n]*)$/mg,
-
-	// #7653, #8125, #8152: local protocol detection
-	rlocalProtocol = /^(?:about|app|app-storage|.+-extension|file|res|widget):$/,
-	rnoContent = /^(?:GET|HEAD)$/,
-	rprotocol = /^\/\//,
-
-	/* Prefilters
-	 * 1) They are useful to introduce custom dataTypes (see ajax/jsonp.js for an example)
-	 * 2) These are called:
-	 *    - BEFORE asking for a transport
-	 *    - AFTER param serialization (s.data is a string if s.processData is true)
-	 * 3) key is the dataType
-	 * 4) the catchall symbol "*" can be used
-	 * 5) execution will start with transport dataType and THEN continue down to "*" if needed
-	 */
-	prefilters = {},
-
-	/* Transports bindings
-	 * 1) key is the dataType
-	 * 2) the catchall symbol "*" can be used
-	 * 3) selection will start with transport dataType and THEN go to "*" if needed
-	 */
-	transports = {},
-
-	// Avoid comment-prolog char sequence (#10098); must appease lint and evade compression
-	allTypes = "*/".concat( "*" ),
-
-	// Anchor tag for parsing the document origin
-	originAnchor = document.createElement( "a" );
-	originAnchor.href = location.href;
-
-// Base "constructor" for jQuery.ajaxPrefilter and jQuery.ajaxTransport
-function addToPrefiltersOrTransports( structure ) {
-
-	// dataTypeExpression is optional and defaults to "*"
-	return function( dataTypeExpression, func ) {
-
-		if ( typeof dataTypeExpression !== "string" ) {
-			func = dataTypeExpression;
-			dataTypeExpression = "*";
-		}
-
-		var dataType,
-			i = 0,
-			dataTypes = dataTypeExpression.toLowerCase().match( rnothtmlwhite ) || [];
-
-		if ( isFunction( func ) ) {
-
-			// For each dataType in the dataTypeExpression
-			while ( ( dataType = dataTypes[ i++ ] ) ) {
-
-				// Prepend if requested
-				if ( dataType[ 0 ] === "+" ) {
-					dataType = dataType.slice( 1 ) || "*";
-					( structure[ dataType ] = structure[ dataType ] || [] ).unshift( func );
-
-				// Otherwise append
-				} else {
-					( structure[ dataType ] = structure[ dataType ] || [] ).push( func );
-				}
-			}
-		}
-	};
-}
-
-// Base inspection function for prefilters and transports
-function inspectPrefiltersOrTransports( structure, options, originalOptions, jqXHR ) {
-
-	var inspected = {},
-		seekingTransport = ( structure === transports );
-
-	function inspect( dataType ) {
-		var selected;
-		inspected[ dataType ] = true;
-		jQuery.each( structure[ dataType ] || [], function( _, prefilterOrFactory ) {
-			var dataTypeOrTransport = prefilterOrFactory( options, originalOptions, jqXHR );
-			if ( typeof dataTypeOrTransport === "string" &&
-				!seekingTransport && !inspected[ dataTypeOrTransport ] ) {
-
-				options.dataTypes.unshift( dataTypeOrTransport );
-				inspect( dataTypeOrTransport );
-				return false;
-			} else if ( seekingTransport ) {
-				return !( selected = dataTypeOrTransport );
-			}
-		} );
-		return selected;
-	}
-
-	return inspect( options.dataTypes[ 0 ] ) || !inspected[ "*" ] && inspect( "*" );
-}
-
-// A special extend for ajax options
-// that takes "flat" options (not to be deep extended)
-// Fixes #9887
-function ajaxExtend( target, src ) {
-	var key, deep,
-		flatOptions = jQuery.ajaxSettings.flatOptions || {};
-
-	for ( key in src ) {
-		if ( src[ key ] !== undefined ) {
-			( flatOptions[ key ] ? target : ( deep || ( deep = {} ) ) )[ key ] = src[ key ];
-		}
-	}
-	if ( deep ) {
-		jQuery.extend( true, target, deep );
-	}
-
-	return target;
-}
-
-/* Handles responses to an ajax request:
- * - finds the right dataType (mediates between content-type and expected dataType)
- * - returns the corresponding response
- */
-function ajaxHandleResponses( s, jqXHR, responses ) {
-
-	var ct, type, finalDataType, firstDataType,
-		contents = s.contents,
-		dataTypes = s.dataTypes;
-
-	// Remove auto dataType and get content-type in the process
-	while ( dataTypes[ 0 ] === "*" ) {
-		dataTypes.shift();
-		if ( ct === undefined ) {
-			ct = s.mimeType || jqXHR.getResponseHeader( "Content-Type" );
-		}
-	}
-
-	// Check if we're dealing with a known content-type
-	if ( ct ) {
-		for ( type in contents ) {
-			if ( contents[ type ] && contents[ type ].test( ct ) ) {
-				dataTypes.unshift( type );
-				break;
-			}
-		}
-	}
-
-	// Check to see if we have a response for the expected dataType
-	if ( dataTypes[ 0 ] in responses ) {
-		finalDataType = dataTypes[ 0 ];
-	} else {
-
-		// Try convertible dataTypes
-		for ( type in responses ) {
-			if ( !dataTypes[ 0 ] || s.converters[ type + " " + dataTypes[ 0 ] ] ) {
-				finalDataType = type;
-				break;
-			}
-			if ( !firstDataType ) {
-				firstDataType = type;
-			}
-		}
-
-		// Or just use first one
-		finalDataType = finalDataType || firstDataType;
-	}
-
-	// If we found a dataType
-	// We add the dataType to the list if needed
-	// and return the corresponding response
-	if ( finalDataType ) {
-		if ( finalDataType !== dataTypes[ 0 ] ) {
-			dataTypes.unshift( finalDataType );
-		}
-		return responses[ finalDataType ];
-	}
-}
-
-/* Chain conversions given the request and the original response
- * Also sets the responseXXX fields on the jqXHR instance
- */
-function ajaxConvert( s, response, jqXHR, isSuccess ) {
-	var conv2, current, conv, tmp, prev,
-		converters = {},
-
-		// Work with a copy of dataTypes in case we need to modify it for conversion
-		dataTypes = s.dataTypes.slice();
-
-	// Create converters map with lowercased keys
-	if ( dataTypes[ 1 ] ) {
-		for ( conv in s.converters ) {
-			converters[ conv.toLowerCase() ] = s.converters[ conv ];
-		}
-	}
-
-	current = dataTypes.shift();
-
-	// Convert to each sequential dataType
-	while ( current ) {
-
-		if ( s.responseFields[ current ] ) {
-			jqXHR[ s.responseFields[ current ] ] = response;
-		}
-
-		// Apply the dataFilter if provided
-		if ( !prev && isSuccess && s.dataFilter ) {
-			response = s.dataFilter( response, s.dataType );
-		}
-
-		prev = current;
-		current = dataTypes.shift();
-
-		if ( current ) {
-
-			// There's only work to do if current dataType is non-auto
-			if ( current === "*" ) {
-
-				current = prev;
-
-			// Convert response if prev dataType is non-auto and differs from current
-			} else if ( prev !== "*" && prev !== current ) {
-
-				// Seek a direct converter
-				conv = converters[ prev + " " + current ] || converters[ "* " + current ];
-
-				// If none found, seek a pair
-				if ( !conv ) {
-					for ( conv2 in converters ) {
-
-						// If conv2 outputs current
-						tmp = conv2.split( " " );
-						if ( tmp[ 1 ] === current ) {
-
-							// If prev can be converted to accepted input
-							conv = converters[ prev + " " + tmp[ 0 ] ] ||
-								converters[ "* " + tmp[ 0 ] ];
-							if ( conv ) {
-
-								// Condense equivalence converters
-								if ( conv === true ) {
-									conv = converters[ conv2 ];
-
-								// Otherwise, insert the intermediate dataType
-								} else if ( converters[ conv2 ] !== true ) {
-									current = tmp[ 0 ];
-									dataTypes.unshift( tmp[ 1 ] );
-								}
-								break;
-							}
-						}
-					}
-				}
-
-				// Apply converter (if not an equivalence)
-				if ( conv !== true ) {
-
-					// Unless errors are allowed to bubble, catch and return them
-					if ( conv && s.throws ) {
-						response = conv( response );
-					} else {
-						try {
-							response = conv( response );
-						} catch ( e ) {
-							return {
-								state: "parsererror",
-								error: conv ? e : "No conversion from " + prev + " to " + current
-							};
-						}
-					}
-				}
-			}
-		}
-	}
-
-	return { state: "success", data: response };
-}
-
-jQuery.extend( {
-
-	// Counter for holding the number of active queries
-	active: 0,
-
-	// Last-Modified header cache for next request
-	lastModified: {},
-	etag: {},
-
-	ajaxSettings: {
-		url: location.href,
-		type: "GET",
-		isLocal: rlocalProtocol.test( location.protocol ),
-		global: true,
-		processData: true,
-		async: true,
-		contentType: "application/x-www-form-urlencoded; charset=UTF-8",
-
-		/*
-		timeout: 0,
-		data: null,
-		dataType: null,
-		username: null,
-		password: null,
-		cache: null,
-		throws: false,
-		traditional: false,
-		headers: {},
-		*/
-
-		accepts: {
-			"*": allTypes,
-			text: "text/plain",
-			html: "text/html",
-			xml: "application/xml, text/xml",
-			json: "application/json, text/javascript"
-		},
-
-		contents: {
-			xml: /\bxml\b/,
-			html: /\bhtml/,
-			json: /\bjson\b/
-		},
-
-		responseFields: {
-			xml: "responseXML",
-			text: "responseText",
-			json: "responseJSON"
-		},
-
-		// Data converters
-		// Keys separate source (or catchall "*") and destination types with a single space
-		converters: {
-
-			// Convert anything to text
-			"* text": String,
-
-			// Text to html (true = no transformation)
-			"text html": true,
-
-			// Evaluate text as a json expression
-			"text json": JSON.parse,
-
-			// Parse text as xml
-			"text xml": jQuery.parseXML
-		},
-
-		// For options that shouldn't be deep extended:
-		// you can add your own custom options here if
-		// and when you create one that shouldn't be
-		// deep extended (see ajaxExtend)
-		flatOptions: {
-			url: true,
-			context: true
-		}
-	},
-
-	// Creates a full fledged settings object into target
-	// with both ajaxSettings and settings fields.
-	// If target is omitted, writes into ajaxSettings.
-	ajaxSetup: function( target, settings ) {
-		return settings ?
-
-			// Building a settings object
-			ajaxExtend( ajaxExtend( target, jQuery.ajaxSettings ), settings ) :
-
-			// Extending ajaxSettings
-			ajaxExtend( jQuery.ajaxSettings, target );
-	},
-
-	ajaxPrefilter: addToPrefiltersOrTransports( prefilters ),
-	ajaxTransport: addToPrefiltersOrTransports( transports ),
-
-	// Main method
-	ajax: function( url, options ) {
-
-		// If url is an object, simulate pre-1.5 signature
-		if ( typeof url === "object" ) {
-			options = url;
-			url = undefined;
-		}
-
-		// Force options to be an object
-		options = options || {};
-
-		var transport,
-
-			// URL without anti-cache param
-			cacheURL,
-
-			// Response headers
-			responseHeadersString,
-			responseHeaders,
-
-			// timeout handle
-			timeoutTimer,
-
-			// Url cleanup var
-			urlAnchor,
-
-			// Request state (becomes false upon send and true upon completion)
-			completed,
-
-			// To know if global events are to be dispatched
-			fireGlobals,
-
-			// Loop variable
-			i,
-
-			// uncached part of the url
-			uncached,
-
-			// Create the final options object
-			s = jQuery.ajaxSetup( {}, options ),
-
-			// Callbacks context
-			callbackContext = s.context || s,
-
-			// Context for global events is callbackContext if it is a DOM node or jQuery collection
-			globalEventContext = s.context &&
-				( callbackContext.nodeType || callbackContext.jquery ) ?
-					jQuery( callbackContext ) :
-					jQuery.event,
-
-			// Deferreds
-			deferred = jQuery.Deferred(),
-			completeDeferred = jQuery.Callbacks( "once memory" ),
-
-			// Status-dependent callbacks
-			statusCode = s.statusCode || {},
-
-			// Headers (they are sent all at once)
-			requestHeaders = {},
-			requestHeadersNames = {},
-
-			// Default abort message
-			strAbort = "canceled",
-
-			// Fake xhr
-			jqXHR = {
-				readyState: 0,
-
-				// Builds headers hashtable if needed
-				getResponseHeader: function( key ) {
-					var match;
-					if ( completed ) {
-						if ( !responseHeaders ) {
-							responseHeaders = {};
-							while ( ( match = rheaders.exec( responseHeadersString ) ) ) {
-								responseHeaders[ match[ 1 ].toLowerCase() ] = match[ 2 ];
-							}
-						}
-						match = responseHeaders[ key.toLowerCase() ];
-					}
-					return match == null ? null : match;
-				},
-
-				// Raw string
-				getAllResponseHeaders: function() {
-					return completed ? responseHeadersString : null;
-				},
-
-				// Caches the header
-				setRequestHeader: function( name, value ) {
-					if ( completed == null ) {
-						name = requestHeadersNames[ name.toLowerCase() ] =
-							requestHeadersNames[ name.toLowerCase() ] || name;
-						requestHeaders[ name ] = value;
-					}
-					return this;
-				},
-
-				// Overrides response content-type header
-				overrideMimeType: function( type ) {
-					if ( completed == null ) {
-						s.mimeType = type;
-					}
-					return this;
-				},
-
-				// Status-dependent callbacks
-				statusCode: function( map ) {
-					var code;
-					if ( map ) {
-						if ( completed ) {
-
-							// Execute the appropriate callbacks
-							jqXHR.always( map[ jqXHR.status ] );
-						} else {
-
-							// Lazy-add the new callbacks in a way that preserves old ones
-							for ( code in map ) {
-								statusCode[ code ] = [ statusCode[ code ], map[ code ] ];
-							}
-						}
-					}
-					return this;
-				},
-
-				// Cancel the request
-				abort: function( statusText ) {
-					var finalText = statusText || strAbort;
-					if ( transport ) {
-						transport.abort( finalText );
-					}
-					done( 0, finalText );
-					return this;
-				}
-			};
-
-		// Attach deferreds
-		deferred.promise( jqXHR );
-
-		// Add protocol if not provided (prefilters might expect it)
-		// Handle falsy url in the settings object (#10093: consistency with old signature)
-		// We also use the url parameter if available
-		s.url = ( ( url || s.url || location.href ) + "" )
-			.replace( rprotocol, location.protocol + "//" );
-
-		// Alias method option to type as per ticket #12004
-		s.type = options.method || options.type || s.method || s.type;
-
-		// Extract dataTypes list
-		s.dataTypes = ( s.dataType || "*" ).toLowerCase().match( rnothtmlwhite ) || [ "" ];
-
-		// A cross-domain request is in order when the origin doesn't match the current origin.
-		if ( s.crossDomain == null ) {
-			urlAnchor = document.createElement( "a" );
-
-			// Support: IE <=8 - 11, Edge 12 - 15
-			// IE throws exception on accessing the href property if url is malformed,
-			// e.g. http://example.com:80x/
-			try {
-				urlAnchor.href = s.url;
-
-				// Support: IE <=8 - 11 only
-				// Anchor's host property isn't correctly set when s.url is relative
-				urlAnchor.href = urlAnchor.href;
-				s.crossDomain = originAnchor.protocol + "//" + originAnchor.host !==
-					urlAnchor.protocol + "//" + urlAnchor.host;
-			} catch ( e ) {
-
-				// If there is an error parsing the URL, assume it is crossDomain,
-				// it can be rejected by the transport if it is invalid
-				s.crossDomain = true;
-			}
-		}
-
-		// Convert data if not already a string
-		if ( s.data && s.processData && typeof s.data !== "string" ) {
-			s.data = jQuery.param( s.data, s.traditional );
-		}
-
-		// Apply prefilters
-		inspectPrefiltersOrTransports( prefilters, s, options, jqXHR );
-
-		// If request was aborted inside a prefilter, stop there
-		if ( completed ) {
-			return jqXHR;
-		}
-
-		// We can fire global events as of now if asked to
-		// Don't fire events if jQuery.event is undefined in an AMD-usage scenario (#15118)
-		fireGlobals = jQuery.event && s.global;
-
-		// Watch for a new set of requests
-		if ( fireGlobals && jQuery.active++ === 0 ) {
-			jQuery.event.trigger( "ajaxStart" );
-		}
-
-		// Uppercase the type
-		s.type = s.type.toUpperCase();
-
-		// Determine if request has content
-		s.hasContent = !rnoContent.test( s.type );
-
-		// Save the URL in case we're toying with the If-Modified-Since
-		// and/or If-None-Match header later on
-		// Remove hash to simplify url manipulation
-		cacheURL = s.url.replace( rhash, "" );
-
-		// More options handling for requests with no content
-		if ( !s.hasContent ) {
-
-			// Remember the hash so we can put it back
-			uncached = s.url.slice( cacheURL.length );
-
-			// If data is available and should be processed, append data to url
-			if ( s.data && ( s.processData || typeof s.data === "string" ) ) {
-				cacheURL += ( rquery.test( cacheURL ) ? "&" : "?" ) + s.data;
-
-				// #9682: remove data so that it's not used in an eventual retry
-				delete s.data;
-			}
-
-			// Add or update anti-cache param if needed
-			if ( s.cache === false ) {
-				cacheURL = cacheURL.replace( rantiCache, "$1" );
-				uncached = ( rquery.test( cacheURL ) ? "&" : "?" ) + "_=" + ( nonce++ ) + uncached;
-			}
-
-			// Put hash and anti-cache on the URL that will be requested (gh-1732)
-			s.url = cacheURL + uncached;
-
-		// Change '%20' to '+' if this is encoded form body content (gh-2658)
-		} else if ( s.data && s.processData &&
-			( s.contentType || "" ).indexOf( "application/x-www-form-urlencoded" ) === 0 ) {
-			s.data = s.data.replace( r20, "+" );
-		}
-
-		// Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode.
-		if ( s.ifModified ) {
-			if ( jQuery.lastModified[ cacheURL ] ) {
-				jqXHR.setRequestHeader( "If-Modified-Since", jQuery.lastModified[ cacheURL ] );
-			}
-			if ( jQuery.etag[ cacheURL ] ) {
-				jqXHR.setRequestHeader( "If-None-Match", jQuery.etag[ cacheURL ] );
-			}
-		}
-
-		// Set the correct header, if data is being sent
-		if ( s.data && s.hasContent && s.contentType !== false || options.contentType ) {
-			jqXHR.setRequestHeader( "Content-Type", s.contentType );
-		}
-
-		// Set the Accepts header for the server, depending on the dataType
-		jqXHR.setRequestHeader(
-			"Accept",
-			s.dataTypes[ 0 ] && s.accepts[ s.dataTypes[ 0 ] ] ?
-				s.accepts[ s.dataTypes[ 0 ] ] +
-					( s.dataTypes[ 0 ] !== "*" ? ", " + allTypes + "; q=0.01" : "" ) :
-				s.accepts[ "*" ]
-		);
-
-		// Check for headers option
-		for ( i in s.headers ) {
-			jqXHR.setRequestHeader( i, s.headers[ i ] );
-		}
-
-		// Allow custom headers/mimetypes and early abort
-		if ( s.beforeSend &&
-			( s.beforeSend.call( callbackContext, jqXHR, s ) === false || completed ) ) {
-
-			// Abort if not done already and return
-			return jqXHR.abort();
-		}
-
-		// Aborting is no longer a cancellation
-		strAbort = "abort";
-
-		// Install callbacks on deferreds
-		completeDeferred.add( s.complete );
-		jqXHR.done( s.success );
-		jqXHR.fail( s.error );
-
-		// Get transport
-		transport = inspectPrefiltersOrTransports( transports, s, options, jqXHR );
-
-		// If no transport, we auto-abort
-		if ( !transport ) {
-			done( -1, "No Transport" );
-		} else {
-			jqXHR.readyState = 1;
-
-			// Send global event
-			if ( fireGlobals ) {
-				globalEventContext.trigger( "ajaxSend", [ jqXHR, s ] );
-			}
-
-			// If request was aborted inside ajaxSend, stop there
-			if ( completed ) {
-				return jqXHR;
-			}
-
-			// Timeout
-			if ( s.async && s.timeout > 0 ) {
-				timeoutTimer = window.setTimeout( function() {
-					jqXHR.abort( "timeout" );
-				}, s.timeout );
-			}
-
-			try {
-				completed = false;
-				transport.send( requestHeaders, done );
-			} catch ( e ) {
-
-				// Rethrow post-completion exceptions
-				if ( completed ) {
-					throw e;
-				}
-
-				// Propagate others as results
-				done( -1, e );
-			}
-		}
-
-		// Callback for when everything is done
-		function done( status, nativeStatusText, responses, headers ) {
-			var isSuccess, success, error, response, modified,
-				statusText = nativeStatusText;
-
-			// Ignore repeat invocations
-			if ( completed ) {
-				return;
-			}
-
-			completed = true;
-
-			// Clear timeout if it exists
-			if ( timeoutTimer ) {
-				window.clearTimeout( timeoutTimer );
-			}
-
-			// Dereference transport for early garbage collection
-			// (no matter how long the jqXHR object will be used)
-			transport = undefined;
-
-			// Cache response headers
-			responseHeadersString = headers || "";
-
-			// Set readyState
-			jqXHR.readyState = status > 0 ? 4 : 0;
-
-			// Determine if successful
-			isSuccess = status >= 200 && status < 300 || status === 304;
-
-			// Get response data
-			if ( responses ) {
-				response = ajaxHandleResponses( s, jqXHR, responses );
-			}
-
-			// Convert no matter what (that way responseXXX fields are always set)
-			response = ajaxConvert( s, response, jqXHR, isSuccess );
-
-			// If successful, handle type chaining
-			if ( isSuccess ) {
-
-				// Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode.
-				if ( s.ifModified ) {
-					modified = jqXHR.getResponseHeader( "Last-Modified" );
-					if ( modified ) {
-						jQuery.lastModified[ cacheURL ] = modified;
-					}
-					modified = jqXHR.getResponseHeader( "etag" );
-					if ( modified ) {
-						jQuery.etag[ cacheURL ] = modified;
-					}
-				}
-
-				// if no content
-				if ( status === 204 || s.type === "HEAD" ) {
-					statusText = "nocontent";
-
-				// if not modified
-				} else if ( status === 304 ) {
-					statusText = "notmodified";
-
-				// If we have data, let's convert it
-				} else {
-					statusText = response.state;
-					success = response.data;
-					error = response.error;
-					isSuccess = !error;
-				}
-			} else {
-
-				// Extract error from statusText and normalize for non-aborts
-				error = statusText;
-				if ( status || !statusText ) {
-					statusText = "error";
-					if ( status < 0 ) {
-						status = 0;
-					}
-				}
-			}
-
-			// Set data for the fake xhr object
-			jqXHR.status = status;
-			jqXHR.statusText = ( nativeStatusText || statusText ) + "";
-
-			// Success/Error
-			if ( isSuccess ) {
-				deferred.resolveWith( callbackContext, [ success, statusText, jqXHR ] );
-			} else {
-				deferred.rejectWith( callbackContext, [ jqXHR, statusText, error ] );
-			}
-
-			// Status-dependent callbacks
-			jqXHR.statusCode( statusCode );
-			statusCode = undefined;
-
-			if ( fireGlobals ) {
-				globalEventContext.trigger( isSuccess ? "ajaxSuccess" : "ajaxError",
-					[ jqXHR, s, isSuccess ? success : error ] );
-			}
-
-			// Complete
-			completeDeferred.fireWith( callbackContext, [ jqXHR, statusText ] );
-
-			if ( fireGlobals ) {
-				globalEventContext.trigger( "ajaxComplete", [ jqXHR, s ] );
-
-				// Handle the global AJAX counter
-				if ( !( --jQuery.active ) ) {
-					jQuery.event.trigger( "ajaxStop" );
-				}
-			}
-		}
-
-		return jqXHR;
-	},
-
-	getJSON: function( url, data, callback ) {
-		return jQuery.get( url, data, callback, "json" );
-	},
-
-	getScript: function( url, callback ) {
-		return jQuery.get( url, undefined, callback, "script" );
-	}
-} );
-
-jQuery.each( [ "get", "post" ], function( i, method ) {
-	jQuery[ method ] = function( url, data, callback, type ) {
-
-		// Shift arguments if data argument was omitted
-		if ( isFunction( data ) ) {
-			type = type || callback;
-			callback = data;
-			data = undefined;
-		}
-
-		// The url can be an options object (which then must have .url)
-		return jQuery.ajax( jQuery.extend( {
-			url: url,
-			type: method,
-			dataType: type,
-			data: data,
-			success: callback
-		}, jQuery.isPlainObject( url ) && url ) );
-	};
-} );
-
-
-jQuery._evalUrl = function( url ) {
-	return jQuery.ajax( {
-		url: url,
-
-		// Make this explicit, since user can override this through ajaxSetup (#11264)
-		type: "GET",
-		dataType: "script",
-		cache: true,
-		async: false,
-		global: false,
-		"throws": true
-	} );
-};
-
-
-jQuery.fn.extend( {
-	wrapAll: function( html ) {
-		var wrap;
-
-		if ( this[ 0 ] ) {
-			if ( isFunction( html ) ) {
-				html = html.call( this[ 0 ] );
-			}
-
-			// The elements to wrap the target around
-			wrap = jQuery( html, this[ 0 ].ownerDocument ).eq( 0 ).clone( true );
-
-			if ( this[ 0 ].parentNode ) {
-				wrap.insertBefore( this[ 0 ] );
-			}
-
-			wrap.map( function() {
-				var elem = this;
-
-				while ( elem.firstElementChild ) {
-					elem = elem.firstElementChild;
-				}
-
-				return elem;
-			} ).append( this );
-		}
-
-		return this;
-	},
-
-	wrapInner: function( html ) {
-		if ( isFunction( html ) ) {
-			return this.each( function( i ) {
-				jQuery( this ).wrapInner( html.call( this, i ) );
-			} );
-		}
-
-		return this.each( function() {
-			var self = jQuery( this ),
-				contents = self.contents();
-
-			if ( contents.length ) {
-				contents.wrapAll( html );
-
-			} else {
-				self.append( html );
-			}
-		} );
-	},
-
-	wrap: function( html ) {
-		var htmlIsFunction = isFunction( html );
-
-		return this.each( function( i ) {
-			jQuery( this ).wrapAll( htmlIsFunction ? html.call( this, i ) : html );
-		} );
-	},
-
-	unwrap: function( selector ) {
-		this.parent( selector ).not( "body" ).each( function() {
-			jQuery( this ).replaceWith( this.childNodes );
-		} );
-		return this;
-	}
-} );
-
-
-jQuery.expr.pseudos.hidden = function( elem ) {
-	return !jQuery.expr.pseudos.visible( elem );
-};
-jQuery.expr.pseudos.visible = function( elem ) {
-	return !!( elem.offsetWidth || elem.offsetHeight || elem.getClientRects().length );
-};
-
-
-
-
-jQuery.ajaxSettings.xhr = function() {
-	try {
-		return new window.XMLHttpRequest();
-	} catch ( e ) {}
-};
-
-var xhrSuccessStatus = {
-
-		// File protocol always yields status code 0, assume 200
-		0: 200,
-
-		// Support: IE <=9 only
-		// #1450: sometimes IE returns 1223 when it should be 204
-		1223: 204
-	},
-	xhrSupported = jQuery.ajaxSettings.xhr();
-
-support.cors = !!xhrSupported && ( "withCredentials" in xhrSupported );
-support.ajax = xhrSupported = !!xhrSupported;
-
-jQuery.ajaxTransport( function( options ) {
-	var callback, errorCallback;
-
-	// Cross domain only allowed if supported through XMLHttpRequest
-	if ( support.cors || xhrSupported && !options.crossDomain ) {
-		return {
-			send: function( headers, complete ) {
-				var i,
-					xhr = options.xhr();
-
-				xhr.open(
-					options.type,
-					options.url,
-					options.async,
-					options.username,
-					options.password
-				);
-
-				// Apply custom fields if provided
-				if ( options.xhrFields ) {
-					for ( i in options.xhrFields ) {
-						xhr[ i ] = options.xhrFields[ i ];
-					}
-				}
-
-				// Override mime type if needed
-				if ( options.mimeType && xhr.overrideMimeType ) {
-					xhr.overrideMimeType( options.mimeType );
-				}
-
-				// X-Requested-With header
-				// For cross-domain requests, seeing as conditions for a preflight are
-				// akin to a jigsaw puzzle, we simply never set it to be sure.
-				// (it can always be set on a per-request basis or even using ajaxSetup)
-				// For same-domain requests, won't change header if already provided.
-				if ( !options.crossDomain && !headers[ "X-Requested-With" ] ) {
-					headers[ "X-Requested-With" ] = "XMLHttpRequest";
-				}
-
-				// Set headers
-				for ( i in headers ) {
-					xhr.setRequestHeader( i, headers[ i ] );
-				}
-
-				// Callback
-				callback = function( type ) {
-					return function() {
-						if ( callback ) {
-							callback = errorCallback = xhr.onload =
-								xhr.onerror = xhr.onabort = xhr.ontimeout =
-									xhr.onreadystatechange = null;
-
-							if ( type === "abort" ) {
-								xhr.abort();
-							} else if ( type === "error" ) {
-
-								// Support: IE <=9 only
-								// On a manual native abort, IE9 throws
-								// errors on any property access that is not readyState
-								if ( typeof xhr.status !== "number" ) {
-									complete( 0, "error" );
-								} else {
-									complete(
-
-										// File: protocol always yields status 0; see #8605, #14207
-										xhr.status,
-										xhr.statusText
-									);
-								}
-							} else {
-								complete(
-									xhrSuccessStatus[ xhr.status ] || xhr.status,
-									xhr.statusText,
-
-									// Support: IE <=9 only
-									// IE9 has no XHR2 but throws on binary (trac-11426)
-									// For XHR2 non-text, let the caller handle it (gh-2498)
-									( xhr.responseType || "text" ) !== "text"  ||
-									typeof xhr.responseText !== "string" ?
-										{ binary: xhr.response } :
-										{ text: xhr.responseText },
-									xhr.getAllResponseHeaders()
-								);
-							}
-						}
-					};
-				};
-
-				// Listen to events
-				xhr.onload = callback();
-				errorCallback = xhr.onerror = xhr.ontimeout = callback( "error" );
-
-				// Support: IE 9 only
-				// Use onreadystatechange to replace onabort
-				// to handle uncaught aborts
-				if ( xhr.onabort !== undefined ) {
-					xhr.onabort = errorCallback;
-				} else {
-					xhr.onreadystatechange = function() {
-
-						// Check readyState before timeout as it changes
-						if ( xhr.readyState === 4 ) {
-
-							// Allow onerror to be called first,
-							// but that will not handle a native abort
-							// Also, save errorCallback to a variable
-							// as xhr.onerror cannot be accessed
-							window.setTimeout( function() {
-								if ( callback ) {
-									errorCallback();
-								}
-							} );
-						}
-					};
-				}
-
-				// Create the abort callback
-				callback = callback( "abort" );
-
-				try {
-
-					// Do send the request (this may raise an exception)
-					xhr.send( options.hasContent && options.data || null );
-				} catch ( e ) {
-
-					// #14683: Only rethrow if this hasn't been notified as an error yet
-					if ( callback ) {
-						throw e;
-					}
-				}
-			},
-
-			abort: function() {
-				if ( callback ) {
-					callback();
-				}
-			}
-		};
-	}
-} );
-
-
-
-
-// Prevent auto-execution of scripts when no explicit dataType was provided (See gh-2432)
-jQuery.ajaxPrefilter( function( s ) {
-	if ( s.crossDomain ) {
-		s.contents.script = false;
-	}
-} );
-
-// Install script dataType
-jQuery.ajaxSetup( {
-	accepts: {
-		script: "text/javascript, application/javascript, " +
-			"application/ecmascript, application/x-ecmascript"
-	},
-	contents: {
-		script: /\b(?:java|ecma)script\b/
-	},
-	converters: {
-		"text script": function( text ) {
-			jQuery.globalEval( text );
-			return text;
-		}
-	}
-} );
-
-// Handle cache's special case and crossDomain
-jQuery.ajaxPrefilter( "script", function( s ) {
-	if ( s.cache === undefined ) {
-		s.cache = false;
-	}
-	if ( s.crossDomain ) {
-		s.type = "GET";
-	}
-} );
-
-// Bind script tag hack transport
-jQuery.ajaxTransport( "script", function( s ) {
-
-	// This transport only deals with cross domain requests
-	if ( s.crossDomain ) {
-		var script, callback;
-		return {
-			send: function( _, complete ) {
-				script = jQuery( "<script>" ).prop( {
-					charset: s.scriptCharset,
-					src: s.url
-				} ).on(
-					"load error",
-					callback = function( evt ) {
-						script.remove();
-						callback = null;
-						if ( evt ) {
-							complete( evt.type === "error" ? 404 : 200, evt.type );
-						}
-					}
-				);
-
-				// Use native DOM manipulation to avoid our domManip AJAX trickery
-				document.head.appendChild( script[ 0 ] );
-			},
-			abort: function() {
-				if ( callback ) {
-					callback();
-				}
-			}
-		};
-	}
-} );
-
-
-
-
-var oldCallbacks = [],
-	rjsonp = /(=)\?(?=&|$)|\?\?/;
-
-// Default jsonp settings
-jQuery.ajaxSetup( {
-	jsonp: "callback",
-	jsonpCallback: function() {
-		var callback = oldCallbacks.pop() || ( jQuery.expando + "_" + ( nonce++ ) );
-		this[ callback ] = true;
-		return callback;
-	}
-} );
-
-// Detect, normalize options and install callbacks for jsonp requests
-jQuery.ajaxPrefilter( "json jsonp", function( s, originalSettings, jqXHR ) {
-
-	var callbackName, overwritten, responseContainer,
-		jsonProp = s.jsonp !== false && ( rjsonp.test( s.url ) ?
-			"url" :
-			typeof s.data === "string" &&
-				( s.contentType || "" )
-					.indexOf( "application/x-www-form-urlencoded" ) === 0 &&
-				rjsonp.test( s.data ) && "data"
-		);
-
-	// Handle iff the expected data type is "jsonp" or we have a parameter to set
-	if ( jsonProp || s.dataTypes[ 0 ] === "jsonp" ) {
-
-		// Get callback name, remembering preexisting value associated with it
-		callbackName = s.jsonpCallback = isFunction( s.jsonpCallback ) ?
-			s.jsonpCallback() :
-			s.jsonpCallback;
-
-		// Insert callback into url or form data
-		if ( jsonProp ) {
-			s[ jsonProp ] = s[ jsonProp ].replace( rjsonp, "$1" + callbackName );
-		} else if ( s.jsonp !== false ) {
-			s.url += ( rquery.test( s.url ) ? "&" : "?" ) + s.jsonp + "=" + callbackName;
-		}
-
-		// Use data converter to retrieve json after script execution
-		s.converters[ "script json" ] = function() {
-			if ( !responseContainer ) {
-				jQuery.error( callbackName + " was not called" );
-			}
-			return responseContainer[ 0 ];
-		};
-
-		// Force json dataType
-		s.dataTypes[ 0 ] = "json";
-
-		// Install callback
-		overwritten = window[ callbackName ];
-		window[ callbackName ] = function() {
-			responseContainer = arguments;
-		};
-
-		// Clean-up function (fires after converters)
-		jqXHR.always( function() {
-
-			// If previous value didn't exist - remove it
-			if ( overwritten === undefined ) {
-				jQuery( window ).removeProp( callbackName );
-
-			// Otherwise restore preexisting value
-			} else {
-				window[ callbackName ] = overwritten;
-			}
-
-			// Save back as free
-			if ( s[ callbackName ] ) {
-
-				// Make sure that re-using the options doesn't screw things around
-				s.jsonpCallback = originalSettings.jsonpCallback;
-
-				// Save the callback name for future use
-				oldCallbacks.push( callbackName );
-			}
-
-			// Call if it was a function and we have a response
-			if ( responseContainer && isFunction( overwritten ) ) {
-				overwritten( responseContainer[ 0 ] );
-			}
-
-			responseContainer = overwritten = undefined;
-		} );
-
-		// Delegate to script
-		return "script";
-	}
-} );
-
-
-
-
-// Support: Safari 8 only
-// In Safari 8 documents created via document.implementation.createHTMLDocument
-// collapse sibling forms: the second one becomes a child of the first one.
-// Because of that, this security measure has to be disabled in Safari 8.
-// https://bugs.webkit.org/show_bug.cgi?id=137337
-support.createHTMLDocument = ( function() {
-	var body = document.implementation.createHTMLDocument( "" ).body;
-	body.innerHTML = "<form></form><form></form>";
-	return body.childNodes.length === 2;
-} )();
-
-
-// Argument "data" should be string of html
-// context (optional): If specified, the fragment will be created in this context,
-// defaults to document
-// keepScripts (optional): If true, will include scripts passed in the html string
-jQuery.parseHTML = function( data, context, keepScripts ) {
-	if ( typeof data !== "string" ) {
-		return [];
-	}
-	if ( typeof context === "boolean" ) {
-		keepScripts = context;
-		context = false;
-	}
-
-	var base, parsed, scripts;
-
-	if ( !context ) {
-
-		// Stop scripts or inline event handlers from being executed immediately
-		// by using document.implementation
-		if ( support.createHTMLDocument ) {
-			context = document.implementation.createHTMLDocument( "" );
-
-			// Set the base href for the created document
-			// so any parsed elements with URLs
-			// are based on the document's URL (gh-2965)
-			base = context.createElement( "base" );
-			base.href = document.location.href;
-			context.head.appendChild( base );
-		} else {
-			context = document;
-		}
-	}
-
-	parsed = rsingleTag.exec( data );
-	scripts = !keepScripts && [];
-
-	// Single tag
-	if ( parsed ) {
-		return [ context.createElement( parsed[ 1 ] ) ];
-	}
-
-	parsed = buildFragment( [ data ], context, scripts );
-
-	if ( scripts && scripts.length ) {
-		jQuery( scripts ).remove();
-	}
-
-	return jQuery.merge( [], parsed.childNodes );
-};
-
-
-/**
- * Load a url into a page
- */
-jQuery.fn.load = function( url, params, callback ) {
-	var selector, type, response,
-		self = this,
-		off = url.indexOf( " " );
-
-	if ( off > -1 ) {
-		selector = stripAndCollapse( url.slice( off ) );
-		url = url.slice( 0, off );
-	}
-
-	// If it's a function
-	if ( isFunction( params ) ) {
-
-		// We assume that it's the callback
-		callback = params;
-		params = undefined;
-
-	// Otherwise, build a param string
-	} else if ( params && typeof params === "object" ) {
-		type = "POST";
-	}
-
-	// If we have elements to modify, make the request
-	if ( self.length > 0 ) {
-		jQuery.ajax( {
-			url: url,
-
-			// If "type" variable is undefined, then "GET" method will be used.
-			// Make value of this field explicit since
-			// user can override it through ajaxSetup method
-			type: type || "GET",
-			dataType: "html",
-			data: params
-		} ).done( function( responseText ) {
-
-			// Save response for use in complete callback
-			response = arguments;
-
-			self.html( selector ?
-
-				// If a selector was specified, locate the right elements in a dummy div
-				// Exclude scripts to avoid IE 'Permission Denied' errors
-				jQuery( "<div>" ).append( jQuery.parseHTML( responseText ) ).find( selector ) :
-
-				// Otherwise use the full result
-				responseText );
-
-		// If the request succeeds, this function gets "data", "status", "jqXHR"
-		// but they are ignored because response was set above.
-		// If it fails, this function gets "jqXHR", "status", "error"
-		} ).always( callback && function( jqXHR, status ) {
-			self.each( function() {
-				callback.apply( this, response || [ jqXHR.responseText, status, jqXHR ] );
-			} );
-		} );
-	}
-
-	return this;
-};
-
-
-
-
-// Attach a bunch of functions for handling common AJAX events
-jQuery.each( [
-	"ajaxStart",
-	"ajaxStop",
-	"ajaxComplete",
-	"ajaxError",
-	"ajaxSuccess",
-	"ajaxSend"
-], function( i, type ) {
-	jQuery.fn[ type ] = function( fn ) {
-		return this.on( type, fn );
-	};
-} );
-
-
-
-
-jQuery.expr.pseudos.animated = function( elem ) {
-	return jQuery.grep( jQuery.timers, function( fn ) {
-		return elem === fn.elem;
-	} ).length;
-};
-
-
-
-
-jQuery.offset = {
-	setOffset: function( elem, options, i ) {
-		var curPosition, curLeft, curCSSTop, curTop, curOffset, curCSSLeft, calculatePosition,
-			position = jQuery.css( elem, "position" ),
-			curElem = jQuery( elem ),
-			props = {};
-
-		// Set position first, in-case top/left are set even on static elem
-		if ( position === "static" ) {
-			elem.style.position = "relative";
-		}
-
-		curOffset = curElem.offset();
-		curCSSTop = jQuery.css( elem, "top" );
-		curCSSLeft = jQuery.css( elem, "left" );
-		calculatePosition = ( position === "absolute" || position === "fixed" ) &&
-			( curCSSTop + curCSSLeft ).indexOf( "auto" ) > -1;
-
-		// Need to be able to calculate position if either
-		// top or left is auto and position is either absolute or fixed
-		if ( calculatePosition ) {
-			curPosition = curElem.position();
-			curTop = curPosition.top;
-			curLeft = curPosition.left;
-
-		} else {
-			curTop = parseFloat( curCSSTop ) || 0;
-			curLeft = parseFloat( curCSSLeft ) || 0;
-		}
-
-		if ( isFunction( options ) ) {
-
-			// Use jQuery.extend here to allow modification of coordinates argument (gh-1848)
-			options = options.call( elem, i, jQuery.extend( {}, curOffset ) );
-		}
-
-		if ( options.top != null ) {
-			props.top = ( options.top - curOffset.top ) + curTop;
-		}
-		if ( options.left != null ) {
-			props.left = ( options.left - curOffset.left ) + curLeft;
-		}
-
-		if ( "using" in options ) {
-			options.using.call( elem, props );
-
-		} else {
-			curElem.css( props );
-		}
-	}
-};
-
-jQuery.fn.extend( {
-
-	// offset() relates an element's border box to the document origin
-	offset: function( options ) {
-
-		// Preserve chaining for setter
-		if ( arguments.length ) {
-			return options === undefined ?
-				this :
-				this.each( function( i ) {
-					jQuery.offset.setOffset( this, options, i );
-				} );
-		}
-
-		var rect, win,
-			elem = this[ 0 ];
-
-		if ( !elem ) {
-			return;
-		}
-
-		// Return zeros for disconnected and hidden (display: none) elements (gh-2310)
-		// Support: IE <=11 only
-		// Running getBoundingClientRect on a
-		// disconnected node in IE throws an error
-		if ( !elem.getClientRects().length ) {
-			return { top: 0, left: 0 };
-		}
-
-		// Get document-relative position by adding viewport scroll to viewport-relative gBCR
-		rect = elem.getBoundingClientRect();
-		win = elem.ownerDocument.defaultView;
-		return {
-			top: rect.top + win.pageYOffset,
-			left: rect.left + win.pageXOffset
-		};
-	},
-
-	// position() relates an element's margin box to its offset parent's padding box
-	// This corresponds to the behavior of CSS absolute positioning
-	position: function() {
-		if ( !this[ 0 ] ) {
-			return;
-		}
-
-		var offsetParent, offset, doc,
-			elem = this[ 0 ],
-			parentOffset = { top: 0, left: 0 };
-
-		// position:fixed elements are offset from the viewport, which itself always has zero offset
-		if ( jQuery.css( elem, "position" ) === "fixed" ) {
-
-			// Assume position:fixed implies availability of getBoundingClientRect
-			offset = elem.getBoundingClientRect();
-
-		} else {
-			offset = this.offset();
-
-			// Account for the *real* offset parent, which can be the document or its root element
-			// when a statically positioned element is identified
-			doc = elem.ownerDocument;
-			offsetParent = elem.offsetParent || doc.documentElement;
-			while ( offsetParent &&
-				( offsetParent === doc.body || offsetParent === doc.documentElement ) &&
-				jQuery.css( offsetParent, "position" ) === "static" ) {
-
-				offsetParent = offsetParent.parentNode;
-			}
-			if ( offsetParent && offsetParent !== elem && offsetParent.nodeType === 1 ) {
-
-				// Incorporate borders into its offset, since they are outside its content origin
-				parentOffset = jQuery( offsetParent ).offset();
-				parentOffset.top += jQuery.css( offsetParent, "borderTopWidth", true );
-				parentOffset.left += jQuery.css( offsetParent, "borderLeftWidth", true );
-			}
-		}
-
-		// Subtract parent offsets and element margins
-		return {
-			top: offset.top - parentOffset.top - jQuery.css( elem, "marginTop", true ),
-			left: offset.left - parentOffset.left - jQuery.css( elem, "marginLeft", true )
-		};
-	},
-
-	// This method will return documentElement in the following cases:
-	// 1) For the element inside the iframe without offsetParent, this method will return
-	//    documentElement of the parent window
-	// 2) For the hidden or detached element
-	// 3) For body or html element, i.e. in case of the html node - it will return itself
-	//
-	// but those exceptions were never presented as a real life use-cases
-	// and might be considered as more preferable results.
-	//
-	// This logic, however, is not guaranteed and can change at any point in the future
-	offsetParent: function() {
-		return this.map( function() {
-			var offsetParent = this.offsetParent;
-
-			while ( offsetParent && jQuery.css( offsetParent, "position" ) === "static" ) {
-				offsetParent = offsetParent.offsetParent;
-			}
-
-			return offsetParent || documentElement;
-		} );
-	}
-} );
-
-// Create scrollLeft and scrollTop methods
-jQuery.each( { scrollLeft: "pageXOffset", scrollTop: "pageYOffset" }, function( method, prop ) {
-	var top = "pageYOffset" === prop;
-
-	jQuery.fn[ method ] = function( val ) {
-		return access( this, function( elem, method, val ) {
-
-			// Coalesce documents and windows
-			var win;
-			if ( isWindow( elem ) ) {
-				win = elem;
-			} else if ( elem.nodeType === 9 ) {
-				win = elem.defaultView;
-			}
-
-			if ( val === undefined ) {
-				return win ? win[ prop ] : elem[ method ];
-			}
-
-			if ( win ) {
-				win.scrollTo(
-					!top ? val : win.pageXOffset,
-					top ? val : win.pageYOffset
-				);
-
-			} else {
-				elem[ method ] = val;
-			}
-		}, method, val, arguments.length );
-	};
-} );
-
-// Support: Safari <=7 - 9.1, Chrome <=37 - 49
-// Add the top/left cssHooks using jQuery.fn.position
-// Webkit bug: https://bugs.webkit.org/show_bug.cgi?id=29084
-// Blink bug: https://bugs.chromium.org/p/chromium/issues/detail?id=589347
-// getComputedStyle returns percent when specified for top/left/bottom/right;
-// rather than make the css module depend on the offset module, just check for it here
-jQuery.each( [ "top", "left" ], function( i, prop ) {
-	jQuery.cssHooks[ prop ] = addGetHookIf( support.pixelPosition,
-		function( elem, computed ) {
-			if ( computed ) {
-				computed = curCSS( elem, prop );
-
-				// If curCSS returns percentage, fallback to offset
-				return rnumnonpx.test( computed ) ?
-					jQuery( elem ).position()[ prop ] + "px" :
-					computed;
-			}
-		}
-	);
-} );
-
-
-// Create innerHeight, innerWidth, height, width, outerHeight and outerWidth methods
-jQuery.each( { Height: "height", Width: "width" }, function( name, type ) {
-	jQuery.each( { padding: "inner" + name, content: type, "": "outer" + name },
-		function( defaultExtra, funcName ) {
-
-		// Margin is only for outerHeight, outerWidth
-		jQuery.fn[ funcName ] = function( margin, value ) {
-			var chainable = arguments.length && ( defaultExtra || typeof margin !== "boolean" ),
-				extra = defaultExtra || ( margin === true || value === true ? "margin" : "border" );
-
-			return access( this, function( elem, type, value ) {
-				var doc;
-
-				if ( isWindow( elem ) ) {
-
-					// $( window ).outerWidth/Height return w/h including scrollbars (gh-1729)
-					return funcName.indexOf( "outer" ) === 0 ?
-						elem[ "inner" + name ] :
-						elem.document.documentElement[ "client" + name ];
-				}
-
-				// Get document width or height
-				if ( elem.nodeType === 9 ) {
-					doc = elem.documentElement;
-
-					// Either scroll[Width/Height] or offset[Width/Height] or client[Width/Height],
-					// whichever is greatest
-					return Math.max(
-						elem.body[ "scroll" + name ], doc[ "scroll" + name ],
-						elem.body[ "offset" + name ], doc[ "offset" + name ],
-						doc[ "client" + name ]
-					);
-				}
-
-				return value === undefined ?
-
-					// Get width or height on the element, requesting but not forcing parseFloat
-					jQuery.css( elem, type, extra ) :
-
-					// Set width or height on the element
-					jQuery.style( elem, type, value, extra );
-			}, type, chainable ? margin : undefined, chainable );
-		};
-	} );
-} );
-
-
-jQuery.each( ( "blur focus focusin focusout resize scroll click dblclick " +
-	"mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave " +
-	"change select submit keydown keypress keyup contextmenu" ).split( " " ),
-	function( i, name ) {
-
-	// Handle event binding
-	jQuery.fn[ name ] = function( data, fn ) {
-		return arguments.length > 0 ?
-			this.on( name, null, data, fn ) :
-			this.trigger( name );
-	};
-} );
-
-jQuery.fn.extend( {
-	hover: function( fnOver, fnOut ) {
-		return this.mouseenter( fnOver ).mouseleave( fnOut || fnOver );
-	}
-} );
-
-
-
-
-jQuery.fn.extend( {
-
-	bind: function( types, data, fn ) {
-		return this.on( types, null, data, fn );
-	},
-	unbind: function( types, fn ) {
-		return this.off( types, null, fn );
-	},
-
-	delegate: function( selector, types, data, fn ) {
-		return this.on( types, selector, data, fn );
-	},
-	undelegate: function( selector, types, fn ) {
-
-		// ( namespace ) or ( selector, types [, fn] )
-		return arguments.length === 1 ?
-			this.off( selector, "**" ) :
-			this.off( types, selector || "**", fn );
-	}
-} );
-
-// Bind a function to a context, optionally partially applying any
-// arguments.
-// jQuery.proxy is deprecated to promote standards (specifically Function#bind)
-// However, it is not slated for removal any time soon
-jQuery.proxy = function( fn, context ) {
-	var tmp, args, proxy;
-
-	if ( typeof context === "string" ) {
-		tmp = fn[ context ];
-		context = fn;
-		fn = tmp;
-	}
-
-	// Quick check to determine if target is callable, in the spec
-	// this throws a TypeError, but we will just return undefined.
-	if ( !isFunction( fn ) ) {
-		return undefined;
-	}
-
-	// Simulated bind
-	args = slice.call( arguments, 2 );
-	proxy = function() {
-		return fn.apply( context || this, args.concat( slice.call( arguments ) ) );
-	};
-
-	// Set the guid of unique handler to the same of original handler, so it can be removed
-	proxy.guid = fn.guid = fn.guid || jQuery.guid++;
-
-	return proxy;
-};
-
-jQuery.holdReady = function( hold ) {
-	if ( hold ) {
-		jQuery.readyWait++;
-	} else {
-		jQuery.ready( true );
-	}
-};
-jQuery.isArray = Array.isArray;
-jQuery.parseJSON = JSON.parse;
-jQuery.nodeName = nodeName;
-jQuery.isFunction = isFunction;
-jQuery.isWindow = isWindow;
-jQuery.camelCase = camelCase;
-jQuery.type = toType;
-
-jQuery.now = Date.now;
-
-jQuery.isNumeric = function( obj ) {
-
-	// As of jQuery 3.0, isNumeric is limited to
-	// strings and numbers (primitives or objects)
-	// that can be coerced to finite numbers (gh-2662)
-	var type = jQuery.type( obj );
-	return ( type === "number" || type === "string" ) &&
-
-		// parseFloat NaNs numeric-cast false positives ("")
-		// ...but misinterprets leading-number strings, particularly hex literals ("0x...")
-		// subtraction forces infinities to NaN
-		!isNaN( obj - parseFloat( obj ) );
-};
-
-
-
-
-// Register as a named AMD module, since jQuery can be concatenated with other
-// files that may use define, but not via a proper concatenation script that
-// understands anonymous AMD modules. A named AMD is safest and most robust
-// way to register. Lowercase jquery is used because AMD module names are
-// derived from file names, and jQuery is normally delivered in a lowercase
-// file name. Do this after creating the global so that if an AMD module wants
-// to call noConflict to hide this version of jQuery, it will work.
-
-// Note that for maximum portability, libraries that are not jQuery should
-// declare themselves as anonymous modules, and avoid setting a global if an
-// AMD loader is present. jQuery is a special case. For more information, see
-// https://github.com/jrburke/requirejs/wiki/Updating-existing-libraries#wiki-anon
-
-if ( typeof define === "function" && define.amd ) {
-	define( "jquery", [], function() {
-		return jQuery;
-	} );
-}
-
-
-
-
-var
-
-	// Map over jQuery in case of overwrite
-	_jQuery = window.jQuery,
-
-	// Map over the $ in case of overwrite
-	_$ = window.$;
-
-jQuery.noConflict = function( deep ) {
-	if ( window.$ === jQuery ) {
-		window.$ = _$;
-	}
-
-	if ( deep && window.jQuery === jQuery ) {
-		window.jQuery = _jQuery;
-	}
-
-	return jQuery;
-};
-
-// Expose jQuery and $ identifiers, even in AMD
-// (#7102#comment:10, https://github.com/jquery/jquery/pull/557)
-// and CommonJS for browser emulators (#13566)
-if ( !noGlobal ) {
-	window.jQuery = window.$ = jQuery;
-}
-
-
-
-
-return jQuery;
-} );
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/license.txt b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/license.txt
deleted file mode 100644
index e7798cf..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.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-1.5.1/modules/AboutBox/AboutBox.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/modules/AboutBox/AboutBox.js
deleted file mode 100644
index 8917a05..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.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-1.5.1/modules/AboutBox/about.css b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/modules/AboutBox/about.css
deleted file mode 100644
index c4507d0..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.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-1.5.1/modules/AboutBox/dialog.html b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/modules/AboutBox/dialog.html
deleted file mode 100644
index 4035191..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.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-1.5.1/modules/AboutBox/lang/b5.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/modules/AboutBox/lang/b5.js
deleted file mode 100644
index 3c835b7..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/modules/AboutBox/lang/b5.js
+++ /dev/null
@@ -1,13 +0,0 @@
-// I18N constants
-// LANG: "b5", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "About this editor": "關於 Xinha"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/modules/AboutBox/lang/ch.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/modules/AboutBox/lang/ch.js
deleted file mode 100644
index a4a1226..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/modules/AboutBox/lang/ch.js
+++ /dev/null
@@ -1,13 +0,0 @@
-// I18N constants
-// LANG: "ch", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "About this editor": "關於 Xinha"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/modules/AboutBox/lang/cz.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/modules/AboutBox/lang/cz.js
deleted file mode 100644
index cd69d87..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/modules/AboutBox/lang/cz.js
+++ /dev/null
@@ -1,13 +0,0 @@
-// I18N constants
-// LANG: "cz", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "About this editor": "O této aplikaci"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/modules/AboutBox/lang/da.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/modules/AboutBox/lang/da.js
deleted file mode 100644
index b7cfe33..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/modules/AboutBox/lang/da.js
+++ /dev/null
@@ -1,14 +0,0 @@
-// I18N constants
-// LANG: "da", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "About this editor": "Om Xinha",
-    "Close": "Luk"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/modules/AboutBox/lang/de.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/modules/AboutBox/lang/de.js
deleted file mode 100644
index 28c922c..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/modules/AboutBox/lang/de.js
+++ /dev/null
@@ -1,14 +0,0 @@
-// I18N constants
-// LANG: "de", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "About this editor": "Über diesen Editor",
-    "Close": "Schließen"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/modules/AboutBox/lang/ee.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/modules/AboutBox/lang/ee.js
deleted file mode 100644
index 3919e03..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/modules/AboutBox/lang/ee.js
+++ /dev/null
@@ -1,13 +0,0 @@
-// I18N constants
-// LANG: "ee", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "About this editor": "Teave toimeti kohta"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/modules/AboutBox/lang/el.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/modules/AboutBox/lang/el.js
deleted file mode 100644
index 34db816..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/modules/AboutBox/lang/el.js
+++ /dev/null
@@ -1,13 +0,0 @@
-// I18N constants
-// LANG: "el", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "About this editor": "Πληροφορίες"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/modules/AboutBox/lang/es.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/modules/AboutBox/lang/es.js
deleted file mode 100644
index 59dbb91..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/modules/AboutBox/lang/es.js
+++ /dev/null
@@ -1,14 +0,0 @@
-// I18N constants
-// LANG: "es", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "About this editor": "Sobre este Editor",
-    "Close": "Cerrar"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/modules/AboutBox/lang/eu.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/modules/AboutBox/lang/eu.js
deleted file mode 100644
index 1bd7fb0..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/modules/AboutBox/lang/eu.js
+++ /dev/null
@@ -1,14 +0,0 @@
-// I18N constants
-// LANG: "eu", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "About this editor": "Editoreari buruz...",
-    "Close": "Itxi"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/modules/AboutBox/lang/fa.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/modules/AboutBox/lang/fa.js
deleted file mode 100644
index c08320b..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/modules/AboutBox/lang/fa.js
+++ /dev/null
@@ -1,14 +0,0 @@
-// I18N constants
-// LANG: "fa", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "About this editor": "درباره این ویرایش گر",
-    "Close": "بستن"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/modules/AboutBox/lang/fi.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/modules/AboutBox/lang/fi.js
deleted file mode 100644
index 68cdd74..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/modules/AboutBox/lang/fi.js
+++ /dev/null
@@ -1,13 +0,0 @@
-// I18N constants
-// LANG: "fi", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "About this editor": "Tietoja editorista"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/modules/AboutBox/lang/fr.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/modules/AboutBox/lang/fr.js
deleted file mode 100644
index cad37dc..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/modules/AboutBox/lang/fr.js
+++ /dev/null
@@ -1,14 +0,0 @@
-// I18N constants
-// LANG: "fr", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "About this editor": "A propos",
-    "Close": "Fermer"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/modules/AboutBox/lang/he.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/modules/AboutBox/lang/he.js
deleted file mode 100644
index 6995911..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/modules/AboutBox/lang/he.js
+++ /dev/null
@@ -1,13 +0,0 @@
-// I18N constants
-// LANG: "he", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "About this editor": "אודות עורך זה"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/modules/AboutBox/lang/hu.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/modules/AboutBox/lang/hu.js
deleted file mode 100644
index e5dbeaf..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/modules/AboutBox/lang/hu.js
+++ /dev/null
@@ -1,13 +0,0 @@
-// I18N constants
-// LANG: "hu", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "About this editor": "Névjegy"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/modules/AboutBox/lang/it.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/modules/AboutBox/lang/it.js
deleted file mode 100644
index 8f196f4..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/modules/AboutBox/lang/it.js
+++ /dev/null
@@ -1,13 +0,0 @@
-// I18N constants
-// LANG: "it", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "About this editor": "Informazioni su Xinha"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/modules/AboutBox/lang/ja.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/modules/AboutBox/lang/ja.js
deleted file mode 100644
index 6d592a9..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/modules/AboutBox/lang/ja.js
+++ /dev/null
@@ -1,14 +0,0 @@
-// I18N constants
-// LANG: "ja", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "About this editor": "バージョン情報",
-    "Close": "閉じる"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/modules/AboutBox/lang/lc_base.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/modules/AboutBox/lang/lc_base.js
deleted file mode 100644
index 5af5a5d..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/modules/AboutBox/lang/lc_base.js
+++ /dev/null
@@ -1,26 +0,0 @@
-// I18N constants
-//
-// LANG: "en", ENCODING: UTF-8
-// Author: Translator-Name, <email@example.com>
-//
-// Last revision: 2018-04-12
-// 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).
-//
-// (Please, remove information below)
-// 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.)
-
-{
-    "About this editor": "",
-    "Close": ""
-}
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/modules/AboutBox/lang/lt.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/modules/AboutBox/lang/lt.js
deleted file mode 100644
index fcd87d3..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/modules/AboutBox/lang/lt.js
+++ /dev/null
@@ -1,13 +0,0 @@
-// I18N constants
-// LANG: "lt", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "About this editor": "Apie redaktorių"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/modules/AboutBox/lang/lv.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/modules/AboutBox/lang/lv.js
deleted file mode 100644
index 9739f09..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/modules/AboutBox/lang/lv.js
+++ /dev/null
@@ -1,13 +0,0 @@
-// I18N constants
-// LANG: "lv", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "About this editor": "Par ðo rediìçtâju"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/modules/AboutBox/lang/nb.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/modules/AboutBox/lang/nb.js
deleted file mode 100644
index fa16e47..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/modules/AboutBox/lang/nb.js
+++ /dev/null
@@ -1,13 +0,0 @@
-// I18N constants
-// LANG: "nb", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "About this editor": "Om denne editor"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/modules/AboutBox/lang/nl.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/modules/AboutBox/lang/nl.js
deleted file mode 100644
index 217afff..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/modules/AboutBox/lang/nl.js
+++ /dev/null
@@ -1,13 +0,0 @@
-// I18N constants
-// LANG: "nl", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "About this editor": "Over deze editor"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/modules/AboutBox/lang/pl.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/modules/AboutBox/lang/pl.js
deleted file mode 100644
index b5abf76..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/modules/AboutBox/lang/pl.js
+++ /dev/null
@@ -1,13 +0,0 @@
-// I18N constants
-// LANG: "pl", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "About this editor": "Informacje o tym edytorze"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/modules/AboutBox/lang/pt_br.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/modules/AboutBox/lang/pt_br.js
deleted file mode 100644
index 114e524..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/modules/AboutBox/lang/pt_br.js
+++ /dev/null
@@ -1,14 +0,0 @@
-// I18N constants
-// LANG: "pt_br", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "About this editor": "Sobre este editor",
-    "Close": "Fechar"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/modules/AboutBox/lang/ro.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/modules/AboutBox/lang/ro.js
deleted file mode 100644
index 24fbaf5..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/modules/AboutBox/lang/ro.js
+++ /dev/null
@@ -1,13 +0,0 @@
-// I18N constants
-// LANG: "ro", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "About this editor": "Despre editor"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/modules/AboutBox/lang/ru.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/modules/AboutBox/lang/ru.js
deleted file mode 100644
index 3a315e2..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/modules/AboutBox/lang/ru.js
+++ /dev/null
@@ -1,14 +0,0 @@
-// I18N constants
-// LANG: "ru", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "About this editor": "О редакторе",
-    "Close": "Закрыть"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/modules/AboutBox/lang/sh.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/modules/AboutBox/lang/sh.js
deleted file mode 100644
index ad2383a..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/modules/AboutBox/lang/sh.js
+++ /dev/null
@@ -1,13 +0,0 @@
-// I18N constants
-// LANG: "sh", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "About this editor": "O ovom editoru"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/modules/AboutBox/lang/si.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/modules/AboutBox/lang/si.js
deleted file mode 100644
index 76c2ca3..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/modules/AboutBox/lang/si.js
+++ /dev/null
@@ -1,13 +0,0 @@
-// I18N constants
-// LANG: "si", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "About this editor": "Vizitka za urejevalnik"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/modules/AboutBox/lang/sr.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/modules/AboutBox/lang/sr.js
deleted file mode 100644
index d4dfa5f..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/modules/AboutBox/lang/sr.js
+++ /dev/null
@@ -1,13 +0,0 @@
-// I18N constants
-// LANG: "sr", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "About this editor": "О овом едитору"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/modules/AboutBox/lang/sv.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/modules/AboutBox/lang/sv.js
deleted file mode 100644
index 65b8a1d..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/modules/AboutBox/lang/sv.js
+++ /dev/null
@@ -1,14 +0,0 @@
-// I18N constants
-// LANG: "sv", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "About this editor": "Om denna editor",
-    "Close": "Stäng"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/modules/AboutBox/lang/th.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/modules/AboutBox/lang/th.js
deleted file mode 100644
index 8d7f3e6..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/modules/AboutBox/lang/th.js
+++ /dev/null
@@ -1,13 +0,0 @@
-// I18N constants
-// LANG: "th", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "About this editor": "เกี่ยวกับโปรแกรมนี้"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/modules/AboutBox/lang/tr.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/modules/AboutBox/lang/tr.js
deleted file mode 100644
index ffeda85..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/modules/AboutBox/lang/tr.js
+++ /dev/null
@@ -1,14 +0,0 @@
-// I18N constants
-// LANG: "tr", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "About this editor": "Bu düzenleyici hakkında",
-    "Close": "Kapat"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/modules/AboutBox/lang/vn.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/modules/AboutBox/lang/vn.js
deleted file mode 100644
index 1cacc50..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/modules/AboutBox/lang/vn.js
+++ /dev/null
@@ -1,13 +0,0 @@
-// I18N constants
-// LANG: "vn", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "About this editor": "Tự Giới Thiệu"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/modules/AboutBox/lang/zh_cn.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/modules/AboutBox/lang/zh_cn.js
deleted file mode 100644
index 37a86e3..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/modules/AboutBox/lang/zh_cn.js
+++ /dev/null
@@ -1,13 +0,0 @@
-// I18N constants
-// LANG: "zh_cn", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "About this editor": "关於 Xinha"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/modules/ColorPicker/ColorPicker.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/modules/ColorPicker/ColorPicker.js
deleted file mode 100644
index f2373e1..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/modules/ColorPicker/ColorPicker.js
+++ /dev/null
@@ -1,938 +0,0 @@
-
-  /**
-   * Gogo Internet Services Color Picker Javascript Widget
-   * colorPicker for short.
-   *
-   * @author James Sleeman <james@gogo.co.nz>
-   * @date June, 2005
-   *
-   * The colorPicker class provides access to a color map for selecting
-   * colors which will be passed back to a callback (usually such a callback would
-   * write the RGB hex value returned into a field, but that's up to you).
-   *
-   * The color map presented is a standard rectangular pallate with 0->360 degrees of
-   * hue on the Y axis and 0->100% saturation on the X axis, the value (brightness) is
-   * selectable as a vertical column of grey values.  Also present is a one row of
-   * white->grey->black for easy selection of these colors.
-   *
-   * A checkbox is presented, which when checked will force the palatte into "web safe"
-   * mode, only colours in the "web safe palatte" of 216 colors will be shown, the palatte
-   * is adjusted so that the normal blend of colours are "rounded" to the nearest web safe
-   * one.  It should be noted that "web safe" colours really are a thing of the past,
-   * not only can pretty much every body display several million colours, but it's actually
-   * been found that of those 216 web safe colours only 20 to 30 are actually going to be
-   * displayed equally on the majority of monitors, and those are mostly yellows!
-   *
-   * =Usage Example=
-   * {{{
-   *  <!-- Here is the field -->         <!-- And we will use this button to open the picker"
-   *  <input type="text" id="myField" /> <input type="button" value="..." id="myButton" />
-   *  <script>
-   *    // now when the window loads link everything up
-   *    window.onload = function()
-   *    {
-   *
-   *      var myField  = document.getElementById('myField');  // Get our field
-   *      var myButton = document.getElementById('myButton'); // And the button
-   *      var myPicker = new colorPicker                      // Make a picker
-   *        (
-   *          {
-   *              // Cellsize is the width and height of each colour cell
-   *            cellsize: '5px',
-   *              // Callback is the function to execute when we are done,
-   *              // this one puts the color value into the field
-   *            callback: function(color){myField.value=color},
-   *              // Granularity defines the maximum number of colors per row/column
-   *              // more colors (high number) gives a smooth gradient of colors
-   *              // but it will take (much) longer to display, while a small number
-   *              // displays quickly, but doesn't show as many different colors.
-   *              // Experiement with it, 18 seems like a good number.
-   *            granularity: 18,
-   *              // Websafe specifies whether or not to include the Web Safe checkbox
-   *            websafe: false,
-   *              // Savecolors specifies the number of recently-selected colors to remember
-   *            savecolors: 20
-   *           }
-   *        );
-   *
-   *      // And now hookup the button to open the picker,
-   *      //  the function to do that is myPicker.open()
-   *      //  it accepts two parameters, the "anchorage" and the element to anchor to,
-   *      //  and an optional third parameter, an initial color code to show in 
-   *      //  the text box and sample.
-   *      //
-   *      //  anchorage is made up of two of the keywords bottom,top,left and right
-   *      //    left:   the left edge of the picker will align to the left edge of the element
-   *      // or right:  the right edgeof the picker aligns to the right edge of the element
-   *      //    top:    the picker will appear above the element
-   *      // or bottom: the picker will appear below the element
-   *
-   *      myButton.onclick =
-   *        function()
-   *        {              // anchorage   , element to anchor to
-   *          myPicker.open('bottom,right', myButton, initcolor)
-   *        };
-   *    }
-   *  </script>
-   * }}}
-   */
-  ColorPicker._pluginInfo =
-  {
-    name     : "colorPicker",
-    version  : "$LastChangedRevision: 1402 $".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() 
-  {
-  // dummy function for Xinha plugin api, note the different names
-  }
-  try {
-    if (window.opener && window.opener.Xinha)
-    { // this prevents that the Xinha.colorPicker object of the opening window is replaced by the one loaded in the popup
-      var openerColorPicker = window.opener.Xinha.colorPicker;
-      Xinha._addEvent(window,'unload', function() {Xinha.colorPicker = openerColorPicker;});
-    }
-  } catch(e) {}
-  //the actual function is below
-  Xinha.colorPicker = function (params)
-  {
-    // if the savedColors is empty, try to read the savedColors from cookie
-    if ( Xinha.colorPicker.savedColors.length === 0 )
-    {
-      Xinha.colorPicker.loadColors();
-    }
-
-    this.is_ie_6 = (Xinha.is_ie && Xinha.ie_version < 7);
-    var picker = this;
-    var enablepick = false;
-    var enablevalue = false;
-    var pickrow = 0;
-    var pickcol = 0;
-    this.callback = params.callback?params.callback:function(color){alert('You picked ' + color );};
-    this.websafe  = params.websafe?params.websafe:false;
-    this.savecolors = params.savecolors? params.savecolors: 20;
-
-    this.cellsize = parseInt(params.cellsize?params.cellsize:'10px', 10);
-    this.side     = params.granularity?params.granularity:18;
-    var valuecol = this.side + 1;
-    var valuerow = 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()
-    {
-      enablepick = false;
-      enablevalue = false;
-    };
-    this.tbody = document.createElement('tbody');
-    this.table.appendChild(this.tbody);
-    this.table.style.border = '1px solid WindowFrame';
-    this.table.style.zIndex = '1050';
-    // Add a title bar and close button
-    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...', 'ColorPicker')));
-    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 but = document.createElement('div');
-    but.title = Xinha._lc("Close", 'ColorPicker');
-    but.className= 'buttonColor';
-    but.style.height = '11px';
-    but.style.width = '11px';
-    but.style.cursor = 'pointer';
-    but.onclick = function() { picker.close(); };
-    but.appendChild(document.createTextNode('\u00D7'));
-    but.align = 'center';
-    but.style.verticalAlign = 'top';
-    but.style.position = 'relative';
-    but.style.cssFloat = 'right';
-    but.style.styleFloat = 'right';
-    but.style.padding = '0';
-    but.style.margin = '2px';
-    but.style.backgroundColor = 'transparent';
-    but.style.fontSize= '11px';
-    if ( !Xinha.is_ie) but.style.lineHeight= '9px'; // line-height:9px is better for centering the x, but IE cuts it off at the bottom :(
-    but.style.letterSpacing= '0';
-    
-        
-    td.appendChild(but);
-
-    this.tbody.appendChild(tr);
-    but = 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))
-        {
-          picker.backSample.style.backgroundColor = this.value;
-          picker.foreSample.style.color = this.value;
-        }
-      };
-
-    this.backSample = document.createElement('div');
-    this.backSample.appendChild(document.createTextNode('\u00A0'));
-    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', 'ColorPicker')));
-    this.foreSample.style.fontWeight = 'bold';
-    this.foreSample.style.fontFamily = 'small-caption,caption,sans-serif';
-    this.foreSample.fontSize = 'x-small';
-
-    /** Convert a decimal number to a two byte hexadecimal representation.
-      * Zero-pads if necessary.
-      *
-      * @param integer dec Integer from 0 -> 255
-      * @returns string 2 character hexadecimal (zero padded)
-      */
-    function toHex(dec)
-    {
-      var h = dec.toString(16);
-      if(h.length < 2) { h = '0' + h; }
-      return h;
-    }
-
-    /** Convert a color object {red:x, green:x, blue:x} to an RGB hex triplet
-     * @param object tuple {red:0->255, green:0->255, blue:0->255}
-     * @returns string hex triplet (#rrggbb)
-     */
-
-    function tupleToColor(tuple)
-    {
-      return '#' + toHex(tuple.red) + toHex(tuple.green) + toHex(tuple.blue);
-    }
-
-    /** Determine the nearest power of a number to another number
-     * (eg nearest power of 4 to 5 => 4, of 4 to 7 => 8)
-     *
-     * @usedby rgbToWebsafe
-     * @param number num number to round to nearest power of <power>
-     * @param number power number to find the nearest power of
-     * @returns number Nearest power of <power> to num.
-     */
-
-    function nearestPowerOf(num,power)
-    {
-      return Math.round(Math.round(num / power) * power);
-    }
-
-    /** Concatenate the hex representation of dec to itself and return as an integer.
-     *  eg dec = 10 -> A -> AA -> 170
-     *
-     * @usedby rgbToWebsafe
-     * @param dec integer
-     * @returns integer
-     */
-
-    function doubleHexDec(dec)
-    {
-      return parseInt(dec.toString(16) + dec.toString(16), 16);
-    }
-
-    /** Convert a given RGB color to the nearest "Web-Safe" color.  A websafe color only has the values
-     *  00, 33, 66, 99, CC and FF for each of the red, green and blue components (thus 6 shades of each
-     *  in combination to produce 6 * 6 * 6 = 216 colors).
-     *
-     * @param    color object {red:0->255, green:0->255, blue:0->255}
-     * @returns  object {red:51|102|153|204|255, green:51|102|153|204|255, blue:51|102|153|204|255}
-     */
-    function rgbToWebsafe(color)
-    {
-      // For each take the high byte, divide by three, round and multiply by three before rounding again
-      color.red   = doubleHexDec(nearestPowerOf(parseInt(toHex(color.red).charAt(0), 16), 3));
-      color.blue  = doubleHexDec(nearestPowerOf(parseInt(toHex(color.blue).charAt(0), 16), 3));
-      color.green = doubleHexDec(nearestPowerOf(parseInt(toHex(color.green).charAt(0), 16), 3));
-      return color;
-    }
-
-    /** Convert a combination of hue, saturation and value into an RGB color.
-     *  Hue is defined in degrees, saturation and value as a floats between 0 and 1 (0% -> 100%)
-     *
-     * @param h float angle of hue around color wheel 0->360
-     * @param s float saturation of color (no color (grey)) 0->1 (vibrant)
-     * @param v float value (brightness) of color (black) 0->1 (bright)
-     * @returns object {red:0->255, green:0->255, blue:0->255}
-     * @seealso http://en.wikipedia.org/wiki/HSV_color_space
-     */
-    function hsvToRGB(h,s,v)
-    {
-      var colors;
-      if(s === 0)
-      {
-        // GREY
-        colors = {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: colors =  {red:v, green:t, blue:p}; break;
-          case 1: colors =  {red:q, green:v, blue:p}; break;
-          case 2: colors =  {red:p, green:v, blue:t}; break;
-          case 3: colors =  {red:p, green:q, blue:v}; break;
-          case 4: colors =  {red:t, green:p, blue:v}; break;
-          default:colors =  {red:v, green:p, blue:q}; break;
-        }
-      }
-      colors.red = Math.ceil(colors.red * 255);
-      colors.green = Math.ceil(colors.green * 255);
-      colors.blue = Math.ceil(colors.blue * 255);
-      return colors;
-    }
-    var self = this;
-    function closeOnBodyClick (ev)
-    {
-      ev = ev ? ev : window.event;
-      el = ev.target ? ev.target : ev.srcElement;
-      do
-      {
-        if (el == self.table) return;
-      }
-      while (el = el.parentNode);
-      self.close();
-    }
-    /** Open the color picker
-     *
-     * @param string anchorage pair of sides of element to anchor the picker to
-     *   "top,left" "top,right" "bottom,left" or "bottom,right"
-     * @param HTML_ELEMENT element the element to anchor the picker to sides of
-     *
-     * @note The element is just referenced here for positioning (anchoring), it
-     * does not automatically get the color copied into it.  See the usage instructions
-     * for the class.
-     */
-
-    this.open = function(anchorage,element,initcolor)
-    {
-      this.table.style.display = '';
-
-      this.pick_color();
-      if(initcolor && /#[0-9a-f]{6,6}/i.test(initcolor))
-      {
-        this.chosenColor.value = initcolor;
-        this.backSample.style.backgroundColor = initcolor;
-        this.foreSample.style.color = initcolor;
-      }
-
-      Xinha._addEvent(document.body,'mousedown',closeOnBodyClick);
-      
-      // Find position of the element
-      this.table.style.position = 'absolute';
-      var e = element;
-      var top  = 0;
-      var left = 0;
-      
-      // Check for overflow:scroll elements which do not have position:relative
-      while(e.parentNode)
-      {
-        e = e.parentNode;
-        if(typeof e.tagName != 'undefined' && !e.tagName.toLowerCase().match(/body|html/))
-        {
-          if( ( e.scrollTop || e.scrollLeft ) && !e.style.position.match(/fixed|absolute|relative/))
-          {
-            Xinha.debugMsg('Warning, the Xinha editor is included in a '+e.tagName+' which has scroll (overflow) but is not positioned relative, absolute, or fixed.  The ColorPicker plugin may not display in the correct location.', 'warn');
-          }
-        }
-      }
-      e = element;
-      
-      do
-      {
-        if (e.style.position == 'fixed') 
-        {
-          this.table.style.position = 'fixed';
-        }
-        
-        if(e.tagName.toLowerCase() == 'body')
-        {
-                              // I don't think we need adjust for scroll at all on body
-                              // In standards these would be 0 for the body (vs document.documentElement.scrollTop/Left)
-                              // in quirks they are not, and it doesn't work in quirks with them.
-          top += e.offsetTop;  // - e.scrollTop;
-          left += e.offsetLeft;// - e.scrollLeft;
-        }
-        else
-        {
-          // Caution, unless an element is positioned (position: fixed/relative/absolute) 
-          // then it will not be considered because it is not an offsetParent
-          // so if you haev an overflow:scroll; div containing your Xinha, then you
-          // must set position:relative;  (or other position) on it in order to get it 
-          // to be considered.
-          top += e.offsetTop - e.scrollTop;
-          left += e.offsetLeft - e.scrollLeft;
-        }
-        
-        e = e.offsetParent;
-      }
-      while(e);
-
-      var x, y;
-      if(/top/.test(anchorage) || (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 + element.offsetHeight) + 'px';
-      }
-
-      if(/left/.test(anchorage) || (left + this.table.offsetWidth > document.body.offsetWidth))
-      {
-        if(left - (this.table.offsetWidth - element.offsetWidth) > 0 )
-        {
-          this.table.style.left = (left - (this.table.offsetWidth - element.offsetWidth)) + 'px';
-        }
-        else
-        {
-          this.table.style.left = 0;
-        }
-      }
-      else
-      {
-        this.table.style.left = left + 'px';
-      }
-     // IE6 ONLY - prevent windowed elements (<SELECT>) to render above the colorpicker
-      if (this.is_ie_6)
-      {
-        this.iframe.style.top = this.table.style.top;
-        this.iframe.style.left = this.table.style.left;
-      }
-    };
-
-    function pickCell(cell)
-    {
-        picker.chosenColor.value = cell.colorCode;
-        picker.backSample.style.backgroundColor = cell.colorCode;
-        picker.foreSample.style.color = cell.colorCode;
-        if((cell.hue >= 195  && cell.saturation > 0.5) || 
-           (cell.hue === 0 && cell.saturation === 0 && cell.value < 0.5) || 
-           (cell.hue !== 0 && picker.value < 0.75))
-        {
-          cell.style.borderColor = '#fff';
-        }
-        else
-        {
-          cell.style.borderColor = '#000';
-        }
-        pickrow = cell.thisrow;
-        pickcol = cell.thiscol;
-     }
-    
-    function pickValue(cell)
-    {
-   //     cell.style.borderWidth = '1px';
-   //     cell.style.borderStyle = 'solid';
-        if(picker.value < 0.5)
-        {
-           cell.style.borderColor = '#fff';
-        }
-        else
-        {
-          cell.style.borderColor = '#000';
-        }
-        valuerow = cell.thisrow;
-        valuecol = cell.thiscol;
-        picker.chosenColor.value = picker.saved_cells[pickrow][pickcol].colorCode;
-        picker.backSample.style.backgroundColor = picker.saved_cells[pickrow][pickcol].colorCode;
-        picker.foreSample.style.color = picker.saved_cells[pickrow][pickcol].colorCode;
-    }
-    
-    function unpickCell(row,col)
-    {
-      picker.saved_cells[row][col].style.borderColor = picker.saved_cells[row][col].colorCode;
-    }
-    
-    /** Draw the color picker. */
-    this.pick_color = function()
-    {
-      var rows, cols;
-      var picker = this;
-      var huestep = 359/(this.side);
-      var saturstep = 1/(this.side - 1);
-      var valustep  = 1/(this.side - 1);
-      var constrain = 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(constrain)
-            {
-              td.colorCode = tupleToColor(rgbToWebsafe(hsvToRGB(huestep*row, saturstep*col, this.value)));
-            }
-            else
-            {
-              td.colorCode = tupleToColor(hsvToRGB(huestep*row, saturstep*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 == pickrow && col == pickcol)
-            {
-              td.style.borderColor = '#000';
-              this.chosenColor.value = td.colorCode;
-              this.backSample.style.backgroundColor = td.colorCode;
-              this.foreSample.style.color = td.colorCode;
-            }
-            td.hue = huestep * row;
-            td.saturation = saturstep*col;
-            td.thisrow = row;
-            td.thiscol = col;
-            td.onmousedown = function()
-            {
-              enablepick = true;
-//            unpickCell(pickrow,pickcol);
-              picker.saved_cells[pickrow][pickcol].style.borderColor = picker.saved_cells[pickrow][pickcol].colorCode;
-              pickCell(this);
-            };
-            td.onmouseover = function()
-            {
-              if(enablepick)
-              {
-                pickCell(this);
-              }
-            };
-            td.onmouseout = function()
-            {
-              if(enablepick)
-              {
-    //          this.style.borderColor = picker.saved_cells[this.thisrow][this.thiscol].colorCode;
-                this.style.borderColor = this.colorCode;
-              }
-            };
-            td.ondblclick = function() { Xinha.colorPicker.remember(this.colorCode, picker.savecolors); picker.callback(this.colorCode); picker.close(); };
-            td.appendChild(document.createTextNode(' '));
-            td.style.cursor = 'pointer';
-            tr.appendChild(td);
-            td = null;
-          }
-
-          // Add a blank and then a value column
-          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,valustep*row)));
-          td.style.backgroundColor = td.colorCode = tupleToColor(hsvToRGB(0,0,valustep*row));
-          td.style.borderWidth = '1px';
-          td.style.borderStyle = 'solid';
-//          td.style.borderColor = td.style.backgroundColor;
-          td.style.borderColor = td.colorCode;
-          if(row == valuerow)
-          {
-            td.style.borderColor = 'black';
-          }
-          td.hue = huestep * row;
-          td.saturation = saturstep*col;
-          td.hsv_value = valustep*row;
-          td.thisrow = row;
-          td.thiscol = col + 1;
-          td.onmousedown = function()
-          {
-            enablevalue = true;
-//          unpickCell(valuerow,valuecol);
-            picker.saved_cells[valuerow][valuecol].style.borderColor = picker.saved_cells[valuerow][valuecol].colorCode;
-            picker.value = this.hsv_value; 
-            picker.pick_color();
-            pickValue(this);
-          };
-          td.onmouseover = function() {
-            if(enablevalue)
-            {
-              picker.value = this.hsv_value; 
-              picker.pick_color();
-              pickValue(this);
-            }
-          };
-          td.onmouseout = function()
-          {
-            if(enablevalue)
-            {
-       //       this.style.borderWidth = 0;
-       //       this.style.borderStyle = 'none';
-              this.style.borderColor = this.colorCode;//'';
-            }
-          };
-          td.style.cursor = 'pointer';
-          tr.appendChild(td);
-          td = null;
-
-          this.tbody.appendChild(tr);
-          tr = null;
-        }
-
-        // Add one row of greys
-        var tr = document.createElement('tr');
-        this.saved_cells[row] = [];
-        for(var col = 0; col < this.side; col++)
-        {
-          var td = document.createElement('td');
-          if(constrain)
-          {
-            td.colorCode = tupleToColor(rgbToWebsafe(hsvToRGB(0, 0, valustep*(this.side-col-1))));
-          }
-          else
-          {
-            td.colorCode = tupleToColor(hsvToRGB(0, 0, valustep*(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 = valustep*(this.side-col-1);
-          td.thisrow = row;
-          td.thiscol = col;
-          td.onmousedown = function()
-          {
-            enablepick = true;
-  //          unpickCell(pickrow,pickcol);
-            picker.saved_cells[pickrow][pickcol].style.borderColor = picker.saved_cells[pickrow][pickcol].colorCode;
-            pickCell(this);
-          };
-          td.onmouseover = function()
-          {
-            if(enablepick)
-            {
-              pickCell(this);
-            }
-          };
-          td.onmouseout = function()
-          {
-            if(enablepick)
-            {
-   //           this.style.borderColor = picker.saved_cells[this.thisrow][this.thiscol].colorCode;
-              this.style.borderColor = this.colorCode;
-            }
-          };
-          td.ondblclick = function() { Xinha.colorPicker.remember(this.colorCode, picker.savecolors); picker.callback(this.colorCode); picker.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 label = document.createElement('label');
-        label.appendChild(document.createTextNode(Xinha._lc('Web Safe: ', 'ColorPicker')));
-
-        this.constrain_cb.onclick = function() { picker.pick_color(); };
-        label.appendChild(this.constrain_cb);
-        label.style.fontFamily = 'small-caption,caption,sans-serif';
-        label.style.fontSize = 'x-small';
-        div.appendChild(label);
-        td.appendChild(div);
-        div = null;
-        }
-
-        var div = document.createElement('div');
-        var label = document.createElement('label');
-        label.style.fontFamily = 'small-caption,caption,sans-serif';
-        label.style.fontSize = 'x-small';
-        label.appendChild(document.createTextNode(Xinha._lc('Color: ', 'ColorPicker')));
-        label.appendChild(this.chosenColor);
-        div.appendChild(label);
-        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(picker.chosenColor.value, picker.savecolors); picker.callback(picker.chosenColor.value); picker.close(); };
-        but.appendChild(document.createTextNode(Xinha._lc('OK', 'ColorPicker')));
-        but.align = 'center';
-        div.appendChild(but);
-        td.appendChild(div);
-
-        var sampleTable = document.createElement('table');
-        sampleTable.style.width = '100%';
-        var sampleBody = document.createElement('tbody');
-        sampleTable.appendChild(sampleBody);
-        var sampleRow = document.createElement('tr');
-        sampleBody.appendChild(sampleRow);
-        var leftSampleCell = document.createElement('td');
-        sampleRow.appendChild(leftSampleCell);
-        leftSampleCell.appendChild(this.backSample);
-        leftSampleCell.style.width = '50%';
-        var rightSampleCell = document.createElement('td');
-        sampleRow.appendChild(rightSampleCell);
-        rightSampleCell.appendChild(this.foreSample);
-        rightSampleCell.style.width = '50%';
-
-        td.appendChild(sampleTable);
-        var savedColors = document.createElement('div');
-        savedColors.style.clear = 'both';
-
-        function createSavedColors(color)
-        {
-          var is_ie = Xinha.is_ie;
-
-          var div = document.createElement('div');
-          div.style.width = picker.cellsize + 'px';//13px';
-          div.style.height = picker.cellsize + 'px';//13px';
-          div.style.margin = '1px';
-          div.style.border = '1px solid black';
-          div.style.cursor = 'pointer';
-          div.style.backgroundColor = color;
-          div.style[ is_ie ? 'styleFloat' : 'cssFloat'] = 'left';
-     //     div.onclick = function() { picker.callback(color); picker.close(); };
-          div.ondblclick = function() { picker.callback(color); picker.close(); };
-   //       div.onmouseover = function()
-          div.onclick = function()
-          {
-            picker.chosenColor.value = color;
-            picker.backSample.style.backgroundColor = color;
-            picker.foreSample.style.color = color;
-          };
-          savedColors.appendChild(div);
-        }
-        for ( var savedCols = 0; savedCols < Xinha.colorPicker.savedColors.length; savedCols++ )
-        {
-          createSavedColors(Xinha.colorPicker.savedColors[savedCols]);
-        }
-        td.appendChild(savedColors);
-
-        this.tbody.appendChild(tr);
-        document.body.appendChild(this.table);
-        
-        //put an iframe behind the table to mask select lists in ie
-        // IE6 ONLY - prevent windowed elements (<SELECT>) to render above the colorpicker
-        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(constrain)
-            {
-              this.saved_cells[row][col].colorCode = tupleToColor(rgbToWebsafe(hsvToRGB(huestep*row, saturstep*col, this.value)));
-            }
-            else
-            {
-              this.saved_cells[row][col].colorCode = tupleToColor(hsvToRGB(huestep*row, saturstep*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 pickcell = this.saved_cells[pickrow][pickcol];
-        this.chosenColor.value = pickcell.colorCode;
-        this.backSample.style.backgroundColor = pickcell.colorCode;
-        this.foreSample.style.color = pickcell.colorCode;
-        if((pickcell.hue >= 195  && pickcell.saturation > 0.5) || 
-           (pickcell.hue === 0 && pickcell.saturation === 0 && pickcell.value < 0.5) || 
-           (pickcell.hue !== 0 && picker.value < 0.75))
-        {
-           pickcell.style.borderColor = '#fff';
-        }
-        else
-        {
-          pickcell.style.borderColor = '#000';
-        }
-      }
-    };
-
-    /** Close the color picker */
-    this.close = function()
-    {
-      Xinha._removeEvent(document.body,'mousedown',closeOnBodyClick);
-      this.table.style.display = 'none';
-      // IE6 ONLY - prevent windowed elements (<SELECT>) to render above the colorpicker
-      if (this.is_ie_6)
-      {
-        if ( this.iframe ) { this.iframe.style.display = 'none'; }
-      }
-    };
-} // end Xinha.colorPicker
-
-// array of the saved colors
-Xinha.colorPicker.savedColors = [];
-
-// add the color to the savedColors
-Xinha.colorPicker.remember = function(color, savecolors)
-{
-  // check if this color is known
-  for ( var i = Xinha.colorPicker.savedColors.length; i--; )
-  {
-    if ( Xinha.colorPicker.savedColors[i] == color )
-    {
-      return false;
-    }
-  }
-  // insert the new color
-  Xinha.colorPicker.savedColors.splice(0, 0, color);
-  // limit elements
-  Xinha.colorPicker.savedColors = Xinha.colorPicker.savedColors.slice(0, savecolors);
-  //[mokhet] probably some more parameters to send to the cookie definition
-  // like domain, secure and such, especially with https connection i presume
-  // save the cookie
-  var expdate = new Date();
-  expdate.setMonth(expdate.getMonth() + 1);
-
-  document.cookie = 'XinhaColorPicker=' + escape (Xinha.colorPicker.savedColors.join('-')) + ';expires=' + expdate.toGMTString();
-  return true;
-};
-
-// try to read the colors from the cookie
-Xinha.colorPicker.loadColors = function()
-{
-  var index = document.cookie.indexOf('XinhaColorPicker');
-  if ( index != -1 )
-  {
-    var begin = (document.cookie.indexOf('=', index) + 1);
-    var end = document.cookie.indexOf(';', index);
-    if ( end == -1 ) { end = document.cookie.length; }
-    Xinha.colorPicker.savedColors = unescape(document.cookie.substring(begin, end)).split('-');
-  }
-};
-
-
-
-/** Create a neat little box next to an input field
- *    * shows actual color
- *    * opens colorPicker on click
- *    * has a button to clear the color with a click
- *
- *  @param input (DOM element) 
- *  @param optional pickerConfig configuration object for Xinha.colorPicker()
- */
-Xinha.colorPicker.InputBinding = function(input,pickerConfig)
-{
-  var doc = input.ownerDocument;
-  var main = doc.createElement('span');
-  main.className = "buttonColor";
-  
-  var chooser = this.chooser = doc.createElement('span');
-  chooser.className = "chooser";
-  if (input.value) chooser.style.backgroundColor = input.value;
-  chooser.onmouseover = function() {chooser.className = "chooser buttonColor-hilite";};
-  chooser.onmouseout = function() {chooser.className = "chooser";};
-  chooser.appendChild(doc.createTextNode('\u00a0'));
-  main.appendChild(chooser);
-  var clearColor = doc.createElement('span');
-  clearColor.className = "nocolor";
-  clearColor.onmouseover = function() {clearColor.className = "nocolor buttonColor-hilite"; clearColor.style.color='#f00'};
-  clearColor.onmouseout = function() {clearColor.className = "nocolor"; clearColor.style.color='#000'};
-  clearColor.onclick = function() {input.value ='';chooser.style.backgroundColor = ''};
-  clearColor.appendChild(doc.createTextNode('\u00d7'));
-  main.appendChild(clearColor);
-  
-  input.parentNode.insertBefore(main,input.nextSibling);
-  
-  Xinha._addEvent(input,'change',function() {chooser.style.backgroundColor = this.value;})
-
-  pickerConfig = (pickerConfig) ? Xinha.cloneObject(pickerConfig) : { cellsize:'5px' };
-  pickerConfig.callback = (pickerConfig.callback) ? pickerConfig.callback : function(color) {chooser.style.backgroundColor = color;input.value=color;if(typeof input.oncolorpicked == 'function') input.oncolorpicked();};
-
-  chooser.onclick = function() 
-  { 
-    var colPicker = new Xinha.colorPicker(pickerConfig);
-    colPicker.open("",chooser, input.value ); 
-  }
-  Xinha.freeLater(this,"chooser");
-}
-Xinha.colorPicker.InputBinding.prototype.setColor = function (color)
-{
-  this.chooser.style.backgroundColor = color;
-}
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/modules/ColorPicker/lang/ch.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/modules/ColorPicker/lang/ch.js
deleted file mode 100644
index b1e6b20..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/modules/ColorPicker/lang/ch.js
+++ /dev/null
@@ -1,13 +0,0 @@
-// I18N constants
-// LANG: "ch", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "OK": "好"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/modules/ColorPicker/lang/cz.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/modules/ColorPicker/lang/cz.js
deleted file mode 100644
index df76250..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/modules/ColorPicker/lang/cz.js
+++ /dev/null
@@ -1,14 +0,0 @@
-// I18N constants
-// LANG: "cz", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Color: ": "Barva",
-    "OK": "OK"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/modules/ColorPicker/lang/da.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/modules/ColorPicker/lang/da.js
deleted file mode 100644
index 418b660..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/modules/ColorPicker/lang/da.js
+++ /dev/null
@@ -1,18 +0,0 @@
-// I18N constants
-// LANG: "da", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Click a color...": "Vælg farve",
-    "Close": "Luk",
-    "Color: ": "Farve: ",
-    "OK": "OK",
-    "Sample": "Eksempel",
-    "Web Safe: ": "Web Safe: "
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/modules/ColorPicker/lang/de.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/modules/ColorPicker/lang/de.js
deleted file mode 100644
index 1f5285f..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/modules/ColorPicker/lang/de.js
+++ /dev/null
@@ -1,18 +0,0 @@
-// I18N constants
-// LANG: "de", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Click a color...": "Farbe wählen",
-    "Close": "Schließen",
-    "Color: ": "Farbe: ",
-    "OK": "OK",
-    "Sample": "Beispiel",
-    "Web Safe: ": "Web Safe: "
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/modules/ColorPicker/lang/ee.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/modules/ColorPicker/lang/ee.js
deleted file mode 100644
index 276bee0..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/modules/ColorPicker/lang/ee.js
+++ /dev/null
@@ -1,13 +0,0 @@
-// I18N constants
-// LANG: "ee", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "OK": "OK"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/modules/ColorPicker/lang/el.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/modules/ColorPicker/lang/el.js
deleted file mode 100644
index 91194ff..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/modules/ColorPicker/lang/el.js
+++ /dev/null
@@ -1,14 +0,0 @@
-// I18N constants
-// LANG: "el", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Color: ": "Χρώμα",
-    "OK": "Εντάξει"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/modules/ColorPicker/lang/es.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/modules/ColorPicker/lang/es.js
deleted file mode 100644
index 215f4bd..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/modules/ColorPicker/lang/es.js
+++ /dev/null
@@ -1,18 +0,0 @@
-// I18N constants
-// LANG: "es", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Click a color...": "Seleccione un color...",
-    "Close": "Cerrar",
-    "Color: ": "Color: ",
-    "OK": "Aceptar",
-    "Sample": "Muestra",
-    "Web Safe: ": "Color web: "
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/modules/ColorPicker/lang/eu.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/modules/ColorPicker/lang/eu.js
deleted file mode 100644
index 92e7dfd..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/modules/ColorPicker/lang/eu.js
+++ /dev/null
@@ -1,18 +0,0 @@
-// I18N constants
-// LANG: "eu", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Click a color...": "Kolore bat aukeratu...",
-    "Close": "Itxi",
-    "Color: ": "Kolorea: ",
-    "OK": "Ados",
-    "Sample": "Lagina",
-    "Web Safe: ": "Web Safe: "
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/modules/ColorPicker/lang/fa.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/modules/ColorPicker/lang/fa.js
deleted file mode 100644
index 6a3455f..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/modules/ColorPicker/lang/fa.js
+++ /dev/null
@@ -1,14 +0,0 @@
-// I18N constants
-// LANG: "fa", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Close": "بستن",
-    "OK": "بله"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/modules/ColorPicker/lang/fi.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/modules/ColorPicker/lang/fi.js
deleted file mode 100644
index 799506e..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/modules/ColorPicker/lang/fi.js
+++ /dev/null
@@ -1,14 +0,0 @@
-// I18N constants
-// LANG: "fi", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Color: ": "Väri",
-    "OK": "Hyväksy"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/modules/ColorPicker/lang/fr.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/modules/ColorPicker/lang/fr.js
deleted file mode 100644
index a0efa40..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/modules/ColorPicker/lang/fr.js
+++ /dev/null
@@ -1,15 +0,0 @@
-// I18N constants
-// LANG: "fr", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Close": "Fermer",
-    "Color: ": "Couleur",
-    "OK": "OK"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/modules/ColorPicker/lang/he.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/modules/ColorPicker/lang/he.js
deleted file mode 100644
index 6b3c06d..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/modules/ColorPicker/lang/he.js
+++ /dev/null
@@ -1,14 +0,0 @@
-// I18N constants
-// LANG: "he", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Color: ": "צבע",
-    "OK": "אישור"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/modules/ColorPicker/lang/hu.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/modules/ColorPicker/lang/hu.js
deleted file mode 100644
index 15f9159..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/modules/ColorPicker/lang/hu.js
+++ /dev/null
@@ -1,13 +0,0 @@
-// I18N constants
-// LANG: "hu", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "OK": "Rendben"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/modules/ColorPicker/lang/it.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/modules/ColorPicker/lang/it.js
deleted file mode 100644
index 8f89988..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/modules/ColorPicker/lang/it.js
+++ /dev/null
@@ -1,14 +0,0 @@
-// I18N constants
-// LANG: "it", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Color: ": "Colore",
-    "OK": "OK"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/modules/ColorPicker/lang/ja.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/modules/ColorPicker/lang/ja.js
deleted file mode 100644
index 3db06b4..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/modules/ColorPicker/lang/ja.js
+++ /dev/null
@@ -1,18 +0,0 @@
-// I18N constants
-// LANG: "ja", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Click a color...": "色をクリック...",
-    "Close": "閉じる",
-    "Color: ": "色: ",
-    "OK": "OK",
-    "Sample": "サンプル",
-    "Web Safe: ": "Webセーフ: "
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/modules/ColorPicker/lang/lc_base.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/modules/ColorPicker/lang/lc_base.js
deleted file mode 100644
index a228304..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/modules/ColorPicker/lang/lc_base.js
+++ /dev/null
@@ -1,30 +0,0 @@
-// I18N constants
-//
-// LANG: "en", ENCODING: UTF-8
-// Author: Translator-Name, <email@example.com>
-//
-// Last revision: 2018-04-12
-// 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).
-//
-// (Please, remove information below)
-// 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.)
-
-{
-    "Click a color...": "",
-    "Close": "",
-    "Color: ": "",
-    "OK": "",
-    "Sample": "",
-    "Web Safe: ": ""
-}
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/modules/ColorPicker/lang/lt.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/modules/ColorPicker/lang/lt.js
deleted file mode 100644
index a4c006a..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/modules/ColorPicker/lang/lt.js
+++ /dev/null
@@ -1,13 +0,0 @@
-// I18N constants
-// LANG: "lt", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "OK": "OK"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/modules/ColorPicker/lang/lv.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/modules/ColorPicker/lang/lv.js
deleted file mode 100644
index 17e6c8c..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/modules/ColorPicker/lang/lv.js
+++ /dev/null
@@ -1,13 +0,0 @@
-// I18N constants
-// LANG: "lv", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "OK": "Labi"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/modules/ColorPicker/lang/nb.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/modules/ColorPicker/lang/nb.js
deleted file mode 100644
index 47545db..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/modules/ColorPicker/lang/nb.js
+++ /dev/null
@@ -1,14 +0,0 @@
-// I18N constants
-// LANG: "nb", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Color: ": "Farge",
-    "OK": "OK"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/modules/ColorPicker/lang/nl.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/modules/ColorPicker/lang/nl.js
deleted file mode 100644
index 903177c..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/modules/ColorPicker/lang/nl.js
+++ /dev/null
@@ -1,14 +0,0 @@
-// I18N constants
-// LANG: "nl", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Color: ": "Kleur",
-    "OK": "OK"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/modules/ColorPicker/lang/pl.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/modules/ColorPicker/lang/pl.js
deleted file mode 100644
index 6d15fdf..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/modules/ColorPicker/lang/pl.js
+++ /dev/null
@@ -1,14 +0,0 @@
-// I18N constants
-// LANG: "pl", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Color: ": "Kolor",
-    "OK": "OK"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/modules/ColorPicker/lang/pt_br.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/modules/ColorPicker/lang/pt_br.js
deleted file mode 100644
index 880311b..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/modules/ColorPicker/lang/pt_br.js
+++ /dev/null
@@ -1,18 +0,0 @@
-// I18N constants
-// LANG: "pt_br", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Click a color...": "Selecione uma côr...",
-    "Close": "Fechar",
-    "Color: ": "Côr:",
-    "OK": "OK",
-    "Sample": "Exemplo",
-    "Web Safe: ": "Web Segura:"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/modules/ColorPicker/lang/ro.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/modules/ColorPicker/lang/ro.js
deleted file mode 100644
index d58699f..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/modules/ColorPicker/lang/ro.js
+++ /dev/null
@@ -1,14 +0,0 @@
-// I18N constants
-// LANG: "ro", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Color: ": "Culoare",
-    "OK": "Acceptă"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/modules/ColorPicker/lang/ru.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/modules/ColorPicker/lang/ru.js
deleted file mode 100644
index bd26fd0..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/modules/ColorPicker/lang/ru.js
+++ /dev/null
@@ -1,15 +0,0 @@
-// I18N constants
-// LANG: "ru", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Close": "Закрыть",
-    "Color: ": "Цвет",
-    "OK": "OK"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/modules/ColorPicker/lang/sh.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/modules/ColorPicker/lang/sh.js
deleted file mode 100644
index 03bad6b..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/modules/ColorPicker/lang/sh.js
+++ /dev/null
@@ -1,13 +0,0 @@
-// I18N constants
-// LANG: "sh", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "OK": "OK"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/modules/ColorPicker/lang/si.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/modules/ColorPicker/lang/si.js
deleted file mode 100644
index 93b7a8b..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/modules/ColorPicker/lang/si.js
+++ /dev/null
@@ -1,13 +0,0 @@
-// I18N constants
-// LANG: "si", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "OK": "V redu"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/modules/ColorPicker/lang/sr.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/modules/ColorPicker/lang/sr.js
deleted file mode 100644
index 5671f11..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/modules/ColorPicker/lang/sr.js
+++ /dev/null
@@ -1,13 +0,0 @@
-// I18N constants
-// LANG: "sr", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "OK": "OK"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/modules/ColorPicker/lang/sv.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/modules/ColorPicker/lang/sv.js
deleted file mode 100644
index 9b0c334..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/modules/ColorPicker/lang/sv.js
+++ /dev/null
@@ -1,15 +0,0 @@
-// I18N constants
-// LANG: "sv", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Close": "Stäng",
-    "Color: ": "Färg",
-    "OK": "OK"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/modules/ColorPicker/lang/th.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/modules/ColorPicker/lang/th.js
deleted file mode 100644
index c8e2a8f..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/modules/ColorPicker/lang/th.js
+++ /dev/null
@@ -1,13 +0,0 @@
-// I18N constants
-// LANG: "th", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "OK": "ตกลง"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/modules/ColorPicker/lang/tr.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/modules/ColorPicker/lang/tr.js
deleted file mode 100644
index a7e8458..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/modules/ColorPicker/lang/tr.js
+++ /dev/null
@@ -1,18 +0,0 @@
-// I18N constants
-// LANG: "tr", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Click a color...": "Bir renk seçin",
-    "Close": "Kapat",
-    "Color: ": "Renk: ",
-    "OK": "Tamam",
-    "Sample": "Örnek",
-    "Web Safe: ": "Web güvenli mod: "
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/modules/ColorPicker/lang/vn.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/modules/ColorPicker/lang/vn.js
deleted file mode 100644
index 58d927f..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/modules/ColorPicker/lang/vn.js
+++ /dev/null
@@ -1,13 +0,0 @@
-// I18N constants
-// LANG: "vn", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "OK": "Đồng ý"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/modules/CreateLink/dialog.html b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/modules/CreateLink/dialog.html
deleted file mode 100644
index 5c7863d..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.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-1.5.1/modules/CreateLink/lang/ch.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/modules/CreateLink/lang/ch.js
deleted file mode 100644
index a3f337b..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/modules/CreateLink/lang/ch.js
+++ /dev/null
@@ -1,23 +0,0 @@
-// I18N constants
-// LANG: "ch", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Cancel": "取消",
-    "Insert/Modify Link": "插入/改寫連結",
-    "New window (_blank)": "新窗户(_blank)",
-    "None (use implicit)": "無(use implicit)",
-    "OK": "好",
-    "Other": "其他",
-    "Same frame (_self)": "本匡 (_self)",
-    "Target:": "目標匡:",
-    "Title (tooltip):": "主題 (tooltip):",
-    "Top frame (_top)": "上匡 (_top)",
-    "URL:": "網址:"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/modules/CreateLink/lang/cz.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/modules/CreateLink/lang/cz.js
deleted file mode 100644
index 36b9929..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/modules/CreateLink/lang/cz.js
+++ /dev/null
@@ -1,14 +0,0 @@
-// I18N constants
-// LANG: "cz", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Cancel": "Zrušit",
-    "OK": "OK"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/modules/CreateLink/lang/da.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/modules/CreateLink/lang/da.js
deleted file mode 100644
index 6b9b0c2..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/modules/CreateLink/lang/da.js
+++ /dev/null
@@ -1,23 +0,0 @@
-// I18N constants
-// LANG: "da", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Cancel": "Annuller",
-    "Insert/Modify Link": "Indsæt/rediger hyperlink",
-    "New window (_blank)": "Nyt vindue (_blank)",
-    "None (use implicit)": "ingen (implicit)",
-    "OK": "OK",
-    "Other": "Andet",
-    "Same frame (_self)": "Samme ramme (_self)",
-    "Target:": "Placering:",
-    "Title (tooltip):": "Titel (Tooltip):",
-    "Top frame (_top)": "Topramme (_top)",
-    "URL:": "URL:"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/modules/CreateLink/lang/de.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/modules/CreateLink/lang/de.js
deleted file mode 100644
index f477511..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/modules/CreateLink/lang/de.js
+++ /dev/null
@@ -1,24 +0,0 @@
-// I18N constants
-// LANG: "de", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Are you sure you wish to remove this link?": "Wollen Sie diesen Link wirklich entfernen?",
-    "Cancel": "Abbrechen",
-    "Insert/Modify Link": "Verknüpfung hinzufügen/ändern",
-    "New window (_blank)": "Neues Fenster (_blank)",
-    "None (use implicit)": "k.A. (implizit)",
-    "OK": "OK",
-    "Other": "Anderes",
-    "Same frame (_self)": "Selber Rahmen (_self)",
-    "Target:": "Ziel:",
-    "Title (tooltip):": "Titel (Tooltip):",
-    "Top frame (_top)": "Oberster Rahmen (_top)",
-    "URL:": "URL:"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/modules/CreateLink/lang/ee.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/modules/CreateLink/lang/ee.js
deleted file mode 100644
index ba916e9..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/modules/CreateLink/lang/ee.js
+++ /dev/null
@@ -1,14 +0,0 @@
-// I18N constants
-// LANG: "ee", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Cancel": "Loobu",
-    "OK": "OK"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/modules/CreateLink/lang/el.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/modules/CreateLink/lang/el.js
deleted file mode 100644
index 59c651e..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/modules/CreateLink/lang/el.js
+++ /dev/null
@@ -1,23 +0,0 @@
-// I18N constants
-// LANG: "el", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Cancel": "Ακύρωση",
-    "Insert/Modify Link": "Εισαγωγή/Τροποποίηση σύνδεσμου",
-    "New window (_blank)": "Νέο παράθυρο (_blank)",
-    "None (use implicit)": "Κανένα (χρήση απόλυτου)",
-    "OK": "Εντάξει",
-    "Other": "Αλλο",
-    "Same frame (_self)": "Ίδιο frame (_self)",
-    "Target:": "Target:",
-    "Title (tooltip):": "Τίτλος (tooltip):",
-    "Top frame (_top)": "Πάνω frame (_top)",
-    "URL:": "URL:"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/modules/CreateLink/lang/es.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/modules/CreateLink/lang/es.js
deleted file mode 100644
index 1c4f182..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/modules/CreateLink/lang/es.js
+++ /dev/null
@@ -1,23 +0,0 @@
-// I18N constants
-// LANG: "es", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Cancel": "Cancelar",
-    "Insert/Modify Link": "Insertar/Modificar un enlace",
-    "New window (_blank)": "Nueva ventana (_blank)",
-    "None (use implicit)": "Vacío ( usar implícito )",
-    "OK": "Aceptar",
-    "Other": "Otro",
-    "Same frame (_self)": "Mismo marco (_self)",
-    "Target:": "Destino:",
-    "Title (tooltip):": "Título (Tooltip):",
-    "Top frame (_top)": "Marco superior (_top)",
-    "URL:": "URL:"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/modules/CreateLink/lang/eu.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/modules/CreateLink/lang/eu.js
deleted file mode 100644
index 9f4870d..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/modules/CreateLink/lang/eu.js
+++ /dev/null
@@ -1,23 +0,0 @@
-// I18N constants
-// LANG: "eu", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Cancel": "Utzi",
-    "Insert/Modify Link": "Lotura txertatu/aldatu",
-    "New window (_blank)": "Lehio berrian (_blank)",
-    "None (use implicit)": "Bat ere ez (implizituki erabili)",
-    "OK": "Ados",
-    "Other": "Beste bat",
-    "Same frame (_self)": "Frame berean (_self)",
-    "Target:": "Helburua:",
-    "Title (tooltip):": "Izenburua (argibidea):",
-    "Top frame (_top)": "Goiko frame-an (_top)",
-    "URL:": "URL-a:"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/modules/CreateLink/lang/fa.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/modules/CreateLink/lang/fa.js
deleted file mode 100644
index 51f8121..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/modules/CreateLink/lang/fa.js
+++ /dev/null
@@ -1,24 +0,0 @@
-// I18N constants
-// LANG: "fa", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Cancel": "انصراف",
-    "Insert/Modify Link": "افزودن / ویرایش لینک",
-    "New window (_blank)": "پنجره جدید (_blank)",
-    "None (use implicit)": "هیچکدام (استفاده از بدون شرط)",
-    "OK": "بله",
-    "Other": "سایر",
-    "Same frame (_self)": "فریم یکسان (_self)",
-    "Target:": "هدف",
-    "Title (tooltip):": "عنوان (راهنمای یک خطی)",
-    "Top frame (_top)": "فریم بالایی (_top)",
-    "URL:": "URL:",
-    "You need to select some text before creating a link": "باید قبل از ساخت لینک ، متنی را انتخاب نمایید"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/modules/CreateLink/lang/fi.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/modules/CreateLink/lang/fi.js
deleted file mode 100644
index 82552b9..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/modules/CreateLink/lang/fi.js
+++ /dev/null
@@ -1,14 +0,0 @@
-// I18N constants
-// LANG: "fi", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Cancel": "Peruuta",
-    "OK": "Hyväksy"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/modules/CreateLink/lang/fr.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/modules/CreateLink/lang/fr.js
deleted file mode 100644
index e98326c..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/modules/CreateLink/lang/fr.js
+++ /dev/null
@@ -1,25 +0,0 @@
-// I18N constants
-// LANG: "fr", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Are you sure you wish to remove this link?": "Confirmez-vous la suppression de ce lien ?",
-    "Cancel": "Annuler",
-    "Insert/Modify Link": "Insérer / Modifier un lien",
-    "New window (_blank)": "Nouvelle fenêtre (_blank)",
-    "None (use implicit)": "Aucune (implicite)",
-    "OK": "OK",
-    "Other": "Autre",
-    "Same frame (_self)": "Même frame (_self)",
-    "Target:": "Cible",
-    "Title (tooltip):": "Texte alternatif",
-    "Top frame (_top)": "Frame principale (_top)",
-    "URL:": "URL:",
-    "You need to select some text before creating a link": "Vous devez sélectionner du texte avant de créer un lien"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/modules/CreateLink/lang/he.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/modules/CreateLink/lang/he.js
deleted file mode 100644
index cd04b9f..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/modules/CreateLink/lang/he.js
+++ /dev/null
@@ -1,23 +0,0 @@
-// I18N constants
-// LANG: "he", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Cancel": "ביטול",
-    "Insert/Modify Link": "הוסף/שנה קישור",
-    "New window (_blank)": "חלון חדש (_blank)",
-    "None (use implicit)": "ללא (השתמש ב-frame הקיים)",
-    "OK": "אישור",
-    "Other": "אחר",
-    "Same frame (_self)": "אותו frame (_self)",
-    "Target:": "יעד:",
-    "Title (tooltip):": "כותרת (tooltip):",
-    "Top frame (_top)": "Frame עליון (_top)",
-    "URL:": "URL:"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/modules/CreateLink/lang/hu.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/modules/CreateLink/lang/hu.js
deleted file mode 100644
index 8ff1ea0..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/modules/CreateLink/lang/hu.js
+++ /dev/null
@@ -1,23 +0,0 @@
-// I18N constants
-// LANG: "hu", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "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)",
-    "OK": "Rendben",
-    "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:"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/modules/CreateLink/lang/it.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/modules/CreateLink/lang/it.js
deleted file mode 100644
index a8551a2..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/modules/CreateLink/lang/it.js
+++ /dev/null
@@ -1,23 +0,0 @@
-// I18N constants
-// LANG: "it", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Cancel": "Annullamento",
-    "Insert/Modify Link": "Inserisci/modifica link",
-    "New window (_blank)": "Nuova finestra (_blank)",
-    "None (use implicit)": "Niente (usa implicito)",
-    "OK": "OK",
-    "Other": "Altro",
-    "Same frame (_self)": "Stessa frame (_self)",
-    "Target:": "Target:",
-    "Title (tooltip):": "Title (suggerimento):",
-    "Top frame (_top)": "Pagina intera (_top)",
-    "URL:": "URL:"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/modules/CreateLink/lang/ja.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/modules/CreateLink/lang/ja.js
deleted file mode 100644
index cf9ec3b..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/modules/CreateLink/lang/ja.js
+++ /dev/null
@@ -1,25 +0,0 @@
-// I18N constants
-// LANG: "ja", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Are you sure you wish to remove this link?": "本当にこのリンクを削除しますか?",
-    "Cancel": "中止",
-    "Insert/Modify Link": "リンクの挿入/修正",
-    "New window (_blank)": "新しいウィンドウ (_blank)",
-    "None (use implicit)": "なし (デフォルトに任せる)",
-    "OK": "OK",
-    "Other": "その他",
-    "Same frame (_self)": "自己フレーム内 (_self)",
-    "Target:": "ターゲット:",
-    "Title (tooltip):": "タイトル:",
-    "Top frame (_top)": "最上位フレーム (_top)",
-    "URL:": "URL:",
-    "You need to select some text before creating a link": "リンクを作成するにはテキストを選択する必要があります"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/modules/CreateLink/lang/lc_base.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/modules/CreateLink/lang/lc_base.js
deleted file mode 100644
index f6437a2..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/modules/CreateLink/lang/lc_base.js
+++ /dev/null
@@ -1,37 +0,0 @@
-// I18N constants
-//
-// LANG: "en", ENCODING: UTF-8
-// Author: Translator-Name, <email@example.com>
-//
-// Last revision: 2018-04-12
-// 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).
-//
-// (Please, remove information below)
-// 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.)
-
-{
-    "Are you sure you wish to remove this link?": "",
-    "Cancel": "",
-    "Insert/Modify Link": "",
-    "New window (_blank)": "",
-    "None (use implicit)": "",
-    "OK": "",
-    "Other": "",
-    "Same frame (_self)": "",
-    "Target:": "",
-    "Title (tooltip):": "",
-    "Top frame (_top)": "",
-    "URL:": "",
-    "You need to select some text before creating a link": ""
-}
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/modules/CreateLink/lang/lt.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/modules/CreateLink/lang/lt.js
deleted file mode 100644
index c7f4340..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/modules/CreateLink/lang/lt.js
+++ /dev/null
@@ -1,23 +0,0 @@
-// I18N constants
-// LANG: "lt", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Cancel": "Atšaukti",
-    "Insert/Modify Link": "Idėti/Modifikuoti",
-    "New window (_blank)": "Naujas langas (_blank)",
-    "None (use implicit)": "None (use implicit)",
-    "OK": "OK",
-    "Other": "Kitas",
-    "Same frame (_self)": "Same frame (_self)",
-    "Target:": "Target:",
-    "Title (tooltip):": "Pavadinimas (tooltip):",
-    "Top frame (_top)": "Top frame (_top)",
-    "URL:": "URL:"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/modules/CreateLink/lang/lv.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/modules/CreateLink/lang/lv.js
deleted file mode 100644
index f83d5d3..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/modules/CreateLink/lang/lv.js
+++ /dev/null
@@ -1,14 +0,0 @@
-// I18N constants
-// LANG: "lv", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Cancel": "Atcelt",
-    "OK": "Labi"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/modules/CreateLink/lang/nb.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/modules/CreateLink/lang/nb.js
deleted file mode 100644
index c137be9..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/modules/CreateLink/lang/nb.js
+++ /dev/null
@@ -1,24 +0,0 @@
-// I18N constants
-// LANG: "nb", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Are you sure you wish to remove this link?": "Er du sikker på at du vil fjerne lenken?",
-    "Cancel": "Avbryt",
-    "Insert/Modify Link": "Rediger lenke",
-    "New window (_blank)": "Eget vindu (_blank)",
-    "None (use implicit)": "Ingen (bruk standardinnstilling)",
-    "OK": "OK",
-    "Other": "Annen",
-    "Same frame (_self)": "Samme ramme (_self)",
-    "Target:": "Mål:",
-    "Title (tooltip):": "Tittel (tooltip):",
-    "Top frame (_top)": "Toppramme (_top)",
-    "URL:": "Adresse:"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/modules/CreateLink/lang/nl.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/modules/CreateLink/lang/nl.js
deleted file mode 100644
index 0d84c60..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/modules/CreateLink/lang/nl.js
+++ /dev/null
@@ -1,24 +0,0 @@
-// I18N constants
-// LANG: "nl", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Are you sure you wish to remove this link?": "Wilt u deze link werkelijk verwijderen?",
-    "Cancel": "Annuleren",
-    "Insert/Modify Link": "Hyperlink invoegen/aanpassen",
-    "New window (_blank)": "Nieuw venster (_blank)",
-    "None (use implicit)": "Geen",
-    "OK": "OK",
-    "Other": "Ander",
-    "Same frame (_self)": "Zelfde frame (_self)",
-    "Target:": "Doel:",
-    "Title (tooltip):": "Titel (tooltip):",
-    "Top frame (_top)": "Bovenste frame (_top)",
-    "URL:": "URL:"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/modules/CreateLink/lang/pl.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/modules/CreateLink/lang/pl.js
deleted file mode 100644
index d3920c3..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/modules/CreateLink/lang/pl.js
+++ /dev/null
@@ -1,24 +0,0 @@
-// I18N constants
-// LANG: "pl", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Are you sure you wish to remove this link?": "Na pewno chcesz usunąć odnośnik?",
-    "Cancel": "Anuluj",
-    "Insert/Modify Link": "Wstaw/edytuj odnośnik",
-    "New window (_blank)": "Nowe okno (_blank)",
-    "None (use implicit)": "Brak",
-    "OK": "OK",
-    "Other": "Inne",
-    "Same frame (_self)": "Ta sama ramka (_self)",
-    "Target:": "Okno docelowe:",
-    "Title (tooltip):": "Tytuł (tooltip):",
-    "Top frame (_top)": "Główna ramka (_top)",
-    "URL:": "URL:"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/modules/CreateLink/lang/pt_br.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/modules/CreateLink/lang/pt_br.js
deleted file mode 100644
index 9bba716..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/modules/CreateLink/lang/pt_br.js
+++ /dev/null
@@ -1,24 +0,0 @@
-// I18N constants
-// LANG: "pt_br", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Are you sure you wish to remove this link?": "Você tem certeza que deseja remover este link?",
-    "Cancel": "Cancelar",
-    "Insert/Modify Link": "Inserir/Modificar Link",
-    "New window (_blank)": "Nova janela (_blank)",
-    "None (use implicit)": "Nenhum (uso implícito)",
-    "OK": "OK",
-    "Same frame (_self)": "Mesma frame (_self)",
-    "Target:": "Destino:",
-    "Title (tooltip):": "Título (tooltip)",
-    "Top frame (_top)": "Frame do topo (_top)",
-    "URL:": "URL:",
-    "You need to select some text before creating a link": "Você precisa selecionar um texto antes de criar um link"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/modules/CreateLink/lang/ro.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/modules/CreateLink/lang/ro.js
deleted file mode 100644
index a43be4a..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/modules/CreateLink/lang/ro.js
+++ /dev/null
@@ -1,23 +0,0 @@
-// I18N constants
-// LANG: "ro", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Cancel": "Renunţă",
-    "Insert/Modify Link": "Inserează/modifcă link",
-    "New window (_blank)": "Fereastră nouă (_blank)",
-    "None (use implicit)": "Nimic (foloseşte ce-i implicit)",
-    "OK": "Acceptă",
-    "Other": "Alt target",
-    "Same frame (_self)": "Aceeaşi fereastră (_self)",
-    "Target:": "Ţinta:",
-    "Title (tooltip):": "Titlul (tooltip):",
-    "Top frame (_top)": "Fereastra principală (_top)",
-    "URL:": "URL:"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/modules/CreateLink/lang/ru.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/modules/CreateLink/lang/ru.js
deleted file mode 100644
index 42fc31b..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/modules/CreateLink/lang/ru.js
+++ /dev/null
@@ -1,24 +0,0 @@
-// I18N constants
-// LANG: "ru", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Cancel": "Отмена",
-    "Insert/Modify Link": "Вставка/изменение ссылки",
-    "New window (_blank)": "Новое окно (_blank)",
-    "None (use implicit)": "По умолчанию",
-    "OK": "OK",
-    "Other": "Другое",
-    "Same frame (_self)": "То же окно (_self)",
-    "Target:": "Открывать в окне:",
-    "Title (tooltip):": "Всплывающая подсказка",
-    "Top frame (_top)": "Родительское окно (_top)",
-    "URL:": "URL:",
-    "You need to select some text before creating a link": "Вы должны выделить текст, который будет преобразован в ссылку"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/modules/CreateLink/lang/sh.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/modules/CreateLink/lang/sh.js
deleted file mode 100644
index ed05070..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/modules/CreateLink/lang/sh.js
+++ /dev/null
@@ -1,23 +0,0 @@
-// I18N constants
-// LANG: "sh", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Cancel": "Poništi",
-    "Insert/Modify Link": "Dodaj/promeni Link",
-    "New window (_blank)": "Novom prozoru (_blank)",
-    "None (use implicit)": "koristi podrazumevano",
-    "OK": "OK",
-    "Other": "Drugo",
-    "Same frame (_self)": "Isti frejm (_self)",
-    "Target:": "Otvori u:",
-    "Title (tooltip):": "Naziv (tooltip):",
-    "Top frame (_top)": "Glavni frejm (_top)",
-    "URL:": "URL:"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/modules/CreateLink/lang/si.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/modules/CreateLink/lang/si.js
deleted file mode 100644
index 7674892..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/modules/CreateLink/lang/si.js
+++ /dev/null
@@ -1,14 +0,0 @@
-// I18N constants
-// LANG: "si", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Cancel": "Prekliči",
-    "OK": "V redu"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/modules/CreateLink/lang/sr.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/modules/CreateLink/lang/sr.js
deleted file mode 100644
index df728ed..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/modules/CreateLink/lang/sr.js
+++ /dev/null
@@ -1,23 +0,0 @@
-// I18N constants
-// LANG: "sr", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Cancel": "Поништи",
-    "Insert/Modify Link": "додај/промени линк",
-    "New window (_blank)": "Новом прозору (_blank)",
-    "None (use implicit)": "користи подразумевано",
-    "OK": "OK",
-    "Other": "Друго",
-    "Same frame (_self)": "Исти фрејм (_self)",
-    "Target:": "Отвори у:",
-    "Title (tooltip):": "Назив (tooltip):",
-    "Top frame (_top)": "Главни фрејм (_top)",
-    "URL:": "УРЛ:"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/modules/CreateLink/lang/sv.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/modules/CreateLink/lang/sv.js
deleted file mode 100644
index c25013e..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/modules/CreateLink/lang/sv.js
+++ /dev/null
@@ -1,24 +0,0 @@
-// I18N constants
-// LANG: "sv", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Cancel": "Avbryt",
-    "Insert/Modify Link": "Redigera länk",
-    "New window (_blank)": "Nytt fönster (_blank)",
-    "None (use implicit)": "Ingen (använd standardinställing)",
-    "OK": "OK",
-    "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 need to select some text before creating a link": "Du måsta markera ett objekt att applicera länken på!"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/modules/CreateLink/lang/th.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/modules/CreateLink/lang/th.js
deleted file mode 100644
index 9da9c8d..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/modules/CreateLink/lang/th.js
+++ /dev/null
@@ -1,14 +0,0 @@
-// I18N constants
-// LANG: "th", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Cancel": "ยกเลิก",
-    "OK": "ตกลง"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/modules/CreateLink/lang/tr.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/modules/CreateLink/lang/tr.js
deleted file mode 100644
index 921f4ba..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/modules/CreateLink/lang/tr.js
+++ /dev/null
@@ -1,23 +0,0 @@
-// I18N constants
-// LANG: "tr", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Cancel": "İptal",
-    "Insert/Modify Link": "Bağlantı ekle/değiştir",
-    "New window (_blank)": "Yeni pencere (_blank)",
-    "None (use implicit)": "Hiçbiri (Örtük)",
-    "OK": "Tamam",
-    "Other": "Başka",
-    "Same frame (_self)": "Aynı çerçeve (_self)",
-    "Target:": "Hedef:",
-    "Title (tooltip):": "Başlık (Araç ipucu):",
-    "Top frame (_top)": "En üst çerçeve (_top)",
-    "URL:": "URL:"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/modules/CreateLink/lang/vn.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/modules/CreateLink/lang/vn.js
deleted file mode 100644
index 72f82b0..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/modules/CreateLink/lang/vn.js
+++ /dev/null
@@ -1,23 +0,0 @@
-// I18N constants
-// LANG: "vn", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "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:"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/modules/CreateLink/link.html b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/modules/CreateLink/link.html
deleted file mode 100644
index b78ede4..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.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, 'CreateLink'));
-}
-
-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('CreateLink');
-  __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-1.5.1/modules/CreateLink/link.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/modules/CreateLink/link.js
deleted file mode 100644
index ef0b2f5..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/modules/CreateLink/link.js
+++ /dev/null
@@ -1,108 +0,0 @@
-  /*--------------------------------------:noTabs=true:tabSize=2:indentSize=2:--
-    --  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.
-    --
-    --  This is the standard implementation of the Xinha.prototype._createLink method,
-    --  which provides the functionality to insert a hyperlink in the editor.
-    --
-    --  The file is loaded as a special plugin by the Xinha Core when no alternative method (plugin) is loaded.
-    --
-    --
-    --  $HeadURL: http://svn.xinha.org/trunk/modules/CreateLink/link.js $
-    --  $LastChangedDate: 2018-02-19 20:35:49 +1300 (Mon, 19 Feb 2018) $
-    --  $LastChangedRevision: 1402 $
-    --  $LastChangedBy: gogo $
-    --------------------------------------------------------------------------*/
-
-function CreateLink(editor) {
-	this.editor = editor;
-	var cfg = editor.config;
-	var self = this;
-
-	if(typeof editor._createLink == 'undefined') {
-	    editor._createLink = function(target) {
-		if(!target) target = self._getSelectedAnchor();
-		self.show(target);
-	    }
-	}
-}
-
-CreateLink._pluginInfo = {
-  name          : "CreateLink",
-  origin        : "Xinha Core",
-  version       : "$LastChangedRevision: 1402 $".replace(/^[^:]*:\s*(.*)\s*\$$/, '$1'),
-  developer     : "The Xinha Core Developer Team",
-  developer_url : "$HeadURL: http://svn.xinha.org/trunk/modules/CreateLink/link.js $".replace(/^[^:]*:\s*(.*)\s*\$$/, '$1'),
-  sponsor       : "",
-  sponsor_url   : "",
-  license       : "htmlArea"
-};
-
-CreateLink.prototype._lc = function(string) {
-	return Xinha._lc(string, 'CreateLink');
-};
-
-
-CreateLink.prototype.onGenerateOnce = function()
-{
-  CreateLink.loadAssets();
-};
-
-CreateLink.loadAssets = function()
-{
-	var self = CreateLink;
-	if (self.loading) return;
-	self.loading = true;
-	Xinha._getback(_editor_url + 'modules/CreateLink/dialog.html', function(getback) { self.html = getback; self.dialogReady = true; });
-	Xinha._getback(_editor_url + 'modules/CreateLink/pluginMethods.js', function(getback) { eval(getback); self.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 self = this;
-	var editor = this.editor;
-
-	var dialog = this.dialog = new Xinha.Dialog(editor, CreateLink.html, 'Xinha',{width:400})
-	// Connect the OK and Cancel buttons
-	dialog.getElementById('ok').onclick = function() {self.apply();}
-
-	dialog.getElementById('cancel').onclick = function() { self.dialog.hide()};
-
-	if (!editor.config.makeLinkShowsTarget)
-	{
-		dialog.getElementById("f_target_label").style.visibility = "hidden";
-		dialog.getElementById("f_target").style.visibility = "hidden";
-		dialog.getElementById("f_other_target").style.visibility = "hidden";
-	}
-
-	dialog.getElementById('f_target').onchange= function() 
-	{
-		var f = dialog.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-1.5.1/modules/CreateLink/pluginMethods.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/modules/CreateLink/pluginMethods.js
deleted file mode 100644
index cc2f853..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/modules/CreateLink/pluginMethods.js
+++ /dev/null
@@ -1,165 +0,0 @@
-
-CreateLink.prototype.show = function(a)
-{
-  if (!this.dialog)
-  {
-    this.prepareDialog();
-  } 
-	var editor = 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 inputs =
-	{
-		f_href   : '',
-		f_title  : '',
-		f_target : '',
-		f_other_target : ''
-	};
-
-	if(a && a.tagName.toLowerCase() == 'a')
-	{
-		inputs.f_href   = this.editor.fixRelativeLinks(a.getAttribute('href'));
-		inputs.f_title  = a.title;
-		if (a.target)
-		{
-			if (!/_self|_top|_blank/.test(a.target))
-			{
-				inputs.f_target = '_other';
-				inputs.f_other_target = a.target;
-			}
-			else
-			{
-				inputs.f_target = a.target;
-				inputs.f_other_target = '';
-			}
-		}
-	}
-
-	// now calling the show method of the Xinha.Dialog object to set the values and show the actual dialog
-	this.dialog.show(inputs);
-};
-
-// and finally ... take some action
-CreateLink.prototype.apply = function()
-{
-
-	var values = this.dialog.hide();
-	var a = this.a;
-	var editor = this.editor;
-
-	var atr =
-	{
-		href: '',
-		target:'',
-		title:''
-	};
-
-	if(values.f_href)
-	{
-		atr.href = values.f_href;
-		atr.title = values.f_title;
-		if (values.f_target.value)
-		{
-			if (values.f_target.value == 'other') atr.target = values.f_other_target;
-			else atr.target = values.f_target.value;
-		}
-	}
-	if (values.f_target.value)
-	{
-		if (values.f_target.value != '_other')
-		{
-			atr.target = values.f_target.value;
-		}
-		else
-		{
-			atr.target = values.f_other_target;
-		}
-	}
-	
-	if(a && a.tagName.toLowerCase() == 'a')
-	{
-		if(!atr.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);
-				editor.updateToolbar();
-				return;
-			}
-		}
-		else
-		{
-			// Update the link
-			for(var i in atr)
-			{
-				a.setAttribute(i, atr[i]);
-			}
-
-			// If we change a mailto link in IE for some hitherto unknown
-			// reason it sets the innerHTML of the link to be the
-			// href of the link.  Stupid IE.
-			if(Xinha.is_ie)
-			{
-				if(/mailto:([^?<>]*)(\?[^<]*)?$/i.test(a.innerHTML))
-				{
-					a.innerHTML = RegExp.$1;
-				}
-			}
-		}
-	}
-	else
-	{
-		if(!atr.href) return true;
-
-		// Insert a link, we let the browser do this, we figure it knows best
-		var tmp = Xinha.uniq('http://www.example.com/Link');
-		editor._doc.execCommand('createlink', false, tmp);
-
-		// Fix them up
-		var anchors = editor._doc.getElementsByTagName('a');
-		for(var i = 0; i < anchors.length; i++)
-		{
-			var anchor = anchors[i];
-			if(anchor.href == tmp)
-			{
-				// Found one.
-				if (!a) a = anchor;
-				for(var j in atr)
-				{
-					anchor.setAttribute(j, atr[j]);
-				}
-			}
-		}
-	}
-	editor.selectNodeContents(a);
-	editor.updateToolbar();
-};
-CreateLink.prototype._getSelectedAnchor = function()
-{
-  var sel  = this.editor.getSelection();
-  var rng  = this.editor.createRange(sel);
-  var a    = this.editor.activeElement(sel);
-  if(a != null && a.tagName.toLowerCase() == 'a')
-  {
-    return a;
-  }
-  else
-  {
-    a = this.editor._getFirstAncestor(sel, 'a');
-    if(a != null)
-    {
-      return a;
-    }
-  }
-  return null;
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/modules/Dialogs/DetachedDialog.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/modules/Dialogs/DetachedDialog.js
deleted file mode 100644
index 24209a3..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/modules/Dialogs/DetachedDialog.js
+++ /dev/null
@@ -1,74 +0,0 @@
-
-  /*--------------------------------------:noTabs=true:tabSize=2:indentSize=2:--
-    --  Xinha (is not htmlArea) - http://xinha.gogo.co.nz/
-    --
-    --  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.
-    --
-    --  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.
-    --
-    --  $HeadURL: http://svn.xinha.webfactional.com/trunk/modules/Dialogs/inline-dialog.js $
-    --  $LastChangedDate: 2007-01-24 03:26:04 +1300 (Wed, 24 Jan 2007) $
-    --  $LastChangedRevision: 694 $
-    --  $LastChangedBy: gogo $
-    --------------------------------------------------------------------------*/
- 
-/** The DivDialog is used as a semi-independant means of using a Plugin outside of 
- *  Xinha, it does not depend on having a Xinha editor available - not that of of course
- *  Plugins themselves may (and very likely do) require an editor.
- *
- *  @param Div into which the dialog will draw itself.
- *
- *  @param HTML for the dialog, with the special subtitutions...
- *    id="[someidhere]" will assign a unique id to the element in question
- *        and this can be retrieved with yourDialog.getElementById('someidhere')   
- *    _(Some Text Here) will localize the text, this is used for within attributes
- *    <l10n>Some Text Here</l10n> will localize the text, this is used outside attributes
- *
- *  @param A function which can take a native (english) string and return a localized version,
- *   OR;   A "context" to be used with the standard Xinha._lc() method,
- *   OR;   Null - no localization will happen, only native strings will be used.
- *
- */
-
-Xinha.DetachedDialog = function( html, localizer, size, options)
-{
-  var fakeeditor =
-  {
-    '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, // maybe not ?
-    'activateEditor': function() { },
-    'restoreSelection': function() { },
-    'updateToolbar': function() { },
-    'focusEditor': function() { }    
-  };
-  
-  Xinha.Dialog.initialZ = 100;
-  this.attached = false;
-  
-  Xinha.DetachedDialog.parentConstructor.call(this, fakeeditor, html, localizer, size, options);
-}
-
-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-1.5.1/modules/Dialogs/XinhaDialog.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/modules/Dialogs/XinhaDialog.js
deleted file mode 100644
index 081ba6e..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/modules/Dialogs/XinhaDialog.js
+++ /dev/null
@@ -1,1591 +0,0 @@
-  /*--------------------------------------:noTabs=true:tabSize=2:indentSize=2:--
-    --  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.
-    --
-    --  This is the new all-in-one implementation of dialogs for Xinha
-    --
-    --
-    --  $HeadURL: http://svn.xinha.org/trunk/modules/Dialogs/XinhaDialog.js $
-    --  $LastChangedDate: 2018-02-07 14:14:28 +1300 (Wed, 07 Feb 2018) $
-    --  $LastChangedRevision: 1379 $
-    --  $LastChangedBy: gogo $
-    --------------------------------------------------------------------------*/
-/*jslint regexp: false, rhino: false, browser: true, bitwise: false, forin: false, adsafe: false, evil: true, nomen: false, 
-glovar: false, debug: false, eqeqeq: false, passfail: false, sidebar: false, laxbreak: false, on: false, cap: true, 
-white: false, widget: false, undef: true, plusplus: false*/
-/*global  Xinha */
-
-/** Xinha Dialog
- *  
- * @constructor
- * @version $LastChangedRevision: 1379 $ $LastChangedDate: 2018-02-07 14:14:28 +1300 (Wed, 07 Feb 2018) $
- * @param {Xinha} editor Xinha object    
- * @param {String} html string The HTML for the dialog's UI
- * @param {String} localizer string the "context" parameter for Xinha._lc(), typically the name of the plugin
- * @param {Object} size object with two possible properties of the size: width & height as int, where height is optional
- * @param {Object} options dictionary with optional boolean attributes 'modal', 'closable', 'resizable', and 'centered', as well as integer attribute 'layer'
-
- */
-Xinha.Dialog = function(editor, html, localizer, size, options)
-{
-  var dialog = this;
-  
-  /** Used for dialog.getElementById()
-   * @type Object
-   * @private
-   */
-  this.id    = { };
-  /** Used for dialog.getElementById()
-   * @type Object
-   * @private
-   */
-  this.r_id  = { }; // reverse lookup id
-  /** The calling Xinha instance
-   * @type Xinha
-   * @private
-   */
-  this.editor   = editor;
-  /** 
-   * @private
-   * @type Document
-   */
-  this.document = document;
-  /** Object with width, height as numbers
-   * @type Object
-   */
-  
-  this.size = size;
-  /** 
-   * @type Boolean
-   * @private
-   */
-  this.modal = (options && options.modal === false) ? false : true;
-  /** 
-   * @type Boolean
-   * @private
-   */
-  this.closable = (options && options.closable === false) ? false : true;
-  /** 
-   * @type Boolean
-   * @private
-   */
-  this.resizable = (options && options.resizable === false) ? false : true;
-  /** 
-   * @type Number
-   * @private
-   */
-  this.layer = (options && options.layer) ? options.layer : 0;
-  /** 
-   * @type Boolean
-   * @private
-   */
-  this.centered = (options && options.centered === true) ? true : false;
-  /** 
-   * @type Boolean
-   * @private
-   */
-  this.closeOnEscape = (options && options.closeOnEscape === true) ? true : false;
-  
-  /** The div that is the actual dialog
-   *  @type DomNode
-   */
-  this.rootElem = null;
-  
-  /** The caption at the top of the dialog that is used to dragged the dialog. It is automatically created from the first h1 in the dialog's HTML
-   *  @type DomNode
-   */
-  this.captionBar = null;
-  /** This div contains the content
-   *  @type DomNode
-   */
-  this.main = null;
-  
-  /** Each dialog has a background
-   *  @type DomNode
-   *  @private
-   */
-  this.background = null;
-  /** 
-   * @type Boolean
-   * @private
-   */
-  this.centered = null;
-  /** 
-   * @type Boolean
-   * @private
-   */
-  this.greyout = null;
-  
-  /** 
-   * @type DomNode
-   * @private
-   */
-  this.buttons = null;
-  /** 
-   * @type DomNode
-   * @private
-   */
-  this.closer = null;
-  /** 
-   * @type DomNode
-   * @private
-   */
-  this.icon = null;
-  /** 
-   * @type DomNode
-   * @private
-   */
-  this.resizer = null;
-  /** 
-   * @type Number
-   * @private
-   */
-  this.initialZ = null;
-  
-  /* Check global config to see if we should override any of the above options
-    If a global option is set, it will apply to all dialogs, regardless of their
-    individual settings (i.e., it will override them). If the global option is
-    undefined, the options passed in above will be used.
-  */
-  var globalOptions = editor.config.dialogOptions;
-  if (globalOptions) 
-  {
-    if (typeof globalOptions.centered != 'undefined') 
-    {
-      this.centered = globalOptions.centered;
-    }
-    if (typeof globalOptions.resizable != 'undefined') 
-    {
-      this.resizable = globalOptions.resizable;
-    }
-    if (typeof globalOptions.closable != 'undefined') 
-    {
-      this.closable = globalOptions.closable;
-    }
-    if (typeof globalOptions.greyout != 'undefined') 
-    {
-      this.greyout = globalOptions.greyout;
-    }
-    if (typeof globalOptions.closeOnEscape != 'undefined') 
-    {
-      this.closeOnEscape = globalOptions.closeOnEscape;
-    }
-  }
-  var backG;
-  if (Xinha.is_ie)
-  { // IE6 needs the iframe to hide select boxes
-    backG = document.createElement("iframe");
-    backG.src = "about:blank";
-    backG.onreadystatechange = function () 
-    {
-      var doc = window.event.srcElement.contentWindow.document;
-      if (this.readyState == 'complete' && doc && doc.body)
-      {
-        var div = doc.createElement('div');
-        //insert styles to make background color skinable
-        var styles, stylesheets = document.styleSheets;
-        
-        for (var i=0;i<stylesheets.length;i++)
-        {
-          if (stylesheets[i].id.indexOf('Xinha') != -1 && stylesheets[i].cssText)
-          {
-            styles += stylesheets[i].cssText;
-          }
-        }
-        div.innerHTML = '<br><style type="text/css">\n'+styles+'\n</style>'; // strange way, but didn't work otherwise
-        doc.getElementsByTagName('body')[0].appendChild(div);
-        doc.body.className = 'xinha_dialog_background';
-        if (dialog.modal) 
-        {
-          doc.body.className += '_modal';
-        }
-        if (dialog.greyout) 
-        {
-          doc.body.className += '_greyout';
-        }
-      }
-    };
-  }
-  else
-  { // Mozilla (<FF3) can't have the iframe, because it hides the caret in text fields
-    // see https://bugzilla.mozilla.org/show_bug.cgi?id=226933
-    backG = document.createElement("div");
-  }
-  backG.className = "xinha_dialog_background";
-  if (this.modal) 
-  {
-    backG.className += '_modal';
-  }
-  if (this.greyout) 
-  {
-    backG.className += '_greyout';
-  }
-  var z = 1000;
-  if (!Xinha.Dialog.initialZ)
-  {
-    var p = editor._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 = backG.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(backG);
-
-  this.background = backG;
-
-  backG = null;
-  Xinha.freeLater(this, "background");
-
-  var rootElem = document.createElement('div');
-  //I've got the feeling dragging is much slower in IE7 w/ pos:fixed, besides the strange fact that it only works in Strict mode 
-  //rootElem.style.position = (Xinha.ie_version < 7 ||(Xinha.is_ie && document.compatMode == "BackCompat") || !this.modal) ? "absolute" : "fixed";
-  rootElem.style.position = (Xinha.is_ie || !this.modal) ? "absolute" : "fixed";
-  rootElem.style.zIndex = (this.modal ? z + 27 : z + 3 ) + this.layer;
-  rootElem.style.display  = 'none';
-  
-  if (!this.modal)
-  {
-    Xinha._addEvent(rootElem,'mousedown', function () { Xinha.Dialog.activateModeless(dialog);});
-  }
-  
-  // FIXME: This is nice, but I don't manage to get it switched off on text inputs :(
-  // rootElem.style.MozUserSelect = "none";
-  
-  rootElem.className = 'dialog' + (this.modal ? '' : ' modeless');
-  if (Xinha.is_chrome) rootElem.className += ' chrome'; // Hack because border-radius & box-shadow don't go well together in chrome
-  
- // this.background[1].appendChild(rootElem);
-  document.body.appendChild(rootElem);
-
-  rootElem.style.paddingBottom = "10px";
-  rootElem.style.width = ( size && size.width )  ? size.width + 'px' : '';
-
-  if (size && size.height)
-  {
-    if (Xinha.ie_version < 7)
-    {
-      rootElem.style.height = size.height + 'px';
-    }
-    else
-    {
-      rootElem.style.minHeight =  size.height + 'px';
-    }
-  }
-
-  html = this.translateHtml(html,localizer);
-
-  var main = document.createElement('div');
-  rootElem.appendChild(main);
-  main.innerHTML = html;
-
-  // If the localizer is a string containing a plugin name, it can be used to
-  // lookup the plugin.
-  this.fixupDOM(main, localizer);
-  
-  //make the first h1 to drag&drop the rootElem
-  var captionBar = main.removeChild( main.getElementsByTagName("h1")[0]);
-  rootElem.insertBefore(captionBar,main);
-  Xinha._addEvent(captionBar, 'mousedown',function(ev) { dialog.dragStart(ev); });
-  
-  captionBar.style.MozUserSelect = "none";
-  captionBar.style.WebkitUserSelect = "none"; //seems to have no effect
-  captionBar.unselectable = "on";
-  captionBar.onselectstart = function() {return false;};
-
-  this.buttons = document.createElement('div');
-  s = this.buttons.style;
-  s.position = "absolute";
-  s.top = "0";
-  s.right = "2px";
-
-  rootElem.appendChild(this.buttons);
-
-  if (this.closable && this.closeOnEscape)
-  {
-    Xinha._addEvent(document, 'keypress', function(ev) {
-      if (ev.keyCode == 27) // ESC key
-      {
-        if (Xinha.Dialog.activeModeless == dialog || dialog.modal)
-        {
-          dialog.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"; dialog.hide(); return false;};
-  
-    this.buttons.appendChild(this.closer);
-  
-    var butX = document.createElement('span');
-    butX.className = 'innerX';
-    butX.style.position = 'relative';
-    butX.style.top = '-3px';
-  
-    butX.appendChild(document.createTextNode('\u00D7')); // cross
-    //below different symbols for future use
-    //butX.appendChild(document.createTextNode('\u25AC')); //bar
-    //butX.appendChild(document.createTextNode('\u25BA')); //triangle right
-    //butX.appendChild(document.createTextNode('\u25B2')); //triangle up
-    //butX.appendChild(document.createTextNode('\u25BC')); //triangle down
-    this.closer.appendChild(butX);
-    butX = null;
-  }
-  
-  this.icon = document.createElement('img');
-  var icon = this.icon;
-  icon.className = 'icon';
-  icon.src = editor.config.iconList.dialogCaption;
-  icon.style.position = 'absolute';
-  icon.style.top = '3px';
-  icon.style.left = '2px';
-  icon.ondrag = function () {return false;};
-
-  //captionBar.style.paddingLeft = '22px';
-  rootElem.appendChild(this.icon);
-  
-  var all = rootElem.getElementsByTagName("*");
-
-  for (var i=0; i<all.length;i++)
-  {
-    var el = all[i]; 
-    if (el.tagName.toLowerCase() == 'textarea' || el.tagName.toLowerCase() == 'input')
-    {
-      // FIXME: this doesn't work
-      //el.style.MozUserSelect = "text";
-    }
-    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) { dialog.resizeStart(ev); });
-    rootElem.appendChild(this.resizer);
-  }
-
-  this.rootElem = rootElem;
-  this.captionBar = captionBar;
-  this.main = main;
-  
-  captionBar = null;
-  rootElem = null;
-  main = 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");
-  
-  // for caching size & position after dragging & resizing
-  this.size = {};
-
-};
-/** This function is called when the dialog is resized. 
- *  By default it does nothing, but you can override it in your Xinha.Dialog object e.g. to resize elements within you Dialog.
- *  Example:<br />
- *  <code>
- *  var dialog = this.dialog; //The plugin's dialog instance;
- *  dialog.onresize = function() 
- *  {
- *    var el = dialog.getElementById('foo');
- *    el.style.width = dialog.width;
- *  }
- *  </code>
- */
-Xinha.Dialog.prototype.onresize = function()
-{
-  return true;
-};
-/** This function shows the dialog and populates form elements with values.
- * Example:<br />
- * Given your dialog contains an input element like <code>&lt;input name="[myInput]" type="text" /&gt;</code>
- * <code>
- *  var dialog = this.dialog; //The plugin's dialog instance;
- *  var values = {myInput : 'My input value'}
- *  dialog.show(values);
- *  </code>
- *  @see #setValues
- *  @param {Object} values Object indexed by names of input elements
- */
-Xinha.Dialog.prototype.show = function(values)
-{
-  var rootElem = this.rootElem;
-  var rootElemStyle = rootElem.style;
-  var modal = this.modal;
-  var scrollPos = this.editor.scrollPos();
-  this.scrollPos = scrollPos;
-  var dialog = this;
-  //dialog.main.style.height = '';
-  if ( this.attached ) 
-  {
-    this.editor.showPanel(rootElem);
-  }
-    
-  // We need to preserve the selection
-  // if this is called before some editor has been activated, it activates the editor
-  if (Xinha._someEditorHasBeenActivated)
-  {
-    this._lastRange = this.editor.saveSelection();
-     
-    if (Xinha.is_ie && !modal)
-    {
-      dialog.saveSelection = function() { dialog._lastRange = dialog.editor.saveSelection();};
-      Xinha._addEvent(this.editor._doc,'mouseup', dialog.saveSelection);
-    }
-  }
- 
-  if ( modal )
-  {
-    this.editor.deactivateEditor();
-    this.editor.suspendUpdateToolbar = true;
-    this.editor.currentModal = dialog;
-  }
-
-  // unfortunately we have to hide the editor (iframe/caret bug)
-  if (Xinha.is_ff2 && modal)
-  {
-    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 (modal) 
-    {
-      this.showBackground();
-      this.posBackground({
-        top: 0,
-        left: 0
-      });
-      this.resizeBackground(Xinha.Dialog.calcFullBgSize());
-    }
-    else 
-    {
-      this.background.style.display = '';
-    }
-
-    //this.onResizeWin = function () {dialog.sizeBackground()};
-    //Xinha._addEvent(window, 'resize', this.onResizeWin );
-
-    //rootElemStyle.display   = '';
-    Xinha.Dialog.fadeIn(this.rootElem, 100,function() {
-      //this is primarily to work around a bug in IE where absolutely positioned elements have a frame that renders above all #1268
-      //but could also be seen as a feature ;)
-      if (modal)
-      {
-        var input = dialog.rootElem.getElementsByTagName('input');
-        for (var i=0;i<input.length;i++)
-        {
-          if (input[i].type == 'text')
-          {
-            try {
-              input[i].focus();
-              break;
-            }
-            catch (e) {}
-          }
-        }
-      }
-    });
-    //hide object & embed tags in document so they won't show through
-    if (this.editor.config.hideObjectsBehindDialogs)
-    {
-      this.objTags = this.editor._doc.getElementsByTagName('object');
-      this.embedTags = this.editor._doc.getElementsByTagName('embed');
-      for (var j=0; j<this.objTags.length; j++)
-      {
-        this.objTags[j].__object_hidden = this.objTags[j].style.visibility;
-        this.objTags[j].style.visibility = 'hidden';
-      }
-      for (j=0; j<this.embedTags.length; j++)
-      {
-        this.embedTags[j].__embed_hidden = this.embedTags[j].style.visibility;
-        this.embedTags[j].style.visibility = 'hidden';
-      }
-    }
-
-    var dialogHeight = rootElem.offsetHeight;
-    var dialogWidth = rootElem.offsetWidth;
-    var viewport = Xinha.viewportSize();
-    var viewportHeight = viewport.y;
-    var viewportWidth = viewport.x;
-    
-    if (dialogHeight >  viewportHeight)
-    {
-      rootElemStyle.height =  viewportHeight + "px";
-      if (rootElem.scrollHeight > dialogHeight)
-      {
-        dialog.main.style.overflowY = "auto";
-      }
-    }
-
-    if(this.size.top && this.size.left)
-    {
-      rootElemStyle.top =  parseInt(this.size.top,10) + 'px';
-      rootElemStyle.left = parseInt(this.size.left,10) + 'px';
-    }
-    else if (this.editor.btnClickEvent && !this.centered)
-    {
-      var btnClickEvent = this.editor.btnClickEvent;
-      if (rootElemStyle.position == 'absolute')
-      {
-        rootElemStyle.top =  btnClickEvent.clientY + this.scrollPos.y +'px';
-      }
-      else
-      {
-        rootElemStyle.top =  btnClickEvent.clientY +'px';
-      }
-
-      if (dialogHeight + rootElem.offsetTop >  viewportHeight)
-      {
-        rootElemStyle.top = (rootElemStyle.position == 'absolute' ? this.scrollPos.y : 0 ) + "px" ;
-      }
-
-      if (rootElemStyle.position == 'absolute')
-      {
-        rootElemStyle.left = btnClickEvent.clientX +  this.scrollPos.x +'px';
-      }
-      else
-      {
-        rootElemStyle.left =  btnClickEvent.clientX +'px';
-      }
-
-      if (dialogWidth + rootElem.offsetLeft >  viewportWidth)
-      {
-        rootElemStyle.left =  btnClickEvent.clientX - dialogWidth   + 'px';
-        if (rootElem.offsetLeft < 0)
-        {
-          rootElemStyle.left = 0;
-        }
-      }
-      this.editor.btnClickEvent = null;
-    }
-    else
-    {
-      var top =  ( viewportHeight - dialogHeight) / 2;
-      var left = ( viewportWidth - dialogWidth) / 2;
-      rootElemStyle.top =  ((top > 0) ? top : 0) +'px';
-      rootElemStyle.left = ((left > 0) ? left : 0)+'px';
-    }
-  }
-  this.width = dialogWidth;
-  this.height = dialogHeight;
-
-  if (!modal)
-  {
-    this.resizeBackground({width: dialogWidth + 'px', height: dialogHeight + 'px' });
-    this.posBackground({top:  rootElemStyle.top, left: rootElemStyle.left});
-  }
- 
-  if(typeof values != 'undefined')
-  {
-    this.setValues(values);
-  }
-  this.dialogShown = true;
-};
-/** Hides the dialog and returns an object with the valuse of form elements
- * @see #getValues
- * @type Object
- */
-Xinha.Dialog.prototype.hide = function()
-{
-  if ( this.attached )
-  {
-    this.editor.hidePanel(this.rootElem);
-  }
-  else
-  {
-    //this.rootElem.style.display = 'none';
-    Xinha.Dialog.fadeOut(this.rootElem);
-    this.hideBackground();
-    var dialog = 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]);
-    }
-
-    //restore visibility of object & embed tags in document
-    if (this.editor.config.hideObjectsBehindDialogs)
-    {
-      for (var j=0; j<this.objTags.length; j++)
-      {
-        this.objTags[j].style.visibility = this.objTags[j].__object_hidden;
-      }
-      for (j=0; j<this.embedTags.length; j++)
-      {
-        this.embedTags[j].style.visibility = this.embedTags[j].__embed_hidden;
-      }
-    }
-
-    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', dialog.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();
-};
-/** Shows/hides the dialog
- * 
- */
-Xinha.Dialog.prototype.toggle = function()
-{
-  if(this.rootElem.style.display == 'none')
-  {
-    this.show();
-  }
-  else
-  {
-    this.hide();
-  }
-};
-/** Reduces the dialog to the size of the caption bar
- * 
- */
-Xinha.Dialog.prototype.collapse = function()
-{
-  if(this.collapsed)
-  {
-    this.collapsed = false;
-    this.show();
-  }
-  else
-  {
-    this.main.style.height = 0;
-    this.collapsed = true;
-  }
-};
-/** Equivalent to document.getElementById. You can't use document.getElementById because id's are dynamic to avoid id clashes between plugins
- * @type DomNode
- * @param {String} id
- */
-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);
-};
-/** Equivalent to document.getElementByName. You can't use document.getElementByName because names are dynamic to avoid name clashes between plugins
- * @type Array
- * @param {String} name
- */
-Xinha.Dialog.prototype.getElementsByName = function(name)
-{
-  if(!this.rootElem.parentNode)
-  {     
-    this.document.body.appendChild(this.rootElem);
-  }
-    
-  var els = this.document.getElementsByName(this.id[name] ? this.id[name] : name); 
-  return Xinha.collectionToArray(els);
-};
-/** Return all elements in the dialog that have the given class
- * @type Array 
- * @param {String} className
- */
-Xinha.Dialog.prototype.getElementsByClassName = function(className)
-{
-  return Xinha.getElementsByClassName(this.rootElem,className);
-};
-
-/** Return all elements in the dialog that have the given class
- * @type Array 
- * @param {String} className
- */
-Xinha.Dialog.prototype.getElementsByTagName = function(className)
-{
-  return Xinha.getElementsByTagName(this.rootElem,className);
-};
-
-/** Creates an elementin the dialog, with the given id if provided
- *   (note that the id is transfomed into a unique id)
- */
-
-Xinha.Dialog.prototype.createElement = function(tagName, id)
-{
-  var newElement = this.document.createElement(tagName);
-  if(typeof id == 'string')
-  {
-    newElement.id = this.createId(id);
-  }
-  return newElement;
-};
-
-/** Initiates dragging
- * @private
- * @param {Object} ev Mousedown event
- */
-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 dialog = this;
-
-  dialog.dragging = true;
-
-  dialog.scrollPos = dialog.editor.scrollPos();
-   
-  var st = dialog.rootElem.style;
-
-  dialog.xOffs =  ev.offsetX || ev.layerX; //first value for IE/Opera/Safari, second value for Gecko (or should I say "netscape";))
-  dialog.yOffs =  ev.offsetY || ev.layerY;
-
-  dialog.mouseMove = function(ev) { dialog.dragIt(ev); };
-  Xinha._addEvent(document,"mousemove", dialog.mouseMove );
-  if (Xinha.is_ie) 
-  {
-    Xinha._addEvent(this.background.contentWindow.document, "mousemove", dialog.mouseMove);
-  }
-  
-  dialog.mouseUp = function (ev) { dialog.dragEnd(ev); };
-  Xinha._addEvent(document,"mouseup",  dialog.mouseUp);
-  if (Xinha.is_ie) 
-  {
-    Xinha._addEvent(this.background.contentWindow.document, "mouseup", dialog.mouseUp);
-  }
-};
-/** Sets the position while dragging
- * @private
- * @param {Object} ev Mousemove event
- */
-Xinha.Dialog.prototype.dragIt = function(ev)
-{
-  var dialog = this;
-
-  if (!dialog.dragging) 
-  {
-    return false;
-  }
-  var posY, posX, newPos;
-  if (dialog.rootElem.style.position == 'absolute')
-  {
-    posY = (ev.clientY + this.scrollPos.y) - dialog.yOffs + "px";
-    posX = (ev.clientX + this.scrollPos.x) - dialog.xOffs + "px";
-
-    newPos = {top: posY,left: posX};
-  }
-  else if (dialog.rootElem.style.position == 'fixed')
-  {
-    posY = ev.clientY  - dialog.yOffs + "px";
-    posX = ev.clientX - dialog.xOffs + "px";
-
-    newPos = {top: posY,left: posX};
-  }
-  
-  dialog.posDialog(newPos);
-};
-/** Ends dragging
- * @private
- * @param {Object} ev Mouseup event
- */
-Xinha.Dialog.prototype.dragEnd = function(ev)
-{
-  var dialog = this;
-  
-  if (!this.modal)
-  {
-     this.editor.suspendUpdateToolbar = false; 
-  }
-
-  if (!dialog.dragging) 
-  {
-    return false;
-  }
-  dialog.dragging = false;
-
-  Xinha._removeEvent(document, "mousemove", dialog.mouseMove );
-  if (Xinha.is_ie) 
-  {
-    Xinha._removeEvent(this.background.contentWindow.document, "mousemove", dialog.mouseMove);
-  }
-  Xinha._removeEvent(document, "mouseup", dialog.mouseUp);
-  if (Xinha.is_ie) 
-  {
-    Xinha._removeEvent(this.background.contentWindow.document, "mouseup", dialog.mouseUp);
-  }
-
-  var rootElemStyle = dialog.rootElem.style;
-  
-  dialog.size.top  = rootElemStyle.top;
-  dialog.size.left = rootElemStyle.left;
-  
-  if (!this.modal)
-  {
-    this.sizeBgToDialog();
-  }
-
-};
-/** Initiates resizing
- * @private
- * @param {Object} ev Mousedown event
- */
-Xinha.Dialog.prototype.resizeStart = function (ev) {
-  var dialog = this;
-  if (dialog.resizing)
-  {
-    return;
-  }
-  dialog.resizing = true;
-  if (!this.modal)
-  {
-    this.editor.suspendUpdateToolbar = true;
-    this.posBackground({top:0, left:0}); 
-    this.resizeBackground(Xinha.Dialog.calcFullBgSize());
-  }
-  dialog.scrollPos = dialog.editor.scrollPos();
-  
-  var st = dialog.rootElem.style;
-  st.minHeight = '';
-  st.overflow  =  'hidden';
-  dialog.xOffs = parseInt(st.left,10);
-  dialog.yOffs = parseInt(st.top,10);
-
-  dialog.mouseMove = function(ev) { dialog.resizeIt(ev); };
-  Xinha._addEvent(document,"mousemove", dialog.mouseMove );
-  if (Xinha.is_ie) 
-  {
-    Xinha._addEvent(this.background.contentWindow.document, "mousemove", dialog.mouseMove);
-  }
-  dialog.mouseUp = function (ev) { dialog.resizeEnd(ev); };
-  Xinha._addEvent(document,"mouseup",  dialog.mouseUp); 
-  if (Xinha.is_ie) 
-  {
-    Xinha._addEvent(this.background.contentWindow.document, "mouseup", dialog.mouseUp);
-  }
-};
-/** Sets the size while resiziong
- * @private
- * @param {Object} ev Mousemove event
- */
-Xinha.Dialog.prototype.resizeIt = function(ev)
-{
-  var dialog = this;
-
-  if (!dialog.resizing) {
-    return false;
-  }
-  var posY, posX;
-  if (dialog.rootElem.style.position == 'absolute')
-  {
-    posY = ev.clientY + dialog.scrollPos.y;
-    posX = ev.clientX + dialog.scrollPos.x;
-  }
-  else
-  {
-    posY = ev.clientY;
-    posX = ev.clientX;
-  }
-
-  posX -=  dialog.xOffs;
-  posY -=  dialog.yOffs;
-
-  var newSize = {};
-  newSize.width  = (( posX > 10) ? posX : 10) + 8 + "px";
-  newSize.height = (( posY > 10) ? posY : 10) + "px";
-
-  dialog.sizeDialog(newSize);
-  
-  
-  dialog.width = dialog.rootElem.offsetWidth;
-  dialog.height = dialog.rootElem.offsetHeight;
-
-  dialog.onresize();
-};
-/** Ends resizing
- * @private
- * @param {Object} ev Mouseup event
- */
-Xinha.Dialog.prototype.resizeEnd = function(ev)
-{
-  var dialog = this;
-  dialog.resizing = false;
-
-  if (!this.modal)
-  {
-    this.editor.suspendUpdateToolbar = false;
-  }
-
-  Xinha._removeEvent(document, "mousemove", dialog.mouseMove );
-  if (Xinha.is_ie) 
-  {
-    Xinha._removeEvent(this.background.contentWindow.document, "mouseup", dialog.mouseUp);
-  }
-  Xinha._removeEvent(document, "mouseup",  dialog.mouseUp);
-  if (Xinha.is_ie) 
-  {
-    Xinha._removeEvent(this.background.contentWindow.document, "mouseup", dialog.mouseUp);
-  }
-  
-  dialog.size.width  = dialog.rootElem.offsetWidth;
-  dialog.size.height = dialog.rootElem.offsetHeight;
-
-  if (!this.modal) 
-  {
-    this.sizeBgToDialog();
-  }  
-};
-/** Attaches a modeless dialog to a panel on the given side
- *  Triggers a notifyOf panel_change event
- *  @param {String} side one of 'left', 'right', 'top', 'bottom'
- */
-Xinha.Dialog.prototype.attachToPanel = function(side)
-{
-  var dialog = this;
-  var rootElem = this.rootElem;
-  var editor = this.editor;
-  
-  this.attached = true;
-  this.rootElem.side = side;
-  this.captionBar.ondblclick = function(ev) { dialog.detachFromPanel(Xinha.getEvent(ev)); };
-  
-  rootElem.style.position = "static";
-  rootElem.parentNode.removeChild(rootElem);
-  
-  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 ( side == 'left' || side == 'right' )
-  {
-    rootElem.style.width  = editor.config.panel_dimensions[side];
-  }
-  else
-  {
-    rootElem.style.width = '';
-  }
-  Xinha.addClasses(rootElem, 'panel');
-  editor._panels[side].panels.push(rootElem);
-  editor._panels[side].div.appendChild(rootElem);
-
-  editor.notifyOf('panel_change', {'action':'add','panel':rootElem});
-};
-/** Removes a panel dialog from its panel and makes it float
- * 
- */
-Xinha.Dialog.prototype.detachFromPanel = function()
-{
-  var dialog = this;
-  var rootElem = dialog.rootElem;
-  var rootElemStyle = rootElem.style;
-  var editor = dialog.editor;
-  
-  dialog.attached = false;
-  
-  var pos = Xinha.getElementTopLeft(rootElem);
-  rootElemStyle.position = "absolute";
-  rootElemStyle.top = pos.top + "px";
-  rootElemStyle.left = pos.left + "px";
-  
-  //dialog.captionBar.style.paddingLeft = "22px";
-  dialog.resizer.style.display = '';
-  if (dialog.closable) 
-  {
-    dialog.closer.style.display = '';
-  }
-  dialog.icon.style.display = '';
-  
-  if (dialog.size.width) 
-  {
-    rootElem.style.width = dialog.size.width + 'px';
-  }
-
-  Xinha.removeClasses(rootElem, 'panel');
-  editor.removePanel(rootElem);
-  document.body.appendChild(rootElem);
-  
-  dialog.captionBar.ondblclick = function() { dialog.attachToPanel(rootElem.side); };
-  
-  this.background.style.display = '';
-  this.sizeBgToDialog();
-};
-/** 
- * @private
- * @type Object Object with width, height strings incl. "px" for CSS
- */
-Xinha.Dialog.calcFullBgSize = function()
-{
-  var page = Xinha.pageSize();
-  var viewport = Xinha.viewportSize();
-  return {width:(page.x > viewport.x  ? page.x : viewport.x )  + "px",height:(page.x > viewport.y ? page.y : viewport.y ) + "px"};
-};
-/** Sizes the background to the size of the dialog
- *  @private
- */
-Xinha.Dialog.prototype.sizeBgToDialog = function()
-{
-  var rootElemStyle = this.rootElem.style;
-  var bgStyle = this.background.style;
-  bgStyle.top = rootElemStyle.top;
-  bgStyle.left = rootElemStyle.left;
-  bgStyle.width = rootElemStyle.width;
-  bgStyle.height = rootElemStyle.height;
-};
-/** Hides the background
- *  @private
- */
-Xinha.Dialog.prototype.hideBackground = function()
-{
-  //this.background.style.display = 'none';
-  Xinha.Dialog.fadeOut(this.background);
-};
-/** Shows the background
- *  @private
- */
-Xinha.Dialog.prototype.showBackground = function()
-{
-  //this.background.style.display = '';
-  Xinha.Dialog.fadeIn(this.background,70);
-};
-/** Positions the background
- *  @private
- *  @param {Object} pos Object with top, left strings incl. "px" for CSS
- */
-Xinha.Dialog.prototype.posBackground = function(pos)
-{
-  if (this.background.style.display != 'none')
-  {
-    this.background.style.top  = pos.top;
-    this.background.style.left = pos.left;
-  }
-};
-/** Resizes the background
- *  @private
- *  @param {Object} size Object with width, height strings incl. "px" for CSS
- */
-Xinha.Dialog.prototype.resizeBackground = function(size)
-{
-  if (this.background.style.display != 'none')
-  {
-    this.background.style.width  = size.width;
-    this.background.style.height = size.height;
-  }
-};
-/** Positions the dialog
- *  @param {Object} pos Object with top, left strings incl. "px" for CSS
- */
-Xinha.Dialog.prototype.posDialog = function(pos)
-{
-  var st = this.rootElem.style;
-  st.left = pos.left;
-  st.top  = pos.top;
-};
-/** Resizes the dialog
- * 
- * @param {Object} size Object with width, height strings incl. "px" for CSS
- */
-Xinha.Dialog.prototype.sizeDialog = function(size)
-{
-  var st = this.rootElem.style;
-  st.height = size.height;
-  st.width  = size.width;
-  var width = parseInt(size.width, 10);
-  var height = parseInt(size.height,10) - this.captionBar.offsetHeight;
-  this.main.style.height = (height > 20) ? height : 20 + "px";
-  this.main.style.width = (width > 10) ? width : 10 + 'px';
-};
-/** Sets the values like Xinha.Dialog.prototype.show(values)
- * @see #show
- * @param {Object} values 
- */
-Xinha.Dialog.prototype.setValues = function(values)
-{
-  for(var i in values)
-  {
-    if (typeof i == 'string') 
-    {
-      var elems = this.getElementsByName(i);
-      if (!elems) 
-      {
-        continue;
-      }
-      for(var x = 0; x < elems.length; x++)
-      {
-        var e = elems[x];
-        switch(e.tagName.toLowerCase())
-        {
-          case 'select'  :
-            for(var j = 0; j < e.options.length; j++)
-            {
-              if(typeof values[i] == 'object')
-              {
-                for(var k = 0; k < values[i].length; k++)
-                {
-                  if(values[i][k] == e.options[j].value)
-                  {
-                    e.options[j].selected = true;
-                  }
-                }
-              }
-              else if(values[i] == e.options[j].value)
-              {
-                e.options[j].selected = true;
-              }
-            }
-          break;
-          case 'textarea':
-          case 'input'   :
-            switch(e.getAttribute('type'))
-            {
-              case 'radio'   :
-                if(e.value == values[i])
-                {
-                  e.checked = true;
-                }
-              break;
-              case 'checkbox':
-                if(typeof values[i] == 'object')
-                {
-                  for(j in values[i])
-                  {
-                    if(values[i][j] == e.value)
-                    {
-                      e.checked = true;
-                    }
-                  }
-                }
-                else
-                {
-                  if(values[i] == e.value)
-                  {
-                    e.checked = true;
-                  }
-                }
-              break;
-              default:
-                e.value = values[i];
-              break;
-            }
-        }
-      }
-    }
-  }
-};
-
-/** Retrieves the values like Xinha.Dialog.prototype.hide()
- * @see #hide
- * @type Object values 
- */
-Xinha.Dialog.prototype.getValues = function()
-{
-  var values = [ ];
-  var inputs = 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 < inputs.length; x++)
-  {
-    var i = inputs[x];
-    if (!(i.name && this.r_id[i.name])) 
-    {
-      continue;
-    }
-
-    if(typeof values[this.r_id[i.name]] == 'undefined')
-    {
-      values[this.r_id[i.name]] = null;
-    }
-    var v = values[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;
-/*
-      case 'textarea':
-      case 'input'   :
-*/
-      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;
-        }
-    }
-    values[this.r_id[i.name]] = v;
-  }
-  return values;
-};
-
-/** Sets the localizer to use for the dialog
- *  @param function|string Either a function which takes a string as a parameter and returns 
- *    a localized string, or the name of a contact to pass to the standard Xinha localizer
- *    the "context" usually means the name of a plugin.
- */
- 
-Xinha.Dialog.prototype.setLocalizer = function(localizer)
-{  
-  var dialog = this;
-  if(typeof localizer == 'function')
-  {
-    dialog._lc = localizer;
-  }
-  else if(localizer)
-  {
-    this._lc = function(string)
-    {
-      return Xinha._lc(string,localizer);
-    };
-  }
-  else
-  {
-    this._lc = function(string)
-    {
-      return string;
-    };
-  }
-}
-
-/** Localizes strings in the dialog.
- * @private
- * @param {String} html The HTML to translate
- * @param {String} localizer Context for translation, usually plugin's name (optional if setLocalizer() has been used) 
- */
- 
-Xinha.Dialog.prototype.translateHtml = function(html,localizer)
-{  
-  var dialog = this;
-  if(localizer) this.setLocalizer(localizer);
-  
-  // looking for strings of the form name='[foo]' or id="[bar]"
-  html = html.replace(/((?:name)|(?:id))=(['"])\[([a-z0-9_]+)\]\2/ig,
-    function(fullString, type, quote, id)
-    {
-      return type + "=" + quote + dialog.createId(id) + quote;
-    }
-    ).replace(/<l10n>(.*?)<\/l10n>/ig,
-    function(fullString,translate)
-    {
-      return dialog._lc(translate) ;
-    }
-    ).replace(/\="_\((.*?)\)"/g,
-    function(fullString, translate)
-    {
-      return '="' + dialog._lc(translate) + '"';
-    }
-  );
-  return html;
-};
-
-/**
- * Fixup links in the elements to allow linking to Xinha resources
- * @private
- */
-Xinha.Dialog.prototype.fixupDOM = function(root,plugin)
-{
-  var dialog = this;
-  if(typeof plugin != 'string')
-  {
-    plugin = 'GenericPlugin';
-  }
-
-  var linkReplace = function(fullString, resource) {
-    switch(resource) {
-      case "editor":
-        return _editor_url;
-      case "plugin":
-        return Xinha.getPluginDir(plugin);
-      case "images":
-        return dialog.editor.imgURL('images');
-    };
-  };
-
-  var images = Xinha.collectionToArray(root.getElementsByTagName('img'));
-
-  for (var index=0; index<images.length; ++index) {
-    var image = images[index];
-    var reference = image.getAttribute('src');
-    if (reference) {
-      var fixedReference = reference.replace(/^\[(editor|plugin|images)\]/, linkReplace);
-      if (fixedReference != reference) {
-        image.setAttribute('src', fixedReference);
-      }
-    }
-  }
-
-  var links = Xinha.collectionToArray(root.getElementsByTagName('a'));
-
-  for (var index=0; index<links.length; ++index) {
-    var link = links[index];
-    var reference = link.getAttribute('href');
-    if (reference) {
-      var fixedReference = reference.replace(/^\[(editor|plugin|images)\]/, linkReplace);
-      if (fixedReference != reference) {
-        link.setAttribute('href', fixedReference);
-      }
-    }
-  }
-
-};
-
-/** Use this function when adding an element with a new ID/name to a 
- *  dialog after it has already been created. This function ensures
- *  that the dialog has the id/name stored in its reverse-lookup table
- *  (which is required for form values to be properly returned by
- *  Xinha.Dialog.hide).
- * 
- * @param {id} the id (or name) to add 
- *
- * Returns the internal ID to which the passed in ID maps
- *
- * TODO: createId is a really awful name, but I can't think of anything better...
- */
-Xinha.Dialog.prototype.createId = function(id)
-{
-  var dialog = this;
-  if (typeof dialog.id[id] == 'undefined')
-  {
-    dialog.id[id] = Xinha.uniq('Dialog');
-    dialog.r_id[dialog.id[id]] = id;
-  }
-  return dialog.id[id];
-};
-
-/** When several modeless dialogs are shown, one can be brought to front with this function (as happens on mouseclick) 
- * 
- * @param {XinhaDialog} dialog The dialog to activate
- */
-
-Xinha.Dialog.activateModeless = function(dialog)
-{
-  if (Xinha.Dialog.activeModeless == dialog || dialog.attached ) 
-  {
-    return;
-  }
-  
-  if (Xinha.Dialog.activeModeless )
-  {
-    Xinha.Dialog.activeModeless.rootElem.style.zIndex = parseInt(Xinha.Dialog.activeModeless.rootElem.style.zIndex, 10) -10;
-  }
-  Xinha.Dialog.activeModeless = dialog;
-
-  Xinha.Dialog.activeModeless.rootElem.style.zIndex = parseInt(Xinha.Dialog.activeModeless.rootElem.style.zIndex, 10) + 10;
-};
-/** Set opacity cross browser 
- * 
- * @param {DomNode} el The element to set the opacity
- * @param {Object} value opacity value (percent)
- */
-Xinha.Dialog.setOpacity = function(el,value)
-{
-    if (typeof el.style.filter != 'undefined')
-    {
-        el.style.filter = (value < 100) ?  'alpha(opacity='+value+')' : '';
-    }
-    else
-    {
-        el.style.opacity = value/100;
-    }
-};
-/** Fade in an element
- * 
- * @param {DomNode} el The element to fade
- * @param {Number} delay Time for one step in ms
- * @param {Number} endOpacity stop when this value is reached (percent)
- * @param {Number} step Fade this much per step (percent)
- */
-Xinha.Dialog.fadeIn = function(el,endOpacity,callback, delay,step)
-{
-    delay = delay || 1;
-    step = step || 25;
-    endOpacity = endOpacity || 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 < endOpacity)
-    {
-        el.op += step;
-        Xinha.Dialog.setOpacity(el,op);
-        el.timeOut = setTimeout(function(){Xinha.Dialog.fadeIn(el, endOpacity, callback, delay, step);},delay);
-    }
-    else
-    {
-        Xinha.Dialog.setOpacity(el,endOpacity);
-        el.op = endOpacity;
-        el.timeOut = null;
-        if (typeof callback == 'function') 
-        {
-          callback.call();
-        }
-    }
-};
-/** Fade out an element
- * 
- * @param {DomNode} el The element to fade
- * @param {Number} delay Time for one step in ms
- * @param {Number} step Fade this much per step (percent)
- */
-Xinha.Dialog.fadeOut = function(el,delay,step)
-{
-    delay = delay || 1;
-    step = step || 30;
-    if (typeof el.op == 'undefined') 
-    {
-      el.op = 100;
-    }
-    var op = el.op;
-
-    if (op >= 0)
-    {
-        el.op -= step;
-        Xinha.Dialog.setOpacity(el,op);
-        el.timeOut = setTimeout(function(){Xinha.Dialog.fadeOut(el,delay,step);},delay);
-    }
-    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-1.5.1/modules/Dialogs/dialog.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/modules/Dialogs/dialog.js
deleted file mode 100644
index f45afe6..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/modules/Dialogs/dialog.js
+++ /dev/null
@@ -1,101 +0,0 @@
-
-  /*--------------------------------------:noTabs=true:tabSize=2:indentSize=2:--
-    --  Xinha (is not htmlArea) - http://xinha.gogo.co.nz/
-    --
-    --  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.
-    --
-    --  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.
-    --
-    --  This is the implementation of the standard popup dialog
-    --
-    --   Though "Dialog" looks like an object, it isn't really an object.  Instead
-    --   it's just namespace for protecting global symbols.
-    --
-    --
-    --  $HeadURL: http://svn.xinha.org/trunk/modules/Dialogs/dialog.js $
-    --  $LastChangedDate: 2008-10-13 06:42:42 +1300 (Mon, 13 Oct 2008) $
-    --  $LastChangedRevision: 1084 $
-    --  $LastChangedBy: ray $
-    --------------------------------------------------------------------------*/
-
-
-function Dialog(url, action, init) {
-	if (typeof init == "undefined") {
-		init = window;	// pass this window object by default
-	}
-	if (typeof window.showModalDialog == 'function' && !Xinha.is_webkit) // webkit easily looses the selection with window.showModalDialog
-	{
-		Dialog._return = function(retVal) {
-			if (typeof action == 'function') action (retVal);
-		}
-		var r = window.showModalDialog(url, init, "dialogheight=300;dialogwidth=400;resizable=yes");
-	}
-	else
-	{
-		Dialog._geckoOpenModal(url, action, init);
-	}
-}
-
-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) {
-		//after closing the popup in IE the events are not released and trying to access Dialog._modal.closed causes an error
-	}
-};
-
-
-// should be a function, the return handler of the currently opened dialog.
-Dialog._return = null;
-
-// constant, the currently opened dialog
-Dialog._modal = null;
-
-// the dialog will read it's args from this variable
-Dialog._arguments = null;
-
-Dialog._selection = null;
-
-Dialog._geckoOpenModal = function(url, action, init) {
-	var dlg = window.open(url, "hadialog",
-			      "toolbar=no,menubar=no,personalbar=no,width=10,height=10," +
-			      "scrollbars=no,resizable=yes,modal=yes,dependable=yes");
-	Dialog._modal = dlg;
-	Dialog._arguments = init;
-
-	// capture some window's events
-	function capwin(w) {
-		Xinha._addEvent(w, "click", Dialog._parentEvent);
-		Xinha._addEvent(w, "mousedown", Dialog._parentEvent);
-		Xinha._addEvent(w, "focus", Dialog._parentEvent);
-	}
-	// release the captured events
-	function relwin(w) {
-		Xinha._removeEvent(w, "click", Dialog._parentEvent);
-		Xinha._removeEvent(w, "mousedown", Dialog._parentEvent);
-		Xinha._removeEvent(w, "focus", Dialog._parentEvent);
-	}
-	capwin(window);
-	// capture other frames, note the exception trapping, this is because
-  // we are not permitted to add events to frames outside of the current
-  // window's domain.
-	for (var i = 0; i < window.frames.length; i++) {try { capwin(window.frames[i]); } catch(e) { } };
-	// make up a function to be called when the Dialog ends.
-	Dialog._return = function (val) {
-		if (val && action) {
-			action(val);
-		}
-		relwin(window);
-		// capture other frames
-		for (var i = 0; i < window.frames.length; i++) { try { relwin(window.frames[i]); } catch(e) { } };
-		Dialog._modal = null;
-	};
-  Dialog._modal.focus();
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/modules/Dialogs/div-dialog.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/modules/Dialogs/div-dialog.js
deleted file mode 100644
index ce34d73..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/modules/Dialogs/div-dialog.js
+++ /dev/null
@@ -1,70 +0,0 @@
-
-  /*--------------------------------------:noTabs=true:tabSize=2:indentSize=2:--
-    --  Xinha (is not htmlArea) - http://xinha.gogo.co.nz/
-    --
-    --  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.
-    --
-    --  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.
-    --
-    --  $HeadURL: http://svn.xinha.webfactional.com/trunk/modules/Dialogs/inline-dialog.js $
-    --  $LastChangedDate: 2007-01-24 03:26:04 +1300 (Wed, 24 Jan 2007) $
-    --  $LastChangedRevision: 694 $
-    --  $LastChangedBy: gogo $
-    --------------------------------------------------------------------------*/
- 
-/** The DivDialog is used as a semi-independant means of using a Plugin outside of 
- *  Xinha, it does not depend on having a Xinha editor available - not that of of course
- *  Plugins themselves may (and very likely do) require an editor.
- *
- *  @param Div into which the dialog will draw itself.
- *
- *  @param HTML for the dialog, with the special subtitutions...
- *    id="[someidhere]" will assign a unique id to the element in question
- *        and this can be retrieved with yourDialog.getElementById('someidhere')   
- *    _(Some Text Here) will localize the text, this is used for within attributes
- *    <l10n>Some Text Here</l10n> will localize the text, this is used outside attributes
- *
- *  @param A function which can take a native (english) string and return a localized version,
- *   OR;   A "context" to be used with the standard Xinha._lc() method,
- *   OR;   Null - no localization will happen, only native strings will be used.
- *
- */
-   
-Xinha.DivDialog = function(rootElem, html, localizer)
-{
-  this.id    = { };
-  this.r_id  = { }; // reverse lookup id
-  this.document = document;
-  
-  this.rootElem = rootElem;
-  this.rootElem.className += ' dialog';
-  this.rootElem.style.display  = 'none';
-    
-  this.width  =  this.rootElem.offsetWidth + 'px';
-  this.height =  this.rootElem.offsetHeight + 'px';
-  
-  this.setLocalizer(localizer);
-  this.rootElem.innerHTML = this.translateHtml(html);  
-}
-
-Xinha.extend(Xinha.DivDialog, Xinha.Dialog);
-
-Xinha.DivDialog.prototype.show = function(values)
-{  
-  if(typeof values != 'undefined')
-  {
-    this.setValues(values);
-  }
-  
-  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-1.5.1/modules/Dialogs/lang/lc_base.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/modules/Dialogs/lang/lc_base.js
deleted file mode 100644
index 9f8ae2f..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/modules/Dialogs/lang/lc_base.js
+++ /dev/null
@@ -1,25 +0,0 @@
-// I18N constants
-//
-// LANG: "en", ENCODING: UTF-8
-// Author: Translator-Name, <email@example.com>
-//
-// Last revision: 2018-04-12
-// 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).
-//
-// (Please, remove information below)
-// 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.)
-
-{
-    "Some Text Here": ""
-}
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/modules/Dialogs/panel-dialog.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/modules/Dialogs/panel-dialog.js
deleted file mode 100644
index e83aa14..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/modules/Dialogs/panel-dialog.js
+++ /dev/null
@@ -1,81 +0,0 @@
-
-Xinha.PanelDialog = function(editor, side, html, localizer)
-{
-  this.id    = { };
-  this.r_id  = { }; // reverse lookup id
-  this.editor   = editor;
-  this.document = document;
-  this.rootElem = editor.addPanel(side);
-
-  var dialog = this;
-  if(typeof localizer == 'function')
-  {
-    this._lc = localizer;
-  }
-  else if(localizer)
-  {
-    this._lc = function(string)
-    {
-      return Xinha._lc(string,localizer);
-    };
-  }
-  else
-  {
-    this._lc = function(string)
-    {
-      return string;
-    };
-  }
-
-  html = html.replace(/\[([a-z0-9_]+)\]/ig,
-                      function(fullString, id)
-                      {
-                        if(typeof dialog.id[id] == 'undefined')
-                        {
-                          dialog.id[id] = Xinha.uniq('Dialog');
-                          dialog.r_id[dialog.id[id]] = id;
-                        }
-                        return dialog.id[id];
-                      }
-             ).replace(/<l10n>(.*?)<\/l10n>/ig,
-                       function(fullString,translate)
-                       {
-                         return dialog._lc(translate) ;
-                       }
-             ).replace(/="_\((.*?)\)"/g,
-                       function(fullString, translate)
-                       {
-                         return '="' + dialog._lc(translate) + '"';
-                       }
-             );
-
-  this.rootElem.innerHTML = html;
-};
-
-Xinha.PanelDialog.prototype.show = function(values)
-{
-  this.setValues(values);
-  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;
-
-Xinha.PanelDialog.prototype.getElementsByClassName = Xinha.Dialog.prototype.getElementsByClassName;
-
-Xinha.PanelDialog.prototype.createElement = Xinha.Dialog.prototype.createElement;
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/modules/Dialogs/popupwin.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/modules/Dialogs/popupwin.js
deleted file mode 100644
index c852668..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/modules/Dialogs/popupwin.js
+++ /dev/null
@@ -1,179 +0,0 @@
-// (c) dynarch.com 2003-2004
-// Distributed under the same terms as HTMLArea itself.
-
-function PopupWin(editor, title, handler, initFunction)
-{
-  this.editor = editor;
-  this.handler = handler;
-  var dlg = window.open("", "__ha_dialog", "toolbar=no,menubar=no,personalbar=no,width=600,height=600,left=20,top=40,scrollbars=no,resizable=yes");
-  this.window = dlg;
-  var doc = dlg.document;
-  this.doc = doc;
-  var self = this;
-
-  var base = document.baseURI || document.URL;
-  if ( base && base.match(/(.*)\/([^\/]+)/) )
-  {
-    base = RegExp.$1 + "/";
-  }
-  // @fixme: why using a regex here and not a simple string test ?
-  if ( typeof _editor_url != "undefined" && ! ( /^\//.test(_editor_url) ) && ! ( /http:\/\//.test(_editor_url) ) )
-  {
-    // _editor_url doesn't start with '/' which means it's relative
-    // FIXME: there's a problem here, it could be http:// which
-    // doesn't start with slash but it's not relative either.
-    base += _editor_url;
-  }
-  else
-  {
-    base = _editor_url;
-  }
- 
-  // @fixme: why using a regex here and not a simple string test ?
-  if ( ! ( /\/$/.test(base) ) )
-  {
-    // base does not end in slash, add it now
-    base += '/';
-  }
-  this.baseURL = base;
-
-  doc.open();
-  var html = "<html><head><title>" + title + "</title>\n";
-  // html += "<base href='" + base + "htmlarea.js' />\n";
-  html += '<style type="text/css">@import url(' + _editor_url + 'Xinha.css);</style>\n';
-  if ( _editor_skin != "" )
-  {
-    html += '<style type="text/css">@import url(' + _editor_url + 'skins/' + _editor_skin + '/skin.css);</style>\n';
-  }
-  html += "</head>\n";
-  html += '<body class="dialog popupwin" id="--HA-body"></body></html>';
-  doc.write(html);
-  doc.close();
-
-  // sometimes I Hate Mozilla... ;-(
-  function init2()
-  {
-    var body = doc.body;
-    if ( !body )
-    {
-      setTimeout(init2, 25);
-      return false;
-    }
-    dlg.title = title;
-    doc.documentElement.style.padding = "0px";
-    doc.documentElement.style.margin = "0px";
-    var content = doc.createElement("div");
-    content.className = "content";
-    self.content = content;
-    body.appendChild(content);
-    self.element = body;
-    initFunction(self);
-    dlg.focus();
-  }
-  init2();
-}
-
-PopupWin.prototype.callHandler = function()
-{
-  var tags = ["input", "textarea", "select"];
-  var params = {};
-  for ( var ti = tags.length; --ti >= 0; )
-  {
-    var tag = tags[ti];
-    var els = this.content.getElementsByTagName(tag);
-    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;
-        }
-      }
-      params[el.name] = val;
-    }
-  }
-  this.handler(this, params);
-  return false;
-};
-
-PopupWin.prototype.close = function()
-{
-  this.window.close();
-};
-
-PopupWin.prototype.addButtons = function()
-{
-  // @fixme: isn't self a predefined variable used to access self frame in most browsers ?
-  //         if yes, then we break it here
-  var self = 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 button = this.doc.createElement("button");
-    div.appendChild(button);
-    button.innerHTML = Xinha._lc(btn, 'Xinha');
-    switch (btn.toLowerCase())
-    {
-      case "ok":
-        Xinha.addDom0Event(button, 'click',
-          function()
-          {
-            self.callHandler();
-            self.close();
-            return false;
-          }
-        );
-      break;
-      case "cancel":
-        Xinha.addDom0Event(button, 'click',
-          function()
-          {
-            self.close();
-            return false;
-          }
-        );
-      break;
-    }
-  }
-};
-
-PopupWin.prototype.showAtElement = function()
-{
-  var self = this;
-  // Mozilla needs some time to realize what's goin' on..
-  setTimeout(function()
-    {
-      var w = self.content.offsetWidth + 4;
-      var h = self.content.offsetHeight + 4;
-      // size to content -- that's fuckin' buggy in all fuckin' browsers!!!
-      // so that we set a larger size for the dialog window and then center
-      // the element inside... phuck!
-
-      // center...
-      var el = self.content;
-      var s = el.style;
-      // s.width = el.offsetWidth + "px";
-      // s.height = el.offsetHeight + "px";
-      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)
-      {
-        self.window.innerWidth = w;
-        self.window.innerHeight = h;
-      }
-      else
-      {
-        self.window.resizeTo(w + 8, h + 70);
-      }
-      
-    },
-    25);
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/modules/FullScreen/full-screen.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/modules/FullScreen/full-screen.js
deleted file mode 100644
index 427bb82..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/modules/FullScreen/full-screen.js
+++ /dev/null
@@ -1,241 +0,0 @@
-function FullScreen(editor, args)
-{
-  this.editor = editor;
-  this.originalSizes = null;
-  editor._superclean_on = false;
-  var cfg = editor.config;
-
-  cfg.registerIcon('fullscreen', [_editor_url + cfg.imgURL + 'ed_buttons_main.png',8,0]);
-  cfg.registerIcon('fullscreenrestore', [_editor_url + cfg.imgURL + 'ed_buttons_main.png',9,0]);
-  
-  cfg.registerButton
-  ( 'fullscreen',
-    this._lc("Maximize/Minimize Editor"),
-    cfg.iconList.fullscreen, true,
-      function(e, objname, obj)
-      {
-        e._fullScreen();
-      }
-  );
-
-  // See if we can find 'popupeditor' and replace it with fullscreen
-  cfg.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(string) {
-    return Xinha._lc(string, {url : _editor_url + 'modules/FullScreen/lang/',context:"FullScreen"});
-};
-
-/** fullScreen makes an editor take up the full window space (and resizes when the browser is resized)
- *  the principle is the same as the "popupwindow" functionality in the original htmlArea, except
- *  this one doesn't popup a window (it just uses to positioning hackery) so it's much more reliable
- *  and much faster to switch between
- */
-
-Xinha.prototype._fullScreen = function()
-{
-  var e = this;
-  var cfg = e.config;
-  function sizeItUp()
-  {
-    if(!e._isFullScreen || e._sizing) return false;
-    e._sizing = true;
-    // Width & Height of window
-    var dim = Xinha.viewportSize();
-    if(e.config.fullScreenSizeDownMethod == 'restore') 
-    {
-      e.originalSizes = {
-        x:   parseInt(e._htmlArea.style.width),
-        y:   parseInt(e._htmlArea.style.height),
-        dim: dim
-      };
-    }
-
-    var h = dim.y - e.config.fullScreenMargins[0] -  e.config.fullScreenMargins[2];
-    var w = dim.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(cfg.iconList.fullscreenrestore); 
-  }
-
-  function sizeItDown()
-  {
-    if(e._isFullScreen || e._sizing) return false;
-    e._sizing = true;
-
-    if(e.originalSizes != null) 
-    {
-        var os = e.originalSizes;
-        var nDim = Xinha.viewportSize();
-        var nW = os.x + (nDim.x - os.dim.x);
-        var nH = os.y + (nDim.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(cfg.iconList.fullscreen); 
-  }
-
-  /** It's not possible to reliably get scroll events, particularly when we are hiding the scrollbars
-   *   so we just reset the scroll ever so often while in fullscreen mode
-   */
-  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);
-    }
-  }
-
-  // Gecko has a bug where if you change position/display on a
-  // designMode iframe that designMode dies.
-  if(Xinha.is_gecko)
-  {
-    this.deactivateEditor();
-  }
-
-  if(this._isFullScreen)
-  {
-    // Unmaximize
-    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)
-    {
-      // Nutthin
-    }
-    this._isFullScreen = false;
-    sizeItDown();
-
-    // Restore all ancestor positions
-    var ancestor = this._htmlArea;
-    while((ancestor = ancestor.parentNode) && ancestor.style)
-    {
-      ancestor.style.position = ancestor._xinha_fullScreenOldPosition;
-      ancestor._xinha_fullScreenOldPosition = null;
-    }
-    
-    if ( Xinha.ie_version < 7 )
-    {
-      var selects = document.getElementsByTagName("select");
-      for ( var i=0;i<selects.length;++i )
-      {
-        selects[i].style.visibility = 'visible';
-      }
-    }
-    window.scroll(this._unScroll.x, this._unScroll.y);
-  }
-  else
-  {
-
-    // Get the current Scroll Positions
-    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
-    };
-
-
-    // Make all ancestors position = static
-    var ancestor = this._htmlArea;
-    while((ancestor = ancestor.parentNode) && ancestor.style)
-    {
-      ancestor._xinha_fullScreenOldPosition = ancestor.style.position;
-      ancestor.style.position = 'static';
-    }
-    // very ugly bug in IE < 7 shows select boxes through elements that are positioned over them
-    if ( Xinha.ie_version < 7 )
-    {
-      var selects = document.getElementsByTagName("select");
-      var s, currentEditor;
-      for ( var i=0;i<selects.length;++i )
-      {
-        s = selects[i];
-        currentEditor = false;
-        while ( s = s.parentNode )
-        {
-          if ( s == this._htmlArea )
-          {
-            currentEditor = true;
-            break;
-          }
-        }
-        if ( !currentEditor && selects[i].style.visibility != 'hidden')
-        {
-          selects[i].style.visibility = 'hidden';
-        }
-      }
-    }
-    // Maximize
-    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)
-    {
-      // Nutthin
-    }
-
-    sizeItUp();
-  }
-
-  if(Xinha.is_gecko)
-  {
-    this.activateEditor();
-  }
-  this.focusEditor();
-};
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/modules/FullScreen/lang/de.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/modules/FullScreen/lang/de.js
deleted file mode 100644
index 9466846..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/modules/FullScreen/lang/de.js
+++ /dev/null
@@ -1,13 +0,0 @@
-// I18N constants
-// LANG: "de", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Maximize/Minimize Editor": "Editor maximieren/verkleinern"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/modules/FullScreen/lang/es.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/modules/FullScreen/lang/es.js
deleted file mode 100644
index 947f00f..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/modules/FullScreen/lang/es.js
+++ /dev/null
@@ -1,13 +0,0 @@
-// I18N constants
-// LANG: "es", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Maximize/Minimize Editor": "Maximizar/Minimizar Editor"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/modules/FullScreen/lang/fr.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/modules/FullScreen/lang/fr.js
deleted file mode 100644
index 2c55280..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/modules/FullScreen/lang/fr.js
+++ /dev/null
@@ -1,13 +0,0 @@
-// I18N constants
-// LANG: "fr", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "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-1.5.1/modules/FullScreen/lang/ja.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/modules/FullScreen/lang/ja.js
deleted file mode 100644
index 18f2162..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/modules/FullScreen/lang/ja.js
+++ /dev/null
@@ -1,13 +0,0 @@
-// I18N constants
-// LANG: "ja", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Maximize/Minimize Editor": "エディタの最大化/最小化"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/modules/FullScreen/lang/lc_base.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/modules/FullScreen/lang/lc_base.js
deleted file mode 100644
index 1ab0559..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/modules/FullScreen/lang/lc_base.js
+++ /dev/null
@@ -1,25 +0,0 @@
-// I18N constants
-//
-// LANG: "en", ENCODING: UTF-8
-// Author: Translator-Name, <email@example.com>
-//
-// Last revision: 2018-04-12
-// 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).
-//
-// (Please, remove information below)
-// 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.)
-
-{
-    "Maximize/Minimize Editor": ""
-}
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/modules/FullScreen/lang/nb.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/modules/FullScreen/lang/nb.js
deleted file mode 100644
index c83474a..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/modules/FullScreen/lang/nb.js
+++ /dev/null
@@ -1,13 +0,0 @@
-// I18N constants
-// LANG: "nb", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "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-1.5.1/modules/FullScreen/lang/nl.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/modules/FullScreen/lang/nl.js
deleted file mode 100644
index c588384..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/modules/FullScreen/lang/nl.js
+++ /dev/null
@@ -1,13 +0,0 @@
-// I18N constants
-// LANG: "nl", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Maximize/Minimize Editor": "Editor maximaliseren/verkleinen"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/modules/FullScreen/lang/pl.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/modules/FullScreen/lang/pl.js
deleted file mode 100644
index b82d233..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/modules/FullScreen/lang/pl.js
+++ /dev/null
@@ -1,13 +0,0 @@
-// I18N constants
-// LANG: "pl", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Maximize/Minimize Editor": "Maksymalizuj/minimalizuj edytor"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/modules/FullScreen/lang/pt_br.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/modules/FullScreen/lang/pt_br.js
deleted file mode 100644
index 314c492..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/modules/FullScreen/lang/pt_br.js
+++ /dev/null
@@ -1,13 +0,0 @@
-// I18N constants
-// LANG: "pt_br", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Maximize/Minimize Editor": "Maximizar/Minimizar Editor"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/modules/FullScreen/lang/ru.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/modules/FullScreen/lang/ru.js
deleted file mode 100644
index 88e7b84..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/modules/FullScreen/lang/ru.js
+++ /dev/null
@@ -1,13 +0,0 @@
-// I18N constants
-// LANG: "ru", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Maximize/Minimize Editor": "Развернуть/Свернуть редактор"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/modules/FullScreen/lang/sv.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/modules/FullScreen/lang/sv.js
deleted file mode 100755
index 3e18358..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/modules/FullScreen/lang/sv.js
+++ /dev/null
@@ -1,13 +0,0 @@
-// I18N constants
-// LANG: "sv", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Maximize/Minimize Editor": "Maximera/Minimera WYSIWYG fönster"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/modules/FullScreen/lang/tr.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/modules/FullScreen/lang/tr.js
deleted file mode 100644
index 8997cb5..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/modules/FullScreen/lang/tr.js
+++ /dev/null
@@ -1,13 +0,0 @@
-// I18N constants
-// LANG: "tr", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Maximize/Minimize Editor": "Editörü simge durumuna küçült/geri yükle"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/modules/Gecko/Gecko.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/modules/Gecko/Gecko.js
deleted file mode 100644
index 5d3de9f..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/modules/Gecko/Gecko.js
+++ /dev/null
@@ -1,960 +0,0 @@
-
-  /*--------------------------------------:noTabs=true:tabSize=2:indentSize=2:--
-    --  Xinha (is not htmlArea) - http://xinha.gogo.co.nz/
-    --
-    --  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.
-    --
-    --  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.
-    --
-    -- This is the Gecko compatability plugin, part of the Xinha core.
-    --
-    --  The file is loaded as a special plugin by the Xinha Core when
-    --  Xinha is being run under a Gecko based browser with the Midas
-    --  editing API.
-    --
-    --  It provides implementation and specialisation for various methods
-    --  in the core where different approaches per browser are required.
-    --
-    --  Design Notes::
-    --   Most methods here will simply be overriding Xinha.prototype.<method>
-    --   and should be called that, but methods specific to Gecko should 
-    --   be a part of the Gecko.prototype, we won't trample on namespace
-    --   that way.
-    --
-    --  $HeadURL: http://svn.xinha.org/trunk/modules/Gecko/Gecko.js $
-    --  $LastChangedDate: 2018-02-19 20:35:49 +1300 (Mon, 19 Feb 2018) $
-    --  $LastChangedRevision: 1402 $
-    --  $LastChangedBy: gogo $
-    --------------------------------------------------------------------------*/
-                                                    
-Gecko._pluginInfo = {
-  name          : "Gecko",
-  origin        : "Xinha Core",
-  version       : "$LastChangedRevision: 1402 $".replace(/^[^:]*:\s*(.*)\s*\$$/, '$1'),
-  developer     : "The Xinha Core Developer Team",
-  developer_url : "$HeadURL: http://svn.xinha.org/trunk/modules/Gecko/Gecko.js $".replace(/^[^:]*:\s*(.*)\s*\$$/, '$1'),
-  sponsor       : "",
-  sponsor_url   : "",
-  license       : "htmlArea"
-};
-
-function Gecko(editor) {
-  this.editor = editor;  
-  editor.Gecko = this;
-}
-
-/** Allow Gecko to handle some key events in a special way.
- */
-Gecko.prototype.onKeyPress = function(ev)
-{
-  var editor = this.editor;
-  var s = editor.getSelection();
-  // Handle shortcuts
-  if(editor.isShortCut(ev))
-  {
-    switch(editor.getKey(ev).toLowerCase())
-    {
-      case 'z':
-      {
-        if(editor._unLink && editor._unlinkOnUndo)
-        {
-          Xinha._stopEvent(ev);
-          editor._unLink();
-          editor.updateToolbar();
-          return true;
-        }
-      }
-      break;
-      
-      case 'a':
-      {
-        // KEY select all
-        sel = editor.getSelection();
-        sel.removeAllRanges();
-        range = editor.createRange();
-        range.selectNodeContents(editor._doc.body);
-        sel.addRange(range);
-        Xinha._stopEvent(ev);
-        return true;
-      }
-      break;
-      
-      case 'v':
-      {
-        // If we are not using htmlareaPaste, don't let Xinha try and be fancy but let the 
-        // event be handled normally by the browser (don't stopEvent it)
-        if(!editor.config.htmlareaPaste)
-        {          
-          return true;
-        }
-      }
-      break;
-    }
-  }
-  
-  // Handle normal characters
-  switch(editor.getKey(ev))
-  {
-    // Space, see if the text just typed looks like a URL, or email address
-    // and link it appropriatly
-    case ' ':
-    {      
-      var autoWrap = function (textNode, tag)
-      {
-        var rightText = textNode.nextSibling;
-        if ( typeof tag == 'string')
-        {
-          tag = editor._doc.createElement(tag);
-        }
-        var a = textNode.parentNode.insertBefore(tag, rightText);
-        Xinha.removeFromParent(textNode);
-        a.appendChild(textNode);
-        rightText.data = ' ' + rightText.data;
-    
-        s.collapse(rightText, 1);
-    
-        editor._unLink = function()
-        {
-          var t = a.firstChild;
-          a.removeChild(t);
-          a.parentNode.insertBefore(t, a);
-          Xinha.removeFromParent(a);
-          editor._unLink = null;
-          editor._unlinkOnUndo = false;
-        };
-        editor._unlinkOnUndo = true;
-    
-        return a;
-      };
-
-      if ( editor.config.convertUrlsToLinks && s && s.isCollapsed && s.anchorNode.nodeType == 3 && s.anchorNode.data.length > 3 && s.anchorNode.data.indexOf('.') >= 0 )
-      {
-        var midStart = s.anchorNode.data.substring(0,s.anchorOffset).search(/\S{4,}$/);
-        if ( midStart == -1 )
-        {
-          break;
-        }
-
-        if ( editor._getFirstAncestor(s, 'a') )
-        {
-          break; // already in an anchor
-        }
-
-        var matchData = s.anchorNode.data.substring(0,s.anchorOffset).replace(/^.*?(\S*)$/, '$1');
-
-        var mEmail = matchData.match(Xinha.RE_email);
-        if ( mEmail )
-        {
-          var leftTextEmail  = s.anchorNode;
-          var rightTextEmail = leftTextEmail.splitText(s.anchorOffset);
-          var midTextEmail   = leftTextEmail.splitText(midStart);
-
-          autoWrap(midTextEmail, 'a').href = 'mailto:' + mEmail[0];
-          return true;
-        }
-
-        RE_date = /([0-9]+\.)+/; //could be date or ip or something else ...
-        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 mUrl = matchData.match(Xinha.RE_url);
-        if ( mUrl )
-        {
-          if (RE_date.test(matchData))
-          {
-            break; //ray: disabling linking of IP numbers because of general bugginess (see Ticket #1085)
-            /*if (!RE_ip.test(matchData)) 
-            {
-              break;
-            }*/
-          } 
-          var leftTextUrl  = s.anchorNode;
-          var rightTextUrl = leftTextUrl.splitText(s.anchorOffset);
-          var midTextUrl   = leftTextUrl.splitText(midStart);
-          autoWrap(midTextUrl, 'a').href = (mUrl[1] ? mUrl[1] : 'http://') + mUrl[2];
-          return true;
-        }
-      }
-    }
-    break;    
-  }
-  
-  // Handle special keys
-  switch ( ev.keyCode )
-  {    
-/*  This is now handled by a plugin  
-    case 13: // ENTER
-
-    break;*/
-
-    case 27: // ESCAPE
-    {
-      if ( editor._unLink )
-      {
-        editor._unLink();
-        Xinha._stopEvent(ev);
-      }
-      break;
-    }
-    break;
-    
-    case 9: // KEY tab
-    {
-      // Note that the ListOperations plugin will handle tabs in list items and indent/outdent those
-      // at some point TableOperations might do also
-      // so this only has to handle a tab/untab in text
-      if(editor.config.tabSpanClass)
-      {
-        if(!ev.shiftKey)
-        {                  //  v-- Avoid lc_parse_strings.php
-          editor.insertHTML('<'+'span class="'+editor.config.tabSpanClass+'">'+editor.config.tabSpanContents+'</span>');
-          var s = editor.getSelection().collapseToEnd();
-        }
-        else
-        {
-          var existingTab = editor.getParentElement();
-          if(existingTab && existingTab.className.match(editor.config.tabSpanClass))
-          {
-            var s = editor.getSelection();
-            s.removeAllRanges();
-            var r = editor.createRange();
-            r.selectNode(existingTab);
-            s.addRange(r);
-            s.deleteFromDocument();
-          }
-        }
-      }
-      
-      Xinha._stopEvent(ev);
-      
-    }
-    break;
-    
-    case 8: // KEY backspace
-    case 46: // KEY delete
-    {
-      // We handle the mozilla backspace directly??
-      if ( !ev.shiftKey && this.handleBackspace() )
-      {
-        Xinha._stopEvent(ev);
-      }
-    }
-    
-    
-    default:
-    {
-        editor._unlinkOnUndo = false;
-
-        // Handle the "auto-linking", specifically this bit of code sets up a handler on
-        // an self-titled anchor (eg <a href="http://www.gogo.co.nz/">www.gogo.co.nz</a>)
-        // when the text content is edited, such that it will update the href on the anchor
-        
-        if ( s.anchorNode && s.anchorNode.nodeType == 3 )
-        {
-          // See if we might be changing a link
-          var a = editor._getFirstAncestor(s, 'a');
-          // @todo: we probably need here to inform the setTimeout below that we not changing a link and not start another setTimeout
-          if ( !a )
-          {
-            break; // not an anchor
-          } 
-          
-          if ( !a._updateAnchTimeout )
-          {
-            if ( s.anchorNode.data.match(Xinha.RE_email) && a.href.match('mailto:' + s.anchorNode.data.trim()) )
-            {
-              var textNode = s.anchorNode;
-              var fnAnchor = function()
-              {
-                a.href = 'mailto:' + textNode.data.trim();
-                // @fixme: why the hell do another timeout is started ?
-                //         This lead to never ending timer if we dont remove this line
-                //         But when removed, the email is not correctly updated
-                //
-                // - to fix this we should make fnAnchor check to see if textNode.data has
-                //   stopped changing for say 5 seconds and if so we do not make this setTimeout 
-                a._updateAnchTimeout = setTimeout(fnAnchor, 250);
-              };
-              a._updateAnchTimeout = setTimeout(fnAnchor, 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 txtNode = s.anchorNode;
-              var fnUrl = function()
-              {
-                // Sometimes m is undefined becase the url is not an url anymore (was www.url.com and become for example www.url)
-                // ray: shouldn't the link be un-linked then?
-                m = txtNode.data.match(Xinha.RE_url);
-                if(m)
-                {
-                  a.href = (m[1] ? m[1] : 'http://') + m[2];
-                }
-                
-                // @fixme: why the hell do another timeout is started ?
-                //         This lead to never ending timer if we dont remove this line
-                //         But when removed, the url is not correctly updated
-                //
-                // - to fix this we should make fnUrl check to see if textNode.data has
-                //   stopped changing for say 5 seconds and if so we do not make this setTimeout
-                a._updateAnchTimeout = setTimeout(fnUrl, 250);
-              };
-              a._updateAnchTimeout = setTimeout(fnUrl, 1000);
-            }
-          }        
-        }                
-    }
-    break;
-  }
-
-  return false; // Let other plugins etc continue from here.
-}
-
-/** When backspace is hit, the Gecko onKeyPress will execute this method.
- *  I don't remember what the exact purpose of this is though :-(
- */
- 
-Gecko.prototype.handleBackspace = function()
-{
-  var editor = this.editor;
-  setTimeout(
-    function()
-    {
-      var sel   = editor.getSelection();
-      var range = editor.createRange(sel);
-      var SC = range.startContainer;
-      var SO = range.startOffset;
-      var EC = range.endContainer;
-      var EO = range.endOffset;
-      var newr = 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 = range.cloneRange();
-        r.setStartBefore(newr);
-        r.setEndAfter(newr);
-        r.extractContents();
-        sel.removeAllRanges();
-        sel.addRange(r);
-      }
-    },
-    10);
-};
-
-Gecko.prototype.inwardHtml = function(html)
-{
-   // Midas uses b and i internally instead of strong and em
-   // Xinha will use strong and em externally (see Xinha.prototype.outwardHtml)   
-   html = html.replace(/<(\/?)strong(\s|>|\/)/ig, "<$1b$2");
-   html = html.replace(/<(\/?)em(\s|>|\/)/ig, "<$1i$2");    
-   
-   // Both IE and Gecko use strike internally instead of del (#523)
-   // Xinha will present del externally (see Xinha.prototype.outwardHtml
-   html = html.replace(/<(\/?)del(\s|>|\/)/ig, "<$1strike$2");
-   
-   return html;
-}
-
-Gecko.prototype.outwardHtml = function(html)
-{
-  // ticket:56, the "greesemonkey" plugin for Firefox adds this junk,
-  // so we strip it out.  Original submitter gave a plugin, but that's
-  // a bit much just for this IMHO - james
-  html = html.replace(/<script[\s]*src[\s]*=[\s]*['"]chrome:\/\/.*?["']>[\s]*<\/script>/ig, '');
-
-  return html;
-}
-
-Gecko.prototype.onExecCommand = function(cmdID, UI, param)
-{   
-  try
-  {
-    // useCSS deprecated & replaced by styleWithCSS
-    this.editor._doc.execCommand('useCSS', false, true); //switch useCSS off (true=off)
-    this.editor._doc.execCommand('styleWithCSS', false, false); //switch styleWithCSS off     
-  } catch (ex) {}
-    
-  switch(cmdID)
-  {
-    case 'paste':
-    {
-      alert(Xinha._lc("The Paste button does not work in this browser for security reasons. Press CTRL-V on your keyboard to paste directly.", 'Gecko'));
-      return true; // Indicate paste is done, stop command being issued to browser by Xinha.prototype.execCommand
-    }
-    break;
-    case 'removeformat':
-      var editor = this.editor;
-      var sel = editor.getSelection();
-      var selSave = editor.saveSelection(sel);
-      var range = editor.createRange(sel);
-
-      var els = editor._doc.body.getElementsByTagName('*');
-
-      var start = ( range.startContainer.nodeType == 1 ) ? range.startContainer : range.startContainer.parentNode;
-      var i, el;
-      if (sel.isCollapsed) range.selectNodeContents(editor._doc.body);
-      
-      for (i=0; i<els.length;i++)
-      {
-        el = els[i];
-        if ( range.isPointInRange(el, 0) || (els[i] == start && range.startOffset == 0))
-        {
-          el.removeAttribute('style');
-        }
-      }
-      this.editor._doc.execCommand(cmdID, UI, param);
-      editor.restoreSelection(selSave);
-      return true;
-    break;
-  }
-  
-  return false;
-}
-Gecko.prototype.onMouseDown = function(ev)
-{   
-  // Gecko doesn't select hr's on single click
-  if (ev.target.tagName.toLowerCase() == "hr")
-  {
-    var sel = this.editor.getSelection();
-    var range = this.editor.createRange(sel);
-    range.selectNode(ev.target);
-  }
-}
-
-
-/*--------------------------------------------------------------------------*/
-/*------- IMPLEMENTATION OF THE ABSTRACT "Xinha.prototype" METHODS ---------*/
-/*--------------------------------------------------------------------------*/
-
-/** Insert a node at the current selection point. 
- * @param toBeInserted DomNode
- */
-
-Xinha.prototype.insertNodeAtSelection = function(toBeInserted)
-{
-  if ( toBeInserted.ownerDocument != this._doc ) // as of FF3, Gecko is strict regarding the ownerDocument of an element
-  {
-    try 
-	{
-		toBeInserted = this._doc.adoptNode( toBeInserted );
-	} catch (e) {}
-  }
-  var sel = this.getSelection();
-  var range = this.createRange(sel);
-  // remove the current selection
-  sel.removeAllRanges();
-  range.deleteContents();
-  var node = range.startContainer;
-  var pos = range.startOffset;
-  var selnode = toBeInserted;
-  
-  switch ( node.nodeType )
-  {
-    case 3: // Node.TEXT_NODE
-      // we have to split it at the caret position.
-      if ( toBeInserted.nodeType == 3 )
-      {
-        // do optimized insertion
-        node.insertData(pos, toBeInserted.data);
-        range = this.createRange();
-        range.setEnd(node, pos + toBeInserted.length);
-        range.setStart(node, pos + toBeInserted.length);
-        sel.addRange(range);
-      }
-      else
-      {
-        node = node.splitText(pos);
-        if ( toBeInserted.nodeType == 11 /* Node.DOCUMENT_FRAGMENT_NODE */ )
-        {
-          selnode = selnode.firstChild;
-        }
-        node.parentNode.insertBefore(toBeInserted, node);
-        this.selectNodeContents(selnode);
-        this.updateToolbar();
-      }
-    break;
-    case 1: // Node.ELEMENT_NODE
-      if ( toBeInserted.nodeType == 11 /* Node.DOCUMENT_FRAGMENT_NODE */ )
-      {
-        selnode = selnode.firstChild;
-      }
-      node.insertBefore(toBeInserted, node.childNodes[pos]);
-      this.selectNodeContents(selnode);
-      this.updateToolbar();
-    break;
-  }
-};
-  
-/** Get the parent element of the supplied or current selection. 
- *  @param   sel optional selection as returned by getSelection
- *  @returns DomNode
- */
- 
-Xinha.prototype.getParentElement = function(sel)
-{
-  if ( typeof sel == 'undefined' )
-  {
-    sel = this.getSelection();
-  }
-  var range = this.createRange(sel);
-  try
-  {
-    var p = range.commonAncestorContainer;
-    if ( !range.collapsed && range.startContainer == range.endContainer &&
-        range.startOffset - range.endOffset <= 1 && range.startContainer.hasChildNodes() )
-    {
-      p = range.startContainer.childNodes[range.startOffset];
-    }
-
-    while ( p.nodeType == 3 )
-    {
-      p = p.parentNode;
-    }
-    return p;
-  }
-  catch (ex)
-  {
-    return null;
-  }
-};
-
-/**
- * Returns the selected element, if any.  That is,
- * the element that you have last selected in the "path"
- * at the bottom of the editor, or a "control" (eg image)
- *
- * @returns null | DomNode
- */
-
-Xinha.prototype.activeElement = function(sel)
-{
-  if ( ( sel === null ) || this.selectionEmpty(sel) )
-  {
-    return null;
-  }
-
-  // For Mozilla we just see if the selection is not collapsed (something is selected)
-  // and that the anchor (start of selection) is an element.  This might not be totally
-  // correct, we possibly should do a simlar check to IE?
-  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 sel.anchorNode.parentNode;
-    }
-  }
-  return null;
-};
-
-/** 
- * Determines if the given selection is empty (collapsed).
- * @param selection Selection object as returned by getSelection
- * @returns true|false
- */
- 
-Xinha.prototype.selectionEmpty = function(sel)
-{
-  if ( !sel )
-  {
-    return true;
-  }
-
-  if ( typeof sel.isCollapsed != 'undefined' )
-  {      
-    return sel.isCollapsed;
-  }
-
-  return true;
-};
-
-/** 
- * Returns a range object to be stored 
- * and later restored with Xinha.prototype.restoreSelection()
- * 
- * @returns Range
- */
-Xinha.prototype.saveSelection = function()
-{
-  return this.createRange(this.getSelection()).cloneRange();
-}
-/** 
- * Restores a selection previously stored
- * @param savedSelection Range object as returned by Xinha.prototype.restoreSelection()
- */
-Xinha.prototype.restoreSelection = function(savedSelection)
-{
-  try 
-  {
-  var sel = this.getSelection();
-  sel.removeAllRanges();
-  sel.addRange(savedSelection);
-  }
-  catch (e) {}
-}
-/**
- * Selects the contents of the given node.  If the node is a "control" type element, (image, form input, table)
- * the node itself is selected for manipulation.
- *
- * @param node DomNode 
- * @param collapseToStart A boolean that, when supplied, says to collapse the selection. True collapses to the start, and false to the end.
- */
- 
-Xinha.prototype.selectNodeContents = function(node, collapseToStart)
-{
-  this.focusEditor();
-  this.forceRedraw();
-  var range;
-  var collapsed = typeof collapseToStart == "undefined" ? true : false;
-  var sel = this.getSelection();
-  range = this._doc.createRange();
-  if ( !node )
-  {
-     sel.removeAllRanges();
-     return;
-  }
-  // Tables and Images get selected as "objects" rather than the text contents
-  if ( collapsed && node.tagName && node.tagName.toLowerCase().match(/table|img|input|textarea|select/) )
-  {
-    range.selectNode(node);
-  }
-  else
-  {
-    range.selectNodeContents(node);
-  }
-  sel.removeAllRanges();
-  sel.addRange(range);
-  if (typeof collapseToStart != "undefined")
-  {
-    if (collapseToStart)
-    {
-      sel.collapse(range.startContainer, range.startOffset);
-    } else
-    {
-      sel.collapse(range.endContainer, range.endOffset);
-    }
-  }
-};
-  
-/** Insert HTML at the current position, deleting the selection if any. 
- *  
- *  @param html string
- */
- 
-Xinha.prototype.insertHTML = function(html)
-{
-  var sel = this.getSelection();
-  var range = this.createRange(sel);
-  this.focusEditor();
-  // construct a new document fragment with the given HTML
-  var fragment = this._doc.createDocumentFragment();
-  var div = this._doc.createElement("div");
-  div.innerHTML = html;
-  while ( div.firstChild )
-  {
-    // the following call also removes the node from div
-    fragment.appendChild(div.firstChild);
-  }
-  // this also removes the selection
-  var node = this.insertNodeAtSelection(fragment);
-};
-
-/** Get the HTML of the current selection.  HTML returned has not been passed through outwardHTML.
- *
- * @returns string
- */
- 
-Xinha.prototype.getSelectedHTML = function()
-{
-  var sel = this.getSelection();
-  if (sel.isCollapsed) return '';
-  var range = this.createRange(sel);
-  return Xinha.getHTML(range.cloneContents(), false, this);
-};
-  
-
-/** Get a Selection object of the current selection.  Note that selection objects are browser specific.
- *
- * @returns Selection
- */
- 
-Xinha.prototype.getSelection = function()
-{
-  return this._iframe.contentWindow.getSelection();
-};
-  
-/** Create a Range object from the given selection.  Note that range objects are browser specific.
- *
- *  @param sel Selection object (see getSelection)
- *  @returns Range
- */
- 
-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();
-  }
-};
-
-/** Due to browser differences, some keys which Xinha prefers to call a keyPress
- *   do not get an actual keypress event.  This browser specific function 
- *   overridden in the browser's engine (eg modules/WebKit/WebKit.js) as required
- *   takes a keydown event type and tells us if we should treat it as a 
- *   keypress event type.
- *
- *  To be clear, the keys we are interested here are
- *        Escape, Tab, Backspace, Delete, Enter
- *   these are "non printable" characters which we still want to regard generally
- *   as a keypress.  
- * 
- *  If the browser does not report these as a keypress
- *   ( https://dvcs.w3.org/hg/d4e/raw-file/tip/key-event-test.html )
- *   then this function must return true for such keydown events as it is
- *   given.
- * 
- * @param KeyboardEvent with keyEvent.type == keydown
- * @return boolean
- */
-
-Xinha.prototype.isKeyDownThatShouldGetButDoesNotGetAKeyPressEvent = function(keyEvent)
-{
-  // Dom 3
-  if(typeof keyEvent.key != 'undefined')
-  {
-    // Found using IE11 (which uses Gecko)
-    //   this seems to be a reasonable way to distinguish
-    //   between IE11 and other Gecko browsers which do 
-    //   not provide the "Old DOM3" .char property
-    if(typeof keyEvent.char != 'undefined')
-    {
-      if(typeof Xinha.DOM3_IE11_KeyDownKeyPress_RE == 'undefined')
-      {
-        // I don't know if pre-defining this is really faster in the modern world of
-        //  Javascript JIT compiling, but it does no harm
-        Xinha.DOM3_IE11_KeyDownKeyPress_RE = /^(Tab|Backspace|Del)/;
-      }
-      
-      if(Xinha.DOM3_IE11_KeyDownKeyPress_RE.test(keyEvent.key))
-      {
-        return true;
-      }
-    }
-    
-    // Firefox reports everything we need as a keypress
-    // correctly (in terms of Xinha)
-  }
-  // Legacy
-  else
-  {
-    // Even very old firefox reports everything we need as a keypress
-    // correctly (in terms of Xinha)
-  }
-};
-
-/** Return the character (as a string) of a keyEvent  - ie, press the 'a' key and
- *  this method will return 'a', press SHIFT-a and it will return 'A'.
- * 
- *  @param   keyEvent
- *  @returns string
- */
-
-Xinha.prototype.getKey = function(keyEvent)
-{ 
-  // DOM3 Key is easy (ish)
-  if(typeof keyEvent.key != 'undefined' && keyEvent.key.length > 0)
-  {
-    switch(keyEvent.key)
-    {
-      case 'Unidentified':
-        // Some old Gecko version reports Shift-Tab as Unidentified
-        if(typeof keyEvent.keyCode != 'undefined' && keyEvent.keyCode == 9) return 'Tab';
-        
-        // Otherwise not know
-        return '';
-        
-      case 'Spacebar': // FF<37
-        return ' '; 
-    }
-    
-    return keyEvent.key;
-  }
-  // If charCode is specified, that's what we want
-  else if(keyEvent.charCode)
-  {
-    return String.fromCharCode(keyEvent.charCode);
-  }
-  // Safari does not set charCode if CTRL is pressed
-  //  but does set keyCode to the key, it also sets keyCode
-  //  for the actual pressing of ctrl, skip that
-  //  the keyCode in Safari si the uppercase character's code 
-  //  for that key, so if shift is not pressed, lowercase it
-  else if(keyEvent.ctrlKey && keyEvent.keyCode != 17)
-  {
-    if(keyEvent.shiftKey)
-    {
-      return String.fromCharCode(keyEvent.keyCode);
-    }
-    else
-    {
-      return String.fromCharCode(keyEvent.keyCode).toLowerCase();
-    }
-  }
-  
-  // Ok, give up, no idea!
-  return '';
-}
-
-/** Return the HTML string of the given Element, including the Element.
- * 
- * @param element HTML Element DomNode
- * @returns string
- */
- 
-Xinha.getOuterHTML = function(element)
-{
-  return (new XMLSerializer()).serializeToString(element);
-};
-
-//Control character for retaining edit location when switching modes
-Xinha.cc = String.fromCharCode(8286); 
-
-Xinha.prototype.setCC = function ( target )
-{
-  var cc = Xinha.cc;
-  try
-  {
-    if ( target == "textarea" )
-    {
-      var ta = this._textArea;
-      var index = ta.selectionStart;
-      var before = ta.value.substring( 0, index )
-      var after = ta.value.substring( index, ta.value.length );
-
-      if ( after.match(/^[^<]*>/) ) // make sure cursor is in an editable area (outside tags, script blocks, entities, and inside the body)
-      {
-        var tagEnd = after.indexOf(">") + 1;
-        ta.value = before + after.substring( 0, tagEnd ) + cc + after.substring( tagEnd, after.length );
-      }
-      else ta.value = before + cc + after;
-      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 ( target )
-{
-  if ( target == 'textarea' )
-  {
-  var ta = this._textArea;
-  var pos = ta.value.indexOf( Xinha.cc );
-  if ( pos == -1 ) return;
-  var end = pos + Xinha.cc.length;
-  var before =  ta.value.substring( 0, pos );
-  var after = ta.value.substring( end, ta.value.length );
-  ta.value = before ;
-
-  ta.scrollTop = ta.scrollHeight;
-  var scrollPos = ta.scrollTop;
-  
-  ta.value += after;
-  ta.setSelectionRange(pos,pos);
-
-  ta.focus();
-  
-  ta.scrollTop = scrollPos;
-
-  }
-  else
-  {
-    try
-    {
-      var doc = this._doc; 
-      doc.body.innerHTML = doc.body.innerHTML.replace(new RegExp(Xinha.cc),'<span id="XinhaEditingPostion"></span>');
-      var posEl = doc.getElementById('XinhaEditingPostion');
-      this.selectNodeContents(posEl);
-      this.scrollToElement(posEl);
-      posEl.parentNode.removeChild(posEl);
-
-      this._iframe.contentWindow.focus();
-    } catch (e) {}
-  }
-};
-/*--------------------------------------------------------------------------*/
-/*------------ EXTEND SOME STANDARD "Xinha.prototype" METHODS --------------*/
-/*--------------------------------------------------------------------------*/
-
-Xinha.prototype._standardToggleBorders = Xinha.prototype._toggleBorders;
-Xinha.prototype._toggleBorders = function()
-{
-  var result = this._standardToggleBorders();
-  
-  // flashing the display forces moz to listen (JB:18-04-2005) - #102
-  var tables = this._doc.getElementsByTagName('TABLE');
-  for(var i = 0; i < tables.length; i++)
-  {
-    tables[i].style.display="none";
-    tables[i].style.display="table";
-  }
-  
-  return result;
-};
-
-/** Return the doctype of a document, if set
- * 
- * @param doc DOM element document
- * @returns string the actual doctype
- */
-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-1.5.1/modules/Gecko/lang/lc_base.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/modules/Gecko/lang/lc_base.js
deleted file mode 100644
index 7364044..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/modules/Gecko/lang/lc_base.js
+++ /dev/null
@@ -1,25 +0,0 @@
-// I18N constants
-//
-// LANG: "en", ENCODING: UTF-8
-// Author: Translator-Name, <email@example.com>
-//
-// Last revision: 2018-04-12
-// 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).
-//
-// (Please, remove information below)
-// 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.)
-
-{
-    "The Paste button does not work in this browser for security reasons. Press CTRL-V on your keyboard to paste directly.": ""
-}
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/modules/Gecko/paraHandlerBest.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/modules/Gecko/paraHandlerBest.js
deleted file mode 100644
index 318c519..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/modules/Gecko/paraHandlerBest.js
+++ /dev/null
@@ -1,911 +0,0 @@
-// tabs 2
-
-/**
-* @fileoverview By Adam Wright, for The University of Western Australia
-*
-* Distributed under the same terms as Xinha itself.
-* This notice MUST stay intact for use (see license.txt).
-*
-* Heavily modified by Yermo Lamers of DTLink, LLC, College Park, Md., USA.
-* For more info see http://www.areaedit.com
-*/
-
-/**
-* plugin Info
-*/
-
-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"
-};
-
-// ------------------------------------------------------------------
-
-// "constants"
-
-/**
-* Whitespace Regex
-*/
-
-EnterParagraphs.prototype._whiteSpace = /^\s*$/;
-
-/**
-* The pragmatic list of which elements a paragraph may not contain
-*/
-
-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;
-
-/**
-* elements which may contain a paragraph
-*/
-
-EnterParagraphs.prototype._pContainers = /^(body|del|div|fieldset|form|ins|map|noscript|object|td|th)$/i;
-
-/**
-* Elements which may not contain paragraphs, and would prefer a break to being split
-*/
-
-EnterParagraphs.prototype._pBreak = /^(address|pre|blockquote)$/i;
-
-/**
-* Elements which may not contain children
-*/
-
-EnterParagraphs.prototype._permEmpty = /^(area|base|basefont|br|col|frame|hr|img|input|isindex|link|meta|param)$/i;
-
-/**
-* Elements which count as content, as distinct from whitespace or containers
-*/
-
-EnterParagraphs.prototype._elemSolid = /^(applet|br|button|hr|img|input|table)$/i;
-
-/**
-* Elements which should get a new P, before or after, when enter is pressed at either end
-*/
-
-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;
-
-/**
-* Elements which should get a new P, before or after a close parent, when enter is pressed at either end
-*/
-
-EnterParagraphs.prototype._pifyParent = /^(dd|dt|li|td|th|tr)$/i;
-
-// ---------------------------------------------------------------------
-
-/**
-* EnterParagraphs Constructor
-*/
-
-function EnterParagraphs(editor)
-{
-  
-  this.editor = editor;
-  
-  // hook into the event handler to intercept key presses if we are using
-  // gecko (Mozilla/FireFox)
-  if (Xinha.is_gecko)
-  {
-    this.onKeyPress = this.__onKeyPress;
-  }
-  
-}	// end of constructor.
-
-// ------------------------------------------------------------------
-
-/**
-* name member for debugging
-*
-* This member is used to identify objects of this class in debugging
-* messages.
-*/
-EnterParagraphs.prototype.name = "EnterParagraphs";
-
-/**
-* Gecko's a bit lacking in some odd ways...
-*/
-EnterParagraphs.prototype.insertAdjacentElement = function(ref,pos,el)
-{
-  if ( pos == 'BeforeBegin' )
-  {
-    ref.parentNode.insertBefore(el,ref);
-  }
-  else if ( pos == 'AfterEnd' )
-  {
-    ref.nextSibling ? ref.parentNode.insertBefore(el,ref.nextSibling) : ref.parentNode.appendChild(el);
-  }
-  else if ( pos == 'AfterBegin' && ref.firstChild )
-  {
-    ref.insertBefore(el,ref.firstChild);
-  }
-  else if ( pos == 'BeforeEnd' || pos == 'AfterBegin' )
-  {
-    ref.appendChild(el);
-  }
-  
-};	// end of insertAdjacentElement()
-
-// ----------------------------------------------------------------
-
-/**
-* Passes a global parent node or document fragment to forEachNode
-*
-* @param root node root node to start search from.
-* @param mode string function to apply to each node.
-* @param direction string traversal direction "ltr" (left to right) or "rtl" (right_to_left)
-* @param init boolean
-*/
-
-EnterParagraphs.prototype.forEachNodeUnder = function ( root, mode, direction, init )
-{
-  
-  // Identify the first and last nodes to deal with
-  var start, end;
-  
-  // nodeType 11 is DOCUMENT_FRAGMENT_NODE which is a container.
-  if ( root.nodeType == 11 && root.firstChild )
-  {
-    start = root.firstChild;
-    end = root.lastChild;
-  }
-  else
-  {
-    start = end = root;
-  }
-  // traverse down the right hand side of the tree getting the last child of the last
-  // child in each level until we reach bottom.
-  while ( end.lastChild )
-  {
-    end = end.lastChild;
-  }
-  
-  return this.forEachNode( start, end, mode, direction, init);
-  
-};	// end of forEachNodeUnder()
-
-// -----------------------------------------------------------------------
-
-/**
-* perform a depth first descent in the direction requested.
-*
-* @param left_node node "start node"
-* @param right_node node "end node"
-* @param mode string function to apply to each node. cullids or emptyset.
-* @param direction string traversal direction "ltr" (left to right) or "rtl" (right_to_left)
-* @param init boolean or object.
-*/
-
-EnterParagraphs.prototype.forEachNode = function (left_node, right_node, mode, direction, init)
-{
-  
-  // returns "Brother" node either left or right.
-  var getSibling = function(elem, direction)
-	{
-    return ( direction == "ltr" ? elem.nextSibling : elem.previousSibling );
-	};
-  
-  var getChild = function(elem, direction)
-	{
-    return ( direction == "ltr" ? elem.firstChild : elem.lastChild );
-	};
-  
-  var walk, lookup, fnReturnVal;
-  
-  // FIXME: init is a boolean in the emptyset case and an object in
-  // the cullids case. Used inconsistently.
-  
-  var next_node = init;
-  
-  // used to flag having reached the last node.
-  
-  var done_flag = false;
-  
-  // loop ntil we've hit the last node in the given direction.
-  // if we're going left to right that's the right_node and visa-versa.
-  
-  while ( walk != direction == "ltr" ? right_node : left_node )
-  {
-    
-    // on first entry, walk here is null. So this is how
-    // we prime the loop with the first node.
-    
-    if ( !walk )
-    {
-      walk = direction == "ltr" ? left_node : right_node;
-    }
-    else
-    {
-      
-      // is there a child node?
-      
-      if ( getChild(walk,direction) )
-      {
-        
-        // descend down into the child.
-        
-        walk = getChild(walk,direction);
-        
-      }
-      else
-      {
-        
-        // is there a sibling node on this level?
-        
-        if ( getSibling(walk,direction) )
-        {
-          // move to the sibling.
-          walk = getSibling(walk,direction); 
-        }
-        else
-        {
-          lookup = walk;
-          
-          // climb back up the tree until we find a level where we are not the end
-          // node on the level (i.e. that we have a sibling in the direction
-            // we are searching) or until we reach the end.
-          
-          while ( !getSibling(lookup,direction) && lookup != (direction == "ltr" ? right_node : left_node) )
-          {
-            lookup = lookup.parentNode;
-          }
-          
-          // did we find a level with a sibling?
-          
-          // walk = ( lookup.nextSibling ? lookup.nextSibling : lookup ) ;
-          
-          walk = ( getSibling(lookup,direction) ? getSibling(lookup,direction) : lookup ) ;
-          
-        }
-      }
-      
-    }	// end of else walk.
-    
-    // have we reached the end? either as a result of the top while loop or climbing
-    // back out above.
-    
-    done_flag = (walk==( direction == "ltr" ? right_node : left_node));
-    
-    // call the requested function on the current node. Functions
-    // return an array.
-    //
-    // Possible functions are _fenCullIds, _fenEmptySet
-    //
-    // The situation is complicated by the fact that sometimes we want to
-    // return the base node and sometimes we do not.
-    //
-    // next_node can be an object (this.takenIds), a node (text, el, etc) or false.
-    
-    switch( mode )
-    {
-      
-    case "cullids":
-      
-      fnReturnVal = this._fenCullIds(walk, next_node );
-      break;
-      
-    case "find_fill":
-      
-      fnReturnVal = this._fenEmptySet(walk, next_node, mode, done_flag);
-      break;
-      
-    case "find_cursorpoint":
-      
-      fnReturnVal = this._fenEmptySet(walk, next_node, mode, done_flag);
-      break;
-      
-    }
-    
-    // If this node wants us to return, return next_node
-    
-    if ( fnReturnVal[0] )
-    {
-      return fnReturnVal[1];
-    }
-    
-    // are we done with the loop?
-    
-    if ( done_flag )
-    {
-      break;
-    }
-    
-    // Otherwise, pass to the next node
-    
-    if ( fnReturnVal[1] )
-    {
-      next_node = fnReturnVal[1];
-    }
-    
-  }	// end of while loop
-  
-  return false;
-  
-};	// end of forEachNode()
-
-// -------------------------------------------------------------------
-
-/**
-* Find a post-insertion node, only if all nodes are empty, or the first content
-*
-* @param node node current node beinge examined.
-* @param next_node node next node to be examined.
-* @param node string "find_fill" or "find_cursorpoint"
-* @param last_flag boolean is this the last node?
-*/
-
-EnterParagraphs.prototype._fenEmptySet = function( node, next_node, mode, last_flag)
-{
-  
-  // Mark this if it's the first base
-  
-  if ( !next_node && !node.firstChild )
-  {
-    next_node = node;
-  }
-  
-  // Is it an element node and is it considered content? (br, hr, etc)
-  // or is it a text node that is not just whitespace?
-  // or is it not an element node and not a text node?
-  
-  if ( (node.nodeType == 1 && this._elemSolid.test(node.nodeName)) ||
-    (node.nodeType == 3 && !this._whiteSpace.test(node.nodeValue)) ||
-  (node.nodeType != 1 && node.nodeType != 3) )
-  {
-    
-    switch( mode )
-    {
-      
-    case "find_fill":
-      
-      // does not return content.
-      
-      return new Array(true, false );
-      break;
-      
-    case "find_cursorpoint":
-      
-      // returns content
-      
-      return new Array(true, node );
-      break;
-      
-    }
-    
-  }
-  
-  // In either case (fill or findcursor) we return the base node. The avoids
-  // problems in terminal cases (beginning or end of document or container tags)
-  
-  if ( last_flag )
-  {
-    return new Array( true, next_node );
-  }
-  
-  return new Array( false, next_node );
-  
-};	// end of _fenEmptySet()
-
-// ------------------------------------------------------------------------------
-
-/**
-* remove duplicate Id's.
-*
-* @param ep_ref enterparagraphs reference to enterparagraphs object
-*/
-
-EnterParagraphs.prototype._fenCullIds = function ( ep_ref, node, pong )
-{
-  
-  // Check for an id, blast it if it's in the store, otherwise add it
-  
-  if ( node.id )
-  {
-    
-    pong[node.id] ? node.id = '' : pong[node.id] = true;
-  }
-  
-  return new Array(false,pong);
-  
-};
-
-// ---------------------------------------------------------------------------------
-
-/**
-* Grabs a range suitable for paragraph stuffing
-*
-* @param rng Range
-* @param search_direction string "left" or "right"
-*
-* @todo check blank node issue in roaming loop.
-*/
-
-EnterParagraphs.prototype.processSide = function( rng, search_direction)
-{
-  
-  var next = function(element, search_direction)
-	{
-    return ( search_direction == "left" ? element.previousSibling : element.nextSibling );
-	};
-  
-  var node = search_direction == "left" ? rng.startContainer : rng.endContainer;
-  var offset = search_direction == "left" ? rng.startOffset : rng.endOffset;
-  var roam, start = node;
-  
-  // Never start with an element, because then the first roaming node might
-  // be on the exclusion list and we wouldn't know until it was too late
-  
-  while ( start.nodeType == 1 && !this._permEmpty.test(start.nodeName) )
-  {
-    start = ( offset ? start.lastChild : start.firstChild );
-  }
-  
-  // Climb the tree, left or right, until our course of action presents itself
-  //
-  // if roam is NULL try start.
-  // if roam is NOT NULL, try next node in our search_direction
-  // If that node is NULL, get our parent node.
-  //
-  // If all the above turns out NULL end the loop.
-  //
-  // FIXME: gecko (firefox 1.0.3) - enter "test" into an empty document and press enter.
-  // sometimes this loop finds a blank text node, sometimes it doesn't.
-  
-  while ( roam = roam ? ( next(roam,search_direction) ? next(roam,search_direction) : roam.parentNode ) : start )
-  {
-    
-    // next() is an inline function defined above that returns the next node depending
-    // on the direction we're searching.
-    
-    if ( next(roam,search_direction) )
-    {
-      
-      // If the next sibling's on the exclusion list, stop before it
-      
-      if ( this._pExclusions.test(next(roam,search_direction).nodeName) )
-      {
-        
-        return this.processRng(rng, search_direction, roam, next(roam,search_direction), (search_direction == "left"?'AfterEnd':'BeforeBegin'), true, false);
-      }
-    }
-    else
-    {
-      
-      // If our parent's on the container list, stop inside it
-      
-      if (this._pContainers.test(roam.parentNode.nodeName))
-      {
-        
-        return this.processRng(rng, search_direction, roam, roam.parentNode, (search_direction == "left"?'AfterBegin':'BeforeEnd'), true, false);
-      }
-      else if (this._pExclusions.test(roam.parentNode.nodeName))
-      {
-        
-        // chop without wrapping
-        
-        if (this._pBreak.test(roam.parentNode.nodeName))
-        {
-          
-          return this.processRng(rng, search_direction, roam, roam.parentNode,
-            (search_direction == "left"?'AfterBegin':'BeforeEnd'), false, (search_direction == "left" ?true:false));
-        }
-        else
-        {
-          
-          // the next(roam,search_direction) in this call is redundant since we know it's false
-          // because of the "if next(roam,search_direction)" above.
-          //
-          // the final false prevents this range from being wrapped in <p>'s most likely
-          // because it's already wrapped.
-          
-          return this.processRng(rng,
-            search_direction,
-            (roam = roam.parentNode),
-            (next(roam,search_direction) ? next(roam,search_direction) : roam.parentNode),
-            (next(roam,search_direction) ? (search_direction == "left"?'AfterEnd':'BeforeBegin') : (search_direction == "left"?'AfterBegin':'BeforeEnd')),
-            false,
-            false);
-        }
-      }
-    }
-  }
-  
-};	// end of processSide()
-
-// ------------------------------------------------------------------------------
-
-/**
-* processRng - process Range.
-*
-* Neighbour and insertion identify where the new node, roam, needs to enter
-* the document; landmarks in our selection will be deleted before insertion
-*
-* @param rn Range original selected range
-* @param search_direction string Direction to search in.
-* @param roam node
-* @param insertion string may be AfterBegin of BeforeEnd
-* @return array
-*/
-
-EnterParagraphs.prototype.processRng = function(rng, search_direction, roam, neighbour, insertion, pWrap, preBr)
-{
-  var node = search_direction == "left" ? rng.startContainer : rng.endContainer;
-  var offset = search_direction == "left" ? rng.startOffset : rng.endOffset;
-  
-  // Define the range to cut, and extend the selection range to the same boundary
-  
-  var editor = this.editor;
-  var newRng = editor._doc.createRange();
-  
-  newRng.selectNode(roam);
-  // extend the range in the given direction.
-  
-  if ( search_direction == "left")
-  {
-    newRng.setEnd(node, offset);
-    rng.setStart(newRng.startContainer, newRng.startOffset);
-  }
-  else if ( search_direction == "right" )
-  {
-    
-    newRng.setStart(node, offset);
-    rng.setEnd(newRng.endContainer, newRng.endOffset);
-  }
-  // Clone the range and remove duplicate ids it would otherwise produce
-  
-  var cnt = newRng.cloneContents();
-  
-  // in this case "init" is an object not a boolen.
-  
-  this.forEachNodeUnder( cnt, "cullids", "ltr", this.takenIds, false, false);
-  
-  // Special case, for inserting paragraphs before some blocks when caret is at
-  // their zero offset.
-  //
-  // Used to "open up space" in front of a list, table. Usefull if the list is at
-  // the top of the document. (otherwise you'd have no way of "moving it down").
-  
-  var pify, pifyOffset, fill;
-  pify = search_direction == "left" ? (newRng.endContainer.nodeType == 3 ? true:false) : (newRng.startContainer.nodeType == 3 ? false:true);
-  pifyOffset = pify ? newRng.startOffset : newRng.endOffset;
-  pify = pify ? newRng.startContainer : newRng.endContainer;
-  
-  if ( this._pifyParent.test(pify.nodeName) && pify.parentNode.childNodes.item(0) == pify )
-  {
-    while ( !this._pifySibling.test(pify.nodeName) )
-    {
-      pify = pify.parentNode;
-    }
-  }
-  
-  // NODE TYPE 11 is DOCUMENT_FRAGMENT NODE
-  // I do not profess to understand any of this, simply applying a patch that others say is good - ticket:446
-  if ( cnt.nodeType == 11 && !cnt.firstChild)
-  {	
-    if (pify.nodeName != "BODY" || (pify.nodeName == "BODY" && pifyOffset != 0)) 
-    { //WKR: prevent body tag in empty doc
-      cnt.appendChild(editor._doc.createElement(pify.nodeName));
-    }
-  }
-  
-  // YmL: Added additional last parameter for fill case to work around logic
-  // error in forEachNode()
-  
-  fill = this.forEachNodeUnder(cnt, "find_fill", "ltr", false );
-  
-  if ( fill &&
-    this._pifySibling.test(pify.nodeName) &&
-  ( (pifyOffset == 0) || ( pifyOffset == 1 && this._pifyForced.test(pify.nodeName) ) ) )
-  {
-    
-    roam = editor._doc.createElement( 'p' );
-    roam.innerHTML = "&nbsp;";
-    
-    // roam = editor._doc.createElement('p');
-    // roam.appendChild(editor._doc.createElement('br'));
-    
-    // for these cases, if we are processing the left hand side we want it to halt
-    // processing instead of doing the right hand side. (Avoids adding another <p>&nbsp</p>
-      // after the list etc.
-      
-      if ((search_direction == "left" ) && pify.previousSibling)
-      {
-        
-        return new Array(pify.previousSibling, 'AfterEnd', roam);
-      }
-      else if (( search_direction == "right") && pify.nextSibling)
-      {
-        
-        return new Array(pify.nextSibling, 'BeforeBegin', roam);
-      }
-      else
-      {
-        
-        return new Array(pify.parentNode, (search_direction == "left"?'AfterBegin':'BeforeEnd'), roam);
-      }
-      
-  }
-  
-  // If our cloned contents are 'content'-less, shove a break in them
-  
-  if ( fill )
-  {
-    
-    // Ill-concieved?
-    //
-    // 3 is a TEXT node and it should be empty.
-    //
-    
-    if ( fill.nodeType == 3 )
-    {
-      // fill = fill.parentNode;
-      
-      fill = editor._doc.createDocumentFragment();
-    }
-    
-    if ( (fill.nodeType == 1 && !this._elemSolid.test()) || fill.nodeType == 11 )
-    {
-      
-      // FIXME:/CHECKME: When Xinha is switched from WYSIWYG to text mode
-      // Xinha.getHTMLWrapper() will strip out the trailing br. Not sure why.
-      
-      // fill.appendChild(editor._doc.createElement('br'));
-      
-      var pterminator = editor._doc.createElement( 'p' );
-      pterminator.innerHTML = "&nbsp;";
-      
-      fill.appendChild( pterminator );
-      
-    }
-    else
-    {
-      
-      // fill.parentNode.insertBefore(editor._doc.createElement('br'),fill);
-      
-      var pterminator = editor._doc.createElement( 'p' );
-      pterminator.innerHTML = "&nbsp;";
-      
-      fill.parentNode.insertBefore(parentNode,fill);
-      
-    }
-  }
-  
-  // YmL: If there was no content replace with fill
-  // (previous code did not use fill and we ended up with the
-    // <p>test</p><p></p> because Gecko was finding two empty text nodes
-    // when traversing on the right hand side of an empty document.
-    
-    if ( fill )
-    {
-      
-      roam = fill;
-    }
-    else
-    {
-      // And stuff a shiny new object with whatever contents we have
-      
-      roam = (pWrap || (cnt.nodeType == 11 && !cnt.firstChild)) ? editor._doc.createElement('p') : editor._doc.createDocumentFragment();
-      roam.appendChild(cnt);
-    }
-    
-    if (preBr)
-    {
-      roam.appendChild(editor._doc.createElement('br'));
-    }
-    // Return the nearest relative, relative insertion point and fragment to insert
-    
-    return new Array(neighbour, insertion, roam);
-    
-};	// end of processRng()
-
-// ----------------------------------------------------------------------------------
-
-/**
-* are we an <li> that should be handled by the browser?
-*
-* there is no good way to "get out of" ordered or unordered lists from Javascript.
-* We have to pass the onKeyPress 13 event to the browser so it can take care of
-* getting us "out of" the list.
-*
-* The Gecko engine does a good job of handling all the normal <li> cases except the "press
-* enter at the first position" where we want a <p>&nbsp</p> inserted before the list. The
-* built-in behavior is to open up a <li> before the current entry (not good).
-*
-* @param rng Range range.
-*/
-
-EnterParagraphs.prototype.isNormalListItem = function(rng)
-{
-  
-  var node, listNode;
-  
-  node = rng.startContainer;
-  
-  if (( typeof node.nodeName != 'undefined') &&
-    ( node.nodeName.toLowerCase() == 'li' ))
-  {
-    
-    // are we a list item?
-    
-    listNode = node;
-  }
-  else if (( typeof node.parentNode != 'undefined' ) &&
-    ( typeof node.parentNode.nodeName != 'undefined' ) &&
-  ( node.parentNode.nodeName.toLowerCase() == 'li' ))
-  {
-    
-    // our parent is a list item.
-    
-    listNode = node.parentNode;
-    
-  }
-  else
-  {
-    // neither we nor our parent are a list item. this is not a normal
-    // li case.
-    var listNode = this.editor._getFirstAncestorForNodeAndWhy(node, ["li"])[0];
-    if ( typeof listNode == 'undefined' || !listNode )
-    {
-      return false;
-    }
-  }
-  
-  // at this point we have a listNode. Is it the first list item?
-  
-  if ( ! listNode.previousSibling )
-  {
-    // are we on the first character of the first li?
-    
-    if ( rng.startOffset == 0 )
-    {
-      return false;
-    }
-  }
-  return true;
-  
-};	// end of isNormalListItem()
-
-// ----------------------------------------------------------------------------------
-/**
-* Called when a key is pressed in the editor
-*/
-
-EnterParagraphs.prototype.__onKeyPress = function(ev)
-{
-  
-  // If they've hit enter and shift is not pressed, handle it
-  
-  if (ev.keyCode == 13 && !ev.shiftKey && this.editor._iframe.contentWindow.getSelection)
-  {
-    return this.handleEnter(ev);
-  }
-  
-};	// end of _onKeyPress()
-
-// -----------------------------------------------------------------------------------
-
-/**
-* Handles the pressing of an unshifted enter for Gecko
-*/
-
-EnterParagraphs.prototype.handleEnter = function(ev)
-{
-  
-  var cursorNode;
-  
-  // Grab the selection and associated range
-  
-  var sel = this.editor.getSelection();
-  var rng = this.editor.createRange(sel);
-  
-  // if we are at the end of a list and the node is empty let the browser handle
-  // it to get us out of the list.
-  
-  if ( this.isNormalListItem(rng) )
-  {
-    
-    return true;
-  }
-  
-  // as far as I can tell this isn't actually used.
-  
-  this.takenIds = new Object();
-  
-  // Grab ranges for document re-stuffing, if appropriate
-  //
-  // pStart and pEnd are arrays consisting of
-  // [0] neighbor node
-  // [1] insertion type
-  // [2] roam
-  
-  var pStart = this.processSide(rng, "left");
-  
-  var pEnd = this.processSide(rng, "right");
-  
-  // used to position the cursor after insertion.
-  
-  cursorNode = pEnd[2];
-  
-  // Get rid of everything local to the selection
-  
-  sel.removeAllRanges();
-  rng.deleteContents();
-  
-  // Grab a node we'll have after insertion, since fragments will be lost
-  //
-  // we'll use this to position the cursor.
-  
-  var holdEnd = this.forEachNodeUnder( cursorNode, "find_cursorpoint", "ltr", false, true);
-  
-  if ( ! holdEnd )
-  {
-    alert( "INTERNAL ERROR - could not find place to put cursor after ENTER" );
-  }
-  
-  // Insert our carefully chosen document fragments
-  
-  if ( pStart )
-  {
-    
-    this.insertAdjacentElement(pStart[0], pStart[1], pStart[2]);
-  }
-  
-  if ( pEnd && pEnd.nodeType != 1)
-  {
-    
-    this.insertAdjacentElement(pEnd[0], pEnd[1], pEnd[2]);
-  }
-  
-  // Move the caret in front of the first good text element
-  
-  if ((holdEnd) && (this._permEmpty.test(holdEnd.nodeName) ))
-  {
-    
-    var prodigal = 0;
-    while ( holdEnd.parentNode.childNodes.item(prodigal) != holdEnd )
-    {
-      prodigal++;
-    }
-    
-    sel.collapse( holdEnd.parentNode, prodigal);
-  }
-  else
-  {
-    
-    // holdEnd might be false.
-    
-    try
-    {
-      sel.collapse(holdEnd, 0);
-      
-      // interestingly, scrollToElement() scroll so the top if holdEnd is a text node.
-      
-      if ( holdEnd.nodeType == 3 )
-      {
-        holdEnd = holdEnd.parentNode;
-      }
-      
-      this.editor.scrollElementIntoViewport(holdEnd);
-      //this.editor.scrollToElement(holdEnd);
-    }
-    catch (e)
-    {
-      // we could try to place the cursor at the end of the document.
-    }
-  }
-  
-  this.editor.updateToolbar();
-  
-  Xinha._stopEvent(ev);
-  
-  return true;
-  
-};	// end of handleEnter()
-
-// END
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/modules/GetHtml/DOMwalk.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/modules/GetHtml/DOMwalk.js
deleted file mode 100644
index 54ec9f4..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/modules/GetHtml/DOMwalk.js
+++ /dev/null
@@ -1,360 +0,0 @@
-
-  /*--------------------------------------:noTabs=true:tabSize=2:indentSize=2:--
-    --  Xinha (is not htmlArea) - http://xinha.gogo.co.nz/
-    --
-    --  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.
-    --
-    --  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.
-    --
-    --  This is the standard implementation of the method for rendering HTML code from the DOM
-    --
-    --  The file is loaded by the Xinha Core when no alternative method (plugin) is loaded.
-    --
-    --
-    --  $HeadURL: http://svn.xinha.org/trunk/modules/GetHtml/DOMwalk.js $
-    --  $LastChangedDate: 2018-02-04 17:28:16 +1300 (Sun, 04 Feb 2018) $
-    --  $LastChangedRevision: 1356 $
-    --  $LastChangedBy: gogo $
-    --------------------------------------------------------------------------*/
-function GetHtmlImplementation(editor) {
-    this.editor = editor;
-}
-
-GetHtmlImplementation._pluginInfo = {
-  name          : "GetHtmlImplementation DOMwalk",
-  origin        : "Xinha Core",
-  version       : "$LastChangedRevision: 1356 $".replace(/^[^:]*:\s*(.*)\s*\$$/, '$1'),
-  developer     : "The Xinha Core Developer Team",
-  developer_url : "$HeadURL: http://svn.xinha.org/trunk/modules/GetHtml/DOMwalk.js $".replace(/^[^:]*:\s*(.*)\s*\$$/, '$1'),
-  sponsor       : "",
-  sponsor_url   : "",
-  license       : "htmlArea"
-};
-
-// Retrieves the HTML code from the given node.	 This is a replacement for
-// getting innerHTML, using standard DOM calls.
-// Wrapper legacy see #442
-Xinha.getHTML = function(root, outputRoot, editor)
-{
-  return Xinha.getHTMLWrapper(root,outputRoot,editor);
-};
-
-Xinha.emptyAttributes = " checked disabled ismap readonly nowrap compact declare selected defer multiple noresize noshade "
-
-Xinha.getHTMLWrapper = function(root, outputRoot, editor, indent)
-{
-  var html = "";
-  if ( !indent )
-  {
-    indent = '';
-  }
-
-  switch ( root.nodeType )
-  {
-    case 10:// Node.DOCUMENT_TYPE_NODE
-    case 6: // Node.ENTITY_NODE
-    case 12:// Node.NOTATION_NODE
-      // this all are for the document type, probably not necessary
-    break;
-
-    case 2: // Node.ATTRIBUTE_NODE
-      // Never get here, this has to be handled in the ELEMENT case because
-      // of IE crapness requring that some attributes are grabbed directly from
-      // the attribute (nodeValue doesn't return correct values), see
-      //http://groups.google.com/groups?hl=en&lr=&ie=UTF-8&oe=UTF-8&safe=off&selm=3porgu4mc4ofcoa1uqkf7u8kvv064kjjb4%404ax.com
-      // for information
-    break;
-
-    case 4: // Node.CDATA_SECTION_NODE
-      // Mozilla seems to convert CDATA into a comment when going into wysiwyg mode,
-      //  don't know about IE
-      html += (Xinha.is_ie ? ('\n' + indent) : '') + '<![CDATA[' + root.data + ']]>' ;
-    break;
-
-    case 5: // Node.ENTITY_REFERENCE_NODE
-      html += '&' + root.nodeValue + ';';
-    break;
-
-    case 7: // Node.PROCESSING_INSTRUCTION_NODE
-      // PI's don't seem to survive going into the wysiwyg mode, (at least in moz)
-      // so this is purely academic
-      html += (Xinha.is_ie ? ('\n' + indent) : '') + '<'+'?' + root.target + ' ' + root.data + ' ?>';
-    break;
-
-    case 1: // Node.ELEMENT_NODE
-    case 11: // Node.DOCUMENT_FRAGMENT_NODE
-    case 9: // Node.DOCUMENT_NODE
-      var closed;
-      var i;
-      var root_tag = (root.nodeType == 1) ? root.tagName.toLowerCase() : '';
-      if ( ( root_tag == "script" || root_tag == "noscript" ) && editor.config.stripScripts )
-      {
-        break;
-      }
-      if ( outputRoot )
-      {
-        outputRoot = !(editor.config.htmlRemoveTags && editor.config.htmlRemoveTags.test(root_tag));
-      }
-      if ( Xinha.is_ie && root_tag == "head" )
-      {
-        if ( outputRoot )
-        {
-          html += (Xinha.is_ie ? ('\n' + indent) : '') + "<head>";
-        }
-        
-        var save_multiline = RegExp.multiline;
-        RegExp.multiline = true;
-        var txt = 
-        root.innerHTML
-        .replace(Xinha.RE_tagName, function(str, p1, p2) { return p1 + p2.toLowerCase(); }) // lowercasize
-        .replace(/\s*=\s*(([^'"][^>\s]*)([>\s])|"([^"]+)"|'([^']+)')/g, '="$2$4$5"$3') //add attribute quotes
-        .replace(/<(link|meta)((\s*\S*="[^"]*")*)>([\n\r]*)/g, '<$1$2 />\n'); //terminate singlet tags
-        RegExp.multiline = save_multiline;
-        html += txt + '\n';
-        if ( outputRoot )
-        {
-          html += (Xinha.is_ie ? ('\n' + indent) : '') + "</head>";
-        }
-        break;
-      }
-      else if ( outputRoot )
-      {
-        closed = (!(root.hasChildNodes() || Xinha.needsClosingTag(root)));
-        html += ((Xinha.isBlockElement(root)) ? ('\n' + indent) : '') + "<" + root.tagName.toLowerCase();
-        var attrs = root.attributes;
-        
-        for ( i = attrs.length-1; i >= 0; --i )
-        {
-          var a = attrs.item(i);
-          // In certain browsers (*cough* firefox) the dom node loses
-          // information if the image is currently broken.  In order to prevent
-          // corrupting the height and width of image tags, we strip height and
-          // width from the image rather than reporting bad information.
-          if (Xinha.is_real_gecko && (root.tagName.toLowerCase() == 'img') &&
-              ((a.nodeName.toLowerCase() == 'height') || (a.nodeName.toLowerCase() == 'width')))
-          {
-            if (!root.complete || root.naturalWidth === 0)
-            {
-              // This means that firefox has been unable to read the dimensions from the actual image
-              continue;
-            }
-          }
-
-          if(root.tagName.toLowerCase() == 'img' && a.nodeName.toLowerCase() == 'complete') continue;
-
-          if (typeof a.nodeValue == 'object' ) continue; // see #684
-          if (root.tagName.toLowerCase() == "input" 
-              && root.type.toLowerCase() == "checkbox" 
-              && a.nodeName.toLowerCase() == "value"
-              && a.nodeValue.toLowerCase() == "on") 
-          {
-            continue;
-          }
-          if ( !a.specified 
-            // IE claims these are !a.specified even though they are.  Perhaps others too?
-            && !(root.tagName.toLowerCase().match(/input|option/) && a.nodeName == 'value')
-            && !(root.tagName.toLowerCase().match(/area/) && a.nodeName.match(/shape|coords/i)) 
-          )
-          {
-            continue;
-          }
-          var name = a.nodeName.toLowerCase();
-          if ( /_moz_editor_bogus_node/.test(name) || ( name == 'class' && a.nodeValue == 'webkit-block-placeholder') )
-          {
-            html = "";
-            break;
-          }
-          if ( /(_moz)|(contenteditable)|(_msh)/.test(name) )
-          {
-            // avoid certain attributes
-            continue;
-          }
-          var value;
-          if ( Xinha.emptyAttributes.indexOf(" "+name+" ") != -1)
-          {
-            value = name;
-          }
-          else if ( name != "style" )
-          {
-            // IE5.5 reports 25 when cellSpacing is
-            // 1; other values might be doomed too.
-            // For this reason we extract the
-            // values directly from the root node.
-            // I'm starting to HATE JavaScript
-            // development.  Browser differences
-            // suck.
-            //
-            // If you have a percent width in width/height then we may need to use nodeValue
-            //  it may well be OK to use nodeValue all the time these days, but it's easier
-            //  to just do it for these and not fix what's not broke
-            if(name == "width" || name == "height")
-            {
-              if(a.nodeValue.match(/%$/))
-              {
-                value = a.nodeValue;
-              }
-              else
-              {
-                value = root[a.nodeName];
-              }
-            }
-            // Using Gecko the values of href and src are converted to absolute links
-            // unless we get them using nodeValue()            
-            else if ( typeof root[a.nodeName] != "undefined" && name != "href" && name != "src" && !(/^on/.test(name)) )
-            {
-              value = root[a.nodeName];
-            }
-            else
-            {
-              value = a.nodeValue;
-			  if (name == 'class')
-			  {
-			  	value = value.replace(/Apple-style-span/,'');
-				if (!value) continue;
-			  }
-              // IE seems not willing to return the original values - it converts to absolute
-              // links using a.nodeValue, a.value, a.stringValue, root.getAttribute("href")
-              // So we have to strip the baseurl manually :-/
-              if ( Xinha.is_ie && (name == "href" || name == "src") )
-              {
-                value = editor.stripBaseURL(value);
-              }
-
-              // High-ascii (8bit) characters in links seem to cause problems for some sites,
-              // while this seems to be consistent with RFC 3986 Section 2.4
-              // because these are not "reserved" characters, it does seem to
-              // cause links to international resources not to work.  See ticket:167
-
-              // IE always returns high-ascii characters un-encoded in links even if they
-              // were supplied as % codes (it unescapes them when we pul the value from the link).
-
-              // Hmmm, very strange if we use encodeURI here, or encodeURIComponent in place
-              // of escape below, then the encoding is wrong.  I mean, completely.
-              // Nothing like it should be at all.  Using escape seems to work though.
-              // It's in both browsers too, so either I'm doing something wrong, or
-              // something else is going on?
-
-              if ( editor.config.only7BitPrintablesInURLs && ( name == "href" || name == "src" ) )
-              {
-                value = value.replace(/([^!-~]+)/g, function(match) { return escape(match); });
-              }
-            }
-          }
-          else if ( !Xinha.is_ie )
-          {
-            value = root.style.cssText.replace(/rgb\(.*?\)/ig,function(rgb){ return Xinha._colorToRgb(rgb) });
-          }
-          else if (!value) // IE8 has style in attributes (see below), but it's empty! 
-          {
-            continue;
-          }
-
-/* This looks wrong, http://trac.xinha.org/ticket/1391#comment:7
-          if ( /^(_moz)?$/.test(value) )
-          {
-            // Mozilla reports some special tags
-            // here; we don't need them.
-            continue;
-          }
-*/
-
-          html += " " + name + '="' + Xinha.htmlEncode(value) + '"';
-        }
-        //IE fails to put style in attributes list & cssText is UPPERCASE
-        if ( Xinha.is_ie && root.style.cssText )
-        {
-          html += ' style="' + root.style.cssText.replace(/(^)?([^:]*):(.*?)(;|$)/g, function(m0, m1,m2,m3, m4){return m2.toLowerCase() + ':' + m3 + m4;}) + '"';
-        }
-        if ( Xinha.is_ie && root.tagName.toLowerCase() == "option" && root.selected )
-        {
-          html += ' selected="selected"';
-        }
-        if ( html !== "" )
-        {
-          if ( closed && root_tag=="p" )
-          {
-            //never use <p /> as empty paragraphs won't be visible
-            html += ">&nbsp;</p>";
-          }
-          else if ( closed )
-          {
-            html += " />";
-          }
-          else
-          {
-            html += ">";
-          }
-        }
-      }
-      var containsBlock = false;
-      if ( root_tag == "script" || root_tag == "noscript" )
-      {
-        if ( !editor.config.stripScripts )
-        {
-          if (Xinha.is_ie)
-          {
-            var innerText = "\n" + root.innerHTML.replace(/^[\n\r]*/,'').replace(/\s+$/,'') + '\n' + indent;
-          }
-          else
-          {
-            var innerText = (root.hasChildNodes()) ? root.firstChild.nodeValue : '';
-          }
-          html += innerText + '</'+root_tag+'>' + ((Xinha.is_ie) ? '\n' : '');
-        }
-      }
-      else if (root_tag == "pre")
-      {
-        html += ((Xinha.is_ie) ? '\n' : '') + root.innerHTML.replace(/<br>/g,'\n') + '</'+root_tag+'>';
-      }
-      else
-      {
-        for ( i = root.firstChild; i; i = i.nextSibling )
-        {
-          if ( !containsBlock && i.nodeType == 1 && Xinha.isBlockElement(i) )
-          {
-            containsBlock = true;
-          }
-          html += Xinha.getHTMLWrapper(i, true, editor, indent + '  ');
-        }
-        if ( outputRoot && !closed )
-        {
-          html += (((Xinha.isBlockElement(root) && containsBlock) || root_tag == 'head' || root_tag == 'html') ? ('\n' + indent) : '') + "</" + root.tagName.toLowerCase() + ">";
-        }
-      }
-    break;
-
-    case 3: // Node.TEXT_NODE
-      if ( /^script|noscript|style$/i.test(root.parentNode.tagName) )
-      {
-        html = root.data;
-      }
-      else if(root.data.trim() == '')
-      {
-        if(root.data)
-        {
-          html = ' ';
-        }
-        else
-        {
-          html = '';
-        }
-      }
-      else
-      {
-        html = Xinha.htmlEncode(root.data);
-      }
-    break;
-
-    case 8: // Node.COMMENT_NODE
-      html = "<!--" + root.data + "-->";
-    break;
-  }
-  return html;
-};
-
-
-
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/modules/GetHtml/TransformInnerHTML.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/modules/GetHtml/TransformInnerHTML.js
deleted file mode 100644
index 4361f3f..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/modules/GetHtml/TransformInnerHTML.js
+++ /dev/null
@@ -1,231 +0,0 @@
-/**
-  * Based on XML_Utility functions submitted by troels_kn.
-  * credit also to adios, who helped with reg exps:
-  * http://www.sitepoint.com/forums/showthread.php?t=201052
-  * 
-  * A replacement for Xinha.getHTML
-  *
-  * Features:
-  *   - Generates XHTML code
-  *   - Much faster than Xinha.getHTML
-  *   - Eliminates the hacks to accomodate browser quirks
-  *   - Returns correct code for Flash objects and scripts
-  *   - Formats html in an indented, readable format in html mode
-  *   - Preserves script and pre formatting
-  *   - Preserves formatting in comments
-  *   - Removes contenteditable from body tag in full-page mode
-  *   - Supports only7BitPrintablesInURLs config option
-  *   - Supports htmlRemoveTags config option
-  */
-  
-function GetHtmlImplementation(editor) {
-    this.editor = editor;
-}
-
-GetHtmlImplementation._pluginInfo = {
-	name          : "GetHtmlImplementation TransformInnerHTML",
-	version       : "1.0",
-	developer     : "Nelson Bright",
-	developer_url : "http://www.brightworkweb.com/",
-	sponsor       : "",
-    sponsor_url   : "",
-	license       : "htmlArea"
-};
-
-Xinha.RegExpCache = [
-/*00*/  /<\s*\/?([^\s\/>]+)[\s*\/>]/gi,//lowercase tags
-/*01*/  /(\s+)_moz[^=>]*=[^\s>]*/gi,//strip _moz attributes
-/*02*/  /\s*=\s*(([^'"][^>\s]*)([>\s])|"([^"]+)"|'([^']+)')/g,// find attributes
-/*03*/  /\/>/g,//strip singlet terminators
-/*04*/  /<(br|hr|img|input|link|meta|param|embed|area)((\s*\S*="[^"]*")*)>/g,//terminate singlet tags
-/*05*/  /(<\w+\s+(\w*="[^"]*"\s+)*)(checked|compact|declare|defer|disabled|ismap|multiple|no(href|resize|shade|wrap)|readonly|selected)([\s>])/gi,//expand singlet attributes
-/*06*/  /(="[^']*)'([^'"]*")/,//check quote nesting
-/*07*/  /&(?=(?!(#[0-9]{2,5};|[a-zA-Z0-9]{2,6};|#x[0-9a-fA-F]{2,4};))[^<]*>)/g,//expand query ampersands not in html entities
-/*08*/  /<\s+/g,//strip tagstart whitespace
-/*09*/  /\s+(\/)?>/g,//trim whitespace
-/*10*/  /\s{2,}/g,//trim extra whitespace
-/*11*/  /\s+([^=\s]+)((="[^"]+")|([\s>]))/g,// lowercase attribute names
-/*12*/  /\s+contenteditable(=[^>\s\/]*)?/gi,//strip contenteditable
-/*13*/  /((href|src)=")([^\s]*)"/g, //find href and src for stripBaseHref()
-/*14*/  /<\/?(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,
-/*15*/  /<\/(div|p|h[1-6]|table|tr|ul|ol|dl|blockquote|html|head|body|script|form|select)( [^>]*)?>/g,//blocklevel closing tag
-/*16*/  /<(div|p|h[1-6]|table|tr|ul|ol|dl|blockquote|object|html|head|body|script|form|select)( [^>]*)?>/g,//blocklevel opening tag
-/*17*/  /<(td|th|li|dt|dd|option|br|hr|embed|param|pre|meta|link|title|area|input|textarea)[^>]*>/g,//singlet tag or output on 1 line
-/*18*/  /(^|<\/(pre|script)>)(\s|[^\s])*?(<(pre|script)[^>]*>|$)/g,//find content NOT inside pre and script tags
-/*19*/  /(<pre[^>]*>)([\s\S])*?(<\/pre>)/g,//find content inside pre tags
-/*20*/  /(^|<!--[\s\S]*?-->)([\s\S]*?)(?=<!--[\s\S]*?-->|$)/g,//find content NOT inside comments
-/*21*/  /\S*=""/g, //find empty attributes
-/*22*/  /<!--[\s\S]*?-->|<\?[\s\S]*?\?>|<\/?\w[^>]*>/g, //find all tags, including comments and php
-/*23*/  /(^|<\/script>)[\s\S]*?(<script[^>]*>|$)/g //find content NOT inside script tags
-];
-// compile for performance; WebKit doesn't support this
-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]);
-	}
-}
-
-/** 
-  * Cleans HTML into wellformed xhtml
-  */
-Xinha.prototype.cleanHTML = function(sHtml) {
-	var c = Xinha.RegExpCache;
-	sHtml = sHtml.
-		replace(c[0], function(str) { return str.toLowerCase(); } ).//lowercase tags/attribute names
-		replace(c[1], ' ').//strip _moz attributes
-		replace(c[12], ' ').//strip contenteditable
-		replace(c[2], '="$2$4$5"$3').//add attribute quotes
-		replace(c[21], ' ').//strip empty attributes
-		replace(c[11], function(str, p1, p2) { return ' '+p1.toLowerCase()+p2; }).//lowercase attribute names
-		replace(c[3], '>').//strip singlet terminators
-		replace(c[9], '$1>').//trim whitespace
-		replace(c[5], '$1$3="$3"$5').//expand singlet attributes
-		replace(c[4], '<$1$2 />').//terminate singlet tags
-		replace(c[6], '$1$2').//check quote nesting
-		replace(c[7], '&amp;').//expand query ampersands
-		replace(c[8], '<').//strip tagstart whitespace
-		replace(c[10], ' ');//trim extra whitespace
-	if(Xinha.is_ie && c[13].test(sHtml)) {
-          sHtml = sHtml.replace(c[13],'$1'+Xinha._escapeDollars(this.stripBaseURL(RegExp.$3))+'"');
-	}
-
-	if(this.config.only7BitPrintablesInURLs) {
-		if (Xinha.is_ie) c[13].test(sHtml); // oddly the test below only triggers when we call this once before (IE6), in Moz it fails if tested twice
-		if ( c[13].test(sHtml)) {
-			try { //Mozilla returns an incorrectly encoded value with innerHTML
-                          sHtml = sHtml.replace(c[13], '$1'+Xinha._escapeDollars(decodeURIComponent(RegExp.$3).replace(/([^!-~]+|%[0-9]+)/g, function(chr) 
-                                                                                                                       {return escape(chr);}))+'"');
-			} catch (e) { // once the URL is escape()ed, you can't decodeURIComponent() it anymore
-                          sHtml = sHtml.replace(c[13], '$1'+Xinha._escapeDollars(RegExp.$3.replace(/([^!-~]+|%[0-9]+)/g,function(chr){return escape(chr);})+'"'));
-			}
-		}
-	}
-	return sHtml;
-};
-
-/**
-  * Prettyfies html by inserting linebreaks before tags, and indenting blocklevel tags
-  */
-Xinha.indent = function(s, sindentChar) {
-	Xinha.__nindent = 0;
-	Xinha.__sindent = "";
-	Xinha.__sindentChar = (typeof sindentChar == "undefined") ? "  " : sindentChar;
-	var c = Xinha.RegExpCache;
-	if(Xinha.is_gecko) { //moz changes returns into <br> inside <pre> tags
-		s = s.replace(c[19], function(str){return str.replace(/<br \/>/g,"\n")});
-	}
-	s = s.replace(c[18], function(strn) { //skip pre and script tags
-	  strn = strn.replace(c[20], function(st,$1,$2) { //exclude comments
-		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;
-				// blocklevel openingtag - increase indent
-				Xinha.__sindent += Xinha.__sindentChar;
-				++Xinha.__nindent;
-				return s;
-			} else if (str.match(c[15])) {
-				// blocklevel closingtag - decrease indent
-				--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])) {
-				// singlet tag
-				return "\n" + Xinha.__sindent + str;
-			}
-			return str; // this won't actually happen
-		});
-		return $1 + string;
-	  });return strn;
-    });
-    //final cleanup
-    s = s.replace(/^\s*/,'').//strip leading whitespace
-        replace(/ +\n/g,'\n').//strip spaces at end of lines
-        replace(/[\r\n]+(\s+)<\/script>/g,'\n$1</script>');//strip returns added into scripts
-    return s;
-};
-
-Xinha.getHTML = function(root, outputRoot, editor) {
-	var html = "";
-	var c = Xinha.RegExpCache;
-
-	if(root.nodeType == 11) {//document fragment
-	    //we can't get innerHTML from the root (type 11) node, so we 
-	    //copy all the child nodes into a new div and get innerHTML from the div
-	    var div = document.createElement("div");
-	    var temp = root.insertBefore(div,root.firstChild);
-	    for (j = temp.nextSibling; j; j = j.nextSibling) { 
-	    		temp.appendChild(j.cloneNode(true));
-	    }
-		html += temp.innerHTML.replace(c[23], function(strn) { //skip content inside script tags
-			strn = strn.replace(c[22], function(tag){
-				if(/^<[!\?]/.test(tag)) return tag; //skip comments and php tags
-				else return editor.cleanHTML(tag)});
-			return strn;
-		});
-
-	} else {
-
-		var root_tag = (root.nodeType == 1) ? root.tagName.toLowerCase() : ''; 
-		if (outputRoot) { //only happens with <html> tag in fullpage mode
-			html += "<" + root_tag;
-			var attrs = root.attributes; // strangely, this doesn't work in moz
-			for (i = 0; i < attrs.length; ++i) {
-				var a = attrs.item(i);
-				if (!a.specified) {
-				  continue;
-				}
-				var name = a.nodeName.toLowerCase();
-				var value = a.nodeValue;
-				html += " " + name + '="' + value + '"';
-			}
-			html += ">";
-		}
-		if(root_tag == "html") {
-			innerhtml = editor._doc.documentElement.innerHTML;
-		} else {
-			innerhtml = root.innerHTML;
-		}
-		//pass tags to cleanHTML() one at a time
-		//includes support for htmlRemoveTags config option
-		html += innerhtml.replace(c[23], function(strn) { //skip content inside script tags
-			strn = strn.replace(c[22], function(tag){
-				if(/^<[!\?]/.test(tag)) return tag; //skip comments and php tags
-				else if(!(editor.config.htmlRemoveTags && editor.config.htmlRemoveTags.test(tag.replace(/<([^\s>\/]+)/,'$1'))))
-					return editor.cleanHTML(tag);
-				else return ''});
-			return strn;
-		});
-		//IE drops  all </li>,</dt>,</dd> tags in a list except the last one
-		if(Xinha.is_ie) {
-			html = html.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)
-			html = html.replace(/<br \/>\n$/, ''); //strip trailing <br> added by moz
-		//Cleanup redundant whitespace before </li></dd></dt> in IE and Mozilla
-		html = html.replace(/\s*(<\/(li|dd|dt)>)/g, '$1');
-		if (outputRoot) {
-			html += "</" + root_tag + ">";
-		}
-		html = Xinha.indent(html);
-	};
-//	html = Xinha.htmlEncode(html);
-
-	return html;
-};
-
-/** 
-  * Escapes dollar signs ($) to make them safe to use in regex replacement functions by replacing each $ in the input with $$.
-  * 
-  * This is advisable any time the replacement string for a call to replace() is a variable and could contain dollar signs that should not be interpreted as references to captured groups (e.g., when you want the text "$10" and not the first captured group followed by a 0).
-  * See http://trac.xinha.org/ticket/1337
-  */
-Xinha._escapeDollars = function(str) {
-  return str.replace(/\$/g, "$$$$");
-};
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/modules/GetHtml/lang/pt_br.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/modules/GetHtml/lang/pt_br.js
deleted file mode 100644
index 4568329..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.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-1.5.1/modules/InlineStyler/InlineStyler.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/modules/InlineStyler/InlineStyler.js
deleted file mode 100644
index ec035cd..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/modules/InlineStyler/InlineStyler.js
+++ /dev/null
@@ -1,566 +0,0 @@
-Xinha.InlineStyler = function(element, editor, dialog, doc)
-{
-  this.element = element;
-  this.editor = editor;
-  this.dialog = dialog;
-  this.doc = doc ? doc : document;
-  this.inputs = {
-    styles : {},
-    aux : {}
-  }
-  this.styles = {};
-  this.auxData = {}; //units and such
-}
-
-Xinha.InlineStyler.getLength = function(value)
-{
-  var len = parseInt(value);
-  if (isNaN(len)) 
-  {
-    len = "";
-  }
-  return len;
-};
-
-// Applies the style found in "params" to the given element.
-Xinha.InlineStyler.prototype.applyStyle = function(params, _ifMatchRe, _exceptMatchRe)
-{
-  var element = this.element;
-  var style = element.style;
-
-  for (var i in params) 
-  {
-    if (typeof params[i] == 'function') 
-      continue;
-    if (params[i] != null)
-      var val = params[i].value || params[i];
-    
-    if(_ifMatchRe && !i.match(_ifMatchRe))        continue;
-    if(_exceptMatchRe && i.match(_exceptMatchRe)) continue;
-    
-    switch (i)
-    {
-    case "backgroundImage":
-      if (/\S/.test(val)) 
-      {
-        style.backgroundImage = "url(" + val + ")";
-      }
-      else 
-      {
-        style.backgroundImage = "none";
-      }
-      break;
-    case "borderCollapse":
-      style.borderCollapse = params[i] == "on" ? "collapse" : "separate";
-      break;
-    case "width":
-      if (/\S/.test(val)) 
-      {
-        style.width = val + this.inputs.aux["widthUnit"].value;
-      }
-      else 
-      {
-        style.width = "";
-      }
-      break;
-    case "height":
-      if (/\S/.test(val)) 
-      {
-        style.height = val + this.inputs.aux["heightUnit"].value;
-      }
-      else 
-      {
-        style.height = "";
-      }
-      break;
-    case "textAlign":
-      if (val == "char") 
-      {
-        var ch = this.inputs.aux["textAlignChar"].value;
-        if (ch == '"') 
-        {
-          ch = '\\"';
-        }
-        style.textAlign = '"' + ch + '"';
-      }
-      else 
-        if (val == "-") 
-      {
-        style.textAlign = "";
-      }
-      else 
-      {
-        style.textAlign = val;
-      }
-      break;
-    case "verticalAlign":
-      element.vAlign = "";
-      if (val == "-") 
-      {
-        style.verticalAlign = "";
-        
-      }
-      else 
-      {
-        style.verticalAlign = val;
-      }
-      break;
-    case "float":
-      if (Xinha.is_ie) {
-        style.styleFloat = val;
-      }
-      else {
-        style.cssFloat = val;
-      }
-      break;
-    case "borderWidth":
-      style[i] = val ? val + "px" : '0px';
-      break;
-    default:      
-      style[i] = val;
-      break;
-      // 		    case "f_st_margin":
-      // 			style.margin = val + "px";
-      // 			break;
-      // 		    case "f_st_padding":
-      // 			style.padding = val + "px";
-      // 			break;
-    }
-  }
-};
-
-Xinha.InlineStyler.prototype.applyStyleExceptMatch = function(params, exceptMatchRe)
-{
-  return this.applyStyle(params, null, exceptMatchRe);
-};
-
-Xinha.InlineStyler.prototype.applyStyleIfMatch    = function(params, ifMatchRe)
-{
-  return this.applyStyle(params, ifMatchRe);
-};
-
-Xinha.InlineStyler.prototype.createStyleLayoutFieldset = function()
-{
-  var self = this;
-  var editor = this.editor;
-  var doc = this.doc;
-  var el = this.element;
-  var fieldset = doc.createElement("fieldset");
-  var legend = doc.createElement("legend");
-  fieldset.appendChild(legend);
-  legend.innerHTML = Xinha._lc("Layout", "InlineStyler");
-  var table = doc.createElement("table");
-  fieldset.appendChild(table);
-  table.style.width = "100%";
-  var tbody = doc.createElement("tbody");
-  table.appendChild(tbody);
-  
-  var tagname = el.tagName.toLowerCase();
-  var tr, td, input, select, option, options, i;
-  
-  if (tagname != "td" && tagname != "tr" && tagname != "th") 
-  {
-    tr = doc.createElement("tr");
-    tbody.appendChild(tr);
-    td = doc.createElement("td");
-    td.className = "label";
-    tr.appendChild(td);
-    td.innerHTML = Xinha._lc("Float", "InlineStyler") + ":";
-    td = doc.createElement("td");
-    tr.appendChild(td);
-    select = doc.createElement("select");
-    select.name = this.dialog.createId("float");
-    td.appendChild(select);
-    this.inputs.styles['float'] = select;
-    
-    options = ["None", "Left", "Right"];
-    /* For lc_parse_strings.php
-   
-      Xinha._lc("None", "InlineStyler");
-      Xinha._lc("Left", "InlineStyler");
-      Xinha._lc("Right", "InlineStyler");
-      
-    */
-    for (var i = 0; i < options.length; ++i) 
-    {
-      var Val = options[i];
-      var val = options[i].toLowerCase();
-      option = doc.createElement("option");
-      option.innerHTML = Xinha._lc(Val, "InlineStyler");
-      option.value = val;
-      if (Xinha.is_ie) {
-        option.selected = (("" + el.style.styleFloat).toLowerCase() == val);
-      }
-      else {
-        option.selected = (("" + el.style.cssFloat).toLowerCase() == val);
-      }
-      select.appendChild(option);
-    }
-  }
-  
-  tr = doc.createElement("tr");
-  tbody.appendChild(tr);
-  td = doc.createElement("td");
-  td.className = "label";
-  tr.appendChild(td);
-  td.innerHTML = Xinha._lc("Width", "InlineStyler") + ":";
-  td = doc.createElement("td");
-  tr.appendChild(td);
-  input = doc.createElement("input");
-  input.name = this.dialog.createId("width");
-  input.type = "text";
-  input.value = Xinha.InlineStyler.getLength(el.style.width);
-  input.size = "5";
-  this.inputs.styles['width'] = input;
-  input.style.marginRight = "0.5em";
-  td.appendChild(input);
-  select = doc.createElement("select");
-  select.name = this.dialog.createId("widthUnit");
-  this.inputs.aux['widthUnit'] = select;
-  option = doc.createElement("option");
-  option.innerHTML = Xinha._lc("percent", "InlineStyler");
-  option.value = "%";
-  option.selected = /%/.test(el.style.width);
-  select.appendChild(option);
-  option = doc.createElement("option");
-  option.innerHTML = Xinha._lc("pixels", "InlineStyler");
-  option.value = "px";
-  option.selected = /px/.test(el.style.width);
-  select.appendChild(option);
-  td.appendChild(select);
-  
-  select.style.marginRight = "0.5em";
-  td.appendChild(doc.createTextNode(Xinha._lc("Text align", "InlineStyler") + ":"));
-  select = doc.createElement("select");
-  select.name = this.dialog.createId("textAlign");
-  select.style.marginLeft = select.style.marginRight = "0.5em";
-  td.appendChild(select);
-  this.inputs.styles['textAlign'] = select;
-  options = ["Left", "Center", "Right", "Justify", "-"];
-  if (tagname == "td") 
-  {
-    options.push("Char");
-  }
-  
-  /* For lc_parse_strings.php
-  
-    Xinha._lc("Left", "InlineStyler");
-    Xinha._lc("Center", "InlineStyler");
-    Xinha._lc("Right", "InlineStyler");
-    Xinha._lc("Justify", "InlineStyler");
-    Xinha._lc("-", "InlineStyler");
-    Xinha._lc("Char", "InlineStyler");
-    
-  */
-  
-  input = doc.createElement("input");
-  this.inputs.aux['textAlignChar'] = input;
-  input.name= this.dialog.createId("textAlignChar");
-  input.size = "1";
-  input.style.fontFamily = "monospace";
-  td.appendChild(input);
-  
-  for (var i = 0; i < options.length; ++i) 
-  {
-    var Val = options[i];
-    var val = Val.toLowerCase();
-    option = doc.createElement("option");
-    option.value = val;
-    option.innerHTML = Xinha._lc(Val, "InlineStyler");
-    option.selected = ((el.style.textAlign.toLowerCase() == val) || (el.style.textAlign == "" && Val == "-"));
-    select.appendChild(option);
-  }
-  var textAlignCharInput = input;
-  function setCharVisibility(value)
-  {
-    textAlignCharInput.style.visibility = value ? "visible" : "hidden";
-    if (value) 
-    {
-      textAlignCharInput.focus();
-      textAlignCharInput.select();
-    }
-  }
-  select.onchange = function()
-  {
-    setCharVisibility(this.value == "char");
-  };
-  setCharVisibility(select.value == "char");
-  
-  tr = doc.createElement("tr");
-  tbody.appendChild(tr);
-  td = doc.createElement("td");
-  td.className = "label";
-  tr.appendChild(td);
-  td.innerHTML = Xinha._lc("Height", "InlineStyler") + ":";
-  td = doc.createElement("td");
-  tr.appendChild(td);
-  input = doc.createElement("input");
-  input.name = this.dialog.createId("height");
-  input.type = "text";
-  input.value = Xinha.InlineStyler.getLength(el.style.height);
-  input.size = "5";
-  this.inputs.styles['height'] = input;
-  input.style.marginRight = "0.5em";
-  td.appendChild(input);
-  select = doc.createElement("select");
-  select.name = this.dialog.createId("heightUnit");
-  this.inputs.aux['heightUnit'] = select;
-  option = doc.createElement("option");
-  option.innerHTML = Xinha._lc("percent", "InlineStyler");
-  option.value = "%";
-  option.selected = /%/.test(el.style.height);
-  select.appendChild(option);
-  option = doc.createElement("option");
-  option.innerHTML = Xinha._lc("pixels", "InlineStyler");
-  option.value = "px";
-  option.selected = /px/.test(el.style.height);
-  select.appendChild(option);
-  td.appendChild(select);
-  
-  select.style.marginRight = "0.5em";
-  td.appendChild(doc.createTextNode(Xinha._lc("Vertical align", "InlineStyler") + ":"));
-  select = doc.createElement("select");
-  select.name = this.dialog.createId("verticalAlign");
-  this.inputs.styles['verticalAlign'] = select;
-  select.style.marginLeft = "0.5em";
-  td.appendChild(select);
-  options = ["Top", "Middle", "Bottom", "Baseline", "-"];
-  /* For lc_parse_strings.php
-   
-   Xinha._lc("Top", "InlineStyler");
-   Xinha._lc("Middle", "InlineStyler");
-   Xinha._lc("Bottom", "InlineStyler");
-   Xinha._lc("Baseline", "InlineStyler");
-   Xinha._lc("-", "InlineStyler");
-   
-   */
-  for (var i = 0; i < options.length; ++i) 
-  {
-    var Val = options[i];
-    var val = Val.toLowerCase();
-    option = doc.createElement("option");
-    option.value = val;
-    option.innerHTML = Xinha._lc(Val, "InlineStyler");
-    option.selected = ((el.style.verticalAlign.toLowerCase() == val) || (el.style.verticalAlign == "" && Val == "-"));
-    select.appendChild(option);
-  }
-  
-  return fieldset;
-};
-
-// Returns an HTML element containing the style attributes for the given
-// element.  This can be easily embedded into any dialog; the functionality is
-// also provided.
-Xinha.InlineStyler.prototype.createStyleFieldset = function()
-{
-  var editor = this.editor;
-  var doc = this.doc;
-  var el = this.element;
-  
-  var fieldset = doc.createElement("fieldset");
-  var legend = doc.createElement("legend");
-  fieldset.appendChild(legend);
-  legend.innerHTML = Xinha._lc("CSS Style", "InlineStyler");
-  var table = doc.createElement("table");
-  fieldset.appendChild(table);
-  table.style.width = "100%";
-  var tbody = doc.createElement("tbody");
-  table.appendChild(tbody);
-  
-  var tr, td, input, select, option, options, i;
-  
-  tr = doc.createElement("tr");
-  tbody.appendChild(tr);
-  td = doc.createElement("td");
-  tr.appendChild(td);
-  td.className = "label";
-  td.innerHTML = Xinha._lc("Background", "InlineStyler") + ":";
-  td = doc.createElement("td");
-  tr.appendChild(td);
-
-  input = doc.createElement("input");
-  input.name = this.dialog.createId("backgroundColor");
-  input.value = Xinha._colorToRgb( el.style.backgroundColor );
-  input.type = "hidden";
-  this.inputs.styles['backgroundColor'] = input;
-  input.style.marginRight = "0.5em";
-  td.appendChild(input);
-  new Xinha.colorPicker.InputBinding(input)
-  
-  td.appendChild(doc.createTextNode(" " + Xinha._lc("Image URL", "InlineStyler") + ": "));
-  input = doc.createElement("input");
-  input.name = this.dialog.createId("backgroundImage");
-  input.type = "text";
-  this.inputs.styles['backgroundImage'] = input;
-  if (el.style.backgroundImage.match(/url\(\s*(.*?)\s*\)/))
-    input.value = RegExp.$1;
-  // input.style.width = "100%";
-  td.appendChild(input);
-  
-  tr = doc.createElement("tr");
-  tbody.appendChild(tr);
-  td = doc.createElement("td");
-  tr.appendChild(td);
-  td.className = "label";
-  td.innerHTML = Xinha._lc("FG Color", "InlineStyler") + ":";
-  td = doc.createElement("td");
-  tr.appendChild(td);
-  input = doc.createElement("input");
-  input.name = this.dialog.createId("color");
-  input.value = Xinha._colorToRgb( el.style.color );
-  input.type = "hidden";
-  this.inputs.styles['color'] = input;
-  input.style.marginRight = "0.5em";
-  td.appendChild(input);
-  new Xinha.colorPicker.InputBinding(input)
-  
-  // for better alignment we include an invisible field.
-  input = doc.createElement("input");
-  input.style.visibility = "hidden";
-  input.type = "text";
-  td.appendChild(input);
-  
-  tr = doc.createElement("tr");
-  tbody.appendChild(tr);
-  td = doc.createElement("td");
-  tr.appendChild(td);
-  td.className = "label";
-  td.innerHTML = Xinha._lc("Border", "InlineStyler") + ":";
-  td = doc.createElement("td");
-  tr.appendChild(td);
-  input = doc.createElement("input");
-  var borderColourInput = input;
-  input.name = this.dialog.createId("borderColor");
-  input.value = Xinha._colorToRgb( el.style.borderColor );
-  input.type = "hidden";
-  this.inputs.styles['borderColor'] = input;
-  input.style.marginRight = "0.5em";
-  td.appendChild(input);
-  new Xinha.colorPicker.InputBinding(input)
-  
-  select = doc.createElement("select");
-  var borderSelect = select;  
-  select.name = this.dialog.createId("borderStyle");
-  var borderFields = [];
-  td.appendChild(select);
-  this.inputs.styles['borderStyle'] = select;
-  options = ["none", "dotted", "dashed", "solid", "double", "groove", "ridge", "inset", "outset"];
-  var currentBorderStyle = el.style.borderStyle;
-  // Gecko reports "solid solid solid solid" for "border-style: solid".
-  // That is, "top right bottom left" -- we only consider the first
-  // value.
-  if (currentBorderStyle.match(/([^\s]*)\s/)) currentBorderStyle = RegExp.$1;
-  for (var i=0;i<options.length;i++) {
-    var val = options[i];
-    option = doc.createElement("option");
-    option.value = val;
-    option.innerHTML = val;
-    if (val == currentBorderStyle) option.selected = true;
-    select.appendChild(option);
-  }
-  select.style.marginRight = "0.5em";
-  function setBorderFieldsStatus(value)
-  {
-    for (var i = 0; i < borderFields.length; ++i) 
-    {
-      var el = borderFields[i];
-      el.style.visibility = value ? "hidden" : "visible";
-      if (!value && (el.tagName.toLowerCase() == "input")) 
-      {
-        el.focus();
-        el.select();
-      }
-    }
-  }
-  select.onchange = function()
-  {
-    setBorderFieldsStatus(this.value == "none");
-  };
-  
-
-  
-  input = doc.createElement("input");
-  var borderWidthInput = input
-  input.name = this.dialog.createId("borderWidth");
-  borderFields.push(input);
-  input.type = "text";
-  this.inputs.styles['borderWidth'] = input;
-  input.value = Xinha.InlineStyler.getLength(el.style.borderWidth);
-  input.size = "5";
-  td.appendChild(input);
-  input.style.marginRight = "0.5em";
-  var span = doc.createElement("span");
-  span.innerHTML = Xinha._lc("pixels", "InlineStyler");
-  td.appendChild(span);
-  borderFields.push(span);
-  
-  setBorderFieldsStatus(select.value == "none");
-  
-  // if somebody changes the border colour, and the border Style is not set, set it
-  // because otherwise they might not do that and get confused
-  borderColourInput.oncolorpicked = function(){
-    if(borderSelect.selectedIndex == 0)
-    {
-      borderSelect.selectedIndex = 3;
-      borderSelect.onchange();
-    } 
-    
-    if(!borderWidthInput.value.length) 
-    {
-      borderWidthInput.value = 1;
-    }
-  };
-  
-  if (el.tagName.toLowerCase() == "table") 
-  {
-    // the border-collapse style is only for tables
-    tr = doc.createElement("tr");
-    tbody.appendChild(tr);
-    td = doc.createElement("td");
-    td.className = "label";
-    tr.appendChild(td);
-    input = doc.createElement("input");
-    input.name = this.dialog.createId("borderCollapse");
-    input.type = "checkbox";
-    input.value = "on";
-    this.inputs.styles['borderCollapse'] = input;
-    input.id = "f_st_borderCollapse";
-    var val = (/collapse/i.test(el.style.borderCollapse));
-    input.checked = val ? 1 : 0;
-    td.appendChild(input);
-    
-    td = doc.createElement("td");
-    tr.appendChild(td);
-    var label = doc.createElement("label");
-    label.htmlFor = "f_st_borderCollapse";
-    label.innerHTML = Xinha._lc("Collapsed borders", "InlineStyler");
-    td.appendChild(label);
-  }
-  
-  // 	tr = doc.createElement("tr");
-  // 	tbody.appendChild(tr);
-  // 	td = doc.createElement("td");
-  // 	td.className = "label";
-  // 	tr.appendChild(td);
-  // 	td.innerHTML = Xinha._lc("Margin", "InlineStyler") + ":";
-  // 	td = doc.createElement("td");
-  // 	tr.appendChild(td);
-  // 	input = doc.createElement("input");
-  // 	input.type = "text";
-  // 	input.size = "5";
-  // 	input.name = "f_st_margin";
-  // 	td.appendChild(input);
-  // 	input.style.marginRight = "0.5em";
-  // 	td.appendChild(doc.createTextNode(Xinha._lc("Padding", "InlineStyler") + ":"));
-  
-  // 	input = doc.createElement("input");
-  // 	input.type = "text";
-  // 	input.size = "5";
-  // 	input.name = "f_st_padding";
-  // 	td.appendChild(input);
-  // 	input.style.marginLeft = "0.5em";
-  // 	input.style.marginRight = "0.5em";
-  // 	td.appendChild(doc.createTextNode(Xinha._lc("pixels", "InlineStyler")));
-  
-  return fieldset;
-};
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/modules/InlineStyler/lang/cz.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/modules/InlineStyler/lang/cz.js
deleted file mode 100644
index 9de0c29..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/modules/InlineStyler/lang/cz.js
+++ /dev/null
@@ -1,37 +0,0 @@
-// I18N constants
-// LANG: "cz", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Background": "Pozadí",
-    "Baseline": "Základní linka",
-    "Border": "Obrys",
-    "Bottom": "Dolů",
-    "Center": "Na střed",
-    "Char": "Znak",
-    "Collapsed borders": "Stlačené okraje",
-    "FG Color": "Barva popředí",
-    "Float": "Obtékání",
-    "Height": "Výška",
-    "Image URL": "Adresa obrázku",
-    "Justify": "Do stran",
-    "Layout": "Rozložení",
-    "Left": "Vlevo",
-    "Margin": "Okraj",
-    "Middle": "Na střed",
-    "None": "Žádné",
-    "Padding": "Odsazování",
-    "Right": "Vpravo",
-    "Text align": "Zarovnání textu",
-    "Top": "Nahoru",
-    "Vertical align": "Svislé zarovnání",
-    "Width": "Šířka",
-    "percent": "procent",
-    "pixels": "pixelů"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/modules/InlineStyler/lang/da.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/modules/InlineStyler/lang/da.js
deleted file mode 100644
index 3b07764..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/modules/InlineStyler/lang/da.js
+++ /dev/null
@@ -1,37 +0,0 @@
-// I18N constants
-// LANG: "da", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Background": "Baggrund",
-    "Baseline": "Grundlinje",
-    "Border": "Ramme",
-    "Bottom": "Tekstbund",
-    "Center": "Centrer",
-    "Char": "Plads",
-    "Collapsed borders": "Sammensmelt rammer",
-    "FG Color": "Font farve",
-    "Float": "Justering",
-    "Height": "Højde",
-    "Image URL": "Billede URL",
-    "Justify": "Lige margener",
-    "Layout": "Layout",
-    "Left": "Venstre",
-    "Margin": "Margen",
-    "Middle": "Midt",
-    "None": "Ingen",
-    "Padding": "Margen",
-    "Right": "Højre",
-    "Text align": "Tekst",
-    "Top": "Top",
-    "Vertical align": "Vertikal placering",
-    "Width": "Bredde",
-    "percent": "procent",
-    "pixels": "pixel"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/modules/InlineStyler/lang/de.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/modules/InlineStyler/lang/de.js
deleted file mode 100644
index 7095f11..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/modules/InlineStyler/lang/de.js
+++ /dev/null
@@ -1,37 +0,0 @@
-// I18N constants
-// LANG: "de", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Background": "Hintergrund",
-    "Baseline": "Grundlinie",
-    "Border": "Rahmen",
-    "Bottom": "unten",
-    "Center": "zentriert",
-    "Char": "Zeichen",
-    "Collapsed borders": "Rahmen fallen zusammen",
-    "FG Color": "Vordergrundfarbe",
-    "Float": "Float",
-    "Height": "Höhe",
-    "Image URL": "Bild-URL",
-    "Justify": "Blocksatz",
-    "Layout": "Gestaltung",
-    "Left": "links",
-    "Margin": "Aussenabstand",
-    "Middle": "zentriert",
-    "None": "Keine",
-    "Padding": "Innenabstand",
-    "Right": "rechts",
-    "Text align": "Textausrichtung",
-    "Top": "oben",
-    "Vertical align": "Vertikale Ausrichtung",
-    "Width": "Breite",
-    "percent": "Prozent",
-    "pixels": "Pixel"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/modules/InlineStyler/lang/el.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/modules/InlineStyler/lang/el.js
deleted file mode 100644
index dded478..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/modules/InlineStyler/lang/el.js
+++ /dev/null
@@ -1,37 +0,0 @@
-// I18N constants
-// LANG: "el", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Background": "Φόντο",
-    "Baseline": "Baseline",
-    "Border": "Περίγραμμα",
-    "Bottom": "Κάτω μέρος",
-    "Center": "Κέντρο",
-    "Char": "Χαρακτήρας",
-    "Collapsed borders": "Συμπτυγμένα περιγράμματα",
-    "FG Color": "Χρώμα αντικειμένων",
-    "Float": "Float",
-    "Height": "Ύψος",
-    "Image URL": "URL εικόνας",
-    "Justify": "Πλήρης στοίχηση",
-    "Layout": "Διάταξη",
-    "Left": "Αριστερά",
-    "Margin": "Περιθώριο",
-    "Middle": "Κέντρο",
-    "None": "Τίποτα",
-    "Padding": "Εσοχή",
-    "Right": "Δεξιά",
-    "Text align": "Στοίχηση κειμένου",
-    "Top": "Πάνω",
-    "Vertical align": "Κατακόρυφη στοίχηση",
-    "Width": "Πλάτος",
-    "percent": "τοις εκατόν",
-    "pixels": "pixels"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/modules/InlineStyler/lang/es.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/modules/InlineStyler/lang/es.js
deleted file mode 100644
index 8d76bd5..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/modules/InlineStyler/lang/es.js
+++ /dev/null
@@ -1,37 +0,0 @@
-// I18N constants
-// LANG: "es", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Background": "Fondo",
-    "Baseline": "Línea base",
-    "Border": "Borde",
-    "Bottom": "Inferior",
-    "Center": "Centrar",
-    "Char": "Carácter",
-    "Collapsed borders": "Bordes colapsados",
-    "FG Color": "Color Principal",
-    "Float": "Flotante",
-    "Height": "Alto",
-    "Image URL": "URL de la imágen",
-    "Justify": "Justificar",
-    "Layout": "Distribución",
-    "Left": "Izquierda",
-    "Margin": "Margen",
-    "Middle": "Medio",
-    "None": "Ninguno",
-    "Padding": "Relleno (Padding)",
-    "Right": "Derecha",
-    "Text align": "Alineación del texto",
-    "Top": "Superior",
-    "Vertical align": "Alineación vertical",
-    "Width": "Ancho",
-    "percent": "por ciento",
-    "pixels": "píxeles"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/modules/InlineStyler/lang/eu.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/modules/InlineStyler/lang/eu.js
deleted file mode 100644
index 647dd90..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/modules/InlineStyler/lang/eu.js
+++ /dev/null
@@ -1,21 +0,0 @@
-// I18N constants
-// LANG: "eu", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Baseline": "Irudiaren oinean",
-    "Bottom": "Behean",
-    "Image URL": "Irudiaren URL-a:",
-    "Layout": "Diseinua",
-    "Left": "Ezkerretara",
-    "Middle": "Erdian",
-    "Right": "Eskuinetara",
-    "Top": "Goian",
-    "Width": "Zabalera:"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/modules/InlineStyler/lang/fa.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/modules/InlineStyler/lang/fa.js
deleted file mode 100644
index 01f43fa..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/modules/InlineStyler/lang/fa.js
+++ /dev/null
@@ -1,21 +0,0 @@
-// I18N constants
-// LANG: "fa", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Baseline": "ابتدای خط",
-    "Bottom": "پایین",
-    "Image URL": "URL تصویر",
-    "Layout": "لایه",
-    "Left": "چپ",
-    "Middle": "وسط",
-    "Right": "راست",
-    "Top": "بالا",
-    "Width": "طول"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/modules/InlineStyler/lang/fi.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/modules/InlineStyler/lang/fi.js
deleted file mode 100644
index 26aea45..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/modules/InlineStyler/lang/fi.js
+++ /dev/null
@@ -1,32 +0,0 @@
-// I18N constants
-// LANG: "fi", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Background": "Tausta",
-    "Baseline": "Takaraja",
-    "Border": "Reuna",
-    "Bottom": "Alle",
-    "Center": "Keskelle",
-    "Char": "Merkki",
-    "Collapsed borders": "Luhistetut reunat",
-    "FG Color": "FG Väri",
-    "Image URL": "Kuvan osoite",
-    "Layout": "Sommittelu",
-    "Left": "Vasen",
-    "Margin": "Marginaali",
-    "Middle": "Keskelle",
-    "Padding": "Palstantäyte",
-    "Right": "Oikea",
-    "Top": "Ylös",
-    "Vertical align": "Vertikaali kohdistus",
-    "Width": "Leveys",
-    "percent": "prosenttia",
-    "pixels": "pikseliä"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/modules/InlineStyler/lang/fr.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/modules/InlineStyler/lang/fr.js
deleted file mode 100644
index e871360..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/modules/InlineStyler/lang/fr.js
+++ /dev/null
@@ -1,37 +0,0 @@
-// I18N constants
-// LANG: "fr", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Background": "Arrière plan",
-    "Baseline": "Baseline",
-    "Border": "Bordure",
-    "Bottom": "Bas",
-    "Center": "Centre",
-    "Char": "Charactère",
-    "Collapsed borders": "Bordure effondrés",
-    "FG Color": "Couleur de face",
-    "Float": "Flotteur",
-    "Height": "Hauteur",
-    "Image URL": "URL pour l'image",
-    "Justify": "Justifié",
-    "Layout": "Layout",
-    "Left": "Gauche",
-    "Margin": "Marge",
-    "Middle": "Milieu",
-    "None": "Aucun",
-    "Padding": "Remplissage",
-    "Right": "Droite",
-    "Text align": "Alignement",
-    "Top": "Haut",
-    "Vertical align": "Vertical",
-    "Width": "Largeur",
-    "percent": "pourcent",
-    "pixels": "pixels"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/modules/InlineStyler/lang/he.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/modules/InlineStyler/lang/he.js
deleted file mode 100644
index 8d0e6c4..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/modules/InlineStyler/lang/he.js
+++ /dev/null
@@ -1,37 +0,0 @@
-// I18N constants
-// LANG: "he", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Background": "רקע",
-    "Baseline": "קו בסיס",
-    "Border": "גבול",
-    "Bottom": "תחתון",
-    "Center": "מרכז",
-    "Char": "תו",
-    "Collapsed borders": "גבולות קורסים",
-    "FG Color": "צבע קידמה",
-    "Float": "מרחף",
-    "Height": "גובה",
-    "Image URL": "URL התמונה",
-    "Justify": "ישור",
-    "Layout": "פריסה",
-    "Left": "שמאל",
-    "Margin": "שוליים",
-    "Middle": "אמצע",
-    "None": "אין",
-    "Padding": "ריווח בשוליים",
-    "Right": "ימין",
-    "Text align": "ישור טקסט",
-    "Top": "עליון",
-    "Vertical align": "יישור אנכי",
-    "Width": "רוחב",
-    "percent": "אחוז",
-    "pixels": "פיקסלים"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/modules/InlineStyler/lang/it.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/modules/InlineStyler/lang/it.js
deleted file mode 100644
index e33b6a0..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/modules/InlineStyler/lang/it.js
+++ /dev/null
@@ -1,37 +0,0 @@
-// I18N constants
-// LANG: "it", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Background": "Sfondo",
-    "Baseline": "Allineamento",
-    "Border": "Bordo",
-    "Bottom": "Basso",
-    "Center": "Centra",
-    "Char": "Carattere",
-    "Collapsed borders": "Bordi chiusi",
-    "FG Color": "Colore Principale",
-    "Float": "Fluttuante",
-    "Height": "Altezza",
-    "Image URL": "URL dell'Immagine",
-    "Justify": "Justifica",
-    "Layout": "Layout",
-    "Left": "Sinistra",
-    "Margin": "Margine",
-    "Middle": "Centrale",
-    "None": "Nulla",
-    "Padding": "Padding",
-    "Right": "Destra",
-    "Text align": "Allineamento del Testo",
-    "Top": "Alto",
-    "Vertical align": "Allineamento verticale",
-    "Width": "Larghezza",
-    "percent": "percento",
-    "pixels": "pixels"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/modules/InlineStyler/lang/ja.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/modules/InlineStyler/lang/ja.js
deleted file mode 100644
index 2949bd7..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/modules/InlineStyler/lang/ja.js
+++ /dev/null
@@ -1,38 +0,0 @@
-// I18N constants
-// LANG: "ja", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Background": "背景",
-    "Baseline": "ベースライン",
-    "Border": "ボーダー",
-    "Bottom": "下",
-    "CSS Style": "CSSスタイル",
-    "Center": "中央",
-    "Char": "文字",
-    "Collapsed borders": "隣接境界線を重ねる",
-    "FG Color": "前景色",
-    "Float": "フロート",
-    "Height": "高さ",
-    "Image URL": "画像URL",
-    "Justify": "両端揃え",
-    "Layout": "レイアウト",
-    "Left": "左",
-    "Margin": "間隔",
-    "Middle": "中央",
-    "None": "なし",
-    "Padding": "余白",
-    "Right": "右",
-    "Text align": "水平位置",
-    "Top": "上",
-    "Vertical align": "垂直位置",
-    "Width": "幅",
-    "percent": "パーセント",
-    "pixels": "ピクセル"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/modules/InlineStyler/lang/lc_base.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/modules/InlineStyler/lang/lc_base.js
deleted file mode 100644
index e1e8aae..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/modules/InlineStyler/lang/lc_base.js
+++ /dev/null
@@ -1,51 +0,0 @@
-// I18N constants
-//
-// LANG: "en", ENCODING: UTF-8
-// Author: Translator-Name, <email@example.com>
-//
-// Last revision: 2018-04-12
-// 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).
-//
-// (Please, remove information below)
-// 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.)
-
-{
-    "-": "",
-    "Background": "",
-    "Baseline": "",
-    "Border": "",
-    "Bottom": "",
-    "CSS Style": "",
-    "Center": "",
-    "Char": "",
-    "Collapsed borders": "",
-    "FG Color": "",
-    "Float": "",
-    "Height": "",
-    "Image URL": "",
-    "Justify": "",
-    "Layout": "",
-    "Left": "",
-    "Margin": "",
-    "Middle": "",
-    "None": "",
-    "Padding": "",
-    "Right": "",
-    "Text align": "",
-    "Top": "",
-    "Vertical align": "",
-    "Width": "",
-    "percent": "",
-    "pixels": ""
-}
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/modules/InlineStyler/lang/nb.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/modules/InlineStyler/lang/nb.js
deleted file mode 100644
index 4c32e9c..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/modules/InlineStyler/lang/nb.js
+++ /dev/null
@@ -1,37 +0,0 @@
-// I18N constants
-// LANG: "nb", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Background": "Bakgrund",
-    "Baseline": "Grunnlinje",
-    "Border": "Ramme",
-    "Bottom": "Bunn",
-    "Center": "Sentrert",
-    "Char": "Tegn",
-    "Collapsed borders": "Fjern kantlinjer",
-    "FG Color": "FG farge",
-    "Float": "Flytende",
-    "Height": "Høyde",
-    "Image URL": "Bildets URL",
-    "Justify": "Juster",
-    "Layout": "Oppsett",
-    "Left": "Venstre",
-    "Margin": "Marg",
-    "Middle": "Midten",
-    "None": "Ingen",
-    "Padding": "Luft",
-    "Right": "Høyre",
-    "Text align": "Juster tekst",
-    "Top": "Overkant",
-    "Vertical align": "Vertikal justering",
-    "Width": "Bredde",
-    "percent": "prosent",
-    "pixels": "Piksel"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/modules/InlineStyler/lang/nl.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/modules/InlineStyler/lang/nl.js
deleted file mode 100644
index 21b3c16..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/modules/InlineStyler/lang/nl.js
+++ /dev/null
@@ -1,37 +0,0 @@
-// I18N constants
-// LANG: "nl", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Background": "Achtergrond",
-    "Baseline": "Basis",
-    "Border": "Kader",
-    "Bottom": "Onder",
-    "Center": "Midden",
-    "Char": "Karakter",
-    "Collapsed borders": "Geen randen",
-    "FG Color": "Voorgrond",
-    "Float": "Zwevend",
-    "Height": "Hoog",
-    "Image URL": "Afbeelding URL",
-    "Justify": "Uitvullen",
-    "Layout": "Weergave",
-    "Left": "Links",
-    "Margin": "Inspringen",
-    "Middle": "Midden",
-    "None": "Geen",
-    "Padding": "Celmarge",
-    "Right": "Rechts",
-    "Text align": "Text uitlijning",
-    "Top": "Boven",
-    "Vertical align": "Vertikale uitlijning",
-    "Width": "Breed",
-    "percent": "procent",
-    "pixels": "pixels"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/modules/InlineStyler/lang/pl.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/modules/InlineStyler/lang/pl.js
deleted file mode 100644
index f2f85cb..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/modules/InlineStyler/lang/pl.js
+++ /dev/null
@@ -1,38 +0,0 @@
-// I18N constants
-// LANG: "pl", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Background": "Tło",
-    "Baseline": "Linia bazowa",
-    "Border": "Ramka",
-    "Bottom": "Dół",
-    "CSS Style": "Styl CSS",
-    "Center": "Środek",
-    "Char": "Znak",
-    "Collapsed borders": "Ramki skolapsowane",
-    "FG Color": "Kolor czcionek",
-    "Float": "Opływanie",
-    "Height": "Wysokość",
-    "Image URL": "URL obrazka",
-    "Justify": "Wyjustuj",
-    "Layout": "Layout",
-    "Left": "Do lewej",
-    "Margin": "Odstęp",
-    "Middle": "Środek",
-    "None": "Brak",
-    "Padding": "Wcięcia",
-    "Right": "Do prawej",
-    "Text align": "Wyr. w poziomie",
-    "Top": "Góra",
-    "Vertical align": "Wyr. w pionie",
-    "Width": "Szerokość",
-    "percent": "%",
-    "pixels": "pikseli"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/modules/InlineStyler/lang/pt_br.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/modules/InlineStyler/lang/pt_br.js
deleted file mode 100644
index 2cab3ee..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/modules/InlineStyler/lang/pt_br.js
+++ /dev/null
@@ -1,38 +0,0 @@
-// I18N constants
-// LANG: "pt_br", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Background": "Fundo",
-    "Baseline": "Linha de base",
-    "Border": "Borda",
-    "Bottom": "Base",
-    "CSS Style": "Estilo (CSS)",
-    "Center": "Centralizar",
-    "Char": "Caracter",
-    "Collapsed borders": "Bordas fechadas",
-    "FG Color": "Cor de primeiro plano",
-    "Float": "Flutuante",
-    "Height": "Altura",
-    "Image URL": "URL da imagem",
-    "Justify": "Justificado",
-    "Layout": "Esquema",
-    "Left": "Esquerda",
-    "Margin": "Margem",
-    "Middle": "Meio",
-    "None": "Nenhum",
-    "Padding": "Espaço interno",
-    "Right": "Direita",
-    "Text align": "Alinhamento do texto",
-    "Top": "Topo",
-    "Vertical align": "Alinhamento vertical",
-    "Width": "Largura",
-    "percent": "porcentagem",
-    "pixels": "pixels"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/modules/InlineStyler/lang/ro.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/modules/InlineStyler/lang/ro.js
deleted file mode 100644
index 09bba1d..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/modules/InlineStyler/lang/ro.js
+++ /dev/null
@@ -1,37 +0,0 @@
-// I18N constants
-// LANG: "ro", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Background": "Fundal",
-    "Baseline": "Baseline",
-    "Border": "Chenar",
-    "Bottom": "Jos",
-    "Center": "Centru",
-    "Char": "Caracter",
-    "Collapsed borders": "Chenare asimilate",
-    "FG Color": "Culoare text",
-    "Float": "Poziţie",
-    "Height": "Înălţimea",
-    "Image URL": "URL-ul imaginii",
-    "Justify": "Justify",
-    "Layout": "Aranjament",
-    "Left": "Stânga",
-    "Margin": "Margine",
-    "Middle": "Mijloc",
-    "None": "Nimic",
-    "Padding": "Spaţiere",
-    "Right": "Dreapta",
-    "Text align": "Aliniere",
-    "Top": "Sus",
-    "Vertical align": "Aliniere pe verticală",
-    "Width": "Lăţime",
-    "percent": "procente",
-    "pixels": "pixeli"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/modules/InlineStyler/lang/ru.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/modules/InlineStyler/lang/ru.js
deleted file mode 100644
index ed993dc..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/modules/InlineStyler/lang/ru.js
+++ /dev/null
@@ -1,37 +0,0 @@
-// I18N constants
-// LANG: "ru", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Background": "Фон",
-    "Baseline": "По нижней границе текста",
-    "Border": "Рамка",
-    "Bottom": "По нижнему краю",
-    "Center": "Центр",
-    "Char": "Символ",
-    "Collapsed borders": "Накладывающиеся рамки",
-    "FG Color": "Цвет переднего плана",
-    "Float": "Обтекание",
-    "Height": "Высота",
-    "Image URL": "URL картинки",
-    "Justify": "По правому краю",
-    "Layout": "Расположение",
-    "Left": "По левому краю",
-    "Margin": "Отступ",
-    "Middle": "Посредине",
-    "None": "Ничего",
-    "Padding": "Поля",
-    "Right": "По правому краю",
-    "Text align": "Выравнивание теста",
-    "Top": "По верхнему краю",
-    "Vertical align": "Вертикальное  выравнивание",
-    "Width": "Ширина",
-    "percent": "процентов",
-    "pixels": "пикселей"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/modules/InlineStyler/lang/sh.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/modules/InlineStyler/lang/sh.js
deleted file mode 100644
index f45174d..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/modules/InlineStyler/lang/sh.js
+++ /dev/null
@@ -1,21 +0,0 @@
-// I18N constants
-// LANG: "sh", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Baseline": "Donja linija",
-    "Bottom": "Dno",
-    "Image URL": "URL slike",
-    "Layout": "Prelom",
-    "Left": "Levo",
-    "Middle": "Sredina",
-    "Right": "Desno",
-    "Top": "Vrh",
-    "Width": "Širina"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/modules/InlineStyler/lang/sr.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/modules/InlineStyler/lang/sr.js
deleted file mode 100644
index 043f4a8..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/modules/InlineStyler/lang/sr.js
+++ /dev/null
@@ -1,21 +0,0 @@
-// I18N constants
-// LANG: "sr", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Baseline": "Доња линија",
-    "Bottom": "Дно",
-    "Image URL": "УРЛ слике",
-    "Layout": "Прелом",
-    "Left": "Лево",
-    "Middle": "Средина",
-    "Right": "Десно",
-    "Top": "Врх",
-    "Width": "Ширина"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/modules/InlineStyler/lang/sv.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/modules/InlineStyler/lang/sv.js
deleted file mode 100644
index 4da10fe..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/modules/InlineStyler/lang/sv.js
+++ /dev/null
@@ -1,37 +0,0 @@
-// I18N constants
-// LANG: "sv", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Background": "Bakgrund",
-    "Baseline": "Baslinje",
-    "Border": "Kantlinje",
-    "Bottom": "Botten",
-    "Center": "Centrera",
-    "Char": "Tecken",
-    "Collapsed borders": "Osynliga kantlinjer",
-    "FG Color": "Förgrundsfärg",
-    "Float": "Flytande",
-    "Height": "Höjd",
-    "Image URL": "Bildens URL",
-    "Justify": "Justera",
-    "Layout": "Layout",
-    "Left": "Venster",
-    "Margin": "Marginal",
-    "Middle": "Mitten",
-    "None": "Ingen",
-    "Padding": "Luft",
-    "Right": "Höger",
-    "Text align": "Justera text",
-    "Top": "Överkant",
-    "Vertical align": "Vertikal justering",
-    "Width": "Bredd",
-    "percent": "procent",
-    "pixels": "bildpunkter"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/modules/InlineStyler/lang/tr.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/modules/InlineStyler/lang/tr.js
deleted file mode 100644
index 40653ff..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/modules/InlineStyler/lang/tr.js
+++ /dev/null
@@ -1,37 +0,0 @@
-// I18N constants
-// LANG: "tr", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Background": "Arka plan",
-    "Baseline": "Taban hizası",
-    "Border": "Kenarlık",
-    "Bottom": "Alta",
-    "Center": "Ortala",
-    "Char": "Karakter",
-    "Collapsed borders": "Daraltılmış kenarlıklar",
-    "FG Color": "Ön plan rengi",
-    "Float": "Kaydır",
-    "Height": "Yükseklik",
-    "Image URL": "Resim URL'si",
-    "Justify": "Yasla",
-    "Layout": "Düzen",
-    "Left": "Sola",
-    "Margin": "Kenar boşluğu",
-    "Middle": "Ortala",
-    "None": "Hiçbiri",
-    "Padding": "İç boşluk",
-    "Right": "Sağa",
-    "Text align": "Metin hizası",
-    "Top": "Yukarı",
-    "Vertical align": "Dikey hiza",
-    "Width": "Genişlik",
-    "percent": "%",
-    "pixels": "Piksel"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/modules/InsertImage/dialog.html b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/modules/InsertImage/dialog.html
deleted file mode 100644
index 49114e7..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.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-1.5.1/modules/InsertImage/insert_image.html b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/modules/InsertImage/insert_image.html
deleted file mode 100644
index 9109912..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.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, 'InsertImage'));
-}
-
-function Init() {
-  __dlg_translate('InsertImage');
-  __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-1.5.1/modules/InsertImage/insert_image.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/modules/InsertImage/insert_image.js
deleted file mode 100644
index 0e17546..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/modules/InsertImage/insert_image.js
+++ /dev/null
@@ -1,109 +0,0 @@
-  /*--------------------------------------:noTabs=true:tabSize=2:indentSize=2:--
-    --  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
-    --
-    --  This is the Xinha standard implementation of an image insertion plugin
-    --
-    --  he file is loaded as a special plugin by the Xinha Core when no alternative method (plugin) is loaded.
-    --
-    --
-    --  $HeadURL: http://svn.xinha.org/trunk/modules/InsertImage/insert_image.js $
-    --  $LastChangedDate: 2018-02-19 20:35:49 +1300 (Mon, 19 Feb 2018) $
-    --  $LastChangedRevision: 1402 $
-    --  $LastChangedBy: gogo $
-    --------------------------------------------------------------------------*/
-  
-InsertImage._pluginInfo = {
-  name          : "InsertImage",
-  origin        : "Xinha Core",
-  version       : "$LastChangedRevision: 1402 $".replace(/^[^:]*:\s*(.*)\s*\$$/, '$1'),
-  developer     : "The Xinha Core Developer Team",
-  developer_url : "$HeadURL: http://svn.xinha.org/trunk/modules/InsertImage/insert_image.js $".replace(/^[^:]*:\s*(.*)\s*\$$/, '$1'),
-  sponsor       : "",
-  sponsor_url   : "",
-  license       : "htmlArea"
-};
-
-function InsertImage(editor) {
-	this.editor = editor;
-	var cfg = editor.config;
-	var self = this;
-
-   
-   if(typeof editor._insertImage == 'undefined') 
-   {
-    editor._insertImage = function() { self.show(); };
-   // editor.config.btnList.insertimage[3] = function() { self.show(); }
-   }
-  }
-  
-InsertImage.prototype._lc = function(string) {
-	return Xinha._lc(string, 'InsertImage');
-};
-
-InsertImage.prototype.onGenerateOnce = function()
-{
-	InsertImage.loadAssets();
-};
-
-InsertImage.loadAssets = function()
-{
-	var self = InsertImage;
-	if (self.loading) return;
-	self.loading = true;
-	Xinha._getback(_editor_url + 'modules/InsertImage/dialog.html', function(getback) { self.html = getback; self.dialogReady = true; });
-	Xinha._getback(_editor_url + 'modules/InsertImage/pluginMethods.js', function(getback) { eval(getback); self.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 self = this;
-	var editor = this.editor;
-  
-	var dialog = this.dialog = new Xinha.Dialog(editor, InsertImage.html, 'Xinha',{width:410})
-	// Connect the OK and Cancel buttons
-	dialog.getElementById('ok').onclick = function() {self.apply();}
-
-	dialog.getElementById('cancel').onclick = function() { self.dialog.hide()};
-
-	dialog.getElementById('preview').onclick = function() { 
-	  var f_url = dialog.getElementById("f_url");
-	  var url = f_url.value;
-
-	  if (!url) {
-	    alert(dialog._lc("You must enter the URL"));
-	    f_url.focus();
-        return false;
-      }
-	  dialog.getElementById('ipreview').src = url;
-	  return false;
-	}
-	this.dialog.onresize = function ()
-  {
-		var newHeightForPreview = 
-		parseInt(this.height,10) 
-		- this.getElementById('h1').offsetHeight 
-		- this.getElementById('buttons').offsetHeight
-		- this.getElementById('inputs').offsetHeight 
-		- parseInt(this.rootElem.style.paddingBottom,10); // we have a padding at the bottom, gotta take this into acount
-		
-		
-		this.getElementById("ipreview").style.height = ((newHeightForPreview > 0) ? newHeightForPreview : 0) + "px"; // no-go beyond 0
-		
-		this.getElementById("ipreview").style.width = this.width - 2   + 'px'; // and the width
-
-  }
-	this.dialogReady = true;
-};
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/modules/InsertImage/lang/ch.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/modules/InsertImage/lang/ch.js
deleted file mode 100644
index 9d78e44..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/modules/InsertImage/lang/ch.js
+++ /dev/null
@@ -1,14 +0,0 @@
-// I18N constants
-// LANG: "ch", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Cancel": "取消",
-    "OK": "好"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/modules/InsertImage/lang/cz.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/modules/InsertImage/lang/cz.js
deleted file mode 100644
index 78d3e1c..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/modules/InsertImage/lang/cz.js
+++ /dev/null
@@ -1,23 +0,0 @@
-// I18N constants
-// LANG: "cz", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Baseline": "Základní linka",
-    "Bottom": "Dolů",
-    "Cancel": "Zrušit",
-    "Image URL:": "Adresa obrázku",
-    "Layout": "Rozložení",
-    "Left": "Vlevo",
-    "Middle": "Na střed",
-    "OK": "OK",
-    "Right": "Vpravo",
-    "Spacing": "Mezery",
-    "Top": "Nahoru"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/modules/InsertImage/lang/da.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/modules/InsertImage/lang/da.js
deleted file mode 100644
index 2a38052..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/modules/InsertImage/lang/da.js
+++ /dev/null
@@ -1,43 +0,0 @@
-// I18N constants
-// LANG: "da", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Absbottom": "Bund",
-    "Absmiddle": "Centreret",
-    "Alignment:": "Justering:",
-    "Alternate text:": "Alternativ text:",
-    "Baseline": "Grundlinje",
-    "Border thickness:": "Kantbredde:",
-    "Bottom": "Tekstbund",
-    "Cancel": "Annuller",
-    "Enter the image URL here": "Angiv billedets URL",
-    "For browsers that don't support images": "for browsere der ikke understøtter billeder",
-    "Horizontal padding": "Vandret fyld",
-    "Horizontal:": "vandret:",
-    "Image Preview:": "Billede smugkig:",
-    "Image URL:": "Billede URL:",
-    "Insert Image": "Indsæt billede",
-    "Layout": "Layout",
-    "Leave empty for no border": "Tom hvis ingen kant",
-    "Left": "Venstre",
-    "Middle": "Midt",
-    "Not set": "Ubestemt",
-    "OK": "OK",
-    "Positioning of this image": "Billedets position",
-    "Preview": "Smugkig",
-    "Preview the image in a new window": "Smugkig af billedet i et nyt vindue",
-    "Right": "Højre",
-    "Spacing": "Afstand",
-    "Texttop": "Teksttop",
-    "Top": "Top",
-    "Vertical padding": "Lodret fyld",
-    "Vertical:": "lodret:",
-    "You must enter the URL": "Du skal angive en URL"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/modules/InsertImage/lang/de.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/modules/InsertImage/lang/de.js
deleted file mode 100644
index 75d2b53..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/modules/InsertImage/lang/de.js
+++ /dev/null
@@ -1,43 +0,0 @@
-// I18N constants
-// LANG: "de", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Absbottom": "unten bündig",
-    "Absmiddle": "mittig",
-    "Alignment:": "Ausrichtung:",
-    "Alternate text:": "Alternativer Text:",
-    "Baseline": "Grundlinie",
-    "Border thickness:": "Randstärke:",
-    "Bottom": "unten",
-    "Cancel": "Abbrechen",
-    "Enter the image URL here": "Bitte geben sie hier die Bild URL ein",
-    "For browsers that don't support images": "für Browser, die keine Bilder unterstützen",
-    "Horizontal padding": "horizontaler Inhaltsabstand",
-    "Horizontal:": "horizontal:",
-    "Image Preview:": "Bild Voransicht:",
-    "Image URL:": "Bild URL:",
-    "Insert Image": "Bild einfügen",
-    "Layout": "Gestaltung",
-    "Leave empty for no border": "leer lassen für keinen Rand",
-    "Left": "links",
-    "Middle": "zentriert",
-    "Not set": "nicht eingestellt",
-    "OK": "OK",
-    "Positioning of this image": "Anordnung dieses Bildes",
-    "Preview": "Vorschau",
-    "Preview the image in a new window": "Voransicht des Bildes in einem neuen Fenster",
-    "Right": "rechts",
-    "Spacing": "Abstand",
-    "Texttop": "oben bündig",
-    "Top": "oben",
-    "Vertical padding": "vertikaler Inhaltsabstand",
-    "Vertical:": "vertikal:",
-    "You must enter the URL": "Bitte geben Sie die URL ein"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/modules/InsertImage/lang/ee.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/modules/InsertImage/lang/ee.js
deleted file mode 100644
index ba916e9..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/modules/InsertImage/lang/ee.js
+++ /dev/null
@@ -1,14 +0,0 @@
-// I18N constants
-// LANG: "ee", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Cancel": "Loobu",
-    "OK": "OK"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/modules/InsertImage/lang/el.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/modules/InsertImage/lang/el.js
deleted file mode 100644
index 6502c8a..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/modules/InsertImage/lang/el.js
+++ /dev/null
@@ -1,23 +0,0 @@
-// I18N constants
-// LANG: "el", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Baseline": "Baseline",
-    "Bottom": "Κάτω μέρος",
-    "Cancel": "Ακύρωση",
-    "Image URL:": "URL εικόνας",
-    "Layout": "Διάταξη",
-    "Left": "Αριστερά",
-    "Middle": "Κέντρο",
-    "OK": "Εντάξει",
-    "Right": "Δεξιά",
-    "Spacing": "Αποστάσεις",
-    "Top": "Πάνω"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/modules/InsertImage/lang/es.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/modules/InsertImage/lang/es.js
deleted file mode 100644
index fda7e1f..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/modules/InsertImage/lang/es.js
+++ /dev/null
@@ -1,42 +0,0 @@
-// I18N constants
-// LANG: "es", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Absbottom": "Inferior absoluto",
-    "Absmiddle": "Medio Absoluto",
-    "Alignment:": "Alineación:",
-    "Alternate text:": "Texto alternativo:",
-    "Baseline": "Línea base",
-    "Border thickness:": "Tamaño del borde:",
-    "Bottom": "Inferior",
-    "Cancel": "Cancelar",
-    "For browsers that don't support images": "Para navegadores que no soportan imágenes",
-    "Horizontal padding": "Relleno horizontal",
-    "Horizontal:": "horizontal:",
-    "Image Preview:": "Previsualización de la imagen:",
-    "Image URL:": "Imagen URL:",
-    "Insert Image": "insertar imagen",
-    "Layout": "Distribución",
-    "Leave empty for no border": "Vacío si no desea ningún borde",
-    "Left": "Izquierda",
-    "Middle": "Medio",
-    "Not set": "No definido",
-    "OK": "Aceptar",
-    "Positioning of this image": "Posición de la imagen",
-    "Preview": "Previsualizar",
-    "Preview the image in a new window": "Previsualizar en una nueva ventana",
-    "Right": "Derecha",
-    "Spacing": "Espaciado",
-    "Texttop": "Texto Superior",
-    "Top": "Superior",
-    "Vertical padding": "Relleno Vertical",
-    "Vertical:": "Vertical:",
-    "You must enter the URL": "Debe introducir la URL"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/modules/InsertImage/lang/eu.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/modules/InsertImage/lang/eu.js
deleted file mode 100644
index f7744c0..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/modules/InsertImage/lang/eu.js
+++ /dev/null
@@ -1,43 +0,0 @@
-// I18N constants
-// LANG: "eu", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Absbottom": "Irudiaren behekaldean",
-    "Absmiddle": "Irudiaren erdian",
-    "Alignment:": "Lerrokatzea:",
-    "Alternate text:": "Testu alternatiboa:",
-    "Baseline": "Irudiaren oinean",
-    "Border thickness:": "Ertzaren lodiera:",
-    "Bottom": "Behean",
-    "Cancel": "Utzi",
-    "Enter the image URL here": "Idatz ezazu irudiaren URL-a hemen",
-    "For browsers that don't support images": "Irudirik onartzen ez duten nabigatzaileentzat",
-    "Horizontal padding": "Betegarri horizontala",
-    "Horizontal:": "Horizontala:",
-    "Image Preview:": "Irudiaren aurrebista:",
-    "Image URL:": "Irudiaren URL-a:",
-    "Insert Image": "Irudia txertatu",
-    "Layout": "Diseinua",
-    "Leave empty for no border": "Uztazu hutsik ertzik ez sortzeko",
-    "Left": "Ezkerretara",
-    "Middle": "Erdian",
-    "Not set": "Ez gaitua",
-    "OK": "Ados",
-    "Positioning of this image": "Irudiaren kokapena",
-    "Preview": "Aurrebista",
-    "Preview the image in a new window": "Aurreikusi irudia beste lehio batean",
-    "Right": "Eskuinetara",
-    "Spacing": "Tartea",
-    "Texttop": "Irudiaren goialdean",
-    "Top": "Goian",
-    "Vertical padding": "Betegarri bertikala",
-    "Vertical:": "Bertikala:",
-    "You must enter the URL": "URL-a idatzi behar duzu"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/modules/InsertImage/lang/fa.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/modules/InsertImage/lang/fa.js
deleted file mode 100644
index a5517e0..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/modules/InsertImage/lang/fa.js
+++ /dev/null
@@ -1,43 +0,0 @@
-// I18N constants
-// LANG: "fa", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Absbottom": "دقیقا پایین",
-    "Absmiddle": "دقیقا وسط",
-    "Alignment:": "تراز بندی",
-    "Alternate text:": "متن جایگزین",
-    "Baseline": "ابتدای خط",
-    "Border thickness:": "ضخامت لبه",
-    "Bottom": "پایین",
-    "Cancel": "انصراف",
-    "Enter the image URL here": "URL تصویر را اینجا وارد کنید",
-    "For browsers that don't support images": "برای مرورگرهایی که از تصاویر پشتیبانی نمی کنند",
-    "Horizontal padding": "پرکننده افقی",
-    "Horizontal:": "افقی",
-    "Image Preview:": "پیش نمایش تصویر",
-    "Image URL:": "URL تصویر",
-    "Insert Image": "افزودن تصویر",
-    "Layout": "لایه",
-    "Leave empty for no border": "برای بدون لبه خالی رها کن",
-    "Left": "چپ",
-    "Middle": "وسط",
-    "Not set": "تنظیم نشده",
-    "OK": "بله",
-    "Positioning of this image": "موقعیت یابی تصویر",
-    "Preview": "پیش نمایش",
-    "Preview the image in a new window": "پیش نمایش تصویر در پنجره ای جدید",
-    "Right": "راست",
-    "Spacing": "فاصله گذاری",
-    "Texttop": "بالای متن",
-    "Top": "بالا",
-    "Vertical padding": "پرکننده عمودی",
-    "Vertical:": "عمودی",
-    "You must enter the URL": "شما باید URL را وارد کنید"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/modules/InsertImage/lang/fi.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/modules/InsertImage/lang/fi.js
deleted file mode 100644
index b0d3d79..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/modules/InsertImage/lang/fi.js
+++ /dev/null
@@ -1,23 +0,0 @@
-// I18N constants
-// LANG: "fi", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Baseline": "Takaraja",
-    "Bottom": "Alle",
-    "Cancel": "Peruuta",
-    "Image URL:": "Kuvan osoite",
-    "Layout": "Sommittelu",
-    "Left": "Vasen",
-    "Middle": "Keskelle",
-    "OK": "Hyväksy",
-    "Right": "Oikea",
-    "Spacing": "Palstatila",
-    "Top": "Ylös"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/modules/InsertImage/lang/fr.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/modules/InsertImage/lang/fr.js
deleted file mode 100644
index 571b9a0..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/modules/InsertImage/lang/fr.js
+++ /dev/null
@@ -1,43 +0,0 @@
-// I18N constants
-// LANG: "fr", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Absbottom": "Absbottom",
-    "Absmiddle": "Absmiddle",
-    "Alignment:": "Alignement",
-    "Alternate text:": "Texte alternatif",
-    "Baseline": "Baseline",
-    "Border thickness:": "Epaisseur bordure",
-    "Bottom": "Bas",
-    "Cancel": "Annuler",
-    "Enter the image URL here": "Entrer l'URL de l'image ici",
-    "For browsers that don't support images": "Pour les navigateurs qui ne supportent pas les images",
-    "Horizontal padding": "Marge horizontale interne",
-    "Horizontal:": "Horizontal",
-    "Image Preview:": "Prévisualisation",
-    "Image URL:": "URL",
-    "Insert Image": "Insérer une image",
-    "Layout": "Layout",
-    "Leave empty for no border": "Laisser vide pour pas de bordure",
-    "Left": "Gauche",
-    "Middle": "Milieu",
-    "Not set": "Indéfini",
-    "OK": "OK",
-    "Positioning of this image": "Position de cette image",
-    "Preview": "Aperçu ",
-    "Preview the image in a new window": "Prévisualiser l'image dans une nouvelle fenêtre",
-    "Right": "Droite",
-    "Spacing": "Espacement",
-    "Texttop": "Texttop",
-    "Top": "Haut",
-    "Vertical padding": "Marge verticale interne",
-    "Vertical:": "Vertical",
-    "You must enter the URL": "Vous devez entrer l'URL"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/modules/InsertImage/lang/he.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/modules/InsertImage/lang/he.js
deleted file mode 100644
index 14253fa..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/modules/InsertImage/lang/he.js
+++ /dev/null
@@ -1,23 +0,0 @@
-// I18N constants
-// LANG: "he", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Baseline": "קו בסיס",
-    "Bottom": "תחתון",
-    "Cancel": "ביטול",
-    "Image URL:": "URL התמונה",
-    "Layout": "פריסה",
-    "Left": "שמאל",
-    "Middle": "אמצע",
-    "OK": "אישור",
-    "Right": "ימין",
-    "Spacing": "ריווח",
-    "Top": "עליון"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/modules/InsertImage/lang/hu.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/modules/InsertImage/lang/hu.js
deleted file mode 100644
index b38528d..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/modules/InsertImage/lang/hu.js
+++ /dev/null
@@ -1,14 +0,0 @@
-// I18N constants
-// LANG: "hu", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Cancel": "Mégsem",
-    "OK": "Rendben"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/modules/InsertImage/lang/it.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/modules/InsertImage/lang/it.js
deleted file mode 100644
index 8a04885..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/modules/InsertImage/lang/it.js
+++ /dev/null
@@ -1,23 +0,0 @@
-// I18N constants
-// LANG: "it", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Baseline": "Allineamento",
-    "Bottom": "Basso",
-    "Cancel": "Annullamento",
-    "Image URL:": "URL dell'Immagine",
-    "Layout": "Layout",
-    "Left": "Sinistra",
-    "Middle": "Centrale",
-    "OK": "OK",
-    "Right": "Destra",
-    "Spacing": "Spaziatura",
-    "Top": "Alto"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/modules/InsertImage/lang/ja.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/modules/InsertImage/lang/ja.js
deleted file mode 100644
index db4c82d..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/modules/InsertImage/lang/ja.js
+++ /dev/null
@@ -1,43 +0,0 @@
-// I18N constants
-// LANG: "ja", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Absbottom": "下(絶対的)",
-    "Absmiddle": "中央(絶対的)",
-    "Alignment:": "行揃え:",
-    "Alternate text:": "代替テキスト:",
-    "Baseline": "ベースライン",
-    "Border thickness:": "境界線の幅:",
-    "Bottom": "下",
-    "Cancel": "中止",
-    "Enter the image URL here": "画像のURLをここに入力します",
-    "For browsers that don't support images": "画像表示をサポートしないブラウザに必要です",
-    "Horizontal padding": "水平余白",
-    "Horizontal:": "水平:",
-    "Image Preview:": "画像プレビュー:",
-    "Image URL:": "画像URL:",
-    "Insert Image": "画像の挿入",
-    "Layout": "レイアウト",
-    "Leave empty for no border": "境界線がない場合は空のままにする",
-    "Left": "左",
-    "Middle": "中央",
-    "Not set": "なし",
-    "OK": "OK",
-    "Positioning of this image": "この画像の配置",
-    "Preview": "表示",
-    "Preview the image in a new window": "ウィンドウで画像を表示",
-    "Right": "右",
-    "Spacing": "間隔",
-    "Texttop": "テキスト上部",
-    "Top": "上",
-    "Vertical padding": "垂直余白",
-    "Vertical:": "垂直:",
-    "You must enter the URL": "URLを入力する必要があります"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/modules/InsertImage/lang/lc_base.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/modules/InsertImage/lang/lc_base.js
deleted file mode 100644
index 76d03c1..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/modules/InsertImage/lang/lc_base.js
+++ /dev/null
@@ -1,55 +0,0 @@
-// I18N constants
-//
-// LANG: "en", ENCODING: UTF-8
-// Author: Translator-Name, <email@example.com>
-//
-// Last revision: 2018-04-12
-// 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).
-//
-// (Please, remove information below)
-// 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.)
-
-{
-    "Absbottom": "",
-    "Absmiddle": "",
-    "Alignment:": "",
-    "Alternate text:": "",
-    "Baseline": "",
-    "Border thickness:": "",
-    "Bottom": "",
-    "Cancel": "",
-    "Enter the image URL here": "",
-    "For browsers that don't support images": "",
-    "Horizontal padding": "",
-    "Horizontal:": "",
-    "Image Preview:": "",
-    "Image URL:": "",
-    "Insert Image": "",
-    "Layout": "",
-    "Leave empty for no border": "",
-    "Left": "",
-    "Middle": "",
-    "Not set": "",
-    "OK": "",
-    "Positioning of this image": "",
-    "Preview": "",
-    "Preview the image in a new window": "",
-    "Right": "",
-    "Spacing": "",
-    "Texttop": "",
-    "Top": "",
-    "Vertical padding": "",
-    "Vertical:": "",
-    "You must enter the URL": ""
-}
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/modules/InsertImage/lang/lt.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/modules/InsertImage/lang/lt.js
deleted file mode 100644
index d118909..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/modules/InsertImage/lang/lt.js
+++ /dev/null
@@ -1,14 +0,0 @@
-// I18N constants
-// LANG: "lt", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Cancel": "Atšaukti",
-    "OK": "OK"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/modules/InsertImage/lang/lv.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/modules/InsertImage/lang/lv.js
deleted file mode 100644
index f83d5d3..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/modules/InsertImage/lang/lv.js
+++ /dev/null
@@ -1,14 +0,0 @@
-// I18N constants
-// LANG: "lv", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Cancel": "Atcelt",
-    "OK": "Labi"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/modules/InsertImage/lang/nb.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/modules/InsertImage/lang/nb.js
deleted file mode 100644
index f730b3f..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/modules/InsertImage/lang/nb.js
+++ /dev/null
@@ -1,32 +0,0 @@
-// I18N constants
-// LANG: "nb", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Alignment:": "Justering:",
-    "Alternate text:": "Alternativ tekst",
-    "Baseline": "Grunnlinje",
-    "Border thickness:": "Rammetykkelse:",
-    "Bottom": "Bunn",
-    "Cancel": "Avbryt",
-    "Horizontal:": "Horisontal:",
-    "Image Preview:": "Forhåndsvisning:",
-    "Image URL:": "Bildets URL:",
-    "Insert Image": "Sett inn bilde",
-    "Layout": "Oppsett",
-    "Left": "Venstre",
-    "Middle": "Midten",
-    "OK": "OK",
-    "Positioning of this image": "Bildepossisjon",
-    "Preview": "Forhåndsvisning",
-    "Right": "Høyre",
-    "Spacing": "Luft",
-    "Top": "Overkant",
-    "Vertical:": "Vertikal:"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/modules/InsertImage/lang/nl.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/modules/InsertImage/lang/nl.js
deleted file mode 100644
index 3be44ed..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/modules/InsertImage/lang/nl.js
+++ /dev/null
@@ -1,38 +0,0 @@
-// I18N constants
-// LANG: "nl", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Alignment:": "Uitvulling:",
-    "Alternate text:": "Alternatieve tekst:",
-    "Baseline": "Basis",
-    "Border thickness:": "Rand dikte:",
-    "Bottom": "Onder",
-    "Cancel": "Annuleren",
-    "Enter the image URL here": "Afbeeldingslocatie (URL)",
-    "For browsers that don't support images": "Voor browsers welke geen afbeeldingen ondersteunen",
-    "Horizontal padding": "Horizontale ruimte",
-    "Horizontal:": "Horizontaal:",
-    "Image Preview:": "Afbeeldingsvoorbeeld:",
-    "Image URL:": "Afbeelding URL:",
-    "Insert Image": "Afbeelding invoegen",
-    "Layout": "Weergave",
-    "Leave empty for no border": "Leeg voor geen rand",
-    "Left": "Links",
-    "Middle": "Midden",
-    "OK": "OK",
-    "Positioning of this image": "Uitlijnen van dit beeld",
-    "Preview": "Voorbeeld",
-    "Preview the image in a new window": "Afbeelding bekijken in nieuw venster",
-    "Right": "Rechts",
-    "Spacing": "marge",
-    "Top": "Boven",
-    "Vertical padding": "Verticale ruimte",
-    "Vertical:": "Verticaal:"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/modules/InsertImage/lang/pl.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/modules/InsertImage/lang/pl.js
deleted file mode 100644
index c13289a..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/modules/InsertImage/lang/pl.js
+++ /dev/null
@@ -1,42 +0,0 @@
-// I18N constants
-// LANG: "pl", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Absbottom": "Abs. dół",
-    "Absmiddle": "Abs. środek",
-    "Alignment:": "Wyrównanie:",
-    "Alternate text:": "Tekst alternatywny:",
-    "Baseline": "Linia bazowa",
-    "Border thickness:": "Grubość obramowania:",
-    "Bottom": "Dół",
-    "Cancel": "Anuluj",
-    "Enter the image URL here": "Podaj URL obrazka",
-    "For browsers that don't support images": "Dla przeglądarek, które nie obsługują obrazków",
-    "Horizontal padding": "Wcięcie poziome",
-    "Horizontal:": "Poziome:",
-    "Image Preview:": "Podgląd obrazka:",
-    "Image URL:": "URL obrazka:",
-    "Insert Image": "Wstaw obrazek",
-    "Layout": "Layout",
-    "Leave empty for no border": "Bez ramek - zostaw puste",
-    "Left": "Do lewej",
-    "Middle": "Środek",
-    "Not set": "Nie ustawione",
-    "OK": "OK",
-    "Positioning of this image": "Wyrównanie tego obrazka na stronie",
-    "Preview": "Podgląd",
-    "Preview the image in a new window": "Podgląd obrazka w nowym oknie",
-    "Right": "Do prawej",
-    "Spacing": "Odstęp",
-    "Texttop": "Góra tekstu",
-    "Top": "Góra",
-    "Vertical padding": "Wcięcie pionowe",
-    "Vertical:": "Pionowe:"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/modules/InsertImage/lang/pt_br.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/modules/InsertImage/lang/pt_br.js
deleted file mode 100644
index 0a279a4..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/modules/InsertImage/lang/pt_br.js
+++ /dev/null
@@ -1,42 +0,0 @@
-// I18N constants
-// LANG: "pt_br", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Absbottom": "Inferior absoluto",
-    "Absmiddle": "Meio absoluto",
-    "Alignment:": "Alinhamento:",
-    "Alternate text:": "Texto Alternativo:",
-    "Baseline": "Linha de base",
-    "Border thickness:": "Espessura da Borda",
-    "Bottom": "Base",
-    "Cancel": "Cancelar",
-    "Enter the image URL here": "Entre aqui com a URL da imagem",
-    "For browsers that don't support images": "Para navegadores que não suportam imagens",
-    "Horizontal padding": "Espaço horizontal",
-    "Horizontal:": "Horizontal:",
-    "Image Preview:": "Visualização da Imagem:",
-    "Image URL:": "URL da imagem:",
-    "Insert Image": "Inserir Imagem",
-    "Layout": "Esquema",
-    "Leave empty for no border": "Deixe em branco para sem bordas",
-    "Left": "Esquerda",
-    "Middle": "Meio",
-    "Not set": "Não definido",
-    "OK": "OK",
-    "Positioning of this image": "Posicionamento desta imagem",
-    "Preview": "Visualizar",
-    "Preview the image in a new window": "Visualizar imagem em uma nova janela",
-    "Right": "Direita",
-    "Spacing": "Espaçamento",
-    "Texttop": "Texto no topo",
-    "Top": "Topo",
-    "Vertical padding": "Espaço vertical",
-    "Vertical:": "Vertical:"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/modules/InsertImage/lang/ro.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/modules/InsertImage/lang/ro.js
deleted file mode 100644
index bfccab1..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/modules/InsertImage/lang/ro.js
+++ /dev/null
@@ -1,23 +0,0 @@
-// I18N constants
-// LANG: "ro", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Baseline": "Baseline",
-    "Bottom": "Jos",
-    "Cancel": "Renunţă",
-    "Image URL:": "URL-ul imaginii",
-    "Layout": "Aranjament",
-    "Left": "Stânga",
-    "Middle": "Mijloc",
-    "OK": "Acceptă",
-    "Right": "Dreapta",
-    "Spacing": "Între celule",
-    "Top": "Sus"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/modules/InsertImage/lang/ru.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/modules/InsertImage/lang/ru.js
deleted file mode 100644
index 1efad89..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/modules/InsertImage/lang/ru.js
+++ /dev/null
@@ -1,43 +0,0 @@
-// I18N constants
-// LANG: "ru", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Absbottom": "По нижней границе",
-    "Absmiddle": "По середине текста",
-    "Alignment:": "Выравнивание",
-    "Alternate text:": "Альтернативный текст",
-    "Baseline": "По нижней границе текста",
-    "Border thickness:": "Толщина рамки",
-    "Bottom": "По нижнему краю",
-    "Cancel": "Отмена",
-    "Enter the image URL here": "Вставьте адрес изображения",
-    "For browsers that don't support images": "Для браузеров, которые не отображают картинки",
-    "Horizontal padding": "Горизонтальные поля",
-    "Horizontal:": "По горизонтали",
-    "Image Preview:": "Предварительный просмотр",
-    "Image URL:": "URL изображения",
-    "Insert Image": "Вставка картинки",
-    "Layout": "Расположение",
-    "Leave empty for no border": "Оставьте пустым, чтобы убрать рамку",
-    "Left": "По левому краю",
-    "Middle": "Посредине",
-    "Not set": "Не установлено",
-    "OK": "OK",
-    "Positioning of this image": "Расположение изображения",
-    "Preview": "Предварительный просмотр",
-    "Preview the image in a new window": "Предварительный просмотр в отдельном окне",
-    "Right": "По правому краю",
-    "Spacing": "Отступы",
-    "Texttop": "По верхней границе текста",
-    "Top": "По верхнему краю",
-    "Vertical padding": "Вертикальные поля",
-    "Vertical:": "По вертикали",
-    "You must enter the URL": "Вы должны ввести URL"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/modules/InsertImage/lang/sh.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/modules/InsertImage/lang/sh.js
deleted file mode 100644
index 922cca2..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/modules/InsertImage/lang/sh.js
+++ /dev/null
@@ -1,42 +0,0 @@
-// I18N constants
-// LANG: "sh", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Absbottom": "Apsolutno dno",
-    "Absmiddle": "Apsolutna sredina",
-    "Alignment:": "Ravnanje",
-    "Alternate text:": "Alternativni tekst",
-    "Baseline": "Donja linija",
-    "Border thickness:": "Debljina okvira",
-    "Bottom": "Dno",
-    "Cancel": "Poništi",
-    "Enter the image URL here": "Unesite URL slike ovde",
-    "For browsers that don't support images": "Za pretraživače koji ne podržavaju slike",
-    "Horizontal padding": "Horizontalno odstojanje",
-    "Horizontal:": "Po horizontali",
-    "Image Preview:": "Pregled slike",
-    "Image URL:": "URL slike",
-    "Insert Image": "Ubaci sliku",
-    "Layout": "Prelom",
-    "Leave empty for no border": "Ostavi prazno kad nema okvira",
-    "Left": "Levo",
-    "Middle": "Sredina",
-    "Not set": "Nije postavljeno",
-    "OK": "OK",
-    "Positioning of this image": "Postavljanje ove slike",
-    "Preview": "Pregled",
-    "Preview the image in a new window": "Pregledaj sliku u novom prozoru",
-    "Right": "Desno",
-    "Spacing": "Razmak",
-    "Texttop": "Vrh teksta",
-    "Top": "Vrh",
-    "Vertical padding": "Vertikalno odstojanje",
-    "Vertical:": "Po vertikali"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/modules/InsertImage/lang/si.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/modules/InsertImage/lang/si.js
deleted file mode 100644
index 7674892..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/modules/InsertImage/lang/si.js
+++ /dev/null
@@ -1,14 +0,0 @@
-// I18N constants
-// LANG: "si", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Cancel": "Prekliči",
-    "OK": "V redu"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/modules/InsertImage/lang/sr.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/modules/InsertImage/lang/sr.js
deleted file mode 100644
index fa2f344..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/modules/InsertImage/lang/sr.js
+++ /dev/null
@@ -1,42 +0,0 @@
-// I18N constants
-// LANG: "sr", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Absbottom": "Апсолутно дно",
-    "Absmiddle": "Апсолутна средина",
-    "Alignment:": "Равнање",
-    "Alternate text:": "алтернативни текст",
-    "Baseline": "Доња линија",
-    "Border thickness:": "Дебљина оквира",
-    "Bottom": "Дно",
-    "Cancel": "Поништи",
-    "Enter the image URL here": "Унесите УРЛ слике овде",
-    "For browsers that don't support images": "За претраживаче који не подржавају слике",
-    "Horizontal padding": "Хортизонтално одстојање",
-    "Horizontal:": "По хоризонтали",
-    "Image Preview:": "Преглед слике",
-    "Image URL:": "УРЛ слике",
-    "Insert Image": "Убаци слику",
-    "Layout": "Прелом",
-    "Leave empty for no border": "Остави празно кад нема оквира",
-    "Left": "Лево",
-    "Middle": "Средина",
-    "Not set": "Није постављено",
-    "OK": "OK",
-    "Positioning of this image": "Постављање ове слике",
-    "Preview": "Преглед",
-    "Preview the image in a new window": "Прегледај слику у новом прозору",
-    "Right": "Десно",
-    "Spacing": "Размак",
-    "Texttop": "Врх текста",
-    "Top": "Врх",
-    "Vertical padding": "Вертикално одстојање",
-    "Vertical:": "По вертикали"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/modules/InsertImage/lang/sv.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/modules/InsertImage/lang/sv.js
deleted file mode 100644
index 5f09eba..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/modules/InsertImage/lang/sv.js
+++ /dev/null
@@ -1,38 +0,0 @@
-// I18N constants
-// LANG: "sv", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Alignment:": "Placering:",
-    "Alternate text:": "Alternativ text:",
-    "Baseline": "Baslinje",
-    "Border thickness:": "Ramtjocklek:",
-    "Bottom": "Botten",
-    "Cancel": "Avbryt",
-    "Enter the image URL here": "Bildens sökväg (URL)",
-    "For browsers that don't support images": "Beskrivande text för webläsare som inte stödjer inbäddade bilder",
-    "Horizontal padding": "Horizontellt indrag på bild",
-    "Horizontal:": "Horisontell:",
-    "Image Preview:": "Förhandsgranskning:",
-    "Image URL:": "Bildens URL:",
-    "Insert Image": "Infoga bild",
-    "Layout": "Layout",
-    "Leave empty for no border": "Lämna tomt för att undvika ram",
-    "Left": "Venster",
-    "Middle": "Mitten",
-    "OK": "OK",
-    "Positioning of this image": "Bildens positionering",
-    "Preview": "Förhandsgranska",
-    "Preview the image in a new window": "Öppna bild i nytt fönster",
-    "Right": "Höger",
-    "Spacing": "Mellanrum",
-    "Top": "Överkant",
-    "Vertical padding": "Vertikalt indrag på bild",
-    "Vertical:": "Vertikal:"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/modules/InsertImage/lang/th.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/modules/InsertImage/lang/th.js
deleted file mode 100644
index 9da9c8d..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/modules/InsertImage/lang/th.js
+++ /dev/null
@@ -1,14 +0,0 @@
-// I18N constants
-// LANG: "th", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Cancel": "ยกเลิก",
-    "OK": "ตกลง"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/modules/InsertImage/lang/tr.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/modules/InsertImage/lang/tr.js
deleted file mode 100644
index 13163eb..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/modules/InsertImage/lang/tr.js
+++ /dev/null
@@ -1,43 +0,0 @@
-// I18N constants
-// LANG: "tr", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Absbottom": "Salt alta",
-    "Absmiddle": "Salt orta",
-    "Alignment:": "Hizalama:",
-    "Alternate text:": "Alternatif metin:",
-    "Baseline": "Taban hizası",
-    "Border thickness:": "Kenarlık kalınlığı:",
-    "Bottom": "Alta",
-    "Cancel": "İptal",
-    "Enter the image URL here": "Lütfen buraya resim URL'sini girin",
-    "For browsers that don't support images": "Resim desteklemeyen tarayıcılar için",
-    "Horizontal padding": "Yatay doldurma miktarı",
-    "Horizontal:": "Yatay:",
-    "Image Preview:": "Resim önizleme:",
-    "Image URL:": "Resim URL'si:",
-    "Insert Image": "Resim ekle",
-    "Layout": "Düzen",
-    "Leave empty for no border": "Kenarlık istemiyorsanız boş bırakın",
-    "Left": "Sola",
-    "Middle": "Ortala",
-    "Not set": "Ayarlanmamış",
-    "OK": "Tamam",
-    "Positioning of this image": "Resmi konumlandırma",
-    "Preview": "Önizleme",
-    "Preview the image in a new window": "Resmi yeni pencerede önizleme",
-    "Right": "Sağa",
-    "Spacing": "Aralık",
-    "Texttop": "Metin-üstte",
-    "Top": "Yukarı",
-    "Vertical padding": "Dikey doldurma miktarı",
-    "Vertical:": "Dikey:",
-    "You must enter the URL": "Lütfen URL girin"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/modules/InsertImage/lang/vn.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/modules/InsertImage/lang/vn.js
deleted file mode 100644
index 2d82e02..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/modules/InsertImage/lang/vn.js
+++ /dev/null
@@ -1,14 +0,0 @@
-// I18N constants
-// LANG: "vn", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Cancel": "Hủy",
-    "OK": "Đồng ý"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/modules/InsertImage/pluginMethods.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/modules/InsertImage/pluginMethods.js
deleted file mode 100644
index a1a0864..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/modules/InsertImage/pluginMethods.js
+++ /dev/null
@@ -1,152 +0,0 @@
-InsertImage.prototype.show = function(image)
-{
-	if (!this.dialog) this.prepareDialog();
-  
-  var editor = this.editor;
-	if ( typeof image == "undefined" )
-  {
-    image = editor.getParentElement();
-    if ( image && image.tagName.toLowerCase() != 'img' )
-    {
-      image = null;
-    }
-  }
-
-  if ( image )
-  {
-    function getSpecifiedAttribute(element,attribute)
-    {
-      var a = element.attributes;
-      for (var i=0;i<a.length;i++)
-      {
-        if (a[i].nodeName == attribute && a[i].specified)
-        {
-          return a[i].value;
-        }
-      }
-      return '';
-    }
-    outparam =
-    {
-      f_url    : editor.stripBaseURL(image.getAttribute('src',2)), // the second parameter makes IE return the value as it is set, as opposed to an "interpolated" (as MSDN calls it) value
-      f_alt    : image.alt,
-      f_border : image.border,
-      f_align  : image.align,
-      f_vert   : getSpecifiedAttribute(image,'vspace'),
-      f_horiz  : getSpecifiedAttribute(image,'hspace'),
-      f_width  : image.width,
-      f_height : image.height
-    };
-  }
-  else{
-  {
-    outparam =
-    {
-      f_url    : '',
-      f_alt    : '',
-      f_border : '',
-      f_align  : '',
-      f_vert   : '',
-      f_horiz  : '',
-      f_width  : '',
-      f_height : ''
-    };
-  }
-  }
-  this.image = image;
-  // now calling the show method of the Xinha.Dialog object to set the values and show the actual dialog
-  this.dialog.show(outparam);
-};
-
-// and finally ... take some action
-InsertImage.prototype.apply = function()
-{
-  var param = this.dialog.hide();
-  if (!param.f_url)
-  {
-    return;
-  }
-  var editor = this.editor;
-  var img = this.image;
-  if ( !img )
-  {
-    if ( Xinha.is_ie )
-    {
-      var sel = editor.getSelection();
-      var range = editor.createRange(sel);
-      editor._doc.execCommand("insertimage", false, param.f_url);
-      img = range.parentElement();
-      // wonder if this works...
-      if ( img.tagName.toLowerCase() != "img" )
-      {
-        img = img.previousSibling;
-      }
-    }
-    else
-    {
-      img = document.createElement('img');
-      img.src = param.f_url;
-      editor.insertNodeAtSelection(img);
-      if ( !img.tagName )
-      {
-        // if the cursor is at the beginning of the document
-        img = range.startContainer.firstChild;
-      }
-    }
-  }
-  else
-  {
-    img.src = param.f_url;
-  }
-
-  for ( var field in param )
-  {
-    var value = param[field];
-    switch (field)
-    {
-      case "f_alt":
-      if (value)
-      img.alt = value;
-      else
-      img.removeAttribute("alt");
-      break;
-      case "f_border":
-      if (value)
-      img.border = parseInt(value || "0");
-      else
-      img.removeAttribute("border");
-      break;
-      case "f_align":
-      if (value.value)
-      img.align = value.value;
-      else
-      img.removeAttribute("align");
-      break;
-      case "f_vert":
-      if (value != "")
-      img.vspace = parseInt(value || "0");
-      else
-      img.removeAttribute("vspace");
-      break;
-      case "f_horiz":
-      if (value != "")
-      img.hspace = parseInt(value || "0");
-      else
-      img.removeAttribute("hspace");
-      break;
-      case "f_width":
-      if (value)
-      img.width = parseInt(value || "0");
-      else
-      img.removeAttribute("width");
-      break;
-      case "f_height":
-      if (value)
-      img.height = parseInt(value || "0");
-      else
-      img.removeAttribute("height");
-      break;
-    }
-  }
-
-};
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/modules/InsertTable/dialog.html b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/modules/InsertTable/dialog.html
deleted file mode 100644
index f319a1a..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/modules/InsertTable/dialog.html
+++ /dev/null
@@ -1,101 +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=""   ></option>

-  <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-1.5.1/modules/InsertTable/insert_table.html b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/modules/InsertTable/insert_table.html
deleted file mode 100644
index eb5ac85..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.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, 'InsertTable'));
-}
-
-function Init() {
-  Xinha = window.opener.Xinha; // load the Xinha plugin and lang file
-  __dlg_translate('InsertTable');
-  __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-1.5.1/modules/InsertTable/insert_table.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/modules/InsertTable/insert_table.js
deleted file mode 100644
index 5140366..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/modules/InsertTable/insert_table.js
+++ /dev/null
@@ -1,94 +0,0 @@
-
-  /*--------------------------------------:noTabs=true:tabSize=2:indentSize=2:--
-    --  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.
-    --
-    --  This is the Xinha standard implementation of a table insertion plugin
-    --
-    --  The file is loaded by the Xinha Core when no alternative method (plugin) is loaded.
-    --
-    --
-    --  $HeadURL: http://svn.xinha.org/trunk/modules/InsertTable/insert_table.js $
-    --  $LastChangedDate: 2018-02-19 20:35:49 +1300 (Mon, 19 Feb 2018) $
-    --  $LastChangedRevision: 1402 $
-    --  $LastChangedBy: gogo $
-    --------------------------------------------------------------------------*/
-InsertTable._pluginInfo = {
-  name          : "InsertTable",
-  origin        : "Xinha Core",
-  version       : "$LastChangedRevision: 1402 $".replace(/^[^:]*:\s*(.*)\s*\$$/, '$1'),
-  developer     : "The Xinha Core Developer Team",
-  developer_url : "$HeadURL: http://svn.xinha.org/trunk/modules/InsertTable/insert_table.js $".replace(/^[^:]*:\s*(.*)\s*\$$/, '$1'),
-  sponsor       : "",
-  sponsor_url   : "",
-  license       : "htmlArea"
-};
-
-function InsertTable(editor) {
-	this.editor = editor;
-	var cfg = editor.config;
-	var self = this;
-
-	if(typeof editor._insertTable == 'undefined') {
-	    editor._insertTable = function() {
-		self.show();
-	    }
-	}
-}
-
-InsertTable.prototype._lc = function(string) {
-	return Xinha._lc(string, 'InsertTable');
-};
-
-
-InsertTable.prototype.onGenerateOnce = function()
-{
-	InsertTable.loadAssets();
-};
-InsertTable.loadAssets = function()
-{
-	var self = InsertTable;
-	if (self.loading) return;
-	self.loading = true;
-	Xinha._getback(_editor_url + 'modules/InsertTable/dialog.html', function(getback) { self.html = getback; self.dialogReady = true; });
-	Xinha._getback(_editor_url + 'modules/InsertTable/pluginMethods.js', function(getback) { eval(getback); self.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 self = this;
-	var editor = this.editor;
-
-	var dialog = this.dialog = new Xinha.Dialog(editor, InsertTable.html, 'Xinha',{width:400})
-	// Connect the OK and Cancel buttons
-	dialog.getElementById('ok').onclick = function() {self.apply();}
-	dialog.getElementById('cancel').onclick = function() { self.dialog.hide()};
-  
-	this.borderColorPicker = new Xinha.colorPicker.InputBinding(dialog.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-1.5.1/modules/InsertTable/lang/b5.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/modules/InsertTable/lang/b5.js
deleted file mode 100644
index 9b7cbae..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/modules/InsertTable/lang/b5.js
+++ /dev/null
@@ -1,13 +0,0 @@
-// I18N constants
-// LANG: "b5", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Insert Table": "插入表格"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/modules/InsertTable/lang/ch.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/modules/InsertTable/lang/ch.js
deleted file mode 100644
index da2475e..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/modules/InsertTable/lang/ch.js
+++ /dev/null
@@ -1,15 +0,0 @@
-// I18N constants
-// LANG: "ch", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Cancel": "取消",
-    "Insert Table": "插入表格",
-    "OK": "好"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/modules/InsertTable/lang/cz.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/modules/InsertTable/lang/cz.js
deleted file mode 100644
index e7813ff..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/modules/InsertTable/lang/cz.js
+++ /dev/null
@@ -1,28 +0,0 @@
-// I18N constants
-// LANG: "cz", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Baseline": "Základní linka",
-    "Border": "Obrys",
-    "Bottom": "Dolů",
-    "Cancel": "Zrušit",
-    "Caption": "Titulek",
-    "Insert Table": "Vložit tabulku",
-    "Layout": "Rozložení",
-    "Left": "Vlevo",
-    "Middle": "Na střed",
-    "OK": "OK",
-    "Percent": "procent",
-    "Pixels": "pixelů",
-    "Right": "Vpravo",
-    "Spacing": "Mezery",
-    "Top": "Nahoru",
-    "Width:": "Šířka"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/modules/InsertTable/lang/da.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/modules/InsertTable/lang/da.js
deleted file mode 100644
index 8b3d3b1..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/modules/InsertTable/lang/da.js
+++ /dev/null
@@ -1,50 +0,0 @@
-// I18N constants
-// LANG: "da", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Absbottom": "Bund",
-    "Absmiddle": "Centreret",
-    "Alignment:": "Justering:",
-    "Baseline": "Grundlinje",
-    "Border": "Ramme",
-    "Border thickness:": "Kantbredde:",
-    "Bottom": "Tekstbund",
-    "Cancel": "Annuller",
-    "Caption": "Titel",
-    "Cell padding:": "Cellefyld:",
-    "Cell spacing:": "Celleafstand:",
-    "Cols:": "Søjler:",
-    "Em": "Geviert (Em)",
-    "Fixed width columns": "Fast-bredde søjler",
-    "Insert Table": "Indsæt tabel",
-    "Layout": "Layout",
-    "Leave empty for no border": "Tom hvis ingen kant",
-    "Left": "Venstre",
-    "Middle": "Midt",
-    "Not set": "Ubestemt",
-    "Number of columns": "Antal søjler",
-    "Number of rows": "Antal rækker",
-    "OK": "OK",
-    "Percent": "Procent",
-    "Pixels": "Pixel",
-    "Positioning of this table": "Placering af tabel",
-    "Right": "Højre",
-    "Rows:": "Rækker:",
-    "Space between adjacent cells": "Afstand mellem celler",
-    "Space between content and border in cell": "Luft mellem indhold og kanter",
-    "Spacing": "Afstand",
-    "Texttop": "Teksttop",
-    "Top": "Top",
-    "Width of the table": "Tabelbredde",
-    "Width unit": "Breddeenhed",
-    "Width:": "Bredde:",
-    "You must enter a number of columns": "Du skal skrive antallet af søjler",
-    "You must enter a number of rows": "Du skal skrive antallet af rækker"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/modules/InsertTable/lang/de.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/modules/InsertTable/lang/de.js
deleted file mode 100644
index e9c4ea9..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/modules/InsertTable/lang/de.js
+++ /dev/null
@@ -1,50 +0,0 @@
-// I18N constants
-// LANG: "de", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Absbottom": "unten bündig",
-    "Absmiddle": "mittig",
-    "Alignment:": "Ausrichtung:",
-    "Baseline": "Grundlinie",
-    "Border": "Rahmen",
-    "Border thickness:": "Randstärke:",
-    "Bottom": "unten",
-    "Cancel": "Abbrechen",
-    "Caption": "Überschrift",
-    "Cell padding:": "Innenabstand:",
-    "Cell spacing:": "Zellenabstand:",
-    "Cols:": "Spalten:",
-    "Em": "Geviert",
-    "Fixed width columns": "Spalten mit fester Breite",
-    "Insert Table": "Tabelle einfügen",
-    "Layout": "Gestaltung",
-    "Leave empty for no border": "leer lassen für keinen Rand",
-    "Left": "links",
-    "Middle": "zentriert",
-    "Not set": "nicht eingestellt",
-    "Number of columns": "Spaltenanzahl",
-    "Number of rows": "Zeilenanzahl",
-    "OK": "OK",
-    "Percent": "Prozent",
-    "Pixels": "Pixel",
-    "Positioning of this table": "Positionierung der Tabelle",
-    "Right": "rechts",
-    "Rows:": "Zeilen:",
-    "Space between adjacent cells": "Raum zwischen angrenzenden Zellen",
-    "Space between content and border in cell": "Raum zwischen Inhalt und Rand der Zelle",
-    "Spacing": "Abstand",
-    "Texttop": "oben bündig",
-    "Top": "oben",
-    "Width of the table": "Tabellenbreite",
-    "Width unit": "Größeneinheit",
-    "Width:": "Breite:",
-    "You must enter a number of columns": "Bitte geben Sie die Anzahl der Spalten an",
-    "You must enter a number of rows": "Bitte geben Sie die Anzahl der Zeilen an"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/modules/InsertTable/lang/ee.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/modules/InsertTable/lang/ee.js
deleted file mode 100644
index d6369f1..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/modules/InsertTable/lang/ee.js
+++ /dev/null
@@ -1,15 +0,0 @@
-// I18N constants
-// LANG: "ee", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Cancel": "Loobu",
-    "Insert Table": "Lisa tabel",
-    "OK": "OK"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/modules/InsertTable/lang/el.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/modules/InsertTable/lang/el.js
deleted file mode 100644
index 6654504..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/modules/InsertTable/lang/el.js
+++ /dev/null
@@ -1,28 +0,0 @@
-// I18N constants
-// LANG: "el", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Baseline": "Baseline",
-    "Border": "Περίγραμμα",
-    "Bottom": "Κάτω μέρος",
-    "Cancel": "Ακύρωση",
-    "Caption": "Λεζάντα",
-    "Insert Table": "Εισαγωγή Πίνακα",
-    "Layout": "Διάταξη",
-    "Left": "Αριστερά",
-    "Middle": "Κέντρο",
-    "OK": "Εντάξει",
-    "Percent": "τοις εκατόν",
-    "Pixels": "pixels",
-    "Right": "Δεξιά",
-    "Spacing": "Αποστάσεις",
-    "Top": "Πάνω",
-    "Width:": "Πλάτος"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/modules/InsertTable/lang/es.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/modules/InsertTable/lang/es.js
deleted file mode 100644
index 7a53e7e..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/modules/InsertTable/lang/es.js
+++ /dev/null
@@ -1,50 +0,0 @@
-// I18N constants
-// LANG: "es", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Absbottom": "Inferior absoluto",
-    "Absmiddle": "Medio Absoluto",
-    "Alignment:": "Alineación:",
-    "Baseline": "Línea base",
-    "Border": "Borde",
-    "Border thickness:": "Tamaño del borde:",
-    "Bottom": "Inferior",
-    "Cancel": "Cancelar",
-    "Caption": "Título",
-    "Cell padding:": "Relleno de celdas:",
-    "Cell spacing:": "Espaciado entre celdas:",
-    "Cols:": "Columnas:",
-    "Em": "Em",
-    "Fixed width columns": "Columnas de ancho fijo",
-    "Insert Table": "Añadir una tabla",
-    "Layout": "Distribución",
-    "Leave empty for no border": "Vacío si no desea ningún borde",
-    "Left": "Izquierda",
-    "Middle": "Medio",
-    "Not set": "No definido",
-    "Number of columns": "Número de columnas",
-    "Number of rows": "Número de filas",
-    "OK": "Aceptar",
-    "Percent": "Porcentaje",
-    "Pixels": "Pixels",
-    "Positioning of this table": "Posición de esta tabla",
-    "Right": "Derecha",
-    "Rows:": "Filas:",
-    "Space between adjacent cells": "Espaciado entre celdas adyacentes",
-    "Space between content and border in cell": "Escapcio entre el contenido y el borde de la celda",
-    "Spacing": "Espaciado",
-    "Texttop": "Texto Superior",
-    "Top": "Superior",
-    "Width of the table": "Ancho de la tabla",
-    "Width unit": "Unidad de anchura",
-    "Width:": "Ancho:",
-    "You must enter a number of columns": "Debe introducir un número de columnas",
-    "You must enter a number of rows": "Debe introducir un número de filas"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/modules/InsertTable/lang/eu.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/modules/InsertTable/lang/eu.js
deleted file mode 100644
index c258d89..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/modules/InsertTable/lang/eu.js
+++ /dev/null
@@ -1,48 +0,0 @@
-// I18N constants
-// LANG: "eu", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Absbottom": "Irudiaren behekaldean",
-    "Absmiddle": "Irudiaren erdian",
-    "Alignment:": "Lerrokatzea:",
-    "Baseline": "Irudiaren oinean",
-    "Border thickness:": "Ertzaren lodiera:",
-    "Bottom": "Behean",
-    "Cancel": "Utzi",
-    "Cell padding:": "Gelaxkaren betegarria:",
-    "Cell spacing:": "Gelaxka-tartea:",
-    "Cols:": "Zutabeak:",
-    "Em": "Em",
-    "Fixed width columns": "Zabalera finkodun zutabeak",
-    "Insert Table": "Taula txertatu",
-    "Layout": "Diseinua",
-    "Leave empty for no border": "Uztazu hutsik ertzik ez sortzeko",
-    "Left": "Ezkerretara",
-    "Middle": "Erdian",
-    "Not set": "Ez gaitua",
-    "Number of columns": "Zutabe-kopurua",
-    "Number of rows": "Lerro-kopurua",
-    "OK": "Ados",
-    "Percent": "Portzentaia",
-    "Pixels": "Pixelak",
-    "Positioning of this table": "Taula honen kokapena",
-    "Right": "Eskuinetara",
-    "Rows:": "Lerroak:",
-    "Space between adjacent cells": "Gelaxka auzokideen arteko tartea",
-    "Space between content and border in cell": "Gelaxkaren edukia eta ertzaren arteko tartea",
-    "Spacing": "Tartea",
-    "Texttop": "Irudiaren goialdean",
-    "Top": "Goian",
-    "Width of the table": "Taularen zabalera",
-    "Width unit": "Zabalera-unitatea",
-    "Width:": "Zabalera:",
-    "You must enter a number of columns": "Zutabe-kopurua idatzi behar duzu",
-    "You must enter a number of rows": "Lerro-kopurua idatzi behar duzu"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/modules/InsertTable/lang/fa.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/modules/InsertTable/lang/fa.js
deleted file mode 100644
index 23e88c4..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/modules/InsertTable/lang/fa.js
+++ /dev/null
@@ -1,48 +0,0 @@
-// I18N constants
-// LANG: "fa", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Absbottom": "دقیقا پایین",
-    "Absmiddle": "دقیقا وسط",
-    "Alignment:": "تراز بندی",
-    "Baseline": "ابتدای خط",
-    "Border thickness:": "ضخامت لبه",
-    "Bottom": "پایین",
-    "Cancel": "انصراف",
-    "Cell padding:": "پر کننده سلول",
-    "Cell spacing:": "فاصله سلول ها",
-    "Cols:": "ستون ها",
-    "Em": "Em",
-    "Fixed width columns": "ستون های طول ثابت",
-    "Insert Table": "افزودن جدول",
-    "Layout": "لایه",
-    "Leave empty for no border": "برای بدون لبه خالی رها کن",
-    "Left": "چپ",
-    "Middle": "وسط",
-    "Not set": "تنظیم نشده",
-    "Number of columns": "تعداد ستون ها",
-    "Number of rows": "تعداد ردیف ها",
-    "OK": "بله",
-    "Percent": "درصد",
-    "Pixels": "پیکسل ها",
-    "Positioning of this table": "موقعیت یابی این جدول",
-    "Right": "راست",
-    "Rows:": "ردیف ها",
-    "Space between adjacent cells": "فاصله بین سلول های همجوار",
-    "Space between content and border in cell": "فاصله بین محتوا و لبه در سلول",
-    "Spacing": "فاصله گذاری",
-    "Texttop": "بالای متن",
-    "Top": "بالا",
-    "Width of the table": "طول جدول",
-    "Width unit": "واحد طول",
-    "Width:": "طول",
-    "You must enter a number of columns": "باید تعداد ستون ها را وارد کنید",
-    "You must enter a number of rows": "باید تعداد ردیف ها را وارد کنید"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/modules/InsertTable/lang/fi.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/modules/InsertTable/lang/fi.js
deleted file mode 100644
index b269fc3..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/modules/InsertTable/lang/fi.js
+++ /dev/null
@@ -1,28 +0,0 @@
-// I18N constants
-// LANG: "fi", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Baseline": "Takaraja",
-    "Border": "Reuna",
-    "Bottom": "Alle",
-    "Cancel": "Peruuta",
-    "Caption": "Otsikko",
-    "Insert Table": "Lisää taulukko",
-    "Layout": "Sommittelu",
-    "Left": "Vasen",
-    "Middle": "Keskelle",
-    "OK": "Hyväksy",
-    "Percent": "prosenttia",
-    "Pixels": "pikseliä",
-    "Right": "Oikea",
-    "Spacing": "Palstatila",
-    "Top": "Ylös",
-    "Width:": "Leveys"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/modules/InsertTable/lang/fr.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/modules/InsertTable/lang/fr.js
deleted file mode 100644
index 7c5f9cf..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/modules/InsertTable/lang/fr.js
+++ /dev/null
@@ -1,50 +0,0 @@
-// I18N constants
-// LANG: "fr", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Absbottom": "Absbottom",
-    "Absmiddle": "Absmiddle",
-    "Alignment:": "Alignement",
-    "Baseline": "Baseline",
-    "Border": "Bordure",
-    "Border thickness:": "Epaisseur bordure",
-    "Bottom": "Bas",
-    "Cancel": "Annuler",
-    "Caption": "Étiquette",
-    "Cell padding:": "Marge interne",
-    "Cell spacing:": "Espacement",
-    "Cols:": "Colonnes",
-    "Em": "Em",
-    "Fixed width columns": "Colonnes à taille fixe",
-    "Insert Table": "Insérer un tableau",
-    "Layout": "Layout",
-    "Leave empty for no border": "Laisser vide pour pas de bordure",
-    "Left": "Gauche",
-    "Middle": "Milieu",
-    "Not set": "Indéfini",
-    "Number of columns": "Nombre de colonnes",
-    "Number of rows": "Nombre de lignes",
-    "OK": "OK",
-    "Percent": "Pourcent",
-    "Pixels": "Pixels",
-    "Positioning of this table": "Position du tableau",
-    "Right": "Droite",
-    "Rows:": "Lignes",
-    "Space between adjacent cells": "Espace entre les cellules adjacentes",
-    "Space between content and border in cell": "Espace entre le contenu et la bordure d'une cellule",
-    "Spacing": "Espacement",
-    "Texttop": "Texttop",
-    "Top": "Haut",
-    "Width of the table": "Largeur du tableau",
-    "Width unit": "Unités de largeur",
-    "Width:": "Largeur",
-    "You must enter a number of columns": "Vous devez entrer le nombre de colonnes",
-    "You must enter a number of rows": "Vous devez entrer le nombre de lignes"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/modules/InsertTable/lang/he.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/modules/InsertTable/lang/he.js
deleted file mode 100644
index 242440b..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/modules/InsertTable/lang/he.js
+++ /dev/null
@@ -1,28 +0,0 @@
-// I18N constants
-// LANG: "he", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Baseline": "קו בסיס",
-    "Border": "גבול",
-    "Bottom": "תחתון",
-    "Cancel": "ביטול",
-    "Caption": "כותרת",
-    "Insert Table": "הכנס טבלה",
-    "Layout": "פריסה",
-    "Left": "שמאל",
-    "Middle": "אמצע",
-    "OK": "אישור",
-    "Percent": "אחוז",
-    "Pixels": "פיקסלים",
-    "Right": "ימין",
-    "Spacing": "ריווח",
-    "Top": "עליון",
-    "Width:": "רוחב"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/modules/InsertTable/lang/hu.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/modules/InsertTable/lang/hu.js
deleted file mode 100644
index 5bdce90..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/modules/InsertTable/lang/hu.js
+++ /dev/null
@@ -1,15 +0,0 @@
-// I18N constants
-// LANG: "hu", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Cancel": "Mégsem",
-    "Insert Table": "Táblázat beszúrása",
-    "OK": "Rendben"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/modules/InsertTable/lang/it.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/modules/InsertTable/lang/it.js
deleted file mode 100644
index 6dbbb8b..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/modules/InsertTable/lang/it.js
+++ /dev/null
@@ -1,28 +0,0 @@
-// I18N constants
-// LANG: "it", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Baseline": "Allineamento",
-    "Border": "Bordo",
-    "Bottom": "Basso",
-    "Cancel": "Annullamento",
-    "Caption": "Titolo",
-    "Insert Table": "Inserisci tabella",
-    "Layout": "Layout",
-    "Left": "Sinistra",
-    "Middle": "Centrale",
-    "OK": "OK",
-    "Percent": "percento",
-    "Pixels": "pixels",
-    "Right": "Destra",
-    "Spacing": "Spaziatura",
-    "Top": "Alto",
-    "Width:": "Larghezza"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/modules/InsertTable/lang/ja.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/modules/InsertTable/lang/ja.js
deleted file mode 100644
index 1a8b2f7..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/modules/InsertTable/lang/ja.js
+++ /dev/null
@@ -1,50 +0,0 @@
-// I18N constants
-// LANG: "ja", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Absbottom": "下(絶対的)",
-    "Absmiddle": "中央(絶対的)",
-    "Alignment:": "行揃え:",
-    "Baseline": "ベースライン",
-    "Border": "ボーダー",
-    "Border thickness:": "境界線の幅:",
-    "Bottom": "下",
-    "Cancel": "中止",
-    "Caption": "キャプション",
-    "Cell padding:": "セル余白:",
-    "Cell spacing:": "セル間隔:",
-    "Cols:": "列:",
-    "Em": "相対値(em)",
-    "Fixed width columns": "列の幅を固定",
-    "Insert Table": "テーブルの挿入",
-    "Layout": "レイアウト",
-    "Leave empty for no border": "境界線がない場合は空のままにする",
-    "Left": "左",
-    "Middle": "中央",
-    "Not set": "なし",
-    "Number of columns": "列数",
-    "Number of rows": "行数",
-    "OK": "OK",
-    "Percent": "パーセント(%)",
-    "Pixels": "ピクセル(px)",
-    "Positioning of this table": "このテーブルの配置",
-    "Right": "右",
-    "Rows:": "行数:",
-    "Space between adjacent cells": "隣接するセル間の距離",
-    "Space between content and border in cell": "セル内における内容と境界線との距離",
-    "Spacing": "間隔",
-    "Texttop": "テキスト上部",
-    "Top": "上",
-    "Width of the table": "テーブルの幅",
-    "Width unit": "幅の単位",
-    "Width:": "幅:",
-    "You must enter a number of columns": "列数を入力してください",
-    "You must enter a number of rows": "行数を入力してください"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/modules/InsertTable/lang/lc_base.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/modules/InsertTable/lang/lc_base.js
deleted file mode 100644
index 3b4b3f9..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/modules/InsertTable/lang/lc_base.js
+++ /dev/null
@@ -1,66 +0,0 @@
-// I18N constants
-//
-// LANG: "en", ENCODING: UTF-8
-// Author: Translator-Name, <email@example.com>
-//
-// Last revision: 2018-04-12
-// 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).
-//
-// (Please, remove information below)
-// 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.)
-
-{
-    "Absbottom": "",
-    "Absmiddle": "",
-    "Alignment:": "",
-    "Baseline": "",
-    "Border": "",
-    "Border thickness:": "",
-    "Bottom": "",
-    "Cancel": "",
-    "Caption": "",
-    "Caption for the table": "",
-    "Cell padding:": "",
-    "Cell spacing:": "",
-    "Collapse borders:": "",
-    "Cols:": "",
-    "Em": "",
-    "Fixed width columns": "",
-    "Insert Table": "",
-    "Layou": "",
-    "Layout": "",
-    "Leave empty for no border": "",
-    "Left": "",
-    "Middle": "",
-    "Not set": "",
-    "Number of columns": "",
-    "Number of rows": "",
-    "OK": "",
-    "Percent": "",
-    "Pixels": "",
-    "Positioning of this table": "",
-    "Right": "",
-    "Rows:": "",
-    "Space between adjacent cells": "",
-    "Space between content and border in cell": "",
-    "Spacing": "",
-    "Style of the border": "",
-    "Texttop": "",
-    "Top": "",
-    "Width of the table": "",
-    "Width unit": "",
-    "Width:": "",
-    "You must enter a number of columns": "",
-    "You must enter a number of rows": ""
-}
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/modules/InsertTable/lang/lt.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/modules/InsertTable/lang/lt.js
deleted file mode 100644
index 680348b..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/modules/InsertTable/lang/lt.js
+++ /dev/null
@@ -1,15 +0,0 @@
-// I18N constants
-// LANG: "lt", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Cancel": "Atšaukti",
-    "Insert Table": "Įterpti lentelę",
-    "OK": "OK"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/modules/InsertTable/lang/lv.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/modules/InsertTable/lang/lv.js
deleted file mode 100644
index 9f39e83..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/modules/InsertTable/lang/lv.js
+++ /dev/null
@@ -1,15 +0,0 @@
-// I18N constants
-// LANG: "lv", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Cancel": "Atcelt",
-    "Insert Table": "Ievietot tabulu",
-    "OK": "Labi"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/modules/InsertTable/lang/nb.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/modules/InsertTable/lang/nb.js
deleted file mode 100644
index ca91884..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/modules/InsertTable/lang/nb.js
+++ /dev/null
@@ -1,30 +0,0 @@
-// I18N constants
-// LANG: "nb", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Alignment:": "Justering:",
-    "Baseline": "Grunnlinje",
-    "Border": "Ramme",
-    "Border thickness:": "Rammetykkelse:",
-    "Bottom": "Bunn",
-    "Cancel": "Avbryt",
-    "Caption": "Overskrift",
-    "Insert Table": "Sett inn tabell",
-    "Layout": "Oppsett",
-    "Left": "Venstre",
-    "Middle": "Midten",
-    "OK": "OK",
-    "Percent": "prosent",
-    "Pixels": "Piksel",
-    "Right": "Høyre",
-    "Spacing": "Luft",
-    "Top": "Overkant",
-    "Width:": "Bredde:"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/modules/InsertTable/lang/nl.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/modules/InsertTable/lang/nl.js
deleted file mode 100644
index 5a13d92..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/modules/InsertTable/lang/nl.js
+++ /dev/null
@@ -1,32 +0,0 @@
-// I18N constants
-// LANG: "nl", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Alignment:": "Uitvulling:",
-    "Baseline": "Basis",
-    "Border": "Kader",
-    "Border thickness:": "Rand dikte:",
-    "Bottom": "Onder",
-    "Cancel": "Annuleren",
-    "Caption": "Opmerking",
-    "Insert Table": "Tabel invoegen",
-    "Layout": "Weergave",
-    "Leave empty for no border": "Leeg voor geen rand",
-    "Left": "Links",
-    "Middle": "Midden",
-    "OK": "OK",
-    "Percent": "procent",
-    "Pixels": "pixels",
-    "Right": "Rechts",
-    "Rows:": "Rijen:",
-    "Spacing": "marge",
-    "Top": "Boven",
-    "Width:": "Breedte:"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/modules/InsertTable/lang/pl.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/modules/InsertTable/lang/pl.js
deleted file mode 100644
index e1d6906..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/modules/InsertTable/lang/pl.js
+++ /dev/null
@@ -1,48 +0,0 @@
-// I18N constants
-// LANG: "pl", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Absbottom": "Abs. dół",
-    "Absmiddle": "Abs. środek",
-    "Alignment:": "Wyrównanie:",
-    "Baseline": "Linia bazowa",
-    "Border": "Ramka",
-    "Border thickness:": "Grubość obramowania:",
-    "Bottom": "Dół",
-    "Cancel": "Anuluj",
-    "Caption": "Podpis",
-    "Cell padding:": "Wcięcie komórek:",
-    "Cell spacing:": "Odstęp komórek:",
-    "Cols:": "Kolumn:",
-    "Em": "Em",
-    "Fixed width columns": "Kolumny o stałej szerokości",
-    "Insert Table": "Wstaw tabelę",
-    "Layout": "Layout",
-    "Leave empty for no border": "Bez ramek - zostaw puste",
-    "Left": "Do lewej",
-    "Middle": "Środek",
-    "Not set": "Nie ustawione",
-    "Number of columns": "Liczba kolumn",
-    "Number of rows": "Liczba wierszy",
-    "OK": "OK",
-    "Percent": "Procent",
-    "Pixels": "Pikseli",
-    "Positioning of this table": "Pozycjonowanie tabeli",
-    "Right": "Do prawej",
-    "Rows:": "Wierszy:",
-    "Space between adjacent cells": "Przestrzeń pomiędzy komórkami",
-    "Space between content and border in cell": "Przestrzeń między krawędzią a zawartością komórki",
-    "Spacing": "Odstęp",
-    "Texttop": "Góra tekstu",
-    "Top": "Góra",
-    "Width of the table": "Szerokość tabeli",
-    "Width unit": "Jednostka",
-    "Width:": "Szerokość:"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/modules/InsertTable/lang/pt_br.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/modules/InsertTable/lang/pt_br.js
deleted file mode 100644
index cb5fe44..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/modules/InsertTable/lang/pt_br.js
+++ /dev/null
@@ -1,49 +0,0 @@
-// I18N constants
-// LANG: "pt_br", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Absbottom": "Inferior absoluto",
-    "Absmiddle": "Meio absoluto",
-    "Alignment:": "Alinhamento:",
-    "Baseline": "Linha de base",
-    "Border": "Borda",
-    "Border thickness:": "Espessura da Borda",
-    "Bottom": "Base",
-    "Cancel": "Cancelar",
-    "Caption": "Captação",
-    "Cell padding:": "Espaçamento interno da célula:",
-    "Cell spacing:": "Espaçamento da célula:",
-    "Collapse borders:": "Bordas fechadas:",
-    "Cols:": "Colunas:",
-    "Em": "Em",
-    "Fixed width columns": "Colunas com largura fixa",
-    "Insert Table": "Inserir Tabela",
-    "Layout": "Esquema",
-    "Leave empty for no border": "Deixe em branco para sem bordas",
-    "Left": "Esquerda",
-    "Middle": "Meio",
-    "Not set": "Não definido",
-    "Number of columns": "Número de colunas",
-    "Number of rows": "Número de linhas",
-    "OK": "OK",
-    "Percent": "Porcentagem",
-    "Pixels": "Pixels",
-    "Positioning of this table": "Posicionamento desta tabela",
-    "Right": "Direita",
-    "Rows:": "Linhas:",
-    "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",
-    "Texttop": "Texto no topo",
-    "Top": "Topo",
-    "Width of the table": "Largura da tabela",
-    "Width unit": "Unidade de largura",
-    "Width:": "Largura:"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/modules/InsertTable/lang/ro.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/modules/InsertTable/lang/ro.js
deleted file mode 100644
index ccaccff..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/modules/InsertTable/lang/ro.js
+++ /dev/null
@@ -1,28 +0,0 @@
-// I18N constants
-// LANG: "ro", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Baseline": "Baseline",
-    "Border": "Chenar",
-    "Bottom": "Jos",
-    "Cancel": "Renunţă",
-    "Caption": "Titlu de tabel",
-    "Insert Table": "Inserează un tabel",
-    "Layout": "Aranjament",
-    "Left": "Stânga",
-    "Middle": "Mijloc",
-    "OK": "Acceptă",
-    "Percent": "procente",
-    "Pixels": "pixeli",
-    "Right": "Dreapta",
-    "Spacing": "Între celule",
-    "Top": "Sus",
-    "Width:": "Lăţime"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/modules/InsertTable/lang/ru.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/modules/InsertTable/lang/ru.js
deleted file mode 100644
index fe6d4be..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/modules/InsertTable/lang/ru.js
+++ /dev/null
@@ -1,50 +0,0 @@
-// I18N constants
-// LANG: "ru", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Absbottom": "По нижней границе",
-    "Absmiddle": "По середине текста",
-    "Alignment:": "Выравнивание",
-    "Baseline": "По нижней границе текста",
-    "Border": "Рамка",
-    "Border thickness:": "Толщина рамки",
-    "Bottom": "По нижнему краю",
-    "Cancel": "Отмена",
-    "Caption": "Заголовок",
-    "Cell padding:": "Поля в ячейках",
-    "Cell spacing:": "Расстояние между ячейками",
-    "Cols:": "Столбцы",
-    "Em": "em",
-    "Fixed width columns": "Столбцы фиксированной ширины",
-    "Insert Table": "Вставка таблицы",
-    "Layout": "Расположение",
-    "Leave empty for no border": "Оставьте пустым, чтобы убрать рамку",
-    "Left": "По левому краю",
-    "Middle": "Посредине",
-    "Not set": "Не установлено",
-    "Number of columns": "Количество столбцов",
-    "Number of rows": "Количество строк",
-    "OK": "OK",
-    "Percent": "проценты",
-    "Pixels": "пикселы",
-    "Positioning of this table": "Расположение таблицы",
-    "Right": "По правому краю",
-    "Rows:": "Строки",
-    "Space between adjacent cells": "Расстояние между соседними ячейками",
-    "Space between content and border in cell": "Расстояние между границей ячейки и текстом",
-    "Spacing": "Отступы",
-    "Texttop": "По верхней границе текста",
-    "Top": "По верхнему краю",
-    "Width of the table": "Ширина таблицы",
-    "Width unit": "Единицы измерения",
-    "Width:": "Ширина",
-    "You must enter a number of columns": "Вы должны ввести количество столбцов",
-    "You must enter a number of rows": "Вы должны ввести количество строк"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/modules/InsertTable/lang/sh.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/modules/InsertTable/lang/sh.js
deleted file mode 100644
index c554bfc..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/modules/InsertTable/lang/sh.js
+++ /dev/null
@@ -1,46 +0,0 @@
-// I18N constants
-// LANG: "sh", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Absbottom": "Apsolutno dno",
-    "Absmiddle": "Apsolutna sredina",
-    "Alignment:": "Ravnanje",
-    "Baseline": "Donja linija",
-    "Border thickness:": "Debljina okvira",
-    "Bottom": "Dno",
-    "Cancel": "Poništi",
-    "Cell padding:": "Unutrašnja odstojanja u ćeliji",
-    "Cell spacing:": "Rastojanje ćelija",
-    "Cols:": "Kolone",
-    "Em": "Em",
-    "Fixed width columns": "Fiksirana širina kolona",
-    "Insert Table": "Ubaci tabelu",
-    "Layout": "Prelom",
-    "Leave empty for no border": "Ostavi prazno kad nema okvira",
-    "Left": "Levo",
-    "Middle": "Sredina",
-    "Not set": "Nije postavljeno",
-    "Number of columns": "Broj kolona",
-    "Number of rows": "Broj redova",
-    "OK": "OK",
-    "Percent": "Procenat",
-    "Pixels": "Pikseli",
-    "Positioning of this table": "Postavljanje ove tabele",
-    "Right": "Desno",
-    "Rows:": "Redovi",
-    "Space between adjacent cells": "Rastojanje naspramnih ćelija",
-    "Space between content and border in cell": "Rastojanje između sadržaja i okvira ćelije",
-    "Spacing": "Razmak",
-    "Texttop": "Vrh teksta",
-    "Top": "Vrh",
-    "Width of the table": "Širina tabele",
-    "Width unit": "Jedinica širine",
-    "Width:": "Širina"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/modules/InsertTable/lang/si.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/modules/InsertTable/lang/si.js
deleted file mode 100644
index 3b83898..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/modules/InsertTable/lang/si.js
+++ /dev/null
@@ -1,15 +0,0 @@
-// I18N constants
-// LANG: "si", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Cancel": "Prekliči",
-    "Insert Table": "Vstavi tabelo",
-    "OK": "V redu"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/modules/InsertTable/lang/sr.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/modules/InsertTable/lang/sr.js
deleted file mode 100644
index 4c1778d..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/modules/InsertTable/lang/sr.js
+++ /dev/null
@@ -1,46 +0,0 @@
-// I18N constants
-// LANG: "sr", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Absbottom": "Апсолутно дно",
-    "Absmiddle": "Апсолутна средина",
-    "Alignment:": "Равнање",
-    "Baseline": "Доња линија",
-    "Border thickness:": "Дебљина оквира",
-    "Bottom": "Дно",
-    "Cancel": "Поништи",
-    "Cell padding:": "Унутрашња одстојања од ивица ћелије",
-    "Cell spacing:": "Размак између ћелија",
-    "Cols:": "Колоне",
-    "Em": "Ем",
-    "Fixed width columns": "Фиксирана ширина колоне",
-    "Insert Table": "Убаци табелу",
-    "Layout": "Прелом",
-    "Leave empty for no border": "Остави празно кад нема оквира",
-    "Left": "Лево",
-    "Middle": "Средина",
-    "Not set": "Није постављено",
-    "Number of columns": "Број колона",
-    "Number of rows": "Број редова",
-    "OK": "OK",
-    "Percent": "Процената",
-    "Pixels": "Пиксела",
-    "Positioning of this table": "Постављање ове табеле",
-    "Right": "Десно",
-    "Rows:": "Редови",
-    "Space between adjacent cells": "Размак између наспрамних ћелија",
-    "Space between content and border in cell": "Растојање између садржаја у ћелији и њеног оквира",
-    "Spacing": "Размак",
-    "Texttop": "Врх текста",
-    "Top": "Врх",
-    "Width of the table": "Ширина табеле",
-    "Width unit": "Јединица ширине",
-    "Width:": "Ширина"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/modules/InsertTable/lang/sv.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/modules/InsertTable/lang/sv.js
deleted file mode 100644
index 8b07026..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/modules/InsertTable/lang/sv.js
+++ /dev/null
@@ -1,45 +0,0 @@
-// I18N constants
-// LANG: "sv", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Alignment:": "Placering:",
-    "Baseline": "Baslinje",
-    "Border": "Kantlinje",
-    "Border thickness:": "Ramtjocklek:",
-    "Bottom": "Botten",
-    "Cancel": "Avbryt",
-    "Caption": "Överskrift",
-    "Cell padding:": "Cellindrag:",
-    "Cell spacing:": "Cellmarginaler:",
-    "Cols:": "Kolumner:",
-    "Fixed width columns": "Fixerad bredd",
-    "Insert Table": "Infoga tabell",
-    "Layout": "Layout",
-    "Leave empty for no border": "Lämna tomt för att undvika ram",
-    "Left": "Venster",
-    "Middle": "Mitten",
-    "Number of columns": "Antal kolumner",
-    "Number of rows": "Antal rader",
-    "OK": "OK",
-    "Percent": "Procent",
-    "Pixels": "Pixlar",
-    "Positioning of this table": "Tabellposition",
-    "Right": "Höger",
-    "Rows:": "Rader:",
-    "Space between adjacent cells": "Utrymme mellan celler",
-    "Space between content and border in cell": "Utrymme mellan ram och cellinnehåll",
-    "Spacing": "Mellanrum",
-    "Top": "Överkant",
-    "Width of the table": "Tabellbredd",
-    "Width unit": "Breddenheter",
-    "Width:": "Bredd:",
-    "You must enter a number of columns": "Ange antal kolumner",
-    "You must enter a number of rows": "Ange ental rader"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/modules/InsertTable/lang/th.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/modules/InsertTable/lang/th.js
deleted file mode 100644
index 288435e..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/modules/InsertTable/lang/th.js
+++ /dev/null
@@ -1,15 +0,0 @@
-// I18N constants
-// LANG: "th", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Cancel": "ยกเลิก",
-    "Insert Table": "เพิ่มตาราง",
-    "OK": "ตกลง"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/modules/InsertTable/lang/tr.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/modules/InsertTable/lang/tr.js
deleted file mode 100644
index a80b191..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/modules/InsertTable/lang/tr.js
+++ /dev/null
@@ -1,50 +0,0 @@
-// I18N constants
-// LANG: "tr", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Absbottom": "Salt alta",
-    "Absmiddle": "Salt orta",
-    "Alignment:": "Hizalama:",
-    "Baseline": "Taban hizası",
-    "Border": "Kenarlık",
-    "Border thickness:": "Kenarlık kalınlığı:",
-    "Bottom": "Alta",
-    "Cancel": "İptal",
-    "Caption": "Başlık",
-    "Cell padding:": "Hücre doldurma:",
-    "Cell spacing:": "Hücre aralığı:",
-    "Cols:": "Sütun:",
-    "Em": "Em",
-    "Fixed width columns": "Sabit başlı sütun",
-    "Insert Table": "Tablo ekle",
-    "Layout": "Düzen",
-    "Leave empty for no border": "Kenarlık istemiyorsanız boş bırakın",
-    "Left": "Sola",
-    "Middle": "Ortala",
-    "Not set": "Ayarlanmamış",
-    "Number of columns": "Sütun sayısı",
-    "Number of rows": "Satır sayısı",
-    "OK": "Tamam",
-    "Percent": "Yüzde",
-    "Pixels": "Piksel",
-    "Positioning of this table": "Tablo konumlandırma",
-    "Right": "Sağa",
-    "Rows:": "Satır:",
-    "Space between adjacent cells": "Bitişik hücre aralığı",
-    "Space between content and border in cell": "İç kenarlığı ve hücre içeriği arasındaki boşluk",
-    "Spacing": "Aralık",
-    "Texttop": "Metin-üstte",
-    "Top": "Yukarı",
-    "Width of the table": "Tablo genişliği",
-    "Width unit": "Genişlik birimi",
-    "Width:": "Genişlik:",
-    "You must enter a number of columns": "Lütfen sütun sayısını girin",
-    "You must enter a number of rows": "Lütfen satır sayısını girin"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/modules/InsertTable/lang/vn.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/modules/InsertTable/lang/vn.js
deleted file mode 100644
index ae21e28..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/modules/InsertTable/lang/vn.js
+++ /dev/null
@@ -1,15 +0,0 @@
-// I18N constants
-// LANG: "vn", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Cancel": "Hủy",
-    "Insert Table": "Chèn Bảng",
-    "OK": "Đồng ý"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/modules/InsertTable/lang/zh_cn.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/modules/InsertTable/lang/zh_cn.js
deleted file mode 100644
index 678077d..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/modules/InsertTable/lang/zh_cn.js
+++ /dev/null
@@ -1,13 +0,0 @@
-// I18N constants
-// LANG: "zh_cn", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Insert Table": "插入表格"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/modules/InsertTable/pluginMethods.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/modules/InsertTable/pluginMethods.js
deleted file mode 100644
index 7af24fe..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/modules/InsertTable/pluginMethods.js
+++ /dev/null
@@ -1,118 +0,0 @@
-InsertTable.prototype.show = function(image)
-{
-  if (!this.dialog) this.prepareDialog();
-
-  var editor = this.editor;
-
-  var values = 
-  {
-    "caption"          : '',
-    "rows"             : '2',
-    "cols"             : '4',
-    "width"            : '100',
-    "unit"             : '%',
-    "fixed"            : '',
-    "align"            : '',
-    "border"           : '',
-    "border_style"     : '',
-    "border_color"     : '',
-    "border_collapse"  : 'on',
-    "spacing"          : '',
-    "padding"          : '5'
-  }
-  // update the color of the picker manually
-  this.borderColorPicker.setColor('#000000');
-  // now calling the show method of the Xinha.Dialog object to set the values and show the actual dialog
-  this.dialog.show(values);
-  this.dialog.onresize();
-};
-
-InsertTable.prototype.apply = function()
-{
-  var editor = this.editor;
-  var doc = editor._doc;
-  var param = this.dialog.getValues();
-  
-  if (!param.rows || !param.cols)
-  {
-    if (!param.rows)
-    {
-      this.dialog.getElementById("rows_alert").style.display = '';
-    }
-    if (!param.cols)
-    {
-      this.dialog.getElementById("columns_alert").style.display = '';
-    }
-    return;
-  }
-  // selection is only restored on dialog.hide()
-  this.dialog.hide();
-  // create the table element
-  var table = doc.createElement("table");
-  // assign the given arguments
-  
-  for ( var field in param )
-  {
-    var value = param[field];
-    if ( !value )
-    {
-      continue;
-    }
-    switch (field)
-    {
-      case "width":
-      table.style.width = value + param.unit.value;
-      break;
-      case "align":
-      table.align = value.value;
-      break;
-      case "border":
-      table.style.border = value + 'px ' + param.border_style.value + ' ' + param.border_color;
-      break;
-      case "border_collapse":
-      table.style.borderCollapse = (value == 'on') ? 'collapse' : '' ;
-      break;
-      case "spacing":
-      table.cellSpacing = parseInt(value, 10);
-      break;
-      case "padding":
-      table.cellPadding = parseInt(value, 10);
-      break;
-    }
-  }
-  if (param.caption)
-  {
-    var caption = table.createCaption();
-    caption.appendChild(doc.createTextNode(param.caption));
-   }
-  var cellwidth = 0;
-  if ( param.fixed )
-  {
-    cellwidth = Math.floor(100 / parseInt(param.cols, 10));
-  }
-  var tbody = doc.createElement("tbody");
-  table.appendChild(tbody);
-  for ( var i = 0; i < param.rows; ++i )
-  {
-    var tr = doc.createElement("tr");
-    tbody.appendChild(tr);
-    for ( var j = 0; j < param.cols; ++j )
-    {
-      var td = doc.createElement("td");
-      // @todo : check if this line doesnt stop us to use pixel width in cells
-      if (cellwidth && i===0)
-      {
-        td.style.width = cellwidth + "%";
-      }
-      if (param.border)
-      {
-        td.style.border = param.border + 'px ' + param.border_style.value + ' ' + param.border_color;
-      }
-      tr.appendChild(td);
-      // Browsers like to see something inside the cell (&nbsp;).
-      td.appendChild(doc.createTextNode('\u00a0'));
-    }
-  }
-  // insert the table
-  editor.insertNodeAtSelection(table);
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/modules/InternetExplorer/InternetExplorer.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/modules/InternetExplorer/InternetExplorer.js
deleted file mode 100644
index 633c0a2..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/modules/InternetExplorer/InternetExplorer.js
+++ /dev/null
@@ -1,1002 +0,0 @@
-

-  /*--------------------------------------:noTabs=true:tabSize=2:indentSize=2:--

-    --

-    --  NOTICE Modern IE does not use this engine any more

-    --

-    --          IE 11 identifies as Gecko

-    --          Edge  identifies as WebKit

-    --

-    --  The last IE version to use this engine is probably IE10, people should

-    --   not use such an old version of IE and should upgrade or use a WebKit

-    --   or Gecko based browser.

-    --

-    --  This engine is no longer officially supported or tested.

-    --

-    -----------------------------------------------------------------------------

-    --

-    --  Xinha (is not htmlArea) - http://xinha.gogo.co.nz/

-    --

-    --  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.

-    --

-    --  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.

-    --

-    -- This is the Internet Explorer compatability plugin, part of the 

-    -- Xinha core.

-    --

-    --  The file is loaded as a special plugin by the Xinha Core when

-    --  Xinha is being run under an Internet Explorer based browser.

-    --

-    --  It provides implementation and specialisation for various methods

-    --  in the core where different approaches per browser are required.

-    --

-    --  Design Notes::

-    --   Most methods here will simply be overriding Xinha.prototype.<method>

-    --   and should be called that, but methods specific to IE should 

-    --   be a part of the InternetExplorer.prototype, we won't trample on 

-    --   namespace that way.

-    --

-    --  $HeadURL: http://svn.xinha.org/trunk/modules/InternetExplorer/InternetExplorer.js $

-    --  $LastChangedDate: 2018-02-19 20:35:49 +1300 (Mon, 19 Feb 2018) $

-    --  $LastChangedRevision: 1402 $

-    --  $LastChangedBy: gogo $

-    --------------------------------------------------------------------------*/

-                                                    

-InternetExplorer._pluginInfo = {

-  name          : "Internet Explorer",

-  origin        : "Xinha Core",

-  version       : "$LastChangedRevision: 1402 $".replace(/^[^:]*:\s*(.*)\s*\$$/, '$1'),

-  developer     : "The Xinha Core Developer Team",

-  developer_url : "$HeadURL: http://svn.xinha.org/trunk/modules/InternetExplorer/InternetExplorer.js $".replace(/^[^:]*:\s*(.*)\s*\$$/, '$1'),

-  sponsor       : "",

-  sponsor_url   : "",

-  license       : "htmlArea"

-};

-

-function InternetExplorer(editor) {

-  this.editor = editor;  

-  editor.InternetExplorer = this; // So we can do my_editor.InternetExplorer.doSomethingIESpecific();

-}

-

-/** Allow Internet Explorer to handle some key events in a special way.

- */

-InternetExplorer.prototype.onKeyPress = function(ev)

-{

-  var editor = this.editor;

-  

-  // Shortcuts

-  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: // KEY backspace

-    case 46: // KEY delete

-    {

-      if(this.handleBackspace())

-      {

-        Xinha._stopEvent(ev);

-        return true;

-      }

-    }

-    break;

-    

-    case 9: // KEY tab

-    {

-      // Note that the ListOperations plugin will handle tabs in list items and indent/outdent those

-      // at some point TableOperations might do also

-      // so this only has to handle a tab/untab in text

-      if(editor.config.tabSpanClass)

-      {

-        if(!ev.shiftKey)

-        {                  //  v-- Avoid lc_parse_strings.php

-          editor.insertHTML('<'+'span class="'+editor.config.tabSpanClass+'">'+editor.config.tabSpanContents+'</span>');

-          var s = editor.getSelection();

-          var r = editor.createRange(s);                   

-          r.collapse(true);

-          r.select();

-        }

-        else

-        {

-          // Shift tab is not trivial to fix in old IE

-          // and I don't care enough about it to try hard

-        }

-      }

-      

-      Xinha._stopEvent(ev);

-      return true;

-    }

-    break;

-

-  }

-  

-  return false;

-}

-

-/** When backspace is hit, the IE onKeyPress will execute this method.

- *  It preserves links when you backspace over them and apparently 

- *  deletes control elements (tables, images, form fields) in a better

- *  way.

- *

- *  @returns true|false True when backspace has been handled specially

- *   false otherwise (should pass through). 

- */

-

-InternetExplorer.prototype.handleBackspace = function()

-{

-  var editor = this.editor;

-  var sel = editor.getSelection();

-  if ( sel.type == 'Control' )

-  {

-    var elm = editor.activeElement(sel);

-    Xinha.removeFromParent(elm);

-    return true;

-  }

-

-  // This bit of code preseves links when you backspace over the

-  // endpoint of the link in IE.  Without it, if you have something like

-  //    link_here |

-  // where | is the cursor, and backspace over the last e, then the link

-  // will de-link, which is a bit tedious

-  var range = editor.createRange(sel);

-  var r2 = range.duplicate();

-  r2.moveStart("character", -1);

-  var a = r2.parentElement();

-  // @fixme: why using again a regex to test a single string ???

-  if ( a != range.parentElement() && ( /^a$/i.test(a.tagName) ) )

-  {

-    r2.collapse(true);

-    r2.moveEnd("character", 1);

-    r2.pasteHTML('');

-    r2.select();

-    return true;

-  }

-};

-

-InternetExplorer.prototype.inwardHtml = function(html)

-{

-   // Both IE and Gecko use strike internally instead of del (#523)

-   // Xinha will present del externally (see Xinha.prototype.outwardHtml

-   html = html.replace(/<(\/?)del(\s|>|\/)/ig, "<$1strike$2");

-   // ie eats scripts and comments at beginning of page, so

-   // make sure there is something before the first script on the page

-   html = html.replace(/(<script|<!--)/i,"&nbsp;$1");

-   

-   // We've got a workaround for certain issues with saving and restoring

-   // selections that may cause us to fill in junk span tags.  We'll clean

-   // those here

-   html = html.replace(/<span[^>]+id="__InsertSpan_Workaround_[a-z]+".*?>([\s\S]*?)<\/span>/i,"$1");

-   

-   return html;

-}

-

-InternetExplorer.prototype.outwardHtml = function(html)

-{

-   // remove space added before first script on the page

-   html = html.replace(/&nbsp;(\s*)(<script|<!--)/i,"$1$2");

-

-   // We've got a workaround for certain issues with saving and restoring

-   // selections that may cause us to fill in junk span tags.  We'll clean

-   // those here

-   html = html.replace(/<span[^>]+id="__InsertSpan_Workaround_[a-z]+".*?>([\s\S]*?)<\/span>/i,"$1");

-   

-   return html;

-}

-

-InternetExplorer.prototype.onExecCommand = function(cmdID, UI, param)

-{   

-  switch(cmdID)

-  {

-    // #645 IE only saves the initial content of the iframe, so we create a temporary iframe with the current editor contents

-    case 'saveas':

-        var doc = null;

-        var editor = this.editor;

-        var iframe = document.createElement("iframe");

-        iframe.src = "about:blank";

-        iframe.style.display = 'none';

-        document.body.appendChild(iframe);

-        try

-        {

-          if ( iframe.contentDocument )

-          {

-            doc = iframe.contentDocument;        

-          }

-          else

-          {

-            doc = iframe.contentWindow.document;

-          }

-        }

-        catch(ex)

-        { 

-          //hope there's no exception

-        }

-        

-        doc.open("text/html","replace");

-        var html = '';

-        if ( editor.config.browserQuirksMode === false )

-        {

-          var doctype = '<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">';

-        }

-        else if ( editor.config.browserQuirksMode === true )

-        {

-           var doctype = '';

-        }

-        else

-        {

-           var doctype = Xinha.getDoctype(document);

-        }

-        if ( !editor.config.fullPage )

-        {

-          html += doctype + "\n";

-          html += "<html>\n";

-          html += "<head>\n";

-          html += "<meta http-equiv=\"Content-Type\" content=\"text/html; charset=" + editor.config.charSet + "\">\n";

-          if ( typeof editor.config.baseHref != 'undefined' && editor.config.baseHref !== null )

-          {

-            html += "<base href=\"" + editor.config.baseHref + "\"/>\n";

-          }

-          

-          if ( typeof editor.config.pageStyleSheets !== 'undefined' )

-          {

-            for ( var i = 0; i < editor.config.pageStyleSheets.length; i++ )

-            {

-              if ( editor.config.pageStyleSheets[i].length > 0 )

-              {

-                html += "<link rel=\"stylesheet\" type=\"text/css\" href=\"" + editor.config.pageStyleSheets[i] + "\">";

-                //html += "<style> @import url('" + editor.config.pageStyleSheets[i] + "'); </style>\n";

-              }

-            }

-          }

-          

-          if ( editor.config.pageStyle )

-          {

-            html += "<style type=\"text/css\">\n" + editor.config.pageStyle + "\n</style>";

-          }

-          

-          html += "</head>\n";

-          html += "<body>\n";

-          html += editor.getEditorContent();

-          html += "</body>\n";

-          html += "</html>";

-        }

-        else

-        {

-          html = editor.getEditorContent();

-          if ( html.match(Xinha.RE_doctype) )

-          {

-            editor.setDoctype(RegExp.$1);

-          }

-        }

-        doc.write(html);

-        doc.close();

-        doc.execCommand(cmdID, UI, param);

-        document.body.removeChild(iframe);

-      return true;

-    break;

-    case 'removeformat':

-      var editor = this.editor;

-      var sel = editor.getSelection();

-      var selSave = editor.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 ( editor.selectionEmpty(sel) )

-      {

-        els = editor._doc.body.childNodes;

-        for (i = 0; i < els.length; i++) 

-        {

-          el = els[i];

-          if (el.nodeType != 1) continue;

-          if (el.tagName.toLowerCase() == 'span')

-          {

-            newNode = editor.convertNode(el, 'div');

-            el.parentNode.replaceChild(newNode, el);

-            el = newNode;

-          }

-          clean(el);

-        }

-      } 

-      editor._doc.execCommand(cmdID, UI, param);

-

-      editor.restoreSelection(selSave);

-      return true;

-    break;

-  }

-  

-  return false;

-};

-/*--------------------------------------------------------------------------*/

-/*------- IMPLEMENTATION OF THE ABSTRACT "Xinha.prototype" METHODS ---------*/

-/*--------------------------------------------------------------------------*/

-

-/** Insert a node at the current selection point. 

- * @param toBeInserted DomNode

- */

-

-Xinha.prototype.insertNodeAtSelection = function(toBeInserted)

-{

-  this.insertHTML(toBeInserted.outerHTML);

-};

-

-  

-/** Get the parent element of the supplied or current selection. 

- *  @param   sel optional selection as returned by getSelection

- *  @returns DomNode

- */

- 

-Xinha.prototype.getParentElement = function(sel)

-{

-  if ( typeof sel == 'undefined' )

-  {

-    sel = this.getSelection();

-  } 

-  var range = this.createRange(sel); 

-  switch ( sel.type )

-  {

-    case "Text":

-      // try to circumvent a bug in IE:

-      // the parent returned is not always the real parent element

-      var parent = range.parentElement();

-      while ( true )

-      {

-        var TestRange = range.duplicate();

-        TestRange.moveToElementText(parent);

-        if ( TestRange.inRange(range) )

-        {

-          break;

-        }

-        if ( ( parent.nodeType != 1 ) || ( parent.tagName.toLowerCase() == 'body' ) )

-        {

-          break;

-        }

-        parent = parent.parentElement;

-      }

-      return parent;

-    case "None":

-      // It seems that even for selection of type "None",

-      // there _is_ a parent element and it's value is not

-      // only correct, but very important to us.  MSIE is

-      // certainly the buggiest browser in the world and I

-      // wonder, God, how can Earth stand it?

-      try

-      {

-        return range.parentElement();

-      }

-      catch(e)

-      {

-        return this._doc.body; // ??

-      }

-      

-    case "Control":

-      return range.item(0);

-    default:

-      return this._doc.body;

-  }

-};

-  

-/**

- * Returns the selected element, if any.  That is,

- * the element that you have last selected in the "path"

- * at the bottom of the editor, or a "control" (eg image)

- *

- * @returns null | DomNode

- */

- 

-Xinha.prototype.activeElement = function(sel)

-{

-  if ( ( sel === null ) || this.selectionEmpty(sel) )

-  {

-    return null;

-  }

-

-  if ( sel.type.toLowerCase() == "control" )

-  {

-    return sel.createRange().item(0);

-  }

-  else

-  {

-    // If it's not a control, then we need to see if

-    // the selection is the _entire_ text of a parent node

-    // (this happens when a node is clicked in the tree)

-    var range = sel.createRange();

-    var p_elm = this.getParentElement(sel);

-    if ( p_elm.innerHTML == range.htmlText )

-    {

-      return p_elm;

-    }

-    /*

-    if ( p_elm )

-    {

-      var p_rng = this._doc.body.createTextRange();

-      p_rng.moveToElementText(p_elm);

-      if ( p_rng.isEqual(range) )

-      {

-        return p_elm;

-      }

-    }

-

-    if ( range.parentElement() )

-    {

-      var prnt_range = this._doc.body.createTextRange();

-      prnt_range.moveToElementText(range.parentElement());

-      if ( prnt_range.isEqual(range) )

-      {

-        return range.parentElement();

-      }

-    }

-    */

-    return null;

-  }

-};

-

-/** 

- * Determines if the given selection is empty (collapsed).

- * @param selection Selection object as returned by getSelection

- * @returns true|false

- */

- 

-Xinha.prototype.selectionEmpty = function(sel)

-{

-  if ( !sel )

-  {

-    return true;

-  }

-

-  return this.createRange(sel).htmlText === '';

-};

-

-/** 

- * Returns a range object to be stored 

- * and later restored with Xinha.prototype.restoreSelection()

- * 

- * @returns Range

- */

-Xinha.prototype.saveSelection = function(sel)

-{

-  return this.createRange(sel ? sel : this.getSelection())

-}

-/** 

- * Restores a selection previously stored

- * @param savedSelection Range object as returned by Xinha.prototype.restoreSelection()

- */

-Xinha.prototype.restoreSelection = function(savedSelection)

-{

-  if (!savedSelection) return;

-  

-  // Ticket #1387

-  // avoid problem where savedSelection does not implement parentElement(). 

-  // This condition occurs if there was no text selection at the time saveSelection() was called.  In the case 

-  // an image selection, the situation is confusing... the image may be selected in two different ways:  1) by 

-  // simply clicking the image it will appear to be selected by a box with sizing handles; or 2) by clicking and 

-  // dragging over the image as you might click and drag over text.  In the first case, the resulting selection 

-  // object does not implement parentElement(), leading to a crash later on in the code below.  The following 

-  // hack avoids that problem. 

-  

-  // Ticket #1488

-  // fix control selection in IE8

-  

-  var savedParentElement = null;

-  if (savedSelection.parentElement)

-  {

-    savedParentElement =  savedSelection.parentElement();

-  }

-  else

-  {

-    savedParentElement = savedSelection.item(0);

-  }

-  

-  // In order to prevent triggering the IE bug mentioned below, we will try to

-  // optimize by not restoring the selection if it happens to match the current

-  // selection.

-  var range = this.createRange(this.getSelection());

-

-  var rangeParentElement =  null;

-  if (range.parentElement)

-  {

-    rangeParentElement =  range.parentElement();

-  }

-  else

-  {

-    rangeParentElement = range.item(0);

-  }

-

-  // We can't compare two selections that come from different documents, so we

-  // must make sure they're from the same document.

-  var findDoc = function(el)

-  {

-    for (var root=el; root; root=root.parentNode)

-    {

-      if (root.tagName.toLowerCase() == 'html')

-      {

-        return root.parentNode;

-      }

-    }

-    return null;

-  }

-

-  if (savedSelection.parentElement && findDoc(savedParentElement) == findDoc(rangeParentElement))

-  {

-    if (range.isEqual(savedSelection))

-    {

-      // The selection hasn't moved, no need to restore.

-      return;

-    }

-  }

-

-  try { savedSelection.select() } catch (e) {};

-  range = this.createRange(this.getSelection());

-  

-  if (range.parentElement)

-  {

-    rangeParentElement =  range.parentElement();

-  }

-  else

-  {

-    rangeParentElement = range.item(0);

-  }

-  

-  if (rangeParentElement != savedParentElement)

-  {

-    // IE has a problem with selections at the end of text nodes that

-    // immediately precede block nodes. Example markup:

-    // <div>Text Node<p>Text in Block</p></div>

-    //               ^

-    // The problem occurs when the cursor is after the 'e' in Node.

-

-    var solution = this.config.selectWorkaround || 'VisibleCue';

-    switch (solution)

-    {

-      case 'SimulateClick':

-        // Try to get the bounding box of the selection and then simulate a

-        // mouse click in the upper right corner to return the cursor to the

-        // correct location.

-

-        // No code yet, fall through to InsertSpan

-      case 'InsertSpan':

-        // This workaround inserts an empty span element so that we are no

-        // longer trying to select a text node,

-        var parentDoc = findDoc(savedParentElement);

-

-        // A function used to generate a unique ID for our temporary span.

-        var randLetters = function(count)

-        {

-          // Build a list of 26 letters.

-          var Letters = '';

-          for (var index = 0; index<26; ++index)

-          {

-            Letters += String.fromCharCode('a'.charCodeAt(0) + index);

-          }

-

-          var result = '';

-          for (var index=0; index<count; ++index)

-          {

-            result += Letters.substr(Math.floor(Math.random()*Letters.length + 1), 1);

-          }

-          return result;

-        }

-

-        // We'll try to find a unique ID to use for finding our element.

-        var keyLength = 1;

-        var tempId = '__InsertSpan_Workaround_' + randLetters(keyLength);

-        while (parentDoc.getElementById(tempId))

-        {

-          // Each time there's a collision, we'll increase our key length by

-          // one, making the chances of a collision exponentially more rare.

-          keyLength += 1;

-          tempId = '__InsertSpan_Workaround_' + randLetters(keyLength);

-        }

-

-        // Now that we have a uniquely identifiable element, we'll stick it and

-        // and use it to orient our selection.

-        savedSelection.pasteHTML('<span id="' + tempId + '"></span>');

-        var tempSpan = parentDoc.getElementById(tempId);

-        savedSelection.moveToElementText(tempSpan);

-        savedSelection.select();

-        break;

-      case 'JustificationHack':

-        // Setting the justification on an element causes IE to alter the

-        // markup so that the selection we want to make is possible.

-        // Unfortunately, this can force block elements to be kicked out of

-        // their containing element, so it is not recommended.

-

-        // Set a non-valid character and use it to anchor our selection.

-        var magicString = String.fromCharCode(1);

-        savedSelection.pasteHTML(magicString);

-        savedSelection.findText(magicString,-1);

-        savedSelection.select();

-

-        // I don't know how to find out if there's an existing justification on

-        // this element.  Hopefully, you're doing all of your styling outside,

-        // so I'll just clear.  I already told you this was a hack.

-        savedSelection.execCommand('JustifyNone');

-        savedSelection.pasteHTML('');

-        break;

-      case 'VisibleCue':

-      default:

-        // This method will insert a little box character to hold our selection

-        // in the desired spot.  We're depending on the user to see this ugly

-        // box and delete it themselves.

-        var magicString = String.fromCharCode(1);

-        savedSelection.pasteHTML(magicString);

-        savedSelection.findText(magicString,-1);

-        savedSelection.select();

-    }

-  }

-}

-

-/**

- * Selects the contents of the given node.  If the node is a "control" type element, (image, form input, table)

- * the node itself is selected for manipulation.

- *

- * @param node DomNode 

- * @param collapseToStart A boolean that, when supplied, says to collapse the selection. True collapses to the start, and false to the end.

- */

- 

-Xinha.prototype.selectNodeContents = function(node, collapseToStart)

-{

-  this.focusEditor();

-  this.forceRedraw();

-  var range;

-  var collapsed = typeof collapseToStart == "undefined" ? true : false;

-  // Tables and Images get selected as "objects" rather than the text contents

-  if ( collapsed && node.tagName && node.tagName.toLowerCase().match(/table|img|input|select|textarea/) )

-  {

-    range = this._doc.body.createControlRange();

-    range.add(node);

-  }

-  else

-  {

-    range = this._doc.body.createTextRange();

-    if (3 == node.nodeType)

-    {

-      // Special handling for text nodes, since moveToElementText fails when

-      // attempting to select a text node

-

-      // Since the TextRange has a quite limited API, our strategy here is to

-      // select (where possible) neighboring nodes, and then move our ranges

-      // endpoints to be just inside of neighboring selections.

-      if (node.parentNode)

-      {

-        range.moveToElementText(node.parentNode);

-      } else

-      {

-        range.moveToElementText(this._doc.body);

-      }

-      var trimmingRange = this._doc.body.createTextRange();

-

-      // In rare situations (mostly html that's been monkeyed about with by

-      // javascript, but that's what we're doing) there can be two adjacent

-      // text nodes.  Since we won't be able to handle these, we'll have to

-      // hack an offset by 'move'ing the number of characters they contain.

-      var texthackOffset = 0;

-      var borderElement=node.previousSibling;

-      for (; borderElement && (1 != borderElement.nodeType); borderElement = borderElement.previousSibling)

-      {

-        if (3 == borderElement.nodeType)

-        {

-          // IE doesn't count '\r' as a character, so we have to adjust the offset.

-          texthackOffset += borderElement.nodeValue.length-borderElement.nodeValue.split('\r').length-1;

-        }

-      }

-      if (borderElement && (1 == borderElement.nodeType))

-      {

-        trimmingRange.moveToElementText(borderElement);

-        range.setEndPoint('StartToEnd', trimmingRange);

-      }

-      if (texthackOffset)

-      {

-        // We now need to move the selection forward the number of characters

-        // in all text nodes in between our text node and our ranges starting

-        // border.

-        range.moveStart('character',texthackOffset);

-      }

-

-      // Youpi!  Now we get to repeat this trimming on the right side.

-      texthackOffset = 0;

-      borderElement=node.nextSibling;

-      for (; borderElement && (1 != borderElement.nodeType); borderElement = borderElement.nextSibling)

-      {

-        if (3 == borderElement.nodeType)

-        {

-          // IE doesn't count '\r' as a character, so we have to adjust the offset.

-          texthackOffset += borderElement.nodeValue.length-borderElement.nodeValue.split('\r').length-1;

-          if (!borderElement.nextSibling)

-          {

-            // When a text node is the last child, IE adds an extra selection

-            // "placeholder" for the newline character.  We need to adjust for

-            // this character as well.

-            texthackOffset += 1;

-          }

-        }

-      }

-      if (borderElement && (1 == borderElement.nodeType))

-      {

-        trimmingRange.moveToElementText(borderElement);

-        range.setEndPoint('EndToStart', trimmingRange);

-      }

-      if (texthackOffset)

-      {

-        // We now need to move the selection backward the number of characters

-        // in all text nodes in between our text node and our ranges ending

-        // border.

-        range.moveEnd('character',-texthackOffset);

-      }

-      if (!node.nextSibling)

-      {

-        // Above we performed a slight adjustment to the offset if the text

-        // node contains a selectable "newline".  We need to do the same if the

-        // node we are trying to select contains a newline.

-        range.moveEnd('character',-1);

-      }

-    }

-    else

-    {

-    range.moveToElementText(node);

-    }

-  }

-  if (typeof collapseToStart != "undefined")

-  {

-    range.collapse(collapseToStart);

-    if (!collapseToStart)

-    {

-      range.moveStart('character',-1);

-      range.moveEnd('character',-1);

-    }

-  }

-  range.select();

-};

-  

-/** Insert HTML at the current position, deleting the selection if any. 

- *  

- *  @param html string

- */

- 

-Xinha.prototype.insertHTML = function(html)

-{

-  this.focusEditor();

-  var sel = this.getSelection();

-  var range = this.createRange(sel);

-  range.pasteHTML(html);

-};

-

-

-/** Get the HTML of the current selection.  HTML returned has not been passed through outwardHTML.

- *

- * @returns string

- */

- 

-Xinha.prototype.getSelectedHTML = function()

-{

-  var sel = this.getSelection();

-  if (this.selectionEmpty(sel)) return '';

-  var range = this.createRange(sel);

-  

-  // Need to be careful of control ranges which won't have htmlText

-  if( range.htmlText )

-  {

-    return range.htmlText;

-  }

-  else if(range.length >= 1)

-  {

-    return range.item(0).outerHTML;

-  }

-  

-  return '';

-};

-  

-/** Get a Selection object of the current selection.  Note that selection objects are browser specific.

- *

- * @returns Selection

- */

- 

-Xinha.prototype.getSelection = function()

-{

-  return this._doc.selection;

-};

-

-/** Create a Range object from the given selection.  Note that range objects are browser specific.

- *

- *  @param sel Selection object (see getSelection)

- *  @returns Range

- */

- 

-Xinha.prototype.createRange = function(sel)

-{

-  if (!sel) sel = this.getSelection();

-  

-  // ticket:1508 - when you do a key event within a 

-  // absolute position div, in IE, the toolbar update

-  // for formatblock etc causes a getParentElement() (above)

-  // which produces a "None" select, then if we focusEditor() it

-  // defocuses the absolute div and focuses into the iframe outside of the

-  // div somewhere.  

-  //

-  // Removing this is probably a workaround and maybe it breaks something else

-  // focusEditor is used in a number of spots, I woudl have thought it should

-  // do nothing if the editor is already focused.

-  //

-  // if(sel.type == 'None') this.focusEditor();

-  

-  return sel.createRange();

-};

-

-/** Due to browser differences, some keys which Xinha prefers to call a keyPress

- *   do not get an actual keypress event.  This browser specific function 

- *   overridden in the browser's engine (eg modules/WebKit/WebKit.js) as required

- *   takes a keydown event type and tells us if we should treat it as a 

- *   keypress event type.

- *

- *  To be clear, the keys we are interested here are

- *        Escape, Tab, Backspace, Delete, Enter

- *   these are "non printable" characters which we still want to regard generally

- *   as a keypress.  

- * 

- *  If the browser does not report these as a keypress

- *   ( https://dvcs.w3.org/hg/d4e/raw-file/tip/key-event-test.html )

- *   then this function must return true for such keydown events as it is

- *   given.

- * 

- * @param KeyboardEvent with keyEvent.type == keydown

- * @return boolean

- */

-

-Xinha.prototype.isKeyDownThatShouldGetButDoesNotGetAKeyPressEvent = function(keyEvent)

-{

-  // Dom 3

-  if(typeof keyEvent.key != 'undefined')

-  {

-    // Found using IE11 in 9-10 modes

-    if(keyEvent.key.match(/^(Tab|Backspace|Del)/))

-    {

-      return true;

-    }

-  }

-  // Legacy

-  else

-  {

-    // Found using IE11 in 5-8 modes

-    if(keyEvent.keyCode == 9   // Tab

-    || keyEvent.keyCode == 8   // Backspace

-    || keyEvent.keyCode == 46  // Del

-    ) return true;

-  }

-};

-

-/** Return the character (as a string) of a keyEvent  - ie, press the 'a' key and

- *  this method will return 'a', press SHIFT-a and it will return 'A'.

- * 

- *  @param   keyEvent

- *  @returns string

- */

-                                   

-Xinha.prototype.getKey = function(keyEvent)

-{

-  return String.fromCharCode(keyEvent.keyCode);

-}

-

-

-/** Return the HTML string of the given Element, including the Element.

- * 

- * @param element HTML Element DomNode

- * @returns string

- */

- 

-Xinha.getOuterHTML = function(element)

-{

-  return element.outerHTML;

-};

-

-// Control character for retaining edit location when switching modes

-Xinha.cc = String.fromCharCode(0x2009);

-

-Xinha.prototype.setCC = function ( target )

-{

-  var cc = Xinha.cc;

-  if ( target == "textarea" )

-  {

-    var ta = this._textArea;

-    var pos = document.selection.createRange();

-    pos.collapse();

-    pos.text = cc;

-    var index = ta.value.indexOf( cc );

-    var before = ta.value.substring( 0, index );

-    var after  = ta.value.substring( index + cc.length , ta.value.length );

-    

-    if ( after.match(/^[^<]*>/) ) // make sure cursor is in an editable area (outside tags, script blocks, entities, and inside the body)

-    {

-      var tagEnd = after.indexOf(">") + 1;

-      ta.value = before + after.substring( 0, tagEnd ) + cc + after.substring( tagEnd, after.length );

-    }

-    else ta.value = before + cc + after;

-    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 control = r.item(0);

-      control.outerHTML += cc;

-    }

-    else

-    {

-      r.collapse();

-      r.text = cc;

-    }

-  }

-};

-

-Xinha.prototype.findCC = function ( target )

-{

-  var findIn = ( target == 'textarea' ) ? this._textArea : this._doc.body;

-  range = findIn.createTextRange();

-  // in case the cursor is inside a link automatically created from a url

-  // the cc also appears in the url and we have to strip it out additionally 

-  if( range.findText( escape(Xinha.cc) ) )

-  {

-    range.select();

-    range.text = '';

-    range.select();

-  }

-  if( range.findText( Xinha.cc ) )

-  {

-    range.select();

-    range.text = '';

-    range.select();

-  }

-  if ( target == 'textarea' ) this._textArea.focus();

-};

-

-/** Return a doctype or empty string depending on whether the document is in Qirksmode or Standards Compliant Mode

- *  It's hardly possible to detect the actual doctype without unreasonable effort, so we set HTML 4.01 just to trigger the rendering mode

- * 

- * @param doc DOM element document

- * @returns string doctype || empty

- */

-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-1.5.1/modules/Opera/Opera.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/modules/Opera/Opera.js
deleted file mode 100644
index 9567d45..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/modules/Opera/Opera.js
+++ /dev/null
@@ -1,954 +0,0 @@
-
-  /*--------------------------------------:noTabs=true:tabSize=2:indentSize=2:--
-    --
-    --
-    --  NOTICE Modern Opera does not use this engine any more, it identifies as
-    --           and uses WebKit (Opera is these days based on Blink).
-    --
-    --   People using older versions of Opera that need this engine should
-    --   upgrade to a WebKit or Gecko based browser.
-    --
-    --  This engine is no longer officially supported or tested.
-    --
-    -----------------------------------------------------------------------------
-    --  Xinha (is not htmlArea) - http://xinha.gogo.co.nz/
-    --
-    --  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.
-    --
-    --  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.
-    --
-    -- This is the Opera compatability plugin, part of the Xinha core.
-    --
-    --  The file is loaded as a special plugin by the Xinha Core when
-    --  Xinha is being run under an Opera based browser with the Midas
-    --  editing API.
-    --
-    --  It provides implementation and specialisation for various methods
-    --  in the core where different approaches per browser are required.
-    --
-    --  Design Notes::
-    --   Most methods here will simply be overriding Xinha.prototype.<method>
-    --   and should be called that, but methods specific to Opera should 
-    --   be a part of the Opera.prototype, we won't trample on namespace
-    --   that way.
-    --
-    --  $HeadURL: http://svn.xinha.org/trunk/modules/Opera/Opera.js $
-    --  $LastChangedDate: 2018-02-19 20:35:49 +1300 (Mon, 19 Feb 2018) $
-    --  $LastChangedRevision: 1402 $
-    --  $LastChangedBy: gogo $
-    --------------------------------------------------------------------------*/
-                                                    
-Opera._pluginInfo = {
-  name          : "Opera",
-  origin        : "Xinha Core",
-  version       : "$LastChangedRevision: 1402 $".replace(/^[^:]*:\s*(.*)\s*\$$/, '$1'),
-  developer     : "The Xinha Core Developer Team",
-  developer_url : "$HeadURL: http://svn.xinha.org/trunk/modules/Opera/Opera.js $".replace(/^[^:]*:\s*(.*)\s*\$$/, '$1'),
-  sponsor       : "Gogo Internet Services Limited",
-  sponsor_url   : "http://www.gogo.co.nz/",
-  license       : "htmlArea"
-};
-
-function Opera(editor) {
-  this.editor = editor;  
-  editor.Opera = this;
-}
-
-/** Allow Opera to handle some key events in a special way.
- */
-Opera.prototype.onKeyPress = function(ev)
-{
-  var editor = this.editor;
-  var s = editor.getSelection();
-  
-  // Handle shortcuts
-  if(editor.isShortCut(ev))
-  {
-    switch(editor.getKey(ev).toLowerCase())
-    {
-      case 'z':
-      {
-        if(editor._unLink && editor._unlinkOnUndo)
-        {
-          Xinha._stopEvent(ev);
-          editor._unLink();
-          editor.updateToolbar();
-          return true;
-        }
-      }
-      break;
-      
-      case 'a':
-      {
-        // KEY select all
-        sel = editor.getSelection();
-        sel.removeAllRanges();
-        range = editor.createRange();
-        range.selectNodeContents(editor._doc.body);
-        sel.addRange(range);
-        Xinha._stopEvent(ev);
-        return true;
-      }
-      break;
-      
-      case 'v':
-      {
-        // If we are not using htmlareaPaste, don't let Xinha try and be fancy but let the 
-        // event be handled normally by the browser (don't stopEvent it)
-        if(!editor.config.htmlareaPaste)
-        {          
-          return true;
-        }
-      }
-      break;
-    }
-  }
-  
-  // Handle normal characters
-  switch(editor.getKey(ev))
-  {
-    // Space, see if the text just typed looks like a URL, or email address
-    // and link it appropriatly
-    case ' ':
-    {      
-      var autoWrap = function (textNode, tag)
-      {
-        var rightText = textNode.nextSibling;
-        if ( typeof tag == 'string')
-        {
-          tag = editor._doc.createElement(tag);
-        }
-        var a = textNode.parentNode.insertBefore(tag, rightText);
-        Xinha.removeFromParent(textNode);
-        a.appendChild(textNode);
-        rightText.data = ' ' + rightText.data;
-    
-        s.collapse(rightText, 1);
-    
-        editor._unLink = function()
-        {
-          var t = a.firstChild;
-          a.removeChild(t);
-          a.parentNode.insertBefore(t, a);
-          Xinha.removeFromParent(a);
-          editor._unLink = null;
-          editor._unlinkOnUndo = false;
-        };
-        editor._unlinkOnUndo = true;
-    
-        return a;
-      };
-  
-      if ( editor.config.convertUrlsToLinks && s && s.isCollapsed && s.anchorNode.nodeType == 3 && s.anchorNode.data.length > 3 && s.anchorNode.data.indexOf('.') >= 0 )
-      {
-        var midStart = s.anchorNode.data.substring(0,s.anchorOffset).search(/\S{4,}$/);
-        if ( midStart == -1 )
-        {
-          break;
-        }
-
-        if ( editor._getFirstAncestor(s, 'a') )
-        {
-          break; // already in an anchor
-        }
-
-        var matchData = s.anchorNode.data.substring(0,s.anchorOffset).replace(/^.*?(\S*)$/, '$1');
-
-        var mEmail = matchData.match(Xinha.RE_email);
-        if ( mEmail )
-        {
-          var leftTextEmail  = s.anchorNode;
-          var rightTextEmail = leftTextEmail.splitText(s.anchorOffset);
-          var midTextEmail   = leftTextEmail.splitText(midStart);
-
-          autoWrap(midTextEmail, 'a').href = 'mailto:' + mEmail[0];
-          break;
-        }
-
-        RE_date = /([0-9]+\.)+/; //could be date or ip or something else ...
-        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 mUrl = matchData.match(Xinha.RE_url);
-        if ( mUrl )
-        {
-          if (RE_date.test(matchData))
-          {
-            break; //ray: disabling linking of IP numbers because of general bugginess (see Ticket #1085)
-            /*if (!RE_ip.test(matchData)) 
-            {
-              break;
-            }*/
-          } 
-          var leftTextUrl  = s.anchorNode;
-          var rightTextUrl = leftTextUrl.splitText(s.anchorOffset);
-          var midTextUrl   = leftTextUrl.splitText(midStart);
-          autoWrap(midTextUrl, 'a').href = (mUrl[1] ? mUrl[1] : 'http://') + mUrl[2];
-          break;
-        }
-      }
-    }
-    break;    
-  }
-  
-  // Handle special keys
-  switch ( ev.keyCode )
-  {    
-/*  This is now handled by a plugin  
-    case 13: // ENTER
-
-    break;*/
-
-    case 27: // ESCAPE
-    {
-      if ( editor._unLink )
-      {
-        editor._unLink();
-        Xinha._stopEvent(ev);
-      }
-      break;
-    }
-    break;
-    
-    case 8: // KEY backspace
-    case 46: // KEY delete
-    {
-      // We handle the mozilla backspace directly??
-      if ( !ev.shiftKey && this.handleBackspace() )
-      {
-        Xinha._stopEvent(ev);
-      }
-    }
-    
-    default:
-    {
-        editor._unlinkOnUndo = false;
-
-        // Handle the "auto-linking", specifically this bit of code sets up a handler on
-        // an self-titled anchor (eg <a href="http://www.gogo.co.nz/">www.gogo.co.nz</a>)
-        // when the text content is edited, such that it will update the href on the anchor
-        
-        if ( s.anchorNode && s.anchorNode.nodeType == 3 )
-        {
-          // See if we might be changing a link
-          var a = editor._getFirstAncestor(s, 'a');
-          // @todo: we probably need here to inform the setTimeout below that we not changing a link and not start another setTimeout
-          if ( !a )
-          {
-            break; // not an anchor
-          } 
-          
-          if ( !a._updateAnchTimeout )
-          {
-            if ( s.anchorNode.data.match(Xinha.RE_email) && a.href.match('mailto:' + s.anchorNode.data.trim()) )
-            {
-              var textNode = s.anchorNode;
-              var fnAnchor = function()
-              {
-                a.href = 'mailto:' + textNode.data.trim();
-                // @fixme: why the hell do another timeout is started ?
-                //         This lead to never ending timer if we dont remove this line
-                //         But when removed, the email is not correctly updated
-                //
-                // - to fix this we should make fnAnchor check to see if textNode.data has
-                //   stopped changing for say 5 seconds and if so we do not make this setTimeout 
-                a._updateAnchTimeout = setTimeout(fnAnchor, 250);
-              };
-              a._updateAnchTimeout = setTimeout(fnAnchor, 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 txtNode = s.anchorNode;
-              var fnUrl = function()
-              {
-                // Sometimes m is undefined becase the url is not an url anymore (was www.url.com and become for example www.url)
-                // ray: shouldn't the link be un-linked then?
-                m = txtNode.data.match(Xinha.RE_url);
-                if(m)
-                {
-                  a.href = (m[1] ? m[1] : 'http://') + m[2];
-                }
-                
-                // @fixme: why the hell do another timeout is started ?
-                //         This lead to never ending timer if we dont remove this line
-                //         But when removed, the url is not correctly updated
-                //
-                // - to fix this we should make fnUrl check to see if textNode.data has
-                //   stopped changing for say 5 seconds and if so we do not make this setTimeout
-                a._updateAnchTimeout = setTimeout(fnUrl, 250);
-              };
-              a._updateAnchTimeout = setTimeout(fnUrl, 1000);
-            }
-          }        
-        }                
-    }
-    break;
-  }
-
-  return false; // Let other plugins etc continue from here.
-}
-
-/** When backspace is hit, the Opera onKeyPress will execute this method.
- *  I don't remember what the exact purpose of this is though :-(
- */
- 
-Opera.prototype.handleBackspace = function()
-{
-  var editor = this.editor;
-  setTimeout(
-    function()
-    {
-      var sel   = editor.getSelection();
-      var range = editor.createRange(sel);
-      var SC = range.startContainer;
-      var SO = range.startOffset;
-      var EC = range.endContainer;
-      var EO = range.endOffset;
-      var newr = 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 = range.cloneRange();
-        r.setStartBefore(newr);
-        r.setEndAfter(newr);
-        r.extractContents();
-        sel.removeAllRanges();
-        sel.addRange(r);
-      }
-    },
-    10);
-};
-
-Opera.prototype.inwardHtml = function(html)
-{
-   // Both IE and Opera use strike internally instead of del (#523)
-   // Xinha will present del externally (see Xinha.prototype.outwardHtml
-   html = html.replace(/<(\/?)del(\s|>|\/)/ig, "<$1strike$2");
-   
-   return html;
-}
-
-Opera.prototype.outwardHtml = function(html)
-{
-
-  return html;
-}
-
-Opera.prototype.onExecCommand = function(cmdID, UI, param)
-{   
-    
-  switch(cmdID)
-  {
-    
-    /*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.", "Opera"));
-      return true; // Indicate paste is done, stop command being issued to browser by Xinha.prototype.execCommand
-    }
-    break;*/
-    
-    case 'removeformat':
-      var editor = this.editor;
-      var sel = editor.getSelection();
-      var selSave = editor.saveSelection(sel);
-      var range = editor.createRange(sel);
-
-      var els = editor._doc.body.getElementsByTagName('*');
-
-      var start = ( range.startContainer.nodeType == 1 ) ? range.startContainer : range.startContainer.parentNode;
-      var i, el;
-      if (sel.isCollapsed) range.selectNodeContents(editor._doc.body);
-      
-      for (i=0; i<els.length;i++)
-      {
-        el = els[i];
-        if ( range.isPointInRange(el, 0) || (els[i] == start && range.startOffset == 0))
-        {
-          el.removeAttribute('style');
-        }
-      }
-      this.editor._doc.execCommand(cmdID, UI, param);
-      editor.restoreSelection(selSave);
-      return true;
-    break;
-    
-  }
-  
-  return false;
-}
-
-Opera.prototype.onMouseDown = function(ev)
-{   
-  
-}
-
-
-/*--------------------------------------------------------------------------*/
-/*------- IMPLEMENTATION OF THE ABSTRACT "Xinha.prototype" METHODS ---------*/
-/*--------------------------------------------------------------------------*/
-
-
-
-/** Insert a node at the current selection point. 
- * @param toBeInserted DomNode
- */
-
-Xinha.prototype.insertNodeAtSelection = function(toBeInserted)
-{
-  if ( toBeInserted.ownerDocument != this._doc )
-  {
-    try 
-    {
-      toBeInserted = this._doc.adoptNode( toBeInserted );
-    } catch (e) {}
-  }
-  
-  this.focusEditor();
-  
-  var sel = this.getSelection();      
-  var range = this.createRange(sel);
-    
-  range.deleteContents();
-  
-  var node = range.startContainer;
-  var pos = range.startOffset;
-  var selnode = toBeInserted;
-  
-  sel.removeAllRanges();
-  
-  switch ( node.nodeType )
-  {
-    case 3: // Node.TEXT_NODE
-      // we have to split it at the caret position.
-      if ( toBeInserted.nodeType == 3 )
-      {
-        // do optimized insertion
-        node.insertData(pos, toBeInserted.data);
-        range = this.createRange();
-        range.setEnd(node, pos + toBeInserted.length);
-        range.setStart(node, pos + toBeInserted.length);
-        sel.addRange(range);
-      }
-      else
-      {
-        node = node.splitText(pos);
-        if ( toBeInserted.nodeType == 11 /* Node.DOCUMENT_FRAGMENT_NODE */ )
-        {
-          selnode = selnode.firstChild;
-        }
-        node.parentNode.insertBefore(toBeInserted, node);
-        this.selectNodeContents(selnode);
-        this.updateToolbar();
-      }
-    break;
-    
-    case 1: // Node.ELEMENT_NODE
-      if ( toBeInserted.nodeType == 11 /* Node.DOCUMENT_FRAGMENT_NODE */ )
-      {
-        selnode = selnode.firstChild;
-      }
-      node.insertBefore(toBeInserted, node.childNodes[pos]);
-      this.selectNodeContents(selnode);
-      this.updateToolbar();
-    break;
-  }
-};
-  
-/** Get the parent element of the supplied or current selection. 
- *  @param   sel optional selection as returned by getSelection
- *  @returns DomNode
- */
- 
-Xinha.prototype.getParentElement = function(sel)
-{
-  if ( typeof sel == 'undefined' )
-  {
-    sel = this.getSelection();
-  }
-  var range = this.createRange(sel);
-  try
-  {
-    var p = range.commonAncestorContainer;
-    if ( !range.collapsed && range.startContainer == range.endContainer &&
-        range.startOffset - range.endOffset <= 1 && range.startContainer.hasChildNodes() )
-    {
-      p = range.startContainer.childNodes[range.startOffset];
-    }
-
-    while ( p.nodeType == 3 )
-    {
-      p = p.parentNode;
-    }
-    return p;
-  }
-  catch (ex)
-  {
-    return null;
-  }
-};
-
-/**
- * Returns the selected element, if any.  That is,
- * the element that you have last selected in the "path"
- * at the bottom of the editor, or a "control" (eg image)
- *
- * @returns null | DomNode
- */
-
-Xinha.prototype.activeElement = function(sel)
-{
-  if ( ( sel === null ) || this.selectionEmpty(sel) )
-  {
-    return null;
-  }
-
-  // For Mozilla we just see if the selection is not collapsed (something is selected)
-  // and that the anchor (start of selection) is an element.  This might not be totally
-  // correct, we possibly should do a simlar check to IE?
-  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 sel.anchorNode.parentNode;
-    }
-  }
-  return null;
-};
-
-/** 
- * Determines if the given selection is empty (collapsed).
- * @param selection Selection object as returned by getSelection
- * @returns true|false
- */
- 
-Xinha.prototype.selectionEmpty = function(sel)
-{
-  if ( !sel )
-  {
-    return true;
-  }
-
-  if ( typeof sel.isCollapsed != 'undefined' )
-  {      
-    return sel.isCollapsed;
-  }
-
-  return true;
-};
-
-/** 
- * Returns a range object to be stored 
- * and later restored with Xinha.prototype.restoreSelection()
- * 
- * @returns Range
- */
-Xinha.prototype.saveSelection = function()
-{
-  return this.createRange(this.getSelection()).cloneRange();
-}
-/** 
- * Restores a selection previously stored
- * @param savedSelection Range object as returned by Xinha.prototype.restoreSelection()
- */
-Xinha.prototype.restoreSelection = function(savedSelection)
-{
-  var sel = this.getSelection();
-  sel.removeAllRanges();
-  sel.addRange(savedSelection);
-}
-/**
- * Selects the contents of the given node.  If the node is a "control" type element, (image, form input, table)
- * the node itself is selected for manipulation.
- *
- * @param node DomNode 
- * @param collapseToStart A boolean that, when supplied, says to collapse the selection. True collapses to the start, and false to the end.
- */
- 
-Xinha.prototype.selectNodeContents = function(node, collapseToStart)
-{
-  this.focusEditor();
-  this.forceRedraw();
-  var range;
-  var collapsed = typeof collapseToStart == "undefined" ? true : false;
-  var sel = this.getSelection();
-  range = this._doc.createRange();
-  // Tables and Images get selected as "objects" rather than the text contents
-  if ( collapsed && node.tagName && node.tagName.toLowerCase().match(/table|img|input|textarea|select/) )
-  {
-    range.selectNode(node);
-  }
-  else
-  {
-    range.selectNodeContents(node);
-  }
-  sel.removeAllRanges();
-  sel.addRange(range);
-  if (typeof collapseToStart != "undefined")
-  {
-    if (collapseToStart)
-    {
-      sel.collapse(range.startContainer, range.startOffset);
-    } else
-    {
-      sel.collapse(range.endContainer, range.endOffset);
-    }
-  }
-};
-  
-/** Insert HTML at the current position, deleting the selection if any. 
- *  
- *  @param html string
- */
- 
-Xinha.prototype.insertHTML = function(html)
-{
-  var sel = this.getSelection();
-  var range = this.createRange(sel);
-  this.focusEditor();
-  // construct a new document fragment with the given HTML
-  var fragment = this._doc.createDocumentFragment();
-  var div = this._doc.createElement("div");
-  div.innerHTML = html;
-  while ( div.firstChild )
-  {
-    // the following call also removes the node from div
-    fragment.appendChild(div.firstChild);
-  }
-  // this also removes the selection
-  var node = this.insertNodeAtSelection(fragment);
-};
-
-/** Get the HTML of the current selection.  HTML returned has not been passed through outwardHTML.
- *
- * @returns string
- */
- 
-Xinha.prototype.getSelectedHTML = function()
-{
-  var sel = this.getSelection();
-  if (sel.isCollapsed) return '';
-  var range = this.createRange(sel);
-  return Xinha.getHTML(range.cloneContents(), false, this);
-};
-  
-
-/** Get a Selection object of the current selection.  Note that selection objects are browser specific.
- *
- * @returns Selection
- */
- 
-Xinha.prototype.getSelection = function()
-{
-  var sel = this._iframe.contentWindow.getSelection();
-  if(sel && sel.focusNode && sel.focusNode.tagName && sel.focusNode.tagName == 'HTML')
-  { // Bad news batman, this selection is wonky  
-    var bod = this._doc.getElementsByTagName('body')[0];
-    var rng = this.createRange();
-    rng.selectNodeContents(bod);
-    sel.removeAllRanges();
-    sel.addRange(rng);
-    sel.collapseToEnd();    
-  }
-  return sel; 
-};
-  
-/** Create a Range object from the given selection.  Note that range objects are browser specific.
- *
- *  @param sel Selection object (see getSelection)
- *  @returns Range
- */
- 
-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();
-  }
-};
-
-/** 
- * @NOTE I don't have a way to test this any more (don't have old opera version
- *   and don't care enough to find one), I'm assuming it will probably be close
- *   to Gecko so I have just copied it directly.
- * 
- * Due to browser differences, some keys which Xinha prefers to call a keyPress
- *   do not get an actual keypress event.  This browser specific function 
- *   overridden in the browser's engine (eg modules/WebKit/WebKit.js) as required
- *   takes a keydown event type and tells us if we should treat it as a 
- *   keypress event type.
- *
- *  To be clear, the keys we are interested here are
- *        Escape, Tab, Backspace, Delete, Enter
- *   these are "non printable" characters which we still want to regard generally
- *   as a keypress.  
- * 
- *  If the browser does not report these as a keypress
- *   ( https://dvcs.w3.org/hg/d4e/raw-file/tip/key-event-test.html )
- *   then this function must return true for such keydown events as it is
- *   given.
- * 
- * @param KeyboardEvent with keyEvent.type == keydown
- * @return boolean
- */
-
-Xinha.prototype.isKeyDownThatShouldGetButDoesNotGetAKeyPressEvent = function(keyEvent)
-{
-  // Dom 3
-  if(typeof keyEvent.key != 'undefined')
-  {
-    // Found using IE11 (which uses Gecko)
-    //   this seems to be a reasonable way to distinguish
-    //   between IE11 and other Gecko browsers which do 
-    //   not provide the "Old DOM3" .char property
-    if(typeof keyEvent.char != 'undefined')
-    {
-      if(keyEvent.key.match(/^(Tab|Backspace|Del)/))
-      {
-        return true;
-      }
-    }
-    
-    // Firefox reports everything we need as a keypress
-    // correctly (in terms of Xinha)
-  }
-  // Legacy
-  else
-  {
-    // Even very old firefox reports everything we need as a keypress
-    // correctly (in terms of Xinha)
-  }
-};
-
-/** Return the character (as a string) of a keyEvent  - ie, press the 'a' key and
- *  this method will return 'a', press SHIFT-a and it will return 'A'.
- * 
- *  @param   keyEvent
- *  @returns string
- */
-                                   
-Xinha.prototype.getKey = function(keyEvent)
-{
-  return String.fromCharCode(keyEvent.charCode);
-}
-
-/** Return the HTML string of the given Element, including the Element.
- * 
- * @param element HTML Element DomNode
- * @returns string
- */
- 
-Xinha.getOuterHTML = function(element)
-{
-  return (new XMLSerializer()).serializeToString(element);
-};
-
-
-/* Caret position remembering when switch between text and html mode.
- * Largely this is the same as for Gecko except:
- *
- * Opera does not have window.find() so we use instead an element with known
- * id (<span id="XinhaOperaCaretMarker">MARK</span>) so that we can 
- * do _doc.getElementById() on it.
- * 
- * Opera for some reason will not set the insert point (flashing caret)
- * anyway though, in theory, the iframe is focused (in findCC below) and then
- * the selection (containing the span above) is collapsed, it should show
- * caret.  I don't know why not.  Seems to require user to actually
- * click to get the caret to show (or type anything without it acting wierd)? 
- * Very annoying.
- *
- */ 
-Xinha.cc = String.fromCharCode(8286);
-Xinha.prototype.setCC = function ( target )
-{
-  // Do a two step caret insertion, first a single char, then we'll replace that with the 
-  // id'd span.
-  var cc = Xinha.cc;
-  
-  try
-  {
-    if ( target == "textarea" )
-    {
-      var ta = this._textArea;
-      var index = ta.selectionStart;
-      var before = ta.value.substring( 0, index )
-      var after = ta.value.substring( index, ta.value.length );
-
-      if ( after.match(/^[^<]*>/) ) // make sure cursor is in an editable area (outside tags, script blocks, entities, and inside the body)
-      {
-        var tagEnd = after.indexOf(">") + 1;
-        ta.value = before + after.substring( 0, tagEnd ) + cc + after.substring( tagEnd, after.length );
-      }
-      else ta.value = before + cc + after;
-      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 mark =  this._doc.createElement('span');
-      mark.id  = 'XinhaOperaCaretMarker';
-      sel.getRangeAt(0).insertNode( mark );
-      
-    }
-  } catch (e) {}
-};
-
-Xinha.prototype.findCC = function ( target )
-{
-  if ( target == '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 before =  ta.value.substring( 0, pos );
-    var after = ta.value.substring( end, ta.value.length );
-    ta.value = before ;
-  
-    ta.scrollTop = ta.scrollHeight;
-    var scrollPos = ta.scrollTop;
-    
-    ta.value += after;
-    ta.setSelectionRange(pos,pos);
-  
-    ta.focus();
-    
-    ta.scrollTop = scrollPos;
-
-  }
-  else
-  {    
-    var marker = this._doc.getElementById('XinhaOperaCaretMarker');
-    if(marker) 
-    {
-      this.focusEditor();// this._iframe.contentWindow.focus();
-      
-      var rng = this.createRange();
-      rng.selectNode(marker);
-      
-      var sel = this.getSelection();
-      sel.addRange(rng); 
-      sel.collapseToStart();
-      
-      this.scrollToElement(marker);
-      
-      marker.parentNode.removeChild(marker);
-      return;
-    }
-  }
-};
-
-/*--------------------------------------------------------------------------*/
-/*------------ EXTEND SOME STANDARD "Xinha.prototype" METHODS --------------*/
-/*--------------------------------------------------------------------------*/
-
-/*
-Xinha.prototype._standardToggleBorders = Xinha.prototype._toggleBorders;
-Xinha.prototype._toggleBorders = function()
-{
-  var result = this._standardToggleBorders();
-    
-  // flashing the display forces moz to listen (JB:18-04-2005) - #102
-  var tables = this._doc.getElementsByTagName('TABLE');
-  for(var i = 0; i < tables.length; i++)
-  {
-    tables[i].style.display="none";
-    tables[i].style.display="table";
-  }
-  
-  return result;
-};
-*/
-
-/** Return the doctype of a document, if set
- * 
- * @param doc DOM element document
- * @returns string the actual doctype
- */
-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
-    {
-      // Timeout a little (Opera is a bit dodgy about using an event)
-      var editor = this;
-      setTimeout( function() { editor.initIframe() }, 5);
-    }
-  }
-}
-
-// For some reason, Opera doesn't listen to addEventListener for at least select elements with event = change
-// so we will have to intercept those and use a Dom0 event, these are used eg for the fontname/size/format
-// dropdowns in the toolbar
-Xinha._addEventOperaOrig = Xinha._addEvent;
-Xinha._addEvent = function(el, evname, func)
-{
-  if(el.tagName && el.tagName.toLowerCase() == 'select' && evname == 'change')
-  {
-    return Xinha.addDom0Event(el,evname,func);
-  }
-  
-  return Xinha._addEventOperaOrig(el,evname,func);
-}
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/modules/Opera/lang/ch.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/modules/Opera/lang/ch.js
deleted file mode 100644
index ff4d7bf..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/modules/Opera/lang/ch.js
+++ /dev/null
@@ -1,13 +0,0 @@
-// I18N constants
-// LANG: "ch", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "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."
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/modules/Opera/lang/da.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/modules/Opera/lang/da.js
deleted file mode 100644
index e5bf374..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/modules/Opera/lang/da.js
+++ /dev/null
@@ -1,13 +0,0 @@
-// I18N constants
-// LANG: "da", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "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."
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/modules/Opera/lang/de.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/modules/Opera/lang/de.js
deleted file mode 100644
index 41cfdb4..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/modules/Opera/lang/de.js
+++ /dev/null
@@ -1,13 +0,0 @@
-// I18N constants
-// LANG: "de", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "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)."
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/modules/Opera/lang/es.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/modules/Opera/lang/es.js
deleted file mode 100644
index c1eccf7..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/modules/Opera/lang/es.js
+++ /dev/null
@@ -1,13 +0,0 @@
-// I18N constants
-// LANG: "es", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "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"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/modules/Opera/lang/eu.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/modules/Opera/lang/eu.js
deleted file mode 100644
index 5ade75b..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/modules/Opera/lang/eu.js
+++ /dev/null
@@ -1,13 +0,0 @@
-// I18N constants
-// LANG: "eu", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "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."
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/modules/Opera/lang/fa.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/modules/Opera/lang/fa.js
deleted file mode 100644
index 1e2c5e7..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/modules/Opera/lang/fa.js
+++ /dev/null
@@ -1,13 +0,0 @@
-// I18N constants
-// LANG: "fa", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "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 را در صفحه کلید بزنید."
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/modules/Opera/lang/fr.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/modules/Opera/lang/fr.js
deleted file mode 100644
index 22f1a91..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/modules/Opera/lang/fr.js
+++ /dev/null
@@ -1,13 +0,0 @@
-// I18N constants
-// LANG: "fr", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "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."
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/modules/Opera/lang/ja.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/modules/Opera/lang/ja.js
deleted file mode 100644
index 1441898..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/modules/Opera/lang/ja.js
+++ /dev/null
@@ -1,13 +0,0 @@
-// I18N constants
-// LANG: "ja", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "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キーを押して直接貼り付けてください。"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/modules/Opera/lang/lc_base.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/modules/Opera/lang/lc_base.js
deleted file mode 100644
index 94bce2a..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/modules/Opera/lang/lc_base.js
+++ /dev/null
@@ -1,26 +0,0 @@
-// I18N constants
-//
-// LANG: "en", ENCODING: UTF-8
-// Author: Translator-Name, <email@example.com>
-//
-// Last revision: 2018-04-12
-// 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).
-//
-// (Please, remove information below)
-// 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.)
-
-{
-    "MARK": "",
-    "The Paste button does not work in Mozilla based web browsers (technical security reasons). Press CTRL-V on your keyboard to paste directly.": ""
-}
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/modules/Opera/lang/pl.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/modules/Opera/lang/pl.js
deleted file mode 100644
index 42d93a4..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/modules/Opera/lang/pl.js
+++ /dev/null
@@ -1,13 +0,0 @@
-// I18N constants
-// LANG: "pl", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "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."
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/modules/Opera/lang/pt_br.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/modules/Opera/lang/pt_br.js
deleted file mode 100644
index f48fcee..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/modules/Opera/lang/pt_br.js
+++ /dev/null
@@ -1,13 +0,0 @@
-// I18N constants
-// LANG: "pt_br", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "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."
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/modules/Opera/lang/ru.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/modules/Opera/lang/ru.js
deleted file mode 100644
index 8480693..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/modules/Opera/lang/ru.js
+++ /dev/null
@@ -1,13 +0,0 @@
-// I18N constants
-// LANG: "ru", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "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 на клавиатуре, чтобы вставить."
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/modules/Opera/lang/sr.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/modules/Opera/lang/sr.js
deleted file mode 100644
index f27a455..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/modules/Opera/lang/sr.js
+++ /dev/null
@@ -1,13 +0,0 @@
-// I18N constants
-// LANG: "sr", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "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 на тастатури да директно залепите."
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/modules/Opera/lang/sv.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/modules/Opera/lang/sv.js
deleted file mode 100644
index 12f7992..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/modules/Opera/lang/sv.js
+++ /dev/null
@@ -1,13 +0,0 @@
-// I18N constants
-// LANG: "sv", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "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."
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/modules/Opera/lang/tr.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/modules/Opera/lang/tr.js
deleted file mode 100644
index 1cd8c33..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/modules/Opera/lang/tr.js
+++ /dev/null
@@ -1,13 +0,0 @@
-// I18N constants
-// LANG: "tr", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "The Paste button does not work in Mozilla based web browsers (technical security reasons). Press CTRL-V on your keyboard to paste directly.": "Güvenlik sebeplerinden dolayı bazı tarayıcılar kes/kopyala/yapıştır komutlarına erişemez. Kesme/kopyalama/yapıştırma komutunu kullanmak için lütfen  klavyenizin kısayollarını kullanın (CTRL + C/V/X)."
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/modules/WebKit/WebKit.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/modules/WebKit/WebKit.js
deleted file mode 100644
index 4b02478..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/modules/WebKit/WebKit.js
+++ /dev/null
@@ -1,952 +0,0 @@
-
-  /*--------------------------------------:noTabs=true:tabSize=2:indentSize=2:--
-    --  Xinha (is not htmlArea) - http://xinha.gogo.co.nz/
-    --
-    --  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.
-    --
-    --  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.
-    --
-    -- This is the WebKit (Safari) compatability plugin, part of the Xinha core.
-    --
-    --  The file is loaded as a special plugin by the Xinha Core when
-    --  Xinha is being run under a Webkit based browser such as Safari
-    --
-    --  It provides implementation and specialisation for various methods
-    --  in the core where different approaches per browser are required.
-    --
-    --  Design Notes::
-    --   Most methods here will simply be overriding Xinha.prototype.<method>
-    --   and should be called that, but methods specific to Webkit should 
-    --   be a part of the WebKit.prototype, we won't trample on namespace
-    --   that way.
-    --
-    --  $HeadURL: http://svn.xinha.org/trunk/modules/WebKit/WebKit.js $
-    --  $LastChangedDate: 2018-02-19 20:35:49 +1300 (Mon, 19 Feb 2018) $
-    --  $LastChangedRevision: 1402 $
-    --  $LastChangedBy: gogo $
-    --------------------------------------------------------------------------*/
-                                                    
-WebKit._pluginInfo = {
-  name          : "WebKit",
-  origin        : "Xinha Core",
-  version       : "$LastChangedRevision: 1402 $".replace(/^[^:]*:\s*(.*)\s*\$$/, '$1'),
-  developer     : "The Xinha Core Developer Team",
-  developer_url : "$HeadURL: http://svn.xinha.org/trunk/modules/WebKit/WebKit.js $".replace(/^[^:]*:\s*(.*)\s*\$$/, '$1'),
-  sponsor       : "",
-  sponsor_url   : "",
-  license       : "htmlArea"
-};
-
-function WebKit(editor) {
-  this.editor = editor;  
-  editor.WebKit = this;
-}
-
-/** Allow Webkit to handle some key events in a special way.
- */
-  
-WebKit.prototype.onKeyPress = function(ev)
-{
-  var editor = this.editor;
-  var s = editor.getSelection();
-  
-  // Handle shortcuts
-  if(editor.isShortCut(ev))
-  {    
-    switch(editor.getKey(ev).toLowerCase())
-    {
-      case 'z':
-        if(editor._unLink && editor._unlinkOnUndo)
-        {
-          Xinha._stopEvent(ev);
-          editor._unLink();
-          editor.updateToolbar();
-          return true;
-        }
-      break;
-	  
-	  case 'a':
-        // ctrl-a selects all, but 
-      break;
-	  
-      case 'v':
-        // If we are not using htmlareaPaste, don't let Xinha try and be fancy but let the 
-        // event be handled normally by the browser (don't stopEvent it)
-        if(!editor.config.htmlareaPaste)
-        {          
-          return true;
-        }
-      break;
-    }
-  }
-  
-  // Handle normal characters
-  switch(editor.getKey(ev))
-  {
-    // Space, see if the text just typed looks like a URL, or email address
-    // and link it appropriatly
-    case ' ': 
-      var autoWrap = function (textNode, tag)
-      {
-        var rightText = textNode.nextSibling;
-        if ( typeof tag == 'string')
-        {
-          tag = editor._doc.createElement(tag);
-        }
-        var a = textNode.parentNode.insertBefore(tag, rightText);
-        Xinha.removeFromParent(textNode);
-        a.appendChild(textNode);
-        rightText.data = ' ' + rightText.data;
-    
-        s.collapse(rightText, 1);
-    
-        editor._unLink = function()
-        {
-          var t = a.firstChild;
-          a.removeChild(t);
-          a.parentNode.insertBefore(t, a);
-          Xinha.removeFromParent(a);
-          editor._unLink = null;
-          editor._unlinkOnUndo = false;
-        };
-        editor._unlinkOnUndo = true;
-        return a;
-      };
-  
-      if ( editor.config.convertUrlsToLinks && s && s.isCollapsed && s.anchorNode.nodeType == 3 && s.anchorNode.data.length > 3 && s.anchorNode.data.indexOf('.') >= 0 )
-      {
-        var midStart = s.anchorNode.data.substring(0,s.anchorOffset).search(/\S{4,}$/);
-        if ( midStart == -1 )
-        {
-          break;
-        }
-
-        if ( editor._getFirstAncestor(s, 'a') )
-        {
-          break; // already in an anchor
-        }
-
-        var matchData = s.anchorNode.data.substring(0,s.anchorOffset).replace(/^.*?(\S*)$/, '$1');
-
-        var mEmail = matchData.match(Xinha.RE_email);
-        if ( mEmail )
-        {
-          var leftTextEmail  = s.anchorNode;
-          var rightTextEmail = leftTextEmail.splitText(s.anchorOffset);
-          var midTextEmail   = leftTextEmail.splitText(midStart);
-
-          autoWrap(midTextEmail, 'a').href = 'mailto:' + mEmail[0];
-          return true;
-        }
-
-        RE_date = /([0-9]+\.)+/; //could be date or ip or something else ...
-        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 mUrl = matchData.match(Xinha.RE_url);
-        if ( mUrl )
-        {
-          if (RE_date.test(matchData))
-          {
-            break; //ray: disabling linking of IP numbers because of general bugginess (see Ticket #1085)
-            /*if (!RE_ip.test(matchData)) 
-            {
-              break;
-            }*/
-          } 
-          var leftTextUrl  = s.anchorNode;
-          var rightTextUrl = leftTextUrl.splitText(s.anchorOffset);
-          var midTextUrl   = leftTextUrl.splitText(midStart);
-          autoWrap(midTextUrl, 'a').href = (mUrl[1] ? mUrl[1] : 'http://') + mUrl[2];
-          return true;
-        }
-      }
-    break;
-  }
-  
-  // Handle special keys
-  switch ( ev.keyCode )
-  {    
-    case 13: // ENTER
-      if( ev.shiftKey  )
-      {
-        //TODO: here we need to add insert new line
-      }
-    break;
-
-    case 27: // ESCAPE
-      if ( editor._unLink )
-      {
-        editor._unLink();
-        Xinha._stopEvent(ev);
-      }
- 
-    break;
-    
-    case 9: // KEY tab
-    {
-      // Note that the ListOperations plugin will handle tabs in list items and indent/outdent those
-      // at some point TableOperations might do also
-      // so this only has to handle a tab/untab in text
-      if(editor.config.tabSpanClass)
-      {
-        if(!ev.shiftKey)
-        {                  //  v-- Avoid lc_parse_strings.php
-          editor.insertHTML('<'+'span class="'+editor.config.tabSpanClass+'">'+editor.config.tabSpanContents+'</span>');
-          var s = editor.getSelection().collapseToEnd();
-        }
-        else
-        {
-          var existingTab = editor.getParentElement();
-          if(existingTab && existingTab.className.match(editor.config.tabSpanClass))
-          {
-            var s = editor.getSelection();
-            s.removeAllRanges();
-            var r = editor.createRange();
-            r.selectNode(existingTab);
-            s.addRange(r);
-            s.deleteFromDocument();
-          }
-        }
-      }
-      
-      Xinha._stopEvent(ev);
-      
-    }
-    break;
-    
-    case 8: // KEY backspace
-    case 46: // KEY delete
-      // We handle the mozilla backspace directly??
-      if ( !ev.shiftKey && this.handleBackspace() )
-      {
-        Xinha._stopEvent(ev);
-      }
-    break;
-    default:
-        editor._unlinkOnUndo = false;
-
-        // Handle the "auto-linking", specifically this bit of code sets up a handler on
-        // an self-titled anchor (eg <a href="http://www.gogo.co.nz/">www.gogo.co.nz</a>)
-        // when the text content is edited, such that it will update the href on the anchor
-        
-        if ( s.anchorNode && s.anchorNode.nodeType == 3 )
-        {
-          // See if we might be changing a link
-          var a = editor._getFirstAncestor(s, 'a');
-          // @todo: we probably need here to inform the setTimeout below that we not changing a link and not start another setTimeout
-          if ( !a )
-          {
-            break; // not an anchor
-          } 
-          
-          if ( !a._updateAnchTimeout )
-          {
-            if ( s.anchorNode.data.match(Xinha.RE_email) && a.href.match('mailto:' + s.anchorNode.data.trim()) )
-            {
-              var textNode = s.anchorNode;
-              var fnAnchor = function()
-              {
-                a.href = 'mailto:' + textNode.data.trim();
-                // @fixme: why the hell do another timeout is started ?
-                //         This lead to never ending timer if we dont remove this line
-                //         But when removed, the email is not correctly updated
-                //
-                // - to fix this we should make fnAnchor check to see if textNode.data has
-                //   stopped changing for say 5 seconds and if so we do not make this setTimeout 
-                a._updateAnchTimeout = setTimeout(fnAnchor, 250);
-              };
-              a._updateAnchTimeout = setTimeout(fnAnchor, 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 txtNode = s.anchorNode;
-              var fnUrl = function()
-              {
-                // Sometimes m is undefined becase the url is not an url anymore (was www.url.com and become for example www.url)
-                // ray: shouldn't the link be un-linked then?
-                m = txtNode.data.match(Xinha.RE_url);
-                if(m)
-                {
-                  a.href = (m[1] ? m[1] : 'http://') + m[2];
-                }
-                
-                // @fixme: why the hell do another timeout is started ?
-                //         This lead to never ending timer if we dont remove this line
-                //         But when removed, the url is not correctly updated
-                //
-                // - to fix this we should make fnUrl check to see if textNode.data has
-                //   stopped changing for say 5 seconds and if so we do not make this setTimeout
-                a._updateAnchTimeout = setTimeout(fnUrl, 250);
-              };
-              a._updateAnchTimeout = setTimeout(fnUrl, 1000);
-            }
-          }        
-        }                
-    break;
-  }
-
-  return false; // Let other plugins etc continue from here.
-}
-
-/** When backspace is hit, the Gecko onKeyPress will execute this method.
- *  I don't remember what the exact purpose of this is though :-(
- *  
- */
- 
-WebKit.prototype.handleBackspace = function()
-{
-  var editor = this.editor;
-  setTimeout(
-    function()
-    {
-      var sel   = editor.getSelection();
-      var range = editor.createRange(sel);
-      var SC = range.startContainer;
-      var SO = range.startOffset;
-      var EC = range.endContainer;
-      var EO = range.endOffset;
-      var newr = 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 = range.cloneRange();
-        r.setStartBefore(newr);
-        r.setEndAfter(newr);
-        r.extractContents();
-        sel.removeAllRanges();
-        sel.addRange(r);
-      }
-    },
-    10);
-};
-
-WebKit.prototype.inwardHtml = function(html)
-{
-   return html;
-}
-
-WebKit.prototype.outwardHtml = function(html)
-{
-  return html;
-}
-
-WebKit.prototype.onExecCommand = function(cmdID, UI, param)
-{   
-  this.editor._doc.execCommand('styleWithCSS', false, false); //switch styleWithCSS off; seems to make no difference though 
-   
-  switch(cmdID)
-  {
-    case 'paste':
-      alert(Xinha._lc("The Paste button does not work in this browser for security reasons. Press CTRL-V on your keyboard to paste directly.", "WebKit"));
-      return true; // Indicate paste is done, stop command being issued to browser by Xinha.prototype.execCommand
-    break;
-    case 'removeformat':
-      var editor = this.editor;
-      var sel = editor.getSelection();
-      var selSave = editor.saveSelection(sel);
-      var range = editor.createRange(sel);
-
-      var els = editor._doc.getElementsByTagName('*');
-      els = Xinha.collectionToArray(els);
-      var start = ( range.startContainer.nodeType == 1 ) ? range.startContainer : range.startContainer.parentNode;
-      var i,el,newNode, fragment, child,r2 = editor._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);
-          fragment = r2.extractContents();
-          while (fragment.firstChild)
-          {
-            child = fragment.removeChild(fragment.firstChild);
-            el.parentNode.insertBefore(child, el);
-          }
-          el.parentNode.removeChild(el);
-        }
-      }
-      if (sel.isCollapsed)
-      {
-        els = editor._doc.body.childNodes;
-        for (i = 0; i < els.length; i++) 
-        {
-          el = els[i];
-          if (el.nodeType != 1) continue;
-          if (el.tagName.toLowerCase() == 'span')
-          {
-            newNode = editor.convertNode(el, 'div');
-            el.parentNode.replaceChild(newNode, el);
-            el = newNode;
-          }
-          clean(el);
-        }
-      } 
-      else
-      {
-        for (i=0; i<els.length;i++)
-        {
-          el = els[i];
-          if ( range.isPointInRange(el, 0) || (els[i] == start && range.startOffset == 0))
-          {
-            clean(el);
-          }
-        }
-      }
-
-      r2.detach();
-      editor.restoreSelection(selSave);
-      return true;
-    break;
-  }
-
-  return false;
-}
-WebKit.prototype.onMouseDown = function(ev)
-{ 
-  // selection of hr in Safari seems utterly impossible :(
-  if (ev.target.tagName.toLowerCase() == "hr" || ev.target.tagName.toLowerCase() == "img")
-  {
-    this.editor.selectNodeContents(ev.target);
-  }
-}
-
-
-/*--------------------------------------------------------------------------*/
-/*------- IMPLEMENTATION OF THE ABSTRACT "Xinha.prototype" METHODS ---------*/
-/*--------------------------------------------------------------------------*/
-
-/** Insert a node at the current selection point. 
- * @param toBeInserted DomNode
- */
-
-Xinha.prototype.insertNodeAtSelection = function(toBeInserted)
-{
-  var sel = this.getSelection();
-  var range = this.createRange(sel);
-  // remove the current selection
-  sel.removeAllRanges();
-  range.deleteContents();
-  var node = range.startContainer;
-  var pos = range.startOffset;
-  var selnode = toBeInserted;
-  switch ( node.nodeType )
-  {
-    case 3: // Node.TEXT_NODE
-      // we have to split it at the caret position.
-      if ( toBeInserted.nodeType == 3 )
-      {
-        // do optimized insertion
-        node.insertData(pos, toBeInserted.data);
-        range = this.createRange();
-        range.setEnd(node, pos + toBeInserted.length);
-        range.setStart(node, pos + toBeInserted.length);
-        sel.addRange(range);
-      }
-      else
-      {
-        node = node.splitText(pos);
-        if ( toBeInserted.nodeType == 11 /* Node.DOCUMENT_FRAGMENT_NODE */ )
-        {
-          selnode = selnode.firstChild;
-        }
-        node.parentNode.insertBefore(toBeInserted, node);
-        this.selectNodeContents(selnode);
-        this.updateToolbar();
-      }
-    break;
-    case 1: // Node.ELEMENT_NODE
-      if ( toBeInserted.nodeType == 11 /* Node.DOCUMENT_FRAGMENT_NODE */ )
-      {
-        selnode = selnode.firstChild;
-      }
-      node.insertBefore(toBeInserted, node.childNodes[pos]);
-      this.selectNodeContents(selnode);
-      this.updateToolbar();
-    break;
-  }
-};
-  
-/** Get the parent element of the supplied or current selection. 
- *  @param   sel optional selection as returned by getSelection
- *  @returns DomNode
- */
- 
-Xinha.prototype.getParentElement = function(sel)
-{
-  if ( typeof sel == 'undefined' )
-  {
-    sel = this.getSelection();
-  }
-  var range = this.createRange(sel);
-  try
-  {
-    var p = range.commonAncestorContainer;
-    if ( !range.collapsed && range.startContainer == range.endContainer &&
-        range.startOffset - range.endOffset <= 1 && range.startContainer.hasChildNodes() )
-    {
-      p = range.startContainer.childNodes[range.startOffset];
-    }
-
-    while ( p.nodeType == 3 )
-    {
-      p = p.parentNode;
-    }
-    return p;
-  }
-  catch (ex)
-  {
-    return null;
-  }
-};
-
-/**
- * Returns the selected element, if any.  That is,
- * the element that you have last selected in the "path"
- * at the bottom of the editor, or a "control" (eg image)
- *
- * @returns null | DomNode
- */
-
-Xinha.prototype.activeElement = function(sel)
-{
-  if ( ( sel === null ) || this.selectionEmpty(sel) )
-  {
-    return null;
-  }
-
-  // For Mozilla we just see if the selection is not collapsed (something is selected)
-  // and that the anchor (start of selection) is an element.  This might not be totally
-  // correct, we possibly should do a simlar check to IE?
-  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 sel.anchorNode.parentNode;
-    }
-  }
-  return null;
-};
-
-/** 
- * Determines if the given selection is empty (collapsed).
- * @param selection Selection object as returned by getSelection
- * @returns true|false
- */
- 
-Xinha.prototype.selectionEmpty = function(sel)
-{
-  if ( !sel )
-  {
-    return true;
-  }
-
-  if ( typeof sel.isCollapsed != 'undefined' )
-  {      
-    return sel.isCollapsed;
-  }
-
-  return true;
-};
-
-/** 
- * Returns a range object to be stored 
- * and later restored with Xinha.prototype.restoreSelection()
- * 
- * @returns Range
- */
-Xinha.prototype.saveSelection = function()
-{
-  return this.createRange(this.getSelection()).cloneRange();
-}
-/** 
- * Restores a selection previously stored
- * @param savedSelection Range object as returned by Xinha.prototype.restoreSelection()
- */
-Xinha.prototype.restoreSelection = function(savedSelection)
-{
-  var sel = this.getSelection();
-  sel.removeAllRanges();
-  sel.addRange(savedSelection);
-}
-/**
- * Selects the contents of the given node.  If the node is a "control" type element, (image, form input, table)
- * the node itself is selected for manipulation.
- *
- * @param node DomNode 
- * @param collapseToStart A boolean that, when supplied, says to collapse the selection. True collapses to the start, and false to the end.
- */
- 
-Xinha.prototype.selectNodeContents = function(node, collapseToStart)
-{
-  if(!node) return; // I've seen this once
-  this.focusEditor();
-  this.forceRedraw();
-  var range;
-  var collapsed = typeof collapseToStart == "undefined" ? true : false;
-  var sel = this.getSelection();
-  range = this._doc.createRange();
-  // Tables and Images get selected as "objects" rather than the text contents
-  if ( collapsed && node.tagName && node.tagName.toLowerCase().match(/table|img|input|textarea|select/) )
-  {
-    range.selectNode(node);
-  }
-  else
-  {
-    range.selectNodeContents(node);
-  }
-  sel.removeAllRanges();
-  sel.addRange(range);
-  if (typeof collapseToStart != "undefined")
-  {
-    if (collapseToStart)
-    {
-      sel.collapse(range.startContainer, range.startOffset);
-    } else
-    {
-      sel.collapse(range.endContainer, range.endOffset);
-    }
-  }
-};
-  
-/** Insert HTML at the current position, deleting the selection if any. 
- *  
- *  @param html string
- */
- 
-Xinha.prototype.insertHTML = function(html)
-{
-  var sel = this.getSelection();
-  var range = this.createRange(sel);
-  this.focusEditor();
-  // construct a new document fragment with the given HTML
-  var fragment = this._doc.createDocumentFragment();
-  var div = this._doc.createElement("div");
-  div.innerHTML = html;
-  while ( div.firstChild )
-  {
-    // the following call also removes the node from div
-    fragment.appendChild(div.firstChild);
-  }
-  // this also removes the selection
-  var node = this.insertNodeAtSelection(fragment);
-};
-
-/** Get the HTML of the current selection.  HTML returned has not been passed through outwardHTML.
- *
- * @returns string
- */
- 
-Xinha.prototype.getSelectedHTML = function()
-{
-  var sel = this.getSelection();
-  if (sel.isCollapsed) return '';
-  var range = this.createRange(sel);
-
-  if ( range )
-  {
-    return Xinha.getHTML(range.cloneContents(), false, this);
-  }
-  else return '';
-};
-  
-
-/** Get a Selection object of the current selection.  Note that selection objects are browser specific.
- *
- * @returns Selection
- */
- 
-Xinha.prototype.getSelection = function()
-{
-  return this._iframe.contentWindow.getSelection();
-};
-  
-/** Create a Range object from the given selection.  Note that range objects are browser specific.
- *
- *  @param sel Selection object (see getSelection)
- *  @returns Range
- */
- 
-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();
-  }
-};
-
-
-/** Due to browser differences, some keys which Xinha prefers to call a keyPress
- *   do not get an actual keypress event.  This browser specific function 
- *   overridden in the browser's engine (eg modules/WebKit/WebKit.js) as required
- *   takes a keydown event type and tells us if we should treat it as a 
- *   keypress event type.
- *
- *  To be clear, the keys we are interested here are
- *        Escape, Tab, Backspace, Delete, Enter
- *   these are "non printable" characters which we still want to regard generally
- *   as a keypress.  
- * 
- *  If the browser does not report these as a keypress
- *   ( https://dvcs.w3.org/hg/d4e/raw-file/tip/key-event-test.html )
- *   then this function must return true for such keydown events as it is
- *   given.
- * 
- * @param KeyboardEvent with keyEvent.type == keydown
- * @return boolean
- */
-
-Xinha.prototype.isKeyDownThatShouldGetButDoesNotGetAKeyPressEvent = function(keyEvent)
-{
-  // Dom 3
-  if(typeof keyEvent.key != 'undefined')
-  {
-    if(typeof Xinha.DOM3_WebKit_KeyDownKeyPress_RE == 'undefined')
-    {
-      // I don't know if pre-defining this is really faster in the modern world of
-      //  Javascript JIT compiling, but it does no harm
-      Xinha.DOM3_WebKit_KeyDownKeyPress_RE = /^(Escape|Esc|Tab|Backspace|Delete|Del)/;
-    }
-    
-    // Found using Chrome 65 and Opera 50, Edge
-    //  Note that Edge calls Escape Esc, and Delete Del
-    if(Xinha.DOM3_WebKit_KeyDownKeyPress_RE.test(keyEvent.key))
-    {
-      return true;
-    }
-  }
-  // Old Safari and Chrome
-  else if(typeof keyEvent.keyIdentifier != 'undefined' && keyEvent.keyIdentifier.length)
-  {
-    var kI = parseInt(keyEvent.keyIdentifier.replace(/^U\+/,''),16);
-    // Found using Safari 9.1.1 - safari seems to pass ESC ok as a keyPress
-    if(kI == 9 /* Tab */ || kI == 8 /* Backspace */ || kI == 127 /* Delete */ ) return true;
-  }
-  // Legacy
-  else
-  {
-    // Also Chrome 65, I'm assuming perhaps dangerously, that it's about the same as 
-    // older pre-KeyboardEvent.key but that's been around a few years now so
-    // people will mostly be on supporting browsers anyway so this probably
-    // won't be hit by that many people
-    if(keyEvent.charCode == 0)
-    {
-      if( keyEvent.keyCode == 27  // ESC
-       || keyEvent.keyCode == 9   // Tab
-       || keyEvent.keyCode == 8   // Backspace
-       || keyEvent.keyCode == 46  // Del
-      ) return true;
-    }
-  }
-};
-
-/** Return the character (as a string) of a keyEvent  - ie, press the 'a' key and
- *  this method will return 'a', press SHIFT-a and it will return 'A'.
- * 
- *  @param   keyEvent
- *  @returns string
- */
-                                   
-Xinha.prototype.getKey = function(keyEvent)
-{ 
-  // DOM3 Key is easy (ish)
-  if(typeof keyEvent.key != 'undefined' && keyEvent.key.length > 0)
-  {
-    return keyEvent.key;
-  }
-  // Old DOM3 used by (Old?) Safari SOMETIMES (but not ALWAYS!) and old Chrome
-  else if(typeof keyEvent.keyIdentifier != 'undefined' && keyEvent.keyIdentifier.length > 0 && keyEvent.keyIdentifier.match(/^U\+/))
-  {
-      var key = String.fromCharCode(parseInt(keyEvent.keyIdentifier.replace(/^U\+/,''),16));
-      if (keyEvent.shiftKey) return key;
-      else return key.toLowerCase();
-  }
-  // If charCode is specified, that's what we want
-  else if(keyEvent.charCode)
-  {
-    return String.fromCharCode(keyEvent.charCode);
-  }
-  // Safari does not set charCode if CTRL is pressed
-  //  but does set keyCode to the key, it also sets keyCode
-  //  for the actual pressing of ctrl, skip that
-  //  the keyCode in Safari si the uppercase character's code 
-  //  for that key, so if shift is not pressed, lowercase it
-  else if(keyEvent.ctrlKey && keyEvent.keyCode != 17)
-  {
-    if(keyEvent.shiftKey)
-    {
-      return String.fromCharCode(keyEvent.keyCode);
-    }
-    else
-    {
-      return String.fromCharCode(keyEvent.keyCode).toLowerCase();
-    }
-  }
-  
-  // Ok, give up, no idea!
-  return '';
-}
-
-/** Return the HTML string of the given Element, including the Element.
- * 
- * @param element HTML Element DomNode
- * @returns string
- */
- 
-Xinha.getOuterHTML = function(element)
-{
-  return (new XMLSerializer()).serializeToString(element);
-};
-
-Xinha.cc = String.fromCharCode(8286); 
-
-Xinha.prototype.setCC = function ( target )
-{
-  var cc = Xinha.cc;
-  try
-  {
-    if ( target == "textarea" )
-    {
-      var ta = this._textArea;
-      var index = ta.selectionStart;
-      var before = ta.value.substring( 0, index )
-      var after = ta.value.substring( index, ta.value.length );
-
-      if ( after.match(/^[^<]*>/) ) // make sure cursor is in an editable area (outside tags, script blocks, enities and inside the body)
-      {
-        var tagEnd = after.indexOf(">") + 1;
-        ta.value = before + after.substring( 0, tagEnd ) + cc + after.substring( tagEnd, after.length );
-      }
-      else ta.value = before + cc + after;
-      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 ( target )
-{
-  var cc = Xinha.cc;
-  
-  if ( target == 'textarea' )
-  {
-  var ta = this._textArea;
-  var pos = ta.value.indexOf( cc );
-  if ( pos == -1 ) return;
-  var end = pos + cc.length;
-  var before =  ta.value.substring( 0, pos );
-  var after = ta.value.substring( end, ta.value.length );
-  ta.value = before ;
-
-  ta.scrollTop = ta.scrollHeight;
-  var scrollPos = ta.scrollTop;
-  
-  ta.value += after;
-  ta.setSelectionRange(pos,pos);
-
-  ta.focus();
-  
-  ta.scrollTop = scrollPos;
-
-  }
-  else
-  {
-    var self = this;
-    try
-    {
-      var doc = this._doc; 
-      doc.body.innerHTML = doc.body.innerHTML.replace(new RegExp(cc),'<span id="XinhaEditingPostion"></span>');
-      var posEl = doc.getElementById('XinhaEditingPostion');
-      this.selectNodeContents(posEl);
-      this.scrollToElement(posEl);
-      posEl.parentNode.removeChild(posEl);
-
-      this._iframe.contentWindow.focus();
-    } catch (e) {}
-  }
-};
-/*--------------------------------------------------------------------------*/
-/*------------ EXTEND SOME STANDARD "Xinha.prototype" METHODS --------------*/
-/*--------------------------------------------------------------------------*/
-
-Xinha.prototype._standardToggleBorders = Xinha.prototype._toggleBorders;
-Xinha.prototype._toggleBorders = function()
-{
-  var result = this._standardToggleBorders();
-  
-  // flashing the display forces moz to listen (JB:18-04-2005) - #102
-  var tables = this._doc.getElementsByTagName('TABLE');
-  for(var i = 0; i < tables.length; i++)
-  {
-    tables[i].style.display="none";
-    tables[i].style.display="table";
-  }
-  
-  return result;
-};
-
-/** Return the doctype of a document, if set
- * 
- * @param doc DOM element document
- * @returns string the actual doctype
- */
-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-1.5.1/modules/WebKit/lang/lc_base.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/modules/WebKit/lang/lc_base.js
deleted file mode 100644
index 7364044..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/modules/WebKit/lang/lc_base.js
+++ /dev/null
@@ -1,25 +0,0 @@
-// I18N constants
-//
-// LANG: "en", ENCODING: UTF-8
-// Author: Translator-Name, <email@example.com>
-//
-// Last revision: 2018-04-12
-// 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).
-//
-// (Please, remove information below)
-// 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.)
-
-{
-    "The Paste button does not work in this browser for security reasons. Press CTRL-V on your keyboard to paste directly.": ""
-}
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/Abbreviation/Abbreviation.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/Abbreviation/Abbreviation.js
deleted file mode 100644
index 7555cc5..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/Abbreviation/Abbreviation.js
+++ /dev/null
@@ -1,153 +0,0 @@
-// Abbreviation plugin for Xinha

-// Implementation by Udo Schmal & Schaffrath NeueMedien

-// Original Author - Udo Schmal

-//

-// (c) Udo Schmal & Schaffrath NeueMedien 2004

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

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

-

-function Abbreviation(editor) {

-  this.editor = editor;

-  var cfg = editor.config;

-  var self = this;

-

-  // register the toolbar buttons provided by this plugin

-  cfg.registerButton({

-    id       : "abbreviation",

-    tooltip  : Xinha._lc("Abbreviation", "Abbreviation"),

-    image    : editor.imgURL("ed_abbreviation.gif", "Abbreviation"),

-    textMode : false,

-    action   : function(editor) {

-                 self.show();

-               }

-  });

-  cfg.addToolbarElement("abbreviation", "inserthorizontalrule", 1);

-}

-

-Abbreviation._pluginInfo = {

-  name          : "Abbreviation",

-  version       : "1.0",

-  developer     : "Udo Schmal",

-  developer_url : "",

-  sponsor       : "L.N.Schaffrath NeueMedien",

-  sponsor_url   : "http://www.schaffrath-neuemedien.de/",

-  c_owner       : "Udo Schmal & Schaffrath-NeueMedien",

-  license       : "htmlArea"

-};

-

-// Fills in the text field if the acronym is either known (i.e., in the [lang].js file)

-// or if we're editing an existing abbreviation.

-Abbreviation.prototype.fillText = function() {

-  var editor = this.editor;

-  var text = this.html.toUpperCase();

-  var abbr = Xinha.getPluginDir(this.constructor.name) + "/abbr/" + _editor_lang + ".js";

-  var abbrData = Xinha._geturlcontent(abbr);

-

-  if (abbrData) {

-    eval('abbrObj = ' + abbrData);

-    if (abbrObj != "") {

-      var dest = this.dialog.getElementById("title");

-      dest.value = this.title || "";

-      for (var i in abbrObj) {

-        same = (i.toUpperCase()==text);

-        if (same)

-          dest.value = abbrObj[i];

-      }

-    }

-  }

-}

-

-Abbreviation.prototype.onGenerateOnce = function(editor) {

-  this.editor.addEditorStylesheet(Xinha.getPluginDir('Abbreviation') + '/abbreviation.css');

-  this.methodsReady = true; //remove this?

-  var self = Abbreviation;

-  Xinha._getback(Xinha.getPluginDir('Abbreviation') + '/dialog.html', function(getback) { self.html = getback; self.dialogReady = true; });

-};

-

-Abbreviation.prototype.OnUpdateToolbar = function(editor) {

-  if (!(Abbreviation.dialogReady && Abbreviation.methodsReady))

-  {

-    this.editor._toolbarObjects.Abbreviation.state("enabled", false);

-  }

-  else this.onUpdateToolbar = null;

-}

-

-Abbreviation.prototype.prepareDialog = function(html) {

-  var self = this;

-  var editor = this.editor;

-  var dialog = this.dialog = new Xinha.Dialog(editor, Abbreviation.html, 'Xinha', {width: 260, height:140});

-

-  dialog.getElementById('ok').onclick = function() { self.apply(); };

-  dialog.getElementById('delete').onclick = function() { self.ondelete(); };

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

-  

-  this.dialogReady = true;

-}

-

-Abbreviation.prototype.show = function(editor) {

-  var editor = this.editor;

-  this.html = editor.getSelectedHTML();

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

-  var self = this;

-  var doc = editor._doc;

-  var sel  = editor._getSelection();

-  var range  = editor._createRange(sel);

-  var abbr = editor._activeElement(sel);

-  

-  if(!(abbr != null && abbr.tagName.toLowerCase() == "abbr")) {

-    abbr = editor._getFirstAncestor(sel, 'abbr');

-  }

-  this.abbr = abbr;

-  

-  if (abbr) this.title = abbr.title;

-  this.fillText();

-

-  this.dialog.getElementById("inputs").onsubmit = function() {

-    self.apply();

-    return false;

-  }

-

-  this.dialog.show();

-  this.dialog.getElementById("title").select();

-}

-

-Abbreviation.prototype.apply = function() {

-  var editor = this.editor;

-  var doc = editor._doc;

-  var abbr = this.abbr;

-  var html = this.html;

-  var param = this.dialog.hide();

-

-  if ( param ) {

-    var title = param["title"];

-    if (title == "" || title == null) {

-      if (abbr) {

-        var child = abbr.innerHTML;

-        abbr.parentNode.removeChild(abbr);

-        editor.insertHTML(child); // FIX: This doesn't work in Safari 3 

-      }

-      return;

-    }

-    try {

-      if (!abbr) {

-        abbr = doc.createElement("abbr");

-        abbr.title = title;

-        abbr.innerHTML = html;

-        if (Xinha.is_ie) {

-          range.pasteHTML(abbr.outerHTML);

-        } else {

-          editor.insertNodeAtSelection(abbr);

-        }

-      } else {

-        abbr.title = title;

-      }

-    }

-    catch (e) { }

-  }

-}

-

-

-Abbreviation.prototype.ondelete = function() {

-  this.dialog.getElementById('title').value = "";

-  this.apply();

-}
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/Abbreviation/abbr/de.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/Abbreviation/abbr/de.js
deleted file mode 100644
index b2b5462..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/Abbreviation/abbr/de.js
+++ /dev/null
@@ -1,40 +0,0 @@
-// I18N constants
-// LANG: "de", ENCODING: UTF-8
-// Author: Udo Schmal, <schmal@schaffrath-neuemedien.de>
-//
-// (c) Udo Schmal & Schaffrath NeueMedien 2004
-// Distributed under the same terms as HTMLArea itself.
-// This notice MUST stay intact for use (see license.txt).
-
-{
-  "Abs.": "Absatz",
-  "bspw.": "Beispielsweise",
-  "bzw.": "beziehungsweise",
-  "c/o": "care of / bei, zu Händen von",
-  "ca.": "circa",
-  "d.h.": "das heißt",
-  "d.J.": "des Jahres",
-  "Dr.": "Doktor",
-  "e.V.": "Eingetragener Verein",
-  "eG.": "Eingetragene Genossenschaft",
-  "ehem.": "ehemals",
-  "einschl.": "einschließlich",
-  "etc.": "et cetera / und so weiter",
-  "evtl.": "eventuell",
-  "ff.": "(fort) folgende",
-  "gem.": "gemäß",
-  "inkl.": "inklusive",
-  "max.": "maximal / maximum",
-  "min.": "mindestens / minimum / minimal",
-  "o.g.": "oben genannt",
-  "rd.": "rund",
-  "S.": "Seite",
-  "u.a.": "unter anderem",
-  "u.ä.": "und ähnlich",
-  "usw.": "und so weiter",
-  "vgl.": "vergleiche",
-  "z.B.": "zum Beispiel",
-  "z.T.": "zum Teil",
-  "z.Z.": "zur Zeit",
-  "zzgl.": "zuzüglich"
-};
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/Abbreviation/abbr/en.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/Abbreviation/abbr/en.js
deleted file mode 100644
index 31974c8..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/Abbreviation/abbr/en.js
+++ /dev/null
@@ -1,16 +0,0 @@
-// I18N constants
-// LANG: "en", ENCODING: UTF-8
-// Author: Udo Schmal, <schmal@schaffrath-neuemedien.de>
-//
-// (c) Udo Schmal & Schaffrath NeueMedien 2004
-// Distributed under the same terms as HTMLArea itself.
-// This notice MUST stay intact for use (see license.txt).
-
-{
-  "ANSI": "American National Standards Institute",  
-  "ASA": "American Standards Association",
-  "ISO": "International Organisation for Standardization",
-  "mime": "Multipurpose Internet Mail Extensions",
-  "UTF": "Unicode Transformation Format",
-  "W3C": "World Wide Web Consortium"
-};
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/Abbreviation/abbreviation.css b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/Abbreviation/abbreviation.css
deleted file mode 100644
index 2f999c9..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/Abbreviation/abbreviation.css
+++ /dev/null
@@ -1,11 +0,0 @@
-abbr, acronym, span.abbr {

-  width: 18px;

-  height: 18px;

-	background-image: url(img/ed_abbreviation.gif);	

-	background-repeat: no-repeat;

-	background-position: left top;

-	white-space : nowrap;	

-	cursor: help;

-	border-bottom: 1px dashed #000;

-	padding-left: 19px;

-}
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/Abbreviation/dialog.html b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/Abbreviation/dialog.html
deleted file mode 100644
index 5b09fb1..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/Abbreviation/dialog.html
+++ /dev/null
@@ -1,16 +0,0 @@
-<h1 id="[h1]"><l10n>Abbreviation</l10n></h1>

-

-<form name="form" action="" method="get" id="[inputs]">

-  <fieldset>

-    <legend><l10n>Expansion:</l10n></legend>

-    <input type="text" id="[title]" name="[title]" size="35" />

- </fieldset>

-<p />

-

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

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

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

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

-</div>

-</form>

-

diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/Abbreviation/img/ed_abbreviation.gif b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/Abbreviation/img/ed_abbreviation.gif
deleted file mode 100644
index 50fba3d..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/Abbreviation/img/ed_abbreviation.gif
+++ /dev/null
Binary files differ
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/Abbreviation/lang/ch.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/Abbreviation/lang/ch.js
deleted file mode 100644
index 9d78e44..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/Abbreviation/lang/ch.js
+++ /dev/null
@@ -1,14 +0,0 @@
-// I18N constants
-// LANG: "ch", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Cancel": "取消",
-    "OK": "好"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/Abbreviation/lang/cz.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/Abbreviation/lang/cz.js
deleted file mode 100644
index 36b9929..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/Abbreviation/lang/cz.js
+++ /dev/null
@@ -1,14 +0,0 @@
-// I18N constants
-// LANG: "cz", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Cancel": "Zrušit",
-    "OK": "OK"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/Abbreviation/lang/da.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/Abbreviation/lang/da.js
deleted file mode 100644
index 20fc0d0..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/Abbreviation/lang/da.js
+++ /dev/null
@@ -1,14 +0,0 @@
-// I18N constants
-// LANG: "da", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Cancel": "Annuller",
-    "OK": "OK"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/Abbreviation/lang/de.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/Abbreviation/lang/de.js
deleted file mode 100644
index e2b6a2d..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/Abbreviation/lang/de.js
+++ /dev/null
@@ -1,17 +0,0 @@
-// I18N constants
-// LANG: "de", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Abbreviation": "Abkürzung",
-    "Cancel": "Abbrechen",
-    "Delete": "Löschen",
-    "Expansion:": "Erklärung:",
-    "OK": "OK"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/Abbreviation/lang/ee.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/Abbreviation/lang/ee.js
deleted file mode 100644
index ba916e9..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/Abbreviation/lang/ee.js
+++ /dev/null
@@ -1,14 +0,0 @@
-// I18N constants
-// LANG: "ee", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Cancel": "Loobu",
-    "OK": "OK"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/Abbreviation/lang/el.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/Abbreviation/lang/el.js
deleted file mode 100644
index f6e006c..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/Abbreviation/lang/el.js
+++ /dev/null
@@ -1,14 +0,0 @@
-// I18N constants
-// LANG: "el", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Cancel": "Ακύρωση",
-    "OK": "Εντάξει"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/Abbreviation/lang/es.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/Abbreviation/lang/es.js
deleted file mode 100644
index 486613d..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/Abbreviation/lang/es.js
+++ /dev/null
@@ -1,17 +0,0 @@
-// I18N constants
-// LANG: "es", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Abbreviation": "Abreviatura",
-    "Cancel": "Cancelar",
-    "Delete": "Suprimir",
-    "Expansion:": "Explicación",
-    "OK": "Aceptar"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/Abbreviation/lang/eu.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/Abbreviation/lang/eu.js
deleted file mode 100644
index 3bc9dbb..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/Abbreviation/lang/eu.js
+++ /dev/null
@@ -1,14 +0,0 @@
-// I18N constants
-// LANG: "eu", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Cancel": "Utzi",
-    "OK": "Ados"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/Abbreviation/lang/fa.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/Abbreviation/lang/fa.js
deleted file mode 100644
index 84e7f7e..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/Abbreviation/lang/fa.js
+++ /dev/null
@@ -1,14 +0,0 @@
-// I18N constants
-// LANG: "fa", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Cancel": "انصراف",
-    "OK": "بله"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/Abbreviation/lang/fi.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/Abbreviation/lang/fi.js
deleted file mode 100644
index 82552b9..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/Abbreviation/lang/fi.js
+++ /dev/null
@@ -1,14 +0,0 @@
-// I18N constants
-// LANG: "fi", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Cancel": "Peruuta",
-    "OK": "Hyväksy"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/Abbreviation/lang/fr.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/Abbreviation/lang/fr.js
deleted file mode 100644
index 49d582e..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/Abbreviation/lang/fr.js
+++ /dev/null
@@ -1,17 +0,0 @@
-// I18N constants
-// LANG: "fr", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Abbreviation": "Abréviation",
-    "Cancel": "Annuler",
-    "Delete": "Supprimer",
-    "Expansion:": "Explication",
-    "OK": "OK"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/Abbreviation/lang/he.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/Abbreviation/lang/he.js
deleted file mode 100644
index a602f7c..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/Abbreviation/lang/he.js
+++ /dev/null
@@ -1,14 +0,0 @@
-// I18N constants
-// LANG: "he", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Cancel": "ביטול",
-    "OK": "אישור"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/Abbreviation/lang/hu.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/Abbreviation/lang/hu.js
deleted file mode 100644
index b38528d..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/Abbreviation/lang/hu.js
+++ /dev/null
@@ -1,14 +0,0 @@
-// I18N constants
-// LANG: "hu", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Cancel": "Mégsem",
-    "OK": "Rendben"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/Abbreviation/lang/it.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/Abbreviation/lang/it.js
deleted file mode 100644
index a0acb45..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/Abbreviation/lang/it.js
+++ /dev/null
@@ -1,14 +0,0 @@
-// I18N constants
-// LANG: "it", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Cancel": "Annullamento",
-    "OK": "OK"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/Abbreviation/lang/ja.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/Abbreviation/lang/ja.js
deleted file mode 100644
index c1d5038..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/Abbreviation/lang/ja.js
+++ /dev/null
@@ -1,17 +0,0 @@
-// I18N constants
-// LANG: "ja", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Abbreviation": "略語",
-    "Cancel": "中止",
-    "Delete": "削除",
-    "Expansion:": "展開される語:",
-    "OK": "OK"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/Abbreviation/lang/lc_base.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/Abbreviation/lang/lc_base.js
deleted file mode 100644
index c4886b2..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/Abbreviation/lang/lc_base.js
+++ /dev/null
@@ -1,29 +0,0 @@
-// I18N constants
-//
-// LANG: "en", ENCODING: UTF-8
-// Author: Translator-Name, <email@example.com>
-//
-// Last revision: 2018-04-12
-// 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).
-//
-// (Please, remove information below)
-// 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.)
-
-{
-    "Abbreviation": "",
-    "Cancel": "",
-    "Delete": "",
-    "Expansion:": "",
-    "OK": ""
-}
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/Abbreviation/lang/lt.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/Abbreviation/lang/lt.js
deleted file mode 100644
index d118909..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/Abbreviation/lang/lt.js
+++ /dev/null
@@ -1,14 +0,0 @@
-// I18N constants
-// LANG: "lt", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Cancel": "Atšaukti",
-    "OK": "OK"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/Abbreviation/lang/lv.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/Abbreviation/lang/lv.js
deleted file mode 100644
index f83d5d3..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/Abbreviation/lang/lv.js
+++ /dev/null
@@ -1,14 +0,0 @@
-// I18N constants
-// LANG: "lv", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Cancel": "Atcelt",
-    "OK": "Labi"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/Abbreviation/lang/nb.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/Abbreviation/lang/nb.js
deleted file mode 100644
index eefe773..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/Abbreviation/lang/nb.js
+++ /dev/null
@@ -1,17 +0,0 @@
-// I18N constants
-// LANG: "nb", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Abbreviation": "Beskrive forkortelse",
-    "Cancel": "Avbryt",
-    "Delete": "Fjerne",
-    "Expansion:": "Betydning:",
-    "OK": "OK"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/Abbreviation/lang/nl.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/Abbreviation/lang/nl.js
deleted file mode 100644
index 9ae3c1d..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/Abbreviation/lang/nl.js
+++ /dev/null
@@ -1,17 +0,0 @@
-// I18N constants
-// LANG: "nl", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Abbreviation": "Afkorting",
-    "Cancel": "Annuleren",
-    "Delete": "Verwijderen",
-    "Expansion:": "Uitbreiding:",
-    "OK": "OK"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/Abbreviation/lang/pl.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/Abbreviation/lang/pl.js
deleted file mode 100644
index 5b43de2..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/Abbreviation/lang/pl.js
+++ /dev/null
@@ -1,15 +0,0 @@
-// I18N constants
-// LANG: "pl", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Cancel": "Anuluj",
-    "Delete": "Usuń",
-    "OK": "OK"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/Abbreviation/lang/pt_br.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/Abbreviation/lang/pt_br.js
deleted file mode 100644
index f182334..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/Abbreviation/lang/pt_br.js
+++ /dev/null
@@ -1,17 +0,0 @@
-// I18N constants
-// LANG: "pt_br", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Abbreviation": "Abreviação",
-    "Cancel": "Cancelar",
-    "Delete": "Apagar",
-    "Expansion:": "Expandir:",
-    "OK": "OK"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/Abbreviation/lang/ro.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/Abbreviation/lang/ro.js
deleted file mode 100644
index 9d6e1c3..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/Abbreviation/lang/ro.js
+++ /dev/null
@@ -1,14 +0,0 @@
-// I18N constants
-// LANG: "ro", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Cancel": "Renunţă",
-    "OK": "Acceptă"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/Abbreviation/lang/ru.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/Abbreviation/lang/ru.js
deleted file mode 100644
index fad59f2..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/Abbreviation/lang/ru.js
+++ /dev/null
@@ -1,14 +0,0 @@
-// I18N constants
-// LANG: "ru", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Cancel": "Отмена",
-    "OK": "OK"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/Abbreviation/lang/sh.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/Abbreviation/lang/sh.js
deleted file mode 100644
index 62e76f7..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/Abbreviation/lang/sh.js
+++ /dev/null
@@ -1,14 +0,0 @@
-// I18N constants
-// LANG: "sh", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Cancel": "Poništi",
-    "OK": "OK"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/Abbreviation/lang/si.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/Abbreviation/lang/si.js
deleted file mode 100644
index 7674892..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/Abbreviation/lang/si.js
+++ /dev/null
@@ -1,14 +0,0 @@
-// I18N constants
-// LANG: "si", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Cancel": "Prekliči",
-    "OK": "V redu"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/Abbreviation/lang/sr.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/Abbreviation/lang/sr.js
deleted file mode 100644
index b7ee6f5..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/Abbreviation/lang/sr.js
+++ /dev/null
@@ -1,14 +0,0 @@
-// I18N constants
-// LANG: "sr", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Cancel": "Поништи",
-    "OK": "OK"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/Abbreviation/lang/sv.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/Abbreviation/lang/sv.js
deleted file mode 100644
index 98336d8..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/Abbreviation/lang/sv.js
+++ /dev/null
@@ -1,14 +0,0 @@
-// I18N constants
-// LANG: "sv", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Cancel": "Avbryt",
-    "OK": "OK"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/Abbreviation/lang/th.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/Abbreviation/lang/th.js
deleted file mode 100644
index 9da9c8d..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/Abbreviation/lang/th.js
+++ /dev/null
@@ -1,14 +0,0 @@
-// I18N constants
-// LANG: "th", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Cancel": "ยกเลิก",
-    "OK": "ตกลง"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/Abbreviation/lang/tr.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/Abbreviation/lang/tr.js
deleted file mode 100644
index 0e2a1fd..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/Abbreviation/lang/tr.js
+++ /dev/null
@@ -1,17 +0,0 @@
-// I18N constants
-// LANG: "tr", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Abbreviation": "Kısaltma",
-    "Cancel": "İptal",
-    "Delete": "Sil",
-    "Expansion:": "Açılım:",
-    "OK": "Tamam"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/Abbreviation/lang/vn.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/Abbreviation/lang/vn.js
deleted file mode 100644
index 2d82e02..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/Abbreviation/lang/vn.js
+++ /dev/null
@@ -1,14 +0,0 @@
-// I18N constants
-// LANG: "vn", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Cancel": "Hủy",
-    "OK": "Đồng ý"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/CSSDropDowns/CSSDropDowns.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/CSSDropDowns/CSSDropDowns.js
deleted file mode 100644
index 9884995..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/CSSDropDowns/CSSDropDowns.js
+++ /dev/null
@@ -1,149 +0,0 @@
-// Simple CSS (className) plugin for the editor
-// Sponsored by http://www.miro.com.au
-// Implementation by Mihai Bazon, http://dynarch.com/mishoo.
-//
-// (c) dynarch.com 2003
-// Distributed under the same terms as HTMLArea itself.
-// This notice MUST stay intact for use (see license.txt).
-//
-// $Id: CSSDropDowns.js 1337 2018-02-03 08:30:25Z gogo $
-// @TODO This is the default and won't be very useful to others.
-// We should make this better.
-Xinha.Config.prototype.cssPluginConfig =
-  {
-    combos : [
-      { label: "Syntax",
-                   // menu text       // CSS class
-        options: { "None"           : "",
-                   "Code" : "code",
-                   "String" : "string",
-                   "Comment" : "comment",
-                   "Variable name" : "variable-name",
-                   "Type" : "type",
-                   "Reference" : "reference",
-                   "Preprocessor" : "preprocessor",
-                   "Keyword" : "keyword",
-                   "Function name" : "function-name",
-                   "Html tag" : "html-tag",
-                   "Html italic" : "html-helper-italic",
-                   "Warning" : "warning",
-                   "Html bold" : "html-helper-bold"
-                 },
-        context: "pre"
-      },
-      { label: "Info",
-        options: { "None"           : "",
-                   "Quote"          : "quote",
-                   "Highlight"      : "highlight",
-                   "Deprecated"     : "deprecated"
-                 }
-      }
-    ]
-  };
-
-function CSSDropDowns(editor, params) {
-	this.editor = editor;
-	var cfg = editor.config;
-	var self = this;
-	var plugin_config;
-  if(params && params.length)
-  {
-    plugin_config = params[0];
-  }
-  else
-  {
-    plugin_config = editor.config.cssPluginConfig;
-  }
-
-  var combos = plugin_config.combos;
-
-	for (var i = 0; i < combos.length; i++) {
-		var combo = combos[i];
-		var id = "CSS-class" + i;
-		var css_class = {
-			id         : id,
-			options    : combo.options,
-			action     : function(editor) { self.onSelect(editor, this, combo.context, combo.updatecontextclass); },
-			refresh    : function(editor) { self.updateValue(editor, this); },
-			context    : combo.context
-		};
-		cfg.registerDropdown(css_class);
-    cfg.addToolbarElement(["T[" + combo.label + "]", id, "separator"] , "formatblock", -1);
- 	}
-}
-
-CSSDropDowns._pluginInfo = {
-	name          : "CSS",
-	version       : "1.0",
-	developer     : "Mihai Bazon",
-	developer_url : "http://dynarch.com/mishoo/",
-	c_owner       : "Mihai Bazon",
-	sponsor       : "Miro International",
-	sponsor_url   : "http://www.miro.com.au",
-	license       : "htmlArea"
-};
-
-CSSDropDowns.prototype.onSelect = function(editor, obj, context, updatecontextclass) {
-	var tbobj = editor._toolbarObjects[obj.id];
-	var index = tbobj.element.selectedIndex;
-	var className = tbobj.element.value;
-
-	// retrieve parent element of the selection
-	var parent = editor.getParentElement();
-	var surround = true;
-
-	var is_span = (parent && parent.tagName.toLowerCase() == "span");
-	var update_parent = (context && updatecontextclass && parent && parent.tagName.toLowerCase() == context);
-
-	if (update_parent) {
-		parent.className = className;
-		editor.updateToolbar();
-		return;
-	}
-
-	if (is_span && index == 0 && !/\S/.test(parent.style.cssText)) {
-		while (parent.firstChild) {
-			parent.parentNode.insertBefore(parent.firstChild, parent);
-		}
-		parent.parentNode.removeChild(parent);
-		editor.updateToolbar();
-		return;
-	}
-
-	if (is_span) {
-		// maybe we could simply change the class of the parent node?
-		if (parent.childNodes.length == 1) {
-			parent.className = className;
-			surround = false;
-			// in this case we should handle the toolbar updation
-			// ourselves.
-			editor.updateToolbar();
-		}
-	}
-
-	// Other possibilities could be checked but require a lot of code.  We
-	// can't afford to do that now.
-	if (surround) {
-		// shit happens ;-) most of the time.  this method works, but
-		// it's dangerous when selection spans multiple block-level
-		// elements.
-		editor.surroundHTML("<span class='" + className + "'>", "</span>");
-	}
-};
-
-CSSDropDowns.prototype.updateValue = function(editor, obj) {
-	var select = editor._toolbarObjects[obj.id].element;
-	var parent = editor.getParentElement();
-	if (typeof parent.className != "undefined" && /\S/.test(parent.className)) {
-		var options = select.options;
-		var value = parent.className;
-		for (var i = options.length; --i >= 0;) {
-			var option = options[i];
-			if (value == option.value) {
-				select.selectedIndex = i;
-				return;
-			}
-		}
-	}
-	select.selectedIndex = 0;
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/CSSPicker/CSSPicker.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/CSSPicker/CSSPicker.js
deleted file mode 100644
index 1eb1ccd..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/CSSPicker/CSSPicker.js
+++ /dev/null
@@ -1,168 +0,0 @@
-/** CSS Picker Plugin by Justin Rovang
- *
- * For full documentation, please see 
- *  http://bitbucket.org/rovangju/xinha_csspicker/wiki/Home
- *
- * SAMPLE CONFIG:
- *
- * You can configure the appearance of the item/style list using the following CSS classes:
- *	.CSSPickerOption (Normal state)
- *	.CSSPickerOptionOver (Mouse-over state, typically border change)
- *	.CSSPickerOptionActive (Indicator for active classes under the selection/carat)
- *	
- * Keys are CSS Class names
- *	wrapper: tag to wrap selected text with
- *	name: friendly name to display in panel with that class style applied to it.
- *
- * Sample config: 
- * CSSPicker.cssList = {
- *		'xinhaDashedBox'	: { 'wrapper':'div',	'name':'Breakout box' }
- *		'xinhaMiniHeadline' : { 'wrapper':'div',	'name':'Sub-headline' }
- * }
- *
- */
-
-function CSSPicker(editor, args) {
-	this.editor = editor;
-	var CSSPicker = this;
-}
-
-CSSPicker._pluginInfo = {
-	name	: "CSSPicker",	
-	version : "2008-12-01",
-	author	: "Justin Rovang"
-}
-
-CSSPicker.prototype.onGenerateOnce = function() {
-	var editor = this.editor;
-	var CSSPicker = this;
-	editor._cssPicker = editor.addPanel("right");
-	
-	this.main = document.createElement("div");
-	editor._cssPicker.style.backgroundColor='#dee5f8';
-	editor._cssPicker.appendChild(this.main);
-	
-	Xinha.freeLater(this,"main");
-	editor.showPanel(editor._cssPicker);
-}
-
-
-CSSPicker.prototype.onUpdateToolbar = function() {
-	if(this.editor._cssPicker) {
-		if(this._timeoutID) window.clearTimeout(this._timeoutID);
-		var e = this.editor;
-		this._timeoutID = window.setTimeout(function() { e._gen(); }, 250); //1000 = 1sec / 500=.5sec / 250=.25sec
-	}
-}
-
-Xinha.prototype.listStyles = function(s) {
-	var editor = this;
-	var mySel = this.getSelection();
-	var myRange;
-	if(Xinha.is_ie) {
-		myRange = this.saveSelection();//mySel;
-		mySel = this.createRange(mySel).text;
-	}
-	
-	var d = document.createElement("div");
-	
-	d.className='CSSPickerOption';
-	
-	/* If our carat is within an active class, highlight it */
-	var toggleState = editor.getStyleInfo(s);
-	if(toggleState) Xinha._addClass(d, 'CSSPickerOptionActive');
-	
-	d.align='center';
-              // v-- Avoid lc_parse_strings.php
-	d.innerHTML='<'+'div class="'+s+'">'+CSSPicker.cssList[s].name+'</div>';
-	d.onclick = function() {
-		editor.wrapStyle(s, mySel, myRange, CSSPicker.cssList[s].wrapper);
-		return false;
-	};
-	
-	Xinha._addEvent(d, 'mouseover', function(ev) {
-		Xinha._addClass(d, 'CSSPickerOptionOver');
-	});
-	
-	Xinha._addEvent(d, 'mouseout', function(ev) {
-		Xinha._removeClass(d, 'CSSPickerOptionOver');
-	});
-	
-	return d;
-}
-
-Xinha.prototype._gen = function() {
-	this.plugins.CSSPicker.instance.main.innerHTML='';
-	for(var s in CSSPicker.cssList) {
-		this.plugins.CSSPicker.instance.main.appendChild(this.listStyles(s));
-	}
-	return true;
-}
-
-/*
-	(string) s: style name
-	(string) sel: selection text
-	(object) myRange: selection object
-	(string) sWrapper: wrapper tag (e.g.: div, span)
-*/
-Xinha.prototype.wrapStyle = function(s, sel, myRange, sWrapper) {
-	if(!sWrapper) sWrapper="div";
-	sWrapper=sWrapper.toLowerCase();
-	
-	/* The reason for these next lines is that we want the user to be able to place
-	 * their cursor below the new div element. Otherwise they can't which makes
-	 * placing anything after a div wrapper difficult/almost impossible. */
-	var divBreak='';
-	if(sWrapper=="div") divBreak='<br/>';
-	
-	var editor=this;
-	this.focusEditor();
-	if(Xinha.is_ie) this.restoreSelection(myRange);
-
-	/* 
-	 * First - Get parent elements and see if the style is already applied.
-	 */
-	var toggleState = editor.getStyleInfo(s);
-	if(!toggleState) {
-		/* Create a new wrapper when:
-		 * 1. Selected text has no 'snug' wrapper around it already.
-		 * 2. If it does have a 'snug' wrapper, only append to the className if it's of the same type (span or div) 
-		 */
-		if(sel == '') sel = '&nbsp;'; //We insert this if the selection is empty, making it easier for carat placement via click
-		
-		this.insertHTML("<"+sWrapper+" class='"+s+"'>"+sel+"</"+sWrapper+">"+divBreak);
-		/* Modify the 'snug' wrapper if the above conditions are not met for a new element: */		
-	}
-	else {
-		/* 1. If the current ancestor has -just- this classname. It should be removed. 
-		 * 2. If it has more than one class, it should be removed from the list of the parents
-		 */
-		Xinha._removeClass(toggleState, s);
-	}
-	
-	return true;
-}
-
-Xinha.prototype.getStyleInfo = function(sClassToProbe) {
-	var editor = this;
-	var aList = this.getAllAncestors();
-	var a,s;
-	
-	if(aList) aList.pop(); //We don't want the body element to show up in this list.
-	if(aList.length > 0) {
-		for(var o in aList){
-			a = aList[o];
-			/* Instead of break down and rebuild the array for this search, we're going
-			 * to do some string trickery...
-			 *  // NOTE: THIS MAY BE PRONE TO PARTIAL MATCHES. SOLUTION IS TO ADD A SPACE PREPEND 
-			 */
-			if(a.className) {
-				s = a.className.trim()+' ';
-				if(s.toLowerCase().match(sClassToProbe.toLowerCase()+' ')) {
-					return a;
-				}
-			}
-		}
-	}
-	return false;
-}
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/CharCounter/CharCounter.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/CharCounter/CharCounter.js
deleted file mode 100644
index d85c9b8..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/CharCounter/CharCounter.js
+++ /dev/null
@@ -1,101 +0,0 @@
-// Charcounter for Xinha

-// (c) Udo Schmal & L.N.Schaffrath NeueMedien

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

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

-

-function CharCounter(editor) {

-  this.editor = editor;

-  this._Chars = 0;

-  this._Words = 0;

-  this._HTML = 0;

-  this.onKeyPress = this.__onKeyPress;

-}

-

-Xinha.Config.prototype.CharCounter =

-{

-  'showChar': true, // show the characters count,

-  'showWord': true, // show the words count,

-  'showHtml': true, // show the exact html count

-  'separator': ' | ', // separator used to join informations

-  'maxHTML' : -1 // -1 for unlimited length, other number for limiting the length of the edited HTML

-};

-

-CharCounter._pluginInfo = {

-  name          : "CharCounter",

-  version       : "1.31",

-  developer     : "Udo Schmal",

-  developer_url : "http://www.schaffrath-neuemedien.de",

-  sponsor       : "L.N.Schaffrath NeueMedien",

-  sponsor_url   : "http://www.schaffrath-neuemedien.de",

-  c_owner       : "Udo Schmal & L.N.Schaffrath NeueMedien",

-  license       : "htmlArea"

-};

-

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

-  return Xinha._lc(string, "CharCounter");

-};

-

-

-CharCounter.prototype.onGenerateOnce = function() {

-  var self = this;

-  if (this.charCount==null) {

-      var charCount = self.editor.registerStatusWidget('CharCounter', ['wysiwyg']);

-      this.charCount = charCount;

-  }

-};

-

-CharCounter.prototype.__onKeyPress= function(ev) {

-  if ((ev.keyCode != 8) && (ev.keyCode !=46)) { // not backspace & delete

-    if (this.editor.config.CharCounter.maxHTML!=-1) {

-      var contents = this.editor.getHTML();

-      if (contents.length >= this.editor.config.CharCounter.maxHTML) {

-        Xinha._stopEvent(ev);

-        return true;

-      }

-    }

-  }

-}

-

-CharCounter.prototype._updateCharCount= function() {

-  var editor = this.editor;

-  var cfg = editor.config;

-  var contents = editor.getHTML();

-  var string = new Array();

-  if (cfg.CharCounter.showHtml) {

-    string[string.length] = this._lc("HTML") + ": " + contents.length;

-  }

-  this._HTML = contents.length;

-  if (cfg.CharCounter.showWord || cfg.CharCounter.showChar) {

-    contents = contents.replace(/<\/?\s*!--[^-->]*-->/gi, "" );

-    contents = contents.replace(/<(.+?)>/g, '');//Don't count HTML tags

-    contents = contents.replace(/&nbsp;/gi, ' ');

-    contents = contents.replace(/([\n\r\t])/g, ' ');//convert newlines and tabs into space

-    contents = contents.replace(/(  +)/g, ' ');//count spaces only once

-    contents = contents.replace(/&(.*);/g, ' ');//Count htmlentities as one keystroke

-    contents = contents.replace(/^\s*|\s*$/g, '');//trim

-  }

-  if (cfg.CharCounter.showWord) {

-    this._Words = 0;

-    for (var x=0;x<contents.length;x++)

-    {

-      if (contents.charAt(x) == " " ) {this._Words++;}

-    }

-    if (this._Words >=1) { this._Words++; }

-    string[string.length] = this._lc("Words") + ": " + this._Words ;

-  }

-  if (cfg.CharCounter.showChar) {

-    string[string.length] = this._lc("Chars") + ": " + contents.length;

-    this._Chars = contents.length;

-  }

-  this.charCount.innerHTML = string.join(cfg.CharCounter.separator);

-};

-

-CharCounter.prototype.onUpdateToolbar = function() {

-  this.charCount.innerHTML = this._lc("... in progress");

-  if(this._timeoutID) {

-    window.clearTimeout(this._timeoutID);

-  }

-  var e = this;

-  this._timeoutID = window.setTimeout(function() {e._updateCharCount();}, 1000);

-};

-

diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/CharCounter/lang/de.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/CharCounter/lang/de.js
deleted file mode 100644
index 7777fd0..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/CharCounter/lang/de.js
+++ /dev/null
@@ -1,16 +0,0 @@
-// I18N constants
-// LANG: "de", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "... in progress": "... in Bearbeitung",
-    "Chars": "Zeichen",
-    "HTML": "HTML",
-    "Words": "Worte"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/CharCounter/lang/fr.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/CharCounter/lang/fr.js
deleted file mode 100644
index eae898c..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/CharCounter/lang/fr.js
+++ /dev/null
@@ -1,14 +0,0 @@
-// I18N constants
-// LANG: "fr", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Chars": "Caractères",
-    "Words": "Mots"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/CharCounter/lang/ja.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/CharCounter/lang/ja.js
deleted file mode 100644
index e885f4b..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/CharCounter/lang/ja.js
+++ /dev/null
@@ -1,15 +0,0 @@
-// I18N constants
-// LANG: "ja", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "... in progress": "... 処理中",
-    "Chars": "文字数",
-    "Words": "単語数"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/CharCounter/lang/lc_base.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/CharCounter/lang/lc_base.js
deleted file mode 100644
index d32b270..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/CharCounter/lang/lc_base.js
+++ /dev/null
@@ -1,28 +0,0 @@
-// I18N constants
-//
-// LANG: "en", ENCODING: UTF-8
-// Author: Translator-Name, <email@example.com>
-//
-// Last revision: 2018-04-12
-// 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).
-//
-// (Please, remove information below)
-// 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.)
-
-{
-    "... in progress": "",
-    "Chars": "",
-    "HTML": "",
-    "Words": ""
-}
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/CharCounter/lang/nb.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/CharCounter/lang/nb.js
deleted file mode 100644
index f559b0a..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/CharCounter/lang/nb.js
+++ /dev/null
@@ -1,13 +0,0 @@
-// I18N constants
-// LANG: "nb", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Chars": "Tegn"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/CharCounter/lang/nl.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/CharCounter/lang/nl.js
deleted file mode 100644
index 11cb40d..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/CharCounter/lang/nl.js
+++ /dev/null
@@ -1,15 +0,0 @@
-// I18N constants
-// LANG: "nl", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "... in progress": "... wordt verwerkt",
-    "Chars": "Tekens",
-    "Words": "Woorden"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/CharCounter/lang/pt_br.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/CharCounter/lang/pt_br.js
deleted file mode 100644
index 1ef4809..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/CharCounter/lang/pt_br.js
+++ /dev/null
@@ -1,16 +0,0 @@
-// I18N constants
-// LANG: "pt_br", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "... in progress": "... em processo",
-    "Chars": "Caracteres",
-    "HTML": "HTML",
-    "Words": "Palavras"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/CharacterMap/CharacterMap.css b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/CharacterMap/CharacterMap.css
deleted file mode 100644
index c7108de..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/CharacterMap/CharacterMap.css
+++ /dev/null
@@ -1,43 +0,0 @@
-.CharacterMap { 

-background-color:white;

-}

-.CharacterMap a.entity {

-  font-size:12px;

-  width:18px;

-  display:block;

-  float:left;

-  padding:2px;

-  text-decoration:none;

-  color:#000;

-  text-align:center;

-  

-}

-.CharacterMap a.light {

-  background-color:#ffffff;

-}

-.CharacterMap a.dark {

-  background-color:#f7f8fd;

-}

-.CharacterMap a.entity:hover {

-  background-color:#ffd760;

-  color:#000;

-}

-.popup td.character {

-  font-family:Verdana,Arial,Helvetica,sans-serif;

-  font-size:14px;

-  font-weight:bold;

-  text-align:center;

-  background:#fff;

-  padding:4px;

-}

-.popup td.character-hilite {

-  background:#ffd760;

-}

-.popup form {

-  text-align:center;

-}

-.popup table {

-  cursor:pointer;

-  background-color:#ADAD9C;

-  border:1px inset;

-}

diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/CharacterMap/CharacterMap.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/CharacterMap/CharacterMap.js
deleted file mode 100644
index ef15014..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/CharacterMap/CharacterMap.js
+++ /dev/null
@@ -1,124 +0,0 @@
-// Character Map plugin for Xinha
-// Original Author - Bernhard Pfeifer novocaine@gmx.net
-Xinha.loadStyle( 'CharacterMap.css', 'CharacterMap' );
-
-function CharacterMap( editor )
-{
-  this.editor = editor;
-  var cfg = editor.config;
-  var self = this;
-  cfg.registerButton(
-    {
-      id       : 'insertcharacter',
-      tooltip  : Xinha._lc( 'Insert special character', 'CharacterMap' ),
-      image    : editor.imgURL('images/tango/16x16/apps/accessories-character-map.png'),
-      textMode : false,
-      action   : function() { self.show(); }
-    }
-  );
-  cfg.addToolbarElement('insertcharacter', 'createlink', -1);
-
-}
-
-// configuration mode : panel or popup
-Xinha.Config.prototype.CharacterMap =
-{
-  'mode': 'popup' // configuration mode : panel or popup
-};
-
-CharacterMap._pluginInfo =
-{
-  name          : "CharacterMap",
-  version       : "2.0",
-  developer     : "Laurent Vilday",
-  developer_url : "http://www.mokhet.com/",
-  c_owner       : "Xinha community",
-  sponsor       : "",
-  sponsor_url   : "",
-  license       : "HTMLArea"
-};
-
-CharacterMap._isActive = false;
-
-
-CharacterMap.prototype.addEntity = function ( entite, pos )
-{
-  var editor = this.editor;
-  var self = this;
-  var a = document.createElement( 'a' );
-  Xinha._addClass( a, 'entity' );
-  a.innerHTML = entite;
-  a.href = 'javascript:void(0)';
-  Xinha._addClass(a, (pos%2)? 'light':'dark');
-  a.onclick = function()
-  {
-    if (Xinha.is_ie) editor.focusEditor();
-    editor.insertHTML( entite );
-    //self._isActive = false;
-    //editor.hidePanel( editor._CharacterMap );
-    return false;
-  };
-  this.dialog.main.appendChild( a );
-  a = null;
-};
-
-CharacterMap.prototype.onGenerateOnce = function()
-{
-	this._prepareDialog();
-};
-
-CharacterMap.prototype._prepareDialog = function()
-{
-	var self = this;
-	var editor = this.editor;
-
-	var html = '<h1><l10n>Insert special character</l10n></h1>';
-
-	// Now we have everything we need, so we can build the dialog.
-	this.dialog = new Xinha.Dialog(editor, html, 'CharacterMap',{width:300},{modal:false});
-	Xinha._addClass( this.dialog.rootElem, 'CharacterMap' );
-
-	if (editor.config.CharacterMap && editor.config.CharacterMap.mode == 'panel') this.dialog.attachToPanel('right');
-	
-	var entites =
-	[
-	'&Yuml;', '&scaron;', '&#064;', '&quot;', '&iexcl;', '&cent;', '&pound;', '&curren;', '&yen;', '&brvbar;',
-	'&sect;', '&uml;', '&copy;', '&ordf;', '&laquo;', '&not;', '&macr;', '&deg;', '&plusmn;', '&sup2;',
-	'&sup3;', '&acute;', '&micro;', '&para;', '&middot;', '&cedil;', '&sup1;', '&ordm;', '&raquo;', '&frac14;',
-	'&frac12;', '&frac34;', '&iquest;', '&times;', '&Oslash;', '&divide;', '&oslash;', '&fnof;', '&circ;',
-	'&tilde;', '&ndash;', '&mdash;', '&lsquo;', '&rsquo;', '&sbquo;', '&ldquo;', '&rdquo;', '&bdquo;',
-	'&dagger;', '&Dagger;', '&bull;', '&hellip;', '&permil;', '&lsaquo;', '&rsaquo;', '&euro;', '&trade;',
-	'&Agrave;', '&Aacute;', '&Acirc;', '&Atilde;', '&Auml;', '&Aring;', '&AElig;', '&Ccedil;', '&Egrave;',
-	'&Eacute;', '&Ecirc;', '&Euml;', '&Igrave;', '&Iacute;', '&Icirc;', '&Iuml;', '&ETH;', '&Ntilde;',
-	'&Ograve;', '&Oacute;', '&Ocirc;', '&Otilde;', '&Ouml;', '&reg;', '&times;', '&Ugrave;', '&Uacute;',
-	'&Ucirc;', '&Uuml;', '&Yacute;', '&THORN;', '&szlig;', '&agrave;', '&aacute;', '&acirc;', '&atilde;',
-	'&auml;', '&aring;', '&aelig;', '&ccedil;', '&egrave;', '&eacute;', '&ecirc;', '&euml;', '&igrave;',
-	'&iacute;', '&icirc;', '&iuml;', '&eth;', '&ntilde;', '&ograve;', '&oacute;', '&ocirc;', '&otilde;',
-	'&ouml;', '&divide;', '&oslash;', '&ugrave;', '&uacute;', '&ucirc;', '&uuml;', '&yacute;', '&thorn;',
-	'&yuml;', '&OElig;', '&oelig;', '&Scaron;'
-	];
-
-	for ( var i=0; i<entites.length; i++ )
-	{
-	  this.addEntity( entites[i], i );
-	}
-	
-	this.ready = true;
-	//this.hide();
-};
-
-CharacterMap.prototype.show = function()
-{
-  if(!this.ready) // if the user is too fast clicking the, we have to make them wait
-	{
-		var self = this;
-		window.setTimeout(function() {self.show();},100);
-		return;
-	}
-	this.dialog.toggle();
-};
-CharacterMap.prototype.hide = function()
-{
-	this.dialog.hide();
-};
-
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/CharacterMap/img/ed_charmap.gif b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/CharacterMap/img/ed_charmap.gif
deleted file mode 100644
index dc6d706..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/CharacterMap/img/ed_charmap.gif
+++ /dev/null
Binary files differ
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/CharacterMap/lang/de.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/CharacterMap/lang/de.js
deleted file mode 100644
index ae73b44..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/CharacterMap/lang/de.js
+++ /dev/null
@@ -1,16 +0,0 @@
-// I18N constants
-// LANG: "de", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Insert special character": "Sonderzeichen einfügen",
-    "__OBSOLETE__": {
-        "Cancel": "Abbrechen"
-    }
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/CharacterMap/lang/es.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/CharacterMap/lang/es.js
deleted file mode 100644
index fa5c3e0..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/CharacterMap/lang/es.js
+++ /dev/null
@@ -1,7 +0,0 @@
-// I18N constants

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

-// translated: Derick Leony <dleony@gmail.com>

-{

-  "Edit HTML for selected text": "Editar código HTML del texto seleccionado",

-  "Tag Editor": "Editor de Etiquetas"

-};

diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/CharacterMap/lang/fr.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/CharacterMap/lang/fr.js
deleted file mode 100644
index 99317ff..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/CharacterMap/lang/fr.js
+++ /dev/null
@@ -1,16 +0,0 @@
-// I18N constants
-// LANG: "fr", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Insert special character": "Insérer un caractère spécial",
-    "__OBSOLETE__": {
-        "Cancel": "Annuler"
-    }
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/CharacterMap/lang/it.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/CharacterMap/lang/it.js
deleted file mode 100644
index 7a217fc..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/CharacterMap/lang/it.js
+++ /dev/null
@@ -1,16 +0,0 @@
-// I18N constants
-// LANG: "it", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Insert special character": "Inserisca il carattere speciale",
-    "__OBSOLETE__": {
-        "Cancel": "Annullamento"
-    }
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/CharacterMap/lang/ja.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/CharacterMap/lang/ja.js
deleted file mode 100644
index 87c5434..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/CharacterMap/lang/ja.js
+++ /dev/null
@@ -1,16 +0,0 @@
-// I18N constants
-// LANG: "ja", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Insert special character": "特殊文字を挿入",
-    "__OBSOLETE__": {
-        "Cancel": "中止"
-    }
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/CharacterMap/lang/lc_base.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/CharacterMap/lang/lc_base.js
deleted file mode 100644
index 099571f..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/CharacterMap/lang/lc_base.js
+++ /dev/null
@@ -1,25 +0,0 @@
-// I18N constants
-//
-// LANG: "en", ENCODING: UTF-8
-// Author: Translator-Name, <email@example.com>
-//
-// Last revision: 2018-04-12
-// 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).
-//
-// (Please, remove information below)
-// 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.)
-
-{
-    "Insert special character": ""
-}
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/CharacterMap/lang/nb.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/CharacterMap/lang/nb.js
deleted file mode 100644
index 732dff7..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/CharacterMap/lang/nb.js
+++ /dev/null
@@ -1,16 +0,0 @@
-// I18N constants
-// LANG: "nb", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Insert special character": "Sett inn tegn",
-    "__OBSOLETE__": {
-        "Cancel": "Avbryt"
-    }
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/CharacterMap/lang/nl.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/CharacterMap/lang/nl.js
deleted file mode 100644
index 3f4cc4d..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/CharacterMap/lang/nl.js
+++ /dev/null
@@ -1,16 +0,0 @@
-// I18N constants
-// LANG: "nl", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Insert special character": "Speciaal character invoegen",
-    "__OBSOLETE__": {
-        "Cancel": "Annuleer"
-    }
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/CharacterMap/lang/pt_br.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/CharacterMap/lang/pt_br.js
deleted file mode 100644
index a2e3444..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/CharacterMap/lang/pt_br.js
+++ /dev/null
@@ -1,16 +0,0 @@
-// I18N constants
-// LANG: "pt_br", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Insert special character": "Inserir caracter especial",
-    "__OBSOLETE__": {
-        "Cancel": "Cancelar"
-    }
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/CharacterMap/lang/ru.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/CharacterMap/lang/ru.js
deleted file mode 100644
index 6c6427a..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/CharacterMap/lang/ru.js
+++ /dev/null
@@ -1,16 +0,0 @@
-// I18N constants
-// LANG: "ru", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Insert special character": "Вставить специальный символ",
-    "__OBSOLETE__": {
-        "Cancel": "Отменить"
-    }
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/CharacterMap/lang/sv.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/CharacterMap/lang/sv.js
deleted file mode 100755
index 6b6cc3e..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/CharacterMap/lang/sv.js
+++ /dev/null
@@ -1,16 +0,0 @@
-// I18N constants
-// LANG: "sv", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Insert special character": "Infoga tecken",
-    "__OBSOLETE__": {
-        "Cancel": "Avbryt"
-    }
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/CharacterMap/lang/tr.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/CharacterMap/lang/tr.js
deleted file mode 100644
index 76d519d..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/CharacterMap/lang/tr.js
+++ /dev/null
@@ -1,16 +0,0 @@
-// I18N constants
-// LANG: "tr", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Insert special character": "Özel karakter ekle",
-    "__OBSOLETE__": {
-        "Cancel": "İptal"
-    }
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/ContextMenu/ContextMenu.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/ContextMenu/ContextMenu.js
deleted file mode 100644
index 1cf5d29..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/ContextMenu/ContextMenu.js
+++ /dev/null
@@ -1,553 +0,0 @@
-// Context Menu Plugin for HTMLArea-3.0
-// Sponsored by www.americanbible.org
-// Implementation by Mihai Bazon, http://dynarch.com/mishoo/
-//
-// (c) dynarch.com 2003.
-// Distributed under the same terms as HTMLArea itself.
-// This notice MUST stay intact for use (see license.txt).
-//
-// $Id: ContextMenu.js 1402 2018-02-19 07:35:49Z gogo $
-
-Xinha.loadStyle("menu.css", "ContextMenu");
-
-function ContextMenu(editor) {
-	this.editor = editor;
-}
-
-ContextMenu._pluginInfo = {
-	name          : "ContextMenu",
-	version       : "1.0",
-	developer     : "Mihai Bazon",
-	developer_url : "http://dynarch.com/mishoo/",
-	c_owner       : "dynarch.com",
-	sponsor       : "American Bible Society",
-	sponsor_url   : "http://www.americanbible.org",
-	license       : "htmlArea"
-};
-
-Xinha.Config.prototype.ContextMenu = {
-	disableMozillaSpellCheck : false,
-  customHooks : { } // 'a': [ ['Label', function() { alert('Action'); }, 'Tooltip', '/icon.jpg' ] ]
-}
-
-ContextMenu.prototype.onGenerate = function() {
-	var self = this;
-	var doc = this.editordoc = this.editor._iframe.contentWindow.document;
-	Xinha._addEvents(doc, ["contextmenu"],
-			    function (event) {
-				    return self.popupMenu(Xinha.is_ie ? self.editor._iframe.contentWindow.event : event);
-			    });
-	this.currentMenu = null;
-	
-	if (this.editor.config.ContextMenu.disableMozillaSpellCheck) {
-		this.editordoc.body.spellcheck = false; // Firefox spellchecking is quite confusing for the user when they don't get the browser context menu
-	}
-};
-
-ContextMenu.prototype.getContextMenu = function(target) {
-	var self = this;
-	var editor = this.editor;
-	var config = editor.config;
-	var menu = [];
-	var tbo = this.editor.plugins.TableOperations;
-	if (tbo) tbo = tbo.instance;
-	var selection = editor.hasSelectedText();
-	if (!Xinha.is_gecko) {
-		if (selection) {
-			menu.push([ Xinha._lc("Cut", "ContextMenu"), function() { editor.execCommand("cut"); }, null, config.btnList["cut"][1] ],
-				  [ Xinha._lc("Copy", "ContextMenu"), function() { editor.execCommand("copy"); }, null, config.btnList["copy"][1] ]);
-			menu.push([ Xinha._lc("Paste", "ContextMenu"), function() { editor.execCommand("paste"); }, null, config.btnList["paste"][1] ]);
-		}
-	}
-	var currentTarget = target;
-	var elmenus = [];
-
-	var link = null;
-	var table = null;
-	var tr = null;
-	var td = null;
-	var img = null;
-
-	function tableOperation(opcode) {
-		tbo.buttonPress(editor, opcode);
-	}
-
-	function insertPara(after) {
-		var el = currentTarget;
-		var par = el.parentNode;
-		var p = editor._doc.createElement("p");
-		p.appendChild(editor._doc.createElement("br"));
-		par.insertBefore(p, after ? el.nextSibling : el);
-		var sel = editor._getSelection();
-		var range = editor._createRange(sel);
-		if (!Xinha.is_ie) {
-			sel.removeAllRanges();
-			range.selectNodeContents(p);
-			range.collapse(true);
-			sel.addRange(range);
-		} else {
-			range.moveToElementText(p);
-			range.collapse(true);
-			range.select();
-		}
-	}
-
-	for (; target; target = target.parentNode) {
-		var tag = target.tagName;
-		if (!tag)
-			continue;
-		tag = tag.toLowerCase();
-		switch (tag) {
-		    case "img":
-			img = target;
-			elmenus.push(null,
-				     [ Xinha._lc("_Image Properties...", "ContextMenu"),
-				       function() {
-					       editor._insertImage(img);
-				       },
-				       Xinha._lc("Show the image properties dialog", "ContextMenu"),
-				       config.btnList["insertimage"][1] ]
-				);
-			break;
-		    case "a":
-			link = target;
-			elmenus.push(null,
-				     [ Xinha._lc("_Modify Link...", "ContextMenu"),
-               function() { editor.config.btnList['createlink'][3](editor); },
-				       Xinha._lc("Current URL is", "ContextMenu") + ': ' + link.href,
-				       config.btnList["createlink"][1] ],
-
-				     [ Xinha._lc("Chec_k Link...", "ContextMenu"),
-				       function() { window.open(link.href); },
-				       Xinha._lc("Opens this link in a new window", "ContextMenu") ],
-
-				     [ Xinha._lc("_Remove Link...", "ContextMenu"),
-				       function() {
-					       if (confirm(Xinha._lc("Please confirm that you want to unlink this element.", "ContextMenu") + "\n" +
-							   Xinha._lc("Link points to:", "ContextMenu") + " " + link.href)) {
-						       while (link.firstChild)
-							       link.parentNode.insertBefore(link.firstChild, link);
-						       link.parentNode.removeChild(link);
-					       }
-				       },
-				       Xinha._lc("Unlink the current element", "ContextMenu") ]
-				);
-			break;
-        case "th":
-		    case "td":
-			td = target;
-			if (!tbo) break;
-			elmenus.push(null);
-      if(typeof config.btnList["TO-cell-prop"] != 'undefined')
-      {
-				     elmenus.push([ Xinha._lc("C_ell Properties...", "ContextMenu"),
-				       function() { tableOperation("TO-cell-prop"); },
-				       Xinha._lc("Show the Table Cell Properties dialog", "ContextMenu"),
-				       config.btnList["TO-cell-prop"][1] ]);
-      }
-      
-      if(typeof config.btnList["TO-cell-insert-after"] != 'undefined')
-      {
-             elmenus.push(
-             [ Xinha._lc("Insert Cell After", "ContextMenu"),
-				       function() { tableOperation("TO-cell-insert-after"); },
-				       Xinha._lc("Insert Cell After", "ContextMenu"),
-				       config.btnList["TO-cell-insert-after"][1] ]);
-      }
-      
-      if(typeof config.btnList["TO-cell-insert-before"] != 'undefined')
-      {
-             elmenus.push([ Xinha._lc("Insert Cell Before", "ContextMenu"),
-				       function() { tableOperation("TO-cell-insert-before"); },
-				       Xinha._lc("Insert Cell After", "ContextMenu"),
-				       config.btnList["TO-cell-insert-before"][1] ]);
-      }
-      
-      if(typeof config.btnList["TO-cell-delete"] != 'undefined')
-      {
-             elmenus.push([ Xinha._lc("Delete Cell", "ContextMenu"),
-				       function() { tableOperation("TO-cell-delete"); },
-				       Xinha._lc("Delete Cell", "ContextMenu"),
-				       config.btnList["TO-cell-delete"][1] ]);
-      }
-      
-      if(typeof config.btnList["TO-cell-merge"] != 'undefined')
-      {
-             elmenus.push([ Xinha._lc("Merge Cells", "ContextMenu"),
-				       function() { tableOperation("TO-cell-merge"); },
-				       Xinha._lc("Merge Cells", "ContextMenu"),
-				       config.btnList["TO-cell-merge"][1] ]
-				);
-      }
-			break;
-		    case "tr":
-			tr = target;
-			if (!tbo) break;
-			elmenus.push(null);
-      
-      if(typeof config.btnList["TO-row-prop"] != 'undefined')
-      {
-             elmenus.push([ Xinha._lc("Ro_w Properties...", "ContextMenu"),
-				       function() { tableOperation("TO-row-prop"); },
-				       Xinha._lc("Show the Table Row Properties dialog", "ContextMenu"),
-				       config.btnList["TO-row-prop"][1] ]);
-      }
-      
-      if(typeof config.btnList["TO-row-insert-above"] != 'undefined')
-      {
-             elmenus.push([ Xinha._lc("I_nsert Row Before", "ContextMenu"),
-				       function() { tableOperation("TO-row-insert-above"); },
-				       Xinha._lc("Insert a new row before the current one", "ContextMenu"),
-				       config.btnList["TO-row-insert-above"][1] ]);
-      }
-      
-      if(typeof config.btnList["TO-row-insert-under"] != 'undefined')
-      {
-             elmenus.push([ Xinha._lc("In_sert Row After", "ContextMenu"),
-				       function() { tableOperation("TO-row-insert-under"); },
-				       Xinha._lc("Insert a new row after the current one", "ContextMenu"),
-				       config.btnList["TO-row-insert-under"][1] ]);
-      }
-      
-      if(typeof config.btnList["TO-row-delete"] != 'undefined')
-      {
-             elmenus.push([ Xinha._lc("_Delete Row", "ContextMenu"),
-				       function() { tableOperation("TO-row-delete"); },
-				       Xinha._lc("Delete the current row", "ContextMenu"),
-				       config.btnList["TO-row-delete"][1] ]
-				);
-      }
-			break;
-		    case "table":
-			table = target;
-			if (!tbo) break;
-			elmenus.push(null);
-      
-      if(typeof config.btnList["TO-table-prop"] != 'undefined')
-      {
-             elmenus.push([ Xinha._lc("_Table Properties...", "ContextMenu"),
-				       function() { tableOperation("TO-table-prop"); },
-				       Xinha._lc("Show the Table Properties dialog", "ContextMenu"),
-				       config.btnList["TO-table-prop"][1] ]);
-      }
-      
-      if(typeof config.btnList["TO-col-insert-before"] != 'undefined')
-      {
-             elmenus.push([ Xinha._lc("Insert _Column Before", "ContextMenu"),
-				       function() { tableOperation("TO-col-insert-before"); },
-				       Xinha._lc("Insert a new column before the current one", "ContextMenu"),
-				       config.btnList["TO-col-insert-before"][1] ]);
-      }
-      
-      if(typeof config.btnList["TO-col-insert-after"] != 'undefined')
-      {
-             elmenus.push([ Xinha._lc("Insert C_olumn After", "ContextMenu"),
-				       function() { tableOperation("TO-col-insert-after"); },
-				       Xinha._lc("Insert a new column after the current one", "ContextMenu"),
-				       config.btnList["TO-col-insert-after"][1] ]);
-      }
-      
-      if(typeof config.btnList["TO-col-delete"] != 'undefined')
-      {
-             elmenus.push([ Xinha._lc("De_lete Column", "ContextMenu"),
-				       function() { tableOperation("TO-col-delete"); },
-				       Xinha._lc("Delete the current column", "ContextMenu"),
-				       config.btnList["TO-col-delete"][1] ]
-				);
-      }
-			break;
-		    case "body":
-			elmenus.push(null,
-				     [ Xinha._lc("Justify Left", "ContextMenu"),
-				       function() { editor.execCommand("justifyleft"); }, null,
-				       config.btnList["justifyleft"][1] ],
-				     [ Xinha._lc("Justify Center", "ContextMenu"),
-				       function() { editor.execCommand("justifycenter"); }, null,
-				       config.btnList["justifycenter"][1] ],
-				     [ Xinha._lc("Justify Right", "ContextMenu"),
-				       function() { editor.execCommand("justifyright"); }, null,
-				       config.btnList["justifyright"][1] ],
-				     [ Xinha._lc("Justify Full", "ContextMenu"),
-				       function() { editor.execCommand("justifyfull"); }, null,
-				       config.btnList["justifyfull"][1] ]
-				);
-			break;
-		}
-	}
-
-	// If there is a selection, and not a link, image, or multiple words
-	//  then this may be a misspelled word, cancel the context menu so that
-	//  the browser's default will appear and offer suggestions
-	if (selection && !link && !img && !editor.getSelectedHTML().replace(/<[^>]+>/, '').match(/\s/))
-  {
-    return false;
-  }
-	
-	if (selection && !link)
-		menu.push(null, [ Xinha._lc("Make lin_k...", "ContextMenu"),
-           function() { editor.config.btnList['createlink'][3](editor); },
-				  Xinha._lc("Create a link", "ContextMenu"),
-				  config.btnList["createlink"][1] ]);
-
-  if(editor.config.ContextMenu.customHooks[currentTarget.tagName.toLowerCase()]) 
-  { 
-    var items = editor.config.ContextMenu.customHooks[currentTarget.tagName.toLowerCase()]; 
-    
-    for (var i = 0; i < items.length; ++i)
-    {
-      menu.push(items[i]); 
-    }
-  }
-
-	for (var i = 0; i < elmenus.length; ++i)
-		menu.push(elmenus[i]);
-
-	if (!/html|body/i.test(currentTarget.tagName))
-		menu.push(null,
-			  [ Xinha._lc("Remove the $elem Element...", 'ContextMenu', {elem: "&lt;" + currentTarget.tagName + "&gt;"}),
-			    function() {
-				    if (confirm(Xinha._lc("Please confirm that you want to remove this element:", "ContextMenu") + " " +
-						currentTarget.tagName)) {
-					    var el = currentTarget;
-					    var p = el.parentNode;
-					    p.removeChild(el);
-					    if (Xinha.is_gecko) {
-						    if (p.tagName.toLowerCase() == "td" && !p.hasChildNodes())
-							    p.appendChild(editor._doc.createElement("br"));
-						    editor.forceRedraw();
-						    editor.focusEditor();
-						    editor.updateToolbar();
-						    if (table) {
-							    var save_collapse = table.style.borderCollapse;
-							    table.style.borderCollapse = "collapse";
-							    table.style.borderCollapse = "separate";
-							    table.style.borderCollapse = save_collapse;
-						    }
-					    }
-				    }
-			    },
-			    Xinha._lc("Remove this node from the document", "ContextMenu") ],
-			  [ Xinha._lc("Insert paragraph before", "ContextMenu"),
-			    function() { insertPara(false); },
-			    Xinha._lc("Insert a paragraph before the current node", "ContextMenu") ],
-			  [ Xinha._lc("Insert paragraph after", "ContextMenu"),
-			    function() { insertPara(true); },
-			    Xinha._lc("Insert a paragraph after the current node", "ContextMenu") ]
-			  );
-	if (!menu[0]) menu.shift(); //If the menu begins with a separator, remove it for cosmetical reasons
-	return menu;
-};
-
-ContextMenu.prototype.popupMenu = function(ev) {
-	var self = this;
-	if (this.currentMenu)
-	{
-		this.closeMenu();
-	}
-	function getPos(el) {
-		var r = { x: el.offsetLeft, y: el.offsetTop };
-		if (el.offsetParent) {
-			var tmp = getPos(el.offsetParent);
-			r.x += tmp.x;
-			r.y += tmp.y;
-		}
-		return r;
-	}
-	function documentClick(ev) {
-		ev || (ev = window.event);
-		if (!self.currentMenu) {
-			alert(Xinha._lc("How did you get here? (Please report!)", "ContextMenu"));
-			return false;
-		}
-		var el = Xinha.is_ie ? ev.srcElement : ev.target;
-		for (; el != null && el != self.currentMenu; el = el.parentNode);
-		if (el == null)
-			self.closeMenu();
-		//Xinha._stopEvent(ev);
-		//return false;
-	}
-	var keys = [];
-	function keyPress(ev) {
-		ev || (ev = window.event);
-		Xinha._stopEvent(ev);
-		if (ev.keyCode == 27) {
-			self.closeMenu();
-			return false;
-		}
-		var key = String.fromCharCode(Xinha.is_ie ? ev.keyCode : ev.charCode).toLowerCase();
-		for (var i = keys.length; --i >= 0;) {
-			var k = keys[i];
-			if (k[0].toLowerCase() == key)
-				k[1].__msh.activate();
-		}
-	}
-	self.closeMenu = function() {
-		self.currentMenu.parentNode.removeChild(self.currentMenu);
-		self.currentMenu = null;
-		Xinha._removeEvent(document, "mousedown", documentClick);
-		Xinha._removeEvent(self.editordoc, "mousedown", documentClick);
-		if (keys.length > 0)
-			Xinha._removeEvent(self.editordoc, "keypress", keyPress);
-		if (Xinha.is_ie)
-			self.iePopup.hide();
-	}
-	var target = Xinha.is_ie ? ev.srcElement : ev.target;
-     var ifpos = getPos(self.editor._htmlArea);//_iframe);
-	var x = ev.clientX + ifpos.x;
-	var y = ev.clientY + ifpos.y;
-
-	var div;
-	var doc;
-	if (!Xinha.is_ie) {
-		doc = document;
-	} else {
-		// IE stinks
-		var popup = this.iePopup = window.createPopup();
-		doc = popup.document;
-		doc.open();
-		doc.write("<html><head><style type='text/css'>@import url(" + Xinha.getPluginDir('ContextMenu') + "/menu.css); html, body { padding: 0px; margin: 0px; overflow: hidden; border: 0px; }</style></head><body unselectable='yes'></body></html>");
-		doc.close();
-	}
-	div = doc.createElement("div");
-	if (Xinha.is_ie)
-		div.unselectable = "on";
-	div.oncontextmenu = function() { return false; };
-	div.className = "htmlarea-context-menu";
-	if (!Xinha.is_ie) {
-	    div.style.visibility = "hidden";
-	    div.style.left = div.style.top = "-200px";
-	}
-	doc.body.appendChild(div);
-
-	var table = doc.createElement("table");
-	div.appendChild(table);
-	table.cellSpacing = 0;
-	table.cellPadding = 0;
-	var parent = doc.createElement("tbody");
-	table.appendChild(parent);
-
-	var options = this.getContextMenu(target);
-  if(options === false) return false; // No context menu
-  
-	for (var i = 0; i < options.length; ++i) {
-		var option = options[i];
-		var item = doc.createElement("tr");
-		parent.appendChild(item);
-		if (Xinha.is_ie)
-			item.unselectable = "on";
-		else item.onmousedown = function(ev) {
-			Xinha._stopEvent(ev);
-			return false;
-		};
-		if (!option) {
-			item.className = "separator";
-			var td = doc.createElement("td");
-			td.className = "icon";
-			var IE_IS_A_FUCKING_SHIT = '>';
-			if (Xinha.is_ie) {
-				td.unselectable = "on";
-				IE_IS_A_FUCKING_SHIT = " unselectable='on' style='height=1px'>&nbsp;";
-			}
-			td.innerHTML = "<div" + IE_IS_A_FUCKING_SHIT + "</div>";
-			var td1 = td.cloneNode(true);
-			td1.className = "label";
-			item.appendChild(td);
-			item.appendChild(td1);
-		} else {
-			var label = option[0];
-			item.className = "item";
-			item.__msh = {
-				item: item,
-				label: label,
-				action: option[1],
-				tooltip: option[2] || null,
-				icon: option[3] || null,
-				activate: function() {
-					self.closeMenu();
-					self.editor.focusEditor();
-					this.action();
-				}
-			};
-			label = label.replace(/_([a-zA-Z0-9])/, "<u>$1</u>");
-			if (label != option[0])
-				keys.push([ RegExp.$1, item ]);
-			label = label.replace(/__/, "_");
-			var td1 = doc.createElement("td");
-			if (Xinha.is_ie)
-				td1.unselectable = "on";
-			item.appendChild(td1);
-			td1.className = "icon";
-			if (item.__msh.icon)
-      {
-        var t = Xinha.makeBtnImg(item.__msh.icon, doc);
-        td1.appendChild(t);
-      }
-      var td2 = doc.createElement("td");
-			if (Xinha.is_ie)
-				td2.unselectable = "on";
-			item.appendChild(td2);
-			td2.className = "label";
-			td2.innerHTML = label;
-			item.onmouseover = function() {
-				this.className += " hover";
-				self.editor._statusBarTree.innerHTML = this.__msh.tooltip || '&nbsp;';
-			};
-			item.onmouseout = function() { this.className = "item"; };
-			item.oncontextmenu = function(ev) {
-				this.__msh.activate();
-				if (!Xinha.is_ie)
-					Xinha._stopEvent(ev);
-				return false;
-			};
-			item.onmouseup = function(ev) {
-				var timeStamp = (new Date()).getTime();
-				if (timeStamp - self.timeStamp > 500)
-					this.__msh.activate();
-				if (!Xinha.is_ie)
-					Xinha._stopEvent(ev);
-				return false;
-			};
-			//if (typeof option[2] == "string")
-			//item.title = option[2];
-		}
-	}
-
-	if (!Xinha.is_ie) {
-	    /* keep then menu from overflowing the client window boundaries */ 
-	
-	    /*	provide a virtual margin to leave a swoosh of air between the
-		meny and the window edge. This should probably go into the menu
-		container css as margin 10px instead...
-	     */
-	    var margin = 10;
-	    
-	    if (y + div.offsetHeight + margin > window.innerHeight)
-		y = window.innerHeight - div.offsetHeight - margin;
-	    if (x + div.offsetWidth + margin > window.innerWidth)
-		x = window.innerWidth - div.offsetWidth - margin;
-	    
-	    div.style.left = x + "px";
-	    div.style.top = y + "px";
-	    div.style.visibility = "visible";
-
-	} else {
-    // To get the size we need to display the popup with some width/height
-    // then we can get the actual size of the div and redisplay the popup at the
-    // correct dimensions.
-    this.iePopup.show(ev.screenX, ev.screenY, 300,50);
-		var w = div.offsetWidth;
-		var h = div.offsetHeight;
-		this.iePopup.show(ev.screenX, ev.screenY, w, h);
-	}
-
-	this.currentMenu = div;
-	this.timeStamp = (new Date()).getTime();
-
-	Xinha._addEvent(document, "mousedown", documentClick);
-	Xinha._addEvent(this.editordoc, "mousedown", documentClick);
-	if (keys.length > 0)
-		Xinha._addEvent(this.editordoc, "keypress", keyPress);
-
-	Xinha._stopEvent(ev);
-	return false;
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/ContextMenu/lang/b5.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/ContextMenu/lang/b5.js
deleted file mode 100644
index cdb0362..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/ContextMenu/lang/b5.js
+++ /dev/null
@@ -1,16 +0,0 @@
-// I18N constants
-// LANG: "b5", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Justify Center": "位置居中",
-    "Justify Full": "位置左右平等",
-    "Justify Left": "位置靠左",
-    "Justify Right": "位置靠右"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/ContextMenu/lang/ch.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/ContextMenu/lang/ch.js
deleted file mode 100644
index afd5a05..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/ContextMenu/lang/ch.js
+++ /dev/null
@@ -1,16 +0,0 @@
-// I18N constants
-// LANG: "ch", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Justify Center": "居中",
-    "Justify Full": "整齊",
-    "Justify Left": "靠左",
-    "Justify Right": "靠右"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/ContextMenu/lang/cz.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/ContextMenu/lang/cz.js
deleted file mode 100644
index 84e85d5..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/ContextMenu/lang/cz.js
+++ /dev/null
@@ -1,16 +0,0 @@
-// I18N constants
-// LANG: "cz", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Justify Center": "Na střed",
-    "Justify Full": "Zarovnat do stran",
-    "Justify Left": "Zarovnat doleva",
-    "Justify Right": "Zarovnat doprava"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/ContextMenu/lang/da.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/ContextMenu/lang/da.js
deleted file mode 100644
index ef75103..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/ContextMenu/lang/da.js
+++ /dev/null
@@ -1,19 +0,0 @@
-// I18N constants
-// LANG: "da", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Copy": "Kopier",
-    "Cut": "Klip",
-    "Justify Center": "Centrer",
-    "Justify Full": "Lige margener",
-    "Justify Left": "Venstrejuster",
-    "Justify Right": "Højrejuster",
-    "Paste": "Sæt ind"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/ContextMenu/lang/de.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/ContextMenu/lang/de.js
deleted file mode 100644
index 6296485..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/ContextMenu/lang/de.js
+++ /dev/null
@@ -1,57 +0,0 @@
-// I18N constants
-// LANG: "de", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "C_ell Properties...": "Zellenoptionen",
-    "Chec_k Link...": "Link testen",
-    "Copy": "Kopieren",
-    "Create a link": "Link erstellen",
-    "Current URL is": "Aktuelle URL ist",
-    "Cut": "Ausschneiden",
-    "De_lete Column": "Spalte löschen",
-    "Delete the current column": "Spalte löschen",
-    "Delete the current row": "Zeile löschen",
-    "How did you get here? (Please report!)": "Wie sind Sie denn hier hin gekommen? (Please report!)",
-    "I_nsert Row Before": "Zeile einfügen vor Position",
-    "In_sert Row After": "Zeile einügen nach Position",
-    "Insert C_olumn After": "Spalte einfügen nach Position",
-    "Insert _Column Before": "Spalte einfügen vor Position",
-    "Insert a new column after the current one": "Spalte einfügen nach der aktuellen Position",
-    "Insert a new column before the current one": "Spalte einfügen vor der aktuellen Position",
-    "Insert a new row after the current one": "Zeile einfügen nach der aktuellen Position",
-    "Insert a new row before the current one": "Zeile einfügen vor der aktuellen Position",
-    "Insert a paragraph after the current node": "Absatz einfügen hinter der aktuellen Position",
-    "Insert a paragraph before the current node": "Absatz einfügen vor der aktuellen Position",
-    "Insert paragraph after": "Absatz einfügen hinter Position",
-    "Insert paragraph before": "Absatz einfügen vor Position",
-    "Justify Center": "Zentriert",
-    "Justify Full": "Blocksatz",
-    "Justify Left": "Linksbündig",
-    "Justify Right": "Rechtsbündig",
-    "Link points to:": "Link zeigt auf:",
-    "Make lin_k...": "Link erstellen",
-    "Opens this link in a new window": "Diesen Link in neuem Fenster öffnen",
-    "Paste": "Einfügen",
-    "Please confirm that you want to remove this element:": "Wollen sie dieses Element wirklich entfernen?",
-    "Please confirm that you want to unlink this element.": "Wollen sie diesen Link wirklich entfernen?",
-    "Remove the $elem Element...": "Element $elem entfernen...",
-    "Remove this node from the document": "Dieses Element aus dem Dokument entfernen",
-    "Ro_w Properties...": "Zeilenoptionen",
-    "Show the Table Cell Properties dialog": "Zellenoptionen anzeigen",
-    "Show the Table Properties dialog": "Tabellenoptionen anzeigen",
-    "Show the Table Row Properties dialog": "Zeilenoptionen anzeigen",
-    "Show the image properties dialog": "Fenster für die Bildoptionen anzeigen",
-    "Unlink the current element": "Link auf Element entfernen",
-    "_Delete Row": "Zeile löschen",
-    "_Image Properties...": "Eigenschaften",
-    "_Modify Link...": "Link ändern",
-    "_Remove Link...": "Link entfernen",
-    "_Table Properties...": "Tabellenoptionen"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/ContextMenu/lang/ee.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/ContextMenu/lang/ee.js
deleted file mode 100644
index e8d5b10..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/ContextMenu/lang/ee.js
+++ /dev/null
@@ -1,16 +0,0 @@
-// I18N constants
-// LANG: "ee", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Justify Center": "Joonda keskele",
-    "Justify Full": "Rööpjoonda",
-    "Justify Left": "Joonda vasakule",
-    "Justify Right": "Joonda paremale"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/ContextMenu/lang/el.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/ContextMenu/lang/el.js
deleted file mode 100644
index 5aa089e..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/ContextMenu/lang/el.js
+++ /dev/null
@@ -1,63 +0,0 @@
-// I18N constants
-// LANG: "el", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "C_ell Properties...": "Ιδιότητες κελιού...",
-    "Chec_k Link...": "Έλεγχος συνδέσμων...",
-    "Copy": "Αντιγραφή",
-    "Create a link": "Δημιουργία συνδέσμου",
-    "Current URL is": "Το τρέχων URL είναι",
-    "Cut": "Αποκοπή",
-    "De_lete Column": "Διαγραφή στήλης",
-    "Delete the current column": "Διαγραφή επιλεγμένης στήλης",
-    "Delete the current row": "Διαγραφή επιλεγμένης γραμμής",
-    "How did you get here? (Please report!)": "Πώς ήρθατε μέχρι εδώ; (Παρακαλούμε αναφέρετε το!)",
-    "I_nsert Row Before": "Εισαγωγή γραμμής πριν",
-    "In_sert Row After": "Εισαγωγή γραμμής μετά",
-    "Insert C_olumn After": "Εισαγωγή στήλης μετά",
-    "Insert _Column Before": "Εισαγωγή στήλης πριν",
-    "Insert a new column after the current one": "Εισαγωγή νέας στήλης μετά την επιλεγμένη",
-    "Insert a new column before the current one": "Εισαγωγή νέας στήλης πριν την επιλεγμένη",
-    "Insert a new row after the current one": "Εισαγωγή μιας νέας γραμμής μετά την επιλεγμένη",
-    "Insert a new row before the current one": "Εισαγωγή μιας νέας γραμμής πριν την επιλεγμένη",
-    "Justify Center": "Στοίχηση Κέντρο",
-    "Justify Full": "Πλήρης Στοίχηση",
-    "Justify Left": "Στοίχηση Αριστερά",
-    "Justify Right": "Στοίχηση Δεξιά",
-    "Link points to:": "Το τρέχων URL είναι",
-    "Make lin_k...": "Δημιουργία συνδέσμου...",
-    "Opens this link in a new window": "Ανοίγει αυτό τον σύνδεσμο σε ένα νέο παράθυρο",
-    "Paste": "Επικόλληση",
-    "Please confirm that you want to unlink this element.": "Είστε βέβαιος πως θέλετε να αφαιρέσετε τον σύνδεσμο από αυτό το στοιχείο:",
-    "Ro_w Properties...": "Ιδιότητες γραμμής...",
-    "Show the Table Cell Properties dialog": "Ιδιότητες κελιού...",
-    "Show the Table Properties dialog": "Εμφάνιση διαλόγου με τις Ιδιότητες Πίνακα",
-    "Show the Table Row Properties dialog": "Ιδιότητες γραμμής...",
-    "Show the image properties dialog": "Ιδιότητες Εικόνας...",
-    "Unlink the current element": "Αφαίρεση συνδέσμου από το παρών στοιχείο",
-    "_Delete Row": "Διαγραφή γραμμής",
-    "_Image Properties...": "Ιδιότητες Εικόνας...",
-    "_Modify Link...": "Τροποποίηση συνδέσμου...",
-    "_Remove Link...": "Διαγραφή συνδέσμου...",
-    "_Table Properties...": "Ιδιότητες πίνακα...",
-    "__OBSOLETE__": {
-        "Delete Cell": "",
-        "Insert Cell After": "",
-        "Insert Cell Before": "",
-        "Insert a paragraph after the current node": "",
-        "Insert a paragraph before the current node": "",
-        "Insert paragraph after": "",
-        "Insert paragraph before": "",
-        "Merge Cells": "",
-        "Please confirm that you want to remove this element:": "",
-        "Remove the $elem Element...": "",
-        "Remove this node from the document": ""
-    }
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/ContextMenu/lang/es.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/ContextMenu/lang/es.js
deleted file mode 100644
index b9dca47..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/ContextMenu/lang/es.js
+++ /dev/null
@@ -1,60 +0,0 @@
-// I18N constants
-// LANG: "es", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "C_ell Properties...": "P_ropiedades de celda...",
-    "Chec_k Link...": "_Verificar hipervínculo...",
-    "Copy": "Copiar",
-    "Create a link": "Crear un hipervínculo",
-    "Current URL is": "La URL actual es",
-    "Cut": "Cortar",
-    "De_lete Column": "_Suprimir columna",
-    "Delete the current column": "Suprimir la columna actual",
-    "Delete the current row": "Suprimir la fila actual",
-    "How did you get here? (Please report!)": "¿Cómo ha llegado aquí? (¡Por favor reporte el error!)",
-    "I_nsert Row Before": "_Insertar fila delante",
-    "In_sert Row After": "I_nsertar fila detrás",
-    "Insert C_olumn After": "Insertar _columna detrás",
-    "Insert _Column Before": "Insert_ar columna delante",
-    "Insert a new column after the current one": "Insertar una columna nueva después de la actual",
-    "Insert a new column before the current one": "Insertar una columna nueva antes de la actual",
-    "Insert a new row after the current one": "Insertar una fila nueva después de la actual",
-    "Insert a new row before the current one": "Insertar una fila nueva antes de la actual",
-    "Insert a paragraph after the current node": "Insertar un párrafo después del nodo actual",
-    "Insert a paragraph before the current node": "Insertar un párrafo antes del nodo actual",
-    "Insert paragraph after": "Insertar párrafo detrás",
-    "Insert paragraph before": "Insertar párrafo delante",
-    "Justify Center": "Centrar",
-    "Justify Full": "Justificar",
-    "Justify Left": "Alinear a la izquierda",
-    "Justify Right": "Alinear a la derecha",
-    "Link points to:": "El hipervínculo apunta a:",
-    "Make lin_k...": "Convertir en _hipervínculo...",
-    "Opens this link in a new window": "Abre este hipervínculo en una ventana nueva",
-    "Paste": "Pegar",
-    "Please confirm that you want to remove this element:": "Por favor, confirme que desea suprimir este elemento:",
-    "Please confirm that you want to unlink this element.": "Por favor, confirme que desea suprimir el hipervínculo de este elemento.",
-    "Remove the $elem Element...": "Suprimir el elemento $elem...",
-    "Remove this node from the document": "Suprimir este nodo del documento",
-    "Ro_w Properties...": "Pr_opiedades de la fila...",
-    "Show the Table Cell Properties dialog": "Mostrar el diálogo Propiedades de la Celda",
-    "Show the Table Properties dialog": "Mostrar el diálogo Propiedades de la Tabla",
-    "Show the Table Row Properties dialog": "Mostrar el diálogo Propiedades de la Fila",
-    "Show the image properties dialog": "Mostrar el diálogo de propiedades de imagen",
-    "Unlink the current element": "Suprimir el hipervínculo del elemento actual",
-    "_Delete Row": "S_uprimir fila",
-    "_Image Properties...": "_Propiedades de imagen...",
-    "_Modify Link...": "_Modificar hipervínculo...",
-    "_Remove Link...": "_Suprimir hipervínculo...",
-    "_Table Properties...": "Propi_edades de la tabla...",
-    "__OBSOLETE__": {
-        "Modify URL": "Modificar URL"
-    }
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/ContextMenu/lang/eu.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/ContextMenu/lang/eu.js
deleted file mode 100644
index cba10ed..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/ContextMenu/lang/eu.js
+++ /dev/null
@@ -1,16 +0,0 @@
-// I18N constants
-// LANG: "eu", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Justify Center": "Zentratu",
-    "Justify Full": "Justifikatu",
-    "Justify Left": "Ezkerretara lerrokatu",
-    "Justify Right": "Eskuinetara lerrokatu"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/ContextMenu/lang/fa.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/ContextMenu/lang/fa.js
deleted file mode 100644
index 33112cc..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/ContextMenu/lang/fa.js
+++ /dev/null
@@ -1,16 +0,0 @@
-// I18N constants
-// LANG: "fa", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Justify Center": "تراز در وسط",
-    "Justify Full": "تراز از چپ و راست",
-    "Justify Left": "تراز از چپ",
-    "Justify Right": "تراز در راست"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/ContextMenu/lang/fi.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/ContextMenu/lang/fi.js
deleted file mode 100644
index ebf9105..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/ContextMenu/lang/fi.js
+++ /dev/null
@@ -1,16 +0,0 @@
-// I18N constants
-// LANG: "fi", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Justify Center": "Keskitä",
-    "Justify Full": "Tasaa molemmat reunat",
-    "Justify Left": "Tasaa vasemmat reunat",
-    "Justify Right": "Tasaa oikeat reunat"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/ContextMenu/lang/fr.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/ContextMenu/lang/fr.js
deleted file mode 100644
index 403f77e..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/ContextMenu/lang/fr.js
+++ /dev/null
@@ -1,60 +0,0 @@
-// I18N constants
-// LANG: "fr", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "C_ell Properties...": "P_ropriétés de la cellule...",
-    "Chec_k Link...": "_Vérifier le lien...",
-    "Copy": "Copier",
-    "Create a link": "Créer un lien",
-    "Current URL is": "L'URL courante est",
-    "Cut": "Couper",
-    "De_lete Column": "_Supprimer la colonne",
-    "Delete the current column": "Supprimer cette colonne",
-    "Delete the current row": "Supprimer la rangée courante",
-    "How did you get here? (Please report!)": "Comment êtes-vous arrivé ici ? (Reportez le bug SVP !)",
-    "I_nsert Row Before": "Insérer une rangée a_vant",
-    "In_sert Row After": "Insér_er une rangée après",
-    "Insert C_olumn After": "Insérer une colonne après",
-    "Insert _Column Before": "I_nsérer une colonne avant",
-    "Insert a new column after the current one": "Insérer une nouvelle colonne après celle-ci",
-    "Insert a new column before the current one": "Insérer une nouvelle rangée avant celle-ci",
-    "Insert a new row after the current one": "Insérer une nouvelle rangée après celle-ci",
-    "Insert a new row before the current one": "Insérer une nouvelle rangée avant celle-ci",
-    "Insert a paragraph after the current node": "Insérer un paragraphe après le noeud courant",
-    "Insert a paragraph before the current node": "Insérer un paragraphe avant le noeud courant",
-    "Insert paragraph after": "Insérer un paragraphe après",
-    "Insert paragraph before": "Insérer un paragraphe avant",
-    "Justify Center": "Aligner au centre",
-    "Justify Full": "Justifier",
-    "Justify Left": "Aligner à gauche",
-    "Justify Right": "Aligner à droite",
-    "Link points to:": "Le lien pointe sur:",
-    "Make lin_k...": "Convertir en lien...",
-    "Opens this link in a new window": "Ouvrir ce lien dans une nouvelle fenêtre",
-    "Paste": "Coller",
-    "Please confirm that you want to remove this element:": "Confirmer la suppression de cet élément:",
-    "Please confirm that you want to unlink this element.": "Voulez-vous vraiment enlever le lien présent sur cet élément.",
-    "Remove the $elem Element...": "Supprimer Élément $elem...",
-    "Remove this node from the document": "Supprimer ce noeud du document",
-    "Ro_w Properties...": "Pr_opriétés de la rangée...",
-    "Show the Table Cell Properties dialog": "Afficher la boite de propriété des cellules",
-    "Show the Table Properties dialog": "Afficher la boite de propriété de tableau",
-    "Show the Table Row Properties dialog": "Afficher la boite de propriété des rangées",
-    "Show the image properties dialog": "Afficher le dialogue des propriétés d'image",
-    "Unlink the current element": "Enlever le lien sur cet élément",
-    "_Delete Row": "Suppr_imer une rangée",
-    "_Image Properties...": "_Propriétés de l'image...",
-    "_Modify Link...": "_Modifier le lien...",
-    "_Remove Link...": "_Supprimer le lien...",
-    "_Table Properties...": "Proprié_tés de la table...",
-    "__OBSOLETE__": {
-        "Modify URL": "Modifier l'URL"
-    }
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/ContextMenu/lang/he.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/ContextMenu/lang/he.js
deleted file mode 100644
index 1297393..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/ContextMenu/lang/he.js
+++ /dev/null
@@ -1,56 +0,0 @@
-// I18N constants
-// LANG: "he", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "C_ell Properties...": "מאפייני ת_א...",
-    "Chec_k Link...": "בדו_ק קישור...",
-    "Copy": "העתק",
-    "Create a link": "יצירת קישור",
-    "Current URL is": "URL נוכחי הוא",
-    "Cut": "גזור",
-    "De_lete Column": "מח_ק טור",
-    "Delete the current column": "מחיקת את הטור הנוכחי",
-    "Delete the current row": "מחיקת את השורה הנוכחית",
-    "How did you get here? (Please report!)": "איך הגעת הנה? (אנא דווח!)",
-    "I_nsert Row Before": "ה_כנס שורה לפני",
-    "In_sert Row After": "הכנ_ס שורה אחרי",
-    "Insert C_olumn After": "הכנס ט_ור אחרי",
-    "Insert _Column Before": "הכנס _טור לפני",
-    "Insert a new column after the current one": "הוספת טור חדש אחרי הנוכחי",
-    "Insert a new column before the current one": "הוספת טור חדש לפני הנוכחי",
-    "Insert a new row after the current one": "הוספת שורה חדשה אחרי הנוכחית",
-    "Insert a new row before the current one": "הוספת שורה חדשה לפני הנוכחית",
-    "Justify Center": "ישור למרכז",
-    "Justify Full": "ישור לשורה מלאה",
-    "Justify Left": "ישור לשמאל",
-    "Justify Right": "ישור לימין",
-    "Link points to:": "הקישור מצביע אל:",
-    "Make lin_k...": "צור קי_שור...",
-    "Opens this link in a new window": "פתיחת קישור זה בחלון חדש",
-    "Paste": "הדבק",
-    "Please confirm that you want to remove this element:": "אנא אשר שברצונך להסיר את האלמנט הזה:",
-    "Please confirm that you want to unlink this element.": "אנא אשר שאתה רוצה לנתק את אלמנט זה.",
-    "Remove the $elem Element...": "הסר את אלמנט ה- $elem...",
-    "Remove this node from the document": "הסרה של node זה מהמסמך",
-    "Ro_w Properties...": "מאפייני _טור...",
-    "Show the Table Cell Properties dialog": "מציג את חלון הדו-שיח של מאפייני תא בטבלה",
-    "Show the Table Properties dialog": "מציג את חלון הדו-שיח של מאפייני טבלה",
-    "Show the Table Row Properties dialog": "מציג את חלון הדו-שיח של מאפייני שורה בטבלה",
-    "Show the image properties dialog": "מציג את חלון הדו-שיח של מאפייני תמונה",
-    "Unlink the current element": "ניתוק את האלמנט הנוכחי",
-    "_Delete Row": "_מחק שורה",
-    "_Image Properties...": "_מאפייני תמונה...",
-    "_Modify Link...": "_שנה קישור...",
-    "_Remove Link...": "_הסר קישור...",
-    "_Table Properties...": "מאפייני ט_בלה...",
-    "__OBSOLETE__": {
-        "Modify URL": "שינוי URL"
-    }
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/ContextMenu/lang/hu.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/ContextMenu/lang/hu.js
deleted file mode 100644
index e7bc7df..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/ContextMenu/lang/hu.js
+++ /dev/null
@@ -1,16 +0,0 @@
-// I18N constants
-// LANG: "hu", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Justify Center": "Középre zárt",
-    "Justify Full": "Sorkizárt",
-    "Justify Left": "Balra zárt",
-    "Justify Right": "Jobbra zárt"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/ContextMenu/lang/it.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/ContextMenu/lang/it.js
deleted file mode 100644
index 11d2a59..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/ContextMenu/lang/it.js
+++ /dev/null
@@ -1,16 +0,0 @@
-// I18N constants
-// LANG: "it", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Justify Center": "Centrato",
-    "Justify Full": "Giustificato",
-    "Justify Left": "Sinistra",
-    "Justify Right": "Destra"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/ContextMenu/lang/ja.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/ContextMenu/lang/ja.js
deleted file mode 100644
index 1a8e780..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/ContextMenu/lang/ja.js
+++ /dev/null
@@ -1,61 +0,0 @@
-// I18N constants
-// LANG: "ja", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "C_ell Properties...": "セルのプロパティ(_E)...",
-    "Chec_k Link...": "リンクを確認(_K)...",
-    "Copy": "コピー",
-    "Create a link": "新たなリンクを作成します",
-    "Current URL is": "現在のURL",
-    "Cut": "切り取り",
-    "De_lete Column": "列の削除(_L)",
-    "Delete Cell": "セルの削除",
-    "Delete the current column": "選択中の列を削除します",
-    "Delete the current row": "選択中の行を削除します",
-    "How did you get here? (Please report!)": "どうやってここに来ましたか?(どうか報告を!)",
-    "I_nsert Row Before": "上に行を挿入(_N)",
-    "In_sert Row After": "下に行を挿入(_S)",
-    "Insert C_olumn After": "右に列を挿入(_O)",
-    "Insert Cell After": "後にセルを挿入",
-    "Insert Cell Before": "前にセルを挿入",
-    "Insert _Column Before": "左に列を挿入(_C)",
-    "Insert a new column after the current one": "選択中の列の右に一列挿入します",
-    "Insert a new column before the current one": "選択中の列の左に一列挿入します",
-    "Insert a new row after the current one": "選択中の行の下に一行挿入します",
-    "Insert a new row before the current one": "選択中の行の上に一行挿入します",
-    "Insert a paragraph after the current node": "選択中のノードの後に段落を挿入します",
-    "Insert a paragraph before the current node": "選択中のノードの手前に段落を挿入します",
-    "Insert paragraph after": "後に段落を挿入",
-    "Insert paragraph before": "前に段落を挿入",
-    "Justify Center": "中央寄せ",
-    "Justify Full": "均等割付",
-    "Justify Left": "左寄せ",
-    "Justify Right": "右寄せ",
-    "Link points to:": "リンク先:",
-    "Make lin_k...": "リンクの作成(_K)...",
-    "Merge Cells": "セルの結合",
-    "Opens this link in a new window": "このリンクを新しいウィンドウで開きます",
-    "Paste": "貼り付け",
-    "Please confirm that you want to remove this element:": "この要素を削除します。よろしいですか。:",
-    "Please confirm that you want to unlink this element.": "この要素のリンクを削除します。よろしいですか。",
-    "Remove the $elem Element...": "$elem 要素を削除 ...",
-    "Remove this node from the document": "ドキュメントからこのノードを削除します",
-    "Ro_w Properties...": "行のプロパティ(_W)...",
-    "Show the Table Cell Properties dialog": "テーブルセルのプロパティダイアログを表示します",
-    "Show the Table Properties dialog": "テーブルのプロパティダイアログを表示します",
-    "Show the Table Row Properties dialog": "テーブル行のプロパティダイアログを表示します",
-    "Show the image properties dialog": "この画像のプロパティダイアログを表示します",
-    "Unlink the current element": "この要素のリンクを解除",
-    "_Delete Row": "行の削除(_D)",
-    "_Image Properties...": "画像のプロパティ(_I)...",
-    "_Modify Link...": "リンクの修正(_M)...",
-    "_Remove Link...": "リンクの削除(_R)",
-    "_Table Properties...": "テーブルのプロパティ(_T)..."
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/ContextMenu/lang/lc_base.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/ContextMenu/lang/lc_base.js
deleted file mode 100644
index 0189477..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/ContextMenu/lang/lc_base.js
+++ /dev/null
@@ -1,73 +0,0 @@
-// I18N constants
-//
-// LANG: "en", ENCODING: UTF-8
-// Author: Translator-Name, <email@example.com>
-//
-// Last revision: 2018-04-12
-// 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).
-//
-// (Please, remove information below)
-// 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.)
-
-{
-    "C_ell Properties...": "",
-    "Chec_k Link...": "",
-    "Copy": "",
-    "Create a link": "",
-    "Current URL is": "",
-    "Cut": "",
-    "De_lete Column": "",
-    "Delete Cell": "",
-    "Delete the current column": "",
-    "Delete the current row": "",
-    "How did you get here? (Please report!)": "",
-    "I_nsert Row Before": "",
-    "In_sert Row After": "",
-    "Insert C_olumn After": "",
-    "Insert Cell After": "",
-    "Insert Cell Before": "",
-    "Insert _Column Before": "",
-    "Insert a new column after the current one": "",
-    "Insert a new column before the current one": "",
-    "Insert a new row after the current one": "",
-    "Insert a new row before the current one": "",
-    "Insert a paragraph after the current node": "",
-    "Insert a paragraph before the current node": "",
-    "Insert paragraph after": "",
-    "Insert paragraph before": "",
-    "Justify Center": "",
-    "Justify Full": "",
-    "Justify Left": "",
-    "Justify Right": "",
-    "Link points to:": "",
-    "Make lin_k...": "",
-    "Merge Cells": "",
-    "Opens this link in a new window": "",
-    "Paste": "",
-    "Please confirm that you want to remove this element:": "",
-    "Please confirm that you want to unlink this element.": "",
-    "Remove the $elem Element...": "",
-    "Remove this node from the document": "",
-    "Ro_w Properties...": "",
-    "Show the Table Cell Properties dialog": "",
-    "Show the Table Properties dialog": "",
-    "Show the Table Row Properties dialog": "",
-    "Show the image properties dialog": "",
-    "Unlink the current element": "",
-    "_Delete Row": "",
-    "_Image Properties...": "",
-    "_Modify Link...": "",
-    "_Remove Link...": "",
-    "_Table Properties...": ""
-}
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/ContextMenu/lang/lt.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/ContextMenu/lang/lt.js
deleted file mode 100644
index 78ef957..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/ContextMenu/lang/lt.js
+++ /dev/null
@@ -1,16 +0,0 @@
-// I18N constants
-// LANG: "lt", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Justify Center": "Lygiavimas pagal centrą",
-    "Justify Full": "Lygiuoti pastraipą",
-    "Justify Left": "Lygiavimas pagal kairę",
-    "Justify Right": "Lygiavimas pagal dešinę"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/ContextMenu/lang/lv.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/ContextMenu/lang/lv.js
deleted file mode 100644
index 8f0d1fb..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/ContextMenu/lang/lv.js
+++ /dev/null
@@ -1,16 +0,0 @@
-// I18N constants
-// LANG: "lv", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Justify Center": "Izlîdzinât centrâ",
-    "Justify Full": "Izlîdzinât pa visu lapu",
-    "Justify Left": "Izlîdzinât pa kreisi",
-    "Justify Right": "Izlîdzinât pa labi"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/ContextMenu/lang/nb.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/ContextMenu/lang/nb.js
deleted file mode 100644
index 36c6d5a..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/ContextMenu/lang/nb.js
+++ /dev/null
@@ -1,57 +0,0 @@
-// I18N constants
-// LANG: "nb", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "C_ell Properties...": "C_elleegenskaper...",
-    "Chec_k Link...": "Sje_kk Link...",
-    "Copy": "Kopier",
-    "Create a link": "Lag ny link",
-    "Current URL is": "Gjeldende URL er",
-    "Cut": "Klipp ut",
-    "De_lete Column": "S_lett kolonne",
-    "Delete the current column": "Slett gjeldende kolonne",
-    "Delete the current row": "Slett gjeldende rad",
-    "How did you get here? (Please report!)": "Hva skjedde? (Vennligst beskriv)",
-    "I_nsert Row Before": "Sett I_nn rad før",
-    "In_sert Row After": "_Sett inn rad etter",
-    "Insert C_olumn After": "Sett inn k_olonne etter",
-    "Insert _Column Before": "Sett inn kolonne etter (_c)",
-    "Insert a new column after the current one": "Sett inn kolonne etter gjeldende",
-    "Insert a new column before the current one": "Sett inn kolonne før gjeldende",
-    "Insert a new row after the current one": "Sett inn ny rad etter gjeldende",
-    "Insert a new row before the current one": "Sett inn ny rad før gjeldende",
-    "Insert a paragraph after the current node": "Sett inn paragraf etter gjeldende node",
-    "Insert a paragraph before the current node": "Sett inn paragraf før gjeldende node",
-    "Insert paragraph after": "Sett inn paragraf etter",
-    "Insert paragraph before": "Sett inn paragraf før",
-    "Justify Center": "_Midtjuster",
-    "Justify Full": "Blokk_juster",
-    "Justify Left": "_Venstrejuster",
-    "Justify Right": "_Høyrejuster",
-    "Link points to:": "Link peker til:",
-    "Make lin_k...": "Lag len_ke...",
-    "Opens this link in a new window": "Åpner denne link i nytt vindu",
-    "Paste": "Lim inn",
-    "Please confirm that you want to remove this element:": "Vennligst bekreft at du ønsker å fjerne elementet:",
-    "Please confirm that you want to unlink this element.": "Vennligst bekreft at du ønsker å fjerne link på elementet",
-    "Remove the $elem Element...": "Fjerne $elem elementet...",
-    "Remove this node from the document": "Fjerne denne node fra dokumentet",
-    "Ro_w Properties...": "Rad Egenskaper... (_w)",
-    "Show the Table Cell Properties dialog": "Vis egenskaper for celle",
-    "Show the Table Properties dialog": "Vis egenskaper for tabellen",
-    "Show the Table Row Properties dialog": "Vis egenskaper for rad",
-    "Show the image properties dialog": "Vis bildeegenskaper",
-    "Unlink the current element": "Fjerne link på gjeldende element",
-    "_Delete Row": "Slett rad (_d)",
-    "_Image Properties...": "_Bildeegenskaper...",
-    "_Modify Link...": "_Rediger Link...",
-    "_Remove Link...": "_Fjerne Link...",
-    "_Table Properties...": "_Tabellegenskaper..."
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/ContextMenu/lang/nl.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/ContextMenu/lang/nl.js
deleted file mode 100644
index d43e2fc..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/ContextMenu/lang/nl.js
+++ /dev/null
@@ -1,56 +0,0 @@
-// I18N constants
-// LANG: "nl", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "C_ell Properties...": "C_eleigenschappen...",
-    "Chec_k Link...": "Controleer hyperlin_k...",
-    "Copy": "Kopiëren",
-    "Create a link": "Maak een hyperlink",
-    "Current URL is": "Huidig URL is",
-    "Cut": "Knippen",
-    "De_lete Column": "Kolom verwijderen",
-    "Delete the current column": "Verwijder de huidige kolom",
-    "Delete the current row": "Verwijder de huidige rij",
-    "How did you get here? (Please report!)": "Hoe kwam je hier? (A.U.B. doorgeven!)",
-    "I_nsert Row Before": "Rij invoegen boven",
-    "In_sert Row After": "Rij invoegen onder",
-    "Insert C_olumn After": "Kolom invoegen na",
-    "Insert _Column Before": "Kolom invoegen voor",
-    "Insert a new column after the current one": "Voeg een nieuwe kolom in na de huidige",
-    "Insert a new column before the current one": "Voeg een nieuwe kolom in voor de huidige",
-    "Insert a new row after the current one": "Voeg een nieuwe rij in onder de huidige",
-    "Insert a new row before the current one": "Voeg een nieuwe rij in boven de huidige",
-    "Justify Center": "Centreren",
-    "Justify Full": "Uitvullen",
-    "Justify Left": "Links uitlijnen",
-    "Justify Right": "Rechts uitlijnen",
-    "Link points to:": "Hyperlink verwijst naar:",
-    "Make lin_k...": "Maak hyperlin_k...",
-    "Opens this link in a new window": "Opend deze hyperlink in een nieuw venster",
-    "Paste": "Plakken",
-    "Please confirm that you want to remove this element:": "Is het werkelijk de bedoeling dit element te verwijderen:",
-    "Please confirm that you want to unlink this element.": "Is het werkelijk de bedoeling dit element te unlinken.",
-    "Remove the $elem Element...": "Verwijder het $elem element...",
-    "Remove this node from the document": "Verwijder dit punt van het document",
-    "Ro_w Properties...": "Rijeigenscha_ppen...",
-    "Show the Table Cell Properties dialog": "Laat de tabel celeigenschappen dialog zien",
-    "Show the Table Properties dialog": "Laat de tabel eigenschappen dialog zien",
-    "Show the Table Row Properties dialog": "Laat de tabel rijeigenschappen dialog zien",
-    "Show the image properties dialog": "Laat het afbeeldingseigenschappen dialog zien",
-    "Unlink the current element": "Unlink het huidige element",
-    "_Delete Row": "Rij _verwijderen",
-    "_Image Properties...": "Eigenschappen afbeelding...",
-    "_Modify Link...": "Hyperlin_k aanpassen...",
-    "_Remove Link...": "Ve_rwijder hyperlink...",
-    "_Table Properties...": "_Tabeleigenschappen...",
-    "__OBSOLETE__": {
-        "Modify URL": "Aanpassen URL"
-    }
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/ContextMenu/lang/pl.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/ContextMenu/lang/pl.js
deleted file mode 100644
index 77a31ef..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/ContextMenu/lang/pl.js
+++ /dev/null
@@ -1,57 +0,0 @@
-// I18N constants
-// LANG: "pl", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "C_ell Properties...": "Właściwości komórki",
-    "Chec_k Link...": "Sprawdź odnośnik",
-    "Copy": "Kopiuj",
-    "Create a link": "Utwórz odnośnik",
-    "Current URL is": "Bieżący URL odnośnika",
-    "Cut": "Wytnij",
-    "De_lete Column": "Usuń kolumnę",
-    "Delete the current column": "Usuwa bieżącą kolumnę",
-    "Delete the current row": "Usuń bieżący wiersz",
-    "How did you get here? (Please report!)": "Jak tu trafiłeś (Proszę, podaj okoliczności!)",
-    "I_nsert Row Before": "Wstaw wiersz przed",
-    "In_sert Row After": "Wstaw wiersz po",
-    "Insert C_olumn After": "Wstaw kolumnę po",
-    "Insert _Column Before": "Wstaw kolumnę przed",
-    "Insert a new column after the current one": "Wstaw nową kolumnę po bieżącej",
-    "Insert a new column before the current one": "Wstaw nową kolumnę przed bieżącą",
-    "Insert a new row after the current one": "Wstaw nowy wiersz po bieżącym",
-    "Insert a new row before the current one": "Wstaw nowy wiersz przed bieżącym",
-    "Insert a paragraph after the current node": "Wstaw akapit po bieżącym elemencie",
-    "Insert a paragraph before the current node": "Wstaw akapit przed bieżącym elementem",
-    "Insert paragraph after": "Wstaw akapit po",
-    "Insert paragraph before": "Wstaw akapit przed",
-    "Justify Center": "Wycentruj",
-    "Justify Full": "Wyjustuj",
-    "Justify Left": "Wyrównaj do lewej",
-    "Justify Right": "Wyrównaj do prawej",
-    "Link points to:": "Odnośnik wskazuje na:",
-    "Make lin_k...": "Utwórz odnośnik",
-    "Opens this link in a new window": "Otwiera ten odnośnik w nowym oknie",
-    "Paste": "Wklej",
-    "Please confirm that you want to remove this element:": "Na pewno chcesz usunąć ten element?",
-    "Please confirm that you want to unlink this element.": "Na pewno chcesz usunąć odnośnik?",
-    "Remove the $elem Element...": "Usuń $elem...",
-    "Remove this node from the document": "Usuń ten element z dokumentu",
-    "Ro_w Properties...": "Właściwości wiersza",
-    "Show the Table Cell Properties dialog": "Pokaż okno właściwości komórki",
-    "Show the Table Properties dialog": "Pokaż okienko właściwości tabeli",
-    "Show the Table Row Properties dialog": "Pokaż okno właściwości wiersza",
-    "Show the image properties dialog": "Pokaż okienko właściwości obrazka",
-    "Unlink the current element": "Usuń odnośnik z zaznaczonego elementu",
-    "_Delete Row": "Usuń wiersz",
-    "_Image Properties...": "Właściwości obrazka",
-    "_Modify Link...": "Zmień odnośnik",
-    "_Remove Link...": "Usuń odnośnik",
-    "_Table Properties...": "Właściwości tabeli"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/ContextMenu/lang/pt_br.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/ContextMenu/lang/pt_br.js
deleted file mode 100644
index fc901ea..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/ContextMenu/lang/pt_br.js
+++ /dev/null
@@ -1,61 +0,0 @@
-// I18N constants
-// LANG: "pt_br", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "C_ell Properties...": "Propriedades da célula",
-    "Chec_k Link...": "Verificar Link...",
-    "Copy": "Copiar",
-    "Create a link": "Criar um novo link",
-    "Current URL is": "A URL corrente é",
-    "Cut": "Recortar",
-    "De_lete Column": "Apagar Coluna",
-    "Delete Cell": "Apagar Célula",
-    "Delete the current column": "Apagar a coluna atual",
-    "Delete the current row": "Apagar a linha atual",
-    "How did you get here? (Please report!)": "Como você começou aqui? (Por favor, informe!)",
-    "I_nsert Row Before": "Inserir linha antes deste ponto",
-    "In_sert Row After": "Inserir linha depois deste ponto",
-    "Insert C_olumn After": "Inserir coluna após este ponto",
-    "Insert Cell After": "Inserir Célula Depois",
-    "Insert Cell Before": "Inserir Célula Antes",
-    "Insert _Column Before": "Inserir coluna antes deste ponto",
-    "Insert a new column after the current one": "Inserir uma nova coluna após esta",
-    "Insert a new column before the current one": "Inserir uma nova coluna antes desta",
-    "Insert a new row after the current one": "Inserir uma linha após esta",
-    "Insert a new row before the current one": "Inserir uma nova linha antes desta",
-    "Insert a paragraph after the current node": "Inserir um parágrafo após o nó atual",
-    "Insert a paragraph before the current node": "Inserir um parágrafo antes do nó atual",
-    "Insert paragraph after": "Inserir um parágrafo após",
-    "Insert paragraph before": "Inserir um parágrafo antes",
-    "Justify Center": "Justificar centralizado",
-    "Justify Full": "Justificação completa",
-    "Justify Left": "Justificar à esquerda",
-    "Justify Right": "Justificar à direita",
-    "Link points to:": "Link para:",
-    "Make lin_k...": "Criar link...",
-    "Merge Cells": "Mesclar Células",
-    "Opens this link in a new window": "Abrir este link em uma nova janela",
-    "Paste": "Colar",
-    "Please confirm that you want to remove this element:": "Por favor, confirme que deseja remover este elemento:",
-    "Please confirm that you want to unlink this element.": "Por favor, confirme que deseja retirar o link do elemento.",
-    "Remove the $elem Element...": "Remover o elemento $elem...",
-    "Remove this node from the document": "Remover este nó do documento",
-    "Ro_w Properties...": "Propriedades da Linha",
-    "Show the Table Cell Properties dialog": "Mostrar Propriedades da Tabelas",
-    "Show the Table Properties dialog": "Mostrar caixa de diálogo de Propriedades da Tabela",
-    "Show the Table Row Properties dialog": "Mostrar caixa de diálogo de Propriedades da Linha",
-    "Show the image properties dialog": "Mostrar a caixa de diálogo das Propriedades da imagem",
-    "Unlink the current element": "Remover link do elemento atual",
-    "_Delete Row": "Apagar linha",
-    "_Image Properties...": "Propriedades da imagem...",
-    "_Modify Link...": "Modificar link",
-    "_Remove Link...": "Remover Link",
-    "_Table Properties...": "Propriedades da Tabela"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/ContextMenu/lang/ro.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/ContextMenu/lang/ro.js
deleted file mode 100644
index 14159d7..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/ContextMenu/lang/ro.js
+++ /dev/null
@@ -1,16 +0,0 @@
-// I18N constants
-// LANG: "ro", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Justify Center": "Aliniere pe centru",
-    "Justify Full": "Aliniere în ambele părţi",
-    "Justify Left": "Aliniere la stânga",
-    "Justify Right": "Aliniere la dreapta"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/ContextMenu/lang/ru.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/ContextMenu/lang/ru.js
deleted file mode 100644
index 019d50a..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/ContextMenu/lang/ru.js
+++ /dev/null
@@ -1,16 +0,0 @@
-// I18N constants
-// LANG: "ru", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Justify Center": "По центру",
-    "Justify Full": "По ширине",
-    "Justify Left": "По левому краю",
-    "Justify Right": "По правому краю"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/ContextMenu/lang/sh.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/ContextMenu/lang/sh.js
deleted file mode 100644
index 8af5cdf..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/ContextMenu/lang/sh.js
+++ /dev/null
@@ -1,16 +0,0 @@
-// I18N constants
-// LANG: "sh", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Justify Center": "Ravnanje po simetrali",
-    "Justify Full": "Puno ravnanje",
-    "Justify Left": "Ravnanje ulevo",
-    "Justify Right": "Ravnanje udesno"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/ContextMenu/lang/si.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/ContextMenu/lang/si.js
deleted file mode 100644
index 372cb68..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/ContextMenu/lang/si.js
+++ /dev/null
@@ -1,16 +0,0 @@
-// I18N constants
-// LANG: "si", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Justify Center": "Na sredino",
-    "Justify Full": "Porazdeli vsebino",
-    "Justify Left": "Poravnaj levo",
-    "Justify Right": "Poravnaj desno"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/ContextMenu/lang/sr.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/ContextMenu/lang/sr.js
deleted file mode 100644
index 2db6018..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/ContextMenu/lang/sr.js
+++ /dev/null
@@ -1,16 +0,0 @@
-// I18N constants
-// LANG: "sr", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Justify Center": "Равнање по симетрали",
-    "Justify Full": "Пуно равнање",
-    "Justify Left": "Равнање улево",
-    "Justify Right": "Равнање удесно"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/ContextMenu/lang/sv.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/ContextMenu/lang/sv.js
deleted file mode 100644
index 2f989c3..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/ContextMenu/lang/sv.js
+++ /dev/null
@@ -1,57 +0,0 @@
-// I18N constants
-// LANG: "sv", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "C_ell Properties...": "C_ellegenskaper...",
-    "Chec_k Link...": "Kontrollera länk...",
-    "Copy": "Kopiera",
-    "Create a link": "SKapa ny länk",
-    "Current URL is": "Aktuellt URL är",
-    "Cut": "Klipp ut",
-    "De_lete Column": "_Radera kolumn",
-    "Delete the current column": "Radera aktuell kolumn",
-    "Delete the current row": "T bort aktuell rad",
-    "How did you get here? (Please report!)": "Hur hamnade du här? (Beskriv förloppet)",
-    "I_nsert Row Before": "I_nfoga rad före",
-    "In_sert Row After": "Infoga rad efter aktuell rad",
-    "Insert C_olumn After": "Infoga k_olumn efter",
-    "Insert _Column Before": "Infoga kolumn efter (_c)",
-    "Insert a new column after the current one": "Infoga kolumn efter aktuell",
-    "Insert a new column before the current one": "Infoga kolumn före aktuell",
-    "Insert a new row after the current one": "Infoga ny rad efter aktuell",
-    "Insert a new row before the current one": "Infoga ny rad före aktuell",
-    "Insert a paragraph after the current node": "Infoga paragraf efter aktuell nod",
-    "Insert a paragraph before the current node": "Infoga paragraf före aktuell nod",
-    "Insert paragraph after": "Infoga paragraf efter",
-    "Insert paragraph before": "Infoga paragraf före",
-    "Justify Center": "_Centerjustera",
-    "Justify Full": "Block_justera",
-    "Justify Left": "_Vänsterjustera",
-    "Justify Right": "_Högerjustera",
-    "Link points to:": "Länken pekar mot:",
-    "Make lin_k...": "Skapa län_k...",
-    "Opens this link in a new window": "Öppna länk i nytt fönster",
-    "Paste": "Klistra in",
-    "Please confirm that you want to remove this element:": "Bekräfta borttagning av element:",
-    "Please confirm that you want to unlink this element.": "Bekräfta borttagning av länk",
-    "Remove the $elem Element...": "Radera elementet $elem...",
-    "Remove this node from the document": "Radera nod från dokumentet",
-    "Ro_w Properties...": "Radegenskaper... (_w)",
-    "Show the Table Cell Properties dialog": "Visa egenskaper for cellen",
-    "Show the Table Properties dialog": "Visa tabellegenskaper",
-    "Show the Table Row Properties dialog": "Visa egenskaper för rad",
-    "Show the image properties dialog": "Visa bildegenskaper",
-    "Unlink the current element": "Ta bort länk kopplad till elementet",
-    "_Delete Row": "Radera rad (_d)",
-    "_Image Properties...": "_Bildegenskaper...",
-    "_Modify Link...": "_Redigera Länk...",
-    "_Remove Link...": "_Ta bort länk...",
-    "_Table Properties...": "_Tabellegenskaper..."
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/ContextMenu/lang/th.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/ContextMenu/lang/th.js
deleted file mode 100644
index c40066d..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/ContextMenu/lang/th.js
+++ /dev/null
@@ -1,16 +0,0 @@
-// I18N constants
-// LANG: "th", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Justify Center": "จัดกึ่งกลาง",
-    "Justify Full": "จัดเต็มขอบ",
-    "Justify Left": "จัดชิดซ้าย",
-    "Justify Right": "จัดชิดขวา"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/ContextMenu/lang/tr.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/ContextMenu/lang/tr.js
deleted file mode 100644
index 181e8cd..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/ContextMenu/lang/tr.js
+++ /dev/null
@@ -1,16 +0,0 @@
-// I18N constants
-// LANG: "tr", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Justify Center": "Ortaya hizala",
-    "Justify Full": "Tam hizala",
-    "Justify Left": "Sola hizala",
-    "Justify Right": "Sağa hizala"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/ContextMenu/lang/vn.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/ContextMenu/lang/vn.js
deleted file mode 100644
index 8a0a7c8..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/ContextMenu/lang/vn.js
+++ /dev/null
@@ -1,16 +0,0 @@
-// I18N constants
-// LANG: "vn", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Justify Center": "Căn Giữa",
-    "Justify Full": "Căn Đều",
-    "Justify Left": "Căn Trái",
-    "Justify Right": "Căn Phải"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/ContextMenu/lang/zh_cn.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/ContextMenu/lang/zh_cn.js
deleted file mode 100644
index 9add81b..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/ContextMenu/lang/zh_cn.js
+++ /dev/null
@@ -1,16 +0,0 @@
-// I18N constants
-// LANG: "zh_cn", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Justify Center": "位置居中",
-    "Justify Full": "位置左右平等",
-    "Justify Left": "位置靠左",
-    "Justify Right": "位置靠右"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/ContextMenu/menu.css b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/ContextMenu/menu.css
deleted file mode 100644
index 34c64b5..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/ContextMenu/menu.css
+++ /dev/null
@@ -1,67 +0,0 @@
-/* styles for the ContextMenu /HTMLArea */
-/* The ContextMenu plugin is (c) dynarch.com 2003. */
-/* Distributed under the same terms as HTMLArea itself */
-
-div.htmlarea-context-menu {
-  position: absolute;
-  border: 1px solid #aca899;
-  padding: 2px;
-  background-color: #fff;
-  color: #000;
-  cursor: default;
-  z-index: 1000;
-}
-
-div.htmlarea-context-menu table {
-  font: 11px tahoma,verdana,sans-serif;
-  border-collapse: collapse;
-}
-
-div.htmlarea-context-menu tr.item td.icon img {
-/* taken care of by xinha.makeBtnImg() */
-/* width: 18px; */
-/* height: 18px; */
-}
-
-div.htmlarea-context-menu tr.item td.icon {
-  padding: 0px 3px;
-  width: 18px;
-  height: 18px;
-  background-color: #cdf;
-}
-
-div.htmlarea-context-menu tr.item td.label {
-  padding: 1px 10px 1px 3px;
-}
-
-div.htmlarea-context-menu tr.separator td {
-  padding: 2px 0px;
-}
-
-div.htmlarea-context-menu tr.separator td div {
-  border-top: 1px solid #aca899;
-  overflow: hidden;
-  position: relative;
-}
-
-div.htmlarea-context-menu tr.separator td.icon {
-  background-color: #cdf;
-}
-
-div.htmlarea-context-menu tr.separator td.icon div {
-/*  margin-left: 3px; */
-  border-color: #fff;
-}
-
-div.htmlarea-context-menu tr.separator td.label div {
-  margin-right: 3px;
-}
-
-div.htmlarea-context-menu tr.item.hover {
-  background-color: #316ac5;
-  color: #fff;
-}
-
-div.htmlarea-context-menu tr.item.hover td.icon {
-  background-color: #619af5;
-}
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/DefinitionList/DefinitionList.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/DefinitionList/DefinitionList.js
deleted file mode 100644
index 72f93ad..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/DefinitionList/DefinitionList.js
+++ /dev/null
@@ -1,99 +0,0 @@
-// DefinitionList plugin for Xinha
-// Distributed under the same terms as Xinha itself.
-// This notice MUST stay intact for use (see license.txt).
-
-
-function DefinitionList(editor) {
-  this.editor = editor;
-  var cfg = editor.config;
-  var bl = DefinitionList.btnList;
-  var self = this;
-  // register the toolbar buttons provided by this plugin
-  for (var i = 0; i < bl.length; ++i) {
-    var btn = bl[i];
-    if (!btn) {
-      continue;
-    }
-    var id = btn[0];
-    cfg.registerButton(id, this._lc(btn[1]), editor.imgURL("ed_" + btn[0] + ".gif", "DefinitionList"), false,
-      function(editor, id) {
-        // dispatch button press event
-        self.buttonPress(editor, id);
-      });
-  }
-
-  // We'll insert the buttons next to the UL/OL buttons, if they exist.
-  // If neither of those buttons exists, addToolbarElement puts our buttons
-  // at the beginning of the toolbar, which is good enough.
-  cfg.addToolbarElement("dl", ["insertunorderedlist", "insertorderedlist"], 1);
-  cfg.addToolbarElement("dt", "dl", 1);
-  cfg.addToolbarElement("dd", "dt", 1);
-}
-
-DefinitionList._pluginInfo = {
-  name          : "DefinitionList",
-  version       : "1.1",
-  developer     : "Udo Schmal",
-  developer_url : "",
-  c_owner       : "Udo Schmal",
-  license       : "htmlArea"
-};
-
-// the list of buttons added by this plugin
-DefinitionList.btnList = [         // for lc_parse_strings.php
-  ["dl", "definition list"],       // Xinha._lc('definition list', 'DefinitionList'); 
-  ["dt", "definition term"],       // Xinha._lc('definition term', 'DefinitionList'); 
-  ["dd", "definition description"] // Xinha._lc('definition description', 'DefinitionList'); 
-  ];
-
-DefinitionList.prototype._lc = function(string) {
-  return Xinha._lc(string, 'DefinitionList');
-};
-
-DefinitionList.prototype.onGenerate = function() {
-  this.editor.addEditorStylesheet(Xinha.getPluginDir('DefinitionList') + '/definition-list.css');
-};
-
-DefinitionList.prototype.buttonPress = function(editor,button_id) {
-  var pe;
-  var dx;
-  if (button_id=='dl') { //definition list
-    pe = editor.getParentElement();
-    if( pe.tagName.toLowerCase() != 'body' ) {
-      while (pe.parentNode.tagName.toLowerCase() != 'body') {
-        pe = pe.parentNode;
-      }
-    }
-    dx = editor._doc.createElement(button_id);
-    dx.innerHTML = '&nbsp;';
-    if( pe.tagName.toLowerCase() == 'body' ) {
-      pe.appendChild(dx);
-    }else if(pe.parentNode.lastChild==pe) {
-      pe.parentNode.appendChild(dx);
-    }else{
-      pe.parentNode.insertBefore(dx,pe.nextSibling);
-    }
-  } else if ((button_id=='dt')||(button_id=='dd')) { //definition term or description
-    pe = editor.getParentElement();
-    while (pe && (pe.nodeType == 1) && (pe.tagName.toLowerCase() != 'body')) {
-      if(pe.tagName.toLowerCase() == 'dl') {
-        dx = editor._doc.createElement(button_id);
-        dx.innerHTML = '&nbsp;';
-        pe.appendChild(dx);
-        break;
-      }else if((pe.tagName.toLowerCase() == 'dt')||(pe.tagName.toLowerCase() == 'dd')){
-        dx = editor._doc.createElement(button_id);
-        dx.innerHTML = '&nbsp;';
-        if(pe.parentNode.lastChild==pe) {
-        pe.parentNode.appendChild(dx);
-        }else{
-          pe.parentNode.insertBefore(dx,pe.nextSibling);
-        }
-        break;
-      }
-      pe = pe.parentNode;
-    }
-    if(pe.tagName.toLowerCase() == 'body')
-  alert('You can insert a definition term or description only in a definition list!');
-  }
-};
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/DefinitionList/definition-list.css b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/DefinitionList/definition-list.css
deleted file mode 100644
index 7ae59d5..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/DefinitionList/definition-list.css
+++ /dev/null
@@ -1,15 +0,0 @@
-dl { border: 1px dotted #800000; }
-dt {
-  background-image: url(img/ed_dt.gif);
-  background-repeat: no-repeat;
-  background-position: left top;
-  padding-left: 19px;
-  color: #800000;
-}
-dd {
-  background-image: url(img/ed_dd.gif);
-  background-repeat: no-repeat;
-  background-position: left top;
-  padding-left: 19px;
-  color: #800000;
-}
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/DefinitionList/img/ed_dd.gif b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/DefinitionList/img/ed_dd.gif
deleted file mode 100644
index 98b25de..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/DefinitionList/img/ed_dd.gif
+++ /dev/null
Binary files differ
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/DefinitionList/img/ed_dl.gif b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/DefinitionList/img/ed_dl.gif
deleted file mode 100644
index ae9b371..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/DefinitionList/img/ed_dl.gif
+++ /dev/null
Binary files differ
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/DefinitionList/img/ed_dt.gif b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/DefinitionList/img/ed_dt.gif
deleted file mode 100644
index b77770c..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/DefinitionList/img/ed_dt.gif
+++ /dev/null
Binary files differ
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/DefinitionList/lang/ja.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/DefinitionList/lang/ja.js
deleted file mode 100644
index 2a833d8..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/DefinitionList/lang/ja.js
+++ /dev/null
@@ -1,15 +0,0 @@
-// I18N constants
-// LANG: "ja", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "definition description": "定義の説明",
-    "definition list": "定義リスト",
-    "definition term": "定義語"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/DefinitionList/lang/lc_base.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/DefinitionList/lang/lc_base.js
deleted file mode 100644
index 501024d..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/DefinitionList/lang/lc_base.js
+++ /dev/null
@@ -1,27 +0,0 @@
-// I18N constants
-//
-// LANG: "en", ENCODING: UTF-8
-// Author: Translator-Name, <email@example.com>
-//
-// Last revision: 2018-04-12
-// 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).
-//
-// (Please, remove information below)
-// 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.)
-
-{
-    "definition description": "",
-    "definition list": "",
-    "definition term": ""
-}
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/DefinitionList/lang/nl.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/DefinitionList/lang/nl.js
deleted file mode 100644
index 16c1bd0..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/DefinitionList/lang/nl.js
+++ /dev/null
@@ -1,15 +0,0 @@
-// I18N constants
-// LANG: "nl", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "definition description": "definitie omschrijving",
-    "definition list": "definitie lijst",
-    "definition term": "definitie term"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/DefinitionList/lang/pt_br.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/DefinitionList/lang/pt_br.js
deleted file mode 100644
index 56a1c2f..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/DefinitionList/lang/pt_br.js
+++ /dev/null
@@ -1,15 +0,0 @@
-// I18N constants
-// LANG: "pt_br", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "definition description": "Descrição de definição",
-    "definition list": "Lista de definição",
-    "definition term": "Termo de definição"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/DefinitionList/lang/ru.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/DefinitionList/lang/ru.js
deleted file mode 100644
index a8d1ee2..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/DefinitionList/lang/ru.js
+++ /dev/null
@@ -1,15 +0,0 @@
-// I18N constants
-// LANG: "ru", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "definition description": "Пояснение",
-    "definition list": "Список с определением",
-    "definition term": "Заголовок"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/DynamicCSS/DynamicCSS.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/DynamicCSS/DynamicCSS.js
deleted file mode 100644
index be1a0f1..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/DynamicCSS/DynamicCSS.js
+++ /dev/null
@@ -1,237 +0,0 @@
-// Dynamic CSS (className) plugin for HTMLArea
-// Sponsored by http://www.systemconcept.de
-// Implementation by Holger Hees
-//
-// (c) systemconcept.de 2004
-// Distributed under the same terms as HTMLArea itself.
-// This notice MUST stay intact for use (see license.txt).
-
-function DynamicCSS(editor, args) {
-  this.editor = editor;
-  var cfg = editor.config;
-  var self = this;
-
-/*var cssArray=null;
-  var cssLength=0;*/
-  var lastTag=null;
-  var lastClass=null;
-
-  var css_class = {
-    id         : "DynamicCSS-class",
-    tooltip       : this._lc("Choose stylesheet"),
-    options    : {"":""},
-    action     : function(editor) { self.onSelect(editor, this); },
-    refresh    : function(editor) { self.updateValue(editor, this); }
-  };
-  cfg.registerDropdown(css_class);
-  cfg.addToolbarElement(["T[CSS]", "DynamicCSS-class", "separator"] , "formatblock", -1);
-}
-
-DynamicCSS.parseStyleSheet=function(editor){
-        iframe = editor._iframe.contentWindow.document;
-
-        cssArray=DynamicCSS.cssArray;
-        if(!cssArray) cssArray=new Array();
-
-        for(i=0;i<iframe.styleSheets.length;i++)
-        {
-            if(iframe.styleSheets[i].title == "XinhaInternalCSS") continue;
-            
-            // Mozilla
-            if(Xinha.is_gecko){
-                try{
-                    cssArray=DynamicCSS.applyCSSRule(iframe.styleSheets[i].cssRules,cssArray);
-                }
-                catch(e){
-                    //alert(e);
-                }
-            }
-            // IE
-            else {
-                try{
-                    if(iframe.styleSheets[i].rules){
-                        cssArray=DynamicCSS.applyCSSRule(iframe.styleSheets[i].rules,cssArray);
-                    }
-                    // @import StyleSheets (IE)
-                    if(iframe.styleSheets[i].imports){
-                        for(j=0;j<iframe.styleSheets[i].imports.length;j++){
-                            cssArray=DynamicCSS.applyCSSRule(iframe.styleSheets[i].imports[j].rules,cssArray);
-                        }
-                    }
-                }
-                catch(e){
-                    //alert(e);
-                }
-            }
-        }
-        DynamicCSS.cssArray=cssArray;
-};
-
-DynamicCSS.applyCSSRule=function(cssRules,cssArray){
-    for(rule in cssRules){
-        if(typeof cssRules[rule] == 'function') continue;
-        // StyleRule
-        if(cssRules[rule].selectorText){
-            if(cssRules[rule].selectorText.search(/:+/)==-1){
-
-                // split equal Styles (Mozilla-specific) e.q. head, body {border:0px}
-                // for ie not relevant. returns allways one element
-                cssElements = cssRules[rule].selectorText.split(",");
-                for(k=0;k<cssElements.length;k++){
-                    cssElement = cssElements[k].split(".");
-
-                    tagName=cssElement[0].toLowerCase().trim();
-                    className=cssElement[1];
-
-                    if(!tagName) tagName='all';
-                    if(!cssArray[tagName]) cssArray[tagName]=new Array();
-
-                    if(className){
-                        if(tagName=='all') cssName=className;
-                        else cssName='<'+className+'>';
-                    }
-                    else{
-                        className='none';
-                        if(tagName=='all') cssName=Xinha._lc("Default", 'DynamicCSS');
-                        else cssName='<'+Xinha._lc("Default", 'DynamicCSS')+'>';
-                    }
-                    cssArray[tagName][className]=cssName;
-                    DynamicCSS.cssLength++;
-                }
-            }
-        }
-        // ImportRule (Mozilla)
-        else if(cssRules[rule].styleSheet){
-            cssArray=DynamicCSS.applyCSSRule(cssRules[rule].styleSheet.cssRules,cssArray);
-        }
-    }
-    return cssArray;
-};
-
-DynamicCSS._pluginInfo = {
-  name          : "DynamicCSS",
-  version       : "1.5.2",
-  developer     : "Holger Hees",
-  developer_url : "http://www.systemconcept.de/",
-  c_owner       : "Holger Hees",
-  sponsor       : "System Concept GmbH",
-  sponsor_url   : "http://www.systemconcept.de/",
-  license       : "htmlArea"
-};
-
-DynamicCSS.prototype._lc = function(string) {
-    return Xinha._lc(string, 'DynamicCSS');
-};
-
-DynamicCSS.prototype.onSelect = function(editor, obj) {
-    var tbobj = editor._toolbarObjects[obj.id];
-    var index = tbobj.element.selectedIndex;
-    var className = tbobj.element.value;
-
-    var parent = editor.getParentElement();
-
-    if(className!='none'){
-        parent.className=className;
-        DynamicCSS.lastClass=className;
-    }
-    else{
-        if(Xinha.is_gecko) parent.removeAttribute('class');
-        else parent.removeAttribute('className');
-    }
-    editor.updateToolbar();
-};
-
-/*DynamicCSS.prototype.onMode = function(mode) {
-    if(mode=='wysiwyg'){
-        // reparse possible changed css files
-        DynamicCSS.cssArray=null;
-        this.updateValue(this.editor,this.editor.config.customSelects["DynamicCSS-class"]);
-    }
-}*/
-
-DynamicCSS.prototype.reparseTimer = function(editor, obj, instance) {
-    // new attempt of rescan stylesheets in 1,2,4 and 8 second (e.g. for external css-files with longer initialisation)
-    if(DynamicCSS.parseCount<9){
-        setTimeout(function () {
-            DynamicCSS.cssLength=0;
-            DynamicCSS.parseStyleSheet(editor);
-            if(DynamicCSS.cssOldLength!=DynamicCSS.cssLength){
-                DynamicCSS.cssOldLength=DynamicCSS.cssLength;
-                DynamicCSS.lastClass=null;
-                instance.updateValue(editor, obj);
-            }
-            instance.reparseTimer(editor, obj, instance);
-        },DynamicCSS.parseCount*1000);
-        DynamicCSS.parseCount=DynamicCSS.parseCount*2;
-    }
-};
-
-DynamicCSS.prototype.updateValue = function(editor, obj) {
-        cssArray=DynamicCSS.cssArray;
-        // initial style init
-        if(!cssArray){
-            DynamicCSS.cssLength=0;
-            DynamicCSS.parseStyleSheet(editor);
-            cssArray=DynamicCSS.cssArray;
-            DynamicCSS.cssOldLength=DynamicCSS.cssLength;
-            DynamicCSS.parseCount=1;
-            this.reparseTimer(editor,obj,this);
-        }
-
-        var parent = editor.getParentElement();
-        var tagName = parent.tagName.toLowerCase();
-        var className = parent.className;
-
-        if(this.lastTag!=tagName || this.lastClass!=className){
-            this.lastTag=tagName;
-            this.lastClass=className;
-
-            var select = editor._toolbarObjects[obj.id].element;
-
-            while(select.length>0){
-                select.options[select.length-1] = null;
-            }
-
-            select.options[0]=new Option(this._lc("Default"),'none');
-            if(cssArray){
-                // style class only allowed if parent tag is not body or editor is in fullpage mode
-                if(tagName!='body' || editor.config.fullPage){
-                    if(cssArray[tagName]){
-                        for(cssClass in cssArray[tagName]){
-                            if(typeof cssArray[tagName][cssClass] != 'string') continue;
-                            if(cssClass=='none') select.options[0]=new Option(cssArray[tagName][cssClass],cssClass);
-                            else select.options[select.length]=new Option(cssArray[tagName][cssClass],cssClass);
-                        }
-                    }
-
-                    if(cssArray['all']){
-                        for(cssClass in cssArray['all']){
-                            if(typeof cssArray['all'][cssClass] != 'string') continue;
-                            select.options[select.length]=new Option(cssArray['all'][cssClass],cssClass);
-                        }
-                    }
-                }
-                else if(cssArray[tagName] && cssArray[tagName]['none']) select.options[0]=new Option(cssArray[tagName]['none'],'none');
-            }
-
-            select.selectedIndex = 0;
-
-            if (typeof className != "undefined" && /\S/.test(className)) {
-                var options = select.options;
-                for (var i = options.length; --i >= 0;) {
-                    var option = options[i];
-                    if (className == option.value) {
-                            select.selectedIndex = i;
-                            break;
-                    }
-                }
-                if(select.selectedIndex == 0){
-                    select.options[select.length]=new Option(this._lc("Undefined"),className);
-                    select.selectedIndex=select.length-1;
-                }
-            }
-
-            if(select.length>1) select.disabled=false;
-            else select.disabled=true;
-        }
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/DynamicCSS/lang/de.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/DynamicCSS/lang/de.js
deleted file mode 100644
index 6c2a7c7..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/DynamicCSS/lang/de.js
+++ /dev/null
@@ -1,15 +0,0 @@
-// I18N constants
-// LANG: "de", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Choose stylesheet": "Wählen Sie einen StyleSheet aus",
-    "Default": "Standard",
-    "Undefined": "Nicht definiert"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/DynamicCSS/lang/fr.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/DynamicCSS/lang/fr.js
deleted file mode 100644
index 20ea7b8..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/DynamicCSS/lang/fr.js
+++ /dev/null
@@ -1,15 +0,0 @@
-// I18N constants
-// LANG: "fr", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Choose stylesheet": "Choisir feuille de style",
-    "Default": "Défaut",
-    "Undefined": "Non défini"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/DynamicCSS/lang/ja.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/DynamicCSS/lang/ja.js
deleted file mode 100644
index bcdcfed..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/DynamicCSS/lang/ja.js
+++ /dev/null
@@ -1,15 +0,0 @@
-// I18N constants
-// LANG: "ja", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Choose stylesheet": "スタイルシートの選択",
-    "Default": "なし",
-    "Undefined": "未定義"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/DynamicCSS/lang/lc_base.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/DynamicCSS/lang/lc_base.js
deleted file mode 100644
index 9a8c3d4..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/DynamicCSS/lang/lc_base.js
+++ /dev/null
@@ -1,27 +0,0 @@
-// I18N constants
-//
-// LANG: "en", ENCODING: UTF-8
-// Author: Translator-Name, <email@example.com>
-//
-// Last revision: 2018-04-12
-// 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).
-//
-// (Please, remove information below)
-// 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.)
-
-{
-    "Choose stylesheet": "",
-    "Default": "",
-    "Undefined": ""
-}
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/DynamicCSS/lang/nb.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/DynamicCSS/lang/nb.js
deleted file mode 100644
index 54b0848..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/DynamicCSS/lang/nb.js
+++ /dev/null
@@ -1,15 +0,0 @@
-// I18N constants
-// LANG: "nb", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Choose stylesheet": "Velg stilsett",
-    "Default": "Standard",
-    "Undefined": "Udefinert"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/DynamicCSS/lang/nl.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/DynamicCSS/lang/nl.js
deleted file mode 100644
index 5a84504..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/DynamicCSS/lang/nl.js
+++ /dev/null
@@ -1,15 +0,0 @@
-// I18N constants
-// LANG: "nl", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Choose stylesheet": "Kies stylesheet",
-    "Default": "Default",
-    "Undefined": "Ungedefinieerd"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/DynamicCSS/lang/pt_br.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/DynamicCSS/lang/pt_br.js
deleted file mode 100644
index 532c9eb..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/DynamicCSS/lang/pt_br.js
+++ /dev/null
@@ -1,15 +0,0 @@
-// I18N constants
-// LANG: "pt_br", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Choose stylesheet": "Escolher estilo",
-    "Default": "Padrão",
-    "Undefined": "Indefinido"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/EditTag/EditTag.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/EditTag/EditTag.js
deleted file mode 100644
index fb70de7..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/EditTag/EditTag.js
+++ /dev/null
@@ -1,56 +0,0 @@
-// Character Map plugin for Xinha

-// Sponsored by http://www.systemconcept.de

-// Implementation by Holger Hees based on HTMLArea XTD 1.5 (http://mosforge.net/projects/htmlarea3xtd/)

-// Original Author - Bernhard Pfeifer novocaine@gmx.net 

-//

-// (c) systemconcept.de 2004

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

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

-

-function EditTag(editor) {

-  this.editor = editor;

-	var cfg = editor.config;

-	var self = this;

-        

-	cfg.registerButton({

-                id       : "edittag",

-                tooltip  : this._lc("Edit HTML for selected text"),

-                image    : editor.imgURL("ed_edit_tag.gif", "EditTag"),

-                textMode : false,

-                action   : function(editor) {

-                             self.buttonPress(editor);

-                           }

-            });

-

-	cfg.addToolbarElement("edittag", "htmlmode",1);

-

-}

-

-EditTag._pluginInfo = {

-	name          : "EditTag",

-	version       : "1.0",

-	developer     : "Pegoraro Marco",

-	developer_url : "http://www.sin-italia.com/",

-	c_owner       : "Marco Pegoraro",

-	sponsor       : "Sin Italia",

-	sponsor_url   : "http://www.sin-italia.com/",

-	license       : "htmlArea"

-};

-

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

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

-};

-

-EditTag.prototype.buttonPress = function(editor) {

-	// Costruzione dell'oggetto parametri da passare alla dialog.

-	outparam = {

-		content : editor.getSelectedHTML()

-	}; // Fine costruzione parametri per il passaggio alla dialog.

-	editor._popupDialog( "plugin://EditTag/edit_tag", function( html ) {

-		if ( !html ) {  

-			//user must have pressed Cancel

-			return false;

-		}

-		editor.insertHTML( html );

-	}, outparam);

-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/EditTag/img/ed_edit_tag.gif b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/EditTag/img/ed_edit_tag.gif
deleted file mode 100644
index 79671fb..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/EditTag/img/ed_edit_tag.gif
+++ /dev/null
Binary files differ
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/EditTag/lang/ch.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/EditTag/lang/ch.js
deleted file mode 100644
index 9d78e44..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/EditTag/lang/ch.js
+++ /dev/null
@@ -1,14 +0,0 @@
-// I18N constants
-// LANG: "ch", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Cancel": "取消",
-    "OK": "好"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/EditTag/lang/cz.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/EditTag/lang/cz.js
deleted file mode 100644
index 36b9929..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/EditTag/lang/cz.js
+++ /dev/null
@@ -1,14 +0,0 @@
-// I18N constants
-// LANG: "cz", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Cancel": "Zrušit",
-    "OK": "OK"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/EditTag/lang/da.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/EditTag/lang/da.js
deleted file mode 100644
index 20fc0d0..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/EditTag/lang/da.js
+++ /dev/null
@@ -1,14 +0,0 @@
-// I18N constants
-// LANG: "da", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Cancel": "Annuller",
-    "OK": "OK"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/EditTag/lang/de.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/EditTag/lang/de.js
deleted file mode 100644
index bf19ed7..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/EditTag/lang/de.js
+++ /dev/null
@@ -1,16 +0,0 @@
-// I18N constants
-// LANG: "de", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Cancel": "Abbrechen",
-    "Edit HTML for selected text": "HTML im ausgewählten Bereich bearbeiten",
-    "OK": "OK",
-    "Tag Editor": "HTML tag Editor"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/EditTag/lang/ee.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/EditTag/lang/ee.js
deleted file mode 100644
index ba916e9..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/EditTag/lang/ee.js
+++ /dev/null
@@ -1,14 +0,0 @@
-// I18N constants
-// LANG: "ee", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Cancel": "Loobu",
-    "OK": "OK"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/EditTag/lang/el.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/EditTag/lang/el.js
deleted file mode 100644
index f6e006c..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/EditTag/lang/el.js
+++ /dev/null
@@ -1,14 +0,0 @@
-// I18N constants
-// LANG: "el", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Cancel": "Ακύρωση",
-    "OK": "Εντάξει"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/EditTag/lang/es.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/EditTag/lang/es.js
deleted file mode 100644
index ff36248..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/EditTag/lang/es.js
+++ /dev/null
@@ -1,16 +0,0 @@
-// I18N constants
-// LANG: "es", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Cancel": "Cancelar",
-    "Edit HTML for selected text": "Editar código HTML del texto seleccionado",
-    "OK": "Aceptar",
-    "Tag Editor": "Editor de Etiquetas"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/EditTag/lang/eu.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/EditTag/lang/eu.js
deleted file mode 100644
index 3bc9dbb..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/EditTag/lang/eu.js
+++ /dev/null
@@ -1,14 +0,0 @@
-// I18N constants
-// LANG: "eu", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Cancel": "Utzi",
-    "OK": "Ados"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/EditTag/lang/fa.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/EditTag/lang/fa.js
deleted file mode 100644
index 84e7f7e..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/EditTag/lang/fa.js
+++ /dev/null
@@ -1,14 +0,0 @@
-// I18N constants
-// LANG: "fa", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Cancel": "انصراف",
-    "OK": "بله"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/EditTag/lang/fi.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/EditTag/lang/fi.js
deleted file mode 100644
index 82552b9..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/EditTag/lang/fi.js
+++ /dev/null
@@ -1,14 +0,0 @@
-// I18N constants
-// LANG: "fi", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Cancel": "Peruuta",
-    "OK": "Hyväksy"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/EditTag/lang/fr.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/EditTag/lang/fr.js
deleted file mode 100644
index 330b923..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/EditTag/lang/fr.js
+++ /dev/null
@@ -1,16 +0,0 @@
-// I18N constants
-// LANG: "fr", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Cancel": "Annuler",
-    "Edit HTML for selected text": "Editer le code HTML du texte sélectionné",
-    "OK": "OK",
-    "Tag Editor": "Editeur de tag HTML"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/EditTag/lang/he.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/EditTag/lang/he.js
deleted file mode 100644
index a602f7c..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/EditTag/lang/he.js
+++ /dev/null
@@ -1,14 +0,0 @@
-// I18N constants
-// LANG: "he", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Cancel": "ביטול",
-    "OK": "אישור"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/EditTag/lang/hu.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/EditTag/lang/hu.js
deleted file mode 100644
index b38528d..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/EditTag/lang/hu.js
+++ /dev/null
@@ -1,14 +0,0 @@
-// I18N constants
-// LANG: "hu", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Cancel": "Mégsem",
-    "OK": "Rendben"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/EditTag/lang/it.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/EditTag/lang/it.js
deleted file mode 100644
index a0acb45..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/EditTag/lang/it.js
+++ /dev/null
@@ -1,14 +0,0 @@
-// I18N constants
-// LANG: "it", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Cancel": "Annullamento",
-    "OK": "OK"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/EditTag/lang/ja.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/EditTag/lang/ja.js
deleted file mode 100644
index 1a5c43a..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/EditTag/lang/ja.js
+++ /dev/null
@@ -1,16 +0,0 @@
-// I18N constants
-// LANG: "ja", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Cancel": "中止",
-    "Edit HTML for selected text": "選択中テキストのHTMLを編集します",
-    "OK": "OK",
-    "Tag Editor": "タグエディタ"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/EditTag/lang/lc_base.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/EditTag/lang/lc_base.js
deleted file mode 100644
index afcf510..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/EditTag/lang/lc_base.js
+++ /dev/null
@@ -1,29 +0,0 @@
-// I18N constants
-//
-// LANG: "en", ENCODING: UTF-8
-// Author: Translator-Name, <email@example.com>
-//
-// Last revision: 2018-04-12
-// 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).
-//
-// (Please, remove information below)
-// 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.)
-
-{
-    "Cancel": "",
-    "Edit HTML for selected text": "",
-    "Edit Tag By Peg": "",
-    "OK": "",
-    "Tag Editor": ""
-}
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/EditTag/lang/lt.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/EditTag/lang/lt.js
deleted file mode 100644
index d118909..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/EditTag/lang/lt.js
+++ /dev/null
@@ -1,14 +0,0 @@
-// I18N constants
-// LANG: "lt", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Cancel": "Atšaukti",
-    "OK": "OK"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/EditTag/lang/lv.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/EditTag/lang/lv.js
deleted file mode 100644
index f83d5d3..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/EditTag/lang/lv.js
+++ /dev/null
@@ -1,14 +0,0 @@
-// I18N constants
-// LANG: "lv", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Cancel": "Atcelt",
-    "OK": "Labi"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/EditTag/lang/nb.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/EditTag/lang/nb.js
deleted file mode 100644
index 2d074f2..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/EditTag/lang/nb.js
+++ /dev/null
@@ -1,15 +0,0 @@
-// I18N constants
-// LANG: "nb", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Cancel": "Avbryt",
-    "Edit HTML for selected text": "Rediger HTML for den valgte teksten",
-    "OK": "OK"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/EditTag/lang/nl.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/EditTag/lang/nl.js
deleted file mode 100644
index 4c8b252..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/EditTag/lang/nl.js
+++ /dev/null
@@ -1,16 +0,0 @@
-// I18N constants
-// LANG: "nl", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Cancel": "Annuleren",
-    "Edit HTML for selected text": "HTML bewerken voor geselecteerde tekst",
-    "OK": "OK",
-    "Tag Editor": "HTML tag Editor"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/EditTag/lang/pl.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/EditTag/lang/pl.js
deleted file mode 100644
index 7779afc..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/EditTag/lang/pl.js
+++ /dev/null
@@ -1,14 +0,0 @@
-// I18N constants
-// LANG: "pl", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Cancel": "Anuluj",
-    "OK": "OK"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/EditTag/lang/pt_br.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/EditTag/lang/pt_br.js
deleted file mode 100644
index 4159227..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/EditTag/lang/pt_br.js
+++ /dev/null
@@ -1,17 +0,0 @@
-// I18N constants
-// LANG: "pt_br", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Cancel": "Cancelar",
-    "Edit HTML for selected text": "Editar HTML para texto selecionado",
-    "Edit Tag By Peg": "Editar Tag por Peg",
-    "OK": "OK",
-    "Tag Editor": "Editor de Tag"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/EditTag/lang/ro.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/EditTag/lang/ro.js
deleted file mode 100644
index 9d6e1c3..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/EditTag/lang/ro.js
+++ /dev/null
@@ -1,14 +0,0 @@
-// I18N constants
-// LANG: "ro", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Cancel": "Renunţă",
-    "OK": "Acceptă"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/EditTag/lang/ru.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/EditTag/lang/ru.js
deleted file mode 100644
index fad59f2..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/EditTag/lang/ru.js
+++ /dev/null
@@ -1,14 +0,0 @@
-// I18N constants
-// LANG: "ru", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Cancel": "Отмена",
-    "OK": "OK"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/EditTag/lang/sh.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/EditTag/lang/sh.js
deleted file mode 100644
index 62e76f7..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/EditTag/lang/sh.js
+++ /dev/null
@@ -1,14 +0,0 @@
-// I18N constants
-// LANG: "sh", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Cancel": "Poništi",
-    "OK": "OK"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/EditTag/lang/si.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/EditTag/lang/si.js
deleted file mode 100644
index 7674892..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/EditTag/lang/si.js
+++ /dev/null
@@ -1,14 +0,0 @@
-// I18N constants
-// LANG: "si", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Cancel": "Prekliči",
-    "OK": "V redu"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/EditTag/lang/sr.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/EditTag/lang/sr.js
deleted file mode 100644
index b7ee6f5..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/EditTag/lang/sr.js
+++ /dev/null
@@ -1,14 +0,0 @@
-// I18N constants
-// LANG: "sr", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Cancel": "Поништи",
-    "OK": "OK"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/EditTag/lang/sv.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/EditTag/lang/sv.js
deleted file mode 100644
index 98336d8..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/EditTag/lang/sv.js
+++ /dev/null
@@ -1,14 +0,0 @@
-// I18N constants
-// LANG: "sv", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Cancel": "Avbryt",
-    "OK": "OK"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/EditTag/lang/th.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/EditTag/lang/th.js
deleted file mode 100644
index 9da9c8d..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/EditTag/lang/th.js
+++ /dev/null
@@ -1,14 +0,0 @@
-// I18N constants
-// LANG: "th", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Cancel": "ยกเลิก",
-    "OK": "ตกลง"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/EditTag/lang/tr.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/EditTag/lang/tr.js
deleted file mode 100644
index d55844d..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/EditTag/lang/tr.js
+++ /dev/null
@@ -1,16 +0,0 @@
-// I18N constants
-// LANG: "tr", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Cancel": "İptal",
-    "Edit HTML for selected text": "Seçilen metin için HTML düzenlemesi yap",
-    "OK": "Tamam",
-    "Tag Editor": "HTML etiket düzenleyicisi"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/EditTag/lang/vn.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/EditTag/lang/vn.js
deleted file mode 100644
index 2d82e02..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/EditTag/lang/vn.js
+++ /dev/null
@@ -1,14 +0,0 @@
-// I18N constants
-// LANG: "vn", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Cancel": "Hủy",
-    "OK": "Đồng ý"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/EditTag/popups/edit_tag.html b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/EditTag/popups/edit_tag.html
deleted file mode 100644
index 2eeb541..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/EditTag/popups/edit_tag.html
+++ /dev/null
@@ -1,38 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">

-<html>

-<head>

-  <title>Edit Tag By Peg</title>

-  <link rel="stylesheet" type="text/css" href="../../../popups/popup.css" />

-  <script type="text/javascript" src="../../../popups/popup.js"></script>

-<script language="javascript">

-  window.resizeTo(600, 450);

-function Init() {

-  __dlg_translate("EditTag");

-  __dlg_init();

-

-  var param = window.dialogArguments;

-  document.getElementById("TAG").value = param["content"];

-  document.getElementById("TAG").focus();

-}

-

-function onCancel() {

-  __dlg_close( null );

-  return false;

-}

-

-function onOK() {

-  var ret = document.getElementById("TAG").value;

-  __dlg_close( ret );

-}

-</script>

-</head>

-

-<body class="dialog" onLoad="Init();">

-<div class="title">Tag Editor</div>

-<textarea name="TAG" id="TAG" cols=22 rows=5 style="width: 100%; height: 315px; margin-top: 8px; margin-bottom: 4px; font-family: monospace; font-size: 11px;"></textarea>

-<div id="buttons">

-    <button type="submit" name="ok" onclick="return onOK();">OK</button>

-    <button type="button" name="cancel" onclick="return onCancel();">Cancel</button>

-</div>

-</body>

-</html>

diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/EncodeOutput/EncodeOutput.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/EncodeOutput/EncodeOutput.js
deleted file mode 100644
index 48b7ded..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/EncodeOutput/EncodeOutput.js
+++ /dev/null
@@ -1,264 +0,0 @@
-/**
- EncodeOutput for Xinha
- ===============================================================================
-     
- At the last moment before submitting, encode the textarea into one of various 
- encodings, also decode it if the textarea is loaded with encoded content.
- 
- This is done to protect against mod_security problems, by encoding it before
- submitting then there is less chance that mod_security will detect your 
- html submission as something unpleasant.
- 
- Encoding style is specified via a configuration option, for example
- 
- {{{
-   xinha_config.EncodeOutput.encoder = 'r13';
- }}}
- 
- The available encodings are:
-   
- * r13   - html is rot13 (alphanum only is rotated)      -- prefix :!r13!:
- * b64   - html is base64 encoded                        -- prefix :!b64!:
- * 64r   - html is base64 encoded and then that is rot13 -- prefix :!64r!:
- * r64   - html is rot13 and then that is base64         -- prefix :!r64!:
- * false - no encoding performed (decoding still will if prefixed)
-  
- You will of course need to detect the prefix (eg :!r13!:) on fields in your 
- server side code and unencode them, for example in PHP you can do..
-   
- if(preg_match('/^(:!r13!:)/', $_POST['myHtmlArea']))
- {
-   // Remove the prefix
-   $_POST['myHtmlArea'] = (string) substr($_POST['myHtmlArea'], 7);
-   
-   // rot13 it
-   $_POST['myHtmlArea'] = str_rot13($_POST['myHtmlArea']);
- }
- elseif(preg_match('/^(:!b64!:)/', $_POST['myHtmlArea']))
- {
-   // Remove the prefix
-   $_POST['myHtmlArea'] = (string) substr($_POST['myHtmlArea'], 7);
-   
-   // b64 it
-   $_POST['myHtmlArea'] = base64_decode($_POST['myHtmlArea']);
- }
- elseif(preg_match('/^(:!64r!:)/', $_POST['myHtmlArea']))
- {
-   // Remove the prefix
-   $_POST['myHtmlArea'] = (string) substr($_POST['myHtmlArea'], 7);
-   
-   // rot13 it
-   $_POST['myHtmlArea'] = str_rot13($_POST['myHtmlArea']);
-   
-   // b64 it
-   $_POST['myHtmlArea'] = base64_decode($_POST['myHtmlArea']);
- }
- elseif(preg_match('/^(:!64r!:)/', $_POST['myHtmlArea']))
- {
-   // Remove the prefix
-   $_POST['myHtmlArea'] = (string) substr($_POST['myHtmlArea'], 7);
-   
-   // b64 it
-   $_POST['myHtmlArea'] = base64_decode($_POST['myHtmlArea']);
-   
-   // rot13 it
-   $_POST['myHtmlArea'] = str_rot13($_POST['myHtmlArea']);
- }
-
-*/
-
-EncodeOutput._pluginInfo = {
-  name          : "EncodeOutput",
-  version       : "1.0",
-  developer     : "Gogo Internet Services Limited",
-  developer_url : "http://www.gogo.co.nz",
-  sponsor       : "",
-  sponsor_url   : "",
-  license       : "htmlArea"
-}
-
-Xinha.Config.prototype.EncodeOutput = 
-{
-  // One of
-  // 
-  //   r13   - html is rot13 (alphanum only is rotated)      -- prefix :!r13!:
-  //   b64   - html is base64 encoded                        -- prefix :!b64!:
-  //   64r   - html is base64 encoded and then that is rot13 -- prefix :!64r!:
-  //   r64   - html is rot13 and then that is base64         -- prefix :!r64!:
-  //
-  //   false - no encoding performed (decoding still will if prefixed)
-  
-  encoder:   'r13'
-  
-}
-
-function EncodeOutput(editor)
-{
-  this.editor = editor;
-}
-
-EncodeOutput.prototype.rot13 = function (s)
-{
-  return (s ? s : this).split('').map(function(_)
-  {
-      if (!_.match(/[A-Za-z]/)) return _;
-      c = Math.floor(_.charCodeAt(0) / 97);
-      k = (_.toLowerCase().charCodeAt(0) - 83) % 26 || 26;
-      return String.fromCharCode(k + ((c == 0) ? 64 : 96));
-  }).join('');
-}
-
-EncodeOutput.prototype.unrot13 = function (s)
-{
-  return this.rot13(s);
-}
-
-EncodeOutput.prototype.b64 = function (s)
-{
-  return Xinha.base64_encode(s);
-}
-
-EncodeOutput.prototype.unb64 = function (s)
-{
-  return Xinha.base64_decode(s);
-}
-
-EncodeOutput.prototype.onGenerate = function ()
-{
-
-}
-EncodeOutput.prototype.onGenerateOnce = function ()
-{
-
-}
-
-/* If the inward html is r13, de-encode it.
- * note that we do not encode in outwardHtml because we don't want
- * to mess up the source code view, this de-code in inward is just
- * to catch any left-overs when you use the back button, or submit 
- * in code view mode.
- */
-
-EncodeOutput.prototype.inwardHtml = function(html)
-{
-  if(html.match(/^:!r13!:/))
-  {
-    // Clean up a hanging rot13, this will happen if the form is submitted
-    // while in text mode, and it's submitted to a new window/tab
-    html = this.unrot13(html.substring(7));
-  }    
-  else if(html.match(/^:!b64:!/))
-  {
-    html = this.unb64(html.substring(7));
-  }
-  else if(html.match(/^:!64r!:/))
-  {
-    html = this.unb64(this.unrot13(html.substring(7)));
-  }
-  else if(html.match(/^:!r64!:/))
-  {
-    html = this.unrot13(this.unb64(html.substring(7)));
-  }
-  
-  return html;
-}
-
-EncodeOutput.prototype.outwardHtml = function(html)
-{
-  return html;
-}
-
-EncodeOutput.prototype.onUpdateToolbar = function ()
-{
-  return false;
-}
-
-EncodeOutput.prototype.onExecCommand = function ( cmdID, UI, param )
-{
-  return false;
-}
-
-EncodeOutput.prototype.onKeyPress = function ( event )
-{
-  return false;
-}
-
-EncodeOutput.prototype.onMouseDown = function ( event )
-{
-  return false;
-}
-
-EncodeOutput.prototype.onBeforeSubmit = function ()
-{
-  return false;
-}
-
-EncodeOutput.prototype.onBeforeSubmitTextArea = function()
-{    
-  switch(this.editor.config.EncodeOutput.encoder)
-  {
-    case 'r64':
-      this.editor._textArea.value = ':!r64!:' + this.b64(this.rot13(this.editor._textArea.value));
-      break;
-      
-    case '64r':
-      this.editor._textArea.value = ':!64r!:' + this.rot13(this.b64(this.editor._textArea.value));
-      break;
-      
-    case 'b64':
-      this.editor._textArea.value = ':!b64!:' + this.b64(this.editor._textArea.value);
-      break;
-          
-    case 'r13':
-      this.editor._textArea.value = ':!r13!:' + this.rot13(this.editor._textArea.value); 
-      break;
-  }
-  
-  var e = this;
-  window.setTimeout(function(){ e.editor._textArea.value = e.inwardHtml(e.editor._textArea.value); }, 2000);
-  
-  return false;
-}
-
-EncodeOutput.prototype.onBeforeUnload = function ()
-{
-  return false;
-}
-
-EncodeOutput.prototype.onBeforeResize = function (width, height)
-{
-  return false;
-}
-
-EncodeOutput.prototype.onResize = function (width, height)
-{
-  return false;
-}
-
-/**
- * 
- * @param {String} action one of 'add', 'remove', 'hide', 'show', 'multi_hide', 'multi_show'
- * @param {DOMNode|Array} panel either the panel itself or an array like ['left','right','top','bottom']
- */
-EncodeOutput.prototype.onPanelChange = function (action, panel)
-{
-  return false;
-}
-/**
- * 
- * @param {String} mode either 'textmode' or 'wysiwyg'
- */
-EncodeOutput.prototype.onMode = function (mode)
-{
-  return false;
-}
-
-/**
- * 
- * @param {String} mode either 'textmode' or 'wysiwyg'
- */
-EncodeOutput.prototype.onBeforeMode = function (mode)
-{
-
-  return false;
-}
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/Equation/ASCIIMathML.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/Equation/ASCIIMathML.js
deleted file mode 100644
index f90a797..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/Equation/ASCIIMathML.js
+++ /dev/null
@@ -1,3364 +0,0 @@
-/*
-ASCIIMathML.js
-==============
-This file contains JavaScript functions to convert ASCII math notation
-and LaTeX to Presentation MathML. Simple graphics commands are also
-translated to SVG images. The conversion is done while the (X)HTML 
-page loads, and should work with Firefox/Mozilla/Netscape 7+ and Internet 
-Explorer 6/7 + MathPlayer (http://www.dessci.com/en/products/mathplayer/) +
-Adobe SVGview 3.03 (http://www.adobe.com/svg/viewer/install/).
-
-Just add the next line to your (X)HTML page with this file in the same folder:
-
-<script type="text/javascript" src="ASCIIMathML.js"></script>
-
-(using the graphics in IE also requires the file "d.svg" in the same folder).
-This is a convenient and inexpensive solution for authoring MathML and SVG.
-
-Version 2.1 Oct 8, 2008, (c) Peter Jipsen http://www.chapman.edu/~jipsen
-This version extends ASCIIMathML.js with LaTeXMathML.js and ASCIIsvg.js.
-Latest version at http://www.chapman.edu/~jipsen/mathml/ASCIIMathML.js
-If you use it on a webpage, please send the URL to jipsen@chapman.edu
-
-The LaTeXMathML modifications were made by Douglas Woodall, June 2006.
-(for details see header on the LaTeXMathML part in middle of file)
-Extensive clean-up and improvements by Paulo Soares, Oct 2007.
-
-This program is free software; you can redistribute it and/or modify
-it under the terms of the GNU Lesser General Public License as published by
-the Free Software Foundation; either version 2.1 of the License, or (at
-your option) any later version.
-
-This program is distributed in the hope that it will be useful, but WITHOUT 
-ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS 
-FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License 
-(at http://www.gnu.org/licences/lgpl.html) for more details.
-*/
-
-var mathcolor = "blue";        // change it to "" (to inherit) or another color
-var mathfontsize = "1em";      // change to e.g. 1.2em for larger math
-var mathfontfamily = "serif";  // change to "" to inherit (works in IE) 
-                               // or another family (e.g. "arial")
-var automathrecognize = false; // writing "amath" on page makes this true
-var checkForMathML = true;     // check if browser can display MathML
-var notifyIfNoMathML = true;   // display note at top if no MathML capability
-var alertIfNoMathML = false;   // show alert box if no MathML capability
-var translateOnLoad = true;    // set to false to do call translators from js 
-var translateLaTeX = true;     // false to preserve $..$, $$..$$
-var translateLaTeXformatting = true; // false to preserve \emph,\begin{},\end{}
-var translateASCIIMath = true; // false to preserve `..`
-var translateASCIIsvg = true;  // false to preserve agraph.., \begin{graph}..
-var avoidinnerHTML = false;   // set true if assigning to innerHTML gives error
-var displaystyle = true;      // puts limits above and below large operators
-var showasciiformulaonhover = true; // helps students learn ASCIIMath
-var decimalsign = ".";        // change to "," if you like, beware of `(1,2)`!
-var AMdelimiter1 = "`", AMescape1 = "\\\\`"; // can use other characters
-var AMdocumentId = "wikitext" // PmWiki element containing math (default=body)
-var checkforprocessasciimathinmoodle = false; // true for systems like Moodle
-var dsvglocation = ""; // path to d.svg (blank if same as ASCIIMathML.js loc)
-
-/*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
-
-var isIE = document.createElementNS==null;
-var noMathML = false, translated = false;
-
-if (isIE) { // avoid adding MathPlayer info explicitly to each webpage
-  document.write("<object id=\"mathplayer\"\
-  classid=\"clsid:32F66A20-7614-11D4-BD11-00104BD3F987\"></object>");
-  document.write("<?import namespace=\"m\" implementation=\"#mathplayer\"?>");
-}
-
-// Add a stylesheet, replacing any previous custom stylesheet (adapted from TW)
-function setStylesheet(s) {
-	var id = "AMMLcustomStyleSheet";
-	var n = document.getElementById(id);
-	if(document.createStyleSheet) {
-		// Test for IE's non-standard createStyleSheet method
-		if(n)
-			n.parentNode.removeChild(n);
-		// This failed without the &nbsp;
-		document.getElementsByTagName("head")[0].insertAdjacentHTML("beforeEnd","&nbsp;<style id='" + id + "'>" + s + "</style>");
-	} else {
-		if(n) {
-			n.replaceChild(document.createTextNode(s),n.firstChild);
-		} else {
-			n = document.createElement("style");
-			n.type = "text/css";
-			n.id = id;
-			n.appendChild(document.createTextNode(s));
-			document.getElementsByTagName("head")[0].appendChild(n);
-		}
-	}
-}
-
-setStylesheet("#AMMLcloseDiv \{font-size:0.8em; padding-top:1em; color:#014\}\n#AMMLwarningBox \{position:absolute; width:100%; top:0; left:0; z-index:200; text-align:center; font-size:1em; font-weight:bold; padding:0.5em 0 0.5em 0; color:#ffc; background:#c30\}");
-
-function init(){
-	var msg, warnings = new Array();
-	if (document.getElementById==null){
-		alert("This webpage requires a recent browser such as Mozilla Firefox/Netscape 7+ or Internet Explorer 6+ with MathPlayer and Adobe SVGviewer");
-		return null;
-	}
-	if (checkForMathML && (msg = checkMathML())) warnings.push(msg);
-	if (checkIfSVGavailable && (msg = checkSVG())) warnings.push(msg);
-	if (warnings.length>0) displayWarnings(warnings);
-	if (!noMathML) initSymbols();
-	return true;
-}
-
-function checkMathML(){
-  if (navigator.appName.slice(0,8)=="Netscape") 
-    if (navigator.appVersion.slice(0,1)>="5") noMathML = null;
-    else noMathML = true;
-  else if (navigator.appName.slice(0,9)=="Microsoft")
-    try {
-        var ActiveX = new ActiveXObject("MathPlayer.Factory.1");
-        noMathML = null;
-    } catch (e) {
-        noMathML = true;
-    }
-  else if (navigator.appName.slice(0,5)=="Opera") 
-    if (navigator.appVersion.slice(0,3)>="9.5") noMathML = null;
-  else noMathML = true;
-//noMathML = true; //uncomment to check
-  if (noMathML && notifyIfNoMathML) {
-    var msg = "To view the ASCIIMathML notation use Internet Explorer + MathPlayer or Mozilla Firefox 2.0 or later.";
-    if (alertIfNoMathML)
-       alert(msg);
-    else return msg;
-  }
-}
-
-function hideWarning(){
-	var body = document.getElementsByTagName("body")[0];
-	body.removeChild(document.getElementById('AMMLwarningBox'));
-	body.onclick = null;
-}
-
-function displayWarnings(warnings) {
-  var i, frag, nd = createElementXHTML("div");
-  var body = document.getElementsByTagName("body")[0];
-  body.onclick=hideWarning;
-  nd.id = 'AMMLwarningBox';
-  for (i=0; i<warnings.length; i++) {
-	frag = createElementXHTML("div");
-	frag.appendChild(document.createTextNode(warnings[i]));
-	frag.style.paddingBottom = "1.0em";
-	nd.appendChild(frag);
-  }
-  nd.appendChild(createElementXHTML("p"));
-  nd.appendChild(document.createTextNode("For instructions see the "));
-  var an = createElementXHTML("a");
-  an.appendChild(document.createTextNode("ASCIIMathML"));
-  an.setAttribute("href","http://www.chapman.edu/~jipsen/asciimath.html");
-  nd.appendChild(an);
-  nd.appendChild(document.createTextNode(" homepage"));
-  an = createElementXHTML("div");
-  an.id = 'AMMLcloseDiv';
-  an.appendChild(document.createTextNode('(click anywhere to close this warning)'));
-  nd.appendChild(an);
-  var body = document.getElementsByTagName("body")[0];
-  body.insertBefore(nd,body.childNodes[0]);
-}
-
-function translate(spanclassAM) {
-  if (!translated) { // run this only once
-    translated = true;
-    var body = document.getElementsByTagName("body")[0];
-    var processN = document.getElementById(AMdocumentId);
-    if (translateLaTeX) LMprocessNode((processN!=null?processN:body));
-    if (translateASCIIMath) AMprocessNode((processN!=null?processN:body), false, spanclassAM);
-  }
-}
-
-function createElementXHTML(t) {
-  if (isIE) return document.createElement(t);
-  else return document.createElementNS("http://www.w3.org/1999/xhtml",t);
-}
-
-function createMmlNode(t,frag) {
-  if (isIE) var node = document.createElement("m:"+t);
-  else var node = document.createElementNS("http://www.w3.org/1998/Math/MathML",t);
-  if (frag) node.appendChild(frag);
-  return node;
-}
-
-// character lists for Mozilla/Netscape fonts
-var AMcal = [0xEF35,0x212C,0xEF36,0xEF37,0x2130,0x2131,0xEF38,0x210B,0x2110,0xEF39,0xEF3A,0x2112,0x2133,0xEF3B,0xEF3C,0xEF3D,0xEF3E,0x211B,0xEF3F,0xEF40,0xEF41,0xEF42,0xEF43,0xEF44,0xEF45,0xEF46];
-var AMfrk = [0xEF5D,0xEF5E,0x212D,0xEF5F,0xEF60,0xEF61,0xEF62,0x210C,0x2111,0xEF63,0xEF64,0xEF65,0xEF66,0xEF67,0xEF68,0xEF69,0xEF6A,0x211C,0xEF6B,0xEF6C,0xEF6D,0xEF6E,0xEF6F,0xEF70,0xEF71,0x2128];
-var AMbbb = [0xEF8C,0xEF8D,0x2102,0xEF8E,0xEF8F,0xEF90,0xEF91,0x210D,0xEF92,0xEF93,0xEF94,0xEF95,0xEF96,0x2115,0xEF97,0x2119,0x211A,0x211D,0xEF98,0xEF99,0xEF9A,0xEF9B,0xEF9C,0xEF9D,0xEF9E,0x2124];
-
-var CONST = 0, UNARY = 1, BINARY = 2, INFIX = 3, LEFTBRACKET = 4,
-    RIGHTBRACKET = 5, SPACE = 6, UNDEROVER = 7, DEFINITION = 8,
-    LEFTRIGHT = 9, TEXT = 10, BIG = 11, LONG = 12, STRETCHY = 13,
-    MATRIX = 14;; // token types
-
-var AMquote = {input:"\"",   tag:"mtext", output:"mbox", tex:null, ttype:TEXT};
-
-var AMsymbols = [
-//some greek symbols
-{input:"alpha",  tag:"mi", output:"\u03B1", tex:null, ttype:CONST},
-{input:"beta",   tag:"mi", output:"\u03B2", tex:null, ttype:CONST},
-{input:"chi",    tag:"mi", output:"\u03C7", tex:null, ttype:CONST},
-{input:"delta",  tag:"mi", output:"\u03B4", tex:null, ttype:CONST},
-{input:"Delta",  tag:"mo", output:"\u0394", tex:null, ttype:CONST},
-{input:"epsi",   tag:"mi", output:"\u03B5", tex:"epsilon", ttype:CONST},
-{input:"varepsilon", tag:"mi", output:"\u025B", tex:null, ttype:CONST},
-{input:"eta",    tag:"mi", output:"\u03B7", tex:null, ttype:CONST},
-{input:"gamma",  tag:"mi", output:"\u03B3", tex:null, ttype:CONST},
-{input:"Gamma",  tag:"mo", output:"\u0393", tex:null, ttype:CONST},
-{input:"iota",   tag:"mi", output:"\u03B9", tex:null, ttype:CONST},
-{input:"kappa",  tag:"mi", output:"\u03BA", tex:null, ttype:CONST},
-{input:"lambda", tag:"mi", output:"\u03BB", tex:null, ttype:CONST},
-{input:"Lambda", tag:"mo", output:"\u039B", tex:null, ttype:CONST},
-{input:"mu",     tag:"mi", output:"\u03BC", tex:null, ttype:CONST},
-{input:"nu",     tag:"mi", output:"\u03BD", tex:null, ttype:CONST},
-{input:"omega",  tag:"mi", output:"\u03C9", tex:null, ttype:CONST},
-{input:"Omega",  tag:"mo", output:"\u03A9", tex:null, ttype:CONST},
-{input:"phi",    tag:"mi", output:"\u03C6", tex:null, ttype:CONST},
-{input:"varphi", tag:"mi", output:"\u03D5", tex:null, ttype:CONST},
-{input:"Phi",    tag:"mo", output:"\u03A6", tex:null, ttype:CONST},
-{input:"pi",     tag:"mi", output:"\u03C0", tex:null, ttype:CONST},
-{input:"Pi",     tag:"mo", output:"\u03A0", tex:null, ttype:CONST},
-{input:"psi",    tag:"mi", output:"\u03C8", tex:null, ttype:CONST},
-{input:"Psi",    tag:"mi", output:"\u03A8", tex:null, ttype:CONST},
-{input:"rho",    tag:"mi", output:"\u03C1", tex:null, ttype:CONST},
-{input:"sigma",  tag:"mi", output:"\u03C3", tex:null, ttype:CONST},
-{input:"Sigma",  tag:"mo", output:"\u03A3", tex:null, ttype:CONST},
-{input:"tau",    tag:"mi", output:"\u03C4", tex:null, ttype:CONST},
-{input:"theta",  tag:"mi", output:"\u03B8", tex:null, ttype:CONST},
-{input:"vartheta", tag:"mi", output:"\u03D1", tex:null, ttype:CONST},
-{input:"Theta",  tag:"mo", output:"\u0398", tex:null, ttype:CONST},
-{input:"upsilon", tag:"mi", output:"\u03C5", tex:null, ttype:CONST},
-{input:"xi",     tag:"mi", output:"\u03BE", tex:null, ttype:CONST},
-{input:"Xi",     tag:"mo", output:"\u039E", tex:null, ttype:CONST},
-{input:"zeta",   tag:"mi", output:"\u03B6", tex:null, ttype:CONST},
-
-//binary operation symbols
-//{input:"-",  tag:"mo", output:"\u0096", tex:null, ttype:CONST},
-{input:"*",  tag:"mo", output:"\u22C5", tex:"cdot", ttype:CONST},
-{input:"**", tag:"mo", output:"\u22C6", tex:"star", ttype:CONST},
-{input:"//", tag:"mo", output:"/",      tex:null, ttype:CONST},
-{input:"\\\\", tag:"mo", output:"\\",   tex:"backslash", ttype:CONST},
-{input:"setminus", tag:"mo", output:"\\", tex:null, ttype:CONST},
-{input:"xx", tag:"mo", output:"\u00D7", tex:"times", ttype:CONST},
-{input:"-:", tag:"mo", output:"\u00F7", tex:"divide", ttype:CONST},
-{input:"@",  tag:"mo", output:"\u26AC", tex:"circ", ttype:CONST},
-{input:"o+", tag:"mo", output:"\u2295", tex:"oplus", ttype:CONST},
-{input:"ox", tag:"mo", output:"\u2297", tex:"otimes", ttype:CONST},
-{input:"o.", tag:"mo", output:"\u2299", tex:"odot", ttype:CONST},
-{input:"sum", tag:"mo", output:"\u2211", tex:null, ttype:UNDEROVER},
-{input:"prod", tag:"mo", output:"\u220F", tex:null, ttype:UNDEROVER},
-{input:"^^",  tag:"mo", output:"\u2227", tex:"wedge", ttype:CONST},
-{input:"^^^", tag:"mo", output:"\u22C0", tex:"bigwedge", ttype:UNDEROVER},
-{input:"vv",  tag:"mo", output:"\u2228", tex:"vee", ttype:CONST},
-{input:"vvv", tag:"mo", output:"\u22C1", tex:"bigvee", ttype:UNDEROVER},
-{input:"nn",  tag:"mo", output:"\u2229", tex:"cap", ttype:CONST},
-{input:"nnn", tag:"mo", output:"\u22C2", tex:"bigcap", ttype:UNDEROVER},
-{input:"uu",  tag:"mo", output:"\u222A", tex:"cup", ttype:CONST},
-{input:"uuu", tag:"mo", output:"\u22C3", tex:"bigcup", ttype:UNDEROVER},
-
-//binary relation symbols
-{input:"!=",  tag:"mo", output:"\u2260", tex:"ne", ttype:CONST},
-{input:":=",  tag:"mo", output:":=",     tex:null, ttype:CONST},
-{input:"lt",  tag:"mo", output:"<",      tex:null, ttype:CONST},
-{input:"<=",  tag:"mo", output:"\u2264", tex:"le", ttype:CONST},
-{input:"lt=", tag:"mo", output:"\u2264", tex:"leq", ttype:CONST},
-{input:">=",  tag:"mo", output:"\u2265", tex:"ge", ttype:CONST},
-{input:"geq", tag:"mo", output:"\u2265", tex:null, ttype:CONST},
-{input:"-<",  tag:"mo", output:"\u227A", tex:"prec", ttype:CONST},
-{input:"-lt", tag:"mo", output:"\u227A", tex:null, ttype:CONST},
-{input:">-",  tag:"mo", output:"\u227B", tex:"succ", ttype:CONST},
-{input:"-<=", tag:"mo", output:"\u2AAF", tex:"preceq", ttype:CONST},
-{input:">-=", tag:"mo", output:"\u2AB0", tex:"succeq", ttype:CONST},
-{input:"in",  tag:"mo", output:"\u2208", tex:null, ttype:CONST},
-{input:"!in", tag:"mo", output:"\u2209", tex:"notin", ttype:CONST},
-{input:"sub", tag:"mo", output:"\u2282", tex:"subset", ttype:CONST},
-{input:"sup", tag:"mo", output:"\u2283", tex:"supset", ttype:CONST},
-{input:"sube", tag:"mo", output:"\u2286", tex:"subseteq", ttype:CONST},
-{input:"supe", tag:"mo", output:"\u2287", tex:"supseteq", ttype:CONST},
-{input:"-=",  tag:"mo", output:"\u2261", tex:"equiv", ttype:CONST},
-{input:"~=",  tag:"mo", output:"\u2245", tex:"cong", ttype:CONST},
-{input:"~~",  tag:"mo", output:"\u2248", tex:"approx", ttype:CONST},
-{input:"prop", tag:"mo", output:"\u221D", tex:"propto", ttype:CONST},
-
-//logical symbols
-{input:"and", tag:"mtext", output:"and", tex:null, ttype:SPACE},
-{input:"or",  tag:"mtext", output:"or",  tex:null, ttype:SPACE},
-{input:"not", tag:"mo", output:"\u00AC", tex:"neg", ttype:CONST},
-{input:"=>",  tag:"mo", output:"\u21D2", tex:"implies", ttype:CONST},
-{input:"if",  tag:"mo", output:"if",     tex:null, ttype:SPACE},
-{input:"<=>", tag:"mo", output:"\u21D4", tex:"iff", ttype:CONST},
-{input:"AA",  tag:"mo", output:"\u2200", tex:"forall", ttype:CONST},
-{input:"EE",  tag:"mo", output:"\u2203", tex:"exists", ttype:CONST},
-{input:"_|_", tag:"mo", output:"\u22A5", tex:"bot", ttype:CONST},
-{input:"TT",  tag:"mo", output:"\u22A4", tex:"top", ttype:CONST},
-{input:"|--",  tag:"mo", output:"\u22A2", tex:"vdash", ttype:CONST},
-{input:"|==",  tag:"mo", output:"\u22A8", tex:"models", ttype:CONST},
-
-//grouping brackets
-{input:"(", tag:"mo", output:"(", tex:null, ttype:LEFTBRACKET},
-{input:")", tag:"mo", output:")", tex:null, ttype:RIGHTBRACKET},
-{input:"[", tag:"mo", output:"[", tex:null, ttype:LEFTBRACKET},
-{input:"]", tag:"mo", output:"]", tex:null, ttype:RIGHTBRACKET},
-{input:"{", tag:"mo", output:"{", tex:null, ttype:LEFTBRACKET},
-{input:"}", tag:"mo", output:"}", tex:null, ttype:RIGHTBRACKET},
-{input:"|", tag:"mo", output:"|", tex:null, ttype:LEFTRIGHT},
-//{input:"||", tag:"mo", output:"||", tex:null, ttype:LEFTRIGHT},
-{input:"(:", tag:"mo", output:"\u2329", tex:"langle", ttype:LEFTBRACKET},
-{input:":)", tag:"mo", output:"\u232A", tex:"rangle", ttype:RIGHTBRACKET},
-{input:"<<", tag:"mo", output:"\u2329", tex:null, ttype:LEFTBRACKET},
-{input:">>", tag:"mo", output:"\u232A", tex:null, ttype:RIGHTBRACKET},
-{input:"{:", tag:"mo", output:"{:", tex:null, ttype:LEFTBRACKET, invisible:true},
-{input:":}", tag:"mo", output:":}", tex:null, ttype:RIGHTBRACKET, invisible:true},
-
-//miscellaneous symbols
-{input:"int",  tag:"mo", output:"\u222B", tex:null, ttype:CONST},
-{input:"dx",   tag:"mi", output:"{:d x:}", tex:null, ttype:DEFINITION},
-{input:"dy",   tag:"mi", output:"{:d y:}", tex:null, ttype:DEFINITION},
-{input:"dz",   tag:"mi", output:"{:d z:}", tex:null, ttype:DEFINITION},
-{input:"dt",   tag:"mi", output:"{:d t:}", tex:null, ttype:DEFINITION},
-{input:"oint", tag:"mo", output:"\u222E", tex:null, ttype:CONST},
-{input:"del",  tag:"mo", output:"\u2202", tex:"partial", ttype:CONST},
-{input:"grad", tag:"mo", output:"\u2207", tex:"nabla", ttype:CONST},
-{input:"+-",   tag:"mo", output:"\u00B1", tex:"pm", ttype:CONST},
-{input:"O/",   tag:"mo", output:"\u2205", tex:"emptyset", ttype:CONST},
-{input:"oo",   tag:"mo", output:"\u221E", tex:"infty", ttype:CONST},
-{input:"aleph", tag:"mo", output:"\u2135", tex:null, ttype:CONST},
-{input:"...",  tag:"mo", output:"...",    tex:"ldots", ttype:CONST},
-{input:":.",  tag:"mo", output:"\u2234",  tex:"therefore", ttype:CONST},
-{input:"/_",  tag:"mo", output:"\u2220",  tex:"angle", ttype:CONST},
-{input:"\\ ",  tag:"mo", output:"\u00A0", tex:null, ttype:CONST},
-{input:"quad", tag:"mo", output:"\u00A0\u00A0", tex:null, ttype:CONST},
-{input:"qquad", tag:"mo", output:"\u00A0\u00A0\u00A0\u00A0", tex:null, ttype:CONST},
-{input:"cdots", tag:"mo", output:"\u22EF", tex:null, ttype:CONST},
-{input:"vdots", tag:"mo", output:"\u22EE", tex:null, ttype:CONST},
-{input:"ddots", tag:"mo", output:"\u22F1", tex:null, ttype:CONST},
-{input:"diamond", tag:"mo", output:"\u22C4", tex:null, ttype:CONST},
-{input:"square", tag:"mo", output:"\u25A1", tex:null, ttype:CONST},
-{input:"|__", tag:"mo", output:"\u230A",  tex:"lfloor", ttype:CONST},
-{input:"__|", tag:"mo", output:"\u230B",  tex:"rfloor", ttype:CONST},
-{input:"|~", tag:"mo", output:"\u2308",  tex:"lceiling", ttype:CONST},
-{input:"~|", tag:"mo", output:"\u2309",  tex:"rceiling", ttype:CONST},
-{input:"CC",  tag:"mo", output:"\u2102", tex:null, ttype:CONST},
-{input:"NN",  tag:"mo", output:"\u2115", tex:null, ttype:CONST},
-{input:"QQ",  tag:"mo", output:"\u211A", tex:null, ttype:CONST},
-{input:"RR",  tag:"mo", output:"\u211D", tex:null, ttype:CONST},
-{input:"ZZ",  tag:"mo", output:"\u2124", tex:null, ttype:CONST},
-{input:"f",   tag:"mi", output:"f",      tex:null, ttype:UNARY, func:true},
-{input:"g",   tag:"mi", output:"g",      tex:null, ttype:UNARY, func:true},
-
-//standard functions
-{input:"lim",  tag:"mo", output:"lim", tex:null, ttype:UNDEROVER},
-{input:"Lim",  tag:"mo", output:"Lim", tex:null, ttype:UNDEROVER},
-{input:"sin",  tag:"mo", output:"sin", tex:null, ttype:UNARY, func:true},
-{input:"cos",  tag:"mo", output:"cos", tex:null, ttype:UNARY, func:true},
-{input:"tan",  tag:"mo", output:"tan", tex:null, ttype:UNARY, func:true},
-{input:"sinh", tag:"mo", output:"sinh", tex:null, ttype:UNARY, func:true},
-{input:"cosh", tag:"mo", output:"cosh", tex:null, ttype:UNARY, func:true},
-{input:"tanh", tag:"mo", output:"tanh", tex:null, ttype:UNARY, func:true},
-{input:"cot",  tag:"mo", output:"cot", tex:null, ttype:UNARY, func:true},
-{input:"sec",  tag:"mo", output:"sec", tex:null, ttype:UNARY, func:true},
-{input:"csc",  tag:"mo", output:"csc", tex:null, ttype:UNARY, func:true},
-{input:"log",  tag:"mo", output:"log", tex:null, ttype:UNARY, func:true},
-{input:"ln",   tag:"mo", output:"ln",  tex:null, ttype:UNARY, func:true},
-{input:"det",  tag:"mo", output:"det", tex:null, ttype:UNARY, func:true},
-{input:"dim",  tag:"mo", output:"dim", tex:null, ttype:CONST},
-{input:"mod",  tag:"mo", output:"mod", tex:null, ttype:CONST},
-{input:"gcd",  tag:"mo", output:"gcd", tex:null, ttype:UNARY, func:true},
-{input:"lcm",  tag:"mo", output:"lcm", tex:null, ttype:UNARY, func:true},
-{input:"lub",  tag:"mo", output:"lub", tex:null, ttype:CONST},
-{input:"glb",  tag:"mo", output:"glb", tex:null, ttype:CONST},
-{input:"min",  tag:"mo", output:"min", tex:null, ttype:UNDEROVER},
-{input:"max",  tag:"mo", output:"max", tex:null, ttype:UNDEROVER},
-
-//arrows
-{input:"uarr", tag:"mo", output:"\u2191", tex:"uparrow", ttype:CONST},
-{input:"darr", tag:"mo", output:"\u2193", tex:"downarrow", ttype:CONST},
-{input:"rarr", tag:"mo", output:"\u2192", tex:"rightarrow", ttype:CONST},
-{input:"->",   tag:"mo", output:"\u2192", tex:"to", ttype:CONST},
-{input:">->",   tag:"mo", output:"\u21A3", tex:"rightarrowtail", ttype:CONST},
-{input:"->>",   tag:"mo", output:"\u21A0", tex:"twoheadrightarrow", ttype:CONST},
-{input:">->>",   tag:"mo", output:"\u2916", tex:"twoheadrightarrowtail", ttype:CONST},
-{input:"|->",  tag:"mo", output:"\u21A6", tex:"mapsto", ttype:CONST},
-{input:"larr", tag:"mo", output:"\u2190", tex:"leftarrow", ttype:CONST},
-{input:"harr", tag:"mo", output:"\u2194", tex:"leftrightarrow", ttype:CONST},
-{input:"rArr", tag:"mo", output:"\u21D2", tex:"Rightarrow", ttype:CONST},
-{input:"lArr", tag:"mo", output:"\u21D0", tex:"Leftarrow", ttype:CONST},
-{input:"hArr", tag:"mo", output:"\u21D4", tex:"Leftrightarrow", ttype:CONST},
-//commands with argument
-{input:"sqrt", tag:"msqrt", output:"sqrt", tex:null, ttype:UNARY},
-{input:"root", tag:"mroot", output:"root", tex:null, ttype:BINARY},
-{input:"frac", tag:"mfrac", output:"/",    tex:null, ttype:BINARY},
-{input:"/",    tag:"mfrac", output:"/",    tex:null, ttype:INFIX},
-{input:"stackrel", tag:"mover", output:"stackrel", tex:null, ttype:BINARY},
-{input:"_",    tag:"msub",  output:"_",    tex:null, ttype:INFIX},
-{input:"^",    tag:"msup",  output:"^",    tex:null, ttype:INFIX},
-{input:"hat", tag:"mover", output:"\u005E", tex:null, ttype:UNARY, acc:true},
-{input:"bar", tag:"mover", output:"\u00AF", tex:"overline", ttype:UNARY, acc:true},
-{input:"vec", tag:"mover", output:"\u2192", tex:null, ttype:UNARY, acc:true},
-{input:"dot", tag:"mover", output:".",      tex:null, ttype:UNARY, acc:true},
-{input:"ddot", tag:"mover", output:"..",    tex:null, ttype:UNARY, acc:true},
-{input:"ul", tag:"munder", output:"\u0332", tex:"underline", ttype:UNARY, acc:true},
-{input:"text", tag:"mtext", output:"text", tex:null, ttype:TEXT},
-{input:"mbox", tag:"mtext", output:"mbox", tex:null, ttype:TEXT},
-AMquote,
-{input:"bb", tag:"mstyle", atname:"fontweight", atval:"bold", output:"bb", tex:null, ttype:UNARY},
-{input:"mathbf", tag:"mstyle", atname:"fontweight", atval:"bold", output:"mathbf", tex:null, ttype:UNARY},
-{input:"sf", tag:"mstyle", atname:"fontfamily", atval:"sans-serif", output:"sf", tex:null, ttype:UNARY},
-{input:"mathsf", tag:"mstyle", atname:"fontfamily", atval:"sans-serif", output:"mathsf", tex:null, ttype:UNARY},
-{input:"bbb", tag:"mstyle", atname:"mathvariant", atval:"double-struck", output:"bbb", tex:null, ttype:UNARY, codes:AMbbb},
-{input:"mathbb", tag:"mstyle", atname:"mathvariant", atval:"double-struck", output:"mathbb", tex:null, ttype:UNARY, codes:AMbbb},
-{input:"cc",  tag:"mstyle", atname:"mathvariant", atval:"script", output:"cc", tex:null, ttype:UNARY, codes:AMcal},
-{input:"mathcal", tag:"mstyle", atname:"mathvariant", atval:"script", output:"mathcal", tex:null, ttype:UNARY, codes:AMcal},
-{input:"tt",  tag:"mstyle", atname:"fontfamily", atval:"monospace", output:"tt", tex:null, ttype:UNARY},
-{input:"mathtt", tag:"mstyle", atname:"fontfamily", atval:"monospace", output:"mathtt", tex:null, ttype:UNARY},
-{input:"fr",  tag:"mstyle", atname:"mathvariant", atval:"fraktur", output:"fr", tex:null, ttype:UNARY, codes:AMfrk},
-{input:"mathfrak",  tag:"mstyle", atname:"mathvariant", atval:"fraktur", output:"mathfrak", tex:null, ttype:UNARY, codes:AMfrk}
-];
-
-function compareNames(s1,s2) {
-  if (s1.input > s2.input) return 1
-  else return -1;
-}
-
-var AMnames = []; //list of input symbols
-
-function initSymbols() {
-  var texsymbols = [], i;
-  for (i=0; i<AMsymbols.length; i++)
-    if (AMsymbols[i].tex) 
-      texsymbols[texsymbols.length] = {input:AMsymbols[i].tex, 
-        tag:AMsymbols[i].tag, output:AMsymbols[i].output, ttype:AMsymbols[i].ttype};
-  AMsymbols = AMsymbols.concat(texsymbols);
-  refreshSymbols();
-}
-
-function refreshSymbols(){
-  var i;
-  AMsymbols.sort(compareNames);
-  for (i=0; i<AMsymbols.length; i++) AMnames[i] = AMsymbols[i].input;
-  LMsymbols.sort(compareNames);
-  for (i=0; i<LMsymbols.length; i++) LMnames[i] = LMsymbols[i].input;
-}
-
-function define(oldstr,newstr) {
-  if(oldstr.substr(0,1)=="\\")
-    LMsymbols = LMsymbols.concat([{input:oldstr, tag:"mo", output:newstr,
-                                 ttype:DEFINITION}]);
-  else
-    AMsymbols = AMsymbols.concat([{input:oldstr, tag:"mo", output:newstr, 
-                                 tex:null, ttype:DEFINITION}]);
-  refreshSymbols(); // this may be a problem if many symbols are defined!
-}
-
-function AMremoveCharsAndBlanks(str,n) {
-//remove n characters and any following blanks
-  var st;
-  if (str.charAt(n)=="\\" && str.charAt(n+1)!="\\" && str.charAt(n+1)!=" ") 
-    st = str.slice(n+1);
-  else st = str.slice(n);
-  for (var i=0; i<st.length && st.charCodeAt(i)<=32; i=i+1);
-  return st.slice(i);
-}
-
-function position(arr, str, n) { 
-// return position >=n where str appears or would be inserted
-// assumes arr is sorted
-  if (n==0) {
-    var h,m;
-    n = -1;
-    h = arr.length;
-    while (n+1<h) {
-      m = (n+h) >> 1;
-      if (arr[m]<str) n = m; else h = m;
-    }
-    return h;
-  } else
-    for (var i=n; i<arr.length && arr[i]<str; i++);
-  return i; // i=arr.length || arr[i]>=str
-}
-
-function AMgetSymbol(str) {
-//return maximal initial substring of str that appears in names
-//return null if there is none
-  var k = 0; //new pos
-  var j = 0; //old pos
-  var mk; //match pos
-  var st;
-  var tagst;
-  var match = "";
-  var more = true;
-  for (var i=1; i<=str.length && more; i++) {
-    st = str.slice(0,i); //initial substring of length i
-    j = k;
-    k = position(AMnames, st, j);
-    if (k<AMnames.length && str.slice(0,AMnames[k].length)==AMnames[k]){
-      match = AMnames[k];
-      mk = k;
-      i = match.length;
-    }
-    more = k<AMnames.length && str.slice(0,AMnames[k].length)>=AMnames[k];
-  }
-  AMpreviousSymbol=AMcurrentSymbol;
-  if (match!=""){
-    AMcurrentSymbol=AMsymbols[mk].ttype;
-    return AMsymbols[mk]; 
-  }
-// if str[0] is a digit or - return maxsubstring of digits.digits
-  AMcurrentSymbol=CONST;
-  k = 1;
-  st = str.slice(0,1);
-  var integ = true;
-  while ("0"<=st && st<="9" && k<=str.length) {
-    st = str.slice(k,k+1);
-    k++;
-  }
-  if (st == decimalsign) {
-    st = str.slice(k,k+1);
-    if ("0"<=st && st<="9") {
-      integ = false;
-      k++;
-      while ("0"<=st && st<="9" && k<=str.length) {
-        st = str.slice(k,k+1);
-        k++;
-      }
-    }
-  }
-  if ((integ && k>1) || k>2) {
-    st = str.slice(0,k-1);
-    tagst = "mn";
-  } else {
-    k = 2;
-    st = str.slice(0,1); //take 1 character
-    tagst = (("A">st || st>"Z") && ("a">st || st>"z")?"mo":"mi");
-  }
-  if (st=="-" && AMpreviousSymbol==INFIX) {
-    AMcurrentSymbol = INFIX;  //trick "/" into recognizing "-" on second parse
-    return {input:st, tag:tagst, output:st, ttype:UNARY, func:true};
-  }
-  return {input:st, tag:tagst, output:st, ttype:CONST};
-}
-
-function AMremoveBrackets(node) {
-  var st;
-  if (node.nodeName=="mrow") {
-    st = node.firstChild.firstChild.nodeValue;
-    if (st=="(" || st=="[" || st=="{") node.removeChild(node.firstChild);
-  }
-  if (node.nodeName=="mrow") {
-    st = node.lastChild.firstChild.nodeValue;
-    if (st==")" || st=="]" || st=="}") node.removeChild(node.lastChild);
-  }
-}
-
-/*Parsing ASCII math expressions with the following grammar
-v ::= [A-Za-z] | greek letters | numbers | other constant symbols
-u ::= sqrt | text | bb | other unary symbols for font commands
-b ::= frac | root | stackrel         binary symbols
-l ::= ( | [ | { | (: | {:            left brackets
-r ::= ) | ] | } | :) | :}            right brackets
-S ::= v | lEr | uS | bSS             Simple expression
-I ::= S_S | S^S | S_S^S | S          Intermediate expression
-E ::= IE | I/I                       Expression
-Each terminal symbol is translated into a corresponding mathml node.*/
-
-var AMnestingDepth,AMpreviousSymbol,AMcurrentSymbol;
-
-function AMparseSexpr(str) { //parses str and returns [node,tailstr]
-  var symbol, node, result, i, st,// rightvert = false,
-    newFrag = document.createDocumentFragment();
-  str = AMremoveCharsAndBlanks(str,0);
-  symbol = AMgetSymbol(str);             //either a token or a bracket or empty
-  if (symbol == null || symbol.ttype == RIGHTBRACKET && AMnestingDepth > 0) {
-    return [null,str];
-  }
-  if (symbol.ttype == DEFINITION) {
-    str = symbol.output+AMremoveCharsAndBlanks(str,symbol.input.length); 
-    symbol = AMgetSymbol(str);
-  }
-  switch (symbol.ttype) {  case UNDEROVER:
-  case CONST:
-    str = AMremoveCharsAndBlanks(str,symbol.input.length); 
-    return [createMmlNode(symbol.tag,        //its a constant
-                             document.createTextNode(symbol.output)),str];
-  case LEFTBRACKET:   //read (expr+)
-    AMnestingDepth++;
-    str = AMremoveCharsAndBlanks(str,symbol.input.length); 
-    result = AMparseExpr(str,true);
-    AMnestingDepth--;
-    if (typeof symbol.invisible == "boolean" && symbol.invisible) 
-      node = createMmlNode("mrow",result[0]);
-    else {
-      node = createMmlNode("mo",document.createTextNode(symbol.output));
-      node = createMmlNode("mrow",node);
-      node.appendChild(result[0]);
-    }
-    return [node,result[1]];
-  case TEXT:
-      if (symbol!=AMquote) str = AMremoveCharsAndBlanks(str,symbol.input.length);
-      if (str.charAt(0)=="{") i=str.indexOf("}");
-      else if (str.charAt(0)=="(") i=str.indexOf(")");
-      else if (str.charAt(0)=="[") i=str.indexOf("]");
-      else if (symbol==AMquote) i=str.slice(1).indexOf("\"")+1;
-      else i = 0;
-      if (i==-1) i = str.length;
-      st = str.slice(1,i);
-      if (st.charAt(0) == " ") {
-        node = createMmlNode("mspace");
-        node.setAttribute("width","1ex");
-        newFrag.appendChild(node);
-      }
-      newFrag.appendChild(
-        createMmlNode(symbol.tag,document.createTextNode(st)));
-      if (st.charAt(st.length-1) == " ") {
-        node = createMmlNode("mspace");
-        node.setAttribute("width","1ex");
-        newFrag.appendChild(node);
-      }
-      str = AMremoveCharsAndBlanks(str,i+1);
-      return [createMmlNode("mrow",newFrag),str];
-  case UNARY:
-      str = AMremoveCharsAndBlanks(str,symbol.input.length); 
-      result = AMparseSexpr(str);
-      if (result[0]==null) return [createMmlNode(symbol.tag,
-                             document.createTextNode(symbol.output)),str];
-      if (typeof symbol.func == "boolean" && symbol.func) { // functions hack
-        st = str.charAt(0);
-        if (st=="^" || st=="_" || st=="/" || st=="|" || st==",") {
-          return [createMmlNode(symbol.tag,
-                    document.createTextNode(symbol.output)),str];
-        } else {
-          node = createMmlNode("mrow",
-           createMmlNode(symbol.tag,document.createTextNode(symbol.output)));
-          node.appendChild(result[0]);
-          return [node,result[1]];
-        }
-      }
-      AMremoveBrackets(result[0]);
-      if (symbol.input == "sqrt") {           // sqrt
-        return [createMmlNode(symbol.tag,result[0]),result[1]];
-      } else if (typeof symbol.acc == "boolean" && symbol.acc) {   // accent
-        node = createMmlNode(symbol.tag,result[0]);
-        node.appendChild(createMmlNode("mo",document.createTextNode(symbol.output)));
-        return [node,result[1]];
-      } else {                        // font change command
-        if (!isIE && typeof symbol.codes != "undefined") {
-          for (i=0; i<result[0].childNodes.length; i++)
-            if (result[0].childNodes[i].nodeName=="mi" || result[0].nodeName=="mi") {
-              st = (result[0].nodeName=="mi"?result[0].firstChild.nodeValue:
-                              result[0].childNodes[i].firstChild.nodeValue);
-              var newst = [];
-              for (var j=0; j<st.length; j++)
-                if (st.charCodeAt(j)>64 && st.charCodeAt(j)<91) newst = newst +
-                  String.fromCharCode(symbol.codes[st.charCodeAt(j)-65]);
-                else newst = newst + st.charAt(j);
-              if (result[0].nodeName=="mi")
-                result[0]=createMmlNode("mo").
-                          appendChild(document.createTextNode(newst));
-              else result[0].replaceChild(createMmlNode("mo").
-                               appendChild(document.createTextNode(newst)),
-                                           result[0].childNodes[i]);
-            }
-        }
-        node = createMmlNode(symbol.tag,result[0]);
-        node.setAttribute(symbol.atname,symbol.atval);
-        return [node,result[1]];
-      }
-  case BINARY:
-    str = AMremoveCharsAndBlanks(str,symbol.input.length); 
-    result = AMparseSexpr(str);
-    if (result[0]==null) return [createMmlNode("mo",
-                           document.createTextNode(symbol.input)),str];
-    AMremoveBrackets(result[0]);
-    var result2 = AMparseSexpr(result[1]);
-    if (result2[0]==null) return [createMmlNode("mo",
-                           document.createTextNode(symbol.input)),str];
-    AMremoveBrackets(result2[0]);
-    if (symbol.input=="root" || symbol.input=="stackrel") 
-      newFrag.appendChild(result2[0]);
-    newFrag.appendChild(result[0]);
-    if (symbol.input=="frac") newFrag.appendChild(result2[0]);
-    return [createMmlNode(symbol.tag,newFrag),result2[1]];
-  case INFIX:
-    str = AMremoveCharsAndBlanks(str,symbol.input.length); 
-    return [createMmlNode("mo",document.createTextNode(symbol.output)),str];
-  case SPACE:
-    str = AMremoveCharsAndBlanks(str,symbol.input.length); 
-    node = createMmlNode("mspace");
-    node.setAttribute("width","1ex");
-    newFrag.appendChild(node);
-    newFrag.appendChild(
-      createMmlNode(symbol.tag,document.createTextNode(symbol.output)));
-    node = createMmlNode("mspace");
-    node.setAttribute("width","1ex");
-    newFrag.appendChild(node);
-    return [createMmlNode("mrow",newFrag),str];
-  case LEFTRIGHT:
-//    if (rightvert) return [null,str]; else rightvert = true;
-    AMnestingDepth++;
-    str = AMremoveCharsAndBlanks(str,symbol.input.length); 
-    result = AMparseExpr(str,false);
-    AMnestingDepth--;
-    var st = "";
-    if (result[0].lastChild!=null)
-      st = result[0].lastChild.firstChild.nodeValue;
-    if (st == "|") { // its an absolute value subterm
-      node = createMmlNode("mo",document.createTextNode(symbol.output));
-      node = createMmlNode("mrow",node);
-      node.appendChild(result[0]);
-      return [node,result[1]];
-    } else { // the "|" is a \mid so use unicode 2223 (divides) for spacing
-      node = createMmlNode("mo",document.createTextNode("\u2223"));
-      node = createMmlNode("mrow",node);
-      return [node,str];
-    }
-  default:
-//alert("default");
-    str = AMremoveCharsAndBlanks(str,symbol.input.length); 
-    return [createMmlNode(symbol.tag,        //its a constant
-                             document.createTextNode(symbol.output)),str];
-  }
-}
-
-function AMparseIexpr(str) {
-  var symbol, sym1, sym2, node, result, underover;
-  str = AMremoveCharsAndBlanks(str,0);
-  sym1 = AMgetSymbol(str);
-  result = AMparseSexpr(str);
-  node = result[0];
-  str = result[1];
-  symbol = AMgetSymbol(str);
-  if (symbol.ttype == INFIX && symbol.input != "/") {
-    str = AMremoveCharsAndBlanks(str,symbol.input.length);
-//    if (symbol.input == "/") result = AMparseIexpr(str); else ...
-    result = AMparseSexpr(str);
-    if (result[0] == null) // show box in place of missing argument
-      result[0] = createMmlNode("mo",document.createTextNode("\u25A1"));
-    else AMremoveBrackets(result[0]);
-    str = result[1];
-//    if (symbol.input == "/") AMremoveBrackets(node);
-    if (symbol.input == "_") {
-      sym2 = AMgetSymbol(str);
-      underover = (sym1.ttype == UNDEROVER);
-      if (sym2.input == "^") {
-        str = AMremoveCharsAndBlanks(str,sym2.input.length);
-        var res2 = AMparseSexpr(str);
-        AMremoveBrackets(res2[0]);
-        str = res2[1];
-        node = createMmlNode((underover?"munderover":"msubsup"),node);
-        node.appendChild(result[0]);
-        node.appendChild(res2[0]);
-        node = createMmlNode("mrow",node); // so sum does not stretch
-      } else {
-        node = createMmlNode((underover?"munder":"msub"),node);
-        node.appendChild(result[0]);
-      }
-    } else {
-      node = createMmlNode(symbol.tag,node);
-      node.appendChild(result[0]);
-    }
-  }
-  return [node,str];
-}
-
-function AMparseExpr(str,rightbracket) {
-  var symbol, node, result, i, nodeList = [],
-  newFrag = document.createDocumentFragment();
-  do {
-    str = AMremoveCharsAndBlanks(str,0);
-    result = AMparseIexpr(str);
-    node = result[0];
-    str = result[1];
-    symbol = AMgetSymbol(str);
-    if (symbol.ttype == INFIX && symbol.input == "/") {
-      str = AMremoveCharsAndBlanks(str,symbol.input.length);
-      result = AMparseIexpr(str);
-      if (result[0] == null) // show box in place of missing argument
-        result[0] = createMmlNode("mo",document.createTextNode("\u25A1"));
-      else AMremoveBrackets(result[0]);
-      str = result[1];
-      AMremoveBrackets(node);
-      node = createMmlNode(symbol.tag,node);
-      node.appendChild(result[0]);
-      newFrag.appendChild(node);
-      symbol = AMgetSymbol(str);
-    } 
-    else if (node!=undefined) newFrag.appendChild(node);
-  } while ((symbol.ttype != RIGHTBRACKET && 
-           (symbol.ttype != LEFTRIGHT || rightbracket)
-           || AMnestingDepth == 0) && symbol!=null && symbol.output!="");
-  if (symbol.ttype == RIGHTBRACKET || symbol.ttype == LEFTRIGHT) {
-//    if (AMnestingDepth > 0) AMnestingDepth--;
-    var len = newFrag.childNodes.length;
-    if (len>0 && newFrag.childNodes[len-1].nodeName == "mrow" && len>1 &&
-      newFrag.childNodes[len-2].nodeName == "mo" &&
-      newFrag.childNodes[len-2].firstChild.nodeValue == ",") { //matrix
-      var right = newFrag.childNodes[len-1].lastChild.firstChild.nodeValue;
-      if (right==")" || right=="]") {
-        var left = newFrag.childNodes[len-1].firstChild.firstChild.nodeValue;
-        if (left=="(" && right==")" && symbol.output != "}" || 
-            left=="[" && right=="]") {
-        var pos = []; // positions of commas
-        var matrix = true;
-        var m = newFrag.childNodes.length;
-        for (i=0; matrix && i<m; i=i+2) {
-          pos[i] = [];
-          node = newFrag.childNodes[i];
-          if (matrix) matrix = node.nodeName=="mrow" && 
-            (i==m-1 || node.nextSibling.nodeName=="mo" && 
-            node.nextSibling.firstChild.nodeValue==",")&&
-            node.firstChild.firstChild.nodeValue==left &&
-            node.lastChild.firstChild.nodeValue==right;
-          if (matrix) 
-            for (var j=0; j<node.childNodes.length; j++)
-              if (node.childNodes[j].firstChild.nodeValue==",")
-                pos[i][pos[i].length]=j;
-          if (matrix && i>1) matrix = pos[i].length == pos[i-2].length;
-        }
-        if (matrix) {
-          var row, frag, n, k, table = document.createDocumentFragment();
-          for (i=0; i<m; i=i+2) {
-            row = document.createDocumentFragment();
-            frag = document.createDocumentFragment();
-            node = newFrag.firstChild; // <mrow>(-,-,...,-,-)</mrow>
-            n = node.childNodes.length;
-            k = 0;
-            node.removeChild(node.firstChild); //remove (
-            for (j=1; j<n-1; j++) {
-              if (typeof pos[i][k] != "undefined" && j==pos[i][k]){
-                node.removeChild(node.firstChild); //remove ,
-                row.appendChild(createMmlNode("mtd",frag));
-                k++;
-              } else frag.appendChild(node.firstChild);
-            }
-            row.appendChild(createMmlNode("mtd",frag));
-            if (newFrag.childNodes.length>2) {
-              newFrag.removeChild(newFrag.firstChild); //remove <mrow>)</mrow>
-              newFrag.removeChild(newFrag.firstChild); //remove <mo>,</mo>
-            }
-            table.appendChild(createMmlNode("mtr",row));
-          }
-          node = createMmlNode("mtable",table);
-          if (typeof symbol.invisible == "boolean" && symbol.invisible) node.setAttribute("columnalign","left");
-          newFrag.replaceChild(node,newFrag.firstChild);
-        }
-       }
-      }
-    }
-    str = AMremoveCharsAndBlanks(str,symbol.input.length);
-    if (typeof symbol.invisible != "boolean" || !symbol.invisible) {
-      node = createMmlNode("mo",document.createTextNode(symbol.output));
-      newFrag.appendChild(node);
-    }
-  }
-  return [newFrag,str];
-}
-
-function parseMath(str,latex) {
-  var frag, node;
-  AMnestingDepth = 0;
-  frag = latex ? LMparseExpr(str.replace(/^\s+/g,""),false,false)[0] : AMparseExpr(str.replace(/^\s+/g,""),false)[0];
-  node = createMmlNode("mstyle",frag);
-  node.setAttribute("mathcolor",mathcolor);
-  node.setAttribute("fontfamily",mathfontfamily);
-  node.setAttribute("mathsize",mathfontsize);
-  if (displaystyle) node.setAttribute("displaystyle","true");
-  node = createMmlNode("math",node);
-  if (showasciiformulaonhover)                      //fixed by djhsu so newline
-    node.setAttribute("title",str.replace(/\s+/g," "));//does not show in Gecko
-  return node;
-}
-
-function strarr2docFrag(arr, linebreaks, latex) {
-  var newFrag=document.createDocumentFragment();
-  var expr = false;
-  for (var i=0; i<arr.length; i++) {
-    if (expr) newFrag.appendChild(parseMath(arr[i],latex));
-    else {
-      var arri = (linebreaks ? arr[i].split("\n\n") : [arr[i]]);
-      newFrag.appendChild(createElementXHTML("span").
-      appendChild(document.createTextNode(arri[0])));
-      for (var j=1; j<arri.length; j++) {
-        newFrag.appendChild(createElementXHTML("p"));
-        newFrag.appendChild(createElementXHTML("span").
-        appendChild(document.createTextNode(arri[j])));
-      }
-    }
-    expr = !expr;
-  }
-  return newFrag;
-}
-
-function AMautomathrec(str) {
-//formula is a space (or start of str) followed by a maximal sequence of *two* or more tokens, possibly separated by runs of digits and/or space.
-//tokens are single letters (except a, A, I) and ASCIIMathML tokens
-  var texcommand = "\\\\[a-zA-Z]+|\\\\\\s|";
-  var ambigAMtoken = "\\b(?:oo|lim|ln|int|oint|del|grad|aleph|prod|prop|sinh|cosh|tanh|cos|sec|pi|tt|fr|sf|sube|supe|sub|sup|det|mod|gcd|lcm|min|max|vec|ddot|ul|chi|eta|nu|mu)(?![a-z])|";
-  var englishAMtoken = "\\b(?:sum|ox|log|sin|tan|dim|hat|bar|dot)(?![a-z])|";
-  var secondenglishAMtoken = "|\\bI\\b|\\bin\\b|\\btext\\b"; // took if and or not out
-  var simpleAMtoken = "NN|ZZ|QQ|RR|CC|TT|AA|EE|sqrt|dx|dy|dz|dt|xx|vv|uu|nn|bb|cc|csc|cot|alpha|beta|delta|Delta|epsilon|gamma|Gamma|kappa|lambda|Lambda|omega|phi|Phi|Pi|psi|Psi|rho|sigma|Sigma|tau|theta|Theta|xi|Xi|zeta"; // uuu nnn?
-  var letter = "[a-zA-HJ-Z](?=(?:[^a-zA-Z]|$|"+ambigAMtoken+englishAMtoken+simpleAMtoken+"))|";
-  var token = letter+texcommand+"\\d+|[-()[\\]{}+=*&^_%\\\@/<>,\\|!:;'~]|\\.(?!(?:\x20|$))|"+ambigAMtoken+englishAMtoken+simpleAMtoken;
-  var re = new RegExp("(^|\\s)((("+token+")\\s?)(("+token+secondenglishAMtoken+")\\s?)+)([,.?]?(?=\\s|$))","g");
-  str = str.replace(re," `$2`$7");
-  var arr = str.split(AMdelimiter1);
-  var re1 = new RegExp("(^|\\s)([b-zB-HJ-Z+*<>]|"+texcommand+ambigAMtoken+simpleAMtoken+")(\\s|\\n|$)","g");
-  var re2 = new RegExp("(^|\\s)([a-z]|"+texcommand+ambigAMtoken+simpleAMtoken+")([,.])","g"); // removed |\d+ for now
-  for (i=0; i<arr.length; i++)   //single nonenglish tokens
-    if (i%2==0) {
-      arr[i] = arr[i].replace(re1," `$2`$3");
-      arr[i] = arr[i].replace(re2," `$2`$3");
-      arr[i] = arr[i].replace(/([{}[\]])/,"`$1`");
-    }
-  str = arr.join(AMdelimiter1);
-  str = str.replace(/((^|\s)\([a-zA-Z]{2,}.*?)\)`/g,"$1`)");  //fix parentheses
-  str = str.replace(/`(\((a\s|in\s))(.*?[a-zA-Z]{2,}\))/g,"$1`$3");  //fix parentheses
-  str = str.replace(/\sin`/g,"` in");
-  str = str.replace(/`(\(\w\)[,.]?(\s|\n|$))/g,"$1`");
-  str = str.replace(/`([0-9.]+|e.g|i.e)`(\.?)/gi,"$1$2");
-  str = str.replace(/`([0-9.]+:)`/g,"$1");
-  return str;
-}
-
-function processNodeR(n, linebreaks,latex) {
-  var mtch, str, arr, frg, i;
-  if (n.childNodes.length == 0) {
-   if ((n.nodeType!=8 || linebreaks) &&
-    n.parentNode.nodeName!="form" && n.parentNode.nodeName!="FORM" &&
-    n.parentNode.nodeName!="textarea" && n.parentNode.nodeName!="TEXTAREA" /*&&
-    n.parentNode.nodeName!="pre" && n.parentNode.nodeName!="PRE"*/) {
-    str = n.nodeValue;
-    if (!(str == null)) {
-      str = str.replace(/\r\n\r\n/g,"\n\n");
-      str = str.replace(/\x20+/g," ");
-      str = str.replace(/\s*\r\n/g," ");
-      if(latex) {
-// DELIMITERS:
-        mtch = (str.indexOf("\$")==-1 ? false : true);
-        str = str.replace(/([^\\])\$/g,"$1 \$");
-        str = str.replace(/^\$/," \$");	// in case \$ at start of string
-        arr = str.split(" \$");
-        for (i=0; i<arr.length; i++)
-	  arr[i]=arr[i].replace(/\\\$/g,"\$");
-      } else {
-      mtch = false;
-      str = str.replace(new RegExp(AMescape1, "g"),
-              function(){mtch = true; return "AMescape1"});
-      str = str.replace(/\\?end{?a?math}?/i,
-              function(){automathrecognize = false; mtch = true; return ""});
-      str = str.replace(/amath\b|\\begin{a?math}/i,
-              function(){automathrecognize = true; mtch = true; return ""});
-      arr = str.split(AMdelimiter1);
-      if (automathrecognize)
-        for (i=0; i<arr.length; i++)
-          if (i%2==0) arr[i] = AMautomathrec(arr[i]);
-      str = arr.join(AMdelimiter1);
-      arr = str.split(AMdelimiter1);
-      for (i=0; i<arr.length; i++) // this is a problem ************
-        arr[i]=arr[i].replace(/AMescape1/g,AMdelimiter1);
-      }
-      if (arr.length>1 || mtch) {
-        if (!noMathML) {
-          frg = strarr2docFrag(arr,n.nodeType==8,latex);
-          var len = frg.childNodes.length;
-          n.parentNode.replaceChild(frg,n);
-          return len-1;
-        } else return 0;
-      }
-    }
-   } else return 0;
-  } else if (n.nodeName!="math") {
-    for (i=0; i<n.childNodes.length; i++)
-      i += processNodeR(n.childNodes[i], linebreaks,latex);
-  }
-  return 0;
-}
-
-function AMprocessNode(n, linebreaks, spanclassAM) {
-  var frag,st;
-  if (spanclassAM!=null) {
-    frag = document.getElementsByTagName("span")
-    for (var i=0;i<frag.length;i++)
-      if (frag[i].className == "AM") 
-        processNodeR(frag[i],linebreaks,false);
-  } else {
-    try {
-      st = n.innerHTML; // look for AMdelimiter on page
-    } catch(err) {}
-//alert(st)
-    if (st==null || /amath\b|\\begin{a?math}/i.test(st) ||
-      st.indexOf(AMdelimiter1+" ")!=-1 || st.slice(-1)==AMdelimiter1 ||
-      st.indexOf(AMdelimiter1+"<")!=-1 || st.indexOf(AMdelimiter1+"\n")!=-1) {
-      processNodeR(n,linebreaks,false);
-    }
-  }
-/*  if (isIE) { //needed to match size and font of formula to surrounding text
-    frag = document.getElementsByTagName('math');
-    for (var i=0;i<frag.length;i++) frag[i].update() //What is this?
-  }*/
-}
-
-/*
-LaTeXMathML.js
-==============
-
-Version 1.1, July 20, 2007 (c) modifications by Peter Jipsen
-
-(changes: renamed global variables from AM... to LM... so that
-LaTeXMathML and ASCIIMathML can be used simultaneously)
-
-Previous header notice:
-This file (Version 1.0), is due to Douglas Woodall, June 2006.
-It contains JavaScript functions to convert (most simple) LaTeX
-math notation to Presentation MathML.  It was obtained by
-downloading the file ASCIIMathML.js from
-	http://www1.chapman.edu/~jipsen/mathml/asciimathdownload/
-and modifying it so that it carries out ONLY those conversions
-that would be carried out in LaTeX.  A description of the original
-file, with examples, can be found at
-	www1.chapman.edu/~jipsen/mathml/asciimath.html
-	ASCIIMathML: Math on the web for everyone
-
-Here is the header notice from the original file:
-
-ASCIIMathML.js
-==============
-This file contains JavaScript functions to convert ASCII math notation
-to Presentation MathML. The conversion is done while the (X)HTML page
-loads, and should work with Firefox/Mozilla/Netscape 7+ and Internet
-Explorer 6+MathPlayer (http://www.dessci.com/en/products/mathplayer/).
-Just add the next line to your (X)HTML page with this file in the same folder:
-<script type="text/javascript" src="ASCIIMathML.js"></script>
-This is a convenient and inexpensive solution for authoring MathML.
-
-Version 1.4.7 Dec 15, 2005, (c) Peter Jipsen http://www.chapman.edu/~jipsen
-Latest version at http://www.chapman.edu/~jipsen/mathml/ASCIIMathML.js
-For changes see http://www.chapman.edu/~jipsen/mathml/asciimathchanges.txt
-If you use it on a webpage, please send the URL to jipsen@chapman.edu
-
-This program is free software; you can redistribute it and/or modify
-it under the terms of the GNU Lesser General Public License as published by
-the Free Software Foundation; either version 2.1 of the License, or (at
-your option) any later version.
-
-This program is distributed in the hope that it will be useful,
-but WITHOUT ANY WARRANTY; without even the implied warranty of
-MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser
-General Public License (at http://www.gnu.org/license/lgpl.html)
-for more details.
-
-LaTeXMathML.js (ctd)
-==============
-
-Content between $...$ and $$...$$ is converted by this part of the file
-*/
-
-// all further global variables start with "LM"
-
-// Commented out by DRW to prevent 1/2 turning into a 2-line fraction
-// LMdiv   = {input:"/",	 tag:"mfrac", output:"/",    ttype:INFIX},
-// Commented out by DRW so that " prints literally in equations
-// LMquote = {input:"\"",	 tag:"mtext", output:"mbox", ttype:TEXT};
-
-var LMsymbols = [
-//Greek letters
-{input:"\\alpha",	tag:"mi", output:"\u03B1", ttype:CONST},
-{input:"\\beta",	tag:"mi", output:"\u03B2", ttype:CONST},
-{input:"\\gamma",	tag:"mi", output:"\u03B3", ttype:CONST},
-{input:"\\delta",	tag:"mi", output:"\u03B4", ttype:CONST},
-{input:"\\epsilon",	tag:"mi", output:"\u03B5", ttype:CONST},
-{input:"\\varepsilon",  tag:"mi", output:"\u025B", ttype:CONST},
-{input:"\\zeta",	tag:"mi", output:"\u03B6", ttype:CONST},
-{input:"\\eta",		tag:"mi", output:"\u03B7", ttype:CONST},
-{input:"\\theta",	tag:"mi", output:"\u03B8", ttype:CONST},
-{input:"\\vartheta",	tag:"mi", output:"\u03D1", ttype:CONST},
-{input:"\\iota",	tag:"mi", output:"\u03B9", ttype:CONST},
-{input:"\\kappa",	tag:"mi", output:"\u03BA", ttype:CONST},
-{input:"\\lambda",	tag:"mi", output:"\u03BB", ttype:CONST},
-{input:"\\mu",		tag:"mi", output:"\u03BC", ttype:CONST},
-{input:"\\nu",		tag:"mi", output:"\u03BD", ttype:CONST},
-{input:"\\xi",		tag:"mi", output:"\u03BE", ttype:CONST},
-{input:"\\pi",		tag:"mi", output:"\u03C0", ttype:CONST},
-{input:"\\varpi",	tag:"mi", output:"\u03D6", ttype:CONST},
-{input:"\\rho",		tag:"mi", output:"\u03C1", ttype:CONST},
-{input:"\\varrho",	tag:"mi", output:"\u03F1", ttype:CONST},
-{input:"\\varsigma",	tag:"mi", output:"\u03C2", ttype:CONST},
-{input:"\\sigma",	tag:"mi", output:"\u03C3", ttype:CONST},
-{input:"\\tau",		tag:"mi", output:"\u03C4", ttype:CONST},
-{input:"\\upsilon",	tag:"mi", output:"\u03C5", ttype:CONST},
-{input:"\\phi",		tag:"mi", output:"\u03C6", ttype:CONST},
-{input:"\\varphi",	tag:"mi", output:"\u03D5", ttype:CONST},
-{input:"\\chi",		tag:"mi", output:"\u03C7", ttype:CONST},
-{input:"\\psi",		tag:"mi", output:"\u03C8", ttype:CONST},
-{input:"\\omega",	tag:"mi", output:"\u03C9", ttype:CONST},
-{input:"\\Gamma",	tag:"mo", output:"\u0393", ttype:CONST},
-{input:"\\Delta",	tag:"mo", output:"\u0394", ttype:CONST},
-{input:"\\Theta",	tag:"mo", output:"\u0398", ttype:CONST},
-{input:"\\Lambda",	tag:"mo", output:"\u039B", ttype:CONST},
-{input:"\\Xi",		tag:"mo", output:"\u039E", ttype:CONST},
-{input:"\\Pi",		tag:"mo", output:"\u03A0", ttype:CONST},
-{input:"\\Sigma",	tag:"mo", output:"\u03A3", ttype:CONST},
-{input:"\\Upsilon",	tag:"mo", output:"\u03A5", ttype:CONST},
-{input:"\\Phi",		tag:"mo", output:"\u03A6", ttype:CONST},
-{input:"\\Psi",		tag:"mo", output:"\u03A8", ttype:CONST},
-{input:"\\Omega",	tag:"mo", output:"\u03A9", ttype:CONST},
-
-//fractions
-{input:"\\frac12",	tag:"mo", output:"\u00BD", ttype:CONST},
-{input:"\\frac14",	tag:"mo", output:"\u00BC", ttype:CONST},
-{input:"\\frac34",	tag:"mo", output:"\u00BE", ttype:CONST},
-{input:"\\frac13",	tag:"mo", output:"\u2153", ttype:CONST},
-{input:"\\frac23",	tag:"mo", output:"\u2154", ttype:CONST},
-{input:"\\frac15",	tag:"mo", output:"\u2155", ttype:CONST},
-{input:"\\frac25",	tag:"mo", output:"\u2156", ttype:CONST},
-{input:"\\frac35",	tag:"mo", output:"\u2157", ttype:CONST},
-{input:"\\frac45",	tag:"mo", output:"\u2158", ttype:CONST},
-{input:"\\frac16",	tag:"mo", output:"\u2159", ttype:CONST},
-{input:"\\frac56",	tag:"mo", output:"\u215A", ttype:CONST},
-{input:"\\frac18",	tag:"mo", output:"\u215B", ttype:CONST},
-{input:"\\frac38",	tag:"mo", output:"\u215C", ttype:CONST},
-{input:"\\frac58",	tag:"mo", output:"\u215D", ttype:CONST},
-{input:"\\frac78",	tag:"mo", output:"\u215E", ttype:CONST},
-
-//binary operation symbols
-{input:"\\pm",		tag:"mo", output:"\u00B1", ttype:CONST},
-{input:"\\mp",		tag:"mo", output:"\u2213", ttype:CONST},
-{input:"\\triangleleft",tag:"mo", output:"\u22B2", ttype:CONST},
-{input:"\\triangleright",tag:"mo",output:"\u22B3", ttype:CONST},
-{input:"\\cdot",	tag:"mo", output:"\u22C5", ttype:CONST},
-{input:"\\star",	tag:"mo", output:"\u22C6", ttype:CONST},
-{input:"\\ast",		tag:"mo", output:"\u002A", ttype:CONST},
-{input:"\\times",	tag:"mo", output:"\u00D7", ttype:CONST},
-{input:"\\div",		tag:"mo", output:"\u00F7", ttype:CONST},
-{input:"\\circ",	tag:"mo", output:"\u2218", ttype:CONST},
-//{input:"\\bullet",	  tag:"mo", output:"\u2219", ttype:CONST},
-{input:"\\bullet",	tag:"mo", output:"\u2022", ttype:CONST},
-{input:"\\oplus",	tag:"mo", output:"\u2295", ttype:CONST},
-{input:"\\ominus",	tag:"mo", output:"\u2296", ttype:CONST},
-{input:"\\otimes",	tag:"mo", output:"\u2297", ttype:CONST},
-{input:"\\bigcirc",	tag:"mo", output:"\u25CB", ttype:CONST},
-{input:"\\oslash",	tag:"mo", output:"\u2298", ttype:CONST},
-{input:"\\odot",	tag:"mo", output:"\u2299", ttype:CONST},
-{input:"\\land",	tag:"mo", output:"\u2227", ttype:CONST},
-{input:"\\wedge",	tag:"mo", output:"\u2227", ttype:CONST},
-{input:"\\lor",		tag:"mo", output:"\u2228", ttype:CONST},
-{input:"\\vee",		tag:"mo", output:"\u2228", ttype:CONST},
-{input:"\\cap",		tag:"mo", output:"\u2229", ttype:CONST},
-{input:"\\cup",		tag:"mo", output:"\u222A", ttype:CONST},
-{input:"\\sqcap",	tag:"mo", output:"\u2293", ttype:CONST},
-{input:"\\sqcup",	tag:"mo", output:"\u2294", ttype:CONST},
-{input:"\\uplus",	tag:"mo", output:"\u228E", ttype:CONST},
-{input:"\\amalg",	tag:"mo", output:"\u2210", ttype:CONST},
-{input:"\\bigtriangleup",tag:"mo",output:"\u25B3", ttype:CONST},
-{input:"\\bigtriangledown",tag:"mo",output:"\u25BD", ttype:CONST},
-{input:"\\dag",		tag:"mo", output:"\u2020", ttype:CONST},
-{input:"\\dagger",	tag:"mo", output:"\u2020", ttype:CONST},
-{input:"\\ddag",	tag:"mo", output:"\u2021", ttype:CONST},
-{input:"\\ddagger",	tag:"mo", output:"\u2021", ttype:CONST},
-{input:"\\lhd",		tag:"mo", output:"\u22B2", ttype:CONST},
-{input:"\\rhd",		tag:"mo", output:"\u22B3", ttype:CONST},
-{input:"\\unlhd",	tag:"mo", output:"\u22B4", ttype:CONST},
-{input:"\\unrhd",	tag:"mo", output:"\u22B5", ttype:CONST},
-
-
-//BIG Operators
-{input:"\\sum",		tag:"mo", output:"\u2211", ttype:UNDEROVER},
-{input:"\\prod",	tag:"mo", output:"\u220F", ttype:UNDEROVER},
-{input:"\\bigcap",	tag:"mo", output:"\u22C2", ttype:UNDEROVER},
-{input:"\\bigcup",	tag:"mo", output:"\u22C3", ttype:UNDEROVER},
-{input:"\\bigwedge",	tag:"mo", output:"\u22C0", ttype:UNDEROVER},
-{input:"\\bigvee",	tag:"mo", output:"\u22C1", ttype:UNDEROVER},
-{input:"\\bigsqcap",	tag:"mo", output:"\u2A05", ttype:UNDEROVER},
-{input:"\\bigsqcup",	tag:"mo", output:"\u2A06", ttype:UNDEROVER},
-{input:"\\coprod",	tag:"mo", output:"\u2210", ttype:UNDEROVER},
-{input:"\\bigoplus",	tag:"mo", output:"\u2A01", ttype:UNDEROVER},
-{input:"\\bigotimes",	tag:"mo", output:"\u2A02", ttype:UNDEROVER},
-{input:"\\bigodot",	tag:"mo", output:"\u2A00", ttype:UNDEROVER},
-{input:"\\biguplus",	tag:"mo", output:"\u2A04", ttype:UNDEROVER},
-{input:"\\int",		tag:"mo", output:"\u222B", ttype:CONST},
-{input:"\\oint",	tag:"mo", output:"\u222E", ttype:CONST},
-
-//binary relation symbols
-{input:":=",		tag:"mo", output:":=",	   ttype:CONST},
-{input:"\\lt",		tag:"mo", output:"<",	   ttype:CONST},
-{input:"\\gt",		tag:"mo", output:">",	   ttype:CONST},
-{input:"\\ne",		tag:"mo", output:"\u2260", ttype:CONST},
-{input:"\\neq",		tag:"mo", output:"\u2260", ttype:CONST},
-{input:"\\le",		tag:"mo", output:"\u2264", ttype:CONST},
-{input:"\\leq",		tag:"mo", output:"\u2264", ttype:CONST},
-{input:"\\leqslant",	tag:"mo", output:"\u2264", ttype:CONST},
-{input:"\\ge",		tag:"mo", output:"\u2265", ttype:CONST},
-{input:"\\geq",		tag:"mo", output:"\u2265", ttype:CONST},
-{input:"\\geqslant",	tag:"mo", output:"\u2265", ttype:CONST},
-{input:"\\equiv",	tag:"mo", output:"\u2261", ttype:CONST},
-{input:"\\ll",		tag:"mo", output:"\u226A", ttype:CONST},
-{input:"\\gg",		tag:"mo", output:"\u226B", ttype:CONST},
-{input:"\\doteq",	tag:"mo", output:"\u2250", ttype:CONST},
-{input:"\\prec",	tag:"mo", output:"\u227A", ttype:CONST},
-{input:"\\succ",	tag:"mo", output:"\u227B", ttype:CONST},
-{input:"\\preceq",	tag:"mo", output:"\u227C", ttype:CONST},
-{input:"\\succeq",	tag:"mo", output:"\u227D", ttype:CONST},
-{input:"\\subset",	tag:"mo", output:"\u2282", ttype:CONST},
-{input:"\\supset",	tag:"mo", output:"\u2283", ttype:CONST},
-{input:"\\subseteq",	tag:"mo", output:"\u2286", ttype:CONST},
-{input:"\\supseteq",	tag:"mo", output:"\u2287", ttype:CONST},
-{input:"\\sqsubset",	tag:"mo", output:"\u228F", ttype:CONST},
-{input:"\\sqsupset",	tag:"mo", output:"\u2290", ttype:CONST},
-{input:"\\sqsubseteq",  tag:"mo", output:"\u2291", ttype:CONST},
-{input:"\\sqsupseteq",  tag:"mo", output:"\u2292", ttype:CONST},
-{input:"\\sim",		tag:"mo", output:"\u223C", ttype:CONST},
-{input:"\\simeq",	tag:"mo", output:"\u2243", ttype:CONST},
-{input:"\\approx",	tag:"mo", output:"\u2248", ttype:CONST},
-{input:"\\cong",	tag:"mo", output:"\u2245", ttype:CONST},
-{input:"\\Join",	tag:"mo", output:"\u22C8", ttype:CONST},
-{input:"\\bowtie",	tag:"mo", output:"\u22C8", ttype:CONST},
-{input:"\\in",		tag:"mo", output:"\u2208", ttype:CONST},
-{input:"\\ni",		tag:"mo", output:"\u220B", ttype:CONST},
-{input:"\\owns",	tag:"mo", output:"\u220B", ttype:CONST},
-{input:"\\propto",	tag:"mo", output:"\u221D", ttype:CONST},
-{input:"\\vdash",	tag:"mo", output:"\u22A2", ttype:CONST},
-{input:"\\dashv",	tag:"mo", output:"\u22A3", ttype:CONST},
-{input:"\\models",	tag:"mo", output:"\u22A8", ttype:CONST},
-{input:"\\perp",	tag:"mo", output:"\u22A5", ttype:CONST},
-{input:"\\smile",	tag:"mo", output:"\u2323", ttype:CONST},
-{input:"\\frown",	tag:"mo", output:"\u2322", ttype:CONST},
-{input:"\\asymp",	tag:"mo", output:"\u224D", ttype:CONST},
-{input:"\\notin",	tag:"mo", output:"\u2209", ttype:CONST},
-
-//matrices
-{input:"\\begin{eqnarray}",	output:"X",	ttype:MATRIX, invisible:true},
-{input:"\\begin{array}",	output:"X",	ttype:MATRIX, invisible:true},
-{input:"\\\\",			output:"}&{",	ttype:DEFINITION},
-{input:"\\end{eqnarray}",	output:"}}",	ttype:DEFINITION},
-{input:"\\end{array}",		output:"}}",	ttype:DEFINITION},
-
-//grouping and literal brackets -- ieval is for IE
-{input:"\\big",	   tag:"mo", output:"X", atval:"1.2", ieval:"2.2", ttype:BIG},
-{input:"\\Big",	   tag:"mo", output:"X", atval:"1.6", ieval:"2.6", ttype:BIG},
-{input:"\\bigg",   tag:"mo", output:"X", atval:"2.2", ieval:"3.2", ttype:BIG},
-{input:"\\Bigg",   tag:"mo", output:"X", atval:"2.9", ieval:"3.9", ttype:BIG},
-{input:"\\left",   tag:"mo", output:"X", ttype:LEFTBRACKET},
-{input:"\\right",  tag:"mo", output:"X", ttype:RIGHTBRACKET},
-{input:"{",	   output:"{", ttype:LEFTBRACKET,  invisible:true},
-{input:"}",	   output:"}", ttype:RIGHTBRACKET, invisible:true},
-
-{input:"(",	   tag:"mo", output:"(",      atval:"1", ttype:STRETCHY},
-{input:"[",	   tag:"mo", output:"[",      atval:"1", ttype:STRETCHY},
-{input:"\\lbrack", tag:"mo", output:"[",      atval:"1", ttype:STRETCHY},
-{input:"\\{",	   tag:"mo", output:"{",      atval:"1", ttype:STRETCHY},
-{input:"\\lbrace", tag:"mo", output:"{",      atval:"1", ttype:STRETCHY},
-{input:"\\langle", tag:"mo", output:"\u2329", atval:"1", ttype:STRETCHY},
-{input:"\\lfloor", tag:"mo", output:"\u230A", atval:"1", ttype:STRETCHY},
-{input:"\\lceil",  tag:"mo", output:"\u2308", atval:"1", ttype:STRETCHY},
-
-// rtag:"mi" causes space to be inserted before a following sin, cos, etc.
-// (see function LMparseExpr() )
-{input:")",	  tag:"mo",output:")",	    rtag:"mi",atval:"1",ttype:STRETCHY},
-{input:"]",	  tag:"mo",output:"]",	    rtag:"mi",atval:"1",ttype:STRETCHY},
-{input:"\\rbrack",tag:"mo",output:"]",	    rtag:"mi",atval:"1",ttype:STRETCHY},
-{input:"\\}",	  tag:"mo",output:"}",	    rtag:"mi",atval:"1",ttype:STRETCHY},
-{input:"\\rbrace",tag:"mo",output:"}",	    rtag:"mi",atval:"1",ttype:STRETCHY},
-{input:"\\rangle",tag:"mo",output:"\u232A", rtag:"mi",atval:"1",ttype:STRETCHY},
-{input:"\\rfloor",tag:"mo",output:"\u230B", rtag:"mi",atval:"1",ttype:STRETCHY},
-{input:"\\rceil", tag:"mo",output:"\u2309", rtag:"mi",atval:"1",ttype:STRETCHY},
-
-// "|", "\\|", "\\vert" and "\\Vert" modified later: lspace = rspace = 0em
-{input:"|",		tag:"mo", output:"\u2223", atval:"1", ttype:STRETCHY},
-{input:"\\|",		tag:"mo", output:"\u2225", atval:"1", ttype:STRETCHY},
-{input:"\\vert",	tag:"mo", output:"\u2223", atval:"1", ttype:STRETCHY},
-{input:"\\Vert",	tag:"mo", output:"\u2225", atval:"1", ttype:STRETCHY},
-{input:"\\mid",		tag:"mo", output:"\u2223", atval:"1", ttype:STRETCHY},
-{input:"\\parallel",	tag:"mo", output:"\u2225", atval:"1", ttype:STRETCHY},
-{input:"/",		tag:"mo", output:"/",	atval:"1.01", ttype:STRETCHY},
-{input:"\\backslash",	tag:"mo", output:"\u2216", atval:"1", ttype:STRETCHY},
-{input:"\\setminus",	tag:"mo", output:"\\",	   ttype:CONST},
-
-//miscellaneous symbols
-{input:"\\!",	  tag:"mspace", atname:"width", atval:"-0.167em", ttype:SPACE},
-{input:"\\,",	  tag:"mspace", atname:"width", atval:"0.167em", ttype:SPACE},
-{input:"\\>",	  tag:"mspace", atname:"width", atval:"0.222em", ttype:SPACE},
-{input:"\\:",	  tag:"mspace", atname:"width", atval:"0.222em", ttype:SPACE},
-{input:"\\;",	  tag:"mspace", atname:"width", atval:"0.278em", ttype:SPACE},
-{input:"~",	  tag:"mspace", atname:"width", atval:"0.333em", ttype:SPACE},
-{input:"\\quad",  tag:"mspace", atname:"width", atval:"1em", ttype:SPACE},
-{input:"\\qquad", tag:"mspace", atname:"width", atval:"2em", ttype:SPACE},
-//{input:"{}",		  tag:"mo", output:"\u200B", ttype:CONST}, // zero-width
-{input:"\\prime",	tag:"mo", output:"\u2032", ttype:CONST},
-{input:"'",		tag:"mo", output:"\u02B9", ttype:CONST},
-{input:"''",		tag:"mo", output:"\u02BA", ttype:CONST},
-{input:"'''",		tag:"mo", output:"\u2034", ttype:CONST},
-{input:"''''",		tag:"mo", output:"\u2057", ttype:CONST},
-{input:"\\ldots",	tag:"mo", output:"\u2026", ttype:CONST},
-{input:"\\cdots",	tag:"mo", output:"\u22EF", ttype:CONST},
-{input:"\\vdots",	tag:"mo", output:"\u22EE", ttype:CONST},
-{input:"\\ddots",	tag:"mo", output:"\u22F1", ttype:CONST},
-{input:"\\forall",	tag:"mo", output:"\u2200", ttype:CONST},
-{input:"\\exists",	tag:"mo", output:"\u2203", ttype:CONST},
-{input:"\\Re",		tag:"mo", output:"\u211C", ttype:CONST},
-{input:"\\Im",		tag:"mo", output:"\u2111", ttype:CONST},
-{input:"\\aleph",	tag:"mo", output:"\u2135", ttype:CONST},
-{input:"\\hbar",	tag:"mo", output:"\u210F", ttype:CONST},
-{input:"\\ell",		tag:"mo", output:"\u2113", ttype:CONST},
-{input:"\\wp",		tag:"mo", output:"\u2118", ttype:CONST},
-{input:"\\emptyset",	tag:"mo", output:"\u2205", ttype:CONST},
-{input:"\\infty",	tag:"mo", output:"\u221E", ttype:CONST},
-{input:"\\surd",	tag:"mo", output:"\\sqrt{}", ttype:DEFINITION},
-{input:"\\partial",	tag:"mo", output:"\u2202", ttype:CONST},
-{input:"\\nabla",	tag:"mo", output:"\u2207", ttype:CONST},
-{input:"\\triangle",	tag:"mo", output:"\u25B3", ttype:CONST},
-{input:"\\therefore",	tag:"mo", output:"\u2234", ttype:CONST},
-{input:"\\angle",	tag:"mo", output:"\u2220", ttype:CONST},
-//{input:"\\\\ ",	  tag:"mo", output:"\u00A0", ttype:CONST},
-{input:"\\diamond",	tag:"mo", output:"\u22C4", ttype:CONST},
-//{input:"\\Diamond",	  tag:"mo", output:"\u25CA", ttype:CONST},
-{input:"\\Diamond",	tag:"mo", output:"\u25C7", ttype:CONST},
-{input:"\\neg",		tag:"mo", output:"\u00AC", ttype:CONST},
-{input:"\\lnot",	tag:"mo", output:"\u00AC", ttype:CONST},
-{input:"\\bot",		tag:"mo", output:"\u22A5", ttype:CONST},
-{input:"\\top",		tag:"mo", output:"\u22A4", ttype:CONST},
-{input:"\\square",	tag:"mo", output:"\u25AB", ttype:CONST},
-{input:"\\Box",		tag:"mo", output:"\u25A1", ttype:CONST},
-{input:"\\wr",		tag:"mo", output:"\u2240", ttype:CONST},
-
-//standard functions
-//Note UNDEROVER *must* have tag:"mo" to work properly
-{input:"\\arccos", tag:"mi", output:"arccos", ttype:UNARY, func:true},
-{input:"\\arcsin", tag:"mi", output:"arcsin", ttype:UNARY, func:true},
-{input:"\\arctan", tag:"mi", output:"arctan", ttype:UNARY, func:true},
-{input:"\\arg",	   tag:"mi", output:"arg",    ttype:UNARY, func:true},
-{input:"\\cos",	   tag:"mi", output:"cos",    ttype:UNARY, func:true},
-{input:"\\cosh",   tag:"mi", output:"cosh",   ttype:UNARY, func:true},
-{input:"\\cot",	   tag:"mi", output:"cot",    ttype:UNARY, func:true},
-{input:"\\coth",   tag:"mi", output:"coth",   ttype:UNARY, func:true},
-{input:"\\csc",	   tag:"mi", output:"csc",    ttype:UNARY, func:true},
-{input:"\\deg",	   tag:"mi", output:"deg",    ttype:UNARY, func:true},
-{input:"\\det",	   tag:"mi", output:"det",    ttype:UNARY, func:true},
-{input:"\\dim",	   tag:"mi", output:"dim",    ttype:UNARY, func:true}, //CONST?
-{input:"\\exp",	   tag:"mi", output:"exp",    ttype:UNARY, func:true},
-{input:"\\gcd",	   tag:"mi", output:"gcd",    ttype:UNARY, func:true}, //CONST?
-{input:"\\hom",	   tag:"mi", output:"hom",    ttype:UNARY, func:true},
-{input:"\\inf",	      tag:"mo", output:"inf",	 ttype:UNDEROVER},
-{input:"\\ker",	   tag:"mi", output:"ker",    ttype:UNARY, func:true},
-{input:"\\lg",	   tag:"mi", output:"lg",     ttype:UNARY, func:true},
-{input:"\\lim",	      tag:"mo", output:"lim",	 ttype:UNDEROVER},
-{input:"\\liminf",    tag:"mo", output:"liminf", ttype:UNDEROVER},
-{input:"\\limsup",    tag:"mo", output:"limsup", ttype:UNDEROVER},
-{input:"\\ln",	   tag:"mi", output:"ln",     ttype:UNARY, func:true},
-{input:"\\log",	   tag:"mi", output:"log",    ttype:UNARY, func:true},
-{input:"\\max",	      tag:"mo", output:"max",	 ttype:UNDEROVER},
-{input:"\\min",	      tag:"mo", output:"min",	 ttype:UNDEROVER},
-{input:"\\Pr",	   tag:"mi", output:"Pr",     ttype:UNARY, func:true},
-{input:"\\sec",	   tag:"mi", output:"sec",    ttype:UNARY, func:true},
-{input:"\\sin",	   tag:"mi", output:"sin",    ttype:UNARY, func:true},
-{input:"\\sinh",   tag:"mi", output:"sinh",   ttype:UNARY, func:true},
-{input:"\\sup",	      tag:"mo", output:"sup",	 ttype:UNDEROVER},
-{input:"\\tan",	   tag:"mi", output:"tan",    ttype:UNARY, func:true},
-{input:"\\tanh",   tag:"mi", output:"tanh",   ttype:UNARY, func:true},
-
-//arrows
-{input:"\\gets",		tag:"mo", output:"\u2190", ttype:CONST},
-{input:"\\leftarrow",		tag:"mo", output:"\u2190", ttype:CONST},
-{input:"\\to",			tag:"mo", output:"\u2192", ttype:CONST},
-{input:"\\rightarrow",		tag:"mo", output:"\u2192", ttype:CONST},
-{input:"\\leftrightarrow",	tag:"mo", output:"\u2194", ttype:CONST},
-{input:"\\uparrow",		tag:"mo", output:"\u2191", ttype:CONST},
-{input:"\\downarrow",		tag:"mo", output:"\u2193", ttype:CONST},
-{input:"\\updownarrow",		tag:"mo", output:"\u2195", ttype:CONST},
-{input:"\\Leftarrow",		tag:"mo", output:"\u21D0", ttype:CONST},
-{input:"\\Rightarrow",		tag:"mo", output:"\u21D2", ttype:CONST},
-{input:"\\Leftrightarrow",	tag:"mo", output:"\u21D4", ttype:CONST},
-{input:"\\iff", tag:"mo", output:"~\\Longleftrightarrow~", ttype:DEFINITION},
-{input:"\\Uparrow",		tag:"mo", output:"\u21D1", ttype:CONST},
-{input:"\\Downarrow",		tag:"mo", output:"\u21D3", ttype:CONST},
-{input:"\\Updownarrow",		tag:"mo", output:"\u21D5", ttype:CONST},
-{input:"\\mapsto",		tag:"mo", output:"\u21A6", ttype:CONST},
-{input:"\\longleftarrow",	tag:"mo", output:"\u2190", ttype:LONG},
-{input:"\\longrightarrow",	tag:"mo", output:"\u2192", ttype:LONG},
-{input:"\\longleftrightarrow",	tag:"mo", output:"\u2194", ttype:LONG},
-{input:"\\Longleftarrow",	tag:"mo", output:"\u21D0", ttype:LONG},
-{input:"\\Longrightarrow",	tag:"mo", output:"\u21D2", ttype:LONG},
-{input:"\\implies",		tag:"mo", output:"\u21D2", ttype:LONG},
-{input:"\\Longleftrightarrow",  tag:"mo", output:"\u21D4", ttype:LONG},
-{input:"\\longmapsto",		tag:"mo", output:"\u21A6", ttype:CONST},
-							// disaster if LONG
-
-//commands with argument
-
-{input:"\\sqrt",	tag:"msqrt", output:"sqrt",	ttype:UNARY},
-{input:"\\root",	tag:"mroot", output:"root",	ttype:BINARY},
-{input:"\\frac",	tag:"mfrac", output:"/",	ttype:BINARY},
-{input:"\\stackrel",    tag:"mover", output:"stackrel", ttype:BINARY},
-{input:"\\atop",	tag:"mfrac", output:"",		ttype:INFIX},
-{input:"\\choose",      tag:"mfrac", output:"",		ttype:INFIX},
-{input:"_",		tag:"msub",  output:"_",	ttype:INFIX},
-{input:"^",		tag:"msup",  output:"^",	ttype:INFIX},
-{input:"\\mathrm",	tag:"mtext", output:"text",	ttype:TEXT},
-{input:"\\mbox",	tag:"mtext", output:"mbox",	ttype:TEXT},
-
-//diacritical marks
-{input:"\\acute",	tag:"mover",  output:"\u00B4", ttype:UNARY, acc:true},
-//{input:"\\acute",	  tag:"mover",  output:"\u0317", ttype:UNARY, acc:true},
-//{input:"\\acute",	  tag:"mover",  output:"\u0301", ttype:UNARY, acc:true},
-//{input:"\\grave",	  tag:"mover",  output:"\u0300", ttype:UNARY, acc:true},
-//{input:"\\grave",	  tag:"mover",  output:"\u0316", ttype:UNARY, acc:true},
-{input:"\\grave",	tag:"mover",  output:"\u0060", ttype:UNARY, acc:true},
-{input:"\\breve",	tag:"mover",  output:"\u02D8", ttype:UNARY, acc:true},
-{input:"\\check",	tag:"mover",  output:"\u02C7", ttype:UNARY, acc:true},
-{input:"\\dot",		tag:"mover",  output:".",      ttype:UNARY, acc:true},
-{input:"\\ddot",	tag:"mover",  output:"..",     ttype:UNARY, acc:true},
-//{input:"\\ddot",	  tag:"mover",  output:"\u00A8", ttype:UNARY, acc:true},
-{input:"\\mathring",	tag:"mover",  output:"\u00B0", ttype:UNARY, acc:true},
-{input:"\\vec",		tag:"mover",  output:"\u20D7", ttype:UNARY, acc:true},
-{input:"\\overrightarrow",tag:"mover",output:"\u20D7", ttype:UNARY, acc:true},
-{input:"\\overleftarrow",tag:"mover", output:"\u20D6", ttype:UNARY, acc:true},
-{input:"\\hat",		tag:"mover",  output:"\u005E", ttype:UNARY, acc:true},
-{input:"\\widehat",	tag:"mover",  output:"\u0302", ttype:UNARY, acc:true},
-{input:"\\tilde",	tag:"mover",  output:"~",      ttype:UNARY, acc:true},
-//{input:"\\tilde",	  tag:"mover",  output:"\u0303", ttype:UNARY, acc:true},
-{input:"\\widetilde",	tag:"mover",  output:"\u02DC", ttype:UNARY, acc:true},
-{input:"\\bar",		tag:"mover",  output:"\u203E", ttype:UNARY, acc:true},
-{input:"\\overbrace",	tag:"mover",  output:"\u23B4", ttype:UNARY, acc:true},
-{input:"\\overline",	tag:"mover",  output:"\u00AF", ttype:UNARY, acc:true},
-{input:"\\underbrace",  tag:"munder", output:"\u23B5", ttype:UNARY, acc:true},
-{input:"\\underline",	tag:"munder", output:"\u00AF", ttype:UNARY, acc:true},
-//{input:"underline",	tag:"munder", output:"\u0332", ttype:UNARY, acc:true},
-
-//typestyles and fonts
-{input:"\\displaystyle",tag:"mstyle",atname:"displaystyle",atval:"true", ttype:UNARY},
-{input:"\\textstyle",tag:"mstyle",atname:"displaystyle",atval:"false", ttype:UNARY},
-{input:"\\scriptstyle",tag:"mstyle",atname:"scriptlevel",atval:"1", ttype:UNARY},
-{input:"\\scriptscriptstyle",tag:"mstyle",atname:"scriptlevel",atval:"2", ttype:UNARY},
-{input:"\\textrm", tag:"mstyle", output:"\\mathrm", ttype: DEFINITION},
-{input:"\\mathbf", tag:"mstyle", atname:"mathvariant", atval:"bold", ttype:UNARY},
-{input:"\\textbf", tag:"mstyle", atname:"mathvariant", atval:"bold", ttype:UNARY},
-{input:"\\mathit", tag:"mstyle", atname:"mathvariant", atval:"italic", ttype:UNARY},
-{input:"\\textit", tag:"mstyle", atname:"mathvariant", atval:"italic", ttype:UNARY},
-{input:"\\mathtt", tag:"mstyle", atname:"mathvariant", atval:"monospace", ttype:UNARY},
-{input:"\\texttt", tag:"mstyle", atname:"mathvariant", atval:"monospace", ttype:UNARY},
-{input:"\\mathsf", tag:"mstyle", atname:"mathvariant", atval:"sans-serif", ttype:UNARY},
-{input:"\\mathbb", tag:"mstyle", atname:"mathvariant", atval:"double-struck", ttype:UNARY, codes:AMbbb},
-{input:"\\mathcal",tag:"mstyle", atname:"mathvariant", atval:"script", ttype:UNARY, codes:AMcal},
-{input:"\\mathfrak",tag:"mstyle",atname:"mathvariant", atval:"fraktur",ttype:UNARY, codes:AMfrk}
-];
-
-var LMnames = []; //list of input symbols
-
-function LMremoveCharsAndBlanks(str,n) {
-//remove n characters and any following blanks
-  var st;
-  st = str.slice(n);
-  for (var i=0; i<st.length && st.charCodeAt(i)<=32; i=i+1);
-  return st.slice(i);
-}
-
-function LMgetSymbol(str) {
-//return maximal initial substring of str that appears in names
-//return null if there is none
-  var k = 0; //new pos
-  var j = 0; //old pos
-  var mk; //match pos
-  var st;
-  var tagst;
-  var match = "";
-  var more = true;
-  for (var i=1; i<=str.length && more; i++) {
-    st = str.slice(0,i); //initial substring of length i
-    j = k;
-    k = position(LMnames, st, j);
-    if (k<LMnames.length && str.slice(0,LMnames[k].length)==LMnames[k]){
-      match = LMnames[k];
-      mk = k;
-      i = match.length;
-    }
-    more = k<LMnames.length && str.slice(0,LMnames[k].length)>=LMnames[k];
-  }
-  LMpreviousSymbol=LMcurrentSymbol;
-  if (match!=""){
-    LMcurrentSymbol=LMsymbols[mk].ttype;
-    return LMsymbols[mk];
-  }
-  LMcurrentSymbol=CONST;
-  k = 1;
-  st = str.slice(0,1); //take 1 character
-  if ("0"<=st && st<="9") tagst = "mn";
-  else tagst = (("A">st || st>"Z") && ("a">st || st>"z")?"mo":"mi");
-/*
-// Commented out by DRW (not fully understood, but probably to do with
-// use of "/" as an INFIX version of "\\frac", which we don't want):
-//}
-//if (st=="-" && LMpreviousSymbol==INFIX) {
-//  LMcurrentSymbol = INFIX;  //trick "/" into recognizing "-" on second parse
-//  return {input:st, tag:tagst, output:st, ttype:UNARY, func:true};
-//}
-*/
-  return {input:st, tag:tagst, output:st, ttype:CONST};
-}
-
-
-/*Parsing ASCII math expressions with the following grammar
-v ::= [A-Za-z] | greek letters | numbers | other constant symbols
-u ::= sqrt | text | bb | other unary symbols for font commands
-b ::= frac | root | stackrel	binary symbols
-l ::= { | \left			left brackets
-r ::= } | \right		right brackets
-S ::= v | lEr | uS | bSS	Simple expression
-I ::= S_S | S^S | S_S^S | S	Intermediate expression
-E ::= IE | I/I			Expression
-Each terminal symbol is translated into a corresponding mathml node.*/
-
-var LMpreviousSymbol,LMcurrentSymbol;
-
-function LMparseSexpr(str) { //parses str and returns [node,tailstr,(node)tag]
-  var symbol, node, result, result2, i, st,// rightvert = false,
-    newFrag = document.createDocumentFragment();
-  str = LMremoveCharsAndBlanks(str,0);
-  symbol = LMgetSymbol(str);             //either a token or a bracket or empty
-  if (symbol == null || symbol.ttype == RIGHTBRACKET)
-    return [null,str,null];
-  if (symbol.ttype == DEFINITION) {
-    str = symbol.output+LMremoveCharsAndBlanks(str,symbol.input.length);
-    symbol = LMgetSymbol(str);
-    if (symbol == null || symbol.ttype == RIGHTBRACKET)
-      return [null,str,null];
-  }
-  str = LMremoveCharsAndBlanks(str,symbol.input.length);
-  switch (symbol.ttype) {
-  case SPACE:
-    node = createMmlNode(symbol.tag);
-    node.setAttribute(symbol.atname,symbol.atval);
-    return [node,str,symbol.tag];
-  case UNDEROVER:
-    if (isIE) {
-      if (symbol.input.substr(0,4) == "\\big") {   // botch for missing symbols
-	str = "\\"+symbol.input.substr(4)+str;	   // make \bigcup = \cup etc.
-	symbol = LMgetSymbol(str);
-	symbol.ttype = UNDEROVER;
-	str = LMremoveCharsAndBlanks(str,symbol.input.length);
-      }
-    }
-    return [createMmlNode(symbol.tag,
-			document.createTextNode(symbol.output)),str,symbol.tag];
-  case CONST:
-    var output = symbol.output;
-    if (isIE) {
-      if (symbol.input == "'")
-	output = "\u2032";
-      else if (symbol.input == "''")
-	output = "\u2033";
-      else if (symbol.input == "'''")
-	output = "\u2033\u2032";
-      else if (symbol.input == "''''")
-	output = "\u2033\u2033";
-      else if (symbol.input == "\\square")
-	output = "\u25A1";	// same as \Box
-      else if (symbol.input.substr(0,5) == "\\frac") {
-						// botch for missing fractions
-	var denom = symbol.input.substr(6,1);
-	if (denom == "5" || denom == "6") {
-	  str = symbol.input.replace(/\\frac/,"\\frac ")+str;
-	  return [node,str,symbol.tag];
-	}
-      }
-    }
-    node = createMmlNode(symbol.tag,document.createTextNode(output));
-    return [node,str,symbol.tag];
-  case LONG:  // added by DRW
-    node = createMmlNode(symbol.tag,document.createTextNode(symbol.output));
-    node.setAttribute("minsize","1.5");
-    node.setAttribute("maxsize","1.5");
-    node = createMmlNode("mover",node);
-    node.appendChild(createMmlNode("mspace"));
-    return [node,str,symbol.tag];
-  case STRETCHY:  // added by DRW
-    if (isIE && symbol.input == "\\backslash")
-	symbol.output = "\\";	// doesn't expand, but then nor does "\u2216"
-    node = createMmlNode(symbol.tag,document.createTextNode(symbol.output));
-    if (symbol.input == "|" || symbol.input == "\\vert" ||
-	symbol.input == "\\|" || symbol.input == "\\Vert") {
-	  node.setAttribute("lspace","0em");
-	  node.setAttribute("rspace","0em");
-    }
-    node.setAttribute("maxsize",symbol.atval);  // don't allow to stretch here
-    if (symbol.rtag != null)
-      return [node,str,symbol.rtag];
-    else
-      return [node,str,symbol.tag];
-  case BIG:  // added by DRW
-    var atval = symbol.atval;
-    if (isIE)
-      atval = symbol.ieval;
-    symbol = LMgetSymbol(str);
-    if (symbol == null)
-	return [null,str,null];
-    str = LMremoveCharsAndBlanks(str,symbol.input.length);
-    node = createMmlNode(symbol.tag,document.createTextNode(symbol.output));
-    if (isIE) {		// to get brackets to expand
-      var space = createMmlNode("mspace");
-      space.setAttribute("height",atval+"ex");
-      node = createMmlNode("mrow",node);
-      node.appendChild(space);
-    } else {		// ignored in IE
-      node.setAttribute("minsize",atval);
-      node.setAttribute("maxsize",atval);
-    }
-    return [node,str,symbol.tag];
-  case LEFTBRACKET:   //read (expr+)
-    if (symbol.input == "\\left") { // left what?
-      symbol = LMgetSymbol(str);
-      if (symbol != null) {
-	if (symbol.input == ".")
-	  symbol.invisible = true;
-	str = LMremoveCharsAndBlanks(str,symbol.input.length);
-      }
-    }
-    result = LMparseExpr(str,true,false);
-    if (symbol==null ||
-	(typeof symbol.invisible == "boolean" && symbol.invisible))
-      node = createMmlNode("mrow",result[0]);
-    else {
-      node = createMmlNode("mo",document.createTextNode(symbol.output));
-      node = createMmlNode("mrow",node);
-      node.appendChild(result[0]);
-    }
-    return [node,result[1],result[2]];
-  case MATRIX:	 //read (expr+)
-    if (symbol.input == "\\begin{array}") {
-      var mask = "";
-      symbol = LMgetSymbol(str);
-      str = LMremoveCharsAndBlanks(str,0);
-      if (symbol == null)
-	mask = "l";
-      else {
-	str = LMremoveCharsAndBlanks(str,symbol.input.length);
-	if (symbol.input != "{")
-	  mask = "l";
-	else do {
-	  symbol = LMgetSymbol(str);
-	  if (symbol != null) {
-	    str = LMremoveCharsAndBlanks(str,symbol.input.length);
-	    if (symbol.input != "}")
-	      mask = mask+symbol.input;
-	  }
-	} while (symbol != null && symbol.input != "" && symbol.input != "}");
-      }
-      result = LMparseExpr("{"+str,true,true);
-//    if (result[0]==null) return [createMmlNode("mo",
-//			   document.createTextNode(symbol.input)),str];
-      node = createMmlNode("mtable",result[0]);
-      mask = mask.replace(/l/g,"left ");
-      mask = mask.replace(/r/g,"right ");
-      mask = mask.replace(/c/g,"center ");
-      node.setAttribute("columnalign",mask);
-      node.setAttribute("displaystyle","false");
-      if (isIE)
-	return [node,result[1],null];
-// trying to get a *little* bit of space around the array
-// (IE already includes it)
-      var lspace = createMmlNode("mspace");
-      lspace.setAttribute("width","0.167em");
-      var rspace = createMmlNode("mspace");
-      rspace.setAttribute("width","0.167em");
-      var node1 = createMmlNode("mrow",lspace);
-      node1.appendChild(node);
-      node1.appendChild(rspace);
-      return [node1,result[1],null];
-    } else {	// eqnarray
-      result = LMparseExpr("{"+str,true,true);
-      node = createMmlNode("mtable",result[0]);
-      if (isIE)
-	node.setAttribute("columnspacing","0.25em"); // best in practice?
-      else
-	node.setAttribute("columnspacing","0.167em"); // correct (but ignored?)
-      node.setAttribute("columnalign","right center left");
-      node.setAttribute("displaystyle","true");
-      node = createMmlNode("mrow",node);
-      return [node,result[1],null];
-    }
-  case TEXT:
-      if (str.charAt(0)=="{") i=str.indexOf("}");
-      else i = 0;
-      if (i==-1)
-		 i = str.length;
-      st = str.slice(1,i);
-      if (st.charAt(0) == " ") {
-	node = createMmlNode("mspace");
-	node.setAttribute("width","0.33em");	// was 1ex
-	newFrag.appendChild(node);
-      }
-      newFrag.appendChild(
-        createMmlNode(symbol.tag,document.createTextNode(st)));
-      if (st.charAt(st.length-1) == " ") {
-	node = createMmlNode("mspace");
-	node.setAttribute("width","0.33em");	// was 1ex
-	newFrag.appendChild(node);
-      }
-      str = LMremoveCharsAndBlanks(str,i+1);
-      return [createMmlNode("mrow",newFrag),str,null];
-  case UNARY:
-      result = LMparseSexpr(str);
-      if (result[0]==null) return [createMmlNode(symbol.tag,
-                             document.createTextNode(symbol.output)),str];
-      if (typeof symbol.func == "boolean" && symbol.func) { // functions hack
-	st = str.charAt(0);
-//	if (st=="^" || st=="_" || st=="/" || st=="|" || st==",") {
-	if (st=="^" || st=="_" || st==",") {
-	  return [createMmlNode(symbol.tag,
-		    document.createTextNode(symbol.output)),str,symbol.tag];
-        } else {
-	  node = createMmlNode("mrow",
-	   createMmlNode(symbol.tag,document.createTextNode(symbol.output)));
-	  if (isIE) {
-	    var space = createMmlNode("mspace");
-	    space.setAttribute("width","0.167em");
-	    node.appendChild(space);
-	  }
-	  node.appendChild(result[0]);
-	  return [node,result[1],symbol.tag];
-        }
-      }
-      if (symbol.input == "\\sqrt") {		// sqrt
-	if (isIE) {	// set minsize, for \surd
-	  var space = createMmlNode("mspace");
-	  space.setAttribute("height","1.2ex");
-	  space.setAttribute("width","0em");	// probably no effect
-	  node = createMmlNode(symbol.tag,result[0])
-//	  node.setAttribute("minsize","1");	// ignored
-//	  node = createMmlNode("mrow",node);  // hopefully unnecessary
-	  node.appendChild(space);
-	  return [node,result[1],symbol.tag];
-	} else
-	  return [createMmlNode(symbol.tag,result[0]),result[1],symbol.tag];
-      } else if (typeof symbol.acc == "boolean" && symbol.acc) {   // accent
-        node = createMmlNode(symbol.tag,result[0]);
-	var output = symbol.output;
-	if (isIE) {
-		if (symbol.input == "\\hat")
-			output = "\u0302";
-		else if (symbol.input == "\\widehat")
-			output = "\u005E";
-		else if (symbol.input == "\\bar")
-			output = "\u00AF";
-		else if (symbol.input == "\\grave")
-			output = "\u0300";
-		else if (symbol.input == "\\tilde")
-			output = "\u0303";
-	}
-	var node1 = createMmlNode("mo",document.createTextNode(output));
-	if (symbol.input == "\\vec" || symbol.input == "\\check")
-						// don't allow to stretch
-	    node1.setAttribute("maxsize","1.2");
-		 // why doesn't "1" work?  \vec nearly disappears in firefox
-	if (isIE && symbol.input == "\\bar")
-	    node1.setAttribute("maxsize","0.5");
-	if (symbol.input == "\\underbrace" || symbol.input == "\\underline")
-	  node1.setAttribute("accentunder","true");
-	else
-	  node1.setAttribute("accent","true");
-	node.appendChild(node1);
-	if (symbol.input == "\\overbrace" || symbol.input == "\\underbrace")
-	  node.ttype = UNDEROVER;
-	return [node,result[1],symbol.tag];
-      } else {			      // font change or displaystyle command
-        if (!isIE && typeof symbol.codes != "undefined") {
-          for (i=0; i<result[0].childNodes.length; i++)
-            if (result[0].childNodes[i].nodeName=="mi" || result[0].nodeName=="mi") {
-              st = (result[0].nodeName=="mi"?result[0].firstChild.nodeValue:
-                              result[0].childNodes[i].firstChild.nodeValue);
-              var newst = [];
-              for (var j=0; j<st.length; j++)
-                if (st.charCodeAt(j)>64 && st.charCodeAt(j)<91) newst = newst +
-                  String.fromCharCode(symbol.codes[st.charCodeAt(j)-65]);
-                else newst = newst + st.charAt(j);
-              if (result[0].nodeName=="mi")
-                result[0]=createMmlNode("mo").
-                          appendChild(document.createTextNode(newst));
-              else result[0].replaceChild(createMmlNode("mo").
-          appendChild(document.createTextNode(newst)),result[0].childNodes[i]);
-            }
-        }
-        node = createMmlNode(symbol.tag,result[0]);
-        node.setAttribute(symbol.atname,symbol.atval);
-	if (symbol.input == "\\scriptstyle" ||
-	    symbol.input == "\\scriptscriptstyle")
-		node.setAttribute("displaystyle","false");
-	return [node,result[1],symbol.tag];
-      }
-  case BINARY:
-    result = LMparseSexpr(str);
-    if (result[0]==null) return [createMmlNode("mo",
-			   document.createTextNode(symbol.input)),str,null];
-    result2 = LMparseSexpr(result[1]);
-    if (result2[0]==null) return [createMmlNode("mo",
-			   document.createTextNode(symbol.input)),str,null];
-    if (symbol.input=="\\root" || symbol.input=="\\stackrel")
-      newFrag.appendChild(result2[0]);
-    newFrag.appendChild(result[0]);
-    if (symbol.input=="\\frac") newFrag.appendChild(result2[0]);
-    return [createMmlNode(symbol.tag,newFrag),result2[1],symbol.tag];
-  case INFIX:
-    str = LMremoveCharsAndBlanks(str,symbol.input.length);
-    return [createMmlNode("mo",document.createTextNode(symbol.output)),
-	str,symbol.tag];
-  default:
-    return [createMmlNode(symbol.tag,        //its a constant
-	document.createTextNode(symbol.output)),str,symbol.tag];
-  }
-}
-
-function LMparseIexpr(str) {
-  var symbol, sym1, sym2, node, result, tag, underover;
-  str = LMremoveCharsAndBlanks(str,0);
-  sym1 = LMgetSymbol(str);
-  result = LMparseSexpr(str);
-  node = result[0];
-  str = result[1];
-  tag = result[2];
-  symbol = LMgetSymbol(str);
-  if (symbol.ttype == INFIX) {
-    str = LMremoveCharsAndBlanks(str,symbol.input.length);
-    result = LMparseSexpr(str);
-    if (result[0] == null) // show box in place of missing argument
-      result[0] = createMmlNode("mo",document.createTextNode("\u25A1"));
-    str = result[1];
-    tag = result[2];
-    if (symbol.input == "_" || symbol.input == "^") {
-      sym2 = LMgetSymbol(str);
-      tag = null;	// no space between x^2 and a following sin, cos, etc.
-// This is for \underbrace and \overbrace
-      underover = ((sym1.ttype == UNDEROVER) || (node.ttype == UNDEROVER));
-//    underover = (sym1.ttype == UNDEROVER);
-      if (symbol.input == "_" && sym2.input == "^") {
-        str = LMremoveCharsAndBlanks(str,sym2.input.length);
-        var res2 = LMparseSexpr(str);
-	str = res2[1];
-	tag = res2[2];  // leave space between x_1^2 and a following sin etc.
-        node = createMmlNode((underover?"munderover":"msubsup"),node);
-        node.appendChild(result[0]);
-        node.appendChild(res2[0]);
-      } else if (symbol.input == "_") {
-	node = createMmlNode((underover?"munder":"msub"),node);
-        node.appendChild(result[0]);
-      } else {
-	node = createMmlNode((underover?"mover":"msup"),node);
-        node.appendChild(result[0]);
-      }
-      node = createMmlNode("mrow",node); // so sum does not stretch
-    } else {
-      node = createMmlNode(symbol.tag,node);
-      if (symbol.input == "\\atop" || symbol.input == "\\choose")
-	node.setAttribute("linethickness","0ex");
-      node.appendChild(result[0]);
-      if (symbol.input == "\\choose")
-	node = createMmlNode("mfenced",node);
-    }
-  }
-  return [node,str,tag];
-}
-
-function LMparseExpr(str,rightbracket,matrix) {
-  var symbol, node, result, i, tag,
-  newFrag = document.createDocumentFragment();
-  do {
-    str = LMremoveCharsAndBlanks(str,0);
-    result = LMparseIexpr(str);
-    node = result[0];
-    str = result[1];
-    tag = result[2];
-    symbol = LMgetSymbol(str);
-    if (node!=undefined) {
-      if ((tag == "mn" || tag == "mi") && symbol!=null &&
-	typeof symbol.func == "boolean" && symbol.func) {
-			// Add space before \sin in 2\sin x or x\sin x
-	  var space = createMmlNode("mspace");
-	  space.setAttribute("width","0.167em");
-	  node = createMmlNode("mrow",node);
-	  node.appendChild(space);
-      }
-      newFrag.appendChild(node);
-    }
-  } while ((symbol.ttype != RIGHTBRACKET)
-        && symbol!=null && symbol.output!="");
-  tag = null;
-  if (symbol.ttype == RIGHTBRACKET) {
-    if (symbol.input == "\\right") { // right what?
-      str = LMremoveCharsAndBlanks(str,symbol.input.length);
-      symbol = LMgetSymbol(str);
-      if (symbol != null && symbol.input == ".")
-	symbol.invisible = true;
-      if (symbol != null)
-	tag = symbol.rtag;
-    }
-    if (symbol!=null)
-      str = LMremoveCharsAndBlanks(str,symbol.input.length); // ready to return
-    var len = newFrag.childNodes.length;
-    if (matrix &&
-      len>0 && newFrag.childNodes[len-1].nodeName == "mrow" && len>1 &&
-      newFrag.childNodes[len-2].nodeName == "mo" &&
-      newFrag.childNodes[len-2].firstChild.nodeValue == "&") { //matrix
-	var pos = []; // positions of ampersands
-        var m = newFrag.childNodes.length;
-        for (i=0; matrix && i<m; i=i+2) {
-          pos[i] = [];
-          node = newFrag.childNodes[i];
-	  for (var j=0; j<node.childNodes.length; j++)
-	    if (node.childNodes[j].firstChild.nodeValue=="&")
-	      pos[i][pos[i].length]=j;
-        }
-	var row, frag, n, k, table = document.createDocumentFragment();
-	for (i=0; i<m; i=i+2) {
-	  row = document.createDocumentFragment();
-	  frag = document.createDocumentFragment();
-	  node = newFrag.firstChild; // <mrow> -&-&...&-&- </mrow>
-	  n = node.childNodes.length;
-	  k = 0;
-	  for (j=0; j<n; j++) {
-	    if (typeof pos[i][k] != "undefined" && j==pos[i][k]){
-	      node.removeChild(node.firstChild); //remove &
-	      row.appendChild(createMmlNode("mtd",frag));
-	      k++;
-	    } else frag.appendChild(node.firstChild);
-	  }
-	  row.appendChild(createMmlNode("mtd",frag));
-	  if (newFrag.childNodes.length>2) {
-	    newFrag.removeChild(newFrag.firstChild); //remove <mrow> </mrow>
-	    newFrag.removeChild(newFrag.firstChild); //remove <mo>&</mo>
-	  }
-	  table.appendChild(createMmlNode("mtr",row));
-	}
-	return [table,str];
-    }
-    if (typeof symbol.invisible != "boolean" || !symbol.invisible) {
-      node = createMmlNode("mo",document.createTextNode(symbol.output));
-      newFrag.appendChild(node);
-    }
-  }
-  return [newFrag,str,tag];
-}
-
-var tcnt = 0, dcnt = 0; //theorem and definition counters
-
-function simpleLaTeXformatting(st) {
-  st = st.replace(/\$\$((.|\n)*?)\$\$/g,"<p align=\"center\">$\\displaystyle{$1}$</p>");
-  st = st.replace(/\\begin{(theorem|lemma|proposition|corollary)}((.|\n)*?)\\end{\1}/g,function(r,s,t){tcnt++; return "<b>"+s.charAt(0).toUpperCase()+s.slice(1)+" "+tcnt+".</b> <i>"+t.replace(/^\s*<\/?\w+\/?>|\s*<\/?\w+\/?>$/g,"")+"</i>"});
-  st = st.replace(/\\begin{(definition|example|remark|problem|exercise|conjecture|solution)}((.|\n)*?)\\end{\1}/g,function(r,s,t){dcnt++; return "<b>"+s.charAt(0).toUpperCase()+s.slice(1)+" "+dcnt+".</b> "+t.replace(/^\s*<\/?\w+\/?>|\s*<\/?\w+\/?>$/g,"")});
-  st = st.replace(/\\begin{proof}((.|\n)*?)\\end{proof}/g,function(s,t){return "<i>Proof:</i> "+t.replace(/^\s*<\/?\w+\/?>|\s*<\/?\w+\/?>$/g,"")+" &#x25A1;"});
-  st = st.replace(/\\emph{(.*?)}/g,"<em>$1</em>");
-  st = st.replace(/\\textbf{(.*?)}/g,"<b>$1</b>");
-  st = st.replace(/\\cite{(.*?)}/g,"[$1]");
-  st = st.replace(/\\chapter{(.*?)}/g,"<h2>$1</h2>");
-  st = st.replace(/\\section{(.*?)}(\s*<\/?(br|p)\s?\/?>)?/g,"<h3>$1</h3>");
-  st = st.replace(/\\subsection{((.|\n)*?)}/g,"<h4>$1</h4>");
-  st = st.replace(/\\begin{itemize}(\s*<\/?(br|p)\s?\/?>)?/g,"<ul>");
-  st = st.replace(/\\item\s((.|\n)*?)(?=(\\item|\\end))/g,"<li>$1</li>");
-  st = st.replace(/\\end{itemize}(\s*<\/?(br|p)\s?\/?>)?/g,"</ul>");
-  st = st.replace(/\\begin{enumerate}(\s*<\/?(br|p)\s?\/?>)?/g,"<ol>");
-  st = st.replace(/\\end{enumerate}(\s*<\/?(br|p)\s?\/?>)?/g,"</ol>");
-  st = st.replace(/\\item\[(.*?)]{(.*?)}/g,"<dt>$1</dt><dd>$2</dd>");
-  st = st.replace(/\\begin{description}/g,"<dl>");
-  st = st.replace(/\\end{description}/g,"</dl>");
-  st = st.replace(/\\newline\b/g,"<br/>");
-  st = st.replace(/\\newpage\b/g,"<br style=\"page-break-after:always;\">");
-  st = st.replace(/\\par\b/g,"<p>&nbsp;</p>");
-  st = st.replace(/\\bigskip/g,"<p style=\"margin-bottom:0.5in\">&nbsp;</p>");
-  st = st.replace(/\\medskip/g,"<p style=\"margin-bottom:0.3in\">&nbsp;</p>");
-  st = st.replace(/\\smallskip/g,"<p style=\"margin-bottom:0.15in\">&nbsp;</p>");
-  st = st.replace(/\\begin{center}((.|\n)*?)\\end{center}/g,"<center>$1</center>");
-  return st
-}
-
-function ASCIIandgraphformatting(st) {
-  st = st.replace(/<sup>(.*?)<\/sup>(\s|(\S))/gi,"^{$1} $3");
-//st = st.replace(/<\/?font.*?>/gi,""); // do this only in amath...endamath
-  st = st.replace(/(Proof:)/g,"<i>$1</i>");
-  st = st.replace(/QED/g,"&nbsp; &nbsp; &#x25A1;");
-  st = st.replace(/(\\?end{?a?math}?)/ig,"<span></span>$1");
-  st = st.replace(/(\bamath\b|\\begin{a?math})/ig,"<span></span>$1");
-  st = st.replace(/([>\n])(Theorem|Lemma|Proposition|Corollary|Definition|Example|Remark|Problem|Exercise|Conjecture|Solution)(:|\W\W?(\w|\s|-|\.)*?\W?:)/g,"$1<b>$2$3</b>");
-  st = st.replace(/<embed\s+class\s?=\s?"?ASCIIsvg"?/gi,"<embed class=\"ASCIIsvg\" src=\""+dsvglocation+"d.svg\" wmode=\"transparent\"");
-  st = st.replace(/(?:\\begin{a?graph}|\bagraph|\(:graph\s)((.|\n)*?)(?:\\end{a?graph}|enda?graph|:\))/g,function(s,t){return "<table><tr><td><div class=\"ASCIIsvg\"><embed class=\"ASCIIsvg\" src=\""+dsvglocation+"d.svg\" wmode=\"transparent\" script=\'"+t.replace(/<\/?(br|p|pre)\s?\/?>/gi,"\n")+"\'/></div></td></tr></table>"});
-  st = st.replace(/insertASCIIMathCalculator/g,"<div class=\"ASCIIMathCalculator\"></div>");
-//alert(dsvglocation)
-  return st
-}
-
-function LMprocessNode(n) {
-  var frag,st;
-  try {
-    st = n.innerHTML;
-  } catch(err) {}
-  var am = /amath\b|\bagraph/i.test(st);
-  if ((st==null || st.indexOf("\$ ")!=-1 || st.indexOf("\$<")!=-1 || 
-       st.indexOf("\\begin")!=-1 || am || st.slice(-1)=="$" ||
-       st.indexOf("\$\n")!=-1)&& !/edit-content|HTMLArea|wikiedit|wpTextbox1/.test(st)){
-    if (!avoidinnerHTML && translateLaTeXformatting) 
-      st = simpleLaTeXformatting(st);
-    if (st!=null && am && !avoidinnerHTML) {
-      st = ASCIIandgraphformatting(st);
-    }
-    st = st.replace(/%7E/g,"~"); // else PmWiki has url issues
-//alert(st)
-    if (!avoidinnerHTML) n.innerHTML = st;
-    processNodeR(n,false,true);
-  }
-/*  if (isIE) { //needed to match size and font of formula to surrounding text
-    frag = document.getElementsByTagName('math');
-    for (var i=0;i<frag.length;i++) frag[i].update() //is this really needed?
-  }*/
-}
-
-/* ASCIIsvg.js
-==============
-JavaScript routines to dynamically generate Scalable Vector Graphics
-using a mathematical xy-coordinate system (y increases upwards) and
-very intuitive JavaScript commands (no programming experience required).
-ASCIIsvg.js is good for learning math and illustrating online math texts.
-Works with Internet Explorer+Adobe SVGviewer and SVG enabled Mozilla/Firefox.
-
-Ver 1.2.9 July 31, 2007 (c) Peter Jipsen http://www.chapman.edu/~jipsen
-Latest version at http://math.chapman.edu/~jipsen/math/pub/ASCIIsvg.js
-If you use it on a webpage, please send the URL to jipsen@chapman.edu
-
-This program is free software; you can redistribute it and/or modify
-it under the terms of the GNU Lesser General Public License as published by
-the Free Software Foundation; either version 2.1 of the License, or (at
-your option) any later version.
-
-This program is distributed in the hope that it will be useful, 
-but WITHOUT ANY WARRANTY; without even the implied warranty of
-MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser
-General Public License (at http://www.gnu.org/license/lgpl.html) 
-for more details.*/
-
-// you can change these
-var checkIfSVGavailable = true;
-var notifyIfNoSVG = true;
-var alertIfNoSVG = false;
-var noSVG = false;
-
-// global defaults used if not specified by graph (you can change these)
-var defaultwidth = 300; defaultheight = 200;   // in pixels
-var defaultxmin = -5.5; defaultxmax = 5.5;     // in usercoords
-var defaultborder = 0; border = defaultborder; // in pixel
-var defaultstrokewidth = "1"; // default line width in pixel
-var defaultstroke = "blue";   // default line color
-var defaultstrokeopacity = 1; // transparent = 0, solid =1
-var defaultstrokedasharray = null; // "10,10" gives 10px long dashes
-var defaultfill = "none";        // default fill color
-var defaultfillopacity = 1;      // transparent = 0, solid =1
-var defaultfontstyle = "normal"; // default text shape normal|italic|inherit
-var defaultfontfamily = "times"; // default font times|ariel|helvetica|...
-var defaultfontsize = "16";      // default size (scaled automatically)
-var defaultfontweight = "normal";// normal|bold|bolder|lighter|100|...|900
-var defaultfontstroke = "none";  // default font outline color
-var defaultfontfill = "none";    // default font color
-var defaultmarker = "none";      // "dot" | "arrow" | "+" | "-" | "|"
-var defaultendpoints = "";       // "c-d" where c is <|o|* and d is >|o|*
-
-// global values used for all pictures (you can change these)
-var showcoordinates = true;
-var markerstrokewidth = "1";
-var markerstroke = "black";
-var markerfill = "yellow";
-var markersize = 4;
-var arrowfill = stroke;
-var dotradius = 4;
-var ticklength = 4;
-var axesstroke = "black";
-var gridstroke = "grey";
-var backgroundstyle = "fill-opacity:1; fill:white";
-var singlelettersitalic = true;
-
-// internal variables (probably no need to change these)
-var picturepos = null; // position of picture relative to top of HTML page
-var xunitlength;       // in pixels, used to convert to user coordinates
-var yunitlength;       // in pixels
-var origin = [0,0];    // in pixels (default is bottom left corner)
-var above = "above";   // shorthands (to avoid typing quotes)
-var below = "below";
-var left = "left";
-var right = "right";
-var aboveleft = "aboveleft";
-var aboveright = "aboveright";
-var belowleft = "belowleft";
-var belowright = "belowright";
-var xmin, xmax, ymin, ymax, xscl, yscl, 
-    xgrid, ygrid, xtick, ytick, initialized;
-var strokewidth, strokedasharray, stroke, fill, strokeopacity, fillopacity;
-var fontstyle, fontfamily, fontsize, fontweight, fontstroke, fontfill;
-var marker, endpoints, dynamic = {};
-var picture, svgpicture, doc, width, height;
-var isIE = document.createElementNS==null;
-
-var cpi = "\u03C0", ctheta = "\u03B8";      // character for pi, theta
-var log = function(x) { return ln(x)/ln(10) };
-var pi = Math.PI, e = Math.E, ln = Math.log, sqrt = Math.sqrt;
-var floor = Math.floor, ceil = Math.ceil, abs = Math.abs;
-var sin = Math.sin, cos = Math.cos, tan = Math.tan;
-var arcsin = Math.asin, arccos = Math.acos, arctan = Math.atan;
-var sec = function(x) { return 1/Math.cos(x) };
-var csc = function(x) { return 1/Math.sin(x) };
-var cot = function(x) { return 1/Math.tan(x) };
-var arcsec = function(x) { return arccos(1/x) };
-var arccsc = function(x) { return arcsin(1/x) };
-var arccot = function(x) { return arctan(1/x) };
-var sinh = function(x) { return (Math.exp(x)-Math.exp(-x))/2 };
-var cosh = function(x) { return (Math.exp(x)+Math.exp(-x))/2 };
-var tanh = 
-  function(x) { return (Math.exp(x)-Math.exp(-x))/(Math.exp(x)+Math.exp(-x)) };
-var sech = function(x) { return 1/cosh(x) };
-var csch = function(x) { return 1/sinh(x) };
-var coth = function(x) { return 1/tanh(x) };
-var arcsinh = function(x) { return ln(x+Math.sqrt(x*x+1)) };
-var arccosh = function(x) { return ln(x+Math.sqrt(x*x-1)) };
-var arctanh = function(x) { return ln((1+x)/(1-x))/2 };
-var sech = function(x) { return 1/cosh(x) };
-var csch = function(x) { return 1/sinh(x) };
-var coth = function(x) { return 1/tanh(x) };
-var arcsech = function(x) { return arccosh(1/x) };
-var arccsch = function(x) { return arcsinh(1/x) };
-var arccoth = function(x) { return arctanh(1/x) };
-var sign = function(x) { return (x==0?0:(x<0?-1:1)) };
-
-function factorial(x,n) { // Factorial function
-  if (n==null) n=1;
-  if (Math.abs(x-Math.round(x*1000000)/1000000)<1e-15)
-    x = Math.round(x*1000000)/1000000;
-  if (x-Math.floor(x)!=0) return NaN;
-  for (var i=x-n; i>0; i-=n) x*=i;
-  return (x<0?NaN:(x==0?1:x));
-}
-
-function C(x,k) {  // Binomial coefficient function
-  var res=1;
-  for (var i=0; i<k; i++) res*=(x-i)/(k-i);
-  return res;
-}
-
-function chop(x,n) { // Truncate decimal number to n places after decimal point
-  if (n==null) n=0;
-  return Math.floor(x*Math.pow(10,n))/Math.pow(10,n);
-}
-
-function ran(a,b,n) { // Generate random number in [a,b] with n digits after .
-  if (n==null) n=0;
-  return chop((b+Math.pow(10,-n)-a)*Math.random()+a,n);
-}
-
-function myCreateElementSVG(t) {
-  if (isIE) return doc.createElement(t);
-  else return doc.createElementNS("http://www.w3.org/2000/svg",t);
-}
-
-function getElementsByClass(container, tagName, clsName){
-  var list = new Array(0);
-  var collection = container.getElementsByTagName(tagName);
-  for(var i = 0; i < collection.length; i++)
-    if(collection[i].className.slice(0,clsName.length)==clsName)
-      list[list.length] = collection[i];
-  return list;
-}
-
-function showobj(obj) {
-  var st="", i;
-  for (i in obj) 
-    st += (obj.getAttribute(i)==null?"":" "+i+":"+obj.getAttribute(i));
-  return st;
-}
-
-function findPos(obj) { // top-left corner of obj on HTML page in pixel
-  var curleft = curtop = 0;
-  if (obj.offsetParent) {
-    curleft = obj.offsetLeft
-    curtop = obj.offsetTop
-    while (obj = obj.offsetParent) {
-      curleft += obj.offsetLeft
-      curtop += obj.offsetTop
-//alert(showobj(obj)+[curleft,curtop])
-    }
-  }
-  return [curleft,curtop];
-}
-
-function checkSVG(){
-  if (navigator.appName.slice(0,8)=="Netscape") 
-    if (window['SVGElement']) noSVG = null;
-    else noSVG = true;
-  else if (navigator.appName.slice(0,9)=="Microsoft")
-    try {
-      var oSVG=eval("new ActiveXObject('Adobe.SVGCtl.3');");
-        noSVG = null;
-    } catch (e) {
-        noSVG = true;
-    }
-  else if (navigator.appName.slice(0,5)=="Opera") // works only for 9.50b1
-    noSVG = null;
-  else noSVG = true;
-//noSVG = true; //uncomment to check
-  if (noSVG && notifyIfNoSVG) {
-    var msg = "To view the ASCIIsvg images use Internet Explorer + Adobe SVGviewer or Mozilla Firefox 2.0 or later."
-    if (alertIfNoSVG)
-      alert(msg);
-    else return msg;
-  }
-}
-
-function setText(st,id) { // add text to an existing node with given id
-  var node = document.getElementById(id);
-  if (node!=null)
-    if (node.childNodes.length!=0) node.childNodes[0].nodeValue = st;
-    else node.appendChild(document.createTextNode(st));
-}
-
-function getX(evt) { // return mouse x-coord in user coordinate system
-  var svgroot = evt.target.parentNode;
-    pos = findPos(svgroot.parentNode);
-  return (evt.clientX+(isIE?0:window.pageXOffset)-pos[0]-svgroot.getAttribute("ox"))/parseFloat(svgroot.getAttribute("xunitlength"));
-}
-
-function getY(evt) { // return mouse y-coord in user coordinate system
-  var svgroot = evt.target.parentNode;
-    pos = findPos(svgroot.parentNode);
-//alert(showobj(svgroot)+svgroot.getAttribute("mytop"))
-  return (svgroot.getAttribute("height")-svgroot.getAttribute("oy")-(evt.clientY+(isIE?0:window.pageYOffset)-pos[1]))/parseFloat(svgroot.getAttribute("yunitlength"));
-}
-
-function translateandeval(src) { //modify user input to JavaScript syntax
-  var errstr;
-  // replace plot(f(x),...) with plot("f(x)",...)  
-  src = src.replace(/plot\(\x20*([^\"f\[][^\n\r;]+?)\,/g,"plot\(\"$1\",");
-  src = src.replace(/plot\(\x20*([^\"f\[][^\n\r;]+)\)/g,"plot(\"$1\")");
-
-  // replace (expr,expr) by [expr,expr] where expr has no (,) in it
-  src = src.replace(/([=[(,]\x20*)\(([-a-z0-9./+*]+?),([-a-z0-9./+*]+?)\)/g,"$1[$2,$3]");
-//alert(src)
-  // insert * between digit and letter e.g. 2x --> 2*x
-  src = src.replace(/([0-9])([a-df-zA-Z]|e^)/g,"$1*$2");
-  src = src.replace(/\)([\(0-9a-zA-Z])/g,"\)*$1");
-
-  try {
-    with (Math) eval(src);          // here the svgpicture object is created
-  } catch(err) {
-    if (err!="wait") {
-//alert(dsvglocation)
-      if (typeof err=="object") 
-        errstr = err.name+" "+err.message+" "+err.number+" "+err.description;
-      else errstr = err;
-      alert(errstr+"\n"+src)
-    }
-  }
-}
-
-var lastSlot = 0;
-
-function drawPictures() { // main routine; called after webpage has loaded
-  var src, id, dsvg, nd, node, ht, index, cols, arr, i, node2;
-  var ASbody = document.getElementsByTagName("body")[0];
-  pictures = getElementsByClass(ASbody,"embed","ASCIIsvg");
-  var len = pictures.length;
-  if(len==0) return;
-  for (index = lastSlot; index < len+lastSlot; index++) {
-   width = null; height = null; 
-   xmin = null; xmax = null; ymin = null; ymax = null;
-   xscl = null; xgrid = null; yscl = null; ygrid = null;
-   initialized = false;
-   picture = pictures[index-lastSlot];  // current picture object
-   src = picture.getAttribute("script"); // get the ASCIIsvg code
-   if (src==null) src = "";
-   // insert "axes()" if not present  ******** experimental
-   if (!/axes\b|initPicture/.test(src)) {
-     var i = 0;
-     while (/((yscl|ymax|ymin|xscl|xmax|xmin|\bwidth|\bheight)\s*=\s*-?\d*(\d\.|\.\d|\d)\d*\s*;?)/.test(src.slice(i))) i++;
-     src = (i==0?"axes(); "+src: src.slice(0,i)+src.slice(i).replace(/((scl|max|min|idth|eight)\s*=\s*-?\d*(\d\.|\.\d|\d)\d*\s*;?)/,"$1\naxes();"));
-   }
-   ht = picture.getAttribute("height");
-   if (isIE) {
-     picture.setAttribute("wmode","transparent");
-//alert("*"+picture.getAttribute("src")+dsvglocation);
-//adding d.svg dynamically greates problems in IE...
-//     if (picture.getAttribute("src")=="") picture.setAttribute("src",dsvglocation+"d.svg");
-   }
-   if (document.getElementById("picture"+(index+1)+"mml")==null) {
-     picture.parentNode.style.position = "relative";
-     node = createElementXHTML("div");
-     node.style.position = "absolute";
-     node.style.top = "0px";
-     node.style.left = "0px";
-     node.setAttribute("id","picture"+(index+1)+"mml");
-     picture.parentNode.insertBefore(node,picture.nextSibling);
-   }
-   if (ht==null) ht ="";
-//   if (ht!="") defaultborder = 25;
-   if (ht=="" || src=="") 
-    if (document.getElementById("picture"+(index+1)+"input")==null) {
-      node = createElementXHTML("textarea");
-      arr = src.split("\n");
-      cols = 0;
-      for (i=0;i<arr.length;i++) cols = Math.max(cols,arr[i].length);
-      node.setAttribute("rows",Math.min(10,arr.length)+1);
-      node.setAttribute("cols",Math.max(Math.min(60,cols),20)+5);
-//      node.setAttribute("style","display:block");
-      if (isIE) src = src.replace(/([^\r])\n/g,"$1\r");
-      node.appendChild(document.createTextNode(src));
-      if (src.indexOf("showcode()")==-1) node.style.display = "none";
-      node.setAttribute("id","picture"+(index+1)+"input");
-      picture.parentNode.insertBefore(node,picture.nextSibling);
-      picture.parentNode.insertBefore(createElementXHTML("br"),node);
-      node2 = createElementXHTML("button");
-      node2.setAttribute("id","picture"+(index+1)+"button");
-      if (isIE) node2.onclick = function() {updatePicture(this)};
-      else node2.setAttribute("onclick","updatePicture(this)");
-      node2.appendChild(document.createTextNode("Update"));
-      if (src.indexOf("showcode()")==-1) node2.style.display = "none";
-      picture.parentNode.insertBefore(node2,node);
-//      picture.parentNode.insertBefore(document.createTextNode("ASCII"),node);
-      picture.parentNode.insertBefore(createElementXHTML("br"),node);
-    } else src = document.getElementById("picture"+(index+1)+"input").value;
-    id = picture.getAttribute("id");
-    dsvg = picture.getAttribute("src");
-    if (id == null || id == "") {
-      id = "picture"+(index+1);
-      picture.setAttribute("id",id);
-    }
-    translateandeval(src);
-  }
-  lastSlot+=len;
-}
-
-function setdefaults() { //called before each graph is evaluated
-  strokewidth = defaultstrokewidth;
-  stroke = defaultstroke;
-  strokeopacity = defaultstrokeopacity;
-  strokedasharray = defaultstrokedasharray;
-  fill = defaultfill;
-  fillopacity = defaultfillopacity;
-  fontstyle = defaultfontstyle;
-  fontfamily = defaultfontfamily;
-  fontsize = defaultfontsize;
-  fontweight = defaultfontweight;
-  fontstroke = defaultfontstroke;
-  fontfill = defaultfontfill;
-  marker = defaultmarker;
-  endpoints = defaultendpoints;
-}
-
-function switchTo(id) { // used by dynamic code to select appropriate graph
-  if (id==undefined) return;
-  var name = id;
-  if (typeof name!="string") name = id.target.parentNode.getAttribute("name");
-  picture = document.getElementById(name);
-  width = picture.getAttribute("width")-0;
-  height = picture.getAttribute("height")-0;
-  setdefaults();
-  if ((picture.nodeName == "EMBED" || picture.nodeName == "embed") && isIE) {
-    svgpicture = picture.getSVGDocument().getElementById("root");
-    doc = picture.getSVGDocument();
-  } else {
-    svgpicture = picture;
-    doc = document;
-  }
-  xunitlength = parseFloat(svgpicture.getAttribute("xunitlength"));
-  yunitlength = parseFloat(svgpicture.getAttribute("yunitlength"));
-  xmin = parseFloat(svgpicture.getAttribute("xmin"));
-  xmax = parseFloat(svgpicture.getAttribute("xmax"));
-  ymin = parseFloat(svgpicture.getAttribute("ymin"));
-  ymax = parseFloat(svgpicture.getAttribute("ymax"));
-  origin = [svgpicture.getAttribute("ox")-0,svgpicture.getAttribute("oy")-0];
-}
-
-function updatePicture(obj) {
-  var node, src, id, top, left;
-  if (typeof obj=="object") id = obj.id.slice(0,-6);
-  else id = (typeof obj=="string"?obj:"picture"+(obj+1));
-  src = document.getElementById(id+"input").value;
-  xmin = null; xmax = null; ymin = null; ymax = null;
-  xscl = null; xgrid = null; yscl = null; ygrid = null;
-  initialized = false;
-  picture = document.getElementById(id);
-  translateandeval(src)
-}
-
-function changepicturesize(evt,factor) {
-  var obj = evt.target;
-  var name = obj.parentNode.getAttribute("name");
-  var pic = document.getElementById(name);
-  var src = document.getElementById(name+"input").value;
-  if (!/height/.test(src)) src = "height=0; "+src;
-  if (!/width/.test(src)) src = "width=0; "+src;
-  src = src.replace(/width\s*=\s*\d+/,"width="+(factor*(pic.getAttribute("width")-0)));
-  src = src.replace(/height\s*=\s*\d+/,"height="+(factor*(pic.getAttribute("height")-0)));
-  document.getElementById(name+"input").value = src;
-  updatePicture(name);
-}
-
-function zoom(evt,factor) {
-  switchTo(evt);
-  var obj = evt.target;
-  var name = obj.parentNode.getAttribute("name");
-  var pic = document.getElementById(name);
-  var src = document.getElementById(name+"input").value;
-  var xlen = (xmax-xmin)/2;
-  var ylen = (ymax-ymin)/2;
-  var xcen = getX(evt), ycen = getY(evt);
-  if (!/ymax/.test(src)) src = "ymax=0; "+src;
-  if (!/ymin/.test(src)) src = "ymin=0; "+src;
-  if (!/xmax/.test(src)) src = "xmax=0; "+src;
-  if (!/xmin/.test(src)) src = "xmin=0; "+src;
-  src = src.replace(/xmin\s*=\s*[-\d.e]+/,"xmin="+(xcen-factor*xlen));
-  src = src.replace(/xmax\s*=\s*[-\d.e]+/,"xmax="+(xcen+factor*xlen));
-  src = src.replace(/ymin\s*=\s*[-\d.e]+/,"ymin="+(ycen-factor*ylen));
-  src = src.replace(/ymax\s*=\s*[-\d.e]+/,"ymax="+(ycen+factor*ylen));
-  document.getElementById(name+"input").value = src;
-  updatePicture(name);
-}
-
-var sinceFirstClick = 0; // ondblclick simulation from 
-var dblClkTimer;         // http://www.enja.org/david/?cat=13 Thanks!
-function timer() {
-  if(sinceFirstClick<60) {
-    sinceFirstClick++;
-    setTimeout("timer()",10);
-  } else {
-    clearTimeout(dblClkTimer);
-    dblClkTimer = "";
-  }
-}
-function mClick(evt) {
-  if(sinceFirstClick!=0) {
-    if(sinceFirstClick <= 40) {
-      if (evt.shiftKey) {
-        if (evt.altKey) changepicturesize(evt,2);
-        else zoom(evt,.5);
-      } else if (evt.altKey) zoom(evt,2);//changepicturesize(evt,.5);
-      else showHideCode(evt);             // do this on dblclick
-      clearTimeout(dblClkTimer);
-      dblClkTimer = "";
-    } else {
-      clearTimeout(dblClkTimer);
-      sinceFirstClick = 0;
-      dblClkTimer = setTimeout("timer()",10);
-    }	      
-  } else {
-    sinceFirstClick = 0;
-    dblClkTimer = setTimeout("timer()",10);
-  }
-}
-
-function showHideCode(evt) { // called by onclick event
-//  if (evt.getDetail()==2) {//getDetail unfortunately not in Firefox
-  var obj=evt.target;
-  var name = obj.parentNode.getAttribute("name");
-  var node = document.getElementById(name+"input");
-  node.style.display = (node.style.display == "none"?"":"none");
-  var node = document.getElementById(name+"button");
-  node.style.display = (node.style.display == "none"?"":"none");
-//  }
-}
-
-function showcode() {} // do nothing
-
-function setBorder(x) { border = x } //deprecate
-
-function initPicture(x_min,x_max,y_min,y_max) { // set up the graph
-// usually called by axes() or noaxes(), but can be used directly
- if (!initialized) {
-  setdefaults();
-  initialized = true;
-  if (x_min!=null) xmin = x_min;
-  if (x_max!=null) xmax = x_max;
-  if (y_min!=null) ymin = y_min;
-  if (y_max!=null) ymax = y_max;
-  if (xmin==null) xmin = defaultxmin;
-  if (xmax==null) xmax = defaultxmax;
- if (typeof xmin != "number" || typeof xmax != "number" || xmin >= xmax) 
-   alert("Picture requires at least two numbers: xmin < xmax");
- else if (y_max != null && (typeof y_min != "number" || 
-          typeof y_max != "number" || y_min >= y_max))
-   alert("initPicture(xmin,xmax,ymin,ymax) requires numbers ymin < ymax");
- else {
-  if (width==null) {
-    width = picture.getAttribute("width");
-    if (width==null || width=="") width=defaultwidth;
-  }
-  picture.setAttribute("width",width);
-  if (height==null) { 
-    height = picture.getAttribute("height");
-    if (height==null || height=="") height=defaultheight;
-  }
-  picture.setAttribute("height",height);
-  xunitlength = (width-2*border)/(xmax-xmin);
-  yunitlength = xunitlength;
-//alert(xmin+" "+xmax+" "+ymin+" "+ymax)
-  if (ymin==null) {
-    origin = [-xmin*xunitlength+border,height/2];
-    ymin = -(height-2*border)/(2*yunitlength);
-    ymax = -ymin;
-  } else {
-    if (ymax!=null) yunitlength = (height-2*border)/(ymax-ymin);
-    else ymax = (height-2*border)/yunitlength + ymin;
-    origin = [-xmin*xunitlength+border,-ymin*yunitlength+border];
-  }
-  if (isIE) {
-    if (picture.FULLSCREEN==undefined) {
-      setTimeout('drawPictures()',50);
-      throw "wait";
-    }
-    svgpicture = picture.getSVGDocument().getElementById("root");
-    if (svgpicture==null) {
-      setTimeout('drawPictures()',50);
-      throw "wait";
-    }
-    svgpicture = picture.getSVGDocument().getElementById("root");
-    while (svgpicture.childNodes.length>0) 
-      svgpicture.removeChild(svgpicture.lastChild); 
-    svgpicture.setAttribute("width",width);
-    svgpicture.setAttribute("height",height);
-    svgpicture.setAttribute("name",picture.getAttribute("id"));
-    doc = picture.getSVGDocument();
-  } else {
-    var qnode = document.createElementNS("http://www.w3.org/2000/svg","svg");
-    qnode.setAttribute("id",picture.getAttribute("id"));
-    qnode.setAttribute("name",picture.getAttribute("id"));
-//    qnode.setAttribute("style","display:inline");
-    qnode.setAttribute("width",picture.getAttribute("width"));
-    qnode.setAttribute("height",picture.getAttribute("height"));
-    picturepos = findPos(picture);
-//  qnode.setAttribute("xmlns:xlink","http://www.w3.org/1999/xlink");
-    if (picture.parentNode!=null) {
-      picture.parentNode.replaceChild(qnode,picture);
-    } else {
-      svgpicture.parentNode.replaceChild(qnode,svgpicture);
-    }
-    svgpicture = qnode;
-    doc = document;
-  }
-  var nd = document.getElementById(picture.getAttribute("id")+"mml");
-  if (nd!=null) // clear out MathML layer
-    while (nd.childNodes.length>0) nd.removeChild(nd.lastChild); 
-  svgpicture.setAttribute("xunitlength",xunitlength);
-  svgpicture.setAttribute("yunitlength",yunitlength);
-  svgpicture.setAttribute("xmin",xmin);
-  svgpicture.setAttribute("xmax",xmax);
-  svgpicture.setAttribute("ymin",ymin);
-  svgpicture.setAttribute("ymax",ymax);
-  svgpicture.setAttribute("ox",origin[0]);
-  svgpicture.setAttribute("oy",origin[1]);
-  var node = myCreateElementSVG("rect");
-  node.setAttribute("x","0");
-  node.setAttribute("y","0");
-  node.setAttribute("width",width);
-  node.setAttribute("height",height);
-  node.setAttribute("style",backgroundstyle);
-  svgpicture.appendChild(node);
-  svgpicture.setAttribute("onmousemove","displayCoord(evt)");
-  svgpicture.setAttribute("onmouseout","removeCoord(evt)");
-  svgpicture.setAttribute("onclick","mClick(evt)");
-  node = myCreateElementSVG("text"); // used for displayCoord
-  node.appendChild(doc.createTextNode(" "));
-  node.setAttribute("id","coords");
-  svgpicture.appendChild(node);
-  node = myCreateElementSVG("text"); // used for text display
-  node.appendChild(doc.createTextNode(" "));
-  node.setAttribute("id","coords");
-  svgpicture.appendChild(node);
-  border = defaultborder;
- }
- }
-}
-
-//////////////////////////user graphics commands start/////////////////////////
-
-function line(p,q,id,endpts) { // segment connecting points p,q (coordinates in units)
-  var node;
-  if (id!=null) node = doc.getElementById(id);
-  if (node==null) {
-    node = myCreateElementSVG("path");
-    node.setAttribute("id", id);
-    svgpicture.appendChild(node);
-  }
-  node.setAttribute("d","M"+(p[0]*xunitlength+origin[0])+","+
-    (height-p[1]*yunitlength-origin[1])+" "+
-    (q[0]*xunitlength+origin[0])+","+(height-q[1]*yunitlength-origin[1]));
-  node.setAttribute("stroke-width", strokewidth);
-  if (strokedasharray!=null) 
-    node.setAttribute("stroke-dasharray", strokedasharray);
-  node.setAttribute("stroke", stroke);
-  node.setAttribute("fill", fill);
-  node.setAttribute("stroke-opacity", strokeopacity);
-  node.setAttribute("fill-opacity", fillopacity);
-  if (marker=="dot" || marker=="arrowdot") {
-    ASdot(p,markersize,markerstroke,markerfill);
-    if (marker=="arrowdot") arrowhead(p,q);
-    ASdot(q,markersize,markerstroke,markerfill);
-  } else if (marker=="arrow") arrowhead(p,q);
-  if (endpts==null && endpoints!="") endpts = endpoints;
-  if (endpts!=null) {
-    if (endpts.indexOf("<-") != -1) arrowhead(q,p);
-    if (endpts.indexOf("o-") != -1) dot(p, "open");
-    if (endpts.indexOf("*-") != -1) dot(p, "closed");
-    if (endpts.indexOf("->") != -1) arrowhead(p,q);
-    if (endpts.indexOf("-o") != -1) dot(q, "open");
-    if (endpts.indexOf("-*") != -1) dot(q, "closed");
-  }
-}
-
-function path(plist,id,c,endpts) {
-  if (c==null) c="";
-  var node, st, i;
-  if (id!=null) node = doc.getElementById(id);
-  if (node==null) {
-    node = myCreateElementSVG("path");
-    node.setAttribute("id", id);
-    svgpicture.appendChild(node);
-  }
-  if (typeof plist == "string") st = plist;
-  else {
-    st = "M";
-    st += (plist[0][0]*xunitlength+origin[0])+","+
-          (height-plist[0][1]*yunitlength-origin[1])+" "+c;
-    for (i=1; i<plist.length; i++)
-      st += (plist[i][0]*xunitlength+origin[0])+","+
-            (height-plist[i][1]*yunitlength-origin[1])+" ";
-  }
-  node.setAttribute("d", st);
-  node.setAttribute("stroke-width", strokewidth);
-  if (strokedasharray!=null) 
-    node.setAttribute("stroke-dasharray", strokedasharray);
-  node.setAttribute("stroke", stroke);
-  node.setAttribute("fill", fill);
-  node.setAttribute("stroke-opacity", strokeopacity);
-  node.setAttribute("fill-opacity", fillopacity);
-  if (marker=="dot" || marker=="arrowdot")
-    for (i=0; i<plist.length; i++)
-      if (c!="C" && c!="T" || i!=1 && i!=2)
-        ASdot(plist[i],markersize,markerstroke,markerfill);
-  if (endpts==null && endpoints!="") endpts = endpoints;
-  if (endpts!=null) {
-    if (endpts.indexOf("<-") != -1) arrowhead(plist[1],plist[0]);
-    if (endpts.indexOf("o-") != -1) dot(plist[0], "open");
-    if (endpts.indexOf("*-") != -1) dot(plist[0], "closed");
-    if (endpts.indexOf("->") != -1) arrowhead(plist[plist.length-2],plist[plist.length-1]);
-    if (endpts.indexOf("-o") != -1) dot(plist[plist.length-1], "open");
-    if (endpts.indexOf("-*") != -1) dot(plist[plist.length-1], "closed");
-  }
-}
-
-function curve(plist,id,endpts) {
-  path(plist,id,"T",endpts);
-}
-
-function vector(p,q,id) {
-  line(p,q,id,"","->");
-}
-
-function circle(center,radius,id) { // coordinates in units
-  var node;
-  if (id!=null) node = doc.getElementById(id);
-  if (node==null) {
-    node = myCreateElementSVG("circle");
-    node.setAttribute("id", id);
-    svgpicture.appendChild(node);
-  }
-  node.setAttribute("cx",center[0]*xunitlength+origin[0]);
-  node.setAttribute("cy",height-center[1]*yunitlength-origin[1]);
-  node.setAttribute("r",radius*xunitlength);
-  node.setAttribute("stroke-width", strokewidth);
-  node.setAttribute("stroke", stroke);
-  node.setAttribute("fill", fill);
-  node.setAttribute("stroke-opacity", strokeopacity);
-  node.setAttribute("fill-opacity", fillopacity);
-}
-
-function loop(p,d,id) { 
-// d is a direction vector e.g. [1,0] means loop starts in that direction
-  if (d==null) d=[1,0];
-  path([p,[p[0]+d[0],p[1]+d[1]],[p[0]-d[1],p[1]+d[0]],p],id,"C");
-  if (marker=="arrow" || marker=="arrowdot") 
-    arrowhead([p[0]+Math.cos(1.4)*d[0]-Math.sin(1.4)*d[1],
-               p[1]+Math.sin(1.4)*d[0]+Math.cos(1.4)*d[1]],p);
-}
-
-function arc(start,end,radius,id,largearc) { // coordinates in units
-  var node, v;
-//alert([fill, stroke, origin, xunitlength, yunitlength, height])
-  if (id!=null) node = doc.getElementById(id);
-  if (largearc==null) largearc=0;
-  if (radius==null) {
-    v=[end[0]-start[0],end[1]-start[1]];
-    radius = Math.sqrt(v[0]*v[0]+v[1]*v[1]);
-  }
-  if (node==null) {
-    node = myCreateElementSVG("path");
-    node.setAttribute("id", id);
-    svgpicture.appendChild(node);
-  }
-  node.setAttribute("d","M"+(start[0]*xunitlength+origin[0])+","+
-    (height-start[1]*yunitlength-origin[1])+" A"+radius*xunitlength+","+
-     radius*yunitlength+" 0 "+largearc+",0 "+(end[0]*xunitlength+origin[0])+","+
-    (height-end[1]*yunitlength-origin[1]));
-  node.setAttribute("stroke-width", strokewidth);
-  node.setAttribute("stroke", stroke);
-  node.setAttribute("fill", fill);
-  node.setAttribute("stroke-opacity", strokeopacity);
-  node.setAttribute("fill-opacity", fillopacity);
-  if (marker=="arrow" || marker=="arrowdot") {
-    u = [(end[1]-start[1])/4,(start[0]-end[0])/4];
-    v = [(end[0]-start[0])/2,(end[1]-start[1])/2];
-//alert([u,v])
-    v = [start[0]+v[0]+u[0],start[1]+v[1]+u[1]];
-  } else v=[start[0],start[1]];
-  if (marker=="dot" || marker=="arrowdot") {
-    ASdot(start,markersize,markerstroke,markerfill);
-    if (marker=="arrowdot") arrowhead(v,end);
-    ASdot(end,markersize,markerstroke,markerfill);
-  } else if (marker=="arrow") arrowhead(v,end);
-}
-
-function sector(center,start,end,id) { // center,start,end should be isoceles
-  var rx = start[0]-center[0], ry = start[1]-center[1];
-  arc(start,end,Math.sqrt(rx*rx+ry*ry),id+"arc");
-  path([end,center,start],id+"path");
-}
-
-function ellipse(center,rx,ry,id) { // coordinates in units
-  var node;
-  if (id!=null) node = doc.getElementById(id);
-  if (node==null) {
-    node = myCreateElementSVG("ellipse");
-    node.setAttribute("id", id);
-    svgpicture.appendChild(node);
-  }
-  node.setAttribute("cx",center[0]*xunitlength+origin[0]);
-  node.setAttribute("cy",height-center[1]*yunitlength-origin[1]);
-  node.setAttribute("rx",rx*xunitlength);
-  node.setAttribute("ry",ry*yunitlength);
-  node.setAttribute("stroke-width", strokewidth);
-  node.setAttribute("stroke", stroke);
-  node.setAttribute("fill", fill);
-  node.setAttribute("stroke-opacity", strokeopacity);
-  node.setAttribute("fill-opacity", fillopacity);
-}
-
-function triangle(p,q,r,id) {
-  path([p,q,r,p],id)
-}
-
-function rect(p,q,id,rx,ry) { // opposite corners in units, rounded by radii
-  var node;
-  if (id!=null) node = doc.getElementById(id);
-  if (node==null) {
-    node = myCreateElementSVG("rect");
-    node.setAttribute("id", id);
-    svgpicture.appendChild(node);
-  }
-  node.setAttribute("x",p[0]*xunitlength+origin[0]);
-  node.setAttribute("y",height-q[1]*yunitlength-origin[1]);
-  node.setAttribute("width",(q[0]-p[0])*xunitlength);
-  node.setAttribute("height",(q[1]-p[1])*yunitlength);
-  if (rx!=null) node.setAttribute("rx",rx*xunitlength);
-  if (ry!=null) node.setAttribute("ry",ry*yunitlength);
-  node.setAttribute("stroke-width", strokewidth);
-  node.setAttribute("stroke", stroke);
-  node.setAttribute("fill", fill);
-  node.setAttribute("stroke-opacity", strokeopacity);
-  node.setAttribute("fill-opacity", fillopacity);
-}
-
-function text(p,st,pos,id,fontsty) {
-  var dnode, node, dx = 0, dy = fontsize/3, str = st.toString();
-  if (/(`|\$)/.test(str)) {  // layer for ASCIIMathML and LaTeXMathML
-    dnode = document.getElementById(svgpicture.getAttribute("name")+"mml");
-    if (dnode!=null) {
-      if (id!=null) node = document.getElementById(id);
-      if (node==null) {
-//alert(dnode.childNodes.length)
-        node = createElementXHTML("div");
-        node.setAttribute("id", id);
-        node.style.position = "absolute";
-        dnode.appendChild(node);
-      }
-      while (node.childNodes.length>0) node.removeChild(node.lastChild); 
-      node.appendChild(document.createTextNode(str));
-      if (/`/.test(str)) AMprocessNode(node); else LMprocessNode(node);
-      dx = -node.offsetWidth/2;
-      dy = -node.offsetHeight/2;
-      if (pos!=null) {
-        if (/above/.test(pos)) dy = -node.offsetHeight;
-        if (/below/.test(pos)) dy = 0;
-        if (/right/.test(pos)) dx = 0;
-        if ( /left/.test(pos)) dx = -node.offsetWidth;
-      }
-      node.style.left = ""+(p[0]*xunitlength+origin[0]+dx)+"px";
-      node.style.top = ""+(height-p[1]*yunitlength-origin[1]+dy)+"px";
-    }
-    return p;
-  }
-  var textanchor = "middle";  // regular text goes into SVG
-  if (pos!=null) {
-    if (/above/.test(pos)) dy = -fontsize/2;
-    if (/below/.test(pos)) dy = fontsize-0;
-    if (/right/.test(pos)) {textanchor = "start"; dx = fontsize/4;}
-    if ( /left/.test(pos)) {textanchor = "end";  dx = -fontsize/4;}
-  }
-  if (id!=null) node = doc.getElementById(id);
-  if (node==null) {
-    node = myCreateElementSVG("text");
-    node.setAttribute("id", id);
-    svgpicture.appendChild(node);
-    node.appendChild(doc.createTextNode(str));
-  }
-  while (node.childNodes.length>1) node.removeChild(node.lastChild); 
-  node.lastChild.nodeValue = "\xA0"+str+"\xA0";
-  node.setAttribute("x",p[0]*xunitlength+origin[0]+dx);
-  node.setAttribute("y",height-p[1]*yunitlength-origin[1]+dy);
-  node.setAttribute("font-style",(fontsty!=null?fontsty:
-    (str.search(/^[a-zA-Z]$/)!=-1?"italic":fontstyle)));
-  node.setAttribute("font-family",fontfamily);
-  node.setAttribute("font-size",fontsize);
-  node.setAttribute("font-weight",fontweight);
-  node.setAttribute("text-anchor",textanchor);
-  if (fontstroke!="none") node.setAttribute("stroke",fontstroke);
-  if (fontfill!="none") node.setAttribute("fill",fontfill);
-  return p;
-}
-
-function mtext(p,st,pos,fontsty,fontsz) { // method for updating text on an svg
-// "this" is the text object or the svgpicture object
-  var textanchor = "middle";
-  var dx = 0; var dy = fontsize/3;
-  if (pos!=null) {
-    if (pos.slice(0,5)=="above") dy = -fontsize/2;
-    if (pos.slice(0,5)=="below") dy = fontsize-0;
-    if (pos.slice(0,5)=="right" || pos.slice(5,10)=="right") {
-      textanchor = "start";
-      dx = fontsize/2;
-    }
-    if (pos.slice(0,4)=="left" || pos.slice(5,9)=="left") {
-      textanchor = "end";
-      dx = -fontsize/2;
-    }
-  }
-  var node = this;
-  if (this.nodeName=="svg") {
-    node = myCreateElementSVG("text");
-    this.appendChild(node);
-    node.appendChild(doc.createTextNode(st));
-  }
-  node.lastChild.nodeValue = st;
-  node.setAttribute("x",p[0]+dx);
-  node.setAttribute("y",p[1]+dy);
-  node.setAttribute("font-style",(fontsty!=null?fontsty:fontstyle));
-  node.setAttribute("font-family",fontfamily);
-  node.setAttribute("font-size",(fontsz!=null?fontsz:fontsize));
-  node.setAttribute("font-weight",fontweight);
-  node.setAttribute("text-anchor",textanchor);
-  if (fontstroke!="none") node.setAttribute("stroke",fontstroke);
-  if (fontfill!="none") node.setAttribute("fill",fontfill);
-}
-
-function image(imgurl,p,w,h,id) { // not working yet
-  var node;
-  if (id!=null) node = doc.getElementById(id);
-  if (node==null) {
-    node = myCreateElementSVG("image");
-    node.setAttribute("id", id);
-    svgpicture.appendChild(node);
-  }
-  node.setAttribute("x",p[0]*xunitlength+origin[0]);
-  node.setAttribute("y",height-p[1]*yunitlength-origin[1]);
-  node.setAttribute("width",w);
-  node.setAttribute("height",h);
-  node.setAttribute("xlink:href", imgurl);
-}
-
-function ASdot(center,radius,s,f) { // coordinates in units, radius in pixel
-  if (s==null) s = stroke; if (f==null) f = fill;
-  var node = myCreateElementSVG("circle");
-  node.setAttribute("cx",center[0]*xunitlength+origin[0]);
-  node.setAttribute("cy",height-center[1]*yunitlength-origin[1]);
-  node.setAttribute("r",radius);
-  node.setAttribute("stroke-width", strokewidth);
-  node.setAttribute("stroke", s);
-  node.setAttribute("fill", f);
-  svgpicture.appendChild(node);
-}
-
-function dot(center, typ, label, pos, id) {
-  var node;
-  var cx = center[0]*xunitlength+origin[0];
-  var cy = height-center[1]*yunitlength-origin[1];
-  if (id!=null) node = doc.getElementById(id);
-  if (typ=="+" || typ=="-" || typ=="|") {
-    if (node==null) {
-      node = myCreateElementSVG("path");
-      node.setAttribute("id", id);
-      svgpicture.appendChild(node);
-    }
-    if (typ=="+") {
-      node.setAttribute("d",
-        " M "+(cx-ticklength)+" "+cy+" L "+(cx+ticklength)+" "+cy+
-        " M "+cx+" "+(cy-ticklength)+" L "+cx+" "+(cy+ticklength));
-      node.setAttribute("stroke-width", .5);
-      node.setAttribute("stroke", axesstroke);
-    } else {
-      if (typ=="-") node.setAttribute("d",
-        " M "+(cx-ticklength)+" "+cy+" L "+(cx+ticklength)+" "+cy);
-      else node.setAttribute("d",
-        " M "+cx+" "+(cy-ticklength)+" L "+cx+" "+(cy+ticklength));
-      node.setAttribute("stroke-width", strokewidth);
-      node.setAttribute("stroke", stroke);
-    }
-  } else {
-    if (node==null) {
-      node = myCreateElementSVG("circle");
-      node.setAttribute("id", id);
-      svgpicture.appendChild(node);
-    }
-    node.setAttribute("cx",cx);
-    node.setAttribute("cy",cy);
-    node.setAttribute("r",dotradius);
-    node.setAttribute("stroke-width", strokewidth);
-    node.setAttribute("stroke", stroke);
-    node.setAttribute("fill", (typ=="open"?"white":
-                              (typ=="closed"?stroke:markerfill)));
-  }
-  if (label!=null) 
-    text(center,label,(pos==null?"below":pos),(id==null?id:id+"label"))
-}
-
-point = dot; //alternative name
-
-function arrowhead(p,q) { // draw arrowhead at q (in units) add size param
-  var up;
-  var v = [p[0]*xunitlength+origin[0],height-p[1]*yunitlength-origin[1]];
-  var w = [q[0]*xunitlength+origin[0],height-q[1]*yunitlength-origin[1]];
-  var u = [w[0]-v[0],w[1]-v[1]];
-  var d = Math.sqrt(u[0]*u[0]+u[1]*u[1]);
-  if (d > 0.00000001) {
-    u = [u[0]/d, u[1]/d];
-    up = [-u[1],u[0]];
-    var node = myCreateElementSVG("path");
-    node.setAttribute("d","M "+(w[0]-15*u[0]-4*up[0])+" "+
-      (w[1]-15*u[1]-4*up[1])+" L "+(w[0]-3*u[0])+" "+(w[1]-3*u[1])+" L "+
-      (w[0]-15*u[0]+4*up[0])+" "+(w[1]-15*u[1]+4*up[1])+" z");
-    node.setAttribute("stroke-width", markerstrokewidth);
-    node.setAttribute("stroke", stroke); /*was markerstroke*/
-    node.setAttribute("fill", stroke); /*was arrowfill*/
-    node.setAttribute("stroke-opacity", strokeopacity);
-    node.setAttribute("fill-opacity", fillopacity);
-    svgpicture.appendChild(node);    
-  }
-}
-
-function chopZ(st) {
-  var k = st.indexOf(".");
-  if (k==-1) return st;
-  for (var i=st.length-1; i>k && st.charAt(i)=="0"; i--);
-  if (i==k) i--;
-  return st.slice(0,i+1);
-}
-
-function grid(dx,dy) { // for backward compatibility
-  axes(dx,dy,null,dx,dy)
-}
-
-function noaxes() {
-  if (!initialized) initPicture();
-}
-
-function axes(dx,dy,labels,gdx,gdy) {
-//xscl=x is equivalent to xtick=x; xgrid=x; labels=true;
-  var x, y, ldx, ldy, lx, ly, lxp, lyp, pnode, st;
-  if (!initialized) initPicture();
-  if (typeof dx=="string") { labels = dx; dx = null; }
-  if (typeof dy=="string") { gdx = dy; dy = null; }
-  if (xscl!=null) {dx = xscl; gdx = xscl; labels = dx}
-  if (yscl!=null) {dy = yscl; gdy = yscl}
-  if (xtick!=null) {dx = xtick}
-  if (ytick!=null) {dy = ytick}
-  dx = (dx==null?xunitlength:dx*xunitlength);
-  dy = (dy==null?dx:dy*yunitlength);
-  fontsize = Math.min(dx/2,dy/2,16); //alert(fontsize)
-  ticklength = fontsize/4;
-  if (xgrid!=null) gdx = xgrid;
-  if (ygrid!=null) gdy = ygrid;
-  if (gdx!=null) {
-    gdx = (typeof gdx=="string"?dx:gdx*xunitlength);
-    gdy = (gdy==null?dy:gdy*yunitlength);
-    pnode = myCreateElementSVG("path");
-    st="";
-    for (x = origin[0]; x<width; x = x+gdx)
-      st += " M"+x+",0"+" "+x+","+height;
-    for (x = origin[0]-gdx; x>0; x = x-gdx)
-      st += " M"+x+",0"+" "+x+","+height;
-    for (y = height-origin[1]; y<height; y = y+gdy)
-      st += " M0,"+y+" "+width+","+y;
-    for (y = height-origin[1]-gdy; y>0; y = y-gdy)
-      st += " M0,"+y+" "+width+","+y;
-    pnode.setAttribute("d",st);
-    pnode.setAttribute("stroke-width", .5);
-    pnode.setAttribute("stroke", gridstroke);
-    pnode.setAttribute("fill", fill);
-    svgpicture.appendChild(pnode);
-  }
-  pnode = myCreateElementSVG("path");
-  st="M0,"+(height-origin[1])+" "+width+","+
-    (height-origin[1])+" M"+origin[0]+",0 "+origin[0]+","+height;
-  for (x = origin[0]+dx; x<width; x = x+dx)
-    st += " M"+x+","+(height-origin[1]+ticklength)+" "+x+","+
-           (height-origin[1]-ticklength);
-  for (x = origin[0]-dx; x>0; x = x-dx)
-    st += " M"+x+","+(height-origin[1]+ticklength)+" "+x+","+
-           (height-origin[1]-ticklength);
-  for (y = height-origin[1]+dy; y<height; y = y+dy)
-    st += " M"+(origin[0]+ticklength)+","+y+" "+(origin[0]-ticklength)+","+y;
-  for (y = height-origin[1]-dy; y>0; y = y-dy)
-    st += " M"+(origin[0]+ticklength)+","+y+" "+(origin[0]-ticklength)+","+y;
-  if (labels!=null) with (Math) {
-    ldx = dx/xunitlength;
-    ldy = dy/yunitlength;
-    lx = (xmin>0 || xmax<0?xmin:0);
-    ly = (ymin>0 || ymax<0?ymin:0);
-    lxp = (ly==0?"below":"above");
-    lyp = (lx==0?"left":"right");
-    var ddx = floor(1.1-log(ldx)/log(10))+1;
-    var ddy = floor(1.1-log(ldy)/log(10))+1;
-    for (x = ldx; x<=xmax; x = x+ldx)
-      text([x,ly],chopZ(x.toFixed(ddx)),lxp);
-    for (x = -ldx; xmin<=x; x = x-ldx)
-      text([x,ly],chopZ(x.toFixed(ddx)),lxp);
-    for (y = ldy; y<=ymax; y = y+ldy)
-      text([lx,y],chopZ(y.toFixed(ddy)),lyp);
-    for (y = -ldy; ymin<=y; y = y-ldy)
-      text([lx,y],chopZ(y.toFixed(ddy)),lyp);
-  }
-  fontsize = defaultfontsize;
-  pnode.setAttribute("d",st);
-  pnode.setAttribute("stroke-width", .5);
-  pnode.setAttribute("stroke", axesstroke);
-  pnode.setAttribute("fill", fill);
-  pnode.setAttribute("stroke-opacity", strokeopacity);
-  pnode.setAttribute("fill-opacity", fillopacity);
-  svgpicture.appendChild(pnode);
-}
-
-function mathjs(st) {
-  //translate a math formula to js function notation
-  // a^b --> pow(a,b)
-  // na --> n*a
-  // (...)d --> (...)*d
-  // n! --> factorial(n)
-  // sin^-1 --> arcsin etc.
-  //while ^ in string, find term on left and right
-  //slice and concat new formula string
-  st = st.replace(/\s/g,"");
-  if (st.indexOf("^-1")!=-1) {
-    st = st.replace(/sin\^-1/g,"arcsin");
-    st = st.replace(/cos\^-1/g,"arccos");
-    st = st.replace(/tan\^-1/g,"arctan");
-    st = st.replace(/sec\^-1/g,"arcsec");
-    st = st.replace(/csc\^-1/g,"arccsc");
-    st = st.replace(/cot\^-1/g,"arccot");
-    st = st.replace(/sinh\^-1/g,"arcsinh");
-    st = st.replace(/cosh\^-1/g,"arccosh");
-    st = st.replace(/tanh\^-1/g,"arctanh");
-    st = st.replace(/sech\^-1/g,"arcsech");
-    st = st.replace(/csch\^-1/g,"arccsch");
-    st = st.replace(/coth\^-1/g,"arccoth");
-  }
-  st = st.replace(/^e$/g,"(Math.E)");
-  st = st.replace(/^e([^a-zA-Z])/g,"(Math.E)$1");
-  st = st.replace(/([^a-zA-Z])e/g,"$1(Math.E)");
-//  st = st.replace(/([^a-zA-Z])e([^a-zA-Z])/g,"$1(Math.E)$2");
-  st = st.replace(/([0-9])([\(a-zA-Z])/g,"$1*$2");
-  st = st.replace(/\)([\(0-9a-zA-Z])/g,"\)*$1");
-  var i,j,k, ch, nested;
-  while ((i=st.indexOf("^"))!=-1) {
-    //find left argument
-    if (i==0) return "Error: missing argument";
-    j = i-1;
-    ch = st.charAt(j);
-    if (ch>="0" && ch<="9") {// look for (decimal) number
-      j--;
-      while (j>=0 && (ch=st.charAt(j))>="0" && ch<="9") j--;
-      if (ch==".") {
-        j--;
-        while (j>=0 && (ch=st.charAt(j))>="0" && ch<="9") j--;
-      }
-    } else if (ch==")") {// look for matching opening bracket and function name
-      nested = 1;
-      j--;
-      while (j>=0 && nested>0) {
-        ch = st.charAt(j);
-        if (ch=="(") nested--;
-        else if (ch==")") nested++;
-        j--;
-      }
-      while (j>=0 && (ch=st.charAt(j))>="a" && ch<="z" || ch>="A" && ch<="Z")
-        j--;
-    } else if (ch>="a" && ch<="z" || ch>="A" && ch<="Z") {// look for variable
-      j--;
-      while (j>=0 && (ch=st.charAt(j))>="a" && ch<="z" || ch>="A" && ch<="Z")
-        j--;
-    } else { 
-      return "Error: incorrect syntax in "+st+" at position "+j;
-    }
-    //find right argument
-    if (i==st.length-1) return "Error: missing argument";
-    k = i+1;
-    ch = st.charAt(k);
-    if (ch>="0" && ch<="9" || ch=="-") {// look for signed (decimal) number
-      k++;
-      while (k<st.length && (ch=st.charAt(k))>="0" && ch<="9") k++;
-      if (ch==".") {
-        k++;
-        while (k<st.length && (ch=st.charAt(k))>="0" && ch<="9") k++;
-      }
-    } else if (ch=="(") {// look for matching closing bracket and function name
-      nested = 1;
-      k++;
-      while (k<st.length && nested>0) {
-        ch = st.charAt(k);
-        if (ch=="(") nested++;
-        else if (ch==")") nested--;
-        k++;
-      }
-    } else if (ch>="a" && ch<="z" || ch>="A" && ch<="Z") {// look for variable
-      k++;
-      while (k<st.length && (ch=st.charAt(k))>="a" && ch<="z" ||
-               ch>="A" && ch<="Z") k++;
-    } else { 
-      return "Error: incorrect syntax in "+st+" at position "+k;
-    }
-    st = st.slice(0,j+1)+"Math.pow("+st.slice(j+1,i)+","+st.slice(i+1,k)+")"+
-           st.slice(k);
-  }
-  while ((i=st.indexOf("!"))!=-1) {
-    //find left argument
-    if (i==0) return "Error: missing argument";
-    j = i-1;
-    ch = st.charAt(j);
-    if (ch>="0" && ch<="9") {// look for (decimal) number
-      j--;
-      while (j>=0 && (ch=st.charAt(j))>="0" && ch<="9") j--;
-      if (ch==".") {
-        j--;
-        while (j>=0 && (ch=st.charAt(j))>="0" && ch<="9") j--;
-      }
-    } else if (ch==")") {// look for matching opening bracket and function name
-      nested = 1;
-      j--;
-      while (j>=0 && nested>0) {
-        ch = st.charAt(j);
-        if (ch=="(") nested--;
-        else if (ch==")") nested++;
-        j--;
-      }
-      while (j>=0 && (ch=st.charAt(j))>="a" && ch<="z" || ch>="A" && ch<="Z")
-        j--;
-    } else if (ch>="a" && ch<="z" || ch>="A" && ch<="Z") {// look for variable
-      j--;
-      while (j>=0 && (ch=st.charAt(j))>="a" && ch<="z" || ch>="A" && ch<="Z")
-        j--;
-    } else { 
-      return "Error: incorrect syntax in "+st+" at position "+j;
-    }
-    st = st.slice(0,j+1)+"factorial("+st.slice(j+1,i)+")"+st.slice(i+1);
-  }
-  return st;
-}
-
-function plot(fun,x_min,x_max,points,id,endpts) {
-  var pth = [];
-  var f = function(x) { return x }, g = fun;
-  var name = null;
-  if (typeof fun=="string") 
-    eval("g = function(x){ with(Math) return "+mathjs(fun)+" }");
-  else if (typeof fun=="object") {
-    eval("f = function(t){ with(Math) return "+mathjs(fun[0])+" }");
-    eval("g = function(t){ with(Math) return "+mathjs(fun[1])+" }");
-  }
-  if (typeof x_min=="string") { name = x_min; x_min = xmin }
-  else name = id;
-  var min = (x_min==null?xmin:x_min);
-  var max = (x_max==null?xmax:x_max);
-  var inc = max-min-0.000001*(max-min);
-  inc = (points==null?inc/200:inc/points);
-  var gt;
-//alert(typeof g(min))
-  for (var t = min; t <= max; t += inc) {
-    gt = g(t);
-    if (!(isNaN(gt)||Math.abs(gt)=="Infinity")) pth[pth.length] = [f(t), gt];
-  }
-  path(pth,name,null,endpts);
-  return pth;
-}
-
-// make polar plot
-
-// make Riemann sums
-
-function slopefield(fun,dx,dy) {
-  var g = fun;
-  if (typeof fun=="string") 
-    eval("g = function(x,y){ with(Math) return "+mathjs(fun)+" }");
-  var gxy,x,y,u,v,dz;
-  if (dx==null) dx=1;
-  if (dy==null) dy=1;
-  dz = Math.sqrt(dx*dx+dy*dy)/6;
-  var x_min = Math.ceil(xmin/dx);
-  var y_min = Math.ceil(ymin/dy);
-  for (x = x_min; x <= xmax; x += dx)
-    for (y = y_min; y <= ymax; y += dy) {
-      gxy = g(x,y);
-      if (!isNaN(gxy)) {
-        if (Math.abs(gxy)=="Infinity") {u = 0; v = dz;}
-        else {u = dz/Math.sqrt(1+gxy*gxy); v = gxy*u;}
-        line([x-u,y-v],[x+u,y+v]);
-      }
-    }
-}
-
-///////////////////////user graphics commands end here/////////////////////////
-
-function show_props(obj) {
-  var result = "";
-  for (var i=0; i< obj.childNodes.length; i++)
-    result += obj.childNodes.item(i) + "\n";
-  return result;
-}
-
-function displayCoord(evt) {
-  if (showcoordinates) {
-    var svgroot = evt.target.parentNode;
-    var nl = svgroot.childNodes;
-    for (var i=0; i<nl.length && nl.item(i).nodeName!="text"; i++);
-    var cnode = nl.item(i);
-    cnode.mtext = mtext;
-    cnode.mtext([svgroot.getAttribute("width")-(-7),svgroot.getAttribute("height")-7],"("+getX(evt).toFixed(2)+", "+getY(evt).toFixed(2)+")", "left", "", "11");
-/*    var dnode = nl.item(i+1);
-    dnode.mtext = mtext;
-    dnode.mtext([0,svgroot.getAttribute("height")-6],"Try (shift/alt)-dblclick", "right", "", "8");
-*/  }
-}
-
-function removeCoord(evt) {
-    var svgroot = evt.target.parentNode;
-    var nl = svgroot.childNodes;
-    for (var i=0; i<nl.length && nl.item(i).nodeName!="text"; i++);
-    var cnode = nl.item(i);
-    cnode.mtext = mtext;
-    cnode.mtext([svgroot.getAttribute("width")-0,svgroot.getAttribute("height")-0],"", "aboveleft", "");
-/*    var dnode = nl.item(i+1);
-    dnode.mtext = mtext;
-    dnode.mtext([0,svgroot.getAttribute("height")-0],"", "aboveright", "");
-*/}
-
-function initASCIIMathCalculators(li) {
-  var i;
-  for (i=0; i<li.length; i++) {
-    li[i].innerHTML = calcstr;
-    AMprocessNode(li[i]);
-  }
-  li = document.getElementsByTagName("textarea");
-  var st;
-  for (i=0; i<li.length; i++) {
-    st = li[i].getAttribute("onkeyup");
-    if (st!=null) eval(String(st).replace(/function anonymous\(\)/,""));
-  }
-}
-
-function calculate(inputId,outputId) {
-  var str = document.getElementById(inputId).value;
-  var err = "";
-  var ind = str.lastIndexOf("\n");
-  if (ind==str.length-1) str = str.slice(0,ind);
-  str = str.slice(str.lastIndexOf("\n")+1);
-  try {
-    var res = eval(mathjs(str));
-  } catch(e) {
-    err = "syntax incomplete";
-  }
-  if (!isNaN(res) && res!="Infinity") 
-    str = "`"+str+" =` "+(Math.abs(res-Math.round(res*1000000)/1000000)<1e-15?Math.round(res*1000000)/1000000:res)+err; 
-  else if (str!="") str = "`"+str+"` = undefined"; //debug:+mathjs(str);
-  var outnode = document.getElementById(outputId);
-  var n = outnode.childNodes.length;
-  for (var i=0; i<n; i++)
-    outnode.removeChild(outnode.firstChild);
-  outnode.appendChild(document.createTextNode(str));
-  AMprocessNode(outnode);
-}
-
-function append(st){
-  document.getElementById('in').value+=st;
-  calculate('in','out');
-  document.getElementById('in').scrollTop = 1000;
-  document.getElementById('in').focus();
-}
-
-function clearTextArea(){
-  document.getElementById('in').value="";
-  calculate('in','out');
-  document.getElementById('in').focus();
-}
-
-var calcstr = "<table align=\"center\">\n<tr><th>\nASCIIMath Scientific Calculator\n</th></tr>\n<tr><td>\nClick in the box to use your keyboard or use the buttons\n</td></tr>\n<tr><td>\n<textarea id=\"in\" rows=\"3\" cols=\"40\" onkeyup=\"calculate('in','out')\"></textarea></td></tr>\n<tr><td height=\"50\">Result: &nbsp; &nbsp; <span id=\"out\"></span></td></tr>\n</table>\n<table align=\"center\" cellspacing=\"0\" cellpadding=\"0\">\n<tbody align=\"center\">\n<tr>\n<td colspan=\"4\">\n<button onclick=\"append('sin^-1(')\"><font size=2>`sin^-1`</font></button><button onclick=\"append('cos^-1(')\"><font size=2>`cos^-1`</font></button><button onclick=\"append('tan^-1(')\"><font size=2>`tan^-1`</font></button></td>\n<td><button onclick=\"clearTextArea()\">&nbsp;`C`&nbsp;</button></td>\n\n</tr>\n<tr>\n<td><button onclick=\"append('pi')\">&nbsp;`pi` &nbsp;</button></td>\n<td><button onclick=\"append('sin(')\">&nbsp;`sin`</button></td>\n<td><button onclick=\"append('cos(')\">&nbsp;`cos`</button></td>\n<td><button onclick=\"append('tan(')\">&nbsp;`tan`</button></td>\n<td><button onclick=\"append('^')\">`x^y`</button></td>\n</tr>\n<tr>\n<td><button onclick=\"append('!')\">&nbsp; `!` &nbsp;</button></td>\n\n<td><button onclick=\"append('(')\"><font size=2>&nbsp;&nbsp;`(`&nbsp;&nbsp;</font></button></td>\n<td><button onclick=\"append(')')\"><font size=2>&nbsp;&nbsp;`)`&nbsp;&nbsp;</font></button></td>\n<td><button onclick=\"append('sqrt(')\"><font size=2>`sqrt({::}^\ )`</font></button></td>\n<td><button onclick=\"append('/')\">&nbsp;`-:\ `</button></td>\n</tr>\n<tr>\n<td><button onclick=\"append('log(')\">`log`</button></td>\n<td><button onclick=\"append('7')\">&nbsp; `7` &nbsp;</button></td>\n<td><button onclick=\"append('8')\">&nbsp; `8` &nbsp;</button></td>\n\n<td><button onclick=\"append('9')\">&nbsp; `9` &nbsp;</button></td>\n<td><button onclick=\"append('*')\">&nbsp;`times`&nbsp;</button></td>\n</tr>\n<tr>\n<td><button onclick=\"append('ln(')\">&nbsp;`ln`&nbsp;</button></td>\n<td><button onclick=\"append('4')\">&nbsp; `4` &nbsp;</button></td>\n<td><button onclick=\"append('5')\">&nbsp; `5` &nbsp;</button></td>\n<td><button onclick=\"append('6')\">&nbsp; `6` &nbsp;</button></td>\n\n<td><button onclick=\"append('-')\">&nbsp;`-{::}`&nbsp;</button></td>\n</tr>\n<tr>\n<td><button onclick=\"append('e')\">&nbsp; `e` &nbsp;</button></td>\n<td><button onclick=\"append('1')\">&nbsp;&nbsp;`1` &nbsp;</button></td>\n<td><button onclick=\"append('2')\">&nbsp; `2` &nbsp;</button></td>\n<td><button onclick=\"append('3')\">&nbsp; `3` &nbsp;</button></td>\n<td><button onclick=\"append('+')\">&nbsp;`+{::}`&nbsp;</button></td>\n\n</tr>\n<tr>\n<td> <!--button onclick=\"append('pi')\">&nbsp;`pi` &nbsp;</button--></td>\n<td><button onclick=\"append('0')\">&nbsp; `0` &nbsp;</button></td>\n<td><button onclick=\"append('.')\">&nbsp; `.` &nbsp;</button></td>\n<td><button onclick=\"append('\\n')\">&nbsp;`\"ent\"`</button></td>\n</tr>\n</tbody>\n</table>";
-
-// GO1.1 Generic onload by Brothercake
-// http://www.brothercake.com/
-//onload function (replaces the onload="translate()" in the <body> tag)
-function generic()
-{
-  if(!init()) return;
-  if (translateOnLoad) {
-    var nd = document.getElementById("processasciimathinmoodle");
-    if (nd!=null) dsvglocation = nd.className;
-    if (nd!=null || !checkforprocessasciimathinmoodle) {
-      translate();
-      if (!noSVG && translateASCIIsvg) drawPictures();
-    }
-    var li = getElementsByClass(document,"div","ASCIIMathCalculator");
-    if (!noMathML && li.length>0) initASCIIMathCalculators(li);
-  }
-};
-//setup onload function
-if(typeof window.addEventListener != 'undefined')
-{
-  //.. gecko, safari, konqueror and standard
-  window.addEventListener('load', generic, false);
-}
-else if(typeof document.addEventListener != 'undefined')
-{
-  //.. opera 7
-  document.addEventListener('load', generic, false);
-}
-else if(typeof window.attachEvent != 'undefined')
-{
-  //.. win/ie
-  window.attachEvent('onload', generic);
-}
-//** remove this condition to degrade older browsers
-else
-{
-  //.. mac/ie5 and anything else that gets this far
-  //if there's an existing onload function
-  if(typeof window.onload == 'function')
-  {
-    //store it
-    var existing = onload;
-    //add new onload handler
-    window.onload = function()
-    {
-      //call existing onload function
-      existing();
-      //call generic onload function
-      generic();
-    };
-  }
-  else
-  {
-    //setup onload function
-    window.onload = generic;
-  }
-}
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/Equation/Equation.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/Equation/Equation.js
deleted file mode 100644
index 8129cf1..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/Equation/Equation.js
+++ /dev/null
@@ -1,232 +0,0 @@
-/*------------------------------------------*\

- AsciiMathML Formula Editor for Xinha

- _______________________

- 

- Based on AsciiMathML by Peter Jipsen http://www.chapman.edu/~jipsen

- 

- Including a table with math symbols for easy input modified from CharacterMap for ASCIIMathML by Peter Jipsen

- HTMLSource based on HTMLArea XTD 1.5 (http://mosforge.net/projects/htmlarea3xtd/) modified by Holger Hees

- Original Author - Bernhard Pfeifer novocaine@gmx.net

- 

- See readme.txt

- 

- This program is free software; you can redistribute it and/or modify

- it under the terms of the GNU Lesser General Public License as published by

- the Free Software Foundation; either version 2.1 of the License, or (at

- your option) any later version.

-

- This program is distributed in the hope that it will be useful, 

- but WITHOUT ANY WARRANTY; without even the implied warranty of

- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU

- Lesser General Public License (at http://www.gnu.org/licenses/lgpl.html) 

- for more details.

-

- Raimund Meyer  11/23/2006

-     

-\*------------------------------------------*/

-function Equation(editor) {

-	this.editor = editor;

-

-	var cfg = editor.config;

-	var self = this;

-	

-

-	// register the toolbar buttons provided by this plugin

-	cfg.registerButton({

-	id       : "equation",

-	tooltip  : this._lc("Formula Editor"),

-	image    : editor.imgURL("equation.gif", "Equation"),

-	textMode : false,

-	action   : function(editor, id) {

-			self.buttonPress(editor, id);

-		}

-	});

-	cfg.addToolbarElement("equation", "inserthorizontalrule", -1);

-	

-	mathcolor = cfg.Equation.mathcolor;       // change it to "" (to inherit) or any other color

-	mathfontfamily = cfg.Equation.mathfontfamily;

-	

-	this.enabled = !Xinha.is_ie;

-	

-	if (this.enabled)

-	{	

-		this.onBeforeSubmit = this.onBeforeUnload = function () {self.unParse();};

-	}

-	

-	if (typeof  AMprocessNode != "function")

-	{

-		Xinha._loadback(Xinha.getPluginDir('Equation') + "/ASCIIMathML.js", function () { translate(); });

-	}

-}

-

-Xinha.Config.prototype.Equation =

-{

-	"mathcolor" : "black",       // change it to "" (to inherit) or any other color

-	"mathfontfamily" : "serif" // change to "" to inherit (works in IE) 

-                               // or another family (e.g. "arial")

-}

-

-Equation._pluginInfo = {

-	name          : "ASCIIMathML Formula Editor",

-	version       : "2.3 (2008-01-26)",

-	developer     : "Raimund Meyer",

-	developer_url : "http://x-webservice.net",

-	c_owner       : "",

-	sponsor       : "",

-	sponsor_url   : "",

-	license       : "GNU/LGPL"

-};

-

-Equation.prototype._lc = function(string) 

-{

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

-};

-Equation.prototype.onGenerate = function() 

-{

-	this.parse();

-};

-

-// avoid changing the formula in the editor

-Equation.prototype.onKeyPress = function(ev)

-{

-	if (this.enabled)

-	{

-		e = this.editor;

-		var span = e._getFirstAncestor(e.getSelection(),['span']);

-		if ( span && span.className == "AM" )

-		{

-			if (

-				ev.keyCode == 8 || // delete

-				ev.keyCode == 46 ||// backspace

-				ev.charCode	       // all character keys

-			) 

-			{ // stop event

-				Xinha._stopEvent(ev);

-				return true; 

-			}

-		}

-	}

-	return false;

-}

-Equation.prototype.onBeforeMode = function( mode )

-{

-	if (this.enabled && mode == 'textmode')

-	{

-		this.unParse();

-	}

-}

-Equation.prototype.onMode = function( mode )

-{

-	if (this.enabled && mode == 'wysiwyg')

-	{

-		this.parse();

-	}

-}

-

-Equation.prototype.parse = function ()

-{

-	if (this.enabled)

-	{

-		var doc = this.editor._doc;

-		var spans = doc.getElementsByTagName("span");

-		for (var i = 0;i<spans.length;i++)

-		{

-			var node = spans[i];

-			if (node.className != 'AM') continue;

-			if (node.innerHTML.indexOf(this.editor.cc) != -1) // avoid problems with source code position auxiliary character

-			{

-				node.innerHTML = node.innerHTML.replace(this.editor.cc,'');

-				node.parentNode.insertBefore(doc.createTextNode(this.editor.cc), node);

-			}

-			node.title = node.innerHTML;

-			// FF3 strict source document policy: 

-			// the span is taken from the editor document, processed in the plugin document, and put back in the editor

-			var clone = node.cloneNode(true);

-			try {

-				document.adoptNode(clone);

-			} catch (e) {}

-			AMprocessNode(clone, false);

-			try {

-				doc.adoptNode(clone);

-			} catch (e) {}

-			node.parentNode.replaceChild(clone, node);

-			// insert space before and after the protected node, otherwide one could get stuck

-			clone.parentNode.insertBefore(doc.createTextNode(String.fromCharCode(32)),clone);

-			clone.parentNode.insertBefore(doc.createTextNode(String.fromCharCode(32)),clone.nextSibling);

-		}

-	}

-}

-

-Equation.prototype.unParse = function ()

-{

-	var doc = this.editor._doc;

-	var spans = doc.getElementsByTagName("span");

-	for (var i = 0;i<spans.length;i++)

-	{

-		var node = spans[i];

-		if (node.className.indexOf ("AM") == -1 || node.getElementsByTagName("math").length == 0) continue;

-		var formula = '`' + node.getElementsByTagName('math')[0].getAttribute('title') + '`';

-		node.innerHTML = formula;

-		node.setAttribute("title", null);

-	}

-}

-

-Equation.prototype.buttonPress = function() 

-{

-	var self = this;

-	var editor = this.editor;

-	var args = {};

-	

-	args['editor'] = editor;

-	

-	var parent = editor._getFirstAncestor(editor.getSelection(),['span']);

-	if (parent)

-	{

-		args["editedNode"] = parent;

-	}

-	Dialog(Xinha.getPluginDir('Equation') + "/popups/dialog.html", function(params) {

-				self.insert(params);

-			}, args);

-};

-

-Equation.prototype.insert = function (param)

-{

-	if (typeof param == 'undefined' || param == null) return;

-

-	if (typeof param["formula"] != "undefined")

-	{

-		var formula = (param["formula"] != '') ? param["formula"].replace(/^`?(.*)`?$/m,"`$1`") : '';

-

-		if (param["editedNode"] && (param["editedNode"].tagName.toLowerCase() == 'span')) 

-		{

-			var span = param["editedNode"]; 

-			if (formula != '')

-			{

-				span.innerHTML = formula;

-				if (this.enabled) span.title = formula;

-			}

-			else

-			{

-				span.parentNode.removeChild(span);

-			}

-			

-		}

-		else if (!param["editedNode"] && formula != '')

-		{

-			if (this.enabled)

-			{			

-				var span = document.createElement('span');

-				span.className = 'AM';

-				this.editor.insertNodeAtSelection(span);

-				span.innerHTML = formula;

-				span.title = formula;

-			}

-			else

-			{

-				this.editor.insertHTML('<span class="AM">'+formula+'</span>');

-			}

-		}

-

-		if (this.enabled) this.parse();//AMprocessNode(this.editor._doc.body, false);

-	}

-}

diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/Equation/example.html b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/Equation/example.html
deleted file mode 100644
index d9c07a6..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/Equation/example.html
+++ /dev/null
@@ -1,45 +0,0 @@
-<!DOCTYPE html
-     PUBLIC "-//W3C//DTD XHTML 1.0 Strict//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>AsciiMathML Example</title>
-  <script type="text/javascript">
-    var mathcolor = "black"; 
-  </script>
-  <script type="text/javascript" src="ASCIIMathML.js"></script>
-<style type="text/css">
-  body { font-family: sans-serif }
-  pre {border: dotted grey thin; background-color:LightYellow; }
-  
-  </style>
-</head>
-
-<body >
-<h1>AsciiMathML Example</h1>
-<p>This shows how to set up your page to display MathML using AsciiMathML</p>
-<p>Add this to the head section of your document:</p>
-<pre>
-
-  &lt;!-- This block is optional configuration --&gt;
-  &lt;script type="text/javascript"&gt;
-    var mathcolor = "black"; // You may change the color of the formulae (default: red)
-    var showasciiformulaonhover = false; // helps students learn ASCIIMath, set to false if you like  (default:true)
-    var mathfontfamily = "Arial"; //and the font (default: serif, which is good I think)
-  &lt;/script&gt;
-  &lt;!-- THIS LOADS THE ACTUAL SCRIPT, PLEASE ADJUST THE URL --&lt;
-  &lt;script type="text/javascript" src="/xinha/plugins/Equation/ASCIIMathML.js"&gt;&lt;/script&gt;
-
-
-</pre>
-<p><span class="AM">`int_a^bf(x)dx`</span></p>
-<p><span class="AM">`[[a,b],[c,d]]`</span><br /></p>
-<p>
- ASCIIMathML by <a href="http://www.chapman.edu/~jipsen" onclick="window.open(this.href,'_blank');return false;">Peter Jipsen</a>, 
-<a href="http://www.chapman.edu" onclick="window.open(this.href,'_blank');return false;">Chapman University</a><br />
-  For more information on AsciiMathML visit this page: <a href="http://www1.chapman.edu/~jipsen/mathml/asciimath.html" onclick="window.open(this.href,'_blank','');return false;">http://www1.chapman.edu/~jipsen/mathml/asciimath.html</a>
-
-</p>
-</body>
-</html>
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/Equation/img/abs_value.gif b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/Equation/img/abs_value.gif
deleted file mode 100644
index 5c8798f..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/Equation/img/abs_value.gif
+++ /dev/null
Binary files differ
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/Equation/img/diag_fraction.gif b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/Equation/img/diag_fraction.gif
deleted file mode 100644
index e38b805..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/Equation/img/diag_fraction.gif
+++ /dev/null
Binary files differ
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/Equation/img/divide.gif b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/Equation/img/divide.gif
deleted file mode 100644
index bb5a9f8..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/Equation/img/divide.gif
+++ /dev/null
Binary files differ
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/Equation/img/dsp_greater_equal.gif b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/Equation/img/dsp_greater_equal.gif
deleted file mode 100644
index e3b2271..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/Equation/img/dsp_greater_equal.gif
+++ /dev/null
Binary files differ
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/Equation/img/dsp_less_equal.gif b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/Equation/img/dsp_less_equal.gif
deleted file mode 100644
index 7377747..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/Equation/img/dsp_less_equal.gif
+++ /dev/null
Binary files differ
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/Equation/img/dsp_notequal.gif b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/Equation/img/dsp_notequal.gif
deleted file mode 100644
index c8165cb..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/Equation/img/dsp_notequal.gif
+++ /dev/null
Binary files differ
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/Equation/img/equation.gif b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/Equation/img/equation.gif
deleted file mode 100644
index 37bc27a..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/Equation/img/equation.gif
+++ /dev/null
Binary files differ
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/Equation/img/equation.old.gif b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/Equation/img/equation.old.gif
deleted file mode 100644
index ffac77a..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/Equation/img/equation.old.gif
+++ /dev/null
Binary files differ
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/Equation/img/greater_equal_than.gif b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/Equation/img/greater_equal_than.gif
deleted file mode 100644
index 0137712..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/Equation/img/greater_equal_than.gif
+++ /dev/null
Binary files differ
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/Equation/img/hor_fraction.gif b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/Equation/img/hor_fraction.gif
deleted file mode 100644
index 7ee0ac8..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/Equation/img/hor_fraction.gif
+++ /dev/null
Binary files differ
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/Equation/img/less_equal_than.gif b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/Equation/img/less_equal_than.gif
deleted file mode 100644
index 9e1be5f..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/Equation/img/less_equal_than.gif
+++ /dev/null
Binary files differ
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/Equation/img/mul.gif b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/Equation/img/mul.gif
deleted file mode 100644
index f271c91..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/Equation/img/mul.gif
+++ /dev/null
Binary files differ
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/Equation/img/notequal.gif b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/Equation/img/notequal.gif
deleted file mode 100644
index da56202..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/Equation/img/notequal.gif
+++ /dev/null
Binary files differ
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/Equation/img/parenthesis.gif b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/Equation/img/parenthesis.gif
deleted file mode 100644
index 5e6f88b..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/Equation/img/parenthesis.gif
+++ /dev/null
Binary files differ
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/Equation/img/root.gif b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/Equation/img/root.gif
deleted file mode 100644
index b226e45..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/Equation/img/root.gif
+++ /dev/null
Binary files differ
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/Equation/img/square_root.gif b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/Equation/img/square_root.gif
deleted file mode 100644
index 03f3417..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/Equation/img/square_root.gif
+++ /dev/null
Binary files differ
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/Equation/lang/ch.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/Equation/lang/ch.js
deleted file mode 100644
index 9d78e44..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/Equation/lang/ch.js
+++ /dev/null
@@ -1,14 +0,0 @@
-// I18N constants
-// LANG: "ch", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Cancel": "取消",
-    "OK": "好"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/Equation/lang/cz.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/Equation/lang/cz.js
deleted file mode 100644
index 36b9929..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/Equation/lang/cz.js
+++ /dev/null
@@ -1,14 +0,0 @@
-// I18N constants
-// LANG: "cz", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Cancel": "Zrušit",
-    "OK": "OK"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/Equation/lang/da.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/Equation/lang/da.js
deleted file mode 100644
index fcec7bf..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/Equation/lang/da.js
+++ /dev/null
@@ -1,15 +0,0 @@
-// I18N constants
-// LANG: "da", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Cancel": "Annuller",
-    "OK": "OK",
-    "Preview": "Smugkig"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/Equation/lang/de.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/Equation/lang/de.js
deleted file mode 100644
index d60f704..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/Equation/lang/de.js
+++ /dev/null
@@ -1,24 +0,0 @@
-// I18N constants
-// LANG: "de", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "AsciiMath Formula Input": "AsciiMath Formeleditor",
-    "Cancel": "Abbrechen",
-    "Formula Editor": "Formeleditor",
-    "Input": "Eingabe",
-    "OK": "OK",
-    "Preview": "Vorschau",
-    "__OBSOLETE__": {
-        "Attention Internet Explorer users: Please note that there is no WYSIWYG representation of the formula in the editor!<br />You might wish to use <a href=\"http://www.mozilla.com\" onclick=\"window.open(this.href,'_blank');return false;\">Mozilla Firefox</a> instead.": "Achtung Internet Explorer-Benutzer: Die Formel wird im Editor nicht als WYSIWYG dargestellt.<br />Benutzen Sie <a href=\"http://www.mozilla.com\" target=\"_blank\">Mozilla Firefox</a> als Alternative.",
-        "Based on ASCIIMathML by ": "Basiert auf ASCIIMathML von ",
-        "For more information on AsciiMathML visit this page: ": "Für weitere Informationen besuchen Sie bitte diese Seite: ",
-        "Show MathML": "Zeige MathML"
-    }
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/Equation/lang/ee.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/Equation/lang/ee.js
deleted file mode 100644
index ba916e9..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/Equation/lang/ee.js
+++ /dev/null
@@ -1,14 +0,0 @@
-// I18N constants
-// LANG: "ee", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Cancel": "Loobu",
-    "OK": "OK"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/Equation/lang/el.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/Equation/lang/el.js
deleted file mode 100644
index f6e006c..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/Equation/lang/el.js
+++ /dev/null
@@ -1,14 +0,0 @@
-// I18N constants
-// LANG: "el", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Cancel": "Ακύρωση",
-    "OK": "Εντάξει"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/Equation/lang/es.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/Equation/lang/es.js
deleted file mode 100644
index c5c1122..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/Equation/lang/es.js
+++ /dev/null
@@ -1,15 +0,0 @@
-// I18N constants
-// LANG: "es", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Cancel": "Cancelar",
-    "OK": "Aceptar",
-    "Preview": "Previsualizar"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/Equation/lang/eu.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/Equation/lang/eu.js
deleted file mode 100644
index c74e425..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/Equation/lang/eu.js
+++ /dev/null
@@ -1,15 +0,0 @@
-// I18N constants
-// LANG: "eu", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Cancel": "Utzi",
-    "OK": "Ados",
-    "Preview": "Aurrebista"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/Equation/lang/fa.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/Equation/lang/fa.js
deleted file mode 100644
index 89dc774..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/Equation/lang/fa.js
+++ /dev/null
@@ -1,15 +0,0 @@
-// I18N constants
-// LANG: "fa", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Cancel": "انصراف",
-    "OK": "بله",
-    "Preview": "پیش نمایش"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/Equation/lang/fi.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/Equation/lang/fi.js
deleted file mode 100644
index 82552b9..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/Equation/lang/fi.js
+++ /dev/null
@@ -1,14 +0,0 @@
-// I18N constants
-// LANG: "fi", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Cancel": "Peruuta",
-    "OK": "Hyväksy"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/Equation/lang/fr.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/Equation/lang/fr.js
deleted file mode 100644
index 197a654..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/Equation/lang/fr.js
+++ /dev/null
@@ -1,15 +0,0 @@
-// I18N constants
-// LANG: "fr", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Cancel": "Annuler",
-    "OK": "OK",
-    "Preview": "Aperçu "
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/Equation/lang/he.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/Equation/lang/he.js
deleted file mode 100644
index a602f7c..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/Equation/lang/he.js
+++ /dev/null
@@ -1,14 +0,0 @@
-// I18N constants
-// LANG: "he", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Cancel": "ביטול",
-    "OK": "אישור"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/Equation/lang/hu.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/Equation/lang/hu.js
deleted file mode 100644
index b38528d..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/Equation/lang/hu.js
+++ /dev/null
@@ -1,14 +0,0 @@
-// I18N constants
-// LANG: "hu", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Cancel": "Mégsem",
-    "OK": "Rendben"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/Equation/lang/it.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/Equation/lang/it.js
deleted file mode 100644
index a0acb45..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/Equation/lang/it.js
+++ /dev/null
@@ -1,14 +0,0 @@
-// I18N constants
-// LANG: "it", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Cancel": "Annullamento",
-    "OK": "OK"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/Equation/lang/ja.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/Equation/lang/ja.js
deleted file mode 100644
index e671843..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/Equation/lang/ja.js
+++ /dev/null
@@ -1,23 +0,0 @@
-// I18N constants
-// LANG: "ja", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "AsciiMath Formula Input": "AsciiMath 数式入力",
-    "Cancel": "中止",
-    "Formula Editor": "数式エディタ",
-    "Input": "入力",
-    "OK": "OK",
-    "Preview": "表示",
-    "__OBSOLETE__": {
-        "Attention: Editing the formula in the editor is not possible, please use this dialog!": "注意: エディタで数式を編集することはできません。必ず、このダイアログを使用してください",
-        "Based on ASCIIMathML by ": "Based on ASCIIMathML by ",
-        "For more information on AsciiMathML visit this page: ": "AsciiMathの詳細はこのページにあります: "
-    }
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/Equation/lang/lc_base.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/Equation/lang/lc_base.js
deleted file mode 100644
index d2d18ba..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/Equation/lang/lc_base.js
+++ /dev/null
@@ -1,329 +0,0 @@
-// I18N constants
-//
-// LANG: "en", ENCODING: UTF-8
-// Author: Translator-Name, <email@example.com>
-//
-// Last revision: 2018-04-12
-// 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).
-//
-// (Please, remove information below)
-// 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.)
-
-{
-    "!=": "",
-    "!in": "",
-    "&gt;-": "",
-    "&gt;=": "",
-    "&lt;=": "",
-    "&lt;=&gt;": "",
-    "&lt;x&gt;": "",
-    "&nbsp; `!` &nbsp;": "",
-    "&nbsp; `.` &nbsp;": "",
-    "&nbsp; `0` &nbsp;": "",
-    "&nbsp; `2` &nbsp;": "",
-    "&nbsp; `3` &nbsp;": "",
-    "&nbsp; `4` &nbsp;": "",
-    "&nbsp; `5` &nbsp;": "",
-    "&nbsp; `6` &nbsp;": "",
-    "&nbsp; `7` &nbsp;": "",
-    "&nbsp; `8` &nbsp;": "",
-    "&nbsp; `9` &nbsp;": "",
-    "&nbsp; `e` &nbsp;": "",
-    "&nbsp;&nbsp;`1` &nbsp;": "",
-    "&nbsp;`+{::}`&nbsp;": "",
-    "&nbsp;`-:\\ `": "",
-    "&nbsp;`-{::}`&nbsp;": "",
-    "&nbsp;`C`&nbsp;": "",
-    "&nbsp;`cos`": "",
-    "&nbsp;`ln`&nbsp;": "",
-    "&nbsp;`pi` &nbsp;": "",
-    "&nbsp;`sin`": "",
-    "&nbsp;`tan`": "",
-    "&nbsp;`times`&nbsp;": "",
-    "&quot;text&quot;": "",
-    "'+formula+'": "",
-    "((n),(k))": "",
-    "(x+1)/(x-1)": "",
-    "*": "",
-    "**": "",
-    "+-": "",
-    "-&gt;": "",
-    "-&lt;": "",
-    "-:": "",
-    "-=": "",
-    "//": "",
-    "/_": "",
-    ":.": "",
-    "=&gt;": "",
-    "@": "",
-    "AA": "",
-    "AsciiMath Formula Input": "",
-    "AsciiMathML Example": "",
-    "Based on ASCIIMathML by": "",
-    "CC": "",
-    "Cancel": "",
-    "Delta": "",
-    "EE": "",
-    "For more information on AsciiMathML visit this page:": "",
-    "Formula Editor": "",
-    "Gamma": "",
-    "Input": "",
-    "Lambda": "",
-    "NN": "",
-    "O/": "",
-    "OK": "",
-    "Omega": "",
-    "Phi": "",
-    "Pi": "",
-    "Preview": "",
-    "Psi": "",
-    "QQ": "",
-    "RR": "",
-    "Sigma": "",
-    "TT": "",
-    "Theta": "",
-    "Xi": "",
-    "ZZ": "",
-    "[[a,b],[c,d]]": "",
-    "\\\\": "",
-    "\\nClick in the box to use your keyboard or use the buttons\\n": "",
-    "^^": "",
-    "^^^": "",
-    "__|": "",
-    "_|_": "",
-    "`!=`": "",
-    "`!in`": "",
-    "`&and;`": "",
-    "`&cap;`": "",
-    "`&cup;`": "",
-    "`&gt;-`": "",
-    "`&gt;=`": "",
-    "`&lt;=&gt;`": "",
-    "`&lt;=`": "",
-    "`&lt;x&gt;`": "",
-    "`&or;`": "",
-    "`&quot;text&quot;`": "",
-    "`((n),(k))`": "",
-    "`(x+1)/(x-1)`": "",
-    "`**`": "",
-    "`*`": "",
-    "`+-`": "",
-    "`-&gt;`": "",
-    "`-&lt;`": "",
-    "`-:`": "",
-    "`-=`": "",
-    "`//`": "",
-    "`/_`": "",
-    "`:.`": "",
-    "`=&gt;`": "",
-    "`@`": "",
-    "`AA`": "",
-    "`CC`": "",
-    "`Delta`": "",
-    "`EE`": "",
-    "`Gamma`": "",
-    "`Lambda`": "",
-    "`NN`": "",
-    "`O/`": "",
-    "`Omega`": "",
-    "`Phi`": "",
-    "`Pi`": "",
-    "`Psi`": "",
-    "`QQ`": "",
-    "`RR`": "",
-    "`Sigma`": "",
-    "`TT`": "",
-    "`Theta`": "",
-    "`Xi`": "",
-    "`ZZ`": "",
-    "`[[a,b],[c,d]]`": "",
-    "`\\\\`": "",
-    "`__|`": "",
-    "`_|_`": "",
-    "`aleph`": "",
-    "`alpha`": "",
-    "`and`": "",
-    "`bara`": "",
-    "`bba`": "",
-    "`bbba`": "",
-    "`beta`": "",
-    "`cca`": "",
-    "`chi`": "",
-    "`darr`": "",
-    "`ddota`": "",
-    "`del`": "",
-    "`delta`": "",
-    "`diamond`": "",
-    "`dota`": "",
-    "`dy/dx`": "",
-    "`epsi`": "",
-    "`eta`": "",
-    "`fra`": "",
-    "`gamma`": "",
-    "`grad`": "",
-    "`hArr`": "",
-    "`harr`": "",
-    "`hata`": "",
-    "`if`": "",
-    "`in`": "",
-    "`int`": "",
-    "`iota`": "",
-    "`kappa`": "",
-    "`lArr`": "",
-    "`lambda`": "",
-    "`larr`": "",
-    "`lim_(x-&gt;oo)`": "",
-    "`log`": "",
-    "`mu`": "",
-    "`nn`": "",
-    "`not`": "",
-    "`nu`": "",
-    "`o+`": "",
-    "`o.`": "",
-    "`oint`": "",
-    "`omega`": "",
-    "`oo`": "",
-    "`or`": "",
-    "`ox`": "",
-    "`phi`": "",
-    "`pi`": "",
-    "`prod`": "",
-    "`prop`": "",
-    "`psi`": "",
-    "`quad`": "",
-    "`rArr`": "",
-    "`rho`": "",
-    "`root(n)(x)`": "",
-    "`sfa`": "",
-    "`sigma`": "",
-    "`sqrt(x)`": "",
-    "`square`": "",
-    "`stackrel(-&gt;)(+)`": "",
-    "`sub`": "",
-    "`sube`": "",
-    "`sum`": "",
-    "`sup`": "",
-    "`supe`": "",
-    "`tau`": "",
-    "`theta`": "",
-    "`tta`": "",
-    "`uarr`": "",
-    "`ula`": "",
-    "`upsilon`": "",
-    "`uu`": "",
-    "`veca`": "",
-    "`vv`": "",
-    "`x_(mn)`": "",
-    "`xi`": "",
-    "`xx`": "",
-    "`zeta`": "",
-    "`|-&gt;`": "",
-    "`|--`": "",
-    "`|==`": "",
-    "`|__`": "",
-    "`|~`": "",
-    "`~=`": "",
-    "`~|`": "",
-    "`~~`": "",
-    "aleph": "",
-    "alpha": "",
-    "and": "",
-    "bara": "",
-    "bba": "",
-    "bbba": "",
-    "beta": "",
-    "cca": "",
-    "chi": "",
-    "darr": "",
-    "ddota": "",
-    "del": "",
-    "delta": "",
-    "diamond": "",
-    "dota": "",
-    "dy/dx": "",
-    "epsi": "",
-    "eta": "",
-    "fra": "",
-    "gamma": "",
-    "grad": "",
-    "hArr": "",
-    "harr": "",
-    "hata": "",
-    "if": "",
-    "in": "",
-    "int": "",
-    "int_a^bf(x)dx": "",
-    "iota": "",
-    "kappa": "",
-    "lArr": "",
-    "lambda": "",
-    "larr": "",
-    "lim_(x-&gt;oo)": "",
-    "mu": "",
-    "nn": "",
-    "nnn": "",
-    "not": "",
-    "nu": "",
-    "o+": "",
-    "o.": "",
-    "oint": "",
-    "omega": "",
-    "oo": "",
-    "or": "",
-    "ox": "",
-    "phi": "",
-    "pi": "",
-    "prod": "",
-    "prop": "",
-    "psi": "",
-    "quad": "",
-    "rArr": "",
-    "rho": "",
-    "root(n)(x)": "",
-    "sfa": "",
-    "sigma": "",
-    "sqrt(x)": "",
-    "square": "",
-    "stackrel(-&gt;)(+)": "",
-    "sub": "",
-    "sube": "",
-    "sum": "",
-    "sum_(n=1)^oo": "",
-    "sup": "",
-    "supe": "",
-    "tau": "",
-    "theta": "",
-    "tta": "",
-    "uarr": "",
-    "ula": "",
-    "upsilon": "",
-    "uu": "",
-    "uuu": "",
-    "veca": "",
-    "vv": "",
-    "vvv": "",
-    "x^(m+n)": "",
-    "x_(mn)": "",
-    "xi": "",
-    "xx": "",
-    "zeta": "",
-    "|-&gt;": "",
-    "|--": "",
-    "|==": "",
-    "|__": "",
-    "|~": "",
-    "~=": "",
-    "~|": "",
-    "~~": ""
-}
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/Equation/lang/lt.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/Equation/lang/lt.js
deleted file mode 100644
index d118909..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/Equation/lang/lt.js
+++ /dev/null
@@ -1,14 +0,0 @@
-// I18N constants
-// LANG: "lt", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Cancel": "Atšaukti",
-    "OK": "OK"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/Equation/lang/lv.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/Equation/lang/lv.js
deleted file mode 100644
index f83d5d3..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/Equation/lang/lv.js
+++ /dev/null
@@ -1,14 +0,0 @@
-// I18N constants
-// LANG: "lv", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Cancel": "Atcelt",
-    "OK": "Labi"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/Equation/lang/nb.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/Equation/lang/nb.js
deleted file mode 100644
index ed6df01..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/Equation/lang/nb.js
+++ /dev/null
@@ -1,15 +0,0 @@
-// I18N constants
-// LANG: "nb", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Cancel": "Avbryt",
-    "OK": "OK",
-    "Preview": "Forhåndsvisning"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/Equation/lang/nl.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/Equation/lang/nl.js
deleted file mode 100644
index ed5705c..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/Equation/lang/nl.js
+++ /dev/null
@@ -1,23 +0,0 @@
-// I18N constants
-// LANG: "nl", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "AsciiMath Formula Input": "AsciiMath Formule Invoeren",
-    "Cancel": "Annuleren",
-    "Formula Editor": "Formule Invoeren",
-    "Input": "Invoer",
-    "OK": "OK",
-    "Preview": "Voorbeeld",
-    "__OBSOLETE__": {
-        "Attention: Editing the formula in the editor is not possible, please use this dialog!": "Let op! het bewerken van de formule in de editor is niet mogelijk, gebruik dit dialoog!",
-        "Based on ASCIIMathML by ": "Gebasseerd op  ASCIIMathML van ",
-        "For more information on AsciiMathML visit this page: ": "Voor meer informatie over AsciiMathML ga je naar: "
-    }
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/Equation/lang/pl.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/Equation/lang/pl.js
deleted file mode 100644
index 0df2fd2..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/Equation/lang/pl.js
+++ /dev/null
@@ -1,15 +0,0 @@
-// I18N constants
-// LANG: "pl", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Cancel": "Anuluj",
-    "OK": "OK",
-    "Preview": "Podgląd"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/Equation/lang/pt_br.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/Equation/lang/pt_br.js
deleted file mode 100644
index fd4bc74..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/Equation/lang/pt_br.js
+++ /dev/null
@@ -1,31 +0,0 @@
-// I18N constants
-// LANG: "pt_br", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "&quot;text&quot;": "&quot;text&quot;",
-    "AsciiMath Formula Input": "Inserir Fórmula AsciiMath",
-    "AsciiMathML Example": "Exemplo AsciiMathML",
-    "Based on ASCIIMathML by": "Baseado no ASCIIMathML por",
-    "Cancel": "Cancelar",
-    "For more information on AsciiMathML visit this page:": "Para maiores informações do AsciiMathML visite este site:",
-    "Formula Editor": "Editor de Fórmula",
-    "Input": "Entrada",
-    "OK": "OK",
-    "Preview": "Visualizar",
-    "`&quot;text&quot;`": "`&quot;texto&quot;`",
-    "__OBSOLETE__": {
-        "Attention Internet Explorer users: Please note that there is no WYSIWYG representation of the formula in the editor! You might wish to use Mozilla Firefox instead.": "Atenção usuários do Internet Explorer: Observe que não é possível representar fórmulas no editor no modo de visualização! É preferivelmente que você utilize o Mozilla Firefox.",
-        "Attention: Editing the formula in the editor is not possible, please use this dialog!": "Atenção: Não é possível editar a fórmula no editor. Ppor favor, utilize este caixa de diálogo!",
-        "Equation": "Equação",
-        "Insert": "Inserir",
-        "Select operation": "Selecionar operação",
-        "Show MathML": "Mostrar MathML"
-    }
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/Equation/lang/ro.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/Equation/lang/ro.js
deleted file mode 100644
index 9d6e1c3..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/Equation/lang/ro.js
+++ /dev/null
@@ -1,14 +0,0 @@
-// I18N constants
-// LANG: "ro", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Cancel": "Renunţă",
-    "OK": "Acceptă"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/Equation/lang/ru.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/Equation/lang/ru.js
deleted file mode 100644
index ee49512..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/Equation/lang/ru.js
+++ /dev/null
@@ -1,15 +0,0 @@
-// I18N constants
-// LANG: "ru", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Cancel": "Отмена",
-    "OK": "OK",
-    "Preview": "Предварительный просмотр"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/Equation/lang/sh.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/Equation/lang/sh.js
deleted file mode 100644
index 1284477..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/Equation/lang/sh.js
+++ /dev/null
@@ -1,15 +0,0 @@
-// I18N constants
-// LANG: "sh", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Cancel": "Poništi",
-    "OK": "OK",
-    "Preview": "Pregled"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/Equation/lang/si.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/Equation/lang/si.js
deleted file mode 100644
index 7674892..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/Equation/lang/si.js
+++ /dev/null
@@ -1,14 +0,0 @@
-// I18N constants
-// LANG: "si", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Cancel": "Prekliči",
-    "OK": "V redu"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/Equation/lang/sr.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/Equation/lang/sr.js
deleted file mode 100644
index 2419b45..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/Equation/lang/sr.js
+++ /dev/null
@@ -1,15 +0,0 @@
-// I18N constants
-// LANG: "sr", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Cancel": "Поништи",
-    "OK": "OK",
-    "Preview": "Преглед"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/Equation/lang/sv.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/Equation/lang/sv.js
deleted file mode 100644
index 287ca02..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/Equation/lang/sv.js
+++ /dev/null
@@ -1,15 +0,0 @@
-// I18N constants
-// LANG: "sv", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Cancel": "Avbryt",
-    "OK": "OK",
-    "Preview": "Förhandsgranska"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/Equation/lang/th.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/Equation/lang/th.js
deleted file mode 100644
index 9da9c8d..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/Equation/lang/th.js
+++ /dev/null
@@ -1,14 +0,0 @@
-// I18N constants
-// LANG: "th", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Cancel": "ยกเลิก",
-    "OK": "ตกลง"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/Equation/lang/tr.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/Equation/lang/tr.js
deleted file mode 100644
index 95e9ce2..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/Equation/lang/tr.js
+++ /dev/null
@@ -1,15 +0,0 @@
-// I18N constants
-// LANG: "tr", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Cancel": "İptal",
-    "OK": "Tamam",
-    "Preview": "Önizleme"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/Equation/lang/vn.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/Equation/lang/vn.js
deleted file mode 100644
index 2d82e02..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/Equation/lang/vn.js
+++ /dev/null
@@ -1,14 +0,0 @@
-// I18N constants
-// LANG: "vn", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Cancel": "Hủy",
-    "OK": "Đồng ý"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/Equation/popups/dialog.html b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/Equation/popups/dialog.html
deleted file mode 100644
index 0b9b2ca..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/Equation/popups/dialog.html
+++ /dev/null
@@ -1,377 +0,0 @@
-<!DOCTYPE html
-     PUBLIC "-//W3C//DTD XHTML 1.0 Strict//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>AsciiMath Formula Input</title>
-  <script type="text/javascript" src="../../../popups/popup.js"></script>
-  <script type="text/javascript" src="../ASCIIMathML.js"></script>
-  <link rel="stylesheet" type="text/css" href="../../../popups/popup.css" />
-
-  <style type="text/css">
-	/* <![CDATA[ */
-	#outputNode,#inputText,#mathml {
-		padding:5px;
-		background-color:white;
-		width:98%;
-		height:200px;
-		font-size:1.3em;
-		border: 1px solid darkgrey;
-		overflow:auto;
-	}
-	#clickInput {
-		width:100%;
-		border-collapse:collapse;
-		background-color: white;
-		text-align:center;
-	}
-	#clickInput td {
-		border: thin solid gray;
-		cursor:pointer;
-		font-size:1.1em;
-		
-	}
-	h3 {
-		font-size:1.6em;
-	}
-	/* ]]> */
-  </style>
-  <script type="text/javascript">
- // <![CDATA[
-// START - Added for compatibility with ASCIIMathML 2.0
-var AMtranslated = false;
-// Next 2 functions copied from ASCIIMathML 1.4.7
-function AMcreateElementXHTML(t) {
-  if (isIE) return document.createElement(t);
-  else return document.createElementNS("http://www.w3.org/1999/xhtml", t);
-}
-function AMinitSymbols() {
-  var texsymbols = [], i;
-  for (i=0; i<AMsymbols.length; i++)
-    if (AMsymbols[i].tex) 
-      texsymbols[texsymbols.length] = {input:AMsymbols[i].tex, 
-        tag:AMsymbols[i].tag, output:AMsymbols[i].output, ttype:AMsymbols[i].ttype};
-  AMsymbols = AMsymbols.concat(texsymbols);
-  AMsymbols.sort(compareNames);
-  for (i=0; i<AMsymbols.length; i++) AMnames[i] = AMsymbols[i].input;
-}
-// END - Added for compatibility with ASCIIMathML 2.0
-
-   window.resizeTo(500, 300);
-var showasciiformulaonhover = false;
-if (typeof Xinha == "undefined")
-	Xinha = window.opener.Xinha;
-
-function i18n(str) {
-  return (Xinha._lc(str, 'Equation'));
-}
-function set (string)
-{
-	var inputField = document.getElementById("inputText");
-	inputField.value += string;
-	preview();
-	inputField.focus();
-	return false;
-}
-function preview() {
-  if (document.getElementById("inputText") != '') {
-      var str = document.getElementById("inputText").value;
-      var outnode = document.getElementById("outputNode");
-      var newnode = AMcreateElementXHTML("div");
-      newnode.setAttribute("id","outputNode");
-      outnode.parentNode.replaceChild(newnode,outnode);
-      outnode = document.getElementById("outputNode");
-      var n = outnode.childNodes.length;
-      for (var i = 0; i < n; i++)
-        outnode.removeChild(outnode.firstChild);
-      outnode.appendChild(document.createTextNode("`"+str+"`"));
-      AMprocessNode(outnode,true);
-  }
-}
-function Init() {
-	__dlg_translate('Equation');
-	__dlg_init();
-	var param = window.dialogArguments;
-	var cfg = param["editor"].config;
-	
-	mathcolor = cfg.Equation.mathcolor;
-	mathfontfamily = cfg.Equation.mathfontfamily;
-	
-	translate();
-	var inputField = document.getElementById("inputText"); 
-	
-	if (param["editedNode"] && param["editedNode"].tagName.toLowerCase() == 'span')
-	{
-		var formula = param["editedNode"].getAttribute("title").replace(/^`*(.*?)`*$/m,"$1");
-		if (!formula) formula = param["editedNode"].innerHTML.replace(/^`*(.*?)`*$/m,"$1"); 
-		inputField.value = formula;
-		preview();
-	}
-	else inputField.value = '';
-	inputField.focus();
-}
-  
-function onOK() {
- 	
- var param = {
- 	"editedNode":window.dialogArguments.editedNode,
- 	"formula" : document.getElementById("inputText").value
- };
- 
- __dlg_close(param);
-  return false;
-}
-
-function onCancel() {
-  __dlg_close(null);
-  return false;
-}
-
-function translate() {
-  if (!AMtranslated) { // run this only once
-    AMtranslated = true;
-    AMinitSymbols();
-    AMprocessNode(document.getElementById("clickInput"),true);
-    preview();
-  }
-}
-window.onload = Init;
-
-function AMnode2string(inNode,indent) {
-// thanks to James Frazer for contributing an initial version of this function
-   var i, str = "";
-   if(inNode.nodeType == 1) {
-       var name = inNode.nodeName.toLowerCase(); // (IE fix)
-       str = "\r" + indent + "<" + name;
-       for(i=0; i < inNode.attributes.length; i++)
-           if (inNode.attributes[i].nodeValue!="italic" &&
-               inNode.attributes[i].nodeValue!="" &&  //stop junk attributes
-               inNode.attributes[i].nodeValue!="inherit" && // (mostly IE)
-               inNode.attributes[i].nodeValue!=undefined &&
-               inNode.attributes[i].nodeName[0] != '-'
-               )
-               str += " "+inNode.attributes[i].nodeName+"="+
-                     "\""+inNode.attributes[i].nodeValue+"\"";
-       if (name == "math") 
-           str += " xmlns=\"http://www.w3.org/1998/Math/MathML\"";
-       str += ">";
-       for(i=0; i<inNode.childNodes.length; i++)
-           str += AMnode2string(inNode.childNodes[i], indent+"  ");
-       if (name != "mo" && name != "mi" && name != "mn") str += "\r"+indent;
-       str += "</" + name + ">";
-   }
-   else if(inNode.nodeType == 3) {
-       var st = inNode.nodeValue;
-       for (i=0; i<st.length; i++)
-           if (st.charCodeAt(i)<32 || st.charCodeAt(i)>126)
-               str += "&#"+st.charCodeAt(i)+";";
-           else if (st.charAt(i)=="<" && indent != "  ") str += "&lt;";
-           else if (st.charAt(i)==">" && indent != "  ") str += "&gt;";
-           else if (st.charAt(i)=="&" && indent != "  ") str += "&amp;";
-           else str += st.charAt(i);
-   }
-   return str;
-} 
-function showMathML()
-{
-	var math = document.getElementById("outputNode").getElementsByTagName("math")[0];
-	if (math)
-		math.parentNode.innerHTML = '<pre>'+Xinha.htmlEncode(AMnode2string(math,''))+'</pre>';
-}
-// ]]>
-</script>
-
-</head>
-
-<body class="dialog">
-<div class="title">AsciiMath Formula Input</div>
-<!--
-Table modified from CharacterMap for ASCIIMathML by Peter Jipsen
-HTMLSource based on HTMLArea XTD 1.5 (http://mosforge.net/projects/htmlarea3xtd/) modified by Holger Hees
-Original Author - Bernhard Pfeifer novocaine@gmx.net
--->
-<table  id="clickInput">
-<tr>
-<td colspan="3" class="character" title="(x+1)/(x-1)" onclick="set('(x+1)/(x-1)')">`(x+1)/(x-1)`</td>
-<td colspan="2" class="character" title="x^(m+n)" onclick="set('x^(m+n)')">`x^(m+n)`</td>
-<td colspan="2" class="character" title="x_(mn)" onclick="set('x_(mn)')">`x_(mn)`</td>
-<td colspan="2" class="character" title="sqrt(x)" onclick="set('sqrt(x)')">`sqrt(x)`</td>
-<td colspan="3" class="character" title="root(n)(x)" onclick="set('root(n)(x)')">`root(n)(x)`</td>
-<td colspan="2" class="character" title="&quot;text&quot;" onclick="set('&quot;text&quot;')">`&quot;text&quot;`</td>
-<td colspan="2" class="character" style="cursor:default"></td>
-</tr><tr>
-<td colspan="2" class="character" title="dy/dx" onclick="set('dy/dx')">`dy/dx`</td>
-<td colspan="3" class="character" title="lim_(x-&gt;oo)" onclick="set('lim_(x-&gt;oo)')">`lim_(x-&gt;oo)`</td>
-<td colspan="3" class="character" title="sum_(n=1)^oo" onclick="set('sum_(n=1)^oo')">`sum_(n=1)^oo`</td>
-<td colspan="3" class="character" title="int_a^bf(x)dx" onclick="set('int_a^bf(x)dx')">`int_a^bf(x)dx`</td>
-<td colspan="3" class="character" title="[[a,b],[c,d]]" onclick="set('[[a,b],[c,d]]')">`[[a,b],[c,d]]`</td>
-<td colspan="2" class="character" title="((n),(k))" onclick="set('((n),(k))')">`((n),(k))`</td>
-</tr><tr>
-<td class="character" title="*" onclick="set('*')">`*`</td>
-<td class="character" title="**" onclick="set('**')">`**`</td>
-<td class="character" title="//" onclick="set('//')">`//`</td>
-<td class="character" title="\\" onclick="set('\\\\')">`\\`</td>
-<td class="character" title="xx" onclick="set('xx')">`xx`</td>
-<td class="character" title="-:" onclick="set('-:')">`-:`</td>
-<td class="character" title="@" onclick="set('@')">`@`</td>
-<td class="character" title="o+" onclick="set('o+')">`o+`</td>
-<td class="character" title="ox" onclick="set('ox')">`ox`</td>
-<td class="character" title="o." onclick="set('o.')">`o.`</td>
-<td class="character" title="sum" onclick="set('sum')">`sum`</td>
-<td class="character" title="prod" onclick="set('prod')">`prod`</td>
-<td class="character" title="^^" onclick="set('^^')">`^^`</td>
-<td class="character" title="^^^" onclick="set('^^^')"><span style="font-size:larger">`&and;`</span></td>
-<td class="character" title="vv" onclick="set('vv')">`vv`</td>
-<td class="character" title="vvv" onclick="set('vvv')"><span style="font-size:larger">`&or;`</span></td>
-</tr><tr>
-<td class="character" title="!=" onclick="set('!=')">`!=`</td>
-<td class="character" title="&lt;=" onclick="set('&lt;=')">`&lt;=`</td>
-<td class="character" title="&gt;=" onclick="set('&gt;=')">`&gt;=`</td>
-<td class="character" title="-&lt;" onclick="set('-&lt;')">`-&lt;`</td>
-<td class="character" title="&gt;-" onclick="set('&gt;-')">`&gt;-`</td>
-<td class="character" title="in" onclick="set('in')">`in`</td>
-<td class="character" title="!in" onclick="set('!in')">`!in`</td>
-<td class="character" title="sub" onclick="set('sub')">`sub`</td>
-<td class="character" title="sup" onclick="set('sup')">`sup`</td>
-<td class="character" title="sube" onclick="set('sube')">`sube`</td>
-<td class="character" title="supe" onclick="set('supe')">`supe`</td>
-<td class="character" title="O/" onclick="set('O/')">`O/`</td>
-<td class="character" title="nn" onclick="set('nn')">`nn`</td>
-<td class="character" title="nnn" onclick="set('nnn')"><span style="font-size:larger">`&cap;`</span></td>
-<td class="character" title="uu" onclick="set('uu')">`uu`</td>
-<td class="character" title="uuu" onclick="set('uuu')"><span style="font-size:larger">`&cup;`</span></td>
-</tr><tr>
-<td class="character" title="and" onclick="set('and')">`and`</td>
-<td class="character" title="or" onclick="set('or')">`or`</td>
-<td class="character" title="not" onclick="set('not')">`not`</td>
-<td class="character" title="=&gt;" onclick="set('==&gt;')">`=&gt;`</td>
-<td class="character" title="if" onclick="set('if')">`if`</td>
-<td class="character" title="&lt;=&gt;" onclick="set('&lt;=&gt;')">`&lt;=&gt;`</td>
-<td class="character" title="AA" onclick="set('AA')">`AA`</td>
-<td class="character" title="EE" onclick="set('EE')">`EE`</td>
-<td class="character" title="_|_" onclick="set('_|_')">`_|_`</td>
-<td class="character" title="TT" onclick="set('TT')">`TT`</td>
-<td class="character" title="|--" onclick="set('|--')">`|--`</td>
-<td class="character" title="|==" onclick="set('|==')">`|==`</td>
-<td class="character" title="-=" onclick="set('-=')">`-=`</td>
-<td class="character" title="~=" onclick="set('~=')">`~=`</td>
-<td class="character" title="~~" onclick="set('~~')">`~~`</td>
-<td class="character" title="prop" onclick="set('prop')">`prop`</td>
-</tr><tr>
-<td class="character" title="int" onclick="set('int')">`int`</td>
-<td class="character" title="oint" onclick="set('oint')">`oint`</td>
-<td class="character" title="del" onclick="set('del')">`del`</td>
-<td class="character" title="grad" onclick="set('grad')">`grad`</td>
-<td class="character" title="+-" onclick="set('+-')">`+-`</td>
-<td class="character" title="oo" onclick="set('oo')">`oo`</td>
-<td class="character" title="aleph" onclick="set('aleph')">`aleph`</td>
-<td class="character" title="quad" onclick="set('quad')">`quad`</td>
-<td class="character" title="diamond" onclick="set('diamond')">`diamond`</td>
-<td class="character" title="square" onclick="set('square')">`square`</td>
-<td class="character" title="|__" onclick="set('|__')">`|__`</td>
-<td class="character" title="__|" onclick="set('__|')">`__|`</td>
-<td class="character" title="|~" onclick="set('|~')">`|~`</td>
-<td class="character" title="~|" onclick="set('~|')">`~|`</td>
-<td class="character" title="&lt;x&gt;" onclick="set('&lt;x&gt;')">`&lt;x&gt;`</td>
-<td class="character" title="/_" onclick="set('/_')">`/_`</td>
-</tr><tr>
-<td class="character" title="uarr" onclick="set('uarr')">`uarr`</td>
-<td class="character" title="darr" onclick="set('darr')">`darr`</td>
-<td class="character" title="larr" onclick="set('larr')">`larr`</td>
-<td class="character" title="-&gt;" onclick="set('-&gt;')">`-&gt;`</td>
-<td class="character" title="|-&gt;" onclick="set('|-&gt;')">`|-&gt;`</td>
-<td class="character" title="harr" onclick="set('harr')">`harr`</td>
-<td class="character" title="lArr" onclick="set('lArr')">`lArr`</td>
-<td class="character" title="rArr" onclick="set('rArr')">`rArr`</td>
-<td class="character" title="hArr" onclick="set('hArr')">`hArr`</td>
-<td class="character" title="hata" onclick="set('hat')">`hata`</td>
-<td class="character" title="ula" onclick="set('ul')">`ula`</td>
-<td class="character" title="dota" onclick="set('dot')">`dota`</td>
-<td class="character" title="ddota" onclick="set('ddot')">`ddota`</td>
-<td class="character" title="veca" onclick="set('vec')">`veca`</td>
-<td class="character" title="bara" onclick="set('bar')">`bara`</td>
-<td class="character" title=":." onclick="set(':.')">`:.`</td>
-</tr><tr>
-<td class="character" title="NN" onclick="set('NN')">`NN`</td>
-<td class="character" title="ZZ" onclick="set('ZZ')">`ZZ`</td>
-<td class="character" title="QQ" onclick="set('QQ')">`QQ`</td>
-<td class="character" title="RR" onclick="set('RR')">`RR`</td>
-<td class="character" title="CC" onclick="set('CC')">`CC`</td>
-<td class="character" title="bba" onclick="set('bb')">`bba`</td>
-<td class="character" title="bbba" onclick="set('bbb')">`bbba`</td>
-<td class="character" title="cca" onclick="set('cc')">`cca`</td>
-<td class="character" title="fra" onclick="set('fr')">`fra`</td>
-<td class="character" title="sfa" onclick="set('sf')">`sfa`</td>
-<td class="character" title="tta" onclick="set('tt')">`tta`</td>
-<td colspan="4" class="character" title="stackrel(-&gt;)(+)" onclick="set('stackrel(-&gt;)(+)')">`stackrel(-&gt;)(+)`</td>
-<td class="character" title="upsilon" onclick="set('upsilon')">`upsilon`</td>
-</tr><tr>
-<td class="character" title="alpha" onclick="set('alpha')">`alpha`</td>
-<td class="character" title="beta" onclick="set('beta')">`beta`</td>
-<td class="character" title="gamma" onclick="set('gamma')">`gamma`</td>
-<td class="character" title="Gamma" onclick="set('Gamma')">`Gamma`</td>
-<td class="character" title="delta" onclick="set('delta')">`delta`</td>
-<td class="character" title="Delta" onclick="set('Delta')">`Delta`</td>
-<td class="character" title="epsi" onclick="set('epsi')">`epsi`</td>
-<td class="character" title="zeta" onclick="set('zeta')">`zeta`</td>
-<td class="character" title="eta" onclick="set('eta')">`eta`</td>
-<td class="character" title="theta" onclick="set('theta')">`theta`</td>
-<td class="character" title="Theta" onclick="set('Theta')">`Theta`</td>
-<td class="character" title="iota" onclick="set('iota')">`iota`</td>
-<td class="character" title="kappa" onclick="set('kappa')">`kappa`</td>
-<td class="character" title="lambda" onclick="set('lambda')">`lambda`</td>
-<td class="character" title="Lambda" onclick="set('Lambda')">`Lambda`</td>
-<td class="character" title="mu" onclick="set('mu')">`mu`</td>
-</tr><tr>
-<td class="character" title="nu" onclick="set('nu')">`nu`</td>
-<td class="character" title="pi" onclick="set('pi')">`pi`</td>
-<td class="character" title="Pi" onclick="set('Pi')">`Pi`</td>
-<td class="character" title="rho" onclick="set('rho')">`rho`</td>
-<td class="character" title="sigma" onclick="set('sigma')">`sigma`</td>
-<td class="character" title="Sigma" onclick="set('Sigma')">`Sigma`</td>
-<td class="character" title="tau" onclick="set('tau')">`tau`</td>
-<td class="character" title="xi" onclick="set('xi')">`xi`</td>
-<td class="character" title="Xi" onclick="set('Xi')">`Xi`</td>
-<td class="character" title="phi" onclick="set('phi')">`phi`</td>
-<td class="character" title="Phi" onclick="set('Phi')">`Phi`</td>
-<td class="character" title="chi" onclick="set('chi')">`chi`</td>
-<td class="character" title="psi" onclick="set('psi')">`psi`</td>
-<td class="character" title="Psi" onclick="set('Psi')">`Psi`</td>
-<td class="character" title="omega" onclick="set('omega')">`omega`</td>
-<td class="character" title="Omega" onclick="set('Omega')">`Omega`</td>
-</tr>
-</table>
-<form action="javascript:void(0);">
-<table style="width: 100%;border:none">
-  <tr>
-    <td style="width:50%">Input</td><td style="width:50%"><input type="button" onclick="showMathML()" style="float:right;font-size:10px" value="Show MathML" /><span>Preview</span></td>
-  </tr>
-  <tr>
-    <td>
-    <textarea id="inputText" onkeyup="preview()"></textarea>
-    </td>
-    <td>
-    <div id="outputNode"></div>
-    <textarea id="mathml" style="display:none"></textarea>
-    </td>
-  </tr>
-  <tr><td colspan="2">
-  <span>Based on ASCIIMathML by </span><a href="http://www.chapman.edu/~jipsen" onclick="window.open(this.href,'_blank','');return false;">Peter Jipsen</a>, 
-<a href="http://www.chapman.edu" onclick="window.open(this.href,'_blank','');return false;">Chapman University</a><br />
-  <span>For more information on AsciiMathML visit this page: </span><a href="http://www1.chapman.edu/~jipsen/mathml/asciimath.html" onclick="window.open(this.href,'_blank','');return false;">http://www1.chapman.edu/~jipsen/mathml/asciimath.html</a></td></tr>
-</table>
-
-<div id="buttons">
-<script type="text/javascript">
-// <![CDATA[
-if (Xinha.is_ie)
- document.write('<span style="color:red;float:left">'+i18n('Attention Internet Explorer users: Please note that there is no WYSIWYG representation of the formula in the editor!<br />You might wish to use <a href="http://www.mozilla.com" onclick="window.open(this.href,\'_blank\');return false;">Mozilla Firefox</a> instead.')+'</span>');
-// ]]>
-</script>
-  <button type="submit" 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-1.5.1/plugins/Equation/readme.txt b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/Equation/readme.txt
deleted file mode 100644
index 06719ce..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/Equation/readme.txt
+++ /dev/null
@@ -1,38 +0,0 @@
-AsciiMathML Formula Editor for Xinha
- _______________________
- 
-Based on AsciiMathML by Peter Jipsen (http://www.chapman.edu/~jipsen).
-Plugin by Raimund Meyer (ray) xinha@raimundmeyer.de
-
-AsciiMathML is a JavaScript library for translating ASCII math notation to Presentation MathML.
-
-Usage
- The formmulae are stored in their ASCII representation, so you have to include the 
- ASCIIMathML library which can be found in the plugin folder in order to render the MathML output in your pages. 
- 
- Example (also see example.html):
-  var mathcolor = "black"; //  You may change the color of the formulae (default: red)
-  var mathfontfamily = "Arial"; //and the font (default: serif, which is good I think)
-  var showasciiformulaonhover = false; // if true helps students learn ASCIIMath (default:true)
-  <script type="text/javascript" src="/xinha/plugins/AsciiMath/ASCIIMathML.js"></script>
-
- The recommended browser for using this plugin is Mozilla/Firefox. At the moment showing the MathML output
- inside the editor is not supported in Internet Explorer.
- 
- 
-License information
-
- This program is free software; you can redistribute it and/or modify
- it under the terms of the GNU Lesser General Public License as published by
- the Free Software Foundation; either version 2.1 of the License, or (at
- your option) any later version.
-
- This program is distributed in the hope that it will be useful, 
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Lesser General Public License (at http://www.gnu.org/licenses/lgpl.html) 
- for more details.
- 
- NOTE: I have changed the license of AsciiMathML from GPL to LGPL according to a permission 
- from the author (see http://xinha.gogo.co.nz/punbb/viewtopic.php?pid=4150#p4150)
- Raimund Meyer 11-29-2006
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/FancySelects/FancySelects.css b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/FancySelects/FancySelects.css
deleted file mode 100644
index 1b914e3..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/FancySelects/FancySelects.css
+++ /dev/null
@@ -1,14 +0,0 @@
-.toolbarElement .select2 { font-size:11px; font-family: Tahoma, Verdana, sans-serif; }
-.toolbarElement .select2-selection--single { height:20px; }
-.select2-container--default .select2-selection--single .select2-selection__rendered 
-{
-    line-height: 18px;
-}
-
-.select2-container--default .select2-selection--single .select2-selection__arrow {
-    height: 16px;
-    position: absolute;
-    top: 1px;
-    right: 1px;
-    width: 20px;
-}
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/FancySelects/FancySelects.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/FancySelects/FancySelects.js
deleted file mode 100644
index 0fc8d53..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/FancySelects/FancySelects.js
+++ /dev/null
@@ -1,168 +0,0 @@
-/**
-  = WebKit Image Resizer =
-  
-  The WebKit based (or similar) browsers, including Chrome (and Edge)
-  don't support drag-to-size images or tables, which is a pain.
-  
-  This plugin implements the EditorBoost jQuery resizing plugin
-    http://www.editorboost.net/Webkitresize/Index
-  jQuery is required, naturally, if it's not already loaded 
-  then we will load our own version, so ensure you load your version
-  first if you need a newer one (then this might break, but oh well).
-  
-  == Usage ==._
-  Instruct Xinha to load the WebKitImageResuze plugin (follow the NewbieGuide),
-  you can load this plugin even in non WebKit browsers, it will do 
-  nothing (no harm, no benefit).
-  
-  == Caution ==
-  This only works acceptably in either:
-    Standards Mode  (eg Doctype <!DOCTYPE html> )
-    Quirks Mode     (eg no doctype              )
-    
-  it does not work great in "Almost Standards Mode" because scrolling throws
-  the resize border out of place, ,that's ok if you don't need to scroll, 
-  either because your text is small, or you are in FullScreen mode or 
-  something, but anyway.
-  
- 
- * @author $Author$
- * @version $Id$
- * @package WebKitResize
- */
-
-
-FancySelects._pluginInfo = {
-  name          : "Fancy Select Boxes (jQuery select2)",
-  version       : "1.0",
-  developer     : "Select2 Authors, James Sleeman (Xinha)",
-  developer_url : "https://select2.org/",
-  license       : "MIT"
-};
-
-// The options here are as for the 'width' configuration option
-// of jQuery Select2 - https://select2.org/appearance
-// If you don't use specific sizes here, then it works fine, but 
-// can "jump around" in the tool bar if it changes size with selection
-Xinha.Config.prototype.FancySelects = {
-  widths: {
-    'formatblock' : '90px',
-    'fontname'    : '130px',
-    'fontsize'    : '80px',
-    'DynamicCSS-class' : '130px',
-    'langmarks'  : '110px'
-  }
-};
-
-Xinha.loadLibrary('jQuery')
-  .loadStyle('select2-4.0.6-rc.1-dist/css/select2.css','FancySelects')
-  .loadScript('select2-4.0.6-rc.1-dist/js/select2.js', 'FancySelects')
-  .loadStyle('FancySelects.css',                       'FancySelects')
-  .loadScriptIf(_editor_lang != 'en', 'select2-4.0.6-rc.1-dist/js/i18n/'+_editor_lang+'.js', 'FancySelects');
-  
-function FancySelects(editor)
-{
-    this.editor = editor;
-    this._isWorking = false; // Set true once everything is setup, or not if it fails (old browser)
-}
-
-FancySelects.prototype.onGenerateOnce = function()
-{
-  
-  var editor = this.editor;
-  
-  // Be sure we wait until jQuery is loaded
-  if(!(typeof jQuery != 'undefined' && jQuery && jQuery.fn && jQuery.fn.select2 && jQuery(editor._htmlArea).find('.toolbarElement select').length))
-  {
-    var self = this;
-    window.setTimeout(function(){self.onGenerateOnce()}, 500);
-    return;
-  }
-  
-  function formatFontName(opt)
-  {
-    if(!opt.id) return opt.text;
-    
-    if(opt.id.match(/wingdings|webdings/i))
-    {               // v-- Avoid lc_parse_strings.php
-      return jQuery('<'+'span>'+opt.text+'</span> <'+'span style="font-family:'+opt.id+'";" title="'+opt.text+'">*(JL</span>');
-    }
-    else
-    {
-      return jQuery('<span style="font-family:'+opt.id+'";" title="'+opt.text+'">'+opt.text+'</span>');
-    }
-  }
-  
-  function formatFontSize(opt)
-  {
-    if(!opt.id) return opt.text;
-   return jQuery('<font size="'+opt.id+'";" title="'+opt.text+'">'+opt.text+'</font>');
-  }
-  
-  try
-  {
-    jQuery(editor._htmlArea).find('.toolbarElement select').each(function(i,e){
-      var txt = e.name;
-      var el  = e;
-      
-      var width = 'resolve';
-      if(typeof editor.config.FancySelects.widths[txt] != 'undefined')
-      {
-        width = editor.config.FancySelects.widths[txt];
-      }
-      
-      switch(txt)
-      {
-        case 'fontname':
-          jQuery(e).select2({dropdownAutoWidth: true, theme: 'default', templateResult: formatFontName, width: width});
-          break;
-        case 'fontsize':
-          jQuery(e).select2({dropdownAutoWidth: true, theme: 'default', templateResult: formatFontSize, width: width});
-          break;
-        default:
-          jQuery(e).select2({dropdownAutoWidth: true, theme: 'default', width: width});
-      }
-      
-      jQuery(e).on('select2:opening', function(){
-        // IE11 needs this because opening the select2 de-selects the selected text
-        // so if we don't save and restore it nothing happens (except that the text is deselected)
-        // FF, Chrome and Edge are fine without this, but they also don't seem to care with it
-        // so I guess just do it across the board is safe enough
-        el._FancySelects_SavedSelection = editor.saveSelection();
-      });
-      
-      jQuery(e).on('select2:select', function(){
-        if(el._FancySelects_SavedSelection) 
-        {
-          editor.restoreSelection(el._FancySelects_SavedSelection);
-        }
-        el._FancySelects_SavedSelection = null;
-        editor._comboSelected(el, txt);
-      });
-      
-    });
-    
-    this._isWorking = true;
-  }
-  catch(e)
-  {
-    // Old browsers may fail and leave a partially constructed select2, remove that
-    // so just the original selects are left
-    var failed = Xinha.getElementsByClassName(editor._htmlArea,'select2-container');
-    for(var i = 0; i < failed.length; i++)
-    {
-      failed[i].parentNode.removeChild(failed[i]);
-    }
-  }
-};
-
-FancySelects.prototype.onUpdateToolbar = function()
-{
-    var editor = this.editor;
-    
-    if(!this._isWorking) return false;
-    
-    jQuery('.toolbarElement select').each(function(i,e){
-      jQuery(e).trigger('change');
-    });
-};
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/FancySelects/lang/lc_base.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/FancySelects/lang/lc_base.js
deleted file mode 100644
index aa42e80..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/FancySelects/lang/lc_base.js
+++ /dev/null
@@ -1,25 +0,0 @@
-// I18N constants
-//
-// LANG: "en", ENCODING: UTF-8
-// Author: Translator-Name, <email@example.com>
-//
-// Last revision: 2018-04-12
-// 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).
-//
-// (Please, remove information below)
-// 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.)
-
-{
-    "'+opt.text+'": ""
-}
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/FancySelects/select2-4.0.6-rc.1-dist/css/select2.css b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/FancySelects/select2-4.0.6-rc.1-dist/css/select2.css
deleted file mode 100644
index ce3afd1..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/FancySelects/select2-4.0.6-rc.1-dist/css/select2.css
+++ /dev/null
@@ -1,484 +0,0 @@
-.select2-container {
-  box-sizing: border-box;
-  display: inline-block;
-  margin: 0;
-  position: relative;
-  vertical-align: middle; }
-  .select2-container .select2-selection--single {
-    box-sizing: border-box;
-    cursor: pointer;
-    display: block;
-    height: 28px;
-    user-select: none;
-    -webkit-user-select: none; }
-    .select2-container .select2-selection--single .select2-selection__rendered {
-      display: block;
-      padding-left: 8px;
-      padding-right: 20px;
-      overflow: hidden;
-      text-overflow: ellipsis;
-      white-space: nowrap; }
-    .select2-container .select2-selection--single .select2-selection__clear {
-      position: relative; }
-  .select2-container[dir="rtl"] .select2-selection--single .select2-selection__rendered {
-    padding-right: 8px;
-    padding-left: 20px; }
-  .select2-container .select2-selection--multiple {
-    box-sizing: border-box;
-    cursor: pointer;
-    display: block;
-    min-height: 32px;
-    user-select: none;
-    -webkit-user-select: none; }
-    .select2-container .select2-selection--multiple .select2-selection__rendered {
-      display: inline-block;
-      overflow: hidden;
-      padding-left: 8px;
-      text-overflow: ellipsis;
-      white-space: nowrap; }
-  .select2-container .select2-search--inline {
-    float: left; }
-    .select2-container .select2-search--inline .select2-search__field {
-      box-sizing: border-box;
-      border: none;
-      font-size: 100%;
-      margin-top: 5px;
-      padding: 0; }
-      .select2-container .select2-search--inline .select2-search__field::-webkit-search-cancel-button {
-        -webkit-appearance: none; }
-
-.select2-dropdown {
-  background-color: white;
-  border: 1px solid #aaa;
-  border-radius: 4px;
-  box-sizing: border-box;
-  display: block;
-  position: absolute;
-  left: -100000px;
-  width: 100%;
-  z-index: 1051; }
-
-.select2-results {
-  display: block; }
-
-.select2-results__options {
-  list-style: none;
-  margin: 0;
-  padding: 0; }
-
-.select2-results__option {
-  padding: 6px;
-  user-select: none;
-  -webkit-user-select: none; }
-  .select2-results__option[aria-selected] {
-    cursor: pointer; }
-
-.select2-container--open .select2-dropdown {
-  left: 0; }
-
-.select2-container--open .select2-dropdown--above {
-  border-bottom: none;
-  border-bottom-left-radius: 0;
-  border-bottom-right-radius: 0; }
-
-.select2-container--open .select2-dropdown--below {
-  border-top: none;
-  border-top-left-radius: 0;
-  border-top-right-radius: 0; }
-
-.select2-search--dropdown {
-  display: block;
-  padding: 4px; }
-  .select2-search--dropdown .select2-search__field {
-    padding: 4px;
-    width: 100%;
-    box-sizing: border-box; }
-    .select2-search--dropdown .select2-search__field::-webkit-search-cancel-button {
-      -webkit-appearance: none; }
-  .select2-search--dropdown.select2-search--hide {
-    display: none; }
-
-.select2-close-mask {
-  border: 0;
-  margin: 0;
-  padding: 0;
-  display: block;
-  position: fixed;
-  left: 0;
-  top: 0;
-  min-height: 100%;
-  min-width: 100%;
-  height: auto;
-  width: auto;
-  opacity: 0;
-  z-index: 99;
-  background-color: #fff;
-  filter: alpha(opacity=0); }
-
-.select2-hidden-accessible {
-  border: 0 !important;
-  clip: rect(0 0 0 0) !important;
-  -webkit-clip-path: inset(50%) !important;
-  clip-path: inset(50%) !important;
-  height: 1px !important;
-  overflow: hidden !important;
-  padding: 0 !important;
-  position: absolute !important;
-  width: 1px !important;
-  white-space: nowrap !important; }
-
-.select2-container--default .select2-selection--single {
-  background-color: #fff;
-  border: 1px solid #aaa;
-  border-radius: 4px; }
-  .select2-container--default .select2-selection--single .select2-selection__rendered {
-    color: #444;
-    line-height: 28px; }
-  .select2-container--default .select2-selection--single .select2-selection__clear {
-    cursor: pointer;
-    float: right;
-    font-weight: bold; }
-  .select2-container--default .select2-selection--single .select2-selection__placeholder {
-    color: #999; }
-  .select2-container--default .select2-selection--single .select2-selection__arrow {
-    height: 26px;
-    position: absolute;
-    top: 1px;
-    right: 1px;
-    width: 20px; }
-    .select2-container--default .select2-selection--single .select2-selection__arrow b {
-      border-color: #888 transparent transparent transparent;
-      border-style: solid;
-      border-width: 5px 4px 0 4px;
-      height: 0;
-      left: 50%;
-      margin-left: -4px;
-      margin-top: -2px;
-      position: absolute;
-      top: 50%;
-      width: 0; }
-
-.select2-container--default[dir="rtl"] .select2-selection--single .select2-selection__clear {
-  float: left; }
-
-.select2-container--default[dir="rtl"] .select2-selection--single .select2-selection__arrow {
-  left: 1px;
-  right: auto; }
-
-.select2-container--default.select2-container--disabled .select2-selection--single {
-  background-color: #eee;
-  cursor: default; }
-  .select2-container--default.select2-container--disabled .select2-selection--single .select2-selection__clear {
-    display: none; }
-
-.select2-container--default.select2-container--open .select2-selection--single .select2-selection__arrow b {
-  border-color: transparent transparent #888 transparent;
-  border-width: 0 4px 5px 4px; }
-
-.select2-container--default .select2-selection--multiple {
-  background-color: white;
-  border: 1px solid #aaa;
-  border-radius: 4px;
-  cursor: text; }
-  .select2-container--default .select2-selection--multiple .select2-selection__rendered {
-    box-sizing: border-box;
-    list-style: none;
-    margin: 0;
-    padding: 0 5px;
-    width: 100%; }
-    .select2-container--default .select2-selection--multiple .select2-selection__rendered li {
-      list-style: none; }
-  .select2-container--default .select2-selection--multiple .select2-selection__placeholder {
-    color: #999;
-    margin-top: 5px;
-    float: left; }
-  .select2-container--default .select2-selection--multiple .select2-selection__clear {
-    cursor: pointer;
-    float: right;
-    font-weight: bold;
-    margin-top: 5px;
-    margin-right: 10px; }
-  .select2-container--default .select2-selection--multiple .select2-selection__choice {
-    background-color: #e4e4e4;
-    border: 1px solid #aaa;
-    border-radius: 4px;
-    cursor: default;
-    float: left;
-    margin-right: 5px;
-    margin-top: 5px;
-    padding: 0 5px; }
-  .select2-container--default .select2-selection--multiple .select2-selection__choice__remove {
-    color: #999;
-    cursor: pointer;
-    display: inline-block;
-    font-weight: bold;
-    margin-right: 2px; }
-    .select2-container--default .select2-selection--multiple .select2-selection__choice__remove:hover {
-      color: #333; }
-
-.select2-container--default[dir="rtl"] .select2-selection--multiple .select2-selection__choice, .select2-container--default[dir="rtl"] .select2-selection--multiple .select2-selection__placeholder, .select2-container--default[dir="rtl"] .select2-selection--multiple .select2-search--inline {
-  float: right; }
-
-.select2-container--default[dir="rtl"] .select2-selection--multiple .select2-selection__choice {
-  margin-left: 5px;
-  margin-right: auto; }
-
-.select2-container--default[dir="rtl"] .select2-selection--multiple .select2-selection__choice__remove {
-  margin-left: 2px;
-  margin-right: auto; }
-
-.select2-container--default.select2-container--focus .select2-selection--multiple {
-  border: solid black 1px;
-  outline: 0; }
-
-.select2-container--default.select2-container--disabled .select2-selection--multiple {
-  background-color: #eee;
-  cursor: default; }
-
-.select2-container--default.select2-container--disabled .select2-selection__choice__remove {
-  display: none; }
-
-.select2-container--default.select2-container--open.select2-container--above .select2-selection--single, .select2-container--default.select2-container--open.select2-container--above .select2-selection--multiple {
-  border-top-left-radius: 0;
-  border-top-right-radius: 0; }
-
-.select2-container--default.select2-container--open.select2-container--below .select2-selection--single, .select2-container--default.select2-container--open.select2-container--below .select2-selection--multiple {
-  border-bottom-left-radius: 0;
-  border-bottom-right-radius: 0; }
-
-.select2-container--default .select2-search--dropdown .select2-search__field {
-  border: 1px solid #aaa; }
-
-.select2-container--default .select2-search--inline .select2-search__field {
-  background: transparent;
-  border: none;
-  outline: 0;
-  box-shadow: none;
-  -webkit-appearance: textfield; }
-
-.select2-container--default .select2-results > .select2-results__options {
-  max-height: 200px;
-  overflow-y: auto; }
-
-.select2-container--default .select2-results__option[role=group] {
-  padding: 0; }
-
-.select2-container--default .select2-results__option[aria-disabled=true] {
-  color: #999; }
-
-.select2-container--default .select2-results__option[aria-selected=true] {
-  background-color: #ddd; }
-
-.select2-container--default .select2-results__option .select2-results__option {
-  padding-left: 1em; }
-  .select2-container--default .select2-results__option .select2-results__option .select2-results__group {
-    padding-left: 0; }
-  .select2-container--default .select2-results__option .select2-results__option .select2-results__option {
-    margin-left: -1em;
-    padding-left: 2em; }
-    .select2-container--default .select2-results__option .select2-results__option .select2-results__option .select2-results__option {
-      margin-left: -2em;
-      padding-left: 3em; }
-      .select2-container--default .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option {
-        margin-left: -3em;
-        padding-left: 4em; }
-        .select2-container--default .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option {
-          margin-left: -4em;
-          padding-left: 5em; }
-          .select2-container--default .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option {
-            margin-left: -5em;
-            padding-left: 6em; }
-
-.select2-container--default .select2-results__option--highlighted[aria-selected] {
-  background-color: #5897fb;
-  color: white; }
-
-.select2-container--default .select2-results__group {
-  cursor: default;
-  display: block;
-  padding: 6px; }
-
-.select2-container--classic .select2-selection--single {
-  background-color: #f7f7f7;
-  border: 1px solid #aaa;
-  border-radius: 4px;
-  outline: 0;
-  background-image: -webkit-linear-gradient(top, white 50%, #eeeeee 100%);
-  background-image: -o-linear-gradient(top, white 50%, #eeeeee 100%);
-  background-image: linear-gradient(to bottom, white 50%, #eeeeee 100%);
-  background-repeat: repeat-x;
-  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#FFFFFFFF', endColorstr='#FFEEEEEE', GradientType=0); }
-  .select2-container--classic .select2-selection--single:focus {
-    border: 1px solid #5897fb; }
-  .select2-container--classic .select2-selection--single .select2-selection__rendered {
-    color: #444;
-    line-height: 28px; }
-  .select2-container--classic .select2-selection--single .select2-selection__clear {
-    cursor: pointer;
-    float: right;
-    font-weight: bold;
-    margin-right: 10px; }
-  .select2-container--classic .select2-selection--single .select2-selection__placeholder {
-    color: #999; }
-  .select2-container--classic .select2-selection--single .select2-selection__arrow {
-    background-color: #ddd;
-    border: none;
-    border-left: 1px solid #aaa;
-    border-top-right-radius: 4px;
-    border-bottom-right-radius: 4px;
-    height: 26px;
-    position: absolute;
-    top: 1px;
-    right: 1px;
-    width: 20px;
-    background-image: -webkit-linear-gradient(top, #eeeeee 50%, #cccccc 100%);
-    background-image: -o-linear-gradient(top, #eeeeee 50%, #cccccc 100%);
-    background-image: linear-gradient(to bottom, #eeeeee 50%, #cccccc 100%);
-    background-repeat: repeat-x;
-    filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#FFEEEEEE', endColorstr='#FFCCCCCC', GradientType=0); }
-    .select2-container--classic .select2-selection--single .select2-selection__arrow b {
-      border-color: #888 transparent transparent transparent;
-      border-style: solid;
-      border-width: 5px 4px 0 4px;
-      height: 0;
-      left: 50%;
-      margin-left: -4px;
-      margin-top: -2px;
-      position: absolute;
-      top: 50%;
-      width: 0; }
-
-.select2-container--classic[dir="rtl"] .select2-selection--single .select2-selection__clear {
-  float: left; }
-
-.select2-container--classic[dir="rtl"] .select2-selection--single .select2-selection__arrow {
-  border: none;
-  border-right: 1px solid #aaa;
-  border-radius: 0;
-  border-top-left-radius: 4px;
-  border-bottom-left-radius: 4px;
-  left: 1px;
-  right: auto; }
-
-.select2-container--classic.select2-container--open .select2-selection--single {
-  border: 1px solid #5897fb; }
-  .select2-container--classic.select2-container--open .select2-selection--single .select2-selection__arrow {
-    background: transparent;
-    border: none; }
-    .select2-container--classic.select2-container--open .select2-selection--single .select2-selection__arrow b {
-      border-color: transparent transparent #888 transparent;
-      border-width: 0 4px 5px 4px; }
-
-.select2-container--classic.select2-container--open.select2-container--above .select2-selection--single {
-  border-top: none;
-  border-top-left-radius: 0;
-  border-top-right-radius: 0;
-  background-image: -webkit-linear-gradient(top, white 0%, #eeeeee 50%);
-  background-image: -o-linear-gradient(top, white 0%, #eeeeee 50%);
-  background-image: linear-gradient(to bottom, white 0%, #eeeeee 50%);
-  background-repeat: repeat-x;
-  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#FFFFFFFF', endColorstr='#FFEEEEEE', GradientType=0); }
-
-.select2-container--classic.select2-container--open.select2-container--below .select2-selection--single {
-  border-bottom: none;
-  border-bottom-left-radius: 0;
-  border-bottom-right-radius: 0;
-  background-image: -webkit-linear-gradient(top, #eeeeee 50%, white 100%);
-  background-image: -o-linear-gradient(top, #eeeeee 50%, white 100%);
-  background-image: linear-gradient(to bottom, #eeeeee 50%, white 100%);
-  background-repeat: repeat-x;
-  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#FFEEEEEE', endColorstr='#FFFFFFFF', GradientType=0); }
-
-.select2-container--classic .select2-selection--multiple {
-  background-color: white;
-  border: 1px solid #aaa;
-  border-radius: 4px;
-  cursor: text;
-  outline: 0; }
-  .select2-container--classic .select2-selection--multiple:focus {
-    border: 1px solid #5897fb; }
-  .select2-container--classic .select2-selection--multiple .select2-selection__rendered {
-    list-style: none;
-    margin: 0;
-    padding: 0 5px; }
-  .select2-container--classic .select2-selection--multiple .select2-selection__clear {
-    display: none; }
-  .select2-container--classic .select2-selection--multiple .select2-selection__choice {
-    background-color: #e4e4e4;
-    border: 1px solid #aaa;
-    border-radius: 4px;
-    cursor: default;
-    float: left;
-    margin-right: 5px;
-    margin-top: 5px;
-    padding: 0 5px; }
-  .select2-container--classic .select2-selection--multiple .select2-selection__choice__remove {
-    color: #888;
-    cursor: pointer;
-    display: inline-block;
-    font-weight: bold;
-    margin-right: 2px; }
-    .select2-container--classic .select2-selection--multiple .select2-selection__choice__remove:hover {
-      color: #555; }
-
-.select2-container--classic[dir="rtl"] .select2-selection--multiple .select2-selection__choice {
-  float: right;
-  margin-left: 5px;
-  margin-right: auto; }
-
-.select2-container--classic[dir="rtl"] .select2-selection--multiple .select2-selection__choice__remove {
-  margin-left: 2px;
-  margin-right: auto; }
-
-.select2-container--classic.select2-container--open .select2-selection--multiple {
-  border: 1px solid #5897fb; }
-
-.select2-container--classic.select2-container--open.select2-container--above .select2-selection--multiple {
-  border-top: none;
-  border-top-left-radius: 0;
-  border-top-right-radius: 0; }
-
-.select2-container--classic.select2-container--open.select2-container--below .select2-selection--multiple {
-  border-bottom: none;
-  border-bottom-left-radius: 0;
-  border-bottom-right-radius: 0; }
-
-.select2-container--classic .select2-search--dropdown .select2-search__field {
-  border: 1px solid #aaa;
-  outline: 0; }
-
-.select2-container--classic .select2-search--inline .select2-search__field {
-  outline: 0;
-  box-shadow: none; }
-
-.select2-container--classic .select2-dropdown {
-  background-color: white;
-  border: 1px solid transparent; }
-
-.select2-container--classic .select2-dropdown--above {
-  border-bottom: none; }
-
-.select2-container--classic .select2-dropdown--below {
-  border-top: none; }
-
-.select2-container--classic .select2-results > .select2-results__options {
-  max-height: 200px;
-  overflow-y: auto; }
-
-.select2-container--classic .select2-results__option[role=group] {
-  padding: 0; }
-
-.select2-container--classic .select2-results__option[aria-disabled=true] {
-  color: grey; }
-
-.select2-container--classic .select2-results__option--highlighted[aria-selected] {
-  background-color: #3875d7;
-  color: white; }
-
-.select2-container--classic .select2-results__group {
-  cursor: default;
-  display: block;
-  padding: 6px; }
-
-.select2-container--classic.select2-container--open .select2-dropdown {
-  border-color: #5897fb; }
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/FancySelects/select2-4.0.6-rc.1-dist/css/select2.min.css b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/FancySelects/select2-4.0.6-rc.1-dist/css/select2.min.css
deleted file mode 100644
index 60d5990..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/FancySelects/select2-4.0.6-rc.1-dist/css/select2.min.css
+++ /dev/null
@@ -1 +0,0 @@
-.select2-container{box-sizing:border-box;display:inline-block;margin:0;position:relative;vertical-align:middle}.select2-container .select2-selection--single{box-sizing:border-box;cursor:pointer;display:block;height:28px;user-select:none;-webkit-user-select:none}.select2-container .select2-selection--single .select2-selection__rendered{display:block;padding-left:8px;padding-right:20px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.select2-container .select2-selection--single .select2-selection__clear{position:relative}.select2-container[dir="rtl"] .select2-selection--single .select2-selection__rendered{padding-right:8px;padding-left:20px}.select2-container .select2-selection--multiple{box-sizing:border-box;cursor:pointer;display:block;min-height:32px;user-select:none;-webkit-user-select:none}.select2-container .select2-selection--multiple .select2-selection__rendered{display:inline-block;overflow:hidden;padding-left:8px;text-overflow:ellipsis;white-space:nowrap}.select2-container .select2-search--inline{float:left}.select2-container .select2-search--inline .select2-search__field{box-sizing:border-box;border:none;font-size:100%;margin-top:5px;padding:0}.select2-container .select2-search--inline .select2-search__field::-webkit-search-cancel-button{-webkit-appearance:none}.select2-dropdown{background-color:white;border:1px solid #aaa;border-radius:4px;box-sizing:border-box;display:block;position:absolute;left:-100000px;width:100%;z-index:1051}.select2-results{display:block}.select2-results__options{list-style:none;margin:0;padding:0}.select2-results__option{padding:6px;user-select:none;-webkit-user-select:none}.select2-results__option[aria-selected]{cursor:pointer}.select2-container--open .select2-dropdown{left:0}.select2-container--open .select2-dropdown--above{border-bottom:none;border-bottom-left-radius:0;border-bottom-right-radius:0}.select2-container--open .select2-dropdown--below{border-top:none;border-top-left-radius:0;border-top-right-radius:0}.select2-search--dropdown{display:block;padding:4px}.select2-search--dropdown .select2-search__field{padding:4px;width:100%;box-sizing:border-box}.select2-search--dropdown .select2-search__field::-webkit-search-cancel-button{-webkit-appearance:none}.select2-search--dropdown.select2-search--hide{display:none}.select2-close-mask{border:0;margin:0;padding:0;display:block;position:fixed;left:0;top:0;min-height:100%;min-width:100%;height:auto;width:auto;opacity:0;z-index:99;background-color:#fff;filter:alpha(opacity=0)}.select2-hidden-accessible{border:0 !important;clip:rect(0 0 0 0) !important;-webkit-clip-path:inset(50%) !important;clip-path:inset(50%) !important;height:1px !important;overflow:hidden !important;padding:0 !important;position:absolute !important;width:1px !important;white-space:nowrap !important}.select2-container--default .select2-selection--single{background-color:#fff;border:1px solid #aaa;border-radius:4px}.select2-container--default .select2-selection--single .select2-selection__rendered{color:#444;line-height:28px}.select2-container--default .select2-selection--single .select2-selection__clear{cursor:pointer;float:right;font-weight:bold}.select2-container--default .select2-selection--single .select2-selection__placeholder{color:#999}.select2-container--default .select2-selection--single .select2-selection__arrow{height:26px;position:absolute;top:1px;right:1px;width:20px}.select2-container--default .select2-selection--single .select2-selection__arrow b{border-color:#888 transparent transparent transparent;border-style:solid;border-width:5px 4px 0 4px;height:0;left:50%;margin-left:-4px;margin-top:-2px;position:absolute;top:50%;width:0}.select2-container--default[dir="rtl"] .select2-selection--single .select2-selection__clear{float:left}.select2-container--default[dir="rtl"] .select2-selection--single .select2-selection__arrow{left:1px;right:auto}.select2-container--default.select2-container--disabled .select2-selection--single{background-color:#eee;cursor:default}.select2-container--default.select2-container--disabled .select2-selection--single .select2-selection__clear{display:none}.select2-container--default.select2-container--open .select2-selection--single .select2-selection__arrow b{border-color:transparent transparent #888 transparent;border-width:0 4px 5px 4px}.select2-container--default .select2-selection--multiple{background-color:white;border:1px solid #aaa;border-radius:4px;cursor:text}.select2-container--default .select2-selection--multiple .select2-selection__rendered{box-sizing:border-box;list-style:none;margin:0;padding:0 5px;width:100%}.select2-container--default .select2-selection--multiple .select2-selection__rendered li{list-style:none}.select2-container--default .select2-selection--multiple .select2-selection__placeholder{color:#999;margin-top:5px;float:left}.select2-container--default .select2-selection--multiple .select2-selection__clear{cursor:pointer;float:right;font-weight:bold;margin-top:5px;margin-right:10px}.select2-container--default .select2-selection--multiple .select2-selection__choice{background-color:#e4e4e4;border:1px solid #aaa;border-radius:4px;cursor:default;float:left;margin-right:5px;margin-top:5px;padding:0 5px}.select2-container--default .select2-selection--multiple .select2-selection__choice__remove{color:#999;cursor:pointer;display:inline-block;font-weight:bold;margin-right:2px}.select2-container--default .select2-selection--multiple .select2-selection__choice__remove:hover{color:#333}.select2-container--default[dir="rtl"] .select2-selection--multiple .select2-selection__choice,.select2-container--default[dir="rtl"] .select2-selection--multiple .select2-selection__placeholder,.select2-container--default[dir="rtl"] .select2-selection--multiple .select2-search--inline{float:right}.select2-container--default[dir="rtl"] .select2-selection--multiple .select2-selection__choice{margin-left:5px;margin-right:auto}.select2-container--default[dir="rtl"] .select2-selection--multiple .select2-selection__choice__remove{margin-left:2px;margin-right:auto}.select2-container--default.select2-container--focus .select2-selection--multiple{border:solid black 1px;outline:0}.select2-container--default.select2-container--disabled .select2-selection--multiple{background-color:#eee;cursor:default}.select2-container--default.select2-container--disabled .select2-selection__choice__remove{display:none}.select2-container--default.select2-container--open.select2-container--above .select2-selection--single,.select2-container--default.select2-container--open.select2-container--above .select2-selection--multiple{border-top-left-radius:0;border-top-right-radius:0}.select2-container--default.select2-container--open.select2-container--below .select2-selection--single,.select2-container--default.select2-container--open.select2-container--below .select2-selection--multiple{border-bottom-left-radius:0;border-bottom-right-radius:0}.select2-container--default .select2-search--dropdown .select2-search__field{border:1px solid #aaa}.select2-container--default .select2-search--inline .select2-search__field{background:transparent;border:none;outline:0;box-shadow:none;-webkit-appearance:textfield}.select2-container--default .select2-results>.select2-results__options{max-height:200px;overflow-y:auto}.select2-container--default .select2-results__option[role=group]{padding:0}.select2-container--default .select2-results__option[aria-disabled=true]{color:#999}.select2-container--default .select2-results__option[aria-selected=true]{background-color:#ddd}.select2-container--default .select2-results__option .select2-results__option{padding-left:1em}.select2-container--default .select2-results__option .select2-results__option .select2-results__group{padding-left:0}.select2-container--default .select2-results__option .select2-results__option .select2-results__option{margin-left:-1em;padding-left:2em}.select2-container--default .select2-results__option .select2-results__option .select2-results__option .select2-results__option{margin-left:-2em;padding-left:3em}.select2-container--default .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option{margin-left:-3em;padding-left:4em}.select2-container--default .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option{margin-left:-4em;padding-left:5em}.select2-container--default .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option{margin-left:-5em;padding-left:6em}.select2-container--default .select2-results__option--highlighted[aria-selected]{background-color:#5897fb;color:white}.select2-container--default .select2-results__group{cursor:default;display:block;padding:6px}.select2-container--classic .select2-selection--single{background-color:#f7f7f7;border:1px solid #aaa;border-radius:4px;outline:0;background-image:-webkit-linear-gradient(top, #fff 50%, #eee 100%);background-image:-o-linear-gradient(top, #fff 50%, #eee 100%);background-image:linear-gradient(to bottom, #fff 50%, #eee 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#FFFFFFFF', endColorstr='#FFEEEEEE', GradientType=0)}.select2-container--classic .select2-selection--single:focus{border:1px solid #5897fb}.select2-container--classic .select2-selection--single .select2-selection__rendered{color:#444;line-height:28px}.select2-container--classic .select2-selection--single .select2-selection__clear{cursor:pointer;float:right;font-weight:bold;margin-right:10px}.select2-container--classic .select2-selection--single .select2-selection__placeholder{color:#999}.select2-container--classic .select2-selection--single .select2-selection__arrow{background-color:#ddd;border:none;border-left:1px solid #aaa;border-top-right-radius:4px;border-bottom-right-radius:4px;height:26px;position:absolute;top:1px;right:1px;width:20px;background-image:-webkit-linear-gradient(top, #eee 50%, #ccc 100%);background-image:-o-linear-gradient(top, #eee 50%, #ccc 100%);background-image:linear-gradient(to bottom, #eee 50%, #ccc 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#FFEEEEEE', endColorstr='#FFCCCCCC', GradientType=0)}.select2-container--classic .select2-selection--single .select2-selection__arrow b{border-color:#888 transparent transparent transparent;border-style:solid;border-width:5px 4px 0 4px;height:0;left:50%;margin-left:-4px;margin-top:-2px;position:absolute;top:50%;width:0}.select2-container--classic[dir="rtl"] .select2-selection--single .select2-selection__clear{float:left}.select2-container--classic[dir="rtl"] .select2-selection--single .select2-selection__arrow{border:none;border-right:1px solid #aaa;border-radius:0;border-top-left-radius:4px;border-bottom-left-radius:4px;left:1px;right:auto}.select2-container--classic.select2-container--open .select2-selection--single{border:1px solid #5897fb}.select2-container--classic.select2-container--open .select2-selection--single .select2-selection__arrow{background:transparent;border:none}.select2-container--classic.select2-container--open .select2-selection--single .select2-selection__arrow b{border-color:transparent transparent #888 transparent;border-width:0 4px 5px 4px}.select2-container--classic.select2-container--open.select2-container--above .select2-selection--single{border-top:none;border-top-left-radius:0;border-top-right-radius:0;background-image:-webkit-linear-gradient(top, #fff 0%, #eee 50%);background-image:-o-linear-gradient(top, #fff 0%, #eee 50%);background-image:linear-gradient(to bottom, #fff 0%, #eee 50%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#FFFFFFFF', endColorstr='#FFEEEEEE', GradientType=0)}.select2-container--classic.select2-container--open.select2-container--below .select2-selection--single{border-bottom:none;border-bottom-left-radius:0;border-bottom-right-radius:0;background-image:-webkit-linear-gradient(top, #eee 50%, #fff 100%);background-image:-o-linear-gradient(top, #eee 50%, #fff 100%);background-image:linear-gradient(to bottom, #eee 50%, #fff 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#FFEEEEEE', endColorstr='#FFFFFFFF', GradientType=0)}.select2-container--classic .select2-selection--multiple{background-color:white;border:1px solid #aaa;border-radius:4px;cursor:text;outline:0}.select2-container--classic .select2-selection--multiple:focus{border:1px solid #5897fb}.select2-container--classic .select2-selection--multiple .select2-selection__rendered{list-style:none;margin:0;padding:0 5px}.select2-container--classic .select2-selection--multiple .select2-selection__clear{display:none}.select2-container--classic .select2-selection--multiple .select2-selection__choice{background-color:#e4e4e4;border:1px solid #aaa;border-radius:4px;cursor:default;float:left;margin-right:5px;margin-top:5px;padding:0 5px}.select2-container--classic .select2-selection--multiple .select2-selection__choice__remove{color:#888;cursor:pointer;display:inline-block;font-weight:bold;margin-right:2px}.select2-container--classic .select2-selection--multiple .select2-selection__choice__remove:hover{color:#555}.select2-container--classic[dir="rtl"] .select2-selection--multiple .select2-selection__choice{float:right;margin-left:5px;margin-right:auto}.select2-container--classic[dir="rtl"] .select2-selection--multiple .select2-selection__choice__remove{margin-left:2px;margin-right:auto}.select2-container--classic.select2-container--open .select2-selection--multiple{border:1px solid #5897fb}.select2-container--classic.select2-container--open.select2-container--above .select2-selection--multiple{border-top:none;border-top-left-radius:0;border-top-right-radius:0}.select2-container--classic.select2-container--open.select2-container--below .select2-selection--multiple{border-bottom:none;border-bottom-left-radius:0;border-bottom-right-radius:0}.select2-container--classic .select2-search--dropdown .select2-search__field{border:1px solid #aaa;outline:0}.select2-container--classic .select2-search--inline .select2-search__field{outline:0;box-shadow:none}.select2-container--classic .select2-dropdown{background-color:#fff;border:1px solid transparent}.select2-container--classic .select2-dropdown--above{border-bottom:none}.select2-container--classic .select2-dropdown--below{border-top:none}.select2-container--classic .select2-results>.select2-results__options{max-height:200px;overflow-y:auto}.select2-container--classic .select2-results__option[role=group]{padding:0}.select2-container--classic .select2-results__option[aria-disabled=true]{color:grey}.select2-container--classic .select2-results__option--highlighted[aria-selected]{background-color:#3875d7;color:#fff}.select2-container--classic .select2-results__group{cursor:default;display:block;padding:6px}.select2-container--classic.select2-container--open .select2-dropdown{border-color:#5897fb}
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/FancySelects/select2-4.0.6-rc.1-dist/js/i18n/af.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/FancySelects/select2-4.0.6-rc.1-dist/js/i18n/af.js
deleted file mode 100644
index 87628ae..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/FancySelects/select2-4.0.6-rc.1-dist/js/i18n/af.js
+++ /dev/null
@@ -1,3 +0,0 @@
-/*! Select2 4.0.6-rc.1 | https://github.com/select2/select2/blob/master/LICENSE.md */
-
-(function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;return e.define("select2/i18n/af",[],function(){return{errorLoading:function(){return"Die resultate kon nie gelaai word nie."},inputTooLong:function(e){var t=e.input.length-e.maximum,n="Verwyders asseblief "+t+" character";return t!=1&&(n+="s"),n},inputTooShort:function(e){var t=e.minimum-e.input.length,n="Voer asseblief "+t+" of meer karakters";return n},loadingMore:function(){return"Meer resultate word gelaai…"},maximumSelected:function(e){var t="Kies asseblief net "+e.maximum+" item";return e.maximum!=1&&(t+="s"),t},noResults:function(){return"Geen resultate gevind"},searching:function(){return"Besig…"}}}),{define:e.define,require:e.require}})();
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/FancySelects/select2-4.0.6-rc.1-dist/js/i18n/ar.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/FancySelects/select2-4.0.6-rc.1-dist/js/i18n/ar.js
deleted file mode 100644
index 18b5edb..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/FancySelects/select2-4.0.6-rc.1-dist/js/i18n/ar.js
+++ /dev/null
@@ -1,3 +0,0 @@
-/*! Select2 4.0.6-rc.1 | https://github.com/select2/select2/blob/master/LICENSE.md */
-
-(function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;return e.define("select2/i18n/ar",[],function(){return{errorLoading:function(){return"لا يمكن تحميل النتائج"},inputTooLong:function(e){var t=e.input.length-e.maximum;return"الرجاء حذف "+t+" عناصر"},inputTooShort:function(e){var t=e.minimum-e.input.length;return"الرجاء إضافة "+t+" عناصر"},loadingMore:function(){return"جاري تحميل نتائج إضافية..."},maximumSelected:function(e){return"تستطيع إختيار "+e.maximum+" بنود فقط"},noResults:function(){return"لم يتم العثور على أي نتائج"},searching:function(){return"جاري البحث…"}}}),{define:e.define,require:e.require}})();
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/FancySelects/select2-4.0.6-rc.1-dist/js/i18n/az.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/FancySelects/select2-4.0.6-rc.1-dist/js/i18n/az.js
deleted file mode 100644
index 884c39e..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/FancySelects/select2-4.0.6-rc.1-dist/js/i18n/az.js
+++ /dev/null
@@ -1,3 +0,0 @@
-/*! Select2 4.0.6-rc.1 | https://github.com/select2/select2/blob/master/LICENSE.md */
-
-(function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;return e.define("select2/i18n/az",[],function(){return{inputTooLong:function(e){var t=e.input.length-e.maximum;return t+" simvol silin"},inputTooShort:function(e){var t=e.minimum-e.input.length;return t+" simvol daxil edin"},loadingMore:function(){return"Daha çox nəticə yüklənir…"},maximumSelected:function(e){return"Sadəcə "+e.maximum+" element seçə bilərsiniz"},noResults:function(){return"Nəticə tapılmadı"},searching:function(){return"Axtarılır…"}}}),{define:e.define,require:e.require}})();
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/FancySelects/select2-4.0.6-rc.1-dist/js/i18n/bg.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/FancySelects/select2-4.0.6-rc.1-dist/js/i18n/bg.js
deleted file mode 100644
index 2f4325a..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/FancySelects/select2-4.0.6-rc.1-dist/js/i18n/bg.js
+++ /dev/null
@@ -1,3 +0,0 @@
-/*! Select2 4.0.6-rc.1 | https://github.com/select2/select2/blob/master/LICENSE.md */
-
-(function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;return e.define("select2/i18n/bg",[],function(){return{inputTooLong:function(e){var t=e.input.length-e.maximum,n="Моля въведете с "+t+" по-малко символ";return t>1&&(n+="a"),n},inputTooShort:function(e){var t=e.minimum-e.input.length,n="Моля въведете още "+t+" символ";return t>1&&(n+="a"),n},loadingMore:function(){return"Зареждат се още…"},maximumSelected:function(e){var t="Можете да направите до "+e.maximum+" ";return e.maximum>1?t+="избора":t+="избор",t},noResults:function(){return"Няма намерени съвпадения"},searching:function(){return"Търсене…"}}}),{define:e.define,require:e.require}})();
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/FancySelects/select2-4.0.6-rc.1-dist/js/i18n/bs.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/FancySelects/select2-4.0.6-rc.1-dist/js/i18n/bs.js
deleted file mode 100644
index e40cc50..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/FancySelects/select2-4.0.6-rc.1-dist/js/i18n/bs.js
+++ /dev/null
@@ -1,3 +0,0 @@
-/*! Select2 4.0.6-rc.1 | https://github.com/select2/select2/blob/master/LICENSE.md */
-
-(function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;return e.define("select2/i18n/bs",[],function(){function e(e,t,n,r){return e%10==1&&e%100!=11?t:e%10>=2&&e%10<=4&&(e%100<12||e%100>14)?n:r}return{errorLoading:function(){return"Preuzimanje nije uspijelo."},inputTooLong:function(t){var n=t.input.length-t.maximum,r="Obrišite "+n+" simbol";return r+=e(n,"","a","a"),r},inputTooShort:function(t){var n=t.minimum-t.input.length,r="Ukucajte bar još "+n+" simbol";return r+=e(n,"","a","a"),r},loadingMore:function(){return"Preuzimanje još rezultata…"},maximumSelected:function(t){var n="Možete izabrati samo "+t.maximum+" stavk";return n+=e(t.maximum,"u","e","i"),n},noResults:function(){return"Ništa nije pronađeno"},searching:function(){return"Pretraga…"}}}),{define:e.define,require:e.require}})();
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/FancySelects/select2-4.0.6-rc.1-dist/js/i18n/ca.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/FancySelects/select2-4.0.6-rc.1-dist/js/i18n/ca.js
deleted file mode 100644
index d6a6abd..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/FancySelects/select2-4.0.6-rc.1-dist/js/i18n/ca.js
+++ /dev/null
@@ -1,3 +0,0 @@
-/*! Select2 4.0.6-rc.1 | https://github.com/select2/select2/blob/master/LICENSE.md */
-
-(function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;return e.define("select2/i18n/ca",[],function(){return{errorLoading:function(){return"La càrrega ha fallat"},inputTooLong:function(e){var t=e.input.length-e.maximum,n="Si us plau, elimina "+t+" car";return t==1?n+="àcter":n+="àcters",n},inputTooShort:function(e){var t=e.minimum-e.input.length,n="Si us plau, introdueix "+t+" car";return t==1?n+="àcter":n+="àcters",n},loadingMore:function(){return"Carregant més resultats…"},maximumSelected:function(e){var t="Només es pot seleccionar "+e.maximum+" element";return e.maximum!=1&&(t+="s"),t},noResults:function(){return"No s'han trobat resultats"},searching:function(){return"Cercant…"}}}),{define:e.define,require:e.require}})();
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/FancySelects/select2-4.0.6-rc.1-dist/js/i18n/cs.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/FancySelects/select2-4.0.6-rc.1-dist/js/i18n/cs.js
deleted file mode 100644
index 8c0d466..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/FancySelects/select2-4.0.6-rc.1-dist/js/i18n/cs.js
+++ /dev/null
@@ -1,3 +0,0 @@
-/*! Select2 4.0.6-rc.1 | https://github.com/select2/select2/blob/master/LICENSE.md */
-
-(function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;return e.define("select2/i18n/cs",[],function(){function e(e,t){switch(e){case 2:return t?"dva":"dvě";case 3:return"tři";case 4:return"čtyři"}return""}return{errorLoading:function(){return"Výsledky nemohly být načteny."},inputTooLong:function(t){var n=t.input.length-t.maximum;return n==1?"Prosím, zadejte o jeden znak méně.":n<=4?"Prosím, zadejte o "+e(n,!0)+" znaky méně.":"Prosím, zadejte o "+n+" znaků méně."},inputTooShort:function(t){var n=t.minimum-t.input.length;return n==1?"Prosím, zadejte ještě jeden znak.":n<=4?"Prosím, zadejte ještě další "+e(n,!0)+" znaky.":"Prosím, zadejte ještě dalších "+n+" znaků."},loadingMore:function(){return"Načítají se další výsledky…"},maximumSelected:function(t){var n=t.maximum;return n==1?"Můžete zvolit jen jednu položku.":n<=4?"Můžete zvolit maximálně "+e(n,!1)+" položky.":"Můžete zvolit maximálně "+n+" položek."},noResults:function(){return"Nenalezeny žádné položky."},searching:function(){return"Vyhledávání…"}}}),{define:e.define,require:e.require}})();
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/FancySelects/select2-4.0.6-rc.1-dist/js/i18n/da.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/FancySelects/select2-4.0.6-rc.1-dist/js/i18n/da.js
deleted file mode 100644
index 081d1c7..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/FancySelects/select2-4.0.6-rc.1-dist/js/i18n/da.js
+++ /dev/null
@@ -1,3 +0,0 @@
-/*! Select2 4.0.6-rc.1 | https://github.com/select2/select2/blob/master/LICENSE.md */
-
-(function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;return e.define("select2/i18n/da",[],function(){return{errorLoading:function(){return"Resultaterne kunne ikke indlæses."},inputTooLong:function(e){var t=e.input.length-e.maximum;return"Angiv venligst "+t+" tegn mindre"},inputTooShort:function(e){var t=e.minimum-e.input.length;return"Angiv venligst "+t+" tegn mere"},loadingMore:function(){return"Indlæser flere resultater…"},maximumSelected:function(e){var t="Du kan kun vælge "+e.maximum+" emne";return e.maximum!=1&&(t+="r"),t},noResults:function(){return"Ingen resultater fundet"},searching:function(){return"Søger…"}}}),{define:e.define,require:e.require}})();
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/FancySelects/select2-4.0.6-rc.1-dist/js/i18n/de.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/FancySelects/select2-4.0.6-rc.1-dist/js/i18n/de.js
deleted file mode 100644
index e1a0172..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/FancySelects/select2-4.0.6-rc.1-dist/js/i18n/de.js
+++ /dev/null
@@ -1,3 +0,0 @@
-/*! Select2 4.0.6-rc.1 | https://github.com/select2/select2/blob/master/LICENSE.md */
-
-(function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;return e.define("select2/i18n/de",[],function(){return{errorLoading:function(){return"Die Ergebnisse konnten nicht geladen werden."},inputTooLong:function(e){var t=e.input.length-e.maximum;return"Bitte "+t+" Zeichen weniger eingeben"},inputTooShort:function(e){var t=e.minimum-e.input.length;return"Bitte "+t+" Zeichen mehr eingeben"},loadingMore:function(){return"Lade mehr Ergebnisse…"},maximumSelected:function(e){var t="Sie können nur "+e.maximum+" Eintr";return e.maximum===1?t+="ag":t+="äge",t+=" auswählen",t},noResults:function(){return"Keine Übereinstimmungen gefunden"},searching:function(){return"Suche…"}}}),{define:e.define,require:e.require}})();
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/FancySelects/select2-4.0.6-rc.1-dist/js/i18n/dsb.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/FancySelects/select2-4.0.6-rc.1-dist/js/i18n/dsb.js
deleted file mode 100644
index c045040..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/FancySelects/select2-4.0.6-rc.1-dist/js/i18n/dsb.js
+++ /dev/null
@@ -1,3 +0,0 @@
-/*! Select2 4.0.6-rc.1 | https://github.com/select2/select2/blob/master/LICENSE.md */
-
-(function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;return e.define("select2/i18n/dsb",[],function(){var e=["znamuško","znamušce","znamuška","znamuškow"],t=["zapisk","zapiska","zapiski","zapiskow"],n=function(t,n){if(t===1)return n[0];if(t===2)return n[1];if(t>2&&t<=4)return n[2];if(t>=5)return n[3]};return{errorLoading:function(){return"Wuslědki njejsu se dali zacytaś."},inputTooLong:function(t){var r=t.input.length-t.maximum;return"Pšosym lašuj "+r+" "+n(r,e)},inputTooShort:function(t){var r=t.minimum-t.input.length;return"Pšosym zapódaj nanejmjenjej "+r+" "+n(r,e)},loadingMore:function(){return"Dalšne wuslědki se zacytaju…"},maximumSelected:function(e){return"Móžoš jano "+e.maximum+" "+n(e.maximum,t)+"wubraś."},noResults:function(){return"Žedne wuslědki namakane"},searching:function(){return"Pyta se…"}}}),{define:e.define,require:e.require}})();
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/FancySelects/select2-4.0.6-rc.1-dist/js/i18n/el.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/FancySelects/select2-4.0.6-rc.1-dist/js/i18n/el.js
deleted file mode 100644
index ab24e29..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/FancySelects/select2-4.0.6-rc.1-dist/js/i18n/el.js
+++ /dev/null
@@ -1,3 +0,0 @@
-/*! Select2 4.0.6-rc.1 | https://github.com/select2/select2/blob/master/LICENSE.md */
-
-(function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;return e.define("select2/i18n/el",[],function(){return{errorLoading:function(){return"Τα αποτελέσματα δεν μπόρεσαν να φορτώσουν."},inputTooLong:function(e){var t=e.input.length-e.maximum,n="Παρακαλώ διαγράψτε "+t+" χαρακτήρ";return t==1&&(n+="α"),t!=1&&(n+="ες"),n},inputTooShort:function(e){var t=e.minimum-e.input.length,n="Παρακαλώ συμπληρώστε "+t+" ή περισσότερους χαρακτήρες";return n},loadingMore:function(){return"Φόρτωση περισσότερων αποτελεσμάτων…"},maximumSelected:function(e){var t="Μπορείτε να επιλέξετε μόνο "+e.maximum+" επιλογ";return e.maximum==1&&(t+="ή"),e.maximum!=1&&(t+="ές"),t},noResults:function(){return"Δεν βρέθηκαν αποτελέσματα"},searching:function(){return"Αναζήτηση…"}}}),{define:e.define,require:e.require}})();
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/FancySelects/select2-4.0.6-rc.1-dist/js/i18n/en.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/FancySelects/select2-4.0.6-rc.1-dist/js/i18n/en.js
deleted file mode 100644
index 646d78a..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/FancySelects/select2-4.0.6-rc.1-dist/js/i18n/en.js
+++ /dev/null
@@ -1,3 +0,0 @@
-/*! Select2 4.0.6-rc.1 | https://github.com/select2/select2/blob/master/LICENSE.md */
-
-(function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;return e.define("select2/i18n/en",[],function(){return{errorLoading:function(){return"The results could not be loaded."},inputTooLong:function(e){var t=e.input.length-e.maximum,n="Please delete "+t+" character";return t!=1&&(n+="s"),n},inputTooShort:function(e){var t=e.minimum-e.input.length,n="Please enter "+t+" or more characters";return n},loadingMore:function(){return"Loading more results…"},maximumSelected:function(e){var t="You can only select "+e.maximum+" item";return e.maximum!=1&&(t+="s"),t},noResults:function(){return"No results found"},searching:function(){return"Searching…"}}}),{define:e.define,require:e.require}})();
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/FancySelects/select2-4.0.6-rc.1-dist/js/i18n/es.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/FancySelects/select2-4.0.6-rc.1-dist/js/i18n/es.js
deleted file mode 100644
index 8430954..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/FancySelects/select2-4.0.6-rc.1-dist/js/i18n/es.js
+++ /dev/null
@@ -1,3 +0,0 @@
-/*! Select2 4.0.6-rc.1 | https://github.com/select2/select2/blob/master/LICENSE.md */
-
-(function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;return e.define("select2/i18n/es",[],function(){return{errorLoading:function(){return"No se pudieron cargar los resultados"},inputTooLong:function(e){var t=e.input.length-e.maximum,n="Por favor, elimine "+t+" car";return t==1?n+="ácter":n+="acteres",n},inputTooShort:function(e){var t=e.minimum-e.input.length,n="Por favor, introduzca "+t+" car";return t==1?n+="ácter":n+="acteres",n},loadingMore:function(){return"Cargando más resultados…"},maximumSelected:function(e){var t="Sólo puede seleccionar "+e.maximum+" elemento";return e.maximum!=1&&(t+="s"),t},noResults:function(){return"No se encontraron resultados"},searching:function(){return"Buscando…"}}}),{define:e.define,require:e.require}})();
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/FancySelects/select2-4.0.6-rc.1-dist/js/i18n/et.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/FancySelects/select2-4.0.6-rc.1-dist/js/i18n/et.js
deleted file mode 100644
index d19b6c6..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/FancySelects/select2-4.0.6-rc.1-dist/js/i18n/et.js
+++ /dev/null
@@ -1,3 +0,0 @@
-/*! Select2 4.0.6-rc.1 | https://github.com/select2/select2/blob/master/LICENSE.md */
-
-(function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;return e.define("select2/i18n/et",[],function(){return{inputTooLong:function(e){var t=e.input.length-e.maximum,n="Sisesta "+t+" täht";return t!=1&&(n+="e"),n+=" vähem",n},inputTooShort:function(e){var t=e.minimum-e.input.length,n="Sisesta "+t+" täht";return t!=1&&(n+="e"),n+=" rohkem",n},loadingMore:function(){return"Laen tulemusi…"},maximumSelected:function(e){var t="Saad vaid "+e.maximum+" tulemus";return e.maximum==1?t+="e":t+="t",t+=" valida",t},noResults:function(){return"Tulemused puuduvad"},searching:function(){return"Otsin…"}}}),{define:e.define,require:e.require}})();
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/FancySelects/select2-4.0.6-rc.1-dist/js/i18n/eu.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/FancySelects/select2-4.0.6-rc.1-dist/js/i18n/eu.js
deleted file mode 100644
index f403093..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/FancySelects/select2-4.0.6-rc.1-dist/js/i18n/eu.js
+++ /dev/null
@@ -1,3 +0,0 @@
-/*! Select2 4.0.6-rc.1 | https://github.com/select2/select2/blob/master/LICENSE.md */
-
-(function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;return e.define("select2/i18n/eu",[],function(){return{inputTooLong:function(e){var t=e.input.length-e.maximum,n="Idatzi ";return t==1?n+="karaktere bat":n+=t+" karaktere",n+=" gutxiago",n},inputTooShort:function(e){var t=e.minimum-e.input.length,n="Idatzi ";return t==1?n+="karaktere bat":n+=t+" karaktere",n+=" gehiago",n},loadingMore:function(){return"Emaitza gehiago kargatzen…"},maximumSelected:function(e){return e.maximum===1?"Elementu bakarra hauta dezakezu":e.maximum+" elementu hauta ditzakezu soilik"},noResults:function(){return"Ez da bat datorrenik aurkitu"},searching:function(){return"Bilatzen…"}}}),{define:e.define,require:e.require}})();
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/FancySelects/select2-4.0.6-rc.1-dist/js/i18n/fa.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/FancySelects/select2-4.0.6-rc.1-dist/js/i18n/fa.js
deleted file mode 100644
index b2a7d0e..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/FancySelects/select2-4.0.6-rc.1-dist/js/i18n/fa.js
+++ /dev/null
@@ -1,3 +0,0 @@
-/*! Select2 4.0.6-rc.1 | https://github.com/select2/select2/blob/master/LICENSE.md */
-
-(function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;return e.define("select2/i18n/fa",[],function(){return{errorLoading:function(){return"امکان بارگذاری نتایج وجود ندارد."},inputTooLong:function(e){var t=e.input.length-e.maximum,n="لطفاً "+t+" کاراکتر را حذف نمایید";return n},inputTooShort:function(e){var t=e.minimum-e.input.length,n="لطفاً تعداد "+t+" کاراکتر یا بیشتر وارد نمایید";return n},loadingMore:function(){return"در حال بارگذاری نتایج بیشتر..."},maximumSelected:function(e){var t="شما تنها می‌توانید "+e.maximum+" آیتم را انتخاب نمایید";return t},noResults:function(){return"هیچ نتیجه‌ای یافت نشد"},searching:function(){return"در حال جستجو..."}}}),{define:e.define,require:e.require}})();
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/FancySelects/select2-4.0.6-rc.1-dist/js/i18n/fi.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/FancySelects/select2-4.0.6-rc.1-dist/js/i18n/fi.js
deleted file mode 100644
index 126e4dc..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/FancySelects/select2-4.0.6-rc.1-dist/js/i18n/fi.js
+++ /dev/null
@@ -1,3 +0,0 @@
-/*! Select2 4.0.6-rc.1 | https://github.com/select2/select2/blob/master/LICENSE.md */
-
-(function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;return e.define("select2/i18n/fi",[],function(){return{errorLoading:function(){return"Tuloksia ei saatu ladattua."},inputTooLong:function(e){var t=e.input.length-e.maximum;return"Ole hyvä ja anna "+t+" merkkiä vähemmän"},inputTooShort:function(e){var t=e.minimum-e.input.length;return"Ole hyvä ja anna "+t+" merkkiä lisää"},loadingMore:function(){return"Ladataan lisää tuloksia…"},maximumSelected:function(e){return"Voit valita ainoastaan "+e.maximum+" kpl"},noResults:function(){return"Ei tuloksia"},searching:function(){return"Haetaan…"}}}),{define:e.define,require:e.require}})();
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/FancySelects/select2-4.0.6-rc.1-dist/js/i18n/fr.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/FancySelects/select2-4.0.6-rc.1-dist/js/i18n/fr.js
deleted file mode 100644
index 7b3183c..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/FancySelects/select2-4.0.6-rc.1-dist/js/i18n/fr.js
+++ /dev/null
@@ -1,3 +0,0 @@
-/*! Select2 4.0.6-rc.1 | https://github.com/select2/select2/blob/master/LICENSE.md */
-
-(function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;return e.define("select2/i18n/fr",[],function(){return{errorLoading:function(){return"Les résultats ne peuvent pas être chargés."},inputTooLong:function(e){var t=e.input.length-e.maximum;return"Supprimez "+t+" caractère"+(t>1?"s":"")},inputTooShort:function(e){var t=e.minimum-e.input.length;return"Saisissez au moins "+t+" caractère"+(t>1?"s":"")},loadingMore:function(){return"Chargement de résultats supplémentaires…"},maximumSelected:function(e){return"Vous pouvez seulement sélectionner "+e.maximum+" élément"+(e.maximum>1?"s":"")},noResults:function(){return"Aucun résultat trouvé"},searching:function(){return"Recherche en cours…"}}}),{define:e.define,require:e.require}})();
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/FancySelects/select2-4.0.6-rc.1-dist/js/i18n/gl.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/FancySelects/select2-4.0.6-rc.1-dist/js/i18n/gl.js
deleted file mode 100644
index b501a62..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/FancySelects/select2-4.0.6-rc.1-dist/js/i18n/gl.js
+++ /dev/null
@@ -1,3 +0,0 @@
-/*! Select2 4.0.6-rc.1 | https://github.com/select2/select2/blob/master/LICENSE.md */
-
-(function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;return e.define("select2/i18n/gl",[],function(){return{errorLoading:function(){return"Non foi posíbel cargar os resultados."},inputTooLong:function(e){var t=e.input.length-e.maximum;return t===1?"Elimine un carácter":"Elimine "+t+" caracteres"},inputTooShort:function(e){var t=e.minimum-e.input.length;return t===1?"Engada un carácter":"Engada "+t+" caracteres"},loadingMore:function(){return"Cargando máis resultados…"},maximumSelected:function(e){return e.maximum===1?"Só pode seleccionar un elemento":"Só pode seleccionar "+e.maximum+" elementos"},noResults:function(){return"Non se atoparon resultados"},searching:function(){return"Buscando…"}}}),{define:e.define,require:e.require}})();
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/FancySelects/select2-4.0.6-rc.1-dist/js/i18n/he.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/FancySelects/select2-4.0.6-rc.1-dist/js/i18n/he.js
deleted file mode 100644
index afd7e8a..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/FancySelects/select2-4.0.6-rc.1-dist/js/i18n/he.js
+++ /dev/null
@@ -1,3 +0,0 @@
-/*! Select2 4.0.6-rc.1 | https://github.com/select2/select2/blob/master/LICENSE.md */
-
-(function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;return e.define("select2/i18n/he",[],function(){return{errorLoading:function(){return"שגיאה בטעינת התוצאות"},inputTooLong:function(e){var t=e.input.length-e.maximum,n="נא למחוק ";return t===1?n+="תו אחד":n+=t+" תווים",n},inputTooShort:function(e){var t=e.minimum-e.input.length,n="נא להכניס ";return t===1?n+="תו אחד":n+=t+" תווים",n+=" או יותר",n},loadingMore:function(){return"טוען תוצאות נוספות…"},maximumSelected:function(e){var t="באפשרותך לבחור עד ";return e.maximum===1?t+="פריט אחד":t+=e.maximum+" פריטים",t},noResults:function(){return"לא נמצאו תוצאות"},searching:function(){return"מחפש…"}}}),{define:e.define,require:e.require}})();
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/FancySelects/select2-4.0.6-rc.1-dist/js/i18n/hi.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/FancySelects/select2-4.0.6-rc.1-dist/js/i18n/hi.js
deleted file mode 100644
index 2dc94c9..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/FancySelects/select2-4.0.6-rc.1-dist/js/i18n/hi.js
+++ /dev/null
@@ -1,3 +0,0 @@
-/*! Select2 4.0.6-rc.1 | https://github.com/select2/select2/blob/master/LICENSE.md */
-
-(function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;return e.define("select2/i18n/hi",[],function(){return{errorLoading:function(){return"परिणामों को लोड नहीं किया जा सका।"},inputTooLong:function(e){var t=e.input.length-e.maximum,n=t+" अक्षर को हटा दें";return t>1&&(n=t+" अक्षरों को हटा दें "),n},inputTooShort:function(e){var t=e.minimum-e.input.length,n="कृपया "+t+" या अधिक अक्षर दर्ज करें";return n},loadingMore:function(){return"अधिक परिणाम लोड हो रहे है..."},maximumSelected:function(e){var t="आप केवल "+e.maximum+" आइटम का चयन कर सकते हैं";return t},noResults:function(){return"कोई परिणाम नहीं मिला"},searching:function(){return"खोज रहा है..."}}}),{define:e.define,require:e.require}})();
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/FancySelects/select2-4.0.6-rc.1-dist/js/i18n/hr.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/FancySelects/select2-4.0.6-rc.1-dist/js/i18n/hr.js
deleted file mode 100644
index 8637a94..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/FancySelects/select2-4.0.6-rc.1-dist/js/i18n/hr.js
+++ /dev/null
@@ -1,3 +0,0 @@
-/*! Select2 4.0.6-rc.1 | https://github.com/select2/select2/blob/master/LICENSE.md */
-
-(function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;return e.define("select2/i18n/hr",[],function(){function e(e){var t=" "+e+" znak";return e%10<5&&e%10>0&&(e%100<5||e%100>19)?e%10>1&&(t+="a"):t+="ova",t}return{errorLoading:function(){return"Preuzimanje nije uspjelo."},inputTooLong:function(t){var n=t.input.length-t.maximum;return"Unesite "+e(n)},inputTooShort:function(t){var n=t.minimum-t.input.length;return"Unesite još "+e(n)},loadingMore:function(){return"Učitavanje rezultata…"},maximumSelected:function(e){return"Maksimalan broj odabranih stavki je "+e.maximum},noResults:function(){return"Nema rezultata"},searching:function(){return"Pretraga…"}}}),{define:e.define,require:e.require}})();
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/FancySelects/select2-4.0.6-rc.1-dist/js/i18n/hsb.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/FancySelects/select2-4.0.6-rc.1-dist/js/i18n/hsb.js
deleted file mode 100644
index 970e18c..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/FancySelects/select2-4.0.6-rc.1-dist/js/i18n/hsb.js
+++ /dev/null
@@ -1,3 +0,0 @@
-/*! Select2 4.0.6-rc.1 | https://github.com/select2/select2/blob/master/LICENSE.md */
-
-(function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;return e.define("select2/i18n/hsb",[],function(){var e=["znamješko","znamješce","znamješka","znamješkow"],t=["zapisk","zapiskaj","zapiski","zapiskow"],n=function(t,n){if(t===1)return n[0];if(t===2)return n[1];if(t>2&&t<=4)return n[2];if(t>=5)return n[3]};return{errorLoading:function(){return"Wuslědki njedachu so začitać."},inputTooLong:function(t){var r=t.input.length-t.maximum;return"Prošu zhašej "+r+" "+n(r,e)},inputTooShort:function(t){var r=t.minimum-t.input.length;return"Prošu zapodaj znajmjeńša "+r+" "+n(r,e)},loadingMore:function(){return"Dalše wuslědki so začitaja…"},maximumSelected:function(e){return"Móžeš jenož "+e.maximum+" "+n(e.maximum,t)+"wubrać"},noResults:function(){return"Žane wuslědki namakane"},searching:function(){return"Pyta so…"}}}),{define:e.define,require:e.require}})();
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/FancySelects/select2-4.0.6-rc.1-dist/js/i18n/hu.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/FancySelects/select2-4.0.6-rc.1-dist/js/i18n/hu.js
deleted file mode 100644
index 0296c29..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/FancySelects/select2-4.0.6-rc.1-dist/js/i18n/hu.js
+++ /dev/null
@@ -1,3 +0,0 @@
-/*! Select2 4.0.6-rc.1 | https://github.com/select2/select2/blob/master/LICENSE.md */
-
-(function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;return e.define("select2/i18n/hu",[],function(){return{errorLoading:function(){return"Az eredmények betöltése nem sikerült."},inputTooLong:function(e){var t=e.input.length-e.maximum;return"Túl hosszú. "+t+" karakterrel több, mint kellene."},inputTooShort:function(e){var t=e.minimum-e.input.length;return"Túl rövid. Még "+t+" karakter hiányzik."},loadingMore:function(){return"Töltés…"},maximumSelected:function(e){return"Csak "+e.maximum+" elemet lehet kiválasztani."},noResults:function(){return"Nincs találat."},searching:function(){return"Keresés…"}}}),{define:e.define,require:e.require}})();
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/FancySelects/select2-4.0.6-rc.1-dist/js/i18n/hy.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/FancySelects/select2-4.0.6-rc.1-dist/js/i18n/hy.js
deleted file mode 100644
index f7db83e..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/FancySelects/select2-4.0.6-rc.1-dist/js/i18n/hy.js
+++ /dev/null
@@ -1,3 +0,0 @@
-/*! Select2 4.0.6-rc.1 | https://github.com/select2/select2/blob/master/LICENSE.md */
-
-(function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;return e.define("select2/i18n/hy",[],function(){return{errorLoading:function(){return"Արդյունքները հնարավոր չէ բեռնել։"},inputTooLong:function(e){var t=e.input.length-e.maximum,n="Խնդրում ենք հեռացնել "+t+" նշան";return n},inputTooShort:function(e){var t=e.minimum-e.input.length,n="Խնդրում ենք մուտքագրել "+t+" կամ ավել նշաններ";return n},loadingMore:function(){return"Բեռնվում են նոր արդյունքներ․․․"},maximumSelected:function(e){var t="Դուք կարող եք ընտրել առավելագույնը "+e.maximum+" կետ";return t},noResults:function(){return"Արդյունքներ չեն գտնվել"},searching:function(){return"Որոնում․․․"}}}),{define:e.define,require:e.require}})();
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/FancySelects/select2-4.0.6-rc.1-dist/js/i18n/id.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/FancySelects/select2-4.0.6-rc.1-dist/js/i18n/id.js
deleted file mode 100644
index 247ba2b..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/FancySelects/select2-4.0.6-rc.1-dist/js/i18n/id.js
+++ /dev/null
@@ -1,3 +0,0 @@
-/*! Select2 4.0.6-rc.1 | https://github.com/select2/select2/blob/master/LICENSE.md */
-
-(function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;return e.define("select2/i18n/id",[],function(){return{errorLoading:function(){return"Data tidak boleh diambil."},inputTooLong:function(e){var t=e.input.length-e.maximum;return"Hapuskan "+t+" huruf"},inputTooShort:function(e){var t=e.minimum-e.input.length;return"Masukkan "+t+" huruf lagi"},loadingMore:function(){return"Mengambil data…"},maximumSelected:function(e){return"Anda hanya dapat memilih "+e.maximum+" pilihan"},noResults:function(){return"Tidak ada data yang sesuai"},searching:function(){return"Mencari…"}}}),{define:e.define,require:e.require}})();
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/FancySelects/select2-4.0.6-rc.1-dist/js/i18n/is.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/FancySelects/select2-4.0.6-rc.1-dist/js/i18n/is.js
deleted file mode 100644
index aae1f38..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/FancySelects/select2-4.0.6-rc.1-dist/js/i18n/is.js
+++ /dev/null
@@ -1,3 +0,0 @@
-/*! Select2 4.0.6-rc.1 | https://github.com/select2/select2/blob/master/LICENSE.md */
-
-(function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;return e.define("select2/i18n/is",[],function(){return{inputTooLong:function(e){var t=e.input.length-e.maximum,n="Vinsamlegast styttið texta um "+t+" staf";return t<=1?n:n+"i"},inputTooShort:function(e){var t=e.minimum-e.input.length,n="Vinsamlegast skrifið "+t+" staf";return t>1&&(n+="i"),n+=" í viðbót",n},loadingMore:function(){return"Sæki fleiri niðurstöður…"},maximumSelected:function(e){return"Þú getur aðeins valið "+e.maximum+" atriði"},noResults:function(){return"Ekkert fannst"},searching:function(){return"Leita…"}}}),{define:e.define,require:e.require}})();
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/FancySelects/select2-4.0.6-rc.1-dist/js/i18n/it.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/FancySelects/select2-4.0.6-rc.1-dist/js/i18n/it.js
deleted file mode 100644
index f56bfa6..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/FancySelects/select2-4.0.6-rc.1-dist/js/i18n/it.js
+++ /dev/null
@@ -1,3 +0,0 @@
-/*! Select2 4.0.6-rc.1 | https://github.com/select2/select2/blob/master/LICENSE.md */
-
-(function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;return e.define("select2/i18n/it",[],function(){return{errorLoading:function(){return"I risultati non possono essere caricati."},inputTooLong:function(e){var t=e.input.length-e.maximum,n="Per favore cancella "+t+" caratter";return t!==1?n+="i":n+="e",n},inputTooShort:function(e){var t=e.minimum-e.input.length,n="Per favore inserisci "+t+" o più caratteri";return n},loadingMore:function(){return"Caricando più risultati…"},maximumSelected:function(e){var t="Puoi selezionare solo "+e.maximum+" element";return e.maximum!==1?t+="i":t+="o",t},noResults:function(){return"Nessun risultato trovato"},searching:function(){return"Sto cercando…"}}}),{define:e.define,require:e.require}})();
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/FancySelects/select2-4.0.6-rc.1-dist/js/i18n/ja.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/FancySelects/select2-4.0.6-rc.1-dist/js/i18n/ja.js
deleted file mode 100644
index bda8e7d..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/FancySelects/select2-4.0.6-rc.1-dist/js/i18n/ja.js
+++ /dev/null
@@ -1,3 +0,0 @@
-/*! Select2 4.0.6-rc.1 | https://github.com/select2/select2/blob/master/LICENSE.md */
-
-(function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;return e.define("select2/i18n/ja",[],function(){return{errorLoading:function(){return"結果が読み込まれませんでした"},inputTooLong:function(e){var t=e.input.length-e.maximum,n=t+" 文字を削除してください";return n},inputTooShort:function(e){var t=e.minimum-e.input.length,n="少なくとも "+t+" 文字を入力してください";return n},loadingMore:function(){return"読み込み中…"},maximumSelected:function(e){var t=e.maximum+" 件しか選択できません";return t},noResults:function(){return"対象が見つかりません"},searching:function(){return"検索しています…"}}}),{define:e.define,require:e.require}})();
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/FancySelects/select2-4.0.6-rc.1-dist/js/i18n/km.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/FancySelects/select2-4.0.6-rc.1-dist/js/i18n/km.js
deleted file mode 100644
index be2c4ae..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/FancySelects/select2-4.0.6-rc.1-dist/js/i18n/km.js
+++ /dev/null
@@ -1,3 +0,0 @@
-/*! Select2 4.0.6-rc.1 | https://github.com/select2/select2/blob/master/LICENSE.md */
-
-(function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;return e.define("select2/i18n/km",[],function(){return{errorLoading:function(){return"មិនអាចទាញយកទិន្នន័យ"},inputTooLong:function(e){var t=e.input.length-e.maximum,n="សូមលុបចេញ  "+t+" អក្សរ";return n},inputTooShort:function(e){var t=e.minimum-e.input.length,n="សូមបញ្ចូល"+t+" អក្សរ រឺ ច្រើនជាងនេះ";return n},loadingMore:function(){return"កំពុងទាញយកទិន្នន័យបន្ថែម..."},maximumSelected:function(e){var t="អ្នកអាចជ្រើសរើសបានតែ "+e.maximum+" ជម្រើសប៉ុណ្ណោះ";return t},noResults:function(){return"មិនមានលទ្ធផល"},searching:function(){return"កំពុងស្វែងរក..."}}}),{define:e.define,require:e.require}})();
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/FancySelects/select2-4.0.6-rc.1-dist/js/i18n/ko.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/FancySelects/select2-4.0.6-rc.1-dist/js/i18n/ko.js
deleted file mode 100644
index caee03f..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/FancySelects/select2-4.0.6-rc.1-dist/js/i18n/ko.js
+++ /dev/null
@@ -1,3 +0,0 @@
-/*! Select2 4.0.6-rc.1 | https://github.com/select2/select2/blob/master/LICENSE.md */
-
-(function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;return e.define("select2/i18n/ko",[],function(){return{errorLoading:function(){return"결과를 불러올 수 없습니다."},inputTooLong:function(e){var t=e.input.length-e.maximum,n="너무 깁니다. "+t+" 글자 지워주세요.";return n},inputTooShort:function(e){var t=e.minimum-e.input.length,n="너무 짧습니다. "+t+" 글자 더 입력해주세요.";return n},loadingMore:function(){return"불러오는 중…"},maximumSelected:function(e){var t="최대 "+e.maximum+"개까지만 선택 가능합니다.";return t},noResults:function(){return"결과가 없습니다."},searching:function(){return"검색 중…"}}}),{define:e.define,require:e.require}})();
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/FancySelects/select2-4.0.6-rc.1-dist/js/i18n/lt.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/FancySelects/select2-4.0.6-rc.1-dist/js/i18n/lt.js
deleted file mode 100644
index a3f9af2..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/FancySelects/select2-4.0.6-rc.1-dist/js/i18n/lt.js
+++ /dev/null
@@ -1,3 +0,0 @@
-/*! Select2 4.0.6-rc.1 | https://github.com/select2/select2/blob/master/LICENSE.md */
-
-(function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;return e.define("select2/i18n/lt",[],function(){function e(e,t,n,r){return e%10===1&&(e%100<11||e%100>19)?t:e%10>=2&&e%10<=9&&(e%100<11||e%100>19)?n:r}return{inputTooLong:function(t){var n=t.input.length-t.maximum,r="Pašalinkite "+n+" simbol";return r+=e(n,"į","ius","ių"),r},inputTooShort:function(t){var n=t.minimum-t.input.length,r="Įrašykite dar "+n+" simbol";return r+=e(n,"į","ius","ių"),r},loadingMore:function(){return"Kraunama daugiau rezultatų…"},maximumSelected:function(t){var n="Jūs galite pasirinkti tik "+t.maximum+" element";return n+=e(t.maximum,"ą","us","ų"),n},noResults:function(){return"Atitikmenų nerasta"},searching:function(){return"Ieškoma…"}}}),{define:e.define,require:e.require}})();
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/FancySelects/select2-4.0.6-rc.1-dist/js/i18n/lv.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/FancySelects/select2-4.0.6-rc.1-dist/js/i18n/lv.js
deleted file mode 100644
index 242b1b4..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/FancySelects/select2-4.0.6-rc.1-dist/js/i18n/lv.js
+++ /dev/null
@@ -1,3 +0,0 @@
-/*! Select2 4.0.6-rc.1 | https://github.com/select2/select2/blob/master/LICENSE.md */
-
-(function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;return e.define("select2/i18n/lv",[],function(){function e(e,t,n,r){return e===11?t:e%10===1?n:r}return{inputTooLong:function(t){var n=t.input.length-t.maximum,r="Lūdzu ievadiet par  "+n;return r+=" simbol"+e(n,"iem","u","iem"),r+" mazāk"},inputTooShort:function(t){var n=t.minimum-t.input.length,r="Lūdzu ievadiet vēl "+n;return r+=" simbol"+e(n,"us","u","us"),r},loadingMore:function(){return"Datu ielāde…"},maximumSelected:function(t){var n="Jūs varat izvēlēties ne vairāk kā "+t.maximum;return n+=" element"+e(t.maximum,"us","u","us"),n},noResults:function(){return"Sakritību nav"},searching:function(){return"Meklēšana…"}}}),{define:e.define,require:e.require}})();
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/FancySelects/select2-4.0.6-rc.1-dist/js/i18n/mk.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/FancySelects/select2-4.0.6-rc.1-dist/js/i18n/mk.js
deleted file mode 100644
index 7b4c338..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/FancySelects/select2-4.0.6-rc.1-dist/js/i18n/mk.js
+++ /dev/null
@@ -1,3 +0,0 @@
-/*! Select2 4.0.6-rc.1 | https://github.com/select2/select2/blob/master/LICENSE.md */
-
-(function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;return e.define("select2/i18n/mk",[],function(){return{inputTooLong:function(e){var t=e.input.length-e.maximum,n="Ве молиме внесете "+e.maximum+" помалку карактер";return e.maximum!==1&&(n+="и"),n},inputTooShort:function(e){var t=e.minimum-e.input.length,n="Ве молиме внесете уште "+e.maximum+" карактер";return e.maximum!==1&&(n+="и"),n},loadingMore:function(){return"Вчитување резултати…"},maximumSelected:function(e){var t="Можете да изберете само "+e.maximum+" ставк";return e.maximum===1?t+="а":t+="и",t},noResults:function(){return"Нема пронајдено совпаѓања"},searching:function(){return"Пребарување…"}}}),{define:e.define,require:e.require}})();
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/FancySelects/select2-4.0.6-rc.1-dist/js/i18n/ms.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/FancySelects/select2-4.0.6-rc.1-dist/js/i18n/ms.js
deleted file mode 100644
index 7990997..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/FancySelects/select2-4.0.6-rc.1-dist/js/i18n/ms.js
+++ /dev/null
@@ -1,3 +0,0 @@
-/*! Select2 4.0.6-rc.1 | https://github.com/select2/select2/blob/master/LICENSE.md */
-
-(function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;return e.define("select2/i18n/ms",[],function(){return{errorLoading:function(){return"Keputusan tidak berjaya dimuatkan."},inputTooLong:function(e){var t=e.input.length-e.maximum;return"Sila hapuskan "+t+" aksara"},inputTooShort:function(e){var t=e.minimum-e.input.length;return"Sila masukkan "+t+" atau lebih aksara"},loadingMore:function(){return"Sedang memuatkan keputusan…"},maximumSelected:function(e){return"Anda hanya boleh memilih "+e.maximum+" pilihan"},noResults:function(){return"Tiada padanan yang ditemui"},searching:function(){return"Mencari…"}}}),{define:e.define,require:e.require}})();
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/FancySelects/select2-4.0.6-rc.1-dist/js/i18n/nb.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/FancySelects/select2-4.0.6-rc.1-dist/js/i18n/nb.js
deleted file mode 100644
index d6553ca..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/FancySelects/select2-4.0.6-rc.1-dist/js/i18n/nb.js
+++ /dev/null
@@ -1,3 +0,0 @@
-/*! Select2 4.0.6-rc.1 | https://github.com/select2/select2/blob/master/LICENSE.md */
-
-(function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;return e.define("select2/i18n/nb",[],function(){return{errorLoading:function(){return"Kunne ikke hente resultater."},inputTooLong:function(e){var t=e.input.length-e.maximum;return"Vennligst fjern "+t+" tegn"},inputTooShort:function(e){var t=e.minimum-e.input.length;return"Vennligst skriv inn "+t+" tegn til"},loadingMore:function(){return"Laster flere resultater…"},maximumSelected:function(e){return"Du kan velge maks "+e.maximum+" elementer"},noResults:function(){return"Ingen treff"},searching:function(){return"Søker…"}}}),{define:e.define,require:e.require}})();
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/FancySelects/select2-4.0.6-rc.1-dist/js/i18n/nl.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/FancySelects/select2-4.0.6-rc.1-dist/js/i18n/nl.js
deleted file mode 100644
index 043c36a..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/FancySelects/select2-4.0.6-rc.1-dist/js/i18n/nl.js
+++ /dev/null
@@ -1,3 +0,0 @@
-/*! Select2 4.0.6-rc.1 | https://github.com/select2/select2/blob/master/LICENSE.md */
-
-(function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;return e.define("select2/i18n/nl",[],function(){return{errorLoading:function(){return"De resultaten konden niet worden geladen."},inputTooLong:function(e){var t=e.input.length-e.maximum,n="Gelieve "+t+" karakters te verwijderen";return n},inputTooShort:function(e){var t=e.minimum-e.input.length,n="Gelieve "+t+" of meer karakters in te voeren";return n},loadingMore:function(){return"Meer resultaten laden…"},maximumSelected:function(e){var t=e.maximum==1?"kan":"kunnen",n="Er "+t+" maar "+e.maximum+" item";return e.maximum!=1&&(n+="s"),n+=" worden geselecteerd",n},noResults:function(){return"Geen resultaten gevonden…"},searching:function(){return"Zoeken…"}}}),{define:e.define,require:e.require}})();
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/FancySelects/select2-4.0.6-rc.1-dist/js/i18n/pl.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/FancySelects/select2-4.0.6-rc.1-dist/js/i18n/pl.js
deleted file mode 100644
index f04f0e9..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/FancySelects/select2-4.0.6-rc.1-dist/js/i18n/pl.js
+++ /dev/null
@@ -1,3 +0,0 @@
-/*! Select2 4.0.6-rc.1 | https://github.com/select2/select2/blob/master/LICENSE.md */
-
-(function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;return e.define("select2/i18n/pl",[],function(){var e=["znak","znaki","znaków"],t=["element","elementy","elementów"],n=function(t,n){if(t===1)return n[0];if(t>1&&t<=4)return n[1];if(t>=5)return n[2]};return{errorLoading:function(){return"Nie można załadować wyników."},inputTooLong:function(t){var r=t.input.length-t.maximum;return"Usuń "+r+" "+n(r,e)},inputTooShort:function(t){var r=t.minimum-t.input.length;return"Podaj przynajmniej "+r+" "+n(r,e)},loadingMore:function(){return"Trwa ładowanie…"},maximumSelected:function(e){return"Możesz zaznaczyć tylko "+e.maximum+" "+n(e.maximum,t)},noResults:function(){return"Brak wyników"},searching:function(){return"Trwa wyszukiwanie…"}}}),{define:e.define,require:e.require}})();
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/FancySelects/select2-4.0.6-rc.1-dist/js/i18n/ps.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/FancySelects/select2-4.0.6-rc.1-dist/js/i18n/ps.js
deleted file mode 100644
index be5e8ee..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/FancySelects/select2-4.0.6-rc.1-dist/js/i18n/ps.js
+++ /dev/null
@@ -1,3 +0,0 @@
-/*! Select2 4.0.6-rc.1 | https://github.com/select2/select2/blob/master/LICENSE.md */
-
-(function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;return e.define("select2/i18n/ps",[],function(){return{errorLoading:function(){return"پايلي نه سي ترلاسه کېدای"},inputTooLong:function(e){var t=e.input.length-e.maximum,n="د مهربانۍ لمخي "+t+" توری ړنګ کړئ";return t!=1&&(n=n.replace("توری","توري")),n},inputTooShort:function(e){var t=e.minimum-e.input.length,n="لږ تر لږه "+t+" يا ډېر توري وليکئ";return n},loadingMore:function(){return"نوري پايلي ترلاسه کيږي..."},maximumSelected:function(e){var t="تاسو يوازي "+e.maximum+" قلم په نښه کولای سی";return e.maximum!=1&&(t=t.replace("قلم","قلمونه")),t},noResults:function(){return"پايلي و نه موندل سوې"},searching:function(){return"لټول کيږي..."}}}),{define:e.define,require:e.require}})();
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/FancySelects/select2-4.0.6-rc.1-dist/js/i18n/pt-BR.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/FancySelects/select2-4.0.6-rc.1-dist/js/i18n/pt-BR.js
deleted file mode 100644
index feb82f2..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/FancySelects/select2-4.0.6-rc.1-dist/js/i18n/pt-BR.js
+++ /dev/null
@@ -1,3 +0,0 @@
-/*! Select2 4.0.6-rc.1 | https://github.com/select2/select2/blob/master/LICENSE.md */
-
-(function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;return e.define("select2/i18n/pt-BR",[],function(){return{errorLoading:function(){return"Os resultados não puderam ser carregados."},inputTooLong:function(e){var t=e.input.length-e.maximum,n="Apague "+t+" caracter";return t!=1&&(n+="es"),n},inputTooShort:function(e){var t=e.minimum-e.input.length,n="Digite "+t+" ou mais caracteres";return n},loadingMore:function(){return"Carregando mais resultados…"},maximumSelected:function(e){var t="Você só pode selecionar "+e.maximum+" ite";return e.maximum==1?t+="m":t+="ns",t},noResults:function(){return"Nenhum resultado encontrado"},searching:function(){return"Buscando…"}}}),{define:e.define,require:e.require}})();
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/FancySelects/select2-4.0.6-rc.1-dist/js/i18n/pt.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/FancySelects/select2-4.0.6-rc.1-dist/js/i18n/pt.js
deleted file mode 100644
index 8c1f25c..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/FancySelects/select2-4.0.6-rc.1-dist/js/i18n/pt.js
+++ /dev/null
@@ -1,3 +0,0 @@
-/*! Select2 4.0.6-rc.1 | https://github.com/select2/select2/blob/master/LICENSE.md */
-
-(function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;return e.define("select2/i18n/pt",[],function(){return{errorLoading:function(){return"Os resultados não puderam ser carregados."},inputTooLong:function(e){var t=e.input.length-e.maximum,n="Por favor apague "+t+" ";return n+=t!=1?"caracteres":"caractere",n},inputTooShort:function(e){var t=e.minimum-e.input.length,n="Introduza "+t+" ou mais caracteres";return n},loadingMore:function(){return"A carregar mais resultados…"},maximumSelected:function(e){var t="Apenas pode seleccionar "+e.maximum+" ";return t+=e.maximum!=1?"itens":"item",t},noResults:function(){return"Sem resultados"},searching:function(){return"A procurar…"}}}),{define:e.define,require:e.require}})();
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/FancySelects/select2-4.0.6-rc.1-dist/js/i18n/ro.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/FancySelects/select2-4.0.6-rc.1-dist/js/i18n/ro.js
deleted file mode 100644
index 043c225..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/FancySelects/select2-4.0.6-rc.1-dist/js/i18n/ro.js
+++ /dev/null
@@ -1,3 +0,0 @@
-/*! Select2 4.0.6-rc.1 | https://github.com/select2/select2/blob/master/LICENSE.md */
-
-(function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;return e.define("select2/i18n/ro",[],function(){return{errorLoading:function(){return"Rezultatele nu au putut fi incărcate."},inputTooLong:function(e){var t=e.input.length-e.maximum,n="Vă rugăm să ștergeți"+t+" caracter";return t!==1&&(n+="e"),n},inputTooShort:function(e){var t=e.minimum-e.input.length,n="Vă rugăm să introduceți "+t+" sau mai multe caractere";return n},loadingMore:function(){return"Se încarcă mai multe rezultate…"},maximumSelected:function(e){var t="Aveți voie să selectați cel mult "+e.maximum;return t+=" element",e.maximum!==1&&(t+="e"),t},noResults:function(){return"Nu au fost găsite rezultate"},searching:function(){return"Căutare…"}}}),{define:e.define,require:e.require}})();
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/FancySelects/select2-4.0.6-rc.1-dist/js/i18n/ru.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/FancySelects/select2-4.0.6-rc.1-dist/js/i18n/ru.js
deleted file mode 100644
index 9c7d25d..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/FancySelects/select2-4.0.6-rc.1-dist/js/i18n/ru.js
+++ /dev/null
@@ -1,3 +0,0 @@
-/*! Select2 4.0.6-rc.1 | https://github.com/select2/select2/blob/master/LICENSE.md */
-
-(function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;return e.define("select2/i18n/ru",[],function(){function e(e,t,n,r){return e%10<5&&e%10>0&&e%100<5||e%100>20?e%10>1?n:t:r}return{errorLoading:function(){return"Невозможно загрузить результаты"},inputTooLong:function(t){var n=t.input.length-t.maximum,r="Пожалуйста, введите на "+n+" символ";return r+=e(n,"","a","ов"),r+=" меньше",r},inputTooShort:function(t){var n=t.minimum-t.input.length,r="Пожалуйста, введите еще хотя бы "+n+" символ";return r+=e(n,"","a","ов"),r},loadingMore:function(){return"Загрузка данных…"},maximumSelected:function(t){var n="Вы можете выбрать не более "+t.maximum+" элемент";return n+=e(t.maximum,"","a","ов"),n},noResults:function(){return"Совпадений не найдено"},searching:function(){return"Поиск…"}}}),{define:e.define,require:e.require}})();
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/FancySelects/select2-4.0.6-rc.1-dist/js/i18n/sk.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/FancySelects/select2-4.0.6-rc.1-dist/js/i18n/sk.js
deleted file mode 100644
index 0dd081f..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/FancySelects/select2-4.0.6-rc.1-dist/js/i18n/sk.js
+++ /dev/null
@@ -1,3 +0,0 @@
-/*! Select2 4.0.6-rc.1 | https://github.com/select2/select2/blob/master/LICENSE.md */
-
-(function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;return e.define("select2/i18n/sk",[],function(){var e={2:function(e){return e?"dva":"dve"},3:function(){return"tri"},4:function(){return"štyri"}};return{errorLoading:function(){return"Výsledky sa nepodarilo načítať."},inputTooLong:function(t){var n=t.input.length-t.maximum;return n==1?"Prosím, zadajte o jeden znak menej":n>=2&&n<=4?"Prosím, zadajte o "+e[n](!0)+" znaky menej":"Prosím, zadajte o "+n+" znakov menej"},inputTooShort:function(t){var n=t.minimum-t.input.length;return n==1?"Prosím, zadajte ešte jeden znak":n<=4?"Prosím, zadajte ešte ďalšie "+e[n](!0)+" znaky":"Prosím, zadajte ešte ďalších "+n+" znakov"},loadingMore:function(){return"Načítanie ďalších výsledkov…"},maximumSelected:function(t){return t.maximum==1?"Môžete zvoliť len jednu položku":t.maximum>=2&&t.maximum<=4?"Môžete zvoliť najviac "+e[t.maximum](!1)+" položky":"Môžete zvoliť najviac "+t.maximum+" položiek"},noResults:function(){return"Nenašli sa žiadne položky"},searching:function(){return"Vyhľadávanie…"}}}),{define:e.define,require:e.require}})();
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/FancySelects/select2-4.0.6-rc.1-dist/js/i18n/sl.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/FancySelects/select2-4.0.6-rc.1-dist/js/i18n/sl.js
deleted file mode 100644
index 6402de6..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/FancySelects/select2-4.0.6-rc.1-dist/js/i18n/sl.js
+++ /dev/null
@@ -1,3 +0,0 @@
-/*! Select2 4.0.6-rc.1 | https://github.com/select2/select2/blob/master/LICENSE.md */
-
-(function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;return e.define("select2/i18n/sl",[],function(){return{errorLoading:function(){return"Zadetkov iskanja ni bilo mogoče naložiti."},inputTooLong:function(e){var t=e.input.length-e.maximum,n="Prosim zbrišite "+t+" znak";return t==2?n+="a":t!=1&&(n+="e"),n},inputTooShort:function(e){var t=e.minimum-e.input.length,n="Prosim vpišite še "+t+" znak";return t==2?n+="a":t!=1&&(n+="e"),n},loadingMore:function(){return"Nalagam več zadetkov…"},maximumSelected:function(e){var t="Označite lahko največ "+e.maximum+" predmet";return e.maximum==2?t+="a":e.maximum!=1&&(t+="e"),t},noResults:function(){return"Ni zadetkov."},searching:function(){return"Iščem…"}}}),{define:e.define,require:e.require}})();
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/FancySelects/select2-4.0.6-rc.1-dist/js/i18n/sr-Cyrl.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/FancySelects/select2-4.0.6-rc.1-dist/js/i18n/sr-Cyrl.js
deleted file mode 100644
index 65f759f..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/FancySelects/select2-4.0.6-rc.1-dist/js/i18n/sr-Cyrl.js
+++ /dev/null
@@ -1,3 +0,0 @@
-/*! Select2 4.0.6-rc.1 | https://github.com/select2/select2/blob/master/LICENSE.md */
-
-(function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;return e.define("select2/i18n/sr-Cyrl",[],function(){function e(e,t,n,r){return e%10==1&&e%100!=11?t:e%10>=2&&e%10<=4&&(e%100<12||e%100>14)?n:r}return{errorLoading:function(){return"Преузимање није успело."},inputTooLong:function(t){var n=t.input.length-t.maximum,r="Обришите "+n+" симбол";return r+=e(n,"","а","а"),r},inputTooShort:function(t){var n=t.minimum-t.input.length,r="Укуцајте бар још "+n+" симбол";return r+=e(n,"","а","а"),r},loadingMore:function(){return"Преузимање још резултата…"},maximumSelected:function(t){var n="Можете изабрати само "+t.maximum+" ставк";return n+=e(t.maximum,"у","е","и"),n},noResults:function(){return"Ништа није пронађено"},searching:function(){return"Претрага…"}}}),{define:e.define,require:e.require}})();
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/FancySelects/select2-4.0.6-rc.1-dist/js/i18n/sr.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/FancySelects/select2-4.0.6-rc.1-dist/js/i18n/sr.js
deleted file mode 100644
index 19209dd..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/FancySelects/select2-4.0.6-rc.1-dist/js/i18n/sr.js
+++ /dev/null
@@ -1,3 +0,0 @@
-/*! Select2 4.0.6-rc.1 | https://github.com/select2/select2/blob/master/LICENSE.md */
-
-(function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;return e.define("select2/i18n/sr",[],function(){function e(e,t,n,r){return e%10==1&&e%100!=11?t:e%10>=2&&e%10<=4&&(e%100<12||e%100>14)?n:r}return{errorLoading:function(){return"Preuzimanje nije uspelo."},inputTooLong:function(t){var n=t.input.length-t.maximum,r="Obrišite "+n+" simbol";return r+=e(n,"","a","a"),r},inputTooShort:function(t){var n=t.minimum-t.input.length,r="Ukucajte bar još "+n+" simbol";return r+=e(n,"","a","a"),r},loadingMore:function(){return"Preuzimanje još rezultata…"},maximumSelected:function(t){var n="Možete izabrati samo "+t.maximum+" stavk";return n+=e(t.maximum,"u","e","i"),n},noResults:function(){return"Ništa nije pronađeno"},searching:function(){return"Pretraga…"}}}),{define:e.define,require:e.require}})();
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/FancySelects/select2-4.0.6-rc.1-dist/js/i18n/sv.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/FancySelects/select2-4.0.6-rc.1-dist/js/i18n/sv.js
deleted file mode 100644
index 21f97a1..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/FancySelects/select2-4.0.6-rc.1-dist/js/i18n/sv.js
+++ /dev/null
@@ -1,3 +0,0 @@
-/*! Select2 4.0.6-rc.1 | https://github.com/select2/select2/blob/master/LICENSE.md */
-
-(function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;return e.define("select2/i18n/sv",[],function(){return{errorLoading:function(){return"Resultat kunde inte laddas."},inputTooLong:function(e){var t=e.input.length-e.maximum,n="Vänligen sudda ut "+t+" tecken";return n},inputTooShort:function(e){var t=e.minimum-e.input.length,n="Vänligen skriv in "+t+" eller fler tecken";return n},loadingMore:function(){return"Laddar fler resultat…"},maximumSelected:function(e){var t="Du kan max välja "+e.maximum+" element";return t},noResults:function(){return"Inga träffar"},searching:function(){return"Söker…"}}}),{define:e.define,require:e.require}})();
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/FancySelects/select2-4.0.6-rc.1-dist/js/i18n/th.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/FancySelects/select2-4.0.6-rc.1-dist/js/i18n/th.js
deleted file mode 100644
index 2ea1654..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/FancySelects/select2-4.0.6-rc.1-dist/js/i18n/th.js
+++ /dev/null
@@ -1,3 +0,0 @@
-/*! Select2 4.0.6-rc.1 | https://github.com/select2/select2/blob/master/LICENSE.md */
-
-(function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;return e.define("select2/i18n/th",[],function(){return{errorLoading:function(){return"ไม่สามารถค้นข้อมูลได้"},inputTooLong:function(e){var t=e.input.length-e.maximum,n="โปรดลบออก "+t+" ตัวอักษร";return n},inputTooShort:function(e){var t=e.minimum-e.input.length,n="โปรดพิมพ์เพิ่มอีก "+t+" ตัวอักษร";return n},loadingMore:function(){return"กำลังค้นข้อมูลเพิ่ม…"},maximumSelected:function(e){var t="คุณสามารถเลือกได้ไม่เกิน "+e.maximum+" รายการ";return t},noResults:function(){return"ไม่พบข้อมูล"},searching:function(){return"กำลังค้นข้อมูล…"}}}),{define:e.define,require:e.require}})();
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/FancySelects/select2-4.0.6-rc.1-dist/js/i18n/tk.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/FancySelects/select2-4.0.6-rc.1-dist/js/i18n/tk.js
deleted file mode 100644
index 8f5f550..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/FancySelects/select2-4.0.6-rc.1-dist/js/i18n/tk.js
+++ /dev/null
@@ -1,3 +0,0 @@
-/*! Select2 4.0.6-rc.1 | https://github.com/select2/select2/blob/master/LICENSE.md */
-
-(function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;return e.define("select2/i18n/tk",[],function(){return{errorLoading:function(){return"Netije ýüklenmedi."},inputTooLong:function(e){var t=e.input.length-e.maximum,n=t+" harp bozuň.";return n},inputTooShort:function(e){var t=e.minimum-e.input.length,n="Ýene-de iň az "+t+" harp ýazyň.";return n},loadingMore:function(){return"Köpräk netije görkezilýär…"},maximumSelected:function(e){var t="Diňe "+e.maximum+" sanysyny saýlaň.";return t},noResults:function(){return"Netije tapylmady."},searching:function(){return"Gözlenýär…"}}}),{define:e.define,require:e.require}})();
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/FancySelects/select2-4.0.6-rc.1-dist/js/i18n/tr.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/FancySelects/select2-4.0.6-rc.1-dist/js/i18n/tr.js
deleted file mode 100644
index 797a899..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/FancySelects/select2-4.0.6-rc.1-dist/js/i18n/tr.js
+++ /dev/null
@@ -1,3 +0,0 @@
-/*! Select2 4.0.6-rc.1 | https://github.com/select2/select2/blob/master/LICENSE.md */
-
-(function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;return e.define("select2/i18n/tr",[],function(){return{errorLoading:function(){return"Sonuç yüklenemedi"},inputTooLong:function(e){var t=e.input.length-e.maximum,n=t+" karakter daha girmelisiniz";return n},inputTooShort:function(e){var t=e.minimum-e.input.length,n="En az "+t+" karakter daha girmelisiniz";return n},loadingMore:function(){return"Daha fazla…"},maximumSelected:function(e){var t="Sadece "+e.maximum+" seçim yapabilirsiniz";return t},noResults:function(){return"Sonuç bulunamadı"},searching:function(){return"Aranıyor…"}}}),{define:e.define,require:e.require}})();
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/FancySelects/select2-4.0.6-rc.1-dist/js/i18n/uk.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/FancySelects/select2-4.0.6-rc.1-dist/js/i18n/uk.js
deleted file mode 100644
index dc3989c..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/FancySelects/select2-4.0.6-rc.1-dist/js/i18n/uk.js
+++ /dev/null
@@ -1,3 +0,0 @@
-/*! Select2 4.0.6-rc.1 | https://github.com/select2/select2/blob/master/LICENSE.md */
-
-(function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;return e.define("select2/i18n/uk",[],function(){function e(e,t,n,r){return e%100>10&&e%100<15?r:e%10===1?t:e%10>1&&e%10<5?n:r}return{errorLoading:function(){return"Неможливо завантажити результати"},inputTooLong:function(t){var n=t.input.length-t.maximum;return"Будь ласка, видаліть "+n+" "+e(t.maximum,"літеру","літери","літер")},inputTooShort:function(e){var t=e.minimum-e.input.length;return"Будь ласка, введіть "+t+" або більше літер"},loadingMore:function(){return"Завантаження інших результатів…"},maximumSelected:function(t){return"Ви можете вибрати лише "+t.maximum+" "+e(t.maximum,"пункт","пункти","пунктів")},noResults:function(){return"Нічого не знайдено"},searching:function(){return"Пошук…"}}}),{define:e.define,require:e.require}})();
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/FancySelects/select2-4.0.6-rc.1-dist/js/i18n/vi.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/FancySelects/select2-4.0.6-rc.1-dist/js/i18n/vi.js
deleted file mode 100644
index 6a32cb7..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/FancySelects/select2-4.0.6-rc.1-dist/js/i18n/vi.js
+++ /dev/null
@@ -1,3 +0,0 @@
-/*! Select2 4.0.6-rc.1 | https://github.com/select2/select2/blob/master/LICENSE.md */
-
-(function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;return e.define("select2/i18n/vi",[],function(){return{inputTooLong:function(e){var t=e.input.length-e.maximum,n="Vui lòng nhập ít hơn "+t+" ký tự";return t!=1&&(n+="s"),n},inputTooShort:function(e){var t=e.minimum-e.input.length,n="Vui lòng nhập nhiều hơn "+t+" ký tự";return n},loadingMore:function(){return"Đang lấy thêm kết quả…"},maximumSelected:function(e){var t="Chỉ có thể chọn được "+e.maximum+" lựa chọn";return t},noResults:function(){return"Không tìm thấy kết quả"},searching:function(){return"Đang tìm…"}}}),{define:e.define,require:e.require}})();
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/FancySelects/select2-4.0.6-rc.1-dist/js/i18n/zh-CN.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/FancySelects/select2-4.0.6-rc.1-dist/js/i18n/zh-CN.js
deleted file mode 100644
index f349dba..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/FancySelects/select2-4.0.6-rc.1-dist/js/i18n/zh-CN.js
+++ /dev/null
@@ -1,3 +0,0 @@
-/*! Select2 4.0.6-rc.1 | https://github.com/select2/select2/blob/master/LICENSE.md */
-
-(function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;return e.define("select2/i18n/zh-CN",[],function(){return{errorLoading:function(){return"无法载入结果。"},inputTooLong:function(e){var t=e.input.length-e.maximum,n="请删除"+t+"个字符";return n},inputTooShort:function(e){var t=e.minimum-e.input.length,n="请再输入至少"+t+"个字符";return n},loadingMore:function(){return"载入更多结果…"},maximumSelected:function(e){var t="最多只能选择"+e.maximum+"个项目";return t},noResults:function(){return"未找到结果"},searching:function(){return"搜索中…"}}}),{define:e.define,require:e.require}})();
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/FancySelects/select2-4.0.6-rc.1-dist/js/i18n/zh-TW.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/FancySelects/select2-4.0.6-rc.1-dist/js/i18n/zh-TW.js
deleted file mode 100644
index 9e9f7b4..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/FancySelects/select2-4.0.6-rc.1-dist/js/i18n/zh-TW.js
+++ /dev/null
@@ -1,3 +0,0 @@
-/*! Select2 4.0.6-rc.1 | https://github.com/select2/select2/blob/master/LICENSE.md */
-
-(function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;return e.define("select2/i18n/zh-TW",[],function(){return{inputTooLong:function(e){var t=e.input.length-e.maximum,n="請刪掉"+t+"個字元";return n},inputTooShort:function(e){var t=e.minimum-e.input.length,n="請再輸入"+t+"個字元";return n},loadingMore:function(){return"載入中…"},maximumSelected:function(e){var t="你只能選擇最多"+e.maximum+"項";return t},noResults:function(){return"沒有找到相符的項目"},searching:function(){return"搜尋中…"}}}),{define:e.define,require:e.require}})();
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/FancySelects/select2-4.0.6-rc.1-dist/js/select2.full.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/FancySelects/select2-4.0.6-rc.1-dist/js/select2.full.js
deleted file mode 100644
index 0e89784..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/FancySelects/select2-4.0.6-rc.1-dist/js/select2.full.js
+++ /dev/null
@@ -1,6559 +0,0 @@
-/*!
- * Select2 4.0.6-rc.1
- * https://select2.github.io
- *
- * Released under the MIT license
- * https://github.com/select2/select2/blob/master/LICENSE.md
- */
-;(function (factory) {
-  if (typeof define === 'function' && define.amd) {
-    // AMD. Register as an anonymous module.
-    define(['jquery'], factory);
-  } else if (typeof module === 'object' && module.exports) {
-    // Node/CommonJS
-    module.exports = function (root, jQuery) {
-      if (jQuery === undefined) {
-        // require('jQuery') returns a factory that requires window to
-        // build a jQuery instance, we normalize how we use modules
-        // that require this pattern but the window provided is a noop
-        // if it's defined (how jquery works)
-        if (typeof window !== 'undefined') {
-          jQuery = require('jquery');
-        }
-        else {
-          jQuery = require('jquery')(root);
-        }
-      }
-      factory(jQuery);
-      return jQuery;
-    };
-  } else {
-    // Browser globals
-    factory(jQuery);
-  }
-} (function (jQuery) {
-  // This is needed so we can catch the AMD loader configuration and use it
-  // The inner file should be wrapped (by `banner.start.js`) in a function that
-  // returns the AMD loader references.
-  var S2 =(function () {
-  // Restore the Select2 AMD loader so it can be used
-  // Needed mostly in the language files, where the loader is not inserted
-  if (jQuery && jQuery.fn && jQuery.fn.select2 && jQuery.fn.select2.amd) {
-    var S2 = jQuery.fn.select2.amd;
-  }
-var S2;(function () { if (!S2 || !S2.requirejs) {
-if (!S2) { S2 = {}; } else { require = S2; }
-/**
- * @license almond 0.3.3 Copyright jQuery Foundation and other contributors.
- * Released under MIT license, http://github.com/requirejs/almond/LICENSE
- */
-//Going sloppy to avoid 'use strict' string cost, but strict practices should
-//be followed.
-/*global setTimeout: false */
-
-var requirejs, require, define;
-(function (undef) {
-    var main, req, makeMap, handlers,
-        defined = {},
-        waiting = {},
-        config = {},
-        defining = {},
-        hasOwn = Object.prototype.hasOwnProperty,
-        aps = [].slice,
-        jsSuffixRegExp = /\.js$/;
-
-    function hasProp(obj, prop) {
-        return hasOwn.call(obj, prop);
-    }
-
-    /**
-     * Given a relative module name, like ./something, normalize it to
-     * a real name that can be mapped to a path.
-     * @param {String} name the relative name
-     * @param {String} baseName a real name that the name arg is relative
-     * to.
-     * @returns {String} normalized name
-     */
-    function normalize(name, baseName) {
-        var nameParts, nameSegment, mapValue, foundMap, lastIndex,
-            foundI, foundStarMap, starI, i, j, part, normalizedBaseParts,
-            baseParts = baseName && baseName.split("/"),
-            map = config.map,
-            starMap = (map && map['*']) || {};
-
-        //Adjust any relative paths.
-        if (name) {
-            name = name.split('/');
-            lastIndex = name.length - 1;
-
-            // If wanting node ID compatibility, strip .js from end
-            // of IDs. Have to do this here, and not in nameToUrl
-            // because node allows either .js or non .js to map
-            // to same file.
-            if (config.nodeIdCompat && jsSuffixRegExp.test(name[lastIndex])) {
-                name[lastIndex] = name[lastIndex].replace(jsSuffixRegExp, '');
-            }
-
-            // Starts with a '.' so need the baseName
-            if (name[0].charAt(0) === '.' && baseParts) {
-                //Convert baseName to array, and lop off the last part,
-                //so that . matches that 'directory' and not name of the baseName's
-                //module. For instance, baseName of 'one/two/three', maps to
-                //'one/two/three.js', but we want the directory, 'one/two' for
-                //this normalization.
-                normalizedBaseParts = baseParts.slice(0, baseParts.length - 1);
-                name = normalizedBaseParts.concat(name);
-            }
-
-            //start trimDots
-            for (i = 0; i < name.length; i++) {
-                part = name[i];
-                if (part === '.') {
-                    name.splice(i, 1);
-                    i -= 1;
-                } else if (part === '..') {
-                    // If at the start, or previous value is still ..,
-                    // keep them so that when converted to a path it may
-                    // still work when converted to a path, even though
-                    // as an ID it is less than ideal. In larger point
-                    // releases, may be better to just kick out an error.
-                    if (i === 0 || (i === 1 && name[2] === '..') || name[i - 1] === '..') {
-                        continue;
-                    } else if (i > 0) {
-                        name.splice(i - 1, 2);
-                        i -= 2;
-                    }
-                }
-            }
-            //end trimDots
-
-            name = name.join('/');
-        }
-
-        //Apply map config if available.
-        if ((baseParts || starMap) && map) {
-            nameParts = name.split('/');
-
-            for (i = nameParts.length; i > 0; i -= 1) {
-                nameSegment = nameParts.slice(0, i).join("/");
-
-                if (baseParts) {
-                    //Find the longest baseName segment match in the config.
-                    //So, do joins on the biggest to smallest lengths of baseParts.
-                    for (j = baseParts.length; j > 0; j -= 1) {
-                        mapValue = map[baseParts.slice(0, j).join('/')];
-
-                        //baseName segment has  config, find if it has one for
-                        //this name.
-                        if (mapValue) {
-                            mapValue = mapValue[nameSegment];
-                            if (mapValue) {
-                                //Match, update name to the new value.
-                                foundMap = mapValue;
-                                foundI = i;
-                                break;
-                            }
-                        }
-                    }
-                }
-
-                if (foundMap) {
-                    break;
-                }
-
-                //Check for a star map match, but just hold on to it,
-                //if there is a shorter segment match later in a matching
-                //config, then favor over this star map.
-                if (!foundStarMap && starMap && starMap[nameSegment]) {
-                    foundStarMap = starMap[nameSegment];
-                    starI = i;
-                }
-            }
-
-            if (!foundMap && foundStarMap) {
-                foundMap = foundStarMap;
-                foundI = starI;
-            }
-
-            if (foundMap) {
-                nameParts.splice(0, foundI, foundMap);
-                name = nameParts.join('/');
-            }
-        }
-
-        return name;
-    }
-
-    function makeRequire(relName, forceSync) {
-        return function () {
-            //A version of a require function that passes a moduleName
-            //value for items that may need to
-            //look up paths relative to the moduleName
-            var args = aps.call(arguments, 0);
-
-            //If first arg is not require('string'), and there is only
-            //one arg, it is the array form without a callback. Insert
-            //a null so that the following concat is correct.
-            if (typeof args[0] !== 'string' && args.length === 1) {
-                args.push(null);
-            }
-            return req.apply(undef, args.concat([relName, forceSync]));
-        };
-    }
-
-    function makeNormalize(relName) {
-        return function (name) {
-            return normalize(name, relName);
-        };
-    }
-
-    function makeLoad(depName) {
-        return function (value) {
-            defined[depName] = value;
-        };
-    }
-
-    function callDep(name) {
-        if (hasProp(waiting, name)) {
-            var args = waiting[name];
-            delete waiting[name];
-            defining[name] = true;
-            main.apply(undef, args);
-        }
-
-        if (!hasProp(defined, name) && !hasProp(defining, name)) {
-            throw new Error('No ' + name);
-        }
-        return defined[name];
-    }
-
-    //Turns a plugin!resource to [plugin, resource]
-    //with the plugin being undefined if the name
-    //did not have a plugin prefix.
-    function splitPrefix(name) {
-        var prefix,
-            index = name ? name.indexOf('!') : -1;
-        if (index > -1) {
-            prefix = name.substring(0, index);
-            name = name.substring(index + 1, name.length);
-        }
-        return [prefix, name];
-    }
-
-    //Creates a parts array for a relName where first part is plugin ID,
-    //second part is resource ID. Assumes relName has already been normalized.
-    function makeRelParts(relName) {
-        return relName ? splitPrefix(relName) : [];
-    }
-
-    /**
-     * Makes a name map, normalizing the name, and using a plugin
-     * for normalization if necessary. Grabs a ref to plugin
-     * too, as an optimization.
-     */
-    makeMap = function (name, relParts) {
-        var plugin,
-            parts = splitPrefix(name),
-            prefix = parts[0],
-            relResourceName = relParts[1];
-
-        name = parts[1];
-
-        if (prefix) {
-            prefix = normalize(prefix, relResourceName);
-            plugin = callDep(prefix);
-        }
-
-        //Normalize according
-        if (prefix) {
-            if (plugin && plugin.normalize) {
-                name = plugin.normalize(name, makeNormalize(relResourceName));
-            } else {
-                name = normalize(name, relResourceName);
-            }
-        } else {
-            name = normalize(name, relResourceName);
-            parts = splitPrefix(name);
-            prefix = parts[0];
-            name = parts[1];
-            if (prefix) {
-                plugin = callDep(prefix);
-            }
-        }
-
-        //Using ridiculous property names for space reasons
-        return {
-            f: prefix ? prefix + '!' + name : name, //fullName
-            n: name,
-            pr: prefix,
-            p: plugin
-        };
-    };
-
-    function makeConfig(name) {
-        return function () {
-            return (config && config.config && config.config[name]) || {};
-        };
-    }
-
-    handlers = {
-        require: function (name) {
-            return makeRequire(name);
-        },
-        exports: function (name) {
-            var e = defined[name];
-            if (typeof e !== 'undefined') {
-                return e;
-            } else {
-                return (defined[name] = {});
-            }
-        },
-        module: function (name) {
-            return {
-                id: name,
-                uri: '',
-                exports: defined[name],
-                config: makeConfig(name)
-            };
-        }
-    };
-
-    main = function (name, deps, callback, relName) {
-        var cjsModule, depName, ret, map, i, relParts,
-            args = [],
-            callbackType = typeof callback,
-            usingExports;
-
-        //Use name if no relName
-        relName = relName || name;
-        relParts = makeRelParts(relName);
-
-        //Call the callback to define the module, if necessary.
-        if (callbackType === 'undefined' || callbackType === 'function') {
-            //Pull out the defined dependencies and pass the ordered
-            //values to the callback.
-            //Default to [require, exports, module] if no deps
-            deps = !deps.length && callback.length ? ['require', 'exports', 'module'] : deps;
-            for (i = 0; i < deps.length; i += 1) {
-                map = makeMap(deps[i], relParts);
-                depName = map.f;
-
-                //Fast path CommonJS standard dependencies.
-                if (depName === "require") {
-                    args[i] = handlers.require(name);
-                } else if (depName === "exports") {
-                    //CommonJS module spec 1.1
-                    args[i] = handlers.exports(name);
-                    usingExports = true;
-                } else if (depName === "module") {
-                    //CommonJS module spec 1.1
-                    cjsModule = args[i] = handlers.module(name);
-                } else if (hasProp(defined, depName) ||
-                           hasProp(waiting, depName) ||
-                           hasProp(defining, depName)) {
-                    args[i] = callDep(depName);
-                } else if (map.p) {
-                    map.p.load(map.n, makeRequire(relName, true), makeLoad(depName), {});
-                    args[i] = defined[depName];
-                } else {
-                    throw new Error(name + ' missing ' + depName);
-                }
-            }
-
-            ret = callback ? callback.apply(defined[name], args) : undefined;
-
-            if (name) {
-                //If setting exports via "module" is in play,
-                //favor that over return value and exports. After that,
-                //favor a non-undefined return value over exports use.
-                if (cjsModule && cjsModule.exports !== undef &&
-                        cjsModule.exports !== defined[name]) {
-                    defined[name] = cjsModule.exports;
-                } else if (ret !== undef || !usingExports) {
-                    //Use the return value from the function.
-                    defined[name] = ret;
-                }
-            }
-        } else if (name) {
-            //May just be an object definition for the module. Only
-            //worry about defining if have a module name.
-            defined[name] = callback;
-        }
-    };
-
-    requirejs = require = req = function (deps, callback, relName, forceSync, alt) {
-        if (typeof deps === "string") {
-            if (handlers[deps]) {
-                //callback in this case is really relName
-                return handlers[deps](callback);
-            }
-            //Just return the module wanted. In this scenario, the
-            //deps arg is the module name, and second arg (if passed)
-            //is just the relName.
-            //Normalize module name, if it contains . or ..
-            return callDep(makeMap(deps, makeRelParts(callback)).f);
-        } else if (!deps.splice) {
-            //deps is a config object, not an array.
-            config = deps;
-            if (config.deps) {
-                req(config.deps, config.callback);
-            }
-            if (!callback) {
-                return;
-            }
-
-            if (callback.splice) {
-                //callback is an array, which means it is a dependency list.
-                //Adjust args if there are dependencies
-                deps = callback;
-                callback = relName;
-                relName = null;
-            } else {
-                deps = undef;
-            }
-        }
-
-        //Support require(['a'])
-        callback = callback || function () {};
-
-        //If relName is a function, it is an errback handler,
-        //so remove it.
-        if (typeof relName === 'function') {
-            relName = forceSync;
-            forceSync = alt;
-        }
-
-        //Simulate async callback;
-        if (forceSync) {
-            main(undef, deps, callback, relName);
-        } else {
-            //Using a non-zero value because of concern for what old browsers
-            //do, and latest browsers "upgrade" to 4 if lower value is used:
-            //http://www.whatwg.org/specs/web-apps/current-work/multipage/timers.html#dom-windowtimers-settimeout:
-            //If want a value immediately, use require('id') instead -- something
-            //that works in almond on the global level, but not guaranteed and
-            //unlikely to work in other AMD implementations.
-            setTimeout(function () {
-                main(undef, deps, callback, relName);
-            }, 4);
-        }
-
-        return req;
-    };
-
-    /**
-     * Just drops the config on the floor, but returns req in case
-     * the config return value is used.
-     */
-    req.config = function (cfg) {
-        return req(cfg);
-    };
-
-    /**
-     * Expose module registry for debugging and tooling
-     */
-    requirejs._defined = defined;
-
-    define = function (name, deps, callback) {
-        if (typeof name !== 'string') {
-            throw new Error('See almond README: incorrect module build, no module name');
-        }
-
-        //This module may not have dependencies
-        if (!deps.splice) {
-            //deps is not an array, so probably means
-            //an object literal or factory function for
-            //the value. Adjust args.
-            callback = deps;
-            deps = [];
-        }
-
-        if (!hasProp(defined, name) && !hasProp(waiting, name)) {
-            waiting[name] = [name, deps, callback];
-        }
-    };
-
-    define.amd = {
-        jQuery: true
-    };
-}());
-
-S2.requirejs = requirejs;S2.require = require;S2.define = define;
-}
-}());
-S2.define("almond", function(){});
-
-/* global jQuery:false, $:false */
-S2.define('jquery',[],function () {
-  var _$ = jQuery || $;
-
-  if (_$ == null && console && console.error) {
-    console.error(
-      'Select2: An instance of jQuery or a jQuery-compatible library was not ' +
-      'found. Make sure that you are including jQuery before Select2 on your ' +
-      'web page.'
-    );
-  }
-
-  return _$;
-});
-
-S2.define('select2/utils',[
-  'jquery'
-], function ($) {
-  var Utils = {};
-
-  Utils.Extend = function (ChildClass, SuperClass) {
-    var __hasProp = {}.hasOwnProperty;
-
-    function BaseConstructor () {
-      this.constructor = ChildClass;
-    }
-
-    for (var key in SuperClass) {
-      if (__hasProp.call(SuperClass, key)) {
-        ChildClass[key] = SuperClass[key];
-      }
-    }
-
-    BaseConstructor.prototype = SuperClass.prototype;
-    ChildClass.prototype = new BaseConstructor();
-    ChildClass.__super__ = SuperClass.prototype;
-
-    return ChildClass;
-  };
-
-  function getMethods (theClass) {
-    var proto = theClass.prototype;
-
-    var methods = [];
-
-    for (var methodName in proto) {
-      var m = proto[methodName];
-
-      if (typeof m !== 'function') {
-        continue;
-      }
-
-      if (methodName === 'constructor') {
-        continue;
-      }
-
-      methods.push(methodName);
-    }
-
-    return methods;
-  }
-
-  Utils.Decorate = function (SuperClass, DecoratorClass) {
-    var decoratedMethods = getMethods(DecoratorClass);
-    var superMethods = getMethods(SuperClass);
-
-    function DecoratedClass () {
-      var unshift = Array.prototype.unshift;
-
-      var argCount = DecoratorClass.prototype.constructor.length;
-
-      var calledConstructor = SuperClass.prototype.constructor;
-
-      if (argCount > 0) {
-        unshift.call(arguments, SuperClass.prototype.constructor);
-
-        calledConstructor = DecoratorClass.prototype.constructor;
-      }
-
-      calledConstructor.apply(this, arguments);
-    }
-
-    DecoratorClass.displayName = SuperClass.displayName;
-
-    function ctr () {
-      this.constructor = DecoratedClass;
-    }
-
-    DecoratedClass.prototype = new ctr();
-
-    for (var m = 0; m < superMethods.length; m++) {
-      var superMethod = superMethods[m];
-
-      DecoratedClass.prototype[superMethod] =
-        SuperClass.prototype[superMethod];
-    }
-
-    var calledMethod = function (methodName) {
-      // Stub out the original method if it's not decorating an actual method
-      var originalMethod = function () {};
-
-      if (methodName in DecoratedClass.prototype) {
-        originalMethod = DecoratedClass.prototype[methodName];
-      }
-
-      var decoratedMethod = DecoratorClass.prototype[methodName];
-
-      return function () {
-        var unshift = Array.prototype.unshift;
-
-        unshift.call(arguments, originalMethod);
-
-        return decoratedMethod.apply(this, arguments);
-      };
-    };
-
-    for (var d = 0; d < decoratedMethods.length; d++) {
-      var decoratedMethod = decoratedMethods[d];
-
-      DecoratedClass.prototype[decoratedMethod] = calledMethod(decoratedMethod);
-    }
-
-    return DecoratedClass;
-  };
-
-  var Observable = function () {
-    this.listeners = {};
-  };
-
-  Observable.prototype.on = function (event, callback) {
-    this.listeners = this.listeners || {};
-
-    if (event in this.listeners) {
-      this.listeners[event].push(callback);
-    } else {
-      this.listeners[event] = [callback];
-    }
-  };
-
-  Observable.prototype.trigger = function (event) {
-    var slice = Array.prototype.slice;
-    var params = slice.call(arguments, 1);
-
-    this.listeners = this.listeners || {};
-
-    // Params should always come in as an array
-    if (params == null) {
-      params = [];
-    }
-
-    // If there are no arguments to the event, use a temporary object
-    if (params.length === 0) {
-      params.push({});
-    }
-
-    // Set the `_type` of the first object to the event
-    params[0]._type = event;
-
-    if (event in this.listeners) {
-      this.invoke(this.listeners[event], slice.call(arguments, 1));
-    }
-
-    if ('*' in this.listeners) {
-      this.invoke(this.listeners['*'], arguments);
-    }
-  };
-
-  Observable.prototype.invoke = function (listeners, params) {
-    for (var i = 0, len = listeners.length; i < len; i++) {
-      listeners[i].apply(this, params);
-    }
-  };
-
-  Utils.Observable = Observable;
-
-  Utils.generateChars = function (length) {
-    var chars = '';
-
-    for (var i = 0; i < length; i++) {
-      var randomChar = Math.floor(Math.random() * 36);
-      chars += randomChar.toString(36);
-    }
-
-    return chars;
-  };
-
-  Utils.bind = function (func, context) {
-    return function () {
-      func.apply(context, arguments);
-    };
-  };
-
-  Utils._convertData = function (data) {
-    for (var originalKey in data) {
-      var keys = originalKey.split('-');
-
-      var dataLevel = data;
-
-      if (keys.length === 1) {
-        continue;
-      }
-
-      for (var k = 0; k < keys.length; k++) {
-        var key = keys[k];
-
-        // Lowercase the first letter
-        // By default, dash-separated becomes camelCase
-        key = key.substring(0, 1).toLowerCase() + key.substring(1);
-
-        if (!(key in dataLevel)) {
-          dataLevel[key] = {};
-        }
-
-        if (k == keys.length - 1) {
-          dataLevel[key] = data[originalKey];
-        }
-
-        dataLevel = dataLevel[key];
-      }
-
-      delete data[originalKey];
-    }
-
-    return data;
-  };
-
-  Utils.hasScroll = function (index, el) {
-    // Adapted from the function created by @ShadowScripter
-    // and adapted by @BillBarry on the Stack Exchange Code Review website.
-    // The original code can be found at
-    // http://codereview.stackexchange.com/q/13338
-    // and was designed to be used with the Sizzle selector engine.
-
-    var $el = $(el);
-    var overflowX = el.style.overflowX;
-    var overflowY = el.style.overflowY;
-
-    //Check both x and y declarations
-    if (overflowX === overflowY &&
-        (overflowY === 'hidden' || overflowY === 'visible')) {
-      return false;
-    }
-
-    if (overflowX === 'scroll' || overflowY === 'scroll') {
-      return true;
-    }
-
-    return ($el.innerHeight() < el.scrollHeight ||
-      $el.innerWidth() < el.scrollWidth);
-  };
-
-  Utils.escapeMarkup = function (markup) {
-    var replaceMap = {
-      '\\': '&#92;',
-      '&': '&amp;',
-      '<': '&lt;',
-      '>': '&gt;',
-      '"': '&quot;',
-      '\'': '&#39;',
-      '/': '&#47;'
-    };
-
-    // Do not try to escape the markup if it's not a string
-    if (typeof markup !== 'string') {
-      return markup;
-    }
-
-    return String(markup).replace(/[&<>"'\/\\]/g, function (match) {
-      return replaceMap[match];
-    });
-  };
-
-  // Append an array of jQuery nodes to a given element.
-  Utils.appendMany = function ($element, $nodes) {
-    // jQuery 1.7.x does not support $.fn.append() with an array
-    // Fall back to a jQuery object collection using $.fn.add()
-    if ($.fn.jquery.substr(0, 3) === '1.7') {
-      var $jqNodes = $();
-
-      $.map($nodes, function (node) {
-        $jqNodes = $jqNodes.add(node);
-      });
-
-      $nodes = $jqNodes;
-    }
-
-    $element.append($nodes);
-  };
-
-  // Cache objects in Utils.__cache instead of $.data (see #4346)
-  Utils.__cache = {};
-
-  var id = 0;
-  Utils.GetUniqueElementId = function (element) {
-    // Get a unique element Id. If element has no id, 
-    // creates a new unique number, stores it in the id 
-    // attribute and returns the new id. 
-    // If an id already exists, it simply returns it.
-
-    var select2Id = element.getAttribute('data-select2-id');
-    if (select2Id == null) {
-      // If element has id, use it.
-      if (element.id) {
-        select2Id = element.id;
-        element.setAttribute('data-select2-id', select2Id);
-      } else {
-        element.setAttribute('data-select2-id', ++id);
-        select2Id = id.toString();
-      }
-    }
-    return select2Id;
-  };
-
-  Utils.StoreData = function (element, name, value) {
-    // Stores an item in the cache for a specified element.
-    // name is the cache key.    
-    var id = Utils.GetUniqueElementId(element);
-    if (!Utils.__cache[id]) {
-      Utils.__cache[id] = {};
-    }
-
-    Utils.__cache[id][name] = value;
-  };
-
-  Utils.GetData = function (element, name) {
-    // Retrieves a value from the cache by its key (name)
-    // name is optional. If no name specified, return 
-    // all cache items for the specified element.
-    // and for a specified element.
-    var id = Utils.GetUniqueElementId(element);
-    if (name) {
-      if (Utils.__cache[id]) {
-        return Utils.__cache[id][name] != null ? 
-	      Utils.__cache[id][name]:
-	      $(element).data(name); // Fallback to HTML5 data attribs.
-      }
-      return $(element).data(name); // Fallback to HTML5 data attribs.
-    } else {
-      return Utils.__cache[id];			   
-    }
-  };
-
-  Utils.RemoveData = function (element) {
-    // Removes all cached items for a specified element.
-    var id = Utils.GetUniqueElementId(element);
-    if (Utils.__cache[id] != null) {
-      delete Utils.__cache[id];
-    }
-  };
-
-  return Utils;
-});
-
-S2.define('select2/results',[
-  'jquery',
-  './utils'
-], function ($, Utils) {
-  function Results ($element, options, dataAdapter) {
-    this.$element = $element;
-    this.data = dataAdapter;
-    this.options = options;
-
-    Results.__super__.constructor.call(this);
-  }
-
-  Utils.Extend(Results, Utils.Observable);
-
-  Results.prototype.render = function () {
-    var $results = $(
-      '<ul class="select2-results__options" role="tree"></ul>'
-    );
-
-    if (this.options.get('multiple')) {
-      $results.attr('aria-multiselectable', 'true');
-    }
-
-    this.$results = $results;
-
-    return $results;
-  };
-
-  Results.prototype.clear = function () {
-    this.$results.empty();
-  };
-
-  Results.prototype.displayMessage = function (params) {
-    var escapeMarkup = this.options.get('escapeMarkup');
-
-    this.clear();
-    this.hideLoading();
-
-    var $message = $(
-      '<li role="treeitem" aria-live="assertive"' +
-      ' class="select2-results__option"></li>'
-    );
-
-    var message = this.options.get('translations').get(params.message);
-
-    $message.append(
-      escapeMarkup(
-        message(params.args)
-      )
-    );
-
-    $message[0].className += ' select2-results__message';
-
-    this.$results.append($message);
-  };
-
-  Results.prototype.hideMessages = function () {
-    this.$results.find('.select2-results__message').remove();
-  };
-
-  Results.prototype.append = function (data) {
-    this.hideLoading();
-
-    var $options = [];
-
-    if (data.results == null || data.results.length === 0) {
-      if (this.$results.children().length === 0) {
-        this.trigger('results:message', {
-          message: 'noResults'
-        });
-      }
-
-      return;
-    }
-
-    data.results = this.sort(data.results);
-
-    for (var d = 0; d < data.results.length; d++) {
-      var item = data.results[d];
-
-      var $option = this.option(item);
-
-      $options.push($option);
-    }
-
-    this.$results.append($options);
-  };
-
-  Results.prototype.position = function ($results, $dropdown) {
-    var $resultsContainer = $dropdown.find('.select2-results');
-    $resultsContainer.append($results);
-  };
-
-  Results.prototype.sort = function (data) {
-    var sorter = this.options.get('sorter');
-
-    return sorter(data);
-  };
-
-  Results.prototype.highlightFirstItem = function () {
-    var $options = this.$results
-      .find('.select2-results__option[aria-selected]');
-
-    var $selected = $options.filter('[aria-selected=true]');
-
-    // Check if there are any selected options
-    if ($selected.length > 0) {
-      // If there are selected options, highlight the first
-      $selected.first().trigger('mouseenter');
-    } else {
-      // If there are no selected options, highlight the first option
-      // in the dropdown
-      $options.first().trigger('mouseenter');
-    }
-
-    this.ensureHighlightVisible();
-  };
-
-  Results.prototype.setClasses = function () {
-    var self = this;
-
-    this.data.current(function (selected) {
-      var selectedIds = $.map(selected, function (s) {
-        return s.id.toString();
-      });
-
-      var $options = self.$results
-        .find('.select2-results__option[aria-selected]');
-
-      $options.each(function () {
-        var $option = $(this);
-
-        var item = Utils.GetData(this, 'data');
-
-        // id needs to be converted to a string when comparing
-        var id = '' + item.id;
-
-        if ((item.element != null && item.element.selected) ||
-            (item.element == null && $.inArray(id, selectedIds) > -1)) {
-          $option.attr('aria-selected', 'true');
-        } else {
-          $option.attr('aria-selected', 'false');
-        }
-      });
-
-    });
-  };
-
-  Results.prototype.showLoading = function (params) {
-    this.hideLoading();
-
-    var loadingMore = this.options.get('translations').get('searching');
-
-    var loading = {
-      disabled: true,
-      loading: true,
-      text: loadingMore(params)
-    };
-    var $loading = this.option(loading);
-    $loading.className += ' loading-results';
-
-    this.$results.prepend($loading);
-  };
-
-  Results.prototype.hideLoading = function () {
-    this.$results.find('.loading-results').remove();
-  };
-
-  Results.prototype.option = function (data) {
-    var option = document.createElement('li');
-    option.className = 'select2-results__option';
-
-    var attrs = {
-      'role': 'treeitem',
-      'aria-selected': 'false'
-    };
-
-    if (data.disabled) {
-      delete attrs['aria-selected'];
-      attrs['aria-disabled'] = 'true';
-    }
-
-    if (data.id == null) {
-      delete attrs['aria-selected'];
-    }
-
-    if (data._resultId != null) {
-      option.id = data._resultId;
-    }
-
-    if (data.title) {
-      option.title = data.title;
-    }
-
-    if (data.children) {
-      attrs.role = 'group';
-      attrs['aria-label'] = data.text;
-      delete attrs['aria-selected'];
-    }
-
-    for (var attr in attrs) {
-      var val = attrs[attr];
-
-      option.setAttribute(attr, val);
-    }
-
-    if (data.children) {
-      var $option = $(option);
-
-      var label = document.createElement('strong');
-      label.className = 'select2-results__group';
-
-      var $label = $(label);
-      this.template(data, label);
-
-      var $children = [];
-
-      for (var c = 0; c < data.children.length; c++) {
-        var child = data.children[c];
-
-        var $child = this.option(child);
-
-        $children.push($child);
-      }
-
-      var $childrenContainer = $('<ul></ul>', {
-        'class': 'select2-results__options select2-results__options--nested'
-      });
-
-      $childrenContainer.append($children);
-
-      $option.append(label);
-      $option.append($childrenContainer);
-    } else {
-      this.template(data, option);
-    }
-
-    Utils.StoreData(option, 'data', data);
-
-    return option;
-  };
-
-  Results.prototype.bind = function (container, $container) {
-    var self = this;
-
-    var id = container.id + '-results';
-
-    this.$results.attr('id', id);
-
-    container.on('results:all', function (params) {
-      self.clear();
-      self.append(params.data);
-
-      if (container.isOpen()) {
-        self.setClasses();
-        self.highlightFirstItem();
-      }
-    });
-
-    container.on('results:append', function (params) {
-      self.append(params.data);
-
-      if (container.isOpen()) {
-        self.setClasses();
-      }
-    });
-
-    container.on('query', function (params) {
-      self.hideMessages();
-      self.showLoading(params);
-    });
-
-    container.on('select', function () {
-      if (!container.isOpen()) {
-        return;
-      }
-
-      self.setClasses();
-      self.highlightFirstItem();
-    });
-
-    container.on('unselect', function () {
-      if (!container.isOpen()) {
-        return;
-      }
-
-      self.setClasses();
-      self.highlightFirstItem();
-    });
-
-    container.on('open', function () {
-      // When the dropdown is open, aria-expended="true"
-      self.$results.attr('aria-expanded', 'true');
-      self.$results.attr('aria-hidden', 'false');
-
-      self.setClasses();
-      self.ensureHighlightVisible();
-    });
-
-    container.on('close', function () {
-      // When the dropdown is closed, aria-expended="false"
-      self.$results.attr('aria-expanded', 'false');
-      self.$results.attr('aria-hidden', 'true');
-      self.$results.removeAttr('aria-activedescendant');
-    });
-
-    container.on('results:toggle', function () {
-      var $highlighted = self.getHighlightedResults();
-
-      if ($highlighted.length === 0) {
-        return;
-      }
-
-      $highlighted.trigger('mouseup');
-    });
-
-    container.on('results:select', function () {
-      var $highlighted = self.getHighlightedResults();
-
-      if ($highlighted.length === 0) {
-        return;
-      }
-
-      var data = Utils.GetData($highlighted[0], 'data');
-
-      if ($highlighted.attr('aria-selected') == 'true') {
-        self.trigger('close', {});
-      } else {
-        self.trigger('select', {
-          data: data
-        });
-      }
-    });
-
-    container.on('results:previous', function () {
-      var $highlighted = self.getHighlightedResults();
-
-      var $options = self.$results.find('[aria-selected]');
-
-      var currentIndex = $options.index($highlighted);
-
-      // If we are already at te top, don't move further
-      // If no options, currentIndex will be -1
-      if (currentIndex <= 0) {
-        return;
-      }
-
-      var nextIndex = currentIndex - 1;
-
-      // If none are highlighted, highlight the first
-      if ($highlighted.length === 0) {
-        nextIndex = 0;
-      }
-
-      var $next = $options.eq(nextIndex);
-
-      $next.trigger('mouseenter');
-
-      var currentOffset = self.$results.offset().top;
-      var nextTop = $next.offset().top;
-      var nextOffset = self.$results.scrollTop() + (nextTop - currentOffset);
-
-      if (nextIndex === 0) {
-        self.$results.scrollTop(0);
-      } else if (nextTop - currentOffset < 0) {
-        self.$results.scrollTop(nextOffset);
-      }
-    });
-
-    container.on('results:next', function () {
-      var $highlighted = self.getHighlightedResults();
-
-      var $options = self.$results.find('[aria-selected]');
-
-      var currentIndex = $options.index($highlighted);
-
-      var nextIndex = currentIndex + 1;
-
-      // If we are at the last option, stay there
-      if (nextIndex >= $options.length) {
-        return;
-      }
-
-      var $next = $options.eq(nextIndex);
-
-      $next.trigger('mouseenter');
-
-      var currentOffset = self.$results.offset().top +
-        self.$results.outerHeight(false);
-      var nextBottom = $next.offset().top + $next.outerHeight(false);
-      var nextOffset = self.$results.scrollTop() + nextBottom - currentOffset;
-
-      if (nextIndex === 0) {
-        self.$results.scrollTop(0);
-      } else if (nextBottom > currentOffset) {
-        self.$results.scrollTop(nextOffset);
-      }
-    });
-
-    container.on('results:focus', function (params) {
-      params.element.addClass('select2-results__option--highlighted');
-    });
-
-    container.on('results:message', function (params) {
-      self.displayMessage(params);
-    });
-
-    if ($.fn.mousewheel) {
-      this.$results.on('mousewheel', function (e) {
-        var top = self.$results.scrollTop();
-
-        var bottom = self.$results.get(0).scrollHeight - top + e.deltaY;
-
-        var isAtTop = e.deltaY > 0 && top - e.deltaY <= 0;
-        var isAtBottom = e.deltaY < 0 && bottom <= self.$results.height();
-
-        if (isAtTop) {
-          self.$results.scrollTop(0);
-
-          e.preventDefault();
-          e.stopPropagation();
-        } else if (isAtBottom) {
-          self.$results.scrollTop(
-            self.$results.get(0).scrollHeight - self.$results.height()
-          );
-
-          e.preventDefault();
-          e.stopPropagation();
-        }
-      });
-    }
-
-    this.$results.on('mouseup', '.select2-results__option[aria-selected]',
-      function (evt) {
-      var $this = $(this);
-
-      var data = Utils.GetData(this, 'data');
-
-      if ($this.attr('aria-selected') === 'true') {
-        if (self.options.get('multiple')) {
-          self.trigger('unselect', {
-            originalEvent: evt,
-            data: data
-          });
-        } else {
-          self.trigger('close', {});
-        }
-
-        return;
-      }
-
-      self.trigger('select', {
-        originalEvent: evt,
-        data: data
-      });
-    });
-
-    this.$results.on('mouseenter', '.select2-results__option[aria-selected]',
-      function (evt) {
-      var data = Utils.GetData(this, 'data');
-
-      self.getHighlightedResults()
-          .removeClass('select2-results__option--highlighted');
-
-      self.trigger('results:focus', {
-        data: data,
-        element: $(this)
-      });
-    });
-  };
-
-  Results.prototype.getHighlightedResults = function () {
-    var $highlighted = this.$results
-    .find('.select2-results__option--highlighted');
-
-    return $highlighted;
-  };
-
-  Results.prototype.destroy = function () {
-    this.$results.remove();
-  };
-
-  Results.prototype.ensureHighlightVisible = function () {
-    var $highlighted = this.getHighlightedResults();
-
-    if ($highlighted.length === 0) {
-      return;
-    }
-
-    var $options = this.$results.find('[aria-selected]');
-
-    var currentIndex = $options.index($highlighted);
-
-    var currentOffset = this.$results.offset().top;
-    var nextTop = $highlighted.offset().top;
-    var nextOffset = this.$results.scrollTop() + (nextTop - currentOffset);
-
-    var offsetDelta = nextTop - currentOffset;
-    nextOffset -= $highlighted.outerHeight(false) * 2;
-
-    if (currentIndex <= 2) {
-      this.$results.scrollTop(0);
-    } else if (offsetDelta > this.$results.outerHeight() || offsetDelta < 0) {
-      this.$results.scrollTop(nextOffset);
-    }
-  };
-
-  Results.prototype.template = function (result, container) {
-    var template = this.options.get('templateResult');
-    var escapeMarkup = this.options.get('escapeMarkup');
-
-    var content = template(result, container);
-
-    if (content == null) {
-      container.style.display = 'none';
-    } else if (typeof content === 'string') {
-      container.innerHTML = escapeMarkup(content);
-    } else {
-      $(container).append(content);
-    }
-  };
-
-  return Results;
-});
-
-S2.define('select2/keys',[
-
-], function () {
-  var KEYS = {
-    BACKSPACE: 8,
-    TAB: 9,
-    ENTER: 13,
-    SHIFT: 16,
-    CTRL: 17,
-    ALT: 18,
-    ESC: 27,
-    SPACE: 32,
-    PAGE_UP: 33,
-    PAGE_DOWN: 34,
-    END: 35,
-    HOME: 36,
-    LEFT: 37,
-    UP: 38,
-    RIGHT: 39,
-    DOWN: 40,
-    DELETE: 46
-  };
-
-  return KEYS;
-});
-
-S2.define('select2/selection/base',[
-  'jquery',
-  '../utils',
-  '../keys'
-], function ($, Utils, KEYS) {
-  function BaseSelection ($element, options) {
-    this.$element = $element;
-    this.options = options;
-
-    BaseSelection.__super__.constructor.call(this);
-  }
-
-  Utils.Extend(BaseSelection, Utils.Observable);
-
-  BaseSelection.prototype.render = function () {
-    var $selection = $(
-      '<span class="select2-selection" role="combobox" ' +
-      ' aria-haspopup="true" aria-expanded="false">' +
-      '</span>'
-    );
-
-    this._tabindex = 0;
-
-    if (Utils.GetData(this.$element[0], 'old-tabindex') != null) {
-      this._tabindex = Utils.GetData(this.$element[0], 'old-tabindex');
-    } else if (this.$element.attr('tabindex') != null) {
-      this._tabindex = this.$element.attr('tabindex');
-    }
-
-    $selection.attr('title', this.$element.attr('title'));
-    $selection.attr('tabindex', this._tabindex);
-
-    this.$selection = $selection;
-
-    return $selection;
-  };
-
-  BaseSelection.prototype.bind = function (container, $container) {
-    var self = this;
-
-    var id = container.id + '-container';
-    var resultsId = container.id + '-results';
-
-    this.container = container;
-
-    this.$selection.on('focus', function (evt) {
-      self.trigger('focus', evt);
-    });
-
-    this.$selection.on('blur', function (evt) {
-      self._handleBlur(evt);
-    });
-
-    this.$selection.on('keydown', function (evt) {
-      self.trigger('keypress', evt);
-
-      if (evt.which === KEYS.SPACE) {
-        evt.preventDefault();
-      }
-    });
-
-    container.on('results:focus', function (params) {
-      self.$selection.attr('aria-activedescendant', params.data._resultId);
-    });
-
-    container.on('selection:update', function (params) {
-      self.update(params.data);
-    });
-
-    container.on('open', function () {
-      // When the dropdown is open, aria-expanded="true"
-      self.$selection.attr('aria-expanded', 'true');
-      self.$selection.attr('aria-owns', resultsId);
-
-      self._attachCloseHandler(container);
-    });
-
-    container.on('close', function () {
-      // When the dropdown is closed, aria-expanded="false"
-      self.$selection.attr('aria-expanded', 'false');
-      self.$selection.removeAttr('aria-activedescendant');
-      self.$selection.removeAttr('aria-owns');
-
-      self.$selection.focus();
-      window.setTimeout(function () {
-        self.$selection.focus();
-      }, 0);
-
-      self._detachCloseHandler(container);
-    });
-
-    container.on('enable', function () {
-      self.$selection.attr('tabindex', self._tabindex);
-    });
-
-    container.on('disable', function () {
-      self.$selection.attr('tabindex', '-1');
-    });
-  };
-
-  BaseSelection.prototype._handleBlur = function (evt) {
-    var self = this;
-
-    // This needs to be delayed as the active element is the body when the tab
-    // key is pressed, possibly along with others.
-    window.setTimeout(function () {
-      // Don't trigger `blur` if the focus is still in the selection
-      if (
-        (document.activeElement == self.$selection[0]) ||
-        ($.contains(self.$selection[0], document.activeElement))
-      ) {
-        return;
-      }
-
-      self.trigger('blur', evt);
-    }, 1);
-  };
-
-  BaseSelection.prototype._attachCloseHandler = function (container) {
-    var self = this;
-
-    $(document.body).on('mousedown.select2.' + container.id, function (e) {
-      var $target = $(e.target);
-
-      var $select = $target.closest('.select2');
-
-      var $all = $('.select2.select2-container--open');
-
-      $all.each(function () {
-        var $this = $(this);
-
-        if (this == $select[0]) {
-          return;
-        }
-
-        var $element = Utils.GetData(this, 'element');
-
-        $element.select2('close');
-      });
-    });
-  };
-
-  BaseSelection.prototype._detachCloseHandler = function (container) {
-    $(document.body).off('mousedown.select2.' + container.id);
-  };
-
-  BaseSelection.prototype.position = function ($selection, $container) {
-    var $selectionContainer = $container.find('.selection');
-    $selectionContainer.append($selection);
-  };
-
-  BaseSelection.prototype.destroy = function () {
-    this._detachCloseHandler(this.container);
-  };
-
-  BaseSelection.prototype.update = function (data) {
-    throw new Error('The `update` method must be defined in child classes.');
-  };
-
-  return BaseSelection;
-});
-
-S2.define('select2/selection/single',[
-  'jquery',
-  './base',
-  '../utils',
-  '../keys'
-], function ($, BaseSelection, Utils, KEYS) {
-  function SingleSelection () {
-    SingleSelection.__super__.constructor.apply(this, arguments);
-  }
-
-  Utils.Extend(SingleSelection, BaseSelection);
-
-  SingleSelection.prototype.render = function () {
-    var $selection = SingleSelection.__super__.render.call(this);
-
-    $selection.addClass('select2-selection--single');
-
-    $selection.html(
-      '<span class="select2-selection__rendered"></span>' +
-      '<span class="select2-selection__arrow" role="presentation">' +
-        '<b role="presentation"></b>' +
-      '</span>'
-    );
-
-    return $selection;
-  };
-
-  SingleSelection.prototype.bind = function (container, $container) {
-    var self = this;
-
-    SingleSelection.__super__.bind.apply(this, arguments);
-
-    var id = container.id + '-container';
-
-    this.$selection.find('.select2-selection__rendered')
-      .attr('id', id)
-      .attr('role', 'textbox')
-      .attr('aria-readonly', 'true');
-    this.$selection.attr('aria-labelledby', id);
-
-    this.$selection.on('mousedown', function (evt) {
-      // Only respond to left clicks
-      if (evt.which !== 1) {
-        return;
-      }
-
-      self.trigger('toggle', {
-        originalEvent: evt
-      });
-    });
-
-    this.$selection.on('focus', function (evt) {
-      // User focuses on the container
-    });
-
-    this.$selection.on('blur', function (evt) {
-      // User exits the container
-    });
-
-    container.on('focus', function (evt) {
-      if (!container.isOpen()) {
-        self.$selection.focus();
-      }
-    });
-  };
-
-  SingleSelection.prototype.clear = function () {
-    var $rendered = this.$selection.find('.select2-selection__rendered');
-    $rendered.empty();
-    $rendered.removeAttr('title'); // clear tooltip on empty
-  };
-
-  SingleSelection.prototype.display = function (data, container) {
-    var template = this.options.get('templateSelection');
-    var escapeMarkup = this.options.get('escapeMarkup');
-
-    return escapeMarkup(template(data, container));
-  };
-
-  SingleSelection.prototype.selectionContainer = function () {
-    return $('<span></span>');
-  };
-
-  SingleSelection.prototype.update = function (data) {
-    if (data.length === 0) {
-      this.clear();
-      return;
-    }
-
-    var selection = data[0];
-
-    var $rendered = this.$selection.find('.select2-selection__rendered');
-    var formatted = this.display(selection, $rendered);
-
-    $rendered.empty().append(formatted);
-    $rendered.attr('title', selection.title || selection.text);
-  };
-
-  return SingleSelection;
-});
-
-S2.define('select2/selection/multiple',[
-  'jquery',
-  './base',
-  '../utils'
-], function ($, BaseSelection, Utils) {
-  function MultipleSelection ($element, options) {
-    MultipleSelection.__super__.constructor.apply(this, arguments);
-  }
-
-  Utils.Extend(MultipleSelection, BaseSelection);
-
-  MultipleSelection.prototype.render = function () {
-    var $selection = MultipleSelection.__super__.render.call(this);
-
-    $selection.addClass('select2-selection--multiple');
-
-    $selection.html(
-      '<ul class="select2-selection__rendered"></ul>'
-    );
-
-    return $selection;
-  };
-
-  MultipleSelection.prototype.bind = function (container, $container) {
-    var self = this;
-
-    MultipleSelection.__super__.bind.apply(this, arguments);
-
-    this.$selection.on('click', function (evt) {
-      self.trigger('toggle', {
-        originalEvent: evt
-      });
-    });
-
-    this.$selection.on(
-      'click',
-      '.select2-selection__choice__remove',
-      function (evt) {
-        // Ignore the event if it is disabled
-        if (self.options.get('disabled')) {
-          return;
-        }
-
-        var $remove = $(this);
-        var $selection = $remove.parent();
-
-        var data = Utils.GetData($selection[0], 'data');
-
-        self.trigger('unselect', {
-          originalEvent: evt,
-          data: data
-        });
-      }
-    );
-  };
-
-  MultipleSelection.prototype.clear = function () {
-    var $rendered = this.$selection.find('.select2-selection__rendered');
-    $rendered.empty();
-    $rendered.removeAttr('title');
-  };
-
-  MultipleSelection.prototype.display = function (data, container) {
-    var template = this.options.get('templateSelection');
-    var escapeMarkup = this.options.get('escapeMarkup');
-
-    return escapeMarkup(template(data, container));
-  };
-
-  MultipleSelection.prototype.selectionContainer = function () {
-    var $container = $(
-      '<li class="select2-selection__choice">' +
-        '<span class="select2-selection__choice__remove" role="presentation">' +
-          '&times;' +
-        '</span>' +
-      '</li>'
-    );
-
-    return $container;
-  };
-
-  MultipleSelection.prototype.update = function (data) {
-    this.clear();
-
-    if (data.length === 0) {
-      return;
-    }
-
-    var $selections = [];
-
-    for (var d = 0; d < data.length; d++) {
-      var selection = data[d];
-
-      var $selection = this.selectionContainer();
-      var formatted = this.display(selection, $selection);
-
-      $selection.append(formatted);
-      $selection.attr('title', selection.title || selection.text);
-
-      Utils.StoreData($selection[0], 'data', selection);
-
-      $selections.push($selection);
-    }
-
-    var $rendered = this.$selection.find('.select2-selection__rendered');
-
-    Utils.appendMany($rendered, $selections);
-  };
-
-  return MultipleSelection;
-});
-
-S2.define('select2/selection/placeholder',[
-  '../utils'
-], function (Utils) {
-  function Placeholder (decorated, $element, options) {
-    this.placeholder = this.normalizePlaceholder(options.get('placeholder'));
-
-    decorated.call(this, $element, options);
-  }
-
-  Placeholder.prototype.normalizePlaceholder = function (_, placeholder) {
-    if (typeof placeholder === 'string') {
-      placeholder = {
-        id: '',
-        text: placeholder
-      };
-    }
-
-    return placeholder;
-  };
-
-  Placeholder.prototype.createPlaceholder = function (decorated, placeholder) {
-    var $placeholder = this.selectionContainer();
-
-    $placeholder.html(this.display(placeholder));
-    $placeholder.addClass('select2-selection__placeholder')
-                .removeClass('select2-selection__choice');
-
-    return $placeholder;
-  };
-
-  Placeholder.prototype.update = function (decorated, data) {
-    var singlePlaceholder = (
-      data.length == 1 && data[0].id != this.placeholder.id
-    );
-    var multipleSelections = data.length > 1;
-
-    if (multipleSelections || singlePlaceholder) {
-      return decorated.call(this, data);
-    }
-
-    this.clear();
-
-    var $placeholder = this.createPlaceholder(this.placeholder);
-
-    this.$selection.find('.select2-selection__rendered').append($placeholder);
-  };
-
-  return Placeholder;
-});
-
-S2.define('select2/selection/allowClear',[
-  'jquery',
-  '../keys',
-  '../utils'
-], function ($, KEYS, Utils) {
-  function AllowClear () { }
-
-  AllowClear.prototype.bind = function (decorated, container, $container) {
-    var self = this;
-
-    decorated.call(this, container, $container);
-
-    if (this.placeholder == null) {
-      if (this.options.get('debug') && window.console && console.error) {
-        console.error(
-          'Select2: The `allowClear` option should be used in combination ' +
-          'with the `placeholder` option.'
-        );
-      }
-    }
-
-    this.$selection.on('mousedown', '.select2-selection__clear',
-      function (evt) {
-        self._handleClear(evt);
-    });
-
-    container.on('keypress', function (evt) {
-      self._handleKeyboardClear(evt, container);
-    });
-  };
-
-  AllowClear.prototype._handleClear = function (_, evt) {
-    // Ignore the event if it is disabled
-    if (this.options.get('disabled')) {
-      return;
-    }
-
-    var $clear = this.$selection.find('.select2-selection__clear');
-
-    // Ignore the event if nothing has been selected
-    if ($clear.length === 0) {
-      return;
-    }
-
-    evt.stopPropagation();
-
-    var data = Utils.GetData($clear[0], 'data');
-
-    var previousVal = this.$element.val();
-    this.$element.val(this.placeholder.id);
-
-    var unselectData = {
-      data: data
-    };
-    this.trigger('clear', unselectData);
-    if (unselectData.prevented) {
-      this.$element.val(previousVal);
-      return;
-    }
-
-    for (var d = 0; d < data.length; d++) {
-      unselectData = {
-        data: data[d]
-      };
-
-      // Trigger the `unselect` event, so people can prevent it from being
-      // cleared.
-      this.trigger('unselect', unselectData);
-
-      // If the event was prevented, don't clear it out.
-      if (unselectData.prevented) {
-        this.$element.val(previousVal);
-        return;
-      }
-    }
-
-    this.$element.trigger('change');
-
-    this.trigger('toggle', {});
-  };
-
-  AllowClear.prototype._handleKeyboardClear = function (_, evt, container) {
-    if (container.isOpen()) {
-      return;
-    }
-
-    if (evt.which == KEYS.DELETE || evt.which == KEYS.BACKSPACE) {
-      this._handleClear(evt);
-    }
-  };
-
-  AllowClear.prototype.update = function (decorated, data) {
-    decorated.call(this, data);
-
-    if (this.$selection.find('.select2-selection__placeholder').length > 0 ||
-        data.length === 0) {
-      return;
-    }
-
-    var $remove = $(
-      '<span class="select2-selection__clear">' +
-        '&times;' +
-      '</span>'
-    );
-    Utils.StoreData($remove[0], 'data', data);
-
-    this.$selection.find('.select2-selection__rendered').prepend($remove);
-  };
-
-  return AllowClear;
-});
-
-S2.define('select2/selection/search',[
-  'jquery',
-  '../utils',
-  '../keys'
-], function ($, Utils, KEYS) {
-  function Search (decorated, $element, options) {
-    decorated.call(this, $element, options);
-  }
-
-  Search.prototype.render = function (decorated) {
-    var $search = $(
-      '<li class="select2-search select2-search--inline">' +
-        '<input class="select2-search__field" type="search" tabindex="-1"' +
-        ' autocomplete="off" autocorrect="off" autocapitalize="none"' +
-        ' spellcheck="false" role="textbox" aria-autocomplete="list" />' +
-      '</li>'
-    );
-
-    this.$searchContainer = $search;
-    this.$search = $search.find('input');
-
-    var $rendered = decorated.call(this);
-
-    this._transferTabIndex();
-
-    return $rendered;
-  };
-
-  Search.prototype.bind = function (decorated, container, $container) {
-    var self = this;
-
-    decorated.call(this, container, $container);
-
-    container.on('open', function () {
-      self.$search.trigger('focus');
-    });
-
-    container.on('close', function () {
-      self.$search.val('');
-      self.$search.removeAttr('aria-activedescendant');
-      self.$search.trigger('focus');
-    });
-
-    container.on('enable', function () {
-      self.$search.prop('disabled', false);
-
-      self._transferTabIndex();
-    });
-
-    container.on('disable', function () {
-      self.$search.prop('disabled', true);
-    });
-
-    container.on('focus', function (evt) {
-      self.$search.trigger('focus');
-    });
-
-    container.on('results:focus', function (params) {
-      self.$search.attr('aria-activedescendant', params.id);
-    });
-
-    this.$selection.on('focusin', '.select2-search--inline', function (evt) {
-      self.trigger('focus', evt);
-    });
-
-    this.$selection.on('focusout', '.select2-search--inline', function (evt) {
-      self._handleBlur(evt);
-    });
-
-    this.$selection.on('keydown', '.select2-search--inline', function (evt) {
-      evt.stopPropagation();
-
-      self.trigger('keypress', evt);
-
-      self._keyUpPrevented = evt.isDefaultPrevented();
-
-      var key = evt.which;
-
-      if (key === KEYS.BACKSPACE && self.$search.val() === '') {
-        var $previousChoice = self.$searchContainer
-          .prev('.select2-selection__choice');
-
-        if ($previousChoice.length > 0) {
-          var item = Utils.GetData($previousChoice[0], 'data');
-
-          self.searchRemoveChoice(item);
-
-          evt.preventDefault();
-        }
-      }
-    });
-
-    // Try to detect the IE version should the `documentMode` property that
-    // is stored on the document. This is only implemented in IE and is
-    // slightly cleaner than doing a user agent check.
-    // This property is not available in Edge, but Edge also doesn't have
-    // this bug.
-    var msie = document.documentMode;
-    var disableInputEvents = msie && msie <= 11;
-
-    // Workaround for browsers which do not support the `input` event
-    // This will prevent double-triggering of events for browsers which support
-    // both the `keyup` and `input` events.
-    this.$selection.on(
-      'input.searchcheck',
-      '.select2-search--inline',
-      function (evt) {
-        // IE will trigger the `input` event when a placeholder is used on a
-        // search box. To get around this issue, we are forced to ignore all
-        // `input` events in IE and keep using `keyup`.
-        if (disableInputEvents) {
-          self.$selection.off('input.search input.searchcheck');
-          return;
-        }
-
-        // Unbind the duplicated `keyup` event
-        self.$selection.off('keyup.search');
-      }
-    );
-
-    this.$selection.on(
-      'keyup.search input.search',
-      '.select2-search--inline',
-      function (evt) {
-        // IE will trigger the `input` event when a placeholder is used on a
-        // search box. To get around this issue, we are forced to ignore all
-        // `input` events in IE and keep using `keyup`.
-        if (disableInputEvents && evt.type === 'input') {
-          self.$selection.off('input.search input.searchcheck');
-          return;
-        }
-
-        var key = evt.which;
-
-        // We can freely ignore events from modifier keys
-        if (key == KEYS.SHIFT || key == KEYS.CTRL || key == KEYS.ALT) {
-          return;
-        }
-
-        // Tabbing will be handled during the `keydown` phase
-        if (key == KEYS.TAB) {
-          return;
-        }
-
-        self.handleSearch(evt);
-      }
-    );
-  };
-
-  /**
-   * This method will transfer the tabindex attribute from the rendered
-   * selection to the search box. This allows for the search box to be used as
-   * the primary focus instead of the selection container.
-   *
-   * @private
-   */
-  Search.prototype._transferTabIndex = function (decorated) {
-    this.$search.attr('tabindex', this.$selection.attr('tabindex'));
-    this.$selection.attr('tabindex', '-1');
-  };
-
-  Search.prototype.createPlaceholder = function (decorated, placeholder) {
-    this.$search.attr('placeholder', placeholder.text);
-  };
-
-  Search.prototype.update = function (decorated, data) {
-    var searchHadFocus = this.$search[0] == document.activeElement;
-
-    this.$search.attr('placeholder', '');
-
-    decorated.call(this, data);
-
-    this.$selection.find('.select2-selection__rendered')
-                   .append(this.$searchContainer);
-
-    this.resizeSearch();
-    if (searchHadFocus) {
-      var isTagInput = this.$element.find('[data-select2-tag]').length;
-      if (isTagInput) {
-        // fix IE11 bug where tag input lost focus
-        this.$element.focus();
-      } else {
-        this.$search.focus();
-      }
-    }
-  };
-
-  Search.prototype.handleSearch = function () {
-    this.resizeSearch();
-
-    if (!this._keyUpPrevented) {
-      var input = this.$search.val();
-
-      this.trigger('query', {
-        term: input
-      });
-    }
-
-    this._keyUpPrevented = false;
-  };
-
-  Search.prototype.searchRemoveChoice = function (decorated, item) {
-    this.trigger('unselect', {
-      data: item
-    });
-
-    this.$search.val(item.text);
-    this.handleSearch();
-  };
-
-  Search.prototype.resizeSearch = function () {
-    this.$search.css('width', '25px');
-
-    var width = '';
-
-    if (this.$search.attr('placeholder') !== '') {
-      width = this.$selection.find('.select2-selection__rendered').innerWidth();
-    } else {
-      var minimumWidth = this.$search.val().length + 1;
-
-      width = (minimumWidth * 0.75) + 'em';
-    }
-
-    this.$search.css('width', width);
-  };
-
-  return Search;
-});
-
-S2.define('select2/selection/eventRelay',[
-  'jquery'
-], function ($) {
-  function EventRelay () { }
-
-  EventRelay.prototype.bind = function (decorated, container, $container) {
-    var self = this;
-    var relayEvents = [
-      'open', 'opening',
-      'close', 'closing',
-      'select', 'selecting',
-      'unselect', 'unselecting',
-      'clear', 'clearing'
-    ];
-
-    var preventableEvents = [
-      'opening', 'closing', 'selecting', 'unselecting', 'clearing'
-    ];
-
-    decorated.call(this, container, $container);
-
-    container.on('*', function (name, params) {
-      // Ignore events that should not be relayed
-      if ($.inArray(name, relayEvents) === -1) {
-        return;
-      }
-
-      // The parameters should always be an object
-      params = params || {};
-
-      // Generate the jQuery event for the Select2 event
-      var evt = $.Event('select2:' + name, {
-        params: params
-      });
-
-      self.$element.trigger(evt);
-
-      // Only handle preventable events if it was one
-      if ($.inArray(name, preventableEvents) === -1) {
-        return;
-      }
-
-      params.prevented = evt.isDefaultPrevented();
-    });
-  };
-
-  return EventRelay;
-});
-
-S2.define('select2/translation',[
-  'jquery',
-  'require'
-], function ($, require) {
-  function Translation (dict) {
-    this.dict = dict || {};
-  }
-
-  Translation.prototype.all = function () {
-    return this.dict;
-  };
-
-  Translation.prototype.get = function (key) {
-    return this.dict[key];
-  };
-
-  Translation.prototype.extend = function (translation) {
-    this.dict = $.extend({}, translation.all(), this.dict);
-  };
-
-  // Static functions
-
-  Translation._cache = {};
-
-  Translation.loadPath = function (path) {
-    if (!(path in Translation._cache)) {
-      var translations = require(path);
-
-      Translation._cache[path] = translations;
-    }
-
-    return new Translation(Translation._cache[path]);
-  };
-
-  return Translation;
-});
-
-S2.define('select2/diacritics',[
-
-], function () {
-  var diacritics = {
-    '\u24B6': 'A',
-    '\uFF21': 'A',
-    '\u00C0': 'A',
-    '\u00C1': 'A',
-    '\u00C2': 'A',
-    '\u1EA6': 'A',
-    '\u1EA4': 'A',
-    '\u1EAA': 'A',
-    '\u1EA8': 'A',
-    '\u00C3': 'A',
-    '\u0100': 'A',
-    '\u0102': 'A',
-    '\u1EB0': 'A',
-    '\u1EAE': 'A',
-    '\u1EB4': 'A',
-    '\u1EB2': 'A',
-    '\u0226': 'A',
-    '\u01E0': 'A',
-    '\u00C4': 'A',
-    '\u01DE': 'A',
-    '\u1EA2': 'A',
-    '\u00C5': 'A',
-    '\u01FA': 'A',
-    '\u01CD': 'A',
-    '\u0200': 'A',
-    '\u0202': 'A',
-    '\u1EA0': 'A',
-    '\u1EAC': 'A',
-    '\u1EB6': 'A',
-    '\u1E00': 'A',
-    '\u0104': 'A',
-    '\u023A': 'A',
-    '\u2C6F': 'A',
-    '\uA732': 'AA',
-    '\u00C6': 'AE',
-    '\u01FC': 'AE',
-    '\u01E2': 'AE',
-    '\uA734': 'AO',
-    '\uA736': 'AU',
-    '\uA738': 'AV',
-    '\uA73A': 'AV',
-    '\uA73C': 'AY',
-    '\u24B7': 'B',
-    '\uFF22': 'B',
-    '\u1E02': 'B',
-    '\u1E04': 'B',
-    '\u1E06': 'B',
-    '\u0243': 'B',
-    '\u0182': 'B',
-    '\u0181': 'B',
-    '\u24B8': 'C',
-    '\uFF23': 'C',
-    '\u0106': 'C',
-    '\u0108': 'C',
-    '\u010A': 'C',
-    '\u010C': 'C',
-    '\u00C7': 'C',
-    '\u1E08': 'C',
-    '\u0187': 'C',
-    '\u023B': 'C',
-    '\uA73E': 'C',
-    '\u24B9': 'D',
-    '\uFF24': 'D',
-    '\u1E0A': 'D',
-    '\u010E': 'D',
-    '\u1E0C': 'D',
-    '\u1E10': 'D',
-    '\u1E12': 'D',
-    '\u1E0E': 'D',
-    '\u0110': 'D',
-    '\u018B': 'D',
-    '\u018A': 'D',
-    '\u0189': 'D',
-    '\uA779': 'D',
-    '\u01F1': 'DZ',
-    '\u01C4': 'DZ',
-    '\u01F2': 'Dz',
-    '\u01C5': 'Dz',
-    '\u24BA': 'E',
-    '\uFF25': 'E',
-    '\u00C8': 'E',
-    '\u00C9': 'E',
-    '\u00CA': 'E',
-    '\u1EC0': 'E',
-    '\u1EBE': 'E',
-    '\u1EC4': 'E',
-    '\u1EC2': 'E',
-    '\u1EBC': 'E',
-    '\u0112': 'E',
-    '\u1E14': 'E',
-    '\u1E16': 'E',
-    '\u0114': 'E',
-    '\u0116': 'E',
-    '\u00CB': 'E',
-    '\u1EBA': 'E',
-    '\u011A': 'E',
-    '\u0204': 'E',
-    '\u0206': 'E',
-    '\u1EB8': 'E',
-    '\u1EC6': 'E',
-    '\u0228': 'E',
-    '\u1E1C': 'E',
-    '\u0118': 'E',
-    '\u1E18': 'E',
-    '\u1E1A': 'E',
-    '\u0190': 'E',
-    '\u018E': 'E',
-    '\u24BB': 'F',
-    '\uFF26': 'F',
-    '\u1E1E': 'F',
-    '\u0191': 'F',
-    '\uA77B': 'F',
-    '\u24BC': 'G',
-    '\uFF27': 'G',
-    '\u01F4': 'G',
-    '\u011C': 'G',
-    '\u1E20': 'G',
-    '\u011E': 'G',
-    '\u0120': 'G',
-    '\u01E6': 'G',
-    '\u0122': 'G',
-    '\u01E4': 'G',
-    '\u0193': 'G',
-    '\uA7A0': 'G',
-    '\uA77D': 'G',
-    '\uA77E': 'G',
-    '\u24BD': 'H',
-    '\uFF28': 'H',
-    '\u0124': 'H',
-    '\u1E22': 'H',
-    '\u1E26': 'H',
-    '\u021E': 'H',
-    '\u1E24': 'H',
-    '\u1E28': 'H',
-    '\u1E2A': 'H',
-    '\u0126': 'H',
-    '\u2C67': 'H',
-    '\u2C75': 'H',
-    '\uA78D': 'H',
-    '\u24BE': 'I',
-    '\uFF29': 'I',
-    '\u00CC': 'I',
-    '\u00CD': 'I',
-    '\u00CE': 'I',
-    '\u0128': 'I',
-    '\u012A': 'I',
-    '\u012C': 'I',
-    '\u0130': 'I',
-    '\u00CF': 'I',
-    '\u1E2E': 'I',
-    '\u1EC8': 'I',
-    '\u01CF': 'I',
-    '\u0208': 'I',
-    '\u020A': 'I',
-    '\u1ECA': 'I',
-    '\u012E': 'I',
-    '\u1E2C': 'I',
-    '\u0197': 'I',
-    '\u24BF': 'J',
-    '\uFF2A': 'J',
-    '\u0134': 'J',
-    '\u0248': 'J',
-    '\u24C0': 'K',
-    '\uFF2B': 'K',
-    '\u1E30': 'K',
-    '\u01E8': 'K',
-    '\u1E32': 'K',
-    '\u0136': 'K',
-    '\u1E34': 'K',
-    '\u0198': 'K',
-    '\u2C69': 'K',
-    '\uA740': 'K',
-    '\uA742': 'K',
-    '\uA744': 'K',
-    '\uA7A2': 'K',
-    '\u24C1': 'L',
-    '\uFF2C': 'L',
-    '\u013F': 'L',
-    '\u0139': 'L',
-    '\u013D': 'L',
-    '\u1E36': 'L',
-    '\u1E38': 'L',
-    '\u013B': 'L',
-    '\u1E3C': 'L',
-    '\u1E3A': 'L',
-    '\u0141': 'L',
-    '\u023D': 'L',
-    '\u2C62': 'L',
-    '\u2C60': 'L',
-    '\uA748': 'L',
-    '\uA746': 'L',
-    '\uA780': 'L',
-    '\u01C7': 'LJ',
-    '\u01C8': 'Lj',
-    '\u24C2': 'M',
-    '\uFF2D': 'M',
-    '\u1E3E': 'M',
-    '\u1E40': 'M',
-    '\u1E42': 'M',
-    '\u2C6E': 'M',
-    '\u019C': 'M',
-    '\u24C3': 'N',
-    '\uFF2E': 'N',
-    '\u01F8': 'N',
-    '\u0143': 'N',
-    '\u00D1': 'N',
-    '\u1E44': 'N',
-    '\u0147': 'N',
-    '\u1E46': 'N',
-    '\u0145': 'N',
-    '\u1E4A': 'N',
-    '\u1E48': 'N',
-    '\u0220': 'N',
-    '\u019D': 'N',
-    '\uA790': 'N',
-    '\uA7A4': 'N',
-    '\u01CA': 'NJ',
-    '\u01CB': 'Nj',
-    '\u24C4': 'O',
-    '\uFF2F': 'O',
-    '\u00D2': 'O',
-    '\u00D3': 'O',
-    '\u00D4': 'O',
-    '\u1ED2': 'O',
-    '\u1ED0': 'O',
-    '\u1ED6': 'O',
-    '\u1ED4': 'O',
-    '\u00D5': 'O',
-    '\u1E4C': 'O',
-    '\u022C': 'O',
-    '\u1E4E': 'O',
-    '\u014C': 'O',
-    '\u1E50': 'O',
-    '\u1E52': 'O',
-    '\u014E': 'O',
-    '\u022E': 'O',
-    '\u0230': 'O',
-    '\u00D6': 'O',
-    '\u022A': 'O',
-    '\u1ECE': 'O',
-    '\u0150': 'O',
-    '\u01D1': 'O',
-    '\u020C': 'O',
-    '\u020E': 'O',
-    '\u01A0': 'O',
-    '\u1EDC': 'O',
-    '\u1EDA': 'O',
-    '\u1EE0': 'O',
-    '\u1EDE': 'O',
-    '\u1EE2': 'O',
-    '\u1ECC': 'O',
-    '\u1ED8': 'O',
-    '\u01EA': 'O',
-    '\u01EC': 'O',
-    '\u00D8': 'O',
-    '\u01FE': 'O',
-    '\u0186': 'O',
-    '\u019F': 'O',
-    '\uA74A': 'O',
-    '\uA74C': 'O',
-    '\u01A2': 'OI',
-    '\uA74E': 'OO',
-    '\u0222': 'OU',
-    '\u24C5': 'P',
-    '\uFF30': 'P',
-    '\u1E54': 'P',
-    '\u1E56': 'P',
-    '\u01A4': 'P',
-    '\u2C63': 'P',
-    '\uA750': 'P',
-    '\uA752': 'P',
-    '\uA754': 'P',
-    '\u24C6': 'Q',
-    '\uFF31': 'Q',
-    '\uA756': 'Q',
-    '\uA758': 'Q',
-    '\u024A': 'Q',
-    '\u24C7': 'R',
-    '\uFF32': 'R',
-    '\u0154': 'R',
-    '\u1E58': 'R',
-    '\u0158': 'R',
-    '\u0210': 'R',
-    '\u0212': 'R',
-    '\u1E5A': 'R',
-    '\u1E5C': 'R',
-    '\u0156': 'R',
-    '\u1E5E': 'R',
-    '\u024C': 'R',
-    '\u2C64': 'R',
-    '\uA75A': 'R',
-    '\uA7A6': 'R',
-    '\uA782': 'R',
-    '\u24C8': 'S',
-    '\uFF33': 'S',
-    '\u1E9E': 'S',
-    '\u015A': 'S',
-    '\u1E64': 'S',
-    '\u015C': 'S',
-    '\u1E60': 'S',
-    '\u0160': 'S',
-    '\u1E66': 'S',
-    '\u1E62': 'S',
-    '\u1E68': 'S',
-    '\u0218': 'S',
-    '\u015E': 'S',
-    '\u2C7E': 'S',
-    '\uA7A8': 'S',
-    '\uA784': 'S',
-    '\u24C9': 'T',
-    '\uFF34': 'T',
-    '\u1E6A': 'T',
-    '\u0164': 'T',
-    '\u1E6C': 'T',
-    '\u021A': 'T',
-    '\u0162': 'T',
-    '\u1E70': 'T',
-    '\u1E6E': 'T',
-    '\u0166': 'T',
-    '\u01AC': 'T',
-    '\u01AE': 'T',
-    '\u023E': 'T',
-    '\uA786': 'T',
-    '\uA728': 'TZ',
-    '\u24CA': 'U',
-    '\uFF35': 'U',
-    '\u00D9': 'U',
-    '\u00DA': 'U',
-    '\u00DB': 'U',
-    '\u0168': 'U',
-    '\u1E78': 'U',
-    '\u016A': 'U',
-    '\u1E7A': 'U',
-    '\u016C': 'U',
-    '\u00DC': 'U',
-    '\u01DB': 'U',
-    '\u01D7': 'U',
-    '\u01D5': 'U',
-    '\u01D9': 'U',
-    '\u1EE6': 'U',
-    '\u016E': 'U',
-    '\u0170': 'U',
-    '\u01D3': 'U',
-    '\u0214': 'U',
-    '\u0216': 'U',
-    '\u01AF': 'U',
-    '\u1EEA': 'U',
-    '\u1EE8': 'U',
-    '\u1EEE': 'U',
-    '\u1EEC': 'U',
-    '\u1EF0': 'U',
-    '\u1EE4': 'U',
-    '\u1E72': 'U',
-    '\u0172': 'U',
-    '\u1E76': 'U',
-    '\u1E74': 'U',
-    '\u0244': 'U',
-    '\u24CB': 'V',
-    '\uFF36': 'V',
-    '\u1E7C': 'V',
-    '\u1E7E': 'V',
-    '\u01B2': 'V',
-    '\uA75E': 'V',
-    '\u0245': 'V',
-    '\uA760': 'VY',
-    '\u24CC': 'W',
-    '\uFF37': 'W',
-    '\u1E80': 'W',
-    '\u1E82': 'W',
-    '\u0174': 'W',
-    '\u1E86': 'W',
-    '\u1E84': 'W',
-    '\u1E88': 'W',
-    '\u2C72': 'W',
-    '\u24CD': 'X',
-    '\uFF38': 'X',
-    '\u1E8A': 'X',
-    '\u1E8C': 'X',
-    '\u24CE': 'Y',
-    '\uFF39': 'Y',
-    '\u1EF2': 'Y',
-    '\u00DD': 'Y',
-    '\u0176': 'Y',
-    '\u1EF8': 'Y',
-    '\u0232': 'Y',
-    '\u1E8E': 'Y',
-    '\u0178': 'Y',
-    '\u1EF6': 'Y',
-    '\u1EF4': 'Y',
-    '\u01B3': 'Y',
-    '\u024E': 'Y',
-    '\u1EFE': 'Y',
-    '\u24CF': 'Z',
-    '\uFF3A': 'Z',
-    '\u0179': 'Z',
-    '\u1E90': 'Z',
-    '\u017B': 'Z',
-    '\u017D': 'Z',
-    '\u1E92': 'Z',
-    '\u1E94': 'Z',
-    '\u01B5': 'Z',
-    '\u0224': 'Z',
-    '\u2C7F': 'Z',
-    '\u2C6B': 'Z',
-    '\uA762': 'Z',
-    '\u24D0': 'a',
-    '\uFF41': 'a',
-    '\u1E9A': 'a',
-    '\u00E0': 'a',
-    '\u00E1': 'a',
-    '\u00E2': 'a',
-    '\u1EA7': 'a',
-    '\u1EA5': 'a',
-    '\u1EAB': 'a',
-    '\u1EA9': 'a',
-    '\u00E3': 'a',
-    '\u0101': 'a',
-    '\u0103': 'a',
-    '\u1EB1': 'a',
-    '\u1EAF': 'a',
-    '\u1EB5': 'a',
-    '\u1EB3': 'a',
-    '\u0227': 'a',
-    '\u01E1': 'a',
-    '\u00E4': 'a',
-    '\u01DF': 'a',
-    '\u1EA3': 'a',
-    '\u00E5': 'a',
-    '\u01FB': 'a',
-    '\u01CE': 'a',
-    '\u0201': 'a',
-    '\u0203': 'a',
-    '\u1EA1': 'a',
-    '\u1EAD': 'a',
-    '\u1EB7': 'a',
-    '\u1E01': 'a',
-    '\u0105': 'a',
-    '\u2C65': 'a',
-    '\u0250': 'a',
-    '\uA733': 'aa',
-    '\u00E6': 'ae',
-    '\u01FD': 'ae',
-    '\u01E3': 'ae',
-    '\uA735': 'ao',
-    '\uA737': 'au',
-    '\uA739': 'av',
-    '\uA73B': 'av',
-    '\uA73D': 'ay',
-    '\u24D1': 'b',
-    '\uFF42': 'b',
-    '\u1E03': 'b',
-    '\u1E05': 'b',
-    '\u1E07': 'b',
-    '\u0180': 'b',
-    '\u0183': 'b',
-    '\u0253': 'b',
-    '\u24D2': 'c',
-    '\uFF43': 'c',
-    '\u0107': 'c',
-    '\u0109': 'c',
-    '\u010B': 'c',
-    '\u010D': 'c',
-    '\u00E7': 'c',
-    '\u1E09': 'c',
-    '\u0188': 'c',
-    '\u023C': 'c',
-    '\uA73F': 'c',
-    '\u2184': 'c',
-    '\u24D3': 'd',
-    '\uFF44': 'd',
-    '\u1E0B': 'd',
-    '\u010F': 'd',
-    '\u1E0D': 'd',
-    '\u1E11': 'd',
-    '\u1E13': 'd',
-    '\u1E0F': 'd',
-    '\u0111': 'd',
-    '\u018C': 'd',
-    '\u0256': 'd',
-    '\u0257': 'd',
-    '\uA77A': 'd',
-    '\u01F3': 'dz',
-    '\u01C6': 'dz',
-    '\u24D4': 'e',
-    '\uFF45': 'e',
-    '\u00E8': 'e',
-    '\u00E9': 'e',
-    '\u00EA': 'e',
-    '\u1EC1': 'e',
-    '\u1EBF': 'e',
-    '\u1EC5': 'e',
-    '\u1EC3': 'e',
-    '\u1EBD': 'e',
-    '\u0113': 'e',
-    '\u1E15': 'e',
-    '\u1E17': 'e',
-    '\u0115': 'e',
-    '\u0117': 'e',
-    '\u00EB': 'e',
-    '\u1EBB': 'e',
-    '\u011B': 'e',
-    '\u0205': 'e',
-    '\u0207': 'e',
-    '\u1EB9': 'e',
-    '\u1EC7': 'e',
-    '\u0229': 'e',
-    '\u1E1D': 'e',
-    '\u0119': 'e',
-    '\u1E19': 'e',
-    '\u1E1B': 'e',
-    '\u0247': 'e',
-    '\u025B': 'e',
-    '\u01DD': 'e',
-    '\u24D5': 'f',
-    '\uFF46': 'f',
-    '\u1E1F': 'f',
-    '\u0192': 'f',
-    '\uA77C': 'f',
-    '\u24D6': 'g',
-    '\uFF47': 'g',
-    '\u01F5': 'g',
-    '\u011D': 'g',
-    '\u1E21': 'g',
-    '\u011F': 'g',
-    '\u0121': 'g',
-    '\u01E7': 'g',
-    '\u0123': 'g',
-    '\u01E5': 'g',
-    '\u0260': 'g',
-    '\uA7A1': 'g',
-    '\u1D79': 'g',
-    '\uA77F': 'g',
-    '\u24D7': 'h',
-    '\uFF48': 'h',
-    '\u0125': 'h',
-    '\u1E23': 'h',
-    '\u1E27': 'h',
-    '\u021F': 'h',
-    '\u1E25': 'h',
-    '\u1E29': 'h',
-    '\u1E2B': 'h',
-    '\u1E96': 'h',
-    '\u0127': 'h',
-    '\u2C68': 'h',
-    '\u2C76': 'h',
-    '\u0265': 'h',
-    '\u0195': 'hv',
-    '\u24D8': 'i',
-    '\uFF49': 'i',
-    '\u00EC': 'i',
-    '\u00ED': 'i',
-    '\u00EE': 'i',
-    '\u0129': 'i',
-    '\u012B': 'i',
-    '\u012D': 'i',
-    '\u00EF': 'i',
-    '\u1E2F': 'i',
-    '\u1EC9': 'i',
-    '\u01D0': 'i',
-    '\u0209': 'i',
-    '\u020B': 'i',
-    '\u1ECB': 'i',
-    '\u012F': 'i',
-    '\u1E2D': 'i',
-    '\u0268': 'i',
-    '\u0131': 'i',
-    '\u24D9': 'j',
-    '\uFF4A': 'j',
-    '\u0135': 'j',
-    '\u01F0': 'j',
-    '\u0249': 'j',
-    '\u24DA': 'k',
-    '\uFF4B': 'k',
-    '\u1E31': 'k',
-    '\u01E9': 'k',
-    '\u1E33': 'k',
-    '\u0137': 'k',
-    '\u1E35': 'k',
-    '\u0199': 'k',
-    '\u2C6A': 'k',
-    '\uA741': 'k',
-    '\uA743': 'k',
-    '\uA745': 'k',
-    '\uA7A3': 'k',
-    '\u24DB': 'l',
-    '\uFF4C': 'l',
-    '\u0140': 'l',
-    '\u013A': 'l',
-    '\u013E': 'l',
-    '\u1E37': 'l',
-    '\u1E39': 'l',
-    '\u013C': 'l',
-    '\u1E3D': 'l',
-    '\u1E3B': 'l',
-    '\u017F': 'l',
-    '\u0142': 'l',
-    '\u019A': 'l',
-    '\u026B': 'l',
-    '\u2C61': 'l',
-    '\uA749': 'l',
-    '\uA781': 'l',
-    '\uA747': 'l',
-    '\u01C9': 'lj',
-    '\u24DC': 'm',
-    '\uFF4D': 'm',
-    '\u1E3F': 'm',
-    '\u1E41': 'm',
-    '\u1E43': 'm',
-    '\u0271': 'm',
-    '\u026F': 'm',
-    '\u24DD': 'n',
-    '\uFF4E': 'n',
-    '\u01F9': 'n',
-    '\u0144': 'n',
-    '\u00F1': 'n',
-    '\u1E45': 'n',
-    '\u0148': 'n',
-    '\u1E47': 'n',
-    '\u0146': 'n',
-    '\u1E4B': 'n',
-    '\u1E49': 'n',
-    '\u019E': 'n',
-    '\u0272': 'n',
-    '\u0149': 'n',
-    '\uA791': 'n',
-    '\uA7A5': 'n',
-    '\u01CC': 'nj',
-    '\u24DE': 'o',
-    '\uFF4F': 'o',
-    '\u00F2': 'o',
-    '\u00F3': 'o',
-    '\u00F4': 'o',
-    '\u1ED3': 'o',
-    '\u1ED1': 'o',
-    '\u1ED7': 'o',
-    '\u1ED5': 'o',
-    '\u00F5': 'o',
-    '\u1E4D': 'o',
-    '\u022D': 'o',
-    '\u1E4F': 'o',
-    '\u014D': 'o',
-    '\u1E51': 'o',
-    '\u1E53': 'o',
-    '\u014F': 'o',
-    '\u022F': 'o',
-    '\u0231': 'o',
-    '\u00F6': 'o',
-    '\u022B': 'o',
-    '\u1ECF': 'o',
-    '\u0151': 'o',
-    '\u01D2': 'o',
-    '\u020D': 'o',
-    '\u020F': 'o',
-    '\u01A1': 'o',
-    '\u1EDD': 'o',
-    '\u1EDB': 'o',
-    '\u1EE1': 'o',
-    '\u1EDF': 'o',
-    '\u1EE3': 'o',
-    '\u1ECD': 'o',
-    '\u1ED9': 'o',
-    '\u01EB': 'o',
-    '\u01ED': 'o',
-    '\u00F8': 'o',
-    '\u01FF': 'o',
-    '\u0254': 'o',
-    '\uA74B': 'o',
-    '\uA74D': 'o',
-    '\u0275': 'o',
-    '\u01A3': 'oi',
-    '\u0223': 'ou',
-    '\uA74F': 'oo',
-    '\u24DF': 'p',
-    '\uFF50': 'p',
-    '\u1E55': 'p',
-    '\u1E57': 'p',
-    '\u01A5': 'p',
-    '\u1D7D': 'p',
-    '\uA751': 'p',
-    '\uA753': 'p',
-    '\uA755': 'p',
-    '\u24E0': 'q',
-    '\uFF51': 'q',
-    '\u024B': 'q',
-    '\uA757': 'q',
-    '\uA759': 'q',
-    '\u24E1': 'r',
-    '\uFF52': 'r',
-    '\u0155': 'r',
-    '\u1E59': 'r',
-    '\u0159': 'r',
-    '\u0211': 'r',
-    '\u0213': 'r',
-    '\u1E5B': 'r',
-    '\u1E5D': 'r',
-    '\u0157': 'r',
-    '\u1E5F': 'r',
-    '\u024D': 'r',
-    '\u027D': 'r',
-    '\uA75B': 'r',
-    '\uA7A7': 'r',
-    '\uA783': 'r',
-    '\u24E2': 's',
-    '\uFF53': 's',
-    '\u00DF': 's',
-    '\u015B': 's',
-    '\u1E65': 's',
-    '\u015D': 's',
-    '\u1E61': 's',
-    '\u0161': 's',
-    '\u1E67': 's',
-    '\u1E63': 's',
-    '\u1E69': 's',
-    '\u0219': 's',
-    '\u015F': 's',
-    '\u023F': 's',
-    '\uA7A9': 's',
-    '\uA785': 's',
-    '\u1E9B': 's',
-    '\u24E3': 't',
-    '\uFF54': 't',
-    '\u1E6B': 't',
-    '\u1E97': 't',
-    '\u0165': 't',
-    '\u1E6D': 't',
-    '\u021B': 't',
-    '\u0163': 't',
-    '\u1E71': 't',
-    '\u1E6F': 't',
-    '\u0167': 't',
-    '\u01AD': 't',
-    '\u0288': 't',
-    '\u2C66': 't',
-    '\uA787': 't',
-    '\uA729': 'tz',
-    '\u24E4': 'u',
-    '\uFF55': 'u',
-    '\u00F9': 'u',
-    '\u00FA': 'u',
-    '\u00FB': 'u',
-    '\u0169': 'u',
-    '\u1E79': 'u',
-    '\u016B': 'u',
-    '\u1E7B': 'u',
-    '\u016D': 'u',
-    '\u00FC': 'u',
-    '\u01DC': 'u',
-    '\u01D8': 'u',
-    '\u01D6': 'u',
-    '\u01DA': 'u',
-    '\u1EE7': 'u',
-    '\u016F': 'u',
-    '\u0171': 'u',
-    '\u01D4': 'u',
-    '\u0215': 'u',
-    '\u0217': 'u',
-    '\u01B0': 'u',
-    '\u1EEB': 'u',
-    '\u1EE9': 'u',
-    '\u1EEF': 'u',
-    '\u1EED': 'u',
-    '\u1EF1': 'u',
-    '\u1EE5': 'u',
-    '\u1E73': 'u',
-    '\u0173': 'u',
-    '\u1E77': 'u',
-    '\u1E75': 'u',
-    '\u0289': 'u',
-    '\u24E5': 'v',
-    '\uFF56': 'v',
-    '\u1E7D': 'v',
-    '\u1E7F': 'v',
-    '\u028B': 'v',
-    '\uA75F': 'v',
-    '\u028C': 'v',
-    '\uA761': 'vy',
-    '\u24E6': 'w',
-    '\uFF57': 'w',
-    '\u1E81': 'w',
-    '\u1E83': 'w',
-    '\u0175': 'w',
-    '\u1E87': 'w',
-    '\u1E85': 'w',
-    '\u1E98': 'w',
-    '\u1E89': 'w',
-    '\u2C73': 'w',
-    '\u24E7': 'x',
-    '\uFF58': 'x',
-    '\u1E8B': 'x',
-    '\u1E8D': 'x',
-    '\u24E8': 'y',
-    '\uFF59': 'y',
-    '\u1EF3': 'y',
-    '\u00FD': 'y',
-    '\u0177': 'y',
-    '\u1EF9': 'y',
-    '\u0233': 'y',
-    '\u1E8F': 'y',
-    '\u00FF': 'y',
-    '\u1EF7': 'y',
-    '\u1E99': 'y',
-    '\u1EF5': 'y',
-    '\u01B4': 'y',
-    '\u024F': 'y',
-    '\u1EFF': 'y',
-    '\u24E9': 'z',
-    '\uFF5A': 'z',
-    '\u017A': 'z',
-    '\u1E91': 'z',
-    '\u017C': 'z',
-    '\u017E': 'z',
-    '\u1E93': 'z',
-    '\u1E95': 'z',
-    '\u01B6': 'z',
-    '\u0225': 'z',
-    '\u0240': 'z',
-    '\u2C6C': 'z',
-    '\uA763': 'z',
-    '\u0386': '\u0391',
-    '\u0388': '\u0395',
-    '\u0389': '\u0397',
-    '\u038A': '\u0399',
-    '\u03AA': '\u0399',
-    '\u038C': '\u039F',
-    '\u038E': '\u03A5',
-    '\u03AB': '\u03A5',
-    '\u038F': '\u03A9',
-    '\u03AC': '\u03B1',
-    '\u03AD': '\u03B5',
-    '\u03AE': '\u03B7',
-    '\u03AF': '\u03B9',
-    '\u03CA': '\u03B9',
-    '\u0390': '\u03B9',
-    '\u03CC': '\u03BF',
-    '\u03CD': '\u03C5',
-    '\u03CB': '\u03C5',
-    '\u03B0': '\u03C5',
-    '\u03C9': '\u03C9',
-    '\u03C2': '\u03C3'
-  };
-
-  return diacritics;
-});
-
-S2.define('select2/data/base',[
-  '../utils'
-], function (Utils) {
-  function BaseAdapter ($element, options) {
-    BaseAdapter.__super__.constructor.call(this);
-  }
-
-  Utils.Extend(BaseAdapter, Utils.Observable);
-
-  BaseAdapter.prototype.current = function (callback) {
-    throw new Error('The `current` method must be defined in child classes.');
-  };
-
-  BaseAdapter.prototype.query = function (params, callback) {
-    throw new Error('The `query` method must be defined in child classes.');
-  };
-
-  BaseAdapter.prototype.bind = function (container, $container) {
-    // Can be implemented in subclasses
-  };
-
-  BaseAdapter.prototype.destroy = function () {
-    // Can be implemented in subclasses
-  };
-
-  BaseAdapter.prototype.generateResultId = function (container, data) {
-    var id = container.id + '-result-';
-
-    id += Utils.generateChars(4);
-
-    if (data.id != null) {
-      id += '-' + data.id.toString();
-    } else {
-      id += '-' + Utils.generateChars(4);
-    }
-    return id;
-  };
-
-  return BaseAdapter;
-});
-
-S2.define('select2/data/select',[
-  './base',
-  '../utils',
-  'jquery'
-], function (BaseAdapter, Utils, $) {
-  function SelectAdapter ($element, options) {
-    this.$element = $element;
-    this.options = options;
-
-    SelectAdapter.__super__.constructor.call(this);
-  }
-
-  Utils.Extend(SelectAdapter, BaseAdapter);
-
-  SelectAdapter.prototype.current = function (callback) {
-    var data = [];
-    var self = this;
-
-    this.$element.find(':selected').each(function () {
-      var $option = $(this);
-
-      var option = self.item($option);
-
-      data.push(option);
-    });
-
-    callback(data);
-  };
-
-  SelectAdapter.prototype.select = function (data) {
-    var self = this;
-
-    data.selected = true;
-
-    // If data.element is a DOM node, use it instead
-    if ($(data.element).is('option')) {
-      data.element.selected = true;
-
-      this.$element.trigger('change');
-
-      return;
-    }
-
-    if (this.$element.prop('multiple')) {
-      this.current(function (currentData) {
-        var val = [];
-
-        data = [data];
-        data.push.apply(data, currentData);
-
-        for (var d = 0; d < data.length; d++) {
-          var id = data[d].id;
-
-          if ($.inArray(id, val) === -1) {
-            val.push(id);
-          }
-        }
-
-        self.$element.val(val);
-        self.$element.trigger('change');
-      });
-    } else {
-      var val = data.id;
-
-      this.$element.val(val);
-      this.$element.trigger('change');
-    }
-  };
-
-  SelectAdapter.prototype.unselect = function (data) {
-    var self = this;
-
-    if (!this.$element.prop('multiple')) {
-      return;
-    }
-
-    data.selected = false;
-
-    if ($(data.element).is('option')) {
-      data.element.selected = false;
-
-      this.$element.trigger('change');
-
-      return;
-    }
-
-    this.current(function (currentData) {
-      var val = [];
-
-      for (var d = 0; d < currentData.length; d++) {
-        var id = currentData[d].id;
-
-        if (id !== data.id && $.inArray(id, val) === -1) {
-          val.push(id);
-        }
-      }
-
-      self.$element.val(val);
-
-      self.$element.trigger('change');
-    });
-  };
-
-  SelectAdapter.prototype.bind = function (container, $container) {
-    var self = this;
-
-    this.container = container;
-
-    container.on('select', function (params) {
-      self.select(params.data);
-    });
-
-    container.on('unselect', function (params) {
-      self.unselect(params.data);
-    });
-  };
-
-  SelectAdapter.prototype.destroy = function () {
-    // Remove anything added to child elements
-    this.$element.find('*').each(function () {
-      // Remove any custom data set by Select2
-      Utils.RemoveData(this);
-    });
-  };
-
-  SelectAdapter.prototype.query = function (params, callback) {
-    var data = [];
-    var self = this;
-
-    var $options = this.$element.children();
-
-    $options.each(function () {
-      var $option = $(this);
-
-      if (!$option.is('option') && !$option.is('optgroup')) {
-        return;
-      }
-
-      var option = self.item($option);
-
-      var matches = self.matches(params, option);
-
-      if (matches !== null) {
-        data.push(matches);
-      }
-    });
-
-    callback({
-      results: data
-    });
-  };
-
-  SelectAdapter.prototype.addOptions = function ($options) {
-    Utils.appendMany(this.$element, $options);
-  };
-
-  SelectAdapter.prototype.option = function (data) {
-    var option;
-
-    if (data.children) {
-      option = document.createElement('optgroup');
-      option.label = data.text;
-    } else {
-      option = document.createElement('option');
-
-      if (option.textContent !== undefined) {
-        option.textContent = data.text;
-      } else {
-        option.innerText = data.text;
-      }
-    }
-
-    if (data.id !== undefined) {
-      option.value = data.id;
-    }
-
-    if (data.disabled) {
-      option.disabled = true;
-    }
-
-    if (data.selected) {
-      option.selected = true;
-    }
-
-    if (data.title) {
-      option.title = data.title;
-    }
-
-    var $option = $(option);
-
-    var normalizedData = this._normalizeItem(data);
-    normalizedData.element = option;
-
-    // Override the option's data with the combined data
-    Utils.StoreData(option, 'data', normalizedData);
-
-    return $option;
-  };
-
-  SelectAdapter.prototype.item = function ($option) {
-    var data = {};
-
-    data = Utils.GetData($option[0], 'data');
-
-    if (data != null) {
-      return data;
-    }
-
-    if ($option.is('option')) {
-      data = {
-        id: $option.val(),
-        text: $option.text(),
-        disabled: $option.prop('disabled'),
-        selected: $option.prop('selected'),
-        title: $option.prop('title')
-      };
-    } else if ($option.is('optgroup')) {
-      data = {
-        text: $option.prop('label'),
-        children: [],
-        title: $option.prop('title')
-      };
-
-      var $children = $option.children('option');
-      var children = [];
-
-      for (var c = 0; c < $children.length; c++) {
-        var $child = $($children[c]);
-
-        var child = this.item($child);
-
-        children.push(child);
-      }
-
-      data.children = children;
-    }
-
-    data = this._normalizeItem(data);
-    data.element = $option[0];
-
-    Utils.StoreData($option[0], 'data', data);
-
-    return data;
-  };
-
-  SelectAdapter.prototype._normalizeItem = function (item) {
-    if (item !== Object(item)) {
-      item = {
-        id: item,
-        text: item
-      };
-    }
-
-    item = $.extend({}, {
-      text: ''
-    }, item);
-
-    var defaults = {
-      selected: false,
-      disabled: false
-    };
-
-    if (item.id != null) {
-      item.id = item.id.toString();
-    }
-
-    if (item.text != null) {
-      item.text = item.text.toString();
-    }
-
-    if (item._resultId == null && item.id && this.container != null) {
-      item._resultId = this.generateResultId(this.container, item);
-    }
-
-    return $.extend({}, defaults, item);
-  };
-
-  SelectAdapter.prototype.matches = function (params, data) {
-    var matcher = this.options.get('matcher');
-
-    return matcher(params, data);
-  };
-
-  return SelectAdapter;
-});
-
-S2.define('select2/data/array',[
-  './select',
-  '../utils',
-  'jquery'
-], function (SelectAdapter, Utils, $) {
-  function ArrayAdapter ($element, options) {
-    var data = options.get('data') || [];
-
-    ArrayAdapter.__super__.constructor.call(this, $element, options);
-
-    this.addOptions(this.convertToOptions(data));
-  }
-
-  Utils.Extend(ArrayAdapter, SelectAdapter);
-
-  ArrayAdapter.prototype.select = function (data) {
-    var $option = this.$element.find('option').filter(function (i, elm) {
-      return elm.value == data.id.toString();
-    });
-
-    if ($option.length === 0) {
-      $option = this.option(data);
-
-      this.addOptions($option);
-    }
-
-    ArrayAdapter.__super__.select.call(this, data);
-  };
-
-  ArrayAdapter.prototype.convertToOptions = function (data) {
-    var self = this;
-
-    var $existing = this.$element.find('option');
-    var existingIds = $existing.map(function () {
-      return self.item($(this)).id;
-    }).get();
-
-    var $options = [];
-
-    // Filter out all items except for the one passed in the argument
-    function onlyItem (item) {
-      return function () {
-        return $(this).val() == item.id;
-      };
-    }
-
-    for (var d = 0; d < data.length; d++) {
-      var item = this._normalizeItem(data[d]);
-
-      // Skip items which were pre-loaded, only merge the data
-      if ($.inArray(item.id, existingIds) >= 0) {
-        var $existingOption = $existing.filter(onlyItem(item));
-
-        var existingData = this.item($existingOption);
-        var newData = $.extend(true, {}, item, existingData);
-
-        var $newOption = this.option(newData);
-
-        $existingOption.replaceWith($newOption);
-
-        continue;
-      }
-
-      var $option = this.option(item);
-
-      if (item.children) {
-        var $children = this.convertToOptions(item.children);
-
-        Utils.appendMany($option, $children);
-      }
-
-      $options.push($option);
-    }
-
-    return $options;
-  };
-
-  return ArrayAdapter;
-});
-
-S2.define('select2/data/ajax',[
-  './array',
-  '../utils',
-  'jquery'
-], function (ArrayAdapter, Utils, $) {
-  function AjaxAdapter ($element, options) {
-    this.ajaxOptions = this._applyDefaults(options.get('ajax'));
-
-    if (this.ajaxOptions.processResults != null) {
-      this.processResults = this.ajaxOptions.processResults;
-    }
-
-    AjaxAdapter.__super__.constructor.call(this, $element, options);
-  }
-
-  Utils.Extend(AjaxAdapter, ArrayAdapter);
-
-  AjaxAdapter.prototype._applyDefaults = function (options) {
-    var defaults = {
-      data: function (params) {
-        return $.extend({}, params, {
-          q: params.term
-        });
-      },
-      transport: function (params, success, failure) {
-        var $request = $.ajax(params);
-
-        $request.then(success);
-        $request.fail(failure);
-
-        return $request;
-      }
-    };
-
-    return $.extend({}, defaults, options, true);
-  };
-
-  AjaxAdapter.prototype.processResults = function (results) {
-    return results;
-  };
-
-  AjaxAdapter.prototype.query = function (params, callback) {
-    var matches = [];
-    var self = this;
-
-    if (this._request != null) {
-      // JSONP requests cannot always be aborted
-      if ($.isFunction(this._request.abort)) {
-        this._request.abort();
-      }
-
-      this._request = null;
-    }
-
-    var options = $.extend({
-      type: 'GET'
-    }, this.ajaxOptions);
-
-    if (typeof options.url === 'function') {
-      options.url = options.url.call(this.$element, params);
-    }
-
-    if (typeof options.data === 'function') {
-      options.data = options.data.call(this.$element, params);
-    }
-
-    function request () {
-      var $request = options.transport(options, function (data) {
-        var results = self.processResults(data, params);
-
-        if (self.options.get('debug') && window.console && console.error) {
-          // Check to make sure that the response included a `results` key.
-          if (!results || !results.results || !$.isArray(results.results)) {
-            console.error(
-              'Select2: The AJAX results did not return an array in the ' +
-              '`results` key of the response.'
-            );
-          }
-        }
-
-        callback(results);
-      }, function () {
-        // Attempt to detect if a request was aborted
-        // Only works if the transport exposes a status property
-        if ('status' in $request &&
-            ($request.status === 0 || $request.status === '0')) {
-          return;
-        }
-
-        self.trigger('results:message', {
-          message: 'errorLoading'
-        });
-      });
-
-      self._request = $request;
-    }
-
-    if (this.ajaxOptions.delay && params.term != null) {
-      if (this._queryTimeout) {
-        window.clearTimeout(this._queryTimeout);
-      }
-
-      this._queryTimeout = window.setTimeout(request, this.ajaxOptions.delay);
-    } else {
-      request();
-    }
-  };
-
-  return AjaxAdapter;
-});
-
-S2.define('select2/data/tags',[
-  'jquery'
-], function ($) {
-  function Tags (decorated, $element, options) {
-    var tags = options.get('tags');
-
-    var createTag = options.get('createTag');
-
-    if (createTag !== undefined) {
-      this.createTag = createTag;
-    }
-
-    var insertTag = options.get('insertTag');
-
-    if (insertTag !== undefined) {
-        this.insertTag = insertTag;
-    }
-
-    decorated.call(this, $element, options);
-
-    if ($.isArray(tags)) {
-      for (var t = 0; t < tags.length; t++) {
-        var tag = tags[t];
-        var item = this._normalizeItem(tag);
-
-        var $option = this.option(item);
-
-        this.$element.append($option);
-      }
-    }
-  }
-
-  Tags.prototype.query = function (decorated, params, callback) {
-    var self = this;
-
-    this._removeOldTags();
-
-    if (params.term == null || params.page != null) {
-      decorated.call(this, params, callback);
-      return;
-    }
-
-    function wrapper (obj, child) {
-      var data = obj.results;
-
-      for (var i = 0; i < data.length; i++) {
-        var option = data[i];
-
-        var checkChildren = (
-          option.children != null &&
-          !wrapper({
-            results: option.children
-          }, true)
-        );
-
-        var optionText = (option.text || '').toUpperCase();
-        var paramsTerm = (params.term || '').toUpperCase();
-
-        var checkText = optionText === paramsTerm;
-
-        if (checkText || checkChildren) {
-          if (child) {
-            return false;
-          }
-
-          obj.data = data;
-          callback(obj);
-
-          return;
-        }
-      }
-
-      if (child) {
-        return true;
-      }
-
-      var tag = self.createTag(params);
-
-      if (tag != null) {
-        var $option = self.option(tag);
-        $option.attr('data-select2-tag', true);
-
-        self.addOptions([$option]);
-
-        self.insertTag(data, tag);
-      }
-
-      obj.results = data;
-
-      callback(obj);
-    }
-
-    decorated.call(this, params, wrapper);
-  };
-
-  Tags.prototype.createTag = function (decorated, params) {
-    var term = $.trim(params.term);
-
-    if (term === '') {
-      return null;
-    }
-
-    return {
-      id: term,
-      text: term
-    };
-  };
-
-  Tags.prototype.insertTag = function (_, data, tag) {
-    data.unshift(tag);
-  };
-
-  Tags.prototype._removeOldTags = function (_) {
-    var tag = this._lastTag;
-
-    var $options = this.$element.find('option[data-select2-tag]');
-
-    $options.each(function () {
-      if (this.selected) {
-        return;
-      }
-
-      $(this).remove();
-    });
-  };
-
-  return Tags;
-});
-
-S2.define('select2/data/tokenizer',[
-  'jquery'
-], function ($) {
-  function Tokenizer (decorated, $element, options) {
-    var tokenizer = options.get('tokenizer');
-
-    if (tokenizer !== undefined) {
-      this.tokenizer = tokenizer;
-    }
-
-    decorated.call(this, $element, options);
-  }
-
-  Tokenizer.prototype.bind = function (decorated, container, $container) {
-    decorated.call(this, container, $container);
-
-    this.$search =  container.dropdown.$search || container.selection.$search ||
-      $container.find('.select2-search__field');
-  };
-
-  Tokenizer.prototype.query = function (decorated, params, callback) {
-    var self = this;
-
-    function createAndSelect (data) {
-      // Normalize the data object so we can use it for checks
-      var item = self._normalizeItem(data);
-
-      // Check if the data object already exists as a tag
-      // Select it if it doesn't
-      var $existingOptions = self.$element.find('option').filter(function () {
-        return $(this).val() === item.id;
-      });
-
-      // If an existing option wasn't found for it, create the option
-      if (!$existingOptions.length) {
-        var $option = self.option(item);
-        $option.attr('data-select2-tag', true);
-
-        self._removeOldTags();
-        self.addOptions([$option]);
-      }
-
-      // Select the item, now that we know there is an option for it
-      select(item);
-    }
-
-    function select (data) {
-      self.trigger('select', {
-        data: data
-      });
-    }
-
-    params.term = params.term || '';
-
-    var tokenData = this.tokenizer(params, this.options, createAndSelect);
-
-    if (tokenData.term !== params.term) {
-      // Replace the search term if we have the search box
-      if (this.$search.length) {
-        this.$search.val(tokenData.term);
-        this.$search.focus();
-      }
-
-      params.term = tokenData.term;
-    }
-
-    decorated.call(this, params, callback);
-  };
-
-  Tokenizer.prototype.tokenizer = function (_, params, options, callback) {
-    var separators = options.get('tokenSeparators') || [];
-    var term = params.term;
-    var i = 0;
-
-    var createTag = this.createTag || function (params) {
-      return {
-        id: params.term,
-        text: params.term
-      };
-    };
-
-    while (i < term.length) {
-      var termChar = term[i];
-
-      if ($.inArray(termChar, separators) === -1) {
-        i++;
-
-        continue;
-      }
-
-      var part = term.substr(0, i);
-      var partParams = $.extend({}, params, {
-        term: part
-      });
-
-      var data = createTag(partParams);
-
-      if (data == null) {
-        i++;
-        continue;
-      }
-
-      callback(data);
-
-      // Reset the term to not include the tokenized portion
-      term = term.substr(i + 1) || '';
-      i = 0;
-    }
-
-    return {
-      term: term
-    };
-  };
-
-  return Tokenizer;
-});
-
-S2.define('select2/data/minimumInputLength',[
-
-], function () {
-  function MinimumInputLength (decorated, $e, options) {
-    this.minimumInputLength = options.get('minimumInputLength');
-
-    decorated.call(this, $e, options);
-  }
-
-  MinimumInputLength.prototype.query = function (decorated, params, callback) {
-    params.term = params.term || '';
-
-    if (params.term.length < this.minimumInputLength) {
-      this.trigger('results:message', {
-        message: 'inputTooShort',
-        args: {
-          minimum: this.minimumInputLength,
-          input: params.term,
-          params: params
-        }
-      });
-
-      return;
-    }
-
-    decorated.call(this, params, callback);
-  };
-
-  return MinimumInputLength;
-});
-
-S2.define('select2/data/maximumInputLength',[
-
-], function () {
-  function MaximumInputLength (decorated, $e, options) {
-    this.maximumInputLength = options.get('maximumInputLength');
-
-    decorated.call(this, $e, options);
-  }
-
-  MaximumInputLength.prototype.query = function (decorated, params, callback) {
-    params.term = params.term || '';
-
-    if (this.maximumInputLength > 0 &&
-        params.term.length > this.maximumInputLength) {
-      this.trigger('results:message', {
-        message: 'inputTooLong',
-        args: {
-          maximum: this.maximumInputLength,
-          input: params.term,
-          params: params
-        }
-      });
-
-      return;
-    }
-
-    decorated.call(this, params, callback);
-  };
-
-  return MaximumInputLength;
-});
-
-S2.define('select2/data/maximumSelectionLength',[
-
-], function (){
-  function MaximumSelectionLength (decorated, $e, options) {
-    this.maximumSelectionLength = options.get('maximumSelectionLength');
-
-    decorated.call(this, $e, options);
-  }
-
-  MaximumSelectionLength.prototype.query =
-    function (decorated, params, callback) {
-      var self = this;
-
-      this.current(function (currentData) {
-        var count = currentData != null ? currentData.length : 0;
-        if (self.maximumSelectionLength > 0 &&
-          count >= self.maximumSelectionLength) {
-          self.trigger('results:message', {
-            message: 'maximumSelected',
-            args: {
-              maximum: self.maximumSelectionLength
-            }
-          });
-          return;
-        }
-        decorated.call(self, params, callback);
-      });
-  };
-
-  return MaximumSelectionLength;
-});
-
-S2.define('select2/dropdown',[
-  'jquery',
-  './utils'
-], function ($, Utils) {
-  function Dropdown ($element, options) {
-    this.$element = $element;
-    this.options = options;
-
-    Dropdown.__super__.constructor.call(this);
-  }
-
-  Utils.Extend(Dropdown, Utils.Observable);
-
-  Dropdown.prototype.render = function () {
-    var $dropdown = $(
-      '<span class="select2-dropdown">' +
-        '<span class="select2-results"></span>' +
-      '</span>'
-    );
-
-    $dropdown.attr('dir', this.options.get('dir'));
-
-    this.$dropdown = $dropdown;
-
-    return $dropdown;
-  };
-
-  Dropdown.prototype.bind = function () {
-    // Should be implemented in subclasses
-  };
-
-  Dropdown.prototype.position = function ($dropdown, $container) {
-    // Should be implmented in subclasses
-  };
-
-  Dropdown.prototype.destroy = function () {
-    // Remove the dropdown from the DOM
-    this.$dropdown.remove();
-  };
-
-  return Dropdown;
-});
-
-S2.define('select2/dropdown/search',[
-  'jquery',
-  '../utils'
-], function ($, Utils) {
-  function Search () { }
-
-  Search.prototype.render = function (decorated) {
-    var $rendered = decorated.call(this);
-
-    var $search = $(
-      '<span class="select2-search select2-search--dropdown">' +
-        '<input class="select2-search__field" type="search" tabindex="-1"' +
-        ' autocomplete="off" autocorrect="off" autocapitalize="none"' +
-        ' spellcheck="false" role="textbox" />' +
-      '</span>'
-    );
-
-    this.$searchContainer = $search;
-    this.$search = $search.find('input');
-
-    $rendered.prepend($search);
-
-    return $rendered;
-  };
-
-  Search.prototype.bind = function (decorated, container, $container) {
-    var self = this;
-
-    decorated.call(this, container, $container);
-
-    this.$search.on('keydown', function (evt) {
-      self.trigger('keypress', evt);
-
-      self._keyUpPrevented = evt.isDefaultPrevented();
-    });
-
-    // Workaround for browsers which do not support the `input` event
-    // This will prevent double-triggering of events for browsers which support
-    // both the `keyup` and `input` events.
-    this.$search.on('input', function (evt) {
-      // Unbind the duplicated `keyup` event
-      $(this).off('keyup');
-    });
-
-    this.$search.on('keyup input', function (evt) {
-      self.handleSearch(evt);
-    });
-
-    container.on('open', function () {
-      self.$search.attr('tabindex', 0);
-
-      self.$search.focus();
-
-      window.setTimeout(function () {
-        self.$search.focus();
-      }, 0);
-    });
-
-    container.on('close', function () {
-      self.$search.attr('tabindex', -1);
-
-      self.$search.val('');
-      self.$search.blur();
-    });
-
-    container.on('focus', function () {
-      if (!container.isOpen()) {
-        self.$search.focus();
-      }
-    });
-
-    container.on('results:all', function (params) {
-      if (params.query.term == null || params.query.term === '') {
-        var showSearch = self.showSearch(params);
-
-        if (showSearch) {
-          self.$searchContainer.removeClass('select2-search--hide');
-        } else {
-          self.$searchContainer.addClass('select2-search--hide');
-        }
-      }
-    });
-  };
-
-  Search.prototype.handleSearch = function (evt) {
-    if (!this._keyUpPrevented) {
-      var input = this.$search.val();
-
-      this.trigger('query', {
-        term: input
-      });
-    }
-
-    this._keyUpPrevented = false;
-  };
-
-  Search.prototype.showSearch = function (_, params) {
-    return true;
-  };
-
-  return Search;
-});
-
-S2.define('select2/dropdown/hidePlaceholder',[
-
-], function () {
-  function HidePlaceholder (decorated, $element, options, dataAdapter) {
-    this.placeholder = this.normalizePlaceholder(options.get('placeholder'));
-
-    decorated.call(this, $element, options, dataAdapter);
-  }
-
-  HidePlaceholder.prototype.append = function (decorated, data) {
-    data.results = this.removePlaceholder(data.results);
-
-    decorated.call(this, data);
-  };
-
-  HidePlaceholder.prototype.normalizePlaceholder = function (_, placeholder) {
-    if (typeof placeholder === 'string') {
-      placeholder = {
-        id: '',
-        text: placeholder
-      };
-    }
-
-    return placeholder;
-  };
-
-  HidePlaceholder.prototype.removePlaceholder = function (_, data) {
-    var modifiedData = data.slice(0);
-
-    for (var d = data.length - 1; d >= 0; d--) {
-      var item = data[d];
-
-      if (this.placeholder.id === item.id) {
-        modifiedData.splice(d, 1);
-      }
-    }
-
-    return modifiedData;
-  };
-
-  return HidePlaceholder;
-});
-
-S2.define('select2/dropdown/infiniteScroll',[
-  'jquery'
-], function ($) {
-  function InfiniteScroll (decorated, $element, options, dataAdapter) {
-    this.lastParams = {};
-
-    decorated.call(this, $element, options, dataAdapter);
-
-    this.$loadingMore = this.createLoadingMore();
-    this.loading = false;
-  }
-
-  InfiniteScroll.prototype.append = function (decorated, data) {
-    this.$loadingMore.remove();
-    this.loading = false;
-
-    decorated.call(this, data);
-
-    if (this.showLoadingMore(data)) {
-      this.$results.append(this.$loadingMore);
-    }
-  };
-
-  InfiniteScroll.prototype.bind = function (decorated, container, $container) {
-    var self = this;
-
-    decorated.call(this, container, $container);
-
-    container.on('query', function (params) {
-      self.lastParams = params;
-      self.loading = true;
-    });
-
-    container.on('query:append', function (params) {
-      self.lastParams = params;
-      self.loading = true;
-    });
-
-    this.$results.on('scroll', function () {
-      var isLoadMoreVisible = $.contains(
-        document.documentElement,
-        self.$loadingMore[0]
-      );
-
-      if (self.loading || !isLoadMoreVisible) {
-        return;
-      }
-
-      var currentOffset = self.$results.offset().top +
-        self.$results.outerHeight(false);
-      var loadingMoreOffset = self.$loadingMore.offset().top +
-        self.$loadingMore.outerHeight(false);
-
-      if (currentOffset + 50 >= loadingMoreOffset) {
-        self.loadMore();
-      }
-    });
-  };
-
-  InfiniteScroll.prototype.loadMore = function () {
-    this.loading = true;
-
-    var params = $.extend({}, {page: 1}, this.lastParams);
-
-    params.page++;
-
-    this.trigger('query:append', params);
-  };
-
-  InfiniteScroll.prototype.showLoadingMore = function (_, data) {
-    return data.pagination && data.pagination.more;
-  };
-
-  InfiniteScroll.prototype.createLoadingMore = function () {
-    var $option = $(
-      '<li ' +
-      'class="select2-results__option select2-results__option--load-more"' +
-      'role="treeitem" aria-disabled="true"></li>'
-    );
-
-    var message = this.options.get('translations').get('loadingMore');
-
-    $option.html(message(this.lastParams));
-
-    return $option;
-  };
-
-  return InfiniteScroll;
-});
-
-S2.define('select2/dropdown/attachBody',[
-  'jquery',
-  '../utils'
-], function ($, Utils) {
-  function AttachBody (decorated, $element, options) {
-    this.$dropdownParent = options.get('dropdownParent') || $(document.body);
-
-    decorated.call(this, $element, options);
-  }
-
-  AttachBody.prototype.bind = function (decorated, container, $container) {
-    var self = this;
-
-    var setupResultsEvents = false;
-
-    decorated.call(this, container, $container);
-
-    container.on('open', function () {
-      self._showDropdown();
-      self._attachPositioningHandler(container);
-
-      if (!setupResultsEvents) {
-        setupResultsEvents = true;
-
-        container.on('results:all', function () {
-          self._positionDropdown();
-          self._resizeDropdown();
-        });
-
-        container.on('results:append', function () {
-          self._positionDropdown();
-          self._resizeDropdown();
-        });
-      }
-    });
-
-    container.on('close', function () {
-      self._hideDropdown();
-      self._detachPositioningHandler(container);
-    });
-
-    this.$dropdownContainer.on('mousedown', function (evt) {
-      evt.stopPropagation();
-    });
-  };
-
-  AttachBody.prototype.destroy = function (decorated) {
-    decorated.call(this);
-
-    this.$dropdownContainer.remove();
-  };
-
-  AttachBody.prototype.position = function (decorated, $dropdown, $container) {
-    // Clone all of the container classes
-    $dropdown.attr('class', $container.attr('class'));
-
-    $dropdown.removeClass('select2');
-    $dropdown.addClass('select2-container--open');
-
-    $dropdown.css({
-      position: 'absolute',
-      top: -999999
-    });
-
-    this.$container = $container;
-  };
-
-  AttachBody.prototype.render = function (decorated) {
-    var $container = $('<span></span>');
-
-    var $dropdown = decorated.call(this);
-    $container.append($dropdown);
-
-    this.$dropdownContainer = $container;
-
-    return $container;
-  };
-
-  AttachBody.prototype._hideDropdown = function (decorated) {
-    this.$dropdownContainer.detach();
-  };
-
-  AttachBody.prototype._attachPositioningHandler =
-      function (decorated, container) {
-    var self = this;
-
-    var scrollEvent = 'scroll.select2.' + container.id;
-    var resizeEvent = 'resize.select2.' + container.id;
-    var orientationEvent = 'orientationchange.select2.' + container.id;
-
-    var $watchers = this.$container.parents().filter(Utils.hasScroll);
-    $watchers.each(function () {
-      Utils.StoreData(this, 'select2-scroll-position', {
-        x: $(this).scrollLeft(),
-        y: $(this).scrollTop()
-      });
-    });
-
-    $watchers.on(scrollEvent, function (ev) {
-      var position = Utils.GetData(this, 'select2-scroll-position');
-      $(this).scrollTop(position.y);
-    });
-
-    $(window).on(scrollEvent + ' ' + resizeEvent + ' ' + orientationEvent,
-      function (e) {
-      self._positionDropdown();
-      self._resizeDropdown();
-    });
-  };
-
-  AttachBody.prototype._detachPositioningHandler =
-      function (decorated, container) {
-    var scrollEvent = 'scroll.select2.' + container.id;
-    var resizeEvent = 'resize.select2.' + container.id;
-    var orientationEvent = 'orientationchange.select2.' + container.id;
-
-    var $watchers = this.$container.parents().filter(Utils.hasScroll);
-    $watchers.off(scrollEvent);
-
-    $(window).off(scrollEvent + ' ' + resizeEvent + ' ' + orientationEvent);
-  };
-
-  AttachBody.prototype._positionDropdown = function () {
-    var $window = $(window);
-
-    var isCurrentlyAbove = this.$dropdown.hasClass('select2-dropdown--above');
-    var isCurrentlyBelow = this.$dropdown.hasClass('select2-dropdown--below');
-
-    var newDirection = null;
-
-    var offset = this.$container.offset();
-
-    offset.bottom = offset.top + this.$container.outerHeight(false);
-
-    var container = {
-      height: this.$container.outerHeight(false)
-    };
-
-    container.top = offset.top;
-    container.bottom = offset.top + container.height;
-
-    var dropdown = {
-      height: this.$dropdown.outerHeight(false)
-    };
-
-    var viewport = {
-      top: $window.scrollTop(),
-      bottom: $window.scrollTop() + $window.height()
-    };
-
-    var enoughRoomAbove = viewport.top < (offset.top - dropdown.height);
-    var enoughRoomBelow = viewport.bottom > (offset.bottom + dropdown.height);
-
-    var css = {
-      left: offset.left,
-      top: container.bottom
-    };
-
-    // Determine what the parent element is to use for calciulating the offset
-    var $offsetParent = this.$dropdownParent;
-
-    // For statically positoned elements, we need to get the element
-    // that is determining the offset
-    if ($offsetParent.css('position') === 'static') {
-      $offsetParent = $offsetParent.offsetParent();
-    }
-
-    var parentOffset = $offsetParent.offset();
-
-    css.top -= parentOffset.top;
-    css.left -= parentOffset.left;
-
-    if (!isCurrentlyAbove && !isCurrentlyBelow) {
-      newDirection = 'below';
-    }
-
-    if (!enoughRoomBelow && enoughRoomAbove && !isCurrentlyAbove) {
-      newDirection = 'above';
-    } else if (!enoughRoomAbove && enoughRoomBelow && isCurrentlyAbove) {
-      newDirection = 'below';
-    }
-
-    if (newDirection == 'above' ||
-      (isCurrentlyAbove && newDirection !== 'below')) {
-      css.top = container.top - parentOffset.top - dropdown.height;
-    }
-
-    if (newDirection != null) {
-      this.$dropdown
-        .removeClass('select2-dropdown--below select2-dropdown--above')
-        .addClass('select2-dropdown--' + newDirection);
-      this.$container
-        .removeClass('select2-container--below select2-container--above')
-        .addClass('select2-container--' + newDirection);
-    }
-
-    this.$dropdownContainer.css(css);
-  };
-
-  AttachBody.prototype._resizeDropdown = function () {
-    var css = {
-      width: this.$container.outerWidth(false) + 'px'
-    };
-
-    if (this.options.get('dropdownAutoWidth')) {
-      css.minWidth = css.width;
-      css.position = 'relative';
-      css.width = 'auto';
-    }
-
-    this.$dropdown.css(css);
-  };
-
-  AttachBody.prototype._showDropdown = function (decorated) {
-    this.$dropdownContainer.appendTo(this.$dropdownParent);
-
-    this._positionDropdown();
-    this._resizeDropdown();
-  };
-
-  return AttachBody;
-});
-
-S2.define('select2/dropdown/minimumResultsForSearch',[
-
-], function () {
-  function countResults (data) {
-    var count = 0;
-
-    for (var d = 0; d < data.length; d++) {
-      var item = data[d];
-
-      if (item.children) {
-        count += countResults(item.children);
-      } else {
-        count++;
-      }
-    }
-
-    return count;
-  }
-
-  function MinimumResultsForSearch (decorated, $element, options, dataAdapter) {
-    this.minimumResultsForSearch = options.get('minimumResultsForSearch');
-
-    if (this.minimumResultsForSearch < 0) {
-      this.minimumResultsForSearch = Infinity;
-    }
-
-    decorated.call(this, $element, options, dataAdapter);
-  }
-
-  MinimumResultsForSearch.prototype.showSearch = function (decorated, params) {
-    if (countResults(params.data.results) < this.minimumResultsForSearch) {
-      return false;
-    }
-
-    return decorated.call(this, params);
-  };
-
-  return MinimumResultsForSearch;
-});
-
-S2.define('select2/dropdown/selectOnClose',[
-  '../utils'
-], function (Utils) {
-  function SelectOnClose () { }
-
-  SelectOnClose.prototype.bind = function (decorated, container, $container) {
-    var self = this;
-
-    decorated.call(this, container, $container);
-
-    container.on('close', function (params) {
-      self._handleSelectOnClose(params);
-    });
-  };
-
-  SelectOnClose.prototype._handleSelectOnClose = function (_, params) {
-    if (params && params.originalSelect2Event != null) {
-      var event = params.originalSelect2Event;
-
-      // Don't select an item if the close event was triggered from a select or
-      // unselect event
-      if (event._type === 'select' || event._type === 'unselect') {
-        return;
-      }
-    }
-
-    var $highlightedResults = this.getHighlightedResults();
-
-    // Only select highlighted results
-    if ($highlightedResults.length < 1) {
-      return;
-    }
-
-    var data = Utils.GetData($highlightedResults[0], 'data');
-
-    // Don't re-select already selected resulte
-    if (
-      (data.element != null && data.element.selected) ||
-      (data.element == null && data.selected)
-    ) {
-      return;
-    }
-
-    this.trigger('select', {
-        data: data
-    });
-  };
-
-  return SelectOnClose;
-});
-
-S2.define('select2/dropdown/closeOnSelect',[
-
-], function () {
-  function CloseOnSelect () { }
-
-  CloseOnSelect.prototype.bind = function (decorated, container, $container) {
-    var self = this;
-
-    decorated.call(this, container, $container);
-
-    container.on('select', function (evt) {
-      self._selectTriggered(evt);
-    });
-
-    container.on('unselect', function (evt) {
-      self._selectTriggered(evt);
-    });
-  };
-
-  CloseOnSelect.prototype._selectTriggered = function (_, evt) {
-    var originalEvent = evt.originalEvent;
-
-    // Don't close if the control key is being held
-    if (originalEvent && originalEvent.ctrlKey) {
-      return;
-    }
-
-    this.trigger('close', {
-      originalEvent: originalEvent,
-      originalSelect2Event: evt
-    });
-  };
-
-  return CloseOnSelect;
-});
-
-S2.define('select2/i18n/en',[],function () {
-  // English
-  return {
-    errorLoading: function () {
-      return 'The results could not be loaded.';
-    },
-    inputTooLong: function (args) {
-      var overChars = args.input.length - args.maximum;
-
-      var message = 'Please delete ' + overChars + ' character';
-
-      if (overChars != 1) {
-        message += 's';
-      }
-
-      return message;
-    },
-    inputTooShort: function (args) {
-      var remainingChars = args.minimum - args.input.length;
-
-      var message = 'Please enter ' + remainingChars + ' or more characters';
-
-      return message;
-    },
-    loadingMore: function () {
-      return 'Loading more results…';
-    },
-    maximumSelected: function (args) {
-      var message = 'You can only select ' + args.maximum + ' item';
-
-      if (args.maximum != 1) {
-        message += 's';
-      }
-
-      return message;
-    },
-    noResults: function () {
-      return 'No results found';
-    },
-    searching: function () {
-      return 'Searching…';
-    }
-  };
-});
-
-S2.define('select2/defaults',[
-  'jquery',
-  'require',
-
-  './results',
-
-  './selection/single',
-  './selection/multiple',
-  './selection/placeholder',
-  './selection/allowClear',
-  './selection/search',
-  './selection/eventRelay',
-
-  './utils',
-  './translation',
-  './diacritics',
-
-  './data/select',
-  './data/array',
-  './data/ajax',
-  './data/tags',
-  './data/tokenizer',
-  './data/minimumInputLength',
-  './data/maximumInputLength',
-  './data/maximumSelectionLength',
-
-  './dropdown',
-  './dropdown/search',
-  './dropdown/hidePlaceholder',
-  './dropdown/infiniteScroll',
-  './dropdown/attachBody',
-  './dropdown/minimumResultsForSearch',
-  './dropdown/selectOnClose',
-  './dropdown/closeOnSelect',
-
-  './i18n/en'
-], function ($, require,
-
-             ResultsList,
-
-             SingleSelection, MultipleSelection, Placeholder, AllowClear,
-             SelectionSearch, EventRelay,
-
-             Utils, Translation, DIACRITICS,
-
-             SelectData, ArrayData, AjaxData, Tags, Tokenizer,
-             MinimumInputLength, MaximumInputLength, MaximumSelectionLength,
-
-             Dropdown, DropdownSearch, HidePlaceholder, InfiniteScroll,
-             AttachBody, MinimumResultsForSearch, SelectOnClose, CloseOnSelect,
-
-             EnglishTranslation) {
-  function Defaults () {
-    this.reset();
-  }
-
-  Defaults.prototype.apply = function (options) {
-    options = $.extend(true, {}, this.defaults, options);
-
-    if (options.dataAdapter == null) {
-      if (options.ajax != null) {
-        options.dataAdapter = AjaxData;
-      } else if (options.data != null) {
-        options.dataAdapter = ArrayData;
-      } else {
-        options.dataAdapter = SelectData;
-      }
-
-      if (options.minimumInputLength > 0) {
-        options.dataAdapter = Utils.Decorate(
-          options.dataAdapter,
-          MinimumInputLength
-        );
-      }
-
-      if (options.maximumInputLength > 0) {
-        options.dataAdapter = Utils.Decorate(
-          options.dataAdapter,
-          MaximumInputLength
-        );
-      }
-
-      if (options.maximumSelectionLength > 0) {
-        options.dataAdapter = Utils.Decorate(
-          options.dataAdapter,
-          MaximumSelectionLength
-        );
-      }
-
-      if (options.tags) {
-        options.dataAdapter = Utils.Decorate(options.dataAdapter, Tags);
-      }
-
-      if (options.tokenSeparators != null || options.tokenizer != null) {
-        options.dataAdapter = Utils.Decorate(
-          options.dataAdapter,
-          Tokenizer
-        );
-      }
-
-      if (options.query != null) {
-        var Query = require(options.amdBase + 'compat/query');
-
-        options.dataAdapter = Utils.Decorate(
-          options.dataAdapter,
-          Query
-        );
-      }
-
-      if (options.initSelection != null) {
-        var InitSelection = require(options.amdBase + 'compat/initSelection');
-
-        options.dataAdapter = Utils.Decorate(
-          options.dataAdapter,
-          InitSelection
-        );
-      }
-    }
-
-    if (options.resultsAdapter == null) {
-      options.resultsAdapter = ResultsList;
-
-      if (options.ajax != null) {
-        options.resultsAdapter = Utils.Decorate(
-          options.resultsAdapter,
-          InfiniteScroll
-        );
-      }
-
-      if (options.placeholder != null) {
-        options.resultsAdapter = Utils.Decorate(
-          options.resultsAdapter,
-          HidePlaceholder
-        );
-      }
-
-      if (options.selectOnClose) {
-        options.resultsAdapter = Utils.Decorate(
-          options.resultsAdapter,
-          SelectOnClose
-        );
-      }
-    }
-
-    if (options.dropdownAdapter == null) {
-      if (options.multiple) {
-        options.dropdownAdapter = Dropdown;
-      } else {
-        var SearchableDropdown = Utils.Decorate(Dropdown, DropdownSearch);
-
-        options.dropdownAdapter = SearchableDropdown;
-      }
-
-      if (options.minimumResultsForSearch !== 0) {
-        options.dropdownAdapter = Utils.Decorate(
-          options.dropdownAdapter,
-          MinimumResultsForSearch
-        );
-      }
-
-      if (options.closeOnSelect) {
-        options.dropdownAdapter = Utils.Decorate(
-          options.dropdownAdapter,
-          CloseOnSelect
-        );
-      }
-
-      if (
-        options.dropdownCssClass != null ||
-        options.dropdownCss != null ||
-        options.adaptDropdownCssClass != null
-      ) {
-        var DropdownCSS = require(options.amdBase + 'compat/dropdownCss');
-
-        options.dropdownAdapter = Utils.Decorate(
-          options.dropdownAdapter,
-          DropdownCSS
-        );
-      }
-
-      options.dropdownAdapter = Utils.Decorate(
-        options.dropdownAdapter,
-        AttachBody
-      );
-    }
-
-    if (options.selectionAdapter == null) {
-      if (options.multiple) {
-        options.selectionAdapter = MultipleSelection;
-      } else {
-        options.selectionAdapter = SingleSelection;
-      }
-
-      // Add the placeholder mixin if a placeholder was specified
-      if (options.placeholder != null) {
-        options.selectionAdapter = Utils.Decorate(
-          options.selectionAdapter,
-          Placeholder
-        );
-      }
-
-      if (options.allowClear) {
-        options.selectionAdapter = Utils.Decorate(
-          options.selectionAdapter,
-          AllowClear
-        );
-      }
-
-      if (options.multiple) {
-        options.selectionAdapter = Utils.Decorate(
-          options.selectionAdapter,
-          SelectionSearch
-        );
-      }
-
-      if (
-        options.containerCssClass != null ||
-        options.containerCss != null ||
-        options.adaptContainerCssClass != null
-      ) {
-        var ContainerCSS = require(options.amdBase + 'compat/containerCss');
-
-        options.selectionAdapter = Utils.Decorate(
-          options.selectionAdapter,
-          ContainerCSS
-        );
-      }
-
-      options.selectionAdapter = Utils.Decorate(
-        options.selectionAdapter,
-        EventRelay
-      );
-    }
-
-    if (typeof options.language === 'string') {
-      // Check if the language is specified with a region
-      if (options.language.indexOf('-') > 0) {
-        // Extract the region information if it is included
-        var languageParts = options.language.split('-');
-        var baseLanguage = languageParts[0];
-
-        options.language = [options.language, baseLanguage];
-      } else {
-        options.language = [options.language];
-      }
-    }
-
-    if ($.isArray(options.language)) {
-      var languages = new Translation();
-      options.language.push('en');
-
-      var languageNames = options.language;
-
-      for (var l = 0; l < languageNames.length; l++) {
-        var name = languageNames[l];
-        var language = {};
-
-        try {
-          // Try to load it with the original name
-          language = Translation.loadPath(name);
-        } catch (e) {
-          try {
-            // If we couldn't load it, check if it wasn't the full path
-            name = this.defaults.amdLanguageBase + name;
-            language = Translation.loadPath(name);
-          } catch (ex) {
-            // The translation could not be loaded at all. Sometimes this is
-            // because of a configuration problem, other times this can be
-            // because of how Select2 helps load all possible translation files.
-            if (options.debug && window.console && console.warn) {
-              console.warn(
-                'Select2: The language file for "' + name + '" could not be ' +
-                'automatically loaded. A fallback will be used instead.'
-              );
-            }
-
-            continue;
-          }
-        }
-
-        languages.extend(language);
-      }
-
-      options.translations = languages;
-    } else {
-      var baseTranslation = Translation.loadPath(
-        this.defaults.amdLanguageBase + 'en'
-      );
-      var customTranslation = new Translation(options.language);
-
-      customTranslation.extend(baseTranslation);
-
-      options.translations = customTranslation;
-    }
-
-    return options;
-  };
-
-  Defaults.prototype.reset = function () {
-    function stripDiacritics (text) {
-      // Used 'uni range + named function' from http://jsperf.com/diacritics/18
-      function match(a) {
-        return DIACRITICS[a] || a;
-      }
-
-      return text.replace(/[^\u0000-\u007E]/g, match);
-    }
-
-    function matcher (params, data) {
-      // Always return the object if there is nothing to compare
-      if ($.trim(params.term) === '') {
-        return data;
-      }
-
-      // Do a recursive check for options with children
-      if (data.children && data.children.length > 0) {
-        // Clone the data object if there are children
-        // This is required as we modify the object to remove any non-matches
-        var match = $.extend(true, {}, data);
-
-        // Check each child of the option
-        for (var c = data.children.length - 1; c >= 0; c--) {
-          var child = data.children[c];
-
-          var matches = matcher(params, child);
-
-          // If there wasn't a match, remove the object in the array
-          if (matches == null) {
-            match.children.splice(c, 1);
-          }
-        }
-
-        // If any children matched, return the new object
-        if (match.children.length > 0) {
-          return match;
-        }
-
-        // If there were no matching children, check just the plain object
-        return matcher(params, match);
-      }
-
-      var original = stripDiacritics(data.text).toUpperCase();
-      var term = stripDiacritics(params.term).toUpperCase();
-
-      // Check if the text contains the term
-      if (original.indexOf(term) > -1) {
-        return data;
-      }
-
-      // If it doesn't contain the term, don't return anything
-      return null;
-    }
-
-    this.defaults = {
-      amdBase: './',
-      amdLanguageBase: './i18n/',
-      closeOnSelect: true,
-      debug: false,
-      dropdownAutoWidth: false,
-      escapeMarkup: Utils.escapeMarkup,
-      language: EnglishTranslation,
-      matcher: matcher,
-      minimumInputLength: 0,
-      maximumInputLength: 0,
-      maximumSelectionLength: 0,
-      minimumResultsForSearch: 0,
-      selectOnClose: false,
-      sorter: function (data) {
-        return data;
-      },
-      templateResult: function (result) {
-        return result.text;
-      },
-      templateSelection: function (selection) {
-        return selection.text;
-      },
-      theme: 'default',
-      width: 'resolve'
-    };
-  };
-
-  Defaults.prototype.set = function (key, value) {
-    var camelKey = $.camelCase(key);
-
-    var data = {};
-    data[camelKey] = value;
-
-    var convertedData = Utils._convertData(data);
-
-    $.extend(true, this.defaults, convertedData);
-  };
-
-  var defaults = new Defaults();
-
-  return defaults;
-});
-
-S2.define('select2/options',[
-  'require',
-  'jquery',
-  './defaults',
-  './utils'
-], function (require, $, Defaults, Utils) {
-  function Options (options, $element) {
-    this.options = options;
-
-    if ($element != null) {
-      this.fromElement($element);
-    }
-
-    this.options = Defaults.apply(this.options);
-
-    if ($element && $element.is('input')) {
-      var InputCompat = require(this.get('amdBase') + 'compat/inputData');
-
-      this.options.dataAdapter = Utils.Decorate(
-        this.options.dataAdapter,
-        InputCompat
-      );
-    }
-  }
-
-  Options.prototype.fromElement = function ($e) {
-    var excludedData = ['select2'];
-
-    if (this.options.multiple == null) {
-      this.options.multiple = $e.prop('multiple');
-    }
-
-    if (this.options.disabled == null) {
-      this.options.disabled = $e.prop('disabled');
-    }
-
-    if (this.options.language == null) {
-      if ($e.prop('lang')) {
-        this.options.language = $e.prop('lang').toLowerCase();
-      } else if ($e.closest('[lang]').prop('lang')) {
-        this.options.language = $e.closest('[lang]').prop('lang');
-      }
-    }
-
-    if (this.options.dir == null) {
-      if ($e.prop('dir')) {
-        this.options.dir = $e.prop('dir');
-      } else if ($e.closest('[dir]').prop('dir')) {
-        this.options.dir = $e.closest('[dir]').prop('dir');
-      } else {
-        this.options.dir = 'ltr';
-      }
-    }
-
-    $e.prop('disabled', this.options.disabled);
-    $e.prop('multiple', this.options.multiple);
-
-    if (Utils.GetData($e[0], 'select2Tags')) {
-      if (this.options.debug && window.console && console.warn) {
-        console.warn(
-          'Select2: The `data-select2-tags` attribute has been changed to ' +
-          'use the `data-data` and `data-tags="true"` attributes and will be ' +
-          'removed in future versions of Select2.'
-        );
-      }
-
-      Utils.StoreData($e[0], 'data', Utils.GetData($e[0], 'select2Tags'));
-      Utils.StoreData($e[0], 'tags', true);
-    }
-
-    if (Utils.GetData($e[0], 'ajaxUrl')) {
-      if (this.options.debug && window.console && console.warn) {
-        console.warn(
-          'Select2: The `data-ajax-url` attribute has been changed to ' +
-          '`data-ajax--url` and support for the old attribute will be removed' +
-          ' in future versions of Select2.'
-        );
-      }
-
-      $e.attr('ajax--url', Utils.GetData($e[0], 'ajaxUrl'));
-      Utils.StoreData($e[0], 'ajax-Url', Utils.GetData($e[0], 'ajaxUrl'));
-	  
-    }
-
-    var dataset = {};
-
-    // Prefer the element's `dataset` attribute if it exists
-    // jQuery 1.x does not correctly handle data attributes with multiple dashes
-    if ($.fn.jquery && $.fn.jquery.substr(0, 2) == '1.' && $e[0].dataset) {
-      dataset = $.extend(true, {}, $e[0].dataset, Utils.GetData($e[0]));
-    } else {
-      dataset = Utils.GetData($e[0]);
-    }
-
-    var data = $.extend(true, {}, dataset);
-
-    data = Utils._convertData(data);
-
-    for (var key in data) {
-      if ($.inArray(key, excludedData) > -1) {
-        continue;
-      }
-
-      if ($.isPlainObject(this.options[key])) {
-        $.extend(this.options[key], data[key]);
-      } else {
-        this.options[key] = data[key];
-      }
-    }
-
-    return this;
-  };
-
-  Options.prototype.get = function (key) {
-    return this.options[key];
-  };
-
-  Options.prototype.set = function (key, val) {
-    this.options[key] = val;
-  };
-
-  return Options;
-});
-
-S2.define('select2/core',[
-  'jquery',
-  './options',
-  './utils',
-  './keys'
-], function ($, Options, Utils, KEYS) {
-  var Select2 = function ($element, options) {
-    if (Utils.GetData($element[0], 'select2') != null) {
-      Utils.GetData($element[0], 'select2').destroy();
-    }
-
-    this.$element = $element;
-
-    this.id = this._generateId($element);
-
-    options = options || {};
-
-    this.options = new Options(options, $element);
-
-    Select2.__super__.constructor.call(this);
-
-    // Set up the tabindex
-
-    var tabindex = $element.attr('tabindex') || 0;
-    Utils.StoreData($element[0], 'old-tabindex', tabindex);
-    $element.attr('tabindex', '-1');
-
-    // Set up containers and adapters
-
-    var DataAdapter = this.options.get('dataAdapter');
-    this.dataAdapter = new DataAdapter($element, this.options);
-
-    var $container = this.render();
-
-    this._placeContainer($container);
-
-    var SelectionAdapter = this.options.get('selectionAdapter');
-    this.selection = new SelectionAdapter($element, this.options);
-    this.$selection = this.selection.render();
-
-    this.selection.position(this.$selection, $container);
-
-    var DropdownAdapter = this.options.get('dropdownAdapter');
-    this.dropdown = new DropdownAdapter($element, this.options);
-    this.$dropdown = this.dropdown.render();
-
-    this.dropdown.position(this.$dropdown, $container);
-
-    var ResultsAdapter = this.options.get('resultsAdapter');
-    this.results = new ResultsAdapter($element, this.options, this.dataAdapter);
-    this.$results = this.results.render();
-
-    this.results.position(this.$results, this.$dropdown);
-
-    // Bind events
-
-    var self = this;
-
-    // Bind the container to all of the adapters
-    this._bindAdapters();
-
-    // Register any DOM event handlers
-    this._registerDomEvents();
-
-    // Register any internal event handlers
-    this._registerDataEvents();
-    this._registerSelectionEvents();
-    this._registerDropdownEvents();
-    this._registerResultsEvents();
-    this._registerEvents();
-
-    // Set the initial state
-    this.dataAdapter.current(function (initialData) {
-      self.trigger('selection:update', {
-        data: initialData
-      });
-    });
-
-    // Hide the original select
-    $element.addClass('select2-hidden-accessible');
-    $element.attr('aria-hidden', 'true');
-
-    // Synchronize any monitored attributes
-    this._syncAttributes();
-
-    Utils.StoreData($element[0], 'select2', this);
-
-    // Ensure backwards compatibility with $element.data('select2').
-    $element.data('select2', this);
-  };
-
-  Utils.Extend(Select2, Utils.Observable);
-
-  Select2.prototype._generateId = function ($element) {
-    var id = '';
-
-    if ($element.attr('id') != null) {
-      id = $element.attr('id');
-    } else if ($element.attr('name') != null) {
-      id = $element.attr('name') + '-' + Utils.generateChars(2);
-    } else {
-      id = Utils.generateChars(4);
-    }
-
-    id = id.replace(/(:|\.|\[|\]|,)/g, '');
-    id = 'select2-' + id;
-
-    return id;
-  };
-
-  Select2.prototype._placeContainer = function ($container) {
-    $container.insertAfter(this.$element);
-
-    var width = this._resolveWidth(this.$element, this.options.get('width'));
-
-    if (width != null) {
-      $container.css('width', width);
-    }
-  };
-
-  Select2.prototype._resolveWidth = function ($element, method) {
-    var WIDTH = /^width:(([-+]?([0-9]*\.)?[0-9]+)(px|em|ex|%|in|cm|mm|pt|pc))/i;
-
-    if (method == 'resolve') {
-      var styleWidth = this._resolveWidth($element, 'style');
-
-      if (styleWidth != null) {
-        return styleWidth;
-      }
-
-      return this._resolveWidth($element, 'element');
-    }
-
-    if (method == 'element') {
-      var elementWidth = $element.outerWidth(false);
-
-      if (elementWidth <= 0) {
-        return 'auto';
-      }
-
-      return elementWidth + 'px';
-    }
-
-    if (method == 'style') {
-      var style = $element.attr('style');
-
-      if (typeof(style) !== 'string') {
-        return null;
-      }
-
-      var attrs = style.split(';');
-
-      for (var i = 0, l = attrs.length; i < l; i = i + 1) {
-        var attr = attrs[i].replace(/\s/g, '');
-        var matches = attr.match(WIDTH);
-
-        if (matches !== null && matches.length >= 1) {
-          return matches[1];
-        }
-      }
-
-      return null;
-    }
-
-    return method;
-  };
-
-  Select2.prototype._bindAdapters = function () {
-    this.dataAdapter.bind(this, this.$container);
-    this.selection.bind(this, this.$container);
-
-    this.dropdown.bind(this, this.$container);
-    this.results.bind(this, this.$container);
-  };
-
-  Select2.prototype._registerDomEvents = function () {
-    var self = this;
-
-    this.$element.on('change.select2', function () {
-      self.dataAdapter.current(function (data) {
-        self.trigger('selection:update', {
-          data: data
-        });
-      });
-    });
-
-    this.$element.on('focus.select2', function (evt) {
-      self.trigger('focus', evt);
-    });
-
-    this._syncA = Utils.bind(this._syncAttributes, this);
-    this._syncS = Utils.bind(this._syncSubtree, this);
-
-    if (this.$element[0].attachEvent) {
-      this.$element[0].attachEvent('onpropertychange', this._syncA);
-    }
-
-    var observer = window.MutationObserver ||
-      window.WebKitMutationObserver ||
-      window.MozMutationObserver
-    ;
-
-    if (observer != null) {
-      this._observer = new observer(function (mutations) {
-        $.each(mutations, self._syncA);
-        $.each(mutations, self._syncS);
-      });
-      this._observer.observe(this.$element[0], {
-        attributes: true,
-        childList: true,
-        subtree: false
-      });
-    } else if (this.$element[0].addEventListener) {
-      this.$element[0].addEventListener(
-        'DOMAttrModified',
-        self._syncA,
-        false
-      );
-      this.$element[0].addEventListener(
-        'DOMNodeInserted',
-        self._syncS,
-        false
-      );
-      this.$element[0].addEventListener(
-        'DOMNodeRemoved',
-        self._syncS,
-        false
-      );
-    }
-  };
-
-  Select2.prototype._registerDataEvents = function () {
-    var self = this;
-
-    this.dataAdapter.on('*', function (name, params) {
-      self.trigger(name, params);
-    });
-  };
-
-  Select2.prototype._registerSelectionEvents = function () {
-    var self = this;
-    var nonRelayEvents = ['toggle', 'focus'];
-
-    this.selection.on('toggle', function () {
-      self.toggleDropdown();
-    });
-
-    this.selection.on('focus', function (params) {
-      self.focus(params);
-    });
-
-    this.selection.on('*', function (name, params) {
-      if ($.inArray(name, nonRelayEvents) !== -1) {
-        return;
-      }
-
-      self.trigger(name, params);
-    });
-  };
-
-  Select2.prototype._registerDropdownEvents = function () {
-    var self = this;
-
-    this.dropdown.on('*', function (name, params) {
-      self.trigger(name, params);
-    });
-  };
-
-  Select2.prototype._registerResultsEvents = function () {
-    var self = this;
-
-    this.results.on('*', function (name, params) {
-      self.trigger(name, params);
-    });
-  };
-
-  Select2.prototype._registerEvents = function () {
-    var self = this;
-
-    this.on('open', function () {
-      self.$container.addClass('select2-container--open');
-    });
-
-    this.on('close', function () {
-      self.$container.removeClass('select2-container--open');
-    });
-
-    this.on('enable', function () {
-      self.$container.removeClass('select2-container--disabled');
-    });
-
-    this.on('disable', function () {
-      self.$container.addClass('select2-container--disabled');
-    });
-
-    this.on('blur', function () {
-      self.$container.removeClass('select2-container--focus');
-    });
-
-    this.on('query', function (params) {
-      if (!self.isOpen()) {
-        self.trigger('open', {});
-      }
-
-      this.dataAdapter.query(params, function (data) {
-        self.trigger('results:all', {
-          data: data,
-          query: params
-        });
-      });
-    });
-
-    this.on('query:append', function (params) {
-      this.dataAdapter.query(params, function (data) {
-        self.trigger('results:append', {
-          data: data,
-          query: params
-        });
-      });
-    });
-
-    this.on('keypress', function (evt) {
-      var key = evt.which;
-
-      if (self.isOpen()) {
-        if (key === KEYS.ESC || key === KEYS.TAB ||
-            (key === KEYS.UP && evt.altKey)) {
-          self.close();
-
-          evt.preventDefault();
-        } else if (key === KEYS.ENTER) {
-          self.trigger('results:select', {});
-
-          evt.preventDefault();
-        } else if ((key === KEYS.SPACE && evt.ctrlKey)) {
-          self.trigger('results:toggle', {});
-
-          evt.preventDefault();
-        } else if (key === KEYS.UP) {
-          self.trigger('results:previous', {});
-
-          evt.preventDefault();
-        } else if (key === KEYS.DOWN) {
-          self.trigger('results:next', {});
-
-          evt.preventDefault();
-        }
-      } else {
-        if (key === KEYS.ENTER || key === KEYS.SPACE ||
-            (key === KEYS.DOWN && evt.altKey)) {
-          self.open();
-
-          evt.preventDefault();
-        }
-      }
-    });
-  };
-
-  Select2.prototype._syncAttributes = function () {
-    this.options.set('disabled', this.$element.prop('disabled'));
-
-    if (this.options.get('disabled')) {
-      if (this.isOpen()) {
-        this.close();
-      }
-
-      this.trigger('disable', {});
-    } else {
-      this.trigger('enable', {});
-    }
-  };
-
-  Select2.prototype._syncSubtree = function (evt, mutations) {
-    var changed = false;
-    var self = this;
-
-    // Ignore any mutation events raised for elements that aren't options or
-    // optgroups. This handles the case when the select element is destroyed
-    if (
-      evt && evt.target && (
-        evt.target.nodeName !== 'OPTION' && evt.target.nodeName !== 'OPTGROUP'
-      )
-    ) {
-      return;
-    }
-
-    if (!mutations) {
-      // If mutation events aren't supported, then we can only assume that the
-      // change affected the selections
-      changed = true;
-    } else if (mutations.addedNodes && mutations.addedNodes.length > 0) {
-      for (var n = 0; n < mutations.addedNodes.length; n++) {
-        var node = mutations.addedNodes[n];
-
-        if (node.selected) {
-          changed = true;
-        }
-      }
-    } else if (mutations.removedNodes && mutations.removedNodes.length > 0) {
-      changed = true;
-    }
-
-    // Only re-pull the data if we think there is a change
-    if (changed) {
-      this.dataAdapter.current(function (currentData) {
-        self.trigger('selection:update', {
-          data: currentData
-        });
-      });
-    }
-  };
-
-  /**
-   * Override the trigger method to automatically trigger pre-events when
-   * there are events that can be prevented.
-   */
-  Select2.prototype.trigger = function (name, args) {
-    var actualTrigger = Select2.__super__.trigger;
-    var preTriggerMap = {
-      'open': 'opening',
-      'close': 'closing',
-      'select': 'selecting',
-      'unselect': 'unselecting',
-      'clear': 'clearing'
-    };
-
-    if (args === undefined) {
-      args = {};
-    }
-
-    if (name in preTriggerMap) {
-      var preTriggerName = preTriggerMap[name];
-      var preTriggerArgs = {
-        prevented: false,
-        name: name,
-        args: args
-      };
-
-      actualTrigger.call(this, preTriggerName, preTriggerArgs);
-
-      if (preTriggerArgs.prevented) {
-        args.prevented = true;
-
-        return;
-      }
-    }
-
-    actualTrigger.call(this, name, args);
-  };
-
-  Select2.prototype.toggleDropdown = function () {
-    if (this.options.get('disabled')) {
-      return;
-    }
-
-    if (this.isOpen()) {
-      this.close();
-    } else {
-      this.open();
-    }
-  };
-
-  Select2.prototype.open = function () {
-    if (this.isOpen()) {
-      return;
-    }
-
-    this.trigger('query', {});
-  };
-
-  Select2.prototype.close = function () {
-    if (!this.isOpen()) {
-      return;
-    }
-
-    this.trigger('close', {});
-  };
-
-  Select2.prototype.isOpen = function () {
-    return this.$container.hasClass('select2-container--open');
-  };
-
-  Select2.prototype.hasFocus = function () {
-    return this.$container.hasClass('select2-container--focus');
-  };
-
-  Select2.prototype.focus = function (data) {
-    // No need to re-trigger focus events if we are already focused
-    if (this.hasFocus()) {
-      return;
-    }
-
-    this.$container.addClass('select2-container--focus');
-    this.trigger('focus', {});
-  };
-
-  Select2.prototype.enable = function (args) {
-    if (this.options.get('debug') && window.console && console.warn) {
-      console.warn(
-        'Select2: The `select2("enable")` method has been deprecated and will' +
-        ' be removed in later Select2 versions. Use $element.prop("disabled")' +
-        ' instead.'
-      );
-    }
-
-    if (args == null || args.length === 0) {
-      args = [true];
-    }
-
-    var disabled = !args[0];
-
-    this.$element.prop('disabled', disabled);
-  };
-
-  Select2.prototype.data = function () {
-    if (this.options.get('debug') &&
-        arguments.length > 0 && window.console && console.warn) {
-      console.warn(
-        'Select2: Data can no longer be set using `select2("data")`. You ' +
-        'should consider setting the value instead using `$element.val()`.'
-      );
-    }
-
-    var data = [];
-
-    this.dataAdapter.current(function (currentData) {
-      data = currentData;
-    });
-
-    return data;
-  };
-
-  Select2.prototype.val = function (args) {
-    if (this.options.get('debug') && window.console && console.warn) {
-      console.warn(
-        'Select2: The `select2("val")` method has been deprecated and will be' +
-        ' removed in later Select2 versions. Use $element.val() instead.'
-      );
-    }
-
-    if (args == null || args.length === 0) {
-      return this.$element.val();
-    }
-
-    var newVal = args[0];
-
-    if ($.isArray(newVal)) {
-      newVal = $.map(newVal, function (obj) {
-        return obj.toString();
-      });
-    }
-
-    this.$element.val(newVal).trigger('change');
-  };
-
-  Select2.prototype.destroy = function () {
-    this.$container.remove();
-
-    if (this.$element[0].detachEvent) {
-      this.$element[0].detachEvent('onpropertychange', this._syncA);
-    }
-
-    if (this._observer != null) {
-      this._observer.disconnect();
-      this._observer = null;
-    } else if (this.$element[0].removeEventListener) {
-      this.$element[0]
-        .removeEventListener('DOMAttrModified', this._syncA, false);
-      this.$element[0]
-        .removeEventListener('DOMNodeInserted', this._syncS, false);
-      this.$element[0]
-        .removeEventListener('DOMNodeRemoved', this._syncS, false);
-    }
-
-    this._syncA = null;
-    this._syncS = null;
-
-    this.$element.off('.select2');
-    this.$element.attr('tabindex',
-    Utils.GetData(this.$element[0], 'old-tabindex'));
-
-    this.$element.removeClass('select2-hidden-accessible');
-    this.$element.attr('aria-hidden', 'false');
-    Utils.RemoveData(this.$element[0]);
-    this.$element.removeData('select2');
-
-    this.dataAdapter.destroy();
-    this.selection.destroy();
-    this.dropdown.destroy();
-    this.results.destroy();
-
-    this.dataAdapter = null;
-    this.selection = null;
-    this.dropdown = null;
-    this.results = null;
-  };
-
-  Select2.prototype.render = function () {
-    var $container = $(
-      '<span class="select2 select2-container">' +
-        '<span class="selection"></span>' +
-        '<span class="dropdown-wrapper" aria-hidden="true"></span>' +
-      '</span>'
-    );
-
-    $container.attr('dir', this.options.get('dir'));
-
-    this.$container = $container;
-
-    this.$container.addClass('select2-container--' + this.options.get('theme'));
-
-    Utils.StoreData($container[0], 'element', this.$element);
-
-    return $container;
-  };
-
-  return Select2;
-});
-
-S2.define('select2/compat/utils',[
-  'jquery'
-], function ($) {
-  function syncCssClasses ($dest, $src, adapter) {
-    var classes, replacements = [], adapted;
-
-    classes = $.trim($dest.attr('class'));
-
-    if (classes) {
-      classes = '' + classes; // for IE which returns object
-
-      $(classes.split(/\s+/)).each(function () {
-        // Save all Select2 classes
-        if (this.indexOf('select2-') === 0) {
-          replacements.push(this);
-        }
-      });
-    }
-
-    classes = $.trim($src.attr('class'));
-
-    if (classes) {
-      classes = '' + classes; // for IE which returns object
-
-      $(classes.split(/\s+/)).each(function () {
-        // Only adapt non-Select2 classes
-        if (this.indexOf('select2-') !== 0) {
-          adapted = adapter(this);
-
-          if (adapted != null) {
-            replacements.push(adapted);
-          }
-        }
-      });
-    }
-
-    $dest.attr('class', replacements.join(' '));
-  }
-
-  return {
-    syncCssClasses: syncCssClasses
-  };
-});
-
-S2.define('select2/compat/containerCss',[
-  'jquery',
-  './utils'
-], function ($, CompatUtils) {
-  // No-op CSS adapter that discards all classes by default
-  function _containerAdapter (clazz) {
-    return null;
-  }
-
-  function ContainerCSS () { }
-
-  ContainerCSS.prototype.render = function (decorated) {
-    var $container = decorated.call(this);
-
-    var containerCssClass = this.options.get('containerCssClass') || '';
-
-    if ($.isFunction(containerCssClass)) {
-      containerCssClass = containerCssClass(this.$element);
-    }
-
-    var containerCssAdapter = this.options.get('adaptContainerCssClass');
-    containerCssAdapter = containerCssAdapter || _containerAdapter;
-
-    if (containerCssClass.indexOf(':all:') !== -1) {
-      containerCssClass = containerCssClass.replace(':all:', '');
-
-      var _cssAdapter = containerCssAdapter;
-
-      containerCssAdapter = function (clazz) {
-        var adapted = _cssAdapter(clazz);
-
-        if (adapted != null) {
-          // Append the old one along with the adapted one
-          return adapted + ' ' + clazz;
-        }
-
-        return clazz;
-      };
-    }
-
-    var containerCss = this.options.get('containerCss') || {};
-
-    if ($.isFunction(containerCss)) {
-      containerCss = containerCss(this.$element);
-    }
-
-    CompatUtils.syncCssClasses($container, this.$element, containerCssAdapter);
-
-    $container.css(containerCss);
-    $container.addClass(containerCssClass);
-
-    return $container;
-  };
-
-  return ContainerCSS;
-});
-
-S2.define('select2/compat/dropdownCss',[
-  'jquery',
-  './utils'
-], function ($, CompatUtils) {
-  // No-op CSS adapter that discards all classes by default
-  function _dropdownAdapter (clazz) {
-    return null;
-  }
-
-  function DropdownCSS () { }
-
-  DropdownCSS.prototype.render = function (decorated) {
-    var $dropdown = decorated.call(this);
-
-    var dropdownCssClass = this.options.get('dropdownCssClass') || '';
-
-    if ($.isFunction(dropdownCssClass)) {
-      dropdownCssClass = dropdownCssClass(this.$element);
-    }
-
-    var dropdownCssAdapter = this.options.get('adaptDropdownCssClass');
-    dropdownCssAdapter = dropdownCssAdapter || _dropdownAdapter;
-
-    if (dropdownCssClass.indexOf(':all:') !== -1) {
-      dropdownCssClass = dropdownCssClass.replace(':all:', '');
-
-      var _cssAdapter = dropdownCssAdapter;
-
-      dropdownCssAdapter = function (clazz) {
-        var adapted = _cssAdapter(clazz);
-
-        if (adapted != null) {
-          // Append the old one along with the adapted one
-          return adapted + ' ' + clazz;
-        }
-
-        return clazz;
-      };
-    }
-
-    var dropdownCss = this.options.get('dropdownCss') || {};
-
-    if ($.isFunction(dropdownCss)) {
-      dropdownCss = dropdownCss(this.$element);
-    }
-
-    CompatUtils.syncCssClasses($dropdown, this.$element, dropdownCssAdapter);
-
-    $dropdown.css(dropdownCss);
-    $dropdown.addClass(dropdownCssClass);
-
-    return $dropdown;
-  };
-
-  return DropdownCSS;
-});
-
-S2.define('select2/compat/initSelection',[
-  'jquery'
-], function ($) {
-  function InitSelection (decorated, $element, options) {
-    if (options.get('debug') && window.console && console.warn) {
-      console.warn(
-        'Select2: The `initSelection` option has been deprecated in favor' +
-        ' of a custom data adapter that overrides the `current` method. ' +
-        'This method is now called multiple times instead of a single ' +
-        'time when the instance is initialized. Support will be removed ' +
-        'for the `initSelection` option in future versions of Select2'
-      );
-    }
-
-    this.initSelection = options.get('initSelection');
-    this._isInitialized = false;
-
-    decorated.call(this, $element, options);
-  }
-
-  InitSelection.prototype.current = function (decorated, callback) {
-    var self = this;
-
-    if (this._isInitialized) {
-      decorated.call(this, callback);
-
-      return;
-    }
-
-    this.initSelection.call(null, this.$element, function (data) {
-      self._isInitialized = true;
-
-      if (!$.isArray(data)) {
-        data = [data];
-      }
-
-      callback(data);
-    });
-  };
-
-  return InitSelection;
-});
-
-S2.define('select2/compat/inputData',[
-  'jquery',
-  '../utils'
-], function ($, Utils) {
-  function InputData (decorated, $element, options) {
-    this._currentData = [];
-    this._valueSeparator = options.get('valueSeparator') || ',';
-
-    if ($element.prop('type') === 'hidden') {
-      if (options.get('debug') && console && console.warn) {
-        console.warn(
-          'Select2: Using a hidden input with Select2 is no longer ' +
-          'supported and may stop working in the future. It is recommended ' +
-          'to use a `<select>` element instead.'
-        );
-      }
-    }
-
-    decorated.call(this, $element, options);
-  }
-
-  InputData.prototype.current = function (_, callback) {
-    function getSelected (data, selectedIds) {
-      var selected = [];
-
-      if (data.selected || $.inArray(data.id, selectedIds) !== -1) {
-        data.selected = true;
-        selected.push(data);
-      } else {
-        data.selected = false;
-      }
-
-      if (data.children) {
-        selected.push.apply(selected, getSelected(data.children, selectedIds));
-      }
-
-      return selected;
-    }
-
-    var selected = [];
-
-    for (var d = 0; d < this._currentData.length; d++) {
-      var data = this._currentData[d];
-
-      selected.push.apply(
-        selected,
-        getSelected(
-          data,
-          this.$element.val().split(
-            this._valueSeparator
-          )
-        )
-      );
-    }
-
-    callback(selected);
-  };
-
-  InputData.prototype.select = function (_, data) {
-    if (!this.options.get('multiple')) {
-      this.current(function (allData) {
-        $.map(allData, function (data) {
-          data.selected = false;
-        });
-      });
-
-      this.$element.val(data.id);
-      this.$element.trigger('change');
-    } else {
-      var value = this.$element.val();
-      value += this._valueSeparator + data.id;
-
-      this.$element.val(value);
-      this.$element.trigger('change');
-    }
-  };
-
-  InputData.prototype.unselect = function (_, data) {
-    var self = this;
-
-    data.selected = false;
-
-    this.current(function (allData) {
-      var values = [];
-
-      for (var d = 0; d < allData.length; d++) {
-        var item = allData[d];
-
-        if (data.id == item.id) {
-          continue;
-        }
-
-        values.push(item.id);
-      }
-
-      self.$element.val(values.join(self._valueSeparator));
-      self.$element.trigger('change');
-    });
-  };
-
-  InputData.prototype.query = function (_, params, callback) {
-    var results = [];
-
-    for (var d = 0; d < this._currentData.length; d++) {
-      var data = this._currentData[d];
-
-      var matches = this.matches(params, data);
-
-      if (matches !== null) {
-        results.push(matches);
-      }
-    }
-
-    callback({
-      results: results
-    });
-  };
-
-  InputData.prototype.addOptions = function (_, $options) {
-    var options = $.map($options, function ($option) {
-      return Utils.GetData($option[0], 'data');
-    });
-
-    this._currentData.push.apply(this._currentData, options);
-  };
-
-  return InputData;
-});
-
-S2.define('select2/compat/matcher',[
-  'jquery'
-], function ($) {
-  function oldMatcher (matcher) {
-    function wrappedMatcher (params, data) {
-      var match = $.extend(true, {}, data);
-
-      if (params.term == null || $.trim(params.term) === '') {
-        return match;
-      }
-
-      if (data.children) {
-        for (var c = data.children.length - 1; c >= 0; c--) {
-          var child = data.children[c];
-
-          // Check if the child object matches
-          // The old matcher returned a boolean true or false
-          var doesMatch = matcher(params.term, child.text, child);
-
-          // If the child didn't match, pop it off
-          if (!doesMatch) {
-            match.children.splice(c, 1);
-          }
-        }
-
-        if (match.children.length > 0) {
-          return match;
-        }
-      }
-
-      if (matcher(params.term, data.text, data)) {
-        return match;
-      }
-
-      return null;
-    }
-
-    return wrappedMatcher;
-  }
-
-  return oldMatcher;
-});
-
-S2.define('select2/compat/query',[
-
-], function () {
-  function Query (decorated, $element, options) {
-    if (options.get('debug') && window.console && console.warn) {
-      console.warn(
-        'Select2: The `query` option has been deprecated in favor of a ' +
-        'custom data adapter that overrides the `query` method. Support ' +
-        'will be removed for the `query` option in future versions of ' +
-        'Select2.'
-      );
-    }
-
-    decorated.call(this, $element, options);
-  }
-
-  Query.prototype.query = function (_, params, callback) {
-    params.callback = callback;
-
-    var query = this.options.get('query');
-
-    query.call(null, params);
-  };
-
-  return Query;
-});
-
-S2.define('select2/dropdown/attachContainer',[
-
-], function () {
-  function AttachContainer (decorated, $element, options) {
-    decorated.call(this, $element, options);
-  }
-
-  AttachContainer.prototype.position =
-    function (decorated, $dropdown, $container) {
-    var $dropdownContainer = $container.find('.dropdown-wrapper');
-    $dropdownContainer.append($dropdown);
-
-    $dropdown.addClass('select2-dropdown--below');
-    $container.addClass('select2-container--below');
-  };
-
-  return AttachContainer;
-});
-
-S2.define('select2/dropdown/stopPropagation',[
-
-], function () {
-  function StopPropagation () { }
-
-  StopPropagation.prototype.bind = function (decorated, container, $container) {
-    decorated.call(this, container, $container);
-
-    var stoppedEvents = [
-    'blur',
-    'change',
-    'click',
-    'dblclick',
-    'focus',
-    'focusin',
-    'focusout',
-    'input',
-    'keydown',
-    'keyup',
-    'keypress',
-    'mousedown',
-    'mouseenter',
-    'mouseleave',
-    'mousemove',
-    'mouseover',
-    'mouseup',
-    'search',
-    'touchend',
-    'touchstart'
-    ];
-
-    this.$dropdown.on(stoppedEvents.join(' '), function (evt) {
-      evt.stopPropagation();
-    });
-  };
-
-  return StopPropagation;
-});
-
-S2.define('select2/selection/stopPropagation',[
-
-], function () {
-  function StopPropagation () { }
-
-  StopPropagation.prototype.bind = function (decorated, container, $container) {
-    decorated.call(this, container, $container);
-
-    var stoppedEvents = [
-      'blur',
-      'change',
-      'click',
-      'dblclick',
-      'focus',
-      'focusin',
-      'focusout',
-      'input',
-      'keydown',
-      'keyup',
-      'keypress',
-      'mousedown',
-      'mouseenter',
-      'mouseleave',
-      'mousemove',
-      'mouseover',
-      'mouseup',
-      'search',
-      'touchend',
-      'touchstart'
-    ];
-
-    this.$selection.on(stoppedEvents.join(' '), function (evt) {
-      evt.stopPropagation();
-    });
-  };
-
-  return StopPropagation;
-});
-
-/*!
- * jQuery Mousewheel 3.1.13
- *
- * Copyright jQuery Foundation and other contributors
- * Released under the MIT license
- * http://jquery.org/license
- */
-
-(function (factory) {
-    if ( typeof S2.define === 'function' && S2.define.amd ) {
-        // AMD. Register as an anonymous module.
-        S2.define('jquery-mousewheel',['jquery'], factory);
-    } else if (typeof exports === 'object') {
-        // Node/CommonJS style for Browserify
-        module.exports = factory;
-    } else {
-        // Browser globals
-        factory(jQuery);
-    }
-}(function ($) {
-
-    var toFix  = ['wheel', 'mousewheel', 'DOMMouseScroll', 'MozMousePixelScroll'],
-        toBind = ( 'onwheel' in document || document.documentMode >= 9 ) ?
-                    ['wheel'] : ['mousewheel', 'DomMouseScroll', 'MozMousePixelScroll'],
-        slice  = Array.prototype.slice,
-        nullLowestDeltaTimeout, lowestDelta;
-
-    if ( $.event.fixHooks ) {
-        for ( var i = toFix.length; i; ) {
-            $.event.fixHooks[ toFix[--i] ] = $.event.mouseHooks;
-        }
-    }
-
-    var special = $.event.special.mousewheel = {
-        version: '3.1.12',
-
-        setup: function() {
-            if ( this.addEventListener ) {
-                for ( var i = toBind.length; i; ) {
-                    this.addEventListener( toBind[--i], handler, false );
-                }
-            } else {
-                this.onmousewheel = handler;
-            }
-            // Store the line height and page height for this particular element
-            $.data(this, 'mousewheel-line-height', special.getLineHeight(this));
-            $.data(this, 'mousewheel-page-height', special.getPageHeight(this));
-        },
-
-        teardown: function() {
-            if ( this.removeEventListener ) {
-                for ( var i = toBind.length; i; ) {
-                    this.removeEventListener( toBind[--i], handler, false );
-                }
-            } else {
-                this.onmousewheel = null;
-            }
-            // Clean up the data we added to the element
-            $.removeData(this, 'mousewheel-line-height');
-            $.removeData(this, 'mousewheel-page-height');
-        },
-
-        getLineHeight: function(elem) {
-            var $elem = $(elem),
-                $parent = $elem['offsetParent' in $.fn ? 'offsetParent' : 'parent']();
-            if (!$parent.length) {
-                $parent = $('body');
-            }
-            return parseInt($parent.css('fontSize'), 10) || parseInt($elem.css('fontSize'), 10) || 16;
-        },
-
-        getPageHeight: function(elem) {
-            return $(elem).height();
-        },
-
-        settings: {
-            adjustOldDeltas: true, // see shouldAdjustOldDeltas() below
-            normalizeOffset: true  // calls getBoundingClientRect for each event
-        }
-    };
-
-    $.fn.extend({
-        mousewheel: function(fn) {
-            return fn ? this.bind('mousewheel', fn) : this.trigger('mousewheel');
-        },
-
-        unmousewheel: function(fn) {
-            return this.unbind('mousewheel', fn);
-        }
-    });
-
-
-    function handler(event) {
-        var orgEvent   = event || window.event,
-            args       = slice.call(arguments, 1),
-            delta      = 0,
-            deltaX     = 0,
-            deltaY     = 0,
-            absDelta   = 0,
-            offsetX    = 0,
-            offsetY    = 0;
-        event = $.event.fix(orgEvent);
-        event.type = 'mousewheel';
-
-        // Old school scrollwheel delta
-        if ( 'detail'      in orgEvent ) { deltaY = orgEvent.detail * -1;      }
-        if ( 'wheelDelta'  in orgEvent ) { deltaY = orgEvent.wheelDelta;       }
-        if ( 'wheelDeltaY' in orgEvent ) { deltaY = orgEvent.wheelDeltaY;      }
-        if ( 'wheelDeltaX' in orgEvent ) { deltaX = orgEvent.wheelDeltaX * -1; }
-
-        // Firefox < 17 horizontal scrolling related to DOMMouseScroll event
-        if ( 'axis' in orgEvent && orgEvent.axis === orgEvent.HORIZONTAL_AXIS ) {
-            deltaX = deltaY * -1;
-            deltaY = 0;
-        }
-
-        // Set delta to be deltaY or deltaX if deltaY is 0 for backwards compatabilitiy
-        delta = deltaY === 0 ? deltaX : deltaY;
-
-        // New school wheel delta (wheel event)
-        if ( 'deltaY' in orgEvent ) {
-            deltaY = orgEvent.deltaY * -1;
-            delta  = deltaY;
-        }
-        if ( 'deltaX' in orgEvent ) {
-            deltaX = orgEvent.deltaX;
-            if ( deltaY === 0 ) { delta  = deltaX * -1; }
-        }
-
-        // No change actually happened, no reason to go any further
-        if ( deltaY === 0 && deltaX === 0 ) { return; }
-
-        // Need to convert lines and pages to pixels if we aren't already in pixels
-        // There are three delta modes:
-        //   * deltaMode 0 is by pixels, nothing to do
-        //   * deltaMode 1 is by lines
-        //   * deltaMode 2 is by pages
-        if ( orgEvent.deltaMode === 1 ) {
-            var lineHeight = $.data(this, 'mousewheel-line-height');
-            delta  *= lineHeight;
-            deltaY *= lineHeight;
-            deltaX *= lineHeight;
-        } else if ( orgEvent.deltaMode === 2 ) {
-            var pageHeight = $.data(this, 'mousewheel-page-height');
-            delta  *= pageHeight;
-            deltaY *= pageHeight;
-            deltaX *= pageHeight;
-        }
-
-        // Store lowest absolute delta to normalize the delta values
-        absDelta = Math.max( Math.abs(deltaY), Math.abs(deltaX) );
-
-        if ( !lowestDelta || absDelta < lowestDelta ) {
-            lowestDelta = absDelta;
-
-            // Adjust older deltas if necessary
-            if ( shouldAdjustOldDeltas(orgEvent, absDelta) ) {
-                lowestDelta /= 40;
-            }
-        }
-
-        // Adjust older deltas if necessary
-        if ( shouldAdjustOldDeltas(orgEvent, absDelta) ) {
-            // Divide all the things by 40!
-            delta  /= 40;
-            deltaX /= 40;
-            deltaY /= 40;
-        }
-
-        // Get a whole, normalized value for the deltas
-        delta  = Math[ delta  >= 1 ? 'floor' : 'ceil' ](delta  / lowestDelta);
-        deltaX = Math[ deltaX >= 1 ? 'floor' : 'ceil' ](deltaX / lowestDelta);
-        deltaY = Math[ deltaY >= 1 ? 'floor' : 'ceil' ](deltaY / lowestDelta);
-
-        // Normalise offsetX and offsetY properties
-        if ( special.settings.normalizeOffset && this.getBoundingClientRect ) {
-            var boundingRect = this.getBoundingClientRect();
-            offsetX = event.clientX - boundingRect.left;
-            offsetY = event.clientY - boundingRect.top;
-        }
-
-        // Add information to the event object
-        event.deltaX = deltaX;
-        event.deltaY = deltaY;
-        event.deltaFactor = lowestDelta;
-        event.offsetX = offsetX;
-        event.offsetY = offsetY;
-        // Go ahead and set deltaMode to 0 since we converted to pixels
-        // Although this is a little odd since we overwrite the deltaX/Y
-        // properties with normalized deltas.
-        event.deltaMode = 0;
-
-        // Add event and delta to the front of the arguments
-        args.unshift(event, delta, deltaX, deltaY);
-
-        // Clearout lowestDelta after sometime to better
-        // handle multiple device types that give different
-        // a different lowestDelta
-        // Ex: trackpad = 3 and mouse wheel = 120
-        if (nullLowestDeltaTimeout) { clearTimeout(nullLowestDeltaTimeout); }
-        nullLowestDeltaTimeout = setTimeout(nullLowestDelta, 200);
-
-        return ($.event.dispatch || $.event.handle).apply(this, args);
-    }
-
-    function nullLowestDelta() {
-        lowestDelta = null;
-    }
-
-    function shouldAdjustOldDeltas(orgEvent, absDelta) {
-        // If this is an older event and the delta is divisable by 120,
-        // then we are assuming that the browser is treating this as an
-        // older mouse wheel event and that we should divide the deltas
-        // by 40 to try and get a more usable deltaFactor.
-        // Side note, this actually impacts the reported scroll distance
-        // in older browsers and can cause scrolling to be slower than native.
-        // Turn this off by setting $.event.special.mousewheel.settings.adjustOldDeltas to false.
-        return special.settings.adjustOldDeltas && orgEvent.type === 'mousewheel' && absDelta % 120 === 0;
-    }
-
-}));
-
-S2.define('jquery.select2',[
-  'jquery',
-  'jquery-mousewheel',
-
-  './select2/core',
-  './select2/defaults',
-  './select2/utils'
-], function ($, _, Select2, Defaults, Utils) {
-  if ($.fn.select2 == null) {
-    // All methods that should return the element
-    var thisMethods = ['open', 'close', 'destroy'];
-
-    $.fn.select2 = function (options) {
-      options = options || {};
-
-      if (typeof options === 'object') {
-        this.each(function () {
-          var instanceOptions = $.extend(true, {}, options);
-
-          var instance = new Select2($(this), instanceOptions);
-        });
-
-        return this;
-      } else if (typeof options === 'string') {
-        var ret;
-        var args = Array.prototype.slice.call(arguments, 1);
-
-        this.each(function () {
-          var instance = Utils.GetData(this, 'select2');
-
-          if (instance == null && window.console && console.error) {
-            console.error(
-              'The select2(\'' + options + '\') method was called on an ' +
-              'element that is not using Select2.'
-            );
-          }
-
-          ret = instance[options].apply(instance, args);
-        });
-
-        // Check if we should be returning `this`
-        if ($.inArray(options, thisMethods) > -1) {
-          return this;
-        }
-
-        return ret;
-      } else {
-        throw new Error('Invalid arguments for Select2: ' + options);
-      }
-    };
-  }
-
-  if ($.fn.select2.defaults == null) {
-    $.fn.select2.defaults = Defaults;
-  }
-
-  return Select2;
-});
-
-  // Return the AMD loader configuration so it can be used outside of this file
-  return {
-    define: S2.define,
-    require: S2.require
-  };
-}());
-
-  // Autoload the jQuery bindings
-  // We know that all of the modules exist above this, so we're safe
-  var select2 = S2.require('jquery.select2');
-
-  // Hold the AMD module references on the jQuery function that was just loaded
-  // This allows Select2 to use the internal loader outside of this file, such
-  // as in the language files.
-  jQuery.fn.select2.amd = S2;
-
-  // Return the Select2 instance for anyone who is importing it.
-  return select2;
-}));
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/FancySelects/select2-4.0.6-rc.1-dist/js/select2.full.min.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/FancySelects/select2-4.0.6-rc.1-dist/js/select2.full.min.js
deleted file mode 100644
index b64efeb..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/FancySelects/select2-4.0.6-rc.1-dist/js/select2.full.min.js
+++ /dev/null
@@ -1 +0,0 @@
-/*! Select2 4.0.6-rc.1 | https://github.com/select2/select2/blob/master/LICENSE.md */!function(a){"function"==typeof define&&define.amd?define(["jquery"],a):"object"==typeof module&&module.exports?module.exports=function(b,c){return void 0===c&&(c="undefined"!=typeof window?require("jquery"):require("jquery")(b)),a(c),c}:a(jQuery)}(function(a){var b=function(){if(a&&a.fn&&a.fn.select2&&a.fn.select2.amd)var b=a.fn.select2.amd;var b;return function(){if(!b||!b.requirejs){b?c=b:b={};var a,c,d;!function(b){function e(a,b){return v.call(a,b)}function f(a,b){var c,d,e,f,g,h,i,j,k,l,m,n,o=b&&b.split("/"),p=t.map,q=p&&p["*"]||{};if(a){for(a=a.split("/"),g=a.length-1,t.nodeIdCompat&&x.test(a[g])&&(a[g]=a[g].replace(x,"")),"."===a[0].charAt(0)&&o&&(n=o.slice(0,o.length-1),a=n.concat(a)),k=0;k<a.length;k++)if("."===(m=a[k]))a.splice(k,1),k-=1;else if(".."===m){if(0===k||1===k&&".."===a[2]||".."===a[k-1])continue;k>0&&(a.splice(k-1,2),k-=2)}a=a.join("/")}if((o||q)&&p){for(c=a.split("/"),k=c.length;k>0;k-=1){if(d=c.slice(0,k).join("/"),o)for(l=o.length;l>0;l-=1)if((e=p[o.slice(0,l).join("/")])&&(e=e[d])){f=e,h=k;break}if(f)break;!i&&q&&q[d]&&(i=q[d],j=k)}!f&&i&&(f=i,h=j),f&&(c.splice(0,h,f),a=c.join("/"))}return a}function g(a,c){return function(){var d=w.call(arguments,0);return"string"!=typeof d[0]&&1===d.length&&d.push(null),o.apply(b,d.concat([a,c]))}}function h(a){return function(b){return f(b,a)}}function i(a){return function(b){r[a]=b}}function j(a){if(e(s,a)){var c=s[a];delete s[a],u[a]=!0,n.apply(b,c)}if(!e(r,a)&&!e(u,a))throw new Error("No "+a);return r[a]}function k(a){var b,c=a?a.indexOf("!"):-1;return c>-1&&(b=a.substring(0,c),a=a.substring(c+1,a.length)),[b,a]}function l(a){return a?k(a):[]}function m(a){return function(){return t&&t.config&&t.config[a]||{}}}var n,o,p,q,r={},s={},t={},u={},v=Object.prototype.hasOwnProperty,w=[].slice,x=/\.js$/;p=function(a,b){var c,d=k(a),e=d[0],g=b[1];return a=d[1],e&&(e=f(e,g),c=j(e)),e?a=c&&c.normalize?c.normalize(a,h(g)):f(a,g):(a=f(a,g),d=k(a),e=d[0],a=d[1],e&&(c=j(e))),{f:e?e+"!"+a:a,n:a,pr:e,p:c}},q={require:function(a){return g(a)},exports:function(a){var b=r[a];return void 0!==b?b:r[a]={}},module:function(a){return{id:a,uri:"",exports:r[a],config:m(a)}}},n=function(a,c,d,f){var h,k,m,n,o,t,v,w=[],x=typeof d;if(f=f||a,t=l(f),"undefined"===x||"function"===x){for(c=!c.length&&d.length?["require","exports","module"]:c,o=0;o<c.length;o+=1)if(n=p(c[o],t),"require"===(k=n.f))w[o]=q.require(a);else if("exports"===k)w[o]=q.exports(a),v=!0;else if("module"===k)h=w[o]=q.module(a);else if(e(r,k)||e(s,k)||e(u,k))w[o]=j(k);else{if(!n.p)throw new Error(a+" missing "+k);n.p.load(n.n,g(f,!0),i(k),{}),w[o]=r[k]}m=d?d.apply(r[a],w):void 0,a&&(h&&h.exports!==b&&h.exports!==r[a]?r[a]=h.exports:m===b&&v||(r[a]=m))}else a&&(r[a]=d)},a=c=o=function(a,c,d,e,f){if("string"==typeof a)return q[a]?q[a](c):j(p(a,l(c)).f);if(!a.splice){if(t=a,t.deps&&o(t.deps,t.callback),!c)return;c.splice?(a=c,c=d,d=null):a=b}return c=c||function(){},"function"==typeof d&&(d=e,e=f),e?n(b,a,c,d):setTimeout(function(){n(b,a,c,d)},4),o},o.config=function(a){return o(a)},a._defined=r,d=function(a,b,c){if("string"!=typeof a)throw new Error("See almond README: incorrect module build, no module name");b.splice||(c=b,b=[]),e(r,a)||e(s,a)||(s[a]=[a,b,c])},d.amd={jQuery:!0}}(),b.requirejs=a,b.require=c,b.define=d}}(),b.define("almond",function(){}),b.define("jquery",[],function(){var b=a||$;return null==b&&console&&console.error&&console.error("Select2: An instance of jQuery or a jQuery-compatible library was not found. Make sure that you are including jQuery before Select2 on your web page."),b}),b.define("select2/utils",["jquery"],function(a){function b(a){var b=a.prototype,c=[];for(var d in b){"function"==typeof b[d]&&("constructor"!==d&&c.push(d))}return c}var c={};c.Extend=function(a,b){function c(){this.constructor=a}var d={}.hasOwnProperty;for(var e in b)d.call(b,e)&&(a[e]=b[e]);return c.prototype=b.prototype,a.prototype=new c,a.__super__=b.prototype,a},c.Decorate=function(a,c){function d(){var b=Array.prototype.unshift,d=c.prototype.constructor.length,e=a.prototype.constructor;d>0&&(b.call(arguments,a.prototype.constructor),e=c.prototype.constructor),e.apply(this,arguments)}function e(){this.constructor=d}var f=b(c),g=b(a);c.displayName=a.displayName,d.prototype=new e;for(var h=0;h<g.length;h++){var i=g[h];d.prototype[i]=a.prototype[i]}for(var j=(function(a){var b=function(){};a in d.prototype&&(b=d.prototype[a]);var e=c.prototype[a];return function(){return Array.prototype.unshift.call(arguments,b),e.apply(this,arguments)}}),k=0;k<f.length;k++){var l=f[k];d.prototype[l]=j(l)}return d};var d=function(){this.listeners={}};d.prototype.on=function(a,b){this.listeners=this.listeners||{},a in this.listeners?this.listeners[a].push(b):this.listeners[a]=[b]},d.prototype.trigger=function(a){var b=Array.prototype.slice,c=b.call(arguments,1);this.listeners=this.listeners||{},null==c&&(c=[]),0===c.length&&c.push({}),c[0]._type=a,a in this.listeners&&this.invoke(this.listeners[a],b.call(arguments,1)),"*"in this.listeners&&this.invoke(this.listeners["*"],arguments)},d.prototype.invoke=function(a,b){for(var c=0,d=a.length;c<d;c++)a[c].apply(this,b)},c.Observable=d,c.generateChars=function(a){for(var b="",c=0;c<a;c++){b+=Math.floor(36*Math.random()).toString(36)}return b},c.bind=function(a,b){return function(){a.apply(b,arguments)}},c._convertData=function(a){for(var b in a){var c=b.split("-"),d=a;if(1!==c.length){for(var e=0;e<c.length;e++){var f=c[e];f=f.substring(0,1).toLowerCase()+f.substring(1),f in d||(d[f]={}),e==c.length-1&&(d[f]=a[b]),d=d[f]}delete a[b]}}return a},c.hasScroll=function(b,c){var d=a(c),e=c.style.overflowX,f=c.style.overflowY;return(e!==f||"hidden"!==f&&"visible"!==f)&&("scroll"===e||"scroll"===f||(d.innerHeight()<c.scrollHeight||d.innerWidth()<c.scrollWidth))},c.escapeMarkup=function(a){var b={"\\":"&#92;","&":"&amp;","<":"&lt;",">":"&gt;",'"':"&quot;","'":"&#39;","/":"&#47;"};return"string"!=typeof a?a:String(a).replace(/[&<>"'\/\\]/g,function(a){return b[a]})},c.appendMany=function(b,c){if("1.7"===a.fn.jquery.substr(0,3)){var d=a();a.map(c,function(a){d=d.add(a)}),c=d}b.append(c)},c.__cache={};var e=0;return c.GetUniqueElementId=function(a){var b=a.getAttribute("data-select2-id");return null==b&&(a.id?(b=a.id,a.setAttribute("data-select2-id",b)):(a.setAttribute("data-select2-id",++e),b=e.toString())),b},c.StoreData=function(a,b,d){var e=c.GetUniqueElementId(a);c.__cache[e]||(c.__cache[e]={}),c.__cache[e][b]=d},c.GetData=function(b,d){var e=c.GetUniqueElementId(b);return d?c.__cache[e]&&null!=c.__cache[e][d]?c.__cache[e][d]:a(b).data(d):c.__cache[e]},c.RemoveData=function(a){var b=c.GetUniqueElementId(a);null!=c.__cache[b]&&delete c.__cache[b]},c}),b.define("select2/results",["jquery","./utils"],function(a,b){function c(a,b,d){this.$element=a,this.data=d,this.options=b,c.__super__.constructor.call(this)}return b.Extend(c,b.Observable),c.prototype.render=function(){var b=a('<ul class="select2-results__options" role="tree"></ul>');return this.options.get("multiple")&&b.attr("aria-multiselectable","true"),this.$results=b,b},c.prototype.clear=function(){this.$results.empty()},c.prototype.displayMessage=function(b){var c=this.options.get("escapeMarkup");this.clear(),this.hideLoading();var d=a('<li role="treeitem" aria-live="assertive" class="select2-results__option"></li>'),e=this.options.get("translations").get(b.message);d.append(c(e(b.args))),d[0].className+=" select2-results__message",this.$results.append(d)},c.prototype.hideMessages=function(){this.$results.find(".select2-results__message").remove()},c.prototype.append=function(a){this.hideLoading();var b=[];if(null==a.results||0===a.results.length)return void(0===this.$results.children().length&&this.trigger("results:message",{message:"noResults"}));a.results=this.sort(a.results);for(var c=0;c<a.results.length;c++){var d=a.results[c],e=this.option(d);b.push(e)}this.$results.append(b)},c.prototype.position=function(a,b){b.find(".select2-results").append(a)},c.prototype.sort=function(a){return this.options.get("sorter")(a)},c.prototype.highlightFirstItem=function(){var a=this.$results.find(".select2-results__option[aria-selected]"),b=a.filter("[aria-selected=true]");b.length>0?b.first().trigger("mouseenter"):a.first().trigger("mouseenter"),this.ensureHighlightVisible()},c.prototype.setClasses=function(){var c=this;this.data.current(function(d){var e=a.map(d,function(a){return a.id.toString()});c.$results.find(".select2-results__option[aria-selected]").each(function(){var c=a(this),d=b.GetData(this,"data"),f=""+d.id;null!=d.element&&d.element.selected||null==d.element&&a.inArray(f,e)>-1?c.attr("aria-selected","true"):c.attr("aria-selected","false")})})},c.prototype.showLoading=function(a){this.hideLoading();var b=this.options.get("translations").get("searching"),c={disabled:!0,loading:!0,text:b(a)},d=this.option(c);d.className+=" loading-results",this.$results.prepend(d)},c.prototype.hideLoading=function(){this.$results.find(".loading-results").remove()},c.prototype.option=function(c){var d=document.createElement("li");d.className="select2-results__option";var e={role:"treeitem","aria-selected":"false"};c.disabled&&(delete e["aria-selected"],e["aria-disabled"]="true"),null==c.id&&delete e["aria-selected"],null!=c._resultId&&(d.id=c._resultId),c.title&&(d.title=c.title),c.children&&(e.role="group",e["aria-label"]=c.text,delete e["aria-selected"]);for(var f in e){var g=e[f];d.setAttribute(f,g)}if(c.children){var h=a(d),i=document.createElement("strong");i.className="select2-results__group";a(i);this.template(c,i);for(var j=[],k=0;k<c.children.length;k++){var l=c.children[k],m=this.option(l);j.push(m)}var n=a("<ul></ul>",{class:"select2-results__options select2-results__options--nested"});n.append(j),h.append(i),h.append(n)}else this.template(c,d);return b.StoreData(d,"data",c),d},c.prototype.bind=function(c,d){var e=this,f=c.id+"-results";this.$results.attr("id",f),c.on("results:all",function(a){e.clear(),e.append(a.data),c.isOpen()&&(e.setClasses(),e.highlightFirstItem())}),c.on("results:append",function(a){e.append(a.data),c.isOpen()&&e.setClasses()}),c.on("query",function(a){e.hideMessages(),e.showLoading(a)}),c.on("select",function(){c.isOpen()&&(e.setClasses(),e.highlightFirstItem())}),c.on("unselect",function(){c.isOpen()&&(e.setClasses(),e.highlightFirstItem())}),c.on("open",function(){e.$results.attr("aria-expanded","true"),e.$results.attr("aria-hidden","false"),e.setClasses(),e.ensureHighlightVisible()}),c.on("close",function(){e.$results.attr("aria-expanded","false"),e.$results.attr("aria-hidden","true"),e.$results.removeAttr("aria-activedescendant")}),c.on("results:toggle",function(){var a=e.getHighlightedResults();0!==a.length&&a.trigger("mouseup")}),c.on("results:select",function(){var a=e.getHighlightedResults();if(0!==a.length){var c=b.GetData(a[0],"data");"true"==a.attr("aria-selected")?e.trigger("close",{}):e.trigger("select",{data:c})}}),c.on("results:previous",function(){var a=e.getHighlightedResults(),b=e.$results.find("[aria-selected]"),c=b.index(a);if(!(c<=0)){var d=c-1;0===a.length&&(d=0);var f=b.eq(d);f.trigger("mouseenter");var g=e.$results.offset().top,h=f.offset().top,i=e.$results.scrollTop()+(h-g);0===d?e.$results.scrollTop(0):h-g<0&&e.$results.scrollTop(i)}}),c.on("results:next",function(){var a=e.getHighlightedResults(),b=e.$results.find("[aria-selected]"),c=b.index(a),d=c+1;if(!(d>=b.length)){var f=b.eq(d);f.trigger("mouseenter");var g=e.$results.offset().top+e.$results.outerHeight(!1),h=f.offset().top+f.outerHeight(!1),i=e.$results.scrollTop()+h-g;0===d?e.$results.scrollTop(0):h>g&&e.$results.scrollTop(i)}}),c.on("results:focus",function(a){a.element.addClass("select2-results__option--highlighted")}),c.on("results:message",function(a){e.displayMessage(a)}),a.fn.mousewheel&&this.$results.on("mousewheel",function(a){var b=e.$results.scrollTop(),c=e.$results.get(0).scrollHeight-b+a.deltaY,d=a.deltaY>0&&b-a.deltaY<=0,f=a.deltaY<0&&c<=e.$results.height();d?(e.$results.scrollTop(0),a.preventDefault(),a.stopPropagation()):f&&(e.$results.scrollTop(e.$results.get(0).scrollHeight-e.$results.height()),a.preventDefault(),a.stopPropagation())}),this.$results.on("mouseup",".select2-results__option[aria-selected]",function(c){var d=a(this),f=b.GetData(this,"data");if("true"===d.attr("aria-selected"))return void(e.options.get("multiple")?e.trigger("unselect",{originalEvent:c,data:f}):e.trigger("close",{}));e.trigger("select",{originalEvent:c,data:f})}),this.$results.on("mouseenter",".select2-results__option[aria-selected]",function(c){var d=b.GetData(this,"data");e.getHighlightedResults().removeClass("select2-results__option--highlighted"),e.trigger("results:focus",{data:d,element:a(this)})})},c.prototype.getHighlightedResults=function(){return this.$results.find(".select2-results__option--highlighted")},c.prototype.destroy=function(){this.$results.remove()},c.prototype.ensureHighlightVisible=function(){var a=this.getHighlightedResults();if(0!==a.length){var b=this.$results.find("[aria-selected]"),c=b.index(a),d=this.$results.offset().top,e=a.offset().top,f=this.$results.scrollTop()+(e-d),g=e-d;f-=2*a.outerHeight(!1),c<=2?this.$results.scrollTop(0):(g>this.$results.outerHeight()||g<0)&&this.$results.scrollTop(f)}},c.prototype.template=function(b,c){var d=this.options.get("templateResult"),e=this.options.get("escapeMarkup"),f=d(b,c);null==f?c.style.display="none":"string"==typeof f?c.innerHTML=e(f):a(c).append(f)},c}),b.define("select2/keys",[],function(){return{BACKSPACE:8,TAB:9,ENTER:13,SHIFT:16,CTRL:17,ALT:18,ESC:27,SPACE:32,PAGE_UP:33,PAGE_DOWN:34,END:35,HOME:36,LEFT:37,UP:38,RIGHT:39,DOWN:40,DELETE:46}}),b.define("select2/selection/base",["jquery","../utils","../keys"],function(a,b,c){function d(a,b){this.$element=a,this.options=b,d.__super__.constructor.call(this)}return b.Extend(d,b.Observable),d.prototype.render=function(){var c=a('<span class="select2-selection" role="combobox"  aria-haspopup="true" aria-expanded="false"></span>');return this._tabindex=0,null!=b.GetData(this.$element[0],"old-tabindex")?this._tabindex=b.GetData(this.$element[0],"old-tabindex"):null!=this.$element.attr("tabindex")&&(this._tabindex=this.$element.attr("tabindex")),c.attr("title",this.$element.attr("title")),c.attr("tabindex",this._tabindex),this.$selection=c,c},d.prototype.bind=function(a,b){var d=this,e=(a.id,a.id+"-results");this.container=a,this.$selection.on("focus",function(a){d.trigger("focus",a)}),this.$selection.on("blur",function(a){d._handleBlur(a)}),this.$selection.on("keydown",function(a){d.trigger("keypress",a),a.which===c.SPACE&&a.preventDefault()}),a.on("results:focus",function(a){d.$selection.attr("aria-activedescendant",a.data._resultId)}),a.on("selection:update",function(a){d.update(a.data)}),a.on("open",function(){d.$selection.attr("aria-expanded","true"),d.$selection.attr("aria-owns",e),d._attachCloseHandler(a)}),a.on("close",function(){d.$selection.attr("aria-expanded","false"),d.$selection.removeAttr("aria-activedescendant"),d.$selection.removeAttr("aria-owns"),d.$selection.focus(),window.setTimeout(function(){d.$selection.focus()},0),d._detachCloseHandler(a)}),a.on("enable",function(){d.$selection.attr("tabindex",d._tabindex)}),a.on("disable",function(){d.$selection.attr("tabindex","-1")})},d.prototype._handleBlur=function(b){var c=this;window.setTimeout(function(){document.activeElement==c.$selection[0]||a.contains(c.$selection[0],document.activeElement)||c.trigger("blur",b)},1)},d.prototype._attachCloseHandler=function(c){a(document.body).on("mousedown.select2."+c.id,function(c){var d=a(c.target),e=d.closest(".select2");a(".select2.select2-container--open").each(function(){a(this),this!=e[0]&&b.GetData(this,"element").select2("close")})})},d.prototype._detachCloseHandler=function(b){a(document.body).off("mousedown.select2."+b.id)},d.prototype.position=function(a,b){b.find(".selection").append(a)},d.prototype.destroy=function(){this._detachCloseHandler(this.container)},d.prototype.update=function(a){throw new Error("The `update` method must be defined in child classes.")},d}),b.define("select2/selection/single",["jquery","./base","../utils","../keys"],function(a,b,c,d){function e(){e.__super__.constructor.apply(this,arguments)}return c.Extend(e,b),e.prototype.render=function(){var a=e.__super__.render.call(this);return a.addClass("select2-selection--single"),a.html('<span class="select2-selection__rendered"></span><span class="select2-selection__arrow" role="presentation"><b role="presentation"></b></span>'),a},e.prototype.bind=function(a,b){var c=this;e.__super__.bind.apply(this,arguments);var d=a.id+"-container";this.$selection.find(".select2-selection__rendered").attr("id",d).attr("role","textbox").attr("aria-readonly","true"),this.$selection.attr("aria-labelledby",d),this.$selection.on("mousedown",function(a){1===a.which&&c.trigger("toggle",{originalEvent:a})}),this.$selection.on("focus",function(a){}),this.$selection.on("blur",function(a){}),a.on("focus",function(b){a.isOpen()||c.$selection.focus()})},e.prototype.clear=function(){var a=this.$selection.find(".select2-selection__rendered");a.empty(),a.removeAttr("title")},e.prototype.display=function(a,b){var c=this.options.get("templateSelection");return this.options.get("escapeMarkup")(c(a,b))},e.prototype.selectionContainer=function(){return a("<span></span>")},e.prototype.update=function(a){if(0===a.length)return void this.clear();var b=a[0],c=this.$selection.find(".select2-selection__rendered"),d=this.display(b,c);c.empty().append(d),c.attr("title",b.title||b.text)},e}),b.define("select2/selection/multiple",["jquery","./base","../utils"],function(a,b,c){function d(a,b){d.__super__.constructor.apply(this,arguments)}return c.Extend(d,b),d.prototype.render=function(){var a=d.__super__.render.call(this);return a.addClass("select2-selection--multiple"),a.html('<ul class="select2-selection__rendered"></ul>'),a},d.prototype.bind=function(b,e){var f=this;d.__super__.bind.apply(this,arguments),this.$selection.on("click",function(a){f.trigger("toggle",{originalEvent:a})}),this.$selection.on("click",".select2-selection__choice__remove",function(b){if(!f.options.get("disabled")){var d=a(this),e=d.parent(),g=c.GetData(e[0],"data");f.trigger("unselect",{originalEvent:b,data:g})}})},d.prototype.clear=function(){var a=this.$selection.find(".select2-selection__rendered");a.empty(),a.removeAttr("title")},d.prototype.display=function(a,b){var c=this.options.get("templateSelection");return this.options.get("escapeMarkup")(c(a,b))},d.prototype.selectionContainer=function(){return a('<li class="select2-selection__choice"><span class="select2-selection__choice__remove" role="presentation">&times;</span></li>')},d.prototype.update=function(a){if(this.clear(),0!==a.length){for(var b=[],d=0;d<a.length;d++){var e=a[d],f=this.selectionContainer(),g=this.display(e,f);f.append(g),f.attr("title",e.title||e.text),c.StoreData(f[0],"data",e),b.push(f)}var h=this.$selection.find(".select2-selection__rendered");c.appendMany(h,b)}},d}),b.define("select2/selection/placeholder",["../utils"],function(a){function b(a,b,c){this.placeholder=this.normalizePlaceholder(c.get("placeholder")),a.call(this,b,c)}return b.prototype.normalizePlaceholder=function(a,b){return"string"==typeof b&&(b={id:"",text:b}),b},b.prototype.createPlaceholder=function(a,b){var c=this.selectionContainer();return c.html(this.display(b)),c.addClass("select2-selection__placeholder").removeClass("select2-selection__choice"),c},b.prototype.update=function(a,b){var c=1==b.length&&b[0].id!=this.placeholder.id;if(b.length>1||c)return a.call(this,b);this.clear();var d=this.createPlaceholder(this.placeholder);this.$selection.find(".select2-selection__rendered").append(d)},b}),b.define("select2/selection/allowClear",["jquery","../keys","../utils"],function(a,b,c){function d(){}return d.prototype.bind=function(a,b,c){var d=this;a.call(this,b,c),null==this.placeholder&&this.options.get("debug")&&window.console&&console.error&&console.error("Select2: The `allowClear` option should be used in combination with the `placeholder` option."),this.$selection.on("mousedown",".select2-selection__clear",function(a){d._handleClear(a)}),b.on("keypress",function(a){d._handleKeyboardClear(a,b)})},d.prototype._handleClear=function(a,b){if(!this.options.get("disabled")){var d=this.$selection.find(".select2-selection__clear");if(0!==d.length){b.stopPropagation();var e=c.GetData(d[0],"data"),f=this.$element.val();this.$element.val(this.placeholder.id);var g={data:e};if(this.trigger("clear",g),g.prevented)return void this.$element.val(f);for(var h=0;h<e.length;h++)if(g={data:e[h]},this.trigger("unselect",g),g.prevented)return void this.$element.val(f);this.$element.trigger("change"),this.trigger("toggle",{})}}},d.prototype._handleKeyboardClear=function(a,c,d){d.isOpen()||c.which!=b.DELETE&&c.which!=b.BACKSPACE||this._handleClear(c)},d.prototype.update=function(b,d){if(b.call(this,d),!(this.$selection.find(".select2-selection__placeholder").length>0||0===d.length)){var e=a('<span class="select2-selection__clear">&times;</span>');c.StoreData(e[0],"data",d),this.$selection.find(".select2-selection__rendered").prepend(e)}},d}),b.define("select2/selection/search",["jquery","../utils","../keys"],function(a,b,c){function d(a,b,c){a.call(this,b,c)}return d.prototype.render=function(b){var c=a('<li class="select2-search select2-search--inline"><input class="select2-search__field" type="search" tabindex="-1" autocomplete="off" autocorrect="off" autocapitalize="none" spellcheck="false" role="textbox" aria-autocomplete="list" /></li>');this.$searchContainer=c,this.$search=c.find("input");var d=b.call(this);return this._transferTabIndex(),d},d.prototype.bind=function(a,d,e){var f=this;a.call(this,d,e),d.on("open",function(){f.$search.trigger("focus")}),d.on("close",function(){f.$search.val(""),f.$search.removeAttr("aria-activedescendant"),f.$search.trigger("focus")}),d.on("enable",function(){f.$search.prop("disabled",!1),f._transferTabIndex()}),d.on("disable",function(){f.$search.prop("disabled",!0)}),d.on("focus",function(a){f.$search.trigger("focus")}),d.on("results:focus",function(a){f.$search.attr("aria-activedescendant",a.id)}),this.$selection.on("focusin",".select2-search--inline",function(a){f.trigger("focus",a)}),this.$selection.on("focusout",".select2-search--inline",function(a){f._handleBlur(a)}),this.$selection.on("keydown",".select2-search--inline",function(a){if(a.stopPropagation(),f.trigger("keypress",a),f._keyUpPrevented=a.isDefaultPrevented(),a.which===c.BACKSPACE&&""===f.$search.val()){var d=f.$searchContainer.prev(".select2-selection__choice");if(d.length>0){var e=b.GetData(d[0],"data");f.searchRemoveChoice(e),a.preventDefault()}}});var g=document.documentMode,h=g&&g<=11;this.$selection.on("input.searchcheck",".select2-search--inline",function(a){if(h)return void f.$selection.off("input.search input.searchcheck");f.$selection.off("keyup.search")}),this.$selection.on("keyup.search input.search",".select2-search--inline",function(a){if(h&&"input"===a.type)return void f.$selection.off("input.search input.searchcheck");var b=a.which;b!=c.SHIFT&&b!=c.CTRL&&b!=c.ALT&&b!=c.TAB&&f.handleSearch(a)})},d.prototype._transferTabIndex=function(a){this.$search.attr("tabindex",this.$selection.attr("tabindex")),this.$selection.attr("tabindex","-1")},d.prototype.createPlaceholder=function(a,b){this.$search.attr("placeholder",b.text)},d.prototype.update=function(a,b){var c=this.$search[0]==document.activeElement;if(this.$search.attr("placeholder",""),a.call(this,b),this.$selection.find(".select2-selection__rendered").append(this.$searchContainer),this.resizeSearch(),c){this.$element.find("[data-select2-tag]").length?this.$element.focus():this.$search.focus()}},d.prototype.handleSearch=function(){if(this.resizeSearch(),!this._keyUpPrevented){var a=this.$search.val();this.trigger("query",{term:a})}this._keyUpPrevented=!1},d.prototype.searchRemoveChoice=function(a,b){this.trigger("unselect",{data:b}),this.$search.val(b.text),this.handleSearch()},d.prototype.resizeSearch=function(){this.$search.css("width","25px");var a="";if(""!==this.$search.attr("placeholder"))a=this.$selection.find(".select2-selection__rendered").innerWidth();else{a=.75*(this.$search.val().length+1)+"em"}this.$search.css("width",a)},d}),b.define("select2/selection/eventRelay",["jquery"],function(a){function b(){}return b.prototype.bind=function(b,c,d){var e=this,f=["open","opening","close","closing","select","selecting","unselect","unselecting","clear","clearing"],g=["opening","closing","selecting","unselecting","clearing"];b.call(this,c,d),c.on("*",function(b,c){if(-1!==a.inArray(b,f)){c=c||{};var d=a.Event("select2:"+b,{params:c});e.$element.trigger(d),-1!==a.inArray(b,g)&&(c.prevented=d.isDefaultPrevented())}})},b}),b.define("select2/translation",["jquery","require"],function(a,b){function c(a){this.dict=a||{}}return c.prototype.all=function(){return this.dict},c.prototype.get=function(a){return this.dict[a]},c.prototype.extend=function(b){this.dict=a.extend({},b.all(),this.dict)},c._cache={},c.loadPath=function(a){if(!(a in c._cache)){var d=b(a);c._cache[a]=d}return new c(c._cache[a])},c}),b.define("select2/diacritics",[],function(){return{"Ⓐ":"A","A":"A","À":"A","Á":"A","Â":"A","Ầ":"A","Ấ":"A","Ẫ":"A","Ẩ":"A","Ã":"A","Ā":"A","Ă":"A","Ằ":"A","Ắ":"A","Ẵ":"A","Ẳ":"A","Ȧ":"A","Ǡ":"A","Ä":"A","Ǟ":"A","Ả":"A","Å":"A","Ǻ":"A","Ǎ":"A","Ȁ":"A","Ȃ":"A","Ạ":"A","Ậ":"A","Ặ":"A","Ḁ":"A","Ą":"A","Ⱥ":"A","Ɐ":"A","Ꜳ":"AA","Æ":"AE","Ǽ":"AE","Ǣ":"AE","Ꜵ":"AO","Ꜷ":"AU","Ꜹ":"AV","Ꜻ":"AV","Ꜽ":"AY","Ⓑ":"B","B":"B","Ḃ":"B","Ḅ":"B","Ḇ":"B","Ƀ":"B","Ƃ":"B","Ɓ":"B","Ⓒ":"C","C":"C","Ć":"C","Ĉ":"C","Ċ":"C","Č":"C","Ç":"C","Ḉ":"C","Ƈ":"C","Ȼ":"C","Ꜿ":"C","Ⓓ":"D","D":"D","Ḋ":"D","Ď":"D","Ḍ":"D","Ḑ":"D","Ḓ":"D","Ḏ":"D","Đ":"D","Ƌ":"D","Ɗ":"D","Ɖ":"D","Ꝺ":"D","DZ":"DZ","DŽ":"DZ","Dz":"Dz","Dž":"Dz","Ⓔ":"E","E":"E","È":"E","É":"E","Ê":"E","Ề":"E","Ế":"E","Ễ":"E","Ể":"E","Ẽ":"E","Ē":"E","Ḕ":"E","Ḗ":"E","Ĕ":"E","Ė":"E","Ë":"E","Ẻ":"E","Ě":"E","Ȅ":"E","Ȇ":"E","Ẹ":"E","Ệ":"E","Ȩ":"E","Ḝ":"E","Ę":"E","Ḙ":"E","Ḛ":"E","Ɛ":"E","Ǝ":"E","Ⓕ":"F","F":"F","Ḟ":"F","Ƒ":"F","Ꝼ":"F","Ⓖ":"G","G":"G","Ǵ":"G","Ĝ":"G","Ḡ":"G","Ğ":"G","Ġ":"G","Ǧ":"G","Ģ":"G","Ǥ":"G","Ɠ":"G","Ꞡ":"G","Ᵹ":"G","Ꝿ":"G","Ⓗ":"H","H":"H","Ĥ":"H","Ḣ":"H","Ḧ":"H","Ȟ":"H","Ḥ":"H","Ḩ":"H","Ḫ":"H","Ħ":"H","Ⱨ":"H","Ⱶ":"H","Ɥ":"H","Ⓘ":"I","I":"I","Ì":"I","Í":"I","Î":"I","Ĩ":"I","Ī":"I","Ĭ":"I","İ":"I","Ï":"I","Ḯ":"I","Ỉ":"I","Ǐ":"I","Ȉ":"I","Ȋ":"I","Ị":"I","Į":"I","Ḭ":"I","Ɨ":"I","Ⓙ":"J","J":"J","Ĵ":"J","Ɉ":"J","Ⓚ":"K","K":"K","Ḱ":"K","Ǩ":"K","Ḳ":"K","Ķ":"K","Ḵ":"K","Ƙ":"K","Ⱪ":"K","Ꝁ":"K","Ꝃ":"K","Ꝅ":"K","Ꞣ":"K","Ⓛ":"L","L":"L","Ŀ":"L","Ĺ":"L","Ľ":"L","Ḷ":"L","Ḹ":"L","Ļ":"L","Ḽ":"L","Ḻ":"L","Ł":"L","Ƚ":"L","Ɫ":"L","Ⱡ":"L","Ꝉ":"L","Ꝇ":"L","Ꞁ":"L","LJ":"LJ","Lj":"Lj","Ⓜ":"M","M":"M","Ḿ":"M","Ṁ":"M","Ṃ":"M","Ɱ":"M","Ɯ":"M","Ⓝ":"N","N":"N","Ǹ":"N","Ń":"N","Ñ":"N","Ṅ":"N","Ň":"N","Ṇ":"N","Ņ":"N","Ṋ":"N","Ṉ":"N","Ƞ":"N","Ɲ":"N","Ꞑ":"N","Ꞥ":"N","NJ":"NJ","Nj":"Nj","Ⓞ":"O","O":"O","Ò":"O","Ó":"O","Ô":"O","Ồ":"O","Ố":"O","Ỗ":"O","Ổ":"O","Õ":"O","Ṍ":"O","Ȭ":"O","Ṏ":"O","Ō":"O","Ṑ":"O","Ṓ":"O","Ŏ":"O","Ȯ":"O","Ȱ":"O","Ö":"O","Ȫ":"O","Ỏ":"O","Ő":"O","Ǒ":"O","Ȍ":"O","Ȏ":"O","Ơ":"O","Ờ":"O","Ớ":"O","Ỡ":"O","Ở":"O","Ợ":"O","Ọ":"O","Ộ":"O","Ǫ":"O","Ǭ":"O","Ø":"O","Ǿ":"O","Ɔ":"O","Ɵ":"O","Ꝋ":"O","Ꝍ":"O","Ƣ":"OI","Ꝏ":"OO","Ȣ":"OU","Ⓟ":"P","P":"P","Ṕ":"P","Ṗ":"P","Ƥ":"P","Ᵽ":"P","Ꝑ":"P","Ꝓ":"P","Ꝕ":"P","Ⓠ":"Q","Q":"Q","Ꝗ":"Q","Ꝙ":"Q","Ɋ":"Q","Ⓡ":"R","R":"R","Ŕ":"R","Ṙ":"R","Ř":"R","Ȑ":"R","Ȓ":"R","Ṛ":"R","Ṝ":"R","Ŗ":"R","Ṟ":"R","Ɍ":"R","Ɽ":"R","Ꝛ":"R","Ꞧ":"R","Ꞃ":"R","Ⓢ":"S","S":"S","ẞ":"S","Ś":"S","Ṥ":"S","Ŝ":"S","Ṡ":"S","Š":"S","Ṧ":"S","Ṣ":"S","Ṩ":"S","Ș":"S","Ş":"S","Ȿ":"S","Ꞩ":"S","Ꞅ":"S","Ⓣ":"T","T":"T","Ṫ":"T","Ť":"T","Ṭ":"T","Ț":"T","Ţ":"T","Ṱ":"T","Ṯ":"T","Ŧ":"T","Ƭ":"T","Ʈ":"T","Ⱦ":"T","Ꞇ":"T","Ꜩ":"TZ","Ⓤ":"U","U":"U","Ù":"U","Ú":"U","Û":"U","Ũ":"U","Ṹ":"U","Ū":"U","Ṻ":"U","Ŭ":"U","Ü":"U","Ǜ":"U","Ǘ":"U","Ǖ":"U","Ǚ":"U","Ủ":"U","Ů":"U","Ű":"U","Ǔ":"U","Ȕ":"U","Ȗ":"U","Ư":"U","Ừ":"U","Ứ":"U","Ữ":"U","Ử":"U","Ự":"U","Ụ":"U","Ṳ":"U","Ų":"U","Ṷ":"U","Ṵ":"U","Ʉ":"U","Ⓥ":"V","V":"V","Ṽ":"V","Ṿ":"V","Ʋ":"V","Ꝟ":"V","Ʌ":"V","Ꝡ":"VY","Ⓦ":"W","W":"W","Ẁ":"W","Ẃ":"W","Ŵ":"W","Ẇ":"W","Ẅ":"W","Ẉ":"W","Ⱳ":"W","Ⓧ":"X","X":"X","Ẋ":"X","Ẍ":"X","Ⓨ":"Y","Y":"Y","Ỳ":"Y","Ý":"Y","Ŷ":"Y","Ỹ":"Y","Ȳ":"Y","Ẏ":"Y","Ÿ":"Y","Ỷ":"Y","Ỵ":"Y","Ƴ":"Y","Ɏ":"Y","Ỿ":"Y","Ⓩ":"Z","Z":"Z","Ź":"Z","Ẑ":"Z","Ż":"Z","Ž":"Z","Ẓ":"Z","Ẕ":"Z","Ƶ":"Z","Ȥ":"Z","Ɀ":"Z","Ⱬ":"Z","Ꝣ":"Z","ⓐ":"a","a":"a","ẚ":"a","à":"a","á":"a","â":"a","ầ":"a","ấ":"a","ẫ":"a","ẩ":"a","ã":"a","ā":"a","ă":"a","ằ":"a","ắ":"a","ẵ":"a","ẳ":"a","ȧ":"a","ǡ":"a","ä":"a","ǟ":"a","ả":"a","å":"a","ǻ":"a","ǎ":"a","ȁ":"a","ȃ":"a","ạ":"a","ậ":"a","ặ":"a","ḁ":"a","ą":"a","ⱥ":"a","ɐ":"a","ꜳ":"aa","æ":"ae","ǽ":"ae","ǣ":"ae","ꜵ":"ao","ꜷ":"au","ꜹ":"av","ꜻ":"av","ꜽ":"ay","ⓑ":"b","b":"b","ḃ":"b","ḅ":"b","ḇ":"b","ƀ":"b","ƃ":"b","ɓ":"b","ⓒ":"c","c":"c","ć":"c","ĉ":"c","ċ":"c","č":"c","ç":"c","ḉ":"c","ƈ":"c","ȼ":"c","ꜿ":"c","ↄ":"c","ⓓ":"d","d":"d","ḋ":"d","ď":"d","ḍ":"d","ḑ":"d","ḓ":"d","ḏ":"d","đ":"d","ƌ":"d","ɖ":"d","ɗ":"d","ꝺ":"d","dz":"dz","dž":"dz","ⓔ":"e","e":"e","è":"e","é":"e","ê":"e","ề":"e","ế":"e","ễ":"e","ể":"e","ẽ":"e","ē":"e","ḕ":"e","ḗ":"e","ĕ":"e","ė":"e","ë":"e","ẻ":"e","ě":"e","ȅ":"e","ȇ":"e","ẹ":"e","ệ":"e","ȩ":"e","ḝ":"e","ę":"e","ḙ":"e","ḛ":"e","ɇ":"e","ɛ":"e","ǝ":"e","ⓕ":"f","f":"f","ḟ":"f","ƒ":"f","ꝼ":"f","ⓖ":"g","g":"g","ǵ":"g","ĝ":"g","ḡ":"g","ğ":"g","ġ":"g","ǧ":"g","ģ":"g","ǥ":"g","ɠ":"g","ꞡ":"g","ᵹ":"g","ꝿ":"g","ⓗ":"h","h":"h","ĥ":"h","ḣ":"h","ḧ":"h","ȟ":"h","ḥ":"h","ḩ":"h","ḫ":"h","ẖ":"h","ħ":"h","ⱨ":"h","ⱶ":"h","ɥ":"h","ƕ":"hv","ⓘ":"i","i":"i","ì":"i","í":"i","î":"i","ĩ":"i","ī":"i","ĭ":"i","ï":"i","ḯ":"i","ỉ":"i","ǐ":"i","ȉ":"i","ȋ":"i","ị":"i","į":"i","ḭ":"i","ɨ":"i","ı":"i","ⓙ":"j","j":"j","ĵ":"j","ǰ":"j","ɉ":"j","ⓚ":"k","k":"k","ḱ":"k","ǩ":"k","ḳ":"k","ķ":"k","ḵ":"k","ƙ":"k","ⱪ":"k","ꝁ":"k","ꝃ":"k","ꝅ":"k","ꞣ":"k","ⓛ":"l","l":"l","ŀ":"l","ĺ":"l","ľ":"l","ḷ":"l","ḹ":"l","ļ":"l","ḽ":"l","ḻ":"l","ſ":"l","ł":"l","ƚ":"l","ɫ":"l","ⱡ":"l","ꝉ":"l","ꞁ":"l","ꝇ":"l","lj":"lj","ⓜ":"m","m":"m","ḿ":"m","ṁ":"m","ṃ":"m","ɱ":"m","ɯ":"m","ⓝ":"n","n":"n","ǹ":"n","ń":"n","ñ":"n","ṅ":"n","ň":"n","ṇ":"n","ņ":"n","ṋ":"n","ṉ":"n","ƞ":"n","ɲ":"n","ʼn":"n","ꞑ":"n","ꞥ":"n","nj":"nj","ⓞ":"o","o":"o","ò":"o","ó":"o","ô":"o","ồ":"o","ố":"o","ỗ":"o","ổ":"o","õ":"o","ṍ":"o","ȭ":"o","ṏ":"o","ō":"o","ṑ":"o","ṓ":"o","ŏ":"o","ȯ":"o","ȱ":"o","ö":"o","ȫ":"o","ỏ":"o","ő":"o","ǒ":"o","ȍ":"o","ȏ":"o","ơ":"o","ờ":"o","ớ":"o","ỡ":"o","ở":"o","ợ":"o","ọ":"o","ộ":"o","ǫ":"o","ǭ":"o","ø":"o","ǿ":"o","ɔ":"o","ꝋ":"o","ꝍ":"o","ɵ":"o","ƣ":"oi","ȣ":"ou","ꝏ":"oo","ⓟ":"p","p":"p","ṕ":"p","ṗ":"p","ƥ":"p","ᵽ":"p","ꝑ":"p","ꝓ":"p","ꝕ":"p","ⓠ":"q","q":"q","ɋ":"q","ꝗ":"q","ꝙ":"q","ⓡ":"r","r":"r","ŕ":"r","ṙ":"r","ř":"r","ȑ":"r","ȓ":"r","ṛ":"r","ṝ":"r","ŗ":"r","ṟ":"r","ɍ":"r","ɽ":"r","ꝛ":"r","ꞧ":"r","ꞃ":"r","ⓢ":"s","s":"s","ß":"s","ś":"s","ṥ":"s","ŝ":"s","ṡ":"s","š":"s","ṧ":"s","ṣ":"s","ṩ":"s","ș":"s","ş":"s","ȿ":"s","ꞩ":"s","ꞅ":"s","ẛ":"s","ⓣ":"t","t":"t","ṫ":"t","ẗ":"t","ť":"t","ṭ":"t","ț":"t","ţ":"t","ṱ":"t","ṯ":"t","ŧ":"t","ƭ":"t","ʈ":"t","ⱦ":"t","ꞇ":"t","ꜩ":"tz","ⓤ":"u","u":"u","ù":"u","ú":"u","û":"u","ũ":"u","ṹ":"u","ū":"u","ṻ":"u","ŭ":"u","ü":"u","ǜ":"u","ǘ":"u","ǖ":"u","ǚ":"u","ủ":"u","ů":"u","ű":"u","ǔ":"u","ȕ":"u","ȗ":"u","ư":"u","ừ":"u","ứ":"u","ữ":"u","ử":"u","ự":"u","ụ":"u","ṳ":"u","ų":"u","ṷ":"u","ṵ":"u","ʉ":"u","ⓥ":"v","v":"v","ṽ":"v","ṿ":"v","ʋ":"v","ꝟ":"v","ʌ":"v","ꝡ":"vy","ⓦ":"w","w":"w","ẁ":"w","ẃ":"w","ŵ":"w","ẇ":"w","ẅ":"w","ẘ":"w","ẉ":"w","ⱳ":"w","ⓧ":"x","x":"x","ẋ":"x","ẍ":"x","ⓨ":"y","y":"y","ỳ":"y","ý":"y","ŷ":"y","ỹ":"y","ȳ":"y","ẏ":"y","ÿ":"y","ỷ":"y","ẙ":"y","ỵ":"y","ƴ":"y","ɏ":"y","ỿ":"y","ⓩ":"z","z":"z","ź":"z","ẑ":"z","ż":"z","ž":"z","ẓ":"z","ẕ":"z","ƶ":"z","ȥ":"z","ɀ":"z","ⱬ":"z","ꝣ":"z","Ά":"Α","Έ":"Ε","Ή":"Η","Ί":"Ι","Ϊ":"Ι","Ό":"Ο","Ύ":"Υ","Ϋ":"Υ","Ώ":"Ω","ά":"α","έ":"ε","ή":"η","ί":"ι","ϊ":"ι","ΐ":"ι","ό":"ο","ύ":"υ","ϋ":"υ","ΰ":"υ","ω":"ω","ς":"σ"}}),b.define("select2/data/base",["../utils"],function(a){function b(a,c){b.__super__.constructor.call(this)}return a.Extend(b,a.Observable),b.prototype.current=function(a){throw new Error("The `current` method must be defined in child classes.")},b.prototype.query=function(a,b){throw new Error("The `query` method must be defined in child classes.")},b.prototype.bind=function(a,b){},b.prototype.destroy=function(){},b.prototype.generateResultId=function(b,c){var d=b.id+"-result-";return d+=a.generateChars(4),null!=c.id?d+="-"+c.id.toString():d+="-"+a.generateChars(4),d},b}),b.define("select2/data/select",["./base","../utils","jquery"],function(a,b,c){function d(a,b){this.$element=a,this.options=b,d.__super__.constructor.call(this)}return b.Extend(d,a),d.prototype.current=function(a){var b=[],d=this;this.$element.find(":selected").each(function(){var a=c(this),e=d.item(a);b.push(e)}),a(b)},d.prototype.select=function(a){var b=this;if(a.selected=!0,c(a.element).is("option"))return a.element.selected=!0,void this.$element.trigger("change");if(this.$element.prop("multiple"))this.current(function(d){var e=[];a=[a],a.push.apply(a,d);for(var f=0;f<a.length;f++){var g=a[f].id;-1===c.inArray(g,e)&&e.push(g)}b.$element.val(e),b.$element.trigger("change")});else{var d=a.id;this.$element.val(d),this.$element.trigger("change")}},d.prototype.unselect=function(a){var b=this;if(this.$element.prop("multiple")){if(a.selected=!1,c(a.element).is("option"))return a.element.selected=!1,void this.$element.trigger("change");this.current(function(d){for(var e=[],f=0;f<d.length;f++){var g=d[f].id;g!==a.id&&-1===c.inArray(g,e)&&e.push(g)}b.$element.val(e),b.$element.trigger("change")})}},d.prototype.bind=function(a,b){var c=this;this.container=a,a.on("select",function(a){c.select(a.data)}),a.on("unselect",function(a){c.unselect(a.data)})},d.prototype.destroy=function(){this.$element.find("*").each(function(){b.RemoveData(this)})},d.prototype.query=function(a,b){var d=[],e=this;this.$element.children().each(function(){var b=c(this);if(b.is("option")||b.is("optgroup")){var f=e.item(b),g=e.matches(a,f);null!==g&&d.push(g)}}),b({results:d})},d.prototype.addOptions=function(a){b.appendMany(this.$element,a)},d.prototype.option=function(a){var d;a.children?(d=document.createElement("optgroup"),d.label=a.text):(d=document.createElement("option"),void 0!==d.textContent?d.textContent=a.text:d.innerText=a.text),void 0!==a.id&&(d.value=a.id),a.disabled&&(d.disabled=!0),a.selected&&(d.selected=!0),a.title&&(d.title=a.title);var e=c(d),f=this._normalizeItem(a);return f.element=d,b.StoreData(d,"data",f),e},d.prototype.item=function(a){var d={};if(null!=(d=b.GetData(a[0],"data")))return d;if(a.is("option"))d={id:a.val(),text:a.text(),disabled:a.prop("disabled"),selected:a.prop("selected"),title:a.prop("title")};else if(a.is("optgroup")){d={text:a.prop("label"),children:[],title:a.prop("title")};for(var e=a.children("option"),f=[],g=0;g<e.length;g++){var h=c(e[g]),i=this.item(h);f.push(i)}d.children=f}return d=this._normalizeItem(d),d.element=a[0],b.StoreData(a[0],"data",d),d},d.prototype._normalizeItem=function(a){a!==Object(a)&&(a={id:a,text:a}),a=c.extend({},{text:""},a);var b={selected:!1,disabled:!1};return null!=a.id&&(a.id=a.id.toString()),null!=a.text&&(a.text=a.text.toString()),null==a._resultId&&a.id&&null!=this.container&&(a._resultId=this.generateResultId(this.container,a)),c.extend({},b,a)},d.prototype.matches=function(a,b){return this.options.get("matcher")(a,b)},d}),b.define("select2/data/array",["./select","../utils","jquery"],function(a,b,c){function d(a,b){var c=b.get("data")||[];d.__super__.constructor.call(this,a,b),this.addOptions(this.convertToOptions(c))}return b.Extend(d,a),d.prototype.select=function(a){var b=this.$element.find("option").filter(function(b,c){return c.value==a.id.toString()});0===b.length&&(b=this.option(a),this.addOptions(b)),d.__super__.select.call(this,a)},d.prototype.convertToOptions=function(a){function d(a){return function(){return c(this).val()==a.id}}for(var e=this,f=this.$element.find("option"),g=f.map(function(){return e.item(c(this)).id}).get(),h=[],i=0;i<a.length;i++){var j=this._normalizeItem(a[i]);if(c.inArray(j.id,g)>=0){var k=f.filter(d(j)),l=this.item(k),m=c.extend(!0,{},j,l),n=this.option(m);k.replaceWith(n)}else{var o=this.option(j);if(j.children){var p=this.convertToOptions(j.children);b.appendMany(o,p)}h.push(o)}}return h},d}),b.define("select2/data/ajax",["./array","../utils","jquery"],function(a,b,c){function d(a,b){this.ajaxOptions=this._applyDefaults(b.get("ajax")),null!=this.ajaxOptions.processResults&&(this.processResults=this.ajaxOptions.processResults),d.__super__.constructor.call(this,a,b)}return b.Extend(d,a),d.prototype._applyDefaults=function(a){var b={data:function(a){return c.extend({},a,{q:a.term})},transport:function(a,b,d){var e=c.ajax(a);return e.then(b),e.fail(d),e}};return c.extend({},b,a,!0)},d.prototype.processResults=function(a){return a},d.prototype.query=function(a,b){function d(){var d=f.transport(f,function(d){var f=e.processResults(d,a);e.options.get("debug")&&window.console&&console.error&&(f&&f.results&&c.isArray(f.results)||console.error("Select2: The AJAX results did not return an array in the `results` key of the response.")),b(f)},function(){"status"in d&&(0===d.status||"0"===d.status)||e.trigger("results:message",{message:"errorLoading"})});e._request=d}var e=this;null!=this._request&&(c.isFunction(this._request.abort)&&this._request.abort(),this._request=null);var f=c.extend({type:"GET"},this.ajaxOptions);"function"==typeof f.url&&(f.url=f.url.call(this.$element,a)),"function"==typeof f.data&&(f.data=f.data.call(this.$element,a)),this.ajaxOptions.delay&&null!=a.term?(this._queryTimeout&&window.clearTimeout(this._queryTimeout),this._queryTimeout=window.setTimeout(d,this.ajaxOptions.delay)):d()},d}),b.define("select2/data/tags",["jquery"],function(a){function b(b,c,d){var e=d.get("tags"),f=d.get("createTag");void 0!==f&&(this.createTag=f);var g=d.get("insertTag");if(void 0!==g&&(this.insertTag=g),b.call(this,c,d),a.isArray(e))for(var h=0;h<e.length;h++){var i=e[h],j=this._normalizeItem(i),k=this.option(j);this.$element.append(k)}}return b.prototype.query=function(a,b,c){function d(a,f){for(var g=a.results,h=0;h<g.length;h++){var i=g[h],j=null!=i.children&&!d({results:i.children},!0);if((i.text||"").toUpperCase()===(b.term||"").toUpperCase()||j)return!f&&(a.data=g,void c(a))}if(f)return!0;var k=e.createTag(b);if(null!=k){var l=e.option(k);l.attr("data-select2-tag",!0),e.addOptions([l]),e.insertTag(g,k)}a.results=g,c(a)}var e=this;if(this._removeOldTags(),null==b.term||null!=b.page)return void a.call(this,b,c);a.call(this,b,d)},b.prototype.createTag=function(b,c){var d=a.trim(c.term);return""===d?null:{id:d,text:d}},b.prototype.insertTag=function(a,b,c){b.unshift(c)},b.prototype._removeOldTags=function(b){this._lastTag;this.$element.find("option[data-select2-tag]").each(function(){this.selected||a(this).remove()})},b}),b.define("select2/data/tokenizer",["jquery"],function(a){function b(a,b,c){var d=c.get("tokenizer");void 0!==d&&(this.tokenizer=d),a.call(this,b,c)}return b.prototype.bind=function(a,b,c){a.call(this,b,c),this.$search=b.dropdown.$search||b.selection.$search||c.find(".select2-search__field")},b.prototype.query=function(b,c,d){function e(b){var c=g._normalizeItem(b);if(!g.$element.find("option").filter(function(){return a(this).val()===c.id}).length){var d=g.option(c);d.attr("data-select2-tag",!0),g._removeOldTags(),g.addOptions([d])}f(c)}function f(a){g.trigger("select",{data:a})}var g=this;c.term=c.term||"";var h=this.tokenizer(c,this.options,e);h.term!==c.term&&(this.$search.length&&(this.$search.val(h.term),this.$search.focus()),c.term=h.term),b.call(this,c,d)},b.prototype.tokenizer=function(b,c,d,e){for(var f=d.get("tokenSeparators")||[],g=c.term,h=0,i=this.createTag||function(a){return{id:a.term,text:a.term}};h<g.length;){var j=g[h];if(-1!==a.inArray(j,f)){var k=g.substr(0,h),l=a.extend({},c,{term:k}),m=i(l);null!=m?(e(m),g=g.substr(h+1)||"",h=0):h++}else h++}return{term:g}},b}),b.define("select2/data/minimumInputLength",[],function(){function a(a,b,c){this.minimumInputLength=c.get("minimumInputLength"),a.call(this,b,c)}return a.prototype.query=function(a,b,c){if(b.term=b.term||"",b.term.length<this.minimumInputLength)return void this.trigger("results:message",{message:"inputTooShort",args:{minimum:this.minimumInputLength,input:b.term,params:b}});a.call(this,b,c)},a}),b.define("select2/data/maximumInputLength",[],function(){function a(a,b,c){this.maximumInputLength=c.get("maximumInputLength"),a.call(this,b,c)}return a.prototype.query=function(a,b,c){if(b.term=b.term||"",this.maximumInputLength>0&&b.term.length>this.maximumInputLength)return void this.trigger("results:message",{message:"inputTooLong",args:{maximum:this.maximumInputLength,input:b.term,params:b}});a.call(this,b,c)},a}),b.define("select2/data/maximumSelectionLength",[],function(){function a(a,b,c){this.maximumSelectionLength=c.get("maximumSelectionLength"),a.call(this,b,c)}return a.prototype.query=function(a,b,c){var d=this;this.current(function(e){var f=null!=e?e.length:0;if(d.maximumSelectionLength>0&&f>=d.maximumSelectionLength)return void d.trigger("results:message",{message:"maximumSelected",args:{maximum:d.maximumSelectionLength}});a.call(d,b,c)})},a}),b.define("select2/dropdown",["jquery","./utils"],function(a,b){function c(a,b){this.$element=a,this.options=b,c.__super__.constructor.call(this)}return b.Extend(c,b.Observable),c.prototype.render=function(){var b=a('<span class="select2-dropdown"><span class="select2-results"></span></span>');return b.attr("dir",this.options.get("dir")),this.$dropdown=b,b},c.prototype.bind=function(){},c.prototype.position=function(a,b){},c.prototype.destroy=function(){this.$dropdown.remove()},c}),b.define("select2/dropdown/search",["jquery","../utils"],function(a,b){function c(){}return c.prototype.render=function(b){var c=b.call(this),d=a('<span class="select2-search select2-search--dropdown"><input class="select2-search__field" type="search" tabindex="-1" autocomplete="off" autocorrect="off" autocapitalize="none" spellcheck="false" role="textbox" /></span>');return this.$searchContainer=d,this.$search=d.find("input"),c.prepend(d),c},c.prototype.bind=function(b,c,d){var e=this;b.call(this,c,d),this.$search.on("keydown",function(a){e.trigger("keypress",a),e._keyUpPrevented=a.isDefaultPrevented()}),this.$search.on("input",function(b){a(this).off("keyup")}),this.$search.on("keyup input",function(a){e.handleSearch(a)}),c.on("open",function(){e.$search.attr("tabindex",0),e.$search.focus(),window.setTimeout(function(){e.$search.focus()},0)}),c.on("close",function(){e.$search.attr("tabindex",-1),e.$search.val(""),e.$search.blur()}),c.on("focus",function(){c.isOpen()||e.$search.focus()}),c.on("results:all",function(a){if(null==a.query.term||""===a.query.term){e.showSearch(a)?e.$searchContainer.removeClass("select2-search--hide"):e.$searchContainer.addClass("select2-search--hide")}})},c.prototype.handleSearch=function(a){if(!this._keyUpPrevented){var b=this.$search.val();this.trigger("query",{term:b})}this._keyUpPrevented=!1},c.prototype.showSearch=function(a,b){return!0},c}),b.define("select2/dropdown/hidePlaceholder",[],function(){function a(a,b,c,d){this.placeholder=this.normalizePlaceholder(c.get("placeholder")),a.call(this,b,c,d)}return a.prototype.append=function(a,b){b.results=this.removePlaceholder(b.results),a.call(this,b)},a.prototype.normalizePlaceholder=function(a,b){return"string"==typeof b&&(b={id:"",text:b}),b},a.prototype.removePlaceholder=function(a,b){for(var c=b.slice(0),d=b.length-1;d>=0;d--){var e=b[d];this.placeholder.id===e.id&&c.splice(d,1)}return c},a}),b.define("select2/dropdown/infiniteScroll",["jquery"],function(a){function b(a,b,c,d){this.lastParams={},a.call(this,b,c,d),this.$loadingMore=this.createLoadingMore(),this.loading=!1}return b.prototype.append=function(a,b){this.$loadingMore.remove(),this.loading=!1,a.call(this,b),this.showLoadingMore(b)&&this.$results.append(this.$loadingMore)},b.prototype.bind=function(b,c,d){var e=this;b.call(this,c,d),c.on("query",function(a){e.lastParams=a,e.loading=!0}),c.on("query:append",function(a){e.lastParams=a,e.loading=!0}),this.$results.on("scroll",function(){var b=a.contains(document.documentElement,e.$loadingMore[0]);if(!e.loading&&b){e.$results.offset().top+e.$results.outerHeight(!1)+50>=e.$loadingMore.offset().top+e.$loadingMore.outerHeight(!1)&&e.loadMore()}})},b.prototype.loadMore=function(){this.loading=!0;var b=a.extend({},{page:1},this.lastParams);b.page++,this.trigger("query:append",b)},b.prototype.showLoadingMore=function(a,b){return b.pagination&&b.pagination.more},b.prototype.createLoadingMore=function(){var b=a('<li class="select2-results__option select2-results__option--load-more"role="treeitem" aria-disabled="true"></li>'),c=this.options.get("translations").get("loadingMore");return b.html(c(this.lastParams)),b},b}),b.define("select2/dropdown/attachBody",["jquery","../utils"],function(a,b){function c(b,c,d){this.$dropdownParent=d.get("dropdownParent")||a(document.body),b.call(this,c,d)}return c.prototype.bind=function(a,b,c){var d=this,e=!1;a.call(this,b,c),b.on("open",function(){d._showDropdown(),d._attachPositioningHandler(b),e||(e=!0,b.on("results:all",function(){d._positionDropdown(),d._resizeDropdown()}),b.on("results:append",function(){d._positionDropdown(),d._resizeDropdown()}))}),b.on("close",function(){d._hideDropdown(),d._detachPositioningHandler(b)}),this.$dropdownContainer.on("mousedown",function(a){a.stopPropagation()})},c.prototype.destroy=function(a){a.call(this),this.$dropdownContainer.remove()},c.prototype.position=function(a,b,c){b.attr("class",c.attr("class")),b.removeClass("select2"),b.addClass("select2-container--open"),b.css({position:"absolute",top:-999999}),this.$container=c},c.prototype.render=function(b){var c=a("<span></span>"),d=b.call(this);return c.append(d),this.$dropdownContainer=c,c},c.prototype._hideDropdown=function(a){this.$dropdownContainer.detach()},c.prototype._attachPositioningHandler=function(c,d){var e=this,f="scroll.select2."+d.id,g="resize.select2."+d.id,h="orientationchange.select2."+d.id,i=this.$container.parents().filter(b.hasScroll);i.each(function(){b.StoreData(this,"select2-scroll-position",{x:a(this).scrollLeft(),y:a(this).scrollTop()})}),i.on(f,function(c){var d=b.GetData(this,"select2-scroll-position");a(this).scrollTop(d.y)}),a(window).on(f+" "+g+" "+h,function(a){e._positionDropdown(),e._resizeDropdown()})},c.prototype._detachPositioningHandler=function(c,d){var e="scroll.select2."+d.id,f="resize.select2."+d.id,g="orientationchange.select2."+d.id;this.$container.parents().filter(b.hasScroll).off(e),a(window).off(e+" "+f+" "+g)},c.prototype._positionDropdown=function(){var b=a(window),c=this.$dropdown.hasClass("select2-dropdown--above"),d=this.$dropdown.hasClass("select2-dropdown--below"),e=null,f=this.$container.offset();f.bottom=f.top+this.$container.outerHeight(!1);var g={height:this.$container.outerHeight(!1)};g.top=f.top,g.bottom=f.top+g.height;var h={height:this.$dropdown.outerHeight(!1)},i={top:b.scrollTop(),bottom:b.scrollTop()+b.height()},j=i.top<f.top-h.height,k=i.bottom>f.bottom+h.height,l={left:f.left,top:g.bottom},m=this.$dropdownParent;"static"===m.css("position")&&(m=m.offsetParent());var n=m.offset();l.top-=n.top,l.left-=n.left,c||d||(e="below"),k||!j||c?!j&&k&&c&&(e="below"):e="above",("above"==e||c&&"below"!==e)&&(l.top=g.top-n.top-h.height),null!=e&&(this.$dropdown.removeClass("select2-dropdown--below select2-dropdown--above").addClass("select2-dropdown--"+e),this.$container.removeClass("select2-container--below select2-container--above").addClass("select2-container--"+e)),this.$dropdownContainer.css(l)},c.prototype._resizeDropdown=function(){var a={width:this.$container.outerWidth(!1)+"px"};this.options.get("dropdownAutoWidth")&&(a.minWidth=a.width,a.position="relative",a.width="auto"),this.$dropdown.css(a)},c.prototype._showDropdown=function(a){this.$dropdownContainer.appendTo(this.$dropdownParent),this._positionDropdown(),this._resizeDropdown()},c}),b.define("select2/dropdown/minimumResultsForSearch",[],function(){function a(b){for(var c=0,d=0;d<b.length;d++){var e=b[d];e.children?c+=a(e.children):c++}return c}function b(a,b,c,d){this.minimumResultsForSearch=c.get("minimumResultsForSearch"),this.minimumResultsForSearch<0&&(this.minimumResultsForSearch=1/0),a.call(this,b,c,d)}return b.prototype.showSearch=function(b,c){return!(a(c.data.results)<this.minimumResultsForSearch)&&b.call(this,c)},b}),b.define("select2/dropdown/selectOnClose",["../utils"],function(a){function b(){}return b.prototype.bind=function(a,b,c){var d=this;a.call(this,b,c),b.on("close",function(a){d._handleSelectOnClose(a)})},b.prototype._handleSelectOnClose=function(b,c){if(c&&null!=c.originalSelect2Event){var d=c.originalSelect2Event;if("select"===d._type||"unselect"===d._type)return}var e=this.getHighlightedResults();if(!(e.length<1)){var f=a.GetData(e[0],"data");null!=f.element&&f.element.selected||null==f.element&&f.selected||this.trigger("select",{data:f})}},b}),b.define("select2/dropdown/closeOnSelect",[],function(){function a(){}return a.prototype.bind=function(a,b,c){var d=this;a.call(this,b,c),b.on("select",function(a){d._selectTriggered(a)}),b.on("unselect",function(a){d._selectTriggered(a)})},a.prototype._selectTriggered=function(a,b){var c=b.originalEvent;c&&c.ctrlKey||this.trigger("close",{originalEvent:c,originalSelect2Event:b})},a}),b.define("select2/i18n/en",[],function(){return{errorLoading:function(){return"The results could not be loaded."},inputTooLong:function(a){var b=a.input.length-a.maximum,c="Please delete "+b+" character";return 1!=b&&(c+="s"),c},inputTooShort:function(a){return"Please enter "+(a.minimum-a.input.length)+" or more characters"},loadingMore:function(){return"Loading more results…"},maximumSelected:function(a){var b="You can only select "+a.maximum+" item";return 1!=a.maximum&&(b+="s"),b},noResults:function(){return"No results found"},searching:function(){return"Searching…"}}}),b.define("select2/defaults",["jquery","require","./results","./selection/single","./selection/multiple","./selection/placeholder","./selection/allowClear","./selection/search","./selection/eventRelay","./utils","./translation","./diacritics","./data/select","./data/array","./data/ajax","./data/tags","./data/tokenizer","./data/minimumInputLength","./data/maximumInputLength","./data/maximumSelectionLength","./dropdown","./dropdown/search","./dropdown/hidePlaceholder","./dropdown/infiniteScroll","./dropdown/attachBody","./dropdown/minimumResultsForSearch","./dropdown/selectOnClose","./dropdown/closeOnSelect","./i18n/en"],function(a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z,A,B,C){function D(){this.reset()}return D.prototype.apply=function(l){if(l=a.extend(!0,{},this.defaults,l),null==l.dataAdapter){if(null!=l.ajax?l.dataAdapter=o:null!=l.data?l.dataAdapter=n:l.dataAdapter=m,l.minimumInputLength>0&&(l.dataAdapter=j.Decorate(l.dataAdapter,r)),l.maximumInputLength>0&&(l.dataAdapter=j.Decorate(l.dataAdapter,s)),l.maximumSelectionLength>0&&(l.dataAdapter=j.Decorate(l.dataAdapter,t)),l.tags&&(l.dataAdapter=j.Decorate(l.dataAdapter,p)),null==l.tokenSeparators&&null==l.tokenizer||(l.dataAdapter=j.Decorate(l.dataAdapter,q)),null!=l.query){var C=b(l.amdBase+"compat/query");l.dataAdapter=j.Decorate(l.dataAdapter,C)}if(null!=l.initSelection){var D=b(l.amdBase+"compat/initSelection");l.dataAdapter=j.Decorate(l.dataAdapter,D)}}if(null==l.resultsAdapter&&(l.resultsAdapter=c,null!=l.ajax&&(l.resultsAdapter=j.Decorate(l.resultsAdapter,x)),null!=l.placeholder&&(l.resultsAdapter=j.Decorate(l.resultsAdapter,w)),l.selectOnClose&&(l.resultsAdapter=j.Decorate(l.resultsAdapter,A))),null==l.dropdownAdapter){if(l.multiple)l.dropdownAdapter=u;else{var E=j.Decorate(u,v);l.dropdownAdapter=E}if(0!==l.minimumResultsForSearch&&(l.dropdownAdapter=j.Decorate(l.dropdownAdapter,z)),l.closeOnSelect&&(l.dropdownAdapter=j.Decorate(l.dropdownAdapter,B)),null!=l.dropdownCssClass||null!=l.dropdownCss||null!=l.adaptDropdownCssClass){var F=b(l.amdBase+"compat/dropdownCss");l.dropdownAdapter=j.Decorate(l.dropdownAdapter,F)}l.dropdownAdapter=j.Decorate(l.dropdownAdapter,y)}if(null==l.selectionAdapter){if(l.multiple?l.selectionAdapter=e:l.selectionAdapter=d,null!=l.placeholder&&(l.selectionAdapter=j.Decorate(l.selectionAdapter,f)),l.allowClear&&(l.selectionAdapter=j.Decorate(l.selectionAdapter,g)),l.multiple&&(l.selectionAdapter=j.Decorate(l.selectionAdapter,h)),null!=l.containerCssClass||null!=l.containerCss||null!=l.adaptContainerCssClass){var G=b(l.amdBase+"compat/containerCss");l.selectionAdapter=j.Decorate(l.selectionAdapter,G)}l.selectionAdapter=j.Decorate(l.selectionAdapter,i)}if("string"==typeof l.language)if(l.language.indexOf("-")>0){var H=l.language.split("-"),I=H[0];l.language=[l.language,I]}else l.language=[l.language];if(a.isArray(l.language)){var J=new k;l.language.push("en");for(var K=l.language,L=0;L<K.length;L++){var M=K[L],N={};try{N=k.loadPath(M)}catch(a){try{M=this.defaults.amdLanguageBase+M,N=k.loadPath(M)}catch(a){l.debug&&window.console&&console.warn&&console.warn('Select2: The language file for "'+M+'" could not be automatically loaded. A fallback will be used instead.');continue}}J.extend(N)}l.translations=J}else{var O=k.loadPath(this.defaults.amdLanguageBase+"en"),P=new k(l.language);P.extend(O),l.translations=P}return l},D.prototype.reset=function(){function b(a){function b(a){return l[a]||a}return a.replace(/[^\u0000-\u007E]/g,b)}function c(d,e){if(""===a.trim(d.term))return e;if(e.children&&e.children.length>0){for(var f=a.extend(!0,{},e),g=e.children.length-1;g>=0;g--){null==c(d,e.children[g])&&f.children.splice(g,1)}return f.children.length>0?f:c(d,f)}var h=b(e.text).toUpperCase(),i=b(d.term).toUpperCase();return h.indexOf(i)>-1?e:null}this.defaults={amdBase:"./",amdLanguageBase:"./i18n/",closeOnSelect:!0,debug:!1,dropdownAutoWidth:!1,escapeMarkup:j.escapeMarkup,language:C,matcher:c,minimumInputLength:0,maximumInputLength:0,maximumSelectionLength:0,minimumResultsForSearch:0,selectOnClose:!1,sorter:function(a){return a},templateResult:function(a){return a.text},templateSelection:function(a){return a.text},theme:"default",width:"resolve"}},D.prototype.set=function(b,c){var d=a.camelCase(b),e={};e[d]=c;var f=j._convertData(e);a.extend(!0,this.defaults,f)},new D}),b.define("select2/options",["require","jquery","./defaults","./utils"],function(a,b,c,d){function e(b,e){if(this.options=b,null!=e&&this.fromElement(e),this.options=c.apply(this.options),e&&e.is("input")){var f=a(this.get("amdBase")+"compat/inputData");this.options.dataAdapter=d.Decorate(this.options.dataAdapter,f)}}return e.prototype.fromElement=function(a){var c=["select2"];null==this.options.multiple&&(this.options.multiple=a.prop("multiple")),null==this.options.disabled&&(this.options.disabled=a.prop("disabled")),null==this.options.language&&(a.prop("lang")?this.options.language=a.prop("lang").toLowerCase():a.closest("[lang]").prop("lang")&&(this.options.language=a.closest("[lang]").prop("lang"))),null==this.options.dir&&(a.prop("dir")?this.options.dir=a.prop("dir"):a.closest("[dir]").prop("dir")?this.options.dir=a.closest("[dir]").prop("dir"):this.options.dir="ltr"),a.prop("disabled",this.options.disabled),a.prop("multiple",this.options.multiple),d.GetData(a[0],"select2Tags")&&(this.options.debug&&window.console&&console.warn&&console.warn('Select2: The `data-select2-tags` attribute has been changed to use the `data-data` and `data-tags="true"` attributes and will be removed in future versions of Select2.'),d.StoreData(a[0],"data",d.GetData(a[0],"select2Tags")),d.StoreData(a[0],"tags",!0)),d.GetData(a[0],"ajaxUrl")&&(this.options.debug&&window.console&&console.warn&&console.warn("Select2: The `data-ajax-url` attribute has been changed to `data-ajax--url` and support for the old attribute will be removed in future versions of Select2."),a.attr("ajax--url",d.GetData(a[0],"ajaxUrl")),d.StoreData(a[0],"ajax-Url",d.GetData(a[0],"ajaxUrl")));var e={};e=b.fn.jquery&&"1."==b.fn.jquery.substr(0,2)&&a[0].dataset?b.extend(!0,{},a[0].dataset,d.GetData(a[0])):d.GetData(a[0]);var f=b.extend(!0,{},e);f=d._convertData(f);for(var g in f)b.inArray(g,c)>-1||(b.isPlainObject(this.options[g])?b.extend(this.options[g],f[g]):this.options[g]=f[g]);return this},e.prototype.get=function(a){return this.options[a]},e.prototype.set=function(a,b){this.options[a]=b},e}),b.define("select2/core",["jquery","./options","./utils","./keys"],function(a,b,c,d){var e=function(a,d){null!=c.GetData(a[0],"select2")&&c.GetData(a[0],"select2").destroy(),this.$element=a,this.id=this._generateId(a),d=d||{},this.options=new b(d,a),e.__super__.constructor.call(this);var f=a.attr("tabindex")||0;c.StoreData(a[0],"old-tabindex",f),a.attr("tabindex","-1");var g=this.options.get("dataAdapter");this.dataAdapter=new g(a,this.options);var h=this.render();this._placeContainer(h);var i=this.options.get("selectionAdapter");this.selection=new i(a,this.options),this.$selection=this.selection.render(),this.selection.position(this.$selection,h);var j=this.options.get("dropdownAdapter");this.dropdown=new j(a,this.options),this.$dropdown=this.dropdown.render(),this.dropdown.position(this.$dropdown,h);var k=this.options.get("resultsAdapter");this.results=new k(a,this.options,this.dataAdapter),this.$results=this.results.render(),this.results.position(this.$results,this.$dropdown);var l=this;this._bindAdapters(),this._registerDomEvents(),this._registerDataEvents(),this._registerSelectionEvents(),this._registerDropdownEvents(),this._registerResultsEvents(),this._registerEvents(),this.dataAdapter.current(function(a){l.trigger("selection:update",{data:a})}),a.addClass("select2-hidden-accessible"),a.attr("aria-hidden","true"),this._syncAttributes(),c.StoreData(a[0],"select2",this),a.data("select2",this)};return c.Extend(e,c.Observable),e.prototype._generateId=function(a){var b="";return b=null!=a.attr("id")?a.attr("id"):null!=a.attr("name")?a.attr("name")+"-"+c.generateChars(2):c.generateChars(4),b=b.replace(/(:|\.|\[|\]|,)/g,""),b="select2-"+b},e.prototype._placeContainer=function(a){a.insertAfter(this.$element);var b=this._resolveWidth(this.$element,this.options.get("width"));null!=b&&a.css("width",b)},e.prototype._resolveWidth=function(a,b){var c=/^width:(([-+]?([0-9]*\.)?[0-9]+)(px|em|ex|%|in|cm|mm|pt|pc))/i;if("resolve"==b){var d=this._resolveWidth(a,"style");return null!=d?d:this._resolveWidth(a,"element")}if("element"==b){var e=a.outerWidth(!1);return e<=0?"auto":e+"px"}if("style"==b){var f=a.attr("style");if("string"!=typeof f)return null;for(var g=f.split(";"),h=0,i=g.length;h<i;h+=1){var j=g[h].replace(/\s/g,""),k=j.match(c);if(null!==k&&k.length>=1)return k[1]}return null}return b},e.prototype._bindAdapters=function(){this.dataAdapter.bind(this,this.$container),this.selection.bind(this,this.$container),this.dropdown.bind(this,this.$container),this.results.bind(this,this.$container)},e.prototype._registerDomEvents=function(){var b=this;this.$element.on("change.select2",function(){b.dataAdapter.current(function(a){b.trigger("selection:update",{data:a})})}),this.$element.on("focus.select2",function(a){b.trigger("focus",a)}),this._syncA=c.bind(this._syncAttributes,this),this._syncS=c.bind(this._syncSubtree,this),this.$element[0].attachEvent&&this.$element[0].attachEvent("onpropertychange",this._syncA);var d=window.MutationObserver||window.WebKitMutationObserver||window.MozMutationObserver;null!=d?(this._observer=new d(function(c){a.each(c,b._syncA),a.each(c,b._syncS)}),this._observer.observe(this.$element[0],{attributes:!0,childList:!0,subtree:!1})):this.$element[0].addEventListener&&(this.$element[0].addEventListener("DOMAttrModified",b._syncA,!1),this.$element[0].addEventListener("DOMNodeInserted",b._syncS,!1),this.$element[0].addEventListener("DOMNodeRemoved",b._syncS,!1))},e.prototype._registerDataEvents=function(){var a=this;this.dataAdapter.on("*",function(b,c){a.trigger(b,c)})},e.prototype._registerSelectionEvents=function(){var b=this,c=["toggle","focus"];this.selection.on("toggle",function(){b.toggleDropdown()}),this.selection.on("focus",function(a){b.focus(a)}),this.selection.on("*",function(d,e){-1===a.inArray(d,c)&&b.trigger(d,e)})},e.prototype._registerDropdownEvents=function(){var a=this;this.dropdown.on("*",function(b,c){a.trigger(b,c)})},e.prototype._registerResultsEvents=function(){var a=this;this.results.on("*",function(b,c){a.trigger(b,c)})},e.prototype._registerEvents=function(){var a=this;this.on("open",function(){a.$container.addClass("select2-container--open")}),this.on("close",function(){a.$container.removeClass("select2-container--open")}),this.on("enable",function(){a.$container.removeClass("select2-container--disabled")}),this.on("disable",function(){a.$container.addClass("select2-container--disabled")}),this.on("blur",function(){a.$container.removeClass("select2-container--focus")}),this.on("query",function(b){a.isOpen()||a.trigger("open",{}),this.dataAdapter.query(b,function(c){a.trigger("results:all",{data:c,query:b})})}),this.on("query:append",function(b){this.dataAdapter.query(b,function(c){a.trigger("results:append",{data:c,query:b})})}),this.on("keypress",function(b){var c=b.which;a.isOpen()?c===d.ESC||c===d.TAB||c===d.UP&&b.altKey?(a.close(),b.preventDefault()):c===d.ENTER?(a.trigger("results:select",{}),b.preventDefault()):c===d.SPACE&&b.ctrlKey?(a.trigger("results:toggle",{}),b.preventDefault()):c===d.UP?(a.trigger("results:previous",{}),b.preventDefault()):c===d.DOWN&&(a.trigger("results:next",{}),b.preventDefault()):(c===d.ENTER||c===d.SPACE||c===d.DOWN&&b.altKey)&&(a.open(),b.preventDefault())})},e.prototype._syncAttributes=function(){this.options.set("disabled",this.$element.prop("disabled")),this.options.get("disabled")?(this.isOpen()&&this.close(),this.trigger("disable",{})):this.trigger("enable",{})},e.prototype._syncSubtree=function(a,b){var c=!1,d=this;if(!a||!a.target||"OPTION"===a.target.nodeName||"OPTGROUP"===a.target.nodeName){if(b)if(b.addedNodes&&b.addedNodes.length>0)for(var e=0;e<b.addedNodes.length;e++){var f=b.addedNodes[e];f.selected&&(c=!0)}else b.removedNodes&&b.removedNodes.length>0&&(c=!0);else c=!0;c&&this.dataAdapter.current(function(a){d.trigger("selection:update",{data:a})})}},e.prototype.trigger=function(a,b){var c=e.__super__.trigger,d={open:"opening",close:"closing",select:"selecting",unselect:"unselecting",clear:"clearing"};if(void 0===b&&(b={}),a in d){var f=d[a],g={prevented:!1,name:a,args:b};if(c.call(this,f,g),g.prevented)return void(b.prevented=!0)}c.call(this,a,b)},e.prototype.toggleDropdown=function(){this.options.get("disabled")||(this.isOpen()?this.close():this.open())},e.prototype.open=function(){this.isOpen()||this.trigger("query",{})},e.prototype.close=function(){this.isOpen()&&this.trigger("close",{})},e.prototype.isOpen=function(){return this.$container.hasClass("select2-container--open")},e.prototype.hasFocus=function(){return this.$container.hasClass("select2-container--focus")},e.prototype.focus=function(a){this.hasFocus()||(this.$container.addClass("select2-container--focus"),this.trigger("focus",{}))},e.prototype.enable=function(a){this.options.get("debug")&&window.console&&console.warn&&console.warn('Select2: The `select2("enable")` method has been deprecated and will be removed in later Select2 versions. Use $element.prop("disabled") instead.'),null!=a&&0!==a.length||(a=[!0]);var b=!a[0];this.$element.prop("disabled",b)},e.prototype.data=function(){this.options.get("debug")&&arguments.length>0&&window.console&&console.warn&&console.warn('Select2: Data can no longer be set using `select2("data")`. You should consider setting the value instead using `$element.val()`.');var a=[];return this.dataAdapter.current(function(b){a=b}),a},e.prototype.val=function(b){if(this.options.get("debug")&&window.console&&console.warn&&console.warn('Select2: The `select2("val")` method has been deprecated and will be removed in later Select2 versions. Use $element.val() instead.'),null==b||0===b.length)return this.$element.val();var c=b[0];a.isArray(c)&&(c=a.map(c,function(a){return a.toString()})),this.$element.val(c).trigger("change")},e.prototype.destroy=function(){this.$container.remove(),this.$element[0].detachEvent&&this.$element[0].detachEvent("onpropertychange",this._syncA),null!=this._observer?(this._observer.disconnect(),this._observer=null):this.$element[0].removeEventListener&&(this.$element[0].removeEventListener("DOMAttrModified",this._syncA,!1),this.$element[0].removeEventListener("DOMNodeInserted",this._syncS,!1),this.$element[0].removeEventListener("DOMNodeRemoved",this._syncS,!1)),this._syncA=null,this._syncS=null,this.$element.off(".select2"),this.$element.attr("tabindex",c.GetData(this.$element[0],"old-tabindex")),this.$element.removeClass("select2-hidden-accessible"),this.$element.attr("aria-hidden","false"),c.RemoveData(this.$element[0]),this.$element.removeData("select2"),this.dataAdapter.destroy(),this.selection.destroy(),this.dropdown.destroy(),this.results.destroy(),this.dataAdapter=null,this.selection=null,this.dropdown=null,this.results=null},e.prototype.render=function(){var b=a('<span class="select2 select2-container"><span class="selection"></span><span class="dropdown-wrapper" aria-hidden="true"></span></span>');return b.attr("dir",this.options.get("dir")),this.$container=b,this.$container.addClass("select2-container--"+this.options.get("theme")),c.StoreData(b[0],"element",this.$element),b},e}),b.define("select2/compat/utils",["jquery"],function(a){function b(b,c,d){var e,f,g=[];e=a.trim(b.attr("class")),e&&(e=""+e,a(e.split(/\s+/)).each(function(){0===this.indexOf("select2-")&&g.push(this)})),e=a.trim(c.attr("class")),e&&(e=""+e,a(e.split(/\s+/)).each(function(){0!==this.indexOf("select2-")&&null!=(f=d(this))&&g.push(f)})),b.attr("class",g.join(" "))}return{syncCssClasses:b}}),b.define("select2/compat/containerCss",["jquery","./utils"],function(a,b){function c(a){return null}function d(){}return d.prototype.render=function(d){var e=d.call(this),f=this.options.get("containerCssClass")||"";a.isFunction(f)&&(f=f(this.$element));var g=this.options.get("adaptContainerCssClass");if(g=g||c,-1!==f.indexOf(":all:")){f=f.replace(":all:","");var h=g;g=function(a){var b=h(a);return null!=b?b+" "+a:a}}var i=this.options.get("containerCss")||{};return a.isFunction(i)&&(i=i(this.$element)),b.syncCssClasses(e,this.$element,g),e.css(i),e.addClass(f),e},d}),b.define("select2/compat/dropdownCss",["jquery","./utils"],function(a,b){function c(a){return null}function d(){}return d.prototype.render=function(d){var e=d.call(this),f=this.options.get("dropdownCssClass")||"";a.isFunction(f)&&(f=f(this.$element));var g=this.options.get("adaptDropdownCssClass");if(g=g||c,-1!==f.indexOf(":all:")){f=f.replace(":all:","");var h=g;g=function(a){var b=h(a);return null!=b?b+" "+a:a}}var i=this.options.get("dropdownCss")||{};return a.isFunction(i)&&(i=i(this.$element)),b.syncCssClasses(e,this.$element,g),e.css(i),e.addClass(f),e},d}),b.define("select2/compat/initSelection",["jquery"],function(a){function b(a,b,c){c.get("debug")&&window.console&&console.warn&&console.warn("Select2: The `initSelection` option has been deprecated in favor of a custom data adapter that overrides the `current` method. This method is now called multiple times instead of a single time when the instance is initialized. Support will be removed for the `initSelection` option in future versions of Select2"),this.initSelection=c.get("initSelection"),this._isInitialized=!1,a.call(this,b,c)}return b.prototype.current=function(b,c){var d=this;if(this._isInitialized)return void b.call(this,c);this.initSelection.call(null,this.$element,function(b){d._isInitialized=!0,a.isArray(b)||(b=[b]),c(b)})},b}),b.define("select2/compat/inputData",["jquery","../utils"],function(a,b){function c(a,b,c){this._currentData=[],this._valueSeparator=c.get("valueSeparator")||",","hidden"===b.prop("type")&&c.get("debug")&&console&&console.warn&&console.warn("Select2: Using a hidden input with Select2 is no longer supported and may stop working in the future. It is recommended to use a `<select>` element instead."),a.call(this,b,c)}return c.prototype.current=function(b,c){function d(b,c){var e=[];return b.selected||-1!==a.inArray(b.id,c)?(b.selected=!0,e.push(b)):b.selected=!1,b.children&&e.push.apply(e,d(b.children,c)),e}for(var e=[],f=0;f<this._currentData.length;f++){var g=this._currentData[f];e.push.apply(e,d(g,this.$element.val().split(this._valueSeparator)))}c(e)},c.prototype.select=function(b,c){if(this.options.get("multiple")){var d=this.$element.val();d+=this._valueSeparator+c.id,this.$element.val(d),this.$element.trigger("change")}else this.current(function(b){a.map(b,function(a){a.selected=!1})}),this.$element.val(c.id),this.$element.trigger("change")},c.prototype.unselect=function(a,b){var c=this;b.selected=!1,this.current(function(a){for(var d=[],e=0;e<a.length;e++){var f=a[e];b.id!=f.id&&d.push(f.id)}c.$element.val(d.join(c._valueSeparator)),c.$element.trigger("change")})},c.prototype.query=function(a,b,c){for(var d=[],e=0;e<this._currentData.length;e++){var f=this._currentData[e],g=this.matches(b,f);null!==g&&d.push(g)}c({results:d})},c.prototype.addOptions=function(c,d){var e=a.map(d,function(a){return b.GetData(a[0],"data")});this._currentData.push.apply(this._currentData,e)},c}),b.define("select2/compat/matcher",["jquery"],function(a){function b(b){function c(c,d){var e=a.extend(!0,{},d);if(null==c.term||""===a.trim(c.term))return e;if(d.children){for(var f=d.children.length-1;f>=0;f--){var g=d.children[f];b(c.term,g.text,g)||e.children.splice(f,1)}if(e.children.length>0)return e}return b(c.term,d.text,d)?e:null}return c}return b}),b.define("select2/compat/query",[],function(){function a(a,b,c){c.get("debug")&&window.console&&console.warn&&console.warn("Select2: The `query` option has been deprecated in favor of a custom data adapter that overrides the `query` method. Support will be removed for the `query` option in future versions of Select2."),a.call(this,b,c)}return a.prototype.query=function(a,b,c){b.callback=c,this.options.get("query").call(null,b)},a}),b.define("select2/dropdown/attachContainer",[],function(){function a(a,b,c){a.call(this,b,c)}return a.prototype.position=function(a,b,c){c.find(".dropdown-wrapper").append(b),b.addClass("select2-dropdown--below"),c.addClass("select2-container--below")},a}),b.define("select2/dropdown/stopPropagation",[],function(){function a(){}return a.prototype.bind=function(a,b,c){a.call(this,b,c);var d=["blur","change","click","dblclick","focus","focusin","focusout","input","keydown","keyup","keypress","mousedown","mouseenter","mouseleave","mousemove","mouseover","mouseup","search","touchend","touchstart"];this.$dropdown.on(d.join(" "),function(a){a.stopPropagation()})},a}),b.define("select2/selection/stopPropagation",[],function(){function a(){}return a.prototype.bind=function(a,b,c){a.call(this,b,c);var d=["blur","change","click","dblclick","focus","focusin","focusout","input","keydown","keyup","keypress","mousedown","mouseenter","mouseleave","mousemove","mouseover","mouseup","search","touchend","touchstart"];this.$selection.on(d.join(" "),function(a){a.stopPropagation()})},a}),function(c){"function"==typeof b.define&&b.define.amd?b.define("jquery-mousewheel",["jquery"],c):"object"==typeof exports?module.exports=c:c(a)}(function(a){function b(b){var g=b||window.event,h=i.call(arguments,1),j=0,l=0,m=0,n=0,o=0,p=0;if(b=a.event.fix(g),b.type="mousewheel","detail"in g&&(m=-1*g.detail),"wheelDelta"in g&&(m=g.wheelDelta),"wheelDeltaY"in g&&(m=g.wheelDeltaY),"wheelDeltaX"in g&&(l=-1*g.wheelDeltaX),"axis"in g&&g.axis===g.HORIZONTAL_AXIS&&(l=-1*m,m=0),j=0===m?l:m,"deltaY"in g&&(m=-1*g.deltaY,j=m),"deltaX"in g&&(l=g.deltaX,0===m&&(j=-1*l)),0!==m||0!==l){if(1===g.deltaMode){var q=a.data(this,"mousewheel-line-height");j*=q,m*=q,l*=q}else if(2===g.deltaMode){var r=a.data(this,"mousewheel-page-height");j*=r,m*=r,l*=r}if(n=Math.max(Math.abs(m),Math.abs(l)),(!f||n<f)&&(f=n,d(g,n)&&(f/=40)),d(g,n)&&(j/=40,l/=40,m/=40),j=Math[j>=1?"floor":"ceil"](j/f),l=Math[l>=1?"floor":"ceil"](l/f),m=Math[m>=1?"floor":"ceil"](m/f),k.settings.normalizeOffset&&this.getBoundingClientRect){var s=this.getBoundingClientRect();o=b.clientX-s.left,p=b.clientY-s.top}return b.deltaX=l,b.deltaY=m,b.deltaFactor=f,b.offsetX=o,b.offsetY=p,b.deltaMode=0,h.unshift(b,j,l,m),e&&clearTimeout(e),e=setTimeout(c,200),(a.event.dispatch||a.event.handle).apply(this,h)}}function c(){f=null}function d(a,b){return k.settings.adjustOldDeltas&&"mousewheel"===a.type&&b%120==0}var e,f,g=["wheel","mousewheel","DOMMouseScroll","MozMousePixelScroll"],h="onwheel"in document||document.documentMode>=9?["wheel"]:["mousewheel","DomMouseScroll","MozMousePixelScroll"],i=Array.prototype.slice;if(a.event.fixHooks)for(var j=g.length;j;)a.event.fixHooks[g[--j]]=a.event.mouseHooks;var k=a.event.special.mousewheel={version:"3.1.12",setup:function(){if(this.addEventListener)for(var c=h.length;c;)this.addEventListener(h[--c],b,!1);else this.onmousewheel=b;a.data(this,"mousewheel-line-height",k.getLineHeight(this)),a.data(this,"mousewheel-page-height",k.getPageHeight(this))},teardown:function(){if(this.removeEventListener)for(var c=h.length;c;)this.removeEventListener(h[--c],b,!1);else this.onmousewheel=null;a.removeData(this,"mousewheel-line-height"),a.removeData(this,"mousewheel-page-height")},getLineHeight:function(b){var c=a(b),d=c["offsetParent"in a.fn?"offsetParent":"parent"]();return d.length||(d=a("body")),parseInt(d.css("fontSize"),10)||parseInt(c.css("fontSize"),10)||16},getPageHeight:function(b){return a(b).height()},settings:{adjustOldDeltas:!0,normalizeOffset:!0}};a.fn.extend({mousewheel:function(a){return a?this.bind("mousewheel",a):this.trigger("mousewheel")},unmousewheel:function(a){return this.unbind("mousewheel",a)}})}),b.define("jquery.select2",["jquery","jquery-mousewheel","./select2/core","./select2/defaults","./select2/utils"],function(a,b,c,d,e){if(null==a.fn.select2){var f=["open","close","destroy"];a.fn.select2=function(b){if("object"==typeof(b=b||{}))return this.each(function(){var d=a.extend(!0,{},b);new c(a(this),d)}),this;if("string"==typeof b){var d,g=Array.prototype.slice.call(arguments,1);return this.each(function(){var a=e.GetData(this,"select2");null==a&&window.console&&console.error&&console.error("The select2('"+b+"') method was called on an element that is not using Select2."),d=a[b].apply(a,g)}),a.inArray(b,f)>-1?this:d}throw new Error("Invalid arguments for Select2: "+b)}}return null==a.fn.select2.defaults&&(a.fn.select2.defaults=d),c}),{define:b.define,require:b.require}}(),c=b.require("jquery.select2");return a.fn.select2.amd=b,c});
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/FancySelects/select2-4.0.6-rc.1-dist/js/select2.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/FancySelects/select2-4.0.6-rc.1-dist/js/select2.js
deleted file mode 100644
index 73d33af..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/FancySelects/select2-4.0.6-rc.1-dist/js/select2.js
+++ /dev/null
@@ -1,5847 +0,0 @@
-/*!
- * Select2 4.0.6-rc.1
- * https://select2.github.io
- *
- * Released under the MIT license
- * https://github.com/select2/select2/blob/master/LICENSE.md
- */
-;(function (factory) {
-  if (typeof define === 'function' && define.amd) {
-    // AMD. Register as an anonymous module.
-    define(['jquery'], factory);
-  } else if (typeof module === 'object' && module.exports) {
-    // Node/CommonJS
-    module.exports = function (root, jQuery) {
-      if (jQuery === undefined) {
-        // require('jQuery') returns a factory that requires window to
-        // build a jQuery instance, we normalize how we use modules
-        // that require this pattern but the window provided is a noop
-        // if it's defined (how jquery works)
-        if (typeof window !== 'undefined') {
-          jQuery = require('jquery');
-        }
-        else {
-          jQuery = require('jquery')(root);
-        }
-      }
-      factory(jQuery);
-      return jQuery;
-    };
-  } else {
-    // Browser globals
-    factory(jQuery);
-  }
-} (function (jQuery) {
-  // This is needed so we can catch the AMD loader configuration and use it
-  // The inner file should be wrapped (by `banner.start.js`) in a function that
-  // returns the AMD loader references.
-  var S2 =(function () {
-  // Restore the Select2 AMD loader so it can be used
-  // Needed mostly in the language files, where the loader is not inserted
-  if (jQuery && jQuery.fn && jQuery.fn.select2 && jQuery.fn.select2.amd) {
-    var S2 = jQuery.fn.select2.amd;
-  }
-var S2;(function () { if (!S2 || !S2.requirejs) {
-if (!S2) { S2 = {}; } else { require = S2; }
-/**
- * @license almond 0.3.3 Copyright jQuery Foundation and other contributors.
- * Released under MIT license, http://github.com/requirejs/almond/LICENSE
- */
-//Going sloppy to avoid 'use strict' string cost, but strict practices should
-//be followed.
-/*global setTimeout: false */
-
-var requirejs, require, define;
-(function (undef) {
-    var main, req, makeMap, handlers,
-        defined = {},
-        waiting = {},
-        config = {},
-        defining = {},
-        hasOwn = Object.prototype.hasOwnProperty,
-        aps = [].slice,
-        jsSuffixRegExp = /\.js$/;
-
-    function hasProp(obj, prop) {
-        return hasOwn.call(obj, prop);
-    }
-
-    /**
-     * Given a relative module name, like ./something, normalize it to
-     * a real name that can be mapped to a path.
-     * @param {String} name the relative name
-     * @param {String} baseName a real name that the name arg is relative
-     * to.
-     * @returns {String} normalized name
-     */
-    function normalize(name, baseName) {
-        var nameParts, nameSegment, mapValue, foundMap, lastIndex,
-            foundI, foundStarMap, starI, i, j, part, normalizedBaseParts,
-            baseParts = baseName && baseName.split("/"),
-            map = config.map,
-            starMap = (map && map['*']) || {};
-
-        //Adjust any relative paths.
-        if (name) {
-            name = name.split('/');
-            lastIndex = name.length - 1;
-
-            // If wanting node ID compatibility, strip .js from end
-            // of IDs. Have to do this here, and not in nameToUrl
-            // because node allows either .js or non .js to map
-            // to same file.
-            if (config.nodeIdCompat && jsSuffixRegExp.test(name[lastIndex])) {
-                name[lastIndex] = name[lastIndex].replace(jsSuffixRegExp, '');
-            }
-
-            // Starts with a '.' so need the baseName
-            if (name[0].charAt(0) === '.' && baseParts) {
-                //Convert baseName to array, and lop off the last part,
-                //so that . matches that 'directory' and not name of the baseName's
-                //module. For instance, baseName of 'one/two/three', maps to
-                //'one/two/three.js', but we want the directory, 'one/two' for
-                //this normalization.
-                normalizedBaseParts = baseParts.slice(0, baseParts.length - 1);
-                name = normalizedBaseParts.concat(name);
-            }
-
-            //start trimDots
-            for (i = 0; i < name.length; i++) {
-                part = name[i];
-                if (part === '.') {
-                    name.splice(i, 1);
-                    i -= 1;
-                } else if (part === '..') {
-                    // If at the start, or previous value is still ..,
-                    // keep them so that when converted to a path it may
-                    // still work when converted to a path, even though
-                    // as an ID it is less than ideal. In larger point
-                    // releases, may be better to just kick out an error.
-                    if (i === 0 || (i === 1 && name[2] === '..') || name[i - 1] === '..') {
-                        continue;
-                    } else if (i > 0) {
-                        name.splice(i - 1, 2);
-                        i -= 2;
-                    }
-                }
-            }
-            //end trimDots
-
-            name = name.join('/');
-        }
-
-        //Apply map config if available.
-        if ((baseParts || starMap) && map) {
-            nameParts = name.split('/');
-
-            for (i = nameParts.length; i > 0; i -= 1) {
-                nameSegment = nameParts.slice(0, i).join("/");
-
-                if (baseParts) {
-                    //Find the longest baseName segment match in the config.
-                    //So, do joins on the biggest to smallest lengths of baseParts.
-                    for (j = baseParts.length; j > 0; j -= 1) {
-                        mapValue = map[baseParts.slice(0, j).join('/')];
-
-                        //baseName segment has  config, find if it has one for
-                        //this name.
-                        if (mapValue) {
-                            mapValue = mapValue[nameSegment];
-                            if (mapValue) {
-                                //Match, update name to the new value.
-                                foundMap = mapValue;
-                                foundI = i;
-                                break;
-                            }
-                        }
-                    }
-                }
-
-                if (foundMap) {
-                    break;
-                }
-
-                //Check for a star map match, but just hold on to it,
-                //if there is a shorter segment match later in a matching
-                //config, then favor over this star map.
-                if (!foundStarMap && starMap && starMap[nameSegment]) {
-                    foundStarMap = starMap[nameSegment];
-                    starI = i;
-                }
-            }
-
-            if (!foundMap && foundStarMap) {
-                foundMap = foundStarMap;
-                foundI = starI;
-            }
-
-            if (foundMap) {
-                nameParts.splice(0, foundI, foundMap);
-                name = nameParts.join('/');
-            }
-        }
-
-        return name;
-    }
-
-    function makeRequire(relName, forceSync) {
-        return function () {
-            //A version of a require function that passes a moduleName
-            //value for items that may need to
-            //look up paths relative to the moduleName
-            var args = aps.call(arguments, 0);
-
-            //If first arg is not require('string'), and there is only
-            //one arg, it is the array form without a callback. Insert
-            //a null so that the following concat is correct.
-            if (typeof args[0] !== 'string' && args.length === 1) {
-                args.push(null);
-            }
-            return req.apply(undef, args.concat([relName, forceSync]));
-        };
-    }
-
-    function makeNormalize(relName) {
-        return function (name) {
-            return normalize(name, relName);
-        };
-    }
-
-    function makeLoad(depName) {
-        return function (value) {
-            defined[depName] = value;
-        };
-    }
-
-    function callDep(name) {
-        if (hasProp(waiting, name)) {
-            var args = waiting[name];
-            delete waiting[name];
-            defining[name] = true;
-            main.apply(undef, args);
-        }
-
-        if (!hasProp(defined, name) && !hasProp(defining, name)) {
-            throw new Error('No ' + name);
-        }
-        return defined[name];
-    }
-
-    //Turns a plugin!resource to [plugin, resource]
-    //with the plugin being undefined if the name
-    //did not have a plugin prefix.
-    function splitPrefix(name) {
-        var prefix,
-            index = name ? name.indexOf('!') : -1;
-        if (index > -1) {
-            prefix = name.substring(0, index);
-            name = name.substring(index + 1, name.length);
-        }
-        return [prefix, name];
-    }
-
-    //Creates a parts array for a relName where first part is plugin ID,
-    //second part is resource ID. Assumes relName has already been normalized.
-    function makeRelParts(relName) {
-        return relName ? splitPrefix(relName) : [];
-    }
-
-    /**
-     * Makes a name map, normalizing the name, and using a plugin
-     * for normalization if necessary. Grabs a ref to plugin
-     * too, as an optimization.
-     */
-    makeMap = function (name, relParts) {
-        var plugin,
-            parts = splitPrefix(name),
-            prefix = parts[0],
-            relResourceName = relParts[1];
-
-        name = parts[1];
-
-        if (prefix) {
-            prefix = normalize(prefix, relResourceName);
-            plugin = callDep(prefix);
-        }
-
-        //Normalize according
-        if (prefix) {
-            if (plugin && plugin.normalize) {
-                name = plugin.normalize(name, makeNormalize(relResourceName));
-            } else {
-                name = normalize(name, relResourceName);
-            }
-        } else {
-            name = normalize(name, relResourceName);
-            parts = splitPrefix(name);
-            prefix = parts[0];
-            name = parts[1];
-            if (prefix) {
-                plugin = callDep(prefix);
-            }
-        }
-
-        //Using ridiculous property names for space reasons
-        return {
-            f: prefix ? prefix + '!' + name : name, //fullName
-            n: name,
-            pr: prefix,
-            p: plugin
-        };
-    };
-
-    function makeConfig(name) {
-        return function () {
-            return (config && config.config && config.config[name]) || {};
-        };
-    }
-
-    handlers = {
-        require: function (name) {
-            return makeRequire(name);
-        },
-        exports: function (name) {
-            var e = defined[name];
-            if (typeof e !== 'undefined') {
-                return e;
-            } else {
-                return (defined[name] = {});
-            }
-        },
-        module: function (name) {
-            return {
-                id: name,
-                uri: '',
-                exports: defined[name],
-                config: makeConfig(name)
-            };
-        }
-    };
-
-    main = function (name, deps, callback, relName) {
-        var cjsModule, depName, ret, map, i, relParts,
-            args = [],
-            callbackType = typeof callback,
-            usingExports;
-
-        //Use name if no relName
-        relName = relName || name;
-        relParts = makeRelParts(relName);
-
-        //Call the callback to define the module, if necessary.
-        if (callbackType === 'undefined' || callbackType === 'function') {
-            //Pull out the defined dependencies and pass the ordered
-            //values to the callback.
-            //Default to [require, exports, module] if no deps
-            deps = !deps.length && callback.length ? ['require', 'exports', 'module'] : deps;
-            for (i = 0; i < deps.length; i += 1) {
-                map = makeMap(deps[i], relParts);
-                depName = map.f;
-
-                //Fast path CommonJS standard dependencies.
-                if (depName === "require") {
-                    args[i] = handlers.require(name);
-                } else if (depName === "exports") {
-                    //CommonJS module spec 1.1
-                    args[i] = handlers.exports(name);
-                    usingExports = true;
-                } else if (depName === "module") {
-                    //CommonJS module spec 1.1
-                    cjsModule = args[i] = handlers.module(name);
-                } else if (hasProp(defined, depName) ||
-                           hasProp(waiting, depName) ||
-                           hasProp(defining, depName)) {
-                    args[i] = callDep(depName);
-                } else if (map.p) {
-                    map.p.load(map.n, makeRequire(relName, true), makeLoad(depName), {});
-                    args[i] = defined[depName];
-                } else {
-                    throw new Error(name + ' missing ' + depName);
-                }
-            }
-
-            ret = callback ? callback.apply(defined[name], args) : undefined;
-
-            if (name) {
-                //If setting exports via "module" is in play,
-                //favor that over return value and exports. After that,
-                //favor a non-undefined return value over exports use.
-                if (cjsModule && cjsModule.exports !== undef &&
-                        cjsModule.exports !== defined[name]) {
-                    defined[name] = cjsModule.exports;
-                } else if (ret !== undef || !usingExports) {
-                    //Use the return value from the function.
-                    defined[name] = ret;
-                }
-            }
-        } else if (name) {
-            //May just be an object definition for the module. Only
-            //worry about defining if have a module name.
-            defined[name] = callback;
-        }
-    };
-
-    requirejs = require = req = function (deps, callback, relName, forceSync, alt) {
-        if (typeof deps === "string") {
-            if (handlers[deps]) {
-                //callback in this case is really relName
-                return handlers[deps](callback);
-            }
-            //Just return the module wanted. In this scenario, the
-            //deps arg is the module name, and second arg (if passed)
-            //is just the relName.
-            //Normalize module name, if it contains . or ..
-            return callDep(makeMap(deps, makeRelParts(callback)).f);
-        } else if (!deps.splice) {
-            //deps is a config object, not an array.
-            config = deps;
-            if (config.deps) {
-                req(config.deps, config.callback);
-            }
-            if (!callback) {
-                return;
-            }
-
-            if (callback.splice) {
-                //callback is an array, which means it is a dependency list.
-                //Adjust args if there are dependencies
-                deps = callback;
-                callback = relName;
-                relName = null;
-            } else {
-                deps = undef;
-            }
-        }
-
-        //Support require(['a'])
-        callback = callback || function () {};
-
-        //If relName is a function, it is an errback handler,
-        //so remove it.
-        if (typeof relName === 'function') {
-            relName = forceSync;
-            forceSync = alt;
-        }
-
-        //Simulate async callback;
-        if (forceSync) {
-            main(undef, deps, callback, relName);
-        } else {
-            //Using a non-zero value because of concern for what old browsers
-            //do, and latest browsers "upgrade" to 4 if lower value is used:
-            //http://www.whatwg.org/specs/web-apps/current-work/multipage/timers.html#dom-windowtimers-settimeout:
-            //If want a value immediately, use require('id') instead -- something
-            //that works in almond on the global level, but not guaranteed and
-            //unlikely to work in other AMD implementations.
-            setTimeout(function () {
-                main(undef, deps, callback, relName);
-            }, 4);
-        }
-
-        return req;
-    };
-
-    /**
-     * Just drops the config on the floor, but returns req in case
-     * the config return value is used.
-     */
-    req.config = function (cfg) {
-        return req(cfg);
-    };
-
-    /**
-     * Expose module registry for debugging and tooling
-     */
-    requirejs._defined = defined;
-
-    define = function (name, deps, callback) {
-        if (typeof name !== 'string') {
-            throw new Error('See almond README: incorrect module build, no module name');
-        }
-
-        //This module may not have dependencies
-        if (!deps.splice) {
-            //deps is not an array, so probably means
-            //an object literal or factory function for
-            //the value. Adjust args.
-            callback = deps;
-            deps = [];
-        }
-
-        if (!hasProp(defined, name) && !hasProp(waiting, name)) {
-            waiting[name] = [name, deps, callback];
-        }
-    };
-
-    define.amd = {
-        jQuery: true
-    };
-}());
-
-S2.requirejs = requirejs;S2.require = require;S2.define = define;
-}
-}());
-S2.define("almond", function(){});
-
-/* global jQuery:false, $:false */
-S2.define('jquery',[],function () {
-  var _$ = jQuery || $;
-
-  if (_$ == null && console && console.error) {
-    console.error(
-      'Select2: An instance of jQuery or a jQuery-compatible library was not ' +
-      'found. Make sure that you are including jQuery before Select2 on your ' +
-      'web page.'
-    );
-  }
-
-  return _$;
-});
-
-S2.define('select2/utils',[
-  'jquery'
-], function ($) {
-  var Utils = {};
-
-  Utils.Extend = function (ChildClass, SuperClass) {
-    var __hasProp = {}.hasOwnProperty;
-
-    function BaseConstructor () {
-      this.constructor = ChildClass;
-    }
-
-    for (var key in SuperClass) {
-      if (__hasProp.call(SuperClass, key)) {
-        ChildClass[key] = SuperClass[key];
-      }
-    }
-
-    BaseConstructor.prototype = SuperClass.prototype;
-    ChildClass.prototype = new BaseConstructor();
-    ChildClass.__super__ = SuperClass.prototype;
-
-    return ChildClass;
-  };
-
-  function getMethods (theClass) {
-    var proto = theClass.prototype;
-
-    var methods = [];
-
-    for (var methodName in proto) {
-      var m = proto[methodName];
-
-      if (typeof m !== 'function') {
-        continue;
-      }
-
-      if (methodName === 'constructor') {
-        continue;
-      }
-
-      methods.push(methodName);
-    }
-
-    return methods;
-  }
-
-  Utils.Decorate = function (SuperClass, DecoratorClass) {
-    var decoratedMethods = getMethods(DecoratorClass);
-    var superMethods = getMethods(SuperClass);
-
-    function DecoratedClass () {
-      var unshift = Array.prototype.unshift;
-
-      var argCount = DecoratorClass.prototype.constructor.length;
-
-      var calledConstructor = SuperClass.prototype.constructor;
-
-      if (argCount > 0) {
-        unshift.call(arguments, SuperClass.prototype.constructor);
-
-        calledConstructor = DecoratorClass.prototype.constructor;
-      }
-
-      calledConstructor.apply(this, arguments);
-    }
-
-    DecoratorClass.displayName = SuperClass.displayName;
-
-    function ctr () {
-      this.constructor = DecoratedClass;
-    }
-
-    DecoratedClass.prototype = new ctr();
-
-    for (var m = 0; m < superMethods.length; m++) {
-      var superMethod = superMethods[m];
-
-      DecoratedClass.prototype[superMethod] =
-        SuperClass.prototype[superMethod];
-    }
-
-    var calledMethod = function (methodName) {
-      // Stub out the original method if it's not decorating an actual method
-      var originalMethod = function () {};
-
-      if (methodName in DecoratedClass.prototype) {
-        originalMethod = DecoratedClass.prototype[methodName];
-      }
-
-      var decoratedMethod = DecoratorClass.prototype[methodName];
-
-      return function () {
-        var unshift = Array.prototype.unshift;
-
-        unshift.call(arguments, originalMethod);
-
-        return decoratedMethod.apply(this, arguments);
-      };
-    };
-
-    for (var d = 0; d < decoratedMethods.length; d++) {
-      var decoratedMethod = decoratedMethods[d];
-
-      DecoratedClass.prototype[decoratedMethod] = calledMethod(decoratedMethod);
-    }
-
-    return DecoratedClass;
-  };
-
-  var Observable = function () {
-    this.listeners = {};
-  };
-
-  Observable.prototype.on = function (event, callback) {
-    this.listeners = this.listeners || {};
-
-    if (event in this.listeners) {
-      this.listeners[event].push(callback);
-    } else {
-      this.listeners[event] = [callback];
-    }
-  };
-
-  Observable.prototype.trigger = function (event) {
-    var slice = Array.prototype.slice;
-    var params = slice.call(arguments, 1);
-
-    this.listeners = this.listeners || {};
-
-    // Params should always come in as an array
-    if (params == null) {
-      params = [];
-    }
-
-    // If there are no arguments to the event, use a temporary object
-    if (params.length === 0) {
-      params.push({});
-    }
-
-    // Set the `_type` of the first object to the event
-    params[0]._type = event;
-
-    if (event in this.listeners) {
-      this.invoke(this.listeners[event], slice.call(arguments, 1));
-    }
-
-    if ('*' in this.listeners) {
-      this.invoke(this.listeners['*'], arguments);
-    }
-  };
-
-  Observable.prototype.invoke = function (listeners, params) {
-    for (var i = 0, len = listeners.length; i < len; i++) {
-      listeners[i].apply(this, params);
-    }
-  };
-
-  Utils.Observable = Observable;
-
-  Utils.generateChars = function (length) {
-    var chars = '';
-
-    for (var i = 0; i < length; i++) {
-      var randomChar = Math.floor(Math.random() * 36);
-      chars += randomChar.toString(36);
-    }
-
-    return chars;
-  };
-
-  Utils.bind = function (func, context) {
-    return function () {
-      func.apply(context, arguments);
-    };
-  };
-
-  Utils._convertData = function (data) {
-    for (var originalKey in data) {
-      var keys = originalKey.split('-');
-
-      var dataLevel = data;
-
-      if (keys.length === 1) {
-        continue;
-      }
-
-      for (var k = 0; k < keys.length; k++) {
-        var key = keys[k];
-
-        // Lowercase the first letter
-        // By default, dash-separated becomes camelCase
-        key = key.substring(0, 1).toLowerCase() + key.substring(1);
-
-        if (!(key in dataLevel)) {
-          dataLevel[key] = {};
-        }
-
-        if (k == keys.length - 1) {
-          dataLevel[key] = data[originalKey];
-        }
-
-        dataLevel = dataLevel[key];
-      }
-
-      delete data[originalKey];
-    }
-
-    return data;
-  };
-
-  Utils.hasScroll = function (index, el) {
-    // Adapted from the function created by @ShadowScripter
-    // and adapted by @BillBarry on the Stack Exchange Code Review website.
-    // The original code can be found at
-    // http://codereview.stackexchange.com/q/13338
-    // and was designed to be used with the Sizzle selector engine.
-
-    var $el = $(el);
-    var overflowX = el.style.overflowX;
-    var overflowY = el.style.overflowY;
-
-    //Check both x and y declarations
-    if (overflowX === overflowY &&
-        (overflowY === 'hidden' || overflowY === 'visible')) {
-      return false;
-    }
-
-    if (overflowX === 'scroll' || overflowY === 'scroll') {
-      return true;
-    }
-
-    return ($el.innerHeight() < el.scrollHeight ||
-      $el.innerWidth() < el.scrollWidth);
-  };
-
-  Utils.escapeMarkup = function (markup) {
-    var replaceMap = {
-      '\\': '&#92;',
-      '&': '&amp;',
-      '<': '&lt;',
-      '>': '&gt;',
-      '"': '&quot;',
-      '\'': '&#39;',
-      '/': '&#47;'
-    };
-
-    // Do not try to escape the markup if it's not a string
-    if (typeof markup !== 'string') {
-      return markup;
-    }
-
-    return String(markup).replace(/[&<>"'\/\\]/g, function (match) {
-      return replaceMap[match];
-    });
-  };
-
-  // Append an array of jQuery nodes to a given element.
-  Utils.appendMany = function ($element, $nodes) {
-    // jQuery 1.7.x does not support $.fn.append() with an array
-    // Fall back to a jQuery object collection using $.fn.add()
-    if ($.fn.jquery.substr(0, 3) === '1.7') {
-      var $jqNodes = $();
-
-      $.map($nodes, function (node) {
-        $jqNodes = $jqNodes.add(node);
-      });
-
-      $nodes = $jqNodes;
-    }
-
-    $element.append($nodes);
-  };
-
-  // Cache objects in Utils.__cache instead of $.data (see #4346)
-  Utils.__cache = {};
-
-  var id = 0;
-  Utils.GetUniqueElementId = function (element) {
-    // Get a unique element Id. If element has no id, 
-    // creates a new unique number, stores it in the id 
-    // attribute and returns the new id. 
-    // If an id already exists, it simply returns it.
-
-    var select2Id = element.getAttribute('data-select2-id');
-    if (select2Id == null) {
-      // If element has id, use it.
-      if (element.id) {
-        select2Id = element.id;
-        element.setAttribute('data-select2-id', select2Id);
-      } else {
-        element.setAttribute('data-select2-id', ++id);
-        select2Id = id.toString();
-      }
-    }
-    return select2Id;
-  };
-
-  Utils.StoreData = function (element, name, value) {
-    // Stores an item in the cache for a specified element.
-    // name is the cache key.    
-    var id = Utils.GetUniqueElementId(element);
-    if (!Utils.__cache[id]) {
-      Utils.__cache[id] = {};
-    }
-
-    Utils.__cache[id][name] = value;
-  };
-
-  Utils.GetData = function (element, name) {
-    // Retrieves a value from the cache by its key (name)
-    // name is optional. If no name specified, return 
-    // all cache items for the specified element.
-    // and for a specified element.
-    var id = Utils.GetUniqueElementId(element);
-    if (name) {
-      if (Utils.__cache[id]) {
-        return Utils.__cache[id][name] != null ? 
-	      Utils.__cache[id][name]:
-	      $(element).data(name); // Fallback to HTML5 data attribs.
-      }
-      return $(element).data(name); // Fallback to HTML5 data attribs.
-    } else {
-      return Utils.__cache[id];			   
-    }
-  };
-
-  Utils.RemoveData = function (element) {
-    // Removes all cached items for a specified element.
-    var id = Utils.GetUniqueElementId(element);
-    if (Utils.__cache[id] != null) {
-      delete Utils.__cache[id];
-    }
-  };
-
-  return Utils;
-});
-
-S2.define('select2/results',[
-  'jquery',
-  './utils'
-], function ($, Utils) {
-  function Results ($element, options, dataAdapter) {
-    this.$element = $element;
-    this.data = dataAdapter;
-    this.options = options;
-
-    Results.__super__.constructor.call(this);
-  }
-
-  Utils.Extend(Results, Utils.Observable);
-
-  Results.prototype.render = function () {
-    var $results = $(
-      '<ul class="select2-results__options" role="tree"></ul>'
-    );
-
-    if (this.options.get('multiple')) {
-      $results.attr('aria-multiselectable', 'true');
-    }
-
-    this.$results = $results;
-
-    return $results;
-  };
-
-  Results.prototype.clear = function () {
-    this.$results.empty();
-  };
-
-  Results.prototype.displayMessage = function (params) {
-    var escapeMarkup = this.options.get('escapeMarkup');
-
-    this.clear();
-    this.hideLoading();
-
-    var $message = $(
-      '<li role="treeitem" aria-live="assertive"' +
-      ' class="select2-results__option"></li>'
-    );
-
-    var message = this.options.get('translations').get(params.message);
-
-    $message.append(
-      escapeMarkup(
-        message(params.args)
-      )
-    );
-
-    $message[0].className += ' select2-results__message';
-
-    this.$results.append($message);
-  };
-
-  Results.prototype.hideMessages = function () {
-    this.$results.find('.select2-results__message').remove();
-  };
-
-  Results.prototype.append = function (data) {
-    this.hideLoading();
-
-    var $options = [];
-
-    if (data.results == null || data.results.length === 0) {
-      if (this.$results.children().length === 0) {
-        this.trigger('results:message', {
-          message: 'noResults'
-        });
-      }
-
-      return;
-    }
-
-    data.results = this.sort(data.results);
-
-    for (var d = 0; d < data.results.length; d++) {
-      var item = data.results[d];
-
-      var $option = this.option(item);
-
-      $options.push($option);
-    }
-
-    this.$results.append($options);
-  };
-
-  Results.prototype.position = function ($results, $dropdown) {
-    var $resultsContainer = $dropdown.find('.select2-results');
-    $resultsContainer.append($results);
-  };
-
-  Results.prototype.sort = function (data) {
-    var sorter = this.options.get('sorter');
-
-    return sorter(data);
-  };
-
-  Results.prototype.highlightFirstItem = function () {
-    var $options = this.$results
-      .find('.select2-results__option[aria-selected]');
-
-    var $selected = $options.filter('[aria-selected=true]');
-
-    // Check if there are any selected options
-    if ($selected.length > 0) {
-      // If there are selected options, highlight the first
-      $selected.first().trigger('mouseenter');
-    } else {
-      // If there are no selected options, highlight the first option
-      // in the dropdown
-      $options.first().trigger('mouseenter');
-    }
-
-    this.ensureHighlightVisible();
-  };
-
-  Results.prototype.setClasses = function () {
-    var self = this;
-
-    this.data.current(function (selected) {
-      var selectedIds = $.map(selected, function (s) {
-        return s.id.toString();
-      });
-
-      var $options = self.$results
-        .find('.select2-results__option[aria-selected]');
-
-      $options.each(function () {
-        var $option = $(this);
-
-        var item = Utils.GetData(this, 'data');
-
-        // id needs to be converted to a string when comparing
-        var id = '' + item.id;
-
-        if ((item.element != null && item.element.selected) ||
-            (item.element == null && $.inArray(id, selectedIds) > -1)) {
-          $option.attr('aria-selected', 'true');
-        } else {
-          $option.attr('aria-selected', 'false');
-        }
-      });
-
-    });
-  };
-
-  Results.prototype.showLoading = function (params) {
-    this.hideLoading();
-
-    var loadingMore = this.options.get('translations').get('searching');
-
-    var loading = {
-      disabled: true,
-      loading: true,
-      text: loadingMore(params)
-    };
-    var $loading = this.option(loading);
-    $loading.className += ' loading-results';
-
-    this.$results.prepend($loading);
-  };
-
-  Results.prototype.hideLoading = function () {
-    this.$results.find('.loading-results').remove();
-  };
-
-  Results.prototype.option = function (data) {
-    var option = document.createElement('li');
-    option.className = 'select2-results__option';
-
-    var attrs = {
-      'role': 'treeitem',
-      'aria-selected': 'false'
-    };
-
-    if (data.disabled) {
-      delete attrs['aria-selected'];
-      attrs['aria-disabled'] = 'true';
-    }
-
-    if (data.id == null) {
-      delete attrs['aria-selected'];
-    }
-
-    if (data._resultId != null) {
-      option.id = data._resultId;
-    }
-
-    if (data.title) {
-      option.title = data.title;
-    }
-
-    if (data.children) {
-      attrs.role = 'group';
-      attrs['aria-label'] = data.text;
-      delete attrs['aria-selected'];
-    }
-
-    for (var attr in attrs) {
-      var val = attrs[attr];
-
-      option.setAttribute(attr, val);
-    }
-
-    if (data.children) {
-      var $option = $(option);
-
-      var label = document.createElement('strong');
-      label.className = 'select2-results__group';
-
-      var $label = $(label);
-      this.template(data, label);
-
-      var $children = [];
-
-      for (var c = 0; c < data.children.length; c++) {
-        var child = data.children[c];
-
-        var $child = this.option(child);
-
-        $children.push($child);
-      }
-
-      var $childrenContainer = $('<ul></ul>', {
-        'class': 'select2-results__options select2-results__options--nested'
-      });
-
-      $childrenContainer.append($children);
-
-      $option.append(label);
-      $option.append($childrenContainer);
-    } else {
-      this.template(data, option);
-    }
-
-    Utils.StoreData(option, 'data', data);
-
-    return option;
-  };
-
-  Results.prototype.bind = function (container, $container) {
-    var self = this;
-
-    var id = container.id + '-results';
-
-    this.$results.attr('id', id);
-
-    container.on('results:all', function (params) {
-      self.clear();
-      self.append(params.data);
-
-      if (container.isOpen()) {
-        self.setClasses();
-        self.highlightFirstItem();
-      }
-    });
-
-    container.on('results:append', function (params) {
-      self.append(params.data);
-
-      if (container.isOpen()) {
-        self.setClasses();
-      }
-    });
-
-    container.on('query', function (params) {
-      self.hideMessages();
-      self.showLoading(params);
-    });
-
-    container.on('select', function () {
-      if (!container.isOpen()) {
-        return;
-      }
-
-      self.setClasses();
-      self.highlightFirstItem();
-    });
-
-    container.on('unselect', function () {
-      if (!container.isOpen()) {
-        return;
-      }
-
-      self.setClasses();
-      self.highlightFirstItem();
-    });
-
-    container.on('open', function () {
-      // When the dropdown is open, aria-expended="true"
-      self.$results.attr('aria-expanded', 'true');
-      self.$results.attr('aria-hidden', 'false');
-
-      self.setClasses();
-      self.ensureHighlightVisible();
-    });
-
-    container.on('close', function () {
-      // When the dropdown is closed, aria-expended="false"
-      self.$results.attr('aria-expanded', 'false');
-      self.$results.attr('aria-hidden', 'true');
-      self.$results.removeAttr('aria-activedescendant');
-    });
-
-    container.on('results:toggle', function () {
-      var $highlighted = self.getHighlightedResults();
-
-      if ($highlighted.length === 0) {
-        return;
-      }
-
-      $highlighted.trigger('mouseup');
-    });
-
-    container.on('results:select', function () {
-      var $highlighted = self.getHighlightedResults();
-
-      if ($highlighted.length === 0) {
-        return;
-      }
-
-      var data = Utils.GetData($highlighted[0], 'data');
-
-      if ($highlighted.attr('aria-selected') == 'true') {
-        self.trigger('close', {});
-      } else {
-        self.trigger('select', {
-          data: data
-        });
-      }
-    });
-
-    container.on('results:previous', function () {
-      var $highlighted = self.getHighlightedResults();
-
-      var $options = self.$results.find('[aria-selected]');
-
-      var currentIndex = $options.index($highlighted);
-
-      // If we are already at te top, don't move further
-      // If no options, currentIndex will be -1
-      if (currentIndex <= 0) {
-        return;
-      }
-
-      var nextIndex = currentIndex - 1;
-
-      // If none are highlighted, highlight the first
-      if ($highlighted.length === 0) {
-        nextIndex = 0;
-      }
-
-      var $next = $options.eq(nextIndex);
-
-      $next.trigger('mouseenter');
-
-      var currentOffset = self.$results.offset().top;
-      var nextTop = $next.offset().top;
-      var nextOffset = self.$results.scrollTop() + (nextTop - currentOffset);
-
-      if (nextIndex === 0) {
-        self.$results.scrollTop(0);
-      } else if (nextTop - currentOffset < 0) {
-        self.$results.scrollTop(nextOffset);
-      }
-    });
-
-    container.on('results:next', function () {
-      var $highlighted = self.getHighlightedResults();
-
-      var $options = self.$results.find('[aria-selected]');
-
-      var currentIndex = $options.index($highlighted);
-
-      var nextIndex = currentIndex + 1;
-
-      // If we are at the last option, stay there
-      if (nextIndex >= $options.length) {
-        return;
-      }
-
-      var $next = $options.eq(nextIndex);
-
-      $next.trigger('mouseenter');
-
-      var currentOffset = self.$results.offset().top +
-        self.$results.outerHeight(false);
-      var nextBottom = $next.offset().top + $next.outerHeight(false);
-      var nextOffset = self.$results.scrollTop() + nextBottom - currentOffset;
-
-      if (nextIndex === 0) {
-        self.$results.scrollTop(0);
-      } else if (nextBottom > currentOffset) {
-        self.$results.scrollTop(nextOffset);
-      }
-    });
-
-    container.on('results:focus', function (params) {
-      params.element.addClass('select2-results__option--highlighted');
-    });
-
-    container.on('results:message', function (params) {
-      self.displayMessage(params);
-    });
-
-    if ($.fn.mousewheel) {
-      this.$results.on('mousewheel', function (e) {
-        var top = self.$results.scrollTop();
-
-        var bottom = self.$results.get(0).scrollHeight - top + e.deltaY;
-
-        var isAtTop = e.deltaY > 0 && top - e.deltaY <= 0;
-        var isAtBottom = e.deltaY < 0 && bottom <= self.$results.height();
-
-        if (isAtTop) {
-          self.$results.scrollTop(0);
-
-          e.preventDefault();
-          e.stopPropagation();
-        } else if (isAtBottom) {
-          self.$results.scrollTop(
-            self.$results.get(0).scrollHeight - self.$results.height()
-          );
-
-          e.preventDefault();
-          e.stopPropagation();
-        }
-      });
-    }
-
-    this.$results.on('mouseup', '.select2-results__option[aria-selected]',
-      function (evt) {
-      var $this = $(this);
-
-      var data = Utils.GetData(this, 'data');
-
-      if ($this.attr('aria-selected') === 'true') {
-        if (self.options.get('multiple')) {
-          self.trigger('unselect', {
-            originalEvent: evt,
-            data: data
-          });
-        } else {
-          self.trigger('close', {});
-        }
-
-        return;
-      }
-
-      self.trigger('select', {
-        originalEvent: evt,
-        data: data
-      });
-    });
-
-    this.$results.on('mouseenter', '.select2-results__option[aria-selected]',
-      function (evt) {
-      var data = Utils.GetData(this, 'data');
-
-      self.getHighlightedResults()
-          .removeClass('select2-results__option--highlighted');
-
-      self.trigger('results:focus', {
-        data: data,
-        element: $(this)
-      });
-    });
-  };
-
-  Results.prototype.getHighlightedResults = function () {
-    var $highlighted = this.$results
-    .find('.select2-results__option--highlighted');
-
-    return $highlighted;
-  };
-
-  Results.prototype.destroy = function () {
-    this.$results.remove();
-  };
-
-  Results.prototype.ensureHighlightVisible = function () {
-    var $highlighted = this.getHighlightedResults();
-
-    if ($highlighted.length === 0) {
-      return;
-    }
-
-    var $options = this.$results.find('[aria-selected]');
-
-    var currentIndex = $options.index($highlighted);
-
-    var currentOffset = this.$results.offset().top;
-    var nextTop = $highlighted.offset().top;
-    var nextOffset = this.$results.scrollTop() + (nextTop - currentOffset);
-
-    var offsetDelta = nextTop - currentOffset;
-    nextOffset -= $highlighted.outerHeight(false) * 2;
-
-    if (currentIndex <= 2) {
-      this.$results.scrollTop(0);
-    } else if (offsetDelta > this.$results.outerHeight() || offsetDelta < 0) {
-      this.$results.scrollTop(nextOffset);
-    }
-  };
-
-  Results.prototype.template = function (result, container) {
-    var template = this.options.get('templateResult');
-    var escapeMarkup = this.options.get('escapeMarkup');
-
-    var content = template(result, container);
-
-    if (content == null) {
-      container.style.display = 'none';
-    } else if (typeof content === 'string') {
-      container.innerHTML = escapeMarkup(content);
-    } else {
-      $(container).append(content);
-    }
-  };
-
-  return Results;
-});
-
-S2.define('select2/keys',[
-
-], function () {
-  var KEYS = {
-    BACKSPACE: 8,
-    TAB: 9,
-    ENTER: 13,
-    SHIFT: 16,
-    CTRL: 17,
-    ALT: 18,
-    ESC: 27,
-    SPACE: 32,
-    PAGE_UP: 33,
-    PAGE_DOWN: 34,
-    END: 35,
-    HOME: 36,
-    LEFT: 37,
-    UP: 38,
-    RIGHT: 39,
-    DOWN: 40,
-    DELETE: 46
-  };
-
-  return KEYS;
-});
-
-S2.define('select2/selection/base',[
-  'jquery',
-  '../utils',
-  '../keys'
-], function ($, Utils, KEYS) {
-  function BaseSelection ($element, options) {
-    this.$element = $element;
-    this.options = options;
-
-    BaseSelection.__super__.constructor.call(this);
-  }
-
-  Utils.Extend(BaseSelection, Utils.Observable);
-
-  BaseSelection.prototype.render = function () {
-    var $selection = $(
-      '<span class="select2-selection" role="combobox" ' +
-      ' aria-haspopup="true" aria-expanded="false">' +
-      '</span>'
-    );
-
-    this._tabindex = 0;
-
-    if (Utils.GetData(this.$element[0], 'old-tabindex') != null) {
-      this._tabindex = Utils.GetData(this.$element[0], 'old-tabindex');
-    } else if (this.$element.attr('tabindex') != null) {
-      this._tabindex = this.$element.attr('tabindex');
-    }
-
-    $selection.attr('title', this.$element.attr('title'));
-    $selection.attr('tabindex', this._tabindex);
-
-    this.$selection = $selection;
-
-    return $selection;
-  };
-
-  BaseSelection.prototype.bind = function (container, $container) {
-    var self = this;
-
-    var id = container.id + '-container';
-    var resultsId = container.id + '-results';
-
-    this.container = container;
-
-    this.$selection.on('focus', function (evt) {
-      self.trigger('focus', evt);
-    });
-
-    this.$selection.on('blur', function (evt) {
-      self._handleBlur(evt);
-    });
-
-    this.$selection.on('keydown', function (evt) {
-      self.trigger('keypress', evt);
-
-      if (evt.which === KEYS.SPACE) {
-        evt.preventDefault();
-      }
-    });
-
-    container.on('results:focus', function (params) {
-      self.$selection.attr('aria-activedescendant', params.data._resultId);
-    });
-
-    container.on('selection:update', function (params) {
-      self.update(params.data);
-    });
-
-    container.on('open', function () {
-      // When the dropdown is open, aria-expanded="true"
-      self.$selection.attr('aria-expanded', 'true');
-      self.$selection.attr('aria-owns', resultsId);
-
-      self._attachCloseHandler(container);
-    });
-
-    container.on('close', function () {
-      // When the dropdown is closed, aria-expanded="false"
-      self.$selection.attr('aria-expanded', 'false');
-      self.$selection.removeAttr('aria-activedescendant');
-      self.$selection.removeAttr('aria-owns');
-
-      self.$selection.focus();
-      window.setTimeout(function () {
-        self.$selection.focus();
-      }, 0);
-
-      self._detachCloseHandler(container);
-    });
-
-    container.on('enable', function () {
-      self.$selection.attr('tabindex', self._tabindex);
-    });
-
-    container.on('disable', function () {
-      self.$selection.attr('tabindex', '-1');
-    });
-  };
-
-  BaseSelection.prototype._handleBlur = function (evt) {
-    var self = this;
-
-    // This needs to be delayed as the active element is the body when the tab
-    // key is pressed, possibly along with others.
-    window.setTimeout(function () {
-      // Don't trigger `blur` if the focus is still in the selection
-      if (
-        (document.activeElement == self.$selection[0]) ||
-        ($.contains(self.$selection[0], document.activeElement))
-      ) {
-        return;
-      }
-
-      self.trigger('blur', evt);
-    }, 1);
-  };
-
-  BaseSelection.prototype._attachCloseHandler = function (container) {
-    var self = this;
-
-    $(document.body).on('mousedown.select2.' + container.id, function (e) {
-      var $target = $(e.target);
-
-      var $select = $target.closest('.select2');
-
-      var $all = $('.select2.select2-container--open');
-
-      $all.each(function () {
-        var $this = $(this);
-
-        if (this == $select[0]) {
-          return;
-        }
-
-        var $element = Utils.GetData(this, 'element');
-
-        $element.select2('close');
-      });
-    });
-  };
-
-  BaseSelection.prototype._detachCloseHandler = function (container) {
-    $(document.body).off('mousedown.select2.' + container.id);
-  };
-
-  BaseSelection.prototype.position = function ($selection, $container) {
-    var $selectionContainer = $container.find('.selection');
-    $selectionContainer.append($selection);
-  };
-
-  BaseSelection.prototype.destroy = function () {
-    this._detachCloseHandler(this.container);
-  };
-
-  BaseSelection.prototype.update = function (data) {
-    throw new Error('The `update` method must be defined in child classes.');
-  };
-
-  return BaseSelection;
-});
-
-S2.define('select2/selection/single',[
-  'jquery',
-  './base',
-  '../utils',
-  '../keys'
-], function ($, BaseSelection, Utils, KEYS) {
-  function SingleSelection () {
-    SingleSelection.__super__.constructor.apply(this, arguments);
-  }
-
-  Utils.Extend(SingleSelection, BaseSelection);
-
-  SingleSelection.prototype.render = function () {
-    var $selection = SingleSelection.__super__.render.call(this);
-
-    $selection.addClass('select2-selection--single');
-
-    $selection.html(
-      '<span class="select2-selection__rendered"></span>' +
-      '<span class="select2-selection__arrow" role="presentation">' +
-        '<b role="presentation"></b>' +
-      '</span>'
-    );
-
-    return $selection;
-  };
-
-  SingleSelection.prototype.bind = function (container, $container) {
-    var self = this;
-
-    SingleSelection.__super__.bind.apply(this, arguments);
-
-    var id = container.id + '-container';
-
-    this.$selection.find('.select2-selection__rendered')
-      .attr('id', id)
-      .attr('role', 'textbox')
-      .attr('aria-readonly', 'true');
-    this.$selection.attr('aria-labelledby', id);
-
-    this.$selection.on('mousedown', function (evt) {
-      // Only respond to left clicks
-      if (evt.which !== 1) {
-        return;
-      }
-
-      self.trigger('toggle', {
-        originalEvent: evt
-      });
-    });
-
-    this.$selection.on('focus', function (evt) {
-      // User focuses on the container
-    });
-
-    this.$selection.on('blur', function (evt) {
-      // User exits the container
-    });
-
-    container.on('focus', function (evt) {
-      if (!container.isOpen()) {
-        self.$selection.focus();
-      }
-    });
-  };
-
-  SingleSelection.prototype.clear = function () {
-    var $rendered = this.$selection.find('.select2-selection__rendered');
-    $rendered.empty();
-    $rendered.removeAttr('title'); // clear tooltip on empty
-  };
-
-  SingleSelection.prototype.display = function (data, container) {
-    var template = this.options.get('templateSelection');
-    var escapeMarkup = this.options.get('escapeMarkup');
-
-    return escapeMarkup(template(data, container));
-  };
-
-  SingleSelection.prototype.selectionContainer = function () {
-    return $('<span></span>');
-  };
-
-  SingleSelection.prototype.update = function (data) {
-    if (data.length === 0) {
-      this.clear();
-      return;
-    }
-
-    var selection = data[0];
-
-    var $rendered = this.$selection.find('.select2-selection__rendered');
-    var formatted = this.display(selection, $rendered);
-
-    $rendered.empty().append(formatted);
-    $rendered.attr('title', selection.title || selection.text);
-  };
-
-  return SingleSelection;
-});
-
-S2.define('select2/selection/multiple',[
-  'jquery',
-  './base',
-  '../utils'
-], function ($, BaseSelection, Utils) {
-  function MultipleSelection ($element, options) {
-    MultipleSelection.__super__.constructor.apply(this, arguments);
-  }
-
-  Utils.Extend(MultipleSelection, BaseSelection);
-
-  MultipleSelection.prototype.render = function () {
-    var $selection = MultipleSelection.__super__.render.call(this);
-
-    $selection.addClass('select2-selection--multiple');
-
-    $selection.html(
-      '<ul class="select2-selection__rendered"></ul>'
-    );
-
-    return $selection;
-  };
-
-  MultipleSelection.prototype.bind = function (container, $container) {
-    var self = this;
-
-    MultipleSelection.__super__.bind.apply(this, arguments);
-
-    this.$selection.on('click', function (evt) {
-      self.trigger('toggle', {
-        originalEvent: evt
-      });
-    });
-
-    this.$selection.on(
-      'click',
-      '.select2-selection__choice__remove',
-      function (evt) {
-        // Ignore the event if it is disabled
-        if (self.options.get('disabled')) {
-          return;
-        }
-
-        var $remove = $(this);
-        var $selection = $remove.parent();
-
-        var data = Utils.GetData($selection[0], 'data');
-
-        self.trigger('unselect', {
-          originalEvent: evt,
-          data: data
-        });
-      }
-    );
-  };
-
-  MultipleSelection.prototype.clear = function () {
-    var $rendered = this.$selection.find('.select2-selection__rendered');
-    $rendered.empty();
-    $rendered.removeAttr('title');
-  };
-
-  MultipleSelection.prototype.display = function (data, container) {
-    var template = this.options.get('templateSelection');
-    var escapeMarkup = this.options.get('escapeMarkup');
-
-    return escapeMarkup(template(data, container));
-  };
-
-  MultipleSelection.prototype.selectionContainer = function () {
-    var $container = $(
-      '<li class="select2-selection__choice">' +
-        '<span class="select2-selection__choice__remove" role="presentation">' +
-          '&times;' +
-        '</span>' +
-      '</li>'
-    );
-
-    return $container;
-  };
-
-  MultipleSelection.prototype.update = function (data) {
-    this.clear();
-
-    if (data.length === 0) {
-      return;
-    }
-
-    var $selections = [];
-
-    for (var d = 0; d < data.length; d++) {
-      var selection = data[d];
-
-      var $selection = this.selectionContainer();
-      var formatted = this.display(selection, $selection);
-
-      $selection.append(formatted);
-      $selection.attr('title', selection.title || selection.text);
-
-      Utils.StoreData($selection[0], 'data', selection);
-
-      $selections.push($selection);
-    }
-
-    var $rendered = this.$selection.find('.select2-selection__rendered');
-
-    Utils.appendMany($rendered, $selections);
-  };
-
-  return MultipleSelection;
-});
-
-S2.define('select2/selection/placeholder',[
-  '../utils'
-], function (Utils) {
-  function Placeholder (decorated, $element, options) {
-    this.placeholder = this.normalizePlaceholder(options.get('placeholder'));
-
-    decorated.call(this, $element, options);
-  }
-
-  Placeholder.prototype.normalizePlaceholder = function (_, placeholder) {
-    if (typeof placeholder === 'string') {
-      placeholder = {
-        id: '',
-        text: placeholder
-      };
-    }
-
-    return placeholder;
-  };
-
-  Placeholder.prototype.createPlaceholder = function (decorated, placeholder) {
-    var $placeholder = this.selectionContainer();
-
-    $placeholder.html(this.display(placeholder));
-    $placeholder.addClass('select2-selection__placeholder')
-                .removeClass('select2-selection__choice');
-
-    return $placeholder;
-  };
-
-  Placeholder.prototype.update = function (decorated, data) {
-    var singlePlaceholder = (
-      data.length == 1 && data[0].id != this.placeholder.id
-    );
-    var multipleSelections = data.length > 1;
-
-    if (multipleSelections || singlePlaceholder) {
-      return decorated.call(this, data);
-    }
-
-    this.clear();
-
-    var $placeholder = this.createPlaceholder(this.placeholder);
-
-    this.$selection.find('.select2-selection__rendered').append($placeholder);
-  };
-
-  return Placeholder;
-});
-
-S2.define('select2/selection/allowClear',[
-  'jquery',
-  '../keys',
-  '../utils'
-], function ($, KEYS, Utils) {
-  function AllowClear () { }
-
-  AllowClear.prototype.bind = function (decorated, container, $container) {
-    var self = this;
-
-    decorated.call(this, container, $container);
-
-    if (this.placeholder == null) {
-      if (this.options.get('debug') && window.console && console.error) {
-        console.error(
-          'Select2: The `allowClear` option should be used in combination ' +
-          'with the `placeholder` option.'
-        );
-      }
-    }
-
-    this.$selection.on('mousedown', '.select2-selection__clear',
-      function (evt) {
-        self._handleClear(evt);
-    });
-
-    container.on('keypress', function (evt) {
-      self._handleKeyboardClear(evt, container);
-    });
-  };
-
-  AllowClear.prototype._handleClear = function (_, evt) {
-    // Ignore the event if it is disabled
-    if (this.options.get('disabled')) {
-      return;
-    }
-
-    var $clear = this.$selection.find('.select2-selection__clear');
-
-    // Ignore the event if nothing has been selected
-    if ($clear.length === 0) {
-      return;
-    }
-
-    evt.stopPropagation();
-
-    var data = Utils.GetData($clear[0], 'data');
-
-    var previousVal = this.$element.val();
-    this.$element.val(this.placeholder.id);
-
-    var unselectData = {
-      data: data
-    };
-    this.trigger('clear', unselectData);
-    if (unselectData.prevented) {
-      this.$element.val(previousVal);
-      return;
-    }
-
-    for (var d = 0; d < data.length; d++) {
-      unselectData = {
-        data: data[d]
-      };
-
-      // Trigger the `unselect` event, so people can prevent it from being
-      // cleared.
-      this.trigger('unselect', unselectData);
-
-      // If the event was prevented, don't clear it out.
-      if (unselectData.prevented) {
-        this.$element.val(previousVal);
-        return;
-      }
-    }
-
-    this.$element.trigger('change');
-
-    this.trigger('toggle', {});
-  };
-
-  AllowClear.prototype._handleKeyboardClear = function (_, evt, container) {
-    if (container.isOpen()) {
-      return;
-    }
-
-    if (evt.which == KEYS.DELETE || evt.which == KEYS.BACKSPACE) {
-      this._handleClear(evt);
-    }
-  };
-
-  AllowClear.prototype.update = function (decorated, data) {
-    decorated.call(this, data);
-
-    if (this.$selection.find('.select2-selection__placeholder').length > 0 ||
-        data.length === 0) {
-      return;
-    }
-
-    var $remove = $(
-      '<span class="select2-selection__clear">' +
-        '&times;' +
-      '</span>'
-    );
-    Utils.StoreData($remove[0], 'data', data);
-
-    this.$selection.find('.select2-selection__rendered').prepend($remove);
-  };
-
-  return AllowClear;
-});
-
-S2.define('select2/selection/search',[
-  'jquery',
-  '../utils',
-  '../keys'
-], function ($, Utils, KEYS) {
-  function Search (decorated, $element, options) {
-    decorated.call(this, $element, options);
-  }
-
-  Search.prototype.render = function (decorated) {
-    var $search = $(
-      '<li class="select2-search select2-search--inline">' +
-        '<input class="select2-search__field" type="search" tabindex="-1"' +
-        ' autocomplete="off" autocorrect="off" autocapitalize="none"' +
-        ' spellcheck="false" role="textbox" aria-autocomplete="list" />' +
-      '</li>'
-    );
-
-    this.$searchContainer = $search;
-    this.$search = $search.find('input');
-
-    var $rendered = decorated.call(this);
-
-    this._transferTabIndex();
-
-    return $rendered;
-  };
-
-  Search.prototype.bind = function (decorated, container, $container) {
-    var self = this;
-
-    decorated.call(this, container, $container);
-
-    container.on('open', function () {
-      self.$search.trigger('focus');
-    });
-
-    container.on('close', function () {
-      self.$search.val('');
-      self.$search.removeAttr('aria-activedescendant');
-      self.$search.trigger('focus');
-    });
-
-    container.on('enable', function () {
-      self.$search.prop('disabled', false);
-
-      self._transferTabIndex();
-    });
-
-    container.on('disable', function () {
-      self.$search.prop('disabled', true);
-    });
-
-    container.on('focus', function (evt) {
-      self.$search.trigger('focus');
-    });
-
-    container.on('results:focus', function (params) {
-      self.$search.attr('aria-activedescendant', params.id);
-    });
-
-    this.$selection.on('focusin', '.select2-search--inline', function (evt) {
-      self.trigger('focus', evt);
-    });
-
-    this.$selection.on('focusout', '.select2-search--inline', function (evt) {
-      self._handleBlur(evt);
-    });
-
-    this.$selection.on('keydown', '.select2-search--inline', function (evt) {
-      evt.stopPropagation();
-
-      self.trigger('keypress', evt);
-
-      self._keyUpPrevented = evt.isDefaultPrevented();
-
-      var key = evt.which;
-
-      if (key === KEYS.BACKSPACE && self.$search.val() === '') {
-        var $previousChoice = self.$searchContainer
-          .prev('.select2-selection__choice');
-
-        if ($previousChoice.length > 0) {
-          var item = Utils.GetData($previousChoice[0], 'data');
-
-          self.searchRemoveChoice(item);
-
-          evt.preventDefault();
-        }
-      }
-    });
-
-    // Try to detect the IE version should the `documentMode` property that
-    // is stored on the document. This is only implemented in IE and is
-    // slightly cleaner than doing a user agent check.
-    // This property is not available in Edge, but Edge also doesn't have
-    // this bug.
-    var msie = document.documentMode;
-    var disableInputEvents = msie && msie <= 11;
-
-    // Workaround for browsers which do not support the `input` event
-    // This will prevent double-triggering of events for browsers which support
-    // both the `keyup` and `input` events.
-    this.$selection.on(
-      'input.searchcheck',
-      '.select2-search--inline',
-      function (evt) {
-        // IE will trigger the `input` event when a placeholder is used on a
-        // search box. To get around this issue, we are forced to ignore all
-        // `input` events in IE and keep using `keyup`.
-        if (disableInputEvents) {
-          self.$selection.off('input.search input.searchcheck');
-          return;
-        }
-
-        // Unbind the duplicated `keyup` event
-        self.$selection.off('keyup.search');
-      }
-    );
-
-    this.$selection.on(
-      'keyup.search input.search',
-      '.select2-search--inline',
-      function (evt) {
-        // IE will trigger the `input` event when a placeholder is used on a
-        // search box. To get around this issue, we are forced to ignore all
-        // `input` events in IE and keep using `keyup`.
-        if (disableInputEvents && evt.type === 'input') {
-          self.$selection.off('input.search input.searchcheck');
-          return;
-        }
-
-        var key = evt.which;
-
-        // We can freely ignore events from modifier keys
-        if (key == KEYS.SHIFT || key == KEYS.CTRL || key == KEYS.ALT) {
-          return;
-        }
-
-        // Tabbing will be handled during the `keydown` phase
-        if (key == KEYS.TAB) {
-          return;
-        }
-
-        self.handleSearch(evt);
-      }
-    );
-  };
-
-  /**
-   * This method will transfer the tabindex attribute from the rendered
-   * selection to the search box. This allows for the search box to be used as
-   * the primary focus instead of the selection container.
-   *
-   * @private
-   */
-  Search.prototype._transferTabIndex = function (decorated) {
-    this.$search.attr('tabindex', this.$selection.attr('tabindex'));
-    this.$selection.attr('tabindex', '-1');
-  };
-
-  Search.prototype.createPlaceholder = function (decorated, placeholder) {
-    this.$search.attr('placeholder', placeholder.text);
-  };
-
-  Search.prototype.update = function (decorated, data) {
-    var searchHadFocus = this.$search[0] == document.activeElement;
-
-    this.$search.attr('placeholder', '');
-
-    decorated.call(this, data);
-
-    this.$selection.find('.select2-selection__rendered')
-                   .append(this.$searchContainer);
-
-    this.resizeSearch();
-    if (searchHadFocus) {
-      var isTagInput = this.$element.find('[data-select2-tag]').length;
-      if (isTagInput) {
-        // fix IE11 bug where tag input lost focus
-        this.$element.focus();
-      } else {
-        this.$search.focus();
-      }
-    }
-  };
-
-  Search.prototype.handleSearch = function () {
-    this.resizeSearch();
-
-    if (!this._keyUpPrevented) {
-      var input = this.$search.val();
-
-      this.trigger('query', {
-        term: input
-      });
-    }
-
-    this._keyUpPrevented = false;
-  };
-
-  Search.prototype.searchRemoveChoice = function (decorated, item) {
-    this.trigger('unselect', {
-      data: item
-    });
-
-    this.$search.val(item.text);
-    this.handleSearch();
-  };
-
-  Search.prototype.resizeSearch = function () {
-    this.$search.css('width', '25px');
-
-    var width = '';
-
-    if (this.$search.attr('placeholder') !== '') {
-      width = this.$selection.find('.select2-selection__rendered').innerWidth();
-    } else {
-      var minimumWidth = this.$search.val().length + 1;
-
-      width = (minimumWidth * 0.75) + 'em';
-    }
-
-    this.$search.css('width', width);
-  };
-
-  return Search;
-});
-
-S2.define('select2/selection/eventRelay',[
-  'jquery'
-], function ($) {
-  function EventRelay () { }
-
-  EventRelay.prototype.bind = function (decorated, container, $container) {
-    var self = this;
-    var relayEvents = [
-      'open', 'opening',
-      'close', 'closing',
-      'select', 'selecting',
-      'unselect', 'unselecting',
-      'clear', 'clearing'
-    ];
-
-    var preventableEvents = [
-      'opening', 'closing', 'selecting', 'unselecting', 'clearing'
-    ];
-
-    decorated.call(this, container, $container);
-
-    container.on('*', function (name, params) {
-      // Ignore events that should not be relayed
-      if ($.inArray(name, relayEvents) === -1) {
-        return;
-      }
-
-      // The parameters should always be an object
-      params = params || {};
-
-      // Generate the jQuery event for the Select2 event
-      var evt = $.Event('select2:' + name, {
-        params: params
-      });
-
-      self.$element.trigger(evt);
-
-      // Only handle preventable events if it was one
-      if ($.inArray(name, preventableEvents) === -1) {
-        return;
-      }
-
-      params.prevented = evt.isDefaultPrevented();
-    });
-  };
-
-  return EventRelay;
-});
-
-S2.define('select2/translation',[
-  'jquery',
-  'require'
-], function ($, require) {
-  function Translation (dict) {
-    this.dict = dict || {};
-  }
-
-  Translation.prototype.all = function () {
-    return this.dict;
-  };
-
-  Translation.prototype.get = function (key) {
-    return this.dict[key];
-  };
-
-  Translation.prototype.extend = function (translation) {
-    this.dict = $.extend({}, translation.all(), this.dict);
-  };
-
-  // Static functions
-
-  Translation._cache = {};
-
-  Translation.loadPath = function (path) {
-    if (!(path in Translation._cache)) {
-      var translations = require(path);
-
-      Translation._cache[path] = translations;
-    }
-
-    return new Translation(Translation._cache[path]);
-  };
-
-  return Translation;
-});
-
-S2.define('select2/diacritics',[
-
-], function () {
-  var diacritics = {
-    '\u24B6': 'A',
-    '\uFF21': 'A',
-    '\u00C0': 'A',
-    '\u00C1': 'A',
-    '\u00C2': 'A',
-    '\u1EA6': 'A',
-    '\u1EA4': 'A',
-    '\u1EAA': 'A',
-    '\u1EA8': 'A',
-    '\u00C3': 'A',
-    '\u0100': 'A',
-    '\u0102': 'A',
-    '\u1EB0': 'A',
-    '\u1EAE': 'A',
-    '\u1EB4': 'A',
-    '\u1EB2': 'A',
-    '\u0226': 'A',
-    '\u01E0': 'A',
-    '\u00C4': 'A',
-    '\u01DE': 'A',
-    '\u1EA2': 'A',
-    '\u00C5': 'A',
-    '\u01FA': 'A',
-    '\u01CD': 'A',
-    '\u0200': 'A',
-    '\u0202': 'A',
-    '\u1EA0': 'A',
-    '\u1EAC': 'A',
-    '\u1EB6': 'A',
-    '\u1E00': 'A',
-    '\u0104': 'A',
-    '\u023A': 'A',
-    '\u2C6F': 'A',
-    '\uA732': 'AA',
-    '\u00C6': 'AE',
-    '\u01FC': 'AE',
-    '\u01E2': 'AE',
-    '\uA734': 'AO',
-    '\uA736': 'AU',
-    '\uA738': 'AV',
-    '\uA73A': 'AV',
-    '\uA73C': 'AY',
-    '\u24B7': 'B',
-    '\uFF22': 'B',
-    '\u1E02': 'B',
-    '\u1E04': 'B',
-    '\u1E06': 'B',
-    '\u0243': 'B',
-    '\u0182': 'B',
-    '\u0181': 'B',
-    '\u24B8': 'C',
-    '\uFF23': 'C',
-    '\u0106': 'C',
-    '\u0108': 'C',
-    '\u010A': 'C',
-    '\u010C': 'C',
-    '\u00C7': 'C',
-    '\u1E08': 'C',
-    '\u0187': 'C',
-    '\u023B': 'C',
-    '\uA73E': 'C',
-    '\u24B9': 'D',
-    '\uFF24': 'D',
-    '\u1E0A': 'D',
-    '\u010E': 'D',
-    '\u1E0C': 'D',
-    '\u1E10': 'D',
-    '\u1E12': 'D',
-    '\u1E0E': 'D',
-    '\u0110': 'D',
-    '\u018B': 'D',
-    '\u018A': 'D',
-    '\u0189': 'D',
-    '\uA779': 'D',
-    '\u01F1': 'DZ',
-    '\u01C4': 'DZ',
-    '\u01F2': 'Dz',
-    '\u01C5': 'Dz',
-    '\u24BA': 'E',
-    '\uFF25': 'E',
-    '\u00C8': 'E',
-    '\u00C9': 'E',
-    '\u00CA': 'E',
-    '\u1EC0': 'E',
-    '\u1EBE': 'E',
-    '\u1EC4': 'E',
-    '\u1EC2': 'E',
-    '\u1EBC': 'E',
-    '\u0112': 'E',
-    '\u1E14': 'E',
-    '\u1E16': 'E',
-    '\u0114': 'E',
-    '\u0116': 'E',
-    '\u00CB': 'E',
-    '\u1EBA': 'E',
-    '\u011A': 'E',
-    '\u0204': 'E',
-    '\u0206': 'E',
-    '\u1EB8': 'E',
-    '\u1EC6': 'E',
-    '\u0228': 'E',
-    '\u1E1C': 'E',
-    '\u0118': 'E',
-    '\u1E18': 'E',
-    '\u1E1A': 'E',
-    '\u0190': 'E',
-    '\u018E': 'E',
-    '\u24BB': 'F',
-    '\uFF26': 'F',
-    '\u1E1E': 'F',
-    '\u0191': 'F',
-    '\uA77B': 'F',
-    '\u24BC': 'G',
-    '\uFF27': 'G',
-    '\u01F4': 'G',
-    '\u011C': 'G',
-    '\u1E20': 'G',
-    '\u011E': 'G',
-    '\u0120': 'G',
-    '\u01E6': 'G',
-    '\u0122': 'G',
-    '\u01E4': 'G',
-    '\u0193': 'G',
-    '\uA7A0': 'G',
-    '\uA77D': 'G',
-    '\uA77E': 'G',
-    '\u24BD': 'H',
-    '\uFF28': 'H',
-    '\u0124': 'H',
-    '\u1E22': 'H',
-    '\u1E26': 'H',
-    '\u021E': 'H',
-    '\u1E24': 'H',
-    '\u1E28': 'H',
-    '\u1E2A': 'H',
-    '\u0126': 'H',
-    '\u2C67': 'H',
-    '\u2C75': 'H',
-    '\uA78D': 'H',
-    '\u24BE': 'I',
-    '\uFF29': 'I',
-    '\u00CC': 'I',
-    '\u00CD': 'I',
-    '\u00CE': 'I',
-    '\u0128': 'I',
-    '\u012A': 'I',
-    '\u012C': 'I',
-    '\u0130': 'I',
-    '\u00CF': 'I',
-    '\u1E2E': 'I',
-    '\u1EC8': 'I',
-    '\u01CF': 'I',
-    '\u0208': 'I',
-    '\u020A': 'I',
-    '\u1ECA': 'I',
-    '\u012E': 'I',
-    '\u1E2C': 'I',
-    '\u0197': 'I',
-    '\u24BF': 'J',
-    '\uFF2A': 'J',
-    '\u0134': 'J',
-    '\u0248': 'J',
-    '\u24C0': 'K',
-    '\uFF2B': 'K',
-    '\u1E30': 'K',
-    '\u01E8': 'K',
-    '\u1E32': 'K',
-    '\u0136': 'K',
-    '\u1E34': 'K',
-    '\u0198': 'K',
-    '\u2C69': 'K',
-    '\uA740': 'K',
-    '\uA742': 'K',
-    '\uA744': 'K',
-    '\uA7A2': 'K',
-    '\u24C1': 'L',
-    '\uFF2C': 'L',
-    '\u013F': 'L',
-    '\u0139': 'L',
-    '\u013D': 'L',
-    '\u1E36': 'L',
-    '\u1E38': 'L',
-    '\u013B': 'L',
-    '\u1E3C': 'L',
-    '\u1E3A': 'L',
-    '\u0141': 'L',
-    '\u023D': 'L',
-    '\u2C62': 'L',
-    '\u2C60': 'L',
-    '\uA748': 'L',
-    '\uA746': 'L',
-    '\uA780': 'L',
-    '\u01C7': 'LJ',
-    '\u01C8': 'Lj',
-    '\u24C2': 'M',
-    '\uFF2D': 'M',
-    '\u1E3E': 'M',
-    '\u1E40': 'M',
-    '\u1E42': 'M',
-    '\u2C6E': 'M',
-    '\u019C': 'M',
-    '\u24C3': 'N',
-    '\uFF2E': 'N',
-    '\u01F8': 'N',
-    '\u0143': 'N',
-    '\u00D1': 'N',
-    '\u1E44': 'N',
-    '\u0147': 'N',
-    '\u1E46': 'N',
-    '\u0145': 'N',
-    '\u1E4A': 'N',
-    '\u1E48': 'N',
-    '\u0220': 'N',
-    '\u019D': 'N',
-    '\uA790': 'N',
-    '\uA7A4': 'N',
-    '\u01CA': 'NJ',
-    '\u01CB': 'Nj',
-    '\u24C4': 'O',
-    '\uFF2F': 'O',
-    '\u00D2': 'O',
-    '\u00D3': 'O',
-    '\u00D4': 'O',
-    '\u1ED2': 'O',
-    '\u1ED0': 'O',
-    '\u1ED6': 'O',
-    '\u1ED4': 'O',
-    '\u00D5': 'O',
-    '\u1E4C': 'O',
-    '\u022C': 'O',
-    '\u1E4E': 'O',
-    '\u014C': 'O',
-    '\u1E50': 'O',
-    '\u1E52': 'O',
-    '\u014E': 'O',
-    '\u022E': 'O',
-    '\u0230': 'O',
-    '\u00D6': 'O',
-    '\u022A': 'O',
-    '\u1ECE': 'O',
-    '\u0150': 'O',
-    '\u01D1': 'O',
-    '\u020C': 'O',
-    '\u020E': 'O',
-    '\u01A0': 'O',
-    '\u1EDC': 'O',
-    '\u1EDA': 'O',
-    '\u1EE0': 'O',
-    '\u1EDE': 'O',
-    '\u1EE2': 'O',
-    '\u1ECC': 'O',
-    '\u1ED8': 'O',
-    '\u01EA': 'O',
-    '\u01EC': 'O',
-    '\u00D8': 'O',
-    '\u01FE': 'O',
-    '\u0186': 'O',
-    '\u019F': 'O',
-    '\uA74A': 'O',
-    '\uA74C': 'O',
-    '\u01A2': 'OI',
-    '\uA74E': 'OO',
-    '\u0222': 'OU',
-    '\u24C5': 'P',
-    '\uFF30': 'P',
-    '\u1E54': 'P',
-    '\u1E56': 'P',
-    '\u01A4': 'P',
-    '\u2C63': 'P',
-    '\uA750': 'P',
-    '\uA752': 'P',
-    '\uA754': 'P',
-    '\u24C6': 'Q',
-    '\uFF31': 'Q',
-    '\uA756': 'Q',
-    '\uA758': 'Q',
-    '\u024A': 'Q',
-    '\u24C7': 'R',
-    '\uFF32': 'R',
-    '\u0154': 'R',
-    '\u1E58': 'R',
-    '\u0158': 'R',
-    '\u0210': 'R',
-    '\u0212': 'R',
-    '\u1E5A': 'R',
-    '\u1E5C': 'R',
-    '\u0156': 'R',
-    '\u1E5E': 'R',
-    '\u024C': 'R',
-    '\u2C64': 'R',
-    '\uA75A': 'R',
-    '\uA7A6': 'R',
-    '\uA782': 'R',
-    '\u24C8': 'S',
-    '\uFF33': 'S',
-    '\u1E9E': 'S',
-    '\u015A': 'S',
-    '\u1E64': 'S',
-    '\u015C': 'S',
-    '\u1E60': 'S',
-    '\u0160': 'S',
-    '\u1E66': 'S',
-    '\u1E62': 'S',
-    '\u1E68': 'S',
-    '\u0218': 'S',
-    '\u015E': 'S',
-    '\u2C7E': 'S',
-    '\uA7A8': 'S',
-    '\uA784': 'S',
-    '\u24C9': 'T',
-    '\uFF34': 'T',
-    '\u1E6A': 'T',
-    '\u0164': 'T',
-    '\u1E6C': 'T',
-    '\u021A': 'T',
-    '\u0162': 'T',
-    '\u1E70': 'T',
-    '\u1E6E': 'T',
-    '\u0166': 'T',
-    '\u01AC': 'T',
-    '\u01AE': 'T',
-    '\u023E': 'T',
-    '\uA786': 'T',
-    '\uA728': 'TZ',
-    '\u24CA': 'U',
-    '\uFF35': 'U',
-    '\u00D9': 'U',
-    '\u00DA': 'U',
-    '\u00DB': 'U',
-    '\u0168': 'U',
-    '\u1E78': 'U',
-    '\u016A': 'U',
-    '\u1E7A': 'U',
-    '\u016C': 'U',
-    '\u00DC': 'U',
-    '\u01DB': 'U',
-    '\u01D7': 'U',
-    '\u01D5': 'U',
-    '\u01D9': 'U',
-    '\u1EE6': 'U',
-    '\u016E': 'U',
-    '\u0170': 'U',
-    '\u01D3': 'U',
-    '\u0214': 'U',
-    '\u0216': 'U',
-    '\u01AF': 'U',
-    '\u1EEA': 'U',
-    '\u1EE8': 'U',
-    '\u1EEE': 'U',
-    '\u1EEC': 'U',
-    '\u1EF0': 'U',
-    '\u1EE4': 'U',
-    '\u1E72': 'U',
-    '\u0172': 'U',
-    '\u1E76': 'U',
-    '\u1E74': 'U',
-    '\u0244': 'U',
-    '\u24CB': 'V',
-    '\uFF36': 'V',
-    '\u1E7C': 'V',
-    '\u1E7E': 'V',
-    '\u01B2': 'V',
-    '\uA75E': 'V',
-    '\u0245': 'V',
-    '\uA760': 'VY',
-    '\u24CC': 'W',
-    '\uFF37': 'W',
-    '\u1E80': 'W',
-    '\u1E82': 'W',
-    '\u0174': 'W',
-    '\u1E86': 'W',
-    '\u1E84': 'W',
-    '\u1E88': 'W',
-    '\u2C72': 'W',
-    '\u24CD': 'X',
-    '\uFF38': 'X',
-    '\u1E8A': 'X',
-    '\u1E8C': 'X',
-    '\u24CE': 'Y',
-    '\uFF39': 'Y',
-    '\u1EF2': 'Y',
-    '\u00DD': 'Y',
-    '\u0176': 'Y',
-    '\u1EF8': 'Y',
-    '\u0232': 'Y',
-    '\u1E8E': 'Y',
-    '\u0178': 'Y',
-    '\u1EF6': 'Y',
-    '\u1EF4': 'Y',
-    '\u01B3': 'Y',
-    '\u024E': 'Y',
-    '\u1EFE': 'Y',
-    '\u24CF': 'Z',
-    '\uFF3A': 'Z',
-    '\u0179': 'Z',
-    '\u1E90': 'Z',
-    '\u017B': 'Z',
-    '\u017D': 'Z',
-    '\u1E92': 'Z',
-    '\u1E94': 'Z',
-    '\u01B5': 'Z',
-    '\u0224': 'Z',
-    '\u2C7F': 'Z',
-    '\u2C6B': 'Z',
-    '\uA762': 'Z',
-    '\u24D0': 'a',
-    '\uFF41': 'a',
-    '\u1E9A': 'a',
-    '\u00E0': 'a',
-    '\u00E1': 'a',
-    '\u00E2': 'a',
-    '\u1EA7': 'a',
-    '\u1EA5': 'a',
-    '\u1EAB': 'a',
-    '\u1EA9': 'a',
-    '\u00E3': 'a',
-    '\u0101': 'a',
-    '\u0103': 'a',
-    '\u1EB1': 'a',
-    '\u1EAF': 'a',
-    '\u1EB5': 'a',
-    '\u1EB3': 'a',
-    '\u0227': 'a',
-    '\u01E1': 'a',
-    '\u00E4': 'a',
-    '\u01DF': 'a',
-    '\u1EA3': 'a',
-    '\u00E5': 'a',
-    '\u01FB': 'a',
-    '\u01CE': 'a',
-    '\u0201': 'a',
-    '\u0203': 'a',
-    '\u1EA1': 'a',
-    '\u1EAD': 'a',
-    '\u1EB7': 'a',
-    '\u1E01': 'a',
-    '\u0105': 'a',
-    '\u2C65': 'a',
-    '\u0250': 'a',
-    '\uA733': 'aa',
-    '\u00E6': 'ae',
-    '\u01FD': 'ae',
-    '\u01E3': 'ae',
-    '\uA735': 'ao',
-    '\uA737': 'au',
-    '\uA739': 'av',
-    '\uA73B': 'av',
-    '\uA73D': 'ay',
-    '\u24D1': 'b',
-    '\uFF42': 'b',
-    '\u1E03': 'b',
-    '\u1E05': 'b',
-    '\u1E07': 'b',
-    '\u0180': 'b',
-    '\u0183': 'b',
-    '\u0253': 'b',
-    '\u24D2': 'c',
-    '\uFF43': 'c',
-    '\u0107': 'c',
-    '\u0109': 'c',
-    '\u010B': 'c',
-    '\u010D': 'c',
-    '\u00E7': 'c',
-    '\u1E09': 'c',
-    '\u0188': 'c',
-    '\u023C': 'c',
-    '\uA73F': 'c',
-    '\u2184': 'c',
-    '\u24D3': 'd',
-    '\uFF44': 'd',
-    '\u1E0B': 'd',
-    '\u010F': 'd',
-    '\u1E0D': 'd',
-    '\u1E11': 'd',
-    '\u1E13': 'd',
-    '\u1E0F': 'd',
-    '\u0111': 'd',
-    '\u018C': 'd',
-    '\u0256': 'd',
-    '\u0257': 'd',
-    '\uA77A': 'd',
-    '\u01F3': 'dz',
-    '\u01C6': 'dz',
-    '\u24D4': 'e',
-    '\uFF45': 'e',
-    '\u00E8': 'e',
-    '\u00E9': 'e',
-    '\u00EA': 'e',
-    '\u1EC1': 'e',
-    '\u1EBF': 'e',
-    '\u1EC5': 'e',
-    '\u1EC3': 'e',
-    '\u1EBD': 'e',
-    '\u0113': 'e',
-    '\u1E15': 'e',
-    '\u1E17': 'e',
-    '\u0115': 'e',
-    '\u0117': 'e',
-    '\u00EB': 'e',
-    '\u1EBB': 'e',
-    '\u011B': 'e',
-    '\u0205': 'e',
-    '\u0207': 'e',
-    '\u1EB9': 'e',
-    '\u1EC7': 'e',
-    '\u0229': 'e',
-    '\u1E1D': 'e',
-    '\u0119': 'e',
-    '\u1E19': 'e',
-    '\u1E1B': 'e',
-    '\u0247': 'e',
-    '\u025B': 'e',
-    '\u01DD': 'e',
-    '\u24D5': 'f',
-    '\uFF46': 'f',
-    '\u1E1F': 'f',
-    '\u0192': 'f',
-    '\uA77C': 'f',
-    '\u24D6': 'g',
-    '\uFF47': 'g',
-    '\u01F5': 'g',
-    '\u011D': 'g',
-    '\u1E21': 'g',
-    '\u011F': 'g',
-    '\u0121': 'g',
-    '\u01E7': 'g',
-    '\u0123': 'g',
-    '\u01E5': 'g',
-    '\u0260': 'g',
-    '\uA7A1': 'g',
-    '\u1D79': 'g',
-    '\uA77F': 'g',
-    '\u24D7': 'h',
-    '\uFF48': 'h',
-    '\u0125': 'h',
-    '\u1E23': 'h',
-    '\u1E27': 'h',
-    '\u021F': 'h',
-    '\u1E25': 'h',
-    '\u1E29': 'h',
-    '\u1E2B': 'h',
-    '\u1E96': 'h',
-    '\u0127': 'h',
-    '\u2C68': 'h',
-    '\u2C76': 'h',
-    '\u0265': 'h',
-    '\u0195': 'hv',
-    '\u24D8': 'i',
-    '\uFF49': 'i',
-    '\u00EC': 'i',
-    '\u00ED': 'i',
-    '\u00EE': 'i',
-    '\u0129': 'i',
-    '\u012B': 'i',
-    '\u012D': 'i',
-    '\u00EF': 'i',
-    '\u1E2F': 'i',
-    '\u1EC9': 'i',
-    '\u01D0': 'i',
-    '\u0209': 'i',
-    '\u020B': 'i',
-    '\u1ECB': 'i',
-    '\u012F': 'i',
-    '\u1E2D': 'i',
-    '\u0268': 'i',
-    '\u0131': 'i',
-    '\u24D9': 'j',
-    '\uFF4A': 'j',
-    '\u0135': 'j',
-    '\u01F0': 'j',
-    '\u0249': 'j',
-    '\u24DA': 'k',
-    '\uFF4B': 'k',
-    '\u1E31': 'k',
-    '\u01E9': 'k',
-    '\u1E33': 'k',
-    '\u0137': 'k',
-    '\u1E35': 'k',
-    '\u0199': 'k',
-    '\u2C6A': 'k',
-    '\uA741': 'k',
-    '\uA743': 'k',
-    '\uA745': 'k',
-    '\uA7A3': 'k',
-    '\u24DB': 'l',
-    '\uFF4C': 'l',
-    '\u0140': 'l',
-    '\u013A': 'l',
-    '\u013E': 'l',
-    '\u1E37': 'l',
-    '\u1E39': 'l',
-    '\u013C': 'l',
-    '\u1E3D': 'l',
-    '\u1E3B': 'l',
-    '\u017F': 'l',
-    '\u0142': 'l',
-    '\u019A': 'l',
-    '\u026B': 'l',
-    '\u2C61': 'l',
-    '\uA749': 'l',
-    '\uA781': 'l',
-    '\uA747': 'l',
-    '\u01C9': 'lj',
-    '\u24DC': 'm',
-    '\uFF4D': 'm',
-    '\u1E3F': 'm',
-    '\u1E41': 'm',
-    '\u1E43': 'm',
-    '\u0271': 'm',
-    '\u026F': 'm',
-    '\u24DD': 'n',
-    '\uFF4E': 'n',
-    '\u01F9': 'n',
-    '\u0144': 'n',
-    '\u00F1': 'n',
-    '\u1E45': 'n',
-    '\u0148': 'n',
-    '\u1E47': 'n',
-    '\u0146': 'n',
-    '\u1E4B': 'n',
-    '\u1E49': 'n',
-    '\u019E': 'n',
-    '\u0272': 'n',
-    '\u0149': 'n',
-    '\uA791': 'n',
-    '\uA7A5': 'n',
-    '\u01CC': 'nj',
-    '\u24DE': 'o',
-    '\uFF4F': 'o',
-    '\u00F2': 'o',
-    '\u00F3': 'o',
-    '\u00F4': 'o',
-    '\u1ED3': 'o',
-    '\u1ED1': 'o',
-    '\u1ED7': 'o',
-    '\u1ED5': 'o',
-    '\u00F5': 'o',
-    '\u1E4D': 'o',
-    '\u022D': 'o',
-    '\u1E4F': 'o',
-    '\u014D': 'o',
-    '\u1E51': 'o',
-    '\u1E53': 'o',
-    '\u014F': 'o',
-    '\u022F': 'o',
-    '\u0231': 'o',
-    '\u00F6': 'o',
-    '\u022B': 'o',
-    '\u1ECF': 'o',
-    '\u0151': 'o',
-    '\u01D2': 'o',
-    '\u020D': 'o',
-    '\u020F': 'o',
-    '\u01A1': 'o',
-    '\u1EDD': 'o',
-    '\u1EDB': 'o',
-    '\u1EE1': 'o',
-    '\u1EDF': 'o',
-    '\u1EE3': 'o',
-    '\u1ECD': 'o',
-    '\u1ED9': 'o',
-    '\u01EB': 'o',
-    '\u01ED': 'o',
-    '\u00F8': 'o',
-    '\u01FF': 'o',
-    '\u0254': 'o',
-    '\uA74B': 'o',
-    '\uA74D': 'o',
-    '\u0275': 'o',
-    '\u01A3': 'oi',
-    '\u0223': 'ou',
-    '\uA74F': 'oo',
-    '\u24DF': 'p',
-    '\uFF50': 'p',
-    '\u1E55': 'p',
-    '\u1E57': 'p',
-    '\u01A5': 'p',
-    '\u1D7D': 'p',
-    '\uA751': 'p',
-    '\uA753': 'p',
-    '\uA755': 'p',
-    '\u24E0': 'q',
-    '\uFF51': 'q',
-    '\u024B': 'q',
-    '\uA757': 'q',
-    '\uA759': 'q',
-    '\u24E1': 'r',
-    '\uFF52': 'r',
-    '\u0155': 'r',
-    '\u1E59': 'r',
-    '\u0159': 'r',
-    '\u0211': 'r',
-    '\u0213': 'r',
-    '\u1E5B': 'r',
-    '\u1E5D': 'r',
-    '\u0157': 'r',
-    '\u1E5F': 'r',
-    '\u024D': 'r',
-    '\u027D': 'r',
-    '\uA75B': 'r',
-    '\uA7A7': 'r',
-    '\uA783': 'r',
-    '\u24E2': 's',
-    '\uFF53': 's',
-    '\u00DF': 's',
-    '\u015B': 's',
-    '\u1E65': 's',
-    '\u015D': 's',
-    '\u1E61': 's',
-    '\u0161': 's',
-    '\u1E67': 's',
-    '\u1E63': 's',
-    '\u1E69': 's',
-    '\u0219': 's',
-    '\u015F': 's',
-    '\u023F': 's',
-    '\uA7A9': 's',
-    '\uA785': 's',
-    '\u1E9B': 's',
-    '\u24E3': 't',
-    '\uFF54': 't',
-    '\u1E6B': 't',
-    '\u1E97': 't',
-    '\u0165': 't',
-    '\u1E6D': 't',
-    '\u021B': 't',
-    '\u0163': 't',
-    '\u1E71': 't',
-    '\u1E6F': 't',
-    '\u0167': 't',
-    '\u01AD': 't',
-    '\u0288': 't',
-    '\u2C66': 't',
-    '\uA787': 't',
-    '\uA729': 'tz',
-    '\u24E4': 'u',
-    '\uFF55': 'u',
-    '\u00F9': 'u',
-    '\u00FA': 'u',
-    '\u00FB': 'u',
-    '\u0169': 'u',
-    '\u1E79': 'u',
-    '\u016B': 'u',
-    '\u1E7B': 'u',
-    '\u016D': 'u',
-    '\u00FC': 'u',
-    '\u01DC': 'u',
-    '\u01D8': 'u',
-    '\u01D6': 'u',
-    '\u01DA': 'u',
-    '\u1EE7': 'u',
-    '\u016F': 'u',
-    '\u0171': 'u',
-    '\u01D4': 'u',
-    '\u0215': 'u',
-    '\u0217': 'u',
-    '\u01B0': 'u',
-    '\u1EEB': 'u',
-    '\u1EE9': 'u',
-    '\u1EEF': 'u',
-    '\u1EED': 'u',
-    '\u1EF1': 'u',
-    '\u1EE5': 'u',
-    '\u1E73': 'u',
-    '\u0173': 'u',
-    '\u1E77': 'u',
-    '\u1E75': 'u',
-    '\u0289': 'u',
-    '\u24E5': 'v',
-    '\uFF56': 'v',
-    '\u1E7D': 'v',
-    '\u1E7F': 'v',
-    '\u028B': 'v',
-    '\uA75F': 'v',
-    '\u028C': 'v',
-    '\uA761': 'vy',
-    '\u24E6': 'w',
-    '\uFF57': 'w',
-    '\u1E81': 'w',
-    '\u1E83': 'w',
-    '\u0175': 'w',
-    '\u1E87': 'w',
-    '\u1E85': 'w',
-    '\u1E98': 'w',
-    '\u1E89': 'w',
-    '\u2C73': 'w',
-    '\u24E7': 'x',
-    '\uFF58': 'x',
-    '\u1E8B': 'x',
-    '\u1E8D': 'x',
-    '\u24E8': 'y',
-    '\uFF59': 'y',
-    '\u1EF3': 'y',
-    '\u00FD': 'y',
-    '\u0177': 'y',
-    '\u1EF9': 'y',
-    '\u0233': 'y',
-    '\u1E8F': 'y',
-    '\u00FF': 'y',
-    '\u1EF7': 'y',
-    '\u1E99': 'y',
-    '\u1EF5': 'y',
-    '\u01B4': 'y',
-    '\u024F': 'y',
-    '\u1EFF': 'y',
-    '\u24E9': 'z',
-    '\uFF5A': 'z',
-    '\u017A': 'z',
-    '\u1E91': 'z',
-    '\u017C': 'z',
-    '\u017E': 'z',
-    '\u1E93': 'z',
-    '\u1E95': 'z',
-    '\u01B6': 'z',
-    '\u0225': 'z',
-    '\u0240': 'z',
-    '\u2C6C': 'z',
-    '\uA763': 'z',
-    '\u0386': '\u0391',
-    '\u0388': '\u0395',
-    '\u0389': '\u0397',
-    '\u038A': '\u0399',
-    '\u03AA': '\u0399',
-    '\u038C': '\u039F',
-    '\u038E': '\u03A5',
-    '\u03AB': '\u03A5',
-    '\u038F': '\u03A9',
-    '\u03AC': '\u03B1',
-    '\u03AD': '\u03B5',
-    '\u03AE': '\u03B7',
-    '\u03AF': '\u03B9',
-    '\u03CA': '\u03B9',
-    '\u0390': '\u03B9',
-    '\u03CC': '\u03BF',
-    '\u03CD': '\u03C5',
-    '\u03CB': '\u03C5',
-    '\u03B0': '\u03C5',
-    '\u03C9': '\u03C9',
-    '\u03C2': '\u03C3'
-  };
-
-  return diacritics;
-});
-
-S2.define('select2/data/base',[
-  '../utils'
-], function (Utils) {
-  function BaseAdapter ($element, options) {
-    BaseAdapter.__super__.constructor.call(this);
-  }
-
-  Utils.Extend(BaseAdapter, Utils.Observable);
-
-  BaseAdapter.prototype.current = function (callback) {
-    throw new Error('The `current` method must be defined in child classes.');
-  };
-
-  BaseAdapter.prototype.query = function (params, callback) {
-    throw new Error('The `query` method must be defined in child classes.');
-  };
-
-  BaseAdapter.prototype.bind = function (container, $container) {
-    // Can be implemented in subclasses
-  };
-
-  BaseAdapter.prototype.destroy = function () {
-    // Can be implemented in subclasses
-  };
-
-  BaseAdapter.prototype.generateResultId = function (container, data) {
-    var id = container.id + '-result-';
-
-    id += Utils.generateChars(4);
-
-    if (data.id != null) {
-      id += '-' + data.id.toString();
-    } else {
-      id += '-' + Utils.generateChars(4);
-    }
-    return id;
-  };
-
-  return BaseAdapter;
-});
-
-S2.define('select2/data/select',[
-  './base',
-  '../utils',
-  'jquery'
-], function (BaseAdapter, Utils, $) {
-  function SelectAdapter ($element, options) {
-    this.$element = $element;
-    this.options = options;
-
-    SelectAdapter.__super__.constructor.call(this);
-  }
-
-  Utils.Extend(SelectAdapter, BaseAdapter);
-
-  SelectAdapter.prototype.current = function (callback) {
-    var data = [];
-    var self = this;
-
-    this.$element.find(':selected').each(function () {
-      var $option = $(this);
-
-      var option = self.item($option);
-
-      data.push(option);
-    });
-
-    callback(data);
-  };
-
-  SelectAdapter.prototype.select = function (data) {
-    var self = this;
-
-    data.selected = true;
-
-    // If data.element is a DOM node, use it instead
-    if ($(data.element).is('option')) {
-      data.element.selected = true;
-
-      this.$element.trigger('change');
-
-      return;
-    }
-
-    if (this.$element.prop('multiple')) {
-      this.current(function (currentData) {
-        var val = [];
-
-        data = [data];
-        data.push.apply(data, currentData);
-
-        for (var d = 0; d < data.length; d++) {
-          var id = data[d].id;
-
-          if ($.inArray(id, val) === -1) {
-            val.push(id);
-          }
-        }
-
-        self.$element.val(val);
-        self.$element.trigger('change');
-      });
-    } else {
-      var val = data.id;
-
-      this.$element.val(val);
-      this.$element.trigger('change');
-    }
-  };
-
-  SelectAdapter.prototype.unselect = function (data) {
-    var self = this;
-
-    if (!this.$element.prop('multiple')) {
-      return;
-    }
-
-    data.selected = false;
-
-    if ($(data.element).is('option')) {
-      data.element.selected = false;
-
-      this.$element.trigger('change');
-
-      return;
-    }
-
-    this.current(function (currentData) {
-      var val = [];
-
-      for (var d = 0; d < currentData.length; d++) {
-        var id = currentData[d].id;
-
-        if (id !== data.id && $.inArray(id, val) === -1) {
-          val.push(id);
-        }
-      }
-
-      self.$element.val(val);
-
-      self.$element.trigger('change');
-    });
-  };
-
-  SelectAdapter.prototype.bind = function (container, $container) {
-    var self = this;
-
-    this.container = container;
-
-    container.on('select', function (params) {
-      self.select(params.data);
-    });
-
-    container.on('unselect', function (params) {
-      self.unselect(params.data);
-    });
-  };
-
-  SelectAdapter.prototype.destroy = function () {
-    // Remove anything added to child elements
-    this.$element.find('*').each(function () {
-      // Remove any custom data set by Select2
-      Utils.RemoveData(this);
-    });
-  };
-
-  SelectAdapter.prototype.query = function (params, callback) {
-    var data = [];
-    var self = this;
-
-    var $options = this.$element.children();
-
-    $options.each(function () {
-      var $option = $(this);
-
-      if (!$option.is('option') && !$option.is('optgroup')) {
-        return;
-      }
-
-      var option = self.item($option);
-
-      var matches = self.matches(params, option);
-
-      if (matches !== null) {
-        data.push(matches);
-      }
-    });
-
-    callback({
-      results: data
-    });
-  };
-
-  SelectAdapter.prototype.addOptions = function ($options) {
-    Utils.appendMany(this.$element, $options);
-  };
-
-  SelectAdapter.prototype.option = function (data) {
-    var option;
-
-    if (data.children) {
-      option = document.createElement('optgroup');
-      option.label = data.text;
-    } else {
-      option = document.createElement('option');
-
-      if (option.textContent !== undefined) {
-        option.textContent = data.text;
-      } else {
-        option.innerText = data.text;
-      }
-    }
-
-    if (data.id !== undefined) {
-      option.value = data.id;
-    }
-
-    if (data.disabled) {
-      option.disabled = true;
-    }
-
-    if (data.selected) {
-      option.selected = true;
-    }
-
-    if (data.title) {
-      option.title = data.title;
-    }
-
-    var $option = $(option);
-
-    var normalizedData = this._normalizeItem(data);
-    normalizedData.element = option;
-
-    // Override the option's data with the combined data
-    Utils.StoreData(option, 'data', normalizedData);
-
-    return $option;
-  };
-
-  SelectAdapter.prototype.item = function ($option) {
-    var data = {};
-
-    data = Utils.GetData($option[0], 'data');
-
-    if (data != null) {
-      return data;
-    }
-
-    if ($option.is('option')) {
-      data = {
-        id: $option.val(),
-        text: $option.text(),
-        disabled: $option.prop('disabled'),
-        selected: $option.prop('selected'),
-        title: $option.prop('title')
-      };
-    } else if ($option.is('optgroup')) {
-      data = {
-        text: $option.prop('label'),
-        children: [],
-        title: $option.prop('title')
-      };
-
-      var $children = $option.children('option');
-      var children = [];
-
-      for (var c = 0; c < $children.length; c++) {
-        var $child = $($children[c]);
-
-        var child = this.item($child);
-
-        children.push(child);
-      }
-
-      data.children = children;
-    }
-
-    data = this._normalizeItem(data);
-    data.element = $option[0];
-
-    Utils.StoreData($option[0], 'data', data);
-
-    return data;
-  };
-
-  SelectAdapter.prototype._normalizeItem = function (item) {
-    if (item !== Object(item)) {
-      item = {
-        id: item,
-        text: item
-      };
-    }
-
-    item = $.extend({}, {
-      text: ''
-    }, item);
-
-    var defaults = {
-      selected: false,
-      disabled: false
-    };
-
-    if (item.id != null) {
-      item.id = item.id.toString();
-    }
-
-    if (item.text != null) {
-      item.text = item.text.toString();
-    }
-
-    if (item._resultId == null && item.id && this.container != null) {
-      item._resultId = this.generateResultId(this.container, item);
-    }
-
-    return $.extend({}, defaults, item);
-  };
-
-  SelectAdapter.prototype.matches = function (params, data) {
-    var matcher = this.options.get('matcher');
-
-    return matcher(params, data);
-  };
-
-  return SelectAdapter;
-});
-
-S2.define('select2/data/array',[
-  './select',
-  '../utils',
-  'jquery'
-], function (SelectAdapter, Utils, $) {
-  function ArrayAdapter ($element, options) {
-    var data = options.get('data') || [];
-
-    ArrayAdapter.__super__.constructor.call(this, $element, options);
-
-    this.addOptions(this.convertToOptions(data));
-  }
-
-  Utils.Extend(ArrayAdapter, SelectAdapter);
-
-  ArrayAdapter.prototype.select = function (data) {
-    var $option = this.$element.find('option').filter(function (i, elm) {
-      return elm.value == data.id.toString();
-    });
-
-    if ($option.length === 0) {
-      $option = this.option(data);
-
-      this.addOptions($option);
-    }
-
-    ArrayAdapter.__super__.select.call(this, data);
-  };
-
-  ArrayAdapter.prototype.convertToOptions = function (data) {
-    var self = this;
-
-    var $existing = this.$element.find('option');
-    var existingIds = $existing.map(function () {
-      return self.item($(this)).id;
-    }).get();
-
-    var $options = [];
-
-    // Filter out all items except for the one passed in the argument
-    function onlyItem (item) {
-      return function () {
-        return $(this).val() == item.id;
-      };
-    }
-
-    for (var d = 0; d < data.length; d++) {
-      var item = this._normalizeItem(data[d]);
-
-      // Skip items which were pre-loaded, only merge the data
-      if ($.inArray(item.id, existingIds) >= 0) {
-        var $existingOption = $existing.filter(onlyItem(item));
-
-        var existingData = this.item($existingOption);
-        var newData = $.extend(true, {}, item, existingData);
-
-        var $newOption = this.option(newData);
-
-        $existingOption.replaceWith($newOption);
-
-        continue;
-      }
-
-      var $option = this.option(item);
-
-      if (item.children) {
-        var $children = this.convertToOptions(item.children);
-
-        Utils.appendMany($option, $children);
-      }
-
-      $options.push($option);
-    }
-
-    return $options;
-  };
-
-  return ArrayAdapter;
-});
-
-S2.define('select2/data/ajax',[
-  './array',
-  '../utils',
-  'jquery'
-], function (ArrayAdapter, Utils, $) {
-  function AjaxAdapter ($element, options) {
-    this.ajaxOptions = this._applyDefaults(options.get('ajax'));
-
-    if (this.ajaxOptions.processResults != null) {
-      this.processResults = this.ajaxOptions.processResults;
-    }
-
-    AjaxAdapter.__super__.constructor.call(this, $element, options);
-  }
-
-  Utils.Extend(AjaxAdapter, ArrayAdapter);
-
-  AjaxAdapter.prototype._applyDefaults = function (options) {
-    var defaults = {
-      data: function (params) {
-        return $.extend({}, params, {
-          q: params.term
-        });
-      },
-      transport: function (params, success, failure) {
-        var $request = $.ajax(params);
-
-        $request.then(success);
-        $request.fail(failure);
-
-        return $request;
-      }
-    };
-
-    return $.extend({}, defaults, options, true);
-  };
-
-  AjaxAdapter.prototype.processResults = function (results) {
-    return results;
-  };
-
-  AjaxAdapter.prototype.query = function (params, callback) {
-    var matches = [];
-    var self = this;
-
-    if (this._request != null) {
-      // JSONP requests cannot always be aborted
-      if ($.isFunction(this._request.abort)) {
-        this._request.abort();
-      }
-
-      this._request = null;
-    }
-
-    var options = $.extend({
-      type: 'GET'
-    }, this.ajaxOptions);
-
-    if (typeof options.url === 'function') {
-      options.url = options.url.call(this.$element, params);
-    }
-
-    if (typeof options.data === 'function') {
-      options.data = options.data.call(this.$element, params);
-    }
-
-    function request () {
-      var $request = options.transport(options, function (data) {
-        var results = self.processResults(data, params);
-
-        if (self.options.get('debug') && window.console && console.error) {
-          // Check to make sure that the response included a `results` key.
-          if (!results || !results.results || !$.isArray(results.results)) {
-            console.error(
-              'Select2: The AJAX results did not return an array in the ' +
-              '`results` key of the response.'
-            );
-          }
-        }
-
-        callback(results);
-      }, function () {
-        // Attempt to detect if a request was aborted
-        // Only works if the transport exposes a status property
-        if ('status' in $request &&
-            ($request.status === 0 || $request.status === '0')) {
-          return;
-        }
-
-        self.trigger('results:message', {
-          message: 'errorLoading'
-        });
-      });
-
-      self._request = $request;
-    }
-
-    if (this.ajaxOptions.delay && params.term != null) {
-      if (this._queryTimeout) {
-        window.clearTimeout(this._queryTimeout);
-      }
-
-      this._queryTimeout = window.setTimeout(request, this.ajaxOptions.delay);
-    } else {
-      request();
-    }
-  };
-
-  return AjaxAdapter;
-});
-
-S2.define('select2/data/tags',[
-  'jquery'
-], function ($) {
-  function Tags (decorated, $element, options) {
-    var tags = options.get('tags');
-
-    var createTag = options.get('createTag');
-
-    if (createTag !== undefined) {
-      this.createTag = createTag;
-    }
-
-    var insertTag = options.get('insertTag');
-
-    if (insertTag !== undefined) {
-        this.insertTag = insertTag;
-    }
-
-    decorated.call(this, $element, options);
-
-    if ($.isArray(tags)) {
-      for (var t = 0; t < tags.length; t++) {
-        var tag = tags[t];
-        var item = this._normalizeItem(tag);
-
-        var $option = this.option(item);
-
-        this.$element.append($option);
-      }
-    }
-  }
-
-  Tags.prototype.query = function (decorated, params, callback) {
-    var self = this;
-
-    this._removeOldTags();
-
-    if (params.term == null || params.page != null) {
-      decorated.call(this, params, callback);
-      return;
-    }
-
-    function wrapper (obj, child) {
-      var data = obj.results;
-
-      for (var i = 0; i < data.length; i++) {
-        var option = data[i];
-
-        var checkChildren = (
-          option.children != null &&
-          !wrapper({
-            results: option.children
-          }, true)
-        );
-
-        var optionText = (option.text || '').toUpperCase();
-        var paramsTerm = (params.term || '').toUpperCase();
-
-        var checkText = optionText === paramsTerm;
-
-        if (checkText || checkChildren) {
-          if (child) {
-            return false;
-          }
-
-          obj.data = data;
-          callback(obj);
-
-          return;
-        }
-      }
-
-      if (child) {
-        return true;
-      }
-
-      var tag = self.createTag(params);
-
-      if (tag != null) {
-        var $option = self.option(tag);
-        $option.attr('data-select2-tag', true);
-
-        self.addOptions([$option]);
-
-        self.insertTag(data, tag);
-      }
-
-      obj.results = data;
-
-      callback(obj);
-    }
-
-    decorated.call(this, params, wrapper);
-  };
-
-  Tags.prototype.createTag = function (decorated, params) {
-    var term = $.trim(params.term);
-
-    if (term === '') {
-      return null;
-    }
-
-    return {
-      id: term,
-      text: term
-    };
-  };
-
-  Tags.prototype.insertTag = function (_, data, tag) {
-    data.unshift(tag);
-  };
-
-  Tags.prototype._removeOldTags = function (_) {
-    var tag = this._lastTag;
-
-    var $options = this.$element.find('option[data-select2-tag]');
-
-    $options.each(function () {
-      if (this.selected) {
-        return;
-      }
-
-      $(this).remove();
-    });
-  };
-
-  return Tags;
-});
-
-S2.define('select2/data/tokenizer',[
-  'jquery'
-], function ($) {
-  function Tokenizer (decorated, $element, options) {
-    var tokenizer = options.get('tokenizer');
-
-    if (tokenizer !== undefined) {
-      this.tokenizer = tokenizer;
-    }
-
-    decorated.call(this, $element, options);
-  }
-
-  Tokenizer.prototype.bind = function (decorated, container, $container) {
-    decorated.call(this, container, $container);
-
-    this.$search =  container.dropdown.$search || container.selection.$search ||
-      $container.find('.select2-search__field');
-  };
-
-  Tokenizer.prototype.query = function (decorated, params, callback) {
-    var self = this;
-
-    function createAndSelect (data) {
-      // Normalize the data object so we can use it for checks
-      var item = self._normalizeItem(data);
-
-      // Check if the data object already exists as a tag
-      // Select it if it doesn't
-      var $existingOptions = self.$element.find('option').filter(function () {
-        return $(this).val() === item.id;
-      });
-
-      // If an existing option wasn't found for it, create the option
-      if (!$existingOptions.length) {
-        var $option = self.option(item);
-        $option.attr('data-select2-tag', true);
-
-        self._removeOldTags();
-        self.addOptions([$option]);
-      }
-
-      // Select the item, now that we know there is an option for it
-      select(item);
-    }
-
-    function select (data) {
-      self.trigger('select', {
-        data: data
-      });
-    }
-
-    params.term = params.term || '';
-
-    var tokenData = this.tokenizer(params, this.options, createAndSelect);
-
-    if (tokenData.term !== params.term) {
-      // Replace the search term if we have the search box
-      if (this.$search.length) {
-        this.$search.val(tokenData.term);
-        this.$search.focus();
-      }
-
-      params.term = tokenData.term;
-    }
-
-    decorated.call(this, params, callback);
-  };
-
-  Tokenizer.prototype.tokenizer = function (_, params, options, callback) {
-    var separators = options.get('tokenSeparators') || [];
-    var term = params.term;
-    var i = 0;
-
-    var createTag = this.createTag || function (params) {
-      return {
-        id: params.term,
-        text: params.term
-      };
-    };
-
-    while (i < term.length) {
-      var termChar = term[i];
-
-      if ($.inArray(termChar, separators) === -1) {
-        i++;
-
-        continue;
-      }
-
-      var part = term.substr(0, i);
-      var partParams = $.extend({}, params, {
-        term: part
-      });
-
-      var data = createTag(partParams);
-
-      if (data == null) {
-        i++;
-        continue;
-      }
-
-      callback(data);
-
-      // Reset the term to not include the tokenized portion
-      term = term.substr(i + 1) || '';
-      i = 0;
-    }
-
-    return {
-      term: term
-    };
-  };
-
-  return Tokenizer;
-});
-
-S2.define('select2/data/minimumInputLength',[
-
-], function () {
-  function MinimumInputLength (decorated, $e, options) {
-    this.minimumInputLength = options.get('minimumInputLength');
-
-    decorated.call(this, $e, options);
-  }
-
-  MinimumInputLength.prototype.query = function (decorated, params, callback) {
-    params.term = params.term || '';
-
-    if (params.term.length < this.minimumInputLength) {
-      this.trigger('results:message', {
-        message: 'inputTooShort',
-        args: {
-          minimum: this.minimumInputLength,
-          input: params.term,
-          params: params
-        }
-      });
-
-      return;
-    }
-
-    decorated.call(this, params, callback);
-  };
-
-  return MinimumInputLength;
-});
-
-S2.define('select2/data/maximumInputLength',[
-
-], function () {
-  function MaximumInputLength (decorated, $e, options) {
-    this.maximumInputLength = options.get('maximumInputLength');
-
-    decorated.call(this, $e, options);
-  }
-
-  MaximumInputLength.prototype.query = function (decorated, params, callback) {
-    params.term = params.term || '';
-
-    if (this.maximumInputLength > 0 &&
-        params.term.length > this.maximumInputLength) {
-      this.trigger('results:message', {
-        message: 'inputTooLong',
-        args: {
-          maximum: this.maximumInputLength,
-          input: params.term,
-          params: params
-        }
-      });
-
-      return;
-    }
-
-    decorated.call(this, params, callback);
-  };
-
-  return MaximumInputLength;
-});
-
-S2.define('select2/data/maximumSelectionLength',[
-
-], function (){
-  function MaximumSelectionLength (decorated, $e, options) {
-    this.maximumSelectionLength = options.get('maximumSelectionLength');
-
-    decorated.call(this, $e, options);
-  }
-
-  MaximumSelectionLength.prototype.query =
-    function (decorated, params, callback) {
-      var self = this;
-
-      this.current(function (currentData) {
-        var count = currentData != null ? currentData.length : 0;
-        if (self.maximumSelectionLength > 0 &&
-          count >= self.maximumSelectionLength) {
-          self.trigger('results:message', {
-            message: 'maximumSelected',
-            args: {
-              maximum: self.maximumSelectionLength
-            }
-          });
-          return;
-        }
-        decorated.call(self, params, callback);
-      });
-  };
-
-  return MaximumSelectionLength;
-});
-
-S2.define('select2/dropdown',[
-  'jquery',
-  './utils'
-], function ($, Utils) {
-  function Dropdown ($element, options) {
-    this.$element = $element;
-    this.options = options;
-
-    Dropdown.__super__.constructor.call(this);
-  }
-
-  Utils.Extend(Dropdown, Utils.Observable);
-
-  Dropdown.prototype.render = function () {
-    var $dropdown = $(
-      '<span class="select2-dropdown">' +
-        '<span class="select2-results"></span>' +
-      '</span>'
-    );
-
-    $dropdown.attr('dir', this.options.get('dir'));
-
-    this.$dropdown = $dropdown;
-
-    return $dropdown;
-  };
-
-  Dropdown.prototype.bind = function () {
-    // Should be implemented in subclasses
-  };
-
-  Dropdown.prototype.position = function ($dropdown, $container) {
-    // Should be implmented in subclasses
-  };
-
-  Dropdown.prototype.destroy = function () {
-    // Remove the dropdown from the DOM
-    this.$dropdown.remove();
-  };
-
-  return Dropdown;
-});
-
-S2.define('select2/dropdown/search',[
-  'jquery',
-  '../utils'
-], function ($, Utils) {
-  function Search () { }
-
-  Search.prototype.render = function (decorated) {
-    var $rendered = decorated.call(this);
-
-    var $search = $(
-      '<span class="select2-search select2-search--dropdown">' +
-        '<input class="select2-search__field" type="search" tabindex="-1"' +
-        ' autocomplete="off" autocorrect="off" autocapitalize="none"' +
-        ' spellcheck="false" role="textbox" />' +
-      '</span>'
-    );
-
-    this.$searchContainer = $search;
-    this.$search = $search.find('input');
-
-    $rendered.prepend($search);
-
-    return $rendered;
-  };
-
-  Search.prototype.bind = function (decorated, container, $container) {
-    var self = this;
-
-    decorated.call(this, container, $container);
-
-    this.$search.on('keydown', function (evt) {
-      self.trigger('keypress', evt);
-
-      self._keyUpPrevented = evt.isDefaultPrevented();
-    });
-
-    // Workaround for browsers which do not support the `input` event
-    // This will prevent double-triggering of events for browsers which support
-    // both the `keyup` and `input` events.
-    this.$search.on('input', function (evt) {
-      // Unbind the duplicated `keyup` event
-      $(this).off('keyup');
-    });
-
-    this.$search.on('keyup input', function (evt) {
-      self.handleSearch(evt);
-    });
-
-    container.on('open', function () {
-      self.$search.attr('tabindex', 0);
-
-      self.$search.focus();
-
-      window.setTimeout(function () {
-        self.$search.focus();
-      }, 0);
-    });
-
-    container.on('close', function () {
-      self.$search.attr('tabindex', -1);
-
-      self.$search.val('');
-      self.$search.blur();
-    });
-
-    container.on('focus', function () {
-      if (!container.isOpen()) {
-        self.$search.focus();
-      }
-    });
-
-    container.on('results:all', function (params) {
-      if (params.query.term == null || params.query.term === '') {
-        var showSearch = self.showSearch(params);
-
-        if (showSearch) {
-          self.$searchContainer.removeClass('select2-search--hide');
-        } else {
-          self.$searchContainer.addClass('select2-search--hide');
-        }
-      }
-    });
-  };
-
-  Search.prototype.handleSearch = function (evt) {
-    if (!this._keyUpPrevented) {
-      var input = this.$search.val();
-
-      this.trigger('query', {
-        term: input
-      });
-    }
-
-    this._keyUpPrevented = false;
-  };
-
-  Search.prototype.showSearch = function (_, params) {
-    return true;
-  };
-
-  return Search;
-});
-
-S2.define('select2/dropdown/hidePlaceholder',[
-
-], function () {
-  function HidePlaceholder (decorated, $element, options, dataAdapter) {
-    this.placeholder = this.normalizePlaceholder(options.get('placeholder'));
-
-    decorated.call(this, $element, options, dataAdapter);
-  }
-
-  HidePlaceholder.prototype.append = function (decorated, data) {
-    data.results = this.removePlaceholder(data.results);
-
-    decorated.call(this, data);
-  };
-
-  HidePlaceholder.prototype.normalizePlaceholder = function (_, placeholder) {
-    if (typeof placeholder === 'string') {
-      placeholder = {
-        id: '',
-        text: placeholder
-      };
-    }
-
-    return placeholder;
-  };
-
-  HidePlaceholder.prototype.removePlaceholder = function (_, data) {
-    var modifiedData = data.slice(0);
-
-    for (var d = data.length - 1; d >= 0; d--) {
-      var item = data[d];
-
-      if (this.placeholder.id === item.id) {
-        modifiedData.splice(d, 1);
-      }
-    }
-
-    return modifiedData;
-  };
-
-  return HidePlaceholder;
-});
-
-S2.define('select2/dropdown/infiniteScroll',[
-  'jquery'
-], function ($) {
-  function InfiniteScroll (decorated, $element, options, dataAdapter) {
-    this.lastParams = {};
-
-    decorated.call(this, $element, options, dataAdapter);
-
-    this.$loadingMore = this.createLoadingMore();
-    this.loading = false;
-  }
-
-  InfiniteScroll.prototype.append = function (decorated, data) {
-    this.$loadingMore.remove();
-    this.loading = false;
-
-    decorated.call(this, data);
-
-    if (this.showLoadingMore(data)) {
-      this.$results.append(this.$loadingMore);
-    }
-  };
-
-  InfiniteScroll.prototype.bind = function (decorated, container, $container) {
-    var self = this;
-
-    decorated.call(this, container, $container);
-
-    container.on('query', function (params) {
-      self.lastParams = params;
-      self.loading = true;
-    });
-
-    container.on('query:append', function (params) {
-      self.lastParams = params;
-      self.loading = true;
-    });
-
-    this.$results.on('scroll', function () {
-      var isLoadMoreVisible = $.contains(
-        document.documentElement,
-        self.$loadingMore[0]
-      );
-
-      if (self.loading || !isLoadMoreVisible) {
-        return;
-      }
-
-      var currentOffset = self.$results.offset().top +
-        self.$results.outerHeight(false);
-      var loadingMoreOffset = self.$loadingMore.offset().top +
-        self.$loadingMore.outerHeight(false);
-
-      if (currentOffset + 50 >= loadingMoreOffset) {
-        self.loadMore();
-      }
-    });
-  };
-
-  InfiniteScroll.prototype.loadMore = function () {
-    this.loading = true;
-
-    var params = $.extend({}, {page: 1}, this.lastParams);
-
-    params.page++;
-
-    this.trigger('query:append', params);
-  };
-
-  InfiniteScroll.prototype.showLoadingMore = function (_, data) {
-    return data.pagination && data.pagination.more;
-  };
-
-  InfiniteScroll.prototype.createLoadingMore = function () {
-    var $option = $(
-      '<li ' +
-      'class="select2-results__option select2-results__option--load-more"' +
-      'role="treeitem" aria-disabled="true"></li>'
-    );
-
-    var message = this.options.get('translations').get('loadingMore');
-
-    $option.html(message(this.lastParams));
-
-    return $option;
-  };
-
-  return InfiniteScroll;
-});
-
-S2.define('select2/dropdown/attachBody',[
-  'jquery',
-  '../utils'
-], function ($, Utils) {
-  function AttachBody (decorated, $element, options) {
-    this.$dropdownParent = options.get('dropdownParent') || $(document.body);
-
-    decorated.call(this, $element, options);
-  }
-
-  AttachBody.prototype.bind = function (decorated, container, $container) {
-    var self = this;
-
-    var setupResultsEvents = false;
-
-    decorated.call(this, container, $container);
-
-    container.on('open', function () {
-      self._showDropdown();
-      self._attachPositioningHandler(container);
-
-      if (!setupResultsEvents) {
-        setupResultsEvents = true;
-
-        container.on('results:all', function () {
-          self._positionDropdown();
-          self._resizeDropdown();
-        });
-
-        container.on('results:append', function () {
-          self._positionDropdown();
-          self._resizeDropdown();
-        });
-      }
-    });
-
-    container.on('close', function () {
-      self._hideDropdown();
-      self._detachPositioningHandler(container);
-    });
-
-    this.$dropdownContainer.on('mousedown', function (evt) {
-      evt.stopPropagation();
-    });
-  };
-
-  AttachBody.prototype.destroy = function (decorated) {
-    decorated.call(this);
-
-    this.$dropdownContainer.remove();
-  };
-
-  AttachBody.prototype.position = function (decorated, $dropdown, $container) {
-    // Clone all of the container classes
-    $dropdown.attr('class', $container.attr('class'));
-
-    $dropdown.removeClass('select2');
-    $dropdown.addClass('select2-container--open');
-
-    $dropdown.css({
-      position: 'absolute',
-      top: -999999
-    });
-
-    this.$container = $container;
-  };
-
-  AttachBody.prototype.render = function (decorated) {
-    var $container = $('<span></span>');
-
-    var $dropdown = decorated.call(this);
-    $container.append($dropdown);
-
-    this.$dropdownContainer = $container;
-
-    return $container;
-  };
-
-  AttachBody.prototype._hideDropdown = function (decorated) {
-    this.$dropdownContainer.detach();
-  };
-
-  AttachBody.prototype._attachPositioningHandler =
-      function (decorated, container) {
-    var self = this;
-
-    var scrollEvent = 'scroll.select2.' + container.id;
-    var resizeEvent = 'resize.select2.' + container.id;
-    var orientationEvent = 'orientationchange.select2.' + container.id;
-
-    var $watchers = this.$container.parents().filter(Utils.hasScroll);
-    $watchers.each(function () {
-      Utils.StoreData(this, 'select2-scroll-position', {
-        x: $(this).scrollLeft(),
-        y: $(this).scrollTop()
-      });
-    });
-
-    $watchers.on(scrollEvent, function (ev) {
-      var position = Utils.GetData(this, 'select2-scroll-position');
-      $(this).scrollTop(position.y);
-    });
-
-    $(window).on(scrollEvent + ' ' + resizeEvent + ' ' + orientationEvent,
-      function (e) {
-      self._positionDropdown();
-      self._resizeDropdown();
-    });
-  };
-
-  AttachBody.prototype._detachPositioningHandler =
-      function (decorated, container) {
-    var scrollEvent = 'scroll.select2.' + container.id;
-    var resizeEvent = 'resize.select2.' + container.id;
-    var orientationEvent = 'orientationchange.select2.' + container.id;
-
-    var $watchers = this.$container.parents().filter(Utils.hasScroll);
-    $watchers.off(scrollEvent);
-
-    $(window).off(scrollEvent + ' ' + resizeEvent + ' ' + orientationEvent);
-  };
-
-  AttachBody.prototype._positionDropdown = function () {
-    var $window = $(window);
-
-    var isCurrentlyAbove = this.$dropdown.hasClass('select2-dropdown--above');
-    var isCurrentlyBelow = this.$dropdown.hasClass('select2-dropdown--below');
-
-    var newDirection = null;
-
-    var offset = this.$container.offset();
-
-    offset.bottom = offset.top + this.$container.outerHeight(false);
-
-    var container = {
-      height: this.$container.outerHeight(false)
-    };
-
-    container.top = offset.top;
-    container.bottom = offset.top + container.height;
-
-    var dropdown = {
-      height: this.$dropdown.outerHeight(false)
-    };
-
-    var viewport = {
-      top: $window.scrollTop(),
-      bottom: $window.scrollTop() + $window.height()
-    };
-
-    var enoughRoomAbove = viewport.top < (offset.top - dropdown.height);
-    var enoughRoomBelow = viewport.bottom > (offset.bottom + dropdown.height);
-
-    var css = {
-      left: offset.left,
-      top: container.bottom
-    };
-
-    // Determine what the parent element is to use for calciulating the offset
-    var $offsetParent = this.$dropdownParent;
-
-    // For statically positoned elements, we need to get the element
-    // that is determining the offset
-    if ($offsetParent.css('position') === 'static') {
-      $offsetParent = $offsetParent.offsetParent();
-    }
-
-    var parentOffset = $offsetParent.offset();
-
-    css.top -= parentOffset.top;
-    css.left -= parentOffset.left;
-
-    if (!isCurrentlyAbove && !isCurrentlyBelow) {
-      newDirection = 'below';
-    }
-
-    if (!enoughRoomBelow && enoughRoomAbove && !isCurrentlyAbove) {
-      newDirection = 'above';
-    } else if (!enoughRoomAbove && enoughRoomBelow && isCurrentlyAbove) {
-      newDirection = 'below';
-    }
-
-    if (newDirection == 'above' ||
-      (isCurrentlyAbove && newDirection !== 'below')) {
-      css.top = container.top - parentOffset.top - dropdown.height;
-    }
-
-    if (newDirection != null) {
-      this.$dropdown
-        .removeClass('select2-dropdown--below select2-dropdown--above')
-        .addClass('select2-dropdown--' + newDirection);
-      this.$container
-        .removeClass('select2-container--below select2-container--above')
-        .addClass('select2-container--' + newDirection);
-    }
-
-    this.$dropdownContainer.css(css);
-  };
-
-  AttachBody.prototype._resizeDropdown = function () {
-    var css = {
-      width: this.$container.outerWidth(false) + 'px'
-    };
-
-    if (this.options.get('dropdownAutoWidth')) {
-      css.minWidth = css.width;
-      css.position = 'relative';
-      css.width = 'auto';
-    }
-
-    this.$dropdown.css(css);
-  };
-
-  AttachBody.prototype._showDropdown = function (decorated) {
-    this.$dropdownContainer.appendTo(this.$dropdownParent);
-
-    this._positionDropdown();
-    this._resizeDropdown();
-  };
-
-  return AttachBody;
-});
-
-S2.define('select2/dropdown/minimumResultsForSearch',[
-
-], function () {
-  function countResults (data) {
-    var count = 0;
-
-    for (var d = 0; d < data.length; d++) {
-      var item = data[d];
-
-      if (item.children) {
-        count += countResults(item.children);
-      } else {
-        count++;
-      }
-    }
-
-    return count;
-  }
-
-  function MinimumResultsForSearch (decorated, $element, options, dataAdapter) {
-    this.minimumResultsForSearch = options.get('minimumResultsForSearch');
-
-    if (this.minimumResultsForSearch < 0) {
-      this.minimumResultsForSearch = Infinity;
-    }
-
-    decorated.call(this, $element, options, dataAdapter);
-  }
-
-  MinimumResultsForSearch.prototype.showSearch = function (decorated, params) {
-    if (countResults(params.data.results) < this.minimumResultsForSearch) {
-      return false;
-    }
-
-    return decorated.call(this, params);
-  };
-
-  return MinimumResultsForSearch;
-});
-
-S2.define('select2/dropdown/selectOnClose',[
-  '../utils'
-], function (Utils) {
-  function SelectOnClose () { }
-
-  SelectOnClose.prototype.bind = function (decorated, container, $container) {
-    var self = this;
-
-    decorated.call(this, container, $container);
-
-    container.on('close', function (params) {
-      self._handleSelectOnClose(params);
-    });
-  };
-
-  SelectOnClose.prototype._handleSelectOnClose = function (_, params) {
-    if (params && params.originalSelect2Event != null) {
-      var event = params.originalSelect2Event;
-
-      // Don't select an item if the close event was triggered from a select or
-      // unselect event
-      if (event._type === 'select' || event._type === 'unselect') {
-        return;
-      }
-    }
-
-    var $highlightedResults = this.getHighlightedResults();
-
-    // Only select highlighted results
-    if ($highlightedResults.length < 1) {
-      return;
-    }
-
-    var data = Utils.GetData($highlightedResults[0], 'data');
-
-    // Don't re-select already selected resulte
-    if (
-      (data.element != null && data.element.selected) ||
-      (data.element == null && data.selected)
-    ) {
-      return;
-    }
-
-    this.trigger('select', {
-        data: data
-    });
-  };
-
-  return SelectOnClose;
-});
-
-S2.define('select2/dropdown/closeOnSelect',[
-
-], function () {
-  function CloseOnSelect () { }
-
-  CloseOnSelect.prototype.bind = function (decorated, container, $container) {
-    var self = this;
-
-    decorated.call(this, container, $container);
-
-    container.on('select', function (evt) {
-      self._selectTriggered(evt);
-    });
-
-    container.on('unselect', function (evt) {
-      self._selectTriggered(evt);
-    });
-  };
-
-  CloseOnSelect.prototype._selectTriggered = function (_, evt) {
-    var originalEvent = evt.originalEvent;
-
-    // Don't close if the control key is being held
-    if (originalEvent && originalEvent.ctrlKey) {
-      return;
-    }
-
-    this.trigger('close', {
-      originalEvent: originalEvent,
-      originalSelect2Event: evt
-    });
-  };
-
-  return CloseOnSelect;
-});
-
-S2.define('select2/i18n/en',[],function () {
-  // English
-  return {
-    errorLoading: function () {
-      return 'The results could not be loaded.';
-    },
-    inputTooLong: function (args) {
-      var overChars = args.input.length - args.maximum;
-
-      var message = 'Please delete ' + overChars + ' character';
-
-      if (overChars != 1) {
-        message += 's';
-      }
-
-      return message;
-    },
-    inputTooShort: function (args) {
-      var remainingChars = args.minimum - args.input.length;
-
-      var message = 'Please enter ' + remainingChars + ' or more characters';
-
-      return message;
-    },
-    loadingMore: function () {
-      return 'Loading more results…';
-    },
-    maximumSelected: function (args) {
-      var message = 'You can only select ' + args.maximum + ' item';
-
-      if (args.maximum != 1) {
-        message += 's';
-      }
-
-      return message;
-    },
-    noResults: function () {
-      return 'No results found';
-    },
-    searching: function () {
-      return 'Searching…';
-    }
-  };
-});
-
-S2.define('select2/defaults',[
-  'jquery',
-  'require',
-
-  './results',
-
-  './selection/single',
-  './selection/multiple',
-  './selection/placeholder',
-  './selection/allowClear',
-  './selection/search',
-  './selection/eventRelay',
-
-  './utils',
-  './translation',
-  './diacritics',
-
-  './data/select',
-  './data/array',
-  './data/ajax',
-  './data/tags',
-  './data/tokenizer',
-  './data/minimumInputLength',
-  './data/maximumInputLength',
-  './data/maximumSelectionLength',
-
-  './dropdown',
-  './dropdown/search',
-  './dropdown/hidePlaceholder',
-  './dropdown/infiniteScroll',
-  './dropdown/attachBody',
-  './dropdown/minimumResultsForSearch',
-  './dropdown/selectOnClose',
-  './dropdown/closeOnSelect',
-
-  './i18n/en'
-], function ($, require,
-
-             ResultsList,
-
-             SingleSelection, MultipleSelection, Placeholder, AllowClear,
-             SelectionSearch, EventRelay,
-
-             Utils, Translation, DIACRITICS,
-
-             SelectData, ArrayData, AjaxData, Tags, Tokenizer,
-             MinimumInputLength, MaximumInputLength, MaximumSelectionLength,
-
-             Dropdown, DropdownSearch, HidePlaceholder, InfiniteScroll,
-             AttachBody, MinimumResultsForSearch, SelectOnClose, CloseOnSelect,
-
-             EnglishTranslation) {
-  function Defaults () {
-    this.reset();
-  }
-
-  Defaults.prototype.apply = function (options) {
-    options = $.extend(true, {}, this.defaults, options);
-
-    if (options.dataAdapter == null) {
-      if (options.ajax != null) {
-        options.dataAdapter = AjaxData;
-      } else if (options.data != null) {
-        options.dataAdapter = ArrayData;
-      } else {
-        options.dataAdapter = SelectData;
-      }
-
-      if (options.minimumInputLength > 0) {
-        options.dataAdapter = Utils.Decorate(
-          options.dataAdapter,
-          MinimumInputLength
-        );
-      }
-
-      if (options.maximumInputLength > 0) {
-        options.dataAdapter = Utils.Decorate(
-          options.dataAdapter,
-          MaximumInputLength
-        );
-      }
-
-      if (options.maximumSelectionLength > 0) {
-        options.dataAdapter = Utils.Decorate(
-          options.dataAdapter,
-          MaximumSelectionLength
-        );
-      }
-
-      if (options.tags) {
-        options.dataAdapter = Utils.Decorate(options.dataAdapter, Tags);
-      }
-
-      if (options.tokenSeparators != null || options.tokenizer != null) {
-        options.dataAdapter = Utils.Decorate(
-          options.dataAdapter,
-          Tokenizer
-        );
-      }
-
-      if (options.query != null) {
-        var Query = require(options.amdBase + 'compat/query');
-
-        options.dataAdapter = Utils.Decorate(
-          options.dataAdapter,
-          Query
-        );
-      }
-
-      if (options.initSelection != null) {
-        var InitSelection = require(options.amdBase + 'compat/initSelection');
-
-        options.dataAdapter = Utils.Decorate(
-          options.dataAdapter,
-          InitSelection
-        );
-      }
-    }
-
-    if (options.resultsAdapter == null) {
-      options.resultsAdapter = ResultsList;
-
-      if (options.ajax != null) {
-        options.resultsAdapter = Utils.Decorate(
-          options.resultsAdapter,
-          InfiniteScroll
-        );
-      }
-
-      if (options.placeholder != null) {
-        options.resultsAdapter = Utils.Decorate(
-          options.resultsAdapter,
-          HidePlaceholder
-        );
-      }
-
-      if (options.selectOnClose) {
-        options.resultsAdapter = Utils.Decorate(
-          options.resultsAdapter,
-          SelectOnClose
-        );
-      }
-    }
-
-    if (options.dropdownAdapter == null) {
-      if (options.multiple) {
-        options.dropdownAdapter = Dropdown;
-      } else {
-        var SearchableDropdown = Utils.Decorate(Dropdown, DropdownSearch);
-
-        options.dropdownAdapter = SearchableDropdown;
-      }
-
-      if (options.minimumResultsForSearch !== 0) {
-        options.dropdownAdapter = Utils.Decorate(
-          options.dropdownAdapter,
-          MinimumResultsForSearch
-        );
-      }
-
-      if (options.closeOnSelect) {
-        options.dropdownAdapter = Utils.Decorate(
-          options.dropdownAdapter,
-          CloseOnSelect
-        );
-      }
-
-      if (
-        options.dropdownCssClass != null ||
-        options.dropdownCss != null ||
-        options.adaptDropdownCssClass != null
-      ) {
-        var DropdownCSS = require(options.amdBase + 'compat/dropdownCss');
-
-        options.dropdownAdapter = Utils.Decorate(
-          options.dropdownAdapter,
-          DropdownCSS
-        );
-      }
-
-      options.dropdownAdapter = Utils.Decorate(
-        options.dropdownAdapter,
-        AttachBody
-      );
-    }
-
-    if (options.selectionAdapter == null) {
-      if (options.multiple) {
-        options.selectionAdapter = MultipleSelection;
-      } else {
-        options.selectionAdapter = SingleSelection;
-      }
-
-      // Add the placeholder mixin if a placeholder was specified
-      if (options.placeholder != null) {
-        options.selectionAdapter = Utils.Decorate(
-          options.selectionAdapter,
-          Placeholder
-        );
-      }
-
-      if (options.allowClear) {
-        options.selectionAdapter = Utils.Decorate(
-          options.selectionAdapter,
-          AllowClear
-        );
-      }
-
-      if (options.multiple) {
-        options.selectionAdapter = Utils.Decorate(
-          options.selectionAdapter,
-          SelectionSearch
-        );
-      }
-
-      if (
-        options.containerCssClass != null ||
-        options.containerCss != null ||
-        options.adaptContainerCssClass != null
-      ) {
-        var ContainerCSS = require(options.amdBase + 'compat/containerCss');
-
-        options.selectionAdapter = Utils.Decorate(
-          options.selectionAdapter,
-          ContainerCSS
-        );
-      }
-
-      options.selectionAdapter = Utils.Decorate(
-        options.selectionAdapter,
-        EventRelay
-      );
-    }
-
-    if (typeof options.language === 'string') {
-      // Check if the language is specified with a region
-      if (options.language.indexOf('-') > 0) {
-        // Extract the region information if it is included
-        var languageParts = options.language.split('-');
-        var baseLanguage = languageParts[0];
-
-        options.language = [options.language, baseLanguage];
-      } else {
-        options.language = [options.language];
-      }
-    }
-
-    if ($.isArray(options.language)) {
-      var languages = new Translation();
-      options.language.push('en');
-
-      var languageNames = options.language;
-
-      for (var l = 0; l < languageNames.length; l++) {
-        var name = languageNames[l];
-        var language = {};
-
-        try {
-          // Try to load it with the original name
-          language = Translation.loadPath(name);
-        } catch (e) {
-          try {
-            // If we couldn't load it, check if it wasn't the full path
-            name = this.defaults.amdLanguageBase + name;
-            language = Translation.loadPath(name);
-          } catch (ex) {
-            // The translation could not be loaded at all. Sometimes this is
-            // because of a configuration problem, other times this can be
-            // because of how Select2 helps load all possible translation files.
-            if (options.debug && window.console && console.warn) {
-              console.warn(
-                'Select2: The language file for "' + name + '" could not be ' +
-                'automatically loaded. A fallback will be used instead.'
-              );
-            }
-
-            continue;
-          }
-        }
-
-        languages.extend(language);
-      }
-
-      options.translations = languages;
-    } else {
-      var baseTranslation = Translation.loadPath(
-        this.defaults.amdLanguageBase + 'en'
-      );
-      var customTranslation = new Translation(options.language);
-
-      customTranslation.extend(baseTranslation);
-
-      options.translations = customTranslation;
-    }
-
-    return options;
-  };
-
-  Defaults.prototype.reset = function () {
-    function stripDiacritics (text) {
-      // Used 'uni range + named function' from http://jsperf.com/diacritics/18
-      function match(a) {
-        return DIACRITICS[a] || a;
-      }
-
-      return text.replace(/[^\u0000-\u007E]/g, match);
-    }
-
-    function matcher (params, data) {
-      // Always return the object if there is nothing to compare
-      if ($.trim(params.term) === '') {
-        return data;
-      }
-
-      // Do a recursive check for options with children
-      if (data.children && data.children.length > 0) {
-        // Clone the data object if there are children
-        // This is required as we modify the object to remove any non-matches
-        var match = $.extend(true, {}, data);
-
-        // Check each child of the option
-        for (var c = data.children.length - 1; c >= 0; c--) {
-          var child = data.children[c];
-
-          var matches = matcher(params, child);
-
-          // If there wasn't a match, remove the object in the array
-          if (matches == null) {
-            match.children.splice(c, 1);
-          }
-        }
-
-        // If any children matched, return the new object
-        if (match.children.length > 0) {
-          return match;
-        }
-
-        // If there were no matching children, check just the plain object
-        return matcher(params, match);
-      }
-
-      var original = stripDiacritics(data.text).toUpperCase();
-      var term = stripDiacritics(params.term).toUpperCase();
-
-      // Check if the text contains the term
-      if (original.indexOf(term) > -1) {
-        return data;
-      }
-
-      // If it doesn't contain the term, don't return anything
-      return null;
-    }
-
-    this.defaults = {
-      amdBase: './',
-      amdLanguageBase: './i18n/',
-      closeOnSelect: true,
-      debug: false,
-      dropdownAutoWidth: false,
-      escapeMarkup: Utils.escapeMarkup,
-      language: EnglishTranslation,
-      matcher: matcher,
-      minimumInputLength: 0,
-      maximumInputLength: 0,
-      maximumSelectionLength: 0,
-      minimumResultsForSearch: 0,
-      selectOnClose: false,
-      sorter: function (data) {
-        return data;
-      },
-      templateResult: function (result) {
-        return result.text;
-      },
-      templateSelection: function (selection) {
-        return selection.text;
-      },
-      theme: 'default',
-      width: 'resolve'
-    };
-  };
-
-  Defaults.prototype.set = function (key, value) {
-    var camelKey = $.camelCase(key);
-
-    var data = {};
-    data[camelKey] = value;
-
-    var convertedData = Utils._convertData(data);
-
-    $.extend(true, this.defaults, convertedData);
-  };
-
-  var defaults = new Defaults();
-
-  return defaults;
-});
-
-S2.define('select2/options',[
-  'require',
-  'jquery',
-  './defaults',
-  './utils'
-], function (require, $, Defaults, Utils) {
-  function Options (options, $element) {
-    this.options = options;
-
-    if ($element != null) {
-      this.fromElement($element);
-    }
-
-    this.options = Defaults.apply(this.options);
-
-    if ($element && $element.is('input')) {
-      var InputCompat = require(this.get('amdBase') + 'compat/inputData');
-
-      this.options.dataAdapter = Utils.Decorate(
-        this.options.dataAdapter,
-        InputCompat
-      );
-    }
-  }
-
-  Options.prototype.fromElement = function ($e) {
-    var excludedData = ['select2'];
-
-    if (this.options.multiple == null) {
-      this.options.multiple = $e.prop('multiple');
-    }
-
-    if (this.options.disabled == null) {
-      this.options.disabled = $e.prop('disabled');
-    }
-
-    if (this.options.language == null) {
-      if ($e.prop('lang')) {
-        this.options.language = $e.prop('lang').toLowerCase();
-      } else if ($e.closest('[lang]').prop('lang')) {
-        this.options.language = $e.closest('[lang]').prop('lang');
-      }
-    }
-
-    if (this.options.dir == null) {
-      if ($e.prop('dir')) {
-        this.options.dir = $e.prop('dir');
-      } else if ($e.closest('[dir]').prop('dir')) {
-        this.options.dir = $e.closest('[dir]').prop('dir');
-      } else {
-        this.options.dir = 'ltr';
-      }
-    }
-
-    $e.prop('disabled', this.options.disabled);
-    $e.prop('multiple', this.options.multiple);
-
-    if (Utils.GetData($e[0], 'select2Tags')) {
-      if (this.options.debug && window.console && console.warn) {
-        console.warn(
-          'Select2: The `data-select2-tags` attribute has been changed to ' +
-          'use the `data-data` and `data-tags="true"` attributes and will be ' +
-          'removed in future versions of Select2.'
-        );
-      }
-
-      Utils.StoreData($e[0], 'data', Utils.GetData($e[0], 'select2Tags'));
-      Utils.StoreData($e[0], 'tags', true);
-    }
-
-    if (Utils.GetData($e[0], 'ajaxUrl')) {
-      if (this.options.debug && window.console && console.warn) {
-        console.warn(
-          'Select2: The `data-ajax-url` attribute has been changed to ' +
-          '`data-ajax--url` and support for the old attribute will be removed' +
-          ' in future versions of Select2.'
-        );
-      }
-
-      $e.attr('ajax--url', Utils.GetData($e[0], 'ajaxUrl'));
-      Utils.StoreData($e[0], 'ajax-Url', Utils.GetData($e[0], 'ajaxUrl'));
-	  
-    }
-
-    var dataset = {};
-
-    // Prefer the element's `dataset` attribute if it exists
-    // jQuery 1.x does not correctly handle data attributes with multiple dashes
-    if ($.fn.jquery && $.fn.jquery.substr(0, 2) == '1.' && $e[0].dataset) {
-      dataset = $.extend(true, {}, $e[0].dataset, Utils.GetData($e[0]));
-    } else {
-      dataset = Utils.GetData($e[0]);
-    }
-
-    var data = $.extend(true, {}, dataset);
-
-    data = Utils._convertData(data);
-
-    for (var key in data) {
-      if ($.inArray(key, excludedData) > -1) {
-        continue;
-      }
-
-      if ($.isPlainObject(this.options[key])) {
-        $.extend(this.options[key], data[key]);
-      } else {
-        this.options[key] = data[key];
-      }
-    }
-
-    return this;
-  };
-
-  Options.prototype.get = function (key) {
-    return this.options[key];
-  };
-
-  Options.prototype.set = function (key, val) {
-    this.options[key] = val;
-  };
-
-  return Options;
-});
-
-S2.define('select2/core',[
-  'jquery',
-  './options',
-  './utils',
-  './keys'
-], function ($, Options, Utils, KEYS) {
-  var Select2 = function ($element, options) {
-    if (Utils.GetData($element[0], 'select2') != null) {
-      Utils.GetData($element[0], 'select2').destroy();
-    }
-
-    this.$element = $element;
-
-    this.id = this._generateId($element);
-
-    options = options || {};
-
-    this.options = new Options(options, $element);
-
-    Select2.__super__.constructor.call(this);
-
-    // Set up the tabindex
-
-    var tabindex = $element.attr('tabindex') || 0;
-    Utils.StoreData($element[0], 'old-tabindex', tabindex);
-    $element.attr('tabindex', '-1');
-
-    // Set up containers and adapters
-
-    var DataAdapter = this.options.get('dataAdapter');
-    this.dataAdapter = new DataAdapter($element, this.options);
-
-    var $container = this.render();
-
-    this._placeContainer($container);
-
-    var SelectionAdapter = this.options.get('selectionAdapter');
-    this.selection = new SelectionAdapter($element, this.options);
-    this.$selection = this.selection.render();
-
-    this.selection.position(this.$selection, $container);
-
-    var DropdownAdapter = this.options.get('dropdownAdapter');
-    this.dropdown = new DropdownAdapter($element, this.options);
-    this.$dropdown = this.dropdown.render();
-
-    this.dropdown.position(this.$dropdown, $container);
-
-    var ResultsAdapter = this.options.get('resultsAdapter');
-    this.results = new ResultsAdapter($element, this.options, this.dataAdapter);
-    this.$results = this.results.render();
-
-    this.results.position(this.$results, this.$dropdown);
-
-    // Bind events
-
-    var self = this;
-
-    // Bind the container to all of the adapters
-    this._bindAdapters();
-
-    // Register any DOM event handlers
-    this._registerDomEvents();
-
-    // Register any internal event handlers
-    this._registerDataEvents();
-    this._registerSelectionEvents();
-    this._registerDropdownEvents();
-    this._registerResultsEvents();
-    this._registerEvents();
-
-    // Set the initial state
-    this.dataAdapter.current(function (initialData) {
-      self.trigger('selection:update', {
-        data: initialData
-      });
-    });
-
-    // Hide the original select
-    $element.addClass('select2-hidden-accessible');
-    $element.attr('aria-hidden', 'true');
-
-    // Synchronize any monitored attributes
-    this._syncAttributes();
-
-    Utils.StoreData($element[0], 'select2', this);
-
-    // Ensure backwards compatibility with $element.data('select2').
-    $element.data('select2', this);
-  };
-
-  Utils.Extend(Select2, Utils.Observable);
-
-  Select2.prototype._generateId = function ($element) {
-    var id = '';
-
-    if ($element.attr('id') != null) {
-      id = $element.attr('id');
-    } else if ($element.attr('name') != null) {
-      id = $element.attr('name') + '-' + Utils.generateChars(2);
-    } else {
-      id = Utils.generateChars(4);
-    }
-
-    id = id.replace(/(:|\.|\[|\]|,)/g, '');
-    id = 'select2-' + id;
-
-    return id;
-  };
-
-  Select2.prototype._placeContainer = function ($container) {
-    $container.insertAfter(this.$element);
-
-    var width = this._resolveWidth(this.$element, this.options.get('width'));
-
-    if (width != null) {
-      $container.css('width', width);
-    }
-  };
-
-  Select2.prototype._resolveWidth = function ($element, method) {
-    var WIDTH = /^width:(([-+]?([0-9]*\.)?[0-9]+)(px|em|ex|%|in|cm|mm|pt|pc))/i;
-
-    if (method == 'resolve') {
-      var styleWidth = this._resolveWidth($element, 'style');
-
-      if (styleWidth != null) {
-        return styleWidth;
-      }
-
-      return this._resolveWidth($element, 'element');
-    }
-
-    if (method == 'element') {
-      var elementWidth = $element.outerWidth(false);
-
-      if (elementWidth <= 0) {
-        return 'auto';
-      }
-
-      return elementWidth + 'px';
-    }
-
-    if (method == 'style') {
-      var style = $element.attr('style');
-
-      if (typeof(style) !== 'string') {
-        return null;
-      }
-
-      var attrs = style.split(';');
-
-      for (var i = 0, l = attrs.length; i < l; i = i + 1) {
-        var attr = attrs[i].replace(/\s/g, '');
-        var matches = attr.match(WIDTH);
-
-        if (matches !== null && matches.length >= 1) {
-          return matches[1];
-        }
-      }
-
-      return null;
-    }
-
-    return method;
-  };
-
-  Select2.prototype._bindAdapters = function () {
-    this.dataAdapter.bind(this, this.$container);
-    this.selection.bind(this, this.$container);
-
-    this.dropdown.bind(this, this.$container);
-    this.results.bind(this, this.$container);
-  };
-
-  Select2.prototype._registerDomEvents = function () {
-    var self = this;
-
-    this.$element.on('change.select2', function () {
-      self.dataAdapter.current(function (data) {
-        self.trigger('selection:update', {
-          data: data
-        });
-      });
-    });
-
-    this.$element.on('focus.select2', function (evt) {
-      self.trigger('focus', evt);
-    });
-
-    this._syncA = Utils.bind(this._syncAttributes, this);
-    this._syncS = Utils.bind(this._syncSubtree, this);
-
-    if (this.$element[0].attachEvent) {
-      this.$element[0].attachEvent('onpropertychange', this._syncA);
-    }
-
-    var observer = window.MutationObserver ||
-      window.WebKitMutationObserver ||
-      window.MozMutationObserver
-    ;
-
-    if (observer != null) {
-      this._observer = new observer(function (mutations) {
-        $.each(mutations, self._syncA);
-        $.each(mutations, self._syncS);
-      });
-      this._observer.observe(this.$element[0], {
-        attributes: true,
-        childList: true,
-        subtree: false
-      });
-    } else if (this.$element[0].addEventListener) {
-      this.$element[0].addEventListener(
-        'DOMAttrModified',
-        self._syncA,
-        false
-      );
-      this.$element[0].addEventListener(
-        'DOMNodeInserted',
-        self._syncS,
-        false
-      );
-      this.$element[0].addEventListener(
-        'DOMNodeRemoved',
-        self._syncS,
-        false
-      );
-    }
-  };
-
-  Select2.prototype._registerDataEvents = function () {
-    var self = this;
-
-    this.dataAdapter.on('*', function (name, params) {
-      self.trigger(name, params);
-    });
-  };
-
-  Select2.prototype._registerSelectionEvents = function () {
-    var self = this;
-    var nonRelayEvents = ['toggle', 'focus'];
-
-    this.selection.on('toggle', function () {
-      self.toggleDropdown();
-    });
-
-    this.selection.on('focus', function (params) {
-      self.focus(params);
-    });
-
-    this.selection.on('*', function (name, params) {
-      if ($.inArray(name, nonRelayEvents) !== -1) {
-        return;
-      }
-
-      self.trigger(name, params);
-    });
-  };
-
-  Select2.prototype._registerDropdownEvents = function () {
-    var self = this;
-
-    this.dropdown.on('*', function (name, params) {
-      self.trigger(name, params);
-    });
-  };
-
-  Select2.prototype._registerResultsEvents = function () {
-    var self = this;
-
-    this.results.on('*', function (name, params) {
-      self.trigger(name, params);
-    });
-  };
-
-  Select2.prototype._registerEvents = function () {
-    var self = this;
-
-    this.on('open', function () {
-      self.$container.addClass('select2-container--open');
-    });
-
-    this.on('close', function () {
-      self.$container.removeClass('select2-container--open');
-    });
-
-    this.on('enable', function () {
-      self.$container.removeClass('select2-container--disabled');
-    });
-
-    this.on('disable', function () {
-      self.$container.addClass('select2-container--disabled');
-    });
-
-    this.on('blur', function () {
-      self.$container.removeClass('select2-container--focus');
-    });
-
-    this.on('query', function (params) {
-      if (!self.isOpen()) {
-        self.trigger('open', {});
-      }
-
-      this.dataAdapter.query(params, function (data) {
-        self.trigger('results:all', {
-          data: data,
-          query: params
-        });
-      });
-    });
-
-    this.on('query:append', function (params) {
-      this.dataAdapter.query(params, function (data) {
-        self.trigger('results:append', {
-          data: data,
-          query: params
-        });
-      });
-    });
-
-    this.on('keypress', function (evt) {
-      var key = evt.which;
-
-      if (self.isOpen()) {
-        if (key === KEYS.ESC || key === KEYS.TAB ||
-            (key === KEYS.UP && evt.altKey)) {
-          self.close();
-
-          evt.preventDefault();
-        } else if (key === KEYS.ENTER) {
-          self.trigger('results:select', {});
-
-          evt.preventDefault();
-        } else if ((key === KEYS.SPACE && evt.ctrlKey)) {
-          self.trigger('results:toggle', {});
-
-          evt.preventDefault();
-        } else if (key === KEYS.UP) {
-          self.trigger('results:previous', {});
-
-          evt.preventDefault();
-        } else if (key === KEYS.DOWN) {
-          self.trigger('results:next', {});
-
-          evt.preventDefault();
-        }
-      } else {
-        if (key === KEYS.ENTER || key === KEYS.SPACE ||
-            (key === KEYS.DOWN && evt.altKey)) {
-          self.open();
-
-          evt.preventDefault();
-        }
-      }
-    });
-  };
-
-  Select2.prototype._syncAttributes = function () {
-    this.options.set('disabled', this.$element.prop('disabled'));
-
-    if (this.options.get('disabled')) {
-      if (this.isOpen()) {
-        this.close();
-      }
-
-      this.trigger('disable', {});
-    } else {
-      this.trigger('enable', {});
-    }
-  };
-
-  Select2.prototype._syncSubtree = function (evt, mutations) {
-    var changed = false;
-    var self = this;
-
-    // Ignore any mutation events raised for elements that aren't options or
-    // optgroups. This handles the case when the select element is destroyed
-    if (
-      evt && evt.target && (
-        evt.target.nodeName !== 'OPTION' && evt.target.nodeName !== 'OPTGROUP'
-      )
-    ) {
-      return;
-    }
-
-    if (!mutations) {
-      // If mutation events aren't supported, then we can only assume that the
-      // change affected the selections
-      changed = true;
-    } else if (mutations.addedNodes && mutations.addedNodes.length > 0) {
-      for (var n = 0; n < mutations.addedNodes.length; n++) {
-        var node = mutations.addedNodes[n];
-
-        if (node.selected) {
-          changed = true;
-        }
-      }
-    } else if (mutations.removedNodes && mutations.removedNodes.length > 0) {
-      changed = true;
-    }
-
-    // Only re-pull the data if we think there is a change
-    if (changed) {
-      this.dataAdapter.current(function (currentData) {
-        self.trigger('selection:update', {
-          data: currentData
-        });
-      });
-    }
-  };
-
-  /**
-   * Override the trigger method to automatically trigger pre-events when
-   * there are events that can be prevented.
-   */
-  Select2.prototype.trigger = function (name, args) {
-    var actualTrigger = Select2.__super__.trigger;
-    var preTriggerMap = {
-      'open': 'opening',
-      'close': 'closing',
-      'select': 'selecting',
-      'unselect': 'unselecting',
-      'clear': 'clearing'
-    };
-
-    if (args === undefined) {
-      args = {};
-    }
-
-    if (name in preTriggerMap) {
-      var preTriggerName = preTriggerMap[name];
-      var preTriggerArgs = {
-        prevented: false,
-        name: name,
-        args: args
-      };
-
-      actualTrigger.call(this, preTriggerName, preTriggerArgs);
-
-      if (preTriggerArgs.prevented) {
-        args.prevented = true;
-
-        return;
-      }
-    }
-
-    actualTrigger.call(this, name, args);
-  };
-
-  Select2.prototype.toggleDropdown = function () {
-    if (this.options.get('disabled')) {
-      return;
-    }
-
-    if (this.isOpen()) {
-      this.close();
-    } else {
-      this.open();
-    }
-  };
-
-  Select2.prototype.open = function () {
-    if (this.isOpen()) {
-      return;
-    }
-
-    this.trigger('query', {});
-  };
-
-  Select2.prototype.close = function () {
-    if (!this.isOpen()) {
-      return;
-    }
-
-    this.trigger('close', {});
-  };
-
-  Select2.prototype.isOpen = function () {
-    return this.$container.hasClass('select2-container--open');
-  };
-
-  Select2.prototype.hasFocus = function () {
-    return this.$container.hasClass('select2-container--focus');
-  };
-
-  Select2.prototype.focus = function (data) {
-    // No need to re-trigger focus events if we are already focused
-    if (this.hasFocus()) {
-      return;
-    }
-
-    this.$container.addClass('select2-container--focus');
-    this.trigger('focus', {});
-  };
-
-  Select2.prototype.enable = function (args) {
-    if (this.options.get('debug') && window.console && console.warn) {
-      console.warn(
-        'Select2: The `select2("enable")` method has been deprecated and will' +
-        ' be removed in later Select2 versions. Use $element.prop("disabled")' +
-        ' instead.'
-      );
-    }
-
-    if (args == null || args.length === 0) {
-      args = [true];
-    }
-
-    var disabled = !args[0];
-
-    this.$element.prop('disabled', disabled);
-  };
-
-  Select2.prototype.data = function () {
-    if (this.options.get('debug') &&
-        arguments.length > 0 && window.console && console.warn) {
-      console.warn(
-        'Select2: Data can no longer be set using `select2("data")`. You ' +
-        'should consider setting the value instead using `$element.val()`.'
-      );
-    }
-
-    var data = [];
-
-    this.dataAdapter.current(function (currentData) {
-      data = currentData;
-    });
-
-    return data;
-  };
-
-  Select2.prototype.val = function (args) {
-    if (this.options.get('debug') && window.console && console.warn) {
-      console.warn(
-        'Select2: The `select2("val")` method has been deprecated and will be' +
-        ' removed in later Select2 versions. Use $element.val() instead.'
-      );
-    }
-
-    if (args == null || args.length === 0) {
-      return this.$element.val();
-    }
-
-    var newVal = args[0];
-
-    if ($.isArray(newVal)) {
-      newVal = $.map(newVal, function (obj) {
-        return obj.toString();
-      });
-    }
-
-    this.$element.val(newVal).trigger('change');
-  };
-
-  Select2.prototype.destroy = function () {
-    this.$container.remove();
-
-    if (this.$element[0].detachEvent) {
-      this.$element[0].detachEvent('onpropertychange', this._syncA);
-    }
-
-    if (this._observer != null) {
-      this._observer.disconnect();
-      this._observer = null;
-    } else if (this.$element[0].removeEventListener) {
-      this.$element[0]
-        .removeEventListener('DOMAttrModified', this._syncA, false);
-      this.$element[0]
-        .removeEventListener('DOMNodeInserted', this._syncS, false);
-      this.$element[0]
-        .removeEventListener('DOMNodeRemoved', this._syncS, false);
-    }
-
-    this._syncA = null;
-    this._syncS = null;
-
-    this.$element.off('.select2');
-    this.$element.attr('tabindex',
-    Utils.GetData(this.$element[0], 'old-tabindex'));
-
-    this.$element.removeClass('select2-hidden-accessible');
-    this.$element.attr('aria-hidden', 'false');
-    Utils.RemoveData(this.$element[0]);
-    this.$element.removeData('select2');
-
-    this.dataAdapter.destroy();
-    this.selection.destroy();
-    this.dropdown.destroy();
-    this.results.destroy();
-
-    this.dataAdapter = null;
-    this.selection = null;
-    this.dropdown = null;
-    this.results = null;
-  };
-
-  Select2.prototype.render = function () {
-    var $container = $(
-      '<span class="select2 select2-container">' +
-        '<span class="selection"></span>' +
-        '<span class="dropdown-wrapper" aria-hidden="true"></span>' +
-      '</span>'
-    );
-
-    $container.attr('dir', this.options.get('dir'));
-
-    this.$container = $container;
-
-    this.$container.addClass('select2-container--' + this.options.get('theme'));
-
-    Utils.StoreData($container[0], 'element', this.$element);
-
-    return $container;
-  };
-
-  return Select2;
-});
-
-S2.define('jquery-mousewheel',[
-  'jquery'
-], function ($) {
-  // Used to shim jQuery.mousewheel for non-full builds.
-  return $;
-});
-
-S2.define('jquery.select2',[
-  'jquery',
-  'jquery-mousewheel',
-
-  './select2/core',
-  './select2/defaults',
-  './select2/utils'
-], function ($, _, Select2, Defaults, Utils) {
-  if ($.fn.select2 == null) {
-    // All methods that should return the element
-    var thisMethods = ['open', 'close', 'destroy'];
-
-    $.fn.select2 = function (options) {
-      options = options || {};
-
-      if (typeof options === 'object') {
-        this.each(function () {
-          var instanceOptions = $.extend(true, {}, options);
-
-          var instance = new Select2($(this), instanceOptions);
-        });
-
-        return this;
-      } else if (typeof options === 'string') {
-        var ret;
-        var args = Array.prototype.slice.call(arguments, 1);
-
-        this.each(function () {
-          var instance = Utils.GetData(this, 'select2');
-
-          if (instance == null && window.console && console.error) {
-            console.error(
-              'The select2(\'' + options + '\') method was called on an ' +
-              'element that is not using Select2.'
-            );
-          }
-
-          ret = instance[options].apply(instance, args);
-        });
-
-        // Check if we should be returning `this`
-        if ($.inArray(options, thisMethods) > -1) {
-          return this;
-        }
-
-        return ret;
-      } else {
-        throw new Error('Invalid arguments for Select2: ' + options);
-      }
-    };
-  }
-
-  if ($.fn.select2.defaults == null) {
-    $.fn.select2.defaults = Defaults;
-  }
-
-  return Select2;
-});
-
-  // Return the AMD loader configuration so it can be used outside of this file
-  return {
-    define: S2.define,
-    require: S2.require
-  };
-}());
-
-  // Autoload the jQuery bindings
-  // We know that all of the modules exist above this, so we're safe
-  var select2 = S2.require('jquery.select2');
-
-  // Hold the AMD module references on the jQuery function that was just loaded
-  // This allows Select2 to use the internal loader outside of this file, such
-  // as in the language files.
-  jQuery.fn.select2.amd = S2;
-
-  // Return the Select2 instance for anyone who is importing it.
-  return select2;
-}));
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/FancySelects/select2-4.0.6-rc.1-dist/js/select2.min.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/FancySelects/select2-4.0.6-rc.1-dist/js/select2.min.js
deleted file mode 100644
index e505290..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/FancySelects/select2-4.0.6-rc.1-dist/js/select2.min.js
+++ /dev/null
@@ -1 +0,0 @@
-/*! Select2 4.0.6-rc.1 | https://github.com/select2/select2/blob/master/LICENSE.md */!function(a){"function"==typeof define&&define.amd?define(["jquery"],a):"object"==typeof module&&module.exports?module.exports=function(b,c){return void 0===c&&(c="undefined"!=typeof window?require("jquery"):require("jquery")(b)),a(c),c}:a(jQuery)}(function(a){var b=function(){if(a&&a.fn&&a.fn.select2&&a.fn.select2.amd)var b=a.fn.select2.amd;var b;return function(){if(!b||!b.requirejs){b?c=b:b={};var a,c,d;!function(b){function e(a,b){return v.call(a,b)}function f(a,b){var c,d,e,f,g,h,i,j,k,l,m,n,o=b&&b.split("/"),p=t.map,q=p&&p["*"]||{};if(a){for(a=a.split("/"),g=a.length-1,t.nodeIdCompat&&x.test(a[g])&&(a[g]=a[g].replace(x,"")),"."===a[0].charAt(0)&&o&&(n=o.slice(0,o.length-1),a=n.concat(a)),k=0;k<a.length;k++)if("."===(m=a[k]))a.splice(k,1),k-=1;else if(".."===m){if(0===k||1===k&&".."===a[2]||".."===a[k-1])continue;k>0&&(a.splice(k-1,2),k-=2)}a=a.join("/")}if((o||q)&&p){for(c=a.split("/"),k=c.length;k>0;k-=1){if(d=c.slice(0,k).join("/"),o)for(l=o.length;l>0;l-=1)if((e=p[o.slice(0,l).join("/")])&&(e=e[d])){f=e,h=k;break}if(f)break;!i&&q&&q[d]&&(i=q[d],j=k)}!f&&i&&(f=i,h=j),f&&(c.splice(0,h,f),a=c.join("/"))}return a}function g(a,c){return function(){var d=w.call(arguments,0);return"string"!=typeof d[0]&&1===d.length&&d.push(null),o.apply(b,d.concat([a,c]))}}function h(a){return function(b){return f(b,a)}}function i(a){return function(b){r[a]=b}}function j(a){if(e(s,a)){var c=s[a];delete s[a],u[a]=!0,n.apply(b,c)}if(!e(r,a)&&!e(u,a))throw new Error("No "+a);return r[a]}function k(a){var b,c=a?a.indexOf("!"):-1;return c>-1&&(b=a.substring(0,c),a=a.substring(c+1,a.length)),[b,a]}function l(a){return a?k(a):[]}function m(a){return function(){return t&&t.config&&t.config[a]||{}}}var n,o,p,q,r={},s={},t={},u={},v=Object.prototype.hasOwnProperty,w=[].slice,x=/\.js$/;p=function(a,b){var c,d=k(a),e=d[0],g=b[1];return a=d[1],e&&(e=f(e,g),c=j(e)),e?a=c&&c.normalize?c.normalize(a,h(g)):f(a,g):(a=f(a,g),d=k(a),e=d[0],a=d[1],e&&(c=j(e))),{f:e?e+"!"+a:a,n:a,pr:e,p:c}},q={require:function(a){return g(a)},exports:function(a){var b=r[a];return void 0!==b?b:r[a]={}},module:function(a){return{id:a,uri:"",exports:r[a],config:m(a)}}},n=function(a,c,d,f){var h,k,m,n,o,t,v,w=[],x=typeof d;if(f=f||a,t=l(f),"undefined"===x||"function"===x){for(c=!c.length&&d.length?["require","exports","module"]:c,o=0;o<c.length;o+=1)if(n=p(c[o],t),"require"===(k=n.f))w[o]=q.require(a);else if("exports"===k)w[o]=q.exports(a),v=!0;else if("module"===k)h=w[o]=q.module(a);else if(e(r,k)||e(s,k)||e(u,k))w[o]=j(k);else{if(!n.p)throw new Error(a+" missing "+k);n.p.load(n.n,g(f,!0),i(k),{}),w[o]=r[k]}m=d?d.apply(r[a],w):void 0,a&&(h&&h.exports!==b&&h.exports!==r[a]?r[a]=h.exports:m===b&&v||(r[a]=m))}else a&&(r[a]=d)},a=c=o=function(a,c,d,e,f){if("string"==typeof a)return q[a]?q[a](c):j(p(a,l(c)).f);if(!a.splice){if(t=a,t.deps&&o(t.deps,t.callback),!c)return;c.splice?(a=c,c=d,d=null):a=b}return c=c||function(){},"function"==typeof d&&(d=e,e=f),e?n(b,a,c,d):setTimeout(function(){n(b,a,c,d)},4),o},o.config=function(a){return o(a)},a._defined=r,d=function(a,b,c){if("string"!=typeof a)throw new Error("See almond README: incorrect module build, no module name");b.splice||(c=b,b=[]),e(r,a)||e(s,a)||(s[a]=[a,b,c])},d.amd={jQuery:!0}}(),b.requirejs=a,b.require=c,b.define=d}}(),b.define("almond",function(){}),b.define("jquery",[],function(){var b=a||$;return null==b&&console&&console.error&&console.error("Select2: An instance of jQuery or a jQuery-compatible library was not found. Make sure that you are including jQuery before Select2 on your web page."),b}),b.define("select2/utils",["jquery"],function(a){function b(a){var b=a.prototype,c=[];for(var d in b){"function"==typeof b[d]&&("constructor"!==d&&c.push(d))}return c}var c={};c.Extend=function(a,b){function c(){this.constructor=a}var d={}.hasOwnProperty;for(var e in b)d.call(b,e)&&(a[e]=b[e]);return c.prototype=b.prototype,a.prototype=new c,a.__super__=b.prototype,a},c.Decorate=function(a,c){function d(){var b=Array.prototype.unshift,d=c.prototype.constructor.length,e=a.prototype.constructor;d>0&&(b.call(arguments,a.prototype.constructor),e=c.prototype.constructor),e.apply(this,arguments)}function e(){this.constructor=d}var f=b(c),g=b(a);c.displayName=a.displayName,d.prototype=new e;for(var h=0;h<g.length;h++){var i=g[h];d.prototype[i]=a.prototype[i]}for(var j=(function(a){var b=function(){};a in d.prototype&&(b=d.prototype[a]);var e=c.prototype[a];return function(){return Array.prototype.unshift.call(arguments,b),e.apply(this,arguments)}}),k=0;k<f.length;k++){var l=f[k];d.prototype[l]=j(l)}return d};var d=function(){this.listeners={}};d.prototype.on=function(a,b){this.listeners=this.listeners||{},a in this.listeners?this.listeners[a].push(b):this.listeners[a]=[b]},d.prototype.trigger=function(a){var b=Array.prototype.slice,c=b.call(arguments,1);this.listeners=this.listeners||{},null==c&&(c=[]),0===c.length&&c.push({}),c[0]._type=a,a in this.listeners&&this.invoke(this.listeners[a],b.call(arguments,1)),"*"in this.listeners&&this.invoke(this.listeners["*"],arguments)},d.prototype.invoke=function(a,b){for(var c=0,d=a.length;c<d;c++)a[c].apply(this,b)},c.Observable=d,c.generateChars=function(a){for(var b="",c=0;c<a;c++){b+=Math.floor(36*Math.random()).toString(36)}return b},c.bind=function(a,b){return function(){a.apply(b,arguments)}},c._convertData=function(a){for(var b in a){var c=b.split("-"),d=a;if(1!==c.length){for(var e=0;e<c.length;e++){var f=c[e];f=f.substring(0,1).toLowerCase()+f.substring(1),f in d||(d[f]={}),e==c.length-1&&(d[f]=a[b]),d=d[f]}delete a[b]}}return a},c.hasScroll=function(b,c){var d=a(c),e=c.style.overflowX,f=c.style.overflowY;return(e!==f||"hidden"!==f&&"visible"!==f)&&("scroll"===e||"scroll"===f||(d.innerHeight()<c.scrollHeight||d.innerWidth()<c.scrollWidth))},c.escapeMarkup=function(a){var b={"\\":"&#92;","&":"&amp;","<":"&lt;",">":"&gt;",'"':"&quot;","'":"&#39;","/":"&#47;"};return"string"!=typeof a?a:String(a).replace(/[&<>"'\/\\]/g,function(a){return b[a]})},c.appendMany=function(b,c){if("1.7"===a.fn.jquery.substr(0,3)){var d=a();a.map(c,function(a){d=d.add(a)}),c=d}b.append(c)},c.__cache={};var e=0;return c.GetUniqueElementId=function(a){var b=a.getAttribute("data-select2-id");return null==b&&(a.id?(b=a.id,a.setAttribute("data-select2-id",b)):(a.setAttribute("data-select2-id",++e),b=e.toString())),b},c.StoreData=function(a,b,d){var e=c.GetUniqueElementId(a);c.__cache[e]||(c.__cache[e]={}),c.__cache[e][b]=d},c.GetData=function(b,d){var e=c.GetUniqueElementId(b);return d?c.__cache[e]&&null!=c.__cache[e][d]?c.__cache[e][d]:a(b).data(d):c.__cache[e]},c.RemoveData=function(a){var b=c.GetUniqueElementId(a);null!=c.__cache[b]&&delete c.__cache[b]},c}),b.define("select2/results",["jquery","./utils"],function(a,b){function c(a,b,d){this.$element=a,this.data=d,this.options=b,c.__super__.constructor.call(this)}return b.Extend(c,b.Observable),c.prototype.render=function(){var b=a('<ul class="select2-results__options" role="tree"></ul>');return this.options.get("multiple")&&b.attr("aria-multiselectable","true"),this.$results=b,b},c.prototype.clear=function(){this.$results.empty()},c.prototype.displayMessage=function(b){var c=this.options.get("escapeMarkup");this.clear(),this.hideLoading();var d=a('<li role="treeitem" aria-live="assertive" class="select2-results__option"></li>'),e=this.options.get("translations").get(b.message);d.append(c(e(b.args))),d[0].className+=" select2-results__message",this.$results.append(d)},c.prototype.hideMessages=function(){this.$results.find(".select2-results__message").remove()},c.prototype.append=function(a){this.hideLoading();var b=[];if(null==a.results||0===a.results.length)return void(0===this.$results.children().length&&this.trigger("results:message",{message:"noResults"}));a.results=this.sort(a.results);for(var c=0;c<a.results.length;c++){var d=a.results[c],e=this.option(d);b.push(e)}this.$results.append(b)},c.prototype.position=function(a,b){b.find(".select2-results").append(a)},c.prototype.sort=function(a){return this.options.get("sorter")(a)},c.prototype.highlightFirstItem=function(){var a=this.$results.find(".select2-results__option[aria-selected]"),b=a.filter("[aria-selected=true]");b.length>0?b.first().trigger("mouseenter"):a.first().trigger("mouseenter"),this.ensureHighlightVisible()},c.prototype.setClasses=function(){var c=this;this.data.current(function(d){var e=a.map(d,function(a){return a.id.toString()});c.$results.find(".select2-results__option[aria-selected]").each(function(){var c=a(this),d=b.GetData(this,"data"),f=""+d.id;null!=d.element&&d.element.selected||null==d.element&&a.inArray(f,e)>-1?c.attr("aria-selected","true"):c.attr("aria-selected","false")})})},c.prototype.showLoading=function(a){this.hideLoading();var b=this.options.get("translations").get("searching"),c={disabled:!0,loading:!0,text:b(a)},d=this.option(c);d.className+=" loading-results",this.$results.prepend(d)},c.prototype.hideLoading=function(){this.$results.find(".loading-results").remove()},c.prototype.option=function(c){var d=document.createElement("li");d.className="select2-results__option";var e={role:"treeitem","aria-selected":"false"};c.disabled&&(delete e["aria-selected"],e["aria-disabled"]="true"),null==c.id&&delete e["aria-selected"],null!=c._resultId&&(d.id=c._resultId),c.title&&(d.title=c.title),c.children&&(e.role="group",e["aria-label"]=c.text,delete e["aria-selected"]);for(var f in e){var g=e[f];d.setAttribute(f,g)}if(c.children){var h=a(d),i=document.createElement("strong");i.className="select2-results__group";a(i);this.template(c,i);for(var j=[],k=0;k<c.children.length;k++){var l=c.children[k],m=this.option(l);j.push(m)}var n=a("<ul></ul>",{class:"select2-results__options select2-results__options--nested"});n.append(j),h.append(i),h.append(n)}else this.template(c,d);return b.StoreData(d,"data",c),d},c.prototype.bind=function(c,d){var e=this,f=c.id+"-results";this.$results.attr("id",f),c.on("results:all",function(a){e.clear(),e.append(a.data),c.isOpen()&&(e.setClasses(),e.highlightFirstItem())}),c.on("results:append",function(a){e.append(a.data),c.isOpen()&&e.setClasses()}),c.on("query",function(a){e.hideMessages(),e.showLoading(a)}),c.on("select",function(){c.isOpen()&&(e.setClasses(),e.highlightFirstItem())}),c.on("unselect",function(){c.isOpen()&&(e.setClasses(),e.highlightFirstItem())}),c.on("open",function(){e.$results.attr("aria-expanded","true"),e.$results.attr("aria-hidden","false"),e.setClasses(),e.ensureHighlightVisible()}),c.on("close",function(){e.$results.attr("aria-expanded","false"),e.$results.attr("aria-hidden","true"),e.$results.removeAttr("aria-activedescendant")}),c.on("results:toggle",function(){var a=e.getHighlightedResults();0!==a.length&&a.trigger("mouseup")}),c.on("results:select",function(){var a=e.getHighlightedResults();if(0!==a.length){var c=b.GetData(a[0],"data");"true"==a.attr("aria-selected")?e.trigger("close",{}):e.trigger("select",{data:c})}}),c.on("results:previous",function(){var a=e.getHighlightedResults(),b=e.$results.find("[aria-selected]"),c=b.index(a);if(!(c<=0)){var d=c-1;0===a.length&&(d=0);var f=b.eq(d);f.trigger("mouseenter");var g=e.$results.offset().top,h=f.offset().top,i=e.$results.scrollTop()+(h-g);0===d?e.$results.scrollTop(0):h-g<0&&e.$results.scrollTop(i)}}),c.on("results:next",function(){var a=e.getHighlightedResults(),b=e.$results.find("[aria-selected]"),c=b.index(a),d=c+1;if(!(d>=b.length)){var f=b.eq(d);f.trigger("mouseenter");var g=e.$results.offset().top+e.$results.outerHeight(!1),h=f.offset().top+f.outerHeight(!1),i=e.$results.scrollTop()+h-g;0===d?e.$results.scrollTop(0):h>g&&e.$results.scrollTop(i)}}),c.on("results:focus",function(a){a.element.addClass("select2-results__option--highlighted")}),c.on("results:message",function(a){e.displayMessage(a)}),a.fn.mousewheel&&this.$results.on("mousewheel",function(a){var b=e.$results.scrollTop(),c=e.$results.get(0).scrollHeight-b+a.deltaY,d=a.deltaY>0&&b-a.deltaY<=0,f=a.deltaY<0&&c<=e.$results.height();d?(e.$results.scrollTop(0),a.preventDefault(),a.stopPropagation()):f&&(e.$results.scrollTop(e.$results.get(0).scrollHeight-e.$results.height()),a.preventDefault(),a.stopPropagation())}),this.$results.on("mouseup",".select2-results__option[aria-selected]",function(c){var d=a(this),f=b.GetData(this,"data");if("true"===d.attr("aria-selected"))return void(e.options.get("multiple")?e.trigger("unselect",{originalEvent:c,data:f}):e.trigger("close",{}));e.trigger("select",{originalEvent:c,data:f})}),this.$results.on("mouseenter",".select2-results__option[aria-selected]",function(c){var d=b.GetData(this,"data");e.getHighlightedResults().removeClass("select2-results__option--highlighted"),e.trigger("results:focus",{data:d,element:a(this)})})},c.prototype.getHighlightedResults=function(){return this.$results.find(".select2-results__option--highlighted")},c.prototype.destroy=function(){this.$results.remove()},c.prototype.ensureHighlightVisible=function(){var a=this.getHighlightedResults();if(0!==a.length){var b=this.$results.find("[aria-selected]"),c=b.index(a),d=this.$results.offset().top,e=a.offset().top,f=this.$results.scrollTop()+(e-d),g=e-d;f-=2*a.outerHeight(!1),c<=2?this.$results.scrollTop(0):(g>this.$results.outerHeight()||g<0)&&this.$results.scrollTop(f)}},c.prototype.template=function(b,c){var d=this.options.get("templateResult"),e=this.options.get("escapeMarkup"),f=d(b,c);null==f?c.style.display="none":"string"==typeof f?c.innerHTML=e(f):a(c).append(f)},c}),b.define("select2/keys",[],function(){return{BACKSPACE:8,TAB:9,ENTER:13,SHIFT:16,CTRL:17,ALT:18,ESC:27,SPACE:32,PAGE_UP:33,PAGE_DOWN:34,END:35,HOME:36,LEFT:37,UP:38,RIGHT:39,DOWN:40,DELETE:46}}),b.define("select2/selection/base",["jquery","../utils","../keys"],function(a,b,c){function d(a,b){this.$element=a,this.options=b,d.__super__.constructor.call(this)}return b.Extend(d,b.Observable),d.prototype.render=function(){var c=a('<span class="select2-selection" role="combobox"  aria-haspopup="true" aria-expanded="false"></span>');return this._tabindex=0,null!=b.GetData(this.$element[0],"old-tabindex")?this._tabindex=b.GetData(this.$element[0],"old-tabindex"):null!=this.$element.attr("tabindex")&&(this._tabindex=this.$element.attr("tabindex")),c.attr("title",this.$element.attr("title")),c.attr("tabindex",this._tabindex),this.$selection=c,c},d.prototype.bind=function(a,b){var d=this,e=(a.id,a.id+"-results");this.container=a,this.$selection.on("focus",function(a){d.trigger("focus",a)}),this.$selection.on("blur",function(a){d._handleBlur(a)}),this.$selection.on("keydown",function(a){d.trigger("keypress",a),a.which===c.SPACE&&a.preventDefault()}),a.on("results:focus",function(a){d.$selection.attr("aria-activedescendant",a.data._resultId)}),a.on("selection:update",function(a){d.update(a.data)}),a.on("open",function(){d.$selection.attr("aria-expanded","true"),d.$selection.attr("aria-owns",e),d._attachCloseHandler(a)}),a.on("close",function(){d.$selection.attr("aria-expanded","false"),d.$selection.removeAttr("aria-activedescendant"),d.$selection.removeAttr("aria-owns"),d.$selection.focus(),window.setTimeout(function(){d.$selection.focus()},0),d._detachCloseHandler(a)}),a.on("enable",function(){d.$selection.attr("tabindex",d._tabindex)}),a.on("disable",function(){d.$selection.attr("tabindex","-1")})},d.prototype._handleBlur=function(b){var c=this;window.setTimeout(function(){document.activeElement==c.$selection[0]||a.contains(c.$selection[0],document.activeElement)||c.trigger("blur",b)},1)},d.prototype._attachCloseHandler=function(c){a(document.body).on("mousedown.select2."+c.id,function(c){var d=a(c.target),e=d.closest(".select2");a(".select2.select2-container--open").each(function(){a(this),this!=e[0]&&b.GetData(this,"element").select2("close")})})},d.prototype._detachCloseHandler=function(b){a(document.body).off("mousedown.select2."+b.id)},d.prototype.position=function(a,b){b.find(".selection").append(a)},d.prototype.destroy=function(){this._detachCloseHandler(this.container)},d.prototype.update=function(a){throw new Error("The `update` method must be defined in child classes.")},d}),b.define("select2/selection/single",["jquery","./base","../utils","../keys"],function(a,b,c,d){function e(){e.__super__.constructor.apply(this,arguments)}return c.Extend(e,b),e.prototype.render=function(){var a=e.__super__.render.call(this);return a.addClass("select2-selection--single"),a.html('<span class="select2-selection__rendered"></span><span class="select2-selection__arrow" role="presentation"><b role="presentation"></b></span>'),a},e.prototype.bind=function(a,b){var c=this;e.__super__.bind.apply(this,arguments);var d=a.id+"-container";this.$selection.find(".select2-selection__rendered").attr("id",d).attr("role","textbox").attr("aria-readonly","true"),this.$selection.attr("aria-labelledby",d),this.$selection.on("mousedown",function(a){1===a.which&&c.trigger("toggle",{originalEvent:a})}),this.$selection.on("focus",function(a){}),this.$selection.on("blur",function(a){}),a.on("focus",function(b){a.isOpen()||c.$selection.focus()})},e.prototype.clear=function(){var a=this.$selection.find(".select2-selection__rendered");a.empty(),a.removeAttr("title")},e.prototype.display=function(a,b){var c=this.options.get("templateSelection");return this.options.get("escapeMarkup")(c(a,b))},e.prototype.selectionContainer=function(){return a("<span></span>")},e.prototype.update=function(a){if(0===a.length)return void this.clear();var b=a[0],c=this.$selection.find(".select2-selection__rendered"),d=this.display(b,c);c.empty().append(d),c.attr("title",b.title||b.text)},e}),b.define("select2/selection/multiple",["jquery","./base","../utils"],function(a,b,c){function d(a,b){d.__super__.constructor.apply(this,arguments)}return c.Extend(d,b),d.prototype.render=function(){var a=d.__super__.render.call(this);return a.addClass("select2-selection--multiple"),a.html('<ul class="select2-selection__rendered"></ul>'),a},d.prototype.bind=function(b,e){var f=this;d.__super__.bind.apply(this,arguments),this.$selection.on("click",function(a){f.trigger("toggle",{originalEvent:a})}),this.$selection.on("click",".select2-selection__choice__remove",function(b){if(!f.options.get("disabled")){var d=a(this),e=d.parent(),g=c.GetData(e[0],"data");f.trigger("unselect",{originalEvent:b,data:g})}})},d.prototype.clear=function(){var a=this.$selection.find(".select2-selection__rendered");a.empty(),a.removeAttr("title")},d.prototype.display=function(a,b){var c=this.options.get("templateSelection");return this.options.get("escapeMarkup")(c(a,b))},d.prototype.selectionContainer=function(){return a('<li class="select2-selection__choice"><span class="select2-selection__choice__remove" role="presentation">&times;</span></li>')},d.prototype.update=function(a){if(this.clear(),0!==a.length){for(var b=[],d=0;d<a.length;d++){var e=a[d],f=this.selectionContainer(),g=this.display(e,f);f.append(g),f.attr("title",e.title||e.text),c.StoreData(f[0],"data",e),b.push(f)}var h=this.$selection.find(".select2-selection__rendered");c.appendMany(h,b)}},d}),b.define("select2/selection/placeholder",["../utils"],function(a){function b(a,b,c){this.placeholder=this.normalizePlaceholder(c.get("placeholder")),a.call(this,b,c)}return b.prototype.normalizePlaceholder=function(a,b){return"string"==typeof b&&(b={id:"",text:b}),b},b.prototype.createPlaceholder=function(a,b){var c=this.selectionContainer();return c.html(this.display(b)),c.addClass("select2-selection__placeholder").removeClass("select2-selection__choice"),c},b.prototype.update=function(a,b){var c=1==b.length&&b[0].id!=this.placeholder.id;if(b.length>1||c)return a.call(this,b);this.clear();var d=this.createPlaceholder(this.placeholder);this.$selection.find(".select2-selection__rendered").append(d)},b}),b.define("select2/selection/allowClear",["jquery","../keys","../utils"],function(a,b,c){function d(){}return d.prototype.bind=function(a,b,c){var d=this;a.call(this,b,c),null==this.placeholder&&this.options.get("debug")&&window.console&&console.error&&console.error("Select2: The `allowClear` option should be used in combination with the `placeholder` option."),this.$selection.on("mousedown",".select2-selection__clear",function(a){d._handleClear(a)}),b.on("keypress",function(a){d._handleKeyboardClear(a,b)})},d.prototype._handleClear=function(a,b){if(!this.options.get("disabled")){var d=this.$selection.find(".select2-selection__clear");if(0!==d.length){b.stopPropagation();var e=c.GetData(d[0],"data"),f=this.$element.val();this.$element.val(this.placeholder.id);var g={data:e};if(this.trigger("clear",g),g.prevented)return void this.$element.val(f);for(var h=0;h<e.length;h++)if(g={data:e[h]},this.trigger("unselect",g),g.prevented)return void this.$element.val(f);this.$element.trigger("change"),this.trigger("toggle",{})}}},d.prototype._handleKeyboardClear=function(a,c,d){d.isOpen()||c.which!=b.DELETE&&c.which!=b.BACKSPACE||this._handleClear(c)},d.prototype.update=function(b,d){if(b.call(this,d),!(this.$selection.find(".select2-selection__placeholder").length>0||0===d.length)){var e=a('<span class="select2-selection__clear">&times;</span>');c.StoreData(e[0],"data",d),this.$selection.find(".select2-selection__rendered").prepend(e)}},d}),b.define("select2/selection/search",["jquery","../utils","../keys"],function(a,b,c){function d(a,b,c){a.call(this,b,c)}return d.prototype.render=function(b){var c=a('<li class="select2-search select2-search--inline"><input class="select2-search__field" type="search" tabindex="-1" autocomplete="off" autocorrect="off" autocapitalize="none" spellcheck="false" role="textbox" aria-autocomplete="list" /></li>');this.$searchContainer=c,this.$search=c.find("input");var d=b.call(this);return this._transferTabIndex(),d},d.prototype.bind=function(a,d,e){var f=this;a.call(this,d,e),d.on("open",function(){f.$search.trigger("focus")}),d.on("close",function(){f.$search.val(""),f.$search.removeAttr("aria-activedescendant"),f.$search.trigger("focus")}),d.on("enable",function(){f.$search.prop("disabled",!1),f._transferTabIndex()}),d.on("disable",function(){f.$search.prop("disabled",!0)}),d.on("focus",function(a){f.$search.trigger("focus")}),d.on("results:focus",function(a){f.$search.attr("aria-activedescendant",a.id)}),this.$selection.on("focusin",".select2-search--inline",function(a){f.trigger("focus",a)}),this.$selection.on("focusout",".select2-search--inline",function(a){f._handleBlur(a)}),this.$selection.on("keydown",".select2-search--inline",function(a){if(a.stopPropagation(),f.trigger("keypress",a),f._keyUpPrevented=a.isDefaultPrevented(),a.which===c.BACKSPACE&&""===f.$search.val()){var d=f.$searchContainer.prev(".select2-selection__choice");if(d.length>0){var e=b.GetData(d[0],"data");f.searchRemoveChoice(e),a.preventDefault()}}});var g=document.documentMode,h=g&&g<=11;this.$selection.on("input.searchcheck",".select2-search--inline",function(a){if(h)return void f.$selection.off("input.search input.searchcheck");f.$selection.off("keyup.search")}),this.$selection.on("keyup.search input.search",".select2-search--inline",function(a){if(h&&"input"===a.type)return void f.$selection.off("input.search input.searchcheck");var b=a.which;b!=c.SHIFT&&b!=c.CTRL&&b!=c.ALT&&b!=c.TAB&&f.handleSearch(a)})},d.prototype._transferTabIndex=function(a){this.$search.attr("tabindex",this.$selection.attr("tabindex")),this.$selection.attr("tabindex","-1")},d.prototype.createPlaceholder=function(a,b){this.$search.attr("placeholder",b.text)},d.prototype.update=function(a,b){var c=this.$search[0]==document.activeElement;if(this.$search.attr("placeholder",""),a.call(this,b),this.$selection.find(".select2-selection__rendered").append(this.$searchContainer),this.resizeSearch(),c){this.$element.find("[data-select2-tag]").length?this.$element.focus():this.$search.focus()}},d.prototype.handleSearch=function(){if(this.resizeSearch(),!this._keyUpPrevented){var a=this.$search.val();this.trigger("query",{term:a})}this._keyUpPrevented=!1},d.prototype.searchRemoveChoice=function(a,b){this.trigger("unselect",{data:b}),this.$search.val(b.text),this.handleSearch()},d.prototype.resizeSearch=function(){this.$search.css("width","25px");var a="";if(""!==this.$search.attr("placeholder"))a=this.$selection.find(".select2-selection__rendered").innerWidth();else{a=.75*(this.$search.val().length+1)+"em"}this.$search.css("width",a)},d}),b.define("select2/selection/eventRelay",["jquery"],function(a){function b(){}return b.prototype.bind=function(b,c,d){var e=this,f=["open","opening","close","closing","select","selecting","unselect","unselecting","clear","clearing"],g=["opening","closing","selecting","unselecting","clearing"];b.call(this,c,d),c.on("*",function(b,c){if(-1!==a.inArray(b,f)){c=c||{};var d=a.Event("select2:"+b,{params:c});e.$element.trigger(d),-1!==a.inArray(b,g)&&(c.prevented=d.isDefaultPrevented())}})},b}),b.define("select2/translation",["jquery","require"],function(a,b){function c(a){this.dict=a||{}}return c.prototype.all=function(){return this.dict},c.prototype.get=function(a){return this.dict[a]},c.prototype.extend=function(b){this.dict=a.extend({},b.all(),this.dict)},c._cache={},c.loadPath=function(a){if(!(a in c._cache)){var d=b(a);c._cache[a]=d}return new c(c._cache[a])},c}),b.define("select2/diacritics",[],function(){return{"Ⓐ":"A","A":"A","À":"A","Á":"A","Â":"A","Ầ":"A","Ấ":"A","Ẫ":"A","Ẩ":"A","Ã":"A","Ā":"A","Ă":"A","Ằ":"A","Ắ":"A","Ẵ":"A","Ẳ":"A","Ȧ":"A","Ǡ":"A","Ä":"A","Ǟ":"A","Ả":"A","Å":"A","Ǻ":"A","Ǎ":"A","Ȁ":"A","Ȃ":"A","Ạ":"A","Ậ":"A","Ặ":"A","Ḁ":"A","Ą":"A","Ⱥ":"A","Ɐ":"A","Ꜳ":"AA","Æ":"AE","Ǽ":"AE","Ǣ":"AE","Ꜵ":"AO","Ꜷ":"AU","Ꜹ":"AV","Ꜻ":"AV","Ꜽ":"AY","Ⓑ":"B","B":"B","Ḃ":"B","Ḅ":"B","Ḇ":"B","Ƀ":"B","Ƃ":"B","Ɓ":"B","Ⓒ":"C","C":"C","Ć":"C","Ĉ":"C","Ċ":"C","Č":"C","Ç":"C","Ḉ":"C","Ƈ":"C","Ȼ":"C","Ꜿ":"C","Ⓓ":"D","D":"D","Ḋ":"D","Ď":"D","Ḍ":"D","Ḑ":"D","Ḓ":"D","Ḏ":"D","Đ":"D","Ƌ":"D","Ɗ":"D","Ɖ":"D","Ꝺ":"D","DZ":"DZ","DŽ":"DZ","Dz":"Dz","Dž":"Dz","Ⓔ":"E","E":"E","È":"E","É":"E","Ê":"E","Ề":"E","Ế":"E","Ễ":"E","Ể":"E","Ẽ":"E","Ē":"E","Ḕ":"E","Ḗ":"E","Ĕ":"E","Ė":"E","Ë":"E","Ẻ":"E","Ě":"E","Ȅ":"E","Ȇ":"E","Ẹ":"E","Ệ":"E","Ȩ":"E","Ḝ":"E","Ę":"E","Ḙ":"E","Ḛ":"E","Ɛ":"E","Ǝ":"E","Ⓕ":"F","F":"F","Ḟ":"F","Ƒ":"F","Ꝼ":"F","Ⓖ":"G","G":"G","Ǵ":"G","Ĝ":"G","Ḡ":"G","Ğ":"G","Ġ":"G","Ǧ":"G","Ģ":"G","Ǥ":"G","Ɠ":"G","Ꞡ":"G","Ᵹ":"G","Ꝿ":"G","Ⓗ":"H","H":"H","Ĥ":"H","Ḣ":"H","Ḧ":"H","Ȟ":"H","Ḥ":"H","Ḩ":"H","Ḫ":"H","Ħ":"H","Ⱨ":"H","Ⱶ":"H","Ɥ":"H","Ⓘ":"I","I":"I","Ì":"I","Í":"I","Î":"I","Ĩ":"I","Ī":"I","Ĭ":"I","İ":"I","Ï":"I","Ḯ":"I","Ỉ":"I","Ǐ":"I","Ȉ":"I","Ȋ":"I","Ị":"I","Į":"I","Ḭ":"I","Ɨ":"I","Ⓙ":"J","J":"J","Ĵ":"J","Ɉ":"J","Ⓚ":"K","K":"K","Ḱ":"K","Ǩ":"K","Ḳ":"K","Ķ":"K","Ḵ":"K","Ƙ":"K","Ⱪ":"K","Ꝁ":"K","Ꝃ":"K","Ꝅ":"K","Ꞣ":"K","Ⓛ":"L","L":"L","Ŀ":"L","Ĺ":"L","Ľ":"L","Ḷ":"L","Ḹ":"L","Ļ":"L","Ḽ":"L","Ḻ":"L","Ł":"L","Ƚ":"L","Ɫ":"L","Ⱡ":"L","Ꝉ":"L","Ꝇ":"L","Ꞁ":"L","LJ":"LJ","Lj":"Lj","Ⓜ":"M","M":"M","Ḿ":"M","Ṁ":"M","Ṃ":"M","Ɱ":"M","Ɯ":"M","Ⓝ":"N","N":"N","Ǹ":"N","Ń":"N","Ñ":"N","Ṅ":"N","Ň":"N","Ṇ":"N","Ņ":"N","Ṋ":"N","Ṉ":"N","Ƞ":"N","Ɲ":"N","Ꞑ":"N","Ꞥ":"N","NJ":"NJ","Nj":"Nj","Ⓞ":"O","O":"O","Ò":"O","Ó":"O","Ô":"O","Ồ":"O","Ố":"O","Ỗ":"O","Ổ":"O","Õ":"O","Ṍ":"O","Ȭ":"O","Ṏ":"O","Ō":"O","Ṑ":"O","Ṓ":"O","Ŏ":"O","Ȯ":"O","Ȱ":"O","Ö":"O","Ȫ":"O","Ỏ":"O","Ő":"O","Ǒ":"O","Ȍ":"O","Ȏ":"O","Ơ":"O","Ờ":"O","Ớ":"O","Ỡ":"O","Ở":"O","Ợ":"O","Ọ":"O","Ộ":"O","Ǫ":"O","Ǭ":"O","Ø":"O","Ǿ":"O","Ɔ":"O","Ɵ":"O","Ꝋ":"O","Ꝍ":"O","Ƣ":"OI","Ꝏ":"OO","Ȣ":"OU","Ⓟ":"P","P":"P","Ṕ":"P","Ṗ":"P","Ƥ":"P","Ᵽ":"P","Ꝑ":"P","Ꝓ":"P","Ꝕ":"P","Ⓠ":"Q","Q":"Q","Ꝗ":"Q","Ꝙ":"Q","Ɋ":"Q","Ⓡ":"R","R":"R","Ŕ":"R","Ṙ":"R","Ř":"R","Ȑ":"R","Ȓ":"R","Ṛ":"R","Ṝ":"R","Ŗ":"R","Ṟ":"R","Ɍ":"R","Ɽ":"R","Ꝛ":"R","Ꞧ":"R","Ꞃ":"R","Ⓢ":"S","S":"S","ẞ":"S","Ś":"S","Ṥ":"S","Ŝ":"S","Ṡ":"S","Š":"S","Ṧ":"S","Ṣ":"S","Ṩ":"S","Ș":"S","Ş":"S","Ȿ":"S","Ꞩ":"S","Ꞅ":"S","Ⓣ":"T","T":"T","Ṫ":"T","Ť":"T","Ṭ":"T","Ț":"T","Ţ":"T","Ṱ":"T","Ṯ":"T","Ŧ":"T","Ƭ":"T","Ʈ":"T","Ⱦ":"T","Ꞇ":"T","Ꜩ":"TZ","Ⓤ":"U","U":"U","Ù":"U","Ú":"U","Û":"U","Ũ":"U","Ṹ":"U","Ū":"U","Ṻ":"U","Ŭ":"U","Ü":"U","Ǜ":"U","Ǘ":"U","Ǖ":"U","Ǚ":"U","Ủ":"U","Ů":"U","Ű":"U","Ǔ":"U","Ȕ":"U","Ȗ":"U","Ư":"U","Ừ":"U","Ứ":"U","Ữ":"U","Ử":"U","Ự":"U","Ụ":"U","Ṳ":"U","Ų":"U","Ṷ":"U","Ṵ":"U","Ʉ":"U","Ⓥ":"V","V":"V","Ṽ":"V","Ṿ":"V","Ʋ":"V","Ꝟ":"V","Ʌ":"V","Ꝡ":"VY","Ⓦ":"W","W":"W","Ẁ":"W","Ẃ":"W","Ŵ":"W","Ẇ":"W","Ẅ":"W","Ẉ":"W","Ⱳ":"W","Ⓧ":"X","X":"X","Ẋ":"X","Ẍ":"X","Ⓨ":"Y","Y":"Y","Ỳ":"Y","Ý":"Y","Ŷ":"Y","Ỹ":"Y","Ȳ":"Y","Ẏ":"Y","Ÿ":"Y","Ỷ":"Y","Ỵ":"Y","Ƴ":"Y","Ɏ":"Y","Ỿ":"Y","Ⓩ":"Z","Z":"Z","Ź":"Z","Ẑ":"Z","Ż":"Z","Ž":"Z","Ẓ":"Z","Ẕ":"Z","Ƶ":"Z","Ȥ":"Z","Ɀ":"Z","Ⱬ":"Z","Ꝣ":"Z","ⓐ":"a","a":"a","ẚ":"a","à":"a","á":"a","â":"a","ầ":"a","ấ":"a","ẫ":"a","ẩ":"a","ã":"a","ā":"a","ă":"a","ằ":"a","ắ":"a","ẵ":"a","ẳ":"a","ȧ":"a","ǡ":"a","ä":"a","ǟ":"a","ả":"a","å":"a","ǻ":"a","ǎ":"a","ȁ":"a","ȃ":"a","ạ":"a","ậ":"a","ặ":"a","ḁ":"a","ą":"a","ⱥ":"a","ɐ":"a","ꜳ":"aa","æ":"ae","ǽ":"ae","ǣ":"ae","ꜵ":"ao","ꜷ":"au","ꜹ":"av","ꜻ":"av","ꜽ":"ay","ⓑ":"b","b":"b","ḃ":"b","ḅ":"b","ḇ":"b","ƀ":"b","ƃ":"b","ɓ":"b","ⓒ":"c","c":"c","ć":"c","ĉ":"c","ċ":"c","č":"c","ç":"c","ḉ":"c","ƈ":"c","ȼ":"c","ꜿ":"c","ↄ":"c","ⓓ":"d","d":"d","ḋ":"d","ď":"d","ḍ":"d","ḑ":"d","ḓ":"d","ḏ":"d","đ":"d","ƌ":"d","ɖ":"d","ɗ":"d","ꝺ":"d","dz":"dz","dž":"dz","ⓔ":"e","e":"e","è":"e","é":"e","ê":"e","ề":"e","ế":"e","ễ":"e","ể":"e","ẽ":"e","ē":"e","ḕ":"e","ḗ":"e","ĕ":"e","ė":"e","ë":"e","ẻ":"e","ě":"e","ȅ":"e","ȇ":"e","ẹ":"e","ệ":"e","ȩ":"e","ḝ":"e","ę":"e","ḙ":"e","ḛ":"e","ɇ":"e","ɛ":"e","ǝ":"e","ⓕ":"f","f":"f","ḟ":"f","ƒ":"f","ꝼ":"f","ⓖ":"g","g":"g","ǵ":"g","ĝ":"g","ḡ":"g","ğ":"g","ġ":"g","ǧ":"g","ģ":"g","ǥ":"g","ɠ":"g","ꞡ":"g","ᵹ":"g","ꝿ":"g","ⓗ":"h","h":"h","ĥ":"h","ḣ":"h","ḧ":"h","ȟ":"h","ḥ":"h","ḩ":"h","ḫ":"h","ẖ":"h","ħ":"h","ⱨ":"h","ⱶ":"h","ɥ":"h","ƕ":"hv","ⓘ":"i","i":"i","ì":"i","í":"i","î":"i","ĩ":"i","ī":"i","ĭ":"i","ï":"i","ḯ":"i","ỉ":"i","ǐ":"i","ȉ":"i","ȋ":"i","ị":"i","į":"i","ḭ":"i","ɨ":"i","ı":"i","ⓙ":"j","j":"j","ĵ":"j","ǰ":"j","ɉ":"j","ⓚ":"k","k":"k","ḱ":"k","ǩ":"k","ḳ":"k","ķ":"k","ḵ":"k","ƙ":"k","ⱪ":"k","ꝁ":"k","ꝃ":"k","ꝅ":"k","ꞣ":"k","ⓛ":"l","l":"l","ŀ":"l","ĺ":"l","ľ":"l","ḷ":"l","ḹ":"l","ļ":"l","ḽ":"l","ḻ":"l","ſ":"l","ł":"l","ƚ":"l","ɫ":"l","ⱡ":"l","ꝉ":"l","ꞁ":"l","ꝇ":"l","lj":"lj","ⓜ":"m","m":"m","ḿ":"m","ṁ":"m","ṃ":"m","ɱ":"m","ɯ":"m","ⓝ":"n","n":"n","ǹ":"n","ń":"n","ñ":"n","ṅ":"n","ň":"n","ṇ":"n","ņ":"n","ṋ":"n","ṉ":"n","ƞ":"n","ɲ":"n","ʼn":"n","ꞑ":"n","ꞥ":"n","nj":"nj","ⓞ":"o","o":"o","ò":"o","ó":"o","ô":"o","ồ":"o","ố":"o","ỗ":"o","ổ":"o","õ":"o","ṍ":"o","ȭ":"o","ṏ":"o","ō":"o","ṑ":"o","ṓ":"o","ŏ":"o","ȯ":"o","ȱ":"o","ö":"o","ȫ":"o","ỏ":"o","ő":"o","ǒ":"o","ȍ":"o","ȏ":"o","ơ":"o","ờ":"o","ớ":"o","ỡ":"o","ở":"o","ợ":"o","ọ":"o","ộ":"o","ǫ":"o","ǭ":"o","ø":"o","ǿ":"o","ɔ":"o","ꝋ":"o","ꝍ":"o","ɵ":"o","ƣ":"oi","ȣ":"ou","ꝏ":"oo","ⓟ":"p","p":"p","ṕ":"p","ṗ":"p","ƥ":"p","ᵽ":"p","ꝑ":"p","ꝓ":"p","ꝕ":"p","ⓠ":"q","q":"q","ɋ":"q","ꝗ":"q","ꝙ":"q","ⓡ":"r","r":"r","ŕ":"r","ṙ":"r","ř":"r","ȑ":"r","ȓ":"r","ṛ":"r","ṝ":"r","ŗ":"r","ṟ":"r","ɍ":"r","ɽ":"r","ꝛ":"r","ꞧ":"r","ꞃ":"r","ⓢ":"s","s":"s","ß":"s","ś":"s","ṥ":"s","ŝ":"s","ṡ":"s","š":"s","ṧ":"s","ṣ":"s","ṩ":"s","ș":"s","ş":"s","ȿ":"s","ꞩ":"s","ꞅ":"s","ẛ":"s","ⓣ":"t","t":"t","ṫ":"t","ẗ":"t","ť":"t","ṭ":"t","ț":"t","ţ":"t","ṱ":"t","ṯ":"t","ŧ":"t","ƭ":"t","ʈ":"t","ⱦ":"t","ꞇ":"t","ꜩ":"tz","ⓤ":"u","u":"u","ù":"u","ú":"u","û":"u","ũ":"u","ṹ":"u","ū":"u","ṻ":"u","ŭ":"u","ü":"u","ǜ":"u","ǘ":"u","ǖ":"u","ǚ":"u","ủ":"u","ů":"u","ű":"u","ǔ":"u","ȕ":"u","ȗ":"u","ư":"u","ừ":"u","ứ":"u","ữ":"u","ử":"u","ự":"u","ụ":"u","ṳ":"u","ų":"u","ṷ":"u","ṵ":"u","ʉ":"u","ⓥ":"v","v":"v","ṽ":"v","ṿ":"v","ʋ":"v","ꝟ":"v","ʌ":"v","ꝡ":"vy","ⓦ":"w","w":"w","ẁ":"w","ẃ":"w","ŵ":"w","ẇ":"w","ẅ":"w","ẘ":"w","ẉ":"w","ⱳ":"w","ⓧ":"x","x":"x","ẋ":"x","ẍ":"x","ⓨ":"y","y":"y","ỳ":"y","ý":"y","ŷ":"y","ỹ":"y","ȳ":"y","ẏ":"y","ÿ":"y","ỷ":"y","ẙ":"y","ỵ":"y","ƴ":"y","ɏ":"y","ỿ":"y","ⓩ":"z","z":"z","ź":"z","ẑ":"z","ż":"z","ž":"z","ẓ":"z","ẕ":"z","ƶ":"z","ȥ":"z","ɀ":"z","ⱬ":"z","ꝣ":"z","Ά":"Α","Έ":"Ε","Ή":"Η","Ί":"Ι","Ϊ":"Ι","Ό":"Ο","Ύ":"Υ","Ϋ":"Υ","Ώ":"Ω","ά":"α","έ":"ε","ή":"η","ί":"ι","ϊ":"ι","ΐ":"ι","ό":"ο","ύ":"υ","ϋ":"υ","ΰ":"υ","ω":"ω","ς":"σ"}}),b.define("select2/data/base",["../utils"],function(a){function b(a,c){b.__super__.constructor.call(this)}return a.Extend(b,a.Observable),b.prototype.current=function(a){throw new Error("The `current` method must be defined in child classes.")},b.prototype.query=function(a,b){throw new Error("The `query` method must be defined in child classes.")},b.prototype.bind=function(a,b){},b.prototype.destroy=function(){},b.prototype.generateResultId=function(b,c){var d=b.id+"-result-";return d+=a.generateChars(4),null!=c.id?d+="-"+c.id.toString():d+="-"+a.generateChars(4),d},b}),b.define("select2/data/select",["./base","../utils","jquery"],function(a,b,c){function d(a,b){this.$element=a,this.options=b,d.__super__.constructor.call(this)}return b.Extend(d,a),d.prototype.current=function(a){var b=[],d=this;this.$element.find(":selected").each(function(){var a=c(this),e=d.item(a);b.push(e)}),a(b)},d.prototype.select=function(a){var b=this;if(a.selected=!0,c(a.element).is("option"))return a.element.selected=!0,void this.$element.trigger("change");if(this.$element.prop("multiple"))this.current(function(d){var e=[];a=[a],a.push.apply(a,d);for(var f=0;f<a.length;f++){var g=a[f].id;-1===c.inArray(g,e)&&e.push(g)}b.$element.val(e),b.$element.trigger("change")});else{var d=a.id;this.$element.val(d),this.$element.trigger("change")}},d.prototype.unselect=function(a){var b=this;if(this.$element.prop("multiple")){if(a.selected=!1,c(a.element).is("option"))return a.element.selected=!1,void this.$element.trigger("change");this.current(function(d){for(var e=[],f=0;f<d.length;f++){var g=d[f].id;g!==a.id&&-1===c.inArray(g,e)&&e.push(g)}b.$element.val(e),b.$element.trigger("change")})}},d.prototype.bind=function(a,b){var c=this;this.container=a,a.on("select",function(a){c.select(a.data)}),a.on("unselect",function(a){c.unselect(a.data)})},d.prototype.destroy=function(){this.$element.find("*").each(function(){b.RemoveData(this)})},d.prototype.query=function(a,b){var d=[],e=this;this.$element.children().each(function(){var b=c(this);if(b.is("option")||b.is("optgroup")){var f=e.item(b),g=e.matches(a,f);null!==g&&d.push(g)}}),b({results:d})},d.prototype.addOptions=function(a){b.appendMany(this.$element,a)},d.prototype.option=function(a){var d;a.children?(d=document.createElement("optgroup"),d.label=a.text):(d=document.createElement("option"),void 0!==d.textContent?d.textContent=a.text:d.innerText=a.text),void 0!==a.id&&(d.value=a.id),a.disabled&&(d.disabled=!0),a.selected&&(d.selected=!0),a.title&&(d.title=a.title);var e=c(d),f=this._normalizeItem(a);return f.element=d,b.StoreData(d,"data",f),e},d.prototype.item=function(a){var d={};if(null!=(d=b.GetData(a[0],"data")))return d;if(a.is("option"))d={id:a.val(),text:a.text(),disabled:a.prop("disabled"),selected:a.prop("selected"),title:a.prop("title")};else if(a.is("optgroup")){d={text:a.prop("label"),children:[],title:a.prop("title")};for(var e=a.children("option"),f=[],g=0;g<e.length;g++){var h=c(e[g]),i=this.item(h);f.push(i)}d.children=f}return d=this._normalizeItem(d),d.element=a[0],b.StoreData(a[0],"data",d),d},d.prototype._normalizeItem=function(a){a!==Object(a)&&(a={id:a,text:a}),a=c.extend({},{text:""},a);var b={selected:!1,disabled:!1};return null!=a.id&&(a.id=a.id.toString()),null!=a.text&&(a.text=a.text.toString()),null==a._resultId&&a.id&&null!=this.container&&(a._resultId=this.generateResultId(this.container,a)),c.extend({},b,a)},d.prototype.matches=function(a,b){return this.options.get("matcher")(a,b)},d}),b.define("select2/data/array",["./select","../utils","jquery"],function(a,b,c){function d(a,b){var c=b.get("data")||[];d.__super__.constructor.call(this,a,b),this.addOptions(this.convertToOptions(c))}return b.Extend(d,a),d.prototype.select=function(a){var b=this.$element.find("option").filter(function(b,c){return c.value==a.id.toString()});0===b.length&&(b=this.option(a),this.addOptions(b)),d.__super__.select.call(this,a)},d.prototype.convertToOptions=function(a){function d(a){return function(){return c(this).val()==a.id}}for(var e=this,f=this.$element.find("option"),g=f.map(function(){return e.item(c(this)).id}).get(),h=[],i=0;i<a.length;i++){var j=this._normalizeItem(a[i]);if(c.inArray(j.id,g)>=0){var k=f.filter(d(j)),l=this.item(k),m=c.extend(!0,{},j,l),n=this.option(m);k.replaceWith(n)}else{var o=this.option(j);if(j.children){var p=this.convertToOptions(j.children);b.appendMany(o,p)}h.push(o)}}return h},d}),b.define("select2/data/ajax",["./array","../utils","jquery"],function(a,b,c){function d(a,b){this.ajaxOptions=this._applyDefaults(b.get("ajax")),null!=this.ajaxOptions.processResults&&(this.processResults=this.ajaxOptions.processResults),d.__super__.constructor.call(this,a,b)}return b.Extend(d,a),d.prototype._applyDefaults=function(a){var b={data:function(a){return c.extend({},a,{q:a.term})},transport:function(a,b,d){var e=c.ajax(a);return e.then(b),e.fail(d),e}};return c.extend({},b,a,!0)},d.prototype.processResults=function(a){return a},d.prototype.query=function(a,b){function d(){var d=f.transport(f,function(d){var f=e.processResults(d,a);e.options.get("debug")&&window.console&&console.error&&(f&&f.results&&c.isArray(f.results)||console.error("Select2: The AJAX results did not return an array in the `results` key of the response.")),b(f)},function(){"status"in d&&(0===d.status||"0"===d.status)||e.trigger("results:message",{message:"errorLoading"})});e._request=d}var e=this;null!=this._request&&(c.isFunction(this._request.abort)&&this._request.abort(),this._request=null);var f=c.extend({type:"GET"},this.ajaxOptions);"function"==typeof f.url&&(f.url=f.url.call(this.$element,a)),"function"==typeof f.data&&(f.data=f.data.call(this.$element,a)),this.ajaxOptions.delay&&null!=a.term?(this._queryTimeout&&window.clearTimeout(this._queryTimeout),this._queryTimeout=window.setTimeout(d,this.ajaxOptions.delay)):d()},d}),b.define("select2/data/tags",["jquery"],function(a){function b(b,c,d){var e=d.get("tags"),f=d.get("createTag");void 0!==f&&(this.createTag=f);var g=d.get("insertTag");if(void 0!==g&&(this.insertTag=g),b.call(this,c,d),a.isArray(e))for(var h=0;h<e.length;h++){var i=e[h],j=this._normalizeItem(i),k=this.option(j);this.$element.append(k)}}return b.prototype.query=function(a,b,c){function d(a,f){for(var g=a.results,h=0;h<g.length;h++){var i=g[h],j=null!=i.children&&!d({results:i.children},!0);if((i.text||"").toUpperCase()===(b.term||"").toUpperCase()||j)return!f&&(a.data=g,void c(a))}if(f)return!0;var k=e.createTag(b);if(null!=k){var l=e.option(k);l.attr("data-select2-tag",!0),e.addOptions([l]),e.insertTag(g,k)}a.results=g,c(a)}var e=this;if(this._removeOldTags(),null==b.term||null!=b.page)return void a.call(this,b,c);a.call(this,b,d)},b.prototype.createTag=function(b,c){var d=a.trim(c.term);return""===d?null:{id:d,text:d}},b.prototype.insertTag=function(a,b,c){b.unshift(c)},b.prototype._removeOldTags=function(b){this._lastTag;this.$element.find("option[data-select2-tag]").each(function(){this.selected||a(this).remove()})},b}),b.define("select2/data/tokenizer",["jquery"],function(a){function b(a,b,c){var d=c.get("tokenizer");void 0!==d&&(this.tokenizer=d),a.call(this,b,c)}return b.prototype.bind=function(a,b,c){a.call(this,b,c),this.$search=b.dropdown.$search||b.selection.$search||c.find(".select2-search__field")},b.prototype.query=function(b,c,d){function e(b){var c=g._normalizeItem(b);if(!g.$element.find("option").filter(function(){return a(this).val()===c.id}).length){var d=g.option(c);d.attr("data-select2-tag",!0),g._removeOldTags(),g.addOptions([d])}f(c)}function f(a){g.trigger("select",{data:a})}var g=this;c.term=c.term||"";var h=this.tokenizer(c,this.options,e);h.term!==c.term&&(this.$search.length&&(this.$search.val(h.term),this.$search.focus()),c.term=h.term),b.call(this,c,d)},b.prototype.tokenizer=function(b,c,d,e){for(var f=d.get("tokenSeparators")||[],g=c.term,h=0,i=this.createTag||function(a){return{id:a.term,text:a.term}};h<g.length;){var j=g[h];if(-1!==a.inArray(j,f)){var k=g.substr(0,h),l=a.extend({},c,{term:k}),m=i(l);null!=m?(e(m),g=g.substr(h+1)||"",h=0):h++}else h++}return{term:g}},b}),b.define("select2/data/minimumInputLength",[],function(){function a(a,b,c){this.minimumInputLength=c.get("minimumInputLength"),a.call(this,b,c)}return a.prototype.query=function(a,b,c){if(b.term=b.term||"",b.term.length<this.minimumInputLength)return void this.trigger("results:message",{message:"inputTooShort",args:{minimum:this.minimumInputLength,input:b.term,params:b}});a.call(this,b,c)},a}),b.define("select2/data/maximumInputLength",[],function(){function a(a,b,c){this.maximumInputLength=c.get("maximumInputLength"),a.call(this,b,c)}return a.prototype.query=function(a,b,c){if(b.term=b.term||"",this.maximumInputLength>0&&b.term.length>this.maximumInputLength)return void this.trigger("results:message",{message:"inputTooLong",args:{maximum:this.maximumInputLength,input:b.term,params:b}});a.call(this,b,c)},a}),b.define("select2/data/maximumSelectionLength",[],function(){function a(a,b,c){this.maximumSelectionLength=c.get("maximumSelectionLength"),a.call(this,b,c)}return a.prototype.query=function(a,b,c){var d=this;this.current(function(e){var f=null!=e?e.length:0;if(d.maximumSelectionLength>0&&f>=d.maximumSelectionLength)return void d.trigger("results:message",{message:"maximumSelected",args:{maximum:d.maximumSelectionLength}});a.call(d,b,c)})},a}),b.define("select2/dropdown",["jquery","./utils"],function(a,b){function c(a,b){this.$element=a,this.options=b,c.__super__.constructor.call(this)}return b.Extend(c,b.Observable),c.prototype.render=function(){var b=a('<span class="select2-dropdown"><span class="select2-results"></span></span>');return b.attr("dir",this.options.get("dir")),this.$dropdown=b,b},c.prototype.bind=function(){},c.prototype.position=function(a,b){},c.prototype.destroy=function(){this.$dropdown.remove()},c}),b.define("select2/dropdown/search",["jquery","../utils"],function(a,b){function c(){}return c.prototype.render=function(b){var c=b.call(this),d=a('<span class="select2-search select2-search--dropdown"><input class="select2-search__field" type="search" tabindex="-1" autocomplete="off" autocorrect="off" autocapitalize="none" spellcheck="false" role="textbox" /></span>');return this.$searchContainer=d,this.$search=d.find("input"),c.prepend(d),c},c.prototype.bind=function(b,c,d){var e=this;b.call(this,c,d),this.$search.on("keydown",function(a){e.trigger("keypress",a),e._keyUpPrevented=a.isDefaultPrevented()}),this.$search.on("input",function(b){a(this).off("keyup")}),this.$search.on("keyup input",function(a){e.handleSearch(a)}),c.on("open",function(){e.$search.attr("tabindex",0),e.$search.focus(),window.setTimeout(function(){e.$search.focus()},0)}),c.on("close",function(){e.$search.attr("tabindex",-1),e.$search.val(""),e.$search.blur()}),c.on("focus",function(){c.isOpen()||e.$search.focus()}),c.on("results:all",function(a){if(null==a.query.term||""===a.query.term){e.showSearch(a)?e.$searchContainer.removeClass("select2-search--hide"):e.$searchContainer.addClass("select2-search--hide")}})},c.prototype.handleSearch=function(a){if(!this._keyUpPrevented){var b=this.$search.val();this.trigger("query",{term:b})}this._keyUpPrevented=!1},c.prototype.showSearch=function(a,b){return!0},c}),b.define("select2/dropdown/hidePlaceholder",[],function(){function a(a,b,c,d){this.placeholder=this.normalizePlaceholder(c.get("placeholder")),a.call(this,b,c,d)}return a.prototype.append=function(a,b){b.results=this.removePlaceholder(b.results),a.call(this,b)},a.prototype.normalizePlaceholder=function(a,b){return"string"==typeof b&&(b={id:"",text:b}),b},a.prototype.removePlaceholder=function(a,b){for(var c=b.slice(0),d=b.length-1;d>=0;d--){var e=b[d];this.placeholder.id===e.id&&c.splice(d,1)}return c},a}),b.define("select2/dropdown/infiniteScroll",["jquery"],function(a){function b(a,b,c,d){this.lastParams={},a.call(this,b,c,d),this.$loadingMore=this.createLoadingMore(),this.loading=!1}return b.prototype.append=function(a,b){this.$loadingMore.remove(),this.loading=!1,a.call(this,b),this.showLoadingMore(b)&&this.$results.append(this.$loadingMore)},b.prototype.bind=function(b,c,d){var e=this;b.call(this,c,d),c.on("query",function(a){e.lastParams=a,e.loading=!0}),c.on("query:append",function(a){e.lastParams=a,e.loading=!0}),this.$results.on("scroll",function(){var b=a.contains(document.documentElement,e.$loadingMore[0]);if(!e.loading&&b){e.$results.offset().top+e.$results.outerHeight(!1)+50>=e.$loadingMore.offset().top+e.$loadingMore.outerHeight(!1)&&e.loadMore()}})},b.prototype.loadMore=function(){this.loading=!0;var b=a.extend({},{page:1},this.lastParams);b.page++,this.trigger("query:append",b)},b.prototype.showLoadingMore=function(a,b){return b.pagination&&b.pagination.more},b.prototype.createLoadingMore=function(){var b=a('<li class="select2-results__option select2-results__option--load-more"role="treeitem" aria-disabled="true"></li>'),c=this.options.get("translations").get("loadingMore");return b.html(c(this.lastParams)),b},b}),b.define("select2/dropdown/attachBody",["jquery","../utils"],function(a,b){function c(b,c,d){this.$dropdownParent=d.get("dropdownParent")||a(document.body),b.call(this,c,d)}return c.prototype.bind=function(a,b,c){var d=this,e=!1;a.call(this,b,c),b.on("open",function(){d._showDropdown(),d._attachPositioningHandler(b),e||(e=!0,b.on("results:all",function(){d._positionDropdown(),d._resizeDropdown()}),b.on("results:append",function(){d._positionDropdown(),d._resizeDropdown()}))}),b.on("close",function(){d._hideDropdown(),d._detachPositioningHandler(b)}),this.$dropdownContainer.on("mousedown",function(a){a.stopPropagation()})},c.prototype.destroy=function(a){a.call(this),this.$dropdownContainer.remove()},c.prototype.position=function(a,b,c){b.attr("class",c.attr("class")),b.removeClass("select2"),b.addClass("select2-container--open"),b.css({position:"absolute",top:-999999}),this.$container=c},c.prototype.render=function(b){var c=a("<span></span>"),d=b.call(this);return c.append(d),this.$dropdownContainer=c,c},c.prototype._hideDropdown=function(a){this.$dropdownContainer.detach()},c.prototype._attachPositioningHandler=function(c,d){var e=this,f="scroll.select2."+d.id,g="resize.select2."+d.id,h="orientationchange.select2."+d.id,i=this.$container.parents().filter(b.hasScroll);i.each(function(){b.StoreData(this,"select2-scroll-position",{x:a(this).scrollLeft(),y:a(this).scrollTop()})}),i.on(f,function(c){var d=b.GetData(this,"select2-scroll-position");a(this).scrollTop(d.y)}),a(window).on(f+" "+g+" "+h,function(a){e._positionDropdown(),e._resizeDropdown()})},c.prototype._detachPositioningHandler=function(c,d){var e="scroll.select2."+d.id,f="resize.select2."+d.id,g="orientationchange.select2."+d.id;this.$container.parents().filter(b.hasScroll).off(e),a(window).off(e+" "+f+" "+g)},c.prototype._positionDropdown=function(){var b=a(window),c=this.$dropdown.hasClass("select2-dropdown--above"),d=this.$dropdown.hasClass("select2-dropdown--below"),e=null,f=this.$container.offset();f.bottom=f.top+this.$container.outerHeight(!1);var g={height:this.$container.outerHeight(!1)};g.top=f.top,g.bottom=f.top+g.height;var h={height:this.$dropdown.outerHeight(!1)},i={top:b.scrollTop(),bottom:b.scrollTop()+b.height()},j=i.top<f.top-h.height,k=i.bottom>f.bottom+h.height,l={left:f.left,top:g.bottom},m=this.$dropdownParent;"static"===m.css("position")&&(m=m.offsetParent());var n=m.offset();l.top-=n.top,l.left-=n.left,c||d||(e="below"),k||!j||c?!j&&k&&c&&(e="below"):e="above",("above"==e||c&&"below"!==e)&&(l.top=g.top-n.top-h.height),null!=e&&(this.$dropdown.removeClass("select2-dropdown--below select2-dropdown--above").addClass("select2-dropdown--"+e),this.$container.removeClass("select2-container--below select2-container--above").addClass("select2-container--"+e)),this.$dropdownContainer.css(l)},c.prototype._resizeDropdown=function(){var a={width:this.$container.outerWidth(!1)+"px"};this.options.get("dropdownAutoWidth")&&(a.minWidth=a.width,a.position="relative",a.width="auto"),this.$dropdown.css(a)},c.prototype._showDropdown=function(a){this.$dropdownContainer.appendTo(this.$dropdownParent),this._positionDropdown(),this._resizeDropdown()},c}),b.define("select2/dropdown/minimumResultsForSearch",[],function(){function a(b){for(var c=0,d=0;d<b.length;d++){var e=b[d];e.children?c+=a(e.children):c++}return c}function b(a,b,c,d){this.minimumResultsForSearch=c.get("minimumResultsForSearch"),this.minimumResultsForSearch<0&&(this.minimumResultsForSearch=1/0),a.call(this,b,c,d)}return b.prototype.showSearch=function(b,c){return!(a(c.data.results)<this.minimumResultsForSearch)&&b.call(this,c)},b}),b.define("select2/dropdown/selectOnClose",["../utils"],function(a){function b(){}return b.prototype.bind=function(a,b,c){var d=this;a.call(this,b,c),b.on("close",function(a){d._handleSelectOnClose(a)})},b.prototype._handleSelectOnClose=function(b,c){if(c&&null!=c.originalSelect2Event){var d=c.originalSelect2Event;if("select"===d._type||"unselect"===d._type)return}var e=this.getHighlightedResults();if(!(e.length<1)){var f=a.GetData(e[0],"data");null!=f.element&&f.element.selected||null==f.element&&f.selected||this.trigger("select",{data:f})}},b}),b.define("select2/dropdown/closeOnSelect",[],function(){function a(){}return a.prototype.bind=function(a,b,c){var d=this;a.call(this,b,c),b.on("select",function(a){d._selectTriggered(a)}),b.on("unselect",function(a){d._selectTriggered(a)})},a.prototype._selectTriggered=function(a,b){var c=b.originalEvent;c&&c.ctrlKey||this.trigger("close",{originalEvent:c,originalSelect2Event:b})},a}),b.define("select2/i18n/en",[],function(){return{errorLoading:function(){return"The results could not be loaded."},inputTooLong:function(a){var b=a.input.length-a.maximum,c="Please delete "+b+" character";return 1!=b&&(c+="s"),c},inputTooShort:function(a){return"Please enter "+(a.minimum-a.input.length)+" or more characters"},loadingMore:function(){return"Loading more results…"},maximumSelected:function(a){var b="You can only select "+a.maximum+" item";return 1!=a.maximum&&(b+="s"),b},noResults:function(){return"No results found"},searching:function(){return"Searching…"}}}),b.define("select2/defaults",["jquery","require","./results","./selection/single","./selection/multiple","./selection/placeholder","./selection/allowClear","./selection/search","./selection/eventRelay","./utils","./translation","./diacritics","./data/select","./data/array","./data/ajax","./data/tags","./data/tokenizer","./data/minimumInputLength","./data/maximumInputLength","./data/maximumSelectionLength","./dropdown","./dropdown/search","./dropdown/hidePlaceholder","./dropdown/infiniteScroll","./dropdown/attachBody","./dropdown/minimumResultsForSearch","./dropdown/selectOnClose","./dropdown/closeOnSelect","./i18n/en"],function(a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z,A,B,C){function D(){this.reset()}return D.prototype.apply=function(l){if(l=a.extend(!0,{},this.defaults,l),null==l.dataAdapter){if(null!=l.ajax?l.dataAdapter=o:null!=l.data?l.dataAdapter=n:l.dataAdapter=m,l.minimumInputLength>0&&(l.dataAdapter=j.Decorate(l.dataAdapter,r)),l.maximumInputLength>0&&(l.dataAdapter=j.Decorate(l.dataAdapter,s)),l.maximumSelectionLength>0&&(l.dataAdapter=j.Decorate(l.dataAdapter,t)),l.tags&&(l.dataAdapter=j.Decorate(l.dataAdapter,p)),null==l.tokenSeparators&&null==l.tokenizer||(l.dataAdapter=j.Decorate(l.dataAdapter,q)),null!=l.query){var C=b(l.amdBase+"compat/query");l.dataAdapter=j.Decorate(l.dataAdapter,C)}if(null!=l.initSelection){var D=b(l.amdBase+"compat/initSelection");l.dataAdapter=j.Decorate(l.dataAdapter,D)}}if(null==l.resultsAdapter&&(l.resultsAdapter=c,null!=l.ajax&&(l.resultsAdapter=j.Decorate(l.resultsAdapter,x)),null!=l.placeholder&&(l.resultsAdapter=j.Decorate(l.resultsAdapter,w)),l.selectOnClose&&(l.resultsAdapter=j.Decorate(l.resultsAdapter,A))),null==l.dropdownAdapter){if(l.multiple)l.dropdownAdapter=u;else{var E=j.Decorate(u,v);l.dropdownAdapter=E}if(0!==l.minimumResultsForSearch&&(l.dropdownAdapter=j.Decorate(l.dropdownAdapter,z)),l.closeOnSelect&&(l.dropdownAdapter=j.Decorate(l.dropdownAdapter,B)),null!=l.dropdownCssClass||null!=l.dropdownCss||null!=l.adaptDropdownCssClass){var F=b(l.amdBase+"compat/dropdownCss");l.dropdownAdapter=j.Decorate(l.dropdownAdapter,F)}l.dropdownAdapter=j.Decorate(l.dropdownAdapter,y)}if(null==l.selectionAdapter){if(l.multiple?l.selectionAdapter=e:l.selectionAdapter=d,null!=l.placeholder&&(l.selectionAdapter=j.Decorate(l.selectionAdapter,f)),l.allowClear&&(l.selectionAdapter=j.Decorate(l.selectionAdapter,g)),l.multiple&&(l.selectionAdapter=j.Decorate(l.selectionAdapter,h)),null!=l.containerCssClass||null!=l.containerCss||null!=l.adaptContainerCssClass){var G=b(l.amdBase+"compat/containerCss");l.selectionAdapter=j.Decorate(l.selectionAdapter,G)}l.selectionAdapter=j.Decorate(l.selectionAdapter,i)}if("string"==typeof l.language)if(l.language.indexOf("-")>0){var H=l.language.split("-"),I=H[0];l.language=[l.language,I]}else l.language=[l.language];if(a.isArray(l.language)){var J=new k;l.language.push("en");for(var K=l.language,L=0;L<K.length;L++){var M=K[L],N={};try{N=k.loadPath(M)}catch(a){try{M=this.defaults.amdLanguageBase+M,N=k.loadPath(M)}catch(a){l.debug&&window.console&&console.warn&&console.warn('Select2: The language file for "'+M+'" could not be automatically loaded. A fallback will be used instead.');continue}}J.extend(N)}l.translations=J}else{var O=k.loadPath(this.defaults.amdLanguageBase+"en"),P=new k(l.language);P.extend(O),l.translations=P}return l},D.prototype.reset=function(){function b(a){function b(a){return l[a]||a}return a.replace(/[^\u0000-\u007E]/g,b)}function c(d,e){if(""===a.trim(d.term))return e;if(e.children&&e.children.length>0){for(var f=a.extend(!0,{},e),g=e.children.length-1;g>=0;g--){null==c(d,e.children[g])&&f.children.splice(g,1)}return f.children.length>0?f:c(d,f)}var h=b(e.text).toUpperCase(),i=b(d.term).toUpperCase();return h.indexOf(i)>-1?e:null}this.defaults={amdBase:"./",amdLanguageBase:"./i18n/",closeOnSelect:!0,debug:!1,dropdownAutoWidth:!1,escapeMarkup:j.escapeMarkup,language:C,matcher:c,minimumInputLength:0,maximumInputLength:0,maximumSelectionLength:0,minimumResultsForSearch:0,selectOnClose:!1,sorter:function(a){return a},templateResult:function(a){return a.text},templateSelection:function(a){return a.text},theme:"default",width:"resolve"}},D.prototype.set=function(b,c){var d=a.camelCase(b),e={};e[d]=c;var f=j._convertData(e);a.extend(!0,this.defaults,f)},new D}),b.define("select2/options",["require","jquery","./defaults","./utils"],function(a,b,c,d){function e(b,e){if(this.options=b,null!=e&&this.fromElement(e),this.options=c.apply(this.options),e&&e.is("input")){var f=a(this.get("amdBase")+"compat/inputData");this.options.dataAdapter=d.Decorate(this.options.dataAdapter,f)}}return e.prototype.fromElement=function(a){var c=["select2"];null==this.options.multiple&&(this.options.multiple=a.prop("multiple")),null==this.options.disabled&&(this.options.disabled=a.prop("disabled")),null==this.options.language&&(a.prop("lang")?this.options.language=a.prop("lang").toLowerCase():a.closest("[lang]").prop("lang")&&(this.options.language=a.closest("[lang]").prop("lang"))),null==this.options.dir&&(a.prop("dir")?this.options.dir=a.prop("dir"):a.closest("[dir]").prop("dir")?this.options.dir=a.closest("[dir]").prop("dir"):this.options.dir="ltr"),a.prop("disabled",this.options.disabled),a.prop("multiple",this.options.multiple),d.GetData(a[0],"select2Tags")&&(this.options.debug&&window.console&&console.warn&&console.warn('Select2: The `data-select2-tags` attribute has been changed to use the `data-data` and `data-tags="true"` attributes and will be removed in future versions of Select2.'),d.StoreData(a[0],"data",d.GetData(a[0],"select2Tags")),d.StoreData(a[0],"tags",!0)),d.GetData(a[0],"ajaxUrl")&&(this.options.debug&&window.console&&console.warn&&console.warn("Select2: The `data-ajax-url` attribute has been changed to `data-ajax--url` and support for the old attribute will be removed in future versions of Select2."),a.attr("ajax--url",d.GetData(a[0],"ajaxUrl")),d.StoreData(a[0],"ajax-Url",d.GetData(a[0],"ajaxUrl")));var e={};e=b.fn.jquery&&"1."==b.fn.jquery.substr(0,2)&&a[0].dataset?b.extend(!0,{},a[0].dataset,d.GetData(a[0])):d.GetData(a[0]);var f=b.extend(!0,{},e);f=d._convertData(f);for(var g in f)b.inArray(g,c)>-1||(b.isPlainObject(this.options[g])?b.extend(this.options[g],f[g]):this.options[g]=f[g]);return this},e.prototype.get=function(a){return this.options[a]},e.prototype.set=function(a,b){this.options[a]=b},e}),b.define("select2/core",["jquery","./options","./utils","./keys"],function(a,b,c,d){var e=function(a,d){null!=c.GetData(a[0],"select2")&&c.GetData(a[0],"select2").destroy(),this.$element=a,this.id=this._generateId(a),d=d||{},this.options=new b(d,a),e.__super__.constructor.call(this);var f=a.attr("tabindex")||0;c.StoreData(a[0],"old-tabindex",f),a.attr("tabindex","-1");var g=this.options.get("dataAdapter");this.dataAdapter=new g(a,this.options);var h=this.render();this._placeContainer(h);var i=this.options.get("selectionAdapter");this.selection=new i(a,this.options),this.$selection=this.selection.render(),this.selection.position(this.$selection,h);var j=this.options.get("dropdownAdapter");this.dropdown=new j(a,this.options),this.$dropdown=this.dropdown.render(),this.dropdown.position(this.$dropdown,h);var k=this.options.get("resultsAdapter");this.results=new k(a,this.options,this.dataAdapter),this.$results=this.results.render(),this.results.position(this.$results,this.$dropdown);var l=this;this._bindAdapters(),this._registerDomEvents(),this._registerDataEvents(),this._registerSelectionEvents(),this._registerDropdownEvents(),this._registerResultsEvents(),this._registerEvents(),this.dataAdapter.current(function(a){l.trigger("selection:update",{data:a})}),a.addClass("select2-hidden-accessible"),a.attr("aria-hidden","true"),this._syncAttributes(),c.StoreData(a[0],"select2",this),a.data("select2",this)};return c.Extend(e,c.Observable),e.prototype._generateId=function(a){var b="";return b=null!=a.attr("id")?a.attr("id"):null!=a.attr("name")?a.attr("name")+"-"+c.generateChars(2):c.generateChars(4),b=b.replace(/(:|\.|\[|\]|,)/g,""),b="select2-"+b},e.prototype._placeContainer=function(a){a.insertAfter(this.$element);var b=this._resolveWidth(this.$element,this.options.get("width"));null!=b&&a.css("width",b)},e.prototype._resolveWidth=function(a,b){var c=/^width:(([-+]?([0-9]*\.)?[0-9]+)(px|em|ex|%|in|cm|mm|pt|pc))/i;if("resolve"==b){var d=this._resolveWidth(a,"style");return null!=d?d:this._resolveWidth(a,"element")}if("element"==b){var e=a.outerWidth(!1);return e<=0?"auto":e+"px"}if("style"==b){var f=a.attr("style");if("string"!=typeof f)return null;for(var g=f.split(";"),h=0,i=g.length;h<i;h+=1){var j=g[h].replace(/\s/g,""),k=j.match(c);if(null!==k&&k.length>=1)return k[1]}return null}return b},e.prototype._bindAdapters=function(){this.dataAdapter.bind(this,this.$container),this.selection.bind(this,this.$container),this.dropdown.bind(this,this.$container),this.results.bind(this,this.$container)},e.prototype._registerDomEvents=function(){var b=this;this.$element.on("change.select2",function(){b.dataAdapter.current(function(a){b.trigger("selection:update",{data:a})})}),this.$element.on("focus.select2",function(a){b.trigger("focus",a)}),this._syncA=c.bind(this._syncAttributes,this),this._syncS=c.bind(this._syncSubtree,this),this.$element[0].attachEvent&&this.$element[0].attachEvent("onpropertychange",this._syncA);var d=window.MutationObserver||window.WebKitMutationObserver||window.MozMutationObserver;null!=d?(this._observer=new d(function(c){a.each(c,b._syncA),a.each(c,b._syncS)}),this._observer.observe(this.$element[0],{attributes:!0,childList:!0,subtree:!1})):this.$element[0].addEventListener&&(this.$element[0].addEventListener("DOMAttrModified",b._syncA,!1),this.$element[0].addEventListener("DOMNodeInserted",b._syncS,!1),this.$element[0].addEventListener("DOMNodeRemoved",b._syncS,!1))},e.prototype._registerDataEvents=function(){var a=this;this.dataAdapter.on("*",function(b,c){a.trigger(b,c)})},e.prototype._registerSelectionEvents=function(){var b=this,c=["toggle","focus"];this.selection.on("toggle",function(){b.toggleDropdown()}),this.selection.on("focus",function(a){b.focus(a)}),this.selection.on("*",function(d,e){-1===a.inArray(d,c)&&b.trigger(d,e)})},e.prototype._registerDropdownEvents=function(){var a=this;this.dropdown.on("*",function(b,c){a.trigger(b,c)})},e.prototype._registerResultsEvents=function(){var a=this;this.results.on("*",function(b,c){a.trigger(b,c)})},e.prototype._registerEvents=function(){var a=this;this.on("open",function(){a.$container.addClass("select2-container--open")}),this.on("close",function(){a.$container.removeClass("select2-container--open")}),this.on("enable",function(){a.$container.removeClass("select2-container--disabled")}),this.on("disable",function(){a.$container.addClass("select2-container--disabled")}),this.on("blur",function(){a.$container.removeClass("select2-container--focus")}),this.on("query",function(b){a.isOpen()||a.trigger("open",{}),this.dataAdapter.query(b,function(c){a.trigger("results:all",{data:c,query:b})})}),this.on("query:append",function(b){this.dataAdapter.query(b,function(c){a.trigger("results:append",{data:c,query:b})})}),this.on("keypress",function(b){var c=b.which;a.isOpen()?c===d.ESC||c===d.TAB||c===d.UP&&b.altKey?(a.close(),b.preventDefault()):c===d.ENTER?(a.trigger("results:select",{}),b.preventDefault()):c===d.SPACE&&b.ctrlKey?(a.trigger("results:toggle",{}),b.preventDefault()):c===d.UP?(a.trigger("results:previous",{}),b.preventDefault()):c===d.DOWN&&(a.trigger("results:next",{}),b.preventDefault()):(c===d.ENTER||c===d.SPACE||c===d.DOWN&&b.altKey)&&(a.open(),b.preventDefault())})},e.prototype._syncAttributes=function(){this.options.set("disabled",this.$element.prop("disabled")),this.options.get("disabled")?(this.isOpen()&&this.close(),this.trigger("disable",{})):this.trigger("enable",{})},e.prototype._syncSubtree=function(a,b){var c=!1,d=this;if(!a||!a.target||"OPTION"===a.target.nodeName||"OPTGROUP"===a.target.nodeName){if(b)if(b.addedNodes&&b.addedNodes.length>0)for(var e=0;e<b.addedNodes.length;e++){var f=b.addedNodes[e];f.selected&&(c=!0)}else b.removedNodes&&b.removedNodes.length>0&&(c=!0);else c=!0;c&&this.dataAdapter.current(function(a){d.trigger("selection:update",{data:a})})}},e.prototype.trigger=function(a,b){var c=e.__super__.trigger,d={open:"opening",close:"closing",select:"selecting",unselect:"unselecting",clear:"clearing"};if(void 0===b&&(b={}),a in d){var f=d[a],g={prevented:!1,name:a,args:b};if(c.call(this,f,g),g.prevented)return void(b.prevented=!0)}c.call(this,a,b)},e.prototype.toggleDropdown=function(){this.options.get("disabled")||(this.isOpen()?this.close():this.open())},e.prototype.open=function(){this.isOpen()||this.trigger("query",{})},e.prototype.close=function(){this.isOpen()&&this.trigger("close",{})},e.prototype.isOpen=function(){return this.$container.hasClass("select2-container--open")},e.prototype.hasFocus=function(){return this.$container.hasClass("select2-container--focus")},e.prototype.focus=function(a){this.hasFocus()||(this.$container.addClass("select2-container--focus"),this.trigger("focus",{}))},e.prototype.enable=function(a){this.options.get("debug")&&window.console&&console.warn&&console.warn('Select2: The `select2("enable")` method has been deprecated and will be removed in later Select2 versions. Use $element.prop("disabled") instead.'),null!=a&&0!==a.length||(a=[!0]);var b=!a[0];this.$element.prop("disabled",b)},e.prototype.data=function(){this.options.get("debug")&&arguments.length>0&&window.console&&console.warn&&console.warn('Select2: Data can no longer be set using `select2("data")`. You should consider setting the value instead using `$element.val()`.');var a=[];return this.dataAdapter.current(function(b){a=b}),a},e.prototype.val=function(b){if(this.options.get("debug")&&window.console&&console.warn&&console.warn('Select2: The `select2("val")` method has been deprecated and will be removed in later Select2 versions. Use $element.val() instead.'),null==b||0===b.length)return this.$element.val();var c=b[0];a.isArray(c)&&(c=a.map(c,function(a){return a.toString()})),this.$element.val(c).trigger("change")},e.prototype.destroy=function(){this.$container.remove(),this.$element[0].detachEvent&&this.$element[0].detachEvent("onpropertychange",this._syncA),null!=this._observer?(this._observer.disconnect(),this._observer=null):this.$element[0].removeEventListener&&(this.$element[0].removeEventListener("DOMAttrModified",this._syncA,!1),this.$element[0].removeEventListener("DOMNodeInserted",this._syncS,!1),this.$element[0].removeEventListener("DOMNodeRemoved",this._syncS,!1)),this._syncA=null,this._syncS=null,this.$element.off(".select2"),this.$element.attr("tabindex",c.GetData(this.$element[0],"old-tabindex")),this.$element.removeClass("select2-hidden-accessible"),this.$element.attr("aria-hidden","false"),c.RemoveData(this.$element[0]),this.$element.removeData("select2"),this.dataAdapter.destroy(),this.selection.destroy(),this.dropdown.destroy(),this.results.destroy(),this.dataAdapter=null,this.selection=null,this.dropdown=null,this.results=null},e.prototype.render=function(){var b=a('<span class="select2 select2-container"><span class="selection"></span><span class="dropdown-wrapper" aria-hidden="true"></span></span>');return b.attr("dir",this.options.get("dir")),this.$container=b,this.$container.addClass("select2-container--"+this.options.get("theme")),c.StoreData(b[0],"element",this.$element),b},e}),b.define("jquery-mousewheel",["jquery"],function(a){return a}),b.define("jquery.select2",["jquery","jquery-mousewheel","./select2/core","./select2/defaults","./select2/utils"],function(a,b,c,d,e){if(null==a.fn.select2){var f=["open","close","destroy"];a.fn.select2=function(b){if("object"==typeof(b=b||{}))return this.each(function(){var d=a.extend(!0,{},b);new c(a(this),d)}),this;if("string"==typeof b){var d,g=Array.prototype.slice.call(arguments,1);return this.each(function(){var a=e.GetData(this,"select2");null==a&&window.console&&console.error&&console.error("The select2('"+b+"') method was called on an element that is not using Select2."),d=a[b].apply(a,g)}),a.inArray(b,f)>-1?this:d}throw new Error("Invalid arguments for Select2: "+b)}}return null==a.fn.select2.defaults&&(a.fn.select2.defaults=d),c}),{define:b.define,require:b.require}}(),c=b.require("jquery.select2");return a.fn.select2.amd=b,c});
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/FindReplace/FindReplace.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/FindReplace/FindReplace.js
deleted file mode 100644
index 065e683..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/FindReplace/FindReplace.js
+++ /dev/null
@@ -1,42 +0,0 @@
-/*---------------------------------------*\

- Find and Replace Plugin for HTMLArea-3.0

- -----------------------------------------

- author: Cau guanabara 

- e-mail: caugb@ibest.com.br

-\*---------------------------------------*/

-

-function FindReplace(editor) {

-this.editor = editor;

-var cfg = editor.config;

-var self = this;

-cfg.registerButton("FR-findreplace", this._lc("Find and Replace"),

-                   editor.imgURL("ed_find.gif", "FindReplace"), false,

-                   function(editor) { self.buttonPress(editor); });

-cfg.addToolbarElement(["FR-findreplace","separator"], ["formatblock","fontsize","fontname"], -1);

-}

-

-FindReplace.prototype.buttonPress = function(editor) { 

-FindReplace.editor = editor;

-var sel = editor.getSelectedHTML();

-  if(/\w/.test(sel)) {

-  sel = sel.replace(/<[^>]*>/g,"");

-  sel = sel.replace(/&nbsp;/g,"");

-  }

-var param = /\w/.test(sel) ? {fr_pattern: sel} : null;

-editor._popupDialog("plugin://FindReplace/find_replace", null, param);

-};

-

-FindReplace._pluginInfo = {

-  name          : "FindReplace",

-  version       : "1.0 - beta",

-  developer     : "Cau Guanabara",

-  developer_url : "mailto:caugb@ibest.com.br",

-  c_owner       : "Cau Guanabara",

-  sponsor       : "Independent production",

-  sponsor_url   : "http://www.netflash.com.br/gb/HA3-rc1/examples/find-replace.html",

-  license       : "htmlArea"

-};

-

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

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

-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/FindReplace/fr_engine.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/FindReplace/fr_engine.js
deleted file mode 100644
index 1248484..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/FindReplace/fr_engine.js
+++ /dev/null
@@ -1,149 +0,0 @@
-/*---------------------------------------*\

- Find and Replace Plugin for HTMLArea-3.0

- -----------------------------------------

- author: Cau guanabara 

- e-mail: caugb@ibest.com.br

-\*---------------------------------------*/

-

-var FindReplace = window.opener.FindReplace;

-var editor = FindReplace.editor;

-var is_mo = window.opener.Xinha.is_gecko;

-var tosearch = '';

-var pater = null;

-var buffer = null;

-var matches = 0;

-var replaces = 0;

-var fr_spans = new Array();

-function _lc(string) {

-    return(window.opener.Xinha._lc(string, 'FindReplace'));

-}

-function execSearch(params) {

-var ihtml = editor._doc.body.innerHTML;

-  if(buffer == null) 

-    buffer = ihtml;

-    

-  if(params['fr_pattern'] != tosearch) {

-    if(tosearch != '')

-      clearDoc();

-  tosearch = params['fr_pattern'];

-  }

-  

-  if(matches == 0) {

-  er = params['fr_words'] ? "/(?!<[^>]*)(\\b"+params['fr_pattern']+"\\b)(?![^<]*>)/g" :

-                            "/(?!<[^>]*)("+params['fr_pattern']+")(?![^<]*>)/g";

-    if(!params['fr_matchcase'])

-      er += "i"; 

-

-  pater = eval(er);

-  

-  var tago = '<span id=frmark>';

-  var tagc = '</span>';

-  var newHtml = ihtml.replace(pater,tago+"$1"+tagc);

-  

-  editor.setHTML(newHtml);

-  

-  var getallspans = editor._doc.body.getElementsByTagName("span"); 

-    for (var i = 0; i < getallspans.length; i++) 

-      if(/^frmark/.test(getallspans[i].id))

-        fr_spans.push(getallspans[i]);

-  }

-

-spanWalker(params['fr_pattern'],params['fr_replacement'],params['fr_replaceall']);

-}

-

-function spanWalker(pattern,replacement,replaceall) {

-var foundtrue = false;

-clearMarks();

-

-  for (var i = matches; i < fr_spans.length; i++) {

-  var elm = fr_spans[i];

-  foundtrue = true;

-    if(!(/[0-9]$/.test(elm.id))) { 

-    matches++;

-    disab('fr_clear',false);

-    elm.id = 'frmark_'+matches;

-    elm.style.color = 'white';

-    elm.style.backgroundColor = 'highlight';

-    elm.style.fontWeight = 'bold';

-    elm.scrollIntoView(false);

-      if(/\w/.test(replacement)) {

-        if(replaceall || confirm(_lc("Substitute this occurrence?"))) {

-        elm.firstChild.replaceData(0,elm.firstChild.data.length,replacement);

-        replaces++;

-        disab('fr_undo',false);

-        }

-        if(replaceall) {

-        clearMarks();

-        continue;

-        }

-      }

-    break;

-    }

-  }

-  var last = (i >= fr_spans.length - 1);

-  if(last || !foundtrue) { // EOF

-  var message = _lc("Done")+':\n\n';

-    if(matches > 0) {

-      if(matches == 1) message += matches+' '+_lc("found item");

-      else             message += matches+' '+_lc("found items");

-      if(replaces > 0) {

-        if(replaces == 1) message += ',\n'+replaces+' '+_lc("replaced item");

-        else              message += ',\n'+replaces+' '+_lc("replaced items");

-      }

-    hiliteAll();

-    disab('fr_hiliteall',false);

-    } else { message += '"'+pattern+'" '+_lc("not found"); }

-  alert(message+'.');

-  }

-}

-

-function clearDoc() {

-var doc = editor._doc.body.innerHTML; 

-var er = /(<span\s+[^>]*id=.?frmark[^>]*>)([^<>]*)(<\/span>)/gi;

-editor._doc.body.innerHTML = doc.replace(er,"$2");

-pater = null;

-tosearch = '';

-fr_spans = new Array();

-matches = 0;

-replaces = 0;

-disab("fr_hiliteall,fr_clear",true);

-}

-

-function clearMarks() {

-var getall = editor._doc.body.getElementsByTagName("span"); 

-  for (var i = 0; i < getall.length; i++) {

-  var elm = getall[i];

-    if(/^frmark/.test(elm.id)) {

-    var objStyle = editor._doc.getElementById(elm.id).style;

-    objStyle.backgroundColor = "";

-    objStyle.color = "";

-    objStyle.fontWeight = "";

-    }

-  }

-}

-

-function hiliteAll() { 

-var getall = editor._doc.body.getElementsByTagName("span"); 

-  for (var i = 0; i < getall.length; i++) {

-  var elm = getall[i];

-    if(/^frmark/.test(elm.id)) { 

-    var objStyle = editor._doc.getElementById(elm.id).style;

-    objStyle.backgroundColor = "highlight";

-    objStyle.color = "white";

-    objStyle.fontWeight = "bold";

-    }

-  }

-}

-

-function resetContents() { 

-  if(buffer == null) return;

-var transp = editor._doc.body.innerHTML;

-editor._doc.body.innerHTML = buffer;

-buffer = transp;

-}

-

-function disab(elms,toset) { 

-var names = elms.split(/[,; ]+/);

-  for(var i = 0; i < names.length; i++) 

-    document.getElementById(names[i]).disabled = toset;

-}
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/FindReplace/img/ed_find.gif b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/FindReplace/img/ed_find.gif
deleted file mode 100644
index 11877d4..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/FindReplace/img/ed_find.gif
+++ /dev/null
Binary files differ
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/FindReplace/lang/cz.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/FindReplace/lang/cz.js
deleted file mode 100644
index 1b9782a..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/FindReplace/lang/cz.js
+++ /dev/null
@@ -1,13 +0,0 @@
-// I18N constants
-// LANG: "cz", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Replace with:": "Zaměnit za"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/FindReplace/lang/da.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/FindReplace/lang/da.js
deleted file mode 100644
index d2e66ed..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/FindReplace/lang/da.js
+++ /dev/null
@@ -1,14 +0,0 @@
-// I18N constants
-// LANG: "da", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Clear": "Fortryd",
-    "Replace with:": "Erstat med"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/FindReplace/lang/de.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/FindReplace/lang/de.js
deleted file mode 100644
index 3cd6f83..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/FindReplace/lang/de.js
+++ /dev/null
@@ -1,32 +0,0 @@
-// I18N constants
-// LANG: "de", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Case sensitive search": "Groß-/Kleinschreibung",
-    "Clear": "Nächstes ersetzen",
-    "Done": "Fertig",
-    "Enter the text you want to find": "Geben Sie einen Text ein den Sie finden möchten",
-    "Find and Replace": "Suchen und ersetzen",
-    "Highlight": "Hervorheben",
-    "Inform a replacement word": "Geben sie einen Text zum ersetzen ein",
-    "Next": "Nächster",
-    "Options": "Optionen",
-    "Replace with:": "Ersetzen durch:",
-    "Search for:": "Suchen nach:",
-    "Substitute all occurrences": "alle Treffer ersetzen",
-    "Substitute this occurrence?": "Treffer ersetzen?",
-    "Undo": "Rückgängig",
-    "Whole words only": "Ganze Wörter",
-    "found item": "Treffer",
-    "found items": "alle Treffer",
-    "not found": "kein Teffer",
-    "replaced item": "ersetzter Treffer",
-    "replaced items": "ersetzte Treffer"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/FindReplace/lang/es.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/FindReplace/lang/es.js
deleted file mode 100644
index 85c96c1..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/FindReplace/lang/es.js
+++ /dev/null
@@ -1,13 +0,0 @@
-// I18N constants
-// LANG: "es", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Clear": "Eliminar"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/FindReplace/lang/fr.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/FindReplace/lang/fr.js
deleted file mode 100644
index 7fa49e0..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/FindReplace/lang/fr.js
+++ /dev/null
@@ -1,32 +0,0 @@
-// I18N constants
-// LANG: "fr", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Case sensitive search": "Recherche sensible à la casse",
-    "Clear": "Effacer",
-    "Done": "Fin",
-    "Enter the text you want to find": "Texte à trouver",
-    "Find and Replace": "Chercher et Remplacer",
-    "Highlight": "Surligner",
-    "Inform a replacement word": "Indiquez un mot de remplacement",
-    "Next": "Suivant",
-    "Options": "Options",
-    "Replace with:": "Remplacer par",
-    "Search for:": "Chercher",
-    "Substitute all occurrences": "Remplacer toutes les occurences",
-    "Substitute this occurrence?": "Remplacer cette occurrence ?",
-    "Undo": "Annuler",
-    "Whole words only": "Mots entiers seulement",
-    "found item": "élément trouvé",
-    "found items": "éléments trouvés",
-    "not found": "non trouvé",
-    "replaced item": "élément remplacé",
-    "replaced items": "éléments remplacés"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/FindReplace/lang/he.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/FindReplace/lang/he.js
deleted file mode 100644
index 3bb688c..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/FindReplace/lang/he.js
+++ /dev/null
@@ -1,13 +0,0 @@
-// I18N constants
-// LANG: "he", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Replace with:": "החלף ב-"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/FindReplace/lang/hu.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/FindReplace/lang/hu.js
deleted file mode 100644
index 6032d97..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/FindReplace/lang/hu.js
+++ /dev/null
@@ -1,13 +0,0 @@
-// I18N constants
-// LANG: "hu", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Replace with:": "Csere a következőre:"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/FindReplace/lang/ja.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/FindReplace/lang/ja.js
deleted file mode 100644
index c4c050f..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/FindReplace/lang/ja.js
+++ /dev/null
@@ -1,32 +0,0 @@
-// I18N constants
-// LANG: "ja", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Case sensitive search": "大文字/小文字区別",
-    "Clear": "通常表示",
-    "Done": "終了",
-    "Enter the text you want to find": "検索したいテキストを入力します",
-    "Find and Replace": "検索/置換",
-    "Highlight": "強調表示",
-    "Inform a replacement word": "単語の置換を知らせる",
-    "Next": "次を検索",
-    "Options": "設定",
-    "Replace with:": "置換:",
-    "Search for:": "検索:",
-    "Substitute all occurrences": "すべて置換",
-    "Substitute this occurrence?": "置換しますか?",
-    "Undo": "元に戻す",
-    "Whole words only": "完全一致のみ",
-    "found item": "件が検索されました",
-    "found items": "件が検索されました",
-    "not found": "はありません",
-    "replaced item": "件が置換されました",
-    "replaced items": "件が置換されました"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/FindReplace/lang/lc_base.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/FindReplace/lang/lc_base.js
deleted file mode 100644
index a6731e2..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/FindReplace/lang/lc_base.js
+++ /dev/null
@@ -1,45 +0,0 @@
-// I18N constants
-//
-// LANG: "en", ENCODING: UTF-8
-// Author: Translator-Name, <email@example.com>
-//
-// Last revision: 2018-04-12
-// 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).
-//
-// (Please, remove information below)
-// 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.)
-
-{
-    "';\r\n  var tagc = '": "",
-    "Case sensitive search": "",
-    "Clear": "",
-    "Done": "",
-    "Enter the text you want to find": "",
-    "Find and Replace": "",
-    "Highlight": "",
-    "Inform a replacement word": "",
-    "Next": "",
-    "Options": "",
-    "Replace with:": "",
-    "Search for:": "",
-    "Substitute all occurrences": "",
-    "Substitute this occurrence?": "",
-    "Undo": "",
-    "Whole words only": "",
-    "found item": "",
-    "found items": "",
-    "not found": "",
-    "replaced item": "",
-    "replaced items": ""
-}
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/FindReplace/lang/nb.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/FindReplace/lang/nb.js
deleted file mode 100644
index dde306f..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/FindReplace/lang/nb.js
+++ /dev/null
@@ -1,32 +0,0 @@
-// I18N constants
-// LANG: "nb", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Case sensitive search": "Skille mellom store og små bokstaver",
-    "Clear": "Tøm",
-    "Done": "Ferdig",
-    "Enter the text you want to find": "Skriv inn teksten du ønsker å finne",
-    "Find and Replace": "Søk og erstatt",
-    "Highlight": "Uthev",
-    "Inform a replacement word": "Vennligst skriv inn et erstatningsord / setning",
-    "Next": "Neste",
-    "Options": "Valg",
-    "Replace with:": "Erstatt med:",
-    "Search for:": "Søk etter:",
-    "Substitute all occurrences": "Erstatt alle treff",
-    "Substitute this occurrence?": "Vennligst bekreft at du vil erstatte?",
-    "Undo": "Tilbake",
-    "Whole words only": "Bare hele ord",
-    "found item": "Treff",
-    "found items": "forekomster funnet i søket",
-    "not found": "ikke funnet",
-    "replaced item": "erstattet treff",
-    "replaced items": "forekomster erstattet"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/FindReplace/lang/nl.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/FindReplace/lang/nl.js
deleted file mode 100644
index 0a28f75..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/FindReplace/lang/nl.js
+++ /dev/null
@@ -1,32 +0,0 @@
-// I18N constants
-// LANG: "nl", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Case sensitive search": "Exact zoeken",
-    "Clear": "Leeg",
-    "Done": "Voltooien",
-    "Enter the text you want to find": "Voer tekst in waar je op wilt zoeken",
-    "Find and Replace": "Zoek en vervang",
-    "Highlight": "Markeren",
-    "Inform a replacement word": "Voer een vervang woord of zin in",
-    "Next": "Volgende",
-    "Options": "Opties",
-    "Replace with:": "Vervang met:",
-    "Search for:": "Zoek naar:",
-    "Substitute all occurrences": "Vervang alle overeenkomsten",
-    "Substitute this occurrence?": "Deze overeenkomst vervangen?",
-    "Undo": "Ongedaan maken",
-    "Whole words only": "Alleen hele woorden",
-    "found item": "gevonden overeenkomst",
-    "found items": "gevonden overeenkomsten",
-    "not found": "niet gevonden",
-    "replaced item": "vervangen item",
-    "replaced items": "vervangen items"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/FindReplace/lang/pl.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/FindReplace/lang/pl.js
deleted file mode 100644
index 07eaf53..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/FindReplace/lang/pl.js
+++ /dev/null
@@ -1,32 +0,0 @@
-// I18N constants
-// LANG: "pl", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Case sensitive search": "Wg wielkości liter",
-    "Clear": "Wyczyść",
-    "Done": "Gotowe",
-    "Enter the text you want to find": "Podaj tekst, jaki chcesz wyszukać",
-    "Find and Replace": "Znajdź i zamień",
-    "Highlight": "Podświetl",
-    "Inform a replacement word": "Podaj tekst do zamiany",
-    "Next": "Następny",
-    "Options": "Opcje",
-    "Replace with:": "Zamień na:",
-    "Search for:": "Szukaj:",
-    "Substitute all occurrences": "Zamień wszystkie wystąpienia",
-    "Substitute this occurrence?": "Zamienić to wystąpienie?",
-    "Undo": "Cofnij",
-    "Whole words only": "Całe słowa",
-    "found item": "znaleziony",
-    "found items": "znalezionych",
-    "not found": "nie znaleziony",
-    "replaced item": "zamieniony",
-    "replaced items": "zamienionych"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/FindReplace/lang/pt_br.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/FindReplace/lang/pt_br.js
deleted file mode 100644
index 4c4274e..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/FindReplace/lang/pt_br.js
+++ /dev/null
@@ -1,32 +0,0 @@
-// I18N constants
-// LANG: "pt_br", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Case sensitive search": "Procura diferenciada Maiúsculas/Minúsculas",
-    "Clear": "Limpar",
-    "Done": "Executado",
-    "Enter the text you want to find": "Forneça o texto que deseja procurar",
-    "Find and Replace": "Procurar e Substituir",
-    "Highlight": "Marcar",
-    "Inform a replacement word": "Informe uma palavra para substituir",
-    "Next": "Próxima",
-    "Options": "Opções",
-    "Replace with:": "Substituir por:",
-    "Search for:": "Procurar por:",
-    "Substitute all occurrences": "Substituir todas as ocorrências",
-    "Substitute this occurrence?": "Substituir todas as ocorrências?",
-    "Undo": "Desfazer",
-    "Whole words only": "Apenas palavras inteiras",
-    "found item": "Item encontrado",
-    "found items": "Itens encontrados",
-    "not found": "nada encontrado",
-    "replaced item": "substituir item",
-    "replaced items": "substituir itens"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/FindReplace/lang/ro.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/FindReplace/lang/ro.js
deleted file mode 100644
index 6e6d491..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/FindReplace/lang/ro.js
+++ /dev/null
@@ -1,13 +0,0 @@
-// I18N constants
-// LANG: "ro", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Replace with:": "Înlocuieşte cu"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/FindReplace/lang/ru.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/FindReplace/lang/ru.js
deleted file mode 100644
index e3641cc..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/FindReplace/lang/ru.js
+++ /dev/null
@@ -1,32 +0,0 @@
-// I18N constants
-// LANG: "ru", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Case sensitive search": "Поиск с учетом регистра",
-    "Clear": "Очистить",
-    "Done": "OK",
-    "Enter the text you want to find": "Введите текст, который вы хотите найти",
-    "Find and Replace": "Найти и заменить",
-    "Highlight": "Выделить",
-    "Inform a replacement word": "Показать замещающее слово",
-    "Next": "След.",
-    "Options": "Опции",
-    "Replace with:": "Заменить с",
-    "Search for:": "Найти",
-    "Substitute all occurrences": "Заменить все вхождения",
-    "Substitute this occurrence?": "Заменить это вхождение?",
-    "Undo": "Отменить",
-    "Whole words only": "Только слова целиком",
-    "found item": "найти",
-    "found items": "найти",
-    "not found": "не найдено",
-    "replaced item": "замененная",
-    "replaced items": "замененные"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/FindReplace/lang/sv.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/FindReplace/lang/sv.js
deleted file mode 100755
index 022cd91..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/FindReplace/lang/sv.js
+++ /dev/null
@@ -1,32 +0,0 @@
-// I18N constants
-// LANG: "sv", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Case sensitive search": "Skilj mellan stora och små bokstäver",
-    "Clear": "Töm",
-    "Done": "Färdig",
-    "Enter the text you want to find": "Skriv in text du vill söka",
-    "Find and Replace": "Sök och ersätt",
-    "Highlight": "Markera",
-    "Inform a replacement word": "Skriv in ett ersättningsord",
-    "Next": "Nästa",
-    "Options": "Välj",
-    "Replace with:": "Ersätt med:",
-    "Search for:": "Sök efter:",
-    "Substitute all occurrences": "Erstatt alla träffar",
-    "Substitute this occurrence?": "Ersätt denna?",
-    "Undo": "Tillbaka",
-    "Whole words only": "Bara hela ord",
-    "found item": "Träff",
-    "found items": "förekomster funna i sökningen",
-    "not found": "inte funnet",
-    "replaced item": "erstatt träff",
-    "replaced items": "förekomster erstatta"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/FindReplace/popups/find_replace.html b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/FindReplace/popups/find_replace.html
deleted file mode 100644
index 3a0fc09..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/FindReplace/popups/find_replace.html
+++ /dev/null
@@ -1,162 +0,0 @@
-<html>
-<head>
-  <title>Find and Replace</title>
-<!--
-/*---------------------------------------*\
- Find and Replace Plugin for HTMLArea-3.0
- -----------------------------------------
- author: Cau guanabara 
- e-mail: caugb@ibest.com.br
-\*---------------------------------------*/
--->
-<script type="text/javascript" src="../fr_engine.js"></script>
-<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(335, 250);
-
-var accepted = {
-                'fr_pattern'       : true,
-                'fr_replacement'   : true,
-                'fr_words'         : true,
-                'fr_matchcase'     : true,
-                'fr_replaceall'    : true
-               };
-
-function Init() {
-__dlg_translate('FindReplace');
-__dlg_init();
-
-disab("fr_undo,fr_clear,fr_hiliteall",true);
-
-var params = window.dialogArguments;
-  if(params) {
-  document.getElementById('fr_pattern').value = params["fr_pattern"];
-  document.getElementById('fr_replacement').focus();
-  } else {
-  document.getElementById('fr_pattern').focus();
-  }
-  
-document.body.onkeypress = __dlg_key_press;
-}
-
-function onCancel() {
-  clearDoc();
-  __dlg_close(null);
-  return false;
-}
-
-function onOK() {
-  var required = {'fr_pattern' : _lc("Enter the text you want to find")};
-  for (var i in required) {
-    var el = document.getElementById(i);
-      if (!el.value) {
-        alert(required[i]);
-        el.focus();
-        return false;
-      }
-  }
-
-  var param = {};
-  for (var i in accepted) {
-  var el = document.getElementById(i);
-  param[i] = el.type == 'checkbox' ? el.checked : el.value;
-  }
-  execSearch(param);
-  return false;
-}
-
-function __dlg_key_press(ev) {
-ev || (ev = window.event);
-  switch(ev.keyCode) {
-    case 13:
-    document.getElementById('fr_go').click();
-    document.getElementById('fr_pattern').focus();
-      break;
-    case 27:
-    clearDoc();
-    window.close();
-    return false;
-  }
-return true;
-}
-
-</script>
-
-<style type="text/css">
-table .label { text-align: right; width: 12em; }
-.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;
-}
-.buttons { border-top: 1px solid #999; padding: 2px; text-align: right; }
-.hrstyle { border-width: 1px; border-color: #666; width: 95%; padding: 2px; }
-</style>
-  </head>
-  <body class="dialog" onload="Init()">
-  <div class="title">Find and Replace</div>
-  <form action="" method="get">
-  <table border="0" style="width: 100%; padding: 2px;"><!---->
-    <tbody>
-      <tr> 
-        <td width="29%" style="text-align: right; vertical-align: bottom;">Search for:</td>
-        <td width="71%" colspan="2" style="vertical-align: bottom;"> 
-        <input id="fr_pattern" type="text" style="width: 200px" onFocus="this.select();"> 
-        </td>
-      </tr>
-      <tr> 
-        <td style="text-align: right;">Replace with:</td>
-        <td colspan="2"> 
-        <input id="fr_replacement" type="text" style="width: 200px" onFocus="this.select();"> 
-        </td>
-      </tr>
-      <tr> 
-        <td colspan="3"><table width="100%" border="0" cellpadding="1" cellspacing="0">
-            <tr> 
-              <td width="78%" style="padding: 2px">
-              <FIELDSET style="width:90%; padding: 5px">
-                <LEGEND><span>Options</span></LEGEND>
-                  <input id="fr_words" type="checkbox" checked onClick="clearDoc();" value="on">
-                <span onClick="e = document.getElementById('fr_words'); 
-                e.click(); e.focus();" style="cursor:default"> 
-                  <span>Whole words only</span></span><br />
-                  <input id="fr_matchcase" type="checkbox" onClick="clearDoc();" value="on">
-                <span onClick="e = document.getElementById('fr_matchcase'); 
-                e.click(); e.focus();" style="cursor:default"> 
-                  <span>Case sensitive search</span></span><br />
-                  <input id="fr_replaceall" type="checkbox" onClick="
-                  if(document.getElementById('fr_replacement').value == '') {
-                  alert(_lc('Inform a replacement word'));
-                  return false;
-                  }
-                  clearDoc();" value="on">
-                <span onClick="e = document.getElementById('fr_replaceall'); 
-                e.click(); e.focus();" style="cursor:default"> 
-                  <span>Substitute all occurrences</span></span>
-                </FIELDSET></td>
-<td width="22%" style="vertical-align: bottom; text-align: right; padding: 4px"> 
-<button type="button" id="fr_clear" onClick="clearMarks()">Clear</button>
-<div class="space"></div>
-<button type="button" id="fr_hiliteall" onClick="hiliteAll()">Highlight</button>
-<div class="space"></div>
-<button type="button" id="fr_undo" onClick="resetContents();">Undo</button>
-</td>
-            </tr>
-          </table></td>
-      </tr>
-    </tbody>
-  </table>
-<div style="border-top: 1px solid #999; padding: 2px; padding: 5px; text-align: right; height: 20px"><button type="button" id="fr_go" onclick="return onOK();">Next</button>
-<button type="button" name="cancel" onclick="return onCancel();">Done</button>
-</div>
-</form>
-</body>
-</html>
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/FormOperations/FormOperations.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/FormOperations/FormOperations.js
deleted file mode 100644
index 112892d..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/FormOperations/FormOperations.js
+++ /dev/null
@@ -1,756 +0,0 @@
-
-  /*--------------------------------------:noTabs=true:tabSize=2:indentSize=2:--
-    --  FormOperations Plugin
-    --
-    --  $HeadURL: http://svn.xinha.org/trunk/plugins/FormOperations/FormOperations.js $
-    --  $LastChangedDate: 2008-10-13 06:42:42 +1300 (Mon, 13 Oct 2008) $
-    --  $LastChangedRevision: 1084 $
-    --  $LastChangedBy: ray $
-    --------------------------------------------------------------------------*/
-
-Xinha.Config.prototype.FormOperations =
-{
-  // format for fields where multiple values may be selected
-  //    'php'          => FieldName[]
-  //    'unmodified'   => FieldName
-  'multiple_field_format': 'php',
-  'allow_edit_form'      : false,
-  'default_form_action'  : Xinha.getPluginDir('FormOperations') + '/formmail.php',
-  'default_form_html'    : Xinha._geturlcontent(Xinha.getPluginDir('FormOperations') + '/default_form.html')
-};
-
-FormOperations._pluginInfo =
-{
-  name     : "FormOperations",
-  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/"
-};
-
-function FormOperations(editor)
-{
-  this.editor = editor;
-  this.panel  = false;
-  this.html   = false;
-  this.ready  = false;
-  this.activeElement = null;
-  this._preparePanel();
-
-
-  editor.config.pageStyleSheets.push(Xinha.getPluginDir('FormOperations') + '/iframe.css');
-
-  var toolbar =
-  [
-    'separator',
-    'insert_form',
-    'insert_text_field',
-    'insert_textarea_field',
-    'insert_select_field',
-    'insert_cb_field',
-    'insert_rb_field',
-    'insert_button'
-  ];
-
-  this.editor.config.toolbar.push(toolbar);
-
-  function pasteAndSelect(htmlTag)
-  {
-    var id = Xinha.uniq('fo');
-    htmlTag = htmlTag.replace(/^<([^ \/>]+)/i, '<$1 id="'+id+'"');
-    editor.insertHTML(htmlTag);
-    var el = editor._doc.getElementById(id);
-    el.setAttribute('id', '');
-    editor.selectNodeContents(el);
-    editor.updateToolbar();
-    return el;
-  }
-
-  var buttonsImage = editor.imgURL('buttons.gif', 'FormOperations');
-
-  FormOperations.prototype._lc = function(string) {
-    return Xinha._lc(string, 'FormOperations');
-  };
-
-  this.editor.config.btnList.insert_form =
-  [ this._lc("Insert a Form."),
-    [buttonsImage, 0, 0],
-    false,
-    function()
-    {
-      var form = null;
-      if(editor.config.FormOperations.default_form_html)
-      {
-        form = pasteAndSelect(editor.config.FormOperations.default_form_html);
-      }
-      else
-      {
-        form = pasteAndSelect('<form>&nbsp;</form>');
-      }
-
-      if(editor.config.FormOperations.default_form_action && !form.action)
-      {
-        form.action = editor.config.FormOperations.default_form_action;
-      }
-    }
-  ];
-
-  this.editor.config.btnList.insert_text_field =
-  [ this._lc("Insert a text, password or hidden field."),
-    [buttonsImage, 1, 0],
-    false,
-    function()
-    {
-      pasteAndSelect('<input type="text" />');
-    },
-    'form'
-  ];
-
-  this.editor.config.btnList.insert_textarea_field =
-  [ this._lc("Insert a multi-line text field."),
-    [buttonsImage, 2, 0],
-    false,
-    function()
-    {
-      pasteAndSelect('<textarea> </textarea>');
-    },
-    'form'
-  ];
-
-  this.editor.config.btnList.insert_select_field =
-  [ this._lc("Insert a select field."),
-    [buttonsImage, 3, 0],
-    false,
-    function()
-    {
-      pasteAndSelect('<select> <option value="">Please Select...</option> </select>');
-    },
-    'form'
-  ];
-
-  this.editor.config.btnList.insert_cb_field =
-  [ this._lc("Insert a check box."),
-    [buttonsImage, 4, 0],
-    false,
-    function()
-    {
-      pasteAndSelect('<input type="checkbox" />');
-    },
-    'form'
-  ];
-
-  this.editor.config.btnList.insert_rb_field =
-  [ this._lc("Insert a radio button."),
-    [buttonsImage, 5, 0],
-    false,
-    function()
-    {
-      pasteAndSelect('<input type="radio" />');
-    },
-    'form'
-  ];
-
-  this.editor.config.btnList.insert_button =
-  [ this._lc("Insert a submit/reset button."),
-    [buttonsImage, 6, 0],
-    false,
-    function()
-    {
-      pasteAndSelect('<input type="submit" value="Send" />');
-    },
-    'form'
-  ];
-}
-
-FormOperations.prototype.onGenerate = function()
-{
-  // Gecko does not register click events on select lists inside the iframe
-  // so the only way of detecting that is to do an event on mouse move.
-  if( Xinha.is_gecko)
-  {
-    var editor = this.editor;
-    var doc    = this.editor._doc;
-    Xinha._addEvents
-    (doc, ["mousemove"],
-     function (event) {
-       return editor._editorEvent(event);
-     });
-  }
-};
-
-FormOperations.prototype._preparePanel = function ()
-{
-  var fo = this;
-  if(this.html == false)
-  {
-
-    Xinha._getback(Xinha.getPluginDir('FormOperations') + '/panel.html',
-      function(txt)
-      {
-        fo.html = txt;
-        fo._preparePanel();
-      }
-    );
-    return false;
-  }
-
-  if(typeof Xinha.Dialog == 'undefined')
-  {
-    Xinha._loadback
-      (_editor_url + 'modules/Dialogs/XinhaDialog.js', function() { fo._preparePanel(); } );
-      return false;
-  }
-
-  if(typeof Xinha.PanelDialog == 'undefined')
-  {
-    Xinha._loadback
-      (_editor_url + 'modules/Dialogs/panel-dialog.js', function() { fo._preparePanel(); } );
-      return false;
-  }
-
-
-
-  this.panel = new Xinha.PanelDialog(this.editor,'bottom',this.html,'FormOperations');
-  this.panel.hide();
-  this.ready = true;
-};
-
-FormOperations.prototype.onUpdateToolbar = function()
-{
-  if(!this.ready) return true;
-  var activeElement = this.editor._activeElement(this.editor._getSelection());
-  if(activeElement != null)
-  {
-    if(activeElement == this.activeElement) return true;
-
-    var tag = activeElement.tagName.toLowerCase();
-    
-    this.hideAll();
-    if(tag === 'form')
-    {
-      if(this.editor.config.FormOperations.allow_edit_form)
-      {
-        this.showForm(activeElement);
-      }
-      else
-      {
-        this.panel.hide();
-        this.activeElement = null;
-        this.panel.hide();
-        return true;
-      }
-    }
-    else
-    {
-
-      if(this.editor.config.FormOperations.allow_edit_form && typeof activeElement.form != 'undefined' && activeElement.form)
-      {
-        this.showForm(activeElement.form);
-      }
-
-      switch(tag)
-      {
-        case 'form':
-        {
-          this.showForm(activeElement);
-        }
-        break;
-
-        case 'input':
-        {
-          switch(activeElement.getAttribute('type').toLowerCase())
-          {
-            case 'text'    :
-            case 'password':
-            case 'hidden'  :
-            {
-              this.showText(activeElement);
-            }
-            break;
-
-            case 'radio'   :
-            case 'checkbox':
-            {
-              this.showCbRd(activeElement);
-            }
-            break;
-
-            case 'submit'  :
-            case 'reset'   :
-            case 'button'  :
-            {
-              this.showButton(activeElement);
-            }
-            break;
-          }
-        }
-        break;
-
-        case 'textarea':
-        {
-          this.showTextarea(activeElement);
-        }
-        break;
-
-        case 'select':
-        {
-          this.showSelect(activeElement);
-        }
-        break;
-
-        default:
-        {
-          this.activeElement = null;
-          this.panel.hide();
-          return true;
-        }
-      }
-    }
-    
-    this.panel.show();
-    
-    //this.editor.scrollToElement(activeElement);
-    this.activeElement = activeElement;
-    return true;
-  }
-  else
-  {
-    this.activeElement = null;
-    this.panel.hide();
-    return true;
-  }
-};
-
-
-FormOperations.prototype.hideAll = function()
-{
-  this.panel.getElementById('fs_form').style.display = 'none';
-  this.panel.getElementById('fs_text').style.display = 'none';
-  this.panel.getElementById('fs_textarea').style.display = 'none';
-  this.panel.getElementById('fs_select').style.display = 'none';
-  this.panel.getElementById('fs_cbrd').style.display = 'none';
-  this.panel.getElementById('fs_button').style.display = 'none';
-};
-
-FormOperations.prototype.showForm = function(form)
-{
-  this.panel.getElementById('fs_form').style.display = '';
-  var vals =
-  {
-    'action' : form.action,
-    'method' : form.method.toUpperCase()
-  }
-  this.panel.setValues(vals);
-  var f = form;
-  this.panel.getElementById('action').onkeyup = function () { f.action = this.value; };
-  this.panel.getElementById('method').onchange   = function () { f.method = this.options[this.selectedIndex].value; };
-};
-
-FormOperations.prototype.showText = function (input)
-{
-  this.panel.getElementById('fs_text').style.display = '';
-
-  var vals =
-  {
-    'text_name'  : this.deformatName(input, input.name),
-    'text_value' : input.value,
-    'text_type'  : input.type.toLowerCase(),
-    'text_width' : input.style.width ? parseFloat(input.style.width.replace(/[^0-9.]/, '')) : '',
-    'text_width_units': input.style.width ? input.style.width.replace(/[0-9.]/, '').toLowerCase() : 'ex',
-    'text_maxlength'  : input.maxlength   ? input.maxlength : ''
-  }
-  this.panel.setValues(vals);
-
-  var i = input;
-  var fo = this;
-
-  this.panel.getElementById('text_name').onkeyup   = function () { i.name = fo.formatName(i, this.value); }
-  this.panel.getElementById('text_value').onkeyup  = function () { i.value = this.value; }
-  this.panel.getElementById('text_type').onchange   = function ()
-    {
-      if(!Xinha.is_ie)
-      {
-        i.type = this.options[this.selectedIndex].value;
-      }
-      else
-      {
-        // IE does not permit modifications of the type of a form field once it is set
-        // We therefor have to destroy and recreate it.  I swear, if I ever
-        // meet any of the Internet Explorer development team I'm gonna
-        // kick them in the nuts!
-        var tmpContainer = fo.editor._doc.createElement('div');
-        if(!/type=/.test(i.outerHTML))
-        {
-          tmpContainer.innerHTML = i.outerHTML.replace(/<INPUT/i, '<input type="'+ this.options[this.selectedIndex].value + '"');
-        }
-        else
-        {
-          tmpContainer.innerHTML = i.outerHTML.replace(/type="?[a-z]+"?/i, 'type="' + this.options[this.selectedIndex].value + '"');
-        }
-        var newElement = Xinha.removeFromParent(tmpContainer.childNodes[0]);
-        i.parentNode.insertBefore(newElement, i);
-        Xinha.removeFromParent(i);
-        input = i = newElement;
-      }
-    }
-
-  var w  = this.panel.getElementById('text_width');
-  var wu = this.panel.getElementById('text_width_units');
-
-  this.panel.getElementById('text_width').onkeyup     =
-  this.panel.getElementById('text_width_units').onchange =
-    function ()
-    {
-      if(!w.value || isNaN(parseFloat(w.value)))
-      {
-        i.style.width = '';
-      }
-      i.style.width = parseFloat(w.value) + wu.options[wu.selectedIndex].value;
-    }
-
-  this.panel.getElementById('text_maxlength').onkeyup = function () { i.maxlength = this.value; }
-};
-
-FormOperations.prototype.showCbRd = function (input)
-{
-  this.panel.getElementById('fs_cbrd').style.display = '';
-  var vals =
-  {
-    'cbrd_name'    : this.deformatName(input, input.name),
-    'cbrd_value'   : input.value,
-    'cbrd_checked' : input.checked ? 1 : 0,
-    'cbrd_type'    : input.type.toLowerCase()
-  };
-  this.panel.setValues(vals);
-
-  var i = input;
-  var fo = this;
-  this.panel.getElementById('cbrd_name').onkeyup   = function () { i.name = fo.formatName(i, this.value); }
-  this.panel.getElementById('cbrd_value').onkeyup  = function () { i.value = this.value; }
-  this.panel.getElementById('cbrd_type').onchange   = function ()
-    {
-      if(!Xinha.is_ie)
-      {
-        i.type = this.options[this.selectedIndex].value;
-      }
-      else
-      {
-        // IE does not permit modifications of the type of a form field once it is set
-        // We therefor have to destroy and recreate it.  I swear, if I ever
-        // meet any of the Internet Explorer development team I'm gonna
-        // kick them in the nuts!
-        var tmpContainer = fo.editor._doc.createElement('div');
-        if(!/type=/.test(i.outerHTML))
-        {
-          tmpContainer.innerHTML = i.outerHTML.replace(/<INPUT/i, '<input type="'+ this.options[this.selectedIndex].value + '"');
-        }
-        else
-        {
-          tmpContainer.innerHTML = i.outerHTML.replace(/type="?[a-z]+"?/i, 'type="' + this.options[this.selectedIndex].value + '"');
-        }
-        var newElement = Xinha.removeFromParent(tmpContainer.childNodes[0]);
-        i.parentNode.insertBefore(newElement, i);
-        Xinha.removeFromParent(i);
-        input = i = newElement;
-      }
-    }
-  this.panel.getElementById('cbrd_checked').onclick   = function () { i.checked = this.checked; }
-};
-
-FormOperations.prototype.showButton = function (input)
-{
-  this.panel.getElementById('fs_button').style.display = '';
-  var vals =
-  {
-    'button_name'    : this.deformatName(input, input.name),
-    'button_value'   : input.value,
-    'button_type'    : input.type.toLowerCase()
-  };
-  this.panel.setValues(vals);
-
-  var i = input;
-  var fo = this;
-  this.panel.getElementById('button_name').onkeyup   = function () { i.name = fo.formatName(i, this.value); };
-  this.panel.getElementById('button_value').onkeyup  = function () { i.value = this.value; };
-  this.panel.getElementById('button_type').onchange   = function ()
-    {
-      if(!Xinha.is_ie)
-      {
-        i.type = this.options[this.selectedIndex].value;
-      }
-      else
-      {
-        // IE does not permit modifications of the type of a form field once it is set
-        // We therefor have to destroy and recreate it.  I swear, if I ever
-        // meet any of the Internet Explorer development team I'm gonna
-        // kick them in the nuts!
-        var tmpContainer = fo.editor._doc.createElement('div');
-        if(!/type=/.test(i.outerHTML))
-        {
-          tmpContainer.innerHTML = i.outerHTML.replace(/<INPUT/i, '<input type="'+ this.options[this.selectedIndex].value + '"');
-        }
-        else
-        {
-          tmpContainer.innerHTML = i.outerHTML.replace(/type="?[a-z]+"?/i, 'type="' + this.options[this.selectedIndex].value + '"');
-        }
-        var newElement = Xinha.removeFromParent(tmpContainer.childNodes[0]);
-        i.parentNode.insertBefore(newElement, i);
-        Xinha.removeFromParent(i);
-        input = i = newElement;
-      }
-    };
-};
-
-FormOperations.prototype.showTextarea = function (input)
-{
-  this.panel.getElementById('fs_textarea').style.display = '';
-  var vals =
-  {
-    'textarea_name'  : this.deformatName(input, input.name),
-    'textarea_value' : input.value,
-    'textarea_width' : input.style.width ? parseFloat(input.style.width.replace(/[^0-9.]/, '')) : '',
-    'textarea_width_units' : input.style.width ? input.style.width.replace(/[0-9.]/, '').toLowerCase() : 'ex',
-    'textarea_height'      : input.style.height ? parseFloat(input.style.height.replace(/[^0-9.]/, '')) : '',
-    'textarea_height_units': input.style.height ? input.style.height.replace(/[0-9.]/, '').toLowerCase() : 'ex'
-  };
-
-  this.panel.setValues(vals);
-
-  var i = input;
-  var fo = this;
-  this.panel.getElementById('textarea_name').onkeyup   = function () { i.name = fo.formatName(i, this.value); };
-  this.panel.getElementById('textarea_value').onkeyup  = function () { i.value = i.innerHTML = this.value; };
-
-  var w  = this.panel.getElementById('textarea_width');
-  var wu = this.panel.getElementById('textarea_width_units');
-
-  this.panel.getElementById('textarea_width').onkeyup     =
-  this.panel.getElementById('textarea_width_units').onchange =
-    function ()
-    {
-      if(!w.value || isNaN(parseFloat(w.value)))
-      {
-        i.style.width = '';
-      }
-      i.style.width = parseFloat(w.value) + wu.options[wu.selectedIndex].value;
-    };
-
-  var h  = this.panel.getElementById('textarea_height');
-  var hu = this.panel.getElementById('textarea_height_units');
-
-  this.panel.getElementById('textarea_height').onkeyup     =
-  this.panel.getElementById('textarea_height_units').onchange =
-    function ()
-    {
-      if(!h.value || isNaN(parseFloat(h.value)))
-      {
-        i.style.height = '';
-      }
-      i.style.height = parseFloat(h.value) + hu.options[hu.selectedIndex].value;
-    };
-
-};
-
-FormOperations.prototype.showSelect = function (input)
-{
-  this.panel.getElementById('fs_select').style.display = '';
-  var vals =
-  {
-    'select_name'  : this.deformatName(input, input.name),
-    'select_multiple' : input.multiple ? 1 : 0,
-    'select_width' : input.style.width ? parseFloat(input.style.width.replace(/[^0-9.]/, '')) : '',
-    'select_width_units' : input.style.width ? input.style.width.replace(/[0-9.]/, '').toLowerCase() : 'ex',
-      'select_height'      : input.style.height ? parseFloat(input.style.height.replace(/[^0-9.]/, '')) : (input.size && input.size > 0 ? input.size : 1),
-    'select_height_units': input.style.height ? input.style.height.replace(/[0-9.]/, '').toLowerCase() : 'items'
-  };
-
-  this.panel.setValues(vals);
-
-  var i = input;
-  var fo = this;
-  this.panel.getElementById('select_name').onkeyup   = function () { i.name = fo.formatName(i, this.value); };
-  this.panel.getElementById('select_multiple').onclick   = function () { i.multiple = this.checked; };
-
-  var w  = this.panel.getElementById('select_width');
-  var wu = this.panel.getElementById('select_width_units');
-
-  this.panel.getElementById('select_width').onkeyup     =
-  this.panel.getElementById('select_width_units').onchange =
-    function ()
-    {
-      if(!w.value || isNaN(parseFloat(w.value)))
-      {
-        i.style.width = '';
-      }
-      i.style.width = parseFloat(w.value) + wu.options[wu.selectedIndex].value;
-    };
-
-  var h  = this.panel.getElementById('select_height');
-  var hu = this.panel.getElementById('select_height_units');
-
-  this.panel.getElementById('select_height').onkeyup     =
-  this.panel.getElementById('select_height_units').onchange =
-    function ()
-    {
-      if(!h.value || isNaN(parseFloat(h.value)))
-      {
-        i.style.height = '';
-        return;
-      }
-
-      if(hu.selectedIndex == 0)
-      {
-        i.style.height = '';
-        i.size = parseInt(h.value);
-      }
-      else
-      {
-        i.style.height = parseFloat(h.value) + hu.options[hu.selectedIndex].value;
-      }
-    };
-
-
-  var fo_sel = this.panel.getElementById('select_options');
-  this.arrayToOpts(this.optsToArray(input.options), fo_sel.options);
-
-  this.panel.getElementById('add_option').onclick =
-    function()
-    {
-      var txt = prompt(Xinha._lc("Enter the name for new option.", 'FormOperations'));
-      if(txt == null) return;
-      var newOpt = new Option(txt);
-      var opts   = fo.optsToArray(fo_sel.options);
-      if(fo_sel.selectedIndex >= 0)
-      {
-        opts.splice(fo_sel.selectedIndex, 0, newOpt);
-      }
-      else
-      {
-        opts.push(newOpt);
-      }
-      fo.arrayToOpts(opts, input.options);
-      fo.arrayToOpts(opts, fo_sel.options);
-    };
-
-  this.panel.getElementById('del_option').onclick =
-    function()
-    {
-      var opts    = fo.optsToArray(fo_sel.options);
-      var newOpts = [ ];
-      for(var i = 0; i < opts.length; i++)
-      {
-        if(opts[i].selected) continue;
-        newOpts.push(opts[i]);
-      }
-      fo.arrayToOpts(newOpts, input.options);
-      fo.arrayToOpts(newOpts, fo_sel.options);
-    };
-
-  this.panel.getElementById('up_option').onclick =
-    function()
-    {
-      if(!(fo_sel.selectedIndex > 0)) return;
-      var opts    = fo.optsToArray(fo_sel.options);
-      var move    = opts.splice(fo_sel.selectedIndex, 1).pop();
-      opts.splice(fo_sel.selectedIndex - 1, 0, move);
-      fo.arrayToOpts(opts, input.options);
-      fo.arrayToOpts(opts, fo_sel.options);
-    };
-
-  this.panel.getElementById('down_option').onclick =
-    function()
-    {
-      if(fo_sel.selectedIndex == fo_sel.options.length - 1) return;
-      var opts    = fo.optsToArray(fo_sel.options);
-      var move    = opts.splice(fo_sel.selectedIndex, 1).pop();
-      opts.splice(fo_sel.selectedIndex+1, 0, move);
-      fo.arrayToOpts(opts, input.options);
-      fo.arrayToOpts(opts, fo_sel.options);
-    };
-
-  this.panel.getElementById('select_options').onchange =
-    function()
-    {
-      fo.arrayToOpts(fo.optsToArray(fo_sel.options), input.options);
-    };
-};
-
-FormOperations.prototype.optsToArray = function(o)
-{
-  var a = [ ];
-  for(var i = 0; i < o.length; i++)
-  {
-    a.push(
-      {
-        'text'            : o[i].text,
-        'value'           : o[i].value,
-        'defaultSelected' : o[i].defaultSelected,
-        'selected'        : o[i].selected
-      }
-    );
-  }
-  return a;
-};
-
-FormOperations.prototype.arrayToOpts = function(a, o)
-{
-  for(var i = o.length -1; i >= 0; i--)
-  {
-    o[i] = null;
-  }
-
-  for(var i = 0; i < a.length; i++)
-  {
-    o[i] = new Option(a[i].text, a[i].value, a[i].defaultSelected, a[i].selected);
-  }
-};
-
-FormOperations.prototype.formatName = function(input, name)
-{
-
-  // Multiple name
-  var mname = name;
-  switch(this.editor.config.FormOperations.multiple_field_format)
-  {
-    case 'php':
-    {
-      mname += '[]';
-    }
-    break;
-
-    case 'unmodified':
-    {
-      // Leave as is.
-    }
-    break;
-
-    default:
-    {
-      throw("Unknown multiple field format " + this.editor.config.FormOperations.multiple_field_format);
-    }
-  }
-
-  if
-  (
-       (input.tagName.toLowerCase() == 'select' && input.multiple)
-    || (input.tagName.toLowerCase() == 'input'  && input.type.toLowerCase() == 'checkbox')
-  )
-  {
-    name = mname;
-  }
-
-  return name;
-};
-
-FormOperations.prototype.deformatName = function(input, name)
-{
-  if(this.editor.config.FormOperations.multiple_field_format == 'php')
-  {
-    name = name.replace(/\[\]$/, '');
-  }
-
-  return name;
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/FormOperations/README b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/FormOperations/README
deleted file mode 100644
index d816c67..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/FormOperations/README
+++ /dev/null
@@ -1,32 +0,0 @@
-Form Operations Plugin
-----------------------
-
-Usage:
-  1. Follow the standard procedure for loading a plugin.
-  2. You may configure the plugin by setting the following configuration variables, or leave them as the defaults.
-
-      xinha_config.FormOperations.multiple_field_format
-        = 'php'
-              this will cause checkbox and "multiple" select fields to have []
-              appended to thier field names silently
-        = 'unmodified'
-              field names will not be silently modified
-
-      xinha_config.FormOperations.allow_edit_form
-        = true
-              the user will be able to edit the action, and method of forms
-        = false
-              neither action, nor method is editable
-
-      xinha_config.FormOperations.default_form_action
-        = 'whatever you want'
-              the default form action to set when inserting a form.  The standard one is a php file in the Form Operations directory which will email the form post to enquiries@<server hostname here>
-
-      xinha_config.FormOperations.default_form_html
-        = '<form>whatever you want here</form>'
-              the default html to insert when inserting a form.  The standard one is a basic contact form.  If you would like to specify an external file which contains the HTML for the form, you may do so via
-              = HTMLArea._geturlcontent('http://absolute/url/to/file.html')
-              see default_form.html for a suitable example, pay attention to the form tag.
-
-
-
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/FormOperations/default_form.html b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/FormOperations/default_form.html
deleted file mode 100644
index 9e7d4e1..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/FormOperations/default_form.html
+++ /dev/null
@@ -1,36 +0,0 @@
-<form>
-  <table class="contact_form">
-    <caption>Contact Us</caption>
-    <tbody>
-      <tr>
-        <th>Your name:</th>
-        <td><input type="text" name="Name" value="" /></td>
-      </tr>
-      <tr>
-        <th>Your email:</th>
-        <td><input type="text" name="Email" value="" /></td>
-      </tr>
-      <tr>
-        <th>Message Subject:</th>
-        <td><input type="text" name="Subject" value="" /></td>
-      </tr>
-      <tr>
-        <th>What are your hobbies?</th>
-        <td>
-          <input type="checkbox" value="Marbles" name="Hobbies[]" /> Marbles <br />
-          <input type="checkbox" value="Conkers" name="Hobbies[]" /> Conkers <br />
-          <input type="checkbox" value="Jacks" name="Hobbies[]" /> Jacks
-        </td>
-      </tr>
-      <tr>
-        <th>Message Body:</th>
-      </tr>
-      <tr>
-        <td colspan="2">
-          <textarea name="Message"> </textarea>
-        </td>
-      </tr>
-    </tbody>
-  </table>
-  <input type="submit" value="Send" /> &nbsp;&nbsp; <input type="reset" value="Reset" />
-</form>
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/FormOperations/formmail.php b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/FormOperations/formmail.php
deleted file mode 100644
index 5d8b328..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/FormOperations/formmail.php
+++ /dev/null
@@ -1,95 +0,0 @@
-<?php
-
-  $send_to      = 'Website Enquiries <enquiries@' . preg_replace('/^www./', '', $_SERVER['HTTP_HOST']) . '>';
-
-  $emailfield   = NULL;
-  $subjectfield = NULL;
-  $namefield    = NULL;
-
-  $when_done_goto    = isset($_REQUEST['when_done_goto']) ? $_REQUEST['when_done_goto'] : NULL;
-
-  if($_POST)
-  {
-    unset($_POST['when_done_goto']);
-    $message    = '';
-    $longestKey = 0;
-    foreach(array_keys($_POST) as $key)
-    {
-      $longestKey = max(strlen($key), $longestKey);
-    }
-    $longestKey = max($longestKey, 15);
-
-    foreach($_POST as $Var => $Val)
-    {
-      if(!$emailfield)
-      {
-        if(preg_match('/(^|\s)e-?mail(\s|$)/i', $Var))
-        {
-          $emailfield = $Var;
-        }
-      }
-
-      if(!$subjectfield)
-      {
-        if(preg_match('/(^|\s)subject(\s|$)/i', $Var))
-        {
-          $subjectfield = $Var;
-        }
-      }
-
-      if(!$namefield)
-      {
-        if(preg_match('/(^|\s)from(\s|$)/i', $Var) || preg_match('/(^|\s)name(\s|$)/i', $Var))
-        {
-          $namefield = $Var;
-        }
-      }
-
-      if(is_array($Val))
-      {
-        $Val = implode(', ', $Val);
-      }
-
-      $message .= $Var;
-      if(strlen($Var) < $longestKey)
-      {
-        $message .= str_repeat('.', $longestKey - strlen($Var));
-      }
-      $message .= ':';
-      if((64 - max(strlen($Var), $longestKey) < strlen($Val)) || preg_match('/\r?\n/', $Val))
-      {
-        $message .= "\r\n  ";
-        $message .= preg_replace('/\r?\n/', "\r\n  ", wordwrap($Val, 62));
-      }
-      else
-      {
-        $message .= ' ' . $Val . "\r\n";
-      }
-    }
-
-    $subject = $subjectfield ? $_POST[$subjectfield] : 'Enquiry';
-    $email   = $emailfield   ? $_POST[$emailfield]   :  $send_to;
-    if($namefield)
-    {
-      $from = $_POST[$namefield] . ' <' . $email . '>';
-    }
-    else
-    {
-      $from = 'Website Visitor' . ' <' . $email . '>';
-    }
-
-    mail($send_to, $subject, $message, "From: $from");
-
-    if(!$when_done_goto)
-    {
-      ?>
-      <html><head><title>Message Sent</title></head><body><h1>Message Sent</h1></body></html>
-      <?php
-    }
-    else
-    {
-      header("location: $when_done_goto");
-      exit;
-    }
-  }
-?>
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/FormOperations/iframe.css b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/FormOperations/iframe.css
deleted file mode 100644
index 2ee1dce..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/FormOperations/iframe.css
+++ /dev/null
@@ -1 +0,0 @@
-form { border: 1px red dotted; }
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/FormOperations/img/buttons.gif b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/FormOperations/img/buttons.gif
deleted file mode 100644
index f414171..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/FormOperations/img/buttons.gif
+++ /dev/null
Binary files differ
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/FormOperations/lang/de.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/FormOperations/lang/de.js
deleted file mode 100644
index 84a82a2..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/FormOperations/lang/de.js
+++ /dev/null
@@ -1,19 +0,0 @@
-// I18N constants
-// LANG: "de", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Insert a Form.": "Email Form einfügen.",
-    "Insert a check box.": "Häkchenfeld einfügen",
-    "Insert a multi-line text field.": "Mehrzeiliges Textfeld einfügen.",
-    "Insert a radio button.": "Optionsfeld einfügen",
-    "Insert a select field.": "Auswahlfeld einfügen.",
-    "Insert a submit/reset button.": "Senden/zurücksetzen Schaltfläche",
-    "Insert a text, password or hidden field.": "Passwort oder unsichtbares Feld einfügen."
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/FormOperations/lang/fr.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/FormOperations/lang/fr.js
deleted file mode 100644
index 9bd740a..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/FormOperations/lang/fr.js
+++ /dev/null
@@ -1,19 +0,0 @@
-// I18N constants
-// LANG: "fr", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Insert a Form.": "Insérer un formulaire",
-    "Insert a check box.": "Insérer une case à cocher",
-    "Insert a multi-line text field.": "Insérer un champ texte à lignes multiples",
-    "Insert a radio button.": "Insérer un bouton radio",
-    "Insert a select field.": "Insérer une boite de sélection",
-    "Insert a submit/reset button.": "Insérer un bouton de soumission/annulation",
-    "Insert a text, password or hidden field.": "Insérer un texte, un mot de passe ou un champ invisible"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/FormOperations/lang/ja.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/FormOperations/lang/ja.js
deleted file mode 100644
index 7a8976b..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/FormOperations/lang/ja.js
+++ /dev/null
@@ -1,61 +0,0 @@
-// I18N constants
-// LANG: "ja", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Enter the name for new option.": "新しい選択肢に名前をつけてください。",
-    "Form Editor": "フォームエディタ",
-    "Insert a Form.": "フォームを挿入",
-    "Insert a check box.": "チェックボックスを挿入",
-    "Insert a multi-line text field.": "複数行テキストフィールドを挿入",
-    "Insert a radio button.": "ラジオボタンを挿入",
-    "Insert a select field.": "選択リストを挿入",
-    "Insert a submit/reset button.": "送信/リセットボタンを挿入",
-    "Insert a text, password or hidden field.": "テキスト/パスワード/非表示フィールドを挿入",
-    "__OBSOLETE__": {
-        "%": "%",
-        "Action:": "アクション:",
-        "Add": "追加",
-        "Button": "ボタン",
-        "Check Box (\"Select Many\")": "チェックボックス(複数選択)",
-        "Check Box/Radio Button": "チェックボックス/ラジオボタン",
-        "Delete": "削除",
-        "Drop-Down/List Field": "ドロップダウン/リスト",
-        "Form": "フォーム",
-        "GET": "GET",
-        "Height:": "高さ:",
-        "Initial Value": "初期値",
-        "Initial Value:": "初期値:",
-        "Label:": "ラベル:",
-        "Max Length:": "最大長:",
-        "May Choose Multiple:": "複数選択可能:",
-        "Method:": "メソッド:",
-        "Move Down": "下へ",
-        "Move Up": "上へ",
-        "Multi-line Field": "複数行フィールド",
-        "Name:": "名前:",
-        "Options": "選択肢",
-        "POST": "POST",
-        "Radio Button (\"Select One\")": "ラジオボタン(単一選択)",
-        "Reset": "リセット",
-        "Selected by default:": "デフォルト選択:",
-        "Submit": "送信",
-        "Text Field": "テキストフィールド",
-        "Tip: Check boxes (select many) and radio buttons (select one only) that are choices for a single question should have the same Name to work correctly.": "ヒント:ひとつの質問について、複数のチェックボックス(複数選択)、または複数のラジオボタン(単一選択)がある場合、すべてに同じ名前を付けなければ正しく機能しません。",
-        "Type:": "タイプ:",
-        "Value:": "値:",
-        "Width:": "幅:",
-        "chars": "文字",
-        "hidden field": "非表示フィールド",
-        "items": "項目",
-        "normal text field": "標準テキストフィールド",
-        "password": "パスワード",
-        "px": "ピクセル"
-    }
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/FormOperations/lang/lc_base.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/FormOperations/lang/lc_base.js
deleted file mode 100644
index 8d5ab7b..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/FormOperations/lang/lc_base.js
+++ /dev/null
@@ -1,35 +0,0 @@
-// I18N constants
-//
-// LANG: "en", ENCODING: UTF-8
-// Author: Translator-Name, <email@example.com>
-//
-// Last revision: 2018-04-12
-// 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).
-//
-// (Please, remove information below)
-// 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.)
-
-{
-    "Enter the name for new option.": "",
-    "Form Editor": "",
-    "Insert a Form.": "",
-    "Insert a check box.": "",
-    "Insert a multi-line text field.": "",
-    "Insert a radio button.": "",
-    "Insert a select field.": "",
-    "Insert a submit/reset button.": "",
-    "Insert a text, password or hidden field.": "",
-    "Message Sent": "",
-    "Please Select...": ""
-}
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/FormOperations/lang/nb.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/FormOperations/lang/nb.js
deleted file mode 100644
index c57ccfd..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/FormOperations/lang/nb.js
+++ /dev/null
@@ -1,19 +0,0 @@
-// I18N constants
-// LANG: "nb", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Insert a Form.": "Sett inn skjema",
-    "Insert a check box.": "Hakeboks",
-    "Insert a multi-line text field.": "Sett inn tekstfelt med flere linjer",
-    "Insert a radio button.": "Sett inn en radioknapp",
-    "Insert a select field.": "Sett inn valgboks/ netrekksboks",
-    "Insert a submit/reset button.": "Sett inn send-/nullstill knapp for skjemaet",
-    "Insert a text, password or hidden field.": "Sett inn formfelt"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/FormOperations/lang/nl.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/FormOperations/lang/nl.js
deleted file mode 100644
index 786f824..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/FormOperations/lang/nl.js
+++ /dev/null
@@ -1,19 +0,0 @@
-// I18N constants
-// LANG: "nl", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Insert a Form.": "Formulier invoegen",
-    "Insert a check box.": "Een checkbox invoegen",
-    "Insert a multi-line text field.": "Een tekstveld met meerdere lijnen invoegen",
-    "Insert a radio button.": "Een radio knop invoegen",
-    "Insert a select field.": "Een selectielijst invoegen",
-    "Insert a submit/reset button.": "Een verzend/wis knop invoegen",
-    "Insert a text, password or hidden field.": "Tekst, wachtwoord of verborgen veld invoegen"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/FormOperations/lang/pt_br.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/FormOperations/lang/pt_br.js
deleted file mode 100644
index 49bc513..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/FormOperations/lang/pt_br.js
+++ /dev/null
@@ -1,21 +0,0 @@
-// I18N constants
-// LANG: "pt_br", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Enter the name for new option.": "Entre com o nome para nova opção",
-    "Form Editor": "Editor de Formulários",
-    "Insert a Form.": "Inserir um Formulário.",
-    "Insert a check box.": "Inserir uma caixa de opção",
-    "Insert a multi-line text field.": "Inserir um texto multi-linha.",
-    "Insert a radio button.": "Inserir um campo de escolha",
-    "Insert a select field.": "Inserir seleção.",
-    "Insert a submit/reset button.": "Inserir um botão de envio/reset",
-    "Insert a text, password or hidden field.": "Inserir um texto, senha ou campo escondido."
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/FormOperations/panel.html b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/FormOperations/panel.html
deleted file mode 100644
index 661b775..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/FormOperations/panel.html
+++ /dev/null
@@ -1,213 +0,0 @@
-<div>
-<h1 id="[h1]"><l10n>Form Editor</l10n></h1>
-  <fieldset id="[fs_form]">
-    <legend>Form</legend>
-    <table>
-      <tr>
-        <th><label>Action:</label></th>
-        <td><input type="text" size="25" name="[action]" id="[action]" /></td>
-
-        <th><label>Method:</label></th>
-        <td><select name="[method]" id="[method]"><option value="POST">POST</option><option value="GET">GET</option></select></td>
-      </tr>
-    </table>
-  </fieldset>
-
-  <fieldset id="[fs_text]">
-    <legend>Text Field</legend>
-
-    <table>
-      <tr>
-        <th>Name:</th>
-        <td>
-          <input type="text" name="[text_name]" id="[text_name]" size="25" />
-        </td>
-        <th>&nbsp;</th>
-        <td>&nbsp;</td>
-      </tr>
-      <tr>
-        <th>Type:</th>
-        <td>
-          <select name="[text_type]" id="[text_type]">
-            <option value="text">normal text field</option>
-            <option value="password">password</option>
-            <option value="hidden">hidden field</option>
-          </select>
-        </td>
-        <th>Initial Value:</th>
-        <td>
-          <input type="text" name="[text_value]" id="[text_value]" size="25" />
-        </td>
-      </tr>
-      <tr>
-        <th>Width:</th>
-        <td>
-          <input type="text" name="[text_width]" id="[text_width]" size="5" />
-          <select name="[text_width_units]" id="[text_width_units]">
-            <option value="em">chars</option>
-            <option value="px">px</option
-                >
-            <option value="%">%</option>
-          </select>
-        </td>
-        <th>Max Length:</th>
-        <td>
-          <input type="text" name="[text_maxlength]" id="[text_maxlength]"   size="5" />
-        </td>
-      </tr>
-    </table>
-  </fieldset>
-
-  <fieldset  id="[fs_cbrd]">
-    <legend>Check Box/Radio Button</legend>
-    <table>
-      <tr>
-        <th>Name:</th>
-        <td>
-          <input type="text" name="[cbrd_name]" id="[cbrd_name]" size="25" />
-        </td>
-        <th>Value:</th>
-        <td>
-          <input type="text" name="[cbrd_value]" id="[cbrd_value]" size="25" />
-        </td>
-      </tr>
-      <tr>
-        <th>Type:</th>
-        <td>
-          <select name="[cbrd_type]" id="[cbrd_type]">
-            <option value="checkbox">Check Box ("Select Many")</option>
-            <option value="radio">Radio Button ("Select One")</option>
-          </select>
-        </td>
-        <th>Selected by default:</th>
-        <td><input type="checkbox" name="[cbrd_checked]" id="[cbrd_checked]" value="1" /></td>
-      </tr>
-      <tr>
-        <td colspan="4">
-          <p class="help">
-            Tip: Check boxes (select many) and radio buttons (select one only) that are choices for a single question should have the same Name to work correctly.
-          </p>
-        </td>
-      </tr>
-    </table>
-  </fieldset>
-
-  <fieldset  id="[fs_button]">
-    <legend>Button</legend>
-    <table>
-      <tr>
-        <th>Name:</th>
-        <td>
-          <input type="text" name="[button_name]" id="[button_name]" size="25" />
-        </td>
-        <th>Label:</th>
-        <td>
-          <input type="text" name="[button_value]" id="[button_value]" size="25" />
-        </td>
-      </tr>
-      <tr>
-        <th>Type:</th>
-        <td>
-          <select name="[button_type]" id="[button_type]">
-            <option value="submit">Submit</option>
-            <option value="reset">Reset</option>
-          </select>
-        </td>
-        <td>&nbsp;</td>
-        <td>&nbsp;</td>
-      </tr>
-    </table>
-  </fieldset>
-
-
-  <fieldset  id="[fs_textarea]">
-    <legend>Multi-line Field</legend>
-    <table>
-      <tr>
-        <th>Name:</th>
-        <td><input type="text" name="[textarea_name]" id="[textarea_name]" size="25" /></td>
-
-    <th>Initial Value</th>
-      </tr>
-
-      <tr>
-        <th>Width:</th>
-        <td>
-          <input type="text" name="[textarea_width]" id="[textarea_width]" size="5" />
-          <select name="[textarea_width_units]" id="[textarea_width_units]">
-            <option value="em">chars</option>
-            <option value="px">px</option>
-            <option value="%">%</option>
-          </select>
-        </td>
-        <td rowspan="2"><textarea name="[textarea_value]" cols="40" rows="4" id="[textarea_value]"></textarea></td>
-      </tr>
-
-      <tr>
-        <th>Height:</th>
-        <td>
-          <input type="text" name="[textarea_height]" id="[textarea_height]" size="5" />
-          <select name="[textarea_height_units]" id="[textarea_height_units]">
-            <option value="em">chars</option>
-            <option value="px">px</option>
-          </select>
-        </td>
-      </tr>
-
-    </table>
-  </fieldset>
-
-  <fieldset  id="[fs_select]">
-    <legend>Drop-Down/List Field</legend>
-
-<table>
-  <tr>
-    <th>Name:</th>
-    <td>
-      <input type="text" name="[select_name]" id="[select_name]" size="25" />
-    </td>
-    <th colspan="2">Options</th>
-  </tr>
-  <tr>
-    <th>May Choose Multiple:</th>
-    <td>
-      <input type="checkbox" name="[select_multiple]" id="[select_multiple]" size="25" value="1" />
-    </td>
-    <td rowspan="3">
-      <select name="[select_options]" size="5" id="[select_options]" >
-      </select>
-    </td>
-    <td rowspan="3">
-      <input name="button" type="button" id="[add_option]" value="Add"       />
-      <br>
-      <input name="button2" type="button" id="[del_option]" value="Delete"    />
-      <br>
-      <input name="button2"  type="button" id="[up_option]" value="Move Up"   />
-      <br>
-      <input name="button2"  type="button" id="[down_option]" value="Move Down" />
-    </td>
-  </tr>
-  <tr>
-    <th>Width:</th>
-    <td>
-      <input type="text" name="[select_width]" id="[select_width]" size="5" />
-      <select name="[select_width_units]" id="[select_width_units]">
-        <option value="em">chars</option>
-        <option value="px">px</option>
-        <option value="%">%</option>
-      </select>
-    </td>
-  </tr>
-  <tr>
-    <th>Height:</th>
-    <td>
-      <input type="text" name="[select_height]" id="[select_height]" size="5" />
-      <select name="[select_height_units]" id="[select_height_units]">
-        <option value="items">items</option>
-        <option value="px">px</option>
-      </select>
-    </td>
-  </tr>
-</table>
-  </fieldset>
-</div>
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/Forms/Forms.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/Forms/Forms.js
deleted file mode 100644
index b27cd3b..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/Forms/Forms.js
+++ /dev/null
@@ -1,354 +0,0 @@
-// Form plugin for Xinha
-// Distributed under the same terms as HTMLArea itself.
-// This notice MUST stay intact for use (see license.txt).
-
-
-function Forms(editor) {
-  this.editor = editor;
-  var cfg = editor.config;
-  var bl = Forms.btnList;
-  var self = this;
-  // register the toolbar buttons provided by this plugin
-  var toolbar = ["linebreak"];
-  for (var i = 0; i < bl.length; ++i) {
-    var btn = bl[i];
-    if (!btn) {
-      toolbar.push("separator");
-    } else {
-      var id = btn[0];
-      if (i<3)
-        cfg.registerButton(id, this._lc(btn[1]), editor.imgURL("ed_" + btn[0] + ".gif", "Forms"), false,
-             function(editor, id) {
-               // dispatch button press event
-               self.buttonPress(editor, id);
-             });
-      else
-        cfg.registerButton(id, this._lc(btn[1]), editor.imgURL("ed_" + btn[0] + ".gif", "Forms"), false,
-             function(editor, id) {
-               // dispatch button press event
-               self.buttonPress(editor, id);
-             },"form");
-      toolbar.push(id);
-    }
-  }
-  // add a new line in the toolbar
-  cfg.toolbar.push(toolbar);
-}
-
-Forms._pluginInfo = {
-  name          : "Forms",
-  origin        : "version: 1.0, by Nelson Bright, BrightWork, Inc., http://www.brightworkweb.com",
-  version       : "2.0",
-  developer     : "Udo Schmal",
-  developer_url : "",
-  sponsor       : "L.N.Schaffrath NeueMedien",
-  sponsor_url   : "http://www.schaffrath-neuemedien.de/",
-  c_owner       : "Udo Schmal & Schaffrath-NeueMedien",
-  license       : "htmlArea"
-};
-
-// the list of buttons added by this plugin
-Forms.btnList = [
-  // form properties button
-  null, // separator
-  ["form",        "Form"],
-  null, // separator
-  // form elements
-  ["textarea",    "Textarea"],
-  ["select",      "Selection Field"],
-  ["checkbox",    "Checkbox"],
-  ["radio",       "Radio Button"],
-  ["text",        "Text Field"],
-  ["password",    "Password Field"],
-  ["file",        "File Field"],
-  ["button",      "Button"],
-  ["submit",      "Submit Button"],
-  ["reset",       "Reset Button"],
-  ["image",       "Image Button"],
-  ["hidden",      "Hidden Field"],
-  ["label",       "Label"],
-  ["fieldset",    "Field Set"]
-  ];
-
-Forms.prototype._lc = function(string) {
-    return Xinha._lc(string, 'Forms');
-};
-
-Forms.prototype.onGenerate = function() {
-  this.editor.addEditorStylesheet(Xinha.getPluginDir("Forms") + '/forms.css');
-};
-
-Forms.prototype.buttonPress = function(editor,button_id, node) {
-  function optionValues(text,value) {
-    this.text = text;
-    this.value = value;
-  }
-  var outparam = new Object();
-  var type = button_id;
-  var sel = editor._getSelection();
-  var range = editor._createRange(sel);
-  if (button_id=="form") { //Form
-    // see if selection is inside an existing 'form' tag
-    var pe = editor.getParentElement();
-    var frm = null;
-    while (pe && (pe.nodeType == 1) && (pe.tagName.toLowerCase() != 'body')) {
-      if(pe.tagName.toLowerCase() == "form") {
-        frm = pe;
-        break;
-      } else
-        pe = pe.parentNode;
-    }
-    if (frm) {
-      outparam.f_name = frm.name;
-      outparam.f_action = frm.action;
-      outparam.f_method = frm.method;
-      outparam.f_enctype = frm.enctype;
-      outparam.f_target = frm.target;
-    } else {;
-      outparam.f_name = "";
-      outparam.f_action = "";
-      outparam.f_method = "";
-      outparam.f_enctype = "";
-      outparam.f_target = "";
-    }
-    editor._popupDialog("plugin://Forms/form", function(param) {
-      if (param) {
-        if(frm) {
-          frm.name = param["f_name"];
-          frm.setAttribute("action", param["f_action"]);
-          frm.setAttribute("method", param["f_method"]);
-          frm.setAttribute("enctype",param["f_enctype"]);
-          frm.setAttribute("target", param["f_target"]);
-        } else {
-          frm = '<form name="' + param["f_name"] + '"';
-          if (param["f_action"] != "") frm += ' action="' + param["f_action"] + '"';
-          if (param["f_method"] != "") frm += ' method="' + param["f_method"] + '"';
-          if (param["f_enctype"] != "") frm += ' enctype="' + param["f_enctype"] + '"';
-          if (param["f_target"] != "") frm += ' target="' + param["f_target"] + '"';
-          frm += '>';
-          editor.surroundHTML(frm, '&nbsp;</form>');
-        }
-      }
-    }, outparam);
-
-  } else { // form element (checkbox, radio, text, password, textarea, select, button, submit, reset, image, hidden)
-    var tagName = "";
-    // see if selection is an form element
-    if (typeof node == "undefined") {
-      node = editor.getParentElement();
-      var tag = node.tagName.toLowerCase()
-      if (node && (tag == "legend")) {
-        node = node.parentElement;
-        tag = node.tagName.toLowerCase();
-      }
-      if (node && !(tag == "textarea" || tag == "select" || tag == "input" || tag == "label" || tag == "fieldset"))
-        node = null;
-    }
-
-    if(node) {
-      type = node.tagName.toLowerCase();
-      outparam.f_name = node.name;
-      tagName = node.tagName;
-      if (type == "input") {
-        outparam.f_type = node.type;
-        type = node.type;
-      }
-      switch (type) {
-        case "textarea":
-          outparam.f_cols = node.cols;
-          outparam.f_rows = node.rows;
-          outparam.f_text = node.innerHTML;
-          outparam.f_wrap = node.getAttribute("wrap");
-          outparam.f_readOnly = node.getAttribute("readOnly");
-          outparam.f_disabled = node.getAttribute("disabled");
-          outparam.f_tabindex = node.getAttribute("tabindex");
-          outparam.f_accesskey = node.getAttribute("accesskey");
-          break;
-        case "select":
-          outparam.f_size = parseInt(node.size);
-          outparam.f_multiple = node.getAttribute("multiple");
-          outparam.f_disabled = node.getAttribute("disabled");
-          outparam.f_tabindex = node.getAttribute("tabindex");
-          var a_options = new Array();
-          for (var i=0; i<=node.options.length-1; i++) {
-            a_options[i] = new optionValues(node.options[i].text, node.options[i].value);
-          }
-          outparam.f_options = a_options;
-          break;
-        case "text":
-        case "password":
-          outparam.f_value = node.value;
-          outparam.f_size = node.size;
-          outparam.f_maxLength = node.maxLength;
-          outparam.f_readOnly = node.getAttribute("readOnly");
-          outparam.f_disabled = node.getAttribute("disabled");
-          outparam.f_tabindex = node.getAttribute("tabindex");
-          outparam.f_accesskey = node.getAttribute("accesskey");
-          break;
-        case "hidden":
-          outparam.f_value = node.value;
-          break;
-        case "submit":
-        case "reset":
-          outparam.f_value = node.value;
-          outparam.f_disabled = node.getAttribute("disabled");
-          outparam.f_tabindex = node.getAttribute("tabindex");
-          outparam.f_accesskey = node.getAttribute("accesskey");
-          break;
-        case "checkbox":
-        case "radio":
-          outparam.f_value = node.value;
-          outparam.f_checked = node.checked;
-          outparam.f_disabled = node.getAttribute("disabled");
-          outparam.f_tabindex = node.getAttribute("tabindex");
-          outparam.f_accesskey = node.getAttribute("accesskey");
-          break;
-        case "button":
-          outparam.f_value = node.value;
-          outparam.f_onclick = node.getAttribute("onclick");
-          outparam.f_disabled = node.getAttribute("disabled");
-          outparam.f_tabindex = node.getAttribute("tabindex");
-          outparam.f_accesskey = node.getAttribute("accesskey");
-          break;
-        case "image":
-          outparam.f_value = node.value;
-          outparam.f_src = node.src;
-          outparam.f_disabled = node.getAttribute("disabled");
-          outparam.f_tabindex = node.getAttribute("tabindex");
-          outparam.f_accesskey = node.getAttribute("accesskey");
-          break;
-        case "file":
-          outparam.f_disabled = node.getAttribute("disabled");
-          outparam.f_tabindex = node.getAttribute("tabindex");
-          outparam.f_accesskey = node.getAttribute("accesskey");
-          break;
-        case "label":
-          outparam.f_text = node.innerHTML;
-          outparam.f_for = node.getAttribute("for");
-          outparam.f_accesskey = node.getAttribute("accesskey");
-          break;
-        case "fieldset":
-          if(node.firstChild.tagName.toLowerCase()=="legend")
-            outparam.f_text = node.firstChild.innerHTML;
-          else
-            outparam.f_text = "";
-          break;
-      }
-    } else {
-      outparam.f_name = "";
-      switch (button_id) {
-        case "textarea":
-        case "select":
-        case "label":
-        case "fieldset":
-          tagName = button_id;
-          break;
-        default:
-          tagName = "input";
-          outparam.f_type = button_id;
-          break;
-      }
-      outparam.f_options = "";
-      outparam.f_cols = "20";
-      outparam.f_rows = "4";
-      outparam.f_multiple = "false";
-      outparam.f_value = "";
-      outparam.f_size = "";
-      outparam.f_maxLength = "";
-      outparam.f_checked = "";
-      outparam.f_src = "";
-      outparam.f_onclick = "";
-      outparam.f_wrap = "";
-      outparam.f_readOnly = "false";
-      outparam.f_disabled = "false";
-      outparam.f_tabindex = "";
-      outparam.f_accesskey = "";
-      outparam.f_for = "";
-      outparam.f_text = "";
-      outparam.f_legend = "";
-    }
-    editor._popupDialog("plugin://Forms/" + tagName + ".html", function(param) {
-      if (param) {
-        if(param["f_cols"])
-          if (isNaN(parseInt(param["f_cols"],10)) || parseInt(param["f_cols"],10) <= 0)
-            param["f_cols"] = "";
-        if(param["f_rows"])
-          if(isNaN(parseInt(param["f_rows"],10)) || parseInt(param["f_rows"],10) <= 0)
-            param["f_rows"] = "";
-        if(param["f_size"])
-          if(isNaN(parseInt(param["f_size"],10)) || parseInt(param["f_size"],10) <= 0)
-            param["f_size"] = "";
-        if(param["f_maxlength"])
-          if(isNaN(parseInt(param["f_maxLength"],10)) || parseInt(param["f_maxLength"],10) <= 0)
-            param["f_maxLength"] = "";
-        if(node) {
-          //prepare existing Element
-          for (field in param) {
-            //alert(field.substring(2,20) + '=' + param[field]);  //to be silent! by htanaka
-            if ((field=="f_text") || (field=="f_options") || (field=="f_onclick") || (field=="f_checked"))continue;
-            if (param[field] != "")
-              node.setAttribute(field.substring(2,20), param[field]);
-            else
-              node.removeAttribute(field.substring(2,20));
-          }
-          if (type == "textarea") {
-            node.innerHTML = param["f_text"];
-          } else if(type == "select") {
-            node.options.length = 0;
-            var optionsList =  param["f_options"];
-            for (i=0; i<= optionsList.length-1; i++) {
-              node.options[i] = new Option(optionsList[i].text, optionsList[i].value)
-            }
-          } else if(type == "label") {
-            node.innerHTML = param["f_text"];
-          } else if(type == "fieldset") {
-            if(outparam.f_text != "") {
-              if(node.firstChild.tagName.toLowerCase()=="legend")
-                node.firstChild.innerHTML = param["f_text"];
-            } else {}// not implemented jet
-          } else if((type == "checkbox") || (type == "radio")) { //input
-              if(param["f_checked"]!="")
-                node.checked = true;
-              else
-                node.checked = false;
-          } else {
-            if(param["f_onclick"]){
-              node.onclick = "";
-              if(param["f_onclick"]!="")
-                node.onclick = param["f_onclick"];
-            }
-          }
-        } else {
-          //create Element
-          var text = "";
-          for (field in param) {
-            if (!param[field]) continue;
-            if ((param[field]=="") || (field=="f_text")|| (field=="f_options"))continue;
-            text += " " + field.substring(2,20) + '="' + param[field] + '"';
-          }
-
-          if(type == "textarea") {
-            text = '<textarea' + text + '>' + param["f_text"] + '</textarea>';
-          } else if(type == "select") {
-            text = '<select' + text + '>';
-            var optionsList =  param["f_options"];
-            for (i=0; i<= optionsList.length-1; i++) {
-                     //  v-- Avoid lc_parse_strings.php
-              text += '<'+'option value="'+optionsList[i].value+'">'+optionsList[i].text+'</option>';
-            }
-            text += '</select>';
-          } else if(type == "label") {
-            text = '<label' + text + '>' + param["f_text"] + '</label>';
-          } else if(type == "fieldset") {
-            text = '<fieldset' + text + '>';
-            if (param["f_legend"] != "") text += '<legend>' + param["f_text"] + '</legend>';
-            text += '</fieldset>';
-          } else {
-            text = '<input type="'+type+'"' + text + '>';
-          }
-          editor.insertHTML(text);
-        }
-      }
-    }, outparam);
-  }
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/Forms/forms.css b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/Forms/forms.css
deleted file mode 100644
index ba0fca6..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/Forms/forms.css
+++ /dev/null
@@ -1,3 +0,0 @@
-form {

-  border: 1px dotted red;

-}

diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/Forms/img/ed_button.gif b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/Forms/img/ed_button.gif
deleted file mode 100644
index cfa4e7d..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/Forms/img/ed_button.gif
+++ /dev/null
Binary files differ
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/Forms/img/ed_checkbox.gif b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/Forms/img/ed_checkbox.gif
deleted file mode 100644
index ea7affa..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/Forms/img/ed_checkbox.gif
+++ /dev/null
Binary files differ
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/Forms/img/ed_fieldset.gif b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/Forms/img/ed_fieldset.gif
deleted file mode 100644
index af358e5..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/Forms/img/ed_fieldset.gif
+++ /dev/null
Binary files differ
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/Forms/img/ed_file.gif b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/Forms/img/ed_file.gif
deleted file mode 100644
index 7f61ce1..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/Forms/img/ed_file.gif
+++ /dev/null
Binary files differ
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/Forms/img/ed_form.gif b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/Forms/img/ed_form.gif
deleted file mode 100644
index a2c293e..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/Forms/img/ed_form.gif
+++ /dev/null
Binary files differ
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/Forms/img/ed_hidden.gif b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/Forms/img/ed_hidden.gif
deleted file mode 100644
index 26b325d..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/Forms/img/ed_hidden.gif
+++ /dev/null
Binary files differ
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/Forms/img/ed_image.gif b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/Forms/img/ed_image.gif
deleted file mode 100644
index 3c8c88e..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/Forms/img/ed_image.gif
+++ /dev/null
Binary files differ
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/Forms/img/ed_label.gif b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/Forms/img/ed_label.gif
deleted file mode 100644
index f93fce7..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/Forms/img/ed_label.gif
+++ /dev/null
Binary files differ
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/Forms/img/ed_password.gif b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/Forms/img/ed_password.gif
deleted file mode 100644
index a799218..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/Forms/img/ed_password.gif
+++ /dev/null
Binary files differ
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/Forms/img/ed_radio.gif b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/Forms/img/ed_radio.gif
deleted file mode 100644
index 5b72ef6..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/Forms/img/ed_radio.gif
+++ /dev/null
Binary files differ
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/Forms/img/ed_reset.gif b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/Forms/img/ed_reset.gif
deleted file mode 100644
index 68fee8e..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/Forms/img/ed_reset.gif
+++ /dev/null
Binary files differ
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/Forms/img/ed_select.gif b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/Forms/img/ed_select.gif
deleted file mode 100644
index 3ea59f5..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/Forms/img/ed_select.gif
+++ /dev/null
Binary files differ
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/Forms/img/ed_submit.gif b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/Forms/img/ed_submit.gif
deleted file mode 100644
index 0b12a19..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/Forms/img/ed_submit.gif
+++ /dev/null
Binary files differ
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/Forms/img/ed_text.gif b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/Forms/img/ed_text.gif
deleted file mode 100644
index fb8159c..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/Forms/img/ed_text.gif
+++ /dev/null
Binary files differ
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/Forms/img/ed_textarea.gif b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/Forms/img/ed_textarea.gif
deleted file mode 100644
index c2c874a..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/Forms/img/ed_textarea.gif
+++ /dev/null
Binary files differ
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/Forms/lang/ch.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/Forms/lang/ch.js
deleted file mode 100644
index 9d78e44..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/Forms/lang/ch.js
+++ /dev/null
@@ -1,14 +0,0 @@
-// I18N constants
-// LANG: "ch", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Cancel": "取消",
-    "OK": "好"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/Forms/lang/cz.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/Forms/lang/cz.js
deleted file mode 100644
index 504bb4a..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/Forms/lang/cz.js
+++ /dev/null
@@ -1,15 +0,0 @@
-// I18N constants
-// LANG: "cz", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Cancel": "Zrušit",
-    "Image URL:": "Adresa obrázku",
-    "OK": "OK"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/Forms/lang/da.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/Forms/lang/da.js
deleted file mode 100644
index 253e942..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/Forms/lang/da.js
+++ /dev/null
@@ -1,18 +0,0 @@
-// I18N constants
-// LANG: "da", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Cancel": "Annuller",
-    "Image URL:": "Billede URL:",
-    "Name": "Navn",
-    "OK": "OK",
-    "Rows:": "Rækker:",
-    "Size:": "Størrelse"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/Forms/lang/de.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/Forms/lang/de.js
deleted file mode 100644
index 33cac0c..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/Forms/lang/de.js
+++ /dev/null
@@ -1,20 +0,0 @@
-// I18N constants
-// LANG: "de", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Cancel": "Abbrechen",
-    "Image URL:": "Bild URL:",
-    "Name": "Name",
-    "OK": "OK",
-    "Options": "Optionen",
-    "Rows:": "Zeilen:",
-    "Size:": "Größe:",
-    "Text:": "Text:"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/Forms/lang/ee.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/Forms/lang/ee.js
deleted file mode 100644
index ba916e9..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/Forms/lang/ee.js
+++ /dev/null
@@ -1,14 +0,0 @@
-// I18N constants
-// LANG: "ee", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Cancel": "Loobu",
-    "OK": "OK"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/Forms/lang/el.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/Forms/lang/el.js
deleted file mode 100644
index 4f44c4f..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/Forms/lang/el.js
+++ /dev/null
@@ -1,15 +0,0 @@
-// I18N constants
-// LANG: "el", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Cancel": "Ακύρωση",
-    "Image URL:": "URL εικόνας",
-    "OK": "Εντάξει"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/Forms/lang/es.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/Forms/lang/es.js
deleted file mode 100644
index eab2cb2..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/Forms/lang/es.js
+++ /dev/null
@@ -1,16 +0,0 @@
-// I18N constants
-// LANG: "es", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Cancel": "Cancelar",
-    "Image URL:": "Imagen URL:",
-    "OK": "Aceptar",
-    "Rows:": "Filas:"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/Forms/lang/eu.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/Forms/lang/eu.js
deleted file mode 100644
index 43b4afe..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/Forms/lang/eu.js
+++ /dev/null
@@ -1,16 +0,0 @@
-// I18N constants
-// LANG: "eu", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Cancel": "Utzi",
-    "Image URL:": "Irudiaren URL-a:",
-    "OK": "Ados",
-    "Rows:": "Lerroak:"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/Forms/lang/fa.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/Forms/lang/fa.js
deleted file mode 100644
index 6e4702c..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/Forms/lang/fa.js
+++ /dev/null
@@ -1,16 +0,0 @@
-// I18N constants
-// LANG: "fa", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Cancel": "انصراف",
-    "Image URL:": "URL تصویر",
-    "OK": "بله",
-    "Rows:": "ردیف ها"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/Forms/lang/fi.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/Forms/lang/fi.js
deleted file mode 100644
index 4cca1da..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/Forms/lang/fi.js
+++ /dev/null
@@ -1,15 +0,0 @@
-// I18N constants
-// LANG: "fi", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Cancel": "Peruuta",
-    "Image URL:": "Kuvan osoite",
-    "OK": "Hyväksy"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/Forms/lang/fr.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/Forms/lang/fr.js
deleted file mode 100644
index 10de038..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/Forms/lang/fr.js
+++ /dev/null
@@ -1,21 +0,0 @@
-// I18N constants
-// LANG: "fr", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Cancel": "Annuler",
-    "Image URL:": "URL",
-    "Name": "Nom",
-    "Name/ID:": "Nom/ID",
-    "OK": "OK",
-    "Options": "Options",
-    "Rows:": "Lignes",
-    "Size:": "Taille",
-    "Text:": "Texte"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/Forms/lang/he.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/Forms/lang/he.js
deleted file mode 100644
index be425af..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/Forms/lang/he.js
+++ /dev/null
@@ -1,15 +0,0 @@
-// I18N constants
-// LANG: "he", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Cancel": "ביטול",
-    "Image URL:": "URL התמונה",
-    "OK": "אישור"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/Forms/lang/hu.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/Forms/lang/hu.js
deleted file mode 100644
index b38528d..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/Forms/lang/hu.js
+++ /dev/null
@@ -1,14 +0,0 @@
-// I18N constants
-// LANG: "hu", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Cancel": "Mégsem",
-    "OK": "Rendben"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/Forms/lang/it.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/Forms/lang/it.js
deleted file mode 100644
index bde1912..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/Forms/lang/it.js
+++ /dev/null
@@ -1,15 +0,0 @@
-// I18N constants
-// LANG: "it", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Cancel": "Annullamento",
-    "Image URL:": "URL dell'Immagine",
-    "OK": "OK"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/Forms/lang/ja.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/Forms/lang/ja.js
deleted file mode 100644
index fcea72b..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/Forms/lang/ja.js
+++ /dev/null
@@ -1,97 +0,0 @@
-// I18N constants
-// LANG: "ja", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "'onClick'=": "'onClick'=",
-    "Access Key:": "アクセスキー:",
-    "Action URL:": "アクションURL:",
-    "Button Script": "ボタンスクリプト",
-    "Cancel": "中止",
-    "Checked": "チェック済み",
-    "Columns:": "列数:",
-    "Default text (optional)": "テキスト初期値(オプション)",
-    "Dimensions": "大きさ",
-    "Disabled": "無効",
-    "Encoding:": "エンコード:",
-    "For Control:": "制御対象:",
-    "Form": "フォーム",
-    "Form Element: FIELDSET": "フォーム要素: FIELDSET",
-    "Form Element: INPUT": "フォーム要素: INPUT",
-    "Form Element: LABEL": "フォーム要素: LABEL",
-    "Form Element: SELECT": "フォーム要素: SELECT",
-    "Form Element: TEXTAREA": "フォーム要素: TEXTAREA",
-    "Form Name:": "フォーム名:",
-    "Form handler script": "フォーム処理スクリプト",
-    "Get": "GET",
-    "HTML-Form to CGI (default)": "HTMLフォームからCGIへ(デフォルト)",
-    "Hard": "ハード",
-    "Height in number of rows": "行数による高さ",
-    "Image URL:": "画像URL:",
-    "Image source": "画像ソース",
-    "Initial Text:": "初期テキスト:",
-    "Javascript for button click": "ボタンクリック時のJavaScritp",
-    "Label:": "ラベル:",
-    "Legend:": "グループ名:",
-    "Max length:": "最大長:",
-    "Maximum number of characters accepted": "入力可能な最大文字数",
-    "Method:": "メソッド:",
-    "Name": "名前",
-    "Name of the form input": "フォーム入力の名前",
-    "Name/ID:": "名前/ID:",
-    "OK": "OK",
-    "Off": "オフ",
-    "Options": "選択肢",
-    "Physical": "物理的",
-    "Please enter a Label": "ラベルを入力してください",
-    "Post": "POST",
-    "Read Only": "読み取り専用",
-    "Rows:": "行数:",
-    "Size of text box in characters": "文字数によるテキストボックスの大きさ",
-    "Size:": "サイズ:",
-    "Soft": "ソフト",
-    "Tab Index:": "タブ順序:",
-    "Target Frame:": "ターゲット:",
-    "Text:": "テキスト:",
-    "URL of image": "画像のURL",
-    "Value of the form input": "フォーム入力の値",
-    "Value:": "値:",
-    "Virtual": "仮想",
-    "Width in number of characters": "文字数による幅",
-    "Wrap Mode:": "折り返し:",
-    "You must enter a Name": "名前が必要です",
-    "multipart Form Data (File-Upload)": "マルチパート(ファイルアップロード用)",
-    "name of the textarea": "テキストエリアの名前",
-    "normal": "標準",
-    "nowrap": "折り返しなし",
-    "pre": "フォーマット済み",
-    "__OBSOLETE__": {
-        "Add": "追加",
-        "Button": "ボタン",
-        "Checkbox": "チェックボックス",
-        "Delete": "削除",
-        "Field Set": "フィールドセット",
-        "File Field": "ファイルフィールド",
-        "Hidden Field": "非表示フィールド",
-        "Image Button": "画像ボタン",
-        "Label": "ラベル",
-        "Lable:": "ラベル:",
-        "Move Down": "下へ",
-        "Move Up": "上へ",
-        "Multiple Select": "複数選択",
-        "Password Field": "パスワードフィールド",
-        "Radio Button": "ラジオボタン",
-        "Reset Button": "リセットボタン",
-        "Selection Field": "選択肢フィールド",
-        "Submit Button": "送信ボタン",
-        "Text Field": "テキストフィールド",
-        "Textarea": "テキストエリア",
-        "You must enter the form name": "フォーム名が必要です"
-    }
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/Forms/lang/lc_base.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/Forms/lang/lc_base.js
deleted file mode 100644
index 31d38bb..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/Forms/lang/lc_base.js
+++ /dev/null
@@ -1,93 +0,0 @@
-// I18N constants
-//
-// LANG: "en", ENCODING: UTF-8
-// Author: Translator-Name, <email@example.com>
-//
-// Last revision: 2018-04-12
-// 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).
-//
-// (Please, remove information below)
-// 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.)
-
-{
-    "'onClick'=": "",
-    "Access Key:": "",
-    "Action URL:": "",
-    "Button Script": "",
-    "Cancel": "",
-    "Checked": "",
-    "Columns:": "",
-    "Default text (optional)": "",
-    "Dimensions": "",
-    "Disabled": "",
-    "Encoding:": "",
-    "For Control:": "",
-    "Form": "",
-    "Form Element: FIELDSET": "",
-    "Form Element: INPUT": "",
-    "Form Element: LABEL": "",
-    "Form Element: SELECT": "",
-    "Form Element: TEXTAREA": "",
-    "Form Name:": "",
-    "Form handler script": "",
-    "Get": "",
-    "HTML-Form to CGI (default)": "",
-    "Hard": "",
-    "Height in number of rows": "",
-    "Image URL:": "",
-    "Image source": "",
-    "Initial Text:": "",
-    "Insert/Edit Form": "",
-    "Insert/Edit Form Element FIELDSET": "",
-    "Insert/Edit Form Element INPUT": "",
-    "Insert/Edit Form Element LABEL": "",
-    "Insert/Edit Form Element SELECT": "",
-    "Insert/Edit Form Element TEXTAREA": "",
-    "Javascript for button click": "",
-    "Label:": "",
-    "Legend:": "",
-    "Max length:": "",
-    "Maximum number of characters accepted": "",
-    "Method:": "",
-    "Name": "",
-    "Name of the form input": "",
-    "Name of the form select": "",
-    "Name/ID:": "",
-    "OK": "",
-    "Off": "",
-    "Options": "",
-    "Physical": "",
-    "Please enter a Label": "",
-    "Post": "",
-    "Read Only": "",
-    "Rows:": "",
-    "Size of text box in characters": "",
-    "Size:": "",
-    "Soft": "",
-    "Tab Index:": "",
-    "Target Frame:": "",
-    "Text:": "",
-    "URL of image": "",
-    "Value of the form input": "",
-    "Value:": "",
-    "Virtual": "",
-    "Width in number of characters": "",
-    "Wrap Mode:": "",
-    "You must enter a Name": "",
-    "multipart Form Data (File-Upload)": "",
-    "name of the textarea": "",
-    "normal": "",
-    "nowrap": "",
-    "pre": ""
-}
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/Forms/lang/lt.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/Forms/lang/lt.js
deleted file mode 100644
index d118909..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/Forms/lang/lt.js
+++ /dev/null
@@ -1,14 +0,0 @@
-// I18N constants
-// LANG: "lt", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Cancel": "Atšaukti",
-    "OK": "OK"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/Forms/lang/lv.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/Forms/lang/lv.js
deleted file mode 100644
index f83d5d3..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/Forms/lang/lv.js
+++ /dev/null
@@ -1,14 +0,0 @@
-// I18N constants
-// LANG: "lv", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Cancel": "Atcelt",
-    "OK": "Labi"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/Forms/lang/nb.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/Forms/lang/nb.js
deleted file mode 100644
index 5e7792d..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/Forms/lang/nb.js
+++ /dev/null
@@ -1,20 +0,0 @@
-// I18N constants
-// LANG: "nb", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Cancel": "Avbryt",
-    "Image URL:": "Bildets URL:",
-    "Name": "Navn",
-    "Name/ID:": "Navn/ID:",
-    "OK": "OK",
-    "Options": "Valg",
-    "Size:": "Størrelse",
-    "Text:": "Tekst:"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/Forms/lang/nl.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/Forms/lang/nl.js
deleted file mode 100644
index b4be7bd..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/Forms/lang/nl.js
+++ /dev/null
@@ -1,98 +0,0 @@
-// I18N constants
-// LANG: "nl", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "'onClick'=": "'onClick'=",
-    "Access Key:": "Toegangs toets:",
-    "Action URL:": "Actie URL:",
-    "Button Script": "Knop script",
-    "Cancel": "Annuleren",
-    "Checked": "Checked",
-    "Columns:": "Kolommen:",
-    "Default text (optional)": "Standaard tekst (optioneel)",
-    "Dimensions": "Dimenties",
-    "Disabled": "Uitgeschakeld",
-    "Encoding:": "Encodering:",
-    "For Control:": "Voor controle:",
-    "Form": "Formulier",
-    "Form Element: FIELDSET": "Formulier element: FIELDSET",
-    "Form Element: INPUT": "Formulier element: INPUT",
-    "Form Element: LABEL": "Formulier element: LABEL",
-    "Form Element: SELECT": "Formulier element: SELECT",
-    "Form Element: TEXTAREA": "Formulier element: TEXTAREA",
-    "Form Name:": "Formulier naame:",
-    "Form handler script": "Formulier script",
-    "Get": "GET",
-    "HTML-Form to CGI (default)": "HTML formulier naar CGI (standaard)",
-    "Hard": "Hard",
-    "Height in number of rows": "Hoogte in aantal tekens",
-    "Image URL:": "Afbeelding URL:",
-    "Image source": "Afbeelding bron",
-    "Initial Text:": "Start tekst:",
-    "Javascript for button click": "Knop klik met JavaScript",
-    "Label:": "Label",
-    "Legend:": "Legend:",
-    "Max length:": "Maximale lengte:",
-    "Maximum number of characters accepted": "Maximaal aantal tekens toegestaan",
-    "Method:": "Methode:",
-    "Name": "Naame",
-    "Name of the form input": "Naam van formulier invoer",
-    "Name of the form select": "Naam van formulier select",
-    "Name/ID:": "Naam/ID:",
-    "OK": "OK",
-    "Off": "Uit",
-    "Options": "Opties",
-    "Physical": "Fysiek",
-    "Please enter a Label": "Voer een Label in",
-    "Post": "POST",
-    "Read Only": "Alleen lezen",
-    "Rows:": "Rijen:",
-    "Size of text box in characters": "Grootte van tekstveld in tekens",
-    "Size:": "Grootte:",
-    "Soft": "Zacht",
-    "Tab Index:": "Tab volgorde:",
-    "Target Frame:": "Doel venster:",
-    "Text:": "Tekst:",
-    "URL of image": "Afbeelding URL",
-    "Value of the form input": "Waarde van formulier invoer",
-    "Value:": "Waarde:",
-    "Virtual": "Virtueel",
-    "Width in number of characters": "Breedte in aantal tekens",
-    "Wrap Mode:": "Terugloop:",
-    "You must enter a Name": "Voer een Naam in",
-    "multipart Form Data (File-Upload)": "Multipart formulier data(Bestands upload)",
-    "name of the textarea": "Naam van tekst gebied",
-    "normal": "normaal",
-    "nowrap": "geen terugloop",
-    "pre": "pre",
-    "__OBSOLETE__": {
-        "Add": "Toevoegen",
-        "Button": "Knop",
-        "Checkbox": "Checkbox",
-        "Delete": "Verwijderen",
-        "Field Set": "Veldset",
-        "File Field": "Bestandsveld",
-        "Hidden Field": "Verborgen veld",
-        "Image Button": "Afbeelding knop",
-        "Label": "Label",
-        "Lable:": "Label:",
-        "Move Down": "Omlaag",
-        "Move Up": "Omhoog",
-        "Multiple Select": "Meerdere selectie mogelijkheden",
-        "Password Field": "Wachtwoordveld",
-        "Radio Button": "Radio knop",
-        "Reset Button": "Wis knop",
-        "Selection Field": "Selectielijst",
-        "Submit Button": "Verzend knop",
-        "Text Field": "Tekstveld",
-        "Textarea": "Tekstgebied",
-        "You must enter the form name": "Voer een formulier Naam in"
-    }
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/Forms/lang/pl.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/Forms/lang/pl.js
deleted file mode 100644
index f193d85..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/Forms/lang/pl.js
+++ /dev/null
@@ -1,19 +0,0 @@
-// I18N constants
-// LANG: "pl", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Cancel": "Anuluj",
-    "Image URL:": "URL obrazka:",
-    "Name": "Nazwa",
-    "OK": "OK",
-    "Options": "Opcje",
-    "Rows:": "Wierszy:",
-    "Size:": "Rozmiar:"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/Forms/lang/pt_br.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/Forms/lang/pt_br.js
deleted file mode 100644
index 302aeac..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/Forms/lang/pt_br.js
+++ /dev/null
@@ -1,78 +0,0 @@
-// I18N constants
-// LANG: "pt_br", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Access Key:": "Tecla de Acesso:",
-    "Action URL:": "Ação - URL:",
-    "Button Script": "Script de Botão",
-    "Cancel": "Cancelar",
-    "Checked": "Definido",
-    "Columns:": "Colunas:",
-    "Default text (optional)": "Texto padrão (opcional)",
-    "Dimensions": "Dimensões",
-    "Disabled": "Desativado",
-    "Encoding:": "Codificação:",
-    "For Control:": "Para Controle:",
-    "Form": "Formulário",
-    "Form Element: FIELDSET": "Elemento do formulário: FIELDSET",
-    "Form Element: INPUT": "Elemento do formulário: INPUT",
-    "Form Element: LABEL": "Elemento do formulário: LABEL",
-    "Form Element: SELECT": "Elemento do formulário: SELECT",
-    "Form Element: TEXTAREA": "Elemento do formulário: TEXTAREA",
-    "Form Name:": "Nome do Formulário:",
-    "Form handler script": "Script do Formulário",
-    "HTML-Form to CGI (default)": "Formulário para CGI (padrão)",
-    "Hard": "Difícil",
-    "Height in number of rows": "Altura em número de linhas",
-    "Image URL:": "URL da imagem:",
-    "Image source": "Imagem de Origem",
-    "Initial Text:": "Texto Inicial:",
-    "Insert/Edit Form": "Inserir/Editar Formulário",
-    "Insert/Edit Form Element FIELDSET": "Inserir/Editar Elemento FIELDSET",
-    "Insert/Edit Form Element INPUT": "Inserir/Editar Elemento INPUT",
-    "Insert/Edit Form Element LABEL": "Inserir/Editar Elemento LABEL",
-    "Insert/Edit Form Element SELECT": "Inserir/Editar Elemento SELECT",
-    "Insert/Edit Form Element TEXTAREA": "Inserir/Editar Elemento TEXTAREA",
-    "Javascript for button click": "Javascript para botão de clicar",
-    "Label:": "Etiqueta:",
-    "Legend:": "Legenda:",
-    "Max length:": "Comprimento Máx.:",
-    "Maximum number of characters accepted": "Máximo número de caracteres aceitos",
-    "Method:": "Método:",
-    "Name": "Nome",
-    "Name of the form input": "Nome do formulário de entrada",
-    "Name of the form select": "Nome do formulário de seleção",
-    "Name/ID:": "Nome/ID:",
-    "OK": "OK",
-    "Off": "Desligado",
-    "Options": "Opções",
-    "Physical": "Físico",
-    "Please enter a Label": "Por favor, entre uma Etiqueta",
-    "Post": "Post",
-    "Read Only": "Somente Leitura",
-    "Rows:": "Linhas:",
-    "Size of text box in characters": "Tamanho da caixa de texto em caracteres",
-    "Size:": "Tamanho:",
-    "Soft": "Fácil",
-    "Tab Index:": "Ordem de Tabulação:",
-    "Target Frame:": "Frame de destino:",
-    "Text:": "Texto:",
-    "URL of image": "URL da imagem",
-    "Value of the form input": "Valor do formulário de entrada",
-    "Value:": "Valor:",
-    "Virtual": "Virtual",
-    "Width in number of characters": "Largura em número de caracteres",
-    "Wrap Mode:": "Modo de quebras:",
-    "You must enter a Name": "Você precisa entrar com um Nome",
-    "multipart Form Data (File-Upload)": "Formulário de dados multipart (Enviar arquivo)",
-    "name of the textarea": "nome da área de texto",
-    "normal": "normal",
-    "nowrap": "sem quebras"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/Forms/lang/ro.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/Forms/lang/ro.js
deleted file mode 100644
index 4013ddc..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/Forms/lang/ro.js
+++ /dev/null
@@ -1,15 +0,0 @@
-// I18N constants
-// LANG: "ro", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Cancel": "Renunţă",
-    "Image URL:": "URL-ul imaginii",
-    "OK": "Acceptă"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/Forms/lang/ru.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/Forms/lang/ru.js
deleted file mode 100644
index e7be3c0..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/Forms/lang/ru.js
+++ /dev/null
@@ -1,17 +0,0 @@
-// I18N constants
-// LANG: "ru", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Cancel": "Отмена",
-    "Image URL:": "URL изображения",
-    "OK": "OK",
-    "Options": "Опции",
-    "Rows:": "Строки"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/Forms/lang/sh.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/Forms/lang/sh.js
deleted file mode 100644
index e1ece97..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/Forms/lang/sh.js
+++ /dev/null
@@ -1,16 +0,0 @@
-// I18N constants
-// LANG: "sh", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Cancel": "Poništi",
-    "Image URL:": "URL slike",
-    "OK": "OK",
-    "Rows:": "Redovi"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/Forms/lang/si.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/Forms/lang/si.js
deleted file mode 100644
index 7674892..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/Forms/lang/si.js
+++ /dev/null
@@ -1,14 +0,0 @@
-// I18N constants
-// LANG: "si", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Cancel": "Prekliči",
-    "OK": "V redu"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/Forms/lang/sr.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/Forms/lang/sr.js
deleted file mode 100644
index b0c50be..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/Forms/lang/sr.js
+++ /dev/null
@@ -1,16 +0,0 @@
-// I18N constants
-// LANG: "sr", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Cancel": "Поништи",
-    "Image URL:": "УРЛ слике",
-    "OK": "OK",
-    "Rows:": "Редови"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/Forms/lang/sv.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/Forms/lang/sv.js
deleted file mode 100644
index 2a22b47..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/Forms/lang/sv.js
+++ /dev/null
@@ -1,18 +0,0 @@
-// I18N constants
-// LANG: "sv", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Cancel": "Avbryt",
-    "Image URL:": "Bildens URL:",
-    "OK": "OK",
-    "Options": "Välj",
-    "Rows:": "Rader:",
-    "Size:": "Storlek"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/Forms/lang/th.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/Forms/lang/th.js
deleted file mode 100644
index 9da9c8d..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/Forms/lang/th.js
+++ /dev/null
@@ -1,14 +0,0 @@
-// I18N constants
-// LANG: "th", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Cancel": "ยกเลิก",
-    "OK": "ตกลง"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/Forms/lang/tr.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/Forms/lang/tr.js
deleted file mode 100644
index dedd184..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/Forms/lang/tr.js
+++ /dev/null
@@ -1,16 +0,0 @@
-// I18N constants
-// LANG: "tr", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Cancel": "İptal",
-    "Image URL:": "Resim URL'si:",
-    "OK": "Tamam",
-    "Rows:": "Satır:"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/Forms/lang/vn.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/Forms/lang/vn.js
deleted file mode 100644
index 2d82e02..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/Forms/lang/vn.js
+++ /dev/null
@@ -1,14 +0,0 @@
-// I18N constants
-// LANG: "vn", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Cancel": "Hủy",
-    "OK": "Đồng ý"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/Forms/popups/fieldset.html b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/Forms/popups/fieldset.html
deleted file mode 100644
index 2f38d4d..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/Forms/popups/fieldset.html
+++ /dev/null
@@ -1,45 +0,0 @@
-<html>
-
-<head>
-  <title>Insert/Edit Form Element FIELDSET</title>
-  <link rel="stylesheet" type="text/css" href="../../../popups/popup.css" />
-  <script type="text/javascript" src="../../../popups/popup.js"></script>
-
-<script type="text/javascript">
-function Init() {
-  __dlg_translate("Forms");
-  __dlg_init(null,{width:260, height:150});
-  var param = window.dialogArguments;
-  document.getElementById("f_text").value = param["f_text"];
-  document.getElementById("f_text").focus();
-}
-
-function onOK() {
-  // pass data back to the calling window
-  var param = new Object();
-  param["f_text"] = document.getElementById("f_text").value;
-  __dlg_close(param);
-  return false;
-}
-
-function onCancel() {
-  __dlg_close(null);
-  return false;
-}
-
-</script>
-</head>
-
-<body class="dialog" onload="Init()">
-  <div id="f_type" class="title">Form Element: FIELDSET</div>
-  <form action="" method="get">
-    <div class="fr">Legend:</div>
-    <input type="text" name="text" id="f_text" />
-    <p />
-    <div id="buttons">
-      <button type="button" 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-1.5.1/plugins/Forms/popups/form.html b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/Forms/popups/form.html
deleted file mode 100644
index daf377f..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/Forms/popups/form.html
+++ /dev/null
@@ -1,89 +0,0 @@
-<html>
-
-<head>
-  <title>Insert/Edit Form</title>
-  <link rel="stylesheet" type="text/css" href="../../../popups/popup.css" />
-  <script type="text/javascript" src="../../../popups/popup.js"></script>
-
-<script type="text/javascript">
-
-var fields = ["f_name", "f_action", "f_method", "f_enctype", "f_target"];
-
-function Init() {
-  __dlg_translate("Forms");
-  __dlg_init(null,{width:360, height:280});
-  var param = window.dialogArguments;
-  for (var i in fields) {
-    document.getElementById(fields[i]).value = param[fields[i]];
-  }
-  document.getElementById("f_name").focus();
-}
-
-function onOK() {
-  var required = {
-    "f_name": "You must enter the form name"
-  };
-  for (var i in required) {
-    var el = document.getElementById(i);
-    if (!el.value) {
-      alert(Xinha._lc(required[i],"Forms"));
-      el.focus();
-      return false;
-    }
-  }
-  // pass data back to the calling window
-  var param = new Object();
-  for (var i in fields) {
-    param[fields[i]] = document.getElementById(fields[i]).value;
-  }
-  __dlg_close(param);
-  return false;
-}
-
-function onCancel() {
-  __dlg_close(null);
-  return false;
-}
-</script>
-</head>
-
-<body class="dialog" onload="Init()">
-<div class="title">Form</div>
-<form action="" method="get">
-  <div class="fr">Form Name:</div>
-  <input type="text" name="name" id="f_name" size="20" title="Name" />
-  <p />
-
-  <fieldset>
-  <legend>Form handler script</legend>
-  <div class="space"></div>
-  <div class="fr">Action URL:</div>
-  <input name="action" id="f_action" type="text" size="30">
-  <p />
-  <div class="fr">Method:</div>
-  <select name="f_method" id="f_method">
-    <option value=""></option>
-    <option value="post">Post</option>
-    <option value="get">Get</option>
-  </select>
-  <div class="space"></div>
-  <div class="fr">Encoding:</div>
-  <select name="enctype" id="f_enctype">
-    <option value=""></option>
-    <option value="application/x-www-form-urlencoded">HTML-Form to CGI (default)</option>
-    <option value="multipart/form-data">multipart Form Data (File-Upload)</option>
-  </select>
-  <p />
-  <div class="fr">Target Frame:</div>
-  <input name="target" id="f_target" type="text" size="30">
-  <p />
-  </fieldset>
-
-<div id="buttons">
-  <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-1.5.1/plugins/Forms/popups/input.html b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/Forms/popups/input.html
deleted file mode 100644
index 7bb45f0..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/Forms/popups/input.html
+++ /dev/null
@@ -1,179 +0,0 @@
-<html>
-
-<head>
-  <title>Insert/Edit Form Element INPUT</title>
-  <link rel="stylesheet" type="text/css" href="../../../popups/popup.css" />
-  <script type="text/javascript" src="../../../popups/popup.js"></script>
-
-<script type="text/javascript">
-var fields = null;
-var type;
-function Init() {
-  __dlg_translate("Forms");
-  __dlg_init();
-  var param = window.dialogArguments;
-  type = param.f_type;
-  document.getElementById("f_type").innerHTML = Xinha._lc('Form Element: INPUT', "Forms") + '(' + type + ')';
-  document.getElementById("txt").style.display = "none";
-  document.getElementById("chk").style.display = "none";
-  document.getElementById("btn").style.display = "none";
-  document.getElementById("img").style.display = "none";
-  switch (type) {
-    case "text":
-    case "password":
-      fields = ["f_name", "f_value", "f_readOnly", "f_disabled", "f_tabindex", "f_accesskey", "f_size", "f_maxLength"];
-      height = 350;
-      document.getElementById("txt").style.display = "block";
-      break;
-    case "checkbox":
-    case "radio":
-      fields = ["f_name", "f_value", "f_checked", "f_disabled", "f_tabindex", "f_accesskey"];
-      document.getElementById("chk").style.display = "block";
-      height = 280;
-      break;
-    case "button":
-      fields = ["f_name", "f_value", "f_disabled", "f_onclick", "f_tabindex", "f_accesskey"];
-      document.getElementById("btn").style.display = "block";
-      height = 300;
-      break;
-    case "file":
-      fields = ["f_name", "f_disabled", "f_tabindex", "f_accesskey"];
-      document.getElementById("f_value").disabled = true;
-      height = 280;
-      break;
-    case "image":
-      fields = ["f_name", "f_disabled", "f_tabindex", "f_accesskey", "f_src"];
-      document.getElementById("img").style.display = "block";
-      document.getElementById("f_value").disabled = true;
-      height = 300;
-      break;
-    case "reset":
-    case "submit":
-      fields = ["f_name", "f_value", "f_disabled", "f_tabindex", "f_accesskey"];
-      height =260;
-      break;
-    case "hidden":
-      fields = ["f_name", "f_value"];
-      document.getElementById("f_disabled").disabled = true;
-      document.getElementById("f_tabindex").disabled = true;
-      document.getElementById("f_accesskey").disabled = true;
-      height =260;
-      break;
-  }
-  for (var i in fields) {
-    switch (fields[i]) {
-    case "f_readOnly":
-    case "f_disabled":
-    case "f_checked":
-      document.getElementById(fields[i]).checked = (param[fields[i]]==fields[i].substring(2,20)) || (param[fields[i]] == true); break;
-    default:
-      document.getElementById(fields[i]).value = param[fields[i]]; break;
-    }
-  }
-  window.resizeTo(320,height);
-  document.getElementById("f_name").focus();
-}
-
-function onOK() {
-  var el = document.getElementById("f_name");
-  if (!el.value) {
-    alert(Xinha._lc("You must enter a Name","Forms"));
-    el.focus();
-    return false;
-  }
-  // pass data back to the calling window
-  var param = new Object();
-  for (var i in fields) {
-    switch (fields[i]) {
-    case "f_readOnly":
-    case "f_disabled":
-    case "f_checked":
-      if(Xinha.is_ie)
-        param[fields[i]] = (document.getElementById(fields[i]).checked)?true:"";
-      else
-        param[fields[i]] = (document.getElementById(fields[i]).checked)?fields[i].substring(2,20):"";
-      break;
-    default:
-      param[fields[i]] = document.getElementById(fields[i]).value; break;
-    }
-  }
-  __dlg_close(param);
-  return false;
-}
-
-function onCancel() {
-  __dlg_close(null);
-  return false;
-}
-</script>
-
-</head>
-
-<body class="dialog" onload="Init()">
-  <div id="f_type" class="title"></div>
-  <form action="" method="get">
-    <div class="fr">Name/ID:</div>
-    <input type="text" name="name" id="f_name" title="Name of the form input" />
-    <p />
-    <div class="fr">Value:</div>
-    <input type="text" name="value" id="f_value" title="Value of the form input" />
-    <p />
-    <div class="fr">Disabled</div>
-    <input type="checkbox" name="disabled" id="f_disabled" value="disabled" />
-    <p />
-
-  <div id="chk">
-    <div class="fr">Checked</div>
-      <input name="checked" id="f_checked" type="checkbox" value="on" />
-    <p />
-  </div>
-
-    <div class="fr">Tab Index:</div>
-    <input type="text" name="tabindex" id="f_tabindex" />
-    <p />
-    <div class="fr">Access Key:</div>
-    <input type="text" name="accesskey" id="f_accesskey" />
-    <p />
-
-  <div id="txt">
-    <div class="fr">Read Only</div>
-    <input type="checkbox" name="readOnly" id="f_readOnly" value="readOnly" />
-    <p />
-
-    <fieldset>
-    <legend>Dimensions</legend>
-      <div class="space"></div>
-      <div class="fr">Size:</div>
-      <input type="text" name="size" id="f_size" size="5" title="Size of text box in characters" />
-      <div class="space"></div>
-      <div class="fr">Max length:</div>
-      <input type="text" name="maxLength" id="f_maxLength" size="5"	title="Maximum number of characters accepted" />
-      <div class="space"></div>
-    </fieldset>
-  </div>
-  <div id="btn">
-    <fieldset>
-    <legend> Button Script</legend>
-      <div class="space"></div>
-      <div class="fr">'onClick'=</div>
-      <input type="text" name="onClick" id="f_onclick" title="Javascript for button click" />
-      <div class="space"></div>
-    </fieldset>
-  </div>
-  <div id="img">
-    <fieldset>
-    <legend>Image source</legend>
-      <div class="space"></div>
-      <div class="fr">Image URL:</div>
-      <input type="text" name="src" id="f_src" title="URL of image" />
-      <div class="space"></div>
-    </fieldset>
-  </div>
-  <div id="buttons">
-    <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-1.5.1/plugins/Forms/popups/label.html b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/Forms/popups/label.html
deleted file mode 100644
index ada1e8e..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/Forms/popups/label.html
+++ /dev/null
@@ -1,58 +0,0 @@
-<html>
-
-<head>
-  <title>Insert/Edit Form Element LABEL</title>
-  <link rel="stylesheet" type="text/css" href="../../../popups/popup.css" />
-  <script type="text/javascript" src="../../../popups/popup.js"></script>
-
-<script type="text/javascript">
-var fields = ["f_text","f_for","f_accesskey"];
-
-function Init() {
-  __dlg_translate("Forms");
-  __dlg_init(null,{width:260, height:220});
-  var param = window.dialogArguments;
-  for (var i in fields) {
-    document.getElementById(fields[i]).value = param[fields[i]];
-  }
-  document.getElementById("f_text").focus();
-}
-
-function onOK() {
-  // pass data back to the calling window
-    // pass data back to the calling window
-  var param = new Object();
-  for (var i in fields) {
-    param[fields[i]] = document.getElementById(fields[i]).value;
-  }
-  __dlg_close(param);
-  return false;
-}
-
-function onCancel() {
-  __dlg_close(null);
-  return false;
-}
-
-</script>
-</head>
-
-<body class="dialog" onload="Init()">
-  <div id="f_type" class="title">Form Element: LABEL</div>
-  <form action="" method="get">
-    <div class="fr">Text:</div>
-    <input type="text" name="text" id="f_text" />
-    <p />
-    <div class="fr">For Control:</div>
-    <input type="text" name="for" id="f_for" />
-    <p />
-    <div class="fr">Access Key:</div>
-    <input type="text" name="accesskey" id="f_accesskey" />
-    <p />
-    <div id="buttons">
-      <button type="button" 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-1.5.1/plugins/Forms/popups/select.html b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/Forms/popups/select.html
deleted file mode 100644
index 72345d1..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/Forms/popups/select.html
+++ /dev/null
@@ -1,208 +0,0 @@
-<html>
-
-<head>
-  <title>Insert/Edit Form Element SELECT</title>
-  <link rel="stylesheet" type="text/css" href="../../../popups/popup.css" />
-  <script type="text/javascript" src="../../../popups/popup.js"></script>
-
-<script type="text/javascript">
-var fields = ["f_name", "f_size", "f_tabindex", "f_multiple", "f_disabled"];
-
-function Init() {
-  __dlg_translate("Forms");
-  __dlg_init(null,{width:360, height:400});
-  var param = window.dialogArguments;
-  for (var i in fields) {
-    switch (fields[i]) {
-    case "f_multiple":
-    case "f_disabled":
-      document.getElementById(fields[i]).checked = (param[fields[i]]==fields[i].substring(2,20)) || (param[fields[i]] == true); break;
-    case "f_size":
-      document.getElementById(fields[i]).value = (param[fields[i]]<=0)?"":param[fields[i]]; break;
-    default:
-      document.getElementById(fields[i]).value = param[fields[i]]; break;
-    }
-  }
-  for (var i=0; i<=param.f_options.length-1; i++) {
-    document.getElementById("f_select").options[i] = new Option(param.f_options[i].text, param.f_options[i].value);
-  }
-  document.getElementById("f_name").focus();
-}
-
-function onOK() {
-  var el = document.getElementById("f_name");
-  if (!el.value) {
-    alert(Xinha._lc("You must enter a Name","Forms"));
-    el.focus();
-    return false;
-  }
-  // pass data back to the calling window
-  var param = new Object();
-  for (var i in fields) {
-    switch (fields[i]) {
-    case "f_multiple":
-      if (document.getElementById("f_size").value=="1")
-        param["f_multiple"] = "";
-      else
-        param["f_multiple"] = (document.getElementById(fields[i]).checked)?"multiple":"";
-      break;
-    case "f_disabled":
-      param[fields[i]] = (document.getElementById(fields[i]).checked)?"disabled":""; break;
-    default:
-      param[fields[i]] = document.getElementById(fields[i]).value; break;
-    }
-  }
-  function optionValues(text,value) {
-    this.text = text;
-    this.value = value;
-  }
-  optionNodes = new Array(); // for option text/value pairs
-  for (var i=0; i<= document.getElementById("f_select").options.length-1; i++) {
-    optionNodes[i] = new optionValues(document.getElementById("f_select").options[i].text, document.getElementById("f_select").options[i].value);
-  }
-  param["f_options"] = optionNodes;
-  __dlg_close(param);
-  return false;
-}
-
-function onCancel() {
-  __dlg_close(null);
-  return false;
-}
-
-
-//functions to build select options list
-//Populates Label and Value fields with selected option values
-function getValues(){
-  var d = document;
-  d.getElementById("f_optionvalue").value = d.getElementById("f_select").options[d.getElementById("f_select").selectedIndex].value;
-  d.getElementById("f_optiontext").value = d.getElementById("f_select").options[d.getElementById("f_select").selectedIndex].text;
-  d.getElementById("f_update").value ="Update Option";
-}
-
-//Add or update options to the select box
-function addItem(item) {
-  var d = document;
-  if (item.f_optiontext.value =="") {alert(Xinha._lc("Please enter a Label","Forms"));}
-  else {
-    if (d.getElementById("f_select").options.selectedIndex != -1) { //update item
-      var indx = d.getElementById("f_select").options.selectedIndex;
-      d.getElementById("f_select").options[indx].text=d.getElementById("f_optiontext").value;
-      d.getElementById("f_select").options[indx].value=d.getElementById("f_optionvalue").value;
-    } else { //add new item
-      var newItem = d.getElementById("f_select").options.length++;
-      d.getElementById("f_select").options[newItem].text=d.getElementById("f_optiontext").value;
-      d.getElementById("f_select").options[newItem].value=d.getElementById("f_optionvalue").value;
-    }
-    d.getElementById("f_select").selectedIndex = -1; //deselect
-    d.getElementById("f_optiontext").value="";//clean up
-    d.getElementById("f_optionvalue").value="";
-    d.getElementById("f_update").value ="Add Option";
-    d.getElementById("f_optiontext").focus();
-  }
-}
-//Clears selected option
-function deleteItem() {
-  var d = document;
-  for (var i = d.getElementById("f_select").options.length - 1; i>=0; i--) {
-    var opt = d.getElementById("f_select").options[i];
-    if (opt.selected) {
-      d.getElementById("f_select").options[i] = null;
-    }
-  }
-  d.getElementById("f_select").selectedIndex = -1;
-  d.getElementById("f_optiontext").value="";
-  d.getElementById("f_optionvalue").value="";
-  d.getElementById("f_optiontext").focus();
-}
-//Moves selected option up
-function moveOptionUp() {
-  var d = document;
-  for (i=0; i<d.getElementById("f_select").options.length; i++) {
-    if (d.getElementById("f_select").options[i].selected) {
-      if (i != 0 && !d.getElementById("f_select").options[i-1].selected) {
-        swapOptions(d.getElementById("f_select"),i,i-1);
-        d.getElementById("f_select").options[i-1].selected = true;
-      }
-    }
-  }
-}
-//Moves selected option down
-function moveOptionDown() {
-  var d = document;
-  for (i=d.getElementById("f_select").options.length-1; i>=0; i--) {
-    if (d.getElementById("f_select").options[i].selected) {
-      if (i != (d.getElementById("f_select").options.length-1) && ! d.getElementById("f_select").options[i+1].selected) {
-        swapOptions(d.getElementById("f_select"),i,i+1);
-        d.getElementById("f_select").options[i+1].selected = true;
-      }
-    }
-  }
-}
-
-function swapOptions(obj,i,j) {
-  var o = obj.options;
-  var i_selected = o[i].selected;
-  var j_selected = o[j].selected;
-  var temp = new Option(o[i].text, o[i].value);
-  var temp2= new Option(o[j].text, o[j].value);
-  o[i] = temp2;
-  o[j] = temp;
-  o[i].selected = j_selected;
-  o[j].selected = i_selected;
-}
-</script>
-</head>
-
-<body class="dialog" onload="Init()">
-  <div id="f_type" class="title">Form Element: SELECT</div>
-  <form action="" method="get">
-    <div class="fr">Name/ID:</div>
-    <input type="text" name="name" id="f_name" title="Name of the form select" />
-    <p />
-    <div class="fr">Size:</div>
-    <input name="size" id="f_size" type="text" value="" size="15" />
-    <p />
-    <div class="fr"><nobr>Multiple Select</nobr></div>
-    <input name="multiple" id="f_multiple" type="checkbox" value="multiple" value="on" />
-    <p />
-    <div class="fr">Disabled</div>
-    <input type="checkbox" name="disabled" id="f_disabled" value="disabled" />
-    <p />
-    <div class="fr">Tab Index:</div>
-    <input type="text" name="tabindex" id="f_tabindex" />
-    <p />
-    <div class="space"></div>
-    <fieldset id="fldLayout">
-    <legend>Options</legend>
-      <table border="0" cellspacing="0">
-      <tr>
-      <td style="text-align: right;">
-        <select name="select" id="f_select" Size="6" onchange="getValues();"  style="width:16em">
-        </select>
-      </td>
-      <td style="text-align: center;">
-        <input type="button" name="up" value="Move Up" style="width:6em" onClick="moveOptionUp()"><br />
-        <input type="button" name="down" value="Move Down" style="width:6em" onClick="moveOptionDown()"><br />
-        <input type="button" name="delete" value="Delete" style="width:6em" onClick="deleteItem();">
-      </td>
-      </tr>
-      </table>
-      <div class="space"></div>
-      <table border="0" cellspacing="0">
-      <tr>
-        <td style="text-align: right;">Label:</td>
-        <td><input type="text" id="f_optiontext" name="optionText" value="" size="15"></td>
-        <td style="text-align: right;">Value:</td>
-        <td><input name="optionValue" id="f_optionvalue" type="text" value="" size="15"></td>
-        <td><input type="button" name="update" id="f_update" value="Add" onclick="addItem(document.forms[0])"></td>
-      </tr>
-      </table>
-    </fieldset>
-    <div id="buttons">
-      <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-1.5.1/plugins/Forms/popups/textarea.html b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/Forms/popups/textarea.html
deleted file mode 100644
index f591251..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/Forms/popups/textarea.html
+++ /dev/null
@@ -1,112 +0,0 @@
-<html>
-
-<head>
-  <title>Insert/Edit Form Element TEXTAREA</title>
-  <link rel="stylesheet" type="text/css" href="../../../popups/popup.css" />
-  <script type="text/javascript" src="../../../popups/popup.js"></script>
-
-<script type="text/javascript">
-
-var fields = ["f_name", "f_text", "f_cols", "f_rows", "f_wrap", "f_tabindex", "f_accesskey", "f_readOnly", "f_disabled"];
-
-function Init() {
-  __dlg_translate("Forms");
-  __dlg_init(null,{width:260, height:380});
-  var param = window.dialogArguments;
-  for (var i in fields) {
-    switch (fields[i]) {
-    case "f_readOnly":
-    case "f_disabled":
-      document.getElementById(fields[i]).checked = (param[fields[i]]==fields[i].substring(2,20)) || (param[fields[i]] == true);  break;
-    default:
-      document.getElementById(fields[i]).value = param[fields[i]]; break;
-    }
-  }
-  document.getElementById("f_name").focus();
-}
-
-function onOK() {
-  var el = document.getElementById("f_name");
-  if (!el.value) {
-    alert(Xinha._lc("You must enter a Name","Forms"));
-    el.focus();
-    return false;
-  }
-  // pass data back to the calling window
-  var param = new Object();
-  for (var i in fields) {
-    switch (fields[i]) {
-    case "f_readOnly":
-    case "f_disabled":
-      if(Xinha.is_ie)
-        param[fields[i]] = (document.getElementById(fields[i]).checked)?true:"";
-      else
-        param[fields[i]] = (document.getElementById(fields[i]).checked)?fields[i].substring(2,20):"";
-      break;
-    default:
-      param[fields[i]] = document.getElementById(fields[i]).value; break;
-    }
-  }
-  __dlg_close(param);
-  return false;
-}
-
-function onCancel() {
-  __dlg_close(null);
-  return false;
-}
-</script>
-</head>
-
-<body class="dialog" onload="Init()">
-<div id="f_type" class="title">Form Element: TEXTAREA</div>
-<form action="" method="get">
-  <div class="fr">Name/ID:</div>
-  <input type="text" name="name" id="f_name" title="name of the textarea" />
-  <p />
-  <fieldset>
-  <legend>Dimensions</legend>
-    <div class="fr">Columns:</div>
-    <input type="text" name="cols" id="f_cols" size="5" title="Width in number of characters" />
-    <p />
-    <div class="fr">Rows:</div>
-    <input type="text" name="rows" id="f_rows" size="5" title="Height in number of rows" />
-    <p />
-  </fieldset>
-  <div class="space"></div>
-  <div class="fr">Wrap Mode:</div>
-  <select name="wrap" id="f_wrap">
-    <option value=""></option>
-    <option value="off">Off</option>
-    <option value="soft">Soft</option>
-    <option value="hard">Hard</option>
-    <option value="physical">Physical</option>
-    <option value="virtual">Virtual</option>
-    <option value="normal">normal</option>
-    <option value="nowrap">nowrap</option>
-    <option value="pre">pre</option>
-  </select>
-  <p />
-  <div class="fr">Read Only</div>
-  <input type="checkbox" name="readOnly" id="f_readOnly" value="readOnly" />
-  <p />
-  <div class="fr">Disabled</div>
-  <input type="checkbox" name="disabled" id="f_disabled" value="disabled" />
-  <p />
-  <div class="fr">Tab Index:</div>
-  <input type="text" name="tabindex" id="f_tabindex" />
-  <p />
-  <div class="fr">Access Key:</div>
-  <input type="text" name="accesskey" id="f_accesskey" />
-  <p />
-
-  <div class="fr">Initial Text:</div>
-  <input type="text" name="text" id="f_text" title="Default text (optional)" />
-  <div id="buttons">
-    <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-1.5.1/plugins/FullPage/FullPage.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/FullPage/FullPage.js
deleted file mode 100644
index 66a7f7c..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/FullPage/FullPage.js
+++ /dev/null
@@ -1,209 +0,0 @@
-// FullPage Plugin for HTMLArea-3.0
-// Implementation by Mihai Bazon.  Sponsored by http://thycotic.com
-//
-// htmlArea v3.0 - Copyright (c) 2002 interactivetools.com, inc.
-// This notice MUST stay intact for use (see license.txt).
-//
-// A free WYSIWYG editor replacement for <textarea> fields.
-// For full source code and docs, visit http://www.interactivetools.com/
-//
-// Version 3.0 developed by Mihai Bazon for InteractiveTools.
-//   http://dynarch.com/mishoo
-//
-// $Id:full-page.js 856 2007-06-13 18:34:34Z wymsy $
-
-function FullPage(editor) {
-	this.editor = editor;
-
-	var cfg = editor.config;
-	cfg.fullPage = true;
-	var self = this;
-
-	cfg.registerButton("FP-docprop", this._lc("Document properties"), editor.imgURL("docprop.gif", "FullPage"), false,
-			   function(editor, id) {
-				   self.buttonPress(editor, id);
-			   });
-
-	// add a new line in the toolbar
-	cfg.addToolbarElement(["separator","FP-docprop"],"separator",-1);
-}
-
-FullPage._pluginInfo = {
-	name          : "FullPage",
-	version       : "1.0",
-	developer     : "Mihai Bazon",
-	developer_url : "http://dynarch.com/mishoo/",
-	c_owner       : "Mihai Bazon",
-	sponsor       : "Thycotic Software Ltd.",
-	sponsor_url   : "http://thycotic.com",
-	license       : "htmlArea"
-};
-
-FullPage.prototype._lc = function(string) {
-    return Xinha._lc(string, 'FullPage');
-};
-
-FullPage.prototype.buttonPress = function(editor, id) {
-	var self = this;
-	switch (id) {
-	    case "FP-docprop":
-		var doc = editor._doc;
-		var links = doc.getElementsByTagName("link");
-		var style1 = '';
-		var style2 = '';
-		var keywords = '';
-		var description = '';
-		var charset = '';
-		for (var i = links.length; --i >= 0;) {
-			var link = links[i];
-			if (/stylesheet/i.test(link.rel)) {
-				if (/alternate/i.test(link.rel))
-					style2 = link.href;
-				else
-					style1 = link.href;
-			}
-		}
-		var metas = doc.getElementsByTagName("meta");
-		for (var i = metas.length; --i >= 0;) {
-			var meta = metas[i];
-			if (/content-type/i.test(meta.httpEquiv)) {
-				r = /^text\/html; *charset=(.*)$/i.exec(meta.content);
-				charset = r[1];
-			} else if ((/keywords/i.test(meta.name)) || (/keywords/i.test(meta.id))) {
-				keywords = meta.content;
-			}	else if ((/description/i.test(meta.name)) || (/description/i.test(meta.id))) {
-				description = meta.content;
-			}
-		}
-		var title = doc.getElementsByTagName("title")[0];
-		title = title ? title.innerHTML : '';
-		var init = {
-			f_doctype      : editor.doctype,
-			f_title        : title,
-			f_body_bgcolor : Xinha._colorToRgb(doc.body.style.backgroundColor),
-			f_body_fgcolor : Xinha._colorToRgb(doc.body.style.color),
-			f_base_style   : style1,
-			f_alt_style    : style2,
-			f_charset      : charset,
-			f_keywords     : keywords,
-			f_description  : description,
-			editor         : editor
-		};
-		editor._popupDialog("plugin://FullPage/docprop", function(params) {
-			self.setDocProp(params);
-		}, init);
-		break;
-	}
-};
-
-FullPage.prototype.setDocProp = function(params) {
-	var txt = "";
-	var doc = this.editor._doc;
-	var head = doc.getElementsByTagName("head")[0];
-	var links = doc.getElementsByTagName("link");
-	var metas = doc.getElementsByTagName("meta");
-	var style1 = null;
-	var style2 = null;
-	var charset = null;
-	var charset_meta = null;
-	var keywords = null;
-	var description = null;
-	for (var i = links.length; --i >= 0;) {
-		var link = links[i];
-		if (/stylesheet/i.test(link.rel)) {
-			if (/alternate/i.test(link.rel))
-				style2 = link;
-			else
-				style1 = link;
-		}
-	}
-	for (var i = metas.length; --i >= 0;) {
-		var meta = metas[i];
-		if (/content-type/i.test(meta.httpEquiv)) {
-			r = /^text\/html; *charset=(.*)$/i.exec(meta.content);
-			charset = r[1];
-			charset_meta = meta;
-		} else if ((/keywords/i.test(meta.name)) || (/keywords/i.test(meta.id))) {
-			keywords = meta;
-		}	else if ((/description/i.test(meta.name)) || (/description/i.test(meta.id))) {
-			description = meta;
-		}
-	}
-	function createLink(alt) {
-		var link = doc.createElement("link");
-		link.rel = alt ? "alternate stylesheet" : "stylesheet";
-		head.appendChild(link);
-		return link;
-	}
-	function createMeta(httpEquiv, name, content) {
-		var meta = doc.createElement("meta");
-		if (httpEquiv!="") meta.httpEquiv = httpEquiv;
-		if (name!="") meta.name = name;
-		if (name!="") meta.id = name;
-		meta.content = content;
-		head.appendChild(meta);
-		return meta;
-	}
-
-	if (!style1 && params.f_base_style)
-		style1 = createLink(false);
-	if (params.f_base_style)
-		style1.href = params.f_base_style;
-	else if (style1)
-		head.removeChild(style1);
-
-	if (!style2 && params.f_alt_style)
-		style2 = createLink(true);
-	if (params.f_alt_style)
-		style2.href = params.f_alt_style;
-	else if (style2)
-		head.removeChild(style2);
-
-	if (charset_meta) {
-		head.removeChild(charset_meta);
-		charset_meta = null;
-	}
-	if (!charset_meta && params.f_charset)
-		charset_meta = createMeta("Content-Type","", "text/html; charset="+params.f_charset);
-
-	if (!keywords && params.f_keywords)
-		keywords = createMeta("","keywords", params.f_keywords);
-	else if (params.f_keywords)
-		keywords.content = params.f_keywords;
-	else if (keywords)
-		head.removeChild(keywords);
-
-	if (!description && params.f_description)
-		description = createMeta("","description", params.f_description);
-	else if (params.f_description)
-		description.content = params.f_description;
-	else if (description)
-		head.removeChild(description);
-
-  	for (var i in params) {
-		var val = params[i];
-		switch (i) {
-		    case "f_title":
-			var title = doc.getElementsByTagName("title")[0];
-			if (!title) {
-				title = doc.createElement("title");
-				head.appendChild(title);
-			} else while (node = title.lastChild)
-				title.removeChild(node);
-			if (!Xinha.is_ie)
-				title.appendChild(doc.createTextNode(val));
-			else
-				doc.title = val;
-			break;
-		    case "f_doctype":
-			this.editor.setDoctype(val);
-			break;
-		    case "f_body_bgcolor":
-			doc.body.style.backgroundColor = val;
-			break;
-		    case "f_body_fgcolor":
-			doc.body.style.color = val;
-			break;
-		}
-	}
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/FullPage/img/docprop.gif b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/FullPage/img/docprop.gif
deleted file mode 100644
index fd00889..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/FullPage/img/docprop.gif
+++ /dev/null
Binary files differ
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/FullPage/lang/ch.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/FullPage/lang/ch.js
deleted file mode 100644
index 9d78e44..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/FullPage/lang/ch.js
+++ /dev/null
@@ -1,14 +0,0 @@
-// I18N constants
-// LANG: "ch", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Cancel": "取消",
-    "OK": "好"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/FullPage/lang/cz.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/FullPage/lang/cz.js
deleted file mode 100644
index 49337e5..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/FullPage/lang/cz.js
+++ /dev/null
@@ -1,15 +0,0 @@
-// I18N constants
-// LANG: "cz", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Cancel": "Zrušit",
-    "Description:": "Popis",
-    "OK": "OK"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/FullPage/lang/da.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/FullPage/lang/da.js
deleted file mode 100644
index 7e7f3fb..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/FullPage/lang/da.js
+++ /dev/null
@@ -1,15 +0,0 @@
-// I18N constants
-// LANG: "da", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Cancel": "Annuller",
-    "Description:": "Beskrivelse:",
-    "OK": "OK"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/FullPage/lang/de.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/FullPage/lang/de.js
deleted file mode 100644
index 6709d86..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/FullPage/lang/de.js
+++ /dev/null
@@ -1,25 +0,0 @@
-// I18N constants
-// LANG: "de", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Alternate style-sheet:": "Alternativer Stylesheet:",
-    "Background color:": "Hintergrundfarbe:",
-    "Cancel": "Abbrechen",
-    "Character set:": "Zeichensatz",
-    "DOCTYPE:": "DOCTYPE:",
-    "Description:": "Beschreibung",
-    "Document properties": "Dokumenteigenschaften",
-    "Document title:": "Dokumenttitel:",
-    "Keywords:": "Schlüsselworte",
-    "OK": "OK",
-    "Primary style-sheet:": "Stylesheet:",
-    "Text color:": "Textfarbe:",
-    "UTF-8 (recommended)": "UTF-8 (empfohlen)"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/FullPage/lang/ee.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/FullPage/lang/ee.js
deleted file mode 100644
index ba916e9..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/FullPage/lang/ee.js
+++ /dev/null
@@ -1,14 +0,0 @@
-// I18N constants
-// LANG: "ee", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Cancel": "Loobu",
-    "OK": "OK"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/FullPage/lang/el.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/FullPage/lang/el.js
deleted file mode 100644
index 50ba2f8..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/FullPage/lang/el.js
+++ /dev/null
@@ -1,15 +0,0 @@
-// I18N constants
-// LANG: "el", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Cancel": "Ακύρωση",
-    "Description:": "Περιγραφή",
-    "OK": "Εντάξει"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/FullPage/lang/es.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/FullPage/lang/es.js
deleted file mode 100644
index daef925..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/FullPage/lang/es.js
+++ /dev/null
@@ -1,15 +0,0 @@
-// I18N constants
-// LANG: "es", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Cancel": "Cancelar",
-    "Description:": "Descripción:",
-    "OK": "Aceptar"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/FullPage/lang/eu.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/FullPage/lang/eu.js
deleted file mode 100644
index 3bc9dbb..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/FullPage/lang/eu.js
+++ /dev/null
@@ -1,14 +0,0 @@
-// I18N constants
-// LANG: "eu", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Cancel": "Utzi",
-    "OK": "Ados"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/FullPage/lang/fa.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/FullPage/lang/fa.js
deleted file mode 100644
index 84e7f7e..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/FullPage/lang/fa.js
+++ /dev/null
@@ -1,14 +0,0 @@
-// I18N constants
-// LANG: "fa", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Cancel": "انصراف",
-    "OK": "بله"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/FullPage/lang/fi.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/FullPage/lang/fi.js
deleted file mode 100644
index 0f32eae..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/FullPage/lang/fi.js
+++ /dev/null
@@ -1,15 +0,0 @@
-// I18N constants
-// LANG: "fi", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Cancel": "Peruuta",
-    "Description:": "Kuvaus",
-    "OK": "Hyväksy"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/FullPage/lang/fr.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/FullPage/lang/fr.js
deleted file mode 100644
index b72ba4e..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/FullPage/lang/fr.js
+++ /dev/null
@@ -1,25 +0,0 @@
-// I18N constants
-// LANG: "fr", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Alternate style-sheet:": "Feuille CSS alternative",
-    "Background color:": "Couleur d'arrière plan",
-    "Cancel": "Annuler",
-    "Character set:": "Jeu de caractères",
-    "DOCTYPE:": "DOCTYPE",
-    "Description:": "Description",
-    "Document properties": "Propriétés du document",
-    "Document title:": "Titre du document",
-    "Keywords:": "Mots clés",
-    "OK": "OK",
-    "Primary style-sheet:": "Feuille CSS primaire",
-    "Text color:": "Couleur de texte",
-    "UTF-8 (recommended)": "UTF-8 (recommandé)"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/FullPage/lang/he.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/FullPage/lang/he.js
deleted file mode 100644
index 14f27c5..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/FullPage/lang/he.js
+++ /dev/null
@@ -1,22 +0,0 @@
-// I18N constants
-// LANG: "he", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Alternate style-sheet:": "גיליון סגנון אחר:",
-    "Background color:": "צבע רקע:",
-    "Cancel": "ביטול",
-    "DOCTYPE:": "DOCTYPE:",
-    "Description:": "תיאור",
-    "Document properties": "מאפייני מסמך",
-    "Document title:": "כותרת מסמך:",
-    "OK": "אישור",
-    "Primary style-sheet:": "גיליון סגנון ראשי:",
-    "Text color:": "צבע טקסט:"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/FullPage/lang/hu.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/FullPage/lang/hu.js
deleted file mode 100644
index b38528d..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/FullPage/lang/hu.js
+++ /dev/null
@@ -1,14 +0,0 @@
-// I18N constants
-// LANG: "hu", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Cancel": "Mégsem",
-    "OK": "Rendben"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/FullPage/lang/it.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/FullPage/lang/it.js
deleted file mode 100644
index e909783..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/FullPage/lang/it.js
+++ /dev/null
@@ -1,15 +0,0 @@
-// I18N constants
-// LANG: "it", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Cancel": "Annullamento",
-    "Description:": "Descrizione",
-    "OK": "OK"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/FullPage/lang/ja.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/FullPage/lang/ja.js
deleted file mode 100644
index 40596b5..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/FullPage/lang/ja.js
+++ /dev/null
@@ -1,25 +0,0 @@
-// I18N constants
-// LANG: "ja", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Alternate style-sheet:": "代替スタイルシート:",
-    "Background color:": "背景色:",
-    "Cancel": "中止",
-    "Character set:": "文字セット:",
-    "DOCTYPE:": "DOCTYPE:",
-    "Description:": "説明:",
-    "Document properties": "文書のプロパティ",
-    "Document title:": "文書の表題:",
-    "Keywords:": "キーワード:",
-    "OK": "OK",
-    "Primary style-sheet:": "優先スタイルシート:",
-    "Text color:": "文字色:",
-    "UTF-8 (recommended)": "UTF-8 (推奨)"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/FullPage/lang/lc_base.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/FullPage/lang/lc_base.js
deleted file mode 100644
index 5eb5e81..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/FullPage/lang/lc_base.js
+++ /dev/null
@@ -1,42 +0,0 @@
-// I18N constants
-//
-// LANG: "en", ENCODING: UTF-8
-// Author: Translator-Name, <email@example.com>
-//
-// Last revision: 2018-04-12
-// 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).
-//
-// (Please, remove information below)
-// 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.)
-
-{
-    "...": "",
-    "Alternate style-sheet:": "",
-    "Background color:": "",
-    "Cancel": "",
-    "Character set:": "",
-    "DOCTYPE:": "",
-    "Description:": "",
-    "Document properties": "",
-    "Document title:": "",
-    "Keywords:": "",
-    "OK": "",
-    "Primary style-sheet:": "",
-    "Text color:": "",
-    "UTF-8 (recommended)": "",
-    "cyrillic (ISO-8859-5)": "",
-    "cyrillic (KOI8-R)": "",
-    "cyrillic (WINDOWS-1251)": "",
-    "western (ISO-8859-1)": ""
-}
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/FullPage/lang/lt.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/FullPage/lang/lt.js
deleted file mode 100644
index d118909..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/FullPage/lang/lt.js
+++ /dev/null
@@ -1,14 +0,0 @@
-// I18N constants
-// LANG: "lt", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Cancel": "Atšaukti",
-    "OK": "OK"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/FullPage/lang/lv.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/FullPage/lang/lv.js
deleted file mode 100644
index f83d5d3..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/FullPage/lang/lv.js
+++ /dev/null
@@ -1,14 +0,0 @@
-// I18N constants
-// LANG: "lv", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Cancel": "Atcelt",
-    "OK": "Labi"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/FullPage/lang/nb.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/FullPage/lang/nb.js
deleted file mode 100644
index 89357f4..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/FullPage/lang/nb.js
+++ /dev/null
@@ -1,24 +0,0 @@
-// I18N constants
-// LANG: "nb", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Alternate style-sheet:": "Alternativt stilsett:",
-    "Background color:": "Bakgrunnsfarge:",
-    "Cancel": "Avbryt",
-    "Character set:": "Tegnsett",
-    "DOCTYPE:": "DOCTYPE:",
-    "Description:": "Beskrivelse",
-    "Document properties": "Egenskaper for dokument",
-    "Document title:": "Tittel på dokument:",
-    "Keywords:": "Nøkkelord",
-    "OK": "OK",
-    "Primary style-sheet:": "Stilsett:",
-    "Text color:": "Tekstfarge:"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/FullPage/lang/nl.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/FullPage/lang/nl.js
deleted file mode 100644
index 52b1370..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/FullPage/lang/nl.js
+++ /dev/null
@@ -1,22 +0,0 @@
-// I18N constants
-// LANG: "nl", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Alternate style-sheet:": "Wisselen van style-sheet:",
-    "Background color:": "Achtergrondkleur:",
-    "Cancel": "Annuleren",
-    "DOCTYPE:": "DOCTYPE:",
-    "Description:": "Beschrijving:",
-    "Document properties": "Documenteigenschappen",
-    "Document title:": "Documenttitel:",
-    "OK": "OK",
-    "Primary style-sheet:": "Primaire style-sheet:",
-    "Text color:": "Tekstkleur:"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/FullPage/lang/pl.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/FullPage/lang/pl.js
deleted file mode 100644
index 004be28..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/FullPage/lang/pl.js
+++ /dev/null
@@ -1,25 +0,0 @@
-// I18N constants
-// LANG: "pl", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Alternate style-sheet:": "Alternatywny arkusz stylów:",
-    "Background color:": "Kolor tła:",
-    "Cancel": "Anuluj",
-    "Character set:": "Zestaw znaków",
-    "DOCTYPE:": "DOCTYPE:",
-    "Description:": "Opis",
-    "Document properties": "Właściwości dokumentu",
-    "Document title:": "Tytuł dokumentu:",
-    "Keywords:": "Słowa kluczowe",
-    "OK": "OK",
-    "Primary style-sheet:": "Arkusz stylów:",
-    "Text color:": "Kolor tekstu:",
-    "UTF-8 (recommended)": "UTF-8 (zalecany)"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/FullPage/lang/pt_br.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/FullPage/lang/pt_br.js
deleted file mode 100644
index bbc030a..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/FullPage/lang/pt_br.js
+++ /dev/null
@@ -1,32 +0,0 @@
-// I18N constants
-// LANG: "pt_br", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Alternate style-sheet:": "Estilo alternativo:",
-    "Background color:": "Côr de Fundo:",
-    "Cancel": "Cancelar",
-    "Character set:": "Conjunto de Caracteres:",
-    "DOCTYPE:": "DOCTYPE:",
-    "Description:": "Descrição:",
-    "Document properties": "Propriedades do Documento",
-    "Document title:": "Título do Documento:",
-    "Keywords:": "Palavras chave:",
-    "OK": "OK",
-    "Primary style-sheet:": "Estilo Primário:",
-    "Text color:": "Côr do Texto:",
-    "UTF-8 (recommended)": "UTF-8 (recomendado)",
-    "cyrillic (ISO-8859-5)": "Cirílico (ISO-8859-5)",
-    "cyrillic (KOI8-R)": "Cirílico (KOI8-R)",
-    "cyrillic (WINDOWS-1251)": "Círilico (WINDOWS-1251)",
-    "western (ISO-8859-1)": "Ocidental (ISO-8859-1)",
-    "__OBSOLETE__": {
-        "Test of FullPage plugin": "Teste do Plugin FullPage"
-    }
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/FullPage/lang/ro.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/FullPage/lang/ro.js
deleted file mode 100644
index 43fd4c2..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/FullPage/lang/ro.js
+++ /dev/null
@@ -1,22 +0,0 @@
-// I18N constants
-// LANG: "ro", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Alternate style-sheet:": "Template CSS alternativ:",
-    "Background color:": "Culoare de fundal:",
-    "Cancel": "Renunţă",
-    "DOCTYPE:": "DOCTYPE:",
-    "Description:": "Descriere",
-    "Document properties": "Proprietăţile documentului",
-    "Document title:": "Titlul documentului:",
-    "OK": "Acceptă",
-    "Primary style-sheet:": "Template CSS principal:",
-    "Text color:": "Culoare text:"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/FullPage/lang/ru.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/FullPage/lang/ru.js
deleted file mode 100644
index 75b51bf..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/FullPage/lang/ru.js
+++ /dev/null
@@ -1,15 +0,0 @@
-// I18N constants
-// LANG: "ru", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Cancel": "Отмена",
-    "Description:": "Описание",
-    "OK": "OK"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/FullPage/lang/sh.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/FullPage/lang/sh.js
deleted file mode 100644
index 62e76f7..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/FullPage/lang/sh.js
+++ /dev/null
@@ -1,14 +0,0 @@
-// I18N constants
-// LANG: "sh", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Cancel": "Poništi",
-    "OK": "OK"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/FullPage/lang/si.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/FullPage/lang/si.js
deleted file mode 100644
index 7674892..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/FullPage/lang/si.js
+++ /dev/null
@@ -1,14 +0,0 @@
-// I18N constants
-// LANG: "si", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Cancel": "Prekliči",
-    "OK": "V redu"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/FullPage/lang/sr.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/FullPage/lang/sr.js
deleted file mode 100644
index b7ee6f5..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/FullPage/lang/sr.js
+++ /dev/null
@@ -1,14 +0,0 @@
-// I18N constants
-// LANG: "sr", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Cancel": "Поништи",
-    "OK": "OK"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/FullPage/lang/sv.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/FullPage/lang/sv.js
deleted file mode 100644
index ad55f19..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/FullPage/lang/sv.js
+++ /dev/null
@@ -1,15 +0,0 @@
-// I18N constants
-// LANG: "sv", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Cancel": "Avbryt",
-    "Description:": "Beskrivning",
-    "OK": "OK"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/FullPage/lang/th.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/FullPage/lang/th.js
deleted file mode 100644
index 9da9c8d..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/FullPage/lang/th.js
+++ /dev/null
@@ -1,14 +0,0 @@
-// I18N constants
-// LANG: "th", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Cancel": "ยกเลิก",
-    "OK": "ตกลง"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/FullPage/lang/tr.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/FullPage/lang/tr.js
deleted file mode 100644
index a2cc218..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/FullPage/lang/tr.js
+++ /dev/null
@@ -1,15 +0,0 @@
-// I18N constants
-// LANG: "tr", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Cancel": "İptal",
-    "Description:": "Tanım",
-    "OK": "Tamam"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/FullPage/lang/vn.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/FullPage/lang/vn.js
deleted file mode 100644
index 2d82e02..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/FullPage/lang/vn.js
+++ /dev/null
@@ -1,14 +0,0 @@
-// I18N constants
-// LANG: "vn", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Cancel": "Hủy",
-    "OK": "Đồng ý"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/FullPage/popups/docprop.html b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/FullPage/popups/docprop.html
deleted file mode 100644
index 00131fe..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/FullPage/popups/docprop.html
+++ /dev/null
@@ -1,142 +0,0 @@
-<html>
-<head>
-<title>Document properties</title>
-<script type="text/javascript" src="../../../popups/popup.js"></script>
-<script type="text/javascript" src="../../../modules/ColorPicker/ColorPicker.js"></script>
-<link rel="stylesheet" type="text/css" href="../../../popups/popup.css" />
-<script type="text/javascript">
-FullPage = window.opener.FullPage; // load the FullPage plugin and lang file ;-)
-window.resizeTo(400, 130);
-var accepted = {
-  f_doctype       : true,
-  f_title         : true,
-  f_body_bgcolor  : true,
-  f_body_fgcolor  : true,
-  f_base_style    : true,
-  f_alt_style     : true,
-  f_charset       : true,
-  f_keywords      : true,
-  f_description   : true
-};
-
-var editor = null;
-function Init() {
-  __dlg_translate('FullPage');
-  __dlg_init();
-  var params = window.dialogArguments;
-  for (var i in params) {
-    if (i in accepted) {
-      var el = document.getElementById(i);
-      el.value = params[i];
-    }
-  }
-  editor = params.editor;
-
-  var bgCol_pick = document.getElementById('bgCol_pick');
-  var f_body_bgcolor = document.getElementById('f_body_bgcolor');
-  var bgColPicker = new Xinha.colorPicker({cellsize:'5px',callback:function(color){f_body_bgcolor.value=color;}});
-  bgCol_pick.onclick = function() { bgColPicker.open('top,right', f_body_bgcolor ); }
-
-  var fgCol_pick = document.getElementById('fgCol_pick');
-  var f_body_fgcolor = document.getElementById('f_body_fgcolor');
-  var fgColPicker = new Xinha.colorPicker({cellsize:'5px',callback:function(color){f_body_fgcolor.value=color;}});
-  fgCol_pick.onclick = function() { fgColPicker.open('top,right', f_body_fgcolor ); }
-
-  document.getElementById("f_title").focus();
-  document.getElementById("f_title").select();
-}
-
-function onOK() {
-  var required = {
-  };
-  for (var i in required) {
-    var el = document.getElementById(i);
-    if (!el.value) {
-      alert(required[i]);
-      el.focus();
-      return false;
-    }
-  }
-
-  var param = {};
-  for (var i in accepted) {
-    var el = document.getElementById(i);
-    param[i] = el.value;
-  }
-  __dlg_close(param);
-  return false;
-}
-
-function onCancel() {
-  __dlg_close(null);
-  return false;
-}
-</script>
-<style type="text/css">
-.fr { width: 11em; float: left; padding: 2px 5px; text-align: right; }
-.txt { width:200px; }
-div { clear:both; }
-.picker { width:30px; }
-</style>
-</head>
-
-<body class="dialog" onload="Init()">
-
-<div class="title">Document properties</div>
-
-<div>
-  <label class="fr" for="f_title">Document title:</label>
-  <input type="text" id="f_title" class="txt" />
-</div>
-<div>
-  <label class="fr" for="f_doctype">DOCTYPE:</label>
-  <input type="text" id="f_doctype" class="txt" />
-</div>
-<div>
-  <label class="fr" for="f_keywords">Keywords:</label>
-
-  <input type="text" id="f_keywords" class="txt" />
-</div>
-<div>
-  <label class="fr" for="f_description">Description:</label>
-  <input type="text" id="f_description" class="txt" />
-</div>
-<div>
-  <label class="fr" for="f_charset">Character set:</label>
-  <select id="f_charset" class="txt">
-    <option value=""></option>
-    <option value="utf-8">UTF-8 (recommended)</option>
-    <option value="windows-1251">cyrillic (WINDOWS-1251)</option>
-
-    <option value="koi8-r">cyrillic (KOI8-R)</option>
-    <option value="iso-8859-5">cyrillic (ISO-8859-5)</option>
-    <option value="iso-8859-1">western (ISO-8859-1)</option>
-  </select>
-</div>
-<div>
-  <label class="fr" for="f_base_style">Primary style-sheet:</label>
-  <input type="text" id="f_base_style" class="txt" />
-</div>
-<div>
-  <label class="fr" for="f_alt_style">Alternate style-sheet:</label>
-  <input type="text" id="f_alt_style" class="txt" />
-</div>
-<div>
-  <label class="fr" for="f_body_bgcolor">Background color:</label>
-  <input name="f_body_bgcolor" type="text" id="f_body_bgcolor" size="7" />
-  <button type="button" id="bgCol_pick" class="picker">...</button>
-</div>
-<div>
-  <label class="fr" for="f_body_fgcolor">Text color:</label>
-  <input name="f_body_fgcolor" type="text" id="f_body_fgcolor" size="7" />
-  <button type="button" id="fgCol_pick" class="picker">...</button>
-</div>
-
-<div id="buttons">
-  <button type="button" name="ok" onclick="return onOK();"><span>OK</span></button>
-
-  <button type="button" name="cancel" onclick="return onCancel();"><span>Cancel</span></button>
-</div>
-
-</body>
-</html>
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/GenericPlugin/GenericPlugin.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/GenericPlugin/GenericPlugin.js
deleted file mode 100644
index 2b5df44..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/GenericPlugin/GenericPlugin.js
+++ /dev/null
@@ -1,117 +0,0 @@
-/*------------------------------------------*\
- GenericPlugin for Xinha
- _______________________
-     
- Democase for plugin event handlers
-\*------------------------------------------*/
-
-GenericPlugin._pluginInfo = {
-  name          : "GenericPlugin",
-  version       : "1.0",
-  developer     : "Xinha Developer Team",
-  developer_url : "http://xinha.org",
-  sponsor       : "",
-  sponsor_url   : "",
-  license       : "htmlArea"
-}
-function GenericPlugin(editor)
-{
-	this.editor = editor;
-}
-
-GenericPlugin.prototype.onGenerate = function ()
-{
-
-}
-GenericPlugin.prototype.onGenerateOnce = function ()
-{
-
-}
-GenericPlugin.prototype.inwardHtml = function(html)
-{
-	return html;
-}
-GenericPlugin.prototype.outwardHtml = function(html)
-{
-	return html;
-}
-GenericPlugin.prototype.onUpdateToolbar = function ()
-{
-	return false;
-}
-
-GenericPlugin.prototype.onExecCommand = function ( cmdID, UI, param )
-{
-	return false;
-}
-
-GenericPlugin.prototype.onKeyDown = function ( event )
-{
-  return false;
-}
-
-GenericPlugin.prototype.onKeyPress = function ( event )
-{
-	return false;
-}
-
-GenericPlugin.prototype.onOnShortCut = function ( event , shortCut )
-{
-  // Where shortCut is a single character, eg if you press ctrl-a, then
-  //  shortCut == 'a'
-  return false;
-}
-
-GenericPlugin.prototype.onKeyUp = function ( event )
-{
-  return false;
-}
-
-GenericPlugin.prototype.onMouseDown = function ( event )
-{
-	return false;
-}
-
-GenericPlugin.prototype.onBeforeSubmit = function ()
-{
-	return false;
-}
-
-GenericPlugin.prototype.onBeforeUnload = function ()
-{
-	return false;
-}
-
-GenericPlugin.prototype.onBeforeResize = function (width, height)
-{
-	return false;
-}
-GenericPlugin.prototype.onResize = function (width, height)
-{
-	return false;
-}
-/**
- * 
- * @param {String} action one of 'add', 'remove', 'hide', 'show', 'multi_hide', 'multi_show'
- * @param {DOMNode|Array} panel either the panel itself or an array like ['left','right','top','bottom']
- */
-GenericPlugin.prototype.onPanelChange = function (action, panel)
-{
-	return false;
-}
-/**
- * 
- * @param {String} mode either 'textmode' or 'wysiwyg'
- */
-GenericPlugin.prototype.onMode = function (mode)
-{
-	return false;
-}
-/**
- * 
- * @param {String} mode either 'textmode' or 'wysiwyg'
- */
-GenericPlugin.prototype.onBeforeMode = function (mode)
-{
-	return false;
-}
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/GetHtml/GetHtml.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/GetHtml/GetHtml.js
deleted file mode 100644
index 7418f85..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/GetHtml/GetHtml.js
+++ /dev/null
@@ -1,17 +0,0 @@
-/**
- Implemented now as GetHtmlImplementation plugin in modules/GetHtml/TransformInnerHTML.js
-  */
-  
-function GetHtml(editor) {
-    editor.config.getHtmlMethod = "TransformInnerHTML";
-}
-
-GetHtml._pluginInfo = {
-	name          : "GetHtml",
-	version       : "1.0",
-	developer     : "Nelson Bright",
-	developer_url : "http://www.brightworkweb.com/",
-	sponsor       : "",
-    sponsor_url   : "",
-	license       : "htmlArea"
-};
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/HorizontalRule/HorizontalRule.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/HorizontalRule/HorizontalRule.js
deleted file mode 100644
index fe9ca08..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/HorizontalRule/HorizontalRule.js
+++ /dev/null
@@ -1,163 +0,0 @@
-
-HorizontalRule._pluginInfo = {
-	name          : "HorizontalRule",
-	version       : "1.0",
-	developer     : "Nelson Bright",
-	developer_url : "http://www.brightworkweb.com/",
-	c_owner       : "Nelson Bright",
-	sponsor       : "BrightWork, Inc.",
-	sponsor_url   : "http://www.brightworkweb.com/",
-	license       : "htmlArea"
-};
-
-function HorizontalRule(editor) {
-    this.editor = editor;
-
-    var cfg = editor.config;
-	var toolbar = cfg.toolbar;
-	var self = this;
-        
-	cfg.registerButton({
-		id       : "edithorizontalrule",
-		tooltip  : this._lc("Insert/edit horizontal rule"),
-	//	image    : editor.imgURL("ed_hr.gif", "HorizontalRule"),
-		image    : [_editor_url + "images/ed_buttons_main.gif",6,0],
-		textMode : false,
-		action   : function(editor) {
-						self.buttonPress(editor);
-				   }
-	});
-
-	cfg.addToolbarElement("edithorizontalrule","inserthorizontalrule",0);
-}
-
-HorizontalRule.prototype._lc = function(string) {
-    return  Xinha._lc(string, 'HorizontalRule');
-};
-
-HorizontalRule.prototype.buttonPress = function(editor) {
-	this.editor = editor;
-	this._editHorizontalRule();
-};
-
-HorizontalRule.prototype._editHorizontalRule = function(rule) {
-	editor = this.editor;
-	var sel = editor._getSelection();
-	var range = editor._createRange(sel);
-	var outparam = null;
-	if (typeof rule == "undefined") {
-		rule = editor.getParentElement();
-		if (rule && !/^hr$/i.test(rule.tagName))
-			rule = null;
-	}
-	if (rule) {
-		var f_widthValue    = rule.style.width || rule.width;
-		outparam = {
-			f_size      : parseInt(rule.style.height,10) || rule.size,
-			f_widthUnit : (/(%|px)$/.test(f_widthValue)) ? RegExp.$1 : 'px',
-			f_width     : parseInt (f_widthValue,10),
-			f_color     : Xinha._colorToRgb(rule.style.backgroundColor) || rule.color,
-			f_align     : rule.style.textAlign || rule.align,
-			f_noshade   : (parseInt(rule.style.borderWidth,10) == 0) || rule.noShade
-		};
-	}
-	editor._popupDialog("plugin://HorizontalRule/edit_horizontal_rule.html", function(param) {
-		if (!param) {	// user pressed Cancel
-			return false;
-		}
-		var hr = rule;
-		if (!hr) {
-			var hrule = editor._doc.createElement("hr");
-			for (var field in param) {
-				var value = param[field];
-				if(value == "") continue;
-				switch (field) { 
-				case "f_width" :
-					if(param["f_widthUnit"]=="%")
-					{
-						hrule.style.width = value + "%";
-					}
-					else
-					{
-						hrule.style.width = value + "px";
-					}
-				break;
-				case "f_size" :
-					hrule.style.height = value + "px"; 
-				break;
-				case "f_align" : // Gecko needs the margins for alignment
-					hrule.style.textAlign = value;
-					switch (value) {
-						case 'left':
-							hrule.style.marginLeft = "0";
-						break;
-						case 'right':
-							hrule.style.marginRight = "0";
-						break;
-						case 'center':
-							hrule.style.marginLeft = "auto";
-							hrule.style.marginRight = "auto";
-						break;
-					}
-				break;
-				case "f_color" :
-					hrule.style.backgroundColor = value; 
-				break;
-				case "f_noshade" :
-					hrule.style.border = "0"; 
-				break;
-				}
-			}
-			if ( Xinha.is_gecko )
-			{   // If I use editor.insertNodeAtSelection(hrule) here I get get a </hr> closing tag
-				editor.execCommand("inserthtml",false,Xinha.getOuterHTML(hrule));
-			}
-			else editor.insertNodeAtSelection(hrule);
-			
-		} else {
-			for (var field in param) {
-			  var value = param[field];
-			  switch (field) {
-				case "f_width" :
-					if(param["f_widthUnit"]=="%")
-					{
-						hr.style.width = value + "%";
-					}
-					else
-					{
-						hr.style.width = value + "px";
-					}
-				break;
-				case "f_size" :
-					hr.style.height = value + "px"; 
-				break;
-				case "f_align" :
-					hr.style.textAlign = value;
-					switch (value) {
-						case 'left':
-							hr.style.marginLeft = "0";
-							hr.style.marginRight = null;
-						break;
-						case 'right':
-							hr.style.marginRight = "0";
-							hr.style.marginLeft = null;
-						break;
-						case 'center':
-							hr.style.marginLeft = "auto";
-							hr.style.marginRight = "auto";
-						break;
-					}
-				break;
-				case "f_color" :
-					hr.style.backgroundColor = value; 
-				break;
-				case "f_noshade" :
-					
-				break;
-			  }
-			  hr.style.border = (param["f_noshade"]) ? "0" : null; 
-			}
-		}
-	}, outparam);
-};
-	
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/HorizontalRule/lang/b5.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/HorizontalRule/lang/b5.js
deleted file mode 100644
index b97c18d..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/HorizontalRule/lang/b5.js
+++ /dev/null
@@ -1,13 +0,0 @@
-// I18N constants
-// LANG: "b5", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Horizontal Rule": "水平線"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/HorizontalRule/lang/ch.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/HorizontalRule/lang/ch.js
deleted file mode 100644
index 3648a2a..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/HorizontalRule/lang/ch.js
+++ /dev/null
@@ -1,15 +0,0 @@
-// I18N constants
-// LANG: "ch", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Cancel": "取消",
-    "Horizontal Rule": "水平線",
-    "OK": "好"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/HorizontalRule/lang/cz.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/HorizontalRule/lang/cz.js
deleted file mode 100644
index 005721b..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/HorizontalRule/lang/cz.js
+++ /dev/null
@@ -1,24 +0,0 @@
-// I18N constants
-// LANG: "cz", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Cancel": "Zrušit",
-    "Center": "Na střed",
-    "Color:": "Barva",
-    "Height:": "Výška",
-    "Horizontal Rule": "Vodorovná čára",
-    "Layout": "Rozložení",
-    "Left": "Vlevo",
-    "OK": "OK",
-    "Right": "Vpravo",
-    "Width:": "Šířka",
-    "percent": "procent",
-    "pixels": "pixelů"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/HorizontalRule/lang/da.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/HorizontalRule/lang/da.js
deleted file mode 100644
index 8265867..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/HorizontalRule/lang/da.js
+++ /dev/null
@@ -1,25 +0,0 @@
-// I18N constants
-// LANG: "da", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Alignment:": "Justering:",
-    "Cancel": "Annuller",
-    "Center": "Centrer",
-    "Color:": "Farve",
-    "Height:": "Højde:",
-    "Horizontal Rule": "Vandret streg",
-    "Layout": "Layout",
-    "Left": "Venstre",
-    "OK": "OK",
-    "Right": "Højre",
-    "Width:": "Bredde:",
-    "percent": "procent",
-    "pixels": "pixel"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/HorizontalRule/lang/de.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/HorizontalRule/lang/de.js
deleted file mode 100644
index 3a330d3..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/HorizontalRule/lang/de.js
+++ /dev/null
@@ -1,32 +0,0 @@
-// I18N constants
-// LANG: "de", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Alignment:": "Ausrichtung:",
-    "Cancel": "Abbrechen",
-    "Center": "zentriert",
-    "Color:": "Farbe",
-    "Height:": "Höhe:",
-    "Horizontal Rule": "Horizontale Linie",
-    "Insert/edit horizontal rule": "horizontale Linie einfügen/bearbeiten",
-    "Layout": "Gestaltung",
-    "Left": "links",
-    "No shading": "keine Schattierung",
-    "OK": "OK",
-    "Right": "rechts",
-    "Style": "Stil",
-    "Width:": "Breite:",
-    "percent": "Prozent",
-    "pixels": "Pixel",
-    "__OBSOLETE__": {
-        "Note:": "Anmerkung",
-        "To select an existing horizontal rule, a double-click may be needed.": "Um eine horizontale Linie auszuwählen kann ein Doppelklick erforderlich sein."
-    }
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/HorizontalRule/lang/ee.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/HorizontalRule/lang/ee.js
deleted file mode 100644
index 5ce8246..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/HorizontalRule/lang/ee.js
+++ /dev/null
@@ -1,15 +0,0 @@
-// I18N constants
-// LANG: "ee", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Cancel": "Loobu",
-    "Horizontal Rule": "Horisontaaljoon",
-    "OK": "OK"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/HorizontalRule/lang/el.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/HorizontalRule/lang/el.js
deleted file mode 100644
index ec106a3..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/HorizontalRule/lang/el.js
+++ /dev/null
@@ -1,24 +0,0 @@
-// I18N constants
-// LANG: "el", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Cancel": "Ακύρωση",
-    "Center": "Κέντρο",
-    "Color:": "Χρώμα",
-    "Height:": "Ύψος",
-    "Horizontal Rule": "Οριζόντια Γραμμή",
-    "Layout": "Διάταξη",
-    "Left": "Αριστερά",
-    "OK": "Εντάξει",
-    "Right": "Δεξιά",
-    "Width:": "Πλάτος",
-    "percent": "τοις εκατόν",
-    "pixels": "pixels"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/HorizontalRule/lang/es.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/HorizontalRule/lang/es.js
deleted file mode 100644
index c8ef6ec..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/HorizontalRule/lang/es.js
+++ /dev/null
@@ -1,25 +0,0 @@
-// I18N constants
-// LANG: "es", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Alignment:": "Alineación:",
-    "Cancel": "Cancelar",
-    "Center": "Centrar",
-    "Color:": "Color:",
-    "Height:": "Alto:",
-    "Horizontal Rule": "Regla horizontal",
-    "Layout": "Distribución",
-    "Left": "Izquierda",
-    "OK": "Aceptar",
-    "Right": "Derecha",
-    "Width:": "Ancho:",
-    "percent": "por ciento",
-    "pixels": "píxeles"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/HorizontalRule/lang/eu.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/HorizontalRule/lang/eu.js
deleted file mode 100644
index 40551b6..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/HorizontalRule/lang/eu.js
+++ /dev/null
@@ -1,20 +0,0 @@
-// I18N constants
-// LANG: "eu", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Alignment:": "Lerrokatzea:",
-    "Cancel": "Utzi",
-    "Horizontal Rule": "Marra horizontala",
-    "Layout": "Diseinua",
-    "Left": "Ezkerretara",
-    "OK": "Ados",
-    "Right": "Eskuinetara",
-    "Width:": "Zabalera:"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/HorizontalRule/lang/fa.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/HorizontalRule/lang/fa.js
deleted file mode 100644
index 6c2166d..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/HorizontalRule/lang/fa.js
+++ /dev/null
@@ -1,20 +0,0 @@
-// I18N constants
-// LANG: "fa", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Alignment:": "تراز بندی",
-    "Cancel": "انصراف",
-    "Horizontal Rule": "خط افقی",
-    "Layout": "لایه",
-    "Left": "چپ",
-    "OK": "بله",
-    "Right": "راست",
-    "Width:": "طول"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/HorizontalRule/lang/fi.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/HorizontalRule/lang/fi.js
deleted file mode 100644
index 9eb4c8e..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/HorizontalRule/lang/fi.js
+++ /dev/null
@@ -1,23 +0,0 @@
-// I18N constants
-// LANG: "fi", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Cancel": "Peruuta",
-    "Center": "Keskelle",
-    "Color:": "Väri",
-    "Horizontal Rule": "Vaakaviiva",
-    "Layout": "Sommittelu",
-    "Left": "Vasen",
-    "OK": "Hyväksy",
-    "Right": "Oikea",
-    "Width:": "Leveys",
-    "percent": "prosenttia",
-    "pixels": "pikseliä"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/HorizontalRule/lang/fr.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/HorizontalRule/lang/fr.js
deleted file mode 100644
index 6c91998..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/HorizontalRule/lang/fr.js
+++ /dev/null
@@ -1,32 +0,0 @@
-// I18N constants
-// LANG: "fr", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Alignment:": "Alignement",
-    "Cancel": "Annuler",
-    "Center": "Centre",
-    "Color:": "Couleur",
-    "Height:": "Hauteur",
-    "Horizontal Rule": "Règle horizontale",
-    "Insert/edit horizontal rule": "Insérer une règle horizontale",
-    "Layout": "Layout",
-    "Left": "Gauche",
-    "No shading": "Pas d'ombre",
-    "OK": "OK",
-    "Right": "Droite",
-    "Style": "Style",
-    "Width:": "Largeur",
-    "percent": "pourcent",
-    "pixels": "pixels",
-    "__OBSOLETE__": {
-        "Note:": "Note",
-        "To select an existing horizontal rule, a double-click may be needed.": "Pour sélectionner une règle horizontale, un double-clic peut être nécessaire."
-    }
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/HorizontalRule/lang/he.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/HorizontalRule/lang/he.js
deleted file mode 100644
index 86093b9..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/HorizontalRule/lang/he.js
+++ /dev/null
@@ -1,24 +0,0 @@
-// I18N constants
-// LANG: "he", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Cancel": "ביטול",
-    "Center": "מרכז",
-    "Color:": "צבע",
-    "Height:": "גובה",
-    "Horizontal Rule": "קו אנכי",
-    "Layout": "פריסה",
-    "Left": "שמאל",
-    "OK": "אישור",
-    "Right": "ימין",
-    "Width:": "רוחב",
-    "percent": "אחוז",
-    "pixels": "פיקסלים"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/HorizontalRule/lang/hu.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/HorizontalRule/lang/hu.js
deleted file mode 100644
index 89f66f7..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/HorizontalRule/lang/hu.js
+++ /dev/null
@@ -1,15 +0,0 @@
-// I18N constants
-// LANG: "hu", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Cancel": "Mégsem",
-    "Horizontal Rule": "Elválasztó vonal",
-    "OK": "Rendben"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/HorizontalRule/lang/it.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/HorizontalRule/lang/it.js
deleted file mode 100644
index 1364f3f..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/HorizontalRule/lang/it.js
+++ /dev/null
@@ -1,24 +0,0 @@
-// I18N constants
-// LANG: "it", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Cancel": "Annullamento",
-    "Center": "Centra",
-    "Color:": "Colore",
-    "Height:": "Altezza",
-    "Horizontal Rule": "Righello orizzontale",
-    "Layout": "Layout",
-    "Left": "Sinistra",
-    "OK": "OK",
-    "Right": "Destra",
-    "Width:": "Larghezza",
-    "percent": "percento",
-    "pixels": "pixels"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/HorizontalRule/lang/ja.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/HorizontalRule/lang/ja.js
deleted file mode 100644
index 8d30e89..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/HorizontalRule/lang/ja.js
+++ /dev/null
@@ -1,32 +0,0 @@
-// I18N constants
-// LANG: "ja", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Alignment:": "行揃え:",
-    "Cancel": "中止",
-    "Center": "中央",
-    "Color:": "色:",
-    "Height:": "高さ:",
-    "Horizontal Rule": "水平線",
-    "Insert/edit horizontal rule": "水平線の挿入/修正",
-    "Layout": "レイアウト",
-    "Left": "左",
-    "No shading": "影付けなし",
-    "OK": "OK",
-    "Right": "右",
-    "Style": "スタイル",
-    "Width:": "幅:",
-    "percent": "パーセント",
-    "pixels": "ピクセル",
-    "__OBSOLETE__": {
-        "Note:": "備考",
-        "To select an existing horizontal rule, a double-click may be needed.": "既存の水平線を選択するにはDoubleClickが必要。"
-    }
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/HorizontalRule/lang/lc_base.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/HorizontalRule/lang/lc_base.js
deleted file mode 100644
index 8bb41ed..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/HorizontalRule/lang/lc_base.js
+++ /dev/null
@@ -1,43 +0,0 @@
-// I18N constants
-//
-// LANG: "en", ENCODING: UTF-8
-// Author: Translator-Name, <email@example.com>
-//
-// Last revision: 2018-04-12
-// 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).
-//
-// (Please, remove information below)
-// 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.)
-
-{
-    "&#x00d7;": "",
-    "&nbsp;": "",
-    "Alignment:": "",
-    "Cancel": "",
-    "Center": "",
-    "Color:": "",
-    "Height:": "",
-    "Horizontal Rule": "",
-    "Insert/Edit Horizontal Rule": "",
-    "Insert/edit horizontal rule": "",
-    "Layout": "",
-    "Left": "",
-    "No shading": "",
-    "OK": "",
-    "Right": "",
-    "Style": "",
-    "Width:": "",
-    "percent": "",
-    "pixels": ""
-}
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/HorizontalRule/lang/lt.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/HorizontalRule/lang/lt.js
deleted file mode 100644
index 8b7f2f4..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/HorizontalRule/lang/lt.js
+++ /dev/null
@@ -1,15 +0,0 @@
-// I18N constants
-// LANG: "lt", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Cancel": "Atšaukti",
-    "Horizontal Rule": "Horizontali linija",
-    "OK": "OK"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/HorizontalRule/lang/lv.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/HorizontalRule/lang/lv.js
deleted file mode 100644
index a803244..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/HorizontalRule/lang/lv.js
+++ /dev/null
@@ -1,15 +0,0 @@
-// I18N constants
-// LANG: "lv", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Cancel": "Atcelt",
-    "Horizontal Rule": "Horizontâla atdalîtâjsvîtra",
-    "OK": "Labi"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/HorizontalRule/lang/nb.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/HorizontalRule/lang/nb.js
deleted file mode 100644
index ea07188..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/HorizontalRule/lang/nb.js
+++ /dev/null
@@ -1,32 +0,0 @@
-// I18N constants
-// LANG: "nb", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Alignment:": "Justering:",
-    "Cancel": "Avbryt",
-    "Center": "Sentrert",
-    "Color:": "Farge",
-    "Height:": "Høyde:",
-    "Horizontal Rule": "Horisontal linje",
-    "Insert/edit horizontal rule": "Sett inn/ rediger horisontal linje",
-    "Layout": "Oppsett",
-    "Left": "Venstre",
-    "No shading": "Ingen skygge",
-    "OK": "OK",
-    "Right": "Høyre",
-    "Style": "Stil",
-    "Width:": "Bredde:",
-    "percent": "prosent",
-    "pixels": "Piksel",
-    "__OBSOLETE__": {
-        "Note:": "Notat",
-        "To select an existing horizontal rule, a double-click may be needed.": "For å velge en horisontal linje kan det hende du må dobbeltklikke."
-    }
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/HorizontalRule/lang/nl.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/HorizontalRule/lang/nl.js
deleted file mode 100644
index 8df83f1..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/HorizontalRule/lang/nl.js
+++ /dev/null
@@ -1,32 +0,0 @@
-// I18N constants
-// LANG: "nl", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Alignment:": "Uitvulling:",
-    "Cancel": "Annuleren",
-    "Center": "Midden",
-    "Color:": "kleur",
-    "Height:": "Hoogte:",
-    "Horizontal Rule": "Horizontale lijn",
-    "Insert/edit horizontal rule": "Horizontale lijn invoegen/bewerken",
-    "Layout": "Weergave",
-    "Left": "Links",
-    "No shading": "Geen schaduw",
-    "OK": "OK",
-    "Right": "Rechts",
-    "Style": "Style",
-    "Width:": "Breedte:",
-    "percent": "procent",
-    "pixels": "pixels",
-    "__OBSOLETE__": {
-        "Note:": "Notitie",
-        "To select an existing horizontal rule, a double-click may be needed.": "Om een bestaande horizontale lijn te selecteren moet je mogelijk dubbel klikken."
-    }
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/HorizontalRule/lang/pl.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/HorizontalRule/lang/pl.js
deleted file mode 100644
index 988e3d3..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/HorizontalRule/lang/pl.js
+++ /dev/null
@@ -1,25 +0,0 @@
-// I18N constants
-// LANG: "pl", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Alignment:": "Wyrównanie:",
-    "Cancel": "Anuluj",
-    "Center": "Środek",
-    "Color:": "Kolor:",
-    "Height:": "Wysokość:",
-    "Horizontal Rule": "Linia pozioma",
-    "Layout": "Layout",
-    "Left": "Do lewej",
-    "OK": "OK",
-    "Right": "Do prawej",
-    "Width:": "Szerokość:",
-    "percent": "%",
-    "pixels": "pikseli"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/HorizontalRule/lang/pt_br.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/HorizontalRule/lang/pt_br.js
deleted file mode 100644
index 64282af..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/HorizontalRule/lang/pt_br.js
+++ /dev/null
@@ -1,29 +0,0 @@
-// I18N constants
-// LANG: "pt_br", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Alignment:": "Alinhamento:",
-    "Cancel": "Cancelar",
-    "Center": "Centralizar",
-    "Color:": "Côr:",
-    "Height:": "Alturar:",
-    "Horizontal Rule": "Linha Horizontal",
-    "Insert/Edit Horizontal Rule": "Inserir/Editar Linha Horizontal",
-    "Insert/edit horizontal rule": "Inserir/editar linha horizontal",
-    "Layout": "Esquema",
-    "Left": "Esquerda",
-    "No shading": "Sem sombra",
-    "OK": "OK",
-    "Right": "Direita",
-    "Style": "Estilo",
-    "Width:": "Largura:",
-    "percent": "porcentagem",
-    "pixels": "pixels"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/HorizontalRule/lang/ro.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/HorizontalRule/lang/ro.js
deleted file mode 100644
index d96ae41..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/HorizontalRule/lang/ro.js
+++ /dev/null
@@ -1,24 +0,0 @@
-// I18N constants
-// LANG: "ro", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Cancel": "Renunţă",
-    "Center": "Centru",
-    "Color:": "Culoare",
-    "Height:": "Înălţimea",
-    "Horizontal Rule": "Linie orizontală",
-    "Layout": "Aranjament",
-    "Left": "Stânga",
-    "OK": "Acceptă",
-    "Right": "Dreapta",
-    "Width:": "Lăţime",
-    "percent": "procente",
-    "pixels": "pixeli"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/HorizontalRule/lang/ru.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/HorizontalRule/lang/ru.js
deleted file mode 100644
index ff2aa42..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/HorizontalRule/lang/ru.js
+++ /dev/null
@@ -1,25 +0,0 @@
-// I18N constants
-// LANG: "ru", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Alignment:": "Выравнивание",
-    "Cancel": "Отмена",
-    "Center": "Центр",
-    "Color:": "Цвет",
-    "Height:": "Высота",
-    "Horizontal Rule": "Горизонтальный разделитель",
-    "Layout": "Расположение",
-    "Left": "По левому краю",
-    "OK": "OK",
-    "Right": "По правому краю",
-    "Width:": "Ширина",
-    "percent": "процентов",
-    "pixels": "пикселей"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/HorizontalRule/lang/sh.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/HorizontalRule/lang/sh.js
deleted file mode 100644
index aebd0d6..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/HorizontalRule/lang/sh.js
+++ /dev/null
@@ -1,20 +0,0 @@
-// I18N constants
-// LANG: "sh", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Alignment:": "Ravnanje",
-    "Cancel": "Poništi",
-    "Horizontal Rule": "Horizontalna linija",
-    "Layout": "Prelom",
-    "Left": "Levo",
-    "OK": "OK",
-    "Right": "Desno",
-    "Width:": "Širina"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/HorizontalRule/lang/si.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/HorizontalRule/lang/si.js
deleted file mode 100644
index b71301f..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/HorizontalRule/lang/si.js
+++ /dev/null
@@ -1,15 +0,0 @@
-// I18N constants
-// LANG: "si", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Cancel": "Prekliči",
-    "Horizontal Rule": "Vodoravna črta",
-    "OK": "V redu"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/HorizontalRule/lang/sr.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/HorizontalRule/lang/sr.js
deleted file mode 100644
index 995a762..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/HorizontalRule/lang/sr.js
+++ /dev/null
@@ -1,20 +0,0 @@
-// I18N constants
-// LANG: "sr", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Alignment:": "Равнање",
-    "Cancel": "Поништи",
-    "Horizontal Rule": "Хоризонтална линија",
-    "Layout": "Прелом",
-    "Left": "Лево",
-    "OK": "OK",
-    "Right": "Десно",
-    "Width:": "Ширина"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/HorizontalRule/lang/sv.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/HorizontalRule/lang/sv.js
deleted file mode 100644
index a20d6a5..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/HorizontalRule/lang/sv.js
+++ /dev/null
@@ -1,25 +0,0 @@
-// I18N constants
-// LANG: "sv", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Alignment:": "Placering:",
-    "Cancel": "Avbryt",
-    "Center": "Centrera",
-    "Color:": "Färg",
-    "Height:": "Höjd:",
-    "Horizontal Rule": "Vågrät linje",
-    "Layout": "Layout",
-    "Left": "Venster",
-    "OK": "OK",
-    "Right": "Höger",
-    "Width:": "Bredd:",
-    "percent": "procent",
-    "pixels": "bildpunkter"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/HorizontalRule/lang/th.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/HorizontalRule/lang/th.js
deleted file mode 100644
index 2eac129..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/HorizontalRule/lang/th.js
+++ /dev/null
@@ -1,15 +0,0 @@
-// I18N constants
-// LANG: "th", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Cancel": "ยกเลิก",
-    "Horizontal Rule": "เส้นกึ่งกลาง",
-    "OK": "ตกลง"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/HorizontalRule/lang/tr.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/HorizontalRule/lang/tr.js
deleted file mode 100644
index 75253dc..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/HorizontalRule/lang/tr.js
+++ /dev/null
@@ -1,25 +0,0 @@
-// I18N constants
-// LANG: "tr", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Alignment:": "Hizalama:",
-    "Cancel": "İptal",
-    "Center": "Ortala",
-    "Color:": "Renk",
-    "Height:": "Yükseklik",
-    "Horizontal Rule": "Yatay cetvel",
-    "Layout": "Düzen",
-    "Left": "Sola",
-    "OK": "Tamam",
-    "Right": "Sağa",
-    "Width:": "Genişlik:",
-    "percent": "%",
-    "pixels": "Piksel"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/HorizontalRule/lang/vn.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/HorizontalRule/lang/vn.js
deleted file mode 100644
index 402ebe1..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/HorizontalRule/lang/vn.js
+++ /dev/null
@@ -1,15 +0,0 @@
-// I18N constants
-// LANG: "vn", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Cancel": "Hủy",
-    "Horizontal Rule": "Dòng Kẻ Ngang",
-    "OK": "Đồng ý"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/HorizontalRule/lang/zh_cn.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/HorizontalRule/lang/zh_cn.js
deleted file mode 100644
index 1878fa1..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/HorizontalRule/lang/zh_cn.js
+++ /dev/null
@@ -1,13 +0,0 @@
-// I18N constants
-// LANG: "zh_cn", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Horizontal Rule": "水平线"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/HorizontalRule/popups/edit_horizontal_rule.html b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/HorizontalRule/popups/edit_horizontal_rule.html
deleted file mode 100644
index aad7302..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/HorizontalRule/popups/edit_horizontal_rule.html
+++ /dev/null
@@ -1,141 +0,0 @@
-<!DOCTYPE html
-     PUBLIC "-//W3C//DTD XHTML 1.0 Strict//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/Edit Horizontal Rule</title>
-  <link rel="stylesheet" type="text/css" href="../../../popups/popup.css" />
-  <script type="text/javascript" src="../../../popups/popup.js"></script>
-  <script type="text/javascript" src="../../../modules/ColorPicker/ColorPicker.js"></script>
-<script type="text/javascript">
-editor = window.opener.editor;
-
-function Init() {
-	__dlg_translate("HorizontalRule");
-	__dlg_init(null,{width:320,height:290});
-	var params = window.dialogArguments;
-	if(params) {
-		document.getElementById("f_size").value = params.f_size;
-		document.getElementById("f_width").value = params.f_width;
-		document.getElementById("f_widthUnit").value = params.f_widthUnit;
-		document.getElementById("f_align").value = params.f_align;
-		document.getElementById("f_color").value = params.f_color;
-		document.getElementById("hrpv").style.backgroundColor = params.f_color;
-		document.getElementById("f_noshade").checked = params.f_noshade;
-	}
-	
-	var colpick = document.getElementById('hrpv');
-	var f_color = document.getElementById('f_color');
-	var colPicker = new Xinha.colorPicker({cellsize:'5px',callback:selectColor});
-	colpick.onclick = function() { colPicker.open('top,left',colpick, f_color.value ); }
-	
-	document.getElementById("f_width").focus();
-}
-
-function onOK() {
-  var fields = ["f_size", "f_width", "f_widthUnit", "f_align", "f_color", "f_noshade"];
-  var param = {};
-  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;
-}
-
-function selectColor(color) {
-	document.getElementById('hrpv').style.backgroundColor = color;
-	document.getElementById('f_color').value = color;
-}
-window.onload = Init;
-</script>
-
-<style type="text/css">
-.buttonColor {
-  padding: 1px;
-  cursor: default;
-  border: 1px solid;
-  border-color: ButtonHighlight ButtonShadow ButtonShadow ButtonHighlight;
-}
-
-.buttonColor-hilite {
-  border-color: #000;
-}
-
-.buttonColor .chooser {
-  height: 0.6em;
-  border: 1px solid;
-  padding: 0px 1em;
-  border-color: ButtonShadow ButtonHighlight ButtonHighlight ButtonShadow;
-}
-
-.buttonColor .nocolor {
-  padding: 0px;
-  height: 0.6em;
-  border: 1px solid;
-  border-color: ButtonShadow ButtonHighlight ButtonHighlight ButtonShadow;
-}
-.buttonColor .nocolor-hilite { background-color: #fff; color: #f00; }
-</style>
-
-</head>
-
-<body class="dialog">
-<div class="title">Horizontal Rule</div>
-<form action="" method="get">
-  <fieldset>
-  <legend>Layout</legend>
-    <div class="fr">Width:</div>
-    <input style="margin-right: 0.5em;" name="f_width" id="f_width" size="5" type="text" />
-    <select style="margin-right: 0.5em;" name="f_widthUnit" id="f_widthUnit">
-      <option value="%">percent</option>
-      <option value="px">pixels</option>
-    </select>
-	<br />
-    <div class="fr">Height:</div>
-    <input style="margin-right: 0.5em;" name="f_size" id="f_size" size="5" type="text" /> <span>pixels</span>
-	<br />
-    <div class="fr">Alignment:</div>
-    <select name="f_align" id="f_align">
-      <option value="left">Left</option>
-      <option value="center">Center</option>
-      <option value="right">Right</option>
-    </select>
-
-  </fieldset>
-  <fieldset>
-  <legend>Style</legend>
-    <div class="fr">Color:</div>
-    <table cellpadding="2" cellspacing="0" id="hrbtn" class="buttonColor">
-    <tr>
-      <td class="chooser" id="hrpv"
-          onmouseover="document.getElementById('hrbtn').style.borderColor='black'"
-          onmouseout="document.getElementById('hrbtn').style.borderColor='ButtonHighlight ButtonShadow ButtonShadow ButtonHighlight'"
-          >&nbsp;</td>
-      <td class="nocolor" id="hrclr"
-          onmouseover="document.getElementById('hrclr').style.color='#f00'"
-          onmouseout="document.getElementById('hrclr').style.color='#000'"
-          onclick="document.getElementById('f_color').value='';	document.getElementById('hrpv').style.backgroundColor=''">&#x00d7;</td>
-    </tr>
-    </table>
-    <br />
-    <div class="fr"> </div>
-    <input type="hidden" name="f_color" id="f_color" />
-    <input type="checkbox" name="f_noshade" id="f_noshade" value="noshade" />
-    <span>No shading</span>
-    <br />
-  </fieldset>
-<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-1.5.1/plugins/HtmlEntities/Entities.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/HtmlEntities/Entities.js
deleted file mode 100644
index b9e6b9a..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/HtmlEntities/Entities.js
+++ /dev/null
@@ -1,204 +0,0 @@
-{
-"&iexcl;" : "¡",
-"&cent;" : "¢",
-"&pound;" : "£",
-"&curren;" : "¤",
-"&yen;" : "¥",
-"&brvbar;" : "¦",
-"&sect;" : "§",
-"&uml;" : "¨",
-"&copy;" : "©",
-"&ordf;" : "ª",
-"&laquo;" : "«",
-"&not;" : "¬",
-"&reg;" : "®",
-"&macr;" : "¯",
-"&deg;" : "°",
-"&plusmn;" : "±",
-"&sup2;" : "²",
-"&sup3;" : "³",
-"&acute;" : "´",
-"&micro;" : "µ",
-"&para;" : "¶",
-"&middot;" : "·",
-"&cedil;" : "¸",
-"&sup1;" : "¹",
-"&ordm;" : "º",
-"&raquo;" : "»",
-"&frac14;" : "¼",
-"&frac12;" : "½",
-"&frac34;" : "¾",
-"&iquest;" : "¿",
-"&Agrave;" : "À",
-"&Aacute;" : "Á",
-"&Acirc;" : "Â",
-"&Atilde;" : "Ã",
-"&Auml;" : "Ä",
-"&Aring;" : "Å",
-"&AElig;" : "Æ",
-"&Ccedil;" : "Ç",
-"&Egrave;" : "È",
-"&Eacute;" : "É",
-"&Ecirc;" : "Ê",
-"&Euml;" : "Ë",
-"&Igrave;" : "Ì",
-"&Iacute;" : "Í",
-"&Icirc;" : "Î",
-"&Iuml;" : "Ï",
-"&ETH;" : "Ð",
-"&Ntilde;" : "Ñ",
-"&Ograve;" : "Ò",
-"&Oacute;" : "Ó",
-"&Ocirc;" : "Ô",
-"&Otilde;" : "Õ",
-"&Ouml;" : "Ö",
-"&times;" : "×",
-"&Oslash;" : "Ø",
-"&Ugrave;" : "Ù",
-"&Uacute;" : "Ú",
-"&Ucirc;" : "Û",
-"&Uuml;" : "Ü",
-"&Yacute;" : "Ý",
-"&THORN;" : "Þ",
-"&szlig;" : "ß",
-"&agrave;" : "à",
-"&aacute;" : "á",
-"&acirc;" : "â",
-"&atilde;" : "ã",
-"&auml;" : "ä",
-"&aring;" : "å",
-"&aelig;" : "æ",
-"&ccedil;" : "ç",
-"&egrave;" : "è",
-"&eacute;" : "é",
-"&ecirc;" : "ê",
-"&euml;" : "ë",
-"&igrave;" : "ì",
-"&iacute;" : "í",
-"&icirc;" : "î",
-"&iuml;" : "ï",
-"&eth;" : "ð",
-"&ntilde;" : "ñ",
-"&ograve;" : "ò",
-"&oacute;" : "ó",
-"&oacute;" : "ó",
-"&ocirc;" : "ô",
-"&otilde;" : "õ",
-"&ouml;" : "ö",
-"&divide;" : "÷",
-"&oslash;" : "ø",
-"&ugrave;" : "ù",
-"&uacute;" : "ú",
-"&ucirc;" : "û",
-"&uuml;" : "ü",
-"&yacute;" : "ý",
-"&thorn;" : "þ",
-"&yuml;" : "ÿ",
-"&fnof;" : "ƒ",
-"&Alpha;" : "Α",
-"&Beta;" : "Β",
-"&Gamma;" : "Γ",
-"&Delta;" : "Δ",
-"&Epsilon;" : "Ε",
-"&Zeta;" : "Ζ",
-"&Eta;" : "Η",
-"&Theta;" : "Θ",
-"&Iota;" : "Ι",
-"&Kappa;" : "Κ",
-"&Lambda;" : "Λ",
-"&Mu;" : "Μ",
-"&Nu;" : "Ν",
-"&Xi;" : "Ξ",
-"&Omicron;" : "Ο ",
-"&Pi;" : "Π",
-"&Rho;" : "Ρ",
-"&Sigma;" : "Σ",
-"&Tau;" : "Τ",
-"&Upsilon;" : "Υ",
-"&Phi;" : "Φ",
-"&Chi;" : "Χ",
-"&Psi;" : "Ψ",
-"&Omega;" : "Ω",
-"&alpha;" : "α",
-"&beta;" : "β",
-"&gamma;" : "γ",
-"&delta;" : "δ",
-"&epsilon;" : "ε",
-"&zeta;" : "ζ",
-"&eta;" : "η",
-"&theta;" : "θ",
-"&iota;" : "ι",
-"&kappa;" : "κ",
-"&lambda;" : "λ",
-"&mu;" : "μ",
-"&nu;" : "ν",
-"&xi;" : "ξ",
-"&omicron;" : "ο",
-"&pi;" : "π",
-"&rho;" : "ρ",
-"&sigmaf;" : "ς",
-"&sigma;" : "σ",
-"&tau;" : "τ",
-"&upsilon;" : "υ",
-"&phi;" : "φ",
-"&omega;" : "ω",
-"&bull;" : "•",
-"&hellip;" : "…",
-"&prime;" : "′",
-"&Prime;" : "″",
-"&oline;" : "‾",
-"&frasl;" : "⁄",
-"&trade;" : "™",
-"&larr;" : "←",
-"&uarr;" : "↑",
-"&rarr;" : "→",
-"&darr;" : "↓",
-"&harr;" : "↔",
-"&rArr;" : "⇒",
-"&part;" : "∂",
-"&prod;" : "∏",
-"&sum;" : "∑",
-"&minus;" : "−",
-"&radic;" : "√",
-"&infin;" : "∞",
-"&cap;" : "∩",
-"&int;" : "∫",
-"&asymp;" : "≈",
-"&ne;" : "≠",
-"&equiv;" : "≡",
-"&le;" : "≤",
-"&ge;" : "≥",
-"&loz;" : "◊",
-"&spades;" : "♠",
-"&clubs;" : "♣",
-"&hearts;" : "♥",
-"&diams;" : "♦",
-"&OElig;" : "Œ",
-"&oelig;" : "œ",
-"&Scaron;" : "Š",
-"&scaron;" : "š",
-"&Yuml;" : "Ÿ",
-"&circ;" : "ˆ",
-"&tilde;" : "˜",
-"&ndash;" : "–",
-"&mdash;" : "—",
-"&lsquo;" : "‘",
-"&rsquo;" : "’",
-"&sbquo;" : "‚",
-"&ldquo;" : "“",
-"&rdquo;" : "”",
-"&bdquo;" : "„",
-"&dagger;" : "†",
-"&Dagger;" : "‡",
-"&permil;" : "‰",
-"&lsaquo;" : "‹",
-"&rsaquo;" : "›",
-"&euro;" : "€",
-
-	// \x22 means '"' -- we use hex reprezentation so that we don't disturb
-	// JS compressors (well, at least mine fails.. ;)
-	
-	"&nbsp;" : "\xA0",
-	"&#8804;" : String.fromCharCode(0x2264), 
-	"&#8805;" : String.fromCharCode(0x2265)
-}
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/HtmlEntities/HtmlEntities.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/HtmlEntities/HtmlEntities.js
deleted file mode 100644
index 144536f..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/HtmlEntities/HtmlEntities.js
+++ /dev/null
@@ -1,51 +0,0 @@
-/*------------------------------------------*\
-HtmlEntities for Xinha
-____________________
-
-Intended to faciliate the use of special characters with ISO 8 bit encodings.
-
-Using the conversion map provided by mharrisonline in ticket #127
-
-If you want to adjust the list, e.g. to except the characters that are available in the used charset,
-edit Entities.js. 
-You may save it under a different name using the xinha_config.HtmlEntities.EntitiesFile variable
-
-ISO-8859-1 preset is default, set
-  
-  xinha_config.HtmlEntities.Encoding = null;
-
-if you want all special characters to be converted or want to load a custom file 
-\*------------------------------------------*/
-
-function HtmlEntities(editor) {
-	this.editor = editor;
-}
-
-HtmlEntities._pluginInfo = {
-  name          : "HtmlEntities",
-  version       : "1.0",
-  developer     : "Raimund Meyer",
-  developer_url : "http://x-webservice.net",
-  c_owner       : "Xinha community",
-  sponsor       : "",
-  sponsor_url   : "",
-  license       : "HTMLArea"
-}
-Xinha.Config.prototype.HtmlEntities =
-{
-	Encoding     : 'iso-8859-1',
-	EntitiesFile : Xinha.getPluginDir("HtmlEntities") + "/Entities.js"
-}
-HtmlEntities.prototype.onGenerate = function() {
-    var e = this.editor;
-    var url = (e.config.HtmlEntities.Encoding) ?  Xinha.getPluginDir("HtmlEntities") + "/"+e.config.HtmlEntities.Encoding+".js" : e.config.HtmlEntities.EntitiesFile;
-    var callback = function (getback) {
-    	var specialReplacements = e.config.specialReplacements;
-    	eval("var replacements =" + getback);
-    	for (var i in  replacements)
-		{
-			specialReplacements[i] =  replacements[i];	
-		}
-    }
-    Xinha._getback(url,callback);
-}
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/HtmlEntities/iso-8859-1.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/HtmlEntities/iso-8859-1.js
deleted file mode 100644
index 92c5aae..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/HtmlEntities/iso-8859-1.js
+++ /dev/null
@@ -1,109 +0,0 @@
-{
-"&fnof;" : "ƒ",
-"&Alpha;" : "Α",
-"&Beta;" : "Β",
-"&Gamma;" : "Γ",
-"&Delta;" : "Δ",
-"&Epsilon;" : "Ε",
-"&Zeta;" : "Ζ",
-"&Eta;" : "Η",
-"&Theta;" : "Θ",
-"&Iota;" : "Ι",
-"&Kappa;" : "Κ",
-"&Lambda;" : "Λ",
-"&Mu;" : "Μ",
-"&Nu;" : "Ν",
-"&Xi;" : "Ξ",
-"&Omicron;" : "Ο ",
-"&Pi;" : "Π",
-"&Rho;" : "Ρ",
-"&Sigma;" : "Σ",
-"&Tau;" : "Τ",
-"&Upsilon;" : "Υ",
-"&Phi;" : "Φ",
-"&Chi;" : "Χ",
-"&Psi;" : "Ψ",
-"&Omega;" : "Ω",
-"&alpha;" : "α",
-"&beta;" : "β",
-"&gamma;" : "γ",
-"&delta;" : "δ",
-"&epsilon;" : "ε",
-"&zeta;" : "ζ",
-"&eta;" : "η",
-"&theta;" : "θ",
-"&iota;" : "ι",
-"&kappa;" : "κ",
-"&lambda;" : "λ",
-"&mu;" : "μ",
-"&nu;" : "ν",
-"&xi;" : "ξ",
-"&omicron;" : "ο",
-"&pi;" : "π",
-"&rho;" : "ρ",
-"&sigmaf;" : "ς",
-"&sigma;" : "σ",
-"&tau;" : "τ",
-"&upsilon;" : "υ",
-"&phi;" : "φ",
-"&omega;" : "ω",
-"&bull;" : "•",
-"&hellip;" : "…",
-"&prime;" : "′",
-"&Prime;" : "″",
-"&oline;" : "‾",
-"&frasl;" : "⁄",
-"&trade;" : "™",
-"&larr;" : "←",
-"&uarr;" : "↑",
-"&rarr;" : "→",
-"&darr;" : "↓",
-"&harr;" : "↔",
-"&rArr;" : "⇒",
-"&part;" : "∂",
-"&prod;" : "∏",
-"&sum;" : "∑",
-"&minus;" : "−",
-"&radic;" : "√",
-"&infin;" : "∞",
-"&cap;" : "∩",
-"&int;" : "∫",
-"&asymp;" : "≈",
-"&ne;" : "≠",
-"&equiv;" : "≡",
-"&le;" : "≤",
-"&ge;" : "≥",
-"&loz;" : "◊",
-"&spades;" : "♠",
-"&clubs;" : "♣",
-"&hearts;" : "♥",
-"&diams;" : "♦",
-"&OElig;" : "Œ",
-"&oelig;" : "œ",
-"&Scaron;" : "Š",
-"&scaron;" : "š",
-"&Yuml;" : "Ÿ",
-"&circ;" : "ˆ",
-"&tilde;" : "˜",
-"&ndash;" : "–",
-"&mdash;" : "—",
-"&lsquo;" : "‘",
-"&rsquo;" : "’",
-"&sbquo;" : "‚",
-"&ldquo;" : "“",
-"&rdquo;" : "”",
-"&bdquo;" : "„",
-"&dagger;" : "†",
-"&Dagger;" : "‡",
-"&permil;" : "‰",
-"&lsaquo;" : "‹",
-"&rsaquo;" : "›",
-"&euro;" : "€",
-
-	// \x22 means '"' -- we use hex reprezentation so that we don't disturb
-	// JS compressors (well, at least mine fails.. ;)
-	
-	"&nbsp;" : "\xA0",
-	"&#8804;" : String.fromCharCode(0x2264), 
-	"&#8805;" : String.fromCharCode(0x2265)
-}
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/InsertAnchor/InsertAnchor.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/InsertAnchor/InsertAnchor.js
deleted file mode 100755
index 9e1f403..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/InsertAnchor/InsertAnchor.js
+++ /dev/null
@@ -1,166 +0,0 @@
-function InsertAnchor(editor) {

-  this.editor = editor;

-  var cfg = editor.config;

-  var self = this;

-  

-  this.placeholderImg = '<img class="IA_placeholder" src="'+Xinha.getPluginDir("InsertAnchor")+'/img/insert-anchor.gif" />';

-  

-  // register the toolbar buttons provided by this plugin

-  cfg.registerButton({

-  id       : "insert-anchor", 

-  tooltip  : this._lc("Insert Anchor"), 

-  image    : editor.imgURL("insert-anchor.gif", "InsertAnchor"),

-  textMode : false,

-  action   : function() {

-               self.show();

-             }

-  });

-  cfg.addToolbarElement("insert-anchor", "createlink", 1);

-}

-

-InsertAnchor._pluginInfo = {

-  name          : "InsertAnchor",

-  origin        : "version: 1.0, by Andre Rabold, MR Printware GmbH, http://www.mr-printware.de",

-  version       : "2.0",

-  developer     : "Udo Schmal",

-  developer_url : "http://www.schaffrath-neuemedien.de",

-  c_owner       : "Udo Schmal",

-  sponsor       : "L.N.Schaffrath NeueMedien",

-  sponsor_url   : "http://www.schaffrath-neuemedien.de",

-  license       : "htmlArea"

-};

-

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

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

-};

-

-InsertAnchor.prototype.onGenerate = function() {

-  this.editor.addEditorStylesheet(Xinha.getPluginDir("InsertAnchor") + '/insert-anchor.css');

-  

-};

-

-InsertAnchor.prototype.inwardHtml = function(html)

-{

-	html= html.replace(/(<a[^>]*class="anchor"[^>]*>)/g,"$1"+this.placeholderImg);

-	return html;

-}

-InsertAnchor.prototype.outwardHtml = function(html)

-{

-	html= html.replace(/(<img[^>]*class="?IA_placeholder"?[^>]*>)/ig,"");

-	return html;

-}

-InsertAnchor.prototype.onGenerateOnce = function()

-{

-	this._prepareDialog();

-};

-InsertAnchor.prototype._prepareDialog = function()

-{

-  var self = this;

-  var editor = this.editor;

-

-  if(!this.html)

-  {

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

-    return;

-  }

-  

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

-  this.dialog = new Xinha.Dialog(editor, this.html, 'InsertAnchor',{width:400});

-  

-  this.dialog.getElementById('ok').onclick = function() {self.apply();}

-

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

-	

-  this.ready = true;

-};

-

-InsertAnchor.prototype.show = function()

-{

-	if(!this.ready) // if the user is too fast clicking the, we have to make them wait

-	{

-  var self = this;

-		window.setTimeout(function() {self.show();},100);

-		return;

-  }

-  

-	var editor = this.editor;

-	this.selectedHTML = editor.getSelectedHTML();

-	var sel  = editor.getSelection();

-  this.range  = editor.createRange(sel);

-  this.a = editor.activeElement(sel);

-  

-  if(!(this.a != null && this.a.tagName.toLowerCase() == 'a'))

-  {

-    this.a = editor._getFirstAncestor(sel, 'a'); 

-  }

-  

-  this.dialog.getElementById('warning').style.display = 'none';

-  

-  if (this.a != null && this.a.tagName.toLowerCase() == 'a')

-  {

-    inputs = { name : this.a.id };

-  }

-  else

-  {

-    if(!this.editor.selectionEmpty(sel))

-    {

-      this.dialog.getElementById('warning').style.display = '';

-    }

-    inputs = { name : '' };

-  } 

-

-	this.dialog.show(inputs);

-

-	this.dialog.getElementById("name").focus();

-};

-

-InsertAnchor.prototype.apply = function ()

-{

-	var editor = this.editor;

-	var param = this.dialog.hide();

-	var anchor = param['name'];

-	var a = this.a;

-	var self = this;

-	if (anchor == "" || anchor == null)

-	{

-		if (a) 

-		{

-          var child = self.outwardHtml(a.innerHTML);

-          a.parentNode.removeChild(a);

-          editor.insertHTML(child);

-        }

-        return;

-	}

-	try 

-	{

-        var doc = editor._doc;

-		if (!a)

-		{

-          a = doc.createElement("a");

-          a.id = anchor;

-          a.name = anchor;

-          a.title = anchor;

-          a.className = "anchor";

-          a.innerHTML = self.placeholderImg;

-		//	var html = editor.getSelectedHTML();

-		//  if (html) a.innerHTML += html;

-			if (Xinha.is_ie) 

-			{

-            this.range.pasteHTML(a.outerHTML);

-          	}

-			else 

-			{

-            editor.insertNodeAtSelection(a);

-          }

-		}

-		else 

-		{

-          a.id = anchor;

-          a.name = anchor;

-          a.title = anchor;

-          a.className = "anchor";

-        }

-      }

-      catch (e) { }

-

-    }

diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/InsertAnchor/dialog.html b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/InsertAnchor/dialog.html
deleted file mode 100644
index 9f2fd8f..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/InsertAnchor/dialog.html
+++ /dev/null
@@ -1,19 +0,0 @@
-<h1 id="[h1]"><l10n>Insert Anchor</l10n></h1>
-<div style="margin: 10px;">
-<table border="0" style="width: 100%;">
-  <tr>
-    <td class="label"><l10n>Anchor name</l10n></td>
-    <td><input type="text" id="[name]" name="[name]" style="width: 80%" /></td>
-  </tr>
-</table>
-
-</div>
-
-<div style="margin: 10px;" id="[warning]">
-  <strong>Selected content may be replaced by the new anchor. Inserting an anchor is like inserting an image, you don't need to select anything.</strong>
-</div>
-
-<div class="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-1.5.1/plugins/InsertAnchor/img/insert-anchor.gif b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/InsertAnchor/img/insert-anchor.gif
deleted file mode 100755
index 9da891b..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/InsertAnchor/img/insert-anchor.gif
+++ /dev/null
Binary files differ
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/InsertAnchor/img/placeholder.gif b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/InsertAnchor/img/placeholder.gif
deleted file mode 100755
index 2c34277..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/InsertAnchor/img/placeholder.gif
+++ /dev/null
Binary files differ
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/InsertAnchor/insert-anchor.css b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/InsertAnchor/insert-anchor.css
deleted file mode 100755
index 0a6b2de..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/InsertAnchor/insert-anchor.css
+++ /dev/null
@@ -1,10 +0,0 @@
-a.anchor {
-  width: 18px;
-  height: 18px;
-  /*
-  background-image: url(img/insert-anchor.gif);
-  background-repeat: no-repeat;
-  background-position: left top;
-  border: 1px dotted blue;
-  */
-}
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/InsertAnchor/lang/ch.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/InsertAnchor/lang/ch.js
deleted file mode 100644
index 9d78e44..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/InsertAnchor/lang/ch.js
+++ /dev/null
@@ -1,14 +0,0 @@
-// I18N constants
-// LANG: "ch", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Cancel": "取消",
-    "OK": "好"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/InsertAnchor/lang/cz.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/InsertAnchor/lang/cz.js
deleted file mode 100644
index 36b9929..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/InsertAnchor/lang/cz.js
+++ /dev/null
@@ -1,14 +0,0 @@
-// I18N constants
-// LANG: "cz", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Cancel": "Zrušit",
-    "OK": "OK"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/InsertAnchor/lang/da.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/InsertAnchor/lang/da.js
deleted file mode 100644
index 20fc0d0..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/InsertAnchor/lang/da.js
+++ /dev/null
@@ -1,14 +0,0 @@
-// I18N constants
-// LANG: "da", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Cancel": "Annuller",
-    "OK": "OK"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/InsertAnchor/lang/de.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/InsertAnchor/lang/de.js
deleted file mode 100755
index a001844..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/InsertAnchor/lang/de.js
+++ /dev/null
@@ -1,17 +0,0 @@
-// I18N constants
-// LANG: "de", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Anchor name": "Name (ID)",
-    "Cancel": "Abbrechen",
-    "Delete": "Löschen",
-    "Insert Anchor": "Anker einfügen",
-    "OK": "OK"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/InsertAnchor/lang/ee.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/InsertAnchor/lang/ee.js
deleted file mode 100644
index ba916e9..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/InsertAnchor/lang/ee.js
+++ /dev/null
@@ -1,14 +0,0 @@
-// I18N constants
-// LANG: "ee", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Cancel": "Loobu",
-    "OK": "OK"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/InsertAnchor/lang/el.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/InsertAnchor/lang/el.js
deleted file mode 100644
index f6e006c..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/InsertAnchor/lang/el.js
+++ /dev/null
@@ -1,14 +0,0 @@
-// I18N constants
-// LANG: "el", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Cancel": "Ακύρωση",
-    "OK": "Εντάξει"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/InsertAnchor/lang/es.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/InsertAnchor/lang/es.js
deleted file mode 100644
index 95fd8cb..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/InsertAnchor/lang/es.js
+++ /dev/null
@@ -1,15 +0,0 @@
-// I18N constants
-// LANG: "es", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Cancel": "Cancelar",
-    "Delete": "Suprimir",
-    "OK": "Aceptar"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/InsertAnchor/lang/eu.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/InsertAnchor/lang/eu.js
deleted file mode 100644
index 3bc9dbb..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/InsertAnchor/lang/eu.js
+++ /dev/null
@@ -1,14 +0,0 @@
-// I18N constants
-// LANG: "eu", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Cancel": "Utzi",
-    "OK": "Ados"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/InsertAnchor/lang/fa.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/InsertAnchor/lang/fa.js
deleted file mode 100644
index 84e7f7e..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/InsertAnchor/lang/fa.js
+++ /dev/null
@@ -1,14 +0,0 @@
-// I18N constants
-// LANG: "fa", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Cancel": "انصراف",
-    "OK": "بله"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/InsertAnchor/lang/fi.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/InsertAnchor/lang/fi.js
deleted file mode 100644
index 82552b9..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/InsertAnchor/lang/fi.js
+++ /dev/null
@@ -1,14 +0,0 @@
-// I18N constants
-// LANG: "fi", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Cancel": "Peruuta",
-    "OK": "Hyväksy"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/InsertAnchor/lang/fr.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/InsertAnchor/lang/fr.js
deleted file mode 100644
index e182729..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/InsertAnchor/lang/fr.js
+++ /dev/null
@@ -1,17 +0,0 @@
-// I18N constants
-// LANG: "fr", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Anchor name": "Nom de l'ancre",
-    "Cancel": "Annuler",
-    "Delete": "Supprimer",
-    "Insert Anchor": "Insérer une ancre",
-    "OK": "OK"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/InsertAnchor/lang/he.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/InsertAnchor/lang/he.js
deleted file mode 100644
index a602f7c..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/InsertAnchor/lang/he.js
+++ /dev/null
@@ -1,14 +0,0 @@
-// I18N constants
-// LANG: "he", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Cancel": "ביטול",
-    "OK": "אישור"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/InsertAnchor/lang/hu.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/InsertAnchor/lang/hu.js
deleted file mode 100644
index b38528d..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/InsertAnchor/lang/hu.js
+++ /dev/null
@@ -1,14 +0,0 @@
-// I18N constants
-// LANG: "hu", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Cancel": "Mégsem",
-    "OK": "Rendben"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/InsertAnchor/lang/it.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/InsertAnchor/lang/it.js
deleted file mode 100644
index a0acb45..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/InsertAnchor/lang/it.js
+++ /dev/null
@@ -1,14 +0,0 @@
-// I18N constants
-// LANG: "it", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Cancel": "Annullamento",
-    "OK": "OK"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/InsertAnchor/lang/ja.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/InsertAnchor/lang/ja.js
deleted file mode 100644
index 7ef11a5..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/InsertAnchor/lang/ja.js
+++ /dev/null
@@ -1,17 +0,0 @@
-// I18N constants
-// LANG: "ja", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Anchor name": "アンカーの名前",
-    "Cancel": "中止",
-    "Delete": "削除",
-    "Insert Anchor": "アンカーの挿入",
-    "OK": "OK"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/InsertAnchor/lang/lc_base.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/InsertAnchor/lang/lc_base.js
deleted file mode 100644
index 810ae20..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/InsertAnchor/lang/lc_base.js
+++ /dev/null
@@ -1,29 +0,0 @@
-// I18N constants
-//
-// LANG: "en", ENCODING: UTF-8
-// Author: Translator-Name, <email@example.com>
-//
-// Last revision: 2018-04-12
-// 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).
-//
-// (Please, remove information below)
-// 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.)
-
-{
-    "Anchor name": "",
-    "Cancel": "",
-    "Delete": "",
-    "Insert Anchor": "",
-    "OK": ""
-}
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/InsertAnchor/lang/lt.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/InsertAnchor/lang/lt.js
deleted file mode 100644
index d118909..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/InsertAnchor/lang/lt.js
+++ /dev/null
@@ -1,14 +0,0 @@
-// I18N constants
-// LANG: "lt", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Cancel": "Atšaukti",
-    "OK": "OK"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/InsertAnchor/lang/lv.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/InsertAnchor/lang/lv.js
deleted file mode 100644
index f83d5d3..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/InsertAnchor/lang/lv.js
+++ /dev/null
@@ -1,14 +0,0 @@
-// I18N constants
-// LANG: "lv", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Cancel": "Atcelt",
-    "OK": "Labi"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/InsertAnchor/lang/nb.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/InsertAnchor/lang/nb.js
deleted file mode 100644
index 3ef2780..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/InsertAnchor/lang/nb.js
+++ /dev/null
@@ -1,17 +0,0 @@
-// I18N constants
-// LANG: "nb", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Anchor name": "Ankernavn (ID)",
-    "Cancel": "Avbryt",
-    "Delete": "Fjerne",
-    "Insert Anchor": "Sett inn anker",
-    "OK": "OK"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/InsertAnchor/lang/nl.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/InsertAnchor/lang/nl.js
deleted file mode 100644
index b35ab20..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/InsertAnchor/lang/nl.js
+++ /dev/null
@@ -1,17 +0,0 @@
-// I18N constants
-// LANG: "nl", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Anchor name": "Naam (ID)",
-    "Cancel": "Annuleren",
-    "Delete": "Verwijderen",
-    "Insert Anchor": "Anker invoegen",
-    "OK": "OK"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/InsertAnchor/lang/pl.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/InsertAnchor/lang/pl.js
deleted file mode 100644
index 09608ae..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/InsertAnchor/lang/pl.js
+++ /dev/null
@@ -1,17 +0,0 @@
-// I18N constants
-// LANG: "pl", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Anchor name": "Nazwa kotwicy",
-    "Cancel": "Anuluj",
-    "Delete": "Usuń",
-    "Insert Anchor": "Wstaw kotwicę",
-    "OK": "OK"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/InsertAnchor/lang/pt_br.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/InsertAnchor/lang/pt_br.js
deleted file mode 100644
index e4097b9..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/InsertAnchor/lang/pt_br.js
+++ /dev/null
@@ -1,17 +0,0 @@
-// I18N constants
-// LANG: "pt_br", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Anchor name": "Nome da âncora",
-    "Cancel": "Cancelar",
-    "Delete": "Deletar",
-    "Insert Anchor": "Inserir Âncora",
-    "OK": "OK"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/InsertAnchor/lang/ro.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/InsertAnchor/lang/ro.js
deleted file mode 100644
index 9d6e1c3..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/InsertAnchor/lang/ro.js
+++ /dev/null
@@ -1,14 +0,0 @@
-// I18N constants
-// LANG: "ro", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Cancel": "Renunţă",
-    "OK": "Acceptă"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/InsertAnchor/lang/ru.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/InsertAnchor/lang/ru.js
deleted file mode 100644
index fad59f2..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/InsertAnchor/lang/ru.js
+++ /dev/null
@@ -1,14 +0,0 @@
-// I18N constants
-// LANG: "ru", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Cancel": "Отмена",
-    "OK": "OK"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/InsertAnchor/lang/sh.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/InsertAnchor/lang/sh.js
deleted file mode 100644
index 62e76f7..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/InsertAnchor/lang/sh.js
+++ /dev/null
@@ -1,14 +0,0 @@
-// I18N constants
-// LANG: "sh", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Cancel": "Poništi",
-    "OK": "OK"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/InsertAnchor/lang/si.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/InsertAnchor/lang/si.js
deleted file mode 100644
index 7674892..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/InsertAnchor/lang/si.js
+++ /dev/null
@@ -1,14 +0,0 @@
-// I18N constants
-// LANG: "si", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Cancel": "Prekliči",
-    "OK": "V redu"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/InsertAnchor/lang/sr.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/InsertAnchor/lang/sr.js
deleted file mode 100644
index b7ee6f5..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/InsertAnchor/lang/sr.js
+++ /dev/null
@@ -1,14 +0,0 @@
-// I18N constants
-// LANG: "sr", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Cancel": "Поништи",
-    "OK": "OK"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/InsertAnchor/lang/sv.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/InsertAnchor/lang/sv.js
deleted file mode 100644
index 98336d8..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/InsertAnchor/lang/sv.js
+++ /dev/null
@@ -1,14 +0,0 @@
-// I18N constants
-// LANG: "sv", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Cancel": "Avbryt",
-    "OK": "OK"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/InsertAnchor/lang/th.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/InsertAnchor/lang/th.js
deleted file mode 100644
index 9da9c8d..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/InsertAnchor/lang/th.js
+++ /dev/null
@@ -1,14 +0,0 @@
-// I18N constants
-// LANG: "th", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Cancel": "ยกเลิก",
-    "OK": "ตกลง"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/InsertAnchor/lang/tr.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/InsertAnchor/lang/tr.js
deleted file mode 100644
index 1d2c8b9..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/InsertAnchor/lang/tr.js
+++ /dev/null
@@ -1,15 +0,0 @@
-// I18N constants
-// LANG: "tr", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Cancel": "İptal",
-    "Delete": "Sil",
-    "OK": "Tamam"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/InsertAnchor/lang/vn.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/InsertAnchor/lang/vn.js
deleted file mode 100644
index 2d82e02..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/InsertAnchor/lang/vn.js
+++ /dev/null
@@ -1,14 +0,0 @@
-// I18N constants
-// LANG: "vn", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Cancel": "Hủy",
-    "OK": "Đồng ý"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/InsertAnchor/popups/insert_anchor.html b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/InsertAnchor/popups/insert_anchor.html
deleted file mode 100644
index 33e5f47..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/InsertAnchor/popups/insert_anchor.html
+++ /dev/null
@@ -1,59 +0,0 @@
-<html>
-<head>
-  <title>Insert Anchor</title>
-  <link rel="stylesheet" type="text/css" href="../../../popups/popup.css" />
-  <script type="text/javascript" src="../../../popups/popup.js"></script>
-  <script type="text/javascript">
-  window.resizeTo(400, 150);
-function Init() {
-  __dlg_translate("InsertAnchor");
-  __dlg_init();
-
-  var param = window.dialogArguments;
-  if (param) {
-    document.getElementById("name").value = param["name"];
-  }
-  document.getElementById("name").focus();
-}
-
-function onOK() {
-  // pass data back to the calling window
-  var param = new Object();
-  param["name"] = document.getElementById("name").value;
-  __dlg_close(param);
-  return false;
-}
-
-function onDelete() {
-  // pass data back to the calling window
-  var param = new Object();
-  param["name"] = "";
-  __dlg_close(param);
-  return false;
-}
-
-function onCancel() {
-  __dlg_close(null);
-  return false;
-}
-</script>
-</head>
-
-<body class="dialog" onload="Init()">
-<div class="title">Insert Anchor</div>
-<form>
-<table border="0" style="width: 100%;">
-  <tr>
-    <td class="label">Anchor name</td>
-    <td><input type="text" id="name" style="width: 100%" /></td>
-  </tr>
-</table>
-
-<div id="buttons">
-  <button type="submit" name="ok" onclick="return onOK();">OK</button>
-  <button type="button" name="delete" onclick="return onDelete();">Delete</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-1.5.1/plugins/InsertNote/InsertNote.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/InsertNote/InsertNote.js
deleted file mode 100644
index d6a9695..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/InsertNote/InsertNote.js
+++ /dev/null
@@ -1,601 +0,0 @@
-/*------------------------------------------*\
-InsertNote plugin for Xinha
-___________________________
-     
-This program is free software; you can redistribute it and/or modify
-it under the terms of the GNU Lesser General Public License as published by
-the Free Software Foundation; either version 3 of the License, or (at
-your option) any later version.
-
-This program is distributed in the hope that it will be useful, 
-but WITHOUT ANY WARRANTY; without even the implied warranty of
-MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-Lesser General Public License (at http://www.gnu.org/licenses/lgpl.html) 
-for more details.
-
-InsertNote
-----------
-Allows for the insertion of footnotes/endnotes. Supports:
-  * Automatic numbering
-  * Automatic linking to anchors
-  * Links back to each specific citation
-  * Saves previously referenced notes for easy reuse
-  * Cleanup of unreferenced notes (or references to non-existent notes)
-\*------------------------------------------*/
-
-function InsertNote(editor)
-{
-  this.editor = editor;
-  var cfg = editor.config;
-  var self = this;
-
-  cfg.registerButton({
-    id       : "insert-note",
-    tooltip  : this._lc("Insert footnote"),
-    image    : editor.imgURL("insert-note.gif", "InsertNote"),
-    textMode : false,
-    action   : function() {
-      self.show();
-    }
-  });
-  cfg.addToolbarElement("insert-note", "createlink", 1);
-};
-
-InsertNote._pluginInfo = {
-  name          : "InsertNote",
-  version       : "0.4",
-  developer     : "Nicholas Bergson-Shilcock",
-  developer_url : "http://www.nicholasbs.com",
-  c_owner       : "Nicholas Bergson-Shilcock",
-  sponsor       : "The Open Planning Project",
-  sponsor_url   : "http://topp.openplans.org",
-  license       : "LGPL"
-};
-
-InsertNote.prototype.onGenerateOnce = function ()
-{
-  this.notes = {};
-  this.noteNums = {};
-  this.ID_PREFIX = "InsertNoteID_"; // This should suffice to be unique...
-  this.MARKER_SUFFIX = "_marker";
-  this.MARKER_CLASS = "InsertNoteMarker";
-  this.LINK_BACK_SUFFIX = "_LinkBacks";
-  this.NOTE_LIST_ID = "InsertNote_NoteList";
-
-  this._prepareDialog();
-};
-
-InsertNote.prototype._prepareDialog = function()
-{
-  var self = this;
-  var editor = this.editor;
-
-  if (!this.html)
-  {
-    Xinha._getback(Xinha.getPluginDir("InsertNote") + "/dialog.html",
-                   function(getback) { 
-                     self.html = getback;
-                     self._prepareDialog();
-                   });
-    return;
-  }
-
-  this.dialog = new Xinha.Dialog(editor, this.html, "InsertNote", 
-                                 {width: 400,
-                                  closeOnEscape: true,
-                                  resizable: false,
-                                  centered: true,
-                                  modal: true
-                                 });
-
-  this.dialog.getElementById("ok").onclick = function() {self.apply();};
-  this.dialog.getElementById("cancel").onclick = function() {self.dialog.hide();};
-  this.dialog.getElementById("noteMenu").onchange = function() {
-    var noteId = this.options[this.selectedIndex].value;
-    var text = self.notes[noteId] || "";
-    var textArea = self.dialog.getElementById("noteContent")
-    textArea.value = text;
-    if (text) {
-      textArea.disabled = true;
-    } else {
-      textArea.disabled = false;
-      textArea.focus();
-    }
-  };
-
-  this.ready = true;
-};
-
-InsertNote.prototype.show = function()
-{
-  if (!this.ready)
-  {
-    var self = this;
-    window.setTimeout(function() {self.show();}, 80);
-    return;
-  }
-  
-  var editor = this.editor;
-
-  // All of the Xinha dialogs are part of the main document, not the editor
-  // document, so we have to use the correct document reference to modify them.
-  var doc = document;
-
-  this.repairNotes();
-  
-  // Can't insert footnotes inside of other footnotes...
-  if (this.cursorInFootnote()) 
-  {
-    alert("Footnotes cannot be inserted inside of other footnotes.");
-    return
-  }
-
-  this.dialog.show();
-
-  var popupMenu = this.dialog.getElementById("noteMenu");
-  while (popupMenu.lastChild.value != "new")
-  {
-    // Remove all menu options except "New note"
-    popupMenu.removeChild(popupMenu.lastChild);
-  }
-  var temp, displayName, n;
-  var orderedIds = this._getOrderedNoteIds();
-  for (var i=0; i<orderedIds.length; i++)
-  {
-    n = orderedIds[i];
-    temp = doc.createElement("option");
-    temp.setAttribute("value", n);
-    displayName = this.notes[n];
-    displayName = displayName.replace(/<[^>]*>/gi, ""); // XXX TODO: Strip HTML less naively.
-    if (displayName.length > 50) // Truncate preview text to 50 chars
-    {
-      displayName = displayName.substr(0,50) + "...";
-    }
-    displayName = this._getNumFromNoteId(n) + ". " + displayName;
-    temp.appendChild(doc.createTextNode(displayName));
-    popupMenu.appendChild(temp);
-  }
-
-  var textArea = this.dialog.getElementById("noteContent");
-  textArea.disabled = false;
-  textArea.focus();
-  textArea.value = "";
-};
-
-// Checks to see whether or not the cursor is placed inside of a footnote
-InsertNote.prototype.cursorInFootnote = function(ignoreMarkers)
-{
-  var ancestors = this.editor.getAllAncestors();
-  for (var i=0; i<ancestors.length; i++) 
-  {
-    if (ancestors[i].id == this.NOTE_LIST_ID)
-      return true;
-    if (ancestors[i].className == this.MARKER_CLASS && !ignoreMarkers)
-      return true;
-  }
-  
-  return false;
-}
-
-/*  This function makes sure all of the notes are consistent.
-    Specifically:
-       * If a note exists but is never referred to, that note is removed
-       * Conversely, if a note is referred to but does not exist, the 
-         references are removed
-       * If the markup for a note marker exists but contains no visible
-         text, the markup is removed
-       * All numbering is updated as follows:
-          - the first note is numbered 1
-          - each note thereafter is numbered sequentially, unless it has
-            already been referenced, in which case it's given the same
-            number as it was the first time it was referenced.
-       * The note text stored in the this.notes hash is updated to reflect
-         any changes made by the user (so if the user changes the 
-         citation body in Xinha we don't overwrite these changes next
-         time we update things)
-       * The noteNums array is regenerated so as to be up to date
-
-*/
-InsertNote.prototype.repairNotes = function() 
-{
-  var self = this;
-  var note;
-  var markers;
-  var marker;
-  var isEmpty;
-  var temp;
-  var doc = this.editor._doc;
-
-  this.repairScheduled = false;
-
-  // First, we remove any markers if they reference a note that doesn't exist.
-  // If the note does exist, we make sure we have a reference to it by
-  // calling this._saveNote()
-  markers = this._getMarkers();
-  for (var i=0; i<markers.length; i++)
-  {
-    marker = markers[i];
-
-    // Remove empty markers
-    isEmpty = false;
-    if (marker) // check if anchor is empty
-      isEmpty = marker.innerHTML.match(/^(<span[^>]*>)?(<sup>)?(<a[^>]*>)?[\s]*(<\/a>)?(<\/sup>)?(<\/span>)?$/m);
-    if (isEmpty)
-      marker.parentNode.removeChild(marker);
-
-
-    var noteId = this._getIdFromMarkerId(marker.id);
-    if (!this.notes[noteId]) 
-    {
-      // We don't have this note stored, let's see if 
-      // it actually exists...
-      note = doc.getElementById(noteId);
-      if (note)
-      {
-        this._saveNote(note);
-      } else
-      {
-        if (marker)
-          marker.parentNode.removeChild(marker);
-      }
-    }
-  }
-
-  // Now we iterate through all the note ids we have stored...
-  for (var id in this.notes)
-  {
-    // Get reference to note
-    note = doc.getElementById(id);
-    
-    markers = this._getMarkers(id);
-    if (note)
-    {
-      if (markers.length == 0) // Remove note if it's not referenced anywhere
-      {
-        // remove the note
-        note.parentNode.removeChild(note);
-        delete this.notes[id];
-      } else 
-      {
-        // The note exists and *is* referenced, so we save its contents
-        this._saveNote(note);
-      }
-    } else
-    {
-      // Note no longer exists. Remove any references to it.
-      for (var i=0; i<markers.length; i++)
-      {
-        markers[i].parentNode.removeChild(markers[i]);
-      }
-      delete this.notes[id];
-    }
-  }
-
-  // Correct marker numbering
-  this._updateRefNums();
-
-  // At this point we now have all of the note markers correctly
-  // numbered, an up-to-date hash (this.noteNums) of note numbers 
-  // keyed to note ids, and no stray markers or unreferenced notes.
-
-  // Final step: Correct the numbering/order of the actual notes
-  var noteList = doc.getElementById(this.NOTE_LIST_ID);
-  var newNoteList = this._createNoteList();
-  if (newNoteList)
-  {
-    noteList.parentNode.replaceChild(newNoteList, noteList);
-  } else
-  {
-    if (noteList)
-      noteList.parentNode.removeChild(noteList);
-  }
-};
-
-InsertNote.prototype._saveNote = function(note)
-{
-  var doc = this.editor._doc;
-  // Before saving a note's contents, we do two things:
-  // 1) we remove the markup we inserted so we don't end up with duplicate links
-  // 2) check to see if the note is empty, and if so, we remove it
-  var temp = doc.getElementById(this._getLinkBackSpanId(note.id));
-  if (temp)
-    temp.parentNode.removeChild(temp);
-  if (note.innerHTML)
-  {
-    this.notes[note.id] = note.innerHTML;
-  } else
-  {
-    // If we're here then the note is empty,
-    // so we delete it and any markers for it.
-    delete this.notes[note.id];
-    markers = this._getMarkers(note.id);
-    for (var i=0; i<markers.length; i++)
-      markers[i].parentNode.removeChild(markers[i]);
-  }
-};
-
-InsertNote.prototype._updateRefNums = function()
-{
-  var runningCount = 1; // first reference is 1
-  var num;
-  var marker;
-  var noteId;
-
-  // Reset all note numbering...
-  this.noteNums = {};
-  
-  var markers = this._getMarkers();
-
-  for (var i=0; i<markers.length; i++)
-  {
-    marker = markers[i];
-    noteId = this._getIdFromMarkerId(marker.id);
-    if (this.noteNums[noteId])
-    {
-      num = this.noteNums[noteId];
-    } else
-    {
-      this.noteNums[noteId] = runningCount;
-      num = runningCount++;
-    }
-    // span -> sup -> anchor
-    marker.firstChild.firstChild.innerHTML = num;
-    // XXX TODO: don't use firstChild.firstChild?
-  }
-};
-
-InsertNote.prototype.apply = function()
-{
-  var editor = this.editor;
-  var param = this.dialog.hide();
-  var noteId = param['noteMenu'].value;
-  var newNote = (noteId == "new");
-  var noteContent = param['noteContent'];
-  var doc = editor._doc;
-
-  if (newNote) // Inserting a new note
-    noteId = this._getNextId(this.ID_PREFIX);
-
-  this.notes[noteId] = noteContent;
-
-  var markerTemplate = this._createNoteMarker(noteId)
-  editor.insertNodeAtSelection(markerTemplate);
-  var marker = doc.getElementById(markerTemplate.id);
-  
-  var currentNoteList = doc.getElementById(this.NOTE_LIST_ID);
-  var newNoteList = this._createNoteList();
-  var body = doc.body;
-  if (currentNoteList)
-  {
-    body.replaceChild(newNoteList, currentNoteList);
-  } else
-  {
-    body.appendChild(newNoteList);
-  }
-
-  var newel = doc.createTextNode('\u00a0');
-  if (marker.nextSibling)
-  {
-    newel = marker.parentNode.insertBefore(newel, marker.nextSibling);
-  } else
-  {
-    newel = marker.parentNode.appendChild(newel);
-  }
-  this.repairNotes();
-  editor.selectNodeContents(newel,false);
-};
-
-InsertNote.prototype._createNoteList = function()
-{
-  var doc = this.editor._doc;
-  var noteList = doc.createElement("ol");
-  noteList.id = this.NOTE_LIST_ID;
-  var orderedIds = this._getOrderedNoteIds();
-  if (orderedIds.length == 0)
-    return null;
-  var note, id;
-  for (var i=0; i<orderedIds.length; i++)
-  {
-    id = orderedIds[i];
-    note = this._createNoteNode(id, this.notes[id]);
-    noteList.appendChild(note);
-  }
-  return noteList;
-};
-
-InsertNote.prototype._createNoteMarker = function(noteId)
-{
-  // Create the note marker, i.e., the # superscript
-  var doc = this.editor._doc;
-  var noteNum = this._getNumFromNoteId(noteId);
-
-  var link = doc.createElement("a");
-  link.href = "#" + noteId;
-  link.innerHTML = noteNum;
-  
-  var superscript = doc.createElement("sup");
-  superscript.appendChild(link);
-
-  var span = doc.createElement("span");
-  span.id = this._getNextMarkerId(noteId);
-  span.className = this.MARKER_CLASS;
-  span.appendChild(superscript);
-
-  return span
-};
-
-InsertNote.prototype._createNoteNode = function(noteId, noteContent)
-{
-  var doc = this.editor._doc;
-
-  var anchor;
-  var superscript = doc.createElement("sup");
-  var markers = this._getMarkers(noteId);
-  var temp;
-  for (var i=0; i<markers.length; i++)
-  {
-    anchor = doc.createElement("a");    
-    if (markers.length == 1)
-    {
-      anchor.innerHTML = "^";
-    }
-    else
-    {
-      anchor.innerHTML = this._letterNum(i);
-    }
-    anchor.href = "#" + markers[i].id;
-    superscript.appendChild(anchor);
-    if (i < markers.length-1)
-    {
-      temp = doc.createTextNode(", ");
-      superscript.appendChild(temp);
-    }
-  }
-
-  var span = doc.createElement("span");
-  span.id = this._getLinkBackSpanId(noteId);
-  span.appendChild(superscript);
-
-  var li = doc.createElement("li");
-  li.id = noteId;
-  li.innerHTML = noteContent;
-  li.appendChild(span);
-
-  return li;
-};
-
-InsertNote.prototype._getNextId = function(prefix)
-{
-  // We can't just use Xinha.uniq here because it doesn't
-  // work across editing sessions. E.g., it will break if 
-  // the user copies the html from one editor to another.
-  var id = Xinha.uniq(prefix);
-  while (this.editor._doc.getElementById(id))
-    id = Xinha.uniq(prefix);
-  return id;
-};
-
-InsertNote.prototype._getOrderedNoteIds = function()
-{
-  var self = this;
-  var orderedIds = new Array();
-  for (var id in this.notes)
-    orderedIds.push(id);
-  
-  orderedIds.sort(function(a,b) {
-    var n1 = self._getNumFromNoteId(a);
-    var n2 = self._getNumFromNoteId(b);
-
-    return (n1 - n2);
-  });
-
-  return orderedIds;
-};
-
-InsertNote.prototype._getNumFromNoteId = function(noteId)
-{
-  if (!this.noteNums[noteId])
-    return 0;
-  return this.noteNums[noteId];
-};
-
-
-// Return array of all markers that reference the specified note.
-// If noteId is not supplied, *all* markers are returned.
-InsertNote.prototype._getMarkers = function(noteId)
-{
-  var doc = this.editor._doc;
-  var markers = Xinha.getElementsByClassName(doc, this.MARKER_CLASS);
-  
-  if (!noteId)
-    return markers;
-  
-  var els = new Array();
-  for (var i=0; i<markers.length; i++)
-  {
-    if (this._getIdFromMarkerId(markers[i].id) == noteId)
-    {
-      els.push(markers[i]);
-    }
-  }
-  return els;
-};
-
-InsertNote.prototype._getNextMarkerId = function(noteId)
-{
-  return this._getNextId(noteId + this.MARKER_SUFFIX);
-};
-
-InsertNote.prototype._getIdFromMarkerId = function(markerId)
-{
-  return markerId.substr(0, markerId.search(this.MARKER_SUFFIX));
-};
-
-InsertNote.prototype._getLinkBackSpanId = function(noteId)
-{
-  return noteId + this.LINK_BACK_SUFFIX;
-};
-
-InsertNote.prototype._lc = function(string)
-{
-  return Xinha._lc(string, "InsertNote");
-};
-
-// Probably overkill, but it does the job
-InsertNote.prototype._letterNum = function(num)
-{
-  var letters = "abcdefghijklmnopqrstuvwxyz";
-  var len = Math.floor(num/letters.length) + 1;
-  var s = "";
-  for (var i=0; i<len; i++)
-    s += letters.substr(num % letters.length,1);
-  return s;
-};
-
-InsertNote.prototype.inwardHtml = function(html)
-{
-  return html;
-};
-
-InsertNote.prototype.outwardHtml = function(html)
-{
-  this.repairNotes();
-  return this.editor.getHTML();
-};
-
-InsertNote.prototype.onKeyPress = function (event)
-{
-  // This seems a bit hacky, but I don't presently see
-  // a better way.
-  //@NOTE: 8 = Backspace, 46 = Delete; this undocumented
-  //  function apears to be for handling delete note references
-  //  to have the note automatically deleted also
-  if (event.keyCode == 8 || event.keyCode == 46)
-  {
-    var self = this;
-    if (!this.repairScheduled && !this.cursorInFootnote(true)) // ignore if in a footnote
-    {
-      this.repairScheduled = true;
-      window.setTimeout(function() { self.repairNotes(); }, 1000);
-    }
-  }
-  return false;
-};
-
-/**
- * 
- * @param {String} mode either 'textmode' or 'wysiwyg'
- */
-InsertNote.prototype.onMode = function (mode)
-{
-  return false;
-};
-
-/**
- * 
- * @param {String} mode either 'textmode' or 'wysiwyg'
- */
-InsertNote.prototype.onBeforeMode = function (mode)
-{
-  return false;
-};
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/InsertNote/dialog.html b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/InsertNote/dialog.html
deleted file mode 100644
index e8fa71d..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/InsertNote/dialog.html
+++ /dev/null
@@ -1,12 +0,0 @@
-<h1 id="[h1]"><l10n>Insert Note</l10n></h1>
-<div style="margin: 10px 10px 0px 10px;">
-  <label><l10n>Insert</l10n></label>
-  <select id="[noteMenu]" name="[noteMenu]" style="margin-bottom: 6px; width: 200px;">
-    <option selected value="new" id="[newNoteOption]">New footnote</option>
-  </select>
-  <textarea id="[noteContent]" name="[noteContent]" style="width: 375px;" rows="6"></textarea>
-</div>
-<div class="buttons">
-  <input type="button" id="[ok]" value="_(Insert)" />
-  <input type="button" id="[cancel]" value="_(Cancel)" />
-</div>
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/InsertNote/img/insert-note.gif b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/InsertNote/img/insert-note.gif
deleted file mode 100644
index 7e9dd1a..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/InsertNote/img/insert-note.gif
+++ /dev/null
Binary files differ
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/InsertNote/lang/ch.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/InsertNote/lang/ch.js
deleted file mode 100644
index 62e5bd6..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/InsertNote/lang/ch.js
+++ /dev/null
@@ -1,13 +0,0 @@
-// I18N constants
-// LANG: "ch", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Cancel": "取消"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/InsertNote/lang/cz.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/InsertNote/lang/cz.js
deleted file mode 100644
index c26a48b..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/InsertNote/lang/cz.js
+++ /dev/null
@@ -1,13 +0,0 @@
-// I18N constants
-// LANG: "cz", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Cancel": "Zrušit"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/InsertNote/lang/da.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/InsertNote/lang/da.js
deleted file mode 100644
index 2f85401..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/InsertNote/lang/da.js
+++ /dev/null
@@ -1,13 +0,0 @@
-// I18N constants
-// LANG: "da", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Cancel": "Annuller"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/InsertNote/lang/de.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/InsertNote/lang/de.js
deleted file mode 100644
index 0e18885..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/InsertNote/lang/de.js
+++ /dev/null
@@ -1,13 +0,0 @@
-// I18N constants
-// LANG: "de", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Cancel": "Abbrechen"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/InsertNote/lang/ee.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/InsertNote/lang/ee.js
deleted file mode 100644
index aacd840..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/InsertNote/lang/ee.js
+++ /dev/null
@@ -1,13 +0,0 @@
-// I18N constants
-// LANG: "ee", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Cancel": "Loobu"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/InsertNote/lang/el.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/InsertNote/lang/el.js
deleted file mode 100644
index 7b4695f..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/InsertNote/lang/el.js
+++ /dev/null
@@ -1,13 +0,0 @@
-// I18N constants
-// LANG: "el", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Cancel": "Ακύρωση"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/InsertNote/lang/es.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/InsertNote/lang/es.js
deleted file mode 100644
index 113ea9e..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/InsertNote/lang/es.js
+++ /dev/null
@@ -1,13 +0,0 @@
-// I18N constants
-// LANG: "es", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Cancel": "Cancelar"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/InsertNote/lang/eu.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/InsertNote/lang/eu.js
deleted file mode 100644
index 1021bf7..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/InsertNote/lang/eu.js
+++ /dev/null
@@ -1,13 +0,0 @@
-// I18N constants
-// LANG: "eu", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Cancel": "Utzi"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/InsertNote/lang/fa.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/InsertNote/lang/fa.js
deleted file mode 100644
index fd57189..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/InsertNote/lang/fa.js
+++ /dev/null
@@ -1,13 +0,0 @@
-// I18N constants
-// LANG: "fa", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Cancel": "انصراف"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/InsertNote/lang/fi.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/InsertNote/lang/fi.js
deleted file mode 100644
index 0233ac0..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/InsertNote/lang/fi.js
+++ /dev/null
@@ -1,13 +0,0 @@
-// I18N constants
-// LANG: "fi", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Cancel": "Peruuta"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/InsertNote/lang/fr.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/InsertNote/lang/fr.js
deleted file mode 100644
index 164c263..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/InsertNote/lang/fr.js
+++ /dev/null
@@ -1,13 +0,0 @@
-// I18N constants
-// LANG: "fr", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Cancel": "Annuler"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/InsertNote/lang/he.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/InsertNote/lang/he.js
deleted file mode 100644
index f65ddc7..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/InsertNote/lang/he.js
+++ /dev/null
@@ -1,13 +0,0 @@
-// I18N constants
-// LANG: "he", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Cancel": "ביטול"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/InsertNote/lang/hu.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/InsertNote/lang/hu.js
deleted file mode 100644
index 58d5664..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/InsertNote/lang/hu.js
+++ /dev/null
@@ -1,13 +0,0 @@
-// I18N constants
-// LANG: "hu", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Cancel": "Mégsem"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/InsertNote/lang/it.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/InsertNote/lang/it.js
deleted file mode 100644
index 2aba43a..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/InsertNote/lang/it.js
+++ /dev/null
@@ -1,13 +0,0 @@
-// I18N constants
-// LANG: "it", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Cancel": "Annullamento"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/InsertNote/lang/ja.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/InsertNote/lang/ja.js
deleted file mode 100644
index 1c389b8..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/InsertNote/lang/ja.js
+++ /dev/null
@@ -1,13 +0,0 @@
-// I18N constants
-// LANG: "ja", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Cancel": "中止"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/InsertNote/lang/lc_base.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/InsertNote/lang/lc_base.js
deleted file mode 100644
index 3821d66..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/InsertNote/lang/lc_base.js
+++ /dev/null
@@ -1,28 +0,0 @@
-// I18N constants
-//
-// LANG: "en", ENCODING: UTF-8
-// Author: Translator-Name, <email@example.com>
-//
-// Last revision: 2018-04-12
-// 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).
-//
-// (Please, remove information below)
-// 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.)
-
-{
-    "Cancel": "",
-    "Insert": "",
-    "Insert Note": "",
-    "Insert footnote": ""
-}
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/InsertNote/lang/lt.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/InsertNote/lang/lt.js
deleted file mode 100644
index dbbc674..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/InsertNote/lang/lt.js
+++ /dev/null
@@ -1,13 +0,0 @@
-// I18N constants
-// LANG: "lt", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Cancel": "Atšaukti"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/InsertNote/lang/lv.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/InsertNote/lang/lv.js
deleted file mode 100644
index 0bc68d5..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/InsertNote/lang/lv.js
+++ /dev/null
@@ -1,13 +0,0 @@
-// I18N constants
-// LANG: "lv", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Cancel": "Atcelt"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/InsertNote/lang/nb.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/InsertNote/lang/nb.js
deleted file mode 100644
index 19624a0..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/InsertNote/lang/nb.js
+++ /dev/null
@@ -1,13 +0,0 @@
-// I18N constants
-// LANG: "nb", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Cancel": "Avbryt"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/InsertNote/lang/nl.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/InsertNote/lang/nl.js
deleted file mode 100644
index 0ddb123..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/InsertNote/lang/nl.js
+++ /dev/null
@@ -1,13 +0,0 @@
-// I18N constants
-// LANG: "nl", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Cancel": "Annuleren"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/InsertNote/lang/pl.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/InsertNote/lang/pl.js
deleted file mode 100644
index 9232930..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/InsertNote/lang/pl.js
+++ /dev/null
@@ -1,13 +0,0 @@
-// I18N constants
-// LANG: "pl", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Cancel": "Anuluj"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/InsertNote/lang/pt_br.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/InsertNote/lang/pt_br.js
deleted file mode 100644
index 46e9dc6..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/InsertNote/lang/pt_br.js
+++ /dev/null
@@ -1,14 +0,0 @@
-// I18N constants
-// LANG: "pt_br", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Cancel": "Cancelar",
-    "Insert": "Inserir"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/InsertNote/lang/ro.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/InsertNote/lang/ro.js
deleted file mode 100644
index 4c4e19f..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/InsertNote/lang/ro.js
+++ /dev/null
@@ -1,13 +0,0 @@
-// I18N constants
-// LANG: "ro", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Cancel": "Renunţă"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/InsertNote/lang/ru.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/InsertNote/lang/ru.js
deleted file mode 100644
index f569cfd..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/InsertNote/lang/ru.js
+++ /dev/null
@@ -1,13 +0,0 @@
-// I18N constants
-// LANG: "ru", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Cancel": "Отмена"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/InsertNote/lang/sh.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/InsertNote/lang/sh.js
deleted file mode 100644
index 603b0c4..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/InsertNote/lang/sh.js
+++ /dev/null
@@ -1,13 +0,0 @@
-// I18N constants
-// LANG: "sh", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Cancel": "Poništi"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/InsertNote/lang/si.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/InsertNote/lang/si.js
deleted file mode 100644
index 103d160..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/InsertNote/lang/si.js
+++ /dev/null
@@ -1,13 +0,0 @@
-// I18N constants
-// LANG: "si", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Cancel": "Prekliči"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/InsertNote/lang/sr.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/InsertNote/lang/sr.js
deleted file mode 100644
index 8d966e6..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/InsertNote/lang/sr.js
+++ /dev/null
@@ -1,13 +0,0 @@
-// I18N constants
-// LANG: "sr", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Cancel": "Поништи"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/InsertNote/lang/sv.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/InsertNote/lang/sv.js
deleted file mode 100644
index 18b6397..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/InsertNote/lang/sv.js
+++ /dev/null
@@ -1,13 +0,0 @@
-// I18N constants
-// LANG: "sv", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Cancel": "Avbryt"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/InsertNote/lang/th.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/InsertNote/lang/th.js
deleted file mode 100644
index bd36b85..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/InsertNote/lang/th.js
+++ /dev/null
@@ -1,13 +0,0 @@
-// I18N constants
-// LANG: "th", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Cancel": "ยกเลิก"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/InsertNote/lang/tr.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/InsertNote/lang/tr.js
deleted file mode 100644
index 163623d..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/InsertNote/lang/tr.js
+++ /dev/null
@@ -1,13 +0,0 @@
-// I18N constants
-// LANG: "tr", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Cancel": "İptal"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/InsertNote/lang/vn.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/InsertNote/lang/vn.js
deleted file mode 100644
index ec2d779..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/InsertNote/lang/vn.js
+++ /dev/null
@@ -1,13 +0,0 @@
-// I18N constants
-// LANG: "vn", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Cancel": "Hủy"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/InsertPagebreak/InsertPagebreak.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/InsertPagebreak/InsertPagebreak.js
deleted file mode 100644
index c736ee1..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/InsertPagebreak/InsertPagebreak.js
+++ /dev/null
@@ -1,43 +0,0 @@
-// InsertPagebreak plugin for HTMLArea/Xinha

-// Implementation by Udo Schmal & Schaffrath NeueMedien

-// Original Author - Udo Schmal

-//

-// (c) Udo Schmal & Schaffrath NeueMedien 2004

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

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

-

-function InsertPagebreak(editor, args) {

-	this.editor = editor;

-	var cfg = editor.config;

-	var self = this;

-

-	cfg.registerButton({

-	id       : "pagebreak",

-	tooltip  : this._lc("Page break"),

-	image    : editor.imgURL("pagebreak.gif", "InsertPagebreak"),

-	textMode : false,

-	action   : function(editor) {

-			self.buttonPress(editor);

-		}

-	});

-  cfg.addToolbarElement("pagebreak", "inserthorizontalrule", 1);

-}

-

-InsertPagebreak._pluginInfo = {

-	name          : "InsertPagebreak",

-	version       : "1.0",

-	developer     : "Udo Schmal",

-	developer_url : "",

-	sponsor       : "L.N.Schaffrath NeueMedien",

-	sponsor_url   : "http://www.schaffrath-neuemedien.de/",

-	c_owner       : "Udo Schmal & Schaffrath NeueMedien",

-	license       : "htmlArea"

-};

-

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

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

-};

-

-InsertPagebreak.prototype.buttonPress = function(editor, context, updatecontextclass) {

-	editor.insertHTML('<div style="font-size: 1px; page-break-after: always; height: 1px; background-color: rgb(192, 192, 192);" contenteditable="false" title="Page Break">');

-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/InsertPagebreak/img/pagebreak.gif b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/InsertPagebreak/img/pagebreak.gif
deleted file mode 100644
index 8d42732..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/InsertPagebreak/img/pagebreak.gif
+++ /dev/null
Binary files differ
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/InsertPagebreak/lang/de.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/InsertPagebreak/lang/de.js
deleted file mode 100644
index 5f24147..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/InsertPagebreak/lang/de.js
+++ /dev/null
@@ -1,13 +0,0 @@
-// I18N constants
-// LANG: "de", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Page break": "Neue Seite"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/InsertPagebreak/lang/fr.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/InsertPagebreak/lang/fr.js
deleted file mode 100644
index f41bea9..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/InsertPagebreak/lang/fr.js
+++ /dev/null
@@ -1,13 +0,0 @@
-// I18N constants
-// LANG: "fr", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Page break": "Séparateur de page"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/InsertPagebreak/lang/ja.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/InsertPagebreak/lang/ja.js
deleted file mode 100644
index 185b428..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/InsertPagebreak/lang/ja.js
+++ /dev/null
@@ -1,13 +0,0 @@
-// I18N constants
-// LANG: "ja", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Page break": "改ページ"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/InsertPagebreak/lang/lc_base.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/InsertPagebreak/lang/lc_base.js
deleted file mode 100644
index ae7da71..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/InsertPagebreak/lang/lc_base.js
+++ /dev/null
@@ -1,26 +0,0 @@
-// I18N constants
-//
-// LANG: "en", ENCODING: UTF-8
-// Author: Translator-Name, <email@example.com>
-//
-// Last revision: 2018-04-12
-// 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).
-//
-// (Please, remove information below)
-// 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.)
-
-{
-    "Page Break": "",
-    "Page break": ""
-}
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/InsertPagebreak/lang/nb.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/InsertPagebreak/lang/nb.js
deleted file mode 100644
index 2246223..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/InsertPagebreak/lang/nb.js
+++ /dev/null
@@ -1,13 +0,0 @@
-// I18N constants
-// LANG: "nb", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Page break": "Sett inn sideskift"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/InsertPagebreak/lang/nl.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/InsertPagebreak/lang/nl.js
deleted file mode 100644
index 1d8dd31..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/InsertPagebreak/lang/nl.js
+++ /dev/null
@@ -1,13 +0,0 @@
-// I18N constants
-// LANG: "nl", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Page break": "Pagina einde"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/InsertPagebreak/lang/pt_br.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/InsertPagebreak/lang/pt_br.js
deleted file mode 100644
index c8a984b..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/InsertPagebreak/lang/pt_br.js
+++ /dev/null
@@ -1,13 +0,0 @@
-// I18N constants
-// LANG: "pt_br", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Page break": "Quebra de página"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/InsertSmiley/InsertSmiley.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/InsertSmiley/InsertSmiley.js
deleted file mode 100644
index a5114f8..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/InsertSmiley/InsertSmiley.js
+++ /dev/null
@@ -1,191 +0,0 @@
-/*---------------------------------------*\

- Insert Smiley Plugin for Xinha

- -----------------------------------------

- original author: Ki Master George (kimastergeorge@gmail.com)

- rewritten: James Sleeman (james@gogo.co.nz)

-\*---------------------------------------*/

-

-InsertSmiley._pluginInfo = {

-  name          : "InsertSmiley",

-  version       : "2.0",

-  developer     : "V 1.0 Ki Master George, V2.0 James Sleeman",

-  developer_url : "http://www.gogo.co.nz/",

-  c_owner       : "Ki Master George, James Sleeman",

-  sponsor       : "Gogo Internet Services",

-  sponsor_url   : "http://www.gogo.co.nz/",

-  license       : "htmlArea"

-};

-

-/** To configure the InsertSmiley plugin.

- *

- * Set xinha_config.InsertSmiley.smileys to EITHER

- *

- *  * A URL to a file called smileys.js, which follows the format

- *    you can view in smileys/smileys.js

- *

- *  * A URL to a file called smileys.php (or whatever other language)

- *    which outputs a file in the same way as smileys/smileys.php

- *

- *  * A javascript the same as you will find in smileys/smileys.js

- *

- *  By defaut the static smileys/smileys.js file is used, you may 

- *  wish to set this like so

- *

- *  xinha_config.InsertSmiley.smileys = _editor_url+'/plugins/InsertSmiley/smileys/smileys.php';

- * 

- *  And then you can add new smileys just by dumping all the images into the

- *      /xinha/plugins/InsertSmiley/smileys/

- *  folder and they will automatically be made available.

- * 

- */

- 

-Xinha.Config.prototype.InsertSmiley=  {

-  smileys : '' 

-};

-

-Xinha.loadStyle('dialog.css', 'InsertSmiley');

-

-function InsertSmiley(editor) {

-  this.editor  = editor;

-  this.smileys = false;

-  this.dialog  = false;

-   

-  var cfg = editor.config;

-  var self = this;  

-  

-  // register the toolbar buttons provided by this plugin

-  cfg.registerButton({

-    id       : "insertsmiley",

-    tooltip  : this._lc("Insert Smiley"),

-    image    : editor.imgURL("ed_smiley.gif", "InsertSmiley"),

-    textMode : false,

-    action   : function(editor) {

-                 self.buttonPress(editor);

-               }

-  });

-  

-  cfg.addToolbarElement("insertsmiley", "inserthorizontalrule", 1);

-}

-

-InsertSmiley.prototype.onGenerateOnce = function()

-{

-  // Back compat for ray's smiley config in changeset:904 ( ticket:1093 )

-  if(this.editor.config.InsertSmiley.smileyURL)

-  {

-    var smileys = [ ];

-    var smileylist = Xinha._geturlcontent(Xinha.getPluginDir("InsertSmiley") + '/smileys.txt');

-    var smileyURL = this.editor.config.InsertSmiley.smileyURL;

-    

-    smileylist = smileylist.match(/^.+$/mg);

-    for(var i = 0; i < smileylist.length; i++)

-    {

-      smileys[smileys.length] = { title: smileylist[i],  src:   smileyURL + encodeURIComponent(smileylist[i]) };                   

-    }

-    this.editor.config.InsertSmiley.smileys = smileys;

-  }

-  

-  

-  this.loadAssets();

-};

-

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

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

-};

-

-/** Load the dialog and js files.

- * 

- */

- 

-InsertSmiley.prototype.loadAssets = function()

-{

-  var self = this;

-  if (self.loading) return;

-  

-  if(typeof this.editor.config.InsertSmiley.smileys != 'string')

-  {

-    // Must be a smiley definition itself

-    this.smileys     = this.editor.config.InsertSmiley.smileys;

-    this.smiley_base = _editor_url; // Doesn't make a lot of sense, we assume the smileys will have absolute paths anyway

-  }

-  else

-  {

-    var smileys_def = 

-      this.editor.config.InsertSmiley.smileys 

-        ? this.editor.config.InsertSmiley.smileys // URL to the smileys.js file, or somethign that creates it

-        : (Xinha.getPluginDir("InsertSmiley") + '/smileys/smileys.js'); // our own default one

-        

-    Xinha._getback( 

-      smileys_def, 

-      function(sm) { self.smileys = eval(sm); self.smileys_base = smileys_def.replace(/\/[^\/]+(\?.*)?$/, '/'); } 

-    );    

-  }

-    

-  Xinha._getback( Xinha.getPluginDir("InsertSmiley") + '/dialog.html', function(html) { self.makeDialog(html); } );

-}

-

-/** Make the dialog

- *

- *  @note It is really important that this happens throuh the onGenerateOnce event

- *   (in this case it goes onGenerateOnce -> loadAssets -> makeDialog)

- *  because otherwise creating the dialog can fail in mysterious ways (silent 

- *  javascript exceptions in Gecko etc).

- */

- 

-InsertSmiley.prototype.makeDialog = function(html)

-{

-  var self = this;

-  

-  // We can not make the dialog until the smileys are loaded, so wait a bit.

-  if(!this.smileys) 

-  {  

-    window.setTimeout(function() { self.makeDialog(html); }, 1000); 

-    return; 

-  }

-  

-  var dialog = new Xinha.Dialog(this.editor, html, 'InsertSmiley', {width:155, height:100}, {modal:false});

-    

-  var src;

-  var s;

-  var a;

-  

-  for(var i = 0; i < this.smileys.length; i++)

-  {

-    src = this.smileys[i].src.match(/^(([a-zA-Z]+:\/\/)|\/)/) ? 

-          this.smileys[i].src : this.smileys_base + this.smileys[i].src;

-    s = document.createElement('img');

-    s.src = src;

-    s.alt = dialog._lc(this.smileys[i].title); 

-    s.style.border = 'none';

-    

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

-    a.href= 'javascript:void(0);';

-    a.smiley_src = src;

-    a.title = dialog._lc(this.smileys[i].title);

-    

-    // This is where we insert the smiley into the HTML

-    Xinha.addDom0Event(a, 'click', function(ev) { self.editor.insertHTML('<img src="'+this.smiley_src+'" alt="'+this.title+'" />'); Xinha._stopEvent(window.event ? event : ev); return false; });

-    

-    a.appendChild(s);

-    dialog.getElementById('smileys').appendChild(a);

-    

-    a = null; s = null; src = null;

-  }

-  

-  this.dialog = dialog;

-  return true;

-}

-

-/** Show the dialog.

- */

- 

-InsertSmiley.prototype.buttonPress = function(editor) {

-  if(this.dialog) 

-  {

-    this.dialog.show();    

-  }

-  else

-  { 

-    // Should put something here!

-  }

-  return;

-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/InsertSmiley/README.txt b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/InsertSmiley/README.txt
deleted file mode 100644
index 4e63158..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/InsertSmiley/README.txt
+++ /dev/null
@@ -1,13 +0,0 @@
-A small number of smileys are included in this release.
-
-To add more smileys, 
-
-  1. Dump as many as you would like as image files into the smileys folder (gif, jpg, png).
-  2. EITHER:
-    a. Edit smileys/smileys.js as appropriate, or;
-    b. Set this Xinha configuration (if your server handles PHP ok)
-       
-        xinha_config.InsertSmiley.smileys = _editor_url+'/plugins/InsertSmiley/smileys/smileys.php';
-       
-       it will automatically pickup the new smileys without you needing to edit the js file.
-      
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/InsertSmiley/dialog.css b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/InsertSmiley/dialog.css
deleted file mode 100644
index 7df462d..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/InsertSmiley/dialog.css
+++ /dev/null
@@ -1,3 +0,0 @@
-.insert-smiley a {
-  display:block; float:left; margin:2px; border:none !important; text-decoration:none !important;
-}
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/InsertSmiley/dialog.html b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/InsertSmiley/dialog.html
deleted file mode 100644
index 5a46498..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/InsertSmiley/dialog.html
+++ /dev/null
@@ -1,4 +0,0 @@
-<h1 id="[h1]"><l10n>Insert Smiley</l10n></h1>
-<div style="position:relative;" id="[smileys]" class="insert-smiley">
-  
-</div>
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/InsertSmiley/img/ed_smiley.gif b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/InsertSmiley/img/ed_smiley.gif
deleted file mode 100644
index d6ee7f4..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/InsertSmiley/img/ed_smiley.gif
+++ /dev/null
Binary files differ
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/InsertSmiley/lang/de.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/InsertSmiley/lang/de.js
deleted file mode 100644
index 70dc7c4..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/InsertSmiley/lang/de.js
+++ /dev/null
@@ -1,17 +0,0 @@
-// I18N constants
-// LANG: "de", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Insert Smiley": "Smiley einfügen",
-    "__OBSOLETE__": {
-        "Cancel": "Abbrechen",
-        "Smiley": "Smiley"
-    }
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/InsertSmiley/lang/fr.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/InsertSmiley/lang/fr.js
deleted file mode 100644
index 3e38a3c..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/InsertSmiley/lang/fr.js
+++ /dev/null
@@ -1,17 +0,0 @@
-// I18N constants
-// LANG: "fr", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Insert Smiley": "Insérer un smiley",
-    "__OBSOLETE__": {
-        "Cancel": "Annuler",
-        "Smiley": "Smiley"
-    }
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/InsertSmiley/lang/ja.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/InsertSmiley/lang/ja.js
deleted file mode 100644
index e413be1..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/InsertSmiley/lang/ja.js
+++ /dev/null
@@ -1,17 +0,0 @@
-// I18N constants
-// LANG: "ja", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Insert Smiley": "スマイリーの挿入",
-    "__OBSOLETE__": {
-        "Cancel": "中止",
-        "Smiley": "スマイリー"
-    }
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/InsertSmiley/lang/lc_base.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/InsertSmiley/lang/lc_base.js
deleted file mode 100644
index 39f6fb3..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/InsertSmiley/lang/lc_base.js
+++ /dev/null
@@ -1,25 +0,0 @@
-// I18N constants
-//
-// LANG: "en", ENCODING: UTF-8
-// Author: Translator-Name, <email@example.com>
-//
-// Last revision: 2018-04-12
-// 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).
-//
-// (Please, remove information below)
-// 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.)
-
-{
-    "Insert Smiley": ""
-}
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/InsertSmiley/lang/nb.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/InsertSmiley/lang/nb.js
deleted file mode 100644
index 8963d5c..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/InsertSmiley/lang/nb.js
+++ /dev/null
@@ -1,17 +0,0 @@
-// I18N constants
-// LANG: "nb", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Insert Smiley": "Sett inn smiley",
-    "__OBSOLETE__": {
-        "Cancel": "Avbryt",
-        "Smiley": "Smiley"
-    }
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/InsertSmiley/lang/nl.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/InsertSmiley/lang/nl.js
deleted file mode 100644
index c143d39..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/InsertSmiley/lang/nl.js
+++ /dev/null
@@ -1,17 +0,0 @@
-// I18N constants
-// LANG: "nl", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Insert Smiley": "Smiley invoegen",
-    "__OBSOLETE__": {
-        "Cancel": "Annuleren",
-        "Smiley": "Smiley"
-    }
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/InsertSmiley/lang/pt_br.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/InsertSmiley/lang/pt_br.js
deleted file mode 100644
index 9d76b77..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/InsertSmiley/lang/pt_br.js
+++ /dev/null
@@ -1,16 +0,0 @@
-// I18N constants
-// LANG: "pt_br", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Insert Smiley": "Inserir Smiley",
-    "__OBSOLETE__": {
-        "Cancel": "Cancelar"
-    }
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/InsertSmiley/lang/tr.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/InsertSmiley/lang/tr.js
deleted file mode 100644
index bf51afb..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/InsertSmiley/lang/tr.js
+++ /dev/null
@@ -1,17 +0,0 @@
-// I18N constants
-// LANG: "tr", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Insert Smiley": "Gülen yüz ekle",
-    "__OBSOLETE__": {
-        "Cancel": "İptal",
-        "Smiley": "Gülen yüz"
-    }
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/InsertSmiley/smileys.txt b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/InsertSmiley/smileys.txt
deleted file mode 100644
index b9df21b..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/InsertSmiley/smileys.txt
+++ /dev/null
@@ -1,580 +0,0 @@
-0001.gif
-0002.gif
-0003.gif
-0004.gif
-0005.gif
-0006.gif
-0007.gif
-0008.gif
-0009.gif
-0010.gif
-0011.gif
-0012.gif
-0013.gif
-0014.gif
-0015.gif
-0016.gif
-0017.gif
-0018.gif
-0019.gif
-0020.gif
-0021.gif
-0022.gif
-0023.gif
-0024.gif
-0025.gif
-0026.gif
-0027.gif
-0028.gif
-0029.gif
-0030.gif
-0031.gif
-0032.gif
-0033.gif
-0034.gif
-0035.gif
-0036.gif
-0037.gif
-0038.gif
-0039.gif
-0040.gif
-0041.gif
-0042.gif
-0043.gif
-0044.gif
-0045.gif
-0046.gif
-0047.gif
-0048.gif
-0049.gif
-0050.gif
-0051.gif
-0052.gif
-0053.gif
-0054.gif
-0055.gif
-0056.gif
-0057.gif
-0058.gif
-0059.gif
-0060.gif
-0061.gif
-0062.gif
-0063.gif
-0064.gif
-0065.gif
-0066.gif
-0067.gif
-0068.gif
-0069.gif
-0070.gif
-0071.gif
-0072.gif
-0073.gif
-0074.gif
-0075.gif
-0076.gif
-0077.gif
-0078.gif
-0079.gif
-0080.gif
-0081.gif
-0082.gif
-0083.gif
-0084.gif
-0085.gif
-0086.gif
-0087.gif
-0088.gif
-0089.gif
-0090.gif
-0091.gif
-0092.gif
-0093.gif
-0094.gif
-0095.gif
-0096.gif
-0097.gif
-0098.gif
-0099.gif
-0100.gif
-0101.gif
-0102.gif
-0103.gif
-0104.gif
-0105.gif
-0106.gif
-0107.gif
-0108.gif
-0109.gif
-0110.gif
-0111.gif
-0112.gif
-0113.gif
-0114.gif
-0115.gif
-0116.gif
-0117.gif
-0118.gif
-0119.gif
-0120.gif
-0121.gif
-0122.gif
-0123.gif
-0124.gif
-0125.gif
-0126.gif
-0127.gif
-0128.gif
-0129.gif
-0130.gif
-0131.gif
-0132.gif
-0133.gif
-0134.gif
-0135.gif
-0136.gif
-0137.gif
-0138.gif
-0139.gif
-0140.gif
-0141.gif
-0142.gif
-0143.gif
-0144.gif
-0145.gif
-0146.gif
-0147.gif
-0148.gif
-0149.gif
-0150.gif
-0151.gif
-0152.gif
-0153.gif
-0154.gif
-0155.gif
-0156.gif
-0157.gif
-0158.gif
-0159.gif
-0160.gif
-0161.gif
-0162.gif
-0163.gif
-0164.gif
-0165.gif
-0166.gif
-0167.gif
-0168.gif
-0169.gif
-0170.gif
-0171.gif
-0172.gif
-0173.gif
-0174.gif
-0175.gif
-0176.gif
-0177.gif
-0178.gif
-0179.gif
-0180.gif
-0181.gif
-0182.gif
-0183.gif
-0184.gif
-0185.gif
-0186.gif
-0187.gif
-0188.gif
-0189.gif
-0190.gif
-0191.gif
-0192.gif
-0193.gif
-0194.gif
-0195.gif
-0196.gif
-0197.gif
-0198.gif
-0199.gif
-0200.gif
-0201.gif
-0202.gif
-0203.gif
-0204.gif
-0205.gif
-0206.gif
-0207.gif
-0208.gif
-0209.gif
-0210.gif
-0211.gif
-0212.gif
-0213.gif
-0214.gif
-0215.gif
-0216.gif
-0217.gif
-0218.gif
-0219.gif
-0220.gif
-0221.gif
-0222.gif
-0223.gif
-0224.gif
-0225.gif
-0226.gif
-0227.gif
-0228.gif
-0229.gif
-0230.gif
-0231.gif
-0232.gif
-0233.gif
-0234.gif
-0235.gif
-0236.gif
-0237.gif
-0238.gif
-0239.gif
-0240.gif
-0241.gif
-0242.gif
-0243.gif
-0244.gif
-0245.gif
-0246.gif
-0247.gif
-0248.gif
-0249.gif
-0250.gif
-0251.gif
-0252.gif
-0253.gif
-0254.gif
-0255.gif
-0256.gif
-0257.gif
-0258.gif
-0259.gif
-0260.gif
-0261.gif
-0262.gif
-0263.gif
-0264.gif
-0265.gif
-0266.gif
-0267.gif
-0268.gif
-0269.gif
-0270.gif
-0271.gif
-0272.gif
-0273.gif
-0274.gif
-0275.gif
-0276.gif
-0277.gif
-0278.gif
-0279.gif
-0280.gif
-0281.gif
-0282.gif
-0283.gif
-0284.gif
-0285.gif
-0286.gif
-0287.gif
-0288.gif
-0289.gif
-0290.gif
-0291.gif
-0292.gif
-0293.gif
-0294.gif
-0295.gif
-0296.gif
-0297.gif
-0298.gif
-0299.gif
-0300.gif
-0301.gif
-0302.gif
-0303.gif
-0304.gif
-0305.gif
-0306.gif
-0307.gif
-0308.gif
-0309.gif
-0310.gif
-0311.gif
-0312.gif
-0313.gif
-0314.gif
-0315.gif
-0316.gif
-0317.gif
-0318.gif
-0319.gif
-0320.gif
-0321.gif
-0322.gif
-0323.gif
-0324.gif
-0325.gif
-0326.gif
-0327.gif
-0328.gif
-0329.gif
-0330.gif
-0331.gif
-0332.gif
-0333.gif
-0334.gif
-0335.gif
-0336.gif
-0337.gif
-0338.gif
-0339.gif
-0340.gif
-0341.gif
-0342.gif
-0343.gif
-0344.gif
-0345.gif
-0346.gif
-0347.gif
-0348.gif
-0349.gif
-0350.gif
-0351.gif
-0352.gif
-0353.gif
-0354.gif
-0355.gif
-0356.gif
-0357.gif
-0358.gif
-0359.gif
-0360.gif
-0361.gif
-0362.gif
-0363.gif
-0364.gif
-0365.gif
-0366.gif
-0367.gif
-0368.gif
-0369.gif
-0370.gif
-0371.gif
-0372.gif
-0373.gif
-0374.gif
-0375.gif
-0376.gif
-0377.gif
-0378.gif
-0379.gif
-0380.gif
-0381.gif
-0382.gif
-0383.gif
-0384.gif
-0385.gif
-0386.gif
-0387.gif
-0388.gif
-0389.gif
-0390.gif
-0391.gif
-0392.gif
-0393.gif
-0394.gif
-0395.gif
-0396.gif
-0397.gif
-0398.gif
-0399.gif
-0400.gif
-0401.gif
-0402.gif
-0403.gif
-0404.gif
-0405.gif
-0406.gif
-0407.gif
-0408.gif
-0409.gif
-0410.gif
-0411.gif
-0412.gif
-0413.gif
-0414.gif
-0415.gif
-0416.gif
-0417.gif
-0418.gif
-0419.gif
-0420.gif
-0421.gif
-0422.gif
-0423.gif
-0424.gif
-0425.gif
-0426.gif
-0427.gif
-0428.gif
-0429.gif
-0430.gif
-0431.gif
-0432.gif
-0433.gif
-0434.gif
-0435.gif
-0436.gif
-0437.gif
-0438.gif
-0439.gif
-0440.gif
-0441.gif
-0442.gif
-0443.gif
-0444.gif
-0445.gif
-0446.gif
-0447.gif
-0448.gif
-0449.gif
-0450.gif
-0451.gif
-0452.gif
-0453.gif
-0454.gif
-0455.gif
-0456.gif
-0457.gif
-0458.gif
-0459.gif
-0460.gif
-0461.gif
-0462.gif
-0463.gif
-0464.gif
-0465.gif
-0466.gif
-0467.gif
-0468.gif
-0469.gif
-0470.gif
-0471.gif
-0472.gif
-0473.gif
-0474.gif
-0475.gif
-0476.gif
-0477.gif
-0478.gif
-0479.gif
-0480.gif
-0481.gif
-0482.gif
-0483.gif
-0484.gif
-0485.gif
-0486.gif
-0487.gif
-0488.gif
-0489.gif
-0490.gif
-0491.gif
-0492.gif
-0493.gif
-0494.gif
-0495.gif
-0496.gif
-0497.gif
-0498.gif
-0499.gif
-0500.gif
-0501.gif
-0502.gif
-0503.gif
-0504.gif
-0505.gif
-0506.gif
-0507.gif
-0508.gif
-0509.gif
-0510.gif
-0511.gif
-0512.gif
-0513.gif
-0514.gif
-0515.gif
-0516.gif
-0517.gif
-0518.gif
-0519.gif
-0520.gif
-0521.gif
-0522.gif
-0523.gif
-0524.gif
-0525.gif
-0526.gif
-0527.gif
-0528.gif
-0529.gif
-0530.gif
-0531.gif
-0532.gif
-0533.gif
-0534.gif
-0535.gif
-0536.gif
-0537.gif
-0538.gif
-0539.gif
-0540.gif
-0541.gif
-0542.gif
-0543.gif
-0544.gif
-0545.gif
-0546.gif
-0547.gif
-0548.gif
-0549.gif
-0550.gif
-0551.gif
-0552.gif
-0553.gif
-0554.gif
-0555.gif
-0556.gif
-0557.gif
-0558.gif
-0559.gif
-0560.gif
-0561.gif
-0562.gif
-0563.gif
-0564.gif
-0565.gif
-0566.gif
-0567.gif
-0568.gif
-0569.gif
-0570.gif
-0571.gif
-0572.gif
-0573.gif
-0574.gif
-0575.gif
-0576.gif
-0577.gif
-0578.gif
-0579.gif
-0580.gif
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/InsertSmiley/smileys/Angry.gif b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/InsertSmiley/smileys/Angry.gif
deleted file mode 100644
index 4a1efb4..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/InsertSmiley/smileys/Angry.gif
+++ /dev/null
Binary files differ
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/InsertSmiley/smileys/Cool.gif b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/InsertSmiley/smileys/Cool.gif
deleted file mode 100644
index a3aa1f0..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/InsertSmiley/smileys/Cool.gif
+++ /dev/null
Binary files differ
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/InsertSmiley/smileys/Excited.gif b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/InsertSmiley/smileys/Excited.gif
deleted file mode 100644
index 4636e33..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/InsertSmiley/smileys/Excited.gif
+++ /dev/null
Binary files differ
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/InsertSmiley/smileys/Grin.gif b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/InsertSmiley/smileys/Grin.gif
deleted file mode 100644
index 238a578..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/InsertSmiley/smileys/Grin.gif
+++ /dev/null
Binary files differ
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/InsertSmiley/smileys/Pleased.gif b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/InsertSmiley/smileys/Pleased.gif
deleted file mode 100644
index 3bc068f..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/InsertSmiley/smileys/Pleased.gif
+++ /dev/null
Binary files differ
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/InsertSmiley/smileys/Sad.gif b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/InsertSmiley/smileys/Sad.gif
deleted file mode 100644
index 172e7f0..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/InsertSmiley/smileys/Sad.gif
+++ /dev/null
Binary files differ
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/InsertSmiley/smileys/Surprised.gif b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/InsertSmiley/smileys/Surprised.gif
deleted file mode 100644
index 484111b..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/InsertSmiley/smileys/Surprised.gif
+++ /dev/null
Binary files differ
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/InsertSmiley/smileys/Wink.gif b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/InsertSmiley/smileys/Wink.gif
deleted file mode 100644
index 56c69cf..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/InsertSmiley/smileys/Wink.gif
+++ /dev/null
Binary files differ
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/InsertSmiley/smileys/smileys.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/InsertSmiley/smileys/smileys.js
deleted file mode 100644
index bce18d2..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/InsertSmiley/smileys/smileys.js
+++ /dev/null
@@ -1,10 +0,0 @@
-[
-  { title: 'Grin',      src: 'Grin.gif'      },
-  { title: 'Angry',     src: 'Angry.gif'     },
-  { title: 'Excited',   src: 'Excited.gif'   },
-  { title: 'Cool',      src: 'Cool.gif'      },
-  { title: 'Wink',      src: 'Wink.gif'      },
-  { title: 'Surprised', src: 'Surprised.gif' },
-  { title: 'Sad',       src: 'Sad.gif'       },
-  { title: 'Pleased',   src: 'Pleased.gif'   }
-]
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/InsertSmiley/smileys/smileys.php b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/InsertSmiley/smileys/smileys.php
deleted file mode 100644
index a59b3cc..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/InsertSmiley/smileys/smileys.php
+++ /dev/null
@@ -1,34 +0,0 @@
-<?php
-  /** This script can be used to automatically output all smiley images you
-   *  dump into this folder, as long as they are gif, jpg or png.
-   * 
-   *  Simply set your 
-   *
-   *   xinha_config.InsertSmiley.smileys = 
-   *      _editor_url+'/plugins/InsertSmiley/smilies.php';
-   *
-   * (or better, make a new smileys folder outside of Xinha 
-   *  and copy this file to it and change the line above
-   *  appropriately).
-   *
-   */
-  
-  // You will probably need to change this if you copy this file elsewhere!
-  require_once(realpath(dirname(__FILE__) . '/../../../contrib/php-xinha.php'));
-  
-  $dh = opendir(dirname(__FILE__)); 
-  $smileys = array();  
-  while($f = readdir($dh))
-  {
-    $M = array();
-    if(preg_match('/^(.*)\.(gif|jpg|png)$/i', $f, $M))
-    {
-      $smileys[] = array('title' => $M[1], 'src'=> $f);
-    }
-  }
-  closedir($dh);
-  
-  
-  echo xinha_to_js($smileys);
-  
-?>
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/InsertSnippet/InsertSnippet.css b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/InsertSnippet/InsertSnippet.css
deleted file mode 100644
index 923eaa9..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/InsertSnippet/InsertSnippet.css
+++ /dev/null
@@ -1,93 +0,0 @@
-.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;
-
-}
-
-.Link2 {
-background-color: #F9A413 !important;
-
-}
-
-.Link3 {
-background-color: #167730 !important;
-}
-
-.Link4 {
-background-color: #233350 !important;
-}
-
-.Link5 {
-background-color: #70685B !important;
-}
-
-a.Link1:hover span{
-background-color: #DF1D1F !important;
-}
-
-a.Link2:hover span {
-background-color: #F9A413 !important;
-
-}
-
-.Link3:hover span {
-background-color: #167730 !important;
-color:white;
-}
-
-.Link4:hover span {
-background-color: #233350 !important;
-color:white;
-}
-
-.Link5:hover span {
-background-color: #70685B !important;
-color:white;
-}
-
-.navi_links li a span {
-	height: 16px;
-	text-indent: 4px;
-	display:block;
-	margin-left: 15px;
-	background-color: #FFF;
-}
-
-div.message_box {
-border: dotted 1px black;
-margin: 1em;
-padding:1em;
-}
-
-.red {
-color:red;
-}
-
-.green {
-color:green;
-}
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/InsertSnippet/InsertSnippet.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/InsertSnippet/InsertSnippet.js
deleted file mode 100644
index 4a948ee..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/InsertSnippet/InsertSnippet.js
+++ /dev/null
@@ -1,92 +0,0 @@
-/*------------------------------------------*\

- InsertSnippet for Xinha

- _______________________

- 

- Insert HTML fragments or template variables

- 

-\*------------------------------------------*/

-

-function InsertSnippet(editor) {

-	this.editor = editor;

-

-	var cfg = editor.config;

-	var self = this;

-	

-

-	cfg.registerButton({

-	id       : "insertsnippet",

-	tooltip  : this._lc("Insert Snippet"),

-	image    : editor.imgURL("ed_snippet.gif", "InsertSnippet"),

-	textMode : false,

-	action   : function(editor) {

-			self.buttonPress(editor);

-		}

-	});

-	cfg.addToolbarElement("insertsnippet", "insertimage", -1);

-	this.snippets = null;

-	var backend = cfg.InsertSnippet.snippets + '?';

-	

-	if(cfg.InsertSnippet.backend_data != null)

-    {

-    	for ( var i in cfg.InsertSnippet.backend_data )

-        {

-            backend += '&' + i + '=' + encodeURIComponent(cfg.InsertSnippet.backend_data[i]);

-        }

-    }

-    Xinha._getback(backend,function (getback) {eval(getback); self.snippets = snippets;});

-}

-

-InsertSnippet.prototype.onUpdateToolbar = function() {

-	if (!this.snippets){

-		this.editor._toolbarObjects.insertsnippet.state("enabled", false);

-	}

-	else InsertSnippet.prototype.onUpdateToolbar = null;

-}

-

-InsertSnippet._pluginInfo = {

-  name          : "InsertSnippet",

-  version       : "1.2",

-  developer     : "Raimund Meyer",

-  developer_url : "http://x-webservice.net",

-  c_owner       : "Raimund Meyer",

-  sponsor       : "",

-  sponsor_url   : "",

-  license       : "htmlArea"

-};

-

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

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

-};

-

-InsertSnippet.prototype.onGenerate = function() {

-  this.editor.addEditorStylesheet(Xinha.getPluginDir("InsertSnippet") + '/InsertSnippet.css');

-};

-

-Xinha.Config.prototype.InsertSnippet =

-{

-  'snippets' : Xinha.getPluginDir("InsertSnippet")+"/demosnippets.js", // purely demo purposes, you should change this

-  'css' : ['../InsertSnippet.css'], //deprecated, CSS is now pulled from xinha_config

-  'showInsertVariable': false,

-  'backend_data' : null

-};

-	

-InsertSnippet.prototype.buttonPress = function(editor) {

-		var args = editor.config;

-			args.snippets = this.snippets;

-		var self = this;

-		editor._popupDialog( "plugin://InsertSnippet/insertsnippet", function( param ) {

-	

-		if ( !param ) { 

-	      return false;

-	    }

-				   	   

-		

-		editor.focusEditor();

-		if (param['how'] == 'variable') {

-			editor.insertHTML('{'+self.snippets[param["snippetnum"]].id+'}');

-		} else {

-			editor.insertHTML(self.snippets[param["snippetnum"]].HTML);

-	   	}

-  

-    }, args);

-  };
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/InsertSnippet/demosnippets.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/InsertSnippet/demosnippets.js
deleted file mode 100644
index d243632..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/InsertSnippet/demosnippets.js
+++ /dev/null
@@ -1,15 +0,0 @@
-var snippets = [];
-var i = 0;
-snippets[i] = {};
-snippets[i]['id'] = 'Box 1';
-snippets[i]['HTML'] = '<div class="message_box red">\n  Visit the <a href="http://xinha.org">Xinha website</a></div>';
-
-i++;
-snippets[i] = {};
-snippets[i]['id'] = 'INFORMATION ABOUT SOMETHING';
-snippets[i]['HTML'] = '<div class="message_box green">\n  This is an information about something\n</div>';
-
-i++;
-snippets[i] = {};
-snippets[i]['id'] = 'Menu';
-snippets[i]['HTML'] = '<ul class="navi_links">\n	<li class="navi">\n		<a href="Link1" class="Link1" tabindex="1"><span class="span_class">Link1</span></a>\n    </li>\n	\n	<li class="navi">\n		<a href="Link2" class="Link2" tabindex="2"><span class="span_class">Link2</span></a>\n    </li>\n\n	\n	<li class="navi">\n		<a href="Link3" class="Link3" tabindex="3"><span class="span_class">Link3</span></a>\n    </li>\n	\n	<li class="navi">\n		<a href="Link4" class="Link4" tabindex="4"><span class="span_class">Link4</span></a>\n    </li>\n	\n	<li class="navi">\n		<a href="Link5" class="Link5" tabindex="5"><span class="span_class">Link5</span></a>\n\n    </li>\n\n</ul>';
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/InsertSnippet/img/ed_snippet.gif b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/InsertSnippet/img/ed_snippet.gif
deleted file mode 100644
index 12684f8..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/InsertSnippet/img/ed_snippet.gif
+++ /dev/null
Binary files differ
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/InsertSnippet/lang/ch.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/InsertSnippet/lang/ch.js
deleted file mode 100644
index 62e5bd6..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/InsertSnippet/lang/ch.js
+++ /dev/null
@@ -1,13 +0,0 @@
-// I18N constants
-// LANG: "ch", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Cancel": "取消"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/InsertSnippet/lang/cz.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/InsertSnippet/lang/cz.js
deleted file mode 100644
index c26a48b..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/InsertSnippet/lang/cz.js
+++ /dev/null
@@ -1,13 +0,0 @@
-// I18N constants
-// LANG: "cz", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Cancel": "Zrušit"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/InsertSnippet/lang/da.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/InsertSnippet/lang/da.js
deleted file mode 100644
index 2f85401..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/InsertSnippet/lang/da.js
+++ /dev/null
@@ -1,13 +0,0 @@
-// I18N constants
-// LANG: "da", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Cancel": "Annuller"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/InsertSnippet/lang/de.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/InsertSnippet/lang/de.js
deleted file mode 100644
index 09ba59c..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/InsertSnippet/lang/de.js
+++ /dev/null
@@ -1,18 +0,0 @@
-// I18N constants
-// LANG: "de", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Cancel": "Abbrechen",
-    "Hide preview": "Vorschau verbergen",
-    "Insert Snippet": "Snippet einfügen",
-    "Insert as": "Einfügen als",
-    "Show preview": "Vorschau zeigen",
-    "Variable": "Variable"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/InsertSnippet/lang/ee.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/InsertSnippet/lang/ee.js
deleted file mode 100644
index aacd840..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/InsertSnippet/lang/ee.js
+++ /dev/null
@@ -1,13 +0,0 @@
-// I18N constants
-// LANG: "ee", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Cancel": "Loobu"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/InsertSnippet/lang/el.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/InsertSnippet/lang/el.js
deleted file mode 100644
index 7b4695f..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/InsertSnippet/lang/el.js
+++ /dev/null
@@ -1,13 +0,0 @@
-// I18N constants
-// LANG: "el", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Cancel": "Ακύρωση"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/InsertSnippet/lang/es.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/InsertSnippet/lang/es.js
deleted file mode 100644
index 113ea9e..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/InsertSnippet/lang/es.js
+++ /dev/null
@@ -1,13 +0,0 @@
-// I18N constants
-// LANG: "es", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Cancel": "Cancelar"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/InsertSnippet/lang/eu.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/InsertSnippet/lang/eu.js
deleted file mode 100644
index 1021bf7..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/InsertSnippet/lang/eu.js
+++ /dev/null
@@ -1,13 +0,0 @@
-// I18N constants
-// LANG: "eu", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Cancel": "Utzi"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/InsertSnippet/lang/fa.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/InsertSnippet/lang/fa.js
deleted file mode 100644
index fd57189..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/InsertSnippet/lang/fa.js
+++ /dev/null
@@ -1,13 +0,0 @@
-// I18N constants
-// LANG: "fa", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Cancel": "انصراف"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/InsertSnippet/lang/fi.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/InsertSnippet/lang/fi.js
deleted file mode 100644
index 0233ac0..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/InsertSnippet/lang/fi.js
+++ /dev/null
@@ -1,13 +0,0 @@
-// I18N constants
-// LANG: "fi", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Cancel": "Peruuta"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/InsertSnippet/lang/fr.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/InsertSnippet/lang/fr.js
deleted file mode 100644
index 164c263..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/InsertSnippet/lang/fr.js
+++ /dev/null
@@ -1,13 +0,0 @@
-// I18N constants
-// LANG: "fr", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Cancel": "Annuler"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/InsertSnippet/lang/he.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/InsertSnippet/lang/he.js
deleted file mode 100644
index f65ddc7..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/InsertSnippet/lang/he.js
+++ /dev/null
@@ -1,13 +0,0 @@
-// I18N constants
-// LANG: "he", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Cancel": "ביטול"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/InsertSnippet/lang/hu.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/InsertSnippet/lang/hu.js
deleted file mode 100644
index 58d5664..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/InsertSnippet/lang/hu.js
+++ /dev/null
@@ -1,13 +0,0 @@
-// I18N constants
-// LANG: "hu", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Cancel": "Mégsem"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/InsertSnippet/lang/it.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/InsertSnippet/lang/it.js
deleted file mode 100644
index 2aba43a..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/InsertSnippet/lang/it.js
+++ /dev/null
@@ -1,13 +0,0 @@
-// I18N constants
-// LANG: "it", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Cancel": "Annullamento"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/InsertSnippet/lang/ja.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/InsertSnippet/lang/ja.js
deleted file mode 100644
index cea3534..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/InsertSnippet/lang/ja.js
+++ /dev/null
@@ -1,18 +0,0 @@
-// I18N constants
-// LANG: "ja", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Cancel": "中止",
-    "Hide preview": "プレビュー非表示",
-    "Insert Snippet": "スニペットの挿入",
-    "Insert as": "形式を選んで挿入",
-    "Show preview": "プレビュー表示",
-    "Variable": "変数"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/InsertSnippet/lang/lc_base.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/InsertSnippet/lang/lc_base.js
deleted file mode 100644
index e17dfd8..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/InsertSnippet/lang/lc_base.js
+++ /dev/null
@@ -1,38 +0,0 @@
-// I18N constants
-//
-// LANG: "en", ENCODING: UTF-8
-// Author: Translator-Name, <email@example.com>
-//
-// Last revision: 2018-04-12
-// 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).
-//
-// (Please, remove information below)
-// 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.)
-
-{
-    "Cancel": "",
-    "Hide preview": "",
-    "Insert Snippet": "",
-    "Insert as": "",
-    "InsertSnippet for Xinha": "",
-    "Link1": "",
-    "Link2": "",
-    "Link3": "",
-    "Link4": "",
-    "Link5": "",
-    "Show preview": "",
-    "This is an information about something": "",
-    "Variable": "",
-    "\\n  This is an information about something\\n": ""
-}
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/InsertSnippet/lang/lt.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/InsertSnippet/lang/lt.js
deleted file mode 100644
index dbbc674..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/InsertSnippet/lang/lt.js
+++ /dev/null
@@ -1,13 +0,0 @@
-// I18N constants
-// LANG: "lt", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Cancel": "Atšaukti"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/InsertSnippet/lang/lv.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/InsertSnippet/lang/lv.js
deleted file mode 100644
index 0bc68d5..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/InsertSnippet/lang/lv.js
+++ /dev/null
@@ -1,13 +0,0 @@
-// I18N constants
-// LANG: "lv", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Cancel": "Atcelt"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/InsertSnippet/lang/nb.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/InsertSnippet/lang/nb.js
deleted file mode 100644
index b0db1a9..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/InsertSnippet/lang/nb.js
+++ /dev/null
@@ -1,18 +0,0 @@
-// I18N constants
-// LANG: "nb", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Cancel": "Avbryt",
-    "Hide preview": "Skjul forhåndsvisning",
-    "Insert Snippet": "Sett inn snutt",
-    "Insert as": "Sett inn som",
-    "Show preview": "Vis forhåndsvisning",
-    "Variable": "Variabel"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/InsertSnippet/lang/nl.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/InsertSnippet/lang/nl.js
deleted file mode 100644
index b4de0db..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/InsertSnippet/lang/nl.js
+++ /dev/null
@@ -1,18 +0,0 @@
-// I18N constants
-// LANG: "nl", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Cancel": "Annuleren",
-    "Hide preview": "Verberg voorbeeld",
-    "Insert Snippet": "Snippet invoegen",
-    "Insert as": "Invoegen als",
-    "Show preview": "Laat voorbeeld zien",
-    "Variable": "Variabele"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/InsertSnippet/lang/pl.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/InsertSnippet/lang/pl.js
deleted file mode 100644
index 9232930..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/InsertSnippet/lang/pl.js
+++ /dev/null
@@ -1,13 +0,0 @@
-// I18N constants
-// LANG: "pl", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Cancel": "Anuluj"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/InsertSnippet/lang/pt_br.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/InsertSnippet/lang/pt_br.js
deleted file mode 100644
index bd5394d..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/InsertSnippet/lang/pt_br.js
+++ /dev/null
@@ -1,20 +0,0 @@
-// I18N constants
-// LANG: "pt_br", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Cancel": "Cancelar",
-    "Hide preview": "Esconder Visualização",
-    "Insert Snippet": "Inserir Fragmento de Código",
-    "Insert as": "Inserir como",
-    "InsertSnippet for Xinha": "Fragmento de Códigos para o Xinha",
-    "Show preview": "Mostrar Visualização",
-    "This is an information about something": "Isto é uma informação sobre alguma coisa",
-    "Variable": "Variável"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/InsertSnippet/lang/ro.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/InsertSnippet/lang/ro.js
deleted file mode 100644
index 4c4e19f..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/InsertSnippet/lang/ro.js
+++ /dev/null
@@ -1,13 +0,0 @@
-// I18N constants
-// LANG: "ro", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Cancel": "Renunţă"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/InsertSnippet/lang/ru.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/InsertSnippet/lang/ru.js
deleted file mode 100644
index f569cfd..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/InsertSnippet/lang/ru.js
+++ /dev/null
@@ -1,13 +0,0 @@
-// I18N constants
-// LANG: "ru", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Cancel": "Отмена"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/InsertSnippet/lang/sh.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/InsertSnippet/lang/sh.js
deleted file mode 100644
index 603b0c4..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/InsertSnippet/lang/sh.js
+++ /dev/null
@@ -1,13 +0,0 @@
-// I18N constants
-// LANG: "sh", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Cancel": "Poništi"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/InsertSnippet/lang/si.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/InsertSnippet/lang/si.js
deleted file mode 100644
index 103d160..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/InsertSnippet/lang/si.js
+++ /dev/null
@@ -1,13 +0,0 @@
-// I18N constants
-// LANG: "si", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Cancel": "Prekliči"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/InsertSnippet/lang/sr.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/InsertSnippet/lang/sr.js
deleted file mode 100644
index 8d966e6..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/InsertSnippet/lang/sr.js
+++ /dev/null
@@ -1,13 +0,0 @@
-// I18N constants
-// LANG: "sr", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Cancel": "Поништи"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/InsertSnippet/lang/sv.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/InsertSnippet/lang/sv.js
deleted file mode 100644
index 18b6397..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/InsertSnippet/lang/sv.js
+++ /dev/null
@@ -1,13 +0,0 @@
-// I18N constants
-// LANG: "sv", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Cancel": "Avbryt"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/InsertSnippet/lang/th.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/InsertSnippet/lang/th.js
deleted file mode 100644
index bd36b85..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/InsertSnippet/lang/th.js
+++ /dev/null
@@ -1,13 +0,0 @@
-// I18N constants
-// LANG: "th", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Cancel": "ยกเลิก"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/InsertSnippet/lang/tr.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/InsertSnippet/lang/tr.js
deleted file mode 100644
index 163623d..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/InsertSnippet/lang/tr.js
+++ /dev/null
@@ -1,13 +0,0 @@
-// I18N constants
-// LANG: "tr", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Cancel": "İptal"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/InsertSnippet/lang/vn.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/InsertSnippet/lang/vn.js
deleted file mode 100644
index ec2d779..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/InsertSnippet/lang/vn.js
+++ /dev/null
@@ -1,13 +0,0 @@
-// I18N constants
-// LANG: "vn", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Cancel": "Hủy"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/InsertSnippet/popups/insertsnippet.html b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/InsertSnippet/popups/insertsnippet.html
deleted file mode 100644
index d758347..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/InsertSnippet/popups/insertsnippet.html
+++ /dev/null
@@ -1,133 +0,0 @@
-<!DOCTYPE html
-		 PUBLIC "-//W3C//DTD XHTML 1.0 Strict//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 Snippet</title>
-<link rel="stylesheet" type="text/css" href="../../../popups/popup.css" />
-<link rel="stylesheet" type="text/css" href="../InsertSnippet.css" />
-<script type="text/javascript" src="../../../popups/popup.js"></script>
-<script type="text/javascript">
-
-var InsertSnippet = window.opener.InsertSnippet;
-var editor = null;
-
-
-function Init() {
-	__dlg_translate("InsertSnippet");
-	__dlg_init(null, {width:800,height:600});
-
-	var config = window.dialogArguments;
- 
-	var snippets = config.snippets;
-	
-	if ( config.pageStyle && !Xinha.is_ie)
-    {
-		var style = document.createElement("style");
-		style.type = "text/css";
-		style.innerHTML = config.pageStyle;
-		document.getElementsByTagName("HEAD")[0].appendChild(style);
-    }
-    
-	if ( typeof config.pageStyleSheets !== 'undefined' )
-	{
-		for ( var i = 0; i < config.pageStyleSheets.length; i++ )
-		{
-			var style = document.createElement("link");
-			style.type = "text/css";
-			style.rel = 'stylesheet';
-			style.href =	config.pageStyleSheets[i];
-			document.getElementsByTagName("HEAD")[0].appendChild(style);
-		}
-	}
-		
-	var tbody = document.getElementById("snippettable");
-	var snippet_html;
-	var snippet_name;
-	var trow;
-	for(var i = 0; i < snippets.length; i++) 
-	{
-		trow = tbody.insertRow(i);
-		snippet_html = snippets[i]['HTML'];
-		snippet_name = snippets[i]['id'];
-	 
-		var insertAsVariable = '';
-		if (config.InsertSnippet.showInsertVariable)
-		{
-			insertAsVariable = ' | <a href="javascript:onOK('+i+','+'\'variable\''+')">'+Xinha._lc("Variable","InsertSnippet")+'</a>';
-		}
-		var new_cell = trow.insertCell(0);
-		new_cell.innerHTML = snippet_name +': '+Xinha._lc("Insert as","InsertSnippet")+' <a href="javascript:onOK('+i+','+'\'html\''+')">HTML</a>'+insertAsVariable + ' (<a id="show_preview'+i+'" href="javascript:preview(\'show\','+i+')">'+Xinha._lc("Show preview","InsertSnippet")+'</a>)<'+/*stop lc_parse_strings*/+'div id="preview'+i+'" style="display:none">'+snippets[i]['HTML']+'</div>'; 
-		new_cell.id = 'cell' + i;
-			
-	}
-
-	document.body.onkeypress = __dlg_key_press;
-}
-
-function preview(action,i) {
-	var show_preview_link = document.getElementById('show_preview'+i); 
-	switch(action)
-	{
-		case 'show':
-			document.getElementById('preview'+i).style.display = 'block';
-			show_preview_link.innerHTML = Xinha._lc("Hide preview","InsertSnippet");
-			show_preview_link.href = "javascript:preview('hide','"+i+"');";
-			
-		break;
-		case 'hide':
-			document.getElementById('preview'+i).style.display = 'none';
-			show_preview_link.innerHTML = Xinha._lc("Show preview","InsertSnippet");
-			show_preview_link.href = "javascript:preview('show','"+i+"');";
-		break;
-	}
-}
-function onCancel() {
-	__dlg_close(null);
-	return false;
-}
-
-function onOK(snippetnum,how) {
-	var params = new Object();
-	params["snippetnum"] = snippetnum;
-	params["how"] = how;
-	__dlg_close(params);
-	return false;
-}
-
-function __dlg_key_press(ev) {
-	ev || (ev = window.event);
-	switch(ev.keyCode) {
-		case 13:
-		document.getElementById('bt_ok').click();
-			break;
-		case 27:
-		__dlg_close();
-		return false;
-	}
-return true;
-}
-</script>
-
-<style type="text/css">
-body {margin:0 !IMPORTANT;padding:0 !IMPORTANT;}
-.buttons {border-top: 1px solid #999; padding: 5px; text-align: right; height: 20px; }
-td {background:white;padding:5px;border:1px solid;border-color: ButtonHighlight ButtonShadow ButtonShadow ButtonHighlight;}
-.preview {}
-</style>
-</head>
-<body class="dialog" onload="Init()">
-<form action="" method="get">
-  <div class="title" >Insert Snippet</div>
-  <div style="height:470px;overflow:auto;">
-  <table style="border: 0; width: 100%;" id="snippettable">
-  </table>
-  </div>
-<div class="space"></div>
-<div class="buttons">
-<button type="button" 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-1.5.1/plugins/InsertSnippet/readme.html b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/InsertSnippet/readme.html
deleted file mode 100644
index b8a905a..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/InsertSnippet/readme.html
+++ /dev/null
@@ -1,57 +0,0 @@
-<!DOCTYPE html
-     PUBLIC "-//W3C//DTD XHTML 1.0 Strict//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>InsertSnippet for Xinha</title>
-  
-<style type="text/css">
-  body { font-family: sans-serif; }
-  pre {border: dotted grey thin; background-color:LightYellow;padding:10px }
-  p { width:500px }
-  </style>
-</head>
-
-<body >
-<h1>InsertSnippet for Xinha</h1>
-<p>Insert HTML fragments in your document.
-
-</p>
-<h2>Usage</h2>
-<p>
-In order to use your own snippets you have to add at least one parameter to your xinha_config:
-</p>
-<pre>
-xinha_config.InsertSnippet.snippets = Xinha.getPluginDir('InsertSnippet') + "/snippets.php";
-</pre>
-<p>
-The path above indicates the use of the provided backend. This parses a file that contains the snippets and 
-should have the following format:
-</p>
-<pre>
-&lt;!--Snippet ID--&gt;
-Snippet content
-&lt;!--/Snippet ID--&gt;
-...and so on
-</pre>
-<p>
-You can use the snippets.html in the plugin folder or tell the backend where to find the file like this
-</p>
-<pre>
-with (xinha_config.InsertSnippet)
-{
-	&lt;?php
-
-	// define backend configuration for the plugin
-	$backend_data['snippets_file'] = '/file/containing/snippets.html';
-	require_once '../contrib/php-xinha.php';
-	xinha_pass_to_php_backend($backend_data);
-    
-	?&gt;
-}
-</pre>
-
-<p style="font-size:80%">Raimund Meyer (xinha@raimundmeyer.de)</p>
-</body>
-</html>
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/InsertSnippet/snippets.html b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/InsertSnippet/snippets.html
deleted file mode 100644
index 3a8dad3..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/InsertSnippet/snippets.html
+++ /dev/null
@@ -1,29 +0,0 @@
-<!--Box 1-->
-<div class="message_box red">
-   Visit the <a href="http://xinha.org">Xinha website</a>
-</div>
-<!--/Box 1-->
-<!--INFORMATION ABOUT SOMETHING-->
-<div class="message_box green">
-   This is an information about something
-</div>
-<!--/INFORMATION ABOUT SOMETHING-->
-<!--Menu-->
-<ul class="navi_links">
-   <li class="navi">
-        <a href="Link1" class="Link1" tabindex="1"><span class="span_class"> Link1 </span></a>
-   </li>
-   <li class="navi">
-        <a href="Link2" class="Link2" tabindex="2"><span class="span_class"> Link2 </span></a>
-   </li>
-   <li class="navi">
-        <a href="Link3" class="Link3" tabindex="3"><span class="span_class"> Link3 </span></a>
-   </li>
-   <li class="navi">
-        <a href="Link4" class="Link4" tabindex="4"><span class="span_class"> Link4 </span></a>
-   </li>
-   <li class="navi">
-        <a href="Link5" class="Link5" tabindex="5"><span class="span_class"> Link5 </span></a>
-   </li>
-</ul>
-<!--/Menu-->
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/InsertSnippet/snippets.php b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/InsertSnippet/snippets.php
deleted file mode 100644
index 8c59db9..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/InsertSnippet/snippets.php
+++ /dev/null
@@ -1,22 +0,0 @@
-<?php

-$snippets_file = 'snippets.html';

-

-include_once('../../contrib/php-xinha.php');

-

-if($passed_data = xinha_read_passed_data())

-{

-	extract($passed_data);      

-}

-$snippets = file_get_contents($snippets_file);

-preg_match_all('/<!--(.*?)-->(.*?)<!--\/.*?-->/s',$snippets,$matches);

-	

-$array=array();

-for ($i=0;$i<count($matches[1]);$i++)

-{

-	$id = $matches[1][$i];

-	$html = $matches[2][$i];

-	$array[] = array('id'=>$id,'HTML'=>$html);

-}

-print "var snippets = " . xinha_to_js($array);

-

-?>
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/InsertSnippet2/InsertSnippet.css b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/InsertSnippet2/InsertSnippet.css
deleted file mode 100644
index f791e7f..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/InsertSnippet2/InsertSnippet.css
+++ /dev/null
@@ -1,92 +0,0 @@
-html > body .ISsnippettable button { min-width:70px;white-space:nowrap;}
-
-.ISsnippettable td {
- 
-	background:white;
-	vertical-align:top;
-}
-
-.ISsnippettable td {
-	padding:5px;
-	border:1px solid;
-	border-color: ButtonHighlight ButtonShadow ButtonShadow ButtonHighlight;
-}
-.ISsnippettable button {text-align:center;}
-.ISsnippettable a.button {/*background:ButtonFace;*/padding:1px 5px 1px 5px;color:black;text-decoration:none}
-.ISpreview {
-    background-color: white;
-    padding: 5px;
-	display : none;
-	position : absolute;
-	top : 12px;
-	left :100px;
-	border : 1px dotted black;
-	z-index:100;
-}
-.IScattabs {line-height:18px; }
-.IScattabs a {
-	white-space:nowrap;
-	border-width:1px 1px 0px 1px;
-	border-color: ButtonHighlight ButtonShadow ButtonShadow ButtonHighlight;
-	border-style:solid;
-	padding:4px;
-	margin-left:1px;
-	text-decoration:none;
-	color:black;
-	-moz-border-radius:10px 10px 0px 0px;
-	height:12px;
-	background-repeat:repeat-x;
-}
-
-.IScattabs .tab1 {
-	background-image:url(img/1.PNG);
-}
-.IScattabs .tab2 {
-	background-image:url(img/2.PNG);
-}
-.IScattabs .tab3 {
-	background-image:url(img/3.PNG);
-}
-.IScattabs .tab4 {
-	background-image:url(img/4.PNG);
-}
-.IScattabs .tab5 {
-	background-image:url(img/5.PNG);
-}
-.IScattabs .tab6 {
-	background-image:url(img/6.PNG);
-}
-.IScattabs .tab7 {
-	background-image:url(img/7.PNG);
-}
-.IScattabs .tab8 {
-	background-image:url(img/8.PNG);
-}
-.IScattabs .tab9 {
-	background-image:url(img/9.PNG);
-}
-.IScattabs .tab10 {
-	background-image:url(img/10.PNG);
-}
-.IScattabs .tab11 {
-	background-image:url(img/11.PNG);
-}
-.IScattabs .tab12 {
-	background-image:url(img/12.PNG);
-}
-.IScattabs .tab13 {
-	background-image:url(img/13.PNG);
-}
-.IScattabs .tab14 {
-	background-image:url(img/14.PNG);
-}
-.IScattabs .tab15 {
-	background-image:url(img/15.PNG);
-}
-.IScattabs .tab16 {
-	background-image:url(img/16.PNG);
-}
-.IScattabs a.active {
-	font-weight:bold;
-	border-width:1px 2px 0px 2px
-}
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/InsertSnippet2/InsertSnippet2.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/InsertSnippet2/InsertSnippet2.js
deleted file mode 100644
index a824300..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/InsertSnippet2/InsertSnippet2.js
+++ /dev/null
@@ -1,396 +0,0 @@
-/*------------------------------------------*\
- InsertSnippet2 for Xinha
- _______________________
- 
- Insert HTML fragments or template variables
- 
-\*------------------------------------------*/
-
-function InsertSnippet2(editor) {
-  this.editor = editor;
-
-  var cfg = editor.config;
-  var self = this;
-  
-
-  cfg.registerButton({
-  id       : "InsertSnippet2",
-  tooltip  : this._lc("Insert Snippet"),
-  image    : editor.imgURL("ed_snippet.gif", "InsertSnippet2"),
-  textMode : false,
-  action   : function(editor) {
-          self.buttonPress(editor);
-      }
-  });
-  cfg.addToolbarElement("InsertSnippet2", "insertimage", -1);
-  this.snippets = null;
-  this.categories = null;
-  this.html =null;
-      
-  Xinha._getback(cfg.InsertSnippet2.snippets,function (txt,req) {
-                  var xml=req.responseXML;
-                  var c = xml.getElementsByTagName('c');
-                  self.categories = [];
-                  for (var i=0;i<c.length;i++)
-                  {
-                      self.categories.push(c[i].getAttribute('n'));	
-                  }
-                  var s = xml.getElementsByTagName('s');
-                  self.snippets = [];
-                  var textContent,item;
-                  
-                  for (var i=0;i<s.length;i++)
-                  {
-                      item = {};
-                      for (var j=0;j<s[i].attributes.length;j++)
-                      {
-                          item[s[i].attributes[j].nodeName] = s[i].attributes[j].nodeValue;
-                      }
-                      item.html = s[i].text || s[i].textContent;
-                      self.snippets.push(item);
-                  }
-  });
-  Xinha.loadStyle('InsertSnippet.css','InsertSnippet2','IScss');
-}
-
-InsertSnippet2.prototype.onUpdateToolbar = function() 
-{
-  if (!this.snippets)
-  {
-      this.editor._toolbarObjects.InsertSnippet2.state("enabled", false);
-  }
-  else InsertSnippet2.prototype.onUpdateToolbar = null;
-}
-
-InsertSnippet2._pluginInfo = {
-  name          : "InsertSnippet2",
-  version       : "1.2",
-  developer     : "Raimund Meyer",
-  developer_url : "http://x-webservice.net",
-  c_owner       : "Raimund Meyer",
-  sponsor       : "",
-  sponsor_url   : "",
-  license       : "htmlArea"
-};
-
-Xinha.Config.prototype.InsertSnippet2 =
-{
-  'snippets' : Xinha.getPluginDir('InsertSnippet2')+'/snippets.xml'
-};
-    
-InsertSnippet2.prototype._lc = function(string) {
-    return Xinha._lc(string, 'InsertSnippet2');
-};
-
-InsertSnippet2.prototype.onGenerateOnce = function()
-{
-    this._prepareDialog();
-};
-InsertSnippet2.prototype._prepareDialog = function()
-{
-  var self = this;
-  if(!this.html) // retrieve the raw dialog contents
-  {
-    Xinha._getback(Xinha.getPluginDir('InsertSnippet2')+'/dialog.html', function(getback) { self.html = getback; self._prepareDialog(); });
-    return;
-  }
-  if (!this.snippets)
-  {
-    setTimeout(function(){self._prepareDialog()},50);
-    return;
-  }
-  var editor = this.editor;
-  var InsertSnippet2 = this;
-  
-  this.dialog = new Xinha.Dialog(editor, this.html, 'InsertSnippet2',{width:800,height:400},{modal:true});
-  Xinha._addClass( this.dialog.rootElem, 'InsertSnippet2' );
-  
-  var dialog = this.dialog;
-  var main = this.dialog.main;
-  var caption = this.dialog.captionBar;
-  
-  this.snippetTable = dialog.getElementById('snippettable');
-  
-  this.drawCatTabs();
-  this.drawSnippetTable();
-  this.preparePreview();
-  
-  dialog.onresize = function() {self.resize(); } 
-  
-  this.dialog.getElementById('search').onkeyup = function() { self.search ()};
-  this.dialog.getElementById('wordbegin').onclick = function() { self.search ()};
-  this.dialog.getElementById('cancel').onclick = function() { self.dialog.hide ()};
-  
-}
-
-InsertSnippet2.prototype.drawSnippetTable = function()
-{
-  if (!this.snippets.length) return;
-  var self = this;
-  var tbody = this.snippetTable;
-  var snippets = this.snippets;
-
-  while (tbody.hasChildNodes())
-  {
-    tbody.removeChild(tbody.lastChild);
-  }
-  var id,snippet_name, snippet_html, snippet_cat, snippet_varname, trow, newCell, cellNo, btn;
-
-  for(var i = 0,trowNo=0; i < snippets.length; i++) 
-  {
-    id = i;
-    snippet_name = snippets[i]['n'];
-    snippet_cat = snippets[i]['c'];
-    snippet_varname = snippets[i]['v']
-    snippet_html = snippets[i]['html'];
-    
-    if (this.categoryFilter && snippet_cat != this.categoryFilter && this.categoryFilter != 'all') continue;
-
-    trow = tbody.insertRow(trowNo);
-    trowNo++;
-
-    cellNo = 0;
-    newCell = trow.insertCell(cellNo);
-
-    newCell.onmouseover = function(event) {return self.preview(event || window.event)};
-    newCell.onmouseout  = function() {return self.preview()};
-    newCell.appendChild(document.createTextNode(snippet_name));
-    newCell.snID = id;
-    
-    newCell.id = 'cell' + id;
-    cellNo++;
-
-    newCell = trow.insertCell(cellNo);
-    
-    newCell.style.whiteSpace = 'nowrap';
-    btn = document.createElement('button');
-    btn.snID = id;
-    btn._insAs = 'html';
-    btn.onclick = function(event) {self.doInsert(event || window.event); return false};
-    btn.appendChild(document.createTextNode(this._lc("HTML")));
-    btn.title = this._lc("Insert as HTML");
-    newCell.appendChild(btn);
-    
-    if (snippet_varname)
-    {
-      newCell.appendChild(document.createTextNode(' '));
-      var btn = document.createElement('button');
-          btn.snID = id;
-          btn._insAs = 'variable';
-          btn.onclick = function(event) {self.doInsert(event || window.event); return false};
-          btn.appendChild(document.createTextNode(this._lc("Variable")));
-          btn.title = this._lc("Insert as template variable");
-
-      newCell.appendChild(btn);
-    }
-
-    cellNo++;
-  }
-}
-InsertSnippet2.prototype.drawCatTabs = function()
-{
-  if (!this.categories.length) return;
-  var self = this;
-  var tabsdiv = this.dialog.getElementById("cattabs");
-  
-  while (tabsdiv.hasChildNodes())
-  {
-    tabsdiv.removeChild(tabsdiv.lastChild);
-  }
-  var tabs_i = 1;
-  var tab = document.createElement('a');
-      tab.href = "javascript:void(0);";
-      tab.appendChild(document.createTextNode(this._lc("All Categories")));
-      tab.cat = 'all';
-      tab.className = "tab"+tabs_i;
-      tab.onclick = function() {self.categoryFilter = self.cat; self.drawCatTabs();self.drawSnippetTable(); self.search ()} 
-      if (!this.categoryFilter || this.categoryFilter == 'all')
-      {
-        Xinha._addClass(tab,'active');
-        tab.onclick = null;
-      }
-  tabsdiv.appendChild(tab);
-  tabs_i++;
-
-  for (var i = 0;i < this.categories.length;i++)
-  {
-    var name = this.categories[i];
-    var tab = document.createElement('a');
-        tab.href = "javascript:void(0);";
-        tab.appendChild(document.createTextNode(name));
-        tab.cat = name;
-        tab.className = "tab"+tabs_i;
-        tab.onclick = function() {self.categoryFilter = this.cat; self.drawCatTabs();self.drawSnippetTable(); self.search ()} 
-        if (name == this.categoryFilter)
-        {
-            Xinha._addClass(tab,'active');
-            tab.onclick = null;
-        }
-    tabsdiv.appendChild(tab);
-    if (Xinha.is_gecko) tabsdiv.appendChild(document.createTextNode(String.fromCharCode(8203)));
-    tabs_i = (tabs_i<16) ? tabs_i +1 : 1;
-  }
-
-  if (!this.catTabsH)
-  {
-    this.catTabsH = tabsdiv.offsetHeight;
-  }
-}
-InsertSnippet2.prototype.search = function ()
-{
-  var tbody = this.dialog.getElementById("snippettable");
-  var searchField =this.dialog.getElementById('search');
-  if (searchField.value)
-  {
-    var val =  searchField.value;
-
-        val = val.replace(/\.?([*?+])/g,'.$1');
-
-    var wordstart = (this.dialog.getElementById('wordbegin').checked) ? '^' : '';
-    try { var re = new RegExp (wordstart+val,'i'); } catch (e) {var re = null};
-  }
-  else var re = null;
-
-  for (var i=0;i<tbody.childNodes.length;i++)
-  {
-    var tr = tbody.childNodes[i]; 
-    var name = tr.firstChild.firstChild.data;
-    if (re && !name.match(re))
-    {
-      tr.style.display = 'none';
-    }
-    else 
-    {
-      tr.style.display = '';
-    }
-  }
-}
-InsertSnippet2.prototype.preview = function(event)
-{
-  if (!event)
-  {
-    this.previewBody.innerHTML = '';
-    return;
-  }
-  var target = event.target || event.srcElement;
-  var snID = target.snID;
-  if (!this.previewBody)
-  {
-    this.preparePreview();
-    return;
-  }
-  if (this.previewIframe.style.display == 'none')
-  {
-    this.previewIframe.style.display = 'block';
-  }
-  this.previewBody.innerHTML = this.snippets[snID].html;
-}
-InsertSnippet2.prototype.preparePreview = function()
-{
-  var editor = this.editor;
-  var self = this;
-  var preview_iframe = this.previewIframe = this.dialog.getElementById('preview_iframe');
-
-  var doc = null;
-  
-  try
-  {
-    if ( preview_iframe.contentDocument )
-    {
-      doc = preview_iframe.contentDocument;        
-    }
-    else
-    {
-      doc = preview_iframe.contentWindow.document;
-    }
-    // try later
-    if ( !doc )
-    {
-      if ( Xinha.is_gecko )
-      {
-        setTimeout(function() { self.preparePreview(snID); }, 50);
-        return false;
-      }
-      else
-      {
-        throw("ERROR: IFRAME can't be initialized.");
-      }
-    }
-  }
-  catch(ex)
-  { // try later
-    setTimeout(function() { self.preparePreview(snID);  }, 50);
-  }
-  doc.open("text/html","replace");
-
-  var html = '<html><head><title></title>';
-  html += "<meta http-equiv=\"Content-Type\" content=\"text/html; charset=" + editor.config.charSet + "\">\n";
-  html += '<style type="text/css">body {background-color:#fff} </style>';
-  if ( typeof editor.config.baseHref != 'undefined' && editor.config.baseHref !== null )
-  {
-    html += "<base href=\"" + editor.config.baseHref + "\"/>\n";
-  }
-  
-  if ( editor.config.pageStyle )
-  {
-    html += "<style type=\"text/css\">\n" + editor.config.pageStyle + "\n</style>";
-  }
-
-  if ( typeof editor.config.pageStyleSheets !== 'undefined' )
-  {
-    for ( var i = 0; i < editor.config.pageStyleSheets.length; i++ )
-    {
-      if ( editor.config.pageStyleSheets[i].length > 0 )
-      {
-        html += "<link rel=\"stylesheet\" type=\"text/css\" href=\"" + editor.config.pageStyleSheets[i] + "\">";
-        //html += "<style> @import url('" + editor.config.pageStyleSheets[i] + "'); </style>\n";
-      }
-    }
-  }
-  html += "</head>\n";
-  html += "<body>\n";
-  html += "</body>\n";
-  html += "</html>";
-
-  doc.write(html);
-  doc.close();
-  setTimeout(function() {
-    self.previewBody = doc.getElementsByTagName('body')[0];
-  },100);
-}
-
-InsertSnippet2.prototype.buttonPress = function(editor)
-{
-  this.dialog.toggle();
-}
-
-InsertSnippet2.prototype.doInsert = function(event)
-{
-  var target = event.target || event.srcElement;
-  var sn  = this.snippets[target.snID];
-  this.dialog.hide();
-  var cfg = this.editor.config.InsertSnippet2;
-  if (target._insAs == 'variable') 
-  {
-      this.editor.insertHTML(sn.v);
-  } 
-  else 
-  {
-      this.editor.insertHTML(sn.html);
-  }	
-}
-
-InsertSnippet2.prototype.resize = function ()
-{
-  var insertDiv = this.dialog.getElementById('insert_div');
-  var preview_iframe = this.dialog.getElementById('preview_iframe');
-  var win = {h:this.dialog.height,w:this.dialog.width};
-
-  var h = win.h - 90;
-  if (this.categories.length) h -= this.catTabsH;
-  insertDiv.style.height = preview_iframe.style.height =  h + 'px';
-  
-  //insertDiv.style.width =  win.w + 'px';
-
-  return true;
-}
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/InsertSnippet2/dialog.html b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/InsertSnippet2/dialog.html
deleted file mode 100644
index 3281872..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/InsertSnippet2/dialog.html
+++ /dev/null
@@ -1,20 +0,0 @@
-<h1 class="title" ><l10n>Insert Snippet</l10n></h1>
-  <form action="" method="get">
-
-    <div class="IScattabs" id="[cattabs]"></div>
-    <div id="[insert_div]" style="overflow:auto;height:330px;float: left;width:50%">
-     <table style="border: 0;width:100%">
-     <tbody id="[snippettable]" class="ISsnippettable"></tbody>
-     </table>
-
-    </div>
-    <div><iframe src="about:blank" style="float:left; border:none;width: 50%;height: 330px" id="[preview_iframe]"></iframe>
-    <div class="space" style="clear: left;"></div>
-    <div class="buttons">
-     <div style="float:left">
-	   <label for="[search]"><l10n>Filter</l10n></label> <input type="text" id="[search]" />
-	   <input type="checkbox" id="[wordbegin]" checked="checked" value="on" /><label for="[wordbegin]"><l10n>Only search word beginning</l10n></label>
-     </div>
-     <button type="button" id="[cancel]" style="float: right;"><l10n>Cancel</l10n></button>
-    </div>
-  </form>
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/InsertSnippet2/img/1.PNG b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/InsertSnippet2/img/1.PNG
deleted file mode 100644
index e9cc95c..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/InsertSnippet2/img/1.PNG
+++ /dev/null
Binary files differ
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/InsertSnippet2/img/10.PNG b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/InsertSnippet2/img/10.PNG
deleted file mode 100644
index 84e4f57..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/InsertSnippet2/img/10.PNG
+++ /dev/null
Binary files differ
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/InsertSnippet2/img/11.PNG b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/InsertSnippet2/img/11.PNG
deleted file mode 100644
index be6982f..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/InsertSnippet2/img/11.PNG
+++ /dev/null
Binary files differ
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/InsertSnippet2/img/12.PNG b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/InsertSnippet2/img/12.PNG
deleted file mode 100644
index a085a1b..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/InsertSnippet2/img/12.PNG
+++ /dev/null
Binary files differ
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/InsertSnippet2/img/13.PNG b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/InsertSnippet2/img/13.PNG
deleted file mode 100644
index 72bf252..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/InsertSnippet2/img/13.PNG
+++ /dev/null
Binary files differ
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/InsertSnippet2/img/14.PNG b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/InsertSnippet2/img/14.PNG
deleted file mode 100644
index 0799576..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/InsertSnippet2/img/14.PNG
+++ /dev/null
Binary files differ
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/InsertSnippet2/img/15.PNG b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/InsertSnippet2/img/15.PNG
deleted file mode 100644
index e322b97..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/InsertSnippet2/img/15.PNG
+++ /dev/null
Binary files differ
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/InsertSnippet2/img/16.PNG b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/InsertSnippet2/img/16.PNG
deleted file mode 100644
index 91577ad..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/InsertSnippet2/img/16.PNG
+++ /dev/null
Binary files differ
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/InsertSnippet2/img/2.PNG b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/InsertSnippet2/img/2.PNG
deleted file mode 100644
index 4cec795..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/InsertSnippet2/img/2.PNG
+++ /dev/null
Binary files differ
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/InsertSnippet2/img/3.PNG b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/InsertSnippet2/img/3.PNG
deleted file mode 100644
index f126794..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/InsertSnippet2/img/3.PNG
+++ /dev/null
Binary files differ
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/InsertSnippet2/img/4.PNG b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/InsertSnippet2/img/4.PNG
deleted file mode 100644
index 1c5ea96..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/InsertSnippet2/img/4.PNG
+++ /dev/null
Binary files differ
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/InsertSnippet2/img/5.PNG b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/InsertSnippet2/img/5.PNG
deleted file mode 100644
index dcaa676..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/InsertSnippet2/img/5.PNG
+++ /dev/null
Binary files differ
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/InsertSnippet2/img/6.PNG b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/InsertSnippet2/img/6.PNG
deleted file mode 100644
index caaef0c..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/InsertSnippet2/img/6.PNG
+++ /dev/null
Binary files differ
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/InsertSnippet2/img/7.PNG b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/InsertSnippet2/img/7.PNG
deleted file mode 100644
index d4f9744..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/InsertSnippet2/img/7.PNG
+++ /dev/null
Binary files differ
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/InsertSnippet2/img/8.PNG b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/InsertSnippet2/img/8.PNG
deleted file mode 100644
index 6164f7a..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/InsertSnippet2/img/8.PNG
+++ /dev/null
Binary files differ
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/InsertSnippet2/img/9.PNG b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/InsertSnippet2/img/9.PNG
deleted file mode 100644
index f7c53a3..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/InsertSnippet2/img/9.PNG
+++ /dev/null
Binary files differ
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/InsertSnippet2/img/ed_snippet.gif b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/InsertSnippet2/img/ed_snippet.gif
deleted file mode 100644
index 12684f8..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/InsertSnippet2/img/ed_snippet.gif
+++ /dev/null
Binary files differ
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/InsertSnippet2/lang/ch.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/InsertSnippet2/lang/ch.js
deleted file mode 100644
index 62e5bd6..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/InsertSnippet2/lang/ch.js
+++ /dev/null
@@ -1,13 +0,0 @@
-// I18N constants
-// LANG: "ch", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Cancel": "取消"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/InsertSnippet2/lang/cz.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/InsertSnippet2/lang/cz.js
deleted file mode 100644
index c26a48b..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/InsertSnippet2/lang/cz.js
+++ /dev/null
@@ -1,13 +0,0 @@
-// I18N constants
-// LANG: "cz", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Cancel": "Zrušit"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/InsertSnippet2/lang/da.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/InsertSnippet2/lang/da.js
deleted file mode 100644
index 2f85401..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/InsertSnippet2/lang/da.js
+++ /dev/null
@@ -1,13 +0,0 @@
-// I18N constants
-// LANG: "da", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Cancel": "Annuller"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/InsertSnippet2/lang/de.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/InsertSnippet2/lang/de.js
deleted file mode 100644
index 5ff7e22..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/InsertSnippet2/lang/de.js
+++ /dev/null
@@ -1,21 +0,0 @@
-// I18N constants
-// LANG: "de", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "All Categories": "Alle Kategorien",
-    "Cancel": "Abbrechen",
-    "Filter": "Filter",
-    "HTML": "HTML",
-    "Insert Snippet": "Snippet einfügen",
-    "Insert as HTML": "Als HTML einfügen",
-    "Insert as template variable": "Als Template-Variable einfügen",
-    "Only search word beginning": "Nur nach Wortanfang suchen",
-    "Variable": "Variable"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/InsertSnippet2/lang/ee.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/InsertSnippet2/lang/ee.js
deleted file mode 100644
index aacd840..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/InsertSnippet2/lang/ee.js
+++ /dev/null
@@ -1,13 +0,0 @@
-// I18N constants
-// LANG: "ee", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Cancel": "Loobu"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/InsertSnippet2/lang/el.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/InsertSnippet2/lang/el.js
deleted file mode 100644
index 7b4695f..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/InsertSnippet2/lang/el.js
+++ /dev/null
@@ -1,13 +0,0 @@
-// I18N constants
-// LANG: "el", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Cancel": "Ακύρωση"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/InsertSnippet2/lang/es.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/InsertSnippet2/lang/es.js
deleted file mode 100644
index 113ea9e..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/InsertSnippet2/lang/es.js
+++ /dev/null
@@ -1,13 +0,0 @@
-// I18N constants
-// LANG: "es", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Cancel": "Cancelar"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/InsertSnippet2/lang/eu.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/InsertSnippet2/lang/eu.js
deleted file mode 100644
index 1021bf7..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/InsertSnippet2/lang/eu.js
+++ /dev/null
@@ -1,13 +0,0 @@
-// I18N constants
-// LANG: "eu", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Cancel": "Utzi"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/InsertSnippet2/lang/fa.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/InsertSnippet2/lang/fa.js
deleted file mode 100644
index fd57189..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/InsertSnippet2/lang/fa.js
+++ /dev/null
@@ -1,13 +0,0 @@
-// I18N constants
-// LANG: "fa", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Cancel": "انصراف"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/InsertSnippet2/lang/fi.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/InsertSnippet2/lang/fi.js
deleted file mode 100644
index 0233ac0..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/InsertSnippet2/lang/fi.js
+++ /dev/null
@@ -1,13 +0,0 @@
-// I18N constants
-// LANG: "fi", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Cancel": "Peruuta"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/InsertSnippet2/lang/fr.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/InsertSnippet2/lang/fr.js
deleted file mode 100644
index 164c263..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/InsertSnippet2/lang/fr.js
+++ /dev/null
@@ -1,13 +0,0 @@
-// I18N constants
-// LANG: "fr", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Cancel": "Annuler"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/InsertSnippet2/lang/he.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/InsertSnippet2/lang/he.js
deleted file mode 100644
index f65ddc7..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/InsertSnippet2/lang/he.js
+++ /dev/null
@@ -1,13 +0,0 @@
-// I18N constants
-// LANG: "he", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Cancel": "ביטול"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/InsertSnippet2/lang/hu.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/InsertSnippet2/lang/hu.js
deleted file mode 100644
index 58d5664..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/InsertSnippet2/lang/hu.js
+++ /dev/null
@@ -1,13 +0,0 @@
-// I18N constants
-// LANG: "hu", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Cancel": "Mégsem"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/InsertSnippet2/lang/it.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/InsertSnippet2/lang/it.js
deleted file mode 100644
index 2aba43a..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/InsertSnippet2/lang/it.js
+++ /dev/null
@@ -1,13 +0,0 @@
-// I18N constants
-// LANG: "it", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Cancel": "Annullamento"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/InsertSnippet2/lang/ja.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/InsertSnippet2/lang/ja.js
deleted file mode 100644
index 38fe597..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/InsertSnippet2/lang/ja.js
+++ /dev/null
@@ -1,16 +0,0 @@
-// I18N constants
-// LANG: "ja", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Cancel": "中止",
-    "Filter": "フィルター",
-    "Insert Snippet": "スニペットの挿入",
-    "Variable": "変数"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/InsertSnippet2/lang/lc_base.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/InsertSnippet2/lang/lc_base.js
deleted file mode 100644
index 1126e6a..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/InsertSnippet2/lang/lc_base.js
+++ /dev/null
@@ -1,34 +0,0 @@
-// I18N constants
-//
-// LANG: "en", ENCODING: UTF-8
-// Author: Translator-Name, <email@example.com>
-//
-// Last revision: 2018-04-12
-// 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).
-//
-// (Please, remove information below)
-// 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.)
-
-{
-    "All Categories": "",
-    "Cancel": "",
-    "Filter": "",
-    "HTML": "",
-    "Insert Snippet": "",
-    "Insert as HTML": "",
-    "Insert as template variable": "",
-    "InsertSnippet for Xinha": "",
-    "Only search word beginning": "",
-    "Variable": ""
-}
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/InsertSnippet2/lang/lt.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/InsertSnippet2/lang/lt.js
deleted file mode 100644
index dbbc674..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/InsertSnippet2/lang/lt.js
+++ /dev/null
@@ -1,13 +0,0 @@
-// I18N constants
-// LANG: "lt", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Cancel": "Atšaukti"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/InsertSnippet2/lang/lv.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/InsertSnippet2/lang/lv.js
deleted file mode 100644
index 0bc68d5..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/InsertSnippet2/lang/lv.js
+++ /dev/null
@@ -1,13 +0,0 @@
-// I18N constants
-// LANG: "lv", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Cancel": "Atcelt"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/InsertSnippet2/lang/nb.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/InsertSnippet2/lang/nb.js
deleted file mode 100644
index cb3a586..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/InsertSnippet2/lang/nb.js
+++ /dev/null
@@ -1,15 +0,0 @@
-// I18N constants
-// LANG: "nb", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Cancel": "Avbryt",
-    "Insert Snippet": "Sett inn snutt",
-    "Variable": "Variabel"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/InsertSnippet2/lang/nl.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/InsertSnippet2/lang/nl.js
deleted file mode 100644
index a6a901a..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/InsertSnippet2/lang/nl.js
+++ /dev/null
@@ -1,16 +0,0 @@
-// I18N constants
-// LANG: "nl", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Cancel": "Annuleren",
-    "Filter": "Filter",
-    "Insert Snippet": "Snippet invoegen",
-    "Variable": "Variabele"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/InsertSnippet2/lang/pl.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/InsertSnippet2/lang/pl.js
deleted file mode 100644
index 9232930..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/InsertSnippet2/lang/pl.js
+++ /dev/null
@@ -1,13 +0,0 @@
-// I18N constants
-// LANG: "pl", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Cancel": "Anuluj"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/InsertSnippet2/lang/pt_br.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/InsertSnippet2/lang/pt_br.js
deleted file mode 100644
index 8157ac7..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/InsertSnippet2/lang/pt_br.js
+++ /dev/null
@@ -1,18 +0,0 @@
-// I18N constants
-// LANG: "pt_br", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Cancel": "Cancelar",
-    "Filter": "Filtro",
-    "HTML": "HTML",
-    "Insert Snippet": "Inserir Fragmento de Código",
-    "InsertSnippet for Xinha": "Fragmento de Códigos para o Xinha",
-    "Variable": "Variável"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/InsertSnippet2/lang/ro.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/InsertSnippet2/lang/ro.js
deleted file mode 100644
index 4c4e19f..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/InsertSnippet2/lang/ro.js
+++ /dev/null
@@ -1,13 +0,0 @@
-// I18N constants
-// LANG: "ro", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Cancel": "Renunţă"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/InsertSnippet2/lang/ru.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/InsertSnippet2/lang/ru.js
deleted file mode 100644
index f569cfd..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/InsertSnippet2/lang/ru.js
+++ /dev/null
@@ -1,13 +0,0 @@
-// I18N constants
-// LANG: "ru", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Cancel": "Отмена"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/InsertSnippet2/lang/sh.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/InsertSnippet2/lang/sh.js
deleted file mode 100644
index 603b0c4..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/InsertSnippet2/lang/sh.js
+++ /dev/null
@@ -1,13 +0,0 @@
-// I18N constants
-// LANG: "sh", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Cancel": "Poništi"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/InsertSnippet2/lang/si.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/InsertSnippet2/lang/si.js
deleted file mode 100644
index 103d160..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/InsertSnippet2/lang/si.js
+++ /dev/null
@@ -1,13 +0,0 @@
-// I18N constants
-// LANG: "si", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Cancel": "Prekliči"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/InsertSnippet2/lang/sr.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/InsertSnippet2/lang/sr.js
deleted file mode 100644
index 8d966e6..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/InsertSnippet2/lang/sr.js
+++ /dev/null
@@ -1,13 +0,0 @@
-// I18N constants
-// LANG: "sr", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Cancel": "Поништи"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/InsertSnippet2/lang/sv.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/InsertSnippet2/lang/sv.js
deleted file mode 100644
index 18b6397..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/InsertSnippet2/lang/sv.js
+++ /dev/null
@@ -1,13 +0,0 @@
-// I18N constants
-// LANG: "sv", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Cancel": "Avbryt"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/InsertSnippet2/lang/th.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/InsertSnippet2/lang/th.js
deleted file mode 100644
index bd36b85..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/InsertSnippet2/lang/th.js
+++ /dev/null
@@ -1,13 +0,0 @@
-// I18N constants
-// LANG: "th", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Cancel": "ยกเลิก"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/InsertSnippet2/lang/tr.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/InsertSnippet2/lang/tr.js
deleted file mode 100644
index 163623d..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/InsertSnippet2/lang/tr.js
+++ /dev/null
@@ -1,13 +0,0 @@
-// I18N constants
-// LANG: "tr", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Cancel": "İptal"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/InsertSnippet2/lang/vn.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/InsertSnippet2/lang/vn.js
deleted file mode 100644
index ec2d779..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/InsertSnippet2/lang/vn.js
+++ /dev/null
@@ -1,13 +0,0 @@
-// I18N constants
-// LANG: "vn", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Cancel": "Hủy"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/InsertSnippet2/readme.html b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/InsertSnippet2/readme.html
deleted file mode 100644
index c161a4b..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/InsertSnippet2/readme.html
+++ /dev/null
@@ -1,51 +0,0 @@
-<!DOCTYPE html
-     PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
-    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
-<html><head>  <title>InsertSnippet for Xinha</title> <style type="text/css">
-  body { font-family: sans-serif; }
-  pre {border: dotted grey thin; background-color:LightYellow;padding:10px }
-  p { width:500px }
-  </style> 
-  </head>
-  <body> 
-    <h1>InsertSnippet2 for Xinha</h1> 
-    <p>Insert HTML fragments or template variables in your document.</p> 
-    <h2>Features</h2> 
-    <ul> 
-      <li>Categorization to organize your snippets if you have a lot  (optional)</li> 
-      <li>Search for name</li> 
-      <li>Insert as literal text/html or variable (optional)&nbsp;</li> 
-      <li>XML data format<br /></li> 
-    </ul> 
-    <h2>Usage</h2> 
-    <p>
-In order to use your own snippets you have to add a parameter to your xinha_config:
-</p> 
-    <pre>xinha_config.InsertSnippet2.snippets = "/path/to/your/snippets.xml";
-</pre> 
-    <p>This path should point to a XML file that has the following format:</p> 
-    <pre>&lt;snXML&gt;
- &lt;categories&gt;
-    &lt;c n="the name" /&gt;
-  &lt;/categories&gt;
-  &lt;snippets&gt;
-        &lt;s n="the name" v="optional variable name to be inserted" c="the category"&gt;
-            &amp;lt;p&amp;gt;some text or HTML, please entize HTML tags&amp;lt;/p&amp;gt;
-        &lt;/s&gt;
-        &lt;s n="another"&gt;
-            &lt;![CDATA[
-               &lt;p&gt;or put HTML in a CDATA section&lt;/p&gt;
-            ]]&gt;
-        &lt;/s&gt;
-  &lt;/snipptes&gt;
-&lt;/snXML&gt;
-</pre> 
-    <p> </p> 
-    <h3>&nbsp;Tags</h3> 
-    <dl><dt>&lt;snXML&gt;&lt;/snXML&gt;</dt><dd>&nbsp;The root tag</dd><dt>&lt;categories&gt;&lt;/categories&gt;<br /></dt><dd>&nbsp;This tag contains the categories (optional)<br /></dd><dt>&nbsp;&lt;c /&gt;</dt><dd>&nbsp;Each category <br /></dd><dt>&nbsp;&lt;snippets&gt;&lt;/snippets&gt;</dt><dd> This tag contains the actual snippet. As this is XML, you cannot put HTML here literally. You have to either entize the &lt;,&gt;, and &amp; characters or wrap the contents in a CDATA section<br /></dd></dl> 
-    <h3>Attributes</h3> 
-    <dl><dt>&nbsp;n</dt><dd>&nbsp;The name of one snippet or category. It is obligatory for both.<br /></dd><dt>&nbsp;v</dt><dd> If this attribute is present in a snippet tag, there is a button in the UI that allows to insert this variable instead of the textual content of the snippet. <br /></dd><dt> c<br /></dt><dd>&nbsp;The category<br /></dd></dl> 
-    <p>Inside the plugin's directory, there is a sample XML file and PHP script that shows how to create the XML dynamically.<br /></p> 
-    <p style="font-size: 80%;">3 October 2008 Raimund Meyer (xinha@raimundmeyer.de)</p> 
-  </body>
-</html>
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/InsertSnippet2/snippets.php b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/InsertSnippet2/snippets.php
deleted file mode 100644
index 9b226ad..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/InsertSnippet2/snippets.php
+++ /dev/null
@@ -1,37 +0,0 @@
-<?php
-/**
- * This is a reference implementation of how to get your snippets dynamically from a PHP data structure into InsertSnippet2's XML format.
- * <?php
- *   $categories = array('cat1','etc...'); //categories are optional
- *   $snippets = array(
- *     array('name'= 'snippet1','text'=>'some text'),
- *     array('name'= 'snippet2','text'=>'<p>some HTML</p>', 'varname'=>'{$var}','category'=>'cat1') //varname and category are optional
- *   )
- * 
- * ?>
- */
-header("Content-type: text/xml");
-print '<?xml version="1.0" encoding="UTF-8"?>
-<!DOCTYPE snXML PUBLIC "Xinha InsertSnippet Data File" "http://x-webservice.net/res/snXML.dtd">';
-?>
-<snXML>
-<categories>
-<?php
-foreach ((array)$categories as $c) {
-	print '<c n="'.$c.'" />'."\n"; 
-}
-
-?>
-</categories>
-<snippets>
-<?php
-foreach ((array)$snippets as $s) {
-	print '<s n="'.$s['name'].'" v="'.$s['varname'].'" c="'.$s['category'].'">
-<![CDATA[
-	'.$s['text'].'
-]]>
-</s>'."\n"; 
-}
-?>
-</snippets>
-</snXML>
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/InsertSnippet2/snippets.xml b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/InsertSnippet2/snippets.xml
deleted file mode 100644
index c06107d..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/InsertSnippet2/snippets.xml
+++ /dev/null
@@ -1,42 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!DOCTYPE snXML PUBLIC "Xinha InsertSnippet Data File" "http://x-webservice.net/res/snXML.dtd">
-<snXML>
-    <categories>
-        <c n="Test Category 1"/>
-        <c n="Test Category 2"/>
-        <c n="Test Category 3"/>
-    </categories>
-    <snippets>
-        <s n="Box 1" v="{$Snippet_Test_0}" c="Test Category 1">
-            <![CDATA[
-              <div class="message_box red">
-                 Visit the <a href="http://xinha.org">Xinha website</a>
-              </div>            </li><li> Nulla placerat nunc ut pede.                 </li><li> Vivamus ultrices mi sit amet urna.           </li><li> Quisque sed augue quis nunc laoreet volutpat.</li><li> Nunc sit amet metus in tortor semper mattis. </li></ul>
-            ]]>
-        </s>
-        <s n="INFORMATION ABOUT SOMETHING" v="{$Snippet_Test_1}" c="Test Category 3">
-               &lt;p&gt;This is some information about something&lt;/p&gt;
-        </s>
-        <s n="Menu" c="Test Category 2">
-            <![CDATA[
-              <ul class="navi_links">
-                 <li class="navi">
-                      <a href="Link1" class="Link1" tabindex="1"><span class="span_class"> Link1 </span></a>
-                 </li>
-                 <li class="navi">
-                      <a href="Link2" class="Link2" tabindex="2"><span class="span_class"> Link2 </span></a>
-                 </li>
-                 <li class="navi">
-                      <a href="Link3" class="Link3" tabindex="3"><span class="span_class"> Link3 </span></a>
-                 </li>
-                 <li class="navi">
-                      <a href="Link4" class="Link4" tabindex="4"><span class="span_class"> Link4 </span></a>
-                 </li>
-                 <li class="navi">
-                      <a href="Link5" class="Link5" tabindex="5"><span class="span_class"> Link5 </span></a>
-                 </li>
-              </ul>
-            ]]>
-        </s>
-    </snippets>
-</snXML>
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/InsertWords/InsertWords.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/InsertWords/InsertWords.js
deleted file mode 100755
index 907fc56..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/InsertWords/InsertWords.js
+++ /dev/null
@@ -1,70 +0,0 @@
-// Plugin for htmlArea to insert keywords, when a type of
-// keyword is selected from a dropdown list
-// By Adam Wright, for The University of Western Australia
-//
-// Distributed under the same terms as HTMLArea itself.
-// This notice MUST stay intact for use (see license.txt).
-
-function InsertWords(editor, params) {
-	this.editor = editor;
-	var cfg = editor.config;
-	var self = this;
-
-    if(params[0] && params[0].combos) {
-      //if arguments where passed with registerPlugin use these
-	  var combos = params[0].combos;
-    } else if (cfg.InsertWords && cfg.InsertWords.combos) {
-      //if combos is found in config use these
-      var combos = cfg.InsertWords.combos;
-    } else {
-      //no combos found
-      var combos = [];
-    }
-
-	// register the toolbar with the keywords dropdown
-    var first = true;
-    var toolbar = [];
-
-	for (var i = combos.length; --i >= 0;) {
-		var combo = combos[i];
-		var id = "IW-id" + i;
-		var iw_class = {
-			id	: id,
-			options	: combo.options,
-			action	: function (editor) { self.onSelect(editor, this, combo.context); },
-			refresh	: function (editor) { },
-			context : combo.context
-		};
-        cfg.registerDropdown(iw_class);
-
-        if (combo.label)
-            toolbar.push("T[" + combo.label + "]");
-        toolbar.push(id);
-        toolbar.push(first ? "separator" : "space");
-	}
-
-    cfg.addToolbarElement(toolbar, "linebreak", 1);
-
-}
-
-InsertWords._pluginInfo = {
-	name          : "InsertWords",
-	version       : "1.0",
-	developer     : "Adam Wright",
-	developer_url : "http://blog.hipikat.org/",
-	sponsor       : "The University of Western Australia",
-	sponsor_url   : "http://www.uwa.edu.au/",
-	license       : "htmlArea"
-};
-
-InsertWords.prototype.onSelect = function(editor, obj, context) {
-
-	// Get the toolbar object element
-	var elem = editor._toolbarObjects[obj.id].element;
-
-	// Insert the keyword value blindly at the selection
-	editor.insertHTML(elem.value);
-
-	// Reset the dropdown to it's label
-	elem.selectedIndex = 0;
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/LangMarks/LangMarks.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/LangMarks/LangMarks.js
deleted file mode 100644
index 3ea70ba..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/LangMarks/LangMarks.js
+++ /dev/null
@@ -1,179 +0,0 @@
-// Mask Language plugin for Xinha
-// Implementation by Udo Schmal
-//
-// (c) Udo Schmal & Schaffrath NeueMedien 2004
-// Distributed under the same terms as HTMLArea itself.
-// This notice MUST stay intact for use (see license.txt).
-
-function LangMarks(editor, args) {
-  this.editor = editor;
-  var cfg = editor.config;
-  var self = this;
-  var options = {};
-  options[this._lc("&mdash; language &mdash;")] = '';
-  
-  // Old configuration type
-  if(!cfg.LangMarks.languages)
-  {
-    Xinha.debugMsg('Warning: Old style LangMarks configuration detected, please update your LangMarks configuration.');
-    var newConfig = {
-      languages:  [],
-      attributes: Xinha.Config.prototype.attributes      
-    };
-    
-    for (var i in cfg.LangMarks)
-    {
-      if (typeof i != 'string') continue;
-      newConfig.languages.push( { name: i, code: cfg.LangMarks[i] } );      
-    }
-    
-    cfg.LangMarks = newConfig;
-  }
-  
-	for (var i = 0; i < cfg.LangMarks.languages.length; i++)
-	{		
-		options[this._lc(cfg.LangMarks.languages[i].name)] = cfg.LangMarks.languages[i].code;
-	}
-  
-
-  cfg.registerDropdown({
-    id	: "langmarks",
-    tooltip	: this._lc("language select"),
-    options	: options,
-    action	: function(editor) { self.onSelect(editor, this); },
-    refresh	: function(editor) { self.updateValue(editor, this); }
-  });
-  cfg.addToolbarElement("langmarks", "inserthorizontalrule", 1);
-}
-
-LangMarks._pluginInfo = {
-  name          : "LangMarks",
-  version       : "1.0",
-  developer     : "Udo Schmal",
-  developer_url : "",
-  sponsor       : "L.N.Schaffrath NeueMedien",
-  sponsor_url   : "http://www.schaffrath-neuemedien.de/",
-  c_owner       : "Udo Schmal & Schaffrath NeueMedien",
-  license       : "htmlArea"
-};
-
-Xinha.Config.prototype.LangMarks = {
-  'languages': [                     // Below are so lc_parse_strings.php finds them
-    { name:"Greek",   code: "el" } , // Xinha._lc('Greek', 'LangMarks')
-    { name:"English", code: "en" },  // Xinha._lc('English', 'LangMarks')
-    { name:"French",  code: "fr" } , // Xinha._lc('French', 'LangMarks')
-    { name:"Latin" ,  code: "la" }   // Xinha._lc('Latin', 'LangMarks')
-  ],
-  
-  'attributes': [
-    'lang',
-    'xml:lang'    
-  ]
-};
-
-LangMarks.prototype._lc = function(string) {
-  return Xinha._lc(string, 'LangMarks');
-};
-
-LangMarks.prototype.onGenerate = function() {
-	 this.editor.addEditorStylesheet(Xinha.getPluginDir("LangMarks") + '/lang-marks.css');
-};
-
-LangMarks.prototype.onSelect = function(editor, obj, context, updatecontextclass) {
-  var tbobj = editor._toolbarObjects[obj.id];
-  var index = tbobj.element.selectedIndex;
-  var language = tbobj.element.value;
-
-  // retrieve parent element of the selection
-  var parent = editor.getParentElement();
-  var surround = true;
-
-  var is_span = (parent && parent.tagName.toLowerCase() == "span");
-  var update_parent = (context && updatecontextclass && parent && parent.tagName.toLowerCase() == context);
-
-  if (update_parent) {
-    parent.className = "haslang";
-    parent.lang = language;    
-    
-    for(var i = 0; i < this.editor.config.LangMarks.attributes.length; i++)
-    {
-      parent.setAttribute(this.editor.config.LangMarks.attributes[i], language);
-    }
-    
-    editor.updateToolbar();
-    return;
-  }
-
-  if (is_span && index == 0 && !/\S/.test(parent.style.cssText)) {
-    while (parent.firstChild) {
-      parent.parentNode.insertBefore(parent.firstChild, parent);
-    }
-    parent.parentNode.removeChild(parent);
-    editor.updateToolbar();
-    return;
-  }
-
-  if (is_span) {
-    // maybe we could simply change the class of the parent node?
-    if (parent.childNodes.length == 1) {
-      parent.className = "haslang";
-      parent.lang = language;
-      
-      for(var i = 0; i < this.editor.config.LangMarks.attributes.length; i++)
-      {
-        parent.setAttribute(this.editor.config.LangMarks.attributes[i], language);
-      }
-            
-      surround = false;
-      // in this case we should handle the toolbar updation
-      // ourselves.
-      editor.updateToolbar();
-    }
-  }
-
-  // Other possibilities could be checked but require a lot of code.  We
-  // can't afford to do that now.
-  if (surround) {
-    // shit happens ;-) most of the time.  this method works, but
-    // it's dangerous when selection spans multiple block-level
-    // elements.
-    var html = '';
-    for(var i = 0; i < this.editor.config.LangMarks.attributes.length; i++)
-    {
-      html += ' ' +this.editor.config.LangMarks.attributes[i] + '="'+language+'"';
-    }
-    
-    editor.surroundHTML('<span'+html+' class="haslang">', '</span>');
-  }
-};
-
-LangMarks.prototype.updateValue = function(editor, obj) {
-  var select = editor._toolbarObjects[obj.id].element;
-  var parents = editor.getAllAncestors();
-  var parent;
-  var lang;
-	for (var i=0;i<parents.length;i++)
-	{
-    for(var j = 0; j < editor.config.LangMarks.attributes.length; j++)
-    {      
-      if(parents[i].getAttribute(this.editor.config.LangMarks.attributes[j]))
-      {
-         parent = parents[i];      
-         lang = parents[i].getAttribute(this.editor.config.LangMarks.attributes[j]);                
-      }
-    }		
-	}
-	if (parent) {
-    var options = select.options;
-    var value = lang;
-    for (var i = options.length; --i >= 0;) {
-      var option = options[i];
-      if (value == option.value) {
-        select.selectedIndex = i;
-        return;
-      }
-    }
-  }
-  else select.selectedIndex = 0;
-
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/LangMarks/lang-marks.css b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/LangMarks/lang-marks.css
deleted file mode 100644
index eee601e..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/LangMarks/lang-marks.css
+++ /dev/null
@@ -1,40 +0,0 @@
-span.haslang {
-	border-bottom: 1px dashed #aaa;
-	white-space : nowrap;
-}
-
-
-
-span[lang]::after {
-	content: attr(lang);
-	text-transform: uppercase;
-	font-family: sans-serif;
-	color: white;
-	background: red;
-	border: 1px solid red;
-	font-size: x-small;
-	font-weight: normal;
-	vertical-align: top;
-}
-
-/*
- * NOTE: The "proper" way to do this is with a CSS namespace
- * @namespace xml "http://www.w3.org/XML/1998/namespace";
- * and putting xmlns:xml="http://www.w3.org/XML/1998/namespace"
- * on the root <html> element or the <span> itself, then using 
- * span[xml|lang] as the selector, but this simply doesn't work 
- * in most browsers.  Which sucks.
- */
-
-span[xml\:lang]::after {
-  content: attr(xml\:lang);
-  text-transform: uppercase;
-  font-family: sans-serif;
-  color: white;
-  background: red;
-  border: 1px solid red;
-  font-size: x-small;
-  font-weight: normal;
-  vertical-align: top;
-}
-
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/LangMarks/lang/de.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/LangMarks/lang/de.js
deleted file mode 100644
index 5a2685a..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/LangMarks/lang/de.js
+++ /dev/null
@@ -1,18 +0,0 @@
-// I18N constants
-// LANG: "de", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "&mdash; language &mdash;": "&mdash; Sprache &mdash;",
-    "English": "englisch",
-    "French": "französisch",
-    "Greek": "griechisch",
-    "Latin": "lateinisch",
-    "language select": "Sprachauswahl"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/LangMarks/lang/es.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/LangMarks/lang/es.js
deleted file mode 100644
index 7a312e3..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/LangMarks/lang/es.js
+++ /dev/null
@@ -1,18 +0,0 @@
-// I18N constants
-// LANG: "es", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "&mdash; language &mdash;": "&mdash; idioma &mdash;",
-    "English": "Inglés",
-    "French": "Francés",
-    "Greek": "Griego",
-    "Latin": "Latín",
-    "language select": "seleccionar idioma"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/LangMarks/lang/fr.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/LangMarks/lang/fr.js
deleted file mode 100644
index 9a7a28a..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/LangMarks/lang/fr.js
+++ /dev/null
@@ -1,18 +0,0 @@
-// I18N constants
-// LANG: "fr", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "&mdash; language &mdash;": "&mdash; Langue &mdash;",
-    "English": "anglais",
-    "French": "français",
-    "Greek": "grec",
-    "Latin": "latin",
-    "language select": "Sélection de la langue"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/LangMarks/lang/ja.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/LangMarks/lang/ja.js
deleted file mode 100644
index 312cecb..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/LangMarks/lang/ja.js
+++ /dev/null
@@ -1,18 +0,0 @@
-// I18N constants
-// LANG: "ja", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "&mdash; language &mdash;": "&mdash; 言語 &mdash;",
-    "English": "英語",
-    "French": "フランス語",
-    "Greek": "ギリシャ語",
-    "Latin": "ラテン語",
-    "language select": "言語の選択"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/LangMarks/lang/lc_base.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/LangMarks/lang/lc_base.js
deleted file mode 100644
index 1392ea1..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/LangMarks/lang/lc_base.js
+++ /dev/null
@@ -1,31 +0,0 @@
-// I18N constants
-//
-// LANG: "en", ENCODING: UTF-8
-// Author: Translator-Name, <email@example.com>
-//
-// Last revision: 2018-04-12
-// 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).
-//
-// (Please, remove information below)
-// 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.)
-
-{
-    "&mdash; language &mdash;": "",
-    "', '": "",
-    "English": "",
-    "French": "",
-    "Greek": "",
-    "Latin": "",
-    "language select": ""
-}
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/LangMarks/lang/nb.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/LangMarks/lang/nb.js
deleted file mode 100644
index f97efaf..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/LangMarks/lang/nb.js
+++ /dev/null
@@ -1,18 +0,0 @@
-// I18N constants
-// LANG: "nb", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "&mdash; language &mdash;": "&mdash; Språk &mdash;",
-    "English": "engelsk",
-    "French": "fransk",
-    "Greek": "grekisk",
-    "Latin": "latin",
-    "language select": "Språkvalg"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/LangMarks/lang/nl.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/LangMarks/lang/nl.js
deleted file mode 100644
index 6c1758e..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/LangMarks/lang/nl.js
+++ /dev/null
@@ -1,18 +0,0 @@
-// I18N constants
-// LANG: "nl", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "&mdash; language &mdash;": "&mdash; taal &mdash;",
-    "English": "Engels",
-    "French": "Frans",
-    "Greek": "Grieks",
-    "Latin": "Latijn",
-    "language select": "Taalkeuze"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/LangMarks/lang/pt_br.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/LangMarks/lang/pt_br.js
deleted file mode 100644
index bf98eb7..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/LangMarks/lang/pt_br.js
+++ /dev/null
@@ -1,18 +0,0 @@
-// I18N constants
-// LANG: "pt_br", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "&mdash; language &mdash;": "&mdash; Idioma &mdash;",
-    "English": "Inglês",
-    "French": "Francês",
-    "Greek": "Grego",
-    "Latin": "Latim",
-    "language select": "Selecionar idioma"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/Linker/Linker.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/Linker/Linker.js
deleted file mode 100644
index c63e3a4..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/Linker/Linker.js
+++ /dev/null
@@ -1,106 +0,0 @@
-/** htmlArea - James' Fork - Linker Plugin **/
-Linker._pluginInfo =
-{
-  name     : "Linker",
-  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/"
-};
-
-Xinha.loadStyle('dTree/dtree.css', 'Linker');
-
-Xinha.Config.prototype.Linker =
-{
-  'treeCaption' : document.location.host,
-  'backend' : Xinha.getPluginDir("Linker") + '/scan.php',
-  'backend_data' : null,
-  'files' : null, 
-  'dialog': null,
-  'canSetTarget': true,
-  'canRemoveLink': true
-};
-
-
-function Linker(editor, args)
-{
-  this.editor  = editor;
-  this.lConfig = editor.config.Linker;
-
-  var linker = this;
-  if(typeof editor._createLink == 'undefined') {
-      editor._createLink = function(target) {
-	  if(!target) target = linker._getSelectedAnchor();
-	  linker._createLink(target);
-      }
-  }
-  if(!editor.config.btnList.createlink)
-  {
-    editor.config.registerButton(
-                                 'createlink', 'Insert/Modify Hyperlink', [_editor_url + "images/ed_buttons_main.gif",6,1], false,
-                                 function(e, objname, obj) { editor.execCommand("createlink"); }
-                                 );
-  }
-
-  // See if we can find 'createlink'
- editor.config.addToolbarElement("createlink", "createlink", 0);
-}
-
-Linker.prototype._lc = function(string)
-{
-  return Xinha._lc(string, 'Linker');
-};
-
-
-Linker.prototype.onGenerateOnce = function()
-{
-  Linker.loadAssets();
-  this.loadFiles();
-};
-
-Linker.prototype.onUpdateToolbar = function()
-{ 
-  if (typeof dTree == 'undefined' || !Linker.methodsReady || !Linker.html || !this.files)
-  {
-    this.editor._toolbarObjects.createlink.state("enabled", false);
-  }
-  else this.onUpdateToolbar = null;
-};
-
-Linker.Dialog_dTrees = [ ];
-
-Linker.loadAssets = function()
-{
-  var self = Linker;
-  if (self.loading) return;
-  self.loading = true;
-  Xinha._getback(Xinha.getPluginDir("Linker") + '/pluginMethods.js', function(getback) { eval(getback); self.methodsReady = true; });
-  Xinha._loadback( Xinha.getPluginDir("Linker") + '/dTree/dtree.js', function() {Linker.dTreeReady = true; } );
-  Xinha._getback( Xinha.getPluginDir("Linker") + '/dialog.html', function(getback) { self.html = getback; } );
-}
-
-Linker.prototype.loadFiles = function()
-{
-    var linker = this;
-    if(linker.lConfig.backend)
-    {
-        //get files from backend
-        Xinha._postback(linker.lConfig.backend,
-                          linker.lConfig.backend_data,
-                          function(txt) {
-                            try {
-                                linker.files = eval(txt);
-                            } catch(Error) {
-                                linker.files = [ {url:'',title:Error.toString()} ];
-                            }
-                            });
-    }
-    else if(linker.lConfig.files != null)
-    {
-        //get files from plugin-config
-        linker.files = linker.lConfig.files;
-    }
-}
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/Linker/dTree/api.html b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/Linker/dTree/api.html
deleted file mode 100644
index 3686a80..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/Linker/dTree/api.html
+++ /dev/null
@@ -1,252 +0,0 @@
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
-
-<html>
-
-<head>
-	<title>Destroydrop &raquo; Javascripts &raquo; Tree &raquo; Api</title>
-
-	<meta http-equiv="content-type" content="text/html;charset=iso-8859-1" />
-	<link rel="stylesheet" href="/dd.css" type="text/css" />
-	<link rel="shortcut icon" href="/favicon.ico" />
-</head>
-
-<body>
-
-<div id="shadow">
-
-	<div id="content">
-
-		<div id="location">
-			<h1><a href="/">Destroydrop</a> &raquo; <a href="/javascripts/">Javascripts</a> &raquo; <a href="/javascripts/tree/">Tree</a> &raquo; <a href="/javascripts/tree/api/">Api</a></h1>
-		</div>
-
-
-		<div class="line"></div>
-
-		<div id="files">
-
-
-<h3>Overview</h3>
-<div class="line"></div>
-<div class="item">
-
-	<ul class="arrow">
-		<li><a href="#functions">Functions</a>
-			<ul class="arrow">
-				<li><a href="#add">add</a></li>
-				<li><a href="#openall">openAll</a></li>
-				<li><a href="#closeall">closeAll</a></li>
-				<li><a href="#opento">openTo</a></li>
-			</ul>
-		</li>
-		<li><a href="#configuration">Configuration</a></li>
-	</ul>
-
-</div>
-
-<a name="functions"></a>
-<h3>Functions</h3>
-<div class="line"></div>
-<div class="item">
-
-	<a name="add"></a>
-	<h4 class="func">add()</h4>
-	<p>Adds a node to the tree.<br />Can only be called before the tree is drawn.</p>
-	<p>id, pid and name are required.</p>
-
-	<h4>Parameters</h4>
-	<table class="files">
-	<tr>
-		<th>Name</th>
-		<th>Type</th>
-		<th>Description</th>
-	</tr>
-	<tr>
-		<td>id</td>
-		<td>Number</td>
-		<td>Unique identity number.</td>
-	</tr>
-	<tr>
-		<td>pid</td>
-		<td>Number</td>
-		<td>Number refering to the parent node. The value for the root node has to be -1.</td>
-	</tr>
-	<tr>
-		<td>name</td>
-		<td>String</td>
-		<td>Text label for the node.</td>
-	</tr>
-	<tr>
-		<td>url</td>
-		<td>String</td>
-		<td>Url for the node.</td>
-	</tr>
-	<tr>
-		<td>title</td>
-		<td>String</td>
-		<td>Title for the node.</td>
-	</tr>
-	<tr>
-		<td>target</td>
-		<td>String</td>
-		<td>Target for the node.</td>
-	</tr>
-	<tr>
-		<td>icon</td>
-		<td>String</td>
-		<td>Image file to use as the icon. Uses default if not specified.</td>
-	</tr>
-	<tr>
-		<td>iconOpen</td>
-		<td>String</td>
-		<td>Image file to use as the open icon. Uses default if not specified.</td>
-	</tr>
-	<tr>
-		<td>open</td>
-		<td>Boolean</td>
-		<td>Is the node open.</td>
-	</tr>
-	</table>
-	<br />
-
-
-	<h4>Example</h4>
-	<p><code>mytree.add(1, 0, 'My node', 'node.html', 'node title', 'mainframe', 'img/musicfolder.gif');</code></p>
-	<br />
-
-	<a name="openall"></a>
-	<h4 class="func">openAll()</h4>
-	<p>Opens all the nodes.<br />Can be called before and after the tree is drawn.</p>
-	<h4>Example</h4>
-	<p><code>mytree.openAll();</code></p>
-	<br />
-
-
-	<a name="closeall"></a>
-	<h4 class="func">closeAll()</h4>
-	<p>Closes all the nodes.<br />Can be called before and after the tree is drawn.</p>
-	<h4>Example</h4>
-	<p><code>mytree.closeAll();</code></p>
-	<br />
-
-
-	<a name="opento"></a>
-	<h4 class="func">openTo()</h4>
-	<p>Opens the tree to a certain node and can also select the node.<br />
-	Can only be called after the tree is drawn.</p>
-
-	<h4>Parameters</h4>
-	<table class="files">
-	<tr>
-		<th>Name</th>
-		<th>Type</th>
-		<th>Description</th>
-	</tr>
-	<tr>
-		<td>id</td>
-		<td>Number</td>
-		<td>Identity number for the node.</td>
-	</tr>
-	<tr>
-		<td>select</td>
-		<td>Boolean</td>
-		<td>Should the node be selected.</td>
-	</tr>
-	</table>
-
-	<h4>Example</h4>
-	<p><code>mytree.openTo(4, true);</code></p>
-
-</div>
-
-<a name="configuration"></a>
-<h3>Configuration</h3>
-<div class="line"></div>
-<div class="item">
-
-	<table class="files">
-	<tr>
-		<th>Variable</th>
-		<th>Type</th>
-		<th>Default</th>
-		<th>Description</th>
-	</tr>
-	<tr>
-		<td>target</td>
-		<td>String</td>
-		<td>true</td>
-		<td>Target for all the nodes.</td>
-	</tr>
-	<tr>
-		<td>folderLinks</td>
-		<td>Boolean</td>
-		<td>true</td>
-		<td>Should folders be links.</td>
-	</tr>
-	<tr>
-		<td>useSelection</td>
-		<td>Boolean</td>
-		<td>true</td>
-		<td>Nodes can be selected(highlighted).</td>
-	</tr>
-	<tr>
-		<td>useCookies</td>
-		<td>Boolean</td>
-		<td>true</td>
-		<td>The tree uses cookies to rember it's state.</td>
-	</tr>
-	<tr>
-		<td>useLines</td>
-		<td>Boolean</td>
-		<td>true</td>
-		<td>Tree is drawn with lines.</td>
-	</tr>
-	<tr>
-		<td>useIcons</td>
-		<td>Boolean</td>
-		<td>true</td>
-		<td>Tree is drawn with icons.</td>
-	</tr>
-	<tr>
-		<td>useStatusText</td>
-		<td>Boolean</td>
-		<td>false</td>
-		<td>Displays node names in the statusbar instead of the url.</td>
-	</tr>
-	<tr>
-		<td>closeSameLevel</td>
-		<td>Boolean</td>
-		<td>false</td>
-		<td>Only one node within a parent can be expanded at the same time.  openAll() and closeAll() functions do not work when this is enabled.</td>
-	</tr>
-	<tr>
-		<td>inOrder</td>
-		<td>Boolean</td>
-		<td>false</td>
-		<td>If parent nodes are always added before children, setting this to true speeds up the tree.</td>
-	</tr>
-	</table>
-
-	<h4>Example</h4>
-	<p><code>mytree.config.target = "mytarget";</code></p>
-
-</div>
-
-		</div>
-
-		<div class="line"></div>
-
-
-		<div id="copy">
-			<p class="right"><a href="http://validator.w3.org/check/referer">XHTML</a>, <a href="http://jigsaw.w3.org/css-validator/check/referer">CSS</a></p>
-			<p><a href="mailto&#58;drop&#64;destroydrop&#46;com">&copy;2002-2003 Geir Landr&ouml;</a></p>
-		</div>
-
-	</div>
-
-</div>
-
-
-</body>
-
-</html>
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/Linker/dTree/dtree.css b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/Linker/dTree/dtree.css
deleted file mode 100644
index ebf7556..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/Linker/dTree/dtree.css
+++ /dev/null
@@ -1,41 +0,0 @@
-/*--------------------------------------------------|

-| dTree 2.05 | www.destroydrop.com/javascript/tree/ |

-|---------------------------------------------------|

-| Copyright (c) 2002-2003 Geir Landr?               |

-|--------------------------------------------------*/

-

-.dtree {

-  font-family: Verdana, Geneva, Arial, Helvetica, sans-serif;

-  font-size: 11px;

-  color: #666;

-  white-space: nowrap;

-}

-.dtree img {

-  border: 0px !important;

-  margin:0px  !important;

-  display:inline !important;

-  vertical-align: middle !important;

-}

-.dtree a,.dtree a:visited {

-  color: #333;

-  text-decoration: none;

-}

-.dtree a.node, .dtree a.nodeSel {

-  white-space: nowrap;

-  padding: 1px 2px 1px 2px;

-  /*padding: 0px 1px 0px 1px;*/

-}

-.dtree a.node:hover, .dtree a.nodeSel:hover {

-  color: #333;

-  text-decoration: underline;

-}

-.dtree a.nodeSel {

-  background-color: #c0d2ec;

-  /*

-  -moz-border-radius : 4px;

-  border:1px dotted #333;

-  */

-}

-.dtree .clip {

-  overflow: hidden;

-}

diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/Linker/dTree/dtree.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/Linker/dTree/dtree.js
deleted file mode 100644
index 6299624..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/Linker/dTree/dtree.js
+++ /dev/null
@@ -1,725 +0,0 @@
-/*--------------------------------------------------|
-
-| dTree 2.05 | www.destroydrop.com/javascript/tree/ |
-
-|---------------------------------------------------|
-
-| Copyright (c) 2002-2003 Geir Landr?               |
-
-|                                                   |
-
-| This script can be used freely as long as all     |
-
-| copyright messages are intact.                    |
-
-|                                                   |
-
-| Updated: 17.04.2003                               |
-
-|--------------------------------------------------*/
-
-
-
-// Node object
-
-function dTreeNode(id, pid, name, url, title, target, icon, iconOpen, open) {
-
-  this.id = id;
-
-  this.pid = pid;
-
-  this.name = name;
-
-  this.url = url;
-
-  this.title = title;
-
-  this.target = target;
-
-  this.icon = icon;
-
-  this.iconOpen = iconOpen;
-
-  this._io = open || false;
-
-  this._is = false;
-
-  this._ls = false;
-
-  this._hc = false;
-
-  this._ai = 0;
-
-  this._p;
-
-}
-
-
-
-// Tree object
-
-function dTree(objName, baseDir) {
-
-  this.config = {
-
-    target					: null,
-
-    folderLinks			: true,
-
-    useSelection		: true,
-
-    useCookies			: true,
-
-    useLines				: true,
-
-    useIcons				: true,
-
-    useStatusText		: false,
-
-    closeSameLevel	: false,
-
-    inOrder					: false
-
-  };
-
-  this.icon = {
-
-    root				: baseDir + 'img/base.gif',
-
-    folder			: baseDir + 'img/folder.gif',
-
-    folderOpen	: baseDir + 'img/folderopen.gif',
-
-    node				: baseDir + 'img/page.gif',
-
-    empty				: baseDir + 'img/empty.gif',
-
-    line				: baseDir + 'img/line.gif',
-
-    join				: baseDir + 'img/join.gif',
-
-    joinBottom	: baseDir + 'img/joinbottom.gif',
-
-    plus				: baseDir + 'img/plus.gif',
-
-    plusBottom	: baseDir + 'img/plusbottom.gif',
-
-    minus				: baseDir + 'img/minus.gif',
-
-    minusBottom	: baseDir + 'img/minusbottom.gif',
-
-    nlPlus			: baseDir + 'img/nolines_plus.gif',
-
-    nlMinus			: baseDir + 'img/nolines_minus.gif'
-
-  };
-
-  this.obj = objName;
-
-  this.aNodes = [];
-
-  this.aIndent = [];
-
-  this.root = new dTreeNode(-1);
-
-  this.selectedNode = null;
-
-  this.selectedFound = false;
-
-  this.completed = false;
-
-}
-
-
-
-// Adds a new node to the node array
-
-dTree.prototype.add = function(id, pid, name, url, title, target, icon, iconOpen, open) {
-
-  this.aNodes[this.aNodes.length] = new dTreeNode(id, pid, name, url, title, target, icon, iconOpen, open);
-
-};
-
-
-
-// Open/close all nodes
-
-dTree.prototype.openAll = function() {
-
-  this.oAll(true);
-
-};
-
-dTree.prototype.closeAll = function() {
-
-  this.oAll(false);
-
-};
-
-
-
-// Outputs the tree to the page
-
-dTree.prototype.toString = function() {
-  this.setCS_All();
-  var str = '<div class="dtree">\n';
-
-  if (document.getElementById) {
-
-    if (this.config.useCookies) this.selectedNode = this.getSelected();
-
-    str += this.addNode(this.root);
-
-  } else str += 'Browser not supported.';
-
-  str += '</div>';
-
-  if (!this.selectedFound) this.selectedNode = null;
-
-  this.completed = true;
-
-  return str;
-
-};
-
-
-
-// Creates the tree structure
-
-dTree.prototype.addNode = function(pNode) {
-
-  var str = '';
-
-  var n=0;
-
-  if (this.config.inOrder) n = pNode._ai;
-
-  for (n; n<this.aNodes.length; n++) {
-
-    if (this.aNodes[n].pid == pNode.id) {
-
-      var cn = this.aNodes[n];
-
-      cn._p = pNode;
-
-      cn._ai = n;
-
-      // this.setCS(cn);
-
-      if (!cn.target && this.config.target) cn.target = this.config.target;
-
-      if (cn._hc && !cn._io && this.config.useCookies) cn._io = this.isOpen(cn.id);
-
-      if (!this.config.folderLinks && cn._hc) cn.url = null;
-
-      if (this.config.useSelection && cn.id == this.selectedNode && !this.selectedFound) {
-
-          cn._is = true;
-
-          this.selectedNode = n;
-
-          this.selectedFound = true;
-
-      }
-
-      str += this.node(cn, n);
-
-      if (cn._ls) break;
-
-    }
-
-  }
-
-  return str;
-
-};
-
-
-
-// Creates the node icon, url and text
-
-dTree.prototype.node = function(node, nodeId) {
-
-  var str = '<div class="dTreeNode">' + this.indent(node, nodeId);
-
-  if (this.config.useIcons) {
-
-    if (!node.icon) node.icon = (this.root.id == node.pid) ? this.icon.root : ((node._hc) ? this.icon.folder : this.icon.node);
-
-    if (!node.iconOpen) node.iconOpen = (node._hc) ? this.icon.folderOpen : this.icon.node;
-
-    if (this.root.id == node.pid) {
-
-      node.icon = this.icon.root;
-
-      node.iconOpen = this.icon.root;
-
-    }
-
-    str += '<img id="i' + this.obj + nodeId + '" src="' + ((node._io) ? node.iconOpen : node.icon) + '" alt="" />';
-
-  }
-
-  if (node.url) {
-
-    str += '<a id="s' + this.obj + nodeId + '" class="' + ((this.config.useSelection) ? ((node._is ? 'nodeSel' : 'node')) : 'node') + '" href="' + node.url + '"';
-
-    if (node.title) str += ' title="' + node.title + '"';
-
-    if (node.target) str += ' target="' + node.target + '"';
-
-    if (this.config.useStatusText) str += ' onmouseover="window.status=\'' + node.name + '\';return true;" onmouseout="window.status=\'\';return true;" ';
-
-    if (this.config.useSelection && ((node._hc && this.config.folderLinks) || !node._hc))
-
-      str += ' onclick="javascript: ' + this.obj + '.s(' + nodeId + ');"';
-
-    str += '>';
-
-  }
-
-  else if ((!this.config.folderLinks || !node.url) && node._hc && node.pid != this.root.id)
-
-    str += '<a href="javascript: ' + this.obj + '.o(' + nodeId + ');" class="node">';
-
-  str += node.name;
-
-  if (node.url || ((!this.config.folderLinks || !node.url) && node._hc)) str += '</a>';
-
-  str += '</div>';
-
-  if (node._hc) {
-
-    str += '<div id="d' + this.obj + nodeId + '" class="clip" style="display:' + ((this.root.id == node.pid || node._io) ? 'block' : 'none') + ';">';
-
-    str += this.addNode(node);
-
-    str += '</div>';
-
-  }
-
-  this.aIndent.pop();
-
-  return str;
-
-};
-
-
-
-// Adds the empty and line icons
-
-dTree.prototype.indent = function(node, nodeId) {
-
-  var str = '';
-
-  if (this.root.id != node.pid) {
-
-    for (var n=0; n<this.aIndent.length; n++)
-
-      str += '<img src="' + ( (this.aIndent[n] == 1 && this.config.useLines) ? this.icon.line : this.icon.empty ) + '" alt="" />';
-
-    (node._ls) ? this.aIndent.push(0) : this.aIndent.push(1);
-
-    if (node._hc) {
-
-      str += '<a href="javascript: ' + this.obj + '.o(' + nodeId + ');"><img id="j' + this.obj + nodeId + '" src="';
-
-      if (!this.config.useLines) str += (node._io) ? this.icon.nlMinus : this.icon.nlPlus;
-
-      else str += ( (node._io) ? ((node._ls && this.config.useLines) ? this.icon.minusBottom : this.icon.minus) : ((node._ls && this.config.useLines) ? this.icon.plusBottom : this.icon.plus ) );
-
-      str += '" alt="" /></a>';
-
-    } else str += '<img src="' + ( (this.config.useLines) ? ((node._ls) ? this.icon.joinBottom : this.icon.join ) : this.icon.empty) + '" alt="" />';
-
-  }
-
-  return str;
-
-};
-
-
-
-// Checks if a node has any children and if it is the last sibling
-
-dTree.prototype.setCS = function(node) {
-
-  var lastId;
-
-  for (var n=0; n<this.aNodes.length; n++) {
-
-    if (this.aNodes[n].pid == node.id) node._hc = true;
-
-    if (this.aNodes[n].pid == node.pid) lastId = this.aNodes[n].id;
-
-  }
-
-  if (lastId==node.id) node._ls = true;
-
-};
-
-dTree.prototype.setCS_All = function()
-{
-  var ids = { }; // ID => { _hc: haschildren, _ls_is: lastsibling}
-
-  for(var n = 0; n < this.aNodes.length; n++)
-  {
-    var node = this.aNodes[n];
-    if(!ids[node.pid])
-    {
-      ids[node.pid] = { _hc: true, _ls_is: node.id };
-    }
-    else
-    {
-      ids[node.pid]._hc    = true;
-      ids[node.pid]._ls_is = node.id;
-    }
-
-    if(!ids[node.id])
-    {
-      ids[node.id] = { _hc: false, _ls_is: null }
-    }
-  }
-
-  for(var n = 0; n < this.aNodes.length; n++)
-  {
-    var node = this.aNodes[n];
-    node._ls = ids[node.pid]._ls_is == node.id ? true : false;
-    if(ids[node.id]) 
-    {
-      node._hc = ids[node.id]._hc;
-    }
-  }
-};
-
-// Returns the selected node
-
-dTree.prototype.getSelected = function() {
-
-  var sn = this.getCookie('cs' + this.obj);
-
-  return (sn) ? sn : null;
-
-};
-
-
-
-// Highlights the selected node
-
-dTree.prototype.s = function(id) {
-
-  if (!this.config.useSelection) return;
-
-  var cn = this.aNodes[id];
-
-  if (cn._hc && !this.config.folderLinks) return;
-
-  if (this.selectedNode != id) {
-
-    if (this.selectedNode || this.selectedNode==0) {
-
-      eOld = document.getElementById("s" + this.obj + this.selectedNode);
-
-      eOld.className = "node";
-
-    }
-
-    eNew = document.getElementById("s" + this.obj + id);
-
-    eNew.className = "nodeSel";
-
-    this.selectedNode = id;
-
-    if (this.config.useCookies) this.setCookie('cs' + this.obj, cn.id);
-
-  }
-
-};
-
-
-
-// Toggle Open or close
-
-dTree.prototype.o = function(id) {
-
-  var cn = this.aNodes[id];
-
-  this.nodeStatus(!cn._io, id, cn._ls);
-
-  cn._io = !cn._io;
-
-  if (this.config.closeSameLevel) this.closeLevel(cn);
-
-  if (this.config.useCookies) this.updateCookie();
-
-};
-
-
-
-// Open or close all nodes
-
-dTree.prototype.oAll = function(status) {
-
-  for (var n=0; n<this.aNodes.length; n++) {
-
-    if (this.aNodes[n]._hc && this.aNodes[n].pid != this.root.id) {
-
-      this.nodeStatus(status, n, this.aNodes[n]._ls)
-
-      this.aNodes[n]._io = status;
-
-    }
-
-  }
-
-  if (this.config.useCookies) this.updateCookie();
-
-};
-
-
-
-// Opens the tree to a specific node
-
-dTree.prototype.openTo = function(nId, bSelect, bFirst) {
-
-  if (!bFirst) {
-
-    for (var n=0; n<this.aNodes.length; n++) {
-
-      if (this.aNodes[n].id == nId) {
-
-        nId=n;
-
-        break;
-
-      }
-
-    }
-
-  }
-
-  var cn=this.aNodes[nId];
-
-  if (cn.pid==this.root.id || !cn._p) return;
-
-  cn._io = true;
-
-  cn._is = bSelect;
-
-  if (this.completed && cn._hc) this.nodeStatus(true, cn._ai, cn._ls);
-
-  if (this.completed && bSelect) this.s(cn._ai);
-
-  else if (bSelect) this._sn=cn._ai;
-
-  this.openTo(cn._p._ai, false, true);
-
-};
-
-
-
-// Closes all nodes on the same level as certain node
-
-dTree.prototype.closeLevel = function(node) {
-
-  for (var n=0; n<this.aNodes.length; n++) {
-
-    if (this.aNodes[n].pid == node.pid && this.aNodes[n].id != node.id && this.aNodes[n]._hc) {
-
-      this.nodeStatus(false, n, this.aNodes[n]._ls);
-
-      this.aNodes[n]._io = false;
-
-      this.closeAllChildren(this.aNodes[n]);
-
-    }
-
-  }
-
-}
-
-
-
-// Closes all children of a node
-
-dTree.prototype.closeAllChildren = function(node) {
-
-  for (var n=0; n<this.aNodes.length; n++) {
-
-    if (this.aNodes[n].pid == node.id && this.aNodes[n]._hc) {
-
-      if (this.aNodes[n]._io) this.nodeStatus(false, n, this.aNodes[n]._ls);
-
-      this.aNodes[n]._io = false;
-
-      this.closeAllChildren(this.aNodes[n]);
-
-    }
-
-  }
-
-}
-
-
-
-// Change the status of a node(open or closed)
-
-dTree.prototype.nodeStatus = function(status, id, bottom) {
-
-  eDiv	= document.getElementById('d' + this.obj + id);
-
-  eJoin	= document.getElementById('j' + this.obj + id);
-
-  if (this.config.useIcons) {
-
-    eIcon	= document.getElementById('i' + this.obj + id);
-
-    eIcon.src = (status) ? this.aNodes[id].iconOpen : this.aNodes[id].icon;
-
-  }
-
-  eJoin.src = (this.config.useLines)?
-
-  ((status)?((bottom)?this.icon.minusBottom:this.icon.minus):((bottom)?this.icon.plusBottom:this.icon.plus)):
-
-  ((status)?this.icon.nlMinus:this.icon.nlPlus);
-
-  eDiv.style.display = (status) ? 'block': 'none';
-
-};
-
-
-
-
-
-// [Cookie] Clears a cookie
-
-dTree.prototype.clearCookie = function() {
-
-  var now = new Date();
-
-  var yesterday = new Date(now.getTime() - 1000 * 60 * 60 * 24);
-
-  this.setCookie('co'+this.obj, 'cookieValue', yesterday);
-
-  this.setCookie('cs'+this.obj, 'cookieValue', yesterday);
-
-};
-
-
-
-// [Cookie] Sets value in a cookie
-
-dTree.prototype.setCookie = function(cookieName, cookieValue, expires, path, domain, secure) {
-
-  document.cookie =
-
-    escape(cookieName) + '=' + escape(cookieValue)
-
-    + (expires ? '; expires=' + expires.toGMTString() : '')
-
-    + (path ? '; path=' + path : '')
-
-    + (domain ? '; domain=' + domain : '')
-
-    + (secure ? '; secure' : '');
-
-};
-
-
-
-// [Cookie] Gets a value from a cookie
-
-dTree.prototype.getCookie = function(cookieName) {
-
-  var cookieValue = '';
-
-  var posName = document.cookie.indexOf(escape(cookieName) + '=');
-
-  if (posName != -1) {
-
-    var posValue = posName + (escape(cookieName) + '=').length;
-
-    var endPos = document.cookie.indexOf(';', posValue);
-
-    if (endPos != -1) cookieValue = unescape(document.cookie.substring(posValue, endPos));
-
-    else cookieValue = unescape(document.cookie.substring(posValue));
-
-  }
-
-  return (cookieValue);
-
-};
-
-
-
-// [Cookie] Returns ids of open nodes as a string
-
-dTree.prototype.updateCookie = function() {
-
-  var str = '';
-
-  for (var n=0; n<this.aNodes.length; n++) {
-
-    if (this.aNodes[n]._io && this.aNodes[n].pid != this.root.id) {
-
-      if (str) str += '.';
-
-      str += this.aNodes[n].id;
-
-    }
-
-  }
-
-  this.setCookie('co' + this.obj, str);
-
-};
-
-
-
-// [Cookie] Checks if a node id is in a cookie
-
-dTree.prototype.isOpen = function(id) {
-
-  var aOpen = this.getCookie('co' + this.obj).split('.');
-
-  for (var n=0; n<aOpen.length; n++)
-
-    if (aOpen[n] == id) return true;
-
-  return false;
-
-};
-
-
-
-// If Push and pop is not implemented by the browser
-
-if (!Array.prototype.push) {
-
-  Array.prototype.push = function array_push() {
-
-    for(var i=0;i<arguments.length;i++)
-
-      this[this.length]=arguments[i];
-
-    return this.length;
-
-  };
-
-}
-
-if (!Array.prototype.pop) {
-
-  Array.prototype.pop = function array_pop() {
-
-    lastElement = this[this.length-1];
-
-    this.length = Math.max(this.length-1,0);
-
-    return lastElement;
-
-  };
-
-}
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/Linker/dTree/example01.html b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/Linker/dTree/example01.html
deleted file mode 100644
index 07d47a2..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/Linker/dTree/example01.html
+++ /dev/null
@@ -1,53 +0,0 @@
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
-
-<html>
-
-<head>
-	<title>Destroydrop &raquo; Javascripts &raquo; Tree</title>
-
-	<link rel="StyleSheet" href="dtree.css" type="text/css" />
-	<script type="text/javascript" src="dtree.js"></script>
-
-</head>
-
-<body>
-
-<h1><a href="/">Destroydrop</a> &raquo; <a href="/javascripts/">Javascripts</a> &raquo; <a href="/javascripts/tree/">Tree</a></h1>
-
-<h2>Example</h2>
-
-<div class="dtree">
-
-	<p><a href="javascript: d.openAll();">open all</a> | <a href="javascript: d.closeAll();">close all</a></p>
-
-	<script type="text/javascript">
-		<!--
-
-		d = new dTree('d');
-
-		d.add(0,-1,'My example tree');
-		d.add(1,0,'Node 1','example01.html');
-		d.add(2,0,'Node 2','example01.html');
-		d.add(3,1,'Node 1.1','example01.html');
-		d.add(4,0,'Node 3','example01.html');
-		d.add(5,3,'Node 1.1.1','example01.html');
-		d.add(6,5,'Node 1.1.1.1','example01.html');
-		d.add(7,0,'Node 4','example01.html');
-		d.add(8,1,'Node 1.2','example01.html');
-		d.add(9,0,'My Pictures','example01.html','Pictures I\'ve taken over the years','','','img/imgfolder.gif');
-		d.add(10,9,'The trip to Iceland','example01.html','Pictures of Gullfoss and Geysir');
-		d.add(11,9,'Mom\'s birthday','example01.html');
-		d.add(12,0,'Recycle Bin','example01.html','','','img/trash.gif');
-
-		document.write(d);
-
-		//-->
-	</script>
-
-</div>
-
-<p><a href="mailto&#58;drop&#64;destroydrop&#46;com">&copy;2002-2003 Geir Landr&ouml;</a></p>
-
-</body>
-
-</html>
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/Linker/dTree/img/base.gif b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/Linker/dTree/img/base.gif
deleted file mode 100644
index 5aa538c..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/Linker/dTree/img/base.gif
+++ /dev/null
Binary files differ
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/Linker/dTree/img/cd.gif b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/Linker/dTree/img/cd.gif
deleted file mode 100644
index 6dfd68e..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/Linker/dTree/img/cd.gif
+++ /dev/null
Binary files differ
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/Linker/dTree/img/copy.gif b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/Linker/dTree/img/copy.gif
deleted file mode 100644
index 330771c..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/Linker/dTree/img/copy.gif
+++ /dev/null
Binary files differ
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/Linker/dTree/img/empty.gif b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/Linker/dTree/img/empty.gif
deleted file mode 100644
index b5cf523..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/Linker/dTree/img/empty.gif
+++ /dev/null
Binary files differ
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/Linker/dTree/img/folder.gif b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/Linker/dTree/img/folder.gif
deleted file mode 100644
index a4e2f29..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/Linker/dTree/img/folder.gif
+++ /dev/null
Binary files differ
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/Linker/dTree/img/folderopen.gif b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/Linker/dTree/img/folderopen.gif
deleted file mode 100644
index 074649b..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/Linker/dTree/img/folderopen.gif
+++ /dev/null
Binary files differ
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/Linker/dTree/img/globe.gif b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/Linker/dTree/img/globe.gif
deleted file mode 100644
index f00ef00..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/Linker/dTree/img/globe.gif
+++ /dev/null
Binary files differ
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/Linker/dTree/img/imgfolder.gif b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/Linker/dTree/img/imgfolder.gif
deleted file mode 100644
index 7906217..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/Linker/dTree/img/imgfolder.gif
+++ /dev/null
Binary files differ
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/Linker/dTree/img/join.gif b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/Linker/dTree/img/join.gif
deleted file mode 100644
index e5e2f6a..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/Linker/dTree/img/join.gif
+++ /dev/null
Binary files differ
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/Linker/dTree/img/joinbottom.gif b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/Linker/dTree/img/joinbottom.gif
deleted file mode 100644
index dd83b18..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/Linker/dTree/img/joinbottom.gif
+++ /dev/null
Binary files differ
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/Linker/dTree/img/line.gif b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/Linker/dTree/img/line.gif
deleted file mode 100644
index 6dcdebe..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/Linker/dTree/img/line.gif
+++ /dev/null
Binary files differ
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/Linker/dTree/img/minus.gif b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/Linker/dTree/img/minus.gif
deleted file mode 100644
index 6eb44b6..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/Linker/dTree/img/minus.gif
+++ /dev/null
Binary files differ
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/Linker/dTree/img/minusbottom.gif b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/Linker/dTree/img/minusbottom.gif
deleted file mode 100644
index 1380d72..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/Linker/dTree/img/minusbottom.gif
+++ /dev/null
Binary files differ
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/Linker/dTree/img/move.gif b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/Linker/dTree/img/move.gif
deleted file mode 100644
index 1aa1eab..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/Linker/dTree/img/move.gif
+++ /dev/null
Binary files differ
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/Linker/dTree/img/musicfolder.gif b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/Linker/dTree/img/musicfolder.gif
deleted file mode 100644
index 5761a40..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/Linker/dTree/img/musicfolder.gif
+++ /dev/null
Binary files differ
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/Linker/dTree/img/nolines_minus.gif b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/Linker/dTree/img/nolines_minus.gif
deleted file mode 100644
index daa8c20..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/Linker/dTree/img/nolines_minus.gif
+++ /dev/null
Binary files differ
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/Linker/dTree/img/nolines_plus.gif b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/Linker/dTree/img/nolines_plus.gif
deleted file mode 100644
index 3e28a7a..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/Linker/dTree/img/nolines_plus.gif
+++ /dev/null
Binary files differ
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/Linker/dTree/img/offline.gif b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/Linker/dTree/img/offline.gif
deleted file mode 100644
index 23163a4..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/Linker/dTree/img/offline.gif
+++ /dev/null
Binary files differ
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/Linker/dTree/img/offline.png b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/Linker/dTree/img/offline.png
deleted file mode 100644
index bb86270..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/Linker/dTree/img/offline.png
+++ /dev/null
Binary files differ
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/Linker/dTree/img/page.gif b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/Linker/dTree/img/page.gif
deleted file mode 100644
index 7c1cea6..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/Linker/dTree/img/page.gif
+++ /dev/null
Binary files differ
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/Linker/dTree/img/plus.gif b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/Linker/dTree/img/plus.gif
deleted file mode 100644
index f6c9a11..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/Linker/dTree/img/plus.gif
+++ /dev/null
Binary files differ
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/Linker/dTree/img/plusbottom.gif b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/Linker/dTree/img/plusbottom.gif
deleted file mode 100644
index c56ad93..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/Linker/dTree/img/plusbottom.gif
+++ /dev/null
Binary files differ
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/Linker/dTree/img/question.gif b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/Linker/dTree/img/question.gif
deleted file mode 100644
index 5536f00..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/Linker/dTree/img/question.gif
+++ /dev/null
Binary files differ
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/Linker/dTree/img/trash.gif b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/Linker/dTree/img/trash.gif
deleted file mode 100644
index 4d2fb72..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/Linker/dTree/img/trash.gif
+++ /dev/null
Binary files differ
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/Linker/dialog.html b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/Linker/dialog.html
deleted file mode 100644
index 4f9fbb6..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/Linker/dialog.html
+++ /dev/null
@@ -1,107 +0,0 @@
-<h1 id="[h1]"><l10n>Insert/Modify Link</l10n></h1>
-<div style="position:relative">
-<div id="[dTree]">(the dTree goes in here)</div>
-<div id="[options]" >
-  <fieldset>
-    <legend><label><input type="radio" name="[type]" id="[type_url]" value="url" checked="checked" />
-        <l10n>URL Link</l10n>
-    </label></legend>
-    <table id="[urltable]" width="100%">
-      <tr>
-        <th><label for="[href]"><l10n>URL:</l10n> </label></th>
-        <td><input type="text" name="[href]" id="[href]" style="width:100%" value="http://www.example.com/" onfocus="if (this.value == 'http://www.example.com/') this.value = '';" /></td>
-      </tr>
-      <tr>
-        <th><label for="[title]"><l10n>Title:</l10n> </label></th>
-        <td><input type="text" name="[title]" id="[title]" style="width:100%" value="_(Shows On Hover)" default_value="_(Shows On Hover)" onfocus="if (this.value == this.getAttribute('default_value')) this.value = '';" /></td>
-      </tr>
-      <tr style="vertical-align: top;" id="[target_options]">
-        <th><l10n>Target:</l10n></th>
-        <td>
-          <div id="[noTarget]"><label><input type="radio" name="[target]" id="[noTargetRadio]" value="" /> <l10n>Ordinary Link</l10n></label></div>
-          <div id="[sameWindow]"><label><input type="radio" name="[target]" id="[sameWindowRadio]" value="_top" /> <l10n>Same Window (jump out of frames)</l10n></label></div>
-          <div id="[newWindow]"><label><input type="radio" name="[target]" id="[newWindowRadio]" value="_blank" /> <l10n>New Window</l10n> </label></div>
-          <div id="[popupWindow]">
-            <label><input type="radio" name="[target]" id="[popupWindowRadio]" value="popup" /> <l10n>Popup Window</l10n> </label>
-             <div style="padding-left:10px">
-              <table id="[popuptable]">
-                <tr>
-                  <th style="text-align: left;"><l10n>Size:</l10n></th>
-                  <td colspan="3"><input type="text" name="[p_width]" size="4" />x<input type="text" name="[p_height]" size="4" /> <l10n>(px)</l10n></td>
-                </tr>
-                <tr>
-                  <th style="text-align: left;"><l10n>Name:</l10n></th>
-                  <td colspan="3"><input type="text" name="[p_name]" style="width:100%" value="_(PopupWindow)" /></td>
-                </tr>
-                <tr>
-                  <th style="text-align: left;"><l10n>Menu Bar:</l10n></th>
-                  <td><input type="checkbox" name="[p_options]" value="menubar=yes" /></td>
-
-                  <th style="text-align: left;"><l10n>Toolbar:</l10n></th>
-                  <td><input type="checkbox" name="[p_options]" value="toolbar=yes" checked="checked" /></td>
-                </tr>
-                <tr>
-                  <th style="text-align: left;"><l10n>Location Bar:</l10n></th>
-                  <td><input type="checkbox" name="[p_options]" value="location=yes" /></td>
-
-                  <th style="text-align: left;"><l10n>Status Bar:</l10n></th>
-                  <td><input type="checkbox" name="[p_options]" value="status=yes"   /></td>
-                </tr>
-                <tr>
-                  <th style="text-align: left;"><l10n>Scrollbars:</l10n></th>
-                  <td><input type="checkbox" name="[p_options]" value="scrollbars=yes" checked="checked" /></td>
-
-                  <th style="text-align: left;"><l10n>Resizeable:</l10n></th>
-                  <td><input type="checkbox" name="[p_options]" value="resizeable=yes" checked="checked" /></td>
-                </tr>
-              </table>
-            </div>
-          </div>
-        </td>
-      </tr>
-    </table>
-  </fieldset>
-  <fieldset id="[mailtofieldset]">
-    <legend><label><input type="radio" name="[type]" id="[type_mailto]" value="mailto"/>
-        <l10n>Email Link</l10n>
-    </label></legend>
-    <table id="[mailtable]" width="100%">
-      <tr>
-        <th><label for="[to]"><l10n>Email Address:</l10n> </label></th>
-        <td><input type="text" name="[to]" id="[to]" style="width:100%" value="alice@example.com" onfocus="if (this.value == 'alice@example.com') this.value = '';" /></td>
-      </tr>
-      <tr>
-        <th><label for="[subject]"><l10n>Subject:</l10n> </label></th>
-        <td><input type="text" name="[subject]" style="width:100%" value="" /></td>
-      </tr>
-      <tr>
-        <th><label for="[body]"><l10n>Message Template:</l10n> </label></th>
-        <td><textarea name="[body]" style="width:100%" rows="5"></textarea></td>
-      </tr>
-    </table>
-  </fieldset>
-
-  <fieldset id="[anchorfieldset]">
-    <legend><label><input type="radio" name="[type]" id="[type_anchor]" value="anchor"/>
-        <l10n>Anchor-Link</l10n>
-    </label></legend>
-    <table id="[anchortable]" width="100%">
-      <tr>
-        <th><label for="[anchor]"><l10n>Anchor:</l10n> </label></th>
-        <td>
-            <select name="[anchor]" id="[anchor]">
-            </select>
-        </td>
-      </tr>
-    </table>
-  </fieldset>
-
-  <div style="text-align:right">
-    <input type="button" id="[ok]"     value="_(OK)"     />
-    <input type="button" id="[clear]"  value="_(Remove Link)" />
-    <input type="button" id="[cancel]" value="_(Cancel)" />
-  </div>
-</div>
-</div>
-
-
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/Linker/lang/ch.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/Linker/lang/ch.js
deleted file mode 100644
index 4e602b5..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/Linker/lang/ch.js
+++ /dev/null
@@ -1,17 +0,0 @@
-// I18N constants
-// LANG: "ch", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Cancel": "取消",
-    "Insert/Modify Link": "插入/改寫連結",
-    "OK": "好",
-    "Target:": "目標匡:",
-    "URL:": "網址:"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/Linker/lang/cz.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/Linker/lang/cz.js
deleted file mode 100644
index 36b9929..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/Linker/lang/cz.js
+++ /dev/null
@@ -1,14 +0,0 @@
-// I18N constants
-// LANG: "cz", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Cancel": "Zrušit",
-    "OK": "OK"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/Linker/lang/da.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/Linker/lang/da.js
deleted file mode 100644
index 29e411d..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/Linker/lang/da.js
+++ /dev/null
@@ -1,20 +0,0 @@
-// I18N constants
-// LANG: "da", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Cancel": "Annuller",
-    "Insert/Modify Link": "Indsæt/rediger hyperlink",
-    "Name:": "Navn",
-    "OK": "OK",
-    "Size:": "Størrelse",
-    "Target:": "Placering:",
-    "URL:": "URL:",
-    "You must select some text before making a new link.": "Vælg venligst noget tekst før du laver et nyt link."
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/Linker/lang/de.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/Linker/lang/de.js
deleted file mode 100644
index 34a9b65..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/Linker/lang/de.js
+++ /dev/null
@@ -1,31 +0,0 @@
-// I18N constants
-// LANG: "de", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Are you sure you wish to remove this link?": "Wollen Sie diesen Link wirklich entfernen?",
-    "Cancel": "Abbrechen",
-    "Email Address:": "Email Adresse",
-    "Email Link": "Email Link",
-    "Insert/Modify Link": "Verknüpfung hinzufügen/ändern",
-    "Message Template:": "Nachrichten Vorlage:",
-    "Name:": "Name:",
-    "New Window": "Neues Fenster",
-    "OK": "OK",
-    "Ordinary Link": "Standard Link",
-    "Popup Window": "Pop-Up Fenster",
-    "Remove Link": "Link entfernen",
-    "Same Window (jump out of frames)": "Selbes Fenster (ganzer Bereich)",
-    "Size:": "Größe:",
-    "Subject:": "Betreff:",
-    "Target:": "Ziel:",
-    "URL Link": "URL Adresse",
-    "URL:": "URL:",
-    "You must select some text before making a new link.": "Sie müssen einen Text markieren um einen Link zu erstellen"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/Linker/lang/ee.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/Linker/lang/ee.js
deleted file mode 100644
index ba916e9..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/Linker/lang/ee.js
+++ /dev/null
@@ -1,14 +0,0 @@
-// I18N constants
-// LANG: "ee", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Cancel": "Loobu",
-    "OK": "OK"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/Linker/lang/el.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/Linker/lang/el.js
deleted file mode 100644
index 7952fc7..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/Linker/lang/el.js
+++ /dev/null
@@ -1,17 +0,0 @@
-// I18N constants
-// LANG: "el", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Cancel": "Ακύρωση",
-    "Insert/Modify Link": "Εισαγωγή/Τροποποίηση σύνδεσμου",
-    "OK": "Εντάξει",
-    "Target:": "Target:",
-    "URL:": "URL:"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/Linker/lang/es.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/Linker/lang/es.js
deleted file mode 100644
index 491181c..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/Linker/lang/es.js
+++ /dev/null
@@ -1,17 +0,0 @@
-// I18N constants
-// LANG: "es", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Cancel": "Cancelar",
-    "Insert/Modify Link": "Insertar/Modificar un enlace",
-    "OK": "Aceptar",
-    "Target:": "Destino:",
-    "URL:": "URL:"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/Linker/lang/eu.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/Linker/lang/eu.js
deleted file mode 100644
index 84aa300..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/Linker/lang/eu.js
+++ /dev/null
@@ -1,17 +0,0 @@
-// I18N constants
-// LANG: "eu", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Cancel": "Utzi",
-    "Insert/Modify Link": "Lotura txertatu/aldatu",
-    "OK": "Ados",
-    "Target:": "Helburua:",
-    "URL:": "URL-a:"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/Linker/lang/fa.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/Linker/lang/fa.js
deleted file mode 100644
index 637488c..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/Linker/lang/fa.js
+++ /dev/null
@@ -1,17 +0,0 @@
-// I18N constants
-// LANG: "fa", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Cancel": "انصراف",
-    "Insert/Modify Link": "افزودن / ویرایش لینک",
-    "OK": "بله",
-    "Target:": "هدف",
-    "URL:": "URL:"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/Linker/lang/fi.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/Linker/lang/fi.js
deleted file mode 100644
index 82552b9..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/Linker/lang/fi.js
+++ /dev/null
@@ -1,14 +0,0 @@
-// I18N constants
-// LANG: "fi", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Cancel": "Peruuta",
-    "OK": "Hyväksy"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/Linker/lang/fr.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/Linker/lang/fr.js
deleted file mode 100644
index da198ff..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/Linker/lang/fr.js
+++ /dev/null
@@ -1,31 +0,0 @@
-// I18N constants
-// LANG: "fr", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Are you sure you wish to remove this link?": "Confirmez-vous la suppression de ce lien ?",
-    "Cancel": "Annuler",
-    "Email Address:": "Adresse email",
-    "Email Link": "Lien email",
-    "Insert/Modify Link": "Insérer / Modifier un lien",
-    "Message Template:": "Message",
-    "Name:": "Nom",
-    "New Window": "Nouvelle fenêtre",
-    "OK": "OK",
-    "Ordinary Link": "Lien standard",
-    "Popup Window": "Fenêtre popup",
-    "Remove Link": "Supprimer",
-    "Same Window (jump out of frames)": "Même fenêtre (sort des frames)",
-    "Size:": "Taille",
-    "Subject:": "Sujet",
-    "Target:": "Cible",
-    "URL Link": "Lien URL",
-    "URL:": "URL:",
-    "You must select some text before making a new link.": "Vous devez sélectionner un texte avant de créer un nouveau lien"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/Linker/lang/he.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/Linker/lang/he.js
deleted file mode 100644
index 937b578..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/Linker/lang/he.js
+++ /dev/null
@@ -1,17 +0,0 @@
-// I18N constants
-// LANG: "he", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Cancel": "ביטול",
-    "Insert/Modify Link": "הוסף/שנה קישור",
-    "OK": "אישור",
-    "Target:": "יעד:",
-    "URL:": "URL:"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/Linker/lang/hu.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/Linker/lang/hu.js
deleted file mode 100644
index 19e4973..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/Linker/lang/hu.js
+++ /dev/null
@@ -1,17 +0,0 @@
-// I18N constants
-// LANG: "hu", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Cancel": "Mégsem",
-    "Insert/Modify Link": "Hivatkozás Beszúrása/Módosítása",
-    "OK": "Rendben",
-    "Target:": "Cél:",
-    "URL:": "URL:"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/Linker/lang/it.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/Linker/lang/it.js
deleted file mode 100644
index c525acf..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/Linker/lang/it.js
+++ /dev/null
@@ -1,17 +0,0 @@
-// I18N constants
-// LANG: "it", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Cancel": "Annullamento",
-    "Insert/Modify Link": "Inserisci/modifica link",
-    "OK": "OK",
-    "Target:": "Target:",
-    "URL:": "URL:"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/Linker/lang/ja.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/Linker/lang/ja.js
deleted file mode 100644
index 83bfc72..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/Linker/lang/ja.js
+++ /dev/null
@@ -1,37 +0,0 @@
-// I18N constants
-// LANG: "ja", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Are you sure you wish to remove this link?": "本当にこのリンクを削除しますか?",
-    "Cancel": "中止",
-    "Email Address:": "アドレス:",
-    "Email Link": "Eメールリンク",
-    "Insert/Modify Link": "リンクの挿入/修正",
-    "Location Bar:": "アドレスバー",
-    "Menu Bar:": "メニュー",
-    "Message Template:": "本文雛形:",
-    "Name:": "名前:",
-    "New Window": "新しいウィンドウ",
-    "OK": "OK",
-    "Ordinary Link": "標準リンク",
-    "Popup Window": "ポップアップウィンドウ",
-    "Remove Link": "リンク削除",
-    "Resizeable:": "リサイズ",
-    "Same Window (jump out of frames)": "同一ウィンドウ (フレーム最上位)",
-    "Scrollbars:": "スクロール",
-    "Size:": "サイズ:",
-    "Status Bar:": "ステータスバー",
-    "Subject:": "件名:",
-    "Target:": "ターゲット:",
-    "Toolbar:": "ツールバー",
-    "URL Link": "URLリンク",
-    "URL:": "URL:",
-    "You must select some text before making a new link.": "リンクを作成するにはテキストを選択する必要があります"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/Linker/lang/lc_base.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/Linker/lang/lc_base.js
deleted file mode 100644
index 8fb7317..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/Linker/lang/lc_base.js
+++ /dev/null
@@ -1,55 +0,0 @@
-// I18N constants
-//
-// LANG: "en", ENCODING: UTF-8
-// Author: Translator-Name, <email@example.com>
-//
-// Last revision: 2018-04-12
-// 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).
-//
-// (Please, remove information below)
-// 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.)
-
-{
-    "(px)": "",
-    "Anchor-Link": "",
-    "Anchor:": "",
-    "Are you sure you wish to remove this link?": "",
-    "Cancel": "",
-    "Email Address:": "",
-    "Email Link": "",
-    "Insert/Modify Link": "",
-    "Location Bar:": "",
-    "Menu Bar:": "",
-    "Message Template:": "",
-    "Name:": "",
-    "New Window": "",
-    "OK": "",
-    "Ordinary Link": "",
-    "Popup Window": "",
-    "PopupWindow": "",
-    "Remove Link": "",
-    "Resizeable:": "",
-    "Same Window (jump out of frames)": "",
-    "Scrollbars:": "",
-    "Shows On Hover": "",
-    "Size:": "",
-    "Status Bar:": "",
-    "Subject:": "",
-    "Target:": "",
-    "Title:": "",
-    "Toolbar:": "",
-    "URL Link": "",
-    "URL:": "",
-    "You must select some text before making a new link.": ""
-}
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/Linker/lang/lt.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/Linker/lang/lt.js
deleted file mode 100644
index 3ab146b..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/Linker/lang/lt.js
+++ /dev/null
@@ -1,17 +0,0 @@
-// I18N constants
-// LANG: "lt", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Cancel": "Atšaukti",
-    "Insert/Modify Link": "Idėti/Modifikuoti",
-    "OK": "OK",
-    "Target:": "Target:",
-    "URL:": "URL:"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/Linker/lang/lv.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/Linker/lang/lv.js
deleted file mode 100644
index f83d5d3..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/Linker/lang/lv.js
+++ /dev/null
@@ -1,14 +0,0 @@
-// I18N constants
-// LANG: "lv", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Cancel": "Atcelt",
-    "OK": "Labi"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/Linker/lang/nb.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/Linker/lang/nb.js
deleted file mode 100644
index 8a7fc0f..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/Linker/lang/nb.js
+++ /dev/null
@@ -1,21 +0,0 @@
-// I18N constants
-// LANG: "nb", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Are you sure you wish to remove this link?": "Er du sikker på at du vil fjerne lenken?",
-    "Cancel": "Avbryt",
-    "Insert/Modify Link": "Rediger lenke",
-    "Name:": "Navn",
-    "OK": "OK",
-    "Size:": "Størrelse",
-    "Target:": "Mål:",
-    "URL:": "Adresse:",
-    "You must select some text before making a new link.": "Du må markere tekst eller et bilde før du kan lage en lenke."
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/Linker/lang/nl.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/Linker/lang/nl.js
deleted file mode 100644
index 68b8f82..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/Linker/lang/nl.js
+++ /dev/null
@@ -1,21 +0,0 @@
-// I18N constants
-// LANG: "nl", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Are you sure you wish to remove this link?": "Wilt u deze link werkelijk verwijderen?",
-    "Cancel": "Annuleren",
-    "Insert/Modify Link": "Hyperlink invoegen/aanpassen",
-    "Name:": "Naame",
-    "OK": "OK",
-    "Size:": "Grootte:",
-    "Target:": "Doel:",
-    "URL:": "URL:",
-    "You must select some text before making a new link.": "Selecteer de tekst welke gelinkt moet worden."
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/Linker/lang/pl.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/Linker/lang/pl.js
deleted file mode 100644
index 57bfdab..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/Linker/lang/pl.js
+++ /dev/null
@@ -1,31 +0,0 @@
-// I18N constants
-// LANG: "pl", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Are you sure you wish to remove this link?": "Na pewno chcesz usunąć odnośnik?",
-    "Cancel": "Anuluj",
-    "Email Address:": "Adres e-mail",
-    "Email Link": "Link do e-maila",
-    "Insert/Modify Link": "Wstaw/edytuj odnośnik",
-    "Message Template:": "Szablon wiadmości:",
-    "Name:": "Nazwa:",
-    "New Window": "Nowe okno",
-    "OK": "OK",
-    "Ordinary Link": "Zwykły odnośnik",
-    "Popup Window": "Okienko pop-up",
-    "Remove Link": "USUŃ ODNOŚNIK",
-    "Same Window (jump out of frames)": "To samo okno (wyskocz z ramek)",
-    "Size:": "Rozmiar:",
-    "Subject:": "Temat:",
-    "Target:": "Okno docelowe:",
-    "URL Link": "Adres URL",
-    "URL:": "URL:",
-    "You must select some text before making a new link.": "Zaznacz tekst przed dodaniem odnośnika."
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/Linker/lang/pt_br.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/Linker/lang/pt_br.js
deleted file mode 100644
index c3dc5ba..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/Linker/lang/pt_br.js
+++ /dev/null
@@ -1,39 +0,0 @@
-// I18N constants
-// LANG: "pt_br", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Anchor-Link": "Link-Âncora",
-    "Anchor:": "Âncora:",
-    "Are you sure you wish to remove this link?": "Você tem certeza que deseja remover este link?",
-    "Cancel": "Cancelar",
-    "Email Address:": "Endereço de E-mail:",
-    "Email Link": "Link de E-mail",
-    "Insert/Modify Link": "Inserir/Modificar Link",
-    "Location Bar:": "Barra de Localização:",
-    "Menu Bar:": "Barra de Menu:",
-    "Message Template:": "Modelo de Mensagem:",
-    "Name:": "Nome:",
-    "New Window": "Nova Janela",
-    "OK": "OK",
-    "Ordinary Link": "Link Comum",
-    "Popup Window": "Janela Pop-up",
-    "Remove Link": "Remover Link",
-    "Resizeable:": "Redimensionável",
-    "Same Window (jump out of frames)": "Mesma Janela (Sair fora dos frames)",
-    "Scrollbars:": "Barra de Rolagem:",
-    "Size:": "Tamanho:",
-    "Status Bar:": "Barra de Informações:",
-    "Subject:": "Assunto:",
-    "Target:": "Destino:",
-    "Toolbar:": "Barra de Ferramentas:",
-    "URL Link": "URL do Link",
-    "URL:": "URL:",
-    "You must select some text before making a new link.": "Você precisa selecionar algum texto antes de criar um novo link."
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/Linker/lang/ro.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/Linker/lang/ro.js
deleted file mode 100644
index c382a67..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/Linker/lang/ro.js
+++ /dev/null
@@ -1,17 +0,0 @@
-// I18N constants
-// LANG: "ro", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Cancel": "Renunţă",
-    "Insert/Modify Link": "Inserează/modifcă link",
-    "OK": "Acceptă",
-    "Target:": "Ţinta:",
-    "URL:": "URL:"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/Linker/lang/ru.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/Linker/lang/ru.js
deleted file mode 100644
index 1f883ae..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/Linker/lang/ru.js
+++ /dev/null
@@ -1,17 +0,0 @@
-// I18N constants
-// LANG: "ru", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Cancel": "Отмена",
-    "Insert/Modify Link": "Вставка/изменение ссылки",
-    "OK": "OK",
-    "Target:": "Открывать в окне:",
-    "URL:": "URL:"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/Linker/lang/sh.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/Linker/lang/sh.js
deleted file mode 100644
index b25d322..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/Linker/lang/sh.js
+++ /dev/null
@@ -1,17 +0,0 @@
-// I18N constants
-// LANG: "sh", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Cancel": "Poništi",
-    "Insert/Modify Link": "Dodaj/promeni Link",
-    "OK": "OK",
-    "Target:": "Otvori u:",
-    "URL:": "URL:"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/Linker/lang/si.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/Linker/lang/si.js
deleted file mode 100644
index 7674892..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/Linker/lang/si.js
+++ /dev/null
@@ -1,14 +0,0 @@
-// I18N constants
-// LANG: "si", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Cancel": "Prekliči",
-    "OK": "V redu"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/Linker/lang/sr.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/Linker/lang/sr.js
deleted file mode 100644
index 1d660bb..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/Linker/lang/sr.js
+++ /dev/null
@@ -1,17 +0,0 @@
-// I18N constants
-// LANG: "sr", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Cancel": "Поништи",
-    "Insert/Modify Link": "додај/промени линк",
-    "OK": "OK",
-    "Target:": "Отвори у:",
-    "URL:": "УРЛ:"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/Linker/lang/sv.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/Linker/lang/sv.js
deleted file mode 100644
index 8313e69..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/Linker/lang/sv.js
+++ /dev/null
@@ -1,18 +0,0 @@
-// I18N constants
-// LANG: "sv", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Cancel": "Avbryt",
-    "Insert/Modify Link": "Redigera länk",
-    "OK": "OK",
-    "Size:": "Storlek",
-    "Target:": "Mål:",
-    "URL:": "Sökväg:"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/Linker/lang/th.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/Linker/lang/th.js
deleted file mode 100644
index 9da9c8d..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/Linker/lang/th.js
+++ /dev/null
@@ -1,14 +0,0 @@
-// I18N constants
-// LANG: "th", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Cancel": "ยกเลิก",
-    "OK": "ตกลง"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/Linker/lang/tr.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/Linker/lang/tr.js
deleted file mode 100644
index 32c2fd2..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/Linker/lang/tr.js
+++ /dev/null
@@ -1,17 +0,0 @@
-// I18N constants
-// LANG: "tr", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Cancel": "İptal",
-    "Insert/Modify Link": "Bağlantı ekle/değiştir",
-    "OK": "Tamam",
-    "Target:": "Hedef:",
-    "URL:": "URL:"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/Linker/lang/vn.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/Linker/lang/vn.js
deleted file mode 100644
index 5908be3..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/Linker/lang/vn.js
+++ /dev/null
@@ -1,17 +0,0 @@
-// I18N constants
-// LANG: "vn", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Cancel": "Hủy",
-    "Insert/Modify Link": "Thêm/Chỉnh sửa đường dẫn",
-    "OK": "Đồng ý",
-    "Target:": "Nơi hiện thị:",
-    "URL:": "URL:"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/Linker/link-picker.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/Linker/link-picker.js
deleted file mode 100644
index 442bd1f..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/Linker/link-picker.js
+++ /dev/null
@@ -1,138 +0,0 @@
-
-  /*--------------------------------------:noTabs=true:tabSize=2:indentSize=2:--
-    --  Xinha (is not htmlArea) - http://xinha.gogo.co.nz/
-    --
-    --  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.
-    --
-    --  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.
-    --
-    --  $HeadURL: http://svn.xinha.webfactional.com/trunk/modules/Dialogs/inline-dialog.js $
-    --  $LastChangedDate: 2007-01-24 03:26:04 +1300 (Wed, 24 Jan 2007) $
-    --  $LastChangedRevision: 694 $
-    --  $LastChangedBy: gogo $
-    --------------------------------------------------------------------------*/
- 
-    
-/** The Link Picker is a semi-standalone instance of the Linker plugin which can be used
- *  for providing a Linker style browse dialog for selecting urls which are then 
- *  returned into a standard form field.
- *
- *  Usage: 
- *  --------------------------------------------------------------------------
- *  {{{
- 
-    <!-- If you are already using Xinha on the page you should already have this stuff... -->
-    <script language="javascript">
-      _editor_url = '/url/to/xinha';
-      _editor_lang = "en"; 
-    </script>
-    <script type="text/javascript" src="/url/to/xinha/XinhaCore.js"></script>    
-    
-    <!-- There are four files required for link picker, in this order. -->
-    <script type="text/javascript" src="/url/to/xinha/modules/Dialog/XinhaDialog.js"></script>        
-    <script type="text/javascript" src="/url/to/xinha/modules/Dialog/DetachedDialog.js"></script>
-    <script type="text/javascript" src="/url/to/xinha/plugins/Linker/Linker.js"></script>
-    <script type="text/javascript" src="/url/to/xinha/plugins/Linker/link-picker.js"></script>
-    
-    <script language="javascript">
-      with(LinkPicker.Config.prototype)
-      {
-         <?php
-          // See Linker for more possible config items
-          $myConfig = array
-            (
-              'dir'        => '/path/to/base' , 
-              'url'        => '/url/to/base' ,              
-            );
-           xinha_pass_to_php_backend($myConfig);
-          ?>
-      }
-    
-      Xinha._addEvent(window, 'load', function()
-        { 
-          new LinkPicker(
-           document.getElementById('url'),  // this is the field that you want to pick links for, it gets a Browse button
-           new LinkPicker.Config()          
-          );
-        });
-    </script>
-    
-    <form>
-      <input type="text" id="url" />
-      <div id="dialogHere" style="width:640px; height:480px;"></div>
-    </form>
-    
- *  }}}
- *   
- */
- 
-function LinkPicker(field, config)
-{
-  this.field = field;
-  
-  var linkPicker = this;
-  
-  // We use a tempoary anchor tag to pass to the Linker plugin
-  this.tmpAnchor = document.createElement('a');  
-  
-  // We will use the detached dialog always
-  config.dialog = LinkPicker.Dialog;
-  config.canSetTarget = false; 
-  config.canRemoveLink = false;
-  
-  // These methods are dummy versions of stuff that would normally be in a Xinha object
-  this.selectionEmpty = function() { return true; };
-  this.getSelection   = function() { return null; };  
-  this.selectNodeContents = function() { return true; };  
-  this.getHTML = function() { return ''; }
-  this.disableToolbar = function() { return true; }
-  this.enableToolbar  = function() { return true; }
-  this._doc = {
-    execCommand: function() { return false; },
-    getElementsByTagName: function() { return [ ]; }
-  }  
-  this.config = { 
-    Linker: config, 
-    btnList: { }, 
-    registerButton: function() { return true; }, 
-    addToolbarElement: function() { }
-  }
-  
-  // Add a button next to the field
-  var button = document.createElement('input'); button.type='button';
-  button.value = 'Browse';
-  button.onclick = function() { linkPicker.editLink(); return false; } 
-  field.parentNode.insertBefore(button,field.nextSibling);  
-    
-  // We co-opt updateToolbar as the point at which we copy the temporary anchor across to the field
-  // Linker calls this as the last step, so perfect.
-  this.updateToolbar  = function() { linkPicker.field.value = this.fixRelativeLinks(linkPicker.tmpAnchor.href); };
-    
-  this.linker = new Linker(this);  
-  this.linker.onGenerateOnce();
-}
-
-LinkPicker.prototype.editLink = function()
-{
-  this.tmpAnchor.href = this.field.value;
-  this.linker._createLink(this.tmpAnchor);
-}
-
-LinkPicker.prototype.fixRelativeLinks = function(href) 
-{  
-  return href.replace(document.location.href.replace( /^(https?:\/\/[^\/]*)(.*)$/i, '$1' ), '');
-}
-
-LinkPicker.Dialog = function(linkPicker, html, localizer, size, options) 
-{ 
-  LinkPicker.Dialog.parentConstructor.call(this, html, localizer, size, options); 
-}
-
-Xinha.extend(LinkPicker.Dialog, Xinha.DetachedDialog);
-
-LinkPicker.Config = function() { }
-LinkPicker.Config.prototype = Xinha.Config.prototype.Linker;
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/Linker/pluginMethods.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/Linker/pluginMethods.js
deleted file mode 100644
index a1eb549..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/Linker/pluginMethods.js
+++ /dev/null
@@ -1,642 +0,0 @@
-Linker.prototype._createLink = function(a)
-{
-  if (!this._dialog)
-  {
-    this._dialog = new Linker.Dialog(this);
-  }
-  
-  if(!a && this.editor.selectionEmpty(this.editor.getSelection()))
-  {       
-    alert(this._lc("You must select some text before making a new link."));
-    return false;
-  }
-
-  var inputs =
-  {
-    type:     'url',
-    href:     'http://www.example.com/',
-    title:    this._lc('Shows On Hover'),
-    target:   '',
-    p_width:  '',
-    p_height: '',
-    p_options: ['menubar=no','toolbar=yes','location=no','status=no','scrollbars=yes','resizeable=yes'],
-    to:       'alice@example.com',
-    subject:  '',
-    body:     '',
-    anchor:   ''
-  };
-  
-  if(a && a.tagName.toLowerCase() == 'a')
-  {
-    var href =this.editor.fixRelativeLinks(a.getAttribute('href'));
-    var m = href.match(/^mailto:(.*@[^?&]*)(\?(.*))?$/);
-    var anchor = href.match(/^#(.*)$/);
-    var title = a.getAttribute('title');
-    
-    if(m)
-    {
-      // Mailto
-      inputs.type = 'mailto';
-      inputs.to = m[1];
-      if(m[3])
-      {
-        var args  = m[3].split('&');
-        for(var x = 0; x<args.length; x++)
-        {
-          var j = args[x].match(/(subject|body)=(.*)/);
-          if(j)
-          {
-            inputs[j[1]] = decodeURIComponent(j[2]);
-          }
-        }
-      }
-    }
-    else if (anchor)
-    {
-      //Anchor-Link
-      inputs.type = 'anchor';
-      inputs.anchor = anchor[1];
-      
-    }
-    else
-    {
-      if(a.getAttribute('onclick') && String(a.getAttribute('onclick')).length)
-      {
-        var m = a.getAttribute('onclick').match(/window\.open\(\s*this\.href\s*,\s*'([a-z0-9_]*)'\s*,\s*'([a-z0-9_=,]*)'\s*\)/i);
-
-        // Popup Window
-        inputs.href   = href ? href : '';
-        inputs.title = title;
-        inputs.target = 'popup';
-        inputs.p_name = m[1];
-        inputs.p_options = [ ];
-
-
-        var args = m[2].split(',');
-        for(var x = 0; x < args.length; x++)
-        {
-          var i = args[x].match(/(width|height)=([0-9]+)/);
-          if(i)
-          {
-            inputs['p_' + i[1]] = parseInt(i[2]);
-          }
-          else
-          {
-            inputs.p_options.push(args[x]);
-          }
-        }
-      }
-      else
-      {
-        // Normal
-        inputs.href   = href;
-        inputs.target = a.target;
-        inputs.title = title;
-      }
-    }
-  }
-
-  var linker = this;
-
-  // If we are not editing a link, then we need to insert links now using execCommand
-  // because for some reason IE is losing the selection between now and when doOK is
-  // complete.  I guess because we are defocusing the iframe when we click stuff in the
-  // linker dialog.
-
-  this.a = a; // Why doesn't a get into the closure below, but if I set it as a property then it's fine?
-
-  var doOK = function()
-  {
-    //if(linker.a) alert(linker.a.tagName);
-    var a = linker.a;
-
-    var values = linker._dialog.hide();
-    var atr =
-    {
-      href: '',
-      target:'',
-      title:'',
-      onclick:''
-    };
-    
-    if(values.title == linker._lc('Shows On Hover')) 
-    {
-      values.title = '';
-    }
-    
-    if(values.type == 'url')
-    {
-     if(values.href)
-     {
-       atr.href = values.href.trim();
-       atr.target = values.target;
-       atr.title = values.title;
-       if(values.target == 'popup')
-       {
-
-         if(values.p_width)
-         {
-           values.p_options.push('width=' + values.p_width);
-         }
-         if(values.p_height)
-         {
-           values.p_options.push('height=' + values.p_height);
-         }
-         atr.onclick = 'if(window.parent && window.parent.Xinha){return false}window.open(this.href, \'' + (values.p_name.replace(/[^a-z0-9_]/i, '_')) + '\', \'' + values.p_options.join(',') + '\');return false;';
-       }
-     }
-    }
-    else if(values.type == 'anchor')
-    {
-      if(values.anchor)
-      {
-        atr.href = values.anchor.value;
-      }
-    }
-    else
-    {
-      if(values.to)
-      {
-        atr.href = 'mailto:' + values.to;
-        if(values.subject) atr.href += '?subject=' + encodeURIComponent(values.subject);
-        if(values.body)    atr.href += (values.subject ? '&' : '?') + 'body=' + encodeURIComponent(values.body);
-      }
-    }
-
-    if (atr.href) atr.href = atr.href.trim();
-
-    if(a && a.tagName.toLowerCase() == 'a')
-    {
-      if(!atr.href)
-      {
-        if(confirm(linker._dialog._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);
-          linker.editor.updateToolbar();
-          return;
-        }
-      }
-      else
-      {
-        // Update the link
-        for(var i in atr)
-        {
-          if(String(atr[i]).length > 0)
-          {
-            a.setAttribute(i, atr[i]);
-          }
-          else
-          {
-            a.removeAttribute(i);
-          }
-        }
-        
-        // If we change a mailto link in IE for some hitherto unknown
-        // reason it sets the innerHTML of the link to be the 
-        // href of the link.  Stupid IE.
-        if(Xinha.is_ie)
-        {
-          if(/mailto:([^?<>]*)(\?[^<]*)?$/i.test(a.innerHTML))
-          {
-            a.innerHTML = RegExp.$1;
-          }
-        }
-      }
-    }
-    else
-    {
-      if(!atr.href) return true;
-
-      // Insert a link, we let the browser do this, we figure it knows best
-      var tmp = Xinha.uniq('http://www.example.com/Link');
-      linker.editor._doc.execCommand('createlink', false, tmp);
-
-      // Fix them up
-      var anchors = linker.editor._doc.getElementsByTagName('a');
-      for(var i = 0; i < anchors.length; i++)
-      {
-        var anchor = anchors[i];
-        if(anchor.href == tmp)
-        {
-          // Found one.
-          if (!a) a = anchor;
-          for(var j in atr)
-          {
-            if(String(atr[j]).length > 0)
-              anchor.setAttribute(j, atr[j]);
-          }
-        }
-      }
-    }
-    linker.editor.selectNodeContents(a);
-    linker.editor.updateToolbar();
-  };
-
-  this._dialog.show(inputs, doOK);
-
-};
-
-Linker.prototype._getSelectedAnchor = function()
-{
-  var sel  = this.editor.getSelection();
-  var rng  = this.editor.createRange(sel);
-  var a    = this.editor.activeElement(sel);
-  if(a != null && a.tagName.toLowerCase() == 'a')
-  {
-    return a;
-  }
-  else
-  {
-    a = this.editor._getFirstAncestor(sel, 'a');
-    if(a != null)
-    {
-      return a;
-    }
-  }
-  return null;
-};
-
-Linker.Dialog_dTrees = [ ];
-
-Linker.Dialog = function (linker)
-{
-  var  lDialog = this;
-  this.Dialog_nxtid = 0;
-  this.linker = linker;
-  this.id = { }; // This will be filled below with a replace, nifty
-
-  this.ready = false;
-
-  this.dialog = false;
-
-  // load the dTree script
-  this._prepareDialog();
-
-};
-
-Linker.Dialog.prototype._prepareDialog = function()
-{
-  var lDialog = this;
-  var linker = this.linker;
-
-  var files = this.linker.files;
-
-  // Now we have everything we need, so we can build the dialog.
-  if(!linker.lConfig.dialog && Xinha.Dialog) linker.lConfig.dialog = Xinha.Dialog;
-  
-  var dialog = this.dialog = new linker.lConfig.dialog(linker.editor, Linker.html, 'Linker',{width:600,height:400});
-  var dTreeName = Xinha.uniq('dTree_');
-
-  this.dTree = new dTree(dTreeName, Xinha.getPluginDir("Linker") + '/dTree/');
-  eval(dTreeName + ' = this.dTree');
-
-  this.dTree.add(this.Dialog_nxtid++, -1, linker.lConfig.treeCaption , null, linker.lConfig.treeCaption);
-  this.makeNodes(files, 0);
-
-  // Put it in
-  var ddTree = this.dialog.getElementById('dTree');
-  //ddTree.innerHTML = this.dTree.toString();
-  ddTree.innerHTML = '';
-//  ddTree.style.position = 'absolute';
-//  ddTree.style.left = 1 + 'px';
- // ddTree.style.top =  0 + 'px';
-  ddTree.style.overflow = 'auto';
-  ddTree.style.height = '300px';
-  if ( Xinha.is_ie )
-  {
-    ddTree.style.styleFloat = "left";
-  }
-  else
-  {
-    ddTree.style.cssFloat = "left";
-  }
-  ddTree.style.backgroundColor = 'white';
-  this.ddTree = ddTree;
-  
-  this.dTree._linker_premade = this.dTree.toString();
-
-  var options = this.dialog.getElementById('options');
-  //options.style.position = 'absolute';
-  //options.style.top      = 0   + 'px';
-  //options.style.right    = 0   + 'px';
-  options.style.width    = 320 + 'px';
-  options.style.overflow = 'auto';
-
-  // Hookup the resizer
-  this.dialog.rootElem.style.paddingBottom ="0";
-  this.dialog.onresize = function()
-    {
-      var h = parseInt(dialog.height) - dialog.getElementById('h1').offsetHeight;
-      var w = parseInt(dialog.width)  - 330 ;
-
-      // An error is thrown with IE when trying to set a negative width or a negative height
-      // But perhaps a width / height of 0 is not the minimum required we need to set
-      if (w<0) w = 0;
-      if (h<0) h = 0;
-      //options.style.height =
-      lDialog.ddTree.style.height = h + 'px';
-      lDialog.ddTree.style.width  = w + 'px';
-    }
-
-  // Set the onclick handlers for the link type radio buttons
-  var self = this;
-  this.dialog.getElementById('type_url').onclick = function() {
-    self.showOptionsForType('url');
-  };
-  this.dialog.getElementById('type_mailto').onclick = function() {
-    self.showOptionsForType('mailto');
-  };
-  this.dialog.getElementById('type_anchor').onclick = function() {
-    self.showOptionsForType('anchor');
-  };
-
-  var hidePopupOptions = function() {
-    self.showOptionsForTarget('none')
-  };
-  this.dialog.getElementById('noTargetRadio').onclick = hidePopupOptions;
-  this.dialog.getElementById('sameWindowRadio').onclick = hidePopupOptions;
-  this.dialog.getElementById('newWindowRadio').onclick = hidePopupOptions;
-  this.dialog.getElementById('popupWindowRadio').onclick = function() {
-    self.showOptionsForTarget('popup');
-  };
-
-  this.ready = true;
-  ddTree = null;
-  Xinha.freeLater(lDialog, 'ddTree');
-  options = null;
-};
-
-Linker.Dialog.prototype.makeNodes = function(files, parent)
-{ 
-  for(var i = 0; i < files.length; i++)
-  {
-    if(typeof files[i] == 'string')
-    {
-      this.dTree.add(this.Dialog_nxtid++, parent,
-                     files[i].replace(/^.*\//, ''),
-                     'javascript:document.getElementsByName(\'' + this.dialog.id.href + '\')[0].value=decodeURIComponent(\'' + encodeURIComponent(files[i]) + '\');document.getElementsByName(\'' + this.dialog.id.type + '\')[0].click();document.getElementsByName(\'' + this.dialog.id.href + '\')[0].focus();void(0);',
-                     files[i]);
-    }
-    else if(typeof files[i]=="object" && files[i] && typeof files[i].length==="number") // there seems to be a strange bug in IE that requires this complicated check, see #1197
-    {
-      var id = this.Dialog_nxtid++;
-      this.dTree.add(id, parent, files[i][0].replace(/^.*\//, ''), null, files[i][0]);
-      this.makeNodes(files[i][1], id);
-    }
-    else if(typeof files[i] == 'object')
-    {
-      var id = this.Dialog_nxtid++;     
-      if(files[i].title) var title = files[i].title;
-      else if(files[i].url) var title = files[i].url.replace(/^.*\//, '');
-      else var title = "no title defined";
-      if(files[i].url) var link = 'javascript:document.getElementsByName(\'' + this.dialog.id.href + '\')[0].value=decodeURIComponent(\'' + encodeURIComponent(files[i].url) + '\');document.getElementsByName(\'' + this.dialog.id.type + '\')[0].click();document.getElementsByName(\'' + this.dialog.id.href + '\')[0].focus();void(0);';
-      else var link = '';
-      
-      this.dTree.add(id, parent, title, link, title);
-      if(files[i].children) {
-        this.makeNodes(files[i].children, id);
-      }
-    }
-  }
-};
-
-Linker.Dialog.prototype._lc = Linker.prototype._lc;
-
-Linker.Dialog.prototype.show = function(inputs, ok, cancel)
-{
-  if(!this.ready)
-  {
-    var lDialog = this;
-    window.setTimeout(function() {lDialog.show(inputs,ok,cancel);},100);
-    return;
-  }
-
-  if(this.ddTree.innerHTML == '')
-  {
-    this.ddTree.innerHTML = this.dTree._linker_premade;
-  }
-  
-  if(!this.linker.lConfig.canSetTarget)
-  {
-    this.dialog.getElementById('target_options').style.display = 'none';    
-  }
-  
-  this.showOptionsForType(inputs.type);
-  this.showOptionsForTarget(inputs.target);
-  
-  var anchor = this.dialog.getElementById('anchor');
-  for(var i=anchor.length;i>=0;i--) {
-    anchor[i] = null;
-  }
-
-  var html = this.linker.editor.getHTML();  
-  var anchors = new Array();
-
-  var m = html.match(/<a[^>]+name="([^"]+)"/gi);
-  if(m)
-  {
-    for(i=0;i<m.length;i++)
-    {
-        var n = m[i].match(/name="([^"]+)"/i);
-        if(!anchors.contains(n[1])) anchors.push(n[1]);
-    }
-  }
-  m = html.match(/id="([^"]+)"/gi);
-  if(m)
-  {
-    for(i=0;i<m.length;i++)
-    {
-        n = m[i].match(/id="([^"]+)"/i);
-        if(!anchors.contains(n[1])) anchors.push(n[1]);
-    }
-  }
-  
-  for(i=0;i<anchors.length;i++)
-  {
-    var opt = new Option(anchors[i],'#'+anchors[i],false,(inputs.anchor == anchors[i]));
-    anchor[anchor.length] = opt;
-  }
-
-  // Configuration for disabling the mail link functionality.
-  if(this.linker.lConfig.disableMailto)
-  {
-    this.dialog.getElementById('mailtofieldset').style.display = "none";
-  }
-
-  // Configuration for hiding the anchor functionality.  Also, no need to show
-  // the UI if there are no anchors present in the document.
-  if(anchor.length==0 || this.linker.lConfig.disableAnchors)
-  {
-    this.dialog.getElementById('anchorfieldset').style.display = "none";
-
-    // If we disable the other two fieldsets, we'll hide the (now) unnecessary
-    // radio button.
-    if (this.linker.lConfig.disableMailto)
-    {
-      this.dialog.getElementById('type').style.display = "none";
-    }
-  }
-
-  // Disable link targets (all targets available by default)
-  var disabledTargets = this.linker.lConfig.disableTargetTypes; 
-  if (typeof disabledTargets == 'undefined')
-  {
-    disabledTargets = [];
-  } 
-  else if (typeof disabledTargets == 'string')
-  {
-    disabledTargets = [disabledTargets];
-  }
-  for (var i=0; i<disabledTargets.length; i++)
-  {
-    this.dialog.getElementById(disabledTargets[i]).style.display = "none";
-  }
-  if (disabledTargets.length == 3) // only one target option is visible
-  {
-    if (disabledTargets.contains('popupWindow'))
-    {
-      // There's no need to show anything, so hide the entire div
-      this.dialog.getElementById('target_options').style.display = "none";
-    }
-    else
-    {
-      // Only popups are allowed, hide the radio button
-      this.dialog.getElementById('popupWindowRadio').style.display = "none";
-      this.showOptionsForTarget('popup');
-    }
-  }
-
-  var enabledTargets = new Array();
-  if (!disabledTargets.contains('noTarget'))
-  {
-    enabledTargets.push('noTargetRadio');
-  }
-  if (!disabledTargets.contains('sameWindow'))
-  {
-    enabledTargets.push('sameWindowRadio');
-  }
-  if (!disabledTargets.contains('newWindow'))
-  {
-    enabledTargets.push('newWindowRadio');
-  }
-  if (!disabledTargets.contains('popupWindow'))
-  {
-    enabledTargets.push('popupWindowRadio');
-  }
-
-  // if we're not editing an existing link, hide the remove link button
-  if (inputs.href == 'http://www.example.com/' && inputs.to == 'alice@example.com') { 
-    this.dialog.getElementById('clear').style.display = "none";
-  }
-  else { // 
-    var clearBtn = this.dialog.getElementById('clear');
-    clearBtn.style.display = "";
-    if (ok)
-    {
-      clearBtn.onclick = function() { lDialog.removeLink(ok); };
-    }
-  }
-  
-  // It could be forced not be able to be removed, as is the case with link-picker.js
-  if(!this.linker.lConfig.canRemoveLink)
-  {
-    this.dialog.getElementById('clear').style.display = 'none';
-  }
-  
-  // Connect the OK and Cancel buttons
-  var dialog = this.dialog;
-  var lDialog = this;
-  if(ok)
-  {
-    this.dialog.getElementById('ok').onclick = ok;
-  }
-  else
-  {
-    this.dialog.getElementById('ok').onclick = function() {lDialog.hide();};
-  }
-
-  if(cancel)
-  {
-    this.dialog.getElementById('cancel').onclick = cancel;
-  }
-  else
-  {
-    this.dialog.getElementById('cancel').onclick = function() { lDialog.hide()};
-  }
-
-  // Show the dialog
-  this.linker.editor.disableToolbar(['fullscreen','linker']);
-
-  this.dialog.show(inputs);
-
-  // If we set the default radio button *before* we call dialog.show()
-  // it doesn' work...
-  var targetSelected = false;
-  for (var i=0; i<enabledTargets.length; i++)
-  {
-    if (this.dialog.getElementById(enabledTargets[i]).checked == true)
-    {
-      targetSelected = true;
-      break;
-    }
-  }
-  // If no target is selected, select the first one by default
-  if (!targetSelected && enabledTargets.length > 0)
-  {
-    this.dialog.getElementById(enabledTargets[0]).checked = true;
-  }
-
-  // Init the sizes
-  this.dialog.onresize();
-};
-
-Linker.Dialog.prototype.hide = function()
-{
-  this.linker.editor.enableToolbar();
-  return this.dialog.hide();
-};
-
-Linker.Dialog.prototype.removeLink = function(applyFunc)
-{
-  this.dialog.getElementById('href').value = "";
-  this.dialog.getElementById('to').value = "";
-
-  return applyFunc();
-};
-
-Linker.Dialog.prototype.showOptionsForType = function(type)
-{
-  var urlOptions = this.dialog.getElementById('urltable');
-  var mailtoOptions = this.dialog.getElementById('mailtable');
-  var anchorOptions = this.dialog.getElementById('anchortable');
-
-  if (type == 'anchor')
-  {
-    anchorOptions.style.display = '';
-    urlOptions.style.display = 'none';
-    mailtoOptions.style.display = 'none';
-  }
-  else if (type == 'mailto')
-  {
-    mailtoOptions.style.display = '';
-    urlOptions.style.display = 'none';
-    anchorOptions.style.display = 'none';
-  }
-  else 
-  {
-    urlOptions.style.display = '';
-    mailtoOptions.style.display = 'none';
-    anchorOptions.style.display = 'none';
-  }
-};
-
-Linker.Dialog.prototype.showOptionsForTarget = function(target)
-{
-  var popupOptions = this.dialog.getElementById('popuptable');
-  popupOptions.style.display = target == 'popup' ? '' : 'none';
-};
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/Linker/scan.php b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/Linker/scan.php
deleted file mode 100644
index 891b008..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/Linker/scan.php
+++ /dev/null
@@ -1,114 +0,0 @@
-<?php
-    // /home/username/foo/public_html/bar
-    $dir          = dirname(__FILE__)."/../..";
-    
-    // http://example.com/bar (or relative url, or semi absolute)
-    $url       = '';
-    
-    $include      = '/\.(php|shtml|html|htm|shtm|cgi|txt|doc|pdf|rtf|xls|csv)$/';
-    $exclude      = '';
-    $dirinclude   = '';
-    $direxclude   = '/(^|\/)[._]|htmlarea/'; // Exclude the htmlarea tree by default
-
-    // New backend config data passing
-    //  if data was passed using xinha_pass_to_backend() we extract and use it
-    //  as the items above    
-    require_once(realpath(dirname(__FILE__) . '/../../contrib/php-xinha.php'));
-    if($passed_data = xinha_read_passed_data())
-    {
-      extract($passed_data);      
-    }
-
-    // Old deprecated backend config data passing
-    //  not described because you shouldn't use it.
-    //------------------------------------------------------------------------    
-    $hash = '';
-    foreach(explode(',', 'dir,include,exclude,dirinclude,direxclude') as $k)
-    {
-      if(isset($_REQUEST[$k]))
-      {
-        if(get_magic_quotes_gpc())
-        {
-          $_REQUEST[$k] = stripslashes($_REQUEST[$k]);
-        }
-        $hash .= $k . '=' . $_REQUEST[$k];
-        $$k = $_REQUEST[$k];
-      }
-    }
-
-    if($hash)
-    {
-      session_start();
-      if(!isset($_SESSION[sha1($hash)]))
-      {
-        ?>
-        [ ];
-        <?php
-        exit;
-      }
-    }
-    //------------------------------------------------------------------------
-
-    // Neither dir nor url should have trailing slash
-    $dir = preg_replace('/\/$/', '', $dir);
-    $url = preg_replace('/\/$/', '', $url);
-    
-    function scan($dir, $durl = '')
-    {
-      global $include, $exclude, $dirinclude, $direxclude;
-      static $seen = array();
-
-      $files = array();
-
-      $dir = realpath($dir);
-      if(isset($seen[$dir]))
-      {
-        return $files;
-      }
-      $seen[$dir] = TRUE;
-      $dh = @opendir($dir);
-
-
-      while($dh && ($file = readdir($dh)))
-      {
-        if($file[0] !== '.')
-        {
-          $path = realpath($dir . '/' . $file);
-          $url  = $durl . '/' . $file;
-
-          if(($dirinclude && !preg_match($dirinclude, $url)) || ($direxclude && preg_match($direxclude, $url))) continue;
-          if(is_dir($path))
-          {
-            if($subdir = scan($path, $url))
-            {
-              $files[] = array('url'=>$url, 'children'=>$subdir);
-            }
-          }
-          elseif(is_file($path))
-          {
-            if(($include && !preg_match($include, $url)) || ($exclude && preg_match($exclude, $url))) continue;
-            $files[] = array('url'=>$url);
-          }
-
-        }
-      }
-      @closedir($dh);
-      return dirsort($files);
-    }
-
-    function dirsort($files)
-    {
-      usort($files, 'dircomp');
-      return $files;
-    }
-
-    function dircomp($a, $b)
-    {
-      if(isset($a['children']) && !isset($b['children'])) return -1;
-      if(isset($b['children']) && !isset($a['children'])) return 1;
-      
-      return strcmp(strtolower($a['url']), strtolower($b['url']));
-    }
-   
-    echo xinha_to_js(scan($dir,$url));
-?>
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/ListOperations/ListOperations.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/ListOperations/ListOperations.js
deleted file mode 100644
index f040244..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/ListOperations/ListOperations.js
+++ /dev/null
@@ -1,90 +0,0 @@
-/** 
- ListOperations for Xinha
- ===============================================================================
- 
- Provides some additional features for working with lists in Xinha.
- 
- At present the only feature is
- 
- {{{
-   xinha_config.ListOperations.tabToIndent = [true | 'atstart' | false];
- }}}
- 
- which causes pressig tab ina list to indent (or shift-tab to detent) to 
- a new list level
- 
- Note that the HTML structure of this list may be, for example
- {{{
-   <ul>
-     <li>Item 1</li>
-     <ul>
-       <li>Item 1.1</li>
-     </ul>
-     <li>Item 2</li>
-   </ul>
- }}}
- 
-See ticket:1614
-*/
-
-ListOperations._pluginInfo = {
-  name          : "ListOperations",
-  version       : "1.0",
-  developer     : "The Xinha Core Developer Team",
-  developer_url : "http://trac.xinha.org/ticket/1614",
-  sponsor       : "",
-  sponsor_url   : "",
-  license       : "htmlArea"
-}
-
-Xinha.Config.prototype.ListOperations = 
-{ 
-  // One of true, false, 'atstart'
-  //  where 'atstart' will indent only at the start of a list item (can be a bit wonky if there is a leading space)
-  tabToIndent: true 
-}
-
-function ListOperations(editor)
-{
-  this.editor = editor;
-}
-
-ListOperations.prototype.onKeyPress = function(ev)
-{
-  var editor = this.editor;
- 
-  // Not enabled, drop out
-  if(!editor.config.ListOperations.tabToIndent) return false;
-  
-  if( ev.keyCode !== 9 ) { return false; }
-
-  var sel = editor.getSelection(),
-      rng = editor.createRange(sel),
-      containing_list = editor._getFirstAncestorAndWhy(sel, ["ol", "ul"]);
-
-  if( containing_list[0] === null ) {
-      return false;
-  }
-
-  containing_list_type = ["ol", "ul"][containing_list[1]];
-  containing_list = containing_list[0];
-
-  if(!editor.config.ListOperations.tabToIndent == 'atstart')
-  {
-    if( rng.startOffset !== 0 ) {
-      return false;
-    }
-  }
-
-  Xinha._stopEvent(ev);
-
-  if( ev.shiftKey ) {
-    if( editor._getFirstAncestorForNodeAndWhy(containing_list, ["ol", "ul"])[0] !== null ) {
-      editor.execCommand("outdent");
-    }
-  } else {
-    editor.execCommand("indent");
-  }
-
-  return true;
-}
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/ListType/ListType.css b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/ListType/ListType.css
deleted file mode 100644
index 8ad84b9..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/ListType/ListType.css
+++ /dev/null
@@ -1,43 +0,0 @@
-.ListType { }

-.ListType a {

-  display:block;

-  float:left;

-  margin:2px 0 0 5px;

-  padding:0;

-  width:50px;

-  height:40px;

-  border:1px solid #9c96a5;

-}

-.ListType a:hover {

-  border:1px solid #ffd760;

-}

-.ListType a.active {

-  border:1px solid #000084;

-}

-.ListType a.circle {

-  background:url(img/circle.png);

-}

-.ListType a.disc {

-  background:url(img/disc.png);

-}

-.ListType a.square {

-  background:url(img/square.png);

-}

-.ListType a.decimal {

-  background:url(img/decimal.png);

-}

-.ListType a.lower-alpha {

-  background:url(img/lower-alpha.png);

-}

-.ListType a.upper-alpha {

-  background:url(img/upper-alpha.png);

-}

-.ListType a.lower-roman {

-  background:url(img/lower-roman.png);

-}

-.ListType a.upper-roman {

-  background:url(img/upper-roman.png);

-}

-.ListType a.none {

-  background:url(img/none.png);

-}

diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/ListType/ListType.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/ListType/ListType.js
deleted file mode 100644
index f654eb3..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/ListType/ListType.js
+++ /dev/null
@@ -1,191 +0,0 @@
-// ListType Plugin for Xinha
-// Toolbar Implementation by Mihai Bazon, http://dynarch.com/mishoo/
-Xinha.loadStyle( 'ListType.css', 'ListType' );
-
-function ListType( editor )
-{
-  this.editor = editor;
-  var cfg = editor.config;
-  var self = this;
-
-  if ( cfg.ListType.mode == 'toolbar' )
-  {
-  var options = {};
-    options[Xinha._lc( "Decimal numbers", "ListType" )] = "decimal";
-    options[Xinha._lc( "Lower roman numbers", "ListType" )] = "lower-roman";
-    options[Xinha._lc( "Upper roman numbers", "ListType" )] = "upper-roman";
-    options[Xinha._lc( "Lower latin letters", "ListType" )] = "lower-alpha";
-    options[Xinha._lc( "Upper latin letters", "ListType" )] = "upper-alpha";
-    if (!Xinha.is_ie)
-      // IE doesn't support this property; even worse, it complains
-      // with a gross error message when we tried to select it,
-      // therefore let's hide it from the damn "browser".
-      options[Xinha._lc( "Lower greek letters", "ListType" )] = "lower-greek";
-    var obj =
-    {
-      id            : "listtype",
-      tooltip       : Xinha._lc( "Choose list style type (for ordered lists)", "ListType" ),
-      options       : options,
-      action        : function( editor ) { self.onSelect( editor, this ); },
-      refresh       : function( editor ) { self.updateValue( editor, this ); },
-      context       : "ol"
-    };
-    cfg.registerDropdown( obj );
-    cfg.addToolbarElement( "listtype", ["insertorderedlist","orderedlist"], 1 );
-  }
-  else
-  {
-    editor._ListType = editor.addPanel( 'right' );
-    Xinha.freeLater( editor, '_ListType' );
-    Xinha.addClass( editor._ListType, 'ListType' );
-    // hurm, ok it's pretty to use the background color for the whole panel,
-    // but should not it be set by default when creating the panel ?
-    Xinha.addClass( editor._ListType.parentNode, 'dialog' );
-
-    editor.notifyOn( 'modechange',
-      function(e,args)
-      {
-        if ( args.mode == 'text' ) editor.hidePanel( editor._ListType );
-      }
-    );
-
-    var elts_ul = ['disc', 'circle', 'square', 'none'];
-    var elts_ol = ['decimal', 'lower-alpha', 'upper-alpha', 'lower-roman', 'upper-roman', 'none'];
-    var divglobal = document.createElement( 'div' );
-    divglobal.style.height = '90px';
-    var div = document.createElement( 'div' );
-    this.divUL = div;
-    div.style.display = 'none';
-    for ( var i=0; i<elts_ul.length; i++ )
-    {
-      div.appendChild( this.createImage( elts_ul[i] ) );
-    }
-    divglobal.appendChild( div );
-    var div = document.createElement( 'div' );
-    this.divOL = div;
-    div.style.display = 'none';
-    for ( var i=0; i<elts_ol.length; i++ )
-    {
-      div.appendChild( this.createImage( elts_ol[i] ) );
-    }
-    divglobal.appendChild( div );
-
-    editor._ListType.appendChild( divglobal );
-
-    editor.hidePanel( editor._ListType );
-  }
-}
-
-Xinha.Config.prototype.ListType =
-{
-  'mode': 'toolbar' // configuration mode : toolbar or panel
-};
-
-ListType._pluginInfo =
-{
-  name          : "ListType",
-  version       : "2.1",
-  developer     : "Laurent Vilday",
-  developer_url : "http://www.mokhet.com/",
-  c_owner       : "Xinha community",
-  sponsor       : "",
-  sponsor_url   : "",
-  license       : "HTMLArea"
-};
-
-ListType.prototype.onSelect = function( editor, combo )
-{
-  var tbobj = editor._toolbarObjects[ combo.id ].element;
-  var parent = editor.getParentElement();
-  while (!/^ol$/i.test( parent.tagName ))
-    parent = parent.parentNode;
-  parent.style.listStyleType = tbobj.value;
-};
-
-ListType.prototype.updateValue = function( editor, combo )
-{
-  var tbobj = editor._toolbarObjects[ combo.id ].element;
-  var parent = editor.getParentElement();
-  while ( parent && !/^ol$/i.test( parent.tagName ) )
-    parent = parent.parentNode;
-  if (!parent)
-  {
-    tbobj.selectedIndex = 0;
-    return;
-  }
-  var type = parent.style.listStyleType;
-  if (!type)
-  {
-    tbobj.selectedIndex = 0;
-  }
-  else
-  {
-    for ( var i = tbobj.firstChild; i; i = i.nextSibling )
-    {
-      i.selected = (type.indexOf(i.value) != -1);
-    }
-  }
-};
-
-ListType.prototype.onUpdateToolbar = function()
-{
-  if ( this.editor.config.ListType.mode == 'toolbar' ) return ;
-  var parent = this.editor.getParentElement();
-  while ( parent && !/^[o|u]l$/i.test( parent.tagName ) )
-    parent = parent.parentNode;
-  if (parent && /^[o|u]l$/i.test( parent.tagName ) )
-  {
-    this.showPanel( parent );
-  }
-  else if (this.editor._ListType.style.display != 'none')
-  {
-    this.editor.hidePanel( this.editor._ListType );
-  }
-};
-
-ListType.prototype.createImage = function( listStyleType )
-{
-  var self = this;
-  var editor = this.editor;
-  var a = document.createElement( 'a' );
-  a.href = 'javascript:void(0)';
-  Xinha._addClass( a, listStyleType );
-  Xinha._addEvent( a, "click", function ()
-    {
-      var parent = editor._ListType.currentListTypeParent;
-      parent.style.listStyleType = listStyleType;
-      self.showActive( parent );
-      return false;
-    }
-  );
-  return a;
-};
-
-ListType.prototype.showActive = function( parent )
-{
-  var activeDiv = ( parent.tagName.toLowerCase() == 'ul' ) ? this.divUL : this.divOL;
-  this.divUL.style.display = 'none';
-  this.divOL.style.display = 'none';
-  activeDiv.style.display = 'block';
-  var defaultType = parent.style.listStyleType;
-  if ( '' == defaultType ) defaultType = ( parent.tagName.toLowerCase() == 'ul' )? 'disc':'decimal';
-  for ( var i=0; i<activeDiv.childNodes.length; i++ )
-  {
-    var elt = activeDiv.childNodes[i];
-    if ( Xinha._hasClass( elt, defaultType ) )
-    {
-      Xinha._addClass( elt, 'active' );
-    }
-    else
-    {
-      Xinha._removeClass( elt, 'active' );
-    }
-  }
-};
-
-ListType.prototype.showPanel = function( parent )
-{
-  this.editor._ListType.currentListTypeParent = parent;
-  this.showActive(parent);
-  this.editor.showPanel( this.editor._ListType );
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/ListType/img/circle.png b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/ListType/img/circle.png
deleted file mode 100644
index e8fd0b6..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/ListType/img/circle.png
+++ /dev/null
Binary files differ
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/ListType/img/decimal.png b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/ListType/img/decimal.png
deleted file mode 100644
index cda7518..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/ListType/img/decimal.png
+++ /dev/null
Binary files differ
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/ListType/img/disc.png b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/ListType/img/disc.png
deleted file mode 100644
index 0dd7b62..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/ListType/img/disc.png
+++ /dev/null
Binary files differ
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/ListType/img/lower-alpha.png b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/ListType/img/lower-alpha.png
deleted file mode 100644
index 1714b70..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/ListType/img/lower-alpha.png
+++ /dev/null
Binary files differ
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/ListType/img/lower-roman.png b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/ListType/img/lower-roman.png
deleted file mode 100644
index 7c934ff..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/ListType/img/lower-roman.png
+++ /dev/null
Binary files differ
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/ListType/img/none.png b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/ListType/img/none.png
deleted file mode 100644
index 3343f3d..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/ListType/img/none.png
+++ /dev/null
Binary files differ
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/ListType/img/square.png b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/ListType/img/square.png
deleted file mode 100644
index 884fffc..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/ListType/img/square.png
+++ /dev/null
Binary files differ
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/ListType/img/upper-alpha.png b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/ListType/img/upper-alpha.png
deleted file mode 100644
index 1654508..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/ListType/img/upper-alpha.png
+++ /dev/null
Binary files differ
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/ListType/img/upper-roman.png b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/ListType/img/upper-roman.png
deleted file mode 100644
index 8d08ce5..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/ListType/img/upper-roman.png
+++ /dev/null
Binary files differ
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/ListType/lang/de.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/ListType/lang/de.js
deleted file mode 100644
index 65e4650..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/ListType/lang/de.js
+++ /dev/null
@@ -1,19 +0,0 @@
-// I18N constants
-// LANG: "de", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Choose list style type (for ordered lists)": "Wählen Sie einen Typ für die Nummerierung aus",
-    "Decimal numbers": "Zahlen",
-    "Lower greek letters": "Griechisch",
-    "Lower latin letters": "Zeichen klein",
-    "Lower roman numbers": "Römisch klein",
-    "Upper latin letters": "Zeichen groß",
-    "Upper roman numbers": "Römisch groß"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/ListType/lang/es.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/ListType/lang/es.js
deleted file mode 100644
index 321e71a..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/ListType/lang/es.js
+++ /dev/null
@@ -1,19 +0,0 @@
-// I18N constants
-// LANG: "es", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Choose list style type (for ordered lists)": "Seleccionar estilo de lista (para listas ordenadas)",
-    "Decimal numbers": "Números",
-    "Lower greek letters": "Letras griegas minúsculas",
-    "Lower latin letters": "Letras minúsculas",
-    "Lower roman numbers": "Números romanos en minúsculas",
-    "Upper latin letters": "Letras mayúsculas",
-    "Upper roman numbers": "Números romanos en mayúsculas"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/ListType/lang/fr.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/ListType/lang/fr.js
deleted file mode 100644
index 1f3f642..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/ListType/lang/fr.js
+++ /dev/null
@@ -1,19 +0,0 @@
-// I18N constants
-// LANG: "fr", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Choose list style type (for ordered lists)": "Choisissez le style de liste (pour les listes ordonnées)",
-    "Decimal numbers": "Nombres décimaux",
-    "Lower greek letters": "Lettres grecques minuscule",
-    "Lower latin letters": "Lettres latines minuscule",
-    "Lower roman numbers": "Nombres romains minuscule",
-    "Upper latin letters": "Lettres latines majuscule",
-    "Upper roman numbers": "Nombres romains majuscule"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/ListType/lang/ja.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/ListType/lang/ja.js
deleted file mode 100644
index 4a2354d..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/ListType/lang/ja.js
+++ /dev/null
@@ -1,19 +0,0 @@
-// I18N constants
-// LANG: "ja", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Choose list style type (for ordered lists)": "リスト形式の選択(順序付けリスト用)",
-    "Decimal numbers": "10進数",
-    "Lower greek letters": "ギリシャ文字(小文字)",
-    "Lower latin letters": "アルファベット(小文字)",
-    "Lower roman numbers": "ローマ数字(小文字)",
-    "Upper latin letters": "アルファベット(大文字)",
-    "Upper roman numbers": "ローマ数字(大文字)"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/ListType/lang/lc_base.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/ListType/lang/lc_base.js
deleted file mode 100644
index 5480188..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/ListType/lang/lc_base.js
+++ /dev/null
@@ -1,31 +0,0 @@
-// I18N constants
-//
-// LANG: "en", ENCODING: UTF-8
-// Author: Translator-Name, <email@example.com>
-//
-// Last revision: 2018-04-12
-// 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).
-//
-// (Please, remove information below)
-// 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.)
-
-{
-    "Choose list style type (for ordered lists)": "",
-    "Decimal numbers": "",
-    "Lower greek letters": "",
-    "Lower latin letters": "",
-    "Lower roman numbers": "",
-    "Upper latin letters": "",
-    "Upper roman numbers": ""
-}
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/ListType/lang/nb.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/ListType/lang/nb.js
deleted file mode 100644
index 62073a7..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/ListType/lang/nb.js
+++ /dev/null
@@ -1,19 +0,0 @@
-// I18N constants
-// LANG: "nb", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Choose list style type (for ordered lists)": "Velg listetype (for nummererte lister)",
-    "Decimal numbers": "Desimaltall",
-    "Lower greek letters": "Lower greek letters",
-    "Lower latin letters": "Lower latin letters",
-    "Lower roman numbers": "Lower roman numbers",
-    "Upper latin letters": "Upper latin letters",
-    "Upper roman numbers": "Upper roman numbers"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/ListType/lang/nl.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/ListType/lang/nl.js
deleted file mode 100644
index bc5ab6d..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/ListType/lang/nl.js
+++ /dev/null
@@ -1,19 +0,0 @@
-// I18N constants
-// LANG: "nl", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Choose list style type (for ordered lists)": "Kies stijl type (voor ordered lists)",
-    "Decimal numbers": "Decimale nummers",
-    "Lower greek letters": "Griekse letters",
-    "Lower latin letters": "Latijnse letters klein",
-    "Lower roman numbers": "Romeinse nummers klein",
-    "Upper latin letters": "Latijnse letters groot",
-    "Upper roman numbers": "Romeinse nummers groot"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/ListType/lang/pl.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/ListType/lang/pl.js
deleted file mode 100644
index a6b0a0d..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/ListType/lang/pl.js
+++ /dev/null
@@ -1,19 +0,0 @@
-// I18N constants
-// LANG: "pl", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Choose list style type (for ordered lists)": "Wybierz typ listy numerowanej",
-    "Decimal numbers": "Cyfry arabskie",
-    "Lower greek letters": "Małe litery greckie",
-    "Lower latin letters": "Małe litery",
-    "Lower roman numbers": "Małe rzymskie",
-    "Upper latin letters": "Duże litery",
-    "Upper roman numbers": "Duże rzymskie"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/ListType/lang/pt_br.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/ListType/lang/pt_br.js
deleted file mode 100644
index 2133d2d..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/ListType/lang/pt_br.js
+++ /dev/null
@@ -1,19 +0,0 @@
-// I18N constants
-// LANG: "pt_br", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Choose list style type (for ordered lists)": "Escolha um tipo de lista (para lista ordenada)",
-    "Decimal numbers": "Números decimais",
-    "Lower greek letters": "Letras gregas inferiores",
-    "Lower latin letters": "Letras latinas inferiores",
-    "Lower roman numbers": "Números romanos inferiores",
-    "Upper latin letters": "Letras latinas superiores",
-    "Upper roman numbers": "Números romanos superiores"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/ListType/lang/ru.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/ListType/lang/ru.js
deleted file mode 100644
index 1d113cf..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/ListType/lang/ru.js
+++ /dev/null
@@ -1,19 +0,0 @@
-// I18N constants
-// LANG: "ru", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Choose list style type (for ordered lists)": "Выберите стиль списков (для упорядоченных списков)",
-    "Decimal numbers": "Десятичные числа",
-    "Lower greek letters": "Строчные греческие символы",
-    "Lower latin letters": "Строчные латинские символы",
-    "Lower roman numbers": "Строчные романские числа",
-    "Upper latin letters": "Заглавные латинские символы",
-    "Upper roman numbers": "Заглавные романские числа"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/ListType/lang/sv.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/ListType/lang/sv.js
deleted file mode 100755
index c7a8433..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/ListType/lang/sv.js
+++ /dev/null
@@ -1,19 +0,0 @@
-// I18N constants
-// LANG: "sv", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Choose list style type (for ordered lists)": "Välj listtyp (för numrerade listor)",
-    "Decimal numbers": "Desimaltal",
-    "Lower greek letters": "Små grekiska bokstäver",
-    "Lower latin letters": "Små latinska bokstäver",
-    "Lower roman numbers": "Små romerska siffror",
-    "Upper latin letters": "Stora latinska bokstäver",
-    "Upper roman numbers": "Stora romerska siffror"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/MootoolsFileManager/MootoolsFileManager.FileManager.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/MootoolsFileManager/MootoolsFileManager.FileManager.js
deleted file mode 100644
index eee4b2f..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/MootoolsFileManager/MootoolsFileManager.FileManager.js
+++ /dev/null
@@ -1,405 +0,0 @@
-/**
-  = Mootools File Manager =
-  == File Manager ==
-  
-  The functions in this file extend the MootoolsFileManager plugin with support
-  for managing files (inserting a link to a file).  This file is loaded automatically.
-     
- * @author $Author$
- * @version $Id$
- * @package MootoolsFileManager
- */
-
-
-// Open a "files" mode of the plugin to allow to select a file to
-// create a link to.
-MootoolsFileManager.prototype.OpenFileManager = function(link) 
-{
-    var editor = this.editor;
-    var outparam = null;
-    var self = this;
-    
-    if (typeof link == "undefined") 
-    {
-      link = this.editor.getParentElement();
-      if (link) 
-      {
-        if (/^img$/i.test(link.tagName))
-            link = link.parentNode;
-        if (!/^a$/i.test(link.tagName))
-            link = null;
-      }
-    }
-    
-    // If the link wasn't provided, and no link is currently in focus,
-    // make one from the selection.
-    if (!link) 
-    {
-      var sel = editor.getSelection();
-      var range = editor.createRange(sel);
-      var compare = 0;
-      
-      if (Xinha.is_ie) 
-      {
-        if ( sel.type == "Control" )
-        {
-          compare = range.length;
-        }
-        else
-        {
-          compare = range.compareEndPoints("StartToEnd", range);
-        }
-      } 
-      else 
-      {
-        compare = range.compareBoundaryPoints(range.START_TO_END, range);
-      }
-      
-      if (compare == 0) 
-      {
-        alert(Xinha._lc("You must select some text before making a new link.", 'MootoolsFileManager'));
-        return;
-      }
-      outparam = {
-          f_href : '',
-          f_title : '',
-          f_target : '',          
-          f_type: '',
-          baseHref: editor.config.baseHref
-      };
-    }
-    else
-    {
-      outparam = {
-          f_href   : Xinha.is_ie ? link.href : link.getAttribute("href"),
-          f_title  : link.title,
-          f_target : link.target,          
-          f_type   : link.type ? link.type : '',
-          baseHref: editor.config.baseHref
-      };
-    }
-    
-    this.current_link = link;
-    this.current_attributes = outparam;
-    
-    if(!this.FileManagerWidget)
-    {    
-      this.FileManagerWidget = new FileManager({
-        url:            this.editor.config.MootoolsFileManager.backend,
-        assetBasePath:  Xinha.getPluginDir('MootoolsFileManager')+'/mootools-filemanager/Assets',
-        language:       _editor_lang,
-        selectable:     true,
-        upload:         this.phpcfg.files_allow_upload,
-        destroy:        this.phpcfg.files_allow_delete,
-        createFolders:  this.phpcfg.files_allow_create_dir,   
-        rename:         this.phpcfg.files_allow_move,
-        move_or_copy:   this.phpcfg.files_allow_move,
-        download:       this.phpcfg.files_allow_download,   
-                                                     
-        propagateData:  Object.merge({'__function': 'file-manager'}, this.editor.config.MootoolsFileManager.backend_data),
-        propagateType:  'POST',
-      
-        uploadAuthData: Object.merge({'__function': 'file-manager'}, this.editor.config.MootoolsFileManager.backend_data),
-                                               
-        onComplete:     function(path, file, mgr) { self.FileManagerReturn(path,file); },
-        onHide:         function() { if(this.swf && this.swf.box) this.swf.box.style.display = 'none'; },
-        onShow:         function() { if(this.swf && this.swf.box) this.swf.box.style.display = ''; },
-        onDetails:      function(details) 
-                        {                                                 
-                          this.info.adopt(self.FileManagerAttributes(details)); 
-                          return true;
-                        },
-        onHidePreview:  function()
-                        {                        
-                          document.id(self.FileManagerAttributes().table).dispose();
-                          return true;
-                        },
-                        
-        showDirGallery: false,
-        keyboardNavigation: false,
-        listType:           this.phpcfg.files_list_type,
-        listPaginationSize: this.phpcfg.files_pagination_size,
-        listMaxSuggestedDirSizeForThumbnails: this.phpcfg.files_list_mode_over,
-        directory:          this.phpcfg.files_list_start_in
-      });       
-    }
-
-    // IE11 which pretends it is "gecko" is particularly finicky 
-    //  about losing selection other browsers not so much, but they
-    //   don't seem to mind saving and restoring it anyway, so we 
-    //   will do that for everybody
-    if(1||Xinha.is_ie) this.current_selection = this.editor.saveSelection();
-    if(link)
-    {      
-        var src  = Xinha.is_ie ? link.href : link.getAttribute("href");
-        if(!src.match(/^(([a-z]+:)|\/)/i))
-        {
-            src = self.editor.config.baseHref.replace(/\/[^\/]*$/, '') + '/' + src;
-            if(src.match(/^[a-z]+:/i) && !self.phpcfg.files_url.match(/^[a-z]:/i))
-            {
-              src = src.replace(/^[a-z]+:(\/\/?)[^/]*/i, '');
-            }
-        }
-        
-        // Get exploded path without the base url
-        var path = src.replace(self.phpcfg.files_url+'/', '').split('/');
-        
-        // Pull off the file
-        var base = path.pop();      
-        
-        // Join the path back togethor (no base url, trailing slash if the path has any length)
-        path = path.length ? (path.join('/') + '/') : '';
-        
-        // feed to widget
-        this.FileManagerWidget.show(null, path, base);          
-    }
-    else
-    {
-      this.FileManagerWidget.show();    
-    }    
-};
-
-// Take the values from the file selection and make it (or update) a link
-MootoolsFileManager.prototype.FileManagerReturn = function(path, file)
-{
-  var editor = this.editor;
-  var a      = this.current_link;
-  
-  var param = this.FileManagerAttributes();  
-  param.f_href = path;
-
-  // IE11 which pretends it is "gecko" is particularly finicky 
-  //  about losing selection other browsers not so much, but they
-  //   don't seem to mind saving and restoring it anyway, so we 
-  //   will do that for everybody
-  if(1||Xinha.is_ie) this.editor.restoreSelection(this.current_selection);  
-  if (!a)
-  {
-    try 
-    {
-      editor._doc.execCommand("createlink", false, param.f_href);
-      a = editor.getParentElement();
-      var sel = editor.getSelection();
-      var range = editor.createRange(sel);
-      if (!Xinha.is_ie) 
-      {
-        a = range.startContainer;
-        if (!/^a$/i.test(a.tagName)) 
-        {
-          a = a.nextSibling;
-          if (a == null)
-          {
-            a = range.startContainer.parentNode;
-          }
-        }
-      }
-    } catch(e) {}
-  }
-  else 
-  {
-    var href = param.f_href.trim();
-    editor.selectNodeContents(a);
-    if (href == "") 
-    {
-      editor._doc.execCommand("unlink", false, null);
-      editor.updateToolbar();
-      return false;
-    }
-    else 
-    {
-      a.href = href;
-    }
-  }
-  
-  if (!(a && /^a$/i.test(a.tagName)))
-  {
-    return false;
-  }
-  
-  a.type = param.f_type.trim();
-  a.target = param.f_target.trim();
-  a.title = param.f_title.trim();
-  editor.selectNodeContents(a);
-  editor.updateToolbar();
-};
-
-/** Return a DOM fragment which has all the fields needed to set the
- *  attributes for a link given a structure of initial values.
- * 
- *  OR return a structure of values taken from the currently table.
- */
- 
-MootoolsFileManager.prototype.FileManagerAttributes = function (details)
-{
-
-  var self = this;
-  self._LastFileDetails = details;
-  
-  function f(name)
-  {
-    var e = self._FileManagerAttributesTable.getElementsByTagName('input');
-    for(var i = 0; i < e.length; i++)
-    {
-      if(e[i].name == name) return e[i];
-    }
-    
-    var e = self._FileManagerAttributesTable.getElementsByTagName('select');
-    for(var i = 0; i < e.length; i++)
-    {
-      if(e[i].name == name) return e[i];
-    }
-    
-    return null;    
-  }
-  
-  function s(name, value)
-  {
-    for(var i = 0; i < f(name).options.length; i++)
-    {
-      if(f(name).options[i].value == value) 
-      {
-       // f(name).options[i].selected = true;
-        f(name).selectedIndex = i;
-        return true;
-      }
-    }
-    return false;
-  }
-  
-  if(!this._FileManagerAttributesTable)
-  {
-    this._FileManagerAttributesTable = (function() {
-      var div     = document.createElement('div');
-      
-      var h2  = document.createElement('h2');
-      h2.appendChild(document.createTextNode('Link Attributes'));            
-      div.appendChild(h2);
-            
-      var table = document.createElement('table');
-      div.appendChild(table);
-      
-      table.className = 'filemanager-extended-options';
-      var tbody = table.appendChild(document.createElement('tbody'));
-      
-      { // Title
-        var tr    = tbody.appendChild(document.createElement('tr'));
-        var th    = tr.appendChild(document.createElement('th'));
-        var label = th.appendChild(document.createTextNode('Title:'));
-        
-        var td    = tr.appendChild(document.createElement('td'));
-        var input = td.appendChild(document.createElement('input'));
-        
-        td.colSpan   = 6;
-        input.name   = 'f_title';
-        input.type = 'text';
-        th.className = td.className = 'filemanager-f_title';      
-      }
-      
-      { // Content Type
-        var tr    = tbody.appendChild(document.createElement('tr'));
-        var th    = tr.appendChild(document.createElement('th'));
-        var label = th.appendChild(document.createTextNode('Type:'));
-        
-        var td    = tr.appendChild(document.createElement('td'));
-        var input = td.appendChild(document.createElement('input'));
-        
-        td.colSpan   = 6;
-        input.name   = 'f_type';
-        input.type = 'text';
-        th.className = td.className = 'filemanager-f_type';      
-      }
-           
-      { // Target
-        var tr    = tbody.appendChild(document.createElement('tr'));
-        
-        { // Target
-          var th    = tr.appendChild(document.createElement('th'));
-          var label = th.appendChild(document.createTextNode('Open In:'));
-          
-          var td    = tr.appendChild(document.createElement('td'));
-          td.colSpan = 2;
-          var input = td.appendChild(document.createElement('select'));
-          
-          input.name   = 'f_target';          
-          input.options[0] = new Option('');
-          input.options[1] = new Option('New Window', '_blank');
-          input.options[2] = new Option('Top Frame', '_top');
-          input.options[3] = new Option('Other Frame:', '');
-          
-          Xinha._addEvent(input, 'change', function()
-          {                    
-            if(f('f_target').selectedIndex == 3)
-            {
-              f('f_otherTarget').style.visibility = 'visible';
-            }
-            else
-            {
-              f('f_otherTarget').style.visibility = 'hidden';
-            }
-          });
-          
-          var input = td.appendChild(document.createElement('input'));
-          input.name   = 'f_otherTarget';
-          input.size = 7;    
-          input.type = 'text';     
-          input.style.visibility = 'hidden';
-          
-          th.className = td.className = 'filemanager-f_target';              
-        }                      
-      }
-            
-      return div;
-    })();        
-  }
-  
-  if(this.current_attributes)
-  {
-    f('f_title').value    = this.current_attributes.f_title;
-    f('f_type').value     = this.current_attributes.f_type;
-    
-    if(this.current_attributes.f_target)
-    {
-      if(!s('f_target', this.current_attributes.f_target))
-      {
-        f('f_target').selectedIndex = 3;
-        f('f_otherTarget').value = this.current_attributes.f_target;
-      }     
-      else
-      {
-        f('f_otherTarget').value = '';
-      }
-    }
-    
-    this.current_attributes = null;
-  }
-  
-  // If no details were supplied, we return the current ones
-  if(!details) 
-  {
-    var details = {
-      f_title:  f('f_title').value,
-      f_type:  f('f_type').value,
-      f_target: f('f_target').selectedIndex < 3 ? f('f_target').options[f('f_target').selectedIndex].value : f('f_otherTarget').value,
-      
-      table: this._FileManagerAttributesTable
-    }
-    
-    return details;
-  }
-  
-  // If details were supplied, we set the appropriate ones.    
-  if(details.mime) f('f_type').value = details.mime;
-  
-  f('f_target').style.visibility = ''; // Ensure that the select hasn't been hidden by an overlay and not put back
-  
-  if(f('f_target').selectedIndex == 3)
-  {
-    f('f_otherTarget').style.visibility = 'visible';
-  }
-  else
-  {
-    f('f_otherTarget').style.visibility = 'hidden';
-  }
-  
-  return this._FileManagerAttributesTable;
-};
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/MootoolsFileManager/MootoolsFileManager.ImageManager.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/MootoolsFileManager/MootoolsFileManager.ImageManager.js
deleted file mode 100644
index a877e91..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/MootoolsFileManager/MootoolsFileManager.ImageManager.js
+++ /dev/null
@@ -1,685 +0,0 @@
-/**
-  = Mootools File Manager =
-  == Image Manager ==
-  
-  The functions in this file extend the MootoolsFileManager plugin with support
-  for managing images.  This file is loaded automatically.
-     
- * @author $Author$
- * @version $Id$
- * @package MootoolsFileManager
- */
-
-
-/** Open the Image Manager version of the plugin.
- *
- *  Called from the _insertImage method of the editor (see the hookup in MootoolsFileManager.js)
- *  Optional image for future external use.
- */
- 
-MootoolsFileManager.prototype.OpenImageManager = function(image)
-{
-  var editor = this.editor;  // for nested functions
-  var self   = this;
-  var outparam = null;
-  
-  if (typeof image == "undefined") 
-  {
-    image = editor.getParentElement();
-    if (image && !/^img$/i.test(image.tagName))
-    {
-      image = null;
-    }
-  }
-
-  if ( image )
-  {
-    outparam =
-      {
-        f_url    : image.getAttribute('src'), //Xinha.is_ie ? image.src : image.src,
-        f_alt    : image.alt,
-        f_border : image.style.borderWidth ? image.style.borderWidth : image.border,
-        f_align  : Xinha.hasAttribute(image, 'align') ? image.align : null,
-        f_padding: image.style.padding,
-        f_margin : image.style.margin,
-        f_width  :  Xinha.hasAttribute(image, 'width') ? image.width : null,
-        f_height  : Xinha.hasAttribute(image, 'height') ? image.height : null,
-        f_backgroundColor: image.style.backgroundColor,
-        f_borderColor: image.style.borderColor,
-        f_hspace:  image.hspace && image.hspace != '-1' ? parseInt(image.hspace) : null,
-        f_vspace: image.vspace && image.vspace != '-1' ? parseInt(image.vspace) : null
-      };
-
-    outparam.f_border  = this.shortSize(outparam.f_border);
-    outparam.f_padding = this.shortSize(outparam.f_padding);
-    outparam.f_margin  = this.shortSize(outparam.f_margin);
-        
-    outparam.f_backgroundColor = this.convertToHex(outparam.f_backgroundColor);
-    outparam.f_borderColor = this.convertToHex(outparam.f_borderColor);
-  }
-   
-  this.current_image        = image;
-  this.current_attributes   = outparam;
-  
-  if(!this.ImageManagerWidget)
-  {
-    this.ImageManagerWidget = new FileManager({
-      url:            this.editor.config.MootoolsFileManager.backend,
-      assetBasePath:  Xinha.getPluginDir('MootoolsFileManager')+'/mootools-filemanager/Assets',
-      language:       _editor_lang,
-      selectable:     true,
-                                              
-      upload:         this.phpcfg.images_allow_upload,
-      destroy:        this.phpcfg.images_allow_delete,
-      createFolders:  this.phpcfg.images_allow_create_dir,
-      rename:         this.phpcfg.images_allow_move,
-      move_or_copy:   this.phpcfg.images_allow_move,
-      download:       this.phpcfg.images_allow_download,
-                                                                             
-      propagateData:  Object.merge({'__function': 'image-manager'}, this.editor.config.MootoolsFileManager.backend_data),
-      propagateType:  'POST',
-      
-      uploadAuthData: Object.merge({'__function': 'image-manager'}, this.editor.config.MootoolsFileManager.backend_data),
-                                              
-      onComplete:     function(path, file, mgr) { self.ImageManagerReturn(path,file); },
-      onHide:         function() { if(this.swf && this.swf.box) this.swf.box.style.display = 'none'; },
-      onShow:         function() { if(this.swf && this.swf.box) this.swf.box.style.display = '';     },
-      onDetails:      function(details) 
-                      {                                                 
-                        this.info.adopt(self.ImageManagerAttributes(details)); 
-                        
-                        // This is some meta data we don't need to see, messes up the formatting.
-                        if(this.info.getElement('.filemanager-preview dl+p'))
-                        {
-                          this.info.getElement('.filemanager-preview dl+p').style.display = 'none';
-                        }
-                        return true;
-                      },
-      onHidePreview:  function()
-                      {                        
-                        document.id(self.ImageManagerAttributes().table).dispose();
-                        return true;
-                      },
-                      
-      showDirGallery: false,
-      keyboardNavigation: false,
-      listType:           this.phpcfg.images_list_type,
-      listPaginationSize: this.phpcfg.images_pagination_size,
-      listMaxSuggestedDirSizeForThumbnails: this.phpcfg.images_list_mode_over,
-      directory:          this.phpcfg.images_list_start_in
-    });        
-  }
-  
-  // IE11 which pretends it is "gecko" is particularly finicky 
-  //  about losing selection other browsers not so much, but they
-  //   don't seem to mind saving and restoring it anyway, so we 
-  //   will do that for everybody
-  if(1||Xinha.is_ie) this.current_selection = this.editor.saveSelection();
-  
-  if(self.current_image)
-  {      
-      var src  = self.current_image.getAttribute('src');
-      if(!src.match(/^(([a-z]+:)|\/)/i))
-      {
-          src = self.editor.config.baseHref.replace(/\/[^\/]*$/, '') + '/' + src;
-          if(src.match(/^[a-z]+:/i) && !self.phpcfg.images_url.match(/^[a-z]:/i))
-          {
-            src = src.replace(/^[a-z]+:(\/\/?)[^/]*/i, '');
-          }
-      }
-      
-      // Get exploded path without the base url
-      var path = src.replace(self.phpcfg.images_url+'/', '').split('/');
-      
-      // Pull off the file
-      var base = path.pop();      
-      
-      // Join the path back togethor (no base url, trailing slash if the path has any length)
-      path = path.length ? (path.join('/') + '/') : '';
-      
-      // feed to widget
-      this.ImageManagerWidget.show(null, path, base);          
-  }
-  else
-  {
-    this.ImageManagerWidget.show();    
-  }
-};
-
-/** Return a DOM fragment which has all the fields needed to set the
- *  attributes for an image given a structure of initial values.
- * 
- *  OR return a structure of values taken from the currently table.
- */
- 
-MootoolsFileManager.prototype.ImageManagerAttributes = function (details)
-{
-
-  var self = this;
-  self._LastImageDetails = details;
-  
-  function f(name)
-  {
-    var e = self._ImageManagerAttributesTable.getElementsByTagName('input');
-    for(var i = 0; i < e.length; i++)
-    {
-      if(e[i].name == name) return e[i];
-    }
-    
-    var e = self._ImageManagerAttributesTable.getElementsByTagName('select');
-    for(var i = 0; i < e.length; i++)
-    {
-      if(e[i].name == name) return e[i];
-    }
-    
-    return null;    
-  }
-  
-  function s(name, value)
-  {
-    for(var i = 0; i < f(name).options.length; i++)
-    {
-      if(f(name).options[i].value == value) 
-      {
-       // f(name).options[i].selected = true;
-        f(name).selectedIndex = i;
-      }
-    }
-  }
-  
-  if(!this._ImageManagerAttributesTable)
-  {
-    this._ImageManagerAttributesTable = (function() {
-      var table = document.createElement('table');
-      table.className = 'filemanager-extended-options';
-      var tbody = table.appendChild(document.createElement('tbody'));
-      
-      { // Description
-        var tr    = tbody.appendChild(document.createElement('tr'));
-        var th    = tr.appendChild(document.createElement('th'));
-        var label = th.appendChild(document.createTextNode('Description:'));
-        
-        var td    = tr.appendChild(document.createElement('td'));
-        var input = td.appendChild(document.createElement('input'));
-        
-        td.colSpan   = 6;
-        input.name   = 'f_alt';
-        input.type = 'text';
-        th.className = td.className = 'filemanager-f_alt';      
-      }
-      
-      { // Width, Constrain, Margin, 
-        var tr    = tbody.appendChild(document.createElement('tr'));
-        
-        { // Width        
-          var th    = tr.appendChild(document.createElement('th'));
-          var label = th.appendChild(document.createTextNode('Width:'));
-          
-          var td    = tr.appendChild(document.createElement('td'));
-          var input = td.appendChild(document.createElement('input'));
-          
-          input.name   = 'f_width';
-          input.size = 4;    
-          input.type = 'text';
-          // @TODO Constrain Ratio
-          th.className = td.className = 'filemanager-f_width';      
-        }
-        
-        { // Constrain        
-          
-          var td    = tr.appendChild(document.createElement('td'));
-          td.rowSpan = 2;
-          td.style.verticalAlign = 'middle';
-          
-          var div   = td.appendChild(document.createElement('div'));
-          div.style.position = 'relative';
-          
-          var img   = div.appendChild(document.createElement('img'));
-          img.src   =  Xinha.getPluginDir("MootoolsFileManager") + '/img/locked.gif';
-          img.width = 25;
-          img.height = 32;
-          img.alt = 'Constrain Proportions';
-          img.style.verticalAlign = 'middle';
-                  
-          var input = document.createElement('input');
-          input.type = 'checkbox';
-          input.name = 'f_constrain';                  
-          input.style.position = 'absolute';
-          input.style.top = '10px';
-          input.style.left = '-4px';
-          input.value = 'on';        
-          input.checked = true;
-          div.appendChild(input);        
-          
-          td.className = 'filemanager-f_constrain';      
-          
-        }
-        
-        if(self.phpcfg.images_use_hspace_vspace)      
-        { // HSPACE/VSPACE        
-          var th    = tr.appendChild(document.createElement('th'));
-          var label = th.appendChild(document.createTextNode('L/R Margin:'));
-          
-          var td    = tr.appendChild(document.createElement('td'));
-          var input = td.appendChild(document.createElement('input'));
-          input.name   = 'f_hspace';
-          input.size = 3;    
-          input.type = 'text';
-          td.appendChild(document.createTextNode(' px '));               
-          th.className = td.className = 'filemanager-f_hspace';      
-          
-          var th    = tr.appendChild(document.createElement('th'));
-          var label = th.appendChild(document.createTextNode('T/B Margin:'));
-          var td    = tr.appendChild(document.createElement('td'));
-          var input = td.appendChild(document.createElement('input'));
-          input.name   = 'f_vspace';
-          input.size = 3;    
-          input.type = 'text';
-          td.appendChild(document.createTextNode(' px '));               
-          th.className = td.className = 'filemanager-f_vspace';      
-        }
-        else
-        {
-          // Margin      
-          var th    = tr.appendChild(document.createElement('th'));
-          var label = th.appendChild(document.createTextNode('Margin:'));
-          
-          var td    = tr.appendChild(document.createElement('td'));
-          var input = td.appendChild(document.createElement('input'));
-          input.name   = 'f_margin';
-          input.size = 3;    
-          input.type = 'text';
-          td.appendChild(document.createTextNode(' px '));        
-          th.className = td.className = 'filemanager-f_margin';    
-        }
-      }
-      
-      { // Height, Padding, Colour  
-        var tr    = tbody.appendChild(document.createElement('tr'));
-        
-        { // Height
-          var th    = tr.appendChild(document.createElement('th'));
-          var label = th.appendChild(document.createTextNode('Height:'));
-          
-          var td    = tr.appendChild(document.createElement('td'));
-          var input = td.appendChild(document.createElement('input'));
-          
-          input.name   = 'f_height';
-          input.size = 4;    
-          input.type = 'text';
-          // @TODO Constrain Ratio
-          th.className = td.className = 'filemanager-f_width';      
-        }
-              
-        { // Padding      
-          var th    = tr.appendChild(document.createElement('th'));
-          var label = th.appendChild(document.createTextNode('Padding:'));
-          
-          var td    = tr.appendChild(document.createElement('td'));
-          var input = td.appendChild(document.createElement('input'));
-          input.name   = 'f_padding';
-          input.size = 3;    
-          input.type = 'text';
-          td.appendChild(document.createTextNode(' px '));        
-          th.className = td.className = 'filemanager-f_padding';    
-        }
-        
-        { // Padding Colour (Background) 
-          var th    = tr.appendChild(document.createElement('th'));
-          var label = th.appendChild(document.createTextNode('Colour:'));
-          
-          var td    = tr.appendChild(document.createElement('td'));
-          var input = td.appendChild(document.createElement('input'));
-          input.name   = 'f_backgroundColor';
-          input.size = 7;    
-          input.type = 'text';        
-          new Xinha.colorPicker.InputBinding(input);
-          th.className = td.className = 'filemanager-f_backgroundColor';    
-        }
-      }
-      
-      { // Alignment, Border, Colour  
-        var tr    = tbody.appendChild(document.createElement('tr'));
-        
-        { // Alignment
-          var th    = tr.appendChild(document.createElement('th'));
-          var label = th.appendChild(document.createTextNode('Alignment:'));
-          
-          var td    = tr.appendChild(document.createElement('td'));
-          td.colSpan = 2;
-          var input = td.appendChild(document.createElement('select'));
-          
-          input.name   = 'f_align';
-          input.title = 'Positioning of this image';
-          input.options[0] = new Option('', true, true);
-          input.options[1] = new Option('Left', 'left');
-          input.options[2] = new Option('Right', 'right');
-          input.options[3] = new Option('Top', 'top');
-          input.options[4] = new Option('Middle', 'middle');
-          input.options[5] = new Option('Bottom', 'bottom');
-          
-          // @TODO Constrain Ratio
-          th.className = td.className = 'filemanager-f_align';              
-        }
-              
-        { // Border      
-          var th    = tr.appendChild(document.createElement('th'));
-          var label = th.appendChild(document.createTextNode('Border:'));
-          
-          var td    = tr.appendChild(document.createElement('td'));
-          var input = td.appendChild(document.createElement('input'));
-          input.name   = 'f_border';
-          input.size = 3;    
-          input.type = 'text';
-          td.appendChild(document.createTextNode(' px '));        
-          th.className = td.className = 'filemanager-f_border';    
-        }
-        
-        { // Border Colour
-          var th    = tr.appendChild(document.createElement('th'));
-          var label = th.appendChild(document.createTextNode('Colour:'));
-          
-          var td    = tr.appendChild(document.createElement('td'));
-          var input = td.appendChild(document.createElement('input'));
-          input.name   = 'f_borderColor';
-          input.size = 7;    
-          input.type = 'text';               
-          new Xinha.colorPicker.InputBinding(input);
-          th.className = td.className = 'filemanager-f_borderColor';    
-        }
-      }
-      
-      { // Size Warning
-         var tr    = tbody.appendChild(document.createElement('tr'));
-                
-         var td    = tr.appendChild(document.createElement('td'));
-         td.colSpan = 7;
-         td.className = 'filemanager-img-size-notice';        
-      }
-      
-      var div = document.createElement('div');
-      var h2 = document.createElement('h2');
-      h2.appendChild(document.createTextNode('Image Attributes'));
-      div.appendChild(h2);
-      div.appendChild(table);
-      return div;
-    })();
-    
-    
-    f('f_width').onkeyup = function()
-    {
-      if(!f('f_constrain').checked) return true;
-      if(!f('f_width').value) 
-      {
-        f('f_width').value = '';
-        f('f_height').value = '';
-      }
-      else if(f('f_height').value && self._LastImageDetails)
-      {
-        f('f_height').value = self.ScaleImage(self._LastImageDetails, { width: f('f_width').value, height: null }).height;
-      }                
-      else if(!self._LastImageDetails)
-      {
-        f('f_height').value = '';
-      }
-      return true;
-    }
-    
-    f('f_height').onkeyup = function()
-    {
-      if(!f('f_constrain').checked) return true;
-      if(!f('f_height').value) 
-      {
-        f('f_width').value = '';
-        f('f_height').value = '';
-      }
-      else if(f('f_width').value && self._LastImageDetails)
-      {
-        f('f_width').value = self.ScaleImage(self._LastImageDetails, { width: null, height: f('f_height').value }).width;
-      }                
-      else if(!self._LastImageDetails)
-      {
-        f('f_width').value = '';
-      }
-      return true;
-    }
-    
-    f('f_constrain').onclick = function()
-    {
-      if(this.checked && f('f_width').value && f('f_height').value)
-      {
-        var new_dim = self.ScaleImage(self._LastImageDetails, { width:f('f_width').value, height:f('f_height').value });
-        f('f_width').value = new_dim.width;
-        f('f_height').value = new_dim.height;
-      }        
-    }
-  }
-  
-  if(this.current_attributes)
-  {
-    f('f_alt').value    = this.current_attributes.f_alt;
-    f('f_border').value = this.current_attributes.f_border;
-    s('f_align', this.current_attributes.f_align);
-    f('f_padding').value = this.current_attributes.f_padding;
-    if(f('f_margin')) f('f_margin').value = this.current_attributes.f_margin;
-    f('f_backgroundColor').value = this.current_attributes.f_backgroundColor;
-    f('f_borderColor').value = this.current_attributes.f_borderColor;    
-    if(f('f_hspace')) f('f_hspace').value  = this.current_attributes.f_hspace;
-    if(f('f_vspace')) f('f_vspace').value = this.current_attributes.f_vspace;    
-    f('f_width').value  = this.current_attributes.f_width ? this.current_attributes.f_width : '';
-    f('f_height').value = this.current_attributes.f_height ? this.current_attributes.f_height : '';
-    
-    this.current_attributes = null;
-  }
-  
-  // If no details were supplied, we return the current ones
-  if(!details) 
-  {
-    var details = {
-      f_alt:    f('f_alt').value,
-      f_border: f('f_border').value,
-      f_align:  f('f_align').options[f('f_align').selectedIndex].value,
-      f_padding: f('f_padding').value,
-      f_margin:  f('f_margin') ? f('f_margin').value : null,
-      f_backgroundColor: f('f_backgroundColor').value,
-      f_borderColor: f('f_borderColor').value,
-      f_hspace: f('f_hspace') ? f('f_hspace').value : null,
-      f_vspace: f('f_vspace') ? f('f_vspace').value : null,
-      f_width:  f('f_width').value,
-      f_height: f('f_height').value,
-      
-      table: this._ImageManagerAttributesTable
-    } 
-    return details;
-  }
-  
-  if(details.width && !isNaN(parseInt(details.width)) && parseInt(details.width) > 400)
-  {
-    this._ImageManagerAttributesTable.getElement('.filemanager-img-size-notice').set('html', '<p class="tip" style="margin-top:4px;">This original image is ' + (details.width) + ' pixels wide, you may wish to reduce the size by putting a lesser number in the "Width" field above.  It is not usually desirable to exceed 400 pixels in width on most normal pages.</p>');
-  }
-  else
-  {
-      this._ImageManagerAttributesTable.getElement('.filemanager-img-size-notice').set('text', '');
-  }
-  
-  // If details were supplied, we set the appropriate ones.  
-  if(
-   (   (f('f_width').value  && f('f_width').value  != details.width)   
-    || (f('f_height').value && f('f_height').value != details.height)  )
-   && 
-    (!details.url || !this.current_image || this.current_image.getAttribute('src') != details.url)
-  )
-  {
-    // Check if this is the same image
-    var warn = function() {      
-      new FileManager.Dialog('This image is a different size, would you like to use the new size?', {
-        language: {        
-          confirm: 'Shrink/Grow To Fit',        
-          decline: 'Fullsize'
-        },
-          
-        buttons: [
-          'confirm',
-          'decline'
-        ],
-        
-        onConfirm: function(){
-          if(f('f_constrain').checked)
-          {
-            var new_size = self.ScaleImage(details, {width: f('f_width').value, height: f('f_height').value});
-            
-            f('f_width').value = f('f_width').value   ? new_size.width : '';
-            f('f_height').value = f('f_height').value ? new_size.height : '';
-          }
-        },
-        
-        onDecline: function(){
-          f('f_width').value = '';
-          f('f_height').value = '';
-        }
-      });
-    }
-      
-      if(!details.path) warn();
-      else if(!this.current_image) warn();
-      else
-      {
-          var src  = self.current_image.getAttribute('src');
-          if(!src.match(/^(([a-z]+:)|\/)/i))
-          {
-              src = self.editor.config.baseHref.replace(/\/[^\/]*$/, '') + '/' + src;
-              if(src.match(/^[a-z]+:/i) && !self.phpcfg.images_url.match(/^[a-z]:/i))
-              {
-                src = src.replace(/^[a-z]+:(\/\/?)[^/]*/i, '');
-              }
-          }
-          if(details.path != src) warn();
-      }
-    
-  }
-  
-  f('f_align').style.visibility = ''; // Ensure that the select hasn't been hidden by an overlay and not put back
-  
-  return this._ImageManagerAttributesTable;
-};
-
-/** Handle the "Select" return from the File Manager, inserting or updating an 
- * image as appropriate.  Calles ImageManagerAttributes() with  no arguments
- * to find out the attributes to set.
- */
- 
-MootoolsFileManager.prototype.ImageManagerReturn = function(path, file)
-{
-  
-  var editor = this.editor;
-  var self   = this;
-  var image  = this.current_image;
-  
-  var param = self.ImageManagerAttributes();  
-  param.f_url = path;
-  
-  // IE11 which pretends it is "gecko" is particularly finicky 
-  //  about losing selection other browsers not so much, but they
-  //   don't seem to mind saving and restoring it anyway, so we 
-  //   will do that for everybody
-  if(1||Xinha.is_ie) this.editor.restoreSelection(this.current_selection);
-  var img = image;
-  if (!img) {
-    if (0 && Xinha.is_ie) {  // Maybe IE7 Needs this, 9 seems to be ok, I think 8 too
-      var sel = editor._getSelection();
-      var range = editor._createRange(sel);
-      editor._doc.execCommand("insertimage", false, param.f_url);
-      img = range.parentElement();
-            
-      // wonder if this works...
-      if (img.tagName.toLowerCase() != "img") {
-        img = img.previousSibling;
-      }
-    } else {
-      img = document.createElement('img');
-      img.src = param.f_url;
-      editor.insertNodeAtSelection(img);
-    }
-  } else {      
-    img.src = param.f_url;
-  }
-
-  for (field in param) {
-    var value = param[field];
-    // @TODO: Add ability to mfm for this to be possible.
-    switch (field) {
-        case "f_alt"    : img.alt  = value; break;
-        case "f_border" :
-        if(value.length)
-        {           
-          img.style.borderWidth = /[^0-9]/.test(value) ? value :  (parseInt(value) + 'px');
-          if(img.style.borderWidth && !img.style.borderStyle)
-          {
-            img.style.borderStyle = 'solid';
-          }
-        }
-        else
-        {
-          img.style.borderWidth = '';
-          img.style.borderStyle = '';
-        }
-        break;
-        
-        case "f_borderColor": img.style.borderColor = value; break;
-        case "f_backgroundColor": img.style.backgroundColor = value; break;
-          
-        case "f_padding": 
-        {
-          if(value.length)
-          {
-            img.style.padding = /[^0-9]/.test(value) ? value :  (parseInt(value) + 'px'); 
-          }
-          else
-          {
-            img.style.padding = '';
-          }
-        }
-        break;
-        
-        case "f_margin": 
-        {
-          if(value && value.length)
-          {
-            img.style.margin = /[^0-9]/.test(value) ? value :  (parseInt(value) + 'px'); 
-          }
-          else
-          {
-            img.style.margin = '';
-          }
-        }
-        break;
-        
-        case "f_align"  : if(value && value !== true && value !== 'true') { img.align  = value; } else { img.removeAttribute('align'); } break;
-          
-        case "f_width" : 
-        {
-          if(!isNaN(parseInt(value))) { img.width  = parseInt(value); } else { img.removeAttribute('width'); }
-        }
-        break;
-        
-        case "f_height":
-        {
-          if(!isNaN(parseInt(value))) { img.height = parseInt(value); } else { img.removeAttribute('height'); }
-        }
-        break;
-        
-        case "f_hspace" : 
-        {
-          if(!isNaN(parseInt(value))) { img.hspace  = parseInt(value); } else { img.removeAttribute('hspace'); }
-        }
-        break;
-        
-        case "f_vspace" : 
-        {
-          if(!isNaN(parseInt(value))) { img.vspace  = parseInt(value); } else { img.removeAttribute('vspace'); }
-        }
-        break;
-    }
-  }
-};
-
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/MootoolsFileManager/MootoolsFileManager.css b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/MootoolsFileManager/MootoolsFileManager.css
deleted file mode 100644
index 7233fcb..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/MootoolsFileManager/MootoolsFileManager.css
+++ /dev/null
@@ -1,61 +0,0 @@
-.filemanager-container .filemanager { overflow:visible; }
-
-div.filemanager-info-area dt, div.filemanager-preview-area dt { width: 100px; margin-left:5px; }
-div.filemanager-info-area dd, div.filemanager-preview-area dd { width:auto; }
-div.filemanager div.filemanager-preview-content {clear:none; }
-
-div.filemanager-preview-area dt { float:left; }
-div.filemanager-preview-area h2 { display:none; }
-div.filemanager-preview-area img.preview { margin-left:5px; margin-right:5px; margin-top:0px; float:right; clear:right; /*max-width:140px;*/ }
-div.filemanager-preview-area dl { float:left; clear:left; width:auto; }
-div.filemanager-preview div.object { margin-left:15%; margin-right:15%; margin-top:0px; float:right; clear:right; }
-
-div.filemanager td, div.filemanager th, div.filemanager input[type=text] {  
-  line-height: 20px;
-  font-size: 11px;
-}
-
-div.filemanager th
-{
-  font-weight:bold;
-  text-align:left;
-  padding-left:0px;
-}
-
-div.filemanager td.filemanager-f_alt input {width:100%;}
-
-div.filemanager table.filemanager-extended-options { width:550px; margin-left:5px; margin-right:5px; border-collapse:collapse; }
-
-
-table.filemanager-extended-options .buttonColor {
-  width :1em;
-  margin-left: 2px;
-  cursor: default;
-}
-
-table.filemanager-extended-options .buttonColor .chooser, table.filemanager-extended-options .buttonColor .nocolor {
-  height: 0.6em;
-  border: 1px solid;
-  padding: 0px 1em;
-  border-color: ButtonHighlight ButtonShadow ButtonShadow ButtonHighlight;
-}
-
-table.filemanager-extended-options .buttonColor .buttonClick {
-  border-color: ButtonShadow ButtonHighlight ButtonHighlight ButtonShadow;
-}
-table.filemanager-extended-options .buttonColor .buttonColor-hilite {
-  border-color: ButtonShadow ButtonHighlight ButtonHighlight ButtonShadow;
-}
-
-table.filemanager-extended-options .buttonColor .nocolor { padding: 0px; }
-table.filemanager-extended-options .buttonColor .nocolor-hilite { background-color: #fff; color: #f00; }
-
-div.filemanager-uploader-area { clear:both; }
-div.filemanager-preview p.tech_info {
-  clear: both;
-}
-
-div.filemanager-preview p.err_info {
-  clear: both;
-}
-
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/MootoolsFileManager/MootoolsFileManager.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/MootoolsFileManager/MootoolsFileManager.js
deleted file mode 100644
index e11a9b3..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/MootoolsFileManager/MootoolsFileManager.js
+++ /dev/null
@@ -1,262 +0,0 @@
-/**
-  = Mootools File Manager =
-  The MootoolsFileManager plugin allows for the management, selection and 
-  insertion of links to files and inline images to the edited HTML.
-   
-  It requires the use of Mootools.  If you do not use mootools plugins,
-  then mootools is not loaded.  If mootools is already loaded, it will
-  not be reloaded (so if you want to use your own version of Mootools 
-  then load it first).
- 
-  == Usage ==
-  Instruct Xinha to load the MootoolsFileManager plugin (follow the NewbieGuide).
- 
-  Configure the plugin as per the directions in the config.php file.
-   
- * @author $Author$
- * @version $Id$
- * @package MootoolsFileManager
- */
-
-
-MootoolsFileManager._pluginInfo = {
-  name          : "Mootols File Manager",
-  version       : "1.5",
-  developer     : "James Sleeman (Xinha), Christoph Pojer (FileManager)",  
-  license       : "MIT"
-};
-
-// All the configuration is done through PHP, please read config.php to learn how (or if you're in a real 
-// hurry, just edit config.php)
-Xinha.Config.prototype.MootoolsFileManager =
-{
-  'backend'      : Xinha.getPluginDir("MootoolsFileManager") + '/backend.php?__plugin=MootoolsFileManager&',
-  'backend_data' : { }
-};
-
-// In case you want to use your own version of Mootools, you can load it first.
-MootoolsFileManager.AssetLoader = Xinha.loadLibrary('MooTools');
-
-// In case you want to use your own version of FileManager, you can load it first.
-// You better look at the changes we had to do to the standard one though.
-if(typeof FileManager == 'undefined')
-{
-  if(typeof __MFM_ASSETS_DIR__ == 'undefined')
-  {
-    __MFM_ASSETS_DIR__ = Xinha.getPluginDir('MootoolsFileManager')+'/mootools-filemanager/Assets'
-  }
-  
-  if(typeof __MFM_USE_FLASH__ == 'undefined')
-  {
-    // Flash is now disabled by default, there is no good reason to use it
-    // as the NoFlash uploader works exactly the same on modern browsers
-    // (allows multiple file uploads, progress bars and so forth)
-    __MFM_USE_FLASH__ = false;
-    
-    /*
-      __MFM_USE_FLASH__ = Browser.Plugins.Flash.version ? true : false;
-      if(Browser.Platform.mac && Browser.firefox3) __MFM_USE_FLASH__ = false;
-    */
-  }
-  
-  if(typeof __MFM_USE_BACK_BUTTON_NAVIGATION__ == 'undefined')
-  {
-    __MFM_USE_BACK_BUTTON_NAVIGATION__ = false;
-  }
-  
-  // Because dom is probably already ready for us, we can't use the autoinit, we do it manually
-  __MILKBOX_NO_AUTOINIT__ = true;
-  
-  MootoolsFileManager.AssetLoader
-    // These are now loaded by FileManager.js automatically
-    //.loadStyle('mootools-filemanager/Assets/Css/FileManager.css', 'MootoolsFileManager')
-    //.loadStyle('mootools-filemanager/Assets/Css/Additions.css', 'MootoolsFileManager')
-    //.loadScript('mootools-filemanager/Source/Additions.js', 'MootoolsFileManager')        
-    .loadScript('mootools-filemanager/Source/FileManager.js', 'MootoolsFileManager')
-    .loadScript('mootools-filemanager/Language/Language.en.js', 'MootoolsFileManager')
-    .whenReady(function() {
-      window.milkbox =  new Milkbox({
-        centered:false
-      });
-    });
-    
- if(__MFM_USE_FLASH__)
- {
-   MootoolsFileManager.AssetLoader
-     .loadScript('mootools-filemanager/Source/Uploader/Swiff.Uploader.js', 'MootoolsFileManager')
-     .loadScript('mootools-filemanager/Source/Uploader/Fx.ProgressBar.js', 'MootoolsFileManager')
-     .loadScript('mootools-filemanager/Source/Uploader.js', 'MootoolsFileManager');
- }
- else
- {
-   MootoolsFileManager.AssetLoader
-      .loadScript('mootools-filemanager/Source/NoFlash.Uploader.js', 'MootoolsFileManager');
- }    
-}
-MootoolsFileManager.AssetLoader.loadStyle('MootoolsFileManager.css', 'MootoolsFileManager');
-
-function MootoolsFileManager(editor)
-{  
-  this.editor = editor;
-  var self = this;
-  var cfg = editor.config;
-    
-  // Do a callback to the PHP backend and get it to "decode" the configuration for us into a 
-  // javascript object.  
-  
-  // IMPORTANT: we need to do this synchronously to ensure that the buttons are added to the toolbar
-  //  before the toolbar is drawn.
-  
-  var phpcfg = Xinha._posturlcontent(editor.config.MootoolsFileManager.backend+'__function=read-config', editor.config.MootoolsFileManager.backend_data);
-
-  eval ('var f = '+phpcfg+';'); 
-  self.phpcfg = f; 
-  self.hookUpButtons(); 
-    
-  return;  
-};
-
-/** Connect up/insert the appropriate buttons and load in the auxillary files.
- *
- *  The different "modes" of this plugin have been split into several auxilliary files
- *  as it's likely you may not want them all (esp if we add more modes later).
- *
- *  Each mode's "include" is loaded as soon as we know it could be needed by the
- *  editor, we don't wait until the button is pressed as that would be slow for
- *  the user to respond.
- * 
- */
- 
-MootoolsFileManager.prototype.hookUpButtons = function() 
-{
-  var self = this;  
-  var phpcfg = self.phpcfg;    
-  
-  if (phpcfg.files_dir) 
-  {
-    MootoolsFileManager.AssetLoader.loadScript('MootoolsFileManager.FileManager.js', 'MootoolsFileManager');
-    
-    this.editor.config.registerButton({
-        id        : "linkfile",
-        tooltip   : Xinha._lc("Insert File Link",'MootoolsFileManager'),
-        image     : Xinha.getPluginDir('MootoolsFileManager') + '/img/ed_linkfile.gif',
-        textMode  : false,
-        action    : function(editor) { MootoolsFileManager.AssetLoader.whenReady(function() { self.OpenFileManager(); }); }
-        });
-        
-    this.editor.config.addToolbarElement("linkfile", "createlink", 1);            
-  };
-  
-  if(phpcfg.images_dir)
-  {     
-    MootoolsFileManager.AssetLoader.loadScript('MootoolsFileManager.ImageManager.js', 'MootoolsFileManager');
-    
-    // Override our Editors insert image button action.  
-    self.editor._insertImage = function(image)
-    {
-      MootoolsFileManager.AssetLoader.whenReady(function() { self.OpenImageManager(image); });
-    }              
-  } 
-};
-
-/** Helper method to scale (an image typically) to a new constraint.
- *
- * @param origdim object { width: 123,height: 456 } The original dimensions.
- * @param newdim  object { width: 456, height: 123 } The new (maximum) dimensions.
- * @param flexside 'width'|'height' (optional) the side which can be "flexible" 
- *   Defaults to the "short" side.
- * @return { width: 789, height: 987 } The scaled dimensions which should be used. 
- */
- 
-MootoolsFileManager.prototype.ScaleImage = function( origdim, newdim, flexside )
-{
-  if(!origdim.height || !origdim.width) return newdim; // No old size, stays new.
-  if(!newdim.height && !newdim.width) return origdim; // No new size, stays the same.
-    
-  if(!flexside)
-  {
-    if(origdim.width > origdim.height)
-    {
-      flexside = 'height'; // Landscape image, allow the height to flex.
-    }
-    else
-    {
-      flexside = 'width'; // Portrait image, allow the width to flex
-    }
-  }
-  
-  var knownside = null;
-  switch(flexside)
-  {
-    case 'height': knownside = 'width'; break;
-    case 'width' : knownside = 'height'; break;
-  }
-  
-  // If we DON'T know the known side, we need to flip it.
-  if(!newdim[knownside])
-  {
-    var t = knownside;
-    knownside = flexside;
-    flexside = t;
-  }
-  
-  var ratio = 0;
-  switch(flexside)
-  {
-    case 'width':  ratio = origdim.width / origdim.height; break;
-    case 'height': ratio = origdim.height / origdim.width; break;
-  }
-  
-  var rdim = {};
-  rdim[knownside] = newdim[knownside];
-  rdim[flexside]  = Math.floor(newdim[knownside] * ratio);
-  if(isNaN(rdim[knownside])) rdim[knownside] = null;
-  if(isNaN(rdim[flexside]))  rdim[flexside]  = null;
-  return rdim;
-}
-
-/** Take a multi-part CSS size specification (eg sizes for 4 borders) and 
- * shrink it into one if possible.
- */
- 
-MootoolsFileManager.prototype.shortSize = function(cssSize)
-{
-  if(/ /.test(cssSize))
-  {
-    var sizes = cssSize.split(' ');
-    var useFirstSize = true;
-    for(var i = 1; i < sizes.length; i++)
-    {
-      if(sizes[0] != sizes[i])
-      {
-        useFirstSize = false;
-        break;
-      }
-    }
-    if(useFirstSize) cssSize = sizes[0];
-  }
-  return cssSize;
-};
-
-/** Take a colour in rgb(a,b) format and convert to HEX
- * handles multiple colours in same string as well.
- */
- 
-MootoolsFileManager.prototype.convertToHex = function(color) 
-{
-  if (typeof color == "string" && /, /.test.color)
-  color = color.replace(/, /, ','); // rgb(a, b) => rgb(a,b)
-
-  if (typeof color == "string" && / /.test.color) { // multiple values
-    var colors = color.split(' ');
-    var colorstring = '';
-    for (var i = 0; i < colors.length; i++) {
-      colorstring += Xinha._colorToRgb(colors[i]);
-      if (i + 1 < colors.length)
-      colorstring += " ";
-    }
-    return colorstring;
-  }
-
-  return Xinha._colorToRgb(color);
-}
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/MootoolsFileManager/README.DEVELOPERS b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/MootoolsFileManager/README.DEVELOPERS
deleted file mode 100644
index 72475a4..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/MootoolsFileManager/README.DEVELOPERS
+++ /dev/null
@@ -1,5 +0,0 @@
-The mootools-filemanager directory contains a version of mootools-filemanager as extracted from the following git repository
-
-https://github.com/sleemanj/mootools-filemanager/
-
-it has been stripped of unnecessary code including the "GetID3" library as this is GPL licenced rather than MIT, no code changes are necessary from the git above, just stuff deleted.
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/MootoolsFileManager/XinhaFileManager.php b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/MootoolsFileManager/XinhaFileManager.php
deleted file mode 100644
index d42ebee..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/MootoolsFileManager/XinhaFileManager.php
+++ /dev/null
@@ -1,69 +0,0 @@
-<?php

-/*

- * Script: XinhaFileManager.php

- *   MooTools FileManager - Backend for the Xinha editor

- *

- *   Derived class which includes special tweaks to make MFM work with Xinha.

- *

- * Note: derive from FileManagerWithAlias instead when you need aliasing support; this is left as an exercise

- *       for the reader. (A non-trivial exercise. You'll need to alias images_dir to images_url

- *	     and files_dir to files_url, at least.

- *

- * Authors:

- *  - Ger Hobbelt (http://hebbut.net)

- *

- * License:

- *   MIT-style license.

- *

- * Copyright:

- *   Copyright (c) 2011 [Ger Hobbelt](http://hobbelt.com)

- *

- * Dependencies:

- *   - FileManager.php

- */

-

-require_once(str_replace('\\', '/', dirname(__FILE__)) . '/mootools-filemanager/Assets/Connector/FileManagerWithAliasSupport.php');

-

-

-class XinhaFileManager extends FileManagerWithAliasSupport

-{

-	public function __construct($options)

-	{

-    if(isset($options['images_dir']) && isset($options['images_url']))

-    {

-      $options['Aliases'][$options['images_url']] = $options['images_dir'];

-      $options['directory'] = $options['images_url'];

-    }

-    

-    if(isset($options['files_dir']) && isset($options['files_url']))

-    {

-      $options['Aliases'][$options['files_url']] = $options['files_dir'];

-      $options['directory'] = $options['files_url'];

-    }

-    

-    if(isset($options['thumbs_dir']) && isset($options['thumbs_url']))

-    {

-      $options['Aliases'][$options['thumbs_url']] = $options['thumbs_dir'];

-      $options['thumbnailPath'] = $options['thumbs_url'];

-    }

-    

-    if(isset($options['suggestedMaxImageDimension']))

-    {

-      $options['maxImageDimension'] = $options['suggestedMaxImageDimension'];

-    }

-        

-		parent::__construct($options);

-	}

-

-	// when you want img.preview style max-width = 164px (was before: max-width: 140px)

-	// 

-	// Note that this will force all 250px thumbnails to a maximum width of 140px

-	/*

-	public function getThumb($meta, $path, $width, $height, $onlyIfExistsInCache = false)

-	{

-		return parent::getThumb($meta, $path, min(164, $width), $height, $onlyIfExistsInCache);

-	}

-	*/

-}

-

-

diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/MootoolsFileManager/backend.php b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/MootoolsFileManager/backend.php
deleted file mode 100644
index f451dce..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/MootoolsFileManager/backend.php
+++ /dev/null
@@ -1,180 +0,0 @@
-<?php 
-/**
-* Unified backend for ImageManager 
-*
-* Image Manager was originally developed by:
-*   Xiang Wei Zhuo, email: xiangweizhuo(at)hotmail.com Wei Shou.
-*
-* Unified backend sponsored by DTLink Software, http://www.dtlink.com
-* Implementation by Yermo Lamers, http://www.formvista.com
-*
-* (c) DTLink, LLC 2005.
-* Distributed under the same terms as HTMLArea itself.
-* This notice MUST stay intact for use (see license.txt).
-*
-* DESCRIPTION:
-*
-* Instead of using separate URL's for each function, ImageManager now
-* routes all requests to the server through this single, replaceable,
-* entry point. backend.php expects at least two URL variable parameters: 
-*
-* __plugin=ImageManager   for future expansion; identify the plugin being requested.
-* __function=thumbs|images|editorFrame|editor|manager  function being called.
-*
-* Having a single entry point that strictly adheres to a defined interface will 
-* make the backend code much easier to maintain and expand. It will make it easier
-* on integrators, not to mention it'll make it easier to have separate 
-* implementations of the backend in different languages (Perl, Python, ASP, etc.) 
-*
-* @see config.inc.php
-*/
-
-// Strip slashes if MQGPC is on
-if(function_exists('set_magic_quotes_runtime')) @set_magic_quotes_runtime(0);
-if(function_exists('get_magic_quotes_gpc') && @get_magic_quotes_gpc())
-{
-  $to_clean = array(&$_GET, &$_POST, &$_REQUEST, &$_COOKIE);
-  while(count($to_clean))
-  {
-    $cleaning =& $to_clean[array_pop($junk = array_keys($to_clean))];
-    unset($to_clean[array_pop($junk = array_keys($to_clean))]);
-    foreach(array_keys($cleaning) as $k)
-    {
-      if(is_array($cleaning[$k]))
-      {
-        $to_clean[] =& $cleaning[$k];
-      }
-      else
-      {
-        $cleaning[$k] = stripslashes($cleaning[$k]);
-      }
-    }
-  }
-}
-
-if(isset($_POST['encoded_data']))
-{
-  $D = json_decode(str_rot13($_POST['encoded_data']));
-  foreach($D as $k => $v) { $_POST[$k]=$v; if(!isset($_REQUEST[$k])) $_REQUEST[$k] = $v; }
-}
-
-function size_to_bytes($s)
-{
-  if(preg_match('/([0-9\.])+([a-zA-Z]+)/', $s, $M))
-  {
-    switch(strtolower($M[2]))
-    {      
-      case 'm':
-        return floor(floatval($M[1]) * 1024 * 1024);
-        
-      case 'b':
-        return intval($M[1]);
-        
-      case 'kb':
-        return floor(floatval($M[1]) * 1024);      
-    }
-  }
-  
-  if(floatval($s) < 10)   return floor(floatval($s) * 1024 * 1024); 
-  if(floatval($s) < 1024) return floor(floatval($s) * 1024); // Kilobytes
-  return intval($s); // Bytes
-}
-
-define('I_KNOW_ABOUT_SUHOSIN', TRUE); // /contrib/xinha-php.js does it's best to avoid this problem for us
-require_once('config.php');
-
-// Ensure thumbnail path is OK
-if(!isset($IMConfig['files_dir']) && !isset($IMConfig['images_dir']))
-{
-  unset($IMConfig['thumbs_dir']);
-  unset($IMConfig['thumbs_url']);
-}
-else
-{ 
-  if(!file_exists($IMConfig['thumbs_dir'])) @mkdir($IMConfig['thumbs_dir']);
-}
-
-switch ( @$_REQUEST[ "__function" ] )
-{
-  case 'read-config':        
-    // This is used so that the javascript can read the config 
-    // so we don't have to have a js config and a php config duplicating
-    // settings
-    echo xinha_to_js($IMConfig);
-    break;
-
-  case 'image-manager':
-    if(!@$IMConfig['images_dir'])
-    {
-      // Session time out
-      echo '{"status" : 0, "error": "No images_dir, most likely your session has timed out, or the file upload was too large for this server to handle, try refreshing your browser, or uploading a smaller file if it still does not work.", "data": ' . json_encode($_REQUEST).'}';exit;
-    }
-    
-    // include('mootools-filemanager/Assets/Connector/FileManager.php');
-    include('XinhaFileManager.php');
-    
-    $browser = new XinhaFileManager(array(
-      'images_dir'    => $IMConfig['images_dir'],
-      'images_url'    => $IMConfig['images_url'],
-      
-      'thumbs_dir'    => $IMConfig['thumbs_dir'],
-      'thumbs_url'    => $IMConfig['thumbs_url'],
-      
-      'assetBasePath' => $IMConfig['base_url'] .'/mootools-filemanager/Assets',
-      
-      'upload'        => $IMConfig['images_allow_upload'],
-      'destroy'       => $IMConfig['images_allow_delete'],      
-      'create'        => $IMConfig['images_allow_create_dir'],
-      'move'          => $IMConfig['images_allow_move'],
-      'download'      => $IMConfig['images_allow_download'],
-      
-      
-      'maxUploadSize' => size_to_bytes($IMConfig['images_max_upload_size']),      
-      'suggestedMaxImageDimension' => $IMConfig['images_suggested_image_dimension'],
-      'thumbnailsMustGoThroughBackend' => FALSE,          
-      'filter'        => 'image/',          
-      
-      'thumbBigSize'  => 150,
-    ));
-
-    $browser->fireEvent(!empty($_REQUEST['event']) ? $_REQUEST['event'] : null);
-    break;
-  
-  case 'file-manager':
-    if(!@$IMConfig['files_dir'])
-    {
-      // Session time out
-      echo '{"status" : 0, "error": "No files_dir, most likely your session has timed out."}';exit;
-    }
-    
-    include('XinhaFileManager.php');
-    
-    $browser = new XinhaFileManager(array(
-      'files_dir'     => $IMConfig['files_dir'],
-      'files_url'     => $IMConfig['files_url'],
-      
-      'thumbs_dir'    => $IMConfig['thumbs_dir'],
-      'thumbs_url'    => $IMConfig['thumbs_url'],
-      
-      'assetBasePath' => $IMConfig['base_url'] .'/mootools-filemanager/Assets',
-      
-      'upload'        => $IMConfig['files_allow_upload'],
-      'destroy'       => $IMConfig['files_allow_delete'],
-      'create'        => $IMConfig['files_allow_create_dir'],
-      'move'          => $IMConfig['files_allow_move'],
-      'download'      => $IMConfig['files_allow_download'],
-      
-      
-      'maxUploadSize' => size_to_bytes($IMConfig['files_max_upload_size']),      
-      'suggestedMaxImageDimension' => $IMConfig['files_suggested_image_dimension'],
-      'thumbnailsMustGoThroughBackend' => FALSE,      
-     // 'filter'        => $IMConfig['files_filter'],
-      'thumbBigSize'  => 150,
-      'useGetID3IfAvailable' => false,
-    ));
-
-    $browser->fireEvent(!empty($_REQUEST['event']) ? $_REQUEST['event'] : null);
-    break;
-}
-
-?>
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/MootoolsFileManager/config.php b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/MootoolsFileManager/config.php
deleted file mode 100644
index 43dddbc..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/MootoolsFileManager/config.php
+++ /dev/null
@@ -1,247 +0,0 @@
-<?php
-  /**
-    = MootoolsFileManager Configuration File =
-        
-    Configure either by directly editing the config.php file (not recommended) or
-    as follows...
-
-    1. You need to be able to put PHP in your XinhaConfig.js, so
-      you may want to call it XinhaConfig.php instead, or whatever other
-      method you choose (eg put the config as an inline script in your 
-      main php page).
-      
-    2. In step 3 of your XinhaConfig write something like...
-      {{{
-        with (xinha_config.MootoolsFileManager)
-        { 
-          <?php 
-            require_once('/path/to/xinha/contrib/php-xinha.php');
-            xinha_pass_to_php_backend
-            (       
-              array
-              (
-                'images_dir' => '/home/your/directory',
-                'images_url' => '/directory',
-                'allow_images_upload' => true,
-              )
-            )
-          ?>
-        }
-      }}}
-
-    This will work provided you are using normal file-based PHP sessions
-    (most likely), if not, you may need to modify the php-xinha.php
-    file to suit your setup.
-  
-  * @author $Author$
-  * @version $Id$
-  * @package MootoolsFileManager
-  *
-  */
-
-
-  /**    
-    == File Paths REQUIRED ==
-    
-    This plugin operates (optionally) in two modes.
-    
-    1. As a File Manager where people are inserting a link to a file 
-      (eg a doc or pdf commonly), we call this "files" mode.
-    2. As an Image Manager where people are inserting an inline image,
-      we call this "images" mode.
-    
-    You may provide one of, or both of, files_dir and images_dir.  If you do not 
-    provide one, that mode of MootoolsFileManager will be disabled.
-    
-    # `files_dir` -- Directory path to the location where ordinary files are stored
-                      (eg /home/you/public_html/downloads/ )                   
-    # `files_url` -- The URL path to the files_dir
-                      (eg /downloads/)  
-    # `images_dir` -- Directory path to the location where inline images are stored
-                      (eg /home/you/public_html/images/)
-    # `images_url` -- The URL path to the images_dir
-
-    === Security Caution ===
-
-    You should ensure that the paths you specify are protected against having PHP and
-    other scripts from being executed.  The following .htaccess file is a good idea
-
-    {{{
-      <IfModule mod_php.c>
-        php_flag engine off
-      </IfModule>
-      AddType text/html .html .htm .shtml .php .php3 .php4 .php5 .php6 .php7 .php8 .phtml .phtm .pl .py .cgi
-      RemoveHandler .php
-      RemoveHandler .php8
-      RemoveHandler .php7
-      RemoveHandler .php6
-      RemoveHandler .php5
-      RemoveHandler .php4
-      RemoveHandler .php3
-    }}}
-    
-  */
-
-  $IMConfig['files_dir']  = FALSE; // No trailing slash 
-  $IMConfig['files_url']  = FALSE; // No trailing slash
-
-  $IMConfig['images_dir'] = FALSE; // No trailing slash
-  $IMConfig['images_url'] = FALSE; // No trailing slash
-  
-  $IMConfig['thumbs_dir'] = NULL;  // Will default to images_dir/.thumbs or files_dir/.thumbs
-  $IMConfig['thumbs_url'] = NULL;  // Will default to images_url/.thumbs or files_url/.thumbs
-  /**
-    == Turning On Uploads ==
-    We have two sets of settings for turning on uploads, one controls the files mode
-    of the plugin, the other is for images mode.
-
-    Note that allowing upload also permits the user to create subdirectories to better
-    organise the files.
-    
-    === Maximum File Sizes ===
-
-    Each mode can have a different maximum file size that can be uploaded, this
-    size is a number followed by one of M, KB or B.
-
-    === Suggested Image Dimensions ===
-
-    Each mode can have a different "suggested maximum image dimension", when the
-    user uses the Mootools File Manager to upload a file, they are able to choose
-    to "resize large images" on upload.  This defines what "large" means.
-  
-  */
-
-  $IMConfig['files_allow_upload']     = false;
-  $IMConfig['files_allow_delete']     = false;
-  $IMConfig['files_max_upload_size']  = '3M';
-  $IMConfig['files_suggested_image_dimension']  = array('width' => 2048, 'height' => 1536);
-
-  $IMConfig['images_allow_upload']     = false;
-  $IMConfig['images_allow_delete']     = false;
-  $IMConfig['images_max_upload_size']  = '3M';
-  $IMConfig['images_suggested_image_dimension']  = $IMConfig['files_suggested_image_dimension'];
-
-
-// -------------------------------------------------------------------------
-//                OPTIONAL SETTINGS 
-// -------------------------------------------------------------------------
-
-/** Expanded Permissions */
-
-$IMConfig['images_allow_create_dir']  = NULL;  // Defaults to allow_images_upload
-$IMConfig['images_allow_move']        = false; 
-$IMConfig['images_allow_download']    = false; 
-  
-$IMConfig['files_allow_create_dir']  = NULL; // Defaults to allow_files_upload
-$IMConfig['files_allow_move']        = false; 
-$IMConfig['files_allow_download']    = false; 
-  
-/** Listing Mode Configuration */
-
-$IMConfig['images_list_type']        = 'list'; // Or 'thumb'
-$IMConfig['images_pagination_size']  = 10000;  // By default, a large number to avoid pagination strongly
-                                               // The MFM may reduce this automatically however.                                               
-$IMConfig['images_list_mode_over']   = 30;     // If a folder contains more than this many entries
-                                               // it will fall back to 'list' mode when in 'thumb' mode
-                                               // the user can switch back to 'thumb' if they want.
-$IMConfig['images_list_start_in']    = NULL;   // You can set this to a path relative to the images_dir
-
-
-$IMConfig['files_list_type']        = 'list';  // Or 'thumb'
-$IMConfig['files_pagination_size']  = 10000;   // By default, a large number to avoid pagination strongly
-                                               // The MFM may reduce this automatically however.                                               
-$IMConfig['files_list_mode_over']   = 30;      // If a folder contains more than this many entries
-                                               // it will fall back to 'list' mode when in 'thumb' mode
-                                               // the user can switch back to 'thumb' if they want.
-$IMConfig['files_list_start_in']    = NULL;    // You can set this to a path relative to the images_dir
-                                               
-/**
-
-== Plugin Path ==
- 
- For most people the defaults will work fine, but if you have trouble, you can set
- `base_dir` to be the directory path to xinha/plugins/MootoolsFileManager
- `base_url` to be the url path to xinha/plugins/MootoolsFileManager
-*/
-
-$IMConfig['base_dir'] = getcwd();
-$IMConfig['base_url'] = preg_replace('/\/backend\.php.*/', '', $_SERVER['REQUEST_URI']);
-
-/**
-
-== HTML Compatability ==
-
- If the HTML you are editing in Xinha is destined for an email you will probably want to use hspace and vspace instead of CSS margins because of poor Email support for CSS.
- 
-*/
-
-$IMConfig['images_use_hspace_vspace'] = TRUE;
-
-////////////////////////////////////////////////////////////////////////////////
-//       ================== END OF CONFIGURATION =======================      //
-////////////////////////////////////////////////////////////////////////////////
-
-// Standard PHP Backend Data Passing
-//  if data was passed using xinha_pass_to_php_backend() we merge the items
-//  provided into the Config
-require_once(realpath(dirname(__FILE__) . '/../../contrib/php-xinha.php'));
-
-if($passed_data = xinha_read_passed_data())
-{
-  $IMConfig = array_merge($IMConfig, $passed_data);
-}
-
-// Back Compat, Some of our config options have been renamed, 
-// if the old name is present, that takes precendence.
-$RenamedConfigVars = array(
-  'UseHSpaceVSpace'        => 'images_use_hspace_vspace',
-  
-  'allow_files_upload'     => 'files_allow_upload',
-  'allow_files_delete'     => 'files_allow_delete',
-  'allow_files_create_dir' => 'files_allow_create_dir',
-  'allow_files_move'       => 'files_allow_move',
-  'allow_files_download'   => 'files_allow_download',
-  
-  'max_files_upload_size'   => 'files_max_upload_size',
-  'suggested_files_image_dimension' => 'files_suggested_image_dimension',
-  
-  'allow_images_upload'     => 'images_allow_upload',
-  'allow_images_delete'     => 'images_allow_delete',
-  'allow_images_create_dir' => 'images_allow_create_dir',
-  'allow_images_move'       => 'images_allow_move',
-  'allow_images_download'   => 'images_allow_download',
-  
-  'max_images_upload_size'  => 'images_max_upload_size',
-  'suggested_images_image_dimension' => 'images_suggested_image_dimension',  
-);
-
-foreach($RenamedConfigVars as $Old => $New)
-{
-  if(isset($IMConfig[$Old]))
-  {
-    $New = $IMConfig[$Old];
-    unset($IMConfig[$Old]);    
-  }
-}
-
-if(!isset($IMConfig['thumbs_dir']))
-{
-  $IMConfig['thumbs_dir'] = (isset($IMConfig['images_dir']) ? $IMConfig['images_dir'] : $IMConfig['files_dir']) . '/.thumbs';
-}
-
-if(!isset($IMConfig['thumbs_url']))
-{
-  $IMConfig['thumbs_url'] = (isset($IMConfig['images_url']) ? $IMConfig['images_url'] : $IMConfig['files_url']) . '/.thumbs';
-}
-
-if(!isset($IMConfig['images_allow_create_dir'])) 
-{
-  $IMConfig['images_allow_create_dir'] = $IMConfig['images_allow_upload'];
-}
-
-if(!isset($IMConfig['files_allow_create_dir'])) 
-{
-  $IMConfig['files_allow_create_dir'] = $IMConfig['files_allow_upload'];
-}
-
-?>
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/MootoolsFileManager/img/ed_linkfile.gif b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/MootoolsFileManager/img/ed_linkfile.gif
deleted file mode 100644
index 38ac232..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/MootoolsFileManager/img/ed_linkfile.gif
+++ /dev/null
Binary files differ
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/MootoolsFileManager/img/locked.gif b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/MootoolsFileManager/img/locked.gif
deleted file mode 100644
index 9247238..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/MootoolsFileManager/img/locked.gif
+++ /dev/null
Binary files differ
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/MootoolsFileManager/lang/da.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/MootoolsFileManager/lang/da.js
deleted file mode 100644
index 8060aac..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/MootoolsFileManager/lang/da.js
+++ /dev/null
@@ -1,14 +0,0 @@
-// I18N constants
-// LANG: "da", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Insert File Link": "Indsæt fil-link",
-    "You must select some text before making a new link.": "Vælg venligst noget tekst før du laver et nyt link."
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/MootoolsFileManager/lang/de.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/MootoolsFileManager/lang/de.js
deleted file mode 100644
index 5894948..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/MootoolsFileManager/lang/de.js
+++ /dev/null
@@ -1,14 +0,0 @@
-// I18N constants
-// LANG: "de", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Insert File Link": "Dateilink einfügen",
-    "You must select some text before making a new link.": "Sie müssen einen Text markieren um einen Link zu erstellen"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/MootoolsFileManager/lang/fr.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/MootoolsFileManager/lang/fr.js
deleted file mode 100644
index a8d696c..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/MootoolsFileManager/lang/fr.js
+++ /dev/null
@@ -1,14 +0,0 @@
-// I18N constants
-// LANG: "fr", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Insert File Link": "Insérer un lien vers fichier",
-    "You must select some text before making a new link.": "Vous devez sélectionner un texte avant de créer un nouveau lien"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/MootoolsFileManager/lang/ja.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/MootoolsFileManager/lang/ja.js
deleted file mode 100644
index 0ba78e5..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/MootoolsFileManager/lang/ja.js
+++ /dev/null
@@ -1,14 +0,0 @@
-// I18N constants
-// LANG: "ja", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Insert File Link": "ファイルへのリンクを挿入",
-    "You must select some text before making a new link.": "リンクを作成するにはテキストを選択する必要があります"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/MootoolsFileManager/lang/lc_base.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/MootoolsFileManager/lang/lc_base.js
deleted file mode 100644
index 8803922..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/MootoolsFileManager/lang/lc_base.js
+++ /dev/null
@@ -1,26 +0,0 @@
-// I18N constants
-//
-// LANG: "en", ENCODING: UTF-8
-// Author: Translator-Name, <email@example.com>
-//
-// Last revision: 2018-04-12
-// 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).
-//
-// (Please, remove information below)
-// 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.)
-
-{
-    "Insert File Link": "",
-    "You must select some text before making a new link.": ""
-}
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/MootoolsFileManager/lang/nb.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/MootoolsFileManager/lang/nb.js
deleted file mode 100644
index c9b4dab..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/MootoolsFileManager/lang/nb.js
+++ /dev/null
@@ -1,14 +0,0 @@
-// I18N constants
-// LANG: "nb", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Insert File Link": "Sett inn lenke til fil",
-    "You must select some text before making a new link.": "Du må markere tekst eller et bilde før du kan lage en lenke."
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/MootoolsFileManager/lang/nl.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/MootoolsFileManager/lang/nl.js
deleted file mode 100644
index 1110b0a..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/MootoolsFileManager/lang/nl.js
+++ /dev/null
@@ -1,14 +0,0 @@
-// I18N constants
-// LANG: "nl", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Insert File Link": "Hypelink van bestandinvoegen",
-    "You must select some text before making a new link.": "Selecteer de tekst welke gelinkt moet worden."
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/MootoolsFileManager/lang/pl.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/MootoolsFileManager/lang/pl.js
deleted file mode 100644
index 7952276..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/MootoolsFileManager/lang/pl.js
+++ /dev/null
@@ -1,14 +0,0 @@
-// I18N constants
-// LANG: "pl", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Insert File Link": "Wstaw odnośnik do pliku na serwerze",
-    "You must select some text before making a new link.": "Zaznacz tekst przed dodaniem odnośnika."
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/MootoolsFileManager/lang/pt_br.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/MootoolsFileManager/lang/pt_br.js
deleted file mode 100644
index 2d2295f..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/MootoolsFileManager/lang/pt_br.js
+++ /dev/null
@@ -1,14 +0,0 @@
-// I18N constants
-// LANG: "pt_br", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Insert File Link": "Inserir Link de Arquivo",
-    "You must select some text before making a new link.": "Você precisa selecionar algum texto antes de criar um novo link."
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/MootoolsFileManager/mootools-filemanager/Assets/Connector/FileManager.php b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/MootoolsFileManager/mootools-filemanager/Assets/Connector/FileManager.php
deleted file mode 100755
index 9eb40d3..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/MootoolsFileManager/mootools-filemanager/Assets/Connector/FileManager.php
+++ /dev/null
@@ -1,5462 +0,0 @@
-<?php
-/*
- * Script: FileManager.php
- *   MooTools FileManager - Backend for the FileManager Script
- *
- * Authors:
- *  - Christoph Pojer (http://cpojer.net) (author)
- *  - James Ehly (http://www.devtrench.com)
- *  - Fabian Vogelsteller (http://frozeman.de)
- *  - Ger Hobbelt (http://hebbut.net)
- *  - James Sleeman (http://code.gogo.co.nz)
- *
- * License:
- *   MIT-style license.
- *
- * Copyright:
- *   Copyright (c) 2009-2011 [Christoph Pojer](http://cpojer.net)
- *   Backend: FileManager & FileManagerWithAliasSupport Copyright (c) 2011 [Ger Hobbelt](http://hobbelt.com)
- *
- * Dependencies:
- *   - Tooling.php
- *   - Image.class.php
- *   - getId3 Library
- *
- * Options:
- *   - directory: (string) The URI base directory to be used for the FileManager ('URI path' i.e. an absolute path here would be rooted at DocumentRoot: '/' == DocumentRoot)
- *   - assetBasePath: (string, optional) The URI path to all images and swf files used by the filemanager
- *   - thumbnailPath: (string) The URI path where the thumbnails of the pictures will be saved
- *   - thumbSmallSize: (integer) The (maximum) width / height in pixels of the thumb48 'small' thumbnails produced by this backend
- *   - thumbBigSize: (integer) The (maximum) width / height in pixels of the thumb250 'big' thumbnails produced by this backend
- *   - mimeTypesPath: (string, optional) The filesystem path to the MimeTypes.ini file. May exist in a place outside the DocumentRoot tree.
- *   - dateFormat: (string, defaults to *j M Y - H:i*) The format in which dates should be displayed
- *   - maxUploadSize: (integer, defaults to *20280000* bytes) The maximum file size for upload in bytes
- *   - maxImageDimension: (array, defaults to *array('width' => 1024, 'height' => 768)*) The maximum number of pixels in height and width an image can have, if the user enables "resize on upload".
- *   - upload: (boolean, defaults to *false*) allow uploads, this is also set in the FileManager.js (this here is only for security protection when uploads should be deactivated)
- *   - destroy: (boolean, defaults to *false*) allow files to get deleted, this is also set in the FileManager.js (this here is only for security protection when file/directory delete operations should be deactivated)
- *   - create: (boolean, defaults to *false*) allow creating new subdirectories, this is also set in the FileManager.js (this here is only for security protection when dir creates should be deactivated)
- *   - move: (boolean, defaults to *false*) allow file and directory move/rename and copy, this is also set in the FileManager.js (this here is only for security protection when rename/move/copy should be deactivated)
- *   - download: (boolean, defaults to *false*) allow downloads, this is also set in the FileManager.js (this here is only for security protection when downloads should be deactivated)
- *   - allowExtChange: (boolean, defaults to *false*) allow the file extension to be changed when performing a rename operation.
- *   - safe: (boolean, defaults to *true*) If true, disallows 'exe', 'dll', 'php', 'php3', 'php4', 'php5', 'phps' and saves them as 'txt' instead.
- *   - chmod: (integer, default is 0777) the permissions set to the uploaded files and created thumbnails (must have a leading "0", e.g. 0777)
- *   - filter: (string, defaults to *null*) If not empty, this is a list of allowed mimetypes (overruled by the GET request 'filter' parameter: single requests can thus overrule the common setup in the constructor for this option)
- *   - showHiddenFoldersAndFiles: (boolean, defaults to *false*) whether or not to show 'dotted' directories and files -- such files are considered 'hidden' on UNIX file systems
- *   - ViewIsAuthorized_cb (function/reference, default is *null*) authentication + authorization callback which can be used to determine whether the given directory may be viewed.
- *     The parameter $action = 'view'.
- *   - DetailIsAuthorized_cb (function/reference, default is *null*) authentication + authorization callback which can be used to determine whether the given file may be inspected (and the details listed).
- *     The parameter $action = 'detail'.
- *   - UploadIsAuthorized_cb (function/reference, default is *null*) authentication + authorization callback which can be used to determine whether the given file may be uploaded.
- *     The parameter $action = 'upload'.
- *   - DownloadIsAuthorized_cb (function/reference, default is *null*) authentication + authorization callback which can be used to determine whether the given file may be downloaded.
- *     The parameter $action = 'download'.
- *   - CreateIsAuthorized_cb (function/reference, default is *null*) authentication + authorization callback which can be used to determine whether the given subdirectory may be created.
- *     The parameter $action = 'create'.
- *   - DestroyIsAuthorized_cb (function/reference, default is *null*) authentication + authorization callback which can be used to determine whether the given file / subdirectory tree may be deleted.
- *     The parameter $action = 'destroy'.
- *   - MoveIsAuthorized_cb (function/reference, default is *null*) authentication + authorization callback which can be used to determine whether the given file / subdirectory may be renamed, moved or copied.
- *     Note that currently support for copying subdirectories is missing.
- *     The parameter $action = 'move'.
- *     UploadIsComplete_cb (function/reference, default is *null*) Upload complete callback which can be used to post process a newly upload file.
- *     The parameter $action = 'upload'.
- *     DownloadIsComplete_cb (function/reference, default is *null*) Download complete callback which can be used to post process after a file has been downloaded file.
- *     The parameter $action = 'download'.
- *     DestroyIsComplete_cb (function/reference, default is *null*) Destroy complete callback which can be used to cleanup after a newly deleted/destroyed file.
- *     The parameter $action = 'destroy'.
- *
- * Obsoleted options:
- *   - maxImageSize: (integer, default is 1024) The maximum number of pixels in both height and width an image can have, if the user enables "resize on upload". (This option is obsoleted by the 'suggestedMaxImageDimension' option.)
- *
- *
- * About the action permissions (upload|destroy|create|move|download):
- *
- *     All the option "permissions" are set to FALSE by default. Developers should always SPECIFICALLY enable a permission to have that permission, for two reasons:
- *
- *     1. Developers forget to disable permissions, they don't forget to enable them (because things don't work!)
- *
- *     2. Having open permissions by default leaves potential for security vulnerabilities where those open permissions are exploited.
- *
- *
- * For all authorization hooks (callback functions) the following applies:
- *
- *     The callback should return TRUE for yes (permission granted), FALSE for no (permission denied).
- *     Parameters sent to the callback are:
- *       ($this, $action, $fileinfo)
- *     where $fileinfo is an array containing info about the file being uploaded, $action is a (string) identifying the current operation, $this is a reference to this FileManager instance.
- *     $action was included as a redundant parameter to each callback as a simple means to allow users to hook a single callback function to all the authorization hooks, without the need to create a wrapper function for each.
- *
- *     For more info about the hook parameter $fileinfo contents and a basic implementation, see further below (section 'Hooks: Detailed Interface Specification') and the examples in
- *     Demos/FM-common.php, Demos/manager.php and Demos/selectImage.php
- *
- *
- * Notes on relative paths and safety / security:
- *
- *   If any option is specifying a relative path, e.g. '../Assets' or 'Media/Stuff/', this is assumed to be relative to the request URI path,
- *   i.e. dirname($_SERVER['SCRIPT_NAME']).
- *
- *   Requests may post/submit relative paths as arguments to their FileManager events/actions in $_GET/$_POST, and those relative paths will be
- *   regarded as relative to the request URI handling script path, i.e. dirname($_SERVER['SCRIPT_NAME']) to make the most
- *   sense from bother server and client coding perspective.
- *
- *
- *   We also assume that any of the paths may be specified from the outside, so each path is processed and filtered to prevent malicious intent
- *   from succeeding. (An example of such would be an attacker posting his own 'destroy' event request requesting the destruction of
- *   '../../../../../../../../../etc/passwd' for example. In more complex rigs, the attack may be assisted through attacks at these options' paths,
- *   so these are subjected to the same scrutiny in here.)
- *
- *   All paths, absolute or relative, as passed to the event handlers (see the onXXX methods of this class) are ENFORCED TO ABIDE THE RULE
- *   'every path resides within the options['directory'] a.k.a. BASEDIR rooted tree' without exception.
- *   Because we can do without exceptions to important rules. ;-)
- *
- *   When paths apparently don't, they are coerced into adherence to this rule; when this fails, an exception is thrown internally and an error
- *   will be reported and the action temrinated.
- *
- *  'LEGAL URL paths':
- *
- *   Paths which adhere to the aforementioned rule are so-called LEGAL URL paths; their 'root' equals BASEDIR.
- *
- *   BASEDIR equals the path pointed at by the options['directory'] setting. It is therefore imperative that you ensure this value is
- *   correctly set up; worst case, this setting will equal DocumentRoot.
- *   In other words: you'll never be able to reach any file or directory outside this site's DocumentRoot directory tree, ever.
- *
- *
- *  Path transformations:
- *
- *   To allow arbitrary directory/path mapping algorithms to be applied (e.g. when implementing Alias support such as available in the
- *   derived class FileManagerWithAliasSupport), all paths are, on every change/edit, transformed from their LEGAL URL representation to
- *   their 'absolute URI path' (which is suitable to be used in links and references in HTML output) and 'absolute physical filesystem path'
- *   equivalents.
- *   By enforcing such a unidirectional transformation we implicitly support non-reversible and hard-to-reverse path aliasing mechanisms,
- *   e.g. complex regex+context based path manipulations in the server.
- *
- *
- *   When you need your paths to be restricted to the bounds of the options['directory'] tree (which is a subtree of the DocumentRoot based
- *   tree), you may wish to use the 'legal' class of path transformation member functions:
- *
- *   - legal2abs_url_path()
- *   - rel2abs_legal_url_path()
- *   - legal_url_path2file_path()
- *
- *   When you have a 'absolute URI path' or a path relative in URI space (implicitly relative to dirname($_SERVER['SCRIPT_NAME']) ), you can
- *   transform such a path to either a guaranteed-absolute URI space path or a filesystem path:
- *
- *   - rel2abs_url_path()
- *   - url_path2file_path()
- *
- *   Any other path transformations are ILLEGAL and DANGEROUS. The only other possibly legal transformation is from absolute URI path to
- *   BASEDIR-based LEGAL URL path, as the URI path space is assumed to be linear and contiguous. However, this operation is HIGHLY discouraged
- *   as it is a very strong indicator of other faulty logic, so we do NOT offer a method for this.
- *
- *
- * Hooks: Detailed Interface Specification:
- *
- *   All 'authorization' callback hooks share a common interface specification (function parameter set). This is by design, so one callback
- *   function can be used to process any and all of these events:
- *
- *   Function prototype:
- *
- *       function CallbackFunction($mgr, $action, &$info)
- *
- *   where
- *
- *       $msg:      (object) reference to the current FileManager class instance. Can be used to invoke public FileManager methods inside
- *                  the callback.
- *
- *       $action:   (string) identifies the event being processed. Can be one of these:
- *
- *                  'create'          create new directory
- *                  'move'            move or copy a file or directory
- *                  'destroy'         delete a file or directory
- *                  'upload'          upload a single file (when performing a bulk upload, each file will be uploaded individually)
- *                  'download'        download a file
- *                  'view'            show a directory listing (in either 'list' or 'thumb' mode)
- *                  'detail'          show detailed information about the file and, whn possible, provide a link to a (largish) thumbnail
- *
- *       $info      (array) carries all the details. Some of which can even be manipulated if your callbac is more than just an
- *                  authentication / authorization checker. ;-)
- *                  For more detail, see the next major section.
- *
- *   The callback should return a boolean, where TRUE means the session/client is authorized to execute the action, while FALSE
- *   will cause the backend to report an authentication error and abort the action.
- *
- *  Exceptions throwing from the callback:
- *
- *   Note that you may choose to throw exceptions from inside the callback; those will be caught and transformed to proper error reports.
- *
- *   You may either throw any exceptions based on either the FileManagerException or Exception classes. When you format the exception
- *   message as "XYZ:data", where 'XYZ' is a alphanumeric-only word, this will be transformed to a i18n-support string, where
- *   'backend.XYZ' must map to a translation string (e.g. 'backend.nofile', see also the Language/Language.XX.js files) and the optional
- *   'data' tail will be appended to the translated message.
- *
- *
- * $info: the details:
- *
- *   Here is the list of $info members per $action event code:
- *
- *   'upload':
- *
- *           $info[] contains:
- *
- *               'legal_dir_url'         (string) LEGAL URI path to the directory where the file is being uploaded. You may invoke
- *                                           $dir = $mgr->legal_url_path2file_path($legal_dir_url);
- *                                       to obtain the physical filesystem path (also available in the 'dir' $info entry, by the way!), or
- *                                           $dir_url = $mgr->legal2abs_url_path($legal_dir_url);
- *                                       to obtain the absolute URI path for the given directory.
- *
- *               'dir'                   (string) physical filesystem path to the directory where the file is being uploaded.
- *
- *               'raw_filename'          (string) the raw, unprocessed filename of the file being being uploaded, as specified by the client.
- *
- *                                       WARNING: 'raw_filename' may contain anything illegal, such as directory paths instead of just a filename,
- *                                                filesystem-illegal characters and what-not. Use 'name'+'extension' instead if you want to know
- *                                                where the upload will end up.
- *
- *               'filename'              (string) the filename, plus extension, of the file being uploaded; this filename is ensured
- *                                       to be both filesystem-legal, unique and not yet existing in the given directory.
- *
- *                                       Note that the file name extension has already been cleaned, including 'safe' mode processing,
- *                                       i.e. any uploaded binary executable will have been assigned the extension '.txt' already, when
- *                                       FileManager's options['safe'] is enabled.
- *
- *               'tmp_filepath'          (string) filesystem path pointing at the temporary storage location of the uploaded file: you can
- *                                       access the file data available here to optionally validate the uploaded content.
- *
- *               'meta_data'             (array) the content sniffed infor as produced by getID3
- *
- *               'mime'                  (string) the mime type as sniffed from the file
- *
- *               'mime_filter'           (optional, string) mime filter as specified by the client: a comma-separated string containing
- *                                       full or partial mime types, where a 'partial' mime types is the part of a mime type before
- *                                       and including the slash, e.g. 'image/'
- *
- *               'mime_filters'          (optional, array of strings) the set of allowed mime types, derived from the 'mime_filter' setting.
- *
- *               'size'                  (integer) number of bytes of the uploaded file
- *
- *               'maxsize'               (integer) the configured maximum number of bytes for any single upload
- *
- *               'overwrite'             (boolean) FALSE: the uploaded file will not overwrite any existing file, it will fail instead.
- *
- *                                       Set to TRUE (and adjust the 'name' and 'extension' entries as you desire) when you wish to overwrite
- *                                       an existing file.
- *
- *               'resize'                (boolean) TRUE: any uploaded images are resized to the configured maximum dimensions before they
- *                                       are stored on disk.
- *
- *               'chmod'                 (integer) UNIX access rights (default: 0666) for the file-to-be-created (RW for user,group,world).
- *
- *                                       Note that the eXecutable bits have already been stripped before the callback was invoked.
- *
- *               'preliminary_json'      (array) the JSON data collected so far; when ['status']==1, then we're performing a regular upload
- *                                       operation, when the ['status']==0, we are performing a defective upload operation.
- *
- *               'validation_failure'    (string) NULL: no validation error has been detected before the callback was invoked; non-NULL, e.g.
- *                                       "nofile": the string passed as message parameter of the FileManagerException, which will be thrown
- *                                       after the callback has returned. (You may alter the 'validation_failure' string value to change the
- *                                       reported error, or set it to NULL to turn off the validation error report entirely -- we assume you
- *                                       will have corrected the other fileinfo[] items as well, when resetting the validation error.
- *
- *
- *         Note that this request originates from a Macromedia Flash client: hence you'll need to use the
- *         $_POST[session_name()] value to manually set the PHP session_id() before you start your your session
- *         again.
- *
- *         The frontend-specified options.propagateData items will be available as $_POST[] items.
- *
- *         The frontend-specified options.uploadAuthData items will be available as $_POST[] items.
- *
- *
- *  'download':
- *
- *           $info[] contains:
- *
- *               'legal_url'             (string) LEGAL URI path to the file to be downloaded. You may invoke
- *                                           $dir = $mgr->legal_url_path2file_path($legal_url);
- *                                       to obtain the physical filesystem path (also available in the 'file' $info entry, by the way!), or
- *                                           $url = $mgr->legal2abs_url_path($legal_url);
- *                                       to obtain the absolute URI path for the given file.
- *
- *               'file'                  (string) physical filesystem path to the file being downloaded.
- *
- *               'meta_data'             (array) the content sniffed infor as produced by getID3
- *
- *               'mime'                  (string) the mime type as sniffed from the file
- *
- *               'mime_filter'           (optional, string) mime filter as specified by the client: a comma-separated string containing
- *                                       full or partial mime types, where a 'partial' mime types is the part of a mime type before
- *                                       and including the slash, e.g. 'image/'
- *
- *               'mime_filters'          (optional, array of strings) the set of allowed mime types, derived from the 'mime_filter' setting.
- *
- *               'validation_failure'    (string) NULL: no validation error has been detected before the callback was invoked; non-NULL, e.g.
- *                                       "nofile": the string passed as message parameter of the FileManagerException, which will be thrown
- *                                       after the callback has returned. (You may alter the 'validation_failure' string value to change the
- *                                       reported error, or set it to NULL to turn off the validation error report entirely -- we assume you
- *                                       will have corrected the other fileinfo[] items as well, when resetting the validation error.
- *
- *         The frontend-specified options.propagateData items will be available as $_POST[] items.
- *
- *
- *  'create': // create directory
- *
- *           $info[] contains:
- *
- *               'legal_url'             (string) LEGAL URI path to the parent directory of the directory being created. You may invoke
- *                                           $dir = $mgr->legal_url_path2file_path($legal_url);
- *                                       to obtain the physical filesystem path (also available in the 'dir' $info entry, by the way!), or
- *                                           $url = $mgr->legal2abs_url_path($legal_url);
- *                                       to obtain the absolute URI path for this parent directory.
- *
- *               'dir'                   (string) physical filesystem path to the parent directory of the directory being created.
- *
- *               'raw_name'              (string) the name of the directory to be created, as specified by the client (unfiltered!)
- *
- *               'uniq_name'             (string) the name of the directory to be created, filtered and ensured to be both unique and
- *                                       not-yet-existing in the filesystem.
- *
- *               'newdir'                (string) the filesystem absolute path to the directory to be created; identical to:
- *                                           $newdir = $mgr->legal_url_path2file_path($legal_url . $uniq_name);
- *                                       Note the above: all paths are transformed from URI space to physical disk every time a change occurs;
- *                                       this allows us to map even not-existing 'directories' to possibly disparate filesystem locations.
- *
- *               'chmod'                 (integer) UNIX access rights (default: 0777) for the directory-to-be-created (RWX for user,group,world)
- *
- *               'preliminary_json'      (array) the JSON data collected so far; when ['status']==1, then we're performing a regular 'create'
- *                                       operation, when the ['status']==0, we are performing a defective 'create' operation.
- *
- *               'validation_failure'    (string) NULL: no validation error has been detected before the callback was invoked; non-NULL, e.g.
- *                                       "nofile": the string passed as message parameter of the FileManagerException, which will be thrown
- *                                       after the callback has returned. (You may alter the 'validation_failure' string value to change the
- *                                       reported error, or set it to NULL to turn off the validation error report entirely -- we assume you
- *                                       will have corrected the other fileinfo[] items as well, when resetting the validation error.
- *
- *         The frontend-specified options.propagateData items will be available as $_POST[] items.
- *
- *
- *  'destroy':
- *
- *           $info[] contains:
- *
- *               'legal_url'             (string) LEGAL URI path to the file/directory to be deleted. You may invoke
- *                                           $dir = $mgr->legal_url_path2file_path($legal_url);
- *                                       to obtain the physical filesystem path (also available in the 'file' $info entry, by the way!), or
- *                                           $url = $mgr->legal2abs_url_path($legal_url);
- *                                       to obtain the absolute URI path for the given file/directory.
- *
- *               'file'                  (string) physical filesystem path to the file/directory being deleted.
- *
- *               'meta_data'             (array) the content sniffed infor as produced by getID3
- *
- *               'mime'                  (string) the mime type as sniffed from the file / directory (directories are mime type: 'text/directory')
- *
- *               'mime_filter'           (optional, string) mime filter as specified by the client: a comma-separated string containing
- *                                       full or partial mime types, where a 'partial' mime types is the part of a mime type before
- *                                       and including the slash, e.g. 'image/'
- *
- *               'mime_filters'          (optional, array of strings) the set of allowed mime types, derived from the 'mime_filter' setting.
- *
- *                                       Note that the 'mime_filters', if any, are applied to the 'delete' operation in a special way: only
- *                                       files matching one of the mime types in this list will be deleted; anything else will remain intact.
- *                                       This can be used to selectively clean a directory tree.
- *
- *                                       The design idea behind this approach is that you are only allowed what you can see ('view'), so
- *                                       all 'view' restrictions should equally to the 'delete' operation.
- *
- *               'preliminary_json'      (array) the JSON data collected so far; when ['status']==1, then we're performing a regular 'destroy'
- *                                       operation, when the ['status']==0, we are performing a defective 'destroy' operation.
- *
- *               'validation_failure'    (string) NULL: no validation error has been detected before the callback was invoked; non-NULL, e.g.
- *                                       "nofile": the string passed as message parameter of the FileManagerException, which will be thrown
- *                                       after the callback has returned. (You may alter the 'validation_failure' string value to change the
- *                                       reported error, or set it to NULL to turn off the validation error report entirely -- we assume you
- *                                       will have corrected the other fileinfo[] items as well, when resetting the validation error.
- *
- *         The frontend-specified options.propagateData items will be available as $_POST[] items.
- *
- *
- *  'move':  // move or copy!
- *
- *           $info[] contains:
- *
- *               'legal_url'             (string) LEGAL URI path to the source parent directory of the file/directory being moved/copied. You may invoke
- *                                           $dir = $mgr->legal_url_path2file_path($legal_url);
- *                                       to obtain the physical filesystem path (also available in the 'dir' $info entry, by the way!), or
- *                                           $url = $mgr->legal2abs_url_path($legal_url);
- *                                       to obtain the absolute URI path for the given directory.
- *
- *               'dir'                   (string) physical filesystem path to the source parent directory of the file/directory being moved/copied.
- *
- *               'path'                  (string) physical filesystem path to the file/directory being moved/copied itself; this is the full source path.
- *
- *               'name'                  (string) the name itself of the file/directory being moved/copied; this is the source name.
- *
- *               'legal_newurl'          (string) LEGAL URI path to the target parent directory of the file/directory being moved/copied. You may invoke
- *                                           $dir = $mgr->legal_url_path2file_path($legal_url);
- *                                       to obtain the physical filesystem path (also available in the 'dir' $info entry, by the way!), or
- *                                           $url = $mgr->legal2abs_url_path($legal_url);
- *                                       to obtain the absolute URI path for the given directory.
- *
- *               'newdir'                (string) physical filesystem path to the target parent directory of the file/directory being moved/copied;
- *                                       this is the full path of the directory where the file/directory will be moved/copied to. (filesystem absolute)
- *
- *               'newpath'               (string) physical filesystem path to the target file/directory being moved/copied itself; this is the full destination path,
- *                                       i.e. the full path of where the file/directory should be renamed/moved to. (filesystem absolute)
- *
- *               'newname'               (string) the target name itself of the file/directory being moved/copied; this is the destination name.
- *
- *                                       This filename is ensured to be both filesystem-legal, unique and not yet existing in the given target directory.
- *
- *               'rename'                (boolean) TRUE when a file/directory RENAME operation is requested (name change, staying within the same
- *                                       parent directory). FALSE otherwise.
- *
- *               'is_dir'                (boolean) TRUE when the subject is a directory itself, FALSE when it is a regular file.
- *
- *               'function'              (string) PHP call which will perform the operation. ('rename' or 'copy')
- *
- *               'preliminary_json'      (array) the JSON data collected so far; when ['status']==1, then we're performing a regular 'move'
- *                                       operation, when the ['status']==0, we are performing a defective 'move' operation.
- *
- *               'validation_failure'    (string) NULL: no validation error has been detected before the callback was invoked; non-NULL, e.g.
- *                                       "nofile": the string passed as message parameter of the FileManagerException, which will be thrown
- *                                       after the callback has returned. (You may alter the 'validation_failure' string value to change the
- *                                       reported error, or set it to NULL to turn off the validation error report entirely -- we assume you
- *                                       will have corrected the other fileinfo[] items as well, when resetting the validation error.
- *
- *         The frontend-specified options.propagateData items will be available as $_POST[] items.
- *
- *
- *  'view':
- *
- *           $info[] contains:
- *
- *               'legal_url'             (string) LEGAL URI path to the directory being viewed/scanned. You may invoke
- *                                           $dir = $mgr->legal_url_path2file_path($legal_url);
- *                                       to obtain the physical filesystem path (also available in the 'dir' $info entry, by the way!), or
- *                                           $url = $mgr->legal2abs_url_path($legal_url);
- *                                       to obtain the absolute URI path for the scanned directory.
- *
- *               'dir'                   (string) physical filesystem path to the directory being viewed/scanned.
- *
- *               'collection'            (dual array of strings) arrays of files and directories (including '..' entry at the top when this is a
- *                                       subdirectory of the FM-managed tree): only names, not full paths. The files array is located at the
- *                                       ['files'] index, while the directories are available at the ['dirs'] index.
- *
- *               'meta_data'             (array) the content sniffed infor as produced by getID3
- *
- *               'mime_filter'           (optional, string) mime filter as specified by the client: a comma-separated string containing
- *                                       full or partial mime types, where a 'partial' mime types is the part of a mime type before
- *                                       and including the slash, e.g. 'image/'
- *
- *               'mime_filters'          (optional, array of strings) the set of allowed mime types, derived from the 'mime_filter' setting.
- *
- *               'file_preselect'        (optional, string) filename of a file in this directory which should be located and selected.
- *                                       When found, the backend will provide an index number pointing at the corresponding JSON files[]
- *                                       entry to assist the front-end in jumping to that particular item in the view.
- *
- *               'preliminary_json'      (array) the JSON data collected so far; when ['status']==1, then we're performing a regular view
- *                                       operation (possibly as the second half of a copy/move/delete operation), when the ['status']==0,
- *                                       we are performing a view operation as the second part of another otherwise failed action, e.g. a
- *                                       failed 'create directory'.
- *
- *               'validation_failure'    (string) NULL: no validation error has been detected before the callback was invoked; non-NULL, e.g.
- *                                       "nofile": the string passed as message parameter of the FileManagerException, which will be thrown
- *                                       after the callback has returned. (You may alter the 'validation_failure' string value to change the
- *                                       reported error, or set it to NULL to turn off the validation error report entirely -- we assume you
- *                                       will have corrected the other fileinfo[] items as well, when resetting the validation error.
- *
- *         The frontend-specified options.propagateData items will be available as $_POST[] items.
- *
- *
- *  'detail':
- *
- *           $info[] contains:
- *
- *               'legal_url'             (string) LEGAL URI path to the file/directory being inspected. You may invoke
- *                                           $dir = $mgr->legal_url_path2file_path($legal_url);
- *                                       to obtain the physical filesystem path (also available in the 'file' $info entry, by the way!), or
- *                                           $url = $mgr->legal2abs_url_path($legal_url);
- *                                       to obtain the absolute URI path for the given file.
- *
- *               'file'                  (string) physical filesystem path to the file being inspected.
- *
- *               'meta_data'             (array) the content sniffed infor as produced by getID3
- *
- *               'mime'                  (string) the mime type as sniffed from the file
- *
- *               'mime_filter'           (optional, string) mime filter as specified by the client: a comma-separated string containing
- *                                       full or partial mime types, where a 'partial' mime types is the part of a mime type before
- *                                       and including the slash, e.g. 'image/'
- *
- *               'mime_filters'          (optional, array of strings) the set of allowed mime types, derived from the 'mime_filter' setting.
- *
- *               'preliminary_json'      (array) the JSON data collected so far; when ['status']==1, then we're performing a regular 'detail'
- *                                       operation, when the ['status']==0, we are performing a defective 'detail' operation.
- *
- *               'validation_failure'    (string) NULL: no validation error has been detected before the callback was invoked; non-NULL, e.g.
- *                                       "nofile": the string passed as message parameter of the FileManagerException, which will be thrown
- *                                       after the callback has returned. (You may alter the 'validation_failure' string value to change the
- *                                       reported error, or set it to NULL to turn off the validation error report entirely -- we assume you
- *                                       will have corrected the other fileinfo[] items as well, when resetting the validation error.
- *
- *         The frontend-specified options.propagateData items will be available as $_POST[] items.
- *
- *
- *
- * Developer Notes:
- *
- * - member functions which have a commented out 'static' keyword have it removed by design: it makes for easier overloading through
- *   inheritance that way and meanwhile there's no pressing need to have those (public) member functions acccessible from the outside world
- *   without having an instance of the FileManager class itself round at the same time.
- */
-
-// ----------- compatibility checks ----------------------------------------------------------------------------
-if (version_compare(PHP_VERSION, '5.2.0') < 0)
-{
-	// die horribly: server does not match our requirements!
-	header('HTTP/1.0 500 FileManager requires PHP 5.2.0 or later', true, 500); // Internal server error
-	throw Exception('FileManager requires PHP 5.2.0 or later');   // this exception will most probably not be caught; that's our intent!
-}
-
-if (function_exists('UploadIsAuthenticated'))
-{
-	// die horribly: user has not upgraded his callback hook(s)!
-	header('HTTP/1.0 500 FileManager callback has not been upgraded!', true, 500); // Internal server error
-	throw Exception('FileManager callback has not been upgraded!');   // this exception will most probably not be caught; that's our intent!
-}
-
-if(!defined("I_KNOW_ABOUT_SUHOSIN") && ini_get('suhosin.session.cryptua'))
-{
-  header('HTTP/1.0 500 Developer must read https://github.com/sleemanj/mootools-filemanager/wiki/suhosin', true, 500); // Internal server error
-  throw Exception('suhosin.session.cryptua: https://github.com/sleemanj/mootools-filemanager/wiki/suhosin" }');   // this exception will most probably not be caught; that's our intent!  
-  exit;
-}
-//-------------------------------------------------------------------------------------------------------------
-
-if (!defined('DEVELOPMENT')) define('DEVELOPMENT', 0);   // make sure this #define is always known to us
-
-
-
-require_once(strtr(dirname(__FILE__), '\\', '/') . '/Tooling.php');
-require_once(strtr(dirname(__FILE__), '\\', '/') . '/Image.class.php');
-
-
-
-// the jpeg quality for the largest thumbnails (smaller ones are automatically done at increasingly higher quality)
-define('MTFM_THUMBNAIL_JPEG_QUALITY', 80);
-
-// the number of directory levels in the thumbnail cache; set to 2 when you expect to handle huge image collections.
-//
-// Note that each directory level distributes the files evenly across 256 directories; hence, you may set this
-// level count to 2 when you expect to handle more than 32K images in total -- as each image will have two thumbnails:
-// a 48px small one and a 250px large one.
-define('MTFM_NUMBER_OF_DIRLEVELS_FOR_CACHE', 1);
-
-// minimum number of cached getID3 results; cache is automatically pruned
-define('MTFM_MIN_GETID3_CACHESIZE', 16);
-
-// allow MTFM to use finfo_open() to help us produce mime types for files. This is slower than the basic file extension to mimetype mapping
-define('MTFM_USE_FINFO_OPEN', false);
-
-
-
-
-
-
-// flags for clean_ID3info_results()
-define('MTFM_CLEAN_ID3_STRIP_EMBEDDED_IMAGES',      0x0001);
-
-
-
-
-
-
-/**
- * Cache element class custom-tailored for the MTFM: includes the code to construct a unique
- * (thumbnail) cache filename and derive suitable cache filenames from the same template with
- * minimal effort.
- *
- * Makes sure the generated (thumbpath) template is unique for each source file ('$legal_url'). We prevent
- * reduced performance for large file sets: all thumbnails/templates derived from any files in the entire
- * FileManager-managed directory tree, rooted by options['directory'], can become a huge collection,
- * so we distribute them across a (thumbnail/cache) directory tree, which is created on demand.
- *
- * The thumbnails cache directory tree is determined by the MD5 of the full path to the source file ($legal_url),
- * using the first two characters of the MD5, making for a span of 256 (directories).
- *
- * Note: when you expect to manage a really HUGE file collection from FM, you may dial up the
- *       MTFM_NUMBER_OF_DIRLEVELS_FOR_CACHE define to 2 here.
- */
-class MTFMCacheItem
-{
-	protected $store;
-
-	protected $legal_url;
-	protected $file;
-	protected $dirty;
-	protected $persistent_edits;
-	protected $loaded;
-	protected $fstat;
-
-	protected $cache_dir;
-	protected $cache_dir_mode;  // UNIX access bits: UGA:RWX
-	protected $cache_dir_url;
-	protected $cache_base;      // cache filename template base
-	protected $cache_tnext;     // thumbnail extension
-
-	protected $cache_file;
-
-	public function __construct($fm_obj, $legal_url, $prefetch = false, $persistent_edits = true)
-	{
-		$this->init($fm_obj, $legal_url, $prefetch, $persistent_edits);
-	}
-
-	public function init($fm_obj, $legal_url, $prefetch = false, $persistent_edits)
-	{
-		$this->dirty = false;
-		$this->persistent_edits = $persistent_edits;
-		$this->loaded = false;
-		$this->store = array();
-
-		$fmopts = $fm_obj->getSettings();
-
-		$this->legal_url = $legal_url;
-		$this->file = $fm_obj->legal_url_path2file_path($legal_url);
-		$this->fstat = null;
-
-		$fi = pathinfo($legal_url);
-		if (is_dir($this->file))
-		{
-			$filename = $fi['basename'];
-			unset($fi['extension']);
-			$ext = '';
-		}
-		else
-		{
-			$filename = $fi['filename'];
-			$ext = strtolower((isset($fi['extension']) && strlen($fi['extension']) > 0) ? '.' . $fi['extension'] : '');
-			switch ($ext)
-			{
-			case '.gif':
-			case '.png':
-			case '.jpg':
-			case '.jpeg':
-				break;
-
-			case '.mp3':
-				// default to JPG, as embedded images don't contain transparency info:
-				$ext = '.jpg';
-				break;
-
-			default:
-				//$ext = preg_replace('/[^A-Za-z0-9.]+/', '_', $ext);
-
-				// default to PNG, as it'll handle transparancy and full color both:
-				$ext = '.png';
-				break;
-			}
-		}
-
-		// as the cache file is generated, but NOT guaranteed from a safe filepath (FM may be visiting unsafe
-		// image files when they exist in a preloaded directory tree!) we do the full safe-filename transform
-		// on the name itself.
-		// The MD5 is taken from the untrammeled original, though:
-		$dircode = md5($legal_url);
-
-		$dir = '';
-		for ($i = 0; $i < MTFM_NUMBER_OF_DIRLEVELS_FOR_CACHE; $i++)
-		{
-			$dir .= substr($dircode, 0, 2) . '/';
-			$dircode = substr($dircode, 2);
-		}
-
-		$fn = substr($dircode, 0, 4) . '_' . preg_replace('/[^A-Za-z0-9]+/', '_', $filename);
-		$dircode = substr($dircode, 4);
-		$fn = substr($fn . $dircode, 0, 38);
-
-		$this->cache_dir_url = $fmopts['thumbnailPath'] . $dir;
-		$this->cache_dir = $fmopts['thumbnailCacheDir'] . $dir;
-		$this->cache_dir_mode = $fmopts['chmod'];
-		$this->cache_base = $fn;
-		$this->cache_tnext = $ext;
-
-		$cache_url = $fn . '-meta.nfo';
-		$this->cache_file = $this->cache_dir . $cache_url;
-
-		if ($prefetch)
-		{
-			$this->load();
-		}
-	}
-
-	public function load()
-	{
-		if (!$this->loaded)
-		{
-			$this->loaded = true; // always mark as loaded, even when the load fails
-
-			if (!is_array($this->fstat) && file_exists($this->file))
-			{
-				$this->fstat = @stat($this->file);
-			}
-			if (file_exists($this->cache_file))
-			{
-				include($this->cache_file);  // unserialize();
-
-				if (   isset($statdata) && isset($data) && is_array($data) && is_array($this->fstat) && is_Array($statdata)
-					&& $statdata[10] == $this->fstat[10] // ctime
-					&& $statdata[9]  == $this->fstat[9]   // mtime
-					&& $statdata[7]  == $this->fstat[7]   // size
-				   )
-				{
-					if (!DEVELOPMENT)
-					{
-						// mix disk cache data with items already existing in RAM cache: we use a delayed-load scheme which necessitates this.
-						$this->store = array_merge($data, $this->store);
-					}
-				}
-				else
-				{
-					// nuke disk cache!
-					@unlink($this->cache_file);
-				}
-			}
-		}
-	}
-
-	public function delete($every_ting_baby = false)
-	{
-		$rv = true;
-		$dir = $this->cache_dir;
-		$dir_exists = file_exists($dir);
-
-		// What do I get for ten dollars?
-		if ($every_ting_baby)
-		{
-			if ($dir_exists)
-			{
-				$dir_and_mask = $dir . $this->cache_base . '*';
-				$coll = safe_glob($dir_and_mask, GLOB_NODOTS | GLOB_NOSORT);
-
-				if ($coll !== false)
-				{
-					foreach($coll['files'] as $filename)
-					{
-						$file = $dir . $filename;
-						$rv &= @unlink($file);
-					}
-				}
-			}
-		}
-		else if (file_exists($this->cache_file))
-		{
-			// nuke cache!
-			$rv &= @unlink($this->cache_file);
-		}
-
-		// as the thumbnail subdirectory may now be entirely empty, try to remove it as well,
-		// but do NOT yack when we don't succeed: there may be other thumbnails, etc. in there still!
-		if ($dir_exists)
-		{
-			for ($i = 0; $i < MTFM_NUMBER_OF_DIRLEVELS_FOR_CACHE; $i++)
-			{
-				@rmdir($dir);
-				$dir = dirname($dir);
-			}
-		}
-
-		// also clear the data cached in RAM:
-		$this->dirty = false;
-		$this->loaded = true;  // we know the cache file doesn't exist any longer, so don't bother trying to load it again later on!
-		$this->store = array();
-
-		return $rv;
-	}
-
-	public function __destruct()
-	{
-		if ($this->dirty && $this->persistent_edits)
-		{
-			// store data to persistent storage:
-			if (!$this->mkCacheDir() && !$this->loaded)
-			{
-				// fetch from disk before saving in order to ensure RAM cache is mixed with _existing_ _valid_ disk cache (RAM wins on individual items).
-				$this->load();
-			}
-
-			if (!is_array($this->fstat) && file_exists($this->file))
-			{
-				$this->fstat = @stat($this->file);
-			}
-
-			$data = '<?php
-
-// legal URL: ' . $this->legal_url . '
-
-$statdata = ' . var_export($this->fstat, true) . ';
-
-$data = ' . var_export($this->store, true) . ';' . PHP_EOL;
-
-			@file_put_contents($this->cache_file, $data);
-		}
-	}
-
-	/*
-	 * @param boolean $persistent    (default: TRUE) TRUE when we should also check the persistent cache storage for this item/key
-	 */
-	public function fetch($key, $persistent = true)
-	{
-		if (isset($this->store[$key]))
-		{
-			return $this->store[$key];
-		}
-		else if ($persistent && !$this->loaded)
-		{
-			// only fetch from disk when we ask for items which haven't been stored yet.
-			$this->load();
-			if (isset($this->store[$key]))
-			{
-				return $this->store[$key];
-			}
-		}
-
-		return null;
-	}
-
-	/*
-	 * @param boolean $persistent    (default: TRUE) TRUE when we should also store this item/key in the persistent cache storage
-	 */
-	public function store($key, $value, $persistent = true)
-	{
-		if (isset($this->store[$key]))
-		{
-			$persistent &= ($this->store[$key] !== $value); // only mark cache as dirty when we actully CHANGE the value stored in here!
-		}
-		$this->dirty |= ($persistent && $this->persistent_edits);
-		$this->store[$key] = $value;
-	}
-
-
-	public function getThumbPath($dimensions)
-	{
-		assert(!empty($dimensions));
-		return $this->cache_dir . $this->cache_base . '-' . $dimensions . $this->cache_tnext;
-	}
-
-	public function getThumbURL($dimensions)
-	{
-		assert(!empty($dimensions));
-		return $this->cache_dir_url . $this->cache_base . '-' . $dimensions . $this->cache_tnext;
-	}
-
-	public function mkCacheDir()
-	{
-		if (!is_dir($this->cache_dir))
-		{
-			@mkdir($this->cache_dir, $this->cache_dir_mode, true);
-			return true;
-		}
-		return false;
-	}
-
-	public function getMimeType()
-	{
-		if (!empty($this->store['mime_type']))
-		{
-			return $this->store['mime_type'];
-		}
-		//$mime = $fm_obj->getMimeFromExt($file);
-		return null;
-	}
-}
-
-
-
-
-
-
-
-class MTFMCache
-{
-	protected $store;           // assoc. array: stores cached data
-	protected $store_ts;        // assoc. array: stores corresponding 'cache timestamps' for use by the LRU algorithm
-	protected $store_lru_ts;    // integer: current 'cache timestamp'
-	protected $min_cache_size;  // integer: minimum cache size limit (maximum is a statistical derivate of this one, about twice as large)
-
-	public function __construct($min_cache_size)
-	{
-		$this->store = array();
-		$this->store_ts = array();
-		// store_lru_ts stores a 'timestamp' counter to track LRU: 'timestamps' older than threshold are discarded when cache is full
-		$this->store_lru_ts = 0;
-		$this->min_cache_size = $min_cache_size;
-	}
-
-	/*
-	 * Return a reference to the cache slot. When the cache slot did not exist before, it will be created, and
-	 * the value stored in the slot will be NULL.
-	 *
-	 * You can store any arbitrary data in a cache slot: it doesn't have to be a MTFMCacheItem instance.
-	 */
-	public function &pick($key, $fm_obj = null, $create_if_not_exist = true)
-	{
-		assert(!empty($key));
-
-		$age_limit = $this->store_lru_ts - $this->min_cache_size;
-
-		if (isset($this->store[$key]))
-		{
-			// mark as LRU entry; only update the timestamp when it's rather old (age/2) to prevent
-			// cache flushing due to hammering of a few entries:
-			if ($this->store_ts[$key] < $age_limit + $this->min_cache_size / 2)
-			{
-				$this->store_ts[$key] = $this->store_lru_ts++;
-			}
-		}
-		else if ($create_if_not_exist)
-		{
-			// only start pruning when we run the risk of overflow. Heuristic: when we're at 50% fill rate, we can expect more requests to come in, so we start pruning already
-			if (count($this->store_ts) >= $this->min_cache_size / 2)
-			{
-				/*
-				 * Cleanup/cache size restriction algorithm:
-				 *
-				 * Randomly probe the cache and check whether the probe has a 'timestamp' older than the configured
-				 * minimum required lifetime. When the probe is older, it is discarded from the cache.
-				 *
-				 * As the probe is assumed to be perfectly random, further assuming we've got a cache size of N,
-				 * then the chance we pick a probe older then age A is (N - A) / N  -- picking any age X has a
-				 * chance of 1/N as random implies flat distribution. Hitting any of the most recent A entries
-				 * is A * 1/N, hence picking any older item is 1 - A/N == (N - A) / N
-				 *
-				 * This means the growth of the cache beyond the given age limit A is a logarithmic curve, but
-				 * we like to have a guaranteed upper limit significantly below N = +Inf, so we probe the cache
-				 * TWICE for each addition: given a cache size of 2N, one of these probes should, on average,
-				 * be successful, thus removing one cache entry on average for a cache size of 2N. As we only
-				 * add 1 item at the same time, the statistically expected bound of the cache will be 2N.
-				 * As chances increase for both probes to be successful when cache size increases, the risk
-				 * of a (very) large cache size at any point in time is dwindingly small, while cost is constant
-				 * per cache transaction (insert + dual probe).
-				 *
-				 * This scheme is expected to be faster (thanks to log growth curve and linear insert/prune costs)
-				 * than the usual where one keeps meticulous track of the entries and their age and entries are
-				 * discarded in order, oldest first.
-				 */
-				$probe_index = array_rand($this->store_ts);
-				if ($this->store_ts[$probe_index] < $age_limit)
-				{
-					// discard antiquated entry:
-					unset($this->store_ts[$probe_index]);
-					unset($this->store[$probe_index]);
-				}
-				$probe_index = array_rand($this->store_ts);
-				if ($this->store_ts[$probe_index] < $age_limit)
-				{
-					// discard antiquated entry:
-					unset($this->store_ts[$probe_index]);
-					unset($this->store[$probe_index]);
-				}
-			}
-
-			/*
-			 * add this slot (empty for now) to the cache. Only do this AFTER the pruning, so it won't risk being
-			 * picked by the random process in there. We _need_ this one right now. ;-)
-			 */
-			$this->store[$key] = (!empty($fm_obj) ? new MTFMCacheItem($fm_obj, $key) : null);
-			$this->store_ts[$key] = $this->store_lru_ts++;
-		}
-		else
-		{
-			// do not clutter the cache; all we're probably after this time is the assistance of a MTFMCacheItem:
-			// provide a dummy cache entry, nulled and all; we won't be saving the stored data, if any, anyhow.
-			if (isset($this->store['!']) && !empty($fm_obj))
-			{
-				$this->store['!']->init($fm_obj, $key, false, false);
-			}
-			else
-			{
-				$this->store['!'] = (!empty($fm_obj) ? new MTFMCacheItem($fm_obj, $key, false, false) : null);
-			}
-			$this->store_ts['!'] = 0;
-			$key = '!';
-		}
-
-		return $this->store[$key];
-	}
-}
-
-
-
-
-
-
-
-class FileManager
-{
-	protected $options;
-	protected $getid3;
-	protected $getid3_cache;
-	protected $icon_cache;              // cache the icon paths per size (large/small) and file extension
-
-	protected $thumbnailCacheDir;
-	protected $thumbnailCacheParentDir;  // assistant precalculated value for scandir/view
-	protected $managedBaseDir;           // precalculated filesystem path eqv. of options['directory']
-
-	public function __construct($options)
-	{
-		$this->options = array_merge(array(
-			/*
-			 * Note that all default paths as listed below are transformed to DocumentRoot-based paths
-			 * through the getRealPath() invocations further below:
-			 */
-			'directory' => null,                                                        // the root of the 'legal URI' directory tree, to be managed by MTFM. MUST be in the DocumentRoot tree.
-			'assetBasePath' => null,                                                    // may sit outside options['directory'] but MUST be in the DocumentRoot tree
-			'thumbnailPath' => null,                                                    // may sit outside options['directory'] but MUST be in the DocumentRoot tree
-			'thumbSmallSize' => 48,                                                     // Used for thumb48 creation
-			'thumbBigSize' => 250,                                                      // Used for thumb250 creation
-			'mimeTypesPath' => strtr(dirname(__FILE__), '\\', '/') . '/MimeTypes.ini',  // an absolute filesystem path anywhere; when relative, it will be assumed to be against options['RequestScriptURI']
-			'documentRootPath' => null,                                                 // an absolute filesystem path pointing at URI path '/'. Default: SERVER['DOCUMENT_ROOT']
-			'RequestScriptURI' => null,												    // default is $_SERVER['SCRIPT_NAME']
-			'dateFormat' => 'j M Y - H:i',
-			'maxUploadSize' => 2600 * 2600 * 3,
-			// 'maxImageSize' => 99999,                                                 // OBSOLETED, replaced by 'suggestedMaxImageDimension'
-			'maxImageDimension' => array('width' => 1024, 'height' => 768),             // Allow to specify the "Resize Large Images" tolerance level.
-			'upload' => false,
-			'destroy' => false,
-			'create' => false,
-			'move' => false,
-			'download' => false,
-			/* ^^^ this last one is easily circumnavigated if it's about images: when you can view 'em, you can 'download' them anyway.
-			 *     However, for other mime types which are not previewable / viewable 'in their full bluntal nugity' ;-) , this will
-			 *     be a strong deterent.
-			 *
-			 *     Think Springer Verlag and PDFs, for instance. You can have 'em, but only /after/ you've ...
-			 */
-			'allowExtChange' => false,
-			'safe' => true,
-			'filter' => null,
-			'chmod' => 0777,
-			'ViewIsAuthorized_cb' => null,
-			'DetailIsAuthorized_cb' => null,
-			'UploadIsAuthorized_cb' => null,
-			'DownloadIsAuthorized_cb' => null,
-			'CreateIsAuthorized_cb' => null,
-			'DestroyIsAuthorized_cb' => null,
-			'MoveIsAuthorized_cb' => null,
-			
-			'UploadIsComplete_cb' => null,
-			'DownloadIsComplete_cb' => null,
-			'DestroyIsComplete_cb' => null,
-			
-			'showHiddenFoldersAndFiles' => false,      // Hide dot dirs/files ?
-			'useGetID3IfAvailable' => true,
-			'enableXSendFile' => false,
-			'readme_file'          => '.readme.html', // If a directory contains a file of this name, the contents of this file 
-                                               //  will be returned in the ajax.  The MFM front end will display this in 
-                                               //  the preview area, provided there is nothing else to display there.
-                                               //  Useful for displaying help text.  The file should only be an 
-                                               //  html snippet, not a complete html file.
-                                               
-		), (is_array($options) ? $options : array()));
-
-		// transform the obsoleted/deprecated options:
-		if (!empty($this->options['maxImageSize']) && $this->options['maxImageSize'] != 1024 && $this->options['maxImageDimension']['width'] == 1024 && $this->options['maxImageDimension']['height'] == 768)
-		{
-			$this->options['maxImageDimension'] = array('width' => $this->options['maxImageSize'], 'height' => $this->options['maxImageSize']);
-		}
-
-		$document_root_fspath = null;
-		if (!empty($this->options['documentRootPath']))
-		{
-			$document_root_fspath = realpath($this->options['documentRootPath']);
-		}
-		if (empty($document_root_fspath))
-		{
-			$document_root_fspath = realpath(isset($_SERVER['REDIRECT_DOCUMENT_ROOT']) ? $_SERVER['REDIRECT_DOCUMENT_ROOT'] : $_SERVER['DOCUMENT_ROOT']);
-		}
-		$document_root_fspath = strtr($document_root_fspath, '\\', '/');
-		$document_root_fspath = rtrim($document_root_fspath, '/');
-		$this->options['documentRootPath'] = $document_root_fspath;
-
-		// apply default to RequestScriptURI:
-		if (empty($this->options['RequestScriptURI']))
-		{
-			$this->options['RequestScriptURI'] = $this->getRequestScriptURI();
-		}
-
-		// only calculate the guestimated defaults when they are indeed required:
-		if ($this->options['directory'] == null || $this->options['assetBasePath'] == null || $this->options['thumbnailPath'] == null)
-		{
-			$my_path = @realpath(dirname(__FILE__));
-			$my_path = strtr($my_path, '\\', '/');
-			$my_path = self::enforceTrailingSlash($my_path);
-			
-			// we throw an Exception here because when these do not apply, the user should have specified all three these entries!
-			if (!FileManagerUtility::startsWith($my_path, $document_root_fspath))
-			{
-				throw new FileManagerException('nofile');
-			}
-
-			$my_url_path = str_replace($document_root_fspath, '', $my_path);
-
-			if ($this->options['directory'] == null)
-			{
-				$this->options['directory'] = $my_url_path . '../../Demos/Files/';
-			}
-			if ($this->options['assetBasePath'] == null)
-			{
-				$this->options['assetBasePath'] = $my_url_path . '../../Assets/';
-			}
-			if ($this->options['thumbnailPath'] == null)
-			{
-				$this->options['thumbnailPath'] = $my_url_path . '../../Assets/Thumbs/';
-			}
-		}
-
-		/*
-		 * make sure we start with a very predictable and LEGAL options['directory'] setting, so that the checks applied to the
-		 * (possibly) user specified value for this bugger actually can check out okay AS LONG AS IT'S INSIDE the DocumentRoot-based
-		 * directory tree:
-		 */
-		$this->options['directory'] = $this->rel2abs_url_path($this->options['directory'] . '/');
-
-		$this->managedBaseDir = $this->url_path2file_path($this->options['directory']);
-
-		// now that the correct options['directory'] has been set up, go and check/clean the other paths in the options[]:
-
-		$this->options['thumbnailPath'] = $this->rel2abs_url_path($this->options['thumbnailPath'] . '/');
-		$this->thumbnailCacheDir = $this->url_path2file_path($this->options['thumbnailPath']);  // precalculate this value; safe as we can assume the entire cache dirtree maps 1:1 to filesystem.
-		$this->thumbnailCacheParentDir = $this->url_path2file_path(self::getParentDir($this->options['thumbnailPath']));    // precalculate this value as well; used by scandir/view
-
-		$this->options['assetBasePath'] = $this->rel2abs_url_path($this->options['assetBasePath'] . '/');
-
-		$this->options['mimeTypesPath'] = @realpath($this->options['mimeTypesPath']);
-		if (empty($this->options['mimeTypesPath']))
-		{
-			throw new FileManagerException('nofile');
-		}
-		$this->options['mimeTypesPath'] = strtr($this->options['mimeTypesPath'], '\\', '/');
-
-		$this->getid3_cache = new MTFMCache(MTFM_MIN_GETID3_CACHESIZE);
-
-		$this->icon_cache = array(array(), array());
-	}
-
-	/**
-	 * @return array the FileManager options and settings.
-	 */
-	public function getSettings()
-	{
-		return array_merge(array(
-				'thumbnailCacheDir' => $this->thumbnailCacheDir,
-				'thumbnailCacheParentDir' => $this->thumbnailCacheParentDir,
-				'managedBaseDir' => $this->managedBaseDir
-		), $this->options);
-	}
-
-
-
-
-	/**
-	 * Central entry point for any client side request.
-	 */
-	public function fireEvent($event = null)
-	{
-		$event = (!empty($event) ? 'on' . ucfirst($event) : null);
-		if (!$event || !method_exists($this, $event)) $event = 'onView';
-
-		$this->{$event}();
-	}
-
-
-
-
-
-
-	/**
-	 * Generalized 'view' handler, which produces a directory listing.
-	 *
-	 * Return the directory listing in a nested array, suitable for JSON encoding.
-	 */
-	protected function _onView($legal_url, $json, $mime_filter, $file_preselect_arg = null, $filemask = '*')
-	{
-		$v_ex_code = 'nofile';
-
-		$dir = $this->legal_url_path2file_path($legal_url);
-		$doubledot = null;
-		$coll = null;
-		if (is_dir($dir))
-		{
-			/*
-			 * Caching notice:
-			 *
-			 * Testing on Win7/64 has revealed that at least on that platform, directories' 'last modified' timestamp does NOT change when
-			 * the contents of the directory are altered (e.g. when a file was added), hence filemtime() cannot be used for directories
-			 * to detect any change and thus steer the cache access.
-			 *
-			 * When one assumes that all file access in the managed directory tree is performed through an MTFM entity, then we can use a
-			 * different tactic (which, due to this risky assumption is dupped part of the group of 'aggressive caching' actions) where
-			 * we check for the existence of a cache file for the given directory; when it does exist, we can use it.
-			 * Also, when any editing activity occurs in a directory, we can either choose to update the dir-cache file (costly, tough,
-			 * rather complex) or simply delete the dir-cache file to signal the next occurrence of the 'view' a fresh dirscan is
-			 * required.
-			 *
-			 * Also, we can keep track of the completed thumbnail generation per file in this dir-cache file. However, the argument against
-			 * such relative sophitication (to prevent a double round-trip per thumbnail in 'thumb' list view) is the heavy cost of
-			 * loading + saving the (edited) dir-cache file for each thumbnail production. The question here is: are those costs significantly
-			 * less then the cost of dirscan + round trips (or 'direct' mode thumbnail file tests) for each 'view' request? How many 'view's
-			 * do you expect compared to the number of directory edits? 'Usually' that ratio should be rather high (few edits, many views),
-			 * thus suggesting a benefit to this aggressive caching and cache updating for thumbnail production.    The 'cheaper for the
-			 * thumbnail production' approach would be to consider it a 'directory edit' and thus nuke the dir-cache for every thumbnail (48px)
-			 * produced. This is /probably/ slower than the cahce updating, as the latter requires only a single file access per 'view'
-			 * operation; all we need to store are a flag (Y/N) per file in the directory, so the store size would be small, even for large
-			 * directories.
-			 *
-			 * What to do? We haven't come to a decision yet.
-			 *
-			 * Code: TODO
-			 */
-
-			$coll = $this->scandir($dir, $filemask, false, 0, ($this->options['showHiddenFoldersAndFiles'] ? ~GLOB_NOHIDDEN : ~0));
-			if ($coll !== false)
-			{
-				/*
-				 * To ensure '..' ends up at the very top of the view, no matter what the other entries in $coll['dirs'][] are made of,
-				 * we pop the last element off the array, check whether it's the double-dot, and if so, keep it out while we
-				 * let the sort run.
-				 */
-				$doubledot = array_pop($coll['dirs']);
-				if ($doubledot !== null && $doubledot !== '..')
-				{
-					$coll['dirs'][] = $doubledot;
-					$doubledot = null;
-				}
-				natcasesort($coll['dirs']);
-				natcasesort($coll['files']);
-
-				$v_ex_code = null;
-			}
-		}
-
-		$mime_filters = $this->getAllowedMimeTypes($mime_filter);
-
-		$fileinfo = array(
-				'legal_url' => $legal_url,
-				'dir' => $dir,
-				'collection' => $coll,
-				'mime_filter' => $mime_filter,
-				'mime_filters' => $mime_filters,
-				'file_preselect' => $file_preselect_arg,
-				'preliminary_json' => $json,
-				'validation_failure' => $v_ex_code
-			);
-
-		if (!empty($this->options['ViewIsAuthorized_cb']) && function_exists($this->options['ViewIsAuthorized_cb']) && !$this->options['ViewIsAuthorized_cb']($this, 'view', $fileinfo))
-		{
-			$v_ex_code = $fileinfo['validation_failure'];
-			if (empty($v_ex_code)) $v_ex_code = 'authorized';
-		}
-		if (!empty($v_ex_code))
-			throw new FileManagerException($v_ex_code);
-
-		$legal_url = $fileinfo['legal_url'];
-		$dir = $fileinfo['dir'];
-		$coll = $fileinfo['collection'];
-		$mime_filter = $fileinfo['mime_filter'];
-		$mime_filters = $fileinfo['mime_filters'];
-		$file_preselect_arg = $fileinfo['file_preselect'];
-		$json = $fileinfo['preliminary_json'];
-
-		$file_preselect_index = -1;
-		$out = array(array(), array());
-
-		$mime = 'text/directory';
-		$iconspec = false;
-
-		if ($doubledot !== null)
-		{
-			$filename = '..';
-
-			$l_url = $legal_url . $filename;
-
-			// must transform here so alias/etc. expansions inside legal_url_path2file_path() get a chance:
-			$file = $this->legal_url_path2file_path($l_url);
-
-			$iconspec = 'is.directory_up';
-
-			$icon48 = $this->getIcon($iconspec, false);
-			$icon48_e = FileManagerUtility::rawurlencode_path($icon48);
-
-			$icon = $this->getIcon($iconspec, true);
-			$icon_e = FileManagerUtility::rawurlencode_path($icon);
-
-			$out[1][] = array(
-					'path' => $l_url,
-					'name' => $filename,
-					'mime' => $mime,
-					'icon48' => $icon48_e,
-					'icon' => $icon_e
-				);
-		}
-
-		// now precalc the directory-common items (a.k.a. invariant computation / common subexpression hoisting)
-		$iconspec_d = 'is.directory';
-
-		$icon48_d = $this->getIcon($iconspec_d, false);
-		$icon48_de = FileManagerUtility::rawurlencode_path($icon48_d);
-
-		$icon_d = $this->getIcon($iconspec_d, true);
-		$icon_de = FileManagerUtility::rawurlencode_path($icon_d);
-
-		foreach ($coll['dirs'] as $filename)
-		{
-			$l_url = $legal_url . $filename;
-
-			$out[1][] = array(
-					'path' => $l_url,
-					'name' => $filename,
-					'mime' => $mime,
-					'icon48' => $icon48_de,
-					'icon' => $icon_de
-				);
-		}
-
-		// and now list the files in the directory
-		$idx = 0;
-		foreach ($coll['files'] as $filename)
-		{
-			$l_url = $legal_url . $filename;
-
-			// Do not allow the getFileInfo()/imageinfo() overhead per file for very large directories; just guess the mimetype from the filename alone.
-			// The real mimetype will show up in the 'details' view anyway as we'll have called getFileInfo() by then!
-			$mime = $this->getMimeFromExt($filename);
-			$iconspec = $filename;
-
-			if (!$this->IsAllowedMimeType($mime, $mime_filters))
-				continue;
-
-			if ($filename === $file_preselect_arg)
-			{
-				$file_preselect_index = $idx;
-			}
-
-			/*
-			 * offload the thumbnailing process to another event ('event=detail / mode=direct') to be fired by the client
-			 * when it's time to render the thumbnail: the offloading helps us tremendously in coping with large
-			 * directories:
-			 * WE simply assume the thumbnail will be there, so we don't even need to check for its existence
-			 * (which saves us one more file_exists() per item at the very least). And when it doesn't, that's
-			 * for the event=thumbnail handler to worry about (creating the thumbnail on demand or serving
-			 * a generic icon image instead).
-			 *
-			 * For now, simply assign a basic icon to any and all; the 'detail' event will replace this item in the frontend
-			 * when the time has arrives when that 'detail' request has been answered.
-			 */
-			$icon48 = $this->getIcon($iconspec, false);
-			$icon48_e = FileManagerUtility::rawurlencode_path($icon48);
-
-			$icon = $this->getIcon($iconspec, true);
-			$icon_e = FileManagerUtility::rawurlencode_path($icon);
-
-			$out[0][] = array(
-					'path' => $l_url,
-					'name' => $filename,
-					'mime' => $mime,
-					// we don't know the thumbnail paths yet --> this will trigger deferred requests: (event=detail, mode=direct)
-					'thumbs_deferred' => true,
-					'icon48' => $icon48_e,
-					'icon' => $icon_e
-				);
-			$idx++;
-		}
-
-		return array_merge((is_array($json) ? $json : array()), array(
-				'root' => substr($this->options['directory'], 1),
-				'this_dir' => array(
-					'path' => $legal_url,
-					'name' => basename($legal_url),
-					'date' => date($this->options['dateFormat'], @filemtime($dir)),
-					'mime' => 'text/directory',
-					'icon48' => $icon48_de,
-					'icon' => $icon_de,
-					'readme' => file_exists($dir . '/' . $this->options['readme_file']) 
-                  ? file_get_contents($dir . '/' . $this->options['readme_file']) 
-                  : null,
-				),
-				'preselect_index' => ($file_preselect_index >= 0 ? $file_preselect_index + count($out[1]) + 1 : 0),
-				'preselect_name' => ($file_preselect_index >= 0 ? $file_preselect_arg : null),
-				'dirs' => $out[1],
-				'files' => $out[0]
-			));
-	}
-
-	/**
-	 * Process the 'view' event (default event fired by fireEvent() method)
-	 *
-	 * Returns a JSON encoded directory view list.
-	 *
-	 * Expected parameters:
-	 *
-	 * $_POST['directory']     path relative to basedir a.k.a. options['directory'] root
-	 *
-	 * $_POST['file_preselect']     optional filename or path:
-	 *                         when a filename, this is the filename of a file in this directory
-	 *                         which should be located and selected. When found, the backend will
-	 *                         provide an index number pointing at the corresponding JSON files[]
-	 *                         entry to assist the front-end in jumping to that particular item
-	 *                         in the view.
-	 *
-	 *                         when a path, it is either an absolute or a relative path:
-	 *                         either is assumed to be a URI URI path, i.e. rooted at
-	 *                           DocumentRoot.
-	 *                         The path will be transformed to a LEGAL URI path and
-	 *                         will OVERRIDE the $_POST['directory'] path.
-	 *                         Otherwise, this mode acts as when only a filename was specified here.
-	 *                         This mode is useful to help a frontend to quickly jump to a file
-	 *                         pointed at by a URI.
-	 *
-	 *                         N.B.: This also the only entry which accepts absolute URI paths and
-	 *                               transforms them to LEGAL URI paths.
-	 *
-	 *                         When the specified path is illegal, i.e. does not reside inside the
-	 *                         options['directory']-rooted LEGAL URI subtree, it will be discarded
-	 *                         entirely (as all file paths, whether they are absolute or relative,
-	 *                         must end up inside the options['directory']-rooted subtree to be
-	 *                         considered manageable files) and the process will continue as if
-	 *                         the $_POST['file_preselect'] entry had not been set.
-	 *
-	 * $_POST['filter']        optional mimetype filter string, amy be the part up to and
-	 *                         including the slash '/' or the full mimetype. Only files
-	 *                         matching this (set of) mimetypes will be listed.
-	 *                         Examples: 'image/' or 'application/zip'
-	 *
-	 * Errors will produce a JSON encoded error report, including at least two fields:
-	 *
-	 * status                  0 for error; nonzero for success
-	 *
-	 * error                   error message
-	 *
-	 * Next to these, the JSON encoded output will, with high probability, include a
-	 * list view of a valid parent or 'basedir' as a fast and easy fallback mechanism for client side
-	 * viewing code, jumping back to a existing directory. However, severe and repetitive errors may not produce this
-	 * 'fallback view list' so proper client code should check the 'status' field in the
-	 * JSON output.
-	 */
-	protected function onView()
-	{
-		// try to produce the view; if it b0rks, retry with the parent, until we've arrived at the basedir:
-		// then we fail more severely.
-
-		$emsg = null;
-		$jserr = array(
-				'status' => 1
-			);
-
-		$mime_filter = $this->getPOSTparam('filter', $this->options['filter']);
-		$legal_url = null;
-
-		try
-		{
-			$dir_arg = $this->getPOSTparam('directory');
-			$legal_url = $this->rel2abs_legal_url_path($dir_arg . '/');
-
-			$file_preselect_arg = $this->getPOSTparam('file_preselect');
-			try
-			{
-				if (!empty($file_preselect_arg))
-				{
-					// check if this a path instead of just a basename, then convert to legal_url and split across filename and directory.
-					if (strpos($file_preselect_arg, '/') !== false)
-					{
-						// this will also convert a relative path to an absolute path before transforming it to a LEGAL URI path:
-						$legal_presel = $this->abs2legal_url_path($file_preselect_arg);
-
-						$prseli = pathinfo($legal_presel);
-						$file_preselect_arg = $prseli['basename'];
-						// override the directory!
-						$legal_url = $prseli['dirname'];
-						$legal_url = self::enforceTrailingSlash($legal_url);
-					}
-					else
-					{
-						$file_preselect_arg = basename($file_preselect_arg);
-					}
-				}
-			}
-			catch(FileManagerException $e)
-			{
-				// discard the preselect input entirely:
-				$file_preselect_arg = null;
-			}
-		}
-		catch(FileManagerException $e)
-		{
-			$emsg = $e->getMessage();
-			$legal_url = '/';
-			$file_preselect_arg = null;
-		}
-		catch(Exception $e)
-		{
-			// catching other severe failures; since this can be anything it may not be a translation keyword in the message...
-			$emsg = $e->getMessage();
-			$legal_url = '/';
-			$file_preselect_arg = null;
-		}
-
-		// loop until we drop below the bottomdir; meanwhile getDir() above guarantees that $dir is a subdir of bottomdir, hence dir >= bottomdir.
-		$original_legal_url = $legal_url;
-		do
-		{
-			try
-			{
-				$rv = $this->_onView($legal_url, $jserr, $mime_filter, $file_preselect_arg);
-
-				$this->sendHttpHeaders('Content-Type: application/json');
-
-				echo json_encode($rv);
-				return;
-			}
-			catch(FileManagerException $e)
-			{
-				if ($emsg === null)
-					$emsg = $e->getMessage();
-			}
-			catch(Exception $e)
-			{
-				// catching other severe failures; since this can be anything it may not be a translation keyword in the message...
-				if ($emsg === null)
-					$emsg = $e->getMessage();
-			}
-
-			// step down to the parent dir and retry:
-			$legal_url = self::getParentDir($legal_url);
-			$file_preselect_arg = null;
-
-			$jserr['status']++;
-
-		} while ($legal_url !== false);
-
-		$this->modify_json4exception($jserr, $emsg, 'path = ' . $original_legal_url);
-
-		$this->sendHttpHeaders('Content-Type: application/json');
-
-		// when we fail here, it's pretty darn bad and nothing to it.
-		// just push the error JSON and go.
-		echo json_encode($jserr);
-	}
-
-	/**
-	 * Process the 'detail' event
-	 *
-	 * Returns a JSON encoded HTML chunk describing the specified file (metadata such
-	 * as size, format and possibly a thumbnail image as well)
-	 *
-	 * Expected parameters:
-	 *
-	 * $_POST['directory']     path relative to basedir a.k.a. options['directory'] root
-	 *
-	 * $_POST['file']          filename (including extension, of course) of the file to
-	 *                         be detailed.
-	 *
-	 * $_POST['filter']        optional mimetype filter string, amy be the part up to and
-	 *                         including the slash '/' or the full mimetype. Only files
-	 *                         matching this (set of) mimetypes will be listed.
-	 *                         Examples: 'image/' or 'application/zip'
-	 *
-	 * $_POST['mode']          'auto' or 'direct': in 'direct' mode, all thumbnails are
-	 *                         forcibly generated _right_ _now_ as the client, using this
-	 *                         mode, tells us delayed generating and loading of the
-	 *                         thumbnail image(s) is out of the question.
-	 *                         'auto' mode will simply provide direct thumbnail image
-	 *                         URLs when those are available in cache, while 'auto' mode
-	 *                         will neglect to provide those, expecting the frontend to
-	 *                         delay-load them through another 'event=detail / mode=direct'
-	 *                         request later on.
-	 *                         'metaHTML': show the metadata as extra HTML content in 
-	 *                         the preview pane (you can also turn that off using CSS:
-	 *                             div.filemanager div.filemanager-diag-dump 
-	 *                             {
-	 *                                 display: none;
-	 *                             }
-	 *                         'metaJSON': deliver the extra getID3 metadata in JSON format
-	 *                         in the json['metadata'] field.
-	 *
-	 *                         Modes can be mixed by adding a '+' between them.
-	 *
-	 * Errors will produce a JSON encoded error report, including at least two fields:
-	 *
-	 * status                  0 for error; nonzero for success
-	 *
-	 * error                   error message
-	 */
-	protected function onDetail()
-	{
-		$emsg = null;
-		$legal_url = null;
-		$file_arg = null;
-		$jserr = array(
-				'status' => 1
-			);
-
-		try
-		{
-			$v_ex_code = 'nofile';
-
-			$mode = $this->getPOSTparam('mode');
-			$mode = explode('+', $mode);
-			if (empty($mode))
-			{
-				$mode = array();
-			}
-
-			$file_arg = $this->getPOSTparam('file');
-
-			$dir_arg = $this->getPOSTparam('directory');
-			$legal_url = $this->rel2abs_legal_url_path($dir_arg . '/');
-
-			$mime_filter = $this->getPOSTparam('filter', $this->options['filter']);
-			$mime_filters = $this->getAllowedMimeTypes($mime_filter);
-
-			$filename = null;
-			$file = null;
-			$mime = null;
-			$meta = null;
-			if (!empty($file_arg))
-			{
-				$filename = basename($file_arg);
-				// must normalize the combo as the user CAN legitimally request filename == '.' (directory detail view) for this event!
-				$path = $this->rel2abs_legal_url_path($legal_url . $filename);
-				//echo " path = $path, ($legal_url . $filename);\n";
-				$legal_url = $path;
-				// must transform here so alias/etc. expansions inside legal_url_path2file_path() get a chance:
-				$file = $this->legal_url_path2file_path($legal_url);
-
-				if (is_readable($file))
-				{
-					if (is_file($file))
-					{
-						$meta = $this->getFileInfo($file, $legal_url);
-						$mime = $meta->getMimeType();
-						if (!$this->IsAllowedMimeType($mime, $mime_filters))
-						{
-							$v_ex_code = 'extension';
-						}
-						else
-						{
-							$v_ex_code = null;
-						}
-					}
-					else if (is_dir($file))
-					{
-						$mime = 'text/directory';
-						$v_ex_code = null;
-					}
-				}
-			}
-
-			$fileinfo = array(
-					'legal_url' => $legal_url,
-					'file' => $file,
-					'mode' => $mode,
-					'meta_data' => $meta,
-					'mime' => $mime,
-					'mime_filter' => $mime_filter,
-					'mime_filters' => $mime_filters,
-					'preliminary_json' => $jserr,
-					'validation_failure' => $v_ex_code
-				);
-
-			if (!empty($this->options['DetailIsAuthorized_cb']) && function_exists($this->options['DetailIsAuthorized_cb']) && !$this->options['DetailIsAuthorized_cb']($this, 'detail', $fileinfo))
-			{
-				$v_ex_code = $fileinfo['validation_failure'];
-				if (empty($v_ex_code)) $v_ex_code = 'authorized';
-			}
-			if (!empty($v_ex_code))
-				throw new FileManagerException($v_ex_code);
-
-			$legal_url = $fileinfo['legal_url'];
-			//$file = $fileinfo['file'];
-			$mode = $fileinfo['mode'];
-			$meta = $fileinfo['meta_data'];
-			//$mime = $fileinfo['mime'];
-			$mime_filter = $fileinfo['mime_filter'];
-			$mime_filters = $fileinfo['mime_filters'];
-			$jserr = $fileinfo['preliminary_json'];
-
-			$jserr = $this->extractDetailInfo($jserr, $legal_url, $meta, $mime_filter, $mime_filters, $mode);
-
-			$this->sendHttpHeaders('Content-Type: application/json');
-
-			echo json_encode($jserr);
-			return;
-		}
-		catch(FileManagerException $e)
-		{
-			$emsg = $e->getMessage();
-		}
-		catch(Exception $e)
-		{
-			// catching other severe failures; since this can be anything and should only happen in the direst of circumstances, we don't bother translating
-			$emsg = $e->getMessage();
-		}
-
-		$this->modify_json4exception($jserr, $emsg, 'file = ' . $file_arg . ', path = ' . $legal_url);
-
-		$icon48 = $this->getIconForError($emsg, 'is.default-error', false);
-		$icon48_e = FileManagerUtility::rawurlencode_path($icon48);
-		$icon = $this->getIconForError($emsg, 'is.default-error', true);
-		$icon_e = FileManagerUtility::rawurlencode_path($icon);
-		$jserr['thumb250'] = null;
-		$jserr['thumb48'] = null;
-		$jserr['icon48'] = $icon48_e;
-		$jserr['icon'] = $icon_e;
-
-		$postdiag_err_HTML = '<p class="err_info">' . $emsg . '</p>';
-		$preview_HTML = '${nopreview}';
-		$content = '';
-		//$content .= '<h3>${preview}</h3>';
-		$content .= '<div class="filemanager-preview-content">' . $preview_HTML . '</div>';
-		//$content .= '<h3>Diagnostics</h3>';
-		//$content .= '<div class="filemanager-detail-diag">;
-		$content .= '<div class="filemanager-errors">' . $postdiag_err_HTML . '</div>';
-		//$content .= '</div>';
-
-		$json['content'] = self::compressHTML($content);
-
-		$this->sendHttpHeaders('Content-Type: application/json');
-
-		// when we fail here, it's pretty darn bad and nothing to it.
-		// just push the error JSON and go.
-		echo json_encode($jserr);
-	}
-
-	/**
-	 * Process the 'destroy' event
-	 *
-	 * Delete the specified file or directory and return a JSON encoded status of success
-	 * or failure.
-	 *
-	 * Note that when images are deleted, so are their thumbnails.
-	 *
-	 * Expected parameters:
-	 *
-	 * $_POST['directory']     path relative to basedir a.k.a. options['directory'] root
-	 *
-	 * $_POST['file']          filename (including extension, of course) of the file to
-	 *                         be detailed.
-	 *
-	 * $_POST['filter']        optional mimetype filter string, amy be the part up to and
-	 *                         including the slash '/' or the full mimetype. Only files
-	 *                         matching this (set of) mimetypes will be listed.
-	 *                         Examples: 'image/' or 'application/zip'
-	 *
-	 * Errors will produce a JSON encoded error report, including at least two fields:
-	 *
-	 * status                  0 for error; nonzero for success
-	 *
-	 * error                   error message
-	 */
-	protected function onDestroy()
-	{
-		$emsg = null;
-		$file_arg = null;
-		$legal_url = null;
-		$jserr = array(
-				'status' => 1
-			);
-
-		try
-		{
-			if (!$this->options['destroy'])
-				throw new FileManagerException('disabled:destroy');
-
-			$v_ex_code = 'nofile';
-
-			$file_arg = $this->getPOSTparam('file');
-
-			$dir_arg = $this->getPOSTparam('directory');
-			$legal_url = $this->rel2abs_legal_url_path($dir_arg . '/');
-
-			$mime_filter = $this->getPOSTparam('filter', $this->options['filter']);
-			$mime_filters = $this->getAllowedMimeTypes($mime_filter);
-
-			$filename = null;
-			$file = null;
-			$mime = null;
-			$meta = null;
-			if (!empty($file_arg))
-			{
-				$filename = basename($file_arg);
-				$legal_url .= $filename;
-				// must transform here so alias/etc. expansions inside legal_url_path2file_path() get a chance:
-				$file = $this->legal_url_path2file_path($legal_url);
-
-				if (file_exists($file))
-				{
-					if (is_file($file))
-					{
-						$meta = $this->getFileInfo($file, $legal_url);
-						$mime = $meta->getMimeType();
-						if (!$this->IsAllowedMimeType($mime, $mime_filters))
-						{
-							$v_ex_code = 'extension';
-						}
-						else
-						{
-							$v_ex_code = null;
-						}
-					}
-					else if (is_dir($file))
-					{
-						$mime = 'text/directory';
-						$v_ex_code = null;
-					}
-				}
-			}
-
-			$fileinfo = array(
-					'legal_url' => $legal_url,
-					'file' => $file,
-					'mime' => $mime,
-					'meta_data' => $meta,
-					'mime_filter' => $mime_filter,
-					'mime_filters' => $mime_filters,
-					'preliminary_json' => $jserr,
-					'validation_failure' => $v_ex_code
-				);
-
-			if (!empty($this->options['DestroyIsAuthorized_cb']) && function_exists($this->options['DestroyIsAuthorized_cb']) && !$this->options['DestroyIsAuthorized_cb']($this, 'destroy', $fileinfo))
-			{
-				$v_ex_code = $fileinfo['validation_failure'];
-				if (empty($v_ex_code)) $v_ex_code = 'authorized';
-			}
-			if (!empty($v_ex_code))
-				throw new FileManagerException($v_ex_code);
-
-			$legal_url = $fileinfo['legal_url'];
-			$file = $fileinfo['file'];
-			$meta = $fileinfo['meta_data'];
-			$mime = $fileinfo['mime'];
-			$mime_filter = $fileinfo['mime_filter'];
-			$mime_filters = $fileinfo['mime_filters'];
-			$jserr = $fileinfo['preliminary_json'];
-
-			if (!$this->unlink($legal_url, $mime_filters))
-			{
-				throw new FileManagerException('unlink_failed:' . $legal_url);
-			}
-
-			$this->sendHttpHeaders('Content-Type: application/json');
-
-			echo json_encode(array(
-					'status' => 1,
-					'content' => 'destroyed'
-				));
-			
-			if (!empty($this->options['DestroyIsComplete_cb']) && function_exists($this->options['DestroyIsComplete_cb']))
-				$this->options['DestroyIsComplete_cb']($this, 'destroy', $fileinfo);	
-			
-			return;
-		}
-		catch(FileManagerException $e)
-		{
-			$emsg = $e->getMessage();
-		}
-		catch(Exception $e)
-		{
-			// catching other severe failures; since this can be anything and should only happen in the direst of circumstances, we don't bother translating
-			$emsg = $e->getMessage();
-		}
-
-		$this->modify_json4exception($jserr, $emsg, 'file = ' . $file_arg . ', path = ' . $legal_url);
-
-		$this->sendHttpHeaders('Content-Type: application/json');
-
-		// when we fail here, it's pretty darn bad and nothing to it.
-		// just push the error JSON and go.
-		echo json_encode($jserr);
-	}
-
-	/**
-	 * Process the 'create' event
-	 *
-	 * Create the specified subdirectory and give it the configured permissions
-	 * (options['chmod'], default 0777) and return a JSON encoded status of success
-	 * or failure.
-	 *
-	 * Expected parameters:
-	 *
-	 * $_POST['directory']     path relative to basedir a.k.a. options['directory'] root
-	 *
-	 * $_POST['file']          name of the subdirectory to be created
-	 *
-	 * Extra input parameters considered while producing the JSON encoded directory view.
-	 * These may not seem relevant for an empty directory, but these parameters are also
-	 * considered when providing the fallback directory view in case an error occurred
-	 * and then the listed directory (either the parent or the basedir itself) may very
-	 * likely not be empty!
-	 *
-	 * $_POST['filter']        optional mimetype filter string, amy be the part up to and
-	 *                         including the slash '/' or the full mimetype. Only files
-	 *                         matching this (set of) mimetypes will be listed.
-	 *                         Examples: 'image/' or 'application/zip'
-	 *
-	 * Errors will produce a JSON encoded error report, including at least two fields:
-	 *
-	 * status                  0 for error; nonzero for success
-	 *
-	 * error                   error message
-	 */
-	protected function onCreate()
-	{
-		$emsg = null;
-		$jserr = array(
-				'status' => 1
-			);
-
-		$mime_filter = $this->getPOSTparam('filter', $this->options['filter']);
-
-		$file_arg = null;
-		$legal_url = null;
-
-		try
-		{
-			if (!$this->options['create'])
-				throw new FileManagerException('disabled:create');
-
-			$v_ex_code = 'nofile';
-
-			$file_arg = $this->getPOSTparam('file');
-
-			$dir_arg = $this->getPOSTparam('directory');
-			$legal_url = $this->rel2abs_legal_url_path($dir_arg . '/');
-
-			// must transform here so alias/etc. expansions inside legal_url_path2file_path() get a chance:
-			$dir = $this->legal_url_path2file_path($legal_url);
-
-			$filename = null;
-			$file = null;
-			$newdir = null;
-			if (!empty($file_arg))
-			{
-				$filename = basename($file_arg);
-
-				if (!$this->IsHiddenNameAllowed($file_arg))
-				{
-					$v_ex_code = 'authorized';
-				}
-				else
-				{
-					if (is_dir($dir))
-					{
-						$file = $this->getUniqueName(array('filename' => $filename), $dir);  // a directory has no 'extension'!
-						if ($file !== null)
-						{
-							$newdir = $this->legal_url_path2file_path($legal_url . $file);
-							$v_ex_code = null;
-						}
-					}
-				}
-			}
-
-			$fileinfo = array(
-					'legal_url' => $legal_url,
-					'dir' => $dir,
-					'raw_name' => $filename,
-					'uniq_name' => $file,
-					'newdir' => $newdir,
-					'chmod' => $this->options['chmod'],
-					'preliminary_json' => $jserr,
-					'validation_failure' => $v_ex_code
-				);
-			if (!empty($this->options['CreateIsAuthorized_cb']) && function_exists($this->options['CreateIsAuthorized_cb']) && !$this->options['CreateIsAuthorized_cb']($this, 'create', $fileinfo))
-			{
-				$v_ex_code = $fileinfo['validation_failure'];
-				if (empty($v_ex_code)) $v_ex_code = 'authorized';
-			}
-			if (!empty($v_ex_code))
-				throw new FileManagerException($v_ex_code);
-
-			$legal_url = $fileinfo['legal_url'];
-			$dir = $fileinfo['dir'];
-			$filename = $fileinfo['raw_name'];
-			$file = $fileinfo['uniq_name'];
-			$newdir = $fileinfo['newdir'];
-			$jserr = $fileinfo['preliminary_json'];
-
-			if (!@mkdir($newdir, $fileinfo['chmod'], true))
-			{
-				throw new FileManagerException('mkdir_failed:' . $this->legal2abs_url_path($legal_url) . $file);
-			}
-
-			$this->sendHttpHeaders('Content-Type: application/json');
-
-			// success, now show the new directory as a list view:
-			$rv = $this->_onView($legal_url . $file . '/', $jserr, $mime_filter);
-
-			echo json_encode($rv);
-			return;
-		}
-		catch(FileManagerException $e)
-		{
-			$emsg = $e->getMessage();
-
-			$jserr['status'] = 0;
-
-			// and fall back to showing the PARENT directory
-			try
-			{
-				$jserr = $this->_onView($legal_url, $jserr, $mime_filter);
-			}
-			catch (Exception $e)
-			{
-				// and fall back to showing the BASEDIR directory
-				try
-				{
-					$legal_url = $this->options['directory'];
-					$jserr = $this->_onView($legal_url, $jserr, $mime_filter);
-				}
-				catch (Exception $e)
-				{
-					// when we fail here, it's pretty darn bad and nothing to it.
-					// just push the error JSON and go.
-				}
-			}
-		}
-		catch(Exception $e)
-		{
-			// catching other severe failures; since this can be anything and should only happen in the direst of circumstances, we don't bother translating
-			$emsg = $e->getMessage();
-
-			$jserr['status'] = 0;
-
-			// and fall back to showing the PARENT directory
-			try
-			{
-				$jserr = $this->_onView($legal_url, $jserr, $mime_filter);
-			}
-			catch (Exception $e)
-			{
-				// and fall back to showing the BASEDIR directory
-				try
-				{
-					$legal_url = $this->options['directory'];
-					$jserr = $this->_onView($legal_url, $jserr, $mime_filter);
-				}
-				catch (Exception $e)
-				{
-					// when we fail here, it's pretty darn bad and nothing to it.
-					// just push the error JSON and go.
-				}
-			}
-		}
-
-		$this->modify_json4exception($jserr, $emsg, 'directory = ' . $file_arg . ', path = ' . $legal_url);
-
-		$this->sendHttpHeaders('Content-Type: application/json');
-
-		// when we fail here, it's pretty darn bad and nothing to it.
-		// just push the error JSON and go.
-		echo json_encode($jserr);
-	}
-
-	/**
-	 * Process the 'download' event
-	 *
-	 * Send the file content of the specified file for download by the client.
-	 * Only files residing within the directory tree rooted by the
-	 * 'basedir' (options['directory']) will be allowed to be downloaded.
-	 *
-	 * Expected parameters:
-	 *
-	 * $_POST['file']         filepath of the file to be downloaded
-	 *
-	 * $_POST['filter']       optional mimetype filter string, amy be the part up to and
-	 *                        including the slash '/' or the full mimetype. Only files
-	 *                        matching this (set of) mimetypes will be listed.
-	 *                        Examples: 'image/' or 'application/zip'
-	 *
-	 * On errors a HTTP 403 error response will be sent instead.
-	 */
-	protected function onDownload()
-	{
-		$emsg = null;
-		$file_arg = null;
-		$file = null;
-		$jserr = array(
-				'status' => 1
-			);
-		
-		try
-		{
-			if (!$this->options['download'])
-				throw new FileManagerException('disabled:download');
-
-			$v_ex_code = 'nofile';
-
-			$file_arg = $this->getPOSTparam('file');
-
-			$mime_filter = $this->getPOSTparam('filter', $this->options['filter']);
-			$mime_filters = $this->getAllowedMimeTypes($mime_filter);
-
-			$legal_url = null;
-			$file = null;
-			$mime = null;
-			$meta = null;
-			if (!empty($file_arg))
-			{
-				$legal_url = $this->rel2abs_legal_url_path($file_arg);
-
-				// must transform here so alias/etc. expansions inside legal_url_path2file_path() get a chance:
-				$file = $this->legal_url_path2file_path($legal_url);
-
-				if (is_readable($file))
-				{
-					if (is_file($file))
-					{
-						$meta = $this->getFileInfo($file, $legal_url);
-						$mime = $meta->getMimeType();
-						if (!$this->IsAllowedMimeType($mime, $mime_filters))
-						{
-							$v_ex_code = 'extension';
-						}
-						else
-						{
-							$v_ex_code = null;
-						}
-					}
-					else
-					{
-						$mime = 'text/directory';
-					}
-				}
-			}
-
-			$fileinfo = array(
-					'legal_url' => $legal_url,
-					'file' => $file,
-					'mime' => $mime,
-					'meta_data' => $meta,
-					'mime_filter' => $mime_filter,
-					'mime_filters' => $mime_filters,
-					'validation_failure' => $v_ex_code
-				);
-			if (!empty($this->options['DownloadIsAuthorized_cb']) && function_exists($this->options['DownloadIsAuthorized_cb']) && !$this->options['DownloadIsAuthorized_cb']($this, 'download', $fileinfo))
-			{
-				$v_ex_code = $fileinfo['validation_failure'];
-				if (empty($v_ex_code)) $v_ex_code = 'authorized';
-			}
-			if (!empty($v_ex_code))
-				throw new FileManagerException($v_ex_code);
-
-			$legal_url = $fileinfo['legal_url'];
-			$file = $fileinfo['file'];
-			$meta = $fileinfo['meta_data'];
-			$mime = $fileinfo['mime'];
-			$mime_filter = $fileinfo['mime_filter'];
-			$mime_filters = $fileinfo['mime_filters'];
-
-
-			if ($fd = fopen($file, 'rb'))
-			{
-				$fsize = filesize($file);
-				$fi = pathinfo($legal_url);
-				
-				// Based on the gist here: https://gist.github.com/854168
-				// Reference: http://codeutopia.net/blog/2009/03/06/sending-files-better-apache-mod_xsendfile-and-php/
-				// We should:
-				// 1. try to use Apache mod_xsendfile
-				// 2. Try to chunk the file into pieces
-				// 3. If the file is sufficiently small, send it directly
-
-				$hdrs = array();
-				// see also: http://www.boutell.com/newfaq/creating/forcedownload.html
-				switch ($mime)
-				{
-				// add here more mime types for different file types and special handling by the client on download
-				case 'application/pdf':
-					$hdrs[] = 'Content-Type: ' . $mime;
-					break;
-
-				default:
-					$hdrs[] = 'Content-Type: application/octet-stream';
-					break;
-				}
-				
-				$hdrs[] = 'Content-Disposition: attachment; filename="' . $fi['basename'] . '"'; // use 'attachment' to force a download
-				
-				// Content length isn't requied for mod_xsendfile (Apache handles this for us)
-				$modx = $this->options['enableXSendFile'] && function_exists('apache_get_modules') && in_array('mod_xsendfile', apache_get_modules());
-				if ($modx)
-				{
-					$hdrs[] = 'X-Sendfile: '.$file;
-				}
-				else
-				{
-					$hdrs[] = 'Content-length: ' . $fsize;
-					$hdrs[] = 'Expires: 0';
-					$hdrs[] = 'Cache-Control: must-revalidate, post-check=0, pre-check=0';
-					$hdrs[] = '!Cache-Control: private'; // flag as FORCED APPEND; use this to open files directly
-				}
-
-				$this->sendHttpHeaders($hdrs);
-				
-				if (!$modx)
-				{
-					$chunksize = 4*1024; // 4KB blocks
-					if ($fsize > $chunksize)
-					{
-						// Turn off compression which prevents files from being re-assembled properly (especially zip files)
-						function_exists('apache_setenv') && @apache_setenv('no-gzip', 1);
-						@ini_set('zlib.output_compression', 0);
-						
-						// Turn off any additional buffering by the server
-						@ini_set('implicit_flush', 1);
-						
-						// Disable any timeouts
-						@set_time_limit(0);
-						while (!feof($fd))
-						{
-							echo @fread($fd, $chunksize);
-							ob_flush();
-							flush();
-						}
-					}
-					else
-					{
-						fpassthru($fd);
-					}
-				}
-
-				fclose($fd);
-				
-				if (!empty($this->options['DownloadIsComplete_cb']) && function_exists($this->options['DownloadIsComplete_cb']))
-	               		  $this->options['DownloadIsComplete_cb']($this, 'download', $fileinfo);
-	
-				return;
-			}
-			
-			$emsg = 'read_error';
-
-			
-		}
-		catch(FileManagerException $e)
-		{
-			$emsg = $e->getMessage();
-		}
-		catch(Exception $e)
-		{
-			// catching other severe failures; since this can be anything and should only happen in the direst of circumstances, we don't bother translating
-			$emsg = $e->getMessage();
-		}
-
-		// we don't care whether it's a 404, a 403 or something else entirely: we feed 'em a 403 and that's final!
-		send_response_status_header(403);
-
-		$this->modify_json4exception($jserr, $emsg, 'file = ' . $this->mkSafe4Display($file_arg . ', destination path = ' . $file));
-		
-		$this->sendHttpHeaders('Content-Type: text/plain');        // Safer for iframes: the 'application/json' mime type would cause FF3.X to pop up a save/view dialog when transmitting these error reports!
-
-		// when we fail here, it's pretty darn bad and nothing to it.
-		// just push the error JSON and go.
-		echo json_encode($jserr);
-	}
-
-	/**
-	 * Process the 'upload' event
-	 *
-	 * Process and store the uploaded file in the designated location.
-	 * Images will be resized when possible and applicable. A thumbnail image will also
-	 * be preproduced when possible.
-	 * Return a JSON encoded status of success or failure.
-	 *
-	 * Expected parameters:
-	 *
-	 * $_POST['directory']    path relative to basedir a.k.a. options['directory'] root
-	 *
-	 * $_POST['resize']       nonzero value indicates any uploaded image should be resized to the configured
-	 *                        options['maxImageDimension'] width and height whenever possible
-	 *
-	 * $_POST['filter']       optional mimetype filter string, amy be the part up to and
-	 *                        including the slash '/' or the full mimetype. Only files
-	 *                        matching this (set of) mimetypes will be listed.
-	 *                        Examples: 'image/' or 'application/zip'
-	 *
-	 * $_FILES[]              the metadata for the uploaded file
-	 *
-	 * $_POST['reportContentType']
-	 *                        if you want a specific content type header set on our response, put it here.
-	 *                        This is needed for when we are posting an upload response to a hidden iframe, the
-	 *                        default application/json mimetype breaks down in that case at least for Firefox 3.X
-	 *                        as the browser will pop up a save/view dialog before JS can access the transmitted data.
-	 *
-	 * Errors will produce a JSON encoded error report, including at least two fields:
-	 *
-	 * status                 0 for error; nonzero for success
-	 *
-	 * error                  error message
-	 */
-	protected function onUpload()
-	{
-		$emsg = null;
-		$file_arg = null;
-		$file = null;
-		$legal_dir_url = null;
-		$jserr = array(
-				'status' => 1
-			);
-
-		try
-		{
-			if (!$this->options['upload'])
-				throw new FileManagerException('disabled:upload');
-
-			// MAY upload zero length files!
-			if (!isset($_FILES) || empty($_FILES['Filedata']) || empty($_FILES['Filedata']['name']))
-				throw new FileManagerException('nofile');
-
-			$v_ex_code = 'nofile';
-
-			$file_size = (empty($_FILES['Filedata']['size']) ? 0 : $_FILES['Filedata']['size']);
-
-			$file_arg = $_FILES['Filedata']['name'];
-
-			$dir_arg = $this->getPOSTparam('directory');
-			$legal_dir_url = $this->rel2abs_legal_url_path($dir_arg . '/');
-			// must transform here so alias/etc. expansions inside legal_url_path2file_path() get a chance:
-			$dir = $this->legal_url_path2file_path($legal_dir_url);
-
-			$mime_filter = $this->getPOSTparam('filter', $this->options['filter']);
-			$mime_filters = $this->getAllowedMimeTypes($mime_filter);
-
-			$tmppath = $_FILES['Filedata']['tmp_name'];
-
-			$resize_imgs = $this->getPOSTparam('resize', 0);
-
-			$filename = null;
-			$fi = array('filename' => null, 'extension' => null);
-			$mime = null;
-			$meta = null;
-			if (!empty($file_arg))
-			{
-				if (!$this->IsHiddenNameAllowed($file_arg))
-				{
-					$v_ex_code = 'fmt_not_allowed';
-				}
-				else
-				{
-          if ($this->options['safe'])
-          {
-            $safeext      = $this->getSafeExtension(preg_replace('/^.*\./', '', $file_arg));           
-            $file_arg = preg_replace('/\..*$/', '', $file_arg) . ".$safeext";
-          }
-          
-					$filename = $this->getUniqueName($file_arg, $dir);
-					if ($filename !== null)
-					{
-						/*
-						 * Security:
-						 *
-						 * Upload::move() processes the unfiltered version of $_FILES[]['name'], at least to get the extension,
-						 * unless we ALWAYS override the filename and extension in the options array below. That's why we
-						 * calculate the extension at all times here.
-						 */
-						if ($this->options['safe'])
-						{
-							$fi = pathinfo($filename);
-							$fi['extension'] = $this->getSafeExtension(isset($fi['extension']) ? $fi['extension'] : '');
-							$filename = $fi['filename'] . ((isset($fi['extension']) && strlen($fi['extension']) > 0) ? '.' . $fi['extension'] : '');
-						}
-
-						$legal_url = $legal_dir_url . $filename;
-
-						// UPLOAD delivers files in temporary storage with extensions NOT matching the mime type, so we don't
-						// filter on extension; we just let getID3 go ahead and content-sniff the mime type.
-						// Since getID3::analyze() is a quite costly operation, we like to do it only ONCE per file,
-						// so we cache the last entries.
-						$meta = $this->getFileInfo($tmppath, $legal_url);
-						$mime = $meta->getMimeType();
-						if (!$this->IsAllowedMimeType($mime, $mime_filters))
-						{
-							$v_ex_code = 'extension';
-						}
-						else
-						{
-							$v_ex_code = null;
-						}
-					}
-				}
-			}
-
-			$fileinfo = array(
-				'legal_dir_url' => $legal_dir_url,
-				'dir' => $dir,
-				'raw_filename' => $file_arg,
-				'filename' => $filename,
-				'meta_data' => $meta,
-				'mime' => $mime,
-				'mime_filter' => $mime_filter,
-				'mime_filters' => $mime_filters,
-				'tmp_filepath' => $tmppath,
-				'size' => $file_size,
-				'maxsize' => $this->options['maxUploadSize'],
-				'overwrite' => false,
-				'resize' => $resize_imgs,
-				'chmod' => $this->options['chmod'] & 0666,   // security: never make those files 'executable'!
-				'preliminary_json' => $jserr,
-				'validation_failure' => $v_ex_code
-			);
-			if (!empty($this->options['UploadIsAuthorized_cb']) && function_exists($this->options['UploadIsAuthorized_cb']) && !$this->options['UploadIsAuthorized_cb']($this, 'upload', $fileinfo))
-			{
-				$v_ex_code = $fileinfo['validation_failure'];
-				if (empty($v_ex_code)) $v_ex_code = 'authorized';
-			}
-			if (!empty($v_ex_code))
-				throw new FileManagerException($v_ex_code);
-
-			$legal_dir_url = $fileinfo['legal_dir_url'];
-			$dir = $fileinfo['dir'];
-			$file_arg = $fileinfo['raw_filename'];
-			$filename = $fileinfo['filename'];
-			$meta = $fileinfo['meta_data'];
-			$mime = $fileinfo['mime'];
-			$mime_filter = $fileinfo['mime_filter'];
-			$mime_filters = $fileinfo['mime_filters'];
-			//$tmppath = $fileinfo['tmp_filepath'];
-			$resize_imgs = $fileinfo['resize'];
-			$jserr = $fileinfo['preliminary_json'];
-
-			if ($fileinfo['maxsize'] && $fileinfo['size'] > $fileinfo['maxsize'])
-				throw new FileManagerException('size');
-
-			//if (!isset($fileinfo['extension']))
-			//  throw new FileManagerException('extension');
-
-			// must transform here so alias/etc. expansions inside legal_url_path2file_path() get a chance:
-			$legal_url = $legal_dir_url . $filename;
-			$file = $this->legal_url_path2file_path($legal_url);
-
-			if (!$fileinfo['overwrite'] && file_exists($file))
-				throw new FileManagerException('exists');
-
-			if (!@move_uploaded_file($_FILES['Filedata']['tmp_name'], $file))
-			{
-				$emsg = 'path';
-				switch ($_FILES['Filedata']['error'])
-				{
-				case 1:
-				case 2:
-					$emsg = 'size';
-					break;
-
-				case 3:
-					$emsg = 'partial';
-					break;
-
-				default:
-					$dir = $this->legal_url_path2file_path($legal_dir_url);
-					if (!is_dir($dir))
-					{
-						$emsg = 'path';
-					}
-					else if (!is_writable($dir))
-					{
-						$emsg = 'path_not_writable';
-					}
-					else
-					{
-						$emsg = 'filename_maybe_too_large';
-					}
-
-					if (!empty($_FILES['Filedata']['error']))
-					{
-						$emsg .= ': error code = ' . strtolower($_FILES['Filedata']['error']) . ', ' . $emsg_add;
-					}
-					break;
-				}
-				throw new FileManagerException($emsg);
-			}
-
-			@chmod($file, $fileinfo['chmod']);
-
-			/*
-			 * NOTE: you /can/ (and should be able to, IMHO) upload 'overly large' image files to your site, but the resizing process step
-			 *       happening here will fail; we have memory usage estimators in place to make the fatal crash a non-silent one, i,e, one
-			 *       where we still have a very high probability of NOT fatally crashing the PHP iunterpreter but catching a suitable exception
-			 *       instead.
-			 *       Having uploaded such huge images, a developer/somebody can always go in later and up the memory limit if the site admins
-			 *       feel it is deserved. Until then, no thumbnails of such images (though you /should/ be able to milkbox-view the real thing!)
-			 */
-			$thumb250   = false;
-			$thumb250_e = false;
-			$thumb48    = false;
-			$thumb48_e  = false;
-			if (FileManagerUtility::startsWith($mime, 'image/'))
-			{
-				if (!empty($resize_imgs))
-				{
-					$img = new Image($file);
-					$size = $img->getSize();
-					// Image::resize() takes care to maintain the proper aspect ratio, so this is easy
-					// (default quality is 100% for JPEG so we get the cleanest resized images here)
-					$img->resize($this->options['maxImageDimension']['width'], $this->options['maxImageDimension']['height'])->save();
-					unset($img);
-					
-					// source image has changed: nuke the cached metadata and then refetch the metadata = forced refetch
-					$meta = $this->getFileInfo($file, $legal_url, true);
-				}
-			}
-
-			/*
-			 * 'abuse' the info extraction process to generate the thumbnails. Besides, doing it this way will also prime the metadata cache for this item,
-			 * so we'll have a very fast performance viewing this file's details and thumbnails both from this point forward!
-			 */
-			$jsbogus = array('status' => 1);
-			$jsbogus = $this->extractDetailInfo($jsbogus, $legal_url, $meta, $mime_filter, $mime_filters, array('direct'));
-
-			$this->sendHttpHeaders('Content-Type: ' . $this->getPOSTparam('reportContentType', 'application/json'));
-
-			echo json_encode(array(
-					'status' => 1,
-					'name' => basename($file)
-				));
-			
-			if (!empty($this->options['UploadIsComplete_cb']) && function_exists($this->options['UploadIsComplete_cb']))
-				$this->options['UploadIsComplete_cb']($this, 'upload', $fileinfo);
-			
-			return;
-		}
-		catch(FileManagerException $e)
-		{
-			$emsg = $e->getMessage();
-		}
-		catch(Exception $e)
-		{
-			// catching other severe failures; since this can be anything and should only happen in the direst of circumstances, we don't bother translating
-			$emsg = $e->getMessage();
-		}
-
-		$this->modify_json4exception($jserr, $emsg, 'file = ' . $this->mkSafe4Display($file_arg . ', destination path = ' . $file . ', target directory (URI path) = ' . $legal_dir_url));
-
-		$this->sendHttpHeaders('Content-Type: ' . $this->getPOSTparam('reportContentType', 'application/json'));
-
-		// when we fail here, it's pretty darn bad and nothing to it.
-		// just push the error JSON and go.
-		echo json_encode(array_merge($jserr, $_FILES));
-	}
-
-	/**
-	 * Process the 'move' event (with is used by both move/copy and rename client side actions)
-	 *
-	 * Copy or move/rename a given file or directory and return a JSON encoded status of success
-	 * or failure.
-	 *
-	 * Expected parameters:
-	 *
-	 *   $_POST['copy']          nonzero value means copy, zero or nil for move/rename
-	 *
-	 * Source filespec:
-	 *
-	 *   $_POST['directory']     path relative to basedir a.k.a. options['directory'] root
-	 *
-	 *   $_POST['file']          original name of the file/subdirectory to be renamed/copied
-	 *
-	 * Destination filespec:
-	 *
-	 *   $_POST['newDirectory']  path relative to basedir a.k.a. options['directory'] root;
-	 *                           target directory where the file must be moved / copied
-	 *
-	 *   $_POST['name']          target name of the file/subdirectory to be renamed
-	 *
-	 * Errors will produce a JSON encoded error report, including at least two fields:
-	 *
-	 * status                    0 for error; nonzero for success
-	 *
-	 * error                     error message
-	 */
-	protected function onMove()
-	{
-		$emsg = null;
-		$file_arg = null;
-		$legal_url = null;
-		$newpath = null;
-		$jserr = array(
-				'status' => 1
-			);
-
-		try
-		{
-			if (!$this->options['move'])
-				throw new FileManagerException('disabled:rn_mv_cp');
-
-			$v_ex_code = 'nofile';
-
-			$file_arg = $this->getPOSTparam('file');
-
-			$dir_arg = $this->getPOSTparam('directory');
-			$legal_url = $this->rel2abs_legal_url_path($dir_arg . '/');
-
-			// must transform here so alias/etc. expansions inside legal_url_path2file_path() get a chance:
-			$dir = $this->legal_url_path2file_path($legal_url);
-
-			$newdir_arg = $this->getPOSTparam('newDirectory');
-			$newname_arg = $this->getPOSTparam('name');
-			$rename = (empty($newdir_arg) && !empty($newname_arg));
-
-			$is_copy = !!$this->getPOSTparam('copy');
-
-			$filename = null;
-			$path = null;
-			$fn = null;
-			$legal_newurl = null;
-			$newdir = null;
-			$newname = null;
-			$newpath = null;
-			$is_dir = false;
-			if (!$this->IsHiddenPathAllowed($newdir_arg) || !$this->IsHiddenNameAllowed($newname_arg))
-			{
-				$v_ex_code = 'authorized';
-			}
-			else
-			{
-				if (!empty($file_arg))
-				{
-					$filename = basename($file_arg);
-					$path = $this->legal_url_path2file_path($legal_url . $filename);
-
-					if (file_exists($path))
-					{
-						$is_dir = is_dir($path);
-
-						// note: we do not support copying entire directories, though directory rename/move is okay
-						if ($is_copy && $is_dir)
-						{
-							$v_ex_code = 'disabled:rn_mv_cp';
-						}
-						else if ($rename)
-						{
-							$fn = 'rename';
-							$legal_newurl = $legal_url;
-							$newdir = $dir;
-
-							$newname = basename($newname_arg);
-							if ($is_dir)
-								$newname = $this->getUniqueName(array('filename' => $newname), $newdir);  // a directory has no 'extension'
-							else
-								$newname = $this->getUniqueName($newname, $newdir);
-
-							if ($newname === null)
-							{
-								$v_ex_code = 'nonewfile';
-							}
-							else
-							{
-								// when the new name seems to have a different extension, make sure the extension doesn't change after all:
-								// Note: - if it's only 'case' we're changing here, then exchange the extension instead of appending it.
-								//       - directories do not have extensions
-								$extOld = pathinfo($filename, PATHINFO_EXTENSION);
-								$extNew = pathinfo($newname, PATHINFO_EXTENSION);
-								if ((!$this->options['allowExtChange'] || (!$is_dir && empty($extNew))) && !empty($extOld) && strtolower($extOld) != strtolower($extNew))
-								{
-									$newname .= '.' . $extOld;
-								}
-								$v_ex_code = null;
-							}
-						}
-						else
-						{
-							$fn = ($is_copy ? 'copy' : 'rename' /* 'move' */);
-							$legal_newurl = $this->rel2abs_legal_url_path($newdir_arg . '/');
-							$newdir = $this->legal_url_path2file_path($legal_newurl);
-
-							if ($is_dir)
-								$newname = $this->getUniqueName(array('filename' => $filename), $newdir);  // a directory has no 'extension'
-							else
-								$newname = $this->getUniqueName($filename, $newdir);
-
-							if ($newname === null)
-								$v_ex_code = 'nonewfile';
-							else
-								$v_ex_code = null;
-						}
-
-						if (empty($v_ex_code))
-						{
-							$newpath = $this->legal_url_path2file_path($legal_newurl . $newname);
-						}
-					}
-				}
-			}
-
-			$fileinfo = array(
-					'legal_url' => $legal_url,
-					'dir' => $dir,
-					'path' => $path,
-					'name' => $filename,
-					'legal_newurl' => $legal_newurl,
-					'newdir' => $newdir,
-					'newpath' => $newpath,
-					'newname' => $newname,
-					'rename' => $rename,
-					'is_dir' => $is_dir,
-					'function' => $fn,
-					'preliminary_json' => $jserr,
-					'validation_failure' => $v_ex_code
-				);
-
-			if (!empty($this->options['MoveIsAuthorized_cb']) && function_exists($this->options['MoveIsAuthorized_cb']) && !$this->options['MoveIsAuthorized_cb']($this, 'move', $fileinfo))
-			{
-				$v_ex_code = $fileinfo['validation_failure'];
-				if (empty($v_ex_code)) $v_ex_code = 'authorized';
-			}
-			if (!empty($v_ex_code))
-				throw new FileManagerException($v_ex_code);
-
-			$legal_url = $fileinfo['legal_url'];
-			$dir = $fileinfo['dir'];
-			$path = $fileinfo['path'];
-			$filename = $fileinfo['name'];
-			$legal_newurl = $fileinfo['legal_newurl'];
-			$newdir = $fileinfo['newdir'];
-			$newpath = $fileinfo['newpath'];
-			$newname = $fileinfo['newname'];
-			$rename = $fileinfo['rename'];
-			$is_dir = $fileinfo['is_dir'];
-			$fn = $fileinfo['function'];
-			$jserr = $fileinfo['preliminary_json'];
-
-			if ($rename)
-			{
-				// try to remove the thumbnail & other cache entries related to the original file; don't mind if it doesn't exist
-				$flurl = $legal_url . $filename;
-				$meta = &$this->getid3_cache->pick($flurl, $this, false);
-				assert($meta != null);
-				if (!$meta->delete(true))
-				{
-					throw new FileManagerException('delete_cache_entries_failed');
-				}
-				unset($meta);
-			}
-
-			if (!function_exists($fn))
-				throw new FileManagerException((empty($fn) ? 'rename' : $fn) . '_failed');
-			if (!@$fn($path, $newpath))
-				throw new FileManagerException($fn . '_failed');
-
-			$this->sendHttpHeaders('Content-Type: application/json');
-
-			// jserr['status'] == 1
-			$jserr['name'] = $newname;
-
-			echo json_encode($jserr);
-			return;
-		}
-		catch(FileManagerException $e)
-		{
-			$emsg = $e->getMessage();
-		}
-		catch(Exception $e)
-		{
-			// catching other severe failures; since this can be anything and should only happen in the direst of circumstances, we don't bother translating
-			$emsg = $e->getMessage();
-		}
-
-		$this->modify_json4exception($jserr, $emsg, 'file = ' . $file_arg . ', path = ' . $legal_url . ', destination path = ' . $newpath);
-
-		$this->sendHttpHeaders('Content-Type: application/json');
-
-		// when we fail here, it's pretty darn bad and nothing to it.
-		// just push the error JSON and go.
-		echo json_encode($jserr);
-	}
-
-
-
-
-
-
-
-
-
-
-	/**
-	 * Send the listed headers when possible; the input parameter is an array of header strings or a single header string.
-	 *
-	 * NOTE: when a header string starts with the '!' character, it means that header is required
-	 * to be appended to the header output set and not overwrite any existing equal header.
-	 */
-	public function sendHttpHeaders($headers)
-	{
-		if (!headers_sent())
-		{
-			$headers = array_merge(array(
-				'Expires: Fri, 01 Jan 1990 00:00:00 GMT',
-				'Cache-Control: no-cache, no-store, max-age=0, must-revalidate'
-			), (is_array($headers) ? $headers : array($headers)));
-
-			foreach($headers as $h)
-			{
-				$append_flag = ($h[0] == '!');
-				$h = ltrim($h, '!');
-				header($h, $append_flag);
-			}
-		}
-	}
-
-
-
-
-	// derived from   http://www.php.net/manual/en/function.filesize.php#100097
-	public function format_bytes($bytes)
-	{
-		if ($bytes < 1024)
-			return $bytes . ' Bytes';
-		elseif ($bytes < 1048576)
-			return round($bytes / 1024, 2) . ' KB (' . $bytes . ' Bytes)';
-		elseif ($bytes < 1073741824)
-			return round($bytes / 1048576, 2) . ' MB (' . $bytes . ' Bytes)';
-		else
-			return round($bytes / 1073741824, 2) . ' GB (' . $bytes . ' Bytes)';
-	}
-
-	/**
-	 * Produce a HTML snippet detailing the given file in the JSON 'content' element; place additional info
-	 * in the JSON elements 'thumbnail', 'thumb48', 'thumb250', 'width', 'height', ...
-	 *
-	 * Return an augmented JSON array.
-	 *
-	 * Throw an exception on error.
-	 */
-	public function extractDetailInfo($json_in, $legal_url, &$meta, $mime_filter, $mime_filters, $mode)
-	{
-		$auto_thumb_gen_mode = !in_array('direct', $mode, true);
-		$metaHTML_mode = in_array('metaHTML', $mode, true);
-		$metaJSON_mode = in_array('metaJSON', $mode, true);
-
-		$url = $this->legal2abs_url_path($legal_url);
-		$filename = basename($url);
-
-		// must transform here so alias/etc. expansions inside url_path2file_path() get a chance:
-		$file = $this->url_path2file_path($url);
-
-		$isdir = !is_file($file);
-		$bad_ext = false;
-		$mime = null;
-		// only perform the (costly) getID3 scan when it hasn't been done before, i.e. can we re-use previously obtained data or not?
-		if (!is_object($meta))
-		{
-			$meta = $this->getFileInfo($file, $legal_url);
-		}
-		if (!$isdir)
-		{
-			$mime = $meta->getMimeType();
-
-			$mime2 = $this->getMimeFromExt($file);
-			$meta->store('mime_type from file extension', $mime2);
-
-			$bad_ext = ($mime2 != $mime);
-			if ($bad_ext)
-			{
-				$iconspec = 'is.' + $this->getExtFromMime($mime);
-			}
-			else
-			{
-				$iconspec = $filename;
-			}
-
-			if (!$this->IsAllowedMimeType($mime, $mime_filters))
-				throw new FileManagerException('extension');
-		}
-		else if (is_dir($file))
-		{
-			$mime = $meta->getMimeType();
-			// $mime = 'text/directory';
-			$iconspec = 'is.directory';
-		}
-		else
-		{
-			// simply do NOT list anything that we cannot cope with.
-			// That includes clearly inaccessible files (and paths) with non-ASCII characters:
-			// PHP5 and below are a real mess when it comes to handling Unicode filesystems
-			// (see the php.net site too: readdir / glob / etc. user comments and the official
-			// notice that PHP will support filesystem UTF-8/Unicode only when PHP6 is released.
-			//
-			// Big, fat bummer!
-			throw new FileManagerException('nofile');
-		}
-
-		// as all the work below is quite costly, we check whether the already loaded cache entry got our number:
-		// several chunks of work below may have been cached and when they have been, use the cached data.
-
-		// it's an internal error when this entry do not exist in the cache store by now!
-		$fi = $meta->fetch('analysis');
-		//assert(!empty($fi));
-
-		$icon48 = $this->getIcon($iconspec, false);
-		$icon = $this->getIcon($iconspec, true);
-
-		$thumb250 = $meta->fetch('thumb250_direct');
-		$thumb48 = $meta->fetch('thumb48_direct');
-		$thumb250_e = false;
-		$thumb48_e  = false;
-
-		$tstamp_str = date($this->options['dateFormat'], @filemtime($file));
-		$fsize = @filesize($file);
-		$fsize_str = empty($fsize) ? '-' : $this->format_bytes($fsize); // convert to T/G/M/K-bytes:
-    
-		$json = array_merge(array(
-				//'status' => 1,
-				//'mimetype' => $mime,
-				'content' => self::compressHTML('<div class="margin">
-					${nopreview}
-				</div>')
-			),
-			array(
-				'path' => $legal_url,
-				'url'  => $url,
-				'name' => $filename,
-				'date' => $tstamp_str,
-				'mime' => $mime,
-				'size' => $fsize,
-				'modified' => @filemtime($file),
-				'size_str' => $fsize_str
-			));
-
-		$content = '<dl>
-						<dt>${modified}</dt>
-						<dd class="filemanager-modified">' . $tstamp_str . '</dd>
-						<dt>${type}</dt>
-						<dd class="filemanager-type">' . $mime . '</dd>
-						<dt>${size}</dt>
-						<dd class="filemanager-size">' . $fsize_str . '</dd>';
-		$content_dl_term = false;
-
-		$preview_HTML = null;
-		$postdiag_err_HTML = '';
-		$postdiag_dump_HTML = '';
-		$thumbnails_done_or_deferred = false;   // TRUE: mark our thumbnail work as 'done'; any NULL thumbnails represent deferred generation entries!
-		$check_for_embedded_img = false;
-
-		$mime_els = explode('/', $mime);
-		for(;;) // bogus loop; only meant to assist the [mime remapping] state machine in here
-		{
-			switch ($mime_els[0])
-			{
-			case 'image':
-				/*
-				 * thumbnail_gen_mode === 'auto':
-				 *
-				 * offload the thumbnailing process to another event ('event=thumbnail') to be fired by the client
-				 * when it's time to render the thumbnail:
-				 * WE simply assume the thumbnail will be there, and when it doesn't, that's
-				 * for the event=thumbnail handler to worry about (creating the thumbnail on demand or serving
-				 * a generic icon image instead). Meanwhile, we are able to speed up the response process here quite
-				 * a bit (rendering thumbnails from very large images can take a lot of time!)
-				 *
-				 * To further improve matters, we first generate the 250px thumbnail and then generate the 48px
-				 * thumbnail from that one (if it doesn't already exist). That saves us one more time processing
-				 * the (possibly huge) original image; downscaling the 250px file is quite fast, relatively speaking.
-				 *
-				 * That bit of code ASSUMES that the thumbnail will be generated from the file argument, while
-				 * the url argument is used to determine the thumbnail name/path.
-				 */
-				$emsg = null;
-				try
-				{
-					if (empty($thumb250))
-					{
-						$thumb250 = $this->getThumb($meta, $file, $this->options['thumbBigSize'], $this->options['thumbBigSize'], $auto_thumb_gen_mode);
-					}
-					if (!empty($thumb250))
-					{
-						$thumb250_e = FileManagerUtility::rawurlencode_path($thumb250);
-					}
-					if (empty($thumb48))
-					{
-						$thumb48 = $this->getThumb($meta, (!empty($thumb250) ? $this->url_path2file_path($thumb250) : $file), $this->options['thumbSmallSize'], $this->options['thumbSmallSize'], $auto_thumb_gen_mode);
-					}
-					if (!empty($thumb48))
-					{
-						$thumb48_e = FileManagerUtility::rawurlencode_path($thumb48);
-					}
-
-					if (empty($thumb48) || empty($thumb250))
-					{
-						/*
-						 * do NOT generate the thumbnail itself yet (it takes too much time!) but do check whether it CAN be generated
-						 * at all: THAT is a (relatively speaking) fast operation!
-						 */
-						$imginfo = Image::checkFileForProcessing($file);
-					}
-					$thumbnails_done_or_deferred = true;
-				}
-				catch (Exception $e)
-				{
-					$emsg = $e->getMessage();
-					$icon48 = $this->getIconForError($emsg, $legal_url, false);
-					$icon = $this->getIconForError($emsg, $legal_url, true);
-					// even cache the fail: that means next time around we don't suffer the failure but immediately serve the error icon instead.
-				}
-
-				$width = round($this->getID3infoItem($fi, 0, 'video', 'resolution_x'));
-				$height = round($this->getID3infoItem($fi, 0, 'video', 'resolution_y'));
-				$json['width'] = $width;
-				$json['height'] = $height;
-
-				$content .= '
-						<dt>${width}</dt><dd>' . $width . 'px</dd>
-						<dt>${height}</dt><dd>' . $height . 'px</dd>
-					</dl>';
-				$content_dl_term = true;
-
-				$sw_make = $this->mkSafeUTF8($this->getID3infoItem($fi, null, 'jpg', 'exif', 'IFD0', 'Software'));
-				$time_make = $this->mkSafeUTF8($this->getID3infoItem($fi, null, 'jpg', 'exif', 'IFD0', 'DateTime'));
-
-				if (!empty($sw_make) || !empty($time_make))
-				{
-					$content .= '<p>Made with ' . (empty($sw_make) ? '???' : $sw_make) . ' @ ' . (empty($time_make) ? '???' : $time_make) . '</p>';
-				}
-
-				// are we delaying the thumbnail generation? When yes, then we need to infer the thumbnail dimensions *anyway*!
-				if (empty($thumb48) && $thumbnails_done_or_deferred)
-				{
-					$dims = $this->predictThumbDimensions($width, $height, $this->options['thumbSmallSize'], $this->options['thumbSmallSize']);
-
-					$json['thumb48_width'] = $dims['width'];
-					$json['thumb48_height'] = $dims['height'];
-				}
-				if (empty($thumb250))
-				{
-					if ($thumbnails_done_or_deferred)
-					{
-						// to show the loader.gif in the preview <img> tag, we MUST set a width+height there, so we guestimate the thumbnail250 size as accurately as possible
-						//
-						// derive size from original:
-						$dims = $this->predictThumbDimensions($width, $height, $this->options['thumbBigSize'], $this->options['thumbBigSize']);
-
-						$preview_HTML = '<a href="' . FileManagerUtility::rawurlencode_path($url) . '" data-milkbox="single" title="' . htmlentities($filename, ENT_QUOTES, 'UTF-8') . '">
-									   <img src="' . $this->options['assetBasePath'] . 'Images/transparent.gif" class="preview" alt="preview" style="width: ' . $dims['width'] . 'px; height: ' . $dims['height'] . 'px;" />
-									 </a>';
-
-						$json['thumb250_width'] = $dims['width'];
-						$json['thumb250_height'] = $dims['height'];
-					}
-					else
-					{
-						// when we get here, a failure occurred before, so we only will have the icons. So we use those:
-						$preview_HTML = '<a href="' . FileManagerUtility::rawurlencode_path($url) . '" data-milkbox="single" title="' . htmlentities($filename, ENT_QUOTES, 'UTF-8') . '">
-									   <img src="' . FileManagerUtility::rawurlencode_path($icon48) . '" class="preview" alt="preview" />
-									 </a>';
-					}
-				}
-				// else: defer the $preview_HTML production until we're at the end of this and have fetched the actual thumbnail dimensions
-
-				if (!empty($emsg))
-				{
-					// use the abilities of modify_json4exception() to munge/format the exception message:
-					$jsa = array('error' => '');
-					$this->modify_json4exception($jsa, $emsg, 'path = ' . $url);
-					$postdiag_err_HTML .= "\n" . '<p class="err_info">' . $jsa['error'] . '</p>';
-
-					if (strpos($emsg, 'img_will_not_fit') !== false)
-					{
-						$earr = explode(':', $emsg, 2);
-						$postdiag_err_HTML .= "\n" . '<p class="tech_info">Estimated minimum memory requirements to create thumbnails for this image: ' . $earr[1] . '</p>';
-					}
-				}
-				break;
-
-			case 'text':
-				switch ($mime_els[1])
-				{
-				case 'directory':
-					$preview_HTML = '';
-					break;
-
-				default:
-					// text preview:
-					$filecontent = @file_get_contents($file, false, null, 0);
-					if ($filecontent === false)
-						throw new FileManagerException('nofile');
-
-					if (!FileManagerUtility::isBinary($filecontent))
-					{
-						$preview_HTML = '<pre>' . str_replace(array('$', "\t"), array('&#36;', '&nbsp;&nbsp;'), htmlentities($filecontent, ENT_NOQUOTES, 'UTF-8')) . '</pre>';
-					}
-					else
-					{
-						// else: fall back to 'no preview available' (if getID3 didn't deliver instead...)
-						$mime_els[0] = 'unknown'; // remap!
-						continue 3;
-					}
-					break;
-				}
-				break;
-
-			case 'application':
-				switch ($mime_els[1])
-				{
-				case 'x-javascript':
-					$mime_els[0] = 'text'; // remap!
-					continue 3;
-
-				case 'zip':
-					$out = array(array(), array());
-					$info = $this->getID3infoItem($fi, null, 'zip', 'files');
-					if (is_array($info))
-					{
-						foreach ($info as $name => $size)
-						{
-							$name = $this->mkSafeUTF8($name);
-							$isdir = is_array($size);
-							$out[$isdir ? 0 : 1][$name] = '<li><a><img src="' . FileManagerUtility::rawurlencode_path($this->getIcon($name, true)) . '" alt="" /> ' . $name . '</a></li>';
-						}
-						natcasesort($out[0]);
-						natcasesort($out[1]);
-						$preview_HTML = '<ul>' . implode(array_merge($out[0], $out[1])) . '</ul>';
-					}
-					break;
-
-				case 'x-shockwave-flash':
-					$check_for_embedded_img = true;
-
-					$info = $this->getID3infoItem($fi, null, 'swf', 'header');
-					if (is_array($info))
-					{
-						$width = round($this->getID3infoItem($fi, 0, 'swf', 'header', 'frame_width') / 10);
-						$height = round($this->getID3infoItem($fi, 0, 'swf', 'header', 'frame_height') / 10);
-						$json['width'] = $width;
-						$json['height'] = $height;
-
-						$content .= '
-								<dt>${width}</dt><dd>' . $width . 'px</dd>
-								<dt>${height}</dt><dd>' . $height . 'px</dd>
-								<dt>${length}</dt><dd>' . round($this->getID3infoItem($fi, 0, 'swf', 'header', 'length') / $this->getID3infoItem($fi, 25, 'swf', 'header', 'frame_count')) . 's</dd>
-							</dl>';
-						$content_dl_term = true;
-					}
-					break;
-
-				default:
-					// else: fall back to 'no preview available' (if getID3 didn't deliver instead...)
-					$mime_els[0] = 'unknown'; // remap!
-					continue 3;
-				}
-				break;
-
-			case 'audio':
-				$check_for_embedded_img = true;
-
-				$title = $this->mkSafeUTF8($this->getID3infoItem($fi, $this->getID3infoItem($fi, '???', 'tags', 'id3v1', 'title', 0), 'tags', 'id3v2', 'title', 0));
-				$artist = $this->mkSafeUTF8($this->getID3infoItem($fi, $this->getID3infoItem($fi, '???', 'tags', 'id3v1', 'artist', 0), 'tags', 'id3v2', 'artist', 0));
-				$album = $this->mkSafeUTF8($this->getID3infoItem($fi, $this->getID3infoItem($fi, '???', 'tags', 'id3v1', 'album', 0), 'tags', 'id3v2', 'album', 0));
-				$length =  $this->mkSafeUTF8($this->getID3infoItem($fi, '???', 'playtime_string'));
-				$bitrate = round($this->getID3infoItem($fi, 0, 'bitrate') / 1000);
-				
-        $json = array_merge($json, array('title' => $title, 'artist' => $artist, 'album' => $album, 'length' => $length, 'bitrate' => $bitrate));
-        
-				$content .= '
-						<dt>${title}</dt><dd>' . $title . '</dd>
-						<dt>${artist}</dt><dd>' . $artist . '</dd>
-						<dt>${album}</dt><dd>' . $album . '</dd>
-						<dt>${length}</dt><dd>' . $length . '</dd>
-						<dt>${bitrate}</dt><dd>' . $bitrate . 'kbps</dd>
-					</dl>';
-				$content_dl_term = true;
-				break;
-
-			case 'video':
-				$check_for_embedded_img = true;
-
-				$a_fmt = $this->mkSafeUTF8($this->getID3infoItem($fi, '???', 'audio', 'dataformat'));
-				$a_samplerate = round($this->getID3infoItem($fi, 0, 'audio', 'sample_rate') / 1000, 1);
-				$a_bitrate = round($this->getID3infoItem($fi, 0, 'audio', 'bitrate') / 1000, 1);
-				$a_bitrate_mode = $this->mkSafeUTF8($this->getID3infoItem($fi, '???', 'audio', 'bitrate_mode'));
-				$a_channels = round($this->getID3infoItem($fi, 0, 'audio', 'channels'));
-				$a_codec = $this->mkSafeUTF8($this->getID3infoItem($fi, '', 'audio', 'codec'));
-				$a_streams = $this->getID3infoItem($fi, '???', 'audio', 'streams');
-				$a_streamcount = (is_array($a_streams) ? count($a_streams) : 0);
-
-				$v_fmt = $this->mkSafeUTF8($this->getID3infoItem($fi, '???', 'video', 'dataformat'));
-				$v_bitrate = round($this->getID3infoItem($fi, 0, 'video', 'bitrate') / 1000, 1);
-				$v_bitrate_mode = $this->mkSafeUTF8($this->getID3infoItem($fi, '???', 'video', 'bitrate_mode'));
-				$v_framerate = round($this->getID3infoItem($fi, 0, 'video', 'frame_rate'), 5);
-				$v_width = round($this->getID3infoItem($fi, '???', 'video', 'resolution_x'));
-				$v_height = round($this->getID3infoItem($fi, '???', 'video', 'resolution_y'));
-				$v_par = round($this->getID3infoItem($fi, 1.0, 'video', 'pixel_aspect_ratio'), 7);
-				$v_codec = $this->mkSafeUTF8($this->getID3infoItem($fi, '', 'video', 'codec'));
-
-				$g_bitrate = round($this->getID3infoItem($fi, 0, 'bitrate') / 1000, 1);
-				$g_playtime_str = $this->mkSafeUTF8($this->getID3infoItem($fi, '???', 'playtime_string'));
-
-				$content .= '
-						<dt>Audio</dt><dd>';
-				if ($a_fmt === '???' && $a_samplerate == 0 && $a_bitrate == 0 && $a_bitrate_mode === '???' && $a_channels == 0 && empty($a_codec) && $a_streams === '???' && $a_streamcount == 0)
-				{
-					$content .= '-';
-				}
-				else
-				{
-					$content .= $a_fmt . (!empty($a_codec) ? ' (' . $a_codec . ')' : '') .
-								(!empty($a_channels) ? ($a_channels === 1 ? ' (mono)' : ($a_channels === 2 ? ' (stereo)' : ' (' . $a_channels . ' channels)')) : '') .
-								': ' . $a_samplerate . ' kHz @ ' . $a_bitrate . ' kbps (' . strtoupper($a_bitrate_mode) . ')' .
-								($a_streamcount > 1 ? ' (' . $a_streamcount . ' streams)' : '');
-				}
-				$content .= '</dd>
-						<dt>Video</dt><dd>' . $v_fmt . (!empty($v_codec) ? ' (' . $v_codec . ')' : '') .  ': ' . $v_framerate . ' fps @ ' . $v_bitrate . ' kbps (' . strtoupper($v_bitrate_mode) . ')' .
-											($v_par != 1.0 ? ', PAR: ' . $v_par : '') .
-									'</dd>
-						<dt>${width}</dt><dd>' . $v_width . 'px</dd>
-						<dt>${height}</dt><dd>' . $v_height . 'px</dd>
-						<dt>${length}</dt><dd>' . $g_playtime_str . '</dd>
-						<dt>${bitrate}</dt><dd>' . $g_bitrate . 'kbps</dd>
-					</dl>';
-				$content_dl_term = true;
-				break;
-
-			default:
-				// fall back to 'no preview available' (if getID3 didn't deliver instead...)
-				break;
-			}
-			break;
-		}
-
-		if (!$content_dl_term)
-		{
-			$content .= '</dl>';
-		}
-
-		if (!empty($fi['error']))
-		{
-			$postdiag_err_HTML .= '<p class="err_info">' . $this->mkSafeUTF8(implode(', ', $fi['error'])) . '</p>';
-		}
-
-		$emsgX = null;
-		if (empty($thumb250))
-		{
-			if (!$thumbnails_done_or_deferred)
-			{
-				// check if we have stored a thumbnail for this file anyhow:
-				$thumb250 = $this->getThumb($meta, $file, $this->options['thumbBigSize'], $this->options['thumbBigSize'], true);
-				if (empty($thumb250))
-				{
-					if (!empty($fi) && $check_for_embedded_img)
-					{
-						/*
-						 * No thumbnail available yet, so find me one!
-						 *
-						 * When we find a thumbnail during the 'cleanup' scan, we don't know up front if it's suitable to be used directly,
-						 * so we treat it as an alternative 'original' file and generate a 250px/48px thumbnail set from it.
-						 *
-						 * When the embedded thumbnail is small enough, the thumbnail creation process will be simply a copy action, so relatively
-						 * low cost.
-						 */
-						$embed = $this->extract_ID3info_embedded_image($fi);
-						//@file_put_contents(dirname(__FILE__) . '/extract_embedded_img.log', print_r(array('html' => $preview_HTML, 'json' => $json, 'thumb250_e' => $thumb250_e, 'thumb250' => $thumb250, 'embed' => $embed, 'fileinfo' => $fi), true));
-						if (is_object($embed))
-						{
-							$thumbX = $meta->getThumbURL('embed');
-							$tfi = pathinfo($thumbX);
-							$tfi['extension'] = image_type_to_extension($embed->metadata[2]);
-							$thumbX = $tfi['dirname'] . '/' . $tfi['filename'] . '.' . $tfi['extension'];
-							$thumbX = $this->normalize($thumbX);
-							$thumbX_f = $this->url_path2file_path($thumbX);
-							// as we've spent some effort to dig out the embedded thumbnail, and 'knowing' (assuming) that generally
-							// embedded thumbnails are not too large, we don't concern ourselves with delaying the thumbnail generation (the
-							// source file mapping is not bidirectional, either!) and go straight ahead and produce the 250px thumbnail at least.
-							$thumb250   = false;
-							$thumb250_e = false;
-							$thumb48    = false;
-							$thumb48_e  = false;
-							$meta->mkCacheDir();
-							if (false === file_put_contents($thumbX_f, $embed->imagedata))
-							{
-								@unlink($thumbX_f);
-								$emsgX = 'Cannot save embedded image data to cache.';
-								$icon48 = $this->getIcon('is.default-error', false);
-								$icon = $this->getIcon('is.default-error', true);
-							}
-							else
-							{
-								try
-								{
-									$thumb250 = $this->getThumb($meta, $thumbX_f, $this->options['thumbBigSize'], $this->options['thumbBigSize'], false);
-									if (!empty($thumb250))
-									{
-										$thumb250_e = FileManagerUtility::rawurlencode_path($thumb250);
-									}
-									$thumb48 = $this->getThumb($meta, (!empty($thumb250) ? $this->url_path2file_path($thumb250) : $thumbX_f), $this->options['thumbSmallSize'], $this->options['thumbSmallSize'], false);
-									if (!empty($thumb48))
-									{
-										$thumb48_e = FileManagerUtility::rawurlencode_path($thumb48);
-									}
-								}
-								catch (Exception $e)
-								{
-									$emsgX = $e->getMessage();
-									$icon48 = $this->getIconForError($emsgX, $legal_url, false);
-									$icon = $this->getIconForError($emsgX, $legal_url, true);
-								}
-							}
-						}
-					}
-				}
-				else
-				{
-					// !empty($thumb250)
-					$thumb250_e = FileManagerUtility::rawurlencode_path($thumb250);
-					try
-					{
-						$thumb48 = $this->getThumb($meta, $this->url_path2file_path($thumb250), $this->options['thumbSmallSize'], $this->options['thumbSmallSize'], false);
-						assert(!empty($thumb48));
-						$thumb48_e = FileManagerUtility::rawurlencode_path($thumb48);
-					}
-					catch (Exception $e)
-					{
-						$emsgX = $e->getMessage();
-						$icon48 = $this->getIconForError($emsgX, $legal_url, false);
-						$icon = $this->getIconForError($emsgX, $legal_url, true);
-						$thumb48 = false;
-						$thumb48_e = false;
-					}
-				}
-			}
-		}
-		else // if (!empty($thumb250))
-		{
-			if (empty($thumb250_e))
-			{
-				$thumb250_e = FileManagerUtility::rawurlencode_path($thumb250);
-			}
-			if (empty($thumb48))
-			{
-				try
-				{
-					$thumb48 = $this->getThumb($meta, $this->url_path2file_path($thumb250), $this->options['thumbSmallSize'], $this->options['thumbSmallSize'], false);
-					assert(!empty($thumb48));
-					$thumb48_e = FileManagerUtility::rawurlencode_path($thumb48);
-				}
-				catch (Exception $e)
-				{
-					$emsgX = $e->getMessage();
-					$icon48 = $this->getIconForError($emsgX, $legal_url, false);
-					$icon = $this->getIconForError($emsgX, $legal_url, true);
-					$thumb48 = false;
-					$thumb48_e = false;
-				}
-			}
-			if (empty($thumb48_e))
-			{
-				$thumb48_e = FileManagerUtility::rawurlencode_path($thumb48);
-			}
-		}
-
-		// also provide X/Y size info with each direct-access thumbnail file:
-		if (!empty($thumb250))
-		{
-			$json['thumb250'] = $thumb250_e;
-			$meta->store('thumb250_direct', $thumb250);
-
-			$tnsize = $meta->fetch('thumb250_info');
-			if (empty($tnsize))
-			{
-				$tnsize = getimagesize($this->url_path2file_path($thumb250));
-				$meta->store('thumb250_info', $tnsize);
-			}
-			if (is_array($tnsize))
-			{
-				$json['thumb250_width'] = $tnsize[0];
-				$json['thumb250_height'] = $tnsize[1];
-
-				if (empty($preview_HTML))
-				{
-					$preview_HTML = '<a href="' . FileManagerUtility::rawurlencode_path($url) . '" data-milkbox="single" title="' . htmlentities($filename, ENT_QUOTES, 'UTF-8') . '">
-									   <img src="' . $thumb250_e . '" class="preview" alt="' . (!empty($emsgX) ? $this->mkSafe4HTMLattr($emsgX) : 'preview') . '"
-											style="width: ' . $tnsize[0] . 'px; height: ' . $tnsize[1] . 'px;" />
-									 </a>';
-				}
-			}
-		}
-		if (!empty($thumb48))
-		{
-			$json['thumb48'] = $thumb48_e;
-			$meta->store('thumb48_direct', $thumb48);
-
-			$tnsize = $meta->fetch('thumb48_info');
-			if (empty($tnsize))
-			{
-				$tnsize = getimagesize($this->url_path2file_path($thumb48));
-				$meta->store('thumb48_info', $tnsize);
-			}
-			if (is_array($tnsize))
-			{
-				$json['thumb48_width'] = $tnsize[0];
-				$json['thumb48_height'] = $tnsize[1];
-			}
-		}
-		if ($thumbnails_done_or_deferred && (empty($thumbs250) || empty($thumbs48)))
-		{
-			$json['thumbs_deferred'] = true;
-		}
-		else
-		{
-			$json['thumbs_deferred'] = false;
-		}
-
-		if (!empty($icon48))
-		{
-			$icon48_e = FileManagerUtility::rawurlencode_path($icon48);
-			$json['icon48'] = $icon48_e;
-		}
-		if (!empty($icon))
-		{
-			$icon_e = FileManagerUtility::rawurlencode_path($icon);
-			$json['icon'] = $icon_e;
-		}
-
-		$fi4dump = null;
-		if (!empty($fi))
-		{
-			try
-			{
-				$fi4dump = $meta->fetch('file_info_dump');
-				if (empty($fi4dump))
-				{
-					$fi4dump = array_merge(array(), $fi); // clone $fi
-					$this->clean_ID3info_results($fi4dump);
-					$meta->store('file_info_dump', $fi4dump);
-				}
-
-				$dump = FileManagerUtility::table_var_dump($fi4dump, false);
-
-				$postdiag_dump_HTML .= "\n" . $dump . "\n";
-				//@file_put_contents(dirname(__FILE__) . '/getid3.log', print_r(array('html' => $preview_HTML, 'json' => $json, 'thumb250_e' => $thumb250_e, 'thumb250' => $thumb250, 'embed' => $embed, 'fileinfo' => $fi), true));
-			}
-			catch(Exception $e)
-			{
-				$postdiag_err_HTML .= '<p class="err_info">' . $e->getMessage() . '</p>';
-			}
-		}
-
-		if ($preview_HTML === null)
-		{
-			$preview_HTML = '${nopreview}';
-		}
-
-		if (!empty($preview_HTML))
-		{
-			//$content .= '<h3>${preview}</h3>';
-			$content .= '<div class="filemanager-preview-content">' . $preview_HTML . '</div>';
-		}
-		if (!empty($postdiag_err_HTML))
-		{
-			$content .= '<div class="filemanager-errors">' . $postdiag_err_HTML . '</div>';
-		}
-		if (!empty($postdiag_dump_HTML) && $metaHTML_mode)
-		{
-			$content .= '<div class="filemanager-diag-dump">' . $postdiag_dump_HTML . '</div>';
-		}
-
-		$json['content'] = self::compressHTML($content);
-		$json['metadata'] = ($metaJSON_mode ? $fi4dump : null);
-
-		return array_merge((is_array($json_in) ? $json_in : array()), $json);
-	}
-
-	/**
-	 * Traverse the getID3 info[] array tree and fetch the item pointed at by the variable number of indices specified
-	 * as additional parameters to this function.
-	 *
-	 * Return the default value when the indicated element does not exist in the info[] set; otherwise return the located item.
-	 *
-	 * The purpose of this method is to act as a safe go-in-between for the fileManager to collect arbitrary getID3 data and
-	 * not get a PHP error when some item in there does not exist.
-	 */
-	public /* static */ function getID3infoItem($getid3_info_obj, $default_value /* , ... */ )
-	{
-		$rv = false;
-		$argc = func_num_args();
-
-		for ($i = 2; $i < $argc; $i++)
-		{
-      $index = func_get_arg($i);
-			if (!is_array($getid3_info_obj))
-			{
-        // the getID3 library seems to return an array for id3 tags, the fall back does not, we
-        // will just short circuit this, it'll be fine.
-        if($i == $argc-1 && $index === 0) return $getid3_info_obj;
-        
-				return $default_value;
-			}
-
-			if (array_key_exists($index, $getid3_info_obj))
-			{
-				$getid3_info_obj = $getid3_info_obj[$index];
-			}
-			else
-			{
-				return $default_value;
-			}
-		}
-		// WARNING: convert '$' to the HTML entity to prevent the JS/client side from 'seeing' the $ and start ${xyz} template variable replacement erroneously
-		return str_replace('$', '&#36;', $getid3_info_obj);
-	}
-
-  /** Return an array of information about a file.
-   *
-   *    IFF the getID3 library (GPL) is available, it will be used.
-   *    ELSE IF FileInfo extention is available, we will try that for getting mimetype
-   *    ELSE do it manually
-   *
-   *  == All Files ==
-   *  mime_type
-   *
-   *  == Images ==   
-   *  video:[resolution_x, resolution_y] 
-   *  jpg:exif:IFD0:[Software, DateTime]
-   *
-   *  == Zip Files ==
-   *  zip:files (an array (name => size|files))
-   *
-   *  == Flash Files ==
-   *  swf:header:[frame_width, frame_height, frame_count, length]
-   *
-   *  == Audio Files ==
-   *  tags:id3v1:[title,artist,album]    
-   *  playtime_string
-   *  bitrate
-   *
-   *  == Video Files ==
-   *  audio:[dataformat,sample_rate,bitrate,bitrate_mode,channels,codec,streams]
-   *  video:[dataformat,bitrate,bitrate_mode,frame_rate,resolution_x,resolution_y,pixel_aspect_ratio,codec]
-   *  bitrate
-   *  playtime_string
-   */
-   
-  public function analyze_file($file, $legal_url)
-  {
-    if($this->options['useGetID3IfAvailable'] && (class_exists('getID3') || file_exists(strtr(dirname(__FILE__), '\\', '/') . '/Assets/getid3/getid3.php')))
-    {
-      // Note delaying requiring getiD3 until now, because it is big and we don't need it if the data is cached already.
-      if(!class_exists('GetId3'))
-      {
-        require(strtr(dirname(__FILE__), '\\', '/') . '/Assets/getid3/getid3.php');
-      }
-
-      $id3 = new getID3();
-      $id3->setOption(array('encoding' => 'UTF-8'));
-      $id3->analyze($file);      
-      $rv = $id3->info;
-      if (empty($rv['mime_type']))
-      {
-        // guarantee to produce a mime type, at least!
-        $rv['mime_type'] = $this->getMimeFromExt($legal_url);     // guestimate mimetype when content sniffing didn't work
-      }
-      
-      return $rv;
-    }
-    else
-    {
-      $rv = array();
-      
-      if(function_exists('finfo_open') && defined('FILEINFO_MIME_TYPE'))
-      {
-        if(!isset($this->_finfo)) $this->_finfo = finfo_open(FILEINFO_MIME_TYPE);
-        $rv['mime_type'] = finfo_file($this->_finfo, $file);        
-      }
-      
-      if(!@$rv['mime_type'])
-      {
-        $rv['mime_type'] = $this->getMimeFromExt($legal_url);     // guestimate mimetype when content sniffing didn't work
-      }
-                  
-      switch(preg_replace('/\/.*$/', '', $rv['mime_type']))
-      {
-        case 'image':
-        {
-          $size = getimagesize($file);
-          if($size !== FALSE)
-          {
-            $rv['video']['resolution_x'] = $size[0];
-            $rv['video']['resolution_y'] = $size[1];                        
-          }
-          
-          if(function_exists('exif_imagetype') && exif_imagetype($file) !== FALSE)
-          {
-            $rv['exif'] = @exif_read_data($file, 0, true);    
-            $rv['jpg']['exif'] = $rv['exif']; // Not strictly true!
-          }
-        }
-        break;
-        
-        case 'audio':
-        {
-          switch($rv['mime_type'])
-          {
-            case 'audio/mpeg':
-            {
-              require_once(strtr(dirname(__FILE__), '\\', '/') . '/ID3.class.php');
-              $ID3 = new id3Parser();
-              $tags = $ID3->read($file);
-              switch($tags['id3'])
-              {                
-                case 1: $rv['tags']['id3v1'] = $tags; 
-                default: $rv['tags']['id3v2'] = $tags;
-              }
-              
-            }            
-            break;
-          }
-        }
-        break;
-      }
-      
-      return $rv;
-    }
-  }
-
-
-
-	/**
-	 * Extract an embedded image from the getID3 info data.
-	 *
-	 * Return FALSE when no embedded image was found, otherwise return an array of the metadata and the binary image data itself.
-	 */
-	protected function extract_ID3info_embedded_image(&$arr)
-	{
-		if (is_array($arr))
-		{
-			foreach ($arr as $key => &$value)
-			{
-				if ($key === 'data' && isset($arr['image_mime']))
-				{
-					// first make sure this is a valid image
-					$imageinfo = array();
-					$imagechunkcheck = getid3_lib::GetDataImageSize($value, $imageinfo);
-					if (is_array($imagechunkcheck) && isset($imagechunkcheck[2]) && in_array($imagechunkcheck[2], array(IMAGETYPE_GIF, IMAGETYPE_JPEG, IMAGETYPE_PNG)))
-					{
-						return new EmbeddedImageContainer($imagechunkcheck, $value);
-					}
-				}
-				else if (is_array($value))
-				{
-					$rv = $this->extract_ID3info_embedded_image($value);
-					if ($rv !== false)
-						return $rv;
-				}
-			}
-		}
-		return false;
-	}
-
-	protected function fold_quicktime_subatoms(&$arr, &$inject, $key_prefix)
-	{
-		$satms = false;
-		if (!empty($arr['subatoms']) && is_array($arr['subatoms']) && !empty($arr['hierarchy']) && !empty($arr['name']) && $arr['hierarchy'] == $arr['name'])
-		{
-			// fold these up all the way to the root:
-			$key_prefix .= '.' . $arr['hierarchy'];
-
-			$satms = $arr['subatoms'];
-			unset($arr['subatoms']);
-			$inject[$key_prefix] = $satms;
-		}
-
-		foreach ($arr as $key => &$value)
-		{
-			if (is_array($value))
-			{
-				$this->fold_quicktime_subatoms($value, $inject, $key_prefix);
-			}
-		}
-
-		if ($satms !== false)
-		{
-			$this->fold_quicktime_subatoms($inject[$key_prefix], $inject, $key_prefix);
-		}
-	}
-
-	// assumes an input array with the keys in CamelCase semi-Hungarian Notation. Convert those keys to something humanly grokkable after it is processed by table_var_dump().
-	protected function clean_AVI_Hungarian(&$arr)
-	{
-		$dst = array();
-		foreach($arr as $key => &$value)
-		{
-			$nk = explode('_', preg_replace('/([A-Z])/', '_\\1', $key));
-			switch ($nk[0])
-			{
-			case 'dw':
-			case 'n':
-			case 'w':
-			case 'bi':
-				unset($nk[0]);
-				break;
-			}
-			$dst[strtolower(implode('_', $nk))] = $value;
-		}
-		$arr = $dst;
-	}
-
-	// another round of scanning to rewrite the keys to human legibility: as this changes the keys, we'll need to rewrite all entries to keep order intact
-	protected function clean_ID3info_keys(&$arr)
-	{
-		$dst = array();
-		foreach($arr as $key => &$value)
-		{
-			$key = strtr($key, "_\x00", '  ');
-
-			// custom transformations: (hopefully switch/case/case/... is faster than str_replace/strtr here)
-			switch ((string)$key)
-			{
-			default:
-				//$key = $this->mkSafeUTF8($key);
-				if (preg_match('/[^ -~]/', $key))
-				{
-					// non-ASCII values in the key: hexdump those characters!
-					$klen = strlen($key);
-					$nk = '';
-					for ($i = 0; $i < $klen; ++$i)
-					{
-						$c = ord($key[$i]);
-
-						if ($c >= 32 && $c <= 127)
-						{
-							$nk .= chr($c);
-						}
-						else
-						{
-							$nk .= sprintf('$%02x', $c);
-						}
-					}
-					$key = $nk;
-				}
-				break;
-
-			case 'avdataend':
-				$key = 'AV data end';
-				break;
-
-			case 'avdataoffset':
-				$key = 'AV data offset';
-				break;
-
-			case 'channelmode':
-				$key = 'channel mode';
-				break;
-
-			case 'dataformat':
-				$key = 'data format';
-				break;
-
-			case 'fileformat':
-				$key = 'file format';
-				break;
-
-			case 'modeextension':
-				$key = 'mode extension';
-				break;
-			}
-
-			$dst[$key] = $value;
-			if (is_array($value))
-			{
-				$this->clean_ID3info_keys($dst[$key]);
-			}
-		}
-		$arr = $dst;
-	}
-
-	protected function clean_ID3info_results_r(&$arr, $flags)
-	{
-		if (is_array($arr))
-		{
-			// heuristic #1: fold all the quickatoms subatoms using their hierarchy and name fields; this is a tree rewrite
-			if (array_key_exists('quicktime', $arr) && is_array($arr['quicktime']))
-			{
-				$inject = array();
-				$this->fold_quicktime_subatoms($arr['quicktime'], $inject, 'quicktime');
-
-				// can't use array_splice on associative arrays, so we rewrite $arr now:
-				$newarr = array();
-				foreach ($arr as $key => &$value)
-				{
-					$newarr[$key] = $value;
-					if ($key === 'quicktime')
-					{
-						foreach ($inject as $ik => &$iv)
-						{
-							$newarr[$ik] = $iv;
-						}
-					}
-				}
-				$arr = $newarr;
-				unset($inject);
-				unset($newarr);
-			}
-
-			$activity = true;
-			while ($activity)
-			{
-				$activity = false; // assume there's nothing to do anymore. Prove us wrong now...
-
-				// heuristic #2: when the number of items in the array which are themselves arrays is 80%, contract the set
-				$todo = array();
-				foreach ($arr as $key => &$value)
-				{
-					if (is_array($value))
-					{
-						$acnt = 0;
-						foreach ($value as $sk => &$sv)
-						{
-							if (is_array($sv))
-							{
-								$acnt++;
-							}
-						}
-
-						// the floor() here helps to fold single-element arrays alongside! :-)
-						if (floor(0.5 * count($value)) <= $acnt)
-						{
-							$todo[] = $key;
-						}
-					}
-				}
-				if (count($todo) > 0)
-				{
-					$inject = array();
-					foreach ($arr as $key => &$value)
-					{
-						if (is_array($value) && in_array($key, $todo))
-						{
-							unset($todo[$key]);
-
-							foreach ($value as $sk => &$sv)
-							{
-								$nk = $key . '.' . $sk;
-
-								// pull up single entry subsubarrays at the same time!
-								if (is_array($sv) && count($sv) == 1)
-								{
-									foreach ($sv as $sk2 => &$sv2)
-									{
-										$nk .= '.' . $sk2;
-										$inject[$nk] = $sv2;
-									}
-								}
-								else
-								{
-									$inject[$nk] = $sv;
-								}
-							}
-						}
-						else
-						{
-							$inject[$key] = $value;
-						}
-					}
-					$arr = $inject;
-					$activity = true;
-				}
-			}
-
-			foreach ($arr as $key => &$value)
-			{
-				if ($key === 'data' && isset($arr['image_mime']))
-				{
-					// when this is a valid image, it's already available as a thumbnail, most probably
-					$imageinfo = array();
-					$imagechunkcheck = getid3_lib::GetDataImageSize($value, $imageinfo);
-					if (is_array($imagechunkcheck) && isset($imagechunkcheck[2]) && in_array($imagechunkcheck[2], array(IMAGETYPE_GIF, IMAGETYPE_JPEG, IMAGETYPE_PNG)))
-					{
-						if ($flags & MTFM_CLEAN_ID3_STRIP_EMBEDDED_IMAGES)
-						{
-							$value = new BinaryDataContainer('(embedded image ' . image_type_to_extension($imagechunkcheck[2]) . ' data...)');
-						}
-						else
-						{
-							$value = new EmbeddedImageContainer($imagechunkcheck, $value);
-						}
-					}
-					else
-					{
-						if ($flags & MTFM_CLEAN_ID3_STRIP_EMBEDDED_IMAGES)
-						{
-							$value = new BinaryDataContainer('(unidentified image data ... ' . (is_string($value) ? 'length = ' . strlen($value) : '') . ' -- ' . print_r($imagechunkcheck) . ')');
-						}
-						else
-						{
-							$this->clean_ID3info_results_r($value, $flags);
-						}
-					}
-				}
-				else if (isset($arr[$key . '_guid']))
-				{
-					// convert guid raw binary data to hex:
-					$temp = unpack('H*', $value);
-					$value = new BinaryDataContainer($temp[1]);
-				}
-				else if (  $key === 'non_intra_quant'                                                                       // MPEG quantization matrix
-						|| $key === 'error_correct_type'
-						)
-				{
-					// convert raw binary data to hex in 32 bit chunks:
-					$temp = unpack('H*', $value);
-					$temp = str_split($temp[1], 8);
-					$value = new BinaryDataContainer(implode(' ', $temp));
-				}
-				else if ($key === 'data' && is_string($value) && isset($arr['frame_name']) && isset($arr['encoding']) && isset($arr['datalength'])) // MP3 tag chunk
-				{
-					$str = $this->mkSafeUTF8(trim(strtr(getid3_lib::iconv_fallback($arr['encoding'], 'UTF-8', $value), "\x00", ' ')));
-					$temp = unpack('H*', $value);
-					$temp = str_split($temp[1], 8);
-					$value = new BinaryDataContainer(implode(' ', $temp) . (!empty($str) ? ' (' . $str . ')' : ''));
-				}
-				else if (  ($key === 'data' && is_string($value) && isset($arr['offset']) && isset($arr['size']))           // AVI offset/size/data items: data = binary
-						|| ($key === 'type_specific_data' && is_string($value) /* && isset($arr['type_specific_len']) */ )  // munch WMV/RM 'type specific data': binary   ('type specific len' will occur alongside, but not in WMV)
-						)
-				{
-					// a bit like UNIX strings tool: strip out anything which isn't at least possibly legible
-					$str = ' ' . preg_replace('/[^ !#-~]/', ' ', strtr($value, "\x00", ' ')) . ' ';     // convert non-ASCII and double quote " to space
-					do
-					{
-						$repl_count = 0;
-						$str = preg_replace(array('/ [^ ] /',
-												  '/ [^A-Za-z0-9\\(.]/',
-												  '/ [A-Za-z0-9][^A-Za-z0-9\\(. ] /'
-												 ), ' ', $str, -1, $repl_count);
-					} while ($repl_count > 0);
-					$str = trim($str);
-
-					if (strlen($value) <= 256)
-					{
-						$temp = unpack('H*', $value);
-						$temp = str_split($temp[1], 8);
-						$temp = implode(' ', $temp);
-						$value = new BinaryDataContainer($temp . (!empty($str) > 0 ? ' (' . $str . ')' : ''));
-					}
-					else
-					{
-						$value = new BinaryDataContainer('binary data... (length = ' . strlen($value) . ' bytes)');
-					}
-				}
-				else if (is_scalar($value) && preg_match('/^(dw[A-Z]|n[A-Z]|w[A-Z]|bi[A-Z])[a-zA-Z]+$/', $key))
-				{
-					// AVI sections which use Hungarian notation, at least partially
-					$this->clean_AVI_Hungarian($arr);
-					// and rescan the transformed key set...
-					$this->clean_ID3info_results($arr);
-					break; // exit this loop
-				}
-				else if (is_array($value))
-				{
-					// heuristic #3: when the value is an array of integers, implode them to a comma-separated list (string) instead:
-					$is_all_ints = true;
-					for ($sk = count($value) - 1; $sk >= 0; --$sk)
-					{
-						if (!array_key_exists($sk, $value) || !is_int($value[$sk]))
-						{
-							$is_all_ints = false;
-							break;
-						}
-					}
-					if ($is_all_ints)
-					{
-						$s = implode(', ', $value);
-						$value = $s;
-					}
-					else
-					{
-						$this->clean_ID3info_results_r($value, $flags);
-					}
-				}
-				else
-				{
-					$this->clean_ID3info_results_r($value, $flags);
-				}
-			}
-		}
-		else if (is_string($arr))
-		{
-			// is this a cleaned up item? Yes, then there's a full-ASCII string here, sans newlines, etc.
-			$len = strlen($arr);
-			$value = rtrim($arr, "\x00");
-			$value = strtr($value, "\x00", ' ');    // because preg_match() doesn't 'see' NUL bytes...
-			if (preg_match("/[^ -~\n\r\t]/", $value))
-			{
-				if ($len > 0 && $len < 256)
-				{
-					// check if we can turn it into something UTF8-LEGAL; when not, we hexdump!
-					$im = str_replace('?', '&QMaRK;', $value);
-					$dst = $this->mkSafeUTF8($im);
-					if (strpos($dst, '?') === false)
-					{
-						// it's a UTF-8 legal string now!
-						$arr = str_replace('&QMaRK;', '?', $dst);
-					}
-					else
-					{
-						// convert raw binary data to hex in 32 bit chunks:
-						$temp = unpack('H*', $arr);
-						$temp = str_split($temp[1], 8);
-						$arr = new BinaryDataContainer(implode(' ', $temp));
-					}
-				}
-				else
-				{
-					$arr = new BinaryDataContainer('(unidentified binary data ... length = ' . strlen($arr) . ')');
-				}
-			}
-			else
-			{
-				$arr = $value;   // don't store as a 'processed' item (shortcut)
-			}
-		}
-		else if (is_bool($arr) ||
-				 is_int($arr) ||
-				 is_float($arr) ||
-				 is_null($arr))
-		{
-		}
-		else if (is_object($arr) && !isset($arr->id3_procsupport_obj))
-		{
-			$arr = new BinaryDataContainer('(object) ' . $this->mkSafeUTF8(print_r($arr, true)));
-		}
-		else if (is_resource($arr))
-		{
-			$arr = new BinaryDataContainer('(resource) ' . $this->mkSafeUTF8(print_r($arr, true)));
-		}
-		else
-		{
-			$arr = new BinaryDataContainer('(unidentified type: ' . gettype($arr) . ') ' . $this->mkSafeUTF8(print_r($arr, true)));
-		}
-	}
-
-	protected function clean_ID3info_results(&$arr, $flags = 0)
-	{
-		unset($arr['GETID3_VERSION']);
-		unset($arr['filepath']);
-		unset($arr['filename']);
-		unset($arr['filenamepath']);
-		unset($arr['cache_hash']);
-		unset($arr['cache_file']);
-
-		$this->clean_ID3info_results_r($arr, $flags);
-
-		// heuristic #4: convert keys to something legible:
-		if (is_array($arr))
-		{
-			$this->clean_ID3info_keys($arr);
-		}
-	}
-
-
-
-
-
-
-
-
-	/**
-	 * Delete a file or directory, inclusing subdirectories and files.
-	 *
-	 * Return TRUE on success, FALSE when an error occurred.
-	 *
-	 * Note that the routine will try to persevere and keep deleting other subdirectories
-	 * and files, even when an error occurred for one or more of the subitems: this is
-	 * a best effort policy.
-	 */
-	protected function unlink($legal_url, $mime_filters)
-	{
-		$rv = true;
-
-		// must transform here so alias/etc. expansions inside legal_url_path2file_path() get a chance:
-		$file = $this->legal_url_path2file_path($legal_url);
-
-		if (is_dir($file))
-		{
-			$dir = self::enforceTrailingSlash($file);
-			$url = self::enforceTrailingSlash($legal_url);
-			$coll = $this->scandir($dir, '*', false, 0, ~GLOB_NOHIDDEN);
-			if ($coll !== false)
-			{
-				foreach ($coll['dirs'] as $f)
-				{
-					if ($f === '.' || $f === '..')
-						continue;
-
-					$rv &= $this->unlink($url . $f, $mime_filters);
-				}
-				foreach ($coll['files'] as $f)
-				{
-					$rv &= $this->unlink($url . $f, $mime_filters);
-				}
-			}
-			else
-			{
-				$rv = false;
-			}
-
-			$rv &= @rmdir($file);
-		}
-		else if (file_exists($file))
-		{
-			if (is_file($file))
-			{
-				$mime = $this->getMimeFromExt($file);   // take the fast track to mime type sniffing; we'll live with the (rather low) risk of being inacurate due to accidental/intentional misnaming of the files
-				if (!$this->IsAllowedMimeType($mime, $mime_filters))
-					return false;
-			}
-
-			$meta = &$this->getid3_cache->pick($legal_url, $this, false);
-			assert($meta != null);
-
-			$rv &= @unlink($file);
-			$rv &= $meta->delete(true);
-
-			unset($meta);
-		}
-		return $rv;
-	}
-
-	/**
-	 * glob() wrapper: accepts the same options as Tooling.php::safe_glob()
-	 *
-	 * However, this method will also ensure the '..' directory entry is only returned,
-	 * even while asked for, when the parent directory can be legally traversed by the FileManager.
-	 *
-	 * Return a dual array (possibly empty) of directories and files, or FALSE on error.
-	 *
-	 * IMPORTANT: this function GUARANTEES that, when present at all, the double-dot '..'
-	 *            entry is the very last entry in the array.
-	 *            This guarantee is important as onView() et al depend on it.
-	 */
-	public function scandir($dir, $filemask, $see_thumbnail_dir, $glob_flags_or, $glob_flags_and)
-	{
-		// list files, except the thumbnail folder itself or any file in it:
-		$dir = self::enforceTrailingSlash($dir);
-
-		$just_below_thumbnail_dir = false;
-		if (!$see_thumbnail_dir)
-		{
-			$tnpath = $this->thumbnailCacheDir;
-			if (FileManagerUtility::startswith($dir, $tnpath))
-				return false;
-
-			$tnparent = $this->thumbnailCacheParentDir;
-			$just_below_thumbnail_dir = ($dir == $tnparent);
-
-			$tndir = basename(substr($this->options['thumbnailPath'], 0, -1));
-		}
-
-		$at_basedir = ($this->managedBaseDir == $dir);
-
-		$flags = GLOB_NODOTS | GLOB_NOHIDDEN | GLOB_NOSORT;
-		$flags &= $glob_flags_and;
-		$flags |= $glob_flags_or;
-		$coll = safe_glob($dir . $filemask, $flags);
-
-		if ($coll !== false)
-		{
-			if ($just_below_thumbnail_dir)
-			{
-				foreach($coll['dirs'] as $k => $dir)
-				{
-					if ($dir === $tndir)
-					{
-						unset($coll['dirs'][$k]);
-						break;
-					}
-				}
-			}
-
-			if (!$at_basedir)
-			{
-				$coll['dirs'][] = '..';
-			}
-		}
-
-		return $coll;
-	}
-
-
-
-	/**
-	 * Check the $extension argument and replace it with a suitable 'safe' extension.
-	 */
-	public function getSafeExtension($extension, $safe_extension = 'txt', $mandatory_extension = 'txt')
-	{
-		if (!is_string($extension) || $extension === '') // can't use 'empty($extension)' as "0" is a valid extension itself.
-		{
-			//enforce a mandatory extension, even when there isn't one (due to filtering or original input producing none)
-			return (!empty($mandatory_extension) ? $mandatory_extension : (!empty($safe_extension) ? $safe_extension : $extension));
-		}
-		$extension = strtolower($extension);
-		switch ($extension)
-		{
-		case 'exe':
-		case 'dll':
-		case 'com':
-		case 'sys':
-		case 'bat':
-		case 'pl':
-		case 'sh':
-		case 'php':
-		case 'php3':
-		case 'php4':
-		case 'php5':
-		case 'php6':
-		case 'php7':
-		case 'php8':
-		case 'phps':
-			return (!empty($safe_extension) ? $safe_extension : $extension);
-
-		default:
-			return $extension;
-		}
-	}
-
-	/**
-	 * Only allow a 'dotted', i.e. UNIX hidden filename when options['safe'] == FALSE
-	 */
-	public function IsHiddenNameAllowed($file)
-	{
-		if ($this->options['safe'] && !empty($file))
-		{
-			if ($file !== '.' && $file !== '..' && $file[0] === '.')
-			{
-				return false;
-			}
-		}
-		return true;
-	}
-
-	public function IsHiddenPathAllowed($path)
-	{
-		if ($this->options['safe'] && !empty($path))
-		{
-			$path = strtr($path, '\\', '/');
-			$segs = explode('/', $path);
-			foreach($segs as $file)
-			{
-				if (!$this->IsHiddenNameAllowed($file))
-				{
-					return false;
-				}
-			}
-		}
-		return true;
-	}
-
-
-	/**
-	 * Make a cleaned-up, unique filename
-	 *
-	 * Return the file (dir + name + ext), or a unique, yet non-existing, variant thereof, where the filename
-	 * is appended with a '_' and a number, e.g. '_1', when the file itself already exists in the given
-	 * directory. The directory part of the returned value equals $dir.
-	 *
-	 * Return NULL when $file is empty or when the specified directory does not reside within the
-	 * directory tree rooted by options['directory']
-	 *
-	 * Note that the given filename will be converted to a legal filename, containing a filesystem-legal
-	 * subset of ASCII characters only, before being used and returned by this function.
-	 *
-	 * @param mixed $fileinfo     either a string containing a filename+ext or an array as produced by pathinfo().
-	 * @daram string $dir         path pointing at where the given file may exist.
-	 *
-	 * @return a filepath consisting of $dir and the cleaned up and possibly sequenced filename and file extension
-	 *         as provided by $fileinfo, or NULL on error.
-	 */
-	public function getUniqueName($fileinfo, $dir)
-	{
-		$dir = self::enforceTrailingSlash($dir);
-
-		if (is_string($fileinfo))
-		{
-			$fileinfo = pathinfo($fileinfo);
-		}
-
-		if (!is_array($fileinfo))
-		{
-			return null;
-		}
-		$dotfile = (strlen($fileinfo['filename']) == 0);
-
-		/*
-		 * since 'pagetitle()' is used to produce a unique, non-existing filename, we can forego the dirscan
-		 * and simply check whether the constructed filename/path exists or not and bump the suffix number
-		 * by 1 until it does not, thus quickly producing a unique filename.
-		 *
-		 * This is faster than using a dirscan to collect a set of existing filenames and feeding them as
-		 * an option array to pagetitle(), particularly for large directories.
-		 */
-		$filename = FileManagerUtility::pagetitle($fileinfo['filename'], null, '-_.,[]()~!@+' /* . '#&' */, '-_,~@+#&');
-		if (!$filename && !$dotfile)
-			return null;
-
-		// also clean up the extension: only allow alphanumerics in there!
-		$ext = FileManagerUtility::pagetitle(isset($fileinfo['extension']) ? $fileinfo['extension'] : null);
-		$ext = (strlen($ext) > 0 ? '.' . $ext : null);
-		// make sure the generated filename is SAFE:
-		$fname = $filename . $ext;
-		$file = $dir . $fname;
-		if (file_exists($file))
-		{
-			if ($dotfile)
-			{
-				$filename = $fname;
-				$ext = '';
-			}
-
-			/*
-			 * make a unique name. Do this by postfixing the filename with '_X' where X is a sequential number.
-			 *
-			 * Note that when the input name is already such a 'sequenced' name, the sequence number is
-			 * extracted from it and sequencing continues from there, hence input 'file_5' would, if it already
-			 * existed, thus be bumped up to become 'file_6' and so on, until a filename is found which
-			 * does not yet exist in the designated directory.
-			 */
-			$i = 1;
-			if (preg_match('/^(.*)_([1-9][0-9]*)$/', $filename, $matches))
-			{
-				$i = intval($matches[2]);
-				if ('P'.$i !== 'P'.$matches[2] || $i > 100000)
-				{
-					// very large number: not a sequence number!
-					$i = 1;
-				}
-				else
-				{
-					$filename = $matches[1];
-				}
-			}
-			do
-			{
-				$fname = $filename . ($i ? '_' . $i : '') . $ext;
-				$file = $dir . $fname;
-				$i++;
-			} while (file_exists($file));
-		}
-
-		// $fname is now guaranteed to NOT exist in the given directory
-		return $fname;
-	}
-
-
-
-	/**
-	 * Predict the actual width/height dimensions of the thumbnail, given the original image's dimensions and the given size limits.
-	 *
-	 * Note: exists as a method in this class, so you can override it when you override getThumb().
-	 */
-	public function predictThumbDimensions($orig_x, $orig_y, $max_x = null, $max_y = null, $ratio = true, $resizeWhenSmaller = false)
-	{
-		return Image::calculate_resize_dimensions($orig_x, $orig_y, $max_x, $max_y, $ratio, $resizeWhenSmaller);
-	}
-
-
-	/**
-	 * Returns the URI path to the apropriate icon image for the given file / directory.
-	 *
-	 * NOTES:
-	 *
-	 * 1) any $path with an 'extension' of '.directory' is assumed to be a directory.
-	 *
-	 * 2) This method specifically does NOT check whether the given path exists or not: it just looks at
-	 *    the filename extension passed to it, that's all.
-	 *
-	 * Note #2 is important as this enables this function to also serve as icon fetcher for ZIP content viewer, etc.:
-	 * after all, those files do not exist physically on disk themselves!
-	 */
-	public function getIcon($file, $smallIcon)
-	{
-		$ext = strtolower(pathinfo($file, PATHINFO_EXTENSION));
-
-		if (array_key_exists($ext, $this->icon_cache[!$smallIcon]))
-		{
-			return $this->icon_cache[!$smallIcon][$ext];
-		}
-
-		$largeDir = (!$smallIcon ? 'Large/' : '');
-		$url_path = $this->options['assetBasePath'] . 'Images/Icons/' . $largeDir . $ext . '.png';
-		$path = (is_file($this->url_path2file_path($url_path)))
-			? $url_path
-			: $this->options['assetBasePath'] . 'Images/Icons/' . $largeDir . 'default.png';
-
-		$this->icon_cache[!$smallIcon][$ext] = $path;
-
-		return $path;
-	}
-
-	/**
-	 * Return the path to the thumbnail of the specified image, the thumbnail having its
-	 * width and height limited to $width pixels.
-	 *
-	 * When the thumbnail image does not exist yet, it will created on the fly.
-	 *
-	 * @param object $meta
-	 *                             the cache record instance related to the original image. Is used
-	 *                             to access the cache and generate a suitable thumbnail filename.
-	 *
-	 * @param string $path         filesystem path to the original image. Is used to derive
-	 *                             the thumbnail content from.
-	 *
-	 * @param integer $width       the maximum number of pixels for width of the
-	 *                             thumbnail.
-	 *
-	 * @param integer $height      the maximum number of pixels for height of the
-	 *                             thumbnail.
-	 */
-	public function getThumb($meta, $path, $width, $height, $onlyIfExistsInCache = false)
-	{
-		$thumbPath = $meta->getThumbPath($width . 'x' . $height);
-		if (!is_file($thumbPath))
-		{
-			if ($onlyIfExistsInCache)
-				return false;
-
-			// make sure the cache subdirectory exists where we are going to store the thumbnail:
-			$meta->mkCacheDir();
-
-			$img = new Image($path);
-			// generally save as lossy / lower-Q jpeg to reduce filesize, unless orig is PNG/GIF, higher quality for smaller thumbnails:
-			$img->resize($width, $height)->save($thumbPath, min(98, max(MTFM_THUMBNAIL_JPEG_QUALITY, MTFM_THUMBNAIL_JPEG_QUALITY + 0.15 * (250 - min($width, $height)))), true);
-
-			if (DEVELOPMENT)
-			{
-				$imginfo = $img->getMetaInfo();
-				$meta->store('img_info', $imginfo);
-
-				$meta->store('memory used', number_format(memory_get_peak_usage() / 1E6, 1) . ' MB');
-				$meta->store('memory estimated', number_format(@$imginfo['fileinfo']['usage_guestimate'] / 1E6, 1) . ' MB');
-				$meta->store('memory suggested', number_format(@$imginfo['fileinfo']['usage_min_advised'] / 1E6, 1) . ' MB');
-			}
-
-			unset($img);
-		}
-		return $meta->getThumbURL($width . 'x' . $height);
-	}
-
-	/**
-	 * Assistant function which produces the best possible icon image path for the given error/exception message.
-	 */
-	public function getIconForError($emsg, $original_filename, $small_icon)
-	{
-		if (empty($emsg))
-		{
-			// just go and pick the extension-related icon for this one; nothing is wrong today, it seems.
-			$thumb_path = (!empty($original_filename) ? $original_filename : 'is.default-missing');
-		}
-		else
-		{
-			$thumb_path = 'is.default-error';
-
-			if (strpos($emsg, 'img_will_not_fit') !== false)
-			{
-				$thumb_path = 'is.oversized_img';
-			}
-			else if (strpos($emsg, 'nofile') !== false)
-			{
-				$thumb_path = 'is.default-missing';
-			}
-			else if (strpos($emsg, 'unsupported_imgfmt') !== false)
-			{
-				// just go and pick the extension-related icon for this one; nothing seriously wrong here.
-				$thumb_path = (!empty($original_filename) ? $original_filename : $thumb_path);
-			}
-			else if (strpos($emsg, 'image') !== false)
-			{
-				$thumb_path = 'badly.broken_img';
-			}
-		}
-
-		$img_filepath = $this->getIcon($thumb_path, $small_icon);
-
-		return $img_filepath;
-	}
-
-
-
-
-
-
-
-
-
-	/**
-	 * Convert the given content to something that is safe to copy straight to HTML
-	 */
-	public function mkSafe4Display($str)
-	{
-		// only allow ASCII to pass:
-		$str = preg_replace("/[^ -~\t\r\n]/", '?', $str);
-		$str = str_replace('%3C', '?', $str);             // in case someone want's to get really fancy: nuke the URLencoded '<'
-
-		// anything that's more complex than a simple <TAG> is nuked:
-		$str = preg_replace('/<([\/]?script\s*[\/]?)>/', '?', $str);               // but first make sure '<script>' doesn't make it through the next regex!
-		$str = preg_replace('/<([\/]?[a-zA-Z]+\s*[\/]?)>/', "\x04\\1\x05", $str);
-		$str = strip_tags($str);
-		$str = strtr($str, "\x04", '<');
-		$str = strtr($str, "\x05", '>');
-		return $str;
-	}
-
-
-	/**
-	 * Make data suitable for inclusion in a HTML tag attribute value: strip all tags and encode quotes!
-	 */
-	public function mkSafe4HTMLattr($str)
-	{
-		$str = str_replace('%3C', '?', $str);             // in case someone want's to get really fancy: nuke the URLencoded '<'
-		$str = strip_tags($str);
-		return htmlspecialchars($str, ENT_QUOTES, 'UTF-8');
-	}
-
-	/**
-	 * inspired by http://nl3.php.net/manual/en/function.utf8-encode.php#102382; mix & mash to make sure the result is LEGAL UTF-8
-	 *
-	 * Introduced after the JSON encoder kept spitting out 'null' instead of a string value for a few choice French JPEGs with very non-UTF EXIF content. :-(
-	 */
-	public function mkSafeUTF8($str)
-	{
-		// kill NUL bytes: they don't belong in here!
-		$str = strtr($str, "\x00", ' ');
-
-		if (!mb_check_encoding($str, 'UTF-8') || $str !== mb_convert_encoding(mb_convert_encoding($str, 'UTF-32', 'UTF-8'), 'UTF-8', 'UTF-32'))
-		{
-			$encoding = mb_detect_encoding($str, 'auto, ISO-8859-1', true);
-			$im = str_replace('?', '&qmark;', $str);
-			if ($encoding !== false)
-			{
-				$dst = mb_convert_encoding($im, 'UTF-8', $encoding);
-			}
-			else
-			{
-				$dst = mb_convert_encoding($im, 'UTF-8');
-			}
-			//$dst = utf8_encode($im);
-			//$dst = getid3_lib::iconv_fallback('ISO-8859-1', 'UTF-8', $im);
-
-			if (!mb_check_encoding($dst, 'UTF-8') || $dst !== mb_convert_encoding(mb_convert_encoding($dst, 'UTF-32', 'UTF-8'), 'UTF-8', 'UTF-32') || strpos($dst, '?') !== false)
-			{
-				// not UTF8 yet... try them all
-				$encs = mb_list_encodings();
-				foreach ($encs as $encoding)
-				{
-					$dst = mb_convert_encoding($im, 'UTF-8', $encoding);
-					if (mb_check_encoding($dst, 'UTF-8') && $dst === mb_convert_encoding(mb_convert_encoding($dst, 'UTF-32', 'UTF-8'), 'UTF-8', 'UTF-32') && strpos($dst, '?') === false)
-					{
-						return str_replace('&qmark;', '?', $dst);
-					}
-				}
-
-				// when we get here, it's pretty hopeless. Strip ANYTHING that's non-ASCII:
-				return preg_replace("/[^ -~\t\r\n]/", '?', $str);
-			}
-
-			// UTF8 cannot contain low-ASCII values; at least WE do not allow that!
-			if (preg_match("/[^ -\xFF\n\r\t]/", $dst))
-			{
-				// weird output that's not legible anyhow, so strip ANYTHING that's non-ASCII:
-				return preg_replace("/[^ -~\t\r\n]/", '?', $str);
-			}
-			return str_replace('&qmark;', '?', $dst);
-		}
-		return $str;
-	}
-
-
-
-	/**
-	 * Safe replacement of dirname(); does not care whether the input has a trailing slash or not.
-	 *
-	 * Return FALSE when the path is attempting to get the parent of '/'
-	 */
-	public static function getParentDir($path)
-	{
-		/*
-		 * on Windows, you get:
-		 *
-		 * dirname("/") = "\"
-		 * dirname("y/") = "."
-		 * dirname("/x") = "\"
-		 *
-		 * so we'd rather not use dirname()   :-(
-		 */
-		if (!is_string($path))
-			return false;
-		$path = rtrim($path, '/');
-		// empty directory or a path with only 1 character in it cannot be a parent+child: that would be 2 at the very least when it's '/a': parent is root '/' then:
-		if (strlen($path) <= 1)
-			return false;
-
-		$p2 = strrpos($path, '/' /* , -1 */ );  // -1 as extra offset is not good enough? Nope. At least not for my Win32 PHP 5.3.1. Yeah, sounds like a PHP bug to me. So we rtrim() now...
-		if ($p2 === false)
-		{
-			return false; // tampering!
-		}
-		$prev = substr($path, 0, $p2 + 1);
-		return $prev;
-	}
-
-	/**
-	 * Return the URI absolute path to the script pointed at by the current URI request.
-	 * For example, if the request was 'http://site.org/dir1/dir2/script.php', then this method will
-	 * return '/dir1/dir2/script.php'.
-	 *
-	 * By default, this is equivalent to $_SERVER['SCRIPT_NAME'].
-	 *
-	 * This default can be overridden by specifying the options['RequestScriptURI'] when invoking the constructor.
-	 */
-	public /* static */ function getRequestScriptURI()
-	{
-		if (!empty($this->options['RequestScriptURI']))
-		{
-			return $this->options['RequestScriptURI'];
-		}
-		
-		// see also: http://php.about.com/od/learnphp/qt/_SERVER_PHP.htm
-		$path = strtr($_SERVER['SCRIPT_NAME'], '\\', '/');
-
-		return $path;
-	}
-
-	/**
-	 * Return the URI absolute path to the directory pointed at by the current URI request.
-	 * For example, if the request was 'http://site.org/dir1/dir2/script', then this method will
-	 * return '/dir1/dir2/'.
-	 *
-	 * Note that the path is returned WITH a trailing slash '/'.
-	 */
-	public /* static */ function getRequestPath()
-	{
-		$path = self::getParentDir($this->getRequestScriptURI());
-		$path = self::enforceTrailingSlash($path);
-
-		return $path;
-	}
-
-	/**
-	 * Normalize an absolute path by converting all slashes '/' and/or backslashes '\' and any mix thereof in the
-	 * specified path to UNIX/MAC/Win compatible single forward slashes '/'.
-	 *
-	 * Also roll up any ./ and ../ directory elements in there.
-	 *
-	 * Throw an exception when the operation failed to produce a legal path.
-	 */
-	public /* static */ function normalize($path)
-	{
-		$path = preg_replace('/(\\\|\/)+/', '/', $path);
-
-		/*
-		 * fold '../' directory parts to prevent malicious paths such as 'a/../../../../../../../../../etc/'
-		 * from succeeding
-		 *
-		 * to prevent screwups in the folding code, we FIRST clean out the './' directories, to prevent
-		 * 'a/./.././.././.././.././.././.././.././.././../etc/' from succeeding:
-		 */
-		$path = preg_replace('#/(\./)+#', '/', $path);
-		// special fix: now strip trailing '/.' section; MUST replace by '/' (trailing) or path won't be accepted as legal when this is the '.' requested for root '/'
-		$path = preg_replace('#/\.$#', '/', $path);
-
-		// now temporarily strip off the leading part up to the colon to prevent entries like '../d:/dir' to succeed when the site root is 'c:/', for example:
-		$lead = '';
-		// the leading part may NOT contain any directory separators, as it's for drive letters only.
-		// So we must check in order to prevent malice like /../../../../../../../c:/dir from making it through.
-		if (preg_match('#^([A-Za-z]:)?/(.*)$#', $path, $matches))
-		{
-			$lead = $matches[1];
-			$path = '/' . $matches[2];
-		}
-
-		while (($pos = strpos($path, '/..')) !== false)
-		{
-			$prev = substr($path, 0, $pos);
-			/*
-			 * on Windows, you get:
-			 *
-			 * dirname("/") = "\"
-			 * dirname("y/") = "."
-			 * dirname("/x") = "\"
-			 *
-			 * so we'd rather not use dirname()   :-(
-			 */
-			$p2 = strrpos($prev, '/');
-			if ($p2 === false)
-			{
-				throw new FileManagerException('path_tampering:' . $path);
-			}
-			$prev = substr($prev, 0, $p2);
-			$next = substr($path, $pos + 3);
-			if ($next && $next[0] !== '/')
-			{
-				throw new FileManagerException('path_tampering:' . $path);
-			}
-			$path = $prev . $next;
-		}
-
-		$path = $lead . $path;
-
-		/*
-		 * iff there was such a '../../../etc/' attempt, we'll know because there'd be an exception thrown in the loop above.
-		 */
-
-		return $path;
-	}
-
-
-	/**
-	 * Accept a URI relative or absolute path and transform it to an absolute URI path, i.e. rooted against DocumentRoot.
-	 *
-	 * Relative paths are assumed to be relative to the current request path, i.e. the getRequestPath() produced path.
-	 *
-	 * Note: as it uses normalize(), any illegal path will throw an FileManagerException
-	 *
-	 * Returns a fully normalized URI absolute path.
-	 */
-	public function rel2abs_url_path($path)
-	{
-		$path = strtr($path, '\\', '/');
-		if (!FileManagerUtility::startsWith($path, '/'))
-		{
-			$based = $this->getRequestPath();
-			$path = $based . $path;
-		}
-		return $this->normalize($path);
-	}
-
-	/**
-	 * Accept an absolute URI path, i.e. rooted against DocumentRoot, and transform it to a LEGAL URI absolute path, i.e. rooted against options['directory'].
-	 *
-	 * Relative paths are assumed to be relative to the current request path, i.e. the getRequestPath() produced path.
-	 *
-	 * Note: as it uses normalize(), any illegal path will throw a FileManagerException
-	 *
-	 * Returns a fully normalized LEGAL URI path.
-	 *
-	 * Throws a FileManagerException when the given path cannot be converted to a LEGAL URL, i.e. when it resides outside the options['directory'] subtree.
-	 */
-	public function abs2legal_url_path($path)
-	{
-		$root = $this->options['directory'];
-
-		$path = $this->rel2abs_url_path($path);
-
-		// but we MUST make sure the path is still a LEGAL URI, i.e. sitting inside options['directory']:
-		if (strlen($path) < strlen($root))
-			$path = self::enforceTrailingSlash($path);
-
-		if (!FileManagerUtility::startsWith($path, $root))
-		{
-			throw new FileManagerException('path_tampering:' . $path);
-		}
-
-		$path = str_replace($root, '/', $path);
-
-		return $path;
-	}
-
-	/**
-	 * Accept a relative or absolute LEGAL URI path and transform it to an absolute URI path, i.e. rooted against DocumentRoot.
-	 *
-	 * Relative paths are assumed to be relative to the options['directory'] directory. This makes them equivalent to absolute paths within
-	 * the LEGAL URI tree and this fact may seem odd. Alas, the FM frontend sends requests without the leading slash and it's those that
-	 * we wish to resolve here, after all. So, yes, this deviates from the general principle applied elesewhere in the code. :-(
-	 * Nevertheless, it's easier than scanning and tweaking the FM frontend everywhere.
-	 *
-	 * Note: as it uses normalize(), any illegal path will throw a FileManagerException
-	 *
-	 * Returns a fully normalized URI absolute path.
-	 */
-	public function legal2abs_url_path($path)
-	{
-		$path = $this->rel2abs_legal_url_path($path);
-		
-		$root = $this->options['directory'];
-
-		// clip the trailing '/' off the $root path as $path has a leading '/' already:
-		$path = substr($root, 0, -1) . $path;
-
-		return $path;
-	}
-
-	/**
-	 * Accept a relative or absolute LEGAL URI path and transform it to an absolute LEGAL URI path, i.e. rooted against options['directory'].
-	 *
-	 * Relative paths are assumed to be relative to the options['directory'] directory. This makes them equivalent to absolute paths within
-	 * the LEGAL URI tree and this fact may seem odd. Alas, the FM frontend sends requests without the leading slash and it's those that
-	 * we wish to resolve here, after all. So, yes, this deviates from the general principle applied elesewhere in the code. :-(
-	 * Nevertheless, it's easier than scanning and tweaking the FM frontend everywhere.
-	 *
-	 * Note: as it uses normalize(), any illegal path will throw an FileManagerException
-	 *
-	 * Returns a fully normalized LEGAL URI absolute path.
-	 */
-	public function rel2abs_legal_url_path($path)
-	{
-		$path = strtr($path, '\\', '/');
-		if (!FileManagerUtility::startsWith($path, '/'))
-		{
-			$path = '/' . $path;
-		}
-
-		$path = $this->normalize($path);
-
-		return $path;
-	}
-
-	/**
-	 * Return the filesystem absolute path for the relative or absolute URI path.
-	 *
-	 * Note: as it uses normalize(), any illegal path will throw an FileManagerException
-	 *
-	 * Returns a fully normalized filesystem absolute path.
-	 */
-	public function url_path2file_path($url_path)
-	{
-		$url_path = $this->rel2abs_url_path($url_path);
-
-		$path = $this->options['documentRootPath'] . $url_path;
-
-		return $path;
-	}
-
-	/**
-	 * Return the filesystem absolute path for the relative or absolute LEGAL URI path.
-	 *
-	 * Note: as it uses normalize(), any illegal path will throw an FileManagerException
-	 *
-	 * Returns a fully normalized filesystem absolute path.
-	 */
-	public function legal_url_path2file_path($url_path)
-	{
-		$path = $this->rel2abs_legal_url_path($url_path);
-
-		$path = substr($this->managedBaseDir, 0, -1) . $path;
-
-		return $path;
-	}
-
-	public static function enforceTrailingSlash($string)
-	{
-		return (strrpos($string, '/') === strlen($string) - 1 ? $string : $string . '/');
-	}
-
-
-
-
-
-	/**
-	 * Produce minimized HTML output; used to cut don't on the content fed
-	 * to JSON_encode() and make it more readable in raw debug view.
-	 */
-	public static function compressHTML($str)
-	{
-		// brute force: replace tabs by spaces and reduce whitespace series to a single space.
-		//$str = preg_replace('/\s+/', ' ', $str);
-
-		return $str;
-	}
-
-
-	protected /* static */ function modify_json4exception(&$jserr, $emsg, $target_info = null)
-	{
-		if (empty($emsg))
-			return;
-
-		// only set up the new json error report array when this is the first exception we got:
-		if (empty($jserr['error']))
-		{
-			// check the error message and see if it is a translation code word (with or without parameters) or just a generic error report string
-			$e = explode(':', $emsg, 2);
-			if (preg_match('/[^A-Za-z0-9_-]/', $e[0]))
-			{
-				// generic message. ouch.
-				$jserr['error'] = $emsg;
-			}
-			else
-			{
-				$extra1 = (!empty($e[1]) ? $this->mkSafe4Display($e[1]) : '');
-				$extra2 = (!empty($target_info) ? ' (' . $this->mkSafe4Display($target_info) . ')' : '');
-				$jserr['error'] = $emsg = '${backend.' . $e[0] . '}';
-				if ($e[0] != 'disabled')
-				{
-					// only append the extra data when it's NOT the 'disabled on this server' message!
-					$jserr['error'] .=  $extra1 . $extra2;
-				}
-				else
-				{
-					$jserr['error'] .=  ' (${' . $extra1 . '})';
-				}
-			}
-			$jserr['status'] = 0;
-		}
-	}
-
-
-
-
-
-
-	public function getAllowedMimeTypes($mime_filter = null)
-	{
-		$mimeTypes = array();
-
-		if (empty($mime_filter)) return null;
-		$mset = explode(',', $mime_filter);
-		for($i = count($mset) - 1; $i >= 0; $i--)
-		{
-			if (strpos($mset[$i], '/') === false)
-				$mset[$i] .= '/';
-		}
-
-		$mimes = $this->getMimeTypeDefinitions();
-
-		foreach ($mimes as $k => $mime)
-		{
-			if ($k === '.')
-				continue;
-
-			foreach($mset as $filter)
-			{
-				if (FileManagerUtility::startsWith($mime, $filter))
-					$mimeTypes[] = $mime;
-			}
-		}
-
-		return $mimeTypes;
-	}
-
-	public function getMimeTypeDefinitions()
-	{
-		static $mimes;
-
-		$pref_ext = array();
-
-		if (!$mimes)
-		{
-			$mimes = parse_ini_file($this->options['mimeTypesPath']);
-
-			if (is_array($mimes))
-			{
-				foreach($mimes as $k => $v)
-				{
-					$m = explode(',', (string)$v);
-					$mimes[$k] = $m[0];
-					$p = null;
-					if (!empty($m[1]))
-					{
-						$p = trim($m[1]);
-					}
-					// is this the preferred extension for this mime type? Or is this the first known extension for the given mime type?
-					if ($p === '*' || !array_key_exists($m[0], $pref_ext))
-					{
-						$pref_ext[$m[0]] = $k;
-					}
-				}
-
-				// stick the mime-to-extension map into an 'illegal' index:
-				$mimes['.'] = $pref_ext;
-			}
-			else
-			{
-				$mimes = false;
-			}
-		}
-
-		if (!is_array($mimes)) $mimes = array(); // prevent faulty mimetype ini file from b0rking other code sections.
-
-		return $mimes;
-	}
-
-	public function IsAllowedMimeType($mime_type, $mime_filters)
-	{
-		if (empty($mime_type))
-			return false;
-		if (!is_array($mime_filters))
-			return true;
-
-		return in_array($mime_type, $mime_filters);
-	}
-
-	/**
-	 * Returns (if possible) the mimetype of the given file
-	 *
-	 * @param string $file        physical filesystem path of the file for which we wish to know the mime type.
-	 */
-	public function getMimeFromExt($file)
-	{
-		$ext = strtolower(pathinfo($file, PATHINFO_EXTENSION));
-
-		$mime = null;
-		if (MTFM_USE_FINFO_OPEN)
-		{
-			$ini = error_reporting(0);
-			if (function_exists('finfo_open') && $f = finfo_open(FILEINFO_MIME, getenv('MAGIC')))
-			{
-				$mime = finfo_file($f, $file);
-				// some systems also produce the character encoding with the mime type; strip if off:
-				$ma = explode(';', $mime);
-				$mime = $ma[0];
-				finfo_close($f);
-			}
-			error_reporting($ini);
-		}
-
-		if ((empty($mime) || $mime === 'application/octet-stream') && strlen($ext) > 0)
-		{
-			$ext2mimetype_arr = $this->getMimeTypeDefinitions();
-
-			if (array_key_exists($ext, $ext2mimetype_arr))
-				$mime = $ext2mimetype_arr[$ext];
-		}
-
-		if (empty($mime))
-		{
-			$mime = 'application/octet-stream';
-		}
-
-		return $mime;
-	}
-
-	/**
-	 * Return the first known extension for the given mime type.
-	 *
-	 * Return NULL when no known extension is found.
-	 */
-	public function getExtFromMime($mime)
-	{
-		$ext2mimetype_arr = $this->getMimeTypeDefinitions();
-		$mime2ext_arr = $ext2mimetype_arr['.'];
-
-		if (array_key_exists($mime, $mime2ext_arr))
-			return $mime2ext_arr[$mime];
-
-		return null;
-	}
-
-	/**
-	 * Returns (if possible) all info about the given file, mimetype, dimensions, the works
-	 *
-	 * @param string $file       physical filesystem path to the file we want to know all about
-	 *
-	 * @param string $legal_url
-	 *                           'legal URL path' to the file; used as the key to the corresponding
-	 *                           cache storage record: getFileInfo() will cache the
-	 *                           extracted info alongside the thumbnails in a cache file with
-	 *                           '.nfo' extension.
-	 *
-	 * @return the info array as produced by getID3::analyze(), as part of a MTFMCacheEntry reference
-	 */
-	public function getFileInfo($file, $legal_url, $force_recheck = false)
-	{
-		// when hash exists in cache, return that one:
-		$meta = &$this->getid3_cache->pick($legal_url, $this);
-		assert($meta != null);
-		$mime_check = $meta->fetch('mime_type');
-		if (empty($mime_check) || $force_recheck)
-		{
-			// cache entry is not yet filled: we'll have to do the hard work now and store it.
-			if (is_dir($file))
-			{
-				$meta->store('mime_type', 'text/directory', false);
-				$meta->store('analysis', null, false);
-			}
-			else
-			{
-        $rv = $this->analyze_file($file, $legal_url);
-        $meta->store('mime_type', $rv['mime_type']);        
-				$meta->store('analysis', $rv);
-			}
-		}
-
-		return $meta;
-	}
-
-
-
-
-
-	protected /* static */ function getGETparam($name, $default_value = null)
-	{
-		if (is_array($_GET) && !empty($_GET[$name]))
-		{
-			$rv = $_GET[$name];
-
-			// see if there's any stuff in there which we don't like
-			if (!preg_match('/[^A-Za-z0-9\/~!@#$%^&*()_+{}[]\'",.?]/', $rv))
-			{
-				return $rv;
-			}
-		}
-		return $default_value;
-	}
-
-	protected /* static */ function getPOSTparam($name, $default_value = null)
-	{
-		if (is_array($_POST) && !empty($_POST[$name]))
-		{
-			$rv = $_POST[$name];
-
-			// see if there's any stuff in there which we don't like
-			if (!preg_match('/[^A-Za-z0-9\/~!@#$%^&*()_+{}[]\'",.?]/', $rv))
-			{
-				return $rv;
-			}
-		}
-		return $default_value;
-	}
-}
-
-
-
-
-
-
-class FileManagerException extends Exception {}
-
-
-
-
-
-/* Stripped-down version of some Styx PHP Framework-Functionality bundled with this FileBrowser. Styx is located at: http://styx.og5.net */
-class FileManagerUtility
-{
-	public static function endsWith($string, $look)
-	{
-		return strrpos($string, $look) === strlen($string) - strlen($look);
-	}
-
-	public static function startsWith($string, $look)
-	{
-		return strpos($string, $look) === 0;
-	}
-
-
-	/**
-	 * Cleanup and check against 'already known names' in optional $options array.
-	 * Return a uniquified name equal to or derived from the original ($data).
-	 *
-	 * First clean up the given name ($data): by default all characters not part of the
-	 * set [A-Za-z0-9_] are converted to an underscore '_'; series of these underscores
-	 * are reduced to a single one, and characters in the set [_.,&+ ] are stripped from
-	 * the lead and tail of the given name, e.g. '__name' would therefor be reduced to
-	 * 'name'.
-	 *
-	 * Next, check the now cleaned-up name $data against an optional set of names ($options array)
-	 * and return the name itself when it does not exist in the set,
-	 * otherwise return an augmented name such that it does not exist in the set
-	 * while having been constructed as name plus '_' plus an integer number,
-	 * starting at 1.
-	 *
-	 * Example:
-	 * If the set is {'file', 'file_1', 'file_3'} then $data = 'file' will return
-	 * the string 'file_2' instead, while $data = 'fileX' will return that same
-	 * value: 'fileX'.
-	 *
-	 * @param string $data     the name to be cleaned and checked/uniquified
-	 * @param array $options   an optional array of strings to check the given name $data against
-	 * @param string $extra_allowed_chars     optional set of additional characters which should pass
-	 *                                        unaltered through the cleanup stage. a dash '-' can be
-	 *                                        used to denote a character range, while the literal
-	 *                                        dash '-' itself, when included, should be positioned
-	 *                                        at the very start or end of the string.
-	 *
-	 *                                        Note that ] must NOT need to be escaped; we do this
-	 *                                        ourselves.
-	 * @param string $trim_chars              optional set of additional characters which are trimmed off the
-	 *                                        start and end of the name ($data); note that de dash
-	 *                                        '-' is always treated as a literal dash here; no
-	 *                                        range feature!
-	 *                                        The basic set of characters trimmed off the name is
-	 *                                        [. ]; this set cannot be reduced, only extended.
-	 *
-	 * @return cleaned-up and uniquified name derived from ($data).
-	 */
-	public static function pagetitle($data, $options = null, $extra_allowed_chars = null, $trim_chars = null)
-	{
-		static $regex;
-		if (!$regex){
-			$regex = array(
-				explode(' ', 'Æ æ Œ œ ß Ü ü Ö ö Ä ä À Á Â Ã Ä Å &#260; &#258; Ç &#262; &#268; &#270; &#272; Ð È É Ê Ë &#280; &#282; &#286; Ì Í Î Ï &#304; &#321; &#317; &#313; Ñ &#323; &#327; Ò Ó Ô Õ Ö Ø &#336; &#340; &#344; Š &#346; &#350; &#356; &#354; Ù Ú Û Ü &#366; &#368; Ý Ž &#377; &#379; à á â ã ä å &#261; &#259; ç &#263; &#269; &#271; &#273; è é ê ë &#281; &#283; &#287; ì í î ï &#305; &#322; &#318; &#314; ñ &#324; &#328; ð ò ó ô õ ö ø &#337; &#341; &#345; &#347; š &#351; &#357; &#355; ù ú û ü &#367; &#369; ý ÿ ž &#378; &#380;'),
-				explode(' ', 'Ae ae Oe oe ss Ue ue Oe oe Ae ae A A A A A A A A C C C D D D E E E E E E G I I I I I L L L N N N O O O O O O O R R S S S T T U U U U U U Y Z Z Z a a a a a a a a c c c d d e e e e e e g i i i i i l l l n n n o o o o o o o o r r s s s t t u u u u u u y y z z z'),
-			);
-		}
-
-		if (empty($data))
-		{
-			return (string)$data;
-		}
-
-		// fixup $extra_allowed_chars to ensure it's suitable as a character sequence for a set in a regex:
-		//
-		// Note:
-		//   caller must ensure a dash '-', when to be treated as a separate character, is at the very end of the string
-		if (is_string($extra_allowed_chars))
-		{
-			$extra_allowed_chars = str_replace(']', '\]', $extra_allowed_chars);
-			if (strpos($extra_allowed_chars, '-') === 0)
-			{
-				$extra_allowed_chars = substr($extra_allowed_chars, 1) . (strpos($extra_allowed_chars, '-') != strlen($extra_allowed_chars) - 1 ? '-' : '');
-			}
-		}
-		else
-		{
-			$extra_allowed_chars = '';
-		}
-		// accepts dots and several other characters, but do NOT tolerate dots or underscores at the start or end, i.e. no 'hidden file names' accepted, for example!
-		$data = preg_replace('/[^A-Za-z0-9' . $extra_allowed_chars . ']+/', '_', str_replace($regex[0], $regex[1], $data));
-		$data = trim($data, '_. ' . $trim_chars);
-
-		//$data = trim(substr(preg_replace('/(?:[^A-z0-9]|_|\^)+/i', '_', str_replace($regex[0], $regex[1], $data)), 0, 64), '_');
-		return !empty($options) ? self::checkTitle($data, $options) : $data;
-	}
-
-	protected static function checkTitle($data, $options = array(), $i = 0)
-	{
-		if (!is_array($options)) return $data;
-
-		$lwr_data = strtolower($data);
-
-		foreach ($options as $content)
-			if ($content && strtolower($content) == $lwr_data . ($i ? '_' . $i : ''))
-				return self::checkTitle($data, $options, ++$i);
-
-		return $data.($i ? '_' . $i : '');
-	}
-
-	public static function isBinary($str)
-	{
-		for($i = 0; $i < strlen($str); $i++)
-		{
-			$c = ord($str[$i]);
-			// do not accept ANY codes below SPACE, except TAB, CR and LF.
-			if ($c == 255 || ($c < 32 /* SPACE */ && $c != 9 && $c != 10 && $c != 13)) return true;
-		}
-
-		return false;
-	}
-
-	/**
-	 * Apply rawurlencode() to each of the elements of the given path
-	 *
-	 * @note
-	 *   this method is provided as rawurlencode() itself also encodes the '/' separators in a path/string
-	 *   and we do NOT want to 'revert' such change with the risk of also picking up other %2F bits in
-	 *   the string (this assumes crafted paths can be fed to us).
-	 */
-	public static function rawurlencode_path($path)
-	{
-		return str_replace('%2F', '/', rawurlencode($path));
-	}
-
-	/**
-	 * Convert a number (representing number of bytes) to a formatted string representing GB .. bytes,
-	 * depending on the size of the value.
-	 */
-	public static function fmt_bytecount($val, $precision = 1)
-	{
-		$unit = array('TB', 'GB', 'MB', 'KB', 'bytes');
-		for ($x = count($unit) - 1; $val >= 1024 && $x > 0; $x--)
-		{
-			$val /= 1024.0;
-		}
-		$val = round($val, ($x > 0 ? $precision : 0));
-		return $val . '&#160;' . $unit[$x];
-	}
-
-
-
-
-	/*
-	 * Derived from getID3 demo_browse.php sample code.
-	 *
-	 * Attempts some 'intelligent' conversions for better readability and information compacting.
-	 */
-	public static function table_var_dump(&$variable, $wrap_in_td = false, $show_types = false, $level = 0)
-	{
-		$returnstring = '';
-		if (is_array($variable))
-		{
-			$returnstring .= ($wrap_in_td ? '' : '');
-			$returnstring .= '<ul class="dump_array dump_level_' . sprintf('%02u', $level) . '">';
-			foreach ($variable as $key => &$value)
-			{
-				// Assign an extra class representing the (rounded) width in number of characters 'or more':
-				// You can use this as a width approximation in pixels to style (very) wide items. It saves
-				// a long run through all the nodes in JS, just to measure the actual width and correct any
-				// overlap occurring in there.
-				$keylen = strlen($key);
-				$threshold = 10;
-				$overlarge_key_class = '';
-				while ($keylen >= $threshold)
-				{
-					$overlarge_key_class .= ' overlarger' . sprintf('%04d', $threshold);
-					$threshold *= 1.6;
-				}
-
-				$returnstring .= '<li><span class="key' . $overlarge_key_class . '">' . $key . '</span>';
-				$tstring = '';
-				if ($show_types)
-				{
-					$tstring = '<span class="type">'.gettype($value);
-					if (is_array($value))
-					{
-						$tstring .= '&nbsp;('.count($value).')';
-					}
-					elseif (is_string($value))
-					{
-						$tstring .= '&nbsp;('.strlen($value).')';
-					}
-					$tstring = '</span>';
-				}
-
-				switch ((string)$key)
-				{
-				case 'filesize':
-					$returnstring .= '<span class="dump_seconds">' . $tstring . self::fmt_bytecount($value) . ($value >= 1024 ? ' (' . $value . ' bytes)' : '') . '</span></li>';
-					continue 2;
-
-				case 'playtime seconds':
-					$returnstring .= '<span class="dump_seconds">' . $tstring . number_format($value, 1) . ' s</span></li>';
-					continue 2;
-
-				case 'compression ratio':
-					$returnstring .= '<span class="dump_compression_ratio">' . $tstring . number_format($value * 100, 1) . '%</span></li>';
-					continue 2;
-
-				case 'bitrate':
-				case 'bit rate':
-				case 'avg bit rate':
-				case 'max bit rate':
-				case 'max bitrate':
-				case 'sample rate':
-				case 'sample rate2':
-				case 'samples per sec':
-				case 'avg bytes per sec':
-					$returnstring .= '<span class="dump_rate">' . $tstring . self::fmt_bytecount($value) . '/s</span></li>';
-					continue 2;
-
-				case 'bytes per minute':
-					$returnstring .= '<span class="dump_rate">' . $tstring . self::fmt_bytecount($value) . '/min</span></li>';
-					continue 2;
-				}
-				$returnstring .= FileManagerUtility::table_var_dump($value, true, $show_types, $level + 1) . '</li>';
-			}
-			$returnstring .= '</ul>';
-			$returnstring .= ($wrap_in_td ? '' : '');
-		}
-		else if (is_bool($variable))
-		{
-			$returnstring .= ($wrap_in_td ? '<span class="dump_boolean">' : '').($variable ? 'TRUE' : 'FALSE').($wrap_in_td ? '</span>' : '');
-		}
-		else if (is_int($variable))
-		{
-			$returnstring .= ($wrap_in_td ? '<span class="dump_integer">' : '').$variable.($wrap_in_td ? '</span>' : '');
-		}
-		else if (is_float($variable))
-		{
-			$returnstring .= ($wrap_in_td ? '<span class="dump_double">' : '').$variable.($wrap_in_td ? '</span>' : '');
-		}
-		else if (is_object($variable) && isset($variable->id3_procsupport_obj))
-		{
-			if (isset($variable->metadata) && isset($variable->imagedata))
-			{
-				// an embedded image (MP3 et al)
-				$returnstring .= ($wrap_in_td ? '<div class="dump_embedded_image">' : '');
-				$returnstring .= '<table class="dump_image">';
-				$returnstring .= '<tr><td><b>type</b></td><td>'.getid3_lib::ImageTypesLookup($variable->metadata[2]).'</td></tr>';
-				$returnstring .= '<tr><td><b>width</b></td><td>'.number_format($variable->metadata[0]).' px</td></tr>';
-				$returnstring .= '<tr><td><b>height</b></td><td>'.number_format($variable->metadata[1]).' px</td></tr>';
-				$returnstring .= '<tr><td><b>size</b></td><td>'.number_format(strlen($variable->imagedata)).' bytes</td></tr></table>';
-				$returnstring .= '<img src="data:'.$variable->metadata['mime'].';base64,'.base64_encode($variable->imagedata).'" width="'.$variable->metadata[0].'" height="'.$variable->metadata[1].'">';
-				$returnstring .= ($wrap_in_td ? '</div>' : '');
-			}
-			else if (isset($variable->binarydata_mode))
-			{
-				$returnstring .= ($wrap_in_td ? '<span class="dump_binary_data">' : '');
-				if ($variable->binarydata_mode == 'procd')
-				{
-					$returnstring .= '<i>' . self::table_var_dump($variable->binarydata, false, false, $level + 1) . '</i>';
-				}
-				else
-				{
-					$temp = unpack('H*', $variable->binarydata);
-					$temp = str_split($temp[1], 8);
-					$returnstring .= '<i>' . self::table_var_dump(implode(' ', $temp), false, false, $level + 1) . '</i>';
-				}
-				$returnstring .= ($wrap_in_td ? '</span>' : '');
-			}
-			else
-			{
-				$returnstring .= ($wrap_in_td ? '<span class="dump_object">' : '').print_r($variable, true).($wrap_in_td ? '</span>' : '');
-			}
-		}
-		else if (is_object($variable))
-		{
-			$returnstring .= ($wrap_in_td ? '<span class="dump_object">' : '').print_r($variable, true).($wrap_in_td ? '</span>' : '');
-		}
-		else if (is_null($variable))
-		{
-			$returnstring .= ($wrap_in_td ? '<span class="dump_null">' : '').'(null)'.($wrap_in_td ? '</span>' : '');
-		}
-		else if (is_string($variable))
-		{
-			$variable = strtr($variable, "\x00", ' ');
-			$varlen = strlen($variable);
-			for ($i = 0; $i < $varlen; $i++)
-			{
-				$returnstring .= htmlentities($variable{$i}, ENT_QUOTES, 'UTF-8');
-			}
-			$returnstring = ($wrap_in_td ? '<span class="dump_string">' : '').nl2br($returnstring).($wrap_in_td ? '</span>' : '');
-		}
-		else
-		{
-			$returnstring .= ($wrap_in_td ? '<span class="dump_other">' : '').nl2br(htmlspecialchars(strtr($variable, "\x00", ' '))).($wrap_in_td ? '</span>' : '');
-		}
-		return $returnstring;
-	}
-}
-
-
-
-// support class for the getID3 info and embedded image extraction:
-class EmbeddedImageContainer
-{
-	public $metadata;
-	public $imagedata;
-	public $id3_procsupport_obj;
-
-	public function __construct($meta, $img)
-	{
-		$this->metadata = $meta;
-		$this->imagedata = $img;
-		$this->id3_procsupport_obj = true;
-	}
-
-	public static function __set_state($arr)
-	{
-		$obj = new EmbeddedImageContainer($arr['metadata'], $arr['imagedata']);
-		return $obj;
-	}
-}
-
-class BinaryDataContainer
-{
-	public $binarydata;
-	public $binarydata_mode;
-	public $id3_procsupport_obj;
-
-	public function __construct($data, $mode = 'procd')
-	{
-		$this->binarydata_mode = $mode;
-		$this->binarydata = $data;
-		$this->id3_procsupport_obj = true;
-	}
-
-	public static function __set_state($arr)
-	{
-		$obj = new BinaryDataContainer($arr['binarydata'], $arr['binarydata_mode']);
-		return $obj;
-	}
-}
-
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/MootoolsFileManager/mootools-filemanager/Assets/Connector/FileManagerWithAliasSupport.php b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/MootoolsFileManager/mootools-filemanager/Assets/Connector/FileManagerWithAliasSupport.php
deleted file mode 100644
index 41a9cfe..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/MootoolsFileManager/mootools-filemanager/Assets/Connector/FileManagerWithAliasSupport.php
+++ /dev/null
@@ -1,242 +0,0 @@
-<?php
-/*
- * Script: FileManagerWithAliasSupport.php
- *   MooTools FileManager - Backend for the FileManager Script (with Alias path mapping support)
- *
- * Authors:
- *  - Christoph Pojer (http://cpojer.net) (author)
- *  - James Ehly (http://www.devtrench.com)
- *  - Fabian Vogelsteller (http://frozeman.de)
- *  - Ger Hobbelt (http://hebbut.net)
- *
- * License:
- *   MIT-style license.
- *
- * Copyright:
- *   FileManager Copyright (c) 2009-2011 [Christoph Pojer](http://cpojer.net)
- *   Backend: FileManager & FileManagerWithAliasSupport Copyright (c) 2011 [Ger Hobbelt](http://hobbelt.com)
- *
- * Dependencies:
- *   - Tooling.php
- *   - Image.class.php
- *   - getId3 Library
- *   - FileManager.php
- */
-
-require(strtr(dirname(__FILE__), '\\', '/') . '/FileManager.php');
-
-
-/**
- * Derived class for FileManager which is capable of handling Aliases as served through Apache's mod_alias or
- * mod_vhost_alias, PROVIDED you have set up the Alias translation table in the constructor: you must pass this table in the
- * $options array as a mapping array in the constructor.
- *
- * Options:
- *   -(all of the options of the FileManager class)
- *   -Aliases: (associative array of strings, where the 'key' URI path is to be transformed to the 'value' physical filesystem path.
- *
- * See Demos/FM-common.php::mkNewFileManager() for an example of an 'Aliases' path mapping set.
- */
-class FileManagerWithAliasSupport extends FileManager
-{
-	protected $scandir_alias_lu_arr;
-
-	public function __construct($options)
-	{
-		$this->scandir_alias_lu_arr = null;
-
-		$options = array_merge(array(
-			'Aliases' => null             // default is an empty Alias list.
-		), (is_array($options) ? $options : array()));
-
-		parent::__construct($options);
-
-		/*
-		 * Now process the Aliases array:
-		 * it works as-is for transforming URI to FILE path, but we need
-		 * to munch the list for scandir() to have fast access at the same info:
-		 *
-		 * here the goal is for scandir() to show the aliases as (fake) directory
-		 * entries, hence we need to collect the aliases per parent directory:
-		 */
-		if (is_array($this->options['Aliases']))
-		{
-			$alias_arr = $this->options['Aliases'];
-
-			// collect the set of aliases per parent directory: we need a fully set up options['directory'] for this now
-			$scandir_lookup_arr = array();
-
-			// NOTE: we can use any of the url2file_path methods here as those only use the raw [Aliases] array
-
-			foreach($alias_arr as $uri => $file)
-			{
-				$isdir = !is_file($file);
-
-				$p_uri = parent::getParentDir($uri);
-				$a_name = basename($uri);
-
-				// as scandir works with filesystem paths, convert this URI path to a filesystem path:
-				$p_dir = $this->url_path2file_path($p_uri);
-				$p_dir = self::enforceTrailingSlash($p_dir);
-
-				if (!isset($scandir_lookup_arr[$p_dir]))
-				{
-					$scandir_lookup_arr[$p_dir] = array(array(), array());
-				}
-				$scandir_lookup_arr[$p_dir][!$isdir][] = /* 'alias' => */ $a_name;
-			}
-
-			$this->scandir_alias_lu_arr = $scandir_lookup_arr;
-		}
-	}
-
-	/**
-	 * @return array the FileManager options and settings.
-	 */
-	public function getSettings()
-	{
-		return array_merge(array(
-			'scandir_alias_lu_arr' => $this->scandir_alias_lu_arr
-		), parent::getSettings());
-	}
-
-	/**
-	 * An augmented scandir() which will ensure any Aliases are included in the relevant
-	 * directory scans; this makes the Aliases behave very similarly to actual directories.
-	 */
-	public function scandir($dir, $filemask, $see_thumbnail_dir, $glob_flags_or, $glob_flags_and)
-	{
-		$dir = self::enforceTrailingSlash($dir);
-
-		// collect the real items first:
-		$coll = parent::scandir($dir, $filemask, $see_thumbnail_dir, $glob_flags_or, $glob_flags_and);
-		if ($coll === false)
-			return $coll;
-
-		$flags = GLOB_NODOTS | GLOB_NOHIDDEN | GLOB_NOSORT;
-		$flags &= $glob_flags_and;
-		$flags |= $glob_flags_or;
-
-		// make sure we keep the guarantee that the '..' entry, when present, is the very last one, intact:
-		$doubledot = array_pop($coll['dirs']);
-		if ($doubledot !== null && $doubledot !== '..')
-		{
-			$coll['dirs'][] = $doubledot;
-			$doubledot = null;
-		}
-
-
-		// we must check against thumbnail path again, as it MAY be an alias, itself!
-		$tndir = null;
-		if (!$see_thumbnail_dir)
-		{
-			$tn_uri = $this->options['thumbnailPath'];
-			$tnpath = $this->url_path2file_path($tn_uri);
-			//if (FileManagerUtility::startswith($dir, $tnpath))
-			//  return false;
-
-			$tnparent = self::getParentDir($tnpath);
-			$just_below_thumbnail_dir = FileManagerUtility::startswith($dir, $tnparent);
-
-			if ($just_below_thumbnail_dir)
-			{
-				$tndir = basename(substr($tn_uri, 0, -1));
-			}
-		}
-
-
-		// now see if we need to add any aliases as elements:
-		if (isset($this->scandir_alias_lu_arr) && !empty($this->scandir_alias_lu_arr[$dir]))
-		{
-			$a_base = $this->scandir_alias_lu_arr[$dir];
-			$d = $coll['dirs'];
-			$f = $coll['files'];
-			foreach($a_base[false] as $a_elem)
-			{
-				if (!in_array($a_elem, $d, true) && $tndir !== $a_elem
-					&& (!($flags & GLOB_NOHIDDEN) || $a_elem[0] != '.') )
-				{
-					//$coll['special_indir_mappings'][1][] = array_push($coll['dirs'], $a_elem) - 1;
-					$coll['dirs'][] = $a_elem;
-				}
-			}
-			foreach($a_base[true] as $a_elem)
-			{
-				if (!in_array($a_elem, $f, true)
-					&& (!($flags & GLOB_NOHIDDEN) || $a_elem[0] != '.') )
-				{
-					//$coll['special_indir_mappings'][0][] = array_push($coll['files'], $a_elem) - 1;
-					$coll['files'][] = $a_elem;
-				}
-			}
-		}
-
-		// make sure we keep the guarantee that the '..' entry, when present, is the very last one, intact:
-		if ($doubledot !== null)
-		{
-			$coll['dirs'][] = $doubledot;
-		}
-
-		return $coll;
-	}
-
-
-
-
-	/**
-	 * Return the filesystem absolute path for the relative or absolute URI path.
-	 *
-	 * Takes the ['Aliases'] mapping array into account; it is processed from top to bottom a la mod_alias.
-	 *
-	 * Note: as it uses normalize(), any illegal path will throw an FileManagerException
-	 *
-	 * Returns a fully normalized filesystem absolute path.
-	 */
-	public function url_path2file_path($url_path)
-	{
-		$url_path = $this->rel2abs_url_path($url_path);
-
-		$replaced_some = false;
-		if (is_array($this->options['Aliases']))
-		{
-			$alias_arr = $this->options['Aliases'];
-
-			foreach($alias_arr as $a_url => $a_path)
-			{
-				// if the uri path matches us (or at least our start), then apply the mapping.
-				// Make sure to only match entire path elements:
-				if (FileManagerUtility::startsWith($url_path . '/', $a_url . '/'))
-				{
-					$url_path = $a_path . substr($url_path, strlen($a_url));
-					$replaced_some = true;
-				}
-			}
-		}
-
-		if (!$replaced_some)
-		{
-			$url_path = parent::url_path2file_path($url_path);
-		}
-
-		return $url_path;
-	}
-
-	/**
-	 * Return the filesystem absolute path for the relative URI path or absolute LEGAL URI path.
-	 *
-	 * Note: as it uses normalize(), any illegal path will throw an FileManagerException
-	 *
-	 * Returns a fully normalized filesystem absolute path.
-	 */
-	public function legal_url_path2file_path($url_path)
-	{
-		$url_path = $this->rel2abs_legal_url_path($url_path);
-
-		$url_path = substr($this->options['directory'], 0, -1) . $url_path;
-
-		$path = $this->url_path2file_path($url_path);
-
-		return $path;
-	}
-}
-
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/MootoolsFileManager/mootools-filemanager/Assets/Connector/ID3.class.php b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/MootoolsFileManager/mootools-filemanager/Assets/Connector/ID3.class.php
deleted file mode 100644
index 7115393..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/MootoolsFileManager/mootools-filemanager/Assets/Connector/ID3.class.php
+++ /dev/null
@@ -1,632 +0,0 @@
-<?php

-

-/** 

- *  Obtain id3 information from mp3 files.

- *

- *  @author James Sleeman (james@gogo.co.nz)

- *  @website http://www.gogo.co.nz

- *  @license MIT  (http://en.wikipedia.org/wiki/MIT_License)

- * 

- *  With thanks for inspiration and a small amount of code to:

- *  Author    : de77

- *  Website   : www.de77.com

- *  Class desc  : http://de77.com/php/php-class-how-to-read-id3v2-tags-from-mp3-files

- *  Class desc  : http://de77.com/php/php-class-how-to-read-id3-v1-tag-from-mp3-files

- *

- *  Acknowledgement to: http://www.autistici.org/ermes/index.php?pag=1&post=15

- *  which I was going to use, but looked to be a bit fragile

- */

- 

-class id3Parser

-{ 

-  public $error;

-  

-  

-  private $tags = array(

-    // V2.3/4

-    'TALB' => 'album',

-    'TCON' => 'genre',

-    'TENC' => 'encoder',

-    'TIT2' => 'title',

-    'TPE1' => 'artist',

-    'TPE2' => 'ensemble',

-    'TYER' => 'year',

-    'TCOM' => 'composer',

-    'TCOP' => 'copyright',

-    'TRCK' => 'track',

-    'WXXX' => 'url',

-    'COMM' => 'comment',

-    

-    // V2.2     

-    'TAL' => 'album',     

-    'TCO' => 'genre',     

-    'TEN' => 'encoder',

-    'TT2' => 'title',     

-    'TP1' => 'artist',

-    'TP2' => 'ensemble',

-    'TYE' => 'year',

-    'TCM' => 'composer',

-    'TCR' => 'copyright',

-    'TRK' => 'track',

-    'WXX' => 'url',

-    'COM' => 'comment'

-  );

-  

-  // ID3v1 Genre Mapping

-  private $genres = array(

-    'Blues',

-    'Classic Rock',

-    'Country',

-    'Dance',

-    'Disco',

-    'Funk',

-    'Grunge',

-    'Hip-Hop',

-    'Jazz',

-    'Metal',

-    'New Age',

-    'Oldies',

-    'Other',

-    'Pop',

-    'R&B',

-    'Rap',

-    'Reggae',

-    'Rock',

-    'Techno',

-    'Industrial',

-    'Alternative',

-    'Ska',

-    'Death Metal',

-    'Pranks',

-    'Soundtrack',

-    'Euro-Techno',

-    'Ambient',

-    'Trip-Hop',

-    'Vocal',

-    'Jazz+Funk',

-    'Fusion',

-    'Trance',

-    'Classical',

-    'Instrumental',

-    'Acid',

-    'House',

-    'Game',

-    'Sound Clip',

-    'Gospel',

-    'Noise',

-    'AlternRock',

-    'Bass',

-    'Soul',

-    'Punk',

-    'Space',

-    'Meditative',

-    'Instrumental Pop',

-    'Instrumental Rock',

-    'Ethnic',

-    'Gothic',

-    'Darkwave',

-    'Techno-Industrial',

-    'Electronic',

-    'Pop-Folk',

-    'Eurodance',

-    'Dream',

-    'Southern Rock',

-    'Comedy',

-    'Cult',

-    'Gangsta',

-    'Top 40',

-    'Christian Rap',

-    'Pop/Funk',

-    'Jungle',

-    'Native American',

-    'Cabaret',

-    'New Wave',

-    'Psychadelic',

-    'Rave',

-    'Showtunes',

-    'Trailer',

-    'Lo-Fi',

-    'Tribal',

-    'Acid Punk',

-    'Acid Jazz',

-    'Polka',

-    'Retro',

-    'Musical',

-    'Rock & Roll',

-    'Hard Rock',

-    'Folk',

-    'Folk-Rock',

-    'National Folk',

-    'Swing',

-    'Fast Fusion',

-    'Bebob',

-    'Latin',

-    'Revival',

-    'Celtic',

-    'Bluegrass',

-    'Avantgarde',

-    'Gothic Rock',

-    'Progressive Rock',

-    'Psychedelic Rock',

-    'Symphonic Rock',

-    'Slow Rock',

-    'Big Band',

-    'Chorus',

-    'Easy Listening',

-    'Acoustic',

-    'Humour',

-    'Speech',

-    'Chanson',

-    'Opera',

-    'Chamber Music',

-    'Sonata',

-    'Symphony',

-    'Booty Bass',

-    'Primus',

-    'Porn Groove',

-    'Satire',

-    'Slow Jam',

-    'Club',

-    'Tango',

-    'Samba',

-    'Folklore',

-    'Ballad',

-    'Power Ballad',

-    'Rhythmic Soul',

-    'Freestyle',

-    'Duet',

-    'Punk Rock',

-    'Drum Solo',

-    'Acapella',

-    'Euro-House',

-    'Dance Hall'

-    );   

-  

-  /** Given a path to an mp3 file, interrogate the file to find any id3 tags in it.

-   *  return an associative array

-   *  can handle id3v1, v2.2, v2.3 and v2.4, however it is not a complete parser, just good-enough

-   *  compressed and encrypted frames are skipped, only (T)ext and (W)ww frames are typically returned

-   *

-   */

-  

-  public function read($file)

-  {

-    $f = fopen($file, 'r');

-    $result = array();

-    if( fread($f, 3) == 'ID3')

-    {

-      // ID3v2 tag at start of file, use that

-      rewind($f);

-      $result = array_merge($result, $this->read_v2($f));

-    }

-    

-    if(!count($result))

-    {

-      fseek($f, -10, SEEK_END);

-      if( fread($f, 3) == '3DI' )

-      {

-        // Looking at a footer of an ID3v2, find the length and seek backwards to the start

-        fseek($f, -10, SEEK_END);

-        $result = array_merge($result, $this->read_v2($f));

-      }

-    }

-    

-    if(!count($result))

-    {

-      fseek($f, -128, SEEK_END);

-      if( fread($f, 3) == 'TAG' )

-      {

-        // v1 tag        

-        fseek($f, -128, SEEK_END);

-        $result = array_merge($result, $this->read_v1($f));

-      }

-    }

-    

-    if(!count($result))

-    {

-      // Still nothing, let's make a title anyway

-      $result['title'] = trim(preg_replace('/(\.mp3|%20|[_+ -]|(^[0-9]+\.?))+/i', ' ', basename($file)));

-      $result['id3']   = '0';

-    }

-    

-    return $result;

-   // echo ("NO ID3 ($file)\n");

-  }

-  

-  /** Decode the value of a text frame, returns in UTF-8 always */

-  

-  private function decode_v23_text_value($tag)

-  {

-    //mb_convert_encoding is corrupted in some versions of PHP so I use iconv

-    switch (ord($tag[0]))

-    {

-      case 0: //ISO-8859-1        

-          return @iconv('ISO-8859-1', 'UTF-8', substr($tag, 1));

-      case 1: //UTF-16 BOM      

-          return @iconv('UTF-16LE', 'UTF-8//IGNORE',  substr($tag.chr(0x00), 3));

-      case 2: //UTF-16BE

-          return @iconv('UTF-16BE', 'UTF-8', substr($tag.chr(0x00), 3));

-      case 3: //UTF-8

-          return substr($tag, 1);

-    }

-    return false;

-  }

-          

-  /** Some size fields in 2.3+ headers are "sync safe", we need to strip out certain bits and rebuild the size integer, bitwise.

-   */

-

-  private function desync_size($headersize)

-  {

-    // The header size needs fixing by stripping out certain bits (1st, 9th, 17th, 25th)

-    // 011111111 === 0x7F

-    $size =    $headersize & 0x7F; // Grab least sig 7 bits

-               $headersize = $headersize >> 8;   // shift out 8 bits

-    

-    $size =    (($headersize & 0x7F)<<7)|$size; // grab least sig 7 bits and shift 7 to the left then add to size

-               $headersize = $headersize >> 8;   // shift out 8 bits

-    

-    $size =    (($headersize & 0x7F)<<14)|$size; // grab least sig 7 bits and shift 14 to the left then add to size

-               $headersize = $headersize >> 8;   // shift out 8 bits

-    

-    $size =    (($headersize & 0x7F)<<21)|$size; // grab least sig 7 bits and shift 21 to the left then add to size

-               $headersize = $headersize >> 8;   // shift out 8 bits    

-    

-    return $size;

-  }

-

-  /** Read a specified number of bytes from the stream counted AFTER re-synchonisation (if necessary).

-   *  The spec isn't very clear, but I believe that in a 2.2/3 if the unsynchronised flag is on, 

-   *  then the frame headers are unsynchronised also, which means if they happen to include an FF00

-   *  simply reading 10 raw bytes would not get a proper frame header.

-   *  We have to unsynchronise as we go and maybe ready more bytes.

-   *

-   *  In contrast, once we HAVE that frame header, the size specified in that header is the unsynchronised size

-   *  of the frame without header, so we should get that specific # of bytes in that case.

-   */

-   

-  private function fread_id3_synchronised_length($f, $num, $IsUnsynchronised, &$LeftToRead)

-  {

-    $frame = '';

-    $totalread = 0;

-    

-    while((strlen($frame) < $num) && $LeftToRead && !feof($f))

-    {

-      $LeftToRead -= $num-strlen($frame);

-      $frame .= fread($f, $num-strlen($frame));          

-      if($IsUnsynchronised) 

-      {

-        $frame = str_replace(chr(0xff).chr(0x00), chr(0xff), $frame);          

-      }

-      

-      while(strlen($frame) && (ord($frame[0]) == 0))

-      {

-        // We have picked up a NUL padding?        

-        $frame = substr($frame,1);

-      }

-    }

-    

-    return $frame;

-  }

-  

-  /** Given a file handle seeked to the first byte of an id3v2.X header, 

-   *  return an array of Property => Value for the id3 properties we can handle (currently T and W prefixes)

-   *  if a property has a given name in id3ParserDe77::$tags, then this will be set also (as a reference).

-   */

-   

-  private function read_v2($f)

-  {   

-    $header = fread($f, 10);

-    $header = @unpack("a3signature/C1version_major/C1version_minor/C1flags/Nsize", $header);

-    $header['size'] = $this->desync_size($header['size']);

-    

-    if($header['signature'] == '3DI')

-    {

-      // This is a footer for a v4, seek up to the start of the data after the header

-      // We don't need to read the header, it's the same as the footer      

-      fseek($f, 0-$header['size']-10, SEEK_CUR); 

-    }

-    

-    $header['version_major'] = hexdec($header['version_major']);

-    $header['version_minor'] = hexdec($header['version_minor']);

-    

-    switch($header['version_major'])

-    {

-      case 4:

-        $result = $this->read_v24($f, $header);       

-        break;

-        

-      case 3:

-        $result = $this->read_v23($f, $header);        

-        break;

-        

-      case 2:

-        $result = $this->read_v22($f, $header);

-        break;

-        

-      default:        

-        $result = array();

-        break;

-    }

-    

-    if(count($result)) $result['id3'] = '2.'.$header['version_major'].'.'.$header['version_minor'];

-     

-    return $result; 

-  } 

-  

-  private function read_v22($f, $header)

-  {    

-    $LeftToRead = $header['size'];

-    $IsUnsynchronised  = $header['flags'] & (1<<7);

-    $IsCompressed      = $header['flags'] & (1<<6);

-    

-    if($IsCompressed) { return array(); }

-    

-    // At this point we should be looking at a frame header on the stream   

-    $result = array();

-    while(($LeftToRead > 6) && !feof($f))

-    {    

-      $frame = fread($f, 6);//$this->fread_id3_synchronised_length($f, 6, $IsUnsynchronised, $LeftToRead);

-            

-      if(strlen($frame) < 6) continue; // Bad frame

-      $frame = unpack('a3id/C3size', $frame );  

-      $frame['size'] = ($frame['size1']<<14)|($frame['size2']<<7)|($frame['size3']);

-      

-      if($frame['size'] == 0) break; // We are now into padding area.      

-      if($frame['size'] > (1024*1024)) { fseek($f, $frame['size'], SEEK_CUR); $LeftToRead -= $frame['size']; continue; }

-

-      // Read the value of the frame        

-      $value = fread($f, $frame['size']);

-      $LeftToRead -= $frame['size'];

-      $frame['value'] = $value;

-      

-      if($IsUnsynchronised) 

-      { 

-        $value = str_replace(chr(0xff).chr(0x00), chr(0xff), $value); 

-      }

-          

-      switch($frame['id'][0])

-      {

-        case 'T':

-          $value = $this->decode_v23_text_value($value);

-          // The old id3v1 genre can be included in this textual information

-          if($frame['id'] == 'TCO' && preg_match('/\(([0-9]+)\)/', $value, $M))

-          {

-            if(isset($this->genres[$M[1]]))

-            {

-              $value = $this->genres[$M[1]];

-            }

-          }

-          $result[$frame['id']] = $value;

-          if(isset($this->tags[$frame['id']])) 

-          {

-            $result[$this->tags[$frame['id']]] =& $result[$frame['id']];

-          }

-          break;

-          

-        case 'W':

-          $result[$frame['id']] = $value;

-          if(isset($this->tags[$frame['id']])) 

-          {

-            $result[$this->tags[$frame['id']]] =& $result[$frame['id']];

-          }          

-        break;

-      }

-    }

-        

-    return $result;

-  

-  }

-  

-  private function read_v24($f, $header)

-  {        

-    $IsUnsynchronised  = $header['flags'] & (1<<7);

-    $HasExtendedHeader = $header['flags'] & (1<<6);

-    $IsExperimental    = $header['flags'] & (1<<5);

-           

-    $LeftToRead = $header['size'];

-    if($HasExtendedHeader)

-    {    

-      $exHeader = unpack('Nsize', fread($f, 4));

-      $exHeader['size'] = $this->desync_size($exHeader['size']);

-      

-      fread($f, $exHeader['size']-4); // Dont' care about this we are just getting rid of it.

-      $LeftToRead -= $exHeader['size'];

-    }

-    

-    // At this point we should be looking at a frame header on the stream

-   

-    $result = array();

-    while(($LeftToRead > 10) && !feof($f))

-    {    

-      $frame = $this->fread_id3_synchronised_length($f, 10, $IsUnsynchronised, $LeftToRead);

-

-      if(strlen($frame) < 10) continue; // Bad frame

-      $frame = unpack('a4id/Nsize/C2flags', $frame );        

-      $frame['size'] = $this->desync_size($frame['size']);

-      

-      if($frame['size'] == 0) break; // We are now into padding area.

-      

-      if( $frame['flags2'] & (1<<7) // Compressed

-      ||  $frame['flags2'] & (1<<6) // Encrypted

-      )

-      {         

-        // Can't work with these

-        fseek($f, $frame['size'], SEEK_CUR); // Dont' care about this we are just getting rid of it.

-        $LeftToRead -= $frame['size'];

-        continue;

-      }

-      

-      if($frame['flags2'] & (1<<5)) // Grouping

-      {

-        fread($f,1); // Get rid of the group byte        

-        $LeftToRead -= 1;

-        $frame['size']--; // it is included in the frame size?

-      }

-      

-      if($frame['flags2'] & 1) // Data length

-      {

-        fread($f,4); // Get rid of the group byte        

-        $LeftToRead -= 4;

-        $frame['size'] -= 4; // it is included in the frame size?

-      }

-      

-      if($frame['size'] > (1024*1024)) { fseek($f, $frame['size'], SEEK_CUR); $LeftToRead -= $frame['size']; continue; }

-

-      // Read the value of the frame      

-      $value = fread($f, $frame['size']);

-      $LeftToRead -= $frame['size'];

-      $frame['value'] = $value;

-      

-      if($IsUnsynchronised) 

-      { 

-        $value = str_replace(chr(0xff).chr(0x00), chr(0xff), $value); 

-      }

-          

-      switch($frame['id'][0])

-      {

-        case 'T':

-          $value = $this->decode_v23_text_value($value);

-          // The old id3v1 genre can be included in this textual information

-          if($frame['id'] == 'TCON' && preg_match('/\(([0-9]+)\)/', $value, $M))

-          {

-            if(isset($this->genres[$M[1]]))

-            {

-              $value = $this->genres[$M[1]];

-            }

-          }

-          $result[$frame['id']] = $value;

-          if(isset($this->tags[$frame['id']])) 

-          {

-            $result[$this->tags[$frame['id']]] =& $result[$frame['id']];

-          }

-          break;

-          

-        case 'W':

-          $result[$frame['id']] = $value;

-          if(isset($this->tags[$frame['id']])) 

-          {

-            $result[$this->tags[$frame['id']]] =& $result[$frame['id']];

-          }          

-        break;

-      }

-    }

-    // echo "VERSION 4\n";   

-    return $result;

-  }

-

-  /** Given a file handle seeked to the first byte after the header, and the header decoded in an array, 

-   *  return an array of Property => Value for the id3 properties we can handle (currently T and W prefixes)

-   *  if a property has a given name in id3ParserDe77::$tags, then this will be set also (as a reference).

-   */

-   

-  private function read_v23($f, $header)

-  {        

-    $IsUnsynchronised  = $header['flags'] & (1<<7);

-    $HasExtendedHeader = $header['flags'] & (1<<6);

-    $IsExperimental    = $header['flags'] & (1<<5);

-        

-   

-    $LeftToRead = $header['size'];

-    if($HasExtendedHeader)

-    {    

-      $exHeader = unpack('Nsize', fread($f, 4));

-      fread($f, $exHeader['size']); // Dont' care about this we are just getting rid of it.

-      $LeftToRead -= 4 + $exHeader['size'];

-    }

-    

-    // At this point we should be looking at a frame header on the stream

-   

-    $result = array();

-    while(($LeftToRead > 10) && !feof($f))

-    {    

-      $frame = $this->fread_id3_synchronised_length($f, 10, $IsUnsynchronised, $LeftToRead);

-

-      if(strlen($frame) < 10) continue; // Bad frame

-      $frame = unpack('a4id/Nsize/C2flags', $frame );            

-      if($frame['size'] == 0) break; // We are now into padding area.

-      

-      if( $frame['flags2'] & (1<<7) // Compressed

-      ||  $frame['flags2'] & (1<<6) // Encrypted

-      )

-      {         

-        // Can't work with these

-        fseek($f, $frame['size'], SEEK_CUR); // Dont' care about this we are just getting rid of it.

-        $LeftToRead -= $frame['size'];

-        continue;

-      }

-      

-      if($frame['flags2'] & (1<<5)) // Grouping

-      {

-        fread($f,1); // Get rid of the group byte        

-        $LeftToRead -= 1;

-        $frame['size']--; // it is included in the frame size

-      }

-      

-      if($frame['size'] > (1024*1024)) { fseek($f, $frame['size'], SEEK_CUR); $LeftToRead -= $frame['size']; continue; }

-

-      // Read the value of the frame        

-      $value = fread($f, $frame['size']);

-      $LeftToRead -= $frame['size'];

-      $frame['value'] = $value;

-      

-      if($IsUnsynchronised) 

-      { 

-        $value = str_replace(chr(0xff).chr(0x00), chr(0xff), $value); 

-      }

-          

-      switch($frame['id'][0])

-      {

-        case 'T':

-          $value = $this->decode_v23_text_value($value);

-          // The old id3v1 genre can be included in this textual information

-          if($frame['id'] == 'TCON' && preg_match('/\(([0-9]+)\)/', $value, $M))

-          {

-            if(isset($this->genres[$M[1]]))

-            {

-              $value = $this->genres[$M[1]];

-            }

-          }

-          $result[$frame['id']] = $value;

-          if(isset($this->tags[$frame['id']])) 

-          {

-            $result[$this->tags[$frame['id']]] =& $result[$frame['id']];

-          }

-          break;

-          

-        case 'W':

-          $result[$frame['id']] = $value;

-          if(isset($this->tags[$frame['id']])) 

-          {

-            $result[$this->tags[$frame['id']]] =& $result[$frame['id']];

-          }          

-        break;

-      }

-    }

-        

-    return $result;

-  }

-

-  /** Given a file handle seeked to the first byte of the header

-   *  return an array of Property => Value for the id3 properties we can handle 

-   *  v1 properties are only title, artist, album, year, comment and genre

-   */

-   

-  public function read_v1($f)

-  {    

-    fseek($f, -128, SEEK_END);

-    $id3 = fread($f, 128);

-    

-    $id3 = @unpack("a3signature/a30title/a30artist/a30album/a4year/a30comment/c1genre", $id3);

-    $id3['genre'] = @$this->genres[$id3['genre']];

-    

-    if (!$id3['signature'] == 'TAG')

-    {

-      $this->error = 'This file does not contain ID3 v1 tag';   

-      return false;   

-    }

-    

-    unset($id3['signature']);

-    $id3['id3'] = 1;    

-    return $id3;  

-  }

-}
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/MootoolsFileManager/mootools-filemanager/Assets/Connector/Image.class.php b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/MootoolsFileManager/mootools-filemanager/Assets/Connector/Image.class.php
deleted file mode 100644
index 7835078..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/MootoolsFileManager/mootools-filemanager/Assets/Connector/Image.class.php
+++ /dev/null
@@ -1,799 +0,0 @@
-<?php
-/**
- * Image - Provides an Interface to the GD-Library for image manipulation
- *
- *
- * @license MIT-style License
- * @author Christoph Pojer <christoph.pojer@gmail.com>
- * @author Additions: Fabian Vogelsteller <fabian.vogelsteller@gmail.com>
- * @author Additions: Ger Hobbelt <ger@hobbelt.com>
- *
- * @link http://www.bin-co.com/php/scripts/classes/gd_image/ Based on work by "Binny V A"
- *
- * @version 1.12
- * Changelog
- *    - 1.12 added memory usage guestimator to warn you when attempting to process overlarge images which will silently but fataly crash PHP
- *    - 1.11 fixed $ratio in resize when both values are given
- *    - 1.1 add real resizing, with comparison of ratio
- *    - 1.01 small fixes in process method and add set memory limit to a higher value
- */
-
-
-define('IMAGE_PROCESSING_MEMORY_MAX_USAGE', 160); // memory_limit setting, in Megabytes; increase when Image class reports too often the images don't fit in memory.
-
-class Image {
-	/**
-	 * The path to the image file
-	 *
-	 * @var string
-	 */
-	private $file;
-	/**
-	 * The image resource
-	 *
-	 * @var resource
-	 */
-	private $image;
-	/**
-	 * Metadata regarding the image
-	 *
-	 * @var array
-	 */
-	private $meta;
-	/**
-	 * Flags whether the image has been manipulated by this instance in any way and has not yet been saved to disk.
-	 */
-	private $dirty;
-
-	/**
-	 * @param string $file The path to the image file
-	 */
-	public function __construct($file)
-	{
-		$this->dirty = false;
-
-		$this->meta = self::checkFileForProcessing($file);
-
-		// only set the new memory limit of IMAGE_PROCESSING_MEMORY_MAX_USAGE MB when the configured one is smaller:
-		if ($this->meta['fileinfo']['memory_limit'] < IMAGE_PROCESSING_MEMORY_MAX_USAGE * 1024 * 1024)
-		{
-			ini_set('memory_limit', IMAGE_PROCESSING_MEMORY_MAX_USAGE . 'M'); //  handle large images
-		}
-
-		$this->file = $file;
-
-		if($this->meta['ext'] != 'jpeg')
-		{
-			$this->image = $this->create();
-
-			$fn = 'imagecreatefrom'.$this->meta['ext'];
-			$original = false;
-			if (function_exists($fn))
-			{
-				$original = @$fn($file);
-			}
-			if (!$original) throw new Exception('imagecreate_failed:' . $fn);
-
-			if (!@imagecopyresampled($this->image, $original, 0, 0, 0, 0, $this->meta['width'], $this->meta['height'], $this->meta['width'], $this->meta['height']))
-				throw new Exception('cvt2truecolor_failed:' . $this->meta['width'] . ' x ' . $this->meta['height']);
-			imagedestroy($original);
-			unset($original);
-		}
-		else
-		{
-			$this->image = @imagecreatefromjpeg($file);
-			if (!$this->image) throw new Exception('imagecreate_failed:imagecreatefromjpeg');
-		}
-	}
-
-	public function __destruct(){
-		if(!empty($this->image)) imagedestroy($this->image);
-		unset($this->image);
-	}
-
-	/**
-	 * Return an array of supported extensions (rather: the second parts of the mime types!)
-	 *
-	 * A type is listed as 'supported' when it can be READ.
-	 */
-	public static function getSupportedTypes()
-	{
-		static $supported_types;
-
-		if (empty($supported_types))
-		{
-			$gdi = gd_info();
-
-			$supported_types = array();
-			if (!empty($gdi['GIF Read Support']))
-				$supported_types[] = 'gif';
-			if (!empty($gdi['PNG Support']))
-				$supported_types[] = 'png';
-			if (!empty($gdi['JPEG Support']) || !empty($gdi['JPG Support']) /* pre 5.3.0 */ )
-				$supported_types[] = 'jpeg';
-			if (!empty($gdi['WBMP Support']))
-				$supported_types[] = 'wbmp';
-			if (!empty($gdi['XPM Support']))
-				$supported_types[] = 'xpm';
-			if (!empty($gdi['XBM Support']))
-				$supported_types[] = 'xbm';
-			$supported_types[] = 'bmp';
-		}
-		return $supported_types;
-	}
-
-	/**
-	 * Guestimates how much RAM memory must be available to be able to process the given image file.
-	 *
-	 * @return an array with key,value pairs: 'needed' specifies the guestimated minimum amount of free
-	 *         memory required for the given file, 'memory_limit' is an integer value representing the total
-	 *         amount of bytes reserved for PHP script, while 'will_fit' is a boolean which indicates whether
-	 *         the given image file could potentially be loaded and processed without causing fatal out-of-memory
-	 *         errors.
-	 *         The directory separator and path-corrected filespec is returned in the 'path' value.
-	 *
-	 * @note The given image file must exist on disk; if it does not, 'needed' and 'will_fit' keys will not
-	 *       be present in the returned array.
-	 */
-	public static function guestimateRequiredMemorySpace($file)
-	{
-		$val = trim(ini_get('memory_limit'));
-		$last = strtoupper(substr($val, -1, 1));
-		$val = floatval($val); // discards the KMG postfix, allow $val to carry values beyond 2..4G
-		switch($last)
-		{
-		// The 'G' modifier is available since PHP 5.1.0
-		case 'G':
-			$val *= 1024.0;
-		case 'M':
-			$val *= 1024.0;
-		case 'K':
-			$val *= 1024.0;
-			break;
-		}
-		$limit = $val;
-
-		$in_use = (function_exists('memory_get_usage') ? memory_get_usage() : 1000000 /* take a wild guess, er, excuse me, 'apply a heuristic' */ );
-
-		$rv = array(
-			'memory_limit' => $limit,
-			'mem_in_use' => $in_use,
-			'path' => $file
-			);
-
-		if(file_exists($file))
-		{
-			$raw_size = @filesize($file);
-			$rv['filesize'] = $raw_size;
-
-			$img = @getimagesize($file, $info_ex);
-			if ($img)
-			{
-				$width = $img[0];
-				$height = $img[1];
-				$rv['imageinfo'] = $img;
-				$rv['imageinfo_extra'] = $info_ex;
-
-				// assume RGBA8, i.e. 4 bytes per pixel
-				// ... having had a good look with memory_get_usage() and memory_get_peak_usage(), it turns out we need
-				// a 'fudge factor' a.k.a. heuristic as the '4 bytes per pixel' estimate is off by quite a bit (if we have
-				// to believe the numbers following a single GD image load operation):
-				$needed = 4.0 * $width * $height;
-				$needed *= 34.0 / 27.0;
-				$rv['needed'] = $needed;
-
-				// since many operations require a source and destination buffer, that'll be 2 of them buffers, thank you very much:
-				// ... however, having had a good look with memory_get_usage() and memory_get_peak_usage(), it turns out
-				// we need about triple!
-				$will_eat = $needed * 2.8;
-				// ^^^ factor = 2.8 : for very large images the estimation error is now ~ +1..8% too pessimistic. Soit!
-				//     (tested with PNG images which consumed up to 475MB RAM to have their thumbnail created. This took a few
-				//      seconds per image, so you might ask yourself if being able to serve such memory megalodons would be,
-				//      ah, desirable, when considered from this perspective.)
-
-				// and 'worst case' (ahem) we've got the file itself loaded in memory as well (on initial load and later save):
-				// ... but this is more than covered by the 'triple charge' already, so we ditch this one from the heuristics.
-				if (0) $will_eat += $raw_size;
-
-				// interestingly, JPEG files only appear to require about half that space required by PNG resize processes...
-				if (!empty($img['mime']) && $img['mime'] == 'image/jpeg')
-				{
-					$will_eat /= 2.0;
-				}
-
-				$rv['usage_guestimate'] = $will_eat;
-
-				// now we know what we about need for this bugger, see if we got enough:
-				$does_fit = ($limit - $in_use > $will_eat);
-				$rv['usage_min_advised'] = $will_eat + $in_use;
-				$rv['will_fit'] = $does_fit;
-			}
-			else
-			{
-				// else: this is not a valid image file!
-				$rv['not_an_image_file'] = true;
-			}
-		}
-		else
-		{
-			// else: this file does not exist!
-			$rv['not_an_image_file'] = true;
-		}
-		return $rv;
-	}
-
-	/**
-	 * Check whether the given file is really an image file and whether it can be processed by our Image class, given the PHP
-	 * memory restrictions.
-	 *
-	 * Return the meta data array when the expectation is that the given file can be processed; throw an exception otherwise.
-	 */
-	public static function checkFileForProcessing($file)
-	{
-		$finfo = self::guestimateRequiredMemorySpace($file);
-		if (!empty($finfo['not_an_image_file']))
-			throw new Exception('no_imageinfo');
-
-		// is it a valid file existing on disk?
-		if (!isset($finfo['imageinfo']))
-			throw new Exception('no_imageinfo');
-
-		$file = $finfo['path'];
-
-		// only set the new memory limit of IMAGE_PROCESSING_MEMORY_MAX_USAGE MB when the configured one is smaller:
-		if ($finfo['memory_limit'] < IMAGE_PROCESSING_MEMORY_MAX_USAGE * 1024 * 1024)
-		{
-			// recalc the 'will_fit' indicator now:
-			$finfo['will_fit'] = ($finfo['usage_min_advised'] < IMAGE_PROCESSING_MEMORY_MAX_USAGE * 1024 * 1024);
-		}
-
-		$img = $finfo['imageinfo'];
-
-		// and will it fit in available memory if we go and load the bugger?
-		if (!$finfo['will_fit'])
-			throw new Exception('img_will_not_fit:' . ceil($finfo['usage_min_advised'] / 1E6) . ' MByte');
-
-		$explarr = explode('/', $img['mime']); // make sure the end() call doesn't throw an error next in E_STRICT mode:
-		$ext_from_mime = end($explarr);
-		$meta = array(
-			'width' => $img[0],
-			'height' => $img[1],
-			'mime' => $img['mime'],
-			'ext' => $ext_from_mime,
-			'fileinfo' => $finfo
-		);
-
-		if($meta['ext'] == 'jpg')
-			$meta['ext'] = 'jpeg';
-		else if($meta['ext'] == 'bmp')
-			$meta['ext'] = 'bmp';
-		else if($meta['ext'] == 'x-ms-bmp')
-			$meta['ext'] = 'bmp';
-		if(!in_array($meta['ext'], self::getSupportedTypes()))
-			throw new Exception('unsupported_imgfmt:' . $meta['ext']);
-
-		return $meta;
-	}
-
-	/**
-	 * Calculate the resize dimensions of an image, given the original dimensions and size limits
-	 *
-	 * @param int $orig_x the original's width
-	 * @param int $orig_y the original's height
-	 * @param int $x the maximum width after resizing has been done
-	 * @param int $y the maximum height after resizing has been done
-	 * @param bool $ratio set to FALSE if the image ratio is solely to be determined
-	 *                    by the $x and $y parameter values; when TRUE (the default)
-	 *                    the resize operation will keep the image aspect ratio intact
-	 * @param bool $resizeWhenSmaller if FALSE the images will not be resized when
-	 *                    already smaller, if TRUE the images will always be resized
-	 * @return array with 'width', 'height' and 'must_resize' component values on success; FALSE on error
-	 */
-	public static function calculate_resize_dimensions($orig_x, $orig_y, $x = null, $y = null, $ratio = true, $resizeWhenSmaller = false)
-	{
-		if(empty($orig_x) || empty($orig_y) || (empty($x) && empty($y))) return false;
-
-		$xStart = $x;
-		$yStart = $y;
-		$ratioX = $orig_x / $orig_y;
-		$ratioY = $orig_y / $orig_x;
-		$ratio |= (empty($y) || empty($x)); // keep ratio when only width OR height is set
-		//echo 'ALLOWED: <br>'.$xStart.'x'."<br>".$yStart.'y'."<br>---------------<br>";
-		// ->> keep the RATIO
-		if($ratio) {
-			//echo 'BEGINN: <br>'.$orig_x.'x'."<br>".$orig_y.'y'."<br><br>";
-			// -> align to WIDTH
-			if(!empty($x) && ($x < $orig_x || $resizeWhenSmaller))
-				$y = $x / $ratioX;
-			// -> align to HEIGHT
-			elseif(!empty($y) && ($y < $orig_y || $resizeWhenSmaller))
-				$x = $y / $ratioY;
-			else {
-				$y = $orig_y;
-				$x = $orig_x;
-			}
-			//echo 'BET: <br>'.$x.'x'."<br>".$y.'y'."<br><br>";
-			// ->> align to WIDTH AND HEIGHT
-			if((!empty($yStart) && $y > $yStart) || (!empty($xStart) && $x > $xStart)) {
-				if($y > $yStart) {
-					$y = $yStart;
-					$x = $y / $ratioY;
-				} elseif($x > $xStart) {
-					$x = $xStart;
-					$y = $x / $ratioX;
-				}
-			}
-		}
-		// else: ->> DONT keep the RATIO
-
-		$x = round($x);
-		$y = round($y);
-
-		//echo 'END: <br>'.$x.'x'."<br>".$y.'y'."<br><br>";
-		$rv = array(
-			'width' => $x,
-			'height' => $y,
-			'must_resize' => false
-		);
-		// speedup? only do the resize operation when it must happen:
-		if ($x != $orig_x || $y != $orig_y)
-		{
-			$rv['must_resize'] = true;
-		}
-		return $rv;
-	}
-
-	/**
-	 * Returns the size of the image
-	 *
-	 * @return array
-	 */
-	public function getSize(){
-		return array(
-			'width' => $this->meta['width'],
-			'height' => $this->meta['height'],
-		);
-	}
-
-
-	/**
-	 * Returns a copy of the meta information of the image
-	 *
-	 * @return array
-	 */
-	public function getMetaInfo(){
-		return array_merge(array(), (is_array($this->meta) ? $this->meta : array()));
-	}
-
-
-	/**
-	 * Returns TRUE when the image data have been altered by this instance's operations, FALSE when the content has not (yet) been touched.
-	 *
-	 * @return boolean
-	 */
-	public function isDirty(){
-		return $this->dirty;
-	}
-
-
-	/**
-	 * Creates a new, empty image with the desired size
-	 *
-	 * @param int $x
-	 * @param int $y
-	 * @param string $ext
-	 * @return resource GD image handle on success; throws an exception on failure
-	 */
-	private function create($x = null, $y = null, $ext = null){
-		if(!$x) $x = $this->meta['width'];
-		if(!$y) $y = $this->meta['height'];
-
-		$image = @imagecreatetruecolor($x, $y);
-		if (!$image) throw new Exception('imagecreatetruecolor_failed');
-		if(!$ext) $ext = $this->meta['ext'];
-		if($ext == 'png'){
-			if (!@imagealphablending($image, false))
-				throw new Exception('imagealphablending_failed');
-			$alpha = @imagecolorallocatealpha($image, 0, 0, 0, 127);
-			if (!$alpha) throw new Exception('imageallocalpha50pctgrey_failed');
-			imagefilledrectangle($image, 0, 0, $x, $y, $alpha);
-		}
-
-		return $image;
-	}
-
-	/**
-	 * Replaces the image resource with the given parameter
-	 *
-	 * @param resource $new
-	 */
-	private function set($new){
-		if(!empty($this->image)) imagedestroy($this->image);
-			$this->dirty = true;
-			$this->image = $new;
-
-			$this->meta['width'] = imagesx($this->image);
-			$this->meta['height'] = imagesy($this->image);
-	}
-
-	/**
-	 * Returns the path to the image file
-	 *
-	 * @return string
-	 */
-	public function getImagePath(){
-		return $this->file;
-	}
-
-	/**
-	 * Returns the resource of the image file
-	 *
-	 * @return resource
-	 */
-	public function getResource(){
-		return $this->image;
-	}
-
-	/**
-	 * Rotates the image by the given angle
-	 *
-	 * @param int $angle
-	 * @param array $bgcolor An indexed array with red/green/blue/alpha values
-	 * @return resource Image resource on success; throws an exception on failure
-	 */
-	public function rotate($angle, $bgcolor = null){
-		if(empty($this->image) || !$angle || $angle>=360) return $this;
-
-		$alpha = (is_array($bgcolor) ? @imagecolorallocatealpha($this->image, $bgcolor[0], $bgcolor[1], $bgcolor[2], !empty($bgcolor[3]) ? $bgcolor[3] : null) : $bgcolor);
-		if (!$alpha) throw new Exception('imagecolorallocatealpha_failed');
-		$img = @imagerotate($this->image, $angle, $alpha);
-		if (!$img) throw new Exception('imagerotate_failed');
-		$this->set($img);
-		unset($img);
-
-		return $this;
-	}
-
-	/**
-	 * Resizes the image to the given size, automatically calculates
-	 * the new ratio if parameter {@link $ratio} is set to true
-	 *
-	 * @param int $x the maximum width after resizing has been done
-	 * @param int $y the maximum height after resizing has been done
-	 * @param bool $ratio set to FALSE if the image ratio is solely to be determined
-	 *                    by the $x and $y parameter values; when TRUE (the default)
-	 *                    the resize operation will keep the image aspect ratio intact
-	 * @param bool $resizeWhenSmaller if FALSE the images will not be resized when
-	 *                    already smaller, if TRUE the images will always be resized
-	 * @return resource Image resource on success; throws an exception on failure
-	 */
-	public function resize($x = null, $y = null, $ratio = true, $resizeWhenSmaller = false)
-	{
-		if(empty($this->image) || (empty($x) && empty($y)))
-		{
-			throw new Exception('resize_inerr');
-		}
-
-		$dims = Image::calculate_resize_dimensions($this->meta['width'], $this->meta['height'], $x, $y, $ratio, $resizeWhenSmaller);
-		if ($dims === false)
-		{
-			throw new Exception('resize_inerr:' . $this->meta['width'] . ' x ' . $this->meta['height']);
-		}
-
-		// speedup? only do the resize operation when it must happen:
-		if ($dims['must_resize'])
-		{
-			$new = $this->create($dims['width'], $dims['height']);
-			if(@imagecopyresampled($new, $this->image, 0, 0, 0, 0, $dims['width'], $dims['height'], $this->meta['width'], $this->meta['height'])) {
-				$this->set($new);
-				unset($new);
-				return $this;
-			}
-			unset($new);
-			throw new Exception('imagecopyresampled_failed:' . $this->meta['width'] . ' x ' . $this->meta['height']);
-		}
-		else
-		{
-			return $this;
-		}
-	}
-
-	/**
-	 * Crops the image. The values are given like margin/padding values in css
-	 *
-	 * <b>Example</b>
-	 * <ul>
-	 * <li>crop(10) - Crops by 10px on all sides</li>
-	 * <li>crop(10, 5) - Crops by 10px on top and bottom and by 5px on left and right sides</li>
-	 * <li>crop(10, 5, 5) - Crops by 10px on top and by 5px on left, right and bottom sides</li>
-	 * <li>crop(10, 5, 3, 2) - Crops by 10px on top, 5px by right, 3px by bottom and 2px by left sides</li>
-	 * </ul>
-	 *
-	 * @param int $top
-	 * @param int $right
-	 * @param int $bottom
-	 * @param int $left
-	 * @return Image
-	 */
-	public function crop($top, $right = null, $bottom = null, $left = null){
-		if(empty($this->image)) return $this;
-
-		if(!is_numeric($right) && !is_numeric($bottom) && !is_numeric($left))
-			$right = $bottom = $left = $top;
-
-		if(!is_numeric($bottom) && !is_numeric($left)){
-			$bottom = $top;
-			$left = $right;
-		}
-
-		if(!is_numeric($left))
-			$left = $right;
-
-		$x = $this->meta['width']-$left-$right;
-		$y = $this->meta['height']-$top-$bottom;
-
-		if($x<0 || $y<0) return $this;
-
-		$new = $this->create($x, $y);
-		if (!@imagecopy($new, $this->image, 0, 0, $left, $top, $x, $y))
-			throw new Exception('imagecopy_failed');
-
-		$this->set($new);
-		unset($new);
-
-		return $this;
-	}
-
-	/**
-	 * Flips the image horizontally or vertically. To Flip both copy multiple single pixel strips around instead
-	 * of just using ->rotate(180): no image distortion this way.
-	 *
-	 * @see Image::rotate()
-	 * @param string $type Either horizontal or vertical
-	 * @return Image
-	 */
-	public function flip($type){
-		if(empty($this->image) || !in_array($type, array('horizontal', 'vertical'))) return $this;
-
-		$new = $this->create();
-
-		if($type=='horizontal')
-		{
-			for($x=0;$x<$this->meta['width'];$x++)
-			{
-				if (!@imagecopy($new, $this->image, $this->meta['width']-$x-1, 0, $x, 0, 1, $this->meta['height']))
-					throw new Exception('imageflip_failed');
-			}
-		}
-		elseif($type=='vertical')
-		{
-			for($y=0;$y<$this->meta['height'];$y++)
-			{
-				if (!@imagecopy($new, $this->image, 0, $this->meta['height']-$y-1, 0, $y, $this->meta['width'], 1))
-					throw new Exception('imageflip_failed');
-			}
-		}
-
-		$this->set($new);
-		unset($new);
-
-		return $this;
-	}
-
-	/**
-	 * Stores the image in the desired directory or overwrite the old one
-	 *
-	 * @param string $ext
-	 * @param string $file
-	 * @param int $quality the amount of lossy compression to apply to the saved file
-	 * @param boolean $store_original_if_unaltered (default: FALSE) set to TRUE if you want to copy the
-	 *                                             original instead of saving the loaded copy when no
-	 *                                             edits to the image have occurred. (set to TRUE when
-	 *                                             you like to keep animated GIFs intact when they have
-	 *                                             not been cropped, rescaled, etc., for instance)
-	 *
-	 * @return Image object
-	 */
-	public function process($ext = null, $file = null, $quality = 60, $store_original_if_unaltered = true){
-		if(empty($this->image)) return $this;
-
-		if(!$ext) $ext = $this->meta['ext'];
-		$ext = strtolower($ext);
-
-		if($ext=='jpg') $ext = 'jpeg';
-		else if($ext=='png') imagesavealpha($this->image, true);
-
-		if($file == null)
-			$file = $this->file;
-		if(!$file) throw new Exception('process_nofile');
-		if(!is_dir(dirname($file))) throw new Exception('process_nodir');
-		if ($store_original_if_unaltered && !$this->isDirty() && $ext == $this->meta['ext'])
-		{
-			// copy original instead of saving the internal representation:
-			$rv = true;
-			if ($file != $this->file)
-			{
-				$rv = @copy($this->file, $file);
-			}
-		}
-		else
-		{
-			$rv = false;
-			$fn = 'image'.$ext;
-			if (function_exists($fn))
-			{
-				if($ext == 'jpeg')
-					$rv = @$fn($this->image, $file, $quality);
-				elseif($ext == 'png')
-					$rv = @$fn($this->image, $file, 9); // PNG is lossless: always maximum compression!
-				else
-					$rv = @$fn($this->image, $file);
-			}
-		}
-		if (!$rv)
-			throw new Exception($fn . '_failed');
-
-		// If there is a new filename change the internal name too
-		$this->file = $file;
-
-		return $this;
-	}
-
-	/**
-	 * Saves the image to the given path
-	 *
-	 * @param string $file Leave empty to replace the original file
-	 * @param int $quality the amount of lossy compression to apply to the saved file
-	 * @param boolean $store_original_if_unaltered (default: FALSE) set to TRUE if you want to copy the
-	 *                                             original instead of saving the loaded copy when no
-	 *                                             edits to the image have occurred. (set to TRUE when
-	 *                                             you like to keep animated GIFs intact when they have
-	 *                                             not been cropped, rescaled, etc., for instance)
-	 *
-	 * @return Image
-	 */
-	public function save($file = null, $quality = 60, $store_original_if_unaltered = true){
-		if(empty($this->image)) return $this;
-
-		if(!$file) $file = $this->file;
-
-		$ext = strtolower(pathinfo($file, PATHINFO_EXTENSION));
-		if(!$ext){
-			$file .= '.'.$this->meta['ext'];
-			$ext = $this->meta['ext'];
-		}
-
-		if($ext=='jpg') $ext = 'jpeg';
-
-		return $this->process($ext, $file, $quality, $store_original_if_unaltered);
-	}
-
-	/**
-	 * Outputs the manipulated image. Implicitly overwrites the old one on disk.
-	 *
-	 * @return Image
-	 */
-	public function show(){
-		if(empty($this->image)) return $this;
-
-		header('Content-type: '.$this->meta['mime']);
-		return $this->process();
-	}
-}
-
-
-
-
-
-
-if (!function_exists('imagecreatefrombmp'))
-{
-	/**
-	 * http://nl3.php.net/manual/en/function.imagecreatefromwbmp.php#86214
-	 */
-	function imagecreatefrombmp($filepath)
-	{
-		// Load the image into a string
-		$filesize = @filesize($filepath);
-		if ($filesize < 108 + 4)
-			return false;
-
-		$read = file_get_contents($filepath);
-		if ($file === false)
-			return false;
-
-		$temp = unpack("H*",$read);
-		unset($read);               // reduce memory consumption
-		$hex = $temp[1];
-		unset($temp);
-		$header = substr($hex, 0, 108);
-
-		// Process the header
-		// Structure: http://www.fastgraph.com/help/bmp_header_format.html
-		if (substr($header, 0, 4) == '424d')
-		{
-			// Cut it in parts of 2 bytes
-			$header_parts = str_split($header, 2);
-
-			// Get the width        4 bytes
-			$width = hexdec($header_parts[19] . $header_parts[18]);
-
-			// Get the height        4 bytes
-			$height = hexdec($header_parts[23] . $header_parts[22]);
-
-			// Unset the header params
-			unset($header_parts);
-		}
-
-		// Define starting X and Y
-		$x = 0;
-		$y = 1;
-
-		// Create newimage
-		$image = imagecreatetruecolor($width, $height);
-		if ($image === false)
-			return $image;
-
-		// Grab the body from the image
-		$body = substr($hex, 108);
-		unset($hex);
-
-		// Calculate if padding at the end-line is needed
-		// Divided by two to keep overview.
-		// 1 byte = 2 HEX-chars
-		$body_size = strlen($body) / 2;
-		$header_size = $width * $height;
-
-		// Use end-line padding? Only when needed
-		$usePadding = ($body_size > $header_size * 3 + 4);
-
-		// Using a for-loop with index-calculation instaid of str_split to avoid large memory consumption
-		// Calculate the next DWORD-position in the body
-		for ($i = 0; $i < $body_size; $i += 3)
-		{
-			// Calculate line-ending and padding
-			if ($x >= $width)
-			{
-				// If padding needed, ignore image-padding
-				// Shift i to the ending of the current 32-bit-block
-				if ($usePadding)
-					$i += $width % 4;
-
-				// Reset horizontal position
-				$x = 0;
-
-				// Raise the height-position (bottom-up)
-				$y++;
-
-				// Reached the image-height? Break the for-loop
-				if ($y > $height)
-					break;
-			}
-
-			// Calculation of the RGB-pixel (defined as BGR in image-data)
-			// Define $i_pos as absolute position in the body
-			$i_pos = $i * 2;
-			$r = hexdec($body[$i_pos+4] . $body[$i_pos+5]);
-			$g = hexdec($body[$i_pos+2] . $body[$i_pos+3]);
-			$b = hexdec($body[$i_pos] . $body[$i_pos+1]);
-
-			// Calculate and draw the pixel
-			$color = imagecolorallocate($image, $r, $g, $b);
-			if ($color === false)
-			{
-				imagedestroy($image);
-				return false;
-			}
-			imagesetpixel($image, $x, $height - $y, $color);
-
-			// Raise the horizontal position
-			$x++;
-		}
-
-		// Unset the body / free the memory
-		unset($body);
-
-		// Return image-object
-		return $image;
-	}
-}
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/MootoolsFileManager/mootools-filemanager/Assets/Connector/MimeTypes.ini b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/MootoolsFileManager/mootools-filemanager/Assets/Connector/MimeTypes.ini
deleted file mode 100644
index b998918..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/MootoolsFileManager/mootools-filemanager/Assets/Connector/MimeTypes.ini
+++ /dev/null
@@ -1,223 +0,0 @@
-; Mimetypes configuration file
-; The types are sorted by the filetype
-;
-; mimetypes postfixed with ', *' define the preferred filename extension for that mime type
-; Any mimetypes lackinga 'preferred extension' will have the first occuring extension in this list assigned to them as 'preferred' instead.
-
-[application]
-ai =	application/postscript
-bcpio =	application/x-bcpio
-bin =	application/octet-stream, *
-ccad =	application/clariscad
-cdf =	application/x-netcdf
-class =	application/octet-stream
-cpio =	application/x-cpio
-cpt =	application/mac-compactpro
-csh =	application/x-csh
-dcr =	application/x-director
-dir =	application/x-director, *
-dms =	application/octet-stream
-doc =	application/msword
-drw =	application/drafting
-dvi =	application/x-dvi
-dwg =	application/acad
-dxf =	application/dxf
-dxr =	application/x-director
-eps =	application/postscript
-exe =	application/octet-stream
-ez =	application/andrew-inset
-gtar =	application/x-gtar
-gz =	application/x-gzip
-hdf =	application/x-hdf
-hqx =	application/mac-binhex40
-ips =	application/x-ipscript
-ipx =	application/x-ipix
-iso =	application/x-isoview
-js =	application/x-javascript
-latex =	application/x-latex
-lha =	application/octet-stream
-lnk =	application/x-ms-shortcut
-lsp =	application/x-lisp
-lzh =	application/octet-stream
-man =	application/x-troff-man
-me =	application/x-troff-me
-mif =	application/vnd.mif
-ms =	application/x-troff-ms
-nc =	application/x-netcdf
-oda =	application/oda
-odt =	application/vnd.oasis.opendocument.text
-ods =	application/vnd.oasis.opendocument.spreadsheet
-odp =	application/vnd.oasis.opendocument.presentation
-odg =	application/vnd.oasis.opendocument.graphics
-odc =	application/vnd.oasis.opendocument.chart
-odf =	application/vnd.oasis.opendocument.formula
-odb =	application/vnd.oasis.opendocument.database
-odi =	application/vnd.oasis.opendocument.image
-odm =	application/vnd.oasis.opendocument.text-master
-ott =	application/vnd.oasis.opendocument.text-template
-ots =	application/vnd.oasis.opendocument.spreadsheet-template
-otp =	application/vnd.oasis.opendocument.presentation-template
-otg =	application/vnd.oasis.opendocument.graphics-template
-pdf =	application/pdf
-pgn =	application/x-chess-pgn
-php =	application/x-httpd-php
-pot =	application/mspowerpoint
-pps =	application/mspowerpoint
-ppt =	application/mspowerpoint, *
-ppz =	application/mspowerpoint
-pre =	application/x-freelance
-prt =	application/pro_eng
-ps =	application/postscript, *
-rar =	application/x-rar
-roff =	application/x-troff
-scm =	application/x-lotusscreencam
-set =	application/set
-sh =	application/x-sh
-shar =	application/x-shar
-sit =	application/x-stuffit
-skd =	application/x-koan
-skm =	application/x-koan
-skp =	application/x-koan
-skt =	application/x-koan
-smi =	application/smil
-smil =	application/smil
-sol =	application/solids
-spl =	application/x-futuresplash
-src =	application/x-wais-source
-step =	application/STEP
-stl =	application/SLA
-stp =	application/STEP
-sv4cpio =	application/x-sv4cpio
-sv4crc =	application/x-sv4crc
-swf =	application/x-shockwave-flash
-t =		application/x-troff
-tar =	application/x-tar
-tcl =	application/x-tcl
-tex =	application/x-tex
-texi =	application/x-texinfo
-texinfo =	application/x-texinfo
-tr =	application/x-troff
-tsp =	application/dsptype
-unv =	application/i-deas
-ustar =	application/x-ustar
-vcd =	application/x-cdlink
-vda =	application/vda
-xlc =	application/vnd.ms-excel
-xll =	application/vnd.ms-excel
-xlm =	application/vnd.ms-excel
-xls =	application/vnd.ms-excel, *
-xlw =	application/vnd.ms-excel
-zip =	application/zip
-
-[audio]
-aif =	audio/x-aiff
-aifc =	audio/x-aiff
-aiff =	audio/x-aiff, *
-au =	audio/basic
-kar =	audio/midi
-mid =	audio/midi, *
-midi =	audio/midi
-mka =	audio/x-matroska
-mp2 =	audio/mpeg
-mp3 =	audio/mpeg, *
-mpga =	audio/mpeg
-ra =	audio/x-realaudio
-ram =	audio/x-pn-realaudio
-rpm =	audio/x-pn-realaudio-plugin
-snd =	audio/basic
-tsi =	audio/TSP-audio
-wav =	audio/x-wav
-
-[text]
-as =	text/x-actionscript
-asc =	text/plain
-c =		text/plain
-cc =	text/plain
-css =	text/css
-etx =	text/x-setext
-f =		text/plain
-f90 =	text/plain
-h =		text/plain
-hh =	text/plain
-htm =	text/html
-html =	text/html, *
-m =		text/plain
-m4 =	text/plain
-rtf =	text/rtf
-rtx =	text/richtext
-sgm =	text/sgml
-sgml =	text/sgml, *
-sh =	text/plain
-tsv =	text/tab-separated-values
-tpl =	text/template
-txt =	text/plain, *
-xml =	text/xml
-
-[video]
-avi =	video/avi
-fli =	video/x-fli
-flv =	video/x-flv
-m1v =	video/mpeg
-m2v =	video/mpeg
-mkv =	video/x-matroska
-mov =	video/quicktime
-movie =	video/x-sgi-movie
-mpe =	video/mpeg
-mpeg =	video/mpeg
-mp4 =	video/mp4
-mpg =	video/mpeg, *
-ogv =	video/ogv
-qt =	video/quicktime
-viv =	video/vnd.vivo
-vivo =	video/vnd.vivo
-vob =	video/mpeg
-webm =	video/webm
-wmv =	video/x-ms-wmv
-asf =	video/x-ms-asf
-rm =	video/x-realvideo
-rmvb =	video/x-realvideo
-
-[image]
-bmp =	image/bmp
-gif =	image/gif
-ief =	image/ief
-jpe =	image/jpeg
-jpeg =	image/jpeg
-jpg =	image/jpeg, *
-pbm =	image/x-portable-bitmap
-pgm =	image/x-portable-graymap
-png =	image/png
-pnm =	image/x-portable-anymap
-ppm =	image/x-portable-pixmap
-psd =	image/psd
-ras =	image/cmu-raster
-rgb =	image/x-rgb
-tif =	image/tiff
-tiff =	image/tiff
-xbm =	image/x-xbitmap
-xpm =	image/x-xpixmap
-xwd =	image/x-xwindowdump
-
-[x-conference]
-ice =	x-conference/x-cooltalk
-
-[model]
-iges =	model/iges
-igs =	model/iges
-mesh =	model/mesh
-msh =	model/mesh
-silo =	model/mesh
-vrml =	model/vrml
-wrl =	model/vrml
-
-[www]
-mime =	www/mime
-
-[chemical]
-pdb =	chemical/x-pdb
-xyz =	chemical/x-pdb
-
-
-
-
-
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/MootoolsFileManager/mootools-filemanager/Assets/Connector/Tooling.php b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/MootoolsFileManager/mootools-filemanager/Assets/Connector/Tooling.php
deleted file mode 100644
index 1d040c4..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/MootoolsFileManager/mootools-filemanager/Assets/Connector/Tooling.php
+++ /dev/null
@@ -1,441 +0,0 @@
-<?php
-/*
- * Script: Tooling.php
- *   MooTools FileManager - Backend for the FileManager Script - Support Code
- *
- * Authors:
- *  - Christoph Pojer (http://cpojer.net) (author)
- *  - James Ehly (http://www.devtrench.com)
- *  - Fabian Vogelsteller (http://frozeman.de)
- *  - Ger Hobbelt (http://hebbut.net)
- *
- * License:
- *   MIT-style license.
- *
- * Copyright:
- *   Copyright (c) 2011 [Christoph Pojer](http://cpojer.net)
- */
-
-
-
-
-if (!function_exists('safe_glob'))
-{
-	/**#@+
-	 * Extra GLOB constant for safe_glob()
-	 */
-	if (!defined('GLOB_NODIR'))       define('GLOB_NODIR',256);
-	if (!defined('GLOB_PATH'))        define('GLOB_PATH',512);
-	if (!defined('GLOB_NODOTS'))      define('GLOB_NODOTS',1024);
-	if (!defined('GLOB_RECURSE'))     define('GLOB_RECURSE',2048);
-	if (!defined('GLOB_NOHIDDEN'))    define('GLOB_NOHIDDEN',4096);
-	/**#@-*/
-
-
-	/**
-	 * A safe empowered glob().
-	 *
-	 * Function glob() is prohibited on some server (probably in safe mode)
-	 * (Message "Warning: glob() has been disabled for security reasons in
-	 * (script) on line (line)") for security reasons as stated on:
-	 * http://seclists.org/fulldisclosure/2005/Sep/0001.html
-	 *
-	 * safe_glob() intends to replace glob() using readdir() & fnmatch() instead.
-	 * Supported flags: GLOB_MARK, GLOB_NOSORT, GLOB_ONLYDIR
-	 * Additional flags: GLOB_NODIR, GLOB_PATH, GLOB_NODOTS, GLOB_RECURSE, GLOB_NOHIDDEN
-	 * (not original glob() flags)
-	 *
-	 * @author BigueNique AT yahoo DOT ca
-	 * @updates
-	 * - 080324 Added support for additional flags: GLOB_NODIR, GLOB_PATH,
-	 *   GLOB_NODOTS, GLOB_RECURSE
-	 * - [i_a] Added support for GLOB_NOHIDDEN, split output in directories and files subarrays
-	 */
-	function safe_glob($pattern, $flags = 0)
-	{
-		$split = explode('/', strtr($pattern, '\\', '/'));
-		$mask = array_pop($split);
-		$path = implode('/', $split);
-		if (($dir = @opendir($path)) !== false)
-		{
-			$dirs = array();
-			$files = array();
-			while(($file = readdir($dir)) !== false)
-			{
-				// HACK/TWEAK: PHP5 and below are completely b0rked when it comes to international filenames   :-(
-				//             --> do not show such files/directories in the list as they won't be accessible anyway!
-				//
-				// The regex charset is limited even within the ASCII range, due to    http://en.wikipedia.org/wiki/Filename#Comparison%5Fof%5Ffile%5Fname%5Flimitations
-				// Although the filtered characters here are _possible_ on UNIX file systems, they're severely frowned upon.
-				if (preg_match('/[^ -)+-.0-;=@-\[\]-{}~]/', $file))  // filesystem-illegal characters are not part of the set:   * > < ? / \ |
-				{
-					// simply do NOT list anything that we cannot cope with.
-					// That includes clearly inaccessible files (and paths) with non-ASCII characters:
-					// PHP5 and below are a real mess when it comes to handling Unicode filesystems
-					// (see the php.net site too: readdir / glob / etc. user comments and the official
-					// notice that PHP will support filesystem UTF-8/Unicode only when PHP6 is released.
-					//
-					// Big, fat bummer!
-					continue;
-				}
-				//$temp = unpack("H*",$file);
-				//echo 'hexdump of filename = ' . $temp[1] . ' for filename = ' . $file . "<br>\n";
-
-				$filepath = $path . '/' . $file;
-				$isdir = is_dir($filepath);
-
-				// Recurse subdirectories (GLOB_RECURSE); speedup: no need to sort the intermediate results
-				if (($flags & GLOB_RECURSE) && $isdir && !($file == '.' || $file == '..'))
-				{
-					$subsect = safe_glob($filepath . '/' . $mask, $flags | GLOB_NOSORT);
-					if (is_array($subsect))
-					{
-						if (!($flags & GLOB_PATH))
-						{
-							$dirs = array_merge($dirs, array_prepend($subject['dirs'], $file . '/'));
-							$files = array_merge($files, array_prepend($subject['files'], $file . '/'));
-						}
-					}
-				}
-				// Match file mask
-				if (fnmatch($mask, $file))
-				{
-					if ( ( (!($flags & GLOB_ONLYDIR)) || $isdir )
-					  && ( (!($flags & GLOB_NODIR)) || !$isdir )
-					  && ( (!($flags & GLOB_NODOTS)) || !($file == '.' || $file == '..') )
-					  && ( (!($flags & GLOB_NOHIDDEN)) || ($file[0] != '.' || $file == '..')) )
-					{
-						if ($isdir)
-						{
-							$dirs[] = ($flags & GLOB_PATH ? $path . '/' : '') . $file . (($flags & GLOB_MARK) ? '/' : '');
-						}
-						else
-						{
-							$files[] = ($flags & GLOB_PATH ? $path . '/' : '') . $file;
-						}
-					}
-				}
-			}
-			closedir($dir);
-			if (!($flags & GLOB_NOSORT))
-			{
-				sort($dirs);
-				sort($files);
-			}
-			return array('dirs' => $dirs, 'files' => $files);
-		}
-		else
-		{
-			return false;
-		}
-	}
-}
-
-
-
-
-// derived from http://nl.php.net/manual/en/function.http-build-query.php#90438
-if (!function_exists('http_build_query_ex'))
-{
-	if (!defined('PHP_QUERY_RFC1738')) define('PHP_QUERY_RFC1738', 1); // encoding is performed per RFC 1738 and the application/x-www-form-urlencoded media type, which implies that spaces are encoded as plus (+) signs.
-	if (!defined('PHP_QUERY_RFC3986')) define('PHP_QUERY_RFC3986', 2); // encoding is performed according to » RFC 3986, and spaces will be percent encoded (%20).
-
-	function http_build_query_ex($data, $prefix = '', $sep = '', $key = '', $enc_type = PHP_QUERY_RFC1738)
-	{
-		$ret = array();
-		if (!is_array($data) && !is_object($data))
-		{
-			if ($enc_type == PHP_QUERY_RFC1738)
-			{
-				$ret[] = urlencode($data);
-			}
-			else
-			{
-				$ret[] = rawurlencode($data);
-			}
-		}
-		else
-		{
-			if (!empty($prefix))
-			{
-				if ($enc_type == PHP_QUERY_RFC1738)
-				{
-					$prefix = urlencode($prefix);
-				}
-				else
-				{
-					$prefix = rawurlencode($prefix);
-				}
-			}
-			foreach ($data as $k => $v)
-			{
-				if (is_int($k))
-				{
-					$k = $prefix . $k;
-				}
-				else if ($enc_type == PHP_QUERY_RFC1738)
-				{
-					$k = urlencode($k);
-				}
-				else
-				{
-					$k = rawurlencode($k);
-				}
-				if (!empty($key) || $key === 0)
-				{
-					$k = $key . '[' . $k . ']';
-				}
-				if (is_array($v) || is_object($v))
-				{
-					$ret[] = http_build_query_ex($v, '', $sep, $k, $enc_type);
-				}
-				else
-				{
-					if ($enc_type == PHP_QUERY_RFC1738)
-					{
-						$v = urlencode($v);
-					}
-					else
-					{
-						$v = rawurlencode($v);
-					}
-					$ret[] = $k . '=' . $v;
-				}
-			}
-		}
-		if (empty($sep)) $sep = ini_get('arg_separator.output');
-		return implode($sep, $ret);
-	}
-}
-
-
-
-/**
- * Determine how the PHP interpreter was invoked: cli/cgi/fastcgi/server,
- * where 'server' implies PHP is part of a webserver in the form of a 'module' (e.g. mod_php5) or similar.
- *
- * This information is used, for example, to decide the correct way to send the 'respose header code':
- * see send_response_status_header().
- */
-if (!function_exists('get_interpreter_invocation_mode'))
-{
-	function get_interpreter_invocation_mode()
-	{
-		global $_ENV;
-		global $_SERVER;
-
-		/*
-		 * see
-		 *
-		 * http://nl2.php.net/manual/en/function.php-sapi-name.php
-		 * http://stackoverflow.com/questions/190759/can-php-detect-if-its-run-from-a-cron-job-or-from-the-command-line
-		 */
-		$mode = "server";
-		$name = php_sapi_name();
-		if (preg_match("/fcgi/", $name) == 1)
-		{
-			$mode = "fastcgi";
-		}
-		else if (preg_match("/cli/", $name) == 1)
-		{
-			$mode = "cli";
-		}
-		else if (preg_match("/cgi/", $name) == 1)
-		{
-			$mode = "cgi";
-		}
-
-		/*
-		 * check whether POSIX functions have been compiled/enabled; xampp on Win32/64 doesn't have the buggers! :-(
-		 */
-		if (function_exists('posix_isatty'))
-		{
-			if (posix_isatty(STDOUT))
-			{
-				/* even when seemingly run as cgi/fastcgi, a valid stdout TTY implies an interactive commandline run */
-				$mode = 'cli';
-			}
-		}
-
-		if (!empty($_ENV['TERM']) && empty($_SERVER['REMOTE_ADDR']))
-		{
-			/* even when seemingly run as cgi/fastcgi, a valid stdout TTY implies an interactive commandline run */
-			$mode = 'cli';
-		}
-
-		return $mode;
-	}
-}
-
-
-
-
-
-
-/**
- * Return the HTTP response code string for the given response code
- */
-if (!function_exists('get_response_code_string'))
-{
-	function get_response_code_string($response_code)
-	{
-		$response_code = intval($response_code);
-		switch ($response_code)
-		{
-		case 100:   return "RFC2616 Section 10.1.1: Continue";
-		case 101:   return "RFC2616 Section 10.1.2: Switching Protocols";
-		case 200:   return "RFC2616 Section 10.2.1: OK";
-		case 201:   return "RFC2616 Section 10.2.2: Created";
-		case 202:   return "RFC2616 Section 10.2.3: Accepted";
-		case 203:   return "RFC2616 Section 10.2.4: Non-Authoritative Information";
-		case 204:   return "RFC2616 Section 10.2.5: No Content";
-		case 205:   return "RFC2616 Section 10.2.6: Reset Content";
-		case 206:   return "RFC2616 Section 10.2.7: Partial Content";
-		case 300:   return "RFC2616 Section 10.3.1: Multiple Choices";
-		case 301:   return "RFC2616 Section 10.3.2: Moved Permanently";
-		case 302:   return "RFC2616 Section 10.3.3: Found";
-		case 303:   return "RFC2616 Section 10.3.4: See Other";
-		case 304:   return "RFC2616 Section 10.3.5: Not Modified";
-		case 305:   return "RFC2616 Section 10.3.6: Use Proxy";
-		case 307:   return "RFC2616 Section 10.3.8: Temporary Redirect";
-		case 400:   return "RFC2616 Section 10.4.1: Bad Request";
-		case 401:   return "RFC2616 Section 10.4.2: Unauthorized";
-		case 402:   return "RFC2616 Section 10.4.3: Payment Required";
-		case 403:   return "RFC2616 Section 10.4.4: Forbidden";
-		case 404:   return "RFC2616 Section 10.4.5: Not Found";
-		case 405:   return "RFC2616 Section 10.4.6: Method Not Allowed";
-		case 406:   return "RFC2616 Section 10.4.7: Not Acceptable";
-		case 407:   return "RFC2616 Section 10.4.8: Proxy Authentication Required";
-		case 408:   return "RFC2616 Section 10.4.9: Request Time-out";
-		case 409:   return "RFC2616 Section 10.4.10: Conflict";
-		case 410:   return "RFC2616 Section 10.4.11: Gone";
-		case 411:   return "RFC2616 Section 10.4.12: Length Required";
-		case 412:   return "RFC2616 Section 10.4.13: Precondition Failed";
-		case 413:   return "RFC2616 Section 10.4.14: Request Entity Too Large";
-		case 414:   return "RFC2616 Section 10.4.15: Request-URI Too Large";
-		case 415:   return "RFC2616 Section 10.4.16: Unsupported Media Type";
-		case 416:   return "RFC2616 Section 10.4.17: Requested range not satisfiable";
-		case 417:   return "RFC2616 Section 10.4.18: Expectation Failed";
-		case 500:   return "RFC2616 Section 10.5.1: Internal Server Error";
-		case 501:   return "RFC2616 Section 10.5.2: Not Implemented";
-		case 502:   return "RFC2616 Section 10.5.3: Bad Gateway";
-		case 503:   return "RFC2616 Section 10.5.4: Service Unavailable";
-		case 504:   return "RFC2616 Section 10.5.5: Gateway Time-out";
-		case 505:   return "RFC2616 Section 10.5.6: HTTP Version not supported";
-	/*
-		case 102:   return "Processing";  // http://www.askapache.com/htaccess/apache-status-code-headers-errordocument.html#m0-askapache3
-		case 207:   return "Multi-Status";
-		case 418:   return "I'm a teapot";
-		case 419:   return "unused";
-		case 420:   return "unused";
-		case 421:   return "unused";
-		case 422:   return "Unproccessable entity";
-		case 423:   return "Locked";
-		case 424:   return "Failed Dependency";
-		case 425:   return "Node code";
-		case 426:   return "Upgrade Required";
-		case 506:   return "Variant Also Negotiates";
-		case 507:   return "Insufficient Storage";
-		case 508:   return "unused";
-		case 509:   return "unused";
-		case 510:   return "Not Extended";
-	*/
-		default:   return rtrim("Unknown Response Code " . $response_code);
-		}
-	}
-}
-
-
-
-/**
- * Performs the correct way of transmitting the response status code header: PHP header() must be invoked in different ways
- * dependent on the way the PHP interpreter has been invoked.
- *
- * See also:
- *
- *   http://nl2.php.net/manual/en/function.header.php
- */
-if (!function_exists('send_response_status_header'))
-{
-	function send_response_status_header($response_code)
-	{
-		$mode = get_interpreter_invocation_mode();
-		switch ($mode)
-		{
-		default:
-		case 'fcgi':
-			header('Status: ' . $response_code, true, $response_code);
-			break;
-
-		case 'server':
-			header('HTTP/1.0 ' . $response_code . ' ' . get_response_code_string($response_code), true, $response_code);
-			break;
-		}
-	}
-}
-
-
-
-
-
-
-/*
- * http://www.php.net/manual/en/function.image-type-to-extension.php#77354
- * -->
- * http://www.php.net/manual/en/function.image-type-to-extension.php#79688
- */
-if (!function_exists('image_type_to_extension'))
-{
-	function image_type_to_extension($type, $dot = true)
-	{
-		$e = array(1 => 'gif', 'jpeg', 'png', 'swf', 'psd', 'bmp', 'tiff', 'tiff', 'jpc', 'jp2', 'jpf', 'jb2', 'swc', 'aiff', 'wbmp', 'xbm');
-
-		// We are expecting an integer.
-		$t = (int)$type;
-		if (!$t)
-		{
-			trigger_error('invalid IMAGETYPE_XXX(' . $type . ') passed to image_type_to_extension()', E_USER_NOTICE);
-			return null;
-		}
-		if (!isset($e[$t]))
-		{
-			trigger_error('unidentified IMAGETYPE_XXX(' . $type . ') passed to image_type_to_extension()', E_USER_NOTICE);
-			return null;
-		}
-
-		return ($dot ? '.' : '') . $e[$t];
-	}
-}
-
-
-if (!function_exists('image_type_to_mime_type'))
-{
-	function image_type_to_mime_type($type)
-	{
-		$m = array(1 => 'image/gif', 'image/jpeg', 'image/png',
-			'application/x-shockwave-flash', 'image/psd', 'image/bmp',
-			'image/tiff', 'image/tiff', 'application/octet-stream',
-			'image/jp2', 'application/octet-stream', 'application/octet-stream',
-			'application/x-shockwave-flash', 'image/iff', 'image/vnd.wap.wbmp', 'image/xbm');
-
-		// We are expecting an integer.
-		$t = (int)$type;
-		if (!$t)
-		{
-			trigger_error('invalid IMAGETYPE_XXX(' . $type . ') passed to image_type_to_mime_type()', E_USER_NOTICE);
-			return null;
-		}
-		if (!isset($m[$t]))
-		{
-			trigger_error('unidentified IMAGETYPE_XXX(' . $type . ') passed to image_type_to_mime_type()', E_USER_NOTICE);
-			return null;
-		}
-		return $m[$t];
-	}
-}
-
-
-
-
-
-
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/MootoolsFileManager/mootools-filemanager/Assets/Css/Additions.css b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/MootoolsFileManager/mootools-filemanager/Assets/Css/Additions.css
deleted file mode 100755
index 1a14d8a..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/MootoolsFileManager/mootools-filemanager/Assets/Css/Additions.css
+++ /dev/null
@@ -1,141 +0,0 @@
-/* upload */
-
-.filemanager-uploader ul.filemanager-uploader-list {
-	padding: 2px 5px;
-}
-
-.filemanager-uploader li.file img.icon, .filemanager-uploader li.file img.file-cancel {
-	position: relative;
-	top: 3px;
-}
-.filemanager-uploader li.file img.icon {
-	padding-right: 4px;
-}
-
-/* Overlay */
-div.filemanager-overlay {
-	position: absolute;
-	left: 0;
-	top: 0;
-	display: none;
-
-	/* z-index: 999; */
-	background: #aaa;
-}
-
-/* Dialog */
-div.filemanager-overlay-dialog {
-	/* z-index: 1999; */
-	background: #fff;
-}
-
-div.filemanager-dialog {
-	position: absolute;
-	display: none;
-	/* z-index: 2000; */
-
-	width: 229px;
-	padding-bottom: 40px;
-
-	color: #bebebe;
-	font-family: Tahoma, sans-serif;
-	font-size: 12px;
-	background: rgba(0, 0, 0, 0.8);
-
-	-o-border-radius: 4px;
-	-moz-border-radius: 4px;
-	-webkit-border-radius: 4px;
-	border-radius: 4px;
-
-	box-shadow: rgba(0, 0, 0, 0.3) 0 0 10px;
-	-moz-box-shadow: rgba(0, 0, 0, 0.3) 0 0 10px;
-	-webkit-box-shadow: rgba(0, 0, 0, 0.3) 0 0 10px;
-	-o-box-shadow: rgba(0, 0, 0, 0.3) 0 0 10px;
-}
-
-div.filemanager-dialog-engine-trident {
-	background: #000;
-}
-
-div.filemanager-dialog-engine-trident4 {
-	width: 249px;
-}
-
-div.filemanager-dialog a {
-	color: #aaa;
-}
-div.filemanager-dialog a:hover {
-	text-decoration: none;
-}
-div.filemanager-dialog div {
-	margin: 10px;
-}
-
-div.filemanager-dialog input, div.filemanager-dialog select {
-	width: 94%;
-	margin: 20px 2%;
-	padding: 2px 1%;
-	border: 1px solid #bebebe;
-	background: #fff;
-
-	color: #333;
-	font-family: Tahoma, sans-serif;
-	font-size: 12px;
-}
-
-div.filemanager-dialog-engine-trident4 input, div.filemanager-dialog-engine-trident5 input {
-	width: 80%;
-}
-
-div.filemanager-dialog button, div.filemanager-dialog .filemanager-button {
-	position: absolute;
-	bottom: 15px;
-	right: 15px;
-
-	width: auto;
-	height: 22px;
-	padding: 2px;
-	border: 1px solid #bebebe;
-
-	cursor: pointer;
-	color: #333;
-	text-shadow: #eee 1px 1px 1px;
-
-	font-family: Tahoma, sans-serif;
-	letter-spacing: 0;
-	font-size: 12px;
-	font-weight: normal;
-	margin: 0;
-	background: url("../Images/button.png") repeat-x;
-	-moz-border-radius: 4px;
-	-webkit-border-radius: 4px;
-	border-radius: 4px;
-}
-div.filemanager-dialog-engine-trident4 button, div.filemanager-dialog-engine-trident4 .filemanager-button,
-div.filemanager-dialog-engine-trident5 button, div.filemanager-dialog-engine-trident5 .filemanager-button {
-	padding: 0 .25em;
-	overflow: visible;
-}
-
-div.filemanager-dialog button.filemanager-dialog-decline, div.filemanager-dialog .filemanager-button.filemanager-dialog-decline {
-	right: auto;
-	left: 15px;
-}
-
-/* NoFlash.upload */
-div.filemanager #filemanager_upload_Filedata
-{
-	width: auto;
-	font-size: 11px;
-}
-
-div.filemanager label.filemanager-resize
-{
-	width: auto;
-}
-
-div.filemanager label.filemanager-resize span
-{
-	width: 20%;
-	overflow: hidden;
-}
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/MootoolsFileManager/mootools-filemanager/Assets/Css/FileManager.css b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/MootoolsFileManager/mootools-filemanager/Assets/Css/FileManager.css
deleted file mode 100755
index 100ac8a..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/MootoolsFileManager/mootools-filemanager/Assets/Css/FileManager.css
+++ /dev/null
@@ -1,1180 +0,0 @@
-div.filemanager-container {
-	display: none;
-}
-div.filemanager * {
-	outline: 0;
-}
-div.filemanager a img {
-	border: 0;
-}
-
-div.filemanager-container,
-div.filemanager,
-div.filemanager button, div.filemanager .filemanager-button,
-div.filemanager label,
-div.filemanager h1 {
-	width: auto;
-	margin: 0;
-
-	font: normal 11px verdana, arial, Tahoma, sans-serif;
-	text-transform: none;
-	letter-spacing: 0;
-}
-
-/* filemanager */
-
-div.filemanager {
-	background: #F5F5F5;
-
-	position: absolute;
-	/* z-index: 1001; */
-	width: 75%;
-	height: 75%;
-
-	box-shadow: rgba(0, 0, 0, 0.3) 0 0 40px;
-	-moz-box-shadow: rgba(0, 0, 0, 0.3) 0 0 40px;
-	-webkit-box-shadow: rgba(0, 0, 0, 0.3) 0 0 40px;
-	-o-box-shadow: rgba(0, 0, 0, 0.3) 0 0 40px;
-
-	border-radius: 0 0 8px 8px;
-	-moz-border-radius: 0 0 8px 8px;
-	-webkit-border-radius: 0 0 8px 8px;
-	-o-border-radius: 0 0 8px 8px;
-}
-
-/* filemanager-header */
-div.filemanager-header {
-	/* z-index: 3; */
-	position: absolute;
-	top: -30px;
-	left: 0px;
-	width: 100%;
-	height: 14px;
-	padding: 8px 0px;
-	background: url("../Images/menu.png") repeat-x;
-
-	box-shadow: rgba(0, 0, 0, 0.3) 0 0 5px;
-	-moz-box-shadow: rgba(0, 0, 0, 0.3) 0 0 5px;
-	-webkit-box-shadow: rgba(0, 0, 0, 0.3) 0 0 5px;
-	-o-box-shadow: rgba(0, 0, 0, 0.3) 0 0 5px;
-
-	border-radius: 8px 8px 0 0;
-	-moz-border-radius: 8px 8px 0 0;
-	-webkit-border-radius: 8px 8px 0 0;
-	-o-border-radius: 8px 8px 0 0;
-
-	overflow: hidden;
-}
-
-/* filemanager-menu */
-
-div.filemanager div.filemanager-menu {
-	/* z-index: 2; */
-	position: absolute;
-	height: 30px;
-	left: 35%;
-	width: 65%;
-	bottom: 0;
-	line-height: 30px;
-
-	border-top: 1px solid #bebebe;
-	background: url("../Images/menu.png") repeat-x;
-
-	box-shadow: rgba(0, 0, 0, 0.3) 2px 0 5px;
-	-moz-box-shadow: rgba(0, 0, 0, 0.3) 1px -2px 5px -2px;
-	-webkit-box-shadow: rgba(0, 0, 0, 0.3) 0 0 5px;
-	-o-box-shadow: rgba(0, 0, 0, 0.3) 0 0 5px;
-
-	border-radius: 0 0 8px 0;
-	-moz-border-radius: 0 0 8px 0;
-	-webkit-border-radius: 0 0 8px 0;
-	-o-border-radius: 0 0 8px 0;
-}
-
-div.filemanager button, div.filemanager .filemanager-button {
-	cursor: pointer;
-	height: 22px;
-	line-height: 20px;        /* lift the text in the button by 1 px: line-height: 20px vs height: 22px */
-	margin: 4px 5px;
-	padding: 0 2px;
-
-	color: #333;
-	text-shadow: #eee 1px 1px 1px;
-
-	clear: none;
-	background: url("../Images/button.png") repeat-x;
-	border: 1px solid #a1aeb9;
-	-moz-border-radius: 4px;
-	-webkit-border-radius: 4px;
-	-o-border-radius: 4px;
-	border-radius: 4px;
-}
-div.filemanager-engine-trident4 button, div.filemanager-engine-trident4 .filemanager-button,
-div.filemanager-engine-trident5 button, div.filemanager-engine-trident5 .filemanager-button {
-	padding: 0 .25em;
-	overflow: visible;
-}
-
-div.filemanager-menu button, div.filemanager-menu .filemanager-button {
-	float: right;
-}
-
-div.filemanager button:hover, div.filemanager .filemanager-button:hover,
-div.filemanager button.hover, div.filemanager .filemanager-button.hover,
-div.filemanager button:focus, div.filemanager .filemanager-button:focus {
-	border: 1px solid #5f676e;
-}
-
-div.filemanager button.disabled,       div.filemanager .filemanager-button.disabled,
-div.filemanager button.disabled:hover, div.filemanager .filemanager-button.disabled:hover,
-div.filemanager button.disabled:focus, div.filemanager .filemanager-button.disabled:focus {
-	cursor: default;
-	color: #666;
-	text-shadow: none;
-	background: url("../Images/button_disabled.png") repeat-x;
-	border-color: #bababa;
-}
-
-div.filemanager button.filemanager-open, div.filemanager .filemanager-button.filemanager-open  {
-	font-weight: bold;
-}
-
-div.filemanager-menu label {
-	cursor: pointer;
-	float: right;
-	width: auto;
-	height: auto;
-	line-height: 30px;
-
-	font-size: 11px;
-}
-
-div.loader {
-	width: 16px;
-	height: 16px;
-	background: url("../Images/loader.gif") no-repeat;
-}
-div.filemanager-header div.loader {
-	position: absolute;
-	top: 7px;
-	right: 30px;
-}
-div.filemanager-browserheader div.loader {
-	position: absolute;
-	top: 4px;
-	left: 5px;
-}
-div.filemanager-preview div.loader {
-	position: relative;
-	left: 50%;
-	right: auto;
-	margin-left: -8px;
-}
-
-/* filemanager-browserscroll */
-
-div.filemanager div.filemanager-browserscroll {
-	margin: 0;
-	padding: 0;
-	height: 100%;
-	overflow-y: auto;
-	overflow-x: hidden; /* don't show the hor. scrollbar just because a few filenames are very long: just clip them! */
-}
-
-
-div.filemanager div.filemanager-browserscroll li.list {
-	height: 21px;
-}
-div.filemanager div.filemanager-browserscroll li.thumb {
-	height: 54px;
-}
-
-div.filemanager ul {
-	margin: 0;
-	padding: 0;
-	position: relative;
-	line-height: 1.8em;
-	zoom: 1;                  /*:: < IE 9.0    :: Microsoft Internet Explorer hack */
-}
-
-div.filemanager ul li {
-	background: none;
-	list-style-image: none;
-	list-style-type: none;
-	list-style: none;
-	line-height: 1.8em;
-	margin: 0;
-	padding: 0;
-	white-space: nowrap;
-}
-
-div.filemanager div.filemanager-browsercontainer {
-	height: 100%;
-	width: 35%;
-	min-width: 189px;
-	border: 0;
-	border-right: 1px solid #bebebe;
-	background: #DEE6F0 url("../Images/filelist.png") repeat-x bottom left;
-	overflow: hidden;
-
-	box-shadow: rgba(0, 0, 0, 0.3) 0 0 5px;
-	-moz-box-shadow: rgba(0, 0, 0, 0.3) 0 0 5px;
-	-webkit-box-shadow: rgba(0, 0, 0, 0.3) 0 0 5px;
-	-o-box-shadow: rgba(0, 0, 0, 0.3) 0 0 5px;
-
-	border-radius: 0 0 0 8px;
-	-moz-border-radius: 0 0 0 8px;
-	-webkit-border-radius: 0 0 0 8px;
-	-o-border-radius: 0 0 0 8px;
-}
-
-div.filemanager-browsercontainer div.filemanager-browserheader {
-	left: 0;
-	top: 0;
-	width: 100%;
-	height: 25px;
-	background: #C3CDD9;
-	border-bottom: 1px solid #bebebe;
-	text-align: center;
-}
-
-div.filemanager-browsercontainer div.filemanager-browserheader a.listType {
-	display: inline-block;
-	float: right;
-	width: 16px;
-	height: 16px;
-	margin: 5px;
-	cursor: pointer;
-}
-div.filemanager-browsercontainer div.filemanager-browserheader a.listType#toggle_side_list {
-	background: url("../Images/application_side_list.png") no-repeat;
-}
-div.filemanager-browsercontainer div.filemanager-browserheader a.listType#toggle_side_boxes {
-	background: url("../Images/application_side_boxes.png") no-repeat;
-}
-div.filemanager-browsercontainer div.filemanager-browserheader a#show_dir_thumb_gallery {
-	background: url("../Images/application_side_thumbs.png") no-repeat top left;
-	height: 16px;
-	width: 16px;
-	display: inline-block;
-	float: right;
-	margin: 5px;
-}
-div.filemanager-browsercontainer div.filemanager-browserheader a#drag_n_drop {
-	display: inline-block;
-	float: right;
-	margin: 5px 3% 0 0;        /* 3%: keep distance variable with the total width of the FM window: looks better for tight and wide viewports */
-	cursor: help;
-
-	background-image: url("../Images/drag_n_drop.png");
-	background-repeat: no-repeat;
-	height: 16px;
-	width: 16px;
-	overflow: hidden;
-	background-position: 0px -16px;
-}
-
-div.filemanager-browsercontainer div.filemanager-browserheader #fm_view_paging {
-	display: inline-block;
-	float: right;
-	margin: 1px 3% 0 0;
-	height: 19px;
-	padding: 4px 5px 0 5px;
-	/* add subtle lines to increase visual separation with the other icons up top */
-	border-left: 1px solid #BEBEBE;
-	border-right: 1px solid #BEBEBE;
-
-}
-
-div.filemanager-browsercontainer div.filemanager-browserheader #fm_view_paging a {
-	display: inline-block;
-	margin: 0 2px;
-}
-
-div.filemanager-browsercontainer div.filemanager-browserheader #fm_view_paging a#paging_goto_first {
-	background-image: url("../Images/go_first.png");
-	background-repeat: no-repeat;
-	height: 16px;
-	width: 10px;
-	overflow: hidden;
-	background-position: 50% 50%;
-
-	position: relative;
-}
-div.filemanager-browsercontainer div.filemanager-browserheader #fm_view_paging a#paging_goto_previous {
-	background-image: url("../Images/go_previous.png");
-	background-repeat: no-repeat;
-	height: 16px;
-	width: 7px;
-	overflow: hidden;
-	background-position: 50% 50%;
-
-	position: relative;
-}
-div.filemanager-browsercontainer div.filemanager-browserheader #fm_view_paging a#paging_goto_next {
-	background-image: url("../Images/go_next.png");
-	background-repeat: no-repeat;
-	height: 16px;
-	width: 7px;
-	overflow: hidden;
-	background-position: 50% 50%;
-
-	position: relative;
-}
-div.filemanager-browsercontainer div.filemanager-browserheader #fm_view_paging a#paging_goto_last {
-	background-image: url("../Images/go_last.png");
-	background-repeat: no-repeat;
-	height: 16px;
-	width: 10px;
-	overflow: hidden;
-	background-position: 50% 50%;
-
-	position: relative;
-}
-div.filemanager-browsercontainer div.filemanager-browserheader #fm_view_paging #paging_info {
-	margin: 0 10px;
-	/*
-	 * to help the page number center vertically, we have to tweak the settings a bit oddly:
-	 * without the position:relative and the top:-4px, it wouldn't work. vertical-align is no use at all:
-	 * 'middle' does not do anything while 'top' does, but is exactly what we do not want.
-	 * Anyway, relative -4px it is.
-	 */
-	height: 16px;
-	position: relative;
-	top: -4px;
-	overflow: hidden;
-}
-
-
-div.filemanager-container span.fi {
-	height: 21px;
-	line-height: 1.8em;
-	padding-left: 5px;
-	color: #000;
-	text-decoration: none;
-	display: block;
-	white-space: nowrap;
-	cursor: pointer;
-}
-
-div.filemanager-container span.thumb {
-	height: 48px;
-	padding: 3px 0 3px 3px;
-	margin: 0;
-	overflow: hidden;
-}
-
-div.filemanager-container span.fi.hover {
-	background: #E2EBF6;
-}
-
-div.filemanager-container span.fi span,
-div.filemanager-container span.thumb {
-	white-space: nowrap;
-	display: block;
-	overflow: hidden;
-	vertical-align: middle;   /* pretty useless, but keep it in? */
-	overflow: visible;
-	/* ^^^ since the floats are all images, this does a nice graphic effect for very long filenames:
-	 *     the maximum width of the row is used to display the name and when hovering over it, the
-	 *     icons appear on top.
-	 */
-}
-
-/* forcing the text to center: see comment below where we v-center the image */
-div.filemanager-container span.thumb span {
-	/* margin-top: 14px; */
-	margin-top: 12px;  /* instead, we 'vertical center' (ahem!) the thing by pushing it down. */
-	/* display: table-cell; */
-}
-
-/*
- * Have the image (thumbnail) centered as well:
- *
- * After several failed attempts this was done with 90% success:
- *    http://www.brunildo.org/test/img_center.html
- *
- * Note that you cannot mix 'float:left' and 'display-table-cell'
- * in the same element. That is why the text following the image
- * MUST be 'display: table-cell' as well, for otherwise it would
- * not display on the same line.
- * And because the text is now it's own 'table-cell' it also needs
- * its own 'vertical-align:middle' replacing the brute-force
- * margin-top downshift.
- *
- * HOWEVER we note that last 10%: very long filenames, i.e. spans
- * with text that would wrap, will NOT center correctly, but instead
- * nuke the complete layout of that particular row. No matter what you do.
- *
- * We can't have that so finally we go back to our old-time all-time favorite:
- * a <span> (which is already here now that we did the previous) filled
- * with a _background_ image: since CSS can center those very well, we're
- * good to go. Finally.
- */
-div.filemanager-container span.thumb span.thumb {
-	float: left;   /* 'left' for the span with background image way; 'none' for the previous method */
-	width: 48px;
-	height: 48px;
-	vertical-align: middle;   /* pretty useless, but keep it in? */
-	text-align: center;
-	/* display: table-cell; */
-	margin: 0 5px 0 0;    /* previous method only: superfluous as it's a 'table-cell' display now: the margin is neglected, so we move the right-side gap to the padding. */
-	/* padding: 0 5px 0 0; */
-	padding: 0;
-
-	background-position: 50% 50%;
-	background-repeat: no-repeat;
-}
-/*
-div.filemanager-container span.thumb span.thumb img,
-div.filemanager-container span.list span.list img {
-	float: none;
-	vertical-align: middle;
-	text-align: center;
-	margin: 0;
-	padding: 0;
-}
-*/
-div.filemanager-container span.list span.list {
-	float: left;   /* 'left' for the span with background image way; 'none' for the previous method */
-	width: 16px;
-	height: 16px;
-	vertical-align: middle;   /* pretty useless, but keep it in? */
-	text-align: center;
-	/* display: table-cell; */
-	margin: 0 5px 0 0;    /* previous method only: superfluous as it's a 'table-cell' display now: the margin is neglected, so we move the right-side gap to the padding. */
-	/* padding: 0 5px 0 0; */
-	padding: 0;
-
-	background-position: 50% 50%;
-	background-repeat: no-repeat;
-}
-
-
-div.filemanager-container span.drag span,
-div.filemanager-engine-trident4 ul li span.fi span,
-div.filemanager-engine-trident5 ul li span.fi span,
-div.filemanager-engine-presto   ul li span.fi span,
-div.filemanager                 ul li:hover span.fi span {
-	overflow: hidden;
-}
-
-div.filemanager ul li span.dir {
-	background-color: transparent;
-}
-
-div.filemanager ul li span.droppable,
-div.filemanager-gallery ul.droppable {
-	background-color: #99b7e7;
-}
-
-ul.filemanager-browser a,
-ul.filemanager-browser span {
-	position: relative;
-}
-
-/*
-div.filemanager ul li a.selected,
-div.filemanager ul li span.selected {
-	background: url("../Images/filelist_selected.png") repeat-x;
-	color: #eee;
-	outline: none;
-}
-*/
-
-div.filemanager ul li span.thumb.selected,
-div.filemanager ul li span.fi.selected {
-	background: #8EAAD6;
-	color: #eee;
-	outline: none;
-}
-
-div.filemanager-container span.fi img {
-	float: left;
-	margin: 3px 3px 0 0;
-}
-
-/*
-obsoleted by the new centering code. At least that one works by centering the image instead of clipping them while forcing width=48px.
-
-div.filemanager-container span.thumb img {
-	float: left;
-	margin: 0 5px 0 0;
-}
-*/
-
-div.filemanager-container span.file img {
-	border: none;
-	margin-top: 5px;
-}
-
-div.filemanager-container span.fi img.browser-icon {
-	float: right;
-	border: none;
-	margin-top: 3px; /* vertically center the little buggers */
-}
-
-/* & and correct for thumb view: */
-div.filemanager-container span.thumb img.browser-icon {
-	margin-top: 16px; /* vertically center the little buggers */
-}
-
-
-div.filemanager-container span.move img.browser-icon {
-	display: none;
-}
-
-div.filemanager span.notice {
-	position: absolute;
-	bottom: 16px;
-	left: 16px;
-}
-
-div.filemanager a.filemanager-close {
-	/* z-index: 4; */
-	display: block;
-	position: absolute;
-	right: 6px;
-	top: -23px;
-	height: 16px;
-	width: 16px;
-	background: url("../Images/close.png") no-repeat;
-	cursor: pointer;
-}
-div.filemanager a.filemanager-close:hover {
-	background-position: 0px -16px;
-}
-div.filemanager div.filemanager-close img {
-	padding: 2px;
-}
-
-div.filemanager-infos {
-	/* z-index: 0; */
-	position: absolute;
-	left: 35%;
-	top: 0;
-	width: 63%;
-	min-width: 250px;
-	height: 92%;
-	padding: 0px 1%;
-	line-height: 1.6em;
-	overflow: auto;
-}
-
-div.filemanager-head {
-	height: 32px;
-	overflow: hidden;
-}
-
-img.filemanager-icon {
-	float: left;
-	margin: 10px 12px;
-}
-
-div.filemanager h1 {
-	margin: 0;
-	padding: 0;
-	height: 32px;
-	line-height: 32px;
-
-	color: #333;
-	font-size: 20px;
-	letter-spacing: 1px;
-	overflow: hidden;
-	white-space: nowrap;
-	background-color: transparent;
-}
-
-div.filemanager h2,
-div.filemanager h3 {
-	margin: 0;
-	border-top: 1px solid #bebebe;
-	font-weight: bold;
-	padding: 2px 0 0 5px;
-	clear: both;
-}
-
-div.filemanager div.filemanager-info-area {
-	border-top: 1px solid #bebebe;
-	padding: 2px 0 0 0;
-	clear: both;
-}
-div.filemanager div.filemanager-preview-content {
-	border-top: 1px solid #bebebe;
-	padding: 2px 0 0 0;
-	clear: both;
-}
-div.filemanager div.filemanager-errors {
-	border-top: 1px solid #bebebe;
-	padding: 2px 0 0 0;
-	clear: both;
-}
-div.filemanager div.filemanager-diag-dump {
-	border-top: 1px solid #bebebe;
-	padding: 2px 0 0 0;
-	clear: both;
-}
-
-div.filemanager h2 {
-	font-size: 14px;
-}
-
-div.filemanager h3 {
-	font-size: 12px;
-}
-
-div.filemanager dl {
-	margin: 5px 0;
-	width: 100%;
-	clear: both;
-	overflow: auto;
-}
-
-div.filemanager dt,
-div.filemanager dd {
-	float: left;
-	line-height: 20px;
-	font-size: 11px;
-}
-
-div.filemanager dt {
-	clear: both;
-	width: 22%;
-	margin-left: 5%;
-	font-weight: bold;
-}
-
-div.filemanager dd {
-	/* width: 60%;    -- Safari4 renders H scrollbar for items which are a little too wide for this, yet still fit on the line :-( */
-	white-space: nowrap;
-	overflow: auto;
-}
-
-div.filemanager div.margin {
-	margin-left: 15px;
-}
-
-div.filemanager a.filemanager-dir-title {
-	padding-left: 10px;
-	padding-right: 10px;
-	font-weight: bold;
-	text-decoration: none;
-	color: #666;
-}
-div.filemanager a.filemanager-dir-title:hover {
-	color: #999;
-}
-
-div.filemanager input.filemanager-dir {
-	margin-top: -4px;
-	background-color: #fbfbfb;
-	background-image: none !important;
-	border: 1px solid #ccc;
-	width: 70%;
-	padding: 1px 5px;
-	font-size: 14px;
-}
-
-div.filemanager span.filemanager-dir a.icon {
-	border: 1px solid #bebebe;
-	padding: 2px 5px 2px 20px;
-	text-decoration: none;
-	background: #eee url("../Images/Icons/directory.png") 2px 0 no-repeat;
-	color: #000;
-
-	-moz-border-radius: 3px;
-	-webkit-border-radius: 3px;
-	-o-border-radius: 3px;
-	border-radius: 3px;
-}
-/* not selectable path */
-div.filemanager span.filemanager-dir span.icon {
-	border: none;
-	padding: 2px 5px 2px 20px;
-	background: url("../Images/Icons/directory.png") 2px 0 no-repeat;
-	color: #999;
-}
-
-div.filemanager span.filemanager-dir a.icon:hover {
-	text-decoration: none;
-	background-color: #fff;
-}
-
-div.filemanager span.filemanager-dir a.selected,
-div.filemanager span.filemanager-dir a.selected:hover {
-	margin: 0 1px;
-	background-color: transparent;
-	border: none;
-	cursor: auto;
-}
-
-div.filemanager-preview {
-	margin-top: 5px;
-}
-
-div.filemanager-preview img.preview {
-	margin: 0 auto 1em;
-	display: block;
-	/* background: transparent; */
-	background: url("../Images/loader.gif") center center no-repeat;
-	border: 1px solid #fff;
-}
-
-div.filemanager-preview img.preview:hover {
-	border: 1px solid #666;
-}
-
-div.filemanager-preview ul li img,
-div.filemanager-uploader ul li img {
-	margin-top: 2px;
-	margin-right: 4px;
-	float: left;
-}
-
-div.filemanager-preview p.tech_info {
-	font-size: 9px;
-	line-height: 1.2em;
-}
-
-div.filemanager-preview p.err_info {
-	color: red;
-	font-weight: bold;
-}
-
-div.filemanager-preview div.preview_err_report {
-	background-color: #fcc;
-}
-
-/*
-div.filemanager-engine-trident4 div.filemanager-preview img.preview {
-	height: 100px;
-}
-*/
-
-div.filemanager-preview ul,
-div.filemanager-uploader ul,
-div.filemanager-preview div.textpreview {
-	border: 1px solid #bebebe;
-	background: #fff;
-
-	padding: 2px;
-	margin: 1em auto;
-
-	width: 490px;
-	height: 280px;
-	overflow: auto;
-}
-
-div.filemanager-preview div.textpreview pre {
-	font: 10px Verdana, Arial, Helvetica, sans-serif;
-}
-
-div.filemanager-preview div.object {
-	width: 100%;
-	text-align: center;
-	overflow: hidden;
-}
-
-div.filemanager-container img.browser-add {
-	position: absolute;
-	width: 16px;
-	height: 16px;
-	/* z-index: 2000; */
-}
-
-/* UPLOAD */
-div.filemanager-container .file span {
-	padding: 0 5px 0 0;
-}
-
-div.filemanager-container .file .file-size {
-	color: #666;
-}
-
-div.filemanager-container .file .file-cancel {
-	cursor: pointer;
-	padding-left: 5px;
-	float: right;
-}
-div.filemanager-container .file .file-progress {
-	margin-top: 5px;
-	float: right;
-	width: 125px;
-	height: 12px;
-	background-image: url("../Images/progress.gif");
-}
-
-div.filemanager div.checkbox {
-	float: left;
-	height: 12px;
-	width: 16px;
-	margin: 10px 3px 0;
-	background: url("../Images/checkbox.png") no-repeat;
-}
-
-div.filemanager div.checkboxChecked {
-	background-position: 0 -12px;
-}
-
-/* SELECTED FILE */
-div.selected-file img {
-	vertical-align: bottom;
-	padding: 0 3px 0 0;
-}
-div.selected-file span {
-	line-height: 16px;
-}
-div.selected-file .file-cancel {
-	cursor: pointer;
-	padding: 0 0 0 5px;
-}
-
-
-/* GALLERY */
-div.filemanager button.filemanager-serialize, div.filemanager .filemanager-button.filemanager-serialize {
-	font-weight: bold;
-}
-
-div.filemanager-gallery {
-	position: absolute;
-	/* z-index: 1000; */
-	width: 798px;        /* 9 images wide + optional scrollbar; old 750px value was ~ 8.5 so pretty useless */
-	height: 144px;
-	display: none;
-
-	font-family: Tahoma, sans-serif;
-	font-size: 12px;
-
-	border: 1px solid #bebebe;
-	border-top: 0;
-	background: #eee;
-
-	border-radius: 0 0 5px 5px;
-	-moz-border-radius: 0 0 5px 5px;
-	-webkit-border-radius: 0 0 5px 5px;
-	-o-border-radius: 0 0 5px 5px;
-
-	box-shadow: rgba(0, 0, 0, 0.3) 0 0 40px;
-	-moz-box-shadow: rgba(0, 0, 0, 0.3) 0 0 40px;
-	-webkit-box-shadow: rgba(0, 0, 0, 0.3) 0 0 40px;
-	-o-box-shadow: rgba(0, 0, 0, 0.3) 0 0 40px;
-}
-
-div.filemanager-gallery div.howto {
-	position: absolute;
-	/* z-index: 1002; */
-	left: 50px;
-	top: 60px;
-
-	color: #666;
-	font-size: 18px;
-	font-style: italic;
-}
-
-div.filemanager-gallery ul {
-	height: 122px;     /* 2 rows @ 60px + ul padding */
-
-	margin: 7px 6px;
-	padding: 4px;
-
-	overflow: auto;
-	overflow-x: hidden;
-	border: 1px solid #bebebe;
-	background: #f2f2f2;
-}
-
-div.filemanager-gallery ul li {
-	position: relative;
-	display: inline-block;
-	float: left;
-	margin: 0 2px;
-	width: 80px;
-	height: 60px;
-	list-style: none;
-	background: url("../Images/loader.gif") center center no-repeat;
-}
-
-div.filemanager-gallery ul li div.gallery-image {
-	padding: 2px;
-	/*
-	width: 75px;
-	height: 56px;
-
-	-- see comment in Gallery.js; these are set up there as getSize() won't deliver these (it delivers actual size, and that's different for this one)
-	*/
-	cursor: pointer;
-}
-
-div.filemanager-gallery ul li div.gallery-image img {
-	padding: 0;
-	margin: 0;
-	border: 0;
-}
-
-div.filemanager-gallery ul li img.filemanager-remove {
-	position: absolute;
-	right: -2px; /* place the red X inside the li entirely; otherwise the adjacent image may partly obscure it */
-	top: -1px;
-	width: 16px;
-	height: 16px;
-	cursor: pointer;
-}
-
-div.filemanager-wrapper {
-	position: absolute;
-	/* z-index: 1020; */
-	width: 272px;
-	height: 410px;
-
-	font-family: Tahoma, sans-serif;
-	font-size: 12px;
-
-	border: 1px solid #bebebe;
-	background: #eee;
-
-	border-radius: 5px;
-	-moz-border-radius: 5px;
-	-webkit-border-radius: 5px;
-	-o-border-radius: 5px;
-}
-
-div.filemanager-wrapper div.img {
-	position: relative;
-	width: 260px;
-	height: 260px;
-	margin: 5px;
-
-	border: 1px solid #bebebe;
-	background: #fff;
-}
-
-div.filemanager-wrapper span {
-	display: block;
-	margin: 3px 8px 1px;
-	font-weight: bold;
-}
-
-div.filemanager-wrapper textarea {
-	padding: 2px;             /* at least Safari had this by default; looks better than 0px, but width must be corrected for this */
-	width: 256px;             /* 260px - 2 * 2 px */
-	height: 80px;
-	margin: 3px 5px 0;
-
-	border: 1px solid #bebebe;
-	background: #fff;
-  
-  /* and prevent FF, Chrome, Safari et al from resizing the textarea and destroy the layout that way: */
-  resize: none;
-}
-
-div.filemanager-wrapper button, div.filemanager-wrapper .filemanager-button {
-	margin: 3px 7px;
-}
-
-img.filemanager-clone {
-	cursor: pointer;
-}
-
-/* TIPS */
-.tip-filebrowser {
-	/* z-index: 1201; */
-}
-.tip-filebrowser .tip {
-	background: #000;
-	-moz-border-radius: 5px;
-	-webkit-border-radius: 5px;
-	-o-border-radius: 5px;
-	border-radius: 5px;
-	border: none;
-}
-
-.tip-filebrowser .tip-title {
-	color: #fff;
-	font: normal 9px verdana, arial, Tahoma, sans-serif;
-	padding: 1px 4px;
-	line-height: 21px;
-	text-align: center;
-	font-weight: bold;
-}
-
-.tip-filebrowser .tip-text {
-	display: none;
-}
-
-/* THUMBNAILS IN PREVIEW LIST */
-div.filemanager-details {
-	overflow: auto;
-	height: 100%;
-}
-div.filemanager-filelist {
-	padding: 5px;
-	border-top: 1px solid #bebebe;
-}
-div.filemanager-filelist ul {
-	background: none;
-	padding: 0;
-	margin: 0;
-	width: auto;
-	height: auto;
-	border: none;
-}
-div.filemanager-filelist li {
-	display: inline-block;
-}
-
-div.filemanager-filelist .fi, div.gallery-image {
-	position: relative;
-	display: inline-block;
-	float: left;
-	margin: 3px;
-	padding: 5px;
-
-	border-radius: 4px;
-	-moz-border-radius: 4px;
-	-webkit-border-radius: 4px;
-	-o-border-radius: 4px;
-
-	text-align: center;
-	white-space: nowrap;
-	cursor: pointer;
-}
-div.gallery-image {
-	float: none;
-}
-div.filemanager-filelist .fi:hover, div.gallery-image:hover {
-	background-color: #dee6f0;
-}
-div.filemanager-filelist .fi:hover .name {
-	color: #098ED1;
-}
-div.filemanager-filelist .fi .dir-gal-thumb-bg {
-	background-repeat: no-repeat;
-	background-position: center center;
-	/*
-	-- Size depends on the user's choice for gallery thumbs sizes
-	width: 100%;
-	height: 48px;
-	*/
-}
-div.filemanager-filelist .fi .name {
-	overflow: hidden;
-	margin-top: 5px;
-	font-weight: normal;
-}
-
-
-/* Extra (Tech.) Info / Diagnostics in preview pane */
-
-/*
-div.filemanager div.filemanager-diag-dump {
-	display: none;
-}
-*/
-
-div.filemanager div.filemanager-diag-dump ul {
-	width: auto;
-	height: auto;
-	background: inherit;
-	border-top: 1px solid #BEBEBE;
-	border-bottom: 1px solid #E7E7E7;
-	border-left: 0;
-	border-right: 0;
-	margin: 5px 0 5px 10px;
-}
-
-div.filemanager div.filemanager-diag-dump ul.dump_level_00 {
-	border: 0;
-}
-
-div.filemanager div.filemanager-diag-dump li span.key {
-	margin-right: 2em;
-	display: inline-block;
-	width: 150px;
-	font-weight: bold;
-}
-
-/*
- * overlarger series ~ golden ratio: 0010, 0016, 0025, 0040, ...
- *
- * Use these classes to tweak the look of the detail info dump.
- */
-div.filemanager div.filemanager-diag-dump li span.key.overlarger0016 {
-	width: auto;    /* prevent key text from overlapping the data; that looks really ugly. */
-}
-
-div.filemanager div.filemanager-diag-dump li {
-	white-space: normal;
-}
-
-div.filemanager div.filemanager-diag-dump li img {
-	/* embedded images should not float in here */
-	float: none;
-}
-
-
-
-
-
-/*  the thumbnails gallery displayed in the preview/detail pane */
-
-#gallery-tn-container
-{
-	margin: 15px;
-	padding: 5px;
-	border: 1px solid #b2a0a0;
-	background: #fffafa;
-	box-shadow: rgba(255, 0, 0, 0.3) 0 0 10px;
-	-moz-box-shadow: rgba(255, 0, 0, 0.3) 0 0 10px;
-	-webkit-box-shadow: rgba(255, 0, 0, 0.3) 0 0 10px;
-}
-
-#gallery-tn-container div
-{
-	float: left;
-
-	/* border: green solid 1px; */
-	margin: 5px;
-
-}
-
-#gallery-tn-container div a
-{
-	display: block;
-	/*
-	width: 250px;
-	height: 250px;
-
-	-- The <a> (and the <img> within!) are 'sized' in the JS code
-	*/
-	border: 1px solid #b2a0a0;
-	background: #eee2e2;
-	padding: 0;
-	margin: 0;
-
-	/* horizontal centering of the contained image */
-	text-align: center;
-	margin-left: auto;
-	margin-right: auto;
-}
-
-#gallery-tn-container div a img
-{
-	padding: 0;
-	margin: 0;
-	border: 0 none;
-}
-
-/*
- *  http://www.smashingmagazine.com/2007/05/01/css-float-theory-things-you-should-know/
- * -->
- *  http://www.positioniseverything.net/easyclearing.html
- * -->
- *  http://blogs.sitepoint.com/simple-clearing-of-floats/
- */
-#gallery-tn-container
-{
-	overflow: auto;
-}
-
-
-
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/MootoolsFileManager/mootools-filemanager/Assets/Css/FileManager_ie7.css b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/MootoolsFileManager/mootools-filemanager/Assets/Css/FileManager_ie7.css
deleted file mode 100755
index db5d4ad..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/MootoolsFileManager/mootools-filemanager/Assets/Css/FileManager_ie7.css
+++ /dev/null
@@ -1,39 +0,0 @@
-div.filemanager div.filemanager-browserscroll {

-	position: relative;

-}

-

-div.filemanager-infos {

-	width: auto;

-}

-

-div.filemanager dl {

-	margin: 5px 0 10px 0;

-	width: 100%;

-	clear: both;

-	overflow: auto;

-	position: relative;

-}

-

-div.filemanager-details {

-	position: relative;

-	overflow-x: hidden;

-	height: 100%;

-}

-

-#mootools-filemanager div.filemanager div.filemanager-menu {

-	width: 350px;

-	background-color: transparent;

-}

-

-#mootools-filemanager div.filemanager-menu label  {

-}

-

-div.filemanager button, div.filemanager .filemanager-button,

-div.filemanager-dialog button, div.filemanager-dialog .filemanager-button{

-	display: inline;

-	overflow: visible;

-}

-

-div.filemanager-container span.fi span {

-  overflow:hidden;

-}
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/MootoolsFileManager/mootools-filemanager/Assets/Images/Icons/7z.png b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/MootoolsFileManager/mootools-filemanager/Assets/Images/Icons/7z.png
deleted file mode 100644
index 4a9560a..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/MootoolsFileManager/mootools-filemanager/Assets/Images/Icons/7z.png
+++ /dev/null
Binary files differ
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/MootoolsFileManager/mootools-filemanager/Assets/Images/Icons/Large/7z.png b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/MootoolsFileManager/mootools-filemanager/Assets/Images/Icons/Large/7z.png
deleted file mode 100644
index 8fc213a..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/MootoolsFileManager/mootools-filemanager/Assets/Images/Icons/Large/7z.png
+++ /dev/null
Binary files differ
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/MootoolsFileManager/mootools-filemanager/Assets/Images/Icons/Large/ace.png b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/MootoolsFileManager/mootools-filemanager/Assets/Images/Icons/Large/ace.png
deleted file mode 100644
index 69ea71f..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/MootoolsFileManager/mootools-filemanager/Assets/Images/Icons/Large/ace.png
+++ /dev/null
Binary files differ
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/MootoolsFileManager/mootools-filemanager/Assets/Images/Icons/Large/as.png b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/MootoolsFileManager/mootools-filemanager/Assets/Images/Icons/Large/as.png
deleted file mode 100644
index d56507a..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/MootoolsFileManager/mootools-filemanager/Assets/Images/Icons/Large/as.png
+++ /dev/null
Binary files differ
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/MootoolsFileManager/mootools-filemanager/Assets/Images/Icons/Large/avi.png b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/MootoolsFileManager/mootools-filemanager/Assets/Images/Icons/Large/avi.png
deleted file mode 100644
index d926b13..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/MootoolsFileManager/mootools-filemanager/Assets/Images/Icons/Large/avi.png
+++ /dev/null
Binary files differ
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/MootoolsFileManager/mootools-filemanager/Assets/Images/Icons/Large/bat.png b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/MootoolsFileManager/mootools-filemanager/Assets/Images/Icons/Large/bat.png
deleted file mode 100644
index 6cbdd5f..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/MootoolsFileManager/mootools-filemanager/Assets/Images/Icons/Large/bat.png
+++ /dev/null
Binary files differ
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/MootoolsFileManager/mootools-filemanager/Assets/Images/Icons/Large/bmp.png b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/MootoolsFileManager/mootools-filemanager/Assets/Images/Icons/Large/bmp.png
deleted file mode 100644
index 1faa139..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/MootoolsFileManager/mootools-filemanager/Assets/Images/Icons/Large/bmp.png
+++ /dev/null
Binary files differ
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/MootoolsFileManager/mootools-filemanager/Assets/Images/Icons/Large/broken_img.png b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/MootoolsFileManager/mootools-filemanager/Assets/Images/Icons/Large/broken_img.png
deleted file mode 100644
index 8397e5f..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/MootoolsFileManager/mootools-filemanager/Assets/Images/Icons/Large/broken_img.png
+++ /dev/null
Binary files differ
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/MootoolsFileManager/mootools-filemanager/Assets/Images/Icons/Large/cmd.png b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/MootoolsFileManager/mootools-filemanager/Assets/Images/Icons/Large/cmd.png
deleted file mode 100644
index 6cbdd5f..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/MootoolsFileManager/mootools-filemanager/Assets/Images/Icons/Large/cmd.png
+++ /dev/null
Binary files differ
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/MootoolsFileManager/mootools-filemanager/Assets/Images/Icons/Large/default-error.png b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/MootoolsFileManager/mootools-filemanager/Assets/Images/Icons/Large/default-error.png
deleted file mode 100644
index d2be05e..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/MootoolsFileManager/mootools-filemanager/Assets/Images/Icons/Large/default-error.png
+++ /dev/null
Binary files differ
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/MootoolsFileManager/mootools-filemanager/Assets/Images/Icons/Large/default-missing.png b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/MootoolsFileManager/mootools-filemanager/Assets/Images/Icons/Large/default-missing.png
deleted file mode 100644
index 7cbd93e..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/MootoolsFileManager/mootools-filemanager/Assets/Images/Icons/Large/default-missing.png
+++ /dev/null
Binary files differ
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/MootoolsFileManager/mootools-filemanager/Assets/Images/Icons/Large/default.png b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/MootoolsFileManager/mootools-filemanager/Assets/Images/Icons/Large/default.png
deleted file mode 100644
index 6d63ef9..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/MootoolsFileManager/mootools-filemanager/Assets/Images/Icons/Large/default.png
+++ /dev/null
Binary files differ
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/MootoolsFileManager/mootools-filemanager/Assets/Images/Icons/Large/directory.png b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/MootoolsFileManager/mootools-filemanager/Assets/Images/Icons/Large/directory.png
deleted file mode 100644
index 3727a6c..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/MootoolsFileManager/mootools-filemanager/Assets/Images/Icons/Large/directory.png
+++ /dev/null
Binary files differ
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/MootoolsFileManager/mootools-filemanager/Assets/Images/Icons/Large/directory_up.png b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/MootoolsFileManager/mootools-filemanager/Assets/Images/Icons/Large/directory_up.png
deleted file mode 100644
index b9a1b1a..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/MootoolsFileManager/mootools-filemanager/Assets/Images/Icons/Large/directory_up.png
+++ /dev/null
Binary files differ
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/MootoolsFileManager/mootools-filemanager/Assets/Images/Icons/Large/doc.png b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/MootoolsFileManager/mootools-filemanager/Assets/Images/Icons/Large/doc.png
deleted file mode 100644
index 9df51f9..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/MootoolsFileManager/mootools-filemanager/Assets/Images/Icons/Large/doc.png
+++ /dev/null
Binary files differ
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/MootoolsFileManager/mootools-filemanager/Assets/Images/Icons/Large/docx.png b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/MootoolsFileManager/mootools-filemanager/Assets/Images/Icons/Large/docx.png
deleted file mode 100644
index 9df51f9..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/MootoolsFileManager/mootools-filemanager/Assets/Images/Icons/Large/docx.png
+++ /dev/null
Binary files differ
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/MootoolsFileManager/mootools-filemanager/Assets/Images/Icons/Large/exe.png b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/MootoolsFileManager/mootools-filemanager/Assets/Images/Icons/Large/exe.png
deleted file mode 100644
index 408e01b..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/MootoolsFileManager/mootools-filemanager/Assets/Images/Icons/Large/exe.png
+++ /dev/null
Binary files differ
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/MootoolsFileManager/mootools-filemanager/Assets/Images/Icons/Large/f4v.png b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/MootoolsFileManager/mootools-filemanager/Assets/Images/Icons/Large/f4v.png
deleted file mode 100644
index d926b13..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/MootoolsFileManager/mootools-filemanager/Assets/Images/Icons/Large/f4v.png
+++ /dev/null
Binary files differ
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/MootoolsFileManager/mootools-filemanager/Assets/Images/Icons/Large/flv.png b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/MootoolsFileManager/mootools-filemanager/Assets/Images/Icons/Large/flv.png
deleted file mode 100644
index d926b13..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/MootoolsFileManager/mootools-filemanager/Assets/Images/Icons/Large/flv.png
+++ /dev/null
Binary files differ
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/MootoolsFileManager/mootools-filemanager/Assets/Images/Icons/Large/gif.png b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/MootoolsFileManager/mootools-filemanager/Assets/Images/Icons/Large/gif.png
deleted file mode 100644
index 1faa139..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/MootoolsFileManager/mootools-filemanager/Assets/Images/Icons/Large/gif.png
+++ /dev/null
Binary files differ
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/MootoolsFileManager/mootools-filemanager/Assets/Images/Icons/Large/gz.png b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/MootoolsFileManager/mootools-filemanager/Assets/Images/Icons/Large/gz.png
deleted file mode 100644
index 8fc213a..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/MootoolsFileManager/mootools-filemanager/Assets/Images/Icons/Large/gz.png
+++ /dev/null
Binary files differ
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/MootoolsFileManager/mootools-filemanager/Assets/Images/Icons/Large/html.png b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/MootoolsFileManager/mootools-filemanager/Assets/Images/Icons/Large/html.png
deleted file mode 100644
index 865a708..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/MootoolsFileManager/mootools-filemanager/Assets/Images/Icons/Large/html.png
+++ /dev/null
Binary files differ
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/MootoolsFileManager/mootools-filemanager/Assets/Images/Icons/Large/ini.png b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/MootoolsFileManager/mootools-filemanager/Assets/Images/Icons/Large/ini.png
deleted file mode 100644
index 11af300..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/MootoolsFileManager/mootools-filemanager/Assets/Images/Icons/Large/ini.png
+++ /dev/null
Binary files differ
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/MootoolsFileManager/mootools-filemanager/Assets/Images/Icons/Large/ink.png b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/MootoolsFileManager/mootools-filemanager/Assets/Images/Icons/Large/ink.png
deleted file mode 100644
index 426920f..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/MootoolsFileManager/mootools-filemanager/Assets/Images/Icons/Large/ink.png
+++ /dev/null
Binary files differ
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/MootoolsFileManager/mootools-filemanager/Assets/Images/Icons/Large/iso.png b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/MootoolsFileManager/mootools-filemanager/Assets/Images/Icons/Large/iso.png
deleted file mode 100644
index 3d3b05a..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/MootoolsFileManager/mootools-filemanager/Assets/Images/Icons/Large/iso.png
+++ /dev/null
Binary files differ
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/MootoolsFileManager/mootools-filemanager/Assets/Images/Icons/Large/jpeg.png b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/MootoolsFileManager/mootools-filemanager/Assets/Images/Icons/Large/jpeg.png
deleted file mode 100644
index 1faa139..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/MootoolsFileManager/mootools-filemanager/Assets/Images/Icons/Large/jpeg.png
+++ /dev/null
Binary files differ
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/MootoolsFileManager/mootools-filemanager/Assets/Images/Icons/Large/jpg.png b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/MootoolsFileManager/mootools-filemanager/Assets/Images/Icons/Large/jpg.png
deleted file mode 100644
index 1faa139..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/MootoolsFileManager/mootools-filemanager/Assets/Images/Icons/Large/jpg.png
+++ /dev/null
Binary files differ
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/MootoolsFileManager/mootools-filemanager/Assets/Images/Icons/Large/js.png b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/MootoolsFileManager/mootools-filemanager/Assets/Images/Icons/Large/js.png
deleted file mode 100644
index 0efa607..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/MootoolsFileManager/mootools-filemanager/Assets/Images/Icons/Large/js.png
+++ /dev/null
Binary files differ
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/MootoolsFileManager/mootools-filemanager/Assets/Images/Icons/Large/m2v.png b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/MootoolsFileManager/mootools-filemanager/Assets/Images/Icons/Large/m2v.png
deleted file mode 100644
index f90ed1b..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/MootoolsFileManager/mootools-filemanager/Assets/Images/Icons/Large/m2v.png
+++ /dev/null
Binary files differ
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/MootoolsFileManager/mootools-filemanager/Assets/Images/Icons/Large/mkv.png b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/MootoolsFileManager/mootools-filemanager/Assets/Images/Icons/Large/mkv.png
deleted file mode 100644
index d926b13..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/MootoolsFileManager/mootools-filemanager/Assets/Images/Icons/Large/mkv.png
+++ /dev/null
Binary files differ
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/MootoolsFileManager/mootools-filemanager/Assets/Images/Icons/Large/mov.png b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/MootoolsFileManager/mootools-filemanager/Assets/Images/Icons/Large/mov.png
deleted file mode 100644
index f90ed1b..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/MootoolsFileManager/mootools-filemanager/Assets/Images/Icons/Large/mov.png
+++ /dev/null
Binary files differ
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/MootoolsFileManager/mootools-filemanager/Assets/Images/Icons/Large/mp3.png b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/MootoolsFileManager/mootools-filemanager/Assets/Images/Icons/Large/mp3.png
deleted file mode 100644
index 953ae4b..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/MootoolsFileManager/mootools-filemanager/Assets/Images/Icons/Large/mp3.png
+++ /dev/null
Binary files differ
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/MootoolsFileManager/mootools-filemanager/Assets/Images/Icons/Large/mp4.png b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/MootoolsFileManager/mootools-filemanager/Assets/Images/Icons/Large/mp4.png
deleted file mode 100644
index d926b13..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/MootoolsFileManager/mootools-filemanager/Assets/Images/Icons/Large/mp4.png
+++ /dev/null
Binary files differ
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/MootoolsFileManager/mootools-filemanager/Assets/Images/Icons/Large/mpeg.png b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/MootoolsFileManager/mootools-filemanager/Assets/Images/Icons/Large/mpeg.png
deleted file mode 100644
index d926b13..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/MootoolsFileManager/mootools-filemanager/Assets/Images/Icons/Large/mpeg.png
+++ /dev/null
Binary files differ
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/MootoolsFileManager/mootools-filemanager/Assets/Images/Icons/Large/mpg.png b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/MootoolsFileManager/mootools-filemanager/Assets/Images/Icons/Large/mpg.png
deleted file mode 100644
index d926b13..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/MootoolsFileManager/mootools-filemanager/Assets/Images/Icons/Large/mpg.png
+++ /dev/null
Binary files differ
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/MootoolsFileManager/mootools-filemanager/Assets/Images/Icons/Large/odp.png b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/MootoolsFileManager/mootools-filemanager/Assets/Images/Icons/Large/odp.png
deleted file mode 100644
index 8ebd0d9..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/MootoolsFileManager/mootools-filemanager/Assets/Images/Icons/Large/odp.png
+++ /dev/null
Binary files differ
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/MootoolsFileManager/mootools-filemanager/Assets/Images/Icons/Large/ods.png b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/MootoolsFileManager/mootools-filemanager/Assets/Images/Icons/Large/ods.png
deleted file mode 100644
index 032c27a..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/MootoolsFileManager/mootools-filemanager/Assets/Images/Icons/Large/ods.png
+++ /dev/null
Binary files differ
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/MootoolsFileManager/mootools-filemanager/Assets/Images/Icons/Large/odt.png b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/MootoolsFileManager/mootools-filemanager/Assets/Images/Icons/Large/odt.png
deleted file mode 100644
index 9df51f9..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/MootoolsFileManager/mootools-filemanager/Assets/Images/Icons/Large/odt.png
+++ /dev/null
Binary files differ
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/MootoolsFileManager/mootools-filemanager/Assets/Images/Icons/Large/ogg.png b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/MootoolsFileManager/mootools-filemanager/Assets/Images/Icons/Large/ogg.png
deleted file mode 100644
index d926b13..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/MootoolsFileManager/mootools-filemanager/Assets/Images/Icons/Large/ogg.png
+++ /dev/null
Binary files differ
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/MootoolsFileManager/mootools-filemanager/Assets/Images/Icons/Large/oversized_img.png b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/MootoolsFileManager/mootools-filemanager/Assets/Images/Icons/Large/oversized_img.png
deleted file mode 100644
index fb7b728..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/MootoolsFileManager/mootools-filemanager/Assets/Images/Icons/Large/oversized_img.png
+++ /dev/null
Binary files differ
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/MootoolsFileManager/mootools-filemanager/Assets/Images/Icons/Large/pdf.png b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/MootoolsFileManager/mootools-filemanager/Assets/Images/Icons/Large/pdf.png
deleted file mode 100644
index d6c8c46..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/MootoolsFileManager/mootools-filemanager/Assets/Images/Icons/Large/pdf.png
+++ /dev/null
Binary files differ
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/MootoolsFileManager/mootools-filemanager/Assets/Images/Icons/Large/php.png b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/MootoolsFileManager/mootools-filemanager/Assets/Images/Icons/Large/php.png
deleted file mode 100644
index d8f2ad9..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/MootoolsFileManager/mootools-filemanager/Assets/Images/Icons/Large/php.png
+++ /dev/null
Binary files differ
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/MootoolsFileManager/mootools-filemanager/Assets/Images/Icons/Large/png.png b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/MootoolsFileManager/mootools-filemanager/Assets/Images/Icons/Large/png.png
deleted file mode 100644
index 1faa139..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/MootoolsFileManager/mootools-filemanager/Assets/Images/Icons/Large/png.png
+++ /dev/null
Binary files differ
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/MootoolsFileManager/mootools-filemanager/Assets/Images/Icons/Large/ppt.png b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/MootoolsFileManager/mootools-filemanager/Assets/Images/Icons/Large/ppt.png
deleted file mode 100644
index 8ebd0d9..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/MootoolsFileManager/mootools-filemanager/Assets/Images/Icons/Large/ppt.png
+++ /dev/null
Binary files differ
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/MootoolsFileManager/mootools-filemanager/Assets/Images/Icons/Large/rar.png b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/MootoolsFileManager/mootools-filemanager/Assets/Images/Icons/Large/rar.png
deleted file mode 100644
index 87e8d56..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/MootoolsFileManager/mootools-filemanager/Assets/Images/Icons/Large/rar.png
+++ /dev/null
Binary files differ
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/MootoolsFileManager/mootools-filemanager/Assets/Images/Icons/Large/rb.png b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/MootoolsFileManager/mootools-filemanager/Assets/Images/Icons/Large/rb.png
deleted file mode 100644
index efa8b71..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/MootoolsFileManager/mootools-filemanager/Assets/Images/Icons/Large/rb.png
+++ /dev/null
Binary files differ
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/MootoolsFileManager/mootools-filemanager/Assets/Images/Icons/Large/rm.png b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/MootoolsFileManager/mootools-filemanager/Assets/Images/Icons/Large/rm.png
deleted file mode 100644
index f90ed1b..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/MootoolsFileManager/mootools-filemanager/Assets/Images/Icons/Large/rm.png
+++ /dev/null
Binary files differ
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/MootoolsFileManager/mootools-filemanager/Assets/Images/Icons/Large/sql.png b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/MootoolsFileManager/mootools-filemanager/Assets/Images/Icons/Large/sql.png
deleted file mode 100644
index d384b6c..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/MootoolsFileManager/mootools-filemanager/Assets/Images/Icons/Large/sql.png
+++ /dev/null
Binary files differ
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/MootoolsFileManager/mootools-filemanager/Assets/Images/Icons/Large/swf.png b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/MootoolsFileManager/mootools-filemanager/Assets/Images/Icons/Large/swf.png
deleted file mode 100644
index 9f7dac6..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/MootoolsFileManager/mootools-filemanager/Assets/Images/Icons/Large/swf.png
+++ /dev/null
Binary files differ
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/MootoolsFileManager/mootools-filemanager/Assets/Images/Icons/Large/tar.png b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/MootoolsFileManager/mootools-filemanager/Assets/Images/Icons/Large/tar.png
deleted file mode 100644
index 782d8d8..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/MootoolsFileManager/mootools-filemanager/Assets/Images/Icons/Large/tar.png
+++ /dev/null
Binary files differ
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/MootoolsFileManager/mootools-filemanager/Assets/Images/Icons/Large/wmv.png b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/MootoolsFileManager/mootools-filemanager/Assets/Images/Icons/Large/wmv.png
deleted file mode 100644
index d926b13..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/MootoolsFileManager/mootools-filemanager/Assets/Images/Icons/Large/wmv.png
+++ /dev/null
Binary files differ
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/MootoolsFileManager/mootools-filemanager/Assets/Images/Icons/Large/xls.png b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/MootoolsFileManager/mootools-filemanager/Assets/Images/Icons/Large/xls.png
deleted file mode 100644
index 032c27a..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/MootoolsFileManager/mootools-filemanager/Assets/Images/Icons/Large/xls.png
+++ /dev/null
Binary files differ
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/MootoolsFileManager/mootools-filemanager/Assets/Images/Icons/Large/xlsx.png b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/MootoolsFileManager/mootools-filemanager/Assets/Images/Icons/Large/xlsx.png
deleted file mode 100644
index 032c27a..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/MootoolsFileManager/mootools-filemanager/Assets/Images/Icons/Large/xlsx.png
+++ /dev/null
Binary files differ
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/MootoolsFileManager/mootools-filemanager/Assets/Images/Icons/Large/zip.png b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/MootoolsFileManager/mootools-filemanager/Assets/Images/Icons/Large/zip.png
deleted file mode 100644
index d992900..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/MootoolsFileManager/mootools-filemanager/Assets/Images/Icons/Large/zip.png
+++ /dev/null
Binary files differ
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/MootoolsFileManager/mootools-filemanager/Assets/Images/Icons/ace.png b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/MootoolsFileManager/mootools-filemanager/Assets/Images/Icons/ace.png
deleted file mode 100644
index 4a9560a..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/MootoolsFileManager/mootools-filemanager/Assets/Images/Icons/ace.png
+++ /dev/null
Binary files differ
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/MootoolsFileManager/mootools-filemanager/Assets/Images/Icons/as.png b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/MootoolsFileManager/mootools-filemanager/Assets/Images/Icons/as.png
deleted file mode 100644
index 159b240..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/MootoolsFileManager/mootools-filemanager/Assets/Images/Icons/as.png
+++ /dev/null
Binary files differ
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/MootoolsFileManager/mootools-filemanager/Assets/Images/Icons/avi.png b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/MootoolsFileManager/mootools-filemanager/Assets/Images/Icons/avi.png
deleted file mode 100644
index c3107b4..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/MootoolsFileManager/mootools-filemanager/Assets/Images/Icons/avi.png
+++ /dev/null
Binary files differ
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/MootoolsFileManager/mootools-filemanager/Assets/Images/Icons/bat.png b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/MootoolsFileManager/mootools-filemanager/Assets/Images/Icons/bat.png
deleted file mode 100644
index 35f015b..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/MootoolsFileManager/mootools-filemanager/Assets/Images/Icons/bat.png
+++ /dev/null
Binary files differ
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/MootoolsFileManager/mootools-filemanager/Assets/Images/Icons/bmp.png b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/MootoolsFileManager/mootools-filemanager/Assets/Images/Icons/bmp.png
deleted file mode 100644
index 0c20bab..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/MootoolsFileManager/mootools-filemanager/Assets/Images/Icons/bmp.png
+++ /dev/null
Binary files differ
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/MootoolsFileManager/mootools-filemanager/Assets/Images/Icons/broken_img.png b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/MootoolsFileManager/mootools-filemanager/Assets/Images/Icons/broken_img.png
deleted file mode 100644
index 9ab39ae..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/MootoolsFileManager/mootools-filemanager/Assets/Images/Icons/broken_img.png
+++ /dev/null
Binary files differ
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/MootoolsFileManager/mootools-filemanager/Assets/Images/Icons/cmd.png b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/MootoolsFileManager/mootools-filemanager/Assets/Images/Icons/cmd.png
deleted file mode 100644
index 35f015b..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/MootoolsFileManager/mootools-filemanager/Assets/Images/Icons/cmd.png
+++ /dev/null
Binary files differ
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/MootoolsFileManager/mootools-filemanager/Assets/Images/Icons/default-error.png b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/MootoolsFileManager/mootools-filemanager/Assets/Images/Icons/default-error.png
deleted file mode 100644
index aef8917..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/MootoolsFileManager/mootools-filemanager/Assets/Images/Icons/default-error.png
+++ /dev/null
Binary files differ
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/MootoolsFileManager/mootools-filemanager/Assets/Images/Icons/default-missing.png b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/MootoolsFileManager/mootools-filemanager/Assets/Images/Icons/default-missing.png
deleted file mode 100644
index 576d4c7..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/MootoolsFileManager/mootools-filemanager/Assets/Images/Icons/default-missing.png
+++ /dev/null
Binary files differ
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/MootoolsFileManager/mootools-filemanager/Assets/Images/Icons/default.png b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/MootoolsFileManager/mootools-filemanager/Assets/Images/Icons/default.png
deleted file mode 100644
index 813f712..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/MootoolsFileManager/mootools-filemanager/Assets/Images/Icons/default.png
+++ /dev/null
Binary files differ
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/MootoolsFileManager/mootools-filemanager/Assets/Images/Icons/directory.png b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/MootoolsFileManager/mootools-filemanager/Assets/Images/Icons/directory.png
deleted file mode 100644
index 784e8fa..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/MootoolsFileManager/mootools-filemanager/Assets/Images/Icons/directory.png
+++ /dev/null
Binary files differ
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/MootoolsFileManager/mootools-filemanager/Assets/Images/Icons/directory_up.png b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/MootoolsFileManager/mootools-filemanager/Assets/Images/Icons/directory_up.png
deleted file mode 100644
index 38b168b..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/MootoolsFileManager/mootools-filemanager/Assets/Images/Icons/directory_up.png
+++ /dev/null
Binary files differ
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/MootoolsFileManager/mootools-filemanager/Assets/Images/Icons/doc.png b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/MootoolsFileManager/mootools-filemanager/Assets/Images/Icons/doc.png
deleted file mode 100644
index ae8ecbf..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/MootoolsFileManager/mootools-filemanager/Assets/Images/Icons/doc.png
+++ /dev/null
Binary files differ
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/MootoolsFileManager/mootools-filemanager/Assets/Images/Icons/docx.png b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/MootoolsFileManager/mootools-filemanager/Assets/Images/Icons/docx.png
deleted file mode 100644
index ae8ecbf..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/MootoolsFileManager/mootools-filemanager/Assets/Images/Icons/docx.png
+++ /dev/null
Binary files differ
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/MootoolsFileManager/mootools-filemanager/Assets/Images/Icons/exe.png b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/MootoolsFileManager/mootools-filemanager/Assets/Images/Icons/exe.png
deleted file mode 100644
index 1dee9e3..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/MootoolsFileManager/mootools-filemanager/Assets/Images/Icons/exe.png
+++ /dev/null
Binary files differ
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/MootoolsFileManager/mootools-filemanager/Assets/Images/Icons/f4v.png b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/MootoolsFileManager/mootools-filemanager/Assets/Images/Icons/f4v.png
deleted file mode 100644
index 9b81fad..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/MootoolsFileManager/mootools-filemanager/Assets/Images/Icons/f4v.png
+++ /dev/null
Binary files differ
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/MootoolsFileManager/mootools-filemanager/Assets/Images/Icons/flv.png b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/MootoolsFileManager/mootools-filemanager/Assets/Images/Icons/flv.png
deleted file mode 100644
index 9b81fad..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/MootoolsFileManager/mootools-filemanager/Assets/Images/Icons/flv.png
+++ /dev/null
Binary files differ
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/MootoolsFileManager/mootools-filemanager/Assets/Images/Icons/gif.png b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/MootoolsFileManager/mootools-filemanager/Assets/Images/Icons/gif.png
deleted file mode 100644
index 0c20bab..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/MootoolsFileManager/mootools-filemanager/Assets/Images/Icons/gif.png
+++ /dev/null
Binary files differ
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/MootoolsFileManager/mootools-filemanager/Assets/Images/Icons/gz.png b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/MootoolsFileManager/mootools-filemanager/Assets/Images/Icons/gz.png
deleted file mode 100644
index 8606ff0..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/MootoolsFileManager/mootools-filemanager/Assets/Images/Icons/gz.png
+++ /dev/null
Binary files differ
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/MootoolsFileManager/mootools-filemanager/Assets/Images/Icons/html.png b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/MootoolsFileManager/mootools-filemanager/Assets/Images/Icons/html.png
deleted file mode 100644
index 6ed2490..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/MootoolsFileManager/mootools-filemanager/Assets/Images/Icons/html.png
+++ /dev/null
Binary files differ
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/MootoolsFileManager/mootools-filemanager/Assets/Images/Icons/ini.png b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/MootoolsFileManager/mootools-filemanager/Assets/Images/Icons/ini.png
deleted file mode 100644
index 106f5aa..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/MootoolsFileManager/mootools-filemanager/Assets/Images/Icons/ini.png
+++ /dev/null
Binary files differ
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/MootoolsFileManager/mootools-filemanager/Assets/Images/Icons/ink.png b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/MootoolsFileManager/mootools-filemanager/Assets/Images/Icons/ink.png
deleted file mode 100644
index f8fbb3e..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/MootoolsFileManager/mootools-filemanager/Assets/Images/Icons/ink.png
+++ /dev/null
Binary files differ
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/MootoolsFileManager/mootools-filemanager/Assets/Images/Icons/iso.png b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/MootoolsFileManager/mootools-filemanager/Assets/Images/Icons/iso.png
deleted file mode 100644
index ef43223..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/MootoolsFileManager/mootools-filemanager/Assets/Images/Icons/iso.png
+++ /dev/null
Binary files differ
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/MootoolsFileManager/mootools-filemanager/Assets/Images/Icons/jpeg.png b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/MootoolsFileManager/mootools-filemanager/Assets/Images/Icons/jpeg.png
deleted file mode 100644
index 0c20bab..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/MootoolsFileManager/mootools-filemanager/Assets/Images/Icons/jpeg.png
+++ /dev/null
Binary files differ
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/MootoolsFileManager/mootools-filemanager/Assets/Images/Icons/jpg.png b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/MootoolsFileManager/mootools-filemanager/Assets/Images/Icons/jpg.png
deleted file mode 100644
index 0c20bab..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/MootoolsFileManager/mootools-filemanager/Assets/Images/Icons/jpg.png
+++ /dev/null
Binary files differ
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/MootoolsFileManager/mootools-filemanager/Assets/Images/Icons/js.png b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/MootoolsFileManager/mootools-filemanager/Assets/Images/Icons/js.png
deleted file mode 100644
index 0c76bd1..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/MootoolsFileManager/mootools-filemanager/Assets/Images/Icons/js.png
+++ /dev/null
Binary files differ
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/MootoolsFileManager/mootools-filemanager/Assets/Images/Icons/m2v.png b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/MootoolsFileManager/mootools-filemanager/Assets/Images/Icons/m2v.png
deleted file mode 100644
index fc4fac6..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/MootoolsFileManager/mootools-filemanager/Assets/Images/Icons/m2v.png
+++ /dev/null
Binary files differ
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/MootoolsFileManager/mootools-filemanager/Assets/Images/Icons/mkv.png b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/MootoolsFileManager/mootools-filemanager/Assets/Images/Icons/mkv.png
deleted file mode 100644
index 9b81fad..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/MootoolsFileManager/mootools-filemanager/Assets/Images/Icons/mkv.png
+++ /dev/null
Binary files differ
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/MootoolsFileManager/mootools-filemanager/Assets/Images/Icons/mov.png b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/MootoolsFileManager/mootools-filemanager/Assets/Images/Icons/mov.png
deleted file mode 100644
index fc4fac6..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/MootoolsFileManager/mootools-filemanager/Assets/Images/Icons/mov.png
+++ /dev/null
Binary files differ
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/MootoolsFileManager/mootools-filemanager/Assets/Images/Icons/mp3.png b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/MootoolsFileManager/mootools-filemanager/Assets/Images/Icons/mp3.png
deleted file mode 100644
index 5506027..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/MootoolsFileManager/mootools-filemanager/Assets/Images/Icons/mp3.png
+++ /dev/null
Binary files differ
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/MootoolsFileManager/mootools-filemanager/Assets/Images/Icons/mp4.png b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/MootoolsFileManager/mootools-filemanager/Assets/Images/Icons/mp4.png
deleted file mode 100644
index 9b81fad..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/MootoolsFileManager/mootools-filemanager/Assets/Images/Icons/mp4.png
+++ /dev/null
Binary files differ
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/MootoolsFileManager/mootools-filemanager/Assets/Images/Icons/mpeg.png b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/MootoolsFileManager/mootools-filemanager/Assets/Images/Icons/mpeg.png
deleted file mode 100644
index 9b81fad..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/MootoolsFileManager/mootools-filemanager/Assets/Images/Icons/mpeg.png
+++ /dev/null
Binary files differ
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/MootoolsFileManager/mootools-filemanager/Assets/Images/Icons/mpg.png b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/MootoolsFileManager/mootools-filemanager/Assets/Images/Icons/mpg.png
deleted file mode 100644
index 9b81fad..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/MootoolsFileManager/mootools-filemanager/Assets/Images/Icons/mpg.png
+++ /dev/null
Binary files differ
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/MootoolsFileManager/mootools-filemanager/Assets/Images/Icons/odp.png b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/MootoolsFileManager/mootools-filemanager/Assets/Images/Icons/odp.png
deleted file mode 100644
index c4eff03..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/MootoolsFileManager/mootools-filemanager/Assets/Images/Icons/odp.png
+++ /dev/null
Binary files differ
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/MootoolsFileManager/mootools-filemanager/Assets/Images/Icons/ods.png b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/MootoolsFileManager/mootools-filemanager/Assets/Images/Icons/ods.png
deleted file mode 100644
index b977d7e..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/MootoolsFileManager/mootools-filemanager/Assets/Images/Icons/ods.png
+++ /dev/null
Binary files differ
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/MootoolsFileManager/mootools-filemanager/Assets/Images/Icons/odt.png b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/MootoolsFileManager/mootools-filemanager/Assets/Images/Icons/odt.png
deleted file mode 100644
index ae8ecbf..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/MootoolsFileManager/mootools-filemanager/Assets/Images/Icons/odt.png
+++ /dev/null
Binary files differ
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/MootoolsFileManager/mootools-filemanager/Assets/Images/Icons/ogg.png b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/MootoolsFileManager/mootools-filemanager/Assets/Images/Icons/ogg.png
deleted file mode 100644
index 9b81fad..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/MootoolsFileManager/mootools-filemanager/Assets/Images/Icons/ogg.png
+++ /dev/null
Binary files differ
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/MootoolsFileManager/mootools-filemanager/Assets/Images/Icons/oversized_img.png b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/MootoolsFileManager/mootools-filemanager/Assets/Images/Icons/oversized_img.png
deleted file mode 100644
index 1ad3c01..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/MootoolsFileManager/mootools-filemanager/Assets/Images/Icons/oversized_img.png
+++ /dev/null
Binary files differ
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/MootoolsFileManager/mootools-filemanager/Assets/Images/Icons/pdf.png b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/MootoolsFileManager/mootools-filemanager/Assets/Images/Icons/pdf.png
deleted file mode 100644
index 8f8095e..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/MootoolsFileManager/mootools-filemanager/Assets/Images/Icons/pdf.png
+++ /dev/null
Binary files differ
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/MootoolsFileManager/mootools-filemanager/Assets/Images/Icons/php.png b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/MootoolsFileManager/mootools-filemanager/Assets/Images/Icons/php.png
deleted file mode 100644
index 7868a25..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/MootoolsFileManager/mootools-filemanager/Assets/Images/Icons/php.png
+++ /dev/null
Binary files differ
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/MootoolsFileManager/mootools-filemanager/Assets/Images/Icons/png.png b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/MootoolsFileManager/mootools-filemanager/Assets/Images/Icons/png.png
deleted file mode 100644
index 0c20bab..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/MootoolsFileManager/mootools-filemanager/Assets/Images/Icons/png.png
+++ /dev/null
Binary files differ
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/MootoolsFileManager/mootools-filemanager/Assets/Images/Icons/ppt.png b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/MootoolsFileManager/mootools-filemanager/Assets/Images/Icons/ppt.png
deleted file mode 100644
index c4eff03..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/MootoolsFileManager/mootools-filemanager/Assets/Images/Icons/ppt.png
+++ /dev/null
Binary files differ
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/MootoolsFileManager/mootools-filemanager/Assets/Images/Icons/rar.png b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/MootoolsFileManager/mootools-filemanager/Assets/Images/Icons/rar.png
deleted file mode 100644
index 4a9560a..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/MootoolsFileManager/mootools-filemanager/Assets/Images/Icons/rar.png
+++ /dev/null
Binary files differ
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/MootoolsFileManager/mootools-filemanager/Assets/Images/Icons/rb.png b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/MootoolsFileManager/mootools-filemanager/Assets/Images/Icons/rb.png
deleted file mode 100644
index f59b7c4..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/MootoolsFileManager/mootools-filemanager/Assets/Images/Icons/rb.png
+++ /dev/null
Binary files differ
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/MootoolsFileManager/mootools-filemanager/Assets/Images/Icons/rm.png b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/MootoolsFileManager/mootools-filemanager/Assets/Images/Icons/rm.png
deleted file mode 100644
index fc4fac6..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/MootoolsFileManager/mootools-filemanager/Assets/Images/Icons/rm.png
+++ /dev/null
Binary files differ
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/MootoolsFileManager/mootools-filemanager/Assets/Images/Icons/sql.png b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/MootoolsFileManager/mootools-filemanager/Assets/Images/Icons/sql.png
deleted file mode 100644
index bddba1f..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/MootoolsFileManager/mootools-filemanager/Assets/Images/Icons/sql.png
+++ /dev/null
Binary files differ
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/MootoolsFileManager/mootools-filemanager/Assets/Images/Icons/swf.png b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/MootoolsFileManager/mootools-filemanager/Assets/Images/Icons/swf.png
deleted file mode 100644
index 5769120..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/MootoolsFileManager/mootools-filemanager/Assets/Images/Icons/swf.png
+++ /dev/null
Binary files differ
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/MootoolsFileManager/mootools-filemanager/Assets/Images/Icons/tar.png b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/MootoolsFileManager/mootools-filemanager/Assets/Images/Icons/tar.png
deleted file mode 100644
index 4a9560a..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/MootoolsFileManager/mootools-filemanager/Assets/Images/Icons/tar.png
+++ /dev/null
Binary files differ
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/MootoolsFileManager/mootools-filemanager/Assets/Images/Icons/wmv.png b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/MootoolsFileManager/mootools-filemanager/Assets/Images/Icons/wmv.png
deleted file mode 100644
index 9b81fad..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/MootoolsFileManager/mootools-filemanager/Assets/Images/Icons/wmv.png
+++ /dev/null
Binary files differ
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/MootoolsFileManager/mootools-filemanager/Assets/Images/Icons/xls.png b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/MootoolsFileManager/mootools-filemanager/Assets/Images/Icons/xls.png
deleted file mode 100644
index b977d7e..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/MootoolsFileManager/mootools-filemanager/Assets/Images/Icons/xls.png
+++ /dev/null
Binary files differ
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/MootoolsFileManager/mootools-filemanager/Assets/Images/Icons/xlsx.png b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/MootoolsFileManager/mootools-filemanager/Assets/Images/Icons/xlsx.png
deleted file mode 100644
index b977d7e..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/MootoolsFileManager/mootools-filemanager/Assets/Images/Icons/xlsx.png
+++ /dev/null
Binary files differ
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/MootoolsFileManager/mootools-filemanager/Assets/Images/Icons/zip.png b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/MootoolsFileManager/mootools-filemanager/Assets/Images/Icons/zip.png
deleted file mode 100644
index 8606ff0..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/MootoolsFileManager/mootools-filemanager/Assets/Images/Icons/zip.png
+++ /dev/null
Binary files differ
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/MootoolsFileManager/mootools-filemanager/Assets/Images/add.png b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/MootoolsFileManager/mootools-filemanager/Assets/Images/add.png
deleted file mode 100644
index 6332fef..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/MootoolsFileManager/mootools-filemanager/Assets/Images/add.png
+++ /dev/null
Binary files differ
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/MootoolsFileManager/mootools-filemanager/Assets/Images/application_side_boxes.png b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/MootoolsFileManager/mootools-filemanager/Assets/Images/application_side_boxes.png
deleted file mode 100644
index 498bbcc..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/MootoolsFileManager/mootools-filemanager/Assets/Images/application_side_boxes.png
+++ /dev/null
Binary files differ
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/MootoolsFileManager/mootools-filemanager/Assets/Images/application_side_list.png b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/MootoolsFileManager/mootools-filemanager/Assets/Images/application_side_list.png
deleted file mode 100644
index f5c37e0..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/MootoolsFileManager/mootools-filemanager/Assets/Images/application_side_list.png
+++ /dev/null
Binary files differ
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/MootoolsFileManager/mootools-filemanager/Assets/Images/application_side_thumbs.png b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/MootoolsFileManager/mootools-filemanager/Assets/Images/application_side_thumbs.png
deleted file mode 100644
index 362bac7..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/MootoolsFileManager/mootools-filemanager/Assets/Images/application_side_thumbs.png
+++ /dev/null
Binary files differ
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/MootoolsFileManager/mootools-filemanager/Assets/Images/bar.gif b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/MootoolsFileManager/mootools-filemanager/Assets/Images/bar.gif
deleted file mode 100644
index abc513f..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/MootoolsFileManager/mootools-filemanager/Assets/Images/bar.gif
+++ /dev/null
Binary files differ
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/MootoolsFileManager/mootools-filemanager/Assets/Images/button.png b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/MootoolsFileManager/mootools-filemanager/Assets/Images/button.png
deleted file mode 100644
index 68b893f..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/MootoolsFileManager/mootools-filemanager/Assets/Images/button.png
+++ /dev/null
Binary files differ
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/MootoolsFileManager/mootools-filemanager/Assets/Images/button_disabled.png b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/MootoolsFileManager/mootools-filemanager/Assets/Images/button_disabled.png
deleted file mode 100644
index 18a445c..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/MootoolsFileManager/mootools-filemanager/Assets/Images/button_disabled.png
+++ /dev/null
Binary files differ
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/MootoolsFileManager/mootools-filemanager/Assets/Images/cancel.png b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/MootoolsFileManager/mootools-filemanager/Assets/Images/cancel.png
deleted file mode 100644
index 7fe6d18..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/MootoolsFileManager/mootools-filemanager/Assets/Images/cancel.png
+++ /dev/null
Binary files differ
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/MootoolsFileManager/mootools-filemanager/Assets/Images/checkbox.png b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/MootoolsFileManager/mootools-filemanager/Assets/Images/checkbox.png
deleted file mode 100644
index 957ee99..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/MootoolsFileManager/mootools-filemanager/Assets/Images/checkbox.png
+++ /dev/null
Binary files differ
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/MootoolsFileManager/mootools-filemanager/Assets/Images/close.png b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/MootoolsFileManager/mootools-filemanager/Assets/Images/close.png
deleted file mode 100644
index cd22a96..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/MootoolsFileManager/mootools-filemanager/Assets/Images/close.png
+++ /dev/null
Binary files differ
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/MootoolsFileManager/mootools-filemanager/Assets/Images/destroy.png b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/MootoolsFileManager/mootools-filemanager/Assets/Images/destroy.png
deleted file mode 100755
index 7404ecc..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/MootoolsFileManager/mootools-filemanager/Assets/Images/destroy.png
+++ /dev/null
Binary files differ
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/MootoolsFileManager/mootools-filemanager/Assets/Images/download.png b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/MootoolsFileManager/mootools-filemanager/Assets/Images/download.png
deleted file mode 100644
index 565ef16..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/MootoolsFileManager/mootools-filemanager/Assets/Images/download.png
+++ /dev/null
Binary files differ
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/MootoolsFileManager/mootools-filemanager/Assets/Images/drag_n_drop.png b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/MootoolsFileManager/mootools-filemanager/Assets/Images/drag_n_drop.png
deleted file mode 100644
index 5588861..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/MootoolsFileManager/mootools-filemanager/Assets/Images/drag_n_drop.png
+++ /dev/null
Binary files differ
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/MootoolsFileManager/mootools-filemanager/Assets/Images/filelist.png b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/MootoolsFileManager/mootools-filemanager/Assets/Images/filelist.png
deleted file mode 100644
index 5833d21..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/MootoolsFileManager/mootools-filemanager/Assets/Images/filelist.png
+++ /dev/null
Binary files differ
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/MootoolsFileManager/mootools-filemanager/Assets/Images/filelist_selected.png b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/MootoolsFileManager/mootools-filemanager/Assets/Images/filelist_selected.png
deleted file mode 100644
index f06f6cb..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/MootoolsFileManager/mootools-filemanager/Assets/Images/filelist_selected.png
+++ /dev/null
Binary files differ
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/MootoolsFileManager/mootools-filemanager/Assets/Images/go_first.png b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/MootoolsFileManager/mootools-filemanager/Assets/Images/go_first.png
deleted file mode 100644
index 1b7aad5..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/MootoolsFileManager/mootools-filemanager/Assets/Images/go_first.png
+++ /dev/null
Binary files differ
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/MootoolsFileManager/mootools-filemanager/Assets/Images/go_last.png b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/MootoolsFileManager/mootools-filemanager/Assets/Images/go_last.png
deleted file mode 100644
index 4ba34d0..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/MootoolsFileManager/mootools-filemanager/Assets/Images/go_last.png
+++ /dev/null
Binary files differ
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/MootoolsFileManager/mootools-filemanager/Assets/Images/go_next.png b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/MootoolsFileManager/mootools-filemanager/Assets/Images/go_next.png
deleted file mode 100644
index beee11c..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/MootoolsFileManager/mootools-filemanager/Assets/Images/go_next.png
+++ /dev/null
Binary files differ
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/MootoolsFileManager/mootools-filemanager/Assets/Images/go_previous.png b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/MootoolsFileManager/mootools-filemanager/Assets/Images/go_previous.png
deleted file mode 100644
index a959fa8..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/MootoolsFileManager/mootools-filemanager/Assets/Images/go_previous.png
+++ /dev/null
Binary files differ
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/MootoolsFileManager/mootools-filemanager/Assets/Images/loader.gif b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/MootoolsFileManager/mootools-filemanager/Assets/Images/loader.gif
deleted file mode 100644
index 9e969a5..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/MootoolsFileManager/mootools-filemanager/Assets/Images/loader.gif
+++ /dev/null
Binary files differ
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/MootoolsFileManager/mootools-filemanager/Assets/Images/menu.png b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/MootoolsFileManager/mootools-filemanager/Assets/Images/menu.png
deleted file mode 100644
index 056a619..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/MootoolsFileManager/mootools-filemanager/Assets/Images/menu.png
+++ /dev/null
Binary files differ
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/MootoolsFileManager/mootools-filemanager/Assets/Images/progress.gif b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/MootoolsFileManager/mootools-filemanager/Assets/Images/progress.gif
deleted file mode 100644
index 830b775..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/MootoolsFileManager/mootools-filemanager/Assets/Images/progress.gif
+++ /dev/null
Binary files differ
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/MootoolsFileManager/mootools-filemanager/Assets/Images/rename.png b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/MootoolsFileManager/mootools-filemanager/Assets/Images/rename.png
deleted file mode 100644
index 6b9c7db..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/MootoolsFileManager/mootools-filemanager/Assets/Images/rename.png
+++ /dev/null
Binary files differ
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/MootoolsFileManager/mootools-filemanager/Assets/Images/transparent.gif b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/MootoolsFileManager/mootools-filemanager/Assets/Images/transparent.gif
deleted file mode 100644
index 8ba501d..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/MootoolsFileManager/mootools-filemanager/Assets/Images/transparent.gif
+++ /dev/null
Binary files differ
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/MootoolsFileManager/mootools-filemanager/Assets/Swiff.Uploader.swf b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/MootoolsFileManager/mootools-filemanager/Assets/Swiff.Uploader.swf
deleted file mode 100644
index e5367fe..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/MootoolsFileManager/mootools-filemanager/Assets/Swiff.Uploader.swf
+++ /dev/null
Binary files differ
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/MootoolsFileManager/mootools-filemanager/Assets/dewplayer.swf b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/MootoolsFileManager/mootools-filemanager/Assets/dewplayer.swf
deleted file mode 100644
index 68a71cd..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/MootoolsFileManager/mootools-filemanager/Assets/dewplayer.swf
+++ /dev/null
Binary files differ
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/MootoolsFileManager/mootools-filemanager/Assets/js/README.md b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/MootoolsFileManager/mootools-filemanager/Assets/js/README.md
deleted file mode 100644
index d76943b..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/MootoolsFileManager/mootools-filemanager/Assets/js/README.md
+++ /dev/null
@@ -1,63 +0,0 @@
-jsGET
-==============================================
-Copyright (C) Fabian Vogelsteller [frozeman.de]
-published under the GNU General Public License version 3
-
-This program is free software;
-you can redistribute it and/or modify it under the terms of the GNU General Public License as published by
-the Free Software Foundation; either version 3 of the License, or (at your option) any later version.
-
-This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
-without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
-See the GNU General Public License for more details.
-
-You should have received a copy of the GNU General Public License along with this program;
-if not,see <http://www.gnu.org/licenses/>.
-_____________________________________________
-
-### AUTHOR
-Fabian Vogelsteller <http://frozeman.de>
-
-### DESCRIPTION
-jsGET is a http GET-Variables clone for javascript, using the hash part of the URL (index.html#...).
-You can set and get variables, and run a listener to hash changes, e.g. when the the history back button gets pressed.
-This allows you to create a usable history navigation in your ajax application. It should work with all A-grade browsers.
-
-### VERSION
-0.2
-
-### INSTALLATION
-Just include the jsGET.js in your website/webapplication and use the jsGET object with its methods to set, get, remove history hash variables.
-See the demo.html for examples.
-
-### Properties
-- vars:                     (object) the hash variables object loaded by get(), set(), remove(), or clear() or load() plus various indicators and trackers:
-- vars.current:             (object) the current variables.
-- vars.old:                 (object) the old variables, before they where changed with set(), remove(), clear() or the browser history back button.   *WARNING*: this is one is only valid while the listener is invoked.
-- vars.changed:             (object) the variables which have changed since the last call of get(), set(), remove(), clear(), load() or the browser history back button.   *WARNING*: this is one is updated by setChangedVars() depending on 'vars.old' and usually is only valid while the listener is invoked.
-- vars.change_count:        (integer) a number of variables changed/added/removed since the last time the listener was invoked.   *WARNING*: this is one is updated by setChangedVars() depending on 'vars.old' and usually is only valid while the listener is invoked.
-- vars.last_hash_loaded:    (string, internal use only) the raw hash string which was just processed; in the listener, this equals the current hash.
-- vars.last_hash_saved:     (string, internal use only) the hash section string which was the last one generated by set(), clear() or remove().
-- vars.foreign_hash_change: (boolean) TRUE when the hash was changed from outside our control, e.g. when the user hit the 'back/history' button in the browser, after the previous invocation of the listener.
-- vars.hash_changed:        (boolean) TRUE when the hash has changed after the previous invocation of the listener.
-
-### Methods
-- load():                                 loads the current hash variables into the vars.current property as JSON object. Return the updated set of key/value pairs.
-- clear():                                clears the hash part of the URL. (because it's not completely possible, it sets it to "#_")
-- get(get):                               (string) try to get a hash variable with the given name.
-- set(set):                               (string,object) sets the given parameters to the hash variables. If it's a string it should have the following format: "key=value". Return the updated set of key/value pairs.
-- remove(remove):                         (string,array) the variable name(s) which should be removed from the hash variables. Return the old set of key/value pairs.
-- addListener(listener,callAlways,bind):  (listener: function, callAlways: boolean, bind: object instance) creates a listener which calls the given function when a hash change occurs. The called function will get the vars property (vars.current,vars.old,vars.changed) and use the "bind" parameter as "this", when specified.
-  The return of the addListener() method is a setInterval ID and must be passed to the removeListener() method to stop the listening.
-  When callAlways is FALSE, it only calls when the browser history buttons are pressed and not when get(), set(), remove() or clear() is called.
-- removeListener(listenerID):             (the setInterval Id received from a addListener() method) removes a listener set with the addListener() method.
-- setChangedVars():                       (internal use) updates the vars.changed collection and vars.change_count value.
-
-### ATTENTION!
-Everytime you call set(), remove() or clear() a new hash string will be set,
-that means you also create a new history step in the browser history!
-
-These are 'special' characters to jsGET and will therefor be encoded when they are part of a key or value:
-
->  # & =
-
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/MootoolsFileManager/mootools-filemanager/Assets/js/demo.html b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/MootoolsFileManager/mootools-filemanager/Assets/js/demo.html
deleted file mode 100644
index 29e097d..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/MootoolsFileManager/mootools-filemanager/Assets/js/demo.html
+++ /dev/null
@@ -1,120 +0,0 @@
-<!doctype html>  
-
-<html lang="en">
-<head>
-  <meta charset="utf-8">
-  <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
-
-  <title>jsGET demo</title>
-  <meta name="description" content="simple demos, which show what you can do with jsGET">
-  <meta name="author" content="Fabian Vogelsteller">
-
-  <meta name="viewport" content="width=device-width, initial-scale=1.0">
-  
-  <script type="text/javascript" src="jsGET.js"></script>
-  
-  <style type="text/css">
-  body {
-    font-size: 12px;
-    font-family: verdana, sans-serif;
-    background-color:#000;
-    color: #fff;
-  }
-  
-  a {
-    color: #fff;
-    border-bottom: 1px dotted #eee;
-  }
-  
-  #menu h1 {
-    color:#fff;
-    font-size: 15px;
-  }
-  
-  #output {
-    width: 200px;
-    border: 1px solid white;
-    padding: 5px;
-    color: #ccc;
-  }
-  </style>
-</head>
-<body>
-  
-  <div id="menu">
-  <h1>Navigation</h1>
-  <a href="#" onclick="jsGET.set('myNavi=firstpage');return false;">First page</a><br />
-  <a href="#" onclick="jsGET.set({'myNavi':'secondpage'});return false;">Second page</a><br />
-  <a href="#" onclick="jsGET.set({'myNavi':'lastpage','newVar':'newValue'});return false;">Last page</a><br /><br />
-  <a href="#" onclick="jsGET.remove('myNavi');return false;">Remove "myNavi" var</a><br />
-  <a href="#" onclick="jsGET.clear();return false;">Clear all</a><br />
-  <h2>Mode</h2>
-  <a href="?mode=regular">Fire jsGET listener (and update output box below) with every change</a><br />
-  <a href="?mode=only-browser-history">Fire jsGET listener (and update output box below) ONLY when you change the URL by going back in the browser history (or by manually editing the hash section)</a><br />
-  Listener test frequency:<br />
-  <a href="?freq=100">very fast (0.1s)</a> |
-  <a href="?freq=250">fast (0.25s)</a> |
-  <a href="?freq=500">regular/default (0.5s)</a> |
-  <a href="?freq=1000">slow (1s)</a> |
-  <a href="?freq=5000">very slow (5s)</a><br />
-  </div>
-  <br />
-  <div id="output">
-  </div>
-  
-  <script type="text/javascript">
-
-  // run the putInOutpuBox always when the hash value changes
-  // (when the second parameter is FALSE, it only calls the function when the browser history button (back, forward) is clicked)
-  var newListener = jsGET.addListener(putInOutputBox, (get_uri_arg('mode') !== 'only-browser-history'), null, parseInt(get_uri_arg('freq'))); // the "newListener" var get the setIntervallId necessary for removeListener()
-  
-  // the function which get called by the listener
-  function putInOutputBox(hashVars) {
-    var outputBox = document.getElementById("output");
-    outputBox.innerHTML = '';
-    var output = '';
-
-    // show changed vars in the output box
-    output += '<b>Changed var(s)</b><br />';
-    for(var key in hashVars.changed) {
-      output += key+' = '+hashVars.changed[key]+'<br />';
-    }
-    
-    // show all current vars in the output box
-    output += '<br><b>Current var(s)</b><br />';
-    for(var key in hashVars.current) {
-      output += key+' = '+hashVars.current[key]+'<br />';
-    }
-    
-    // show all current vars in the output box
-    output += '<br /><b>Old var(s)</b><br />';
-    for(var key in hashVars.old) {
-      output += key+' = '+hashVars.old[key]+'<br />';
-    }
-    
-    output += '<br /><br /><b>This uses the get() method, to fetch the "myNavi" var:</b><br />'+jsGET.get('myNavi');
-    
-    outputBox.innerHTML = output;
-	blink(1);
-	setTimeout(blink, 250);
-  }
-  
-  function blink(toggle) {
-    var outputBox = document.getElementById("output");
-	outputBox.style.backgroundColor = (toggle == 1 ? '#800' : '');
-  }
-	
-	// derived from  http://www.netlobo.com/url_query_string_javascript.html
-	function get_uri_arg(name)
-	{
-	  var re = '[?&]' + name + '=([^&#]*)';
-	  var regex = new RegExp(re);
-	  var results = regex.exec(window.location.href);
-	  if (results == null)
-		return '';
-	  else
-		return results[1];
-	}  
-  </script>
-</body>
-</html>
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/MootoolsFileManager/mootools-filemanager/Assets/js/jsGET.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/MootoolsFileManager/mootools-filemanager/Assets/js/jsGET.js
deleted file mode 100644
index 52087fd..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/MootoolsFileManager/mootools-filemanager/Assets/js/jsGET.js
+++ /dev/null
@@ -1,294 +0,0 @@
-/**
-*
-* jsGET
-*
-* jsGET is a http GET-Variables clone for javascript, using the hash part of the URL (index.html#...).
-* You can set and get variables, and run a listener to hash changes, e.g. when the the history back button gets pressed.
-* This allows you to create a usable history navigation in your ajax application. It should work with all A-grade browsers.
-*
-* @author Fabian Vogelsteller <fabian@feindura.org>
-* @copyright Fabian Vogelsteller
-* @license http://www.gnu.org/licenses GNU General Public License version 3
-*
-* @version 0.2
-*
-* ### Properties
-* - vars:                     (object) the hash variables object loaded by get(), set(), remove(), or clear() or load() plus various indicators and trackers:
-* - vars.current:             (object) the current variables.
-* - vars.old:                 (object) the old variables, before they where changed with set(), remove(), clear() or the browser history back button.   *WARNING*: this is one is only valid while the listener is invoked.
-* - vars.changed:             (object) the variables which have changed since the last call of get(), set(), remove(), clear(), load() or the browser history back button.   *WARNING*: this is one is updated by setChangedVars() depending on 'vars.old' and usually is only valid while the listener is invoked.
-* - vars.change_count:        (integer) a number of variables changed/added/removed since the last time the listener was invoked.   *WARNING*: this is one is updated by setChangedVars() depending on 'vars.old' and usually is only valid while the listener is invoked.
-* - vars.last_hash_loaded:    (string, internal use only) the raw hash string which was just processed; in the listener, this equals the current hash.
-* - vars.last_hash_saved:     (string, internal use only) the hash section string which was the last one generated by set(), clear() or remove().
-* - vars.foreign_hash_change: (boolean) TRUE when the hash was changed from outside our control, e.g. when the user hit the 'back/history' button in the browser, after the previous invocation of the listener.
-* - vars.hash_changed:        (boolean) TRUE when the hash has changed after the previous invocation of the listener.
-*
-* ### Methods
-* - load():                                 loads the current hash variables into the vars.current property as JSON object. Return the updated set of key/value pairs.
-* - clear():                                clears the hash part of the URL. (because it's not completely possible, it sets it to "#_")
-* - get(get):                               (string) try to get a hash variable with the given name.
-* - set(set):                               (string,object) sets the given parameters to the hash variables. If it's a string it should have the following format: "key=value". Return the updated set of key/value pairs.
-* - remove(remove):                         (string,array) the variable name(s) which should be removed from the hash variables. Return the old set of key/value pairs.
-* - addListener(listener,callAlways,bind):  (listener: function, callAlways: boolean, bind: object instance) creates a listener which calls the given function when a hash change occurs. The called function will get the vars property (vars.current,vars.old,vars.changed) and use the "bind" parameter as "this", when specified.
-*                                           The return of the addListener() method is a setInterval ID and must be passed to the removeListener() method to stop the listening.
-*                                           When callAlways is FALSE, it only calls when the browser history buttons are pressed and not when get(), set(), remove() or clear() is called.
-* - removeListener(listenerID):             (the setInterval Id received from a addListener() method) removes a listener set with the addListener() method.
-* - setChangedVars():                       (internal use) updates the vars.changed collection and vars.change_count value.
-*
-* ### ATTENTION!
-* Everytime you call set(), remove() or clear() a new hash string will be set,
-* that means you also create a new history step in the browser history!
-*
-* These are 'special' characters to jsGET and will therefor be encoded when they are part of a key or value:
-*   # & =
-*/
-
-var jsGET = {
-	vars: {
-		old: {},
-		current: {},
-		changed: {},
-		change_count: 0,
-		last_hash_loaded: '',
-		last_hash_saved: window.location.hash,
-		foreign_hash_change: false,
-		hash_changed: false
-	},
-	load: function() {
-		// only load hash variables when anything changed in the hash since last time we loaded them:
-		var i;
-		var new_hash = window.location.hash;
-
-		if (this.vars.last_hash_loaded !== new_hash) {
-			// detect whether the hash was changed outside our control, e.g. when user pushed BACK/HISTORY button in browser:
-			if (new_hash !== this.vars.last_hash_saved) {
-				this.vars.foreign_hash_change = true;
-			}
-			this.vars.hash_changed = true;
-
-			var hashVars = new_hash.split('#');
-			this.vars.current = {};
-			if (typeof hashVars[1] !== 'undefined' && hashVars[1] && hashVars[1] !== '_') {
-				hashVars = hashVars[1].split('&');
-				for(i = 0; i < hashVars.length; i++) {
-					var hashVar = hashVars[i].split('=');
-					this.vars.current[this.decode(hashVar[0])] = (typeof hashVar[1] !== 'undefined' ? this.decode(hashVar[1]) : '');
-				}
-			}
-			this.vars.last_hash_loaded = new_hash;
-		}
-		return this.vars.current;
-	},
-	// encode special characters in the input string; use encodeURIComponent() to encode as that one is fast and ensures proper Unicode handling as well: bonus!
-	encode: function(s) {
-		s = encodeURIComponent(s);
-		// BUT! browsers take things like '%26' in the URL anywhere and translate it to '&' before we get our hands on the fragment part, so we need to prevent the browsers from doing this:
-		s = s.replace(/%/g, '$'); // we can do this safely as encodeURIComponent() will have encoded any '$' in the original string!
-		return s;
-	},
-	decode: function(s) {
-		s = s.replace(/\$/g, '%');
-		s = decodeURIComponent(s);
-		return s;
-	},
-	clear: function() {
-		this.vars.last_hash_saved = window.location.hash = "#_";
-		//window.location.href = window.location.href.replace( /#.*$/, "");
-		return false;
-	},
-	get: function(key) {
-		this.load();
-		return (this.vars.current.hasOwnProperty(key) ? this.vars.current[key] : null);
-	},
-	set: function(set) {
-		var key;
-
-		//if (typeof console !== 'undefined' && console.log) console.log('savedHistory');
-		this.load();
-
-		if (typeof set !== 'object') {
-			var setSplit = set.split('=');
-			set = {};
-			// be aware that the _value_ of the key, value pair can have an embedded '=' (or more) itself:
-			key = setSplit.shift();
-			var value = setSplit.join('=');
-			set[key] = value;
-		}
-		else {
-			// do not damage the set passed in as a parameter
-			set = this.helpers.cloneObject(set);
-		}
-
-		// var
-		var hashString = '';
-		var sep = '#';
-
-		// check for change in existing vars
-		for(key in this.vars.current) {
-			if (this.vars.current.hasOwnProperty(key)) {
-				if (set.hasOwnProperty(key)) {
-					hashString += sep+this.encode(key)+'='+this.encode(set[key]);
-					delete set[key];
-				}
-				else {
-					hashString += sep+this.encode(key)+'='+this.encode(this.vars.current[key]);
-				}
-				sep = '&';
-			}
-		}
-
-		// add new vars
-		for(key in set) {
-			if (set.hasOwnProperty(key)) {
-				hashString += sep+this.encode(key)+'='+this.encode(set[key]);
-				sep = '&';
-			}
-		}
-		this.vars.last_hash_saved = window.location.hash = hashString;
-		return this.load();
-	},
-	remove: function(remove) {
-		var removes;
-		var i;
-		var key;
-
-		this.load();
-
-		if (typeof remove !== 'object') {
-			removes = [remove];
-		} else {
-			removes = remove;
-		}
-
-		// var
-		var hashString = '';
-		var sep = '#';
-
-		for (i = 0; i < removes.length; i++) {
-			if (this.vars.current.hasOwnProperty(removes[i])) {
-				delete this.vars.current[removes[i]];
-			}
-		}
-
-		// create new hash string
-		for(key in this.vars.current) {
-			if (this.vars.current.hasOwnProperty(key)) {
-				hashString += sep+this.encode(key)+'='+this.encode(this.vars.current[key]);
-				sep = '&';
-			}
-		}
-		this.vars.last_hash_saved = window.location.hash = hashString;
-
-		this.load();
-		// a bit odd: this one returns the OLD set, while set() returns the UPDATED set...
-		return this.vars.current;
-	},
-	setChangedVars: function() {
-		var change_count;
-		var key;
-		var oldVars = this.helpers.cloneObject(this.vars.old);
-		this.vars.changed = this.helpers.cloneObject(this.vars.current);
-
-		// check for changed vars
-		change_count = 0;
-		for (key in this.vars.changed) {
-			if (this.vars.changed.hasOwnProperty(key)) {
-				if (oldVars.hasOwnProperty(key)) {
-					if (oldVars[key] === this.vars.changed[key]) {
-						change_count--;         // faster?/simpler than multiple 'else' branches just to track change_count
-						delete this.vars.changed[key];
-					}
-					delete oldVars[key];
-				}
-				change_count++;
-			}
-		}
-		// merge the rest of this.vars.old with the changedVars
-		for (key in oldVars) {
-			if (oldVars.hasOwnProperty(key) /* && !this.vars.changed.hasOwnProperty(key) */ ) {
-				this.vars.changed[key] = oldVars[key];
-				change_count++;
-			}
-		}
-		this.vars.change_count = change_count;
-	},
-	addListener: function(listener, callAlways, bind, freq) { // use the returned interval ID for removeListener
-
-		this.load();
-		this.vars.hash_changed = false;
-		this.vars.foreign_hash_change = false;
-		this.vars.old = this.helpers.cloneObject(this.vars.current);
-
-		this.pollHash = function() {
-			var key;
-
-			this.load();    // side effect: an immediate check (one more) to see whether the hash has changed by us or others
-
-			// and make sure listener always fires whn callAlways==FALSE and user is going back&forth in the browser history (one or more history entries may match   this.vars.last_hash_saved !)
-			this.vars.last_hash_saved = window.location.hash;
-
-			if (this.vars.hash_changed) {
-				this.setChangedVars();
-				if (callAlways || this.vars.foreign_hash_change) {
-					// var
-					/*
-					if (typeof console !== 'undefined' && console.log) console.log('-----');
-					if (typeof console !== 'undefined' && console.log) console.log(this.vars.old);
-					if (typeof console !== 'undefined' && console.log) console.log(this.vars.changed);
-					*/
-					// call the given listener function
-					if (typeof listener === 'function') {
-						listener.apply(bind, [this.vars]);
-					}
-
-					// only reset the 'old' array, i.e. effect the '.changed' set, when the listener was actually (to be) invoked.
-					//
-					// also reset the 'changed' markers so changes applied inside the listener don't 'recursively' trigger the listener:
-					this.load();
-					this.vars.hash_changed = false;
-					this.vars.foreign_hash_change = false;
-
-					/*
-					if (typeof console !== 'undefined' && console.log) console.log('-----');
-					if (typeof console !== 'undefined' && console.log) console.log(this.vars.current);
-					if (typeof console !== 'undefined' && console.log) console.log(this.vars.old);
-					if (typeof console !== 'undefined' && console.log) console.log(this.vars.changed);
-					*/
-					this.vars.old = new this.vars.current.constructor();
-					for (key in this.vars.current) {
-						if (this.vars.current.hasOwnProperty(key)) {
-							this.vars.old[key] = this.vars.current[key];
-						}
-					}
-				}
-			}
-		};
-
-		var self = this;
-		return setInterval(function() {
-			self.pollHash();
-		}, (freq || 500));
-	},
-	removeListener: function(listenerID) { // use the interval ID returned by addListener
-		delete this.pollHash;
-		return clearInterval(listenerID);
-	},
-	helpers:
-	{
-		// eqv. of mootools Object.clone():
-		cloneObject: function(obj) {
-			var key;
-			var rv = new obj.constructor();
-			for (key in obj) {
-				if (obj.hasOwnProperty(key)) {
-					rv[key] = obj[key];
-				}
-			}
-			return rv;
-		}
-	}
-};
-
-
-/* settings for jsLint: undef: true, browser: true, indent: 4 */
-
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/MootoolsFileManager/mootools-filemanager/Assets/js/milkbox/css/close.gif b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/MootoolsFileManager/mootools-filemanager/Assets/js/milkbox/css/close.gif
deleted file mode 100644
index 9d7206f..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/MootoolsFileManager/mootools-filemanager/Assets/js/milkbox/css/close.gif
+++ /dev/null
Binary files differ
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/MootoolsFileManager/mootools-filemanager/Assets/js/milkbox/css/loading.gif b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/MootoolsFileManager/mootools-filemanager/Assets/js/milkbox/css/loading.gif
deleted file mode 100644
index 53dd589..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/MootoolsFileManager/mootools-filemanager/Assets/js/milkbox/css/loading.gif
+++ /dev/null
Binary files differ
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/MootoolsFileManager/mootools-filemanager/Assets/js/milkbox/css/loading.old.gif b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/MootoolsFileManager/mootools-filemanager/Assets/js/milkbox/css/loading.old.gif
deleted file mode 100644
index f864d5f..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/MootoolsFileManager/mootools-filemanager/Assets/js/milkbox/css/loading.old.gif
+++ /dev/null
Binary files differ
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/MootoolsFileManager/mootools-filemanager/Assets/js/milkbox/css/milkbox.css b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/MootoolsFileManager/mootools-filemanager/Assets/js/milkbox/css/milkbox.css
deleted file mode 100644
index 0fb6367..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/MootoolsFileManager/mootools-filemanager/Assets/js/milkbox/css/milkbox.css
+++ /dev/null
@@ -1,106 +0,0 @@
-/* MILKBOX CSS */
-
-#mbox-overlay{
-	background-color: #000; /* set the Milkbox overlay color // opacity: see the js options */
-	z-index:50000;
-	cursor: pointer;
-}
-
-/* Main box */
-#mbox-mainbox{
-	/* For default width and height, see the js options */
-	top:10%;/* overwritten in the js options to properly position the main box when activated in a scrolled window */
-	background-color: #fff;/* set the main box background color */
-	border: 5px solid #fff;/* set the main box border */ 
-	padding:5px;/* set the main box padding */
-}
-
-/* Where the files actually are injected */
-#mbox-filebox{ margin:0; padding:0; border:none; overflow:hidden; }
-
-#mbox-filebox img,
-#mbox-filebox iframe,
-#mbox-filebox swf{
-	border:none;	
-}
-
-/*this class is for styling the inner file box*/
-/*these styles will be visible after the first is loaded */
-.mbox-filebox-decorations{
-	border:none;
-	padding:0;
-}
-
-/* *** BOTTOM *** */
-
-/* container for controls and caption */
-#mbox-bottom { 
-	/* set text options */
-	font-family: Arial, Verdana, Geneva, Helvetica, sans-serif;
-	font-size: 12px;
-	color: #656565;
-	line-height: 1.4em;
-	text-align: left;
-	padding-top:8px;
-	margin:0;
-}
-
-/* controls/navigation */
-/* be careful if you change buttons dimensions */
-
-#mbox-controls{
-	/*background-color:#0f0;*/
-	float:right;
-	width:27px;
-	padding-top:3px;
-	border-left:1px solid #9c9c9c;/* set nav border */
-}
-
-#mbox-count{ 
-	overflow:hidden;
-	padding-top:1px;
-	float:right;
-	text-align:right;
-	font-size:9px; /* count font size */
-}
-
-#mbox-close,
-#mbox-prev,
-#mbox-next,
-#mbox-playpause{
-	float:right;
-	height:19px;
-}
-
-#mbox-prev,#mbox-next{ width:15px; }
-#mbox-prev{ background: url(prev.gif) no-repeat; }/* IMAGE: prev */
-#mbox-next{ background: url(next.gif) no-repeat; }/* IMAGE: next */
-
-#mbox-playpause{ width:13px; }
-#mbox-playpause{ background: url(play-pause.gif) no-repeat; }/* IMAGE: prev */
-
-#mbox-close{
-	width:17px;
-	background:url(close.gif) no-repeat;/* IMAGE: close */
-}
-
-#mbox-prev:hover,
-#mbox-next:hover,
-#mbox-close:hover,
-#mbox-playpause:hover{
-	background-position:0 -22px;
-}
-
-/* description */
-#mbox-caption{
-	/*background-color:#f00;*/
-	margin-right:27px;
-	padding:0px 10px 0 0;
-	font-weight: normal;
-	text-align:justify;
-	overflow-x: hidden;  /* make sure the controls at the right remain accessible, even for small images with very large filenames: those would otherwise overlap those controls at right */
-}
-
-.mbox-loading{ background:url(loading.gif) no-repeat center; }/* IMAGE: loading gif */
-.mbox-reset{ clear:both; height:0; margin:0; padding:0; font-size:0; overflow:hidden; }
-
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/MootoolsFileManager/mootools-filemanager/Assets/js/milkbox/css/next.gif b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/MootoolsFileManager/mootools-filemanager/Assets/js/milkbox/css/next.gif
deleted file mode 100644
index 874835f..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/MootoolsFileManager/mootools-filemanager/Assets/js/milkbox/css/next.gif
+++ /dev/null
Binary files differ
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/MootoolsFileManager/mootools-filemanager/Assets/js/milkbox/css/play-pause.gif b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/MootoolsFileManager/mootools-filemanager/Assets/js/milkbox/css/play-pause.gif
deleted file mode 100644
index 7301b65..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/MootoolsFileManager/mootools-filemanager/Assets/js/milkbox/css/play-pause.gif
+++ /dev/null
Binary files differ
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/MootoolsFileManager/mootools-filemanager/Assets/js/milkbox/css/prev.gif b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/MootoolsFileManager/mootools-filemanager/Assets/js/milkbox/css/prev.gif
deleted file mode 100644
index d531199..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/MootoolsFileManager/mootools-filemanager/Assets/js/milkbox/css/prev.gif
+++ /dev/null
Binary files differ
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/MootoolsFileManager/mootools-filemanager/Assets/js/milkbox/milkbox.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/MootoolsFileManager/mootools-filemanager/Assets/js/milkbox/milkbox.js
deleted file mode 100644
index 308b973..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/MootoolsFileManager/mootools-filemanager/Assets/js/milkbox/milkbox.js
+++ /dev/null
@@ -1,1186 +0,0 @@
-/*
-	Milkbox v3.0.3 - required: mootools.js v1.3 core + more (see the relative js file for details about used modules)
-
-	by Luca Reghellin (http://www.reghellin.com) September 2011, MIT-style license.
-	Inspiration Lokesh Dhakar (http://www.lokeshdhakar.com/projects/lightbox2/)
-	AND OF COURSE, SPECIAL THANKS TO THE MOOTOOLS DEVELOPERS AND THE OTHER DEVELOPERS HELPING ALL AROUND THE WORLD
-*/
-
-
-//Class: Milkbox (singleton)
-(function(){
-
-var milkbox_singleton = null;
-
-this.Milkbox = new Class({
-
-	Implements:[Options,Events],
-
-	options:{//set all the options here
-		overlayOpacity:0.7,
-		marginTop:50,
-		initialWidth:250,
-		initialHeight:250,
-		fileboxBorderWidth:'0px',
-		fileboxBorderColor:'#000000',
-		fileboxPadding:'0px',
-		resizeDuration:.5,
-		resizeTransition:'sine:in:out',/*function (ex. Transitions.Sine.easeIn) or string (ex. 'bounce:out')*/
-		autoPlay:false,
-		autoPlayDelay:7,
-		removeTitle:true,
-		autoSize:true,
-		autoSizeMaxHeight:0,//only if autoSize==true
-		centered:false,
-		imageOfText:'of',
-		onXmlGalleries:function(){},
-		onClosed:function(){},
-		onFileReady:function(){},
-    zIndex: 50001,
-	},
-
-	initialize: function(options){
-		if (milkbox_singleton) return milkbox_singleton;
-		milkbox_singleton = this;
-
-		this.setOptions(options);
-		this.autoPlayBkup = { autoPlayDelay:this.options.autoPlayDelay, autoPlay:this.options.autoPlay };
-		this.fullOptionsBkup = {};
-		this.galleries = [];
-		this.formElements = [];
-		this.activated;
-		this.busy = false;
-		this.paused = false;
-		this.closed = true;
-		this.intId;
-		this.loadCheckerId;
-		this.externalGalleries = [];
-		this.singlePageLinkId = 0;
-		
-		this.currentIndex;
-		this.currentGallery;
-		this.fileReady;
-		this.loadedImages = [];
-		this.currentFile;
-		this.options_bkup;
-		
-		this.display;
-		
-		this.getPageGalleries();
-		if(this.galleries.length != 0){ this.prepare(true); }
-	},
-	
-	prepare:function(checkForm){
-		if(checkForm){ this.checkFormElements(); }
-		this.prepareHTML();
-		this.prepareEventListeners();
-		this.activated = true;
-	},
-	
-	//utility
-	open:function(gallery,index){
-		var i;
-		
-		if(!this.activated){ this.prepare(true); }
-				
-		var g = (instanceOf(gallery,MilkboxGallery)) ? gallery : this.getGallery(gallery);
-		if(!g) return false;
- 		
- 		// [i_a] when 'index' is not an number, it may be a element reference or string: resolve such indexes too
-		if (typeOf(index) !== 'number') {
-			i = g.get_index_of(index);
-			if(i !== -1){ index = i; }
-		}
-
-		i = parseInt(index, 10);
-		if(isNaN(i)){ i = 0; }
-
-		this.closed = false;
-		var item = g.get_item(i);
-		if(!item) return false;
-		
-		this.currentGallery = g;
-		this.currentIndex = i;
-				
-		this.hideFormElements();
-		
-		this.display.set_mode(this.currentGallery.type);
-		this.display.appear();
-		
-		
-		if(this.options.autoPlay || g.options.autoplay){ this.startAutoPlay(true); }
-
-		this.loadFile(item,this.getPreloads());
-		return true;
-	},
-	
-	
-	//utility
-	close:function(hideDisplay){
-		if(hideDisplay){ this.display.disappear(); }
-		this.showFormElements();
-		this.pauseAutoPlay();
-		this.stopLoadingCheck();
-		this.currentGallery = null;
-		this.currentIndex = null;
-		this.currentFile = null;
-		this.busy = false;
-		this.paused = false;
-		this.fileReady = false;
-		this.closed = true;
-	
-		this.fireEvent('closed');
-	},
-
-	startAutoPlay:function(opening){
-		var d = this.currentGallery.options.autoplay_delay || this.options.autoPlayDelay;
-		if(d < this.options.resizeDuration*2){ d = this.options.resizeDuration*2 };
-
-		var f = function(){
-			this.removeEvent('fileReady',f);
-			this.intId = this.navAux.periodical(d*1000,this,[null,'next']);
-		}
-
-		if(opening){
-			this.addEvent('fileReady',f);
-		} else {
-			this.intId = this.navAux.periodical(d*1000,this,[null,'next']);
-		}
-
-		this.paused = false;
-	},
-	
-	pauseAutoPlay:function(){
-		if(this.intId){ 
-			clearInterval(this.intId); 
-			this.intId = null; 
-		}
-		
-		this.paused = true;
-	},
-	
-	//utility
-	//list:Array of objects or an object > [ { gallery:'gall1', autoplay:true, delay:6 } ]
-	//to permanently define autoplay options for any gallery 
-	setAutoPlay:function(list){
-		var l = (typeOf(list) == 'object') ? [list] : list;
-		l.each(function(item){
-			var g = this.getGallery(item.gallery);
-			if(!g){ return; }
-			var a = (item.autoplay == true) ? item.autoplay : false;
-			var d = (item.delay && a) ? item.delay : this.options.autoPlayDelay;
-			g.setOptions({ autoplay:a, autoplay_delay:d }).refresh();
-		},this);
-	},
-
-
-	//utility	
-	//{href:'file1.jpg',size:'width:900,height:100', title:'text'}
-	//show a file on the fly without gallery functionalities
-	openWithFile:function(file, options){
-		if(!this.activated){ this.prepare(); }
-	
-		if(options){
-			this.refreshDisplay(options,true);//set custom options
-		}
-		
-		var g = new MilkboxGallery([file],{ remove_title:this.options.removeTitle });
-		this.open(g,0);
-	},
-	
-	getPreloads:function(){
-		var items = this.currentGallery.items;
-		var index = this.currentIndex;
-		if(items.length == 1) return null;
-		
-		var next = (index != items.length-1) ? items[index+1] : items[0];
-		var prev = (index != 0) ? items[index-1] : items[items.length-1];
-		var preloads = (prev == next) ? [prev] : [prev,next]; //if gallery.length == 2, then prev == next
-		return preloads;					
-	},
-	
-	//LOADING
-	loadFile:function(fileObj,preloads){
-
-		this.fileReady = false;
-		this.display.clear_content();
-		this.display.hide_bottom();
-		
-		if(this.checkFileType(fileObj,'swf')){
-			this.loadSwf(fileObj);
-		} else if (this.checkFileType(fileObj,'html')){
-			this.loadHtml(fileObj);
-		} else {//filetype:image
-			this.loadImage(fileObj);
-		}
-		
-		if(!this.checkFileType(fileObj,'swf')) this.startLoadingCheck();
-		if(preloads){ this.preloadFiles(preloads); }
-	},
-	
-	//to prevent the loader to show if the file is cached
-	startLoadingCheck:function(){
-		var t = 0;
-		if (!this.loadCheckerId) {
-		  this.loadCheckerId = (function(){
-			 t+=1;
-			 if(t > 5){
-				if (this.loadCheckerId) {
-				  // only show the loader when the timer has not been cleared yet!
-				  this.display.show_loader();
-				}
-				this.stopLoadingCheck();
-			 }
-		  }).periodical(100,this);
-		}//end if
-	},
-
-	stopLoadingCheck:function(){
-		clearInterval(this.loadCheckerId);
-	},
-	
-	preloadFiles:function(preloads){
-		preloads.each(function(fileObj,index){
-			if(!this.checkFileType(fileObj,"swf") && !this.checkFileType(fileObj,"html")){ 
-				this.preloadImage(fileObj.href); 
-			}
-		},this);
-	},
-	
-	preloadImage:function(file){
-		if(!this.loadedImages.contains(file)){
-			var imageAsset = new Asset.image(file, { 
-				onLoad:function(){
-					this.loadedImages.push(file);
-				}.bind(this)
-			});
-		}
-	},
-
-	loadImage:function(fileObj){
-		var file = fileObj.href;
-		var imageAsset = new Asset.image(file, { 
-			onLoad:function(img){
-				if(!this.loadedImages.contains(file)){ this.loadedImages.push(file); };//see next/prev events
-				this.loadComplete(img,fileObj.caption);
-			}.bind(this)
-		});
-	},
-
-	loadSwf:function(fileObj){
-		var swfObj = new Swiff(fileObj.href,{
-			width:fileObj.size.width,
-			height:fileObj.size.height,
-			vars:fileObj.vars,
-			params:{ wMode:'opaque', swLiveConnect:'false' }
-		});
-		
-		this.loadComplete(document.id(swfObj),fileObj.caption);
-	},
-
-	loadHtml:function(fileObj){
-		
-		var query = (fileObj.vars ? '?' + Object.toQueryString(fileObj.vars) : '');
-		var extras = (fileObj.extras ? fileObj.extras : '');
-		
-		var iFrame = new Element('iframe',{
-			'src':fileObj.href+query,
-			'frameborder':0,//for IE...
-			styles:{ 
-				'border':'none'
-			}
-		});
-
-		if(fileObj.size){
-			iFrame.set({
-				'width':fileObj.size.width,
-				'height':fileObj.size.height
-			});
-		}
-		
-		this.loadComplete(iFrame,fileObj.caption);
-	},//loadHtml
-
-
-	//LOAD COMPLETE ********//
-	loadComplete:function(file,caption){
-		
-		if(this.closed) return;//if an onload event were still running
-		
-		this.fileReady = true;//the file is loaded and ready to be showed (see next_prev_aux())
-		this.stopLoadingCheck();
-		this.currentFile = file;
-		var timer;
-		timer = (function(){
-			if(this.display.ready){
-				if (this.currentGallery.items != null) {
-					this.display.show_file(file,caption,this.currentIndex+1,this.currentGallery.items.length);
-				}
-				clearInterval(timer);
-			}//end if
-		}).periodical(100,this);
-		
-		this.fireEvent('fileReady');
-	},//end loadComplete
-
-	checkFileType:function(file,type){
-		var href = (typeOf(file) != 'string') ? file.href : file;
-		var splitted = href.split('?')[0];
-		var regexp = new RegExp("\.("+type+")$","i");
-		var test = splitted.test(regexp);
-		
-		if(!test && type=="html"){
-			test = splitted.test(/\/\d+$/);
-		}
-		
-		return test;
-	},
-
-	//GALLERIES
-	getPageGalleries:function(){
-		var names = [];
-		var links = $$('a[data-milkbox]');
-		
-		//check names
-		links.each(function(link){
-			var name = link.get('data-milkbox');
-			if(name == 'single'){
-				this.galleries.push(new MilkboxGallery(link,{name:'single'+this.singlePageLinkId++, remove_title:this.options.removeTitle }));
-			} else if(!names.contains(name)){
-				names.push(name);
-			}
-		},this);
-				
-		names.each(function(name){
-			this.galleries.push(new MilkboxGallery($$('a[data-milkbox='+name+']'),{ name:name, remove_title:this.options.removeTitle }));
-		},this);
-		
-		//set default autoplay // override with setAutoPlay
-		if(this.options.autoPlay){
-			this.galleries.each(function(g){ 
-				g.setOptions({autoplay:this.options.autoPlay,autoplay_delay:this.options.autoPlayDelay});
-				g.refresh();
-			}.bind(this));
-		}
-		
-	},//getPageGalleries
-
-	reloadPageGalleries:function(){		
-		//reload page galleries
-		this.removePageGalleryEvents();
-
-		this.galleries = this.galleries.filter(function(gallery){
-			if(!gallery.external) gallery.clear();
-			return gallery.external; 
-		});
-		
-		this.getPageGalleries();
-		this.addPageGalleriesEvents();
-		
-		if(!this.activated){ this.prepare(true); }
-	},//end reloadPageGalleries
-
-	//list: optional. Can be a single string/object or an array of strings/objects
-	resetExternalGalleries:function(list){
-		this.galleries = this.galleries.filter(function(gallery){
-			if(gallery.external) gallery.clear();
-			return !gallery.external;
-		});
-
-		if(!list) return;
-		var array = (typeOf(list) == 'array') ? list : [list];
-		array.each(function(data){ this.addGalleries(data); }, this);
-	},
-
-	//utility
-	addGalleries:function(data){
-		if(!this.activated){ this.prepare(true); }
-		if (typeOf(data) == 'string' && data.split('?')[0].test(/\.(xml)$/i)) {
-			this.loadXml(data);
-		} else {//array or object
-			this.setObjectGalleries(data);
-		}
-		if(!this.activated){ this.prepare(true); }
-	},
-	
-	loadXml:function(xmlfile){
-		var r = new Request({
-			method:'get',
-			autoCancel:true,
-			url:xmlfile,
-			onRequest:function(){
-				//placeholder
-			}.bind(this),
-			onSuccess:function(text,xml){
-				var t = text.replace(/(<a.+)\/>/gi,"$1></a>");
-				this.setXmlGalleries(new Element('div',{ html:t }));
-			}.bind(this),
-			onFailure:function(transport){ alert('Milkbox :: loadXml: XML file path error or local Ajax test: please test xml galleries on-line'); }
-		}).send();
-	},
-	
-	setXmlGalleries:function(container){
-		var c = container;
-		var xml_galleries = c.getElements('.gallery');
-		var links;
-		var aplist = [];
-		xml_galleries.each(function(xml_gallery,i){
-						
-			var options = { 
-				name:xml_gallery.getProperty('name'), 
-				autoplay:Boolean(xml_gallery.getProperty('autoplay')),
-				autoplay_delay:Number(xml_gallery.getProperty('autoplay_delay'))
-			}
-			
-			var links = xml_gallery.getChildren('a').map(function(tag){ 
-				return { href:tag.href, size:tag.get('data-milkbox-size'), title:tag.get('title') }
-			},this);
-			
-			this.galleries.push(new MilkboxGallery(links,options));
-		},this);
-			
-		this.fireEvent('xmlGalleries');
-	},//end setXmlGalleries
-	
-	//[{ name:'gall1', autoplay:true, autoplay_delay:7, files:[{href:'file1.jpg',size:'width:900,height:100', title:'text'},{href:'file2.html',size:'w:800,h:200', title:'text'}] },{...},{...}]	
-	setObjectGalleries:function(data){
-		var array = (typeOf(data) == 'array') ? data : [data];
-		array.each(function(newobj){
-			var options = {
-				name:newobj.name, 
-				autoplay:newobj.autoplay,
-				autoplay_delay:newobj.autoplay_delay
-			}			
-			this.galleries.push(new MilkboxGallery(newobj.files,options));
-		},this);
-	},
-	
-	//utility
-	getGallery:function(name){
-		var g = this.galleries.filter(function(gallery){ return gallery.name == name; },this);
-		return g[0] || null;
-	},
-	
-	//HTML
-	prepareHTML:function(){
-		this.display = new MilkboxDisplay({
-			initialWidth:this.options.initialWidth,
-			initialHeight:this.options.initialHeight,
-			overlayOpacity:this.options.overlayOpacity,
-			marginTop:this.options.marginTop,
-			fileboxBorderWidth:this.options.fileboxBorderWidth,
-			fileboxBorderColor:this.options.fileboxBorderColor,
-			fileboxPadding:this.options.fileboxPadding,
-			resizeDuration:this.options.resizeDuration,
-			resizeTransition:this.options.resizeTransition,
-			centered:this.options.centered,
-			autoSize:this.options.autoSize,
-			autoSizeMaxHeight:this.options.autoSizeMaxHeight,
-			imageOfText:this.options.imageOfText,
-      zIndex:this.options.zIndex
-		});
-	},
-	
-	refreshDisplay:function(options,keepBackup){
-		if(!this.activated) return;
-	
-		var options_bkup = this.display.options;//save original options
-		var new_options = Object.merge({},options_bkup,options);	
-		if(this.display){ this.display.clear() }
-		this.display = new MilkboxDisplay(new_options);
-		this.addDisplayEvents();
-		
-		if(keepBackup){
-			this.options_bkup = options_bkup;//restored in close();
-		} else {
-			this.options_bkup = null;
-		}
-	},
-
-	checkFormElements:function(){
-		this.formElements = $$('select, textarea');
-		if(this.formElements.length == 0) return;
-
-		this.formElements = this.formElements.filter(function(elem){   
-      var vis = elem.getStyle('visibility');    
-      var dis = elem.getStyle('display');     
-      return (dis !== 'none' && vis !== 'hidden');     
-    }).map(function(elem){
-			elem.store('visibility',elem.getStyle('visibility'));
-			elem.store('display',elem.getStyle('display'));
-			return elem;
-		});
-	},
-	
-	hideFormElements:function(){
-		if(this.formElements.length == 0) return;
-		this.formElements.each(function(elem){ elem.setStyle('display','none'); });
-	},
-	
-	showFormElements:function(){
-		if(this.formElements.length == 0) return;
-		this.formElements.each(function(elem){
-			elem.setStyle('visibility',elem.retrieve('visibility'));
-			elem.setStyle('display',elem.retrieve('display'));
-		})
-	},
-	
-	//EVENTS
-	addPageGalleriesEvents:function(){
-		var pageGalleries = this.galleries.filter(function(gallery){ return !gallery.external });
-		pageGalleries.each(function(gallery){
-			gallery.items.each(function(item){
-				item.element.addEvent('click',function(e){
-					e.preventDefault();
-					this.open(gallery.name,gallery.get_index_of(item));
-				}.bind(this));
-			},this);
-		},this);
-	},
-	
-	removePageGalleryEvents:function(){
-		var pageGalleries = this.galleries.filter(function(gallery){ return !gallery.external });
-		pageGalleries.each(function(gallery){
-			gallery.items.each(function(item){
-				item.element.removeEvents('click');
-			});
-		});
-	},
-	
-	addDisplayEvents:function(){
-		this.display.addEvent('nextClick',function(){
-			this.navAux(true,'next');
-		}.bind(this));
-		
-		this.display.addEvent('prevClick',function(){
-			this.navAux(true,'prev');
-		}.bind(this));
-		
-		this.display.addEvent('playPauseClick',function(){
-			if(this.paused){
-				this.startAutoPlay();
-			} else {
-				this.pauseAutoPlay();
-			}
-			this.display.set_paused(this.paused);
-		}.bind(this));
-		
-		this.display.addEvent('disappear',function(){
-			if(this.options_bkup){ this.refreshDisplay(this.options_bkup); }
-			this.close(false);
-		}.bind(this));
-		
-		this.display.addEvent('resizeComplete',function(){
-			this.busy = false;//see navAux
-		}.bind(this));
-	},
-
-	prepareEventListeners:function(){
-		
-		this.addPageGalleriesEvents();
-		this.addDisplayEvents();
-		
-		//reset overlay height and position onResize
-		window.addEvent('resize',function(){
-			if(this.display.ready){ this.display.resetOverlaySize(); }
-		}.bind(this));
-		
-		//keyboard next/prev/close
-		window.document.addEvent('keydown',function(e){
-			if(this.busy == true || this.closed){ return; }
-			if(e.key == 'right' || e.key == 'left' || e.key == 'space'){ e.preventDefault(); }
-
-			if(this.display.mode != 'single'){
-				if(e.key == 'right' || e.key == 'space'){ this.navAux(e,'next'); }
-				else if(e.key == 'left'){ this.navAux(e,'prev'); }
-			}
-			
-			if(e.key == 'esc'){ this.display.disappear(); }
-		}.bind(this));
-	},
-
-	navAux:function(e,direction){
-				
-		if(e){//called from a button/key event
-			this.pauseAutoPlay();
-		} else {//called from autoplay
-			if(this.busy || !this.fileReady){ return; }//prevent autoplay()
-		}
-
-		this.busy = true; //for keyboard and autoplay
-		
-		var i, _i;
-
-		if(direction == "next"){
-			i= (this.currentIndex != this.currentGallery.items.length-1) ? this.currentIndex += 1 : this.currentIndex = 0;
-			_i= (this.currentIndex != this.currentGallery.items.length-1) ? this.currentIndex + 1 : 0;
-		} else {
-			i= (this.currentIndex != 0) ? this.currentIndex -= 1 : this.currentIndex = this.currentGallery.items.length-1;
-			_i= (this.currentIndex != 0) ? this.currentIndex - 1 : this.currentGallery.items.length-1;		
-		};
-
-		this.loadFile(this.currentGallery.get_item(i),[this.currentGallery.get_item(_i)]);
-	}
-
-
-});//END MILKBOX CLASS CODE
-
-})();//END SINGLETON CODE
-
-
-
-
-
-
-var MilkboxDisplay= new Class({
-
-	Implements:[Options,Events],
-	
-	options:{
-		initialWidth:100,
-		initialHeight:100,
-		overlayOpacity:1,
-		marginTop:0,
-		fileboxBorderWidth:'0px',
-		fileboxBorderColor:'#000000',
-		fileboxPadding:'0px',
-		resizeDuration:.5,
-		resizeTransition:'sine:in:out',
-		centered:false,
-		autoSize:false,
-		autoSizeMaxHeight:0,
-		imageOfText:'of',
-		onNextClick:function(){},
-		onPrevClick:function(){},
-		onPlayPause:function(){},
-		onDisappear:function(){},
-		onResizeComplete:function(){}
-	},
-	
-	initialize: function(options){
-		this.setOptions(options);
-		
-		this.overlay;
-		this.mainbox;
-		this.filebox;
-		this.bottom;
-		this.controls;
-		this.caption;
-		this.close;
-		this.next;
-		this.prev;
-		this.playpause;
-		this.paused = false;
-		this.count;
-		
-		this.mode = 'standard';
-		this.ready = false;//after overlay and mainbox become visible == true
-		
-		this.overlay_show_fx;
-		this.overlay_hide_fx;
-
-		this.mainbox_show_fx;
-		this.mainbox_hide_fx;
-		this.mainbox_resize_fx;
-		
-		this.current_file = null;
-
-		this.build_html();
-		this.prepare_effects();
-		this.prepare_events();
-
-	},//end init
-	
-	build_html:function(){
-		this.overlay = new Element('div', { 
-			'id':'mbox-overlay',
-			'styles':{
-				'visibility':'visible',
-				'position':'fixed',
-				'display':'none',
-				'left':0,
-				'width':'100%',
-				'opacity':0,
-				'height':0,
-				'overflow':'hidden',
-				'margin':0,
-				'padding':0
-			}
-		}).inject(document.id(document.body));
-
-		this.mainbox = new Element('div', {
-			'id':'mbox-mainbox',
-			'styles': {
-				'position':(this.options.centered) ? 'fixed' : 'absolute',
-				'overflow':'hidden',
-				'display':'none',
-				'z-index':this.options.zIndex,//50001,//overlay z-index (see css) + 1
-				'width':this.options.initialWidth,
-				'height':this.options.initialHeight,
-				'opacity':0,
-				'margin':0,
-				'left':'50%',
-				'marginLeft':-(this.options.initialWidth/2),
-				'marginTop':(this.options.centered) ? -(this.options.initialHeight/2) : '',
-				'top':(this.options.centered) ? '50%' : ''
-			}
-		}).inject(document.id(document.body));
-		
-		this.filebox = new Element('div',{
-			'id':'mbox-filebox',
-			'styles':{
-				'border-style':'solid',
-				'border-width':this.options.fileboxBorderWidth,
-				'border-color':this.options.fileboxBorderColor,
-				'padding':this.options.fileboxPadding,
-				'opacity':0
-			}
-		}).inject(this.mainbox);
-		
-		this.bottom = new Element('div#mbox-bottom').setStyle('visibility','hidden').inject(this.mainbox);
-		this.controls = new Element('div#mbox-controls');
-		this.caption = new Element('div#mbox-caption',{'html':'test'}).setStyle('display','none');
-
-		this.bottom.adopt(new Element('div.mbox-reset'),this.controls, this.caption, new Element('div.mbox-reset'));
-		
-		this.close = new Element('div#mbox-close');
-		this.next = new Element('div#mbox-next');
-		this.prev = new Element('div#mbox-prev');
-		this.playpause = new Element('div#mbox-playpause');
-		this.count = new Element('div#mbox-count');
-		
-		$$(this.next, this.prev, this.close, this.playpause).setStyles({
-			'outline':'none',
-			'cursor':'pointer'
-		});
-
-		this.controls.adopt(new Element('div.mbox-reset'), this.close, this.next, this.prev, this.playpause, new Element('div.mbox-reset'), this.count);
-	},
-	
-	prepare_effects:function(){
-		this.overlay_show_fx = new Fx.Tween(this.overlay,{ 
-				duration:'short',
-				link:'cancel',
-				property:'opacity',
-				onStart:function(){
-					this.element.setStyles({
-						'top':-window.getScroll().y,
-						'height':window.getScrollSize().y+window.getScroll().y,
-						'display':'block'
-					});
-				},
-				onComplete:function(){
-					this.mainbox_show_fx.start(1);
-				}.bind(this)
-		});
-
-		this.overlay_hide_fx = new Fx.Tween(this.overlay,{ 
-				duration:'short',
-				link:'cancel',
-				property:'opacity',
-				onStart:function(){},
-				onComplete:function(){
-					this.overlay.setStyle('display','none');
-					this.fireEvent('disappear');
-				}.bind(this)
-		});
-		
-		this.mainbox_show_fx = new Fx.Tween(this.mainbox,{ 
-				duration:'short',
-				link:'cancel',
-				property:'opacity',
-				onStart:function(){
-					this.mainbox.setStyle('display','block');
-				}.bind(this),
-				onComplete:function(){
-					this.ready = true;
-				}.bind(this)
-		});
-
-		this.mainbox_hide_fx = new Fx.Tween(this.mainbox,{ 
-				duration:'short',
-				link:'cancel',
-				property:'opacity',
-				onStart:function(){
-					this.ready = false;
-				}.bind(this),
-				onComplete:function(){
-					this.overlay.setStyle('display','none');
-				}.bind(this)
-		});
-		
-		
-		this.mainbox_resize_fx = new Fx.Morph(this.mainbox,{ 
-				duration:this.options.resizeDuration*1000,
-				transition:this.options.resizeTransition,
-				link:'cancel',
-				onStart:function(){
-					this.filebox.setStyle('opacity',0)
-				}.bind(this),
-				onComplete:function(){
-					this.show_bottom();
-					this.filebox.setStyle('height',this.current_file.height+'px');
-					this.filebox.grab(this.current_file).tween('opacity',1);
-					this.fireEvent('resizeComplete');
-				}.bind(this)
-		});
-		
-		this.filebox.set('tween',{ duration:'short', link:'chain' });
-	},//end prepare_effects
-	
-	prepare_events:function(){
-		$$(this.overlay,this.close).addEvent('click', function(){ this.disappear(); }.bind(this));
-		this.prev.addEvent('click',function(){ this.fireEvent('prevClick') }.bind(this));
-		this.next.addEvent('click',function(){ this.fireEvent('nextClick') }.bind(this));
-		this.playpause.addEvent('click',function(){ this.fireEvent('playPauseClick') }.bind(this) );
-	},
-
-	show_file:function(file,caption,index,length){
-
-		this.hide_loader();
-		
-		if(file.match && file.match('img') && (this.options.autoSize || this.options.centered)){
-			var file = this.get_resized_image(file);
-		};
-
-		var file_size = { w:file.width.toInt(), h:file.height.toInt() };
-		if(!file_size.w || !file_size.h){ alert('Milkbox error: you must pass size values if the file is swf or html or a free file (openWithFile)'); return; }//data-milkbox-size not passed
-		file_size = Object.map(file_size,function(value){ return value.toInt(); });
-		
-		this.caption.innerHTML = (caption) ? caption : '';
-		this.update_count(index,length);
-		
-		var filebox_addsize = this.filebox.getStyle('border-width').toInt()*2+this.filebox.getStyle('padding').toInt()*2;
-				
-		var final_w = file_size.w+filebox_addsize;
-		
-		//so now I can predict the caption height
-		var caption_adds = this.caption.getStyles('paddingRight','marginRight');
-		this.caption.setStyle('width',final_w-caption_adds.paddingRight.toInt()-caption_adds.marginRight.toInt() - 2);
-		$$(this.bottom,this.controls).setStyle('height',Math.max(this.caption.getDimensions().height,this.controls.getComputedSize().totalHeight));
-		var mainbox_size = this.mainbox.getComputedSize();
-
-		var final_h = file_size.h+filebox_addsize+this.bottom.getComputedSize().totalHeight;
-		
-		var target_size = { 
-			w:final_w,
-			h:final_h,
-			total_w:final_w+mainbox_size.totalWidth-mainbox_size.width,
-			total_h:final_h+mainbox_size.totalHeight-mainbox_size.height
-		}
-		
-		this.current_file = file;
-		this.resize_to(target_size);
-	},//show_file
-
-	//image:<img>, maxsize:{ w,h }
-	get_resized_image:function(image){
-
-		var max_size;
-		var ratio;
-		var check;
-		
-		var i_size = { w:image.get('width').toInt(), h:image.get('height').toInt() };
-		
-		//cut out some pixels to make it better
-		var w_size = window.getSize();
-		var max_size = { 
-			w:w_size.x-60, 
-			h:w_size.y-68-this.options.marginTop*2
-		};
-
-		var max_dim = Math.max( max_size.h, max_size.w );
-
-		if(max_dim == max_size.w){
-			ratio = max_dim/i_size.w;
-			check = 'h';
-		} else {
-			ratio = max_dim/i_size.h;
-			check = 'w';
-		}
-		
-		ratio = (ratio <= 1) ? ratio : 1;
-		
-		i_size = Object.map(i_size,function(value){ return Math.floor(value*ratio); });
-		
-		ratio = (max_size[check]/i_size[check] <= 1) ? max_size[check]/i_size[check] : 1;
-		i_size = Object.map(i_size,function(value){ return Math.floor(value*ratio); });
-		
-		if(this.options.autoSizeMaxHeight > 0){
-			ratio = (this.options.autoSizeMaxHeight/i_size.height < 1) ? this.options.autoSizeMaxHeight/i_size.height : 1;
-			i_size = Object.map(i_size,function(value){ return Math.floor(value*ratio); });
-		}
-
-		image.set({ 'width':i_size.w, 'height':i_size.h });
-		
-		return image;
-	},//get_resized_image
-
-	resize_to:function(target_size){
-		this.mainbox_resize_fx.start({
-			'width':target_size.w,
-			'height':target_size.h,
-			'marginLeft':-(target_size.total_w/2).round(),
-			'marginTop':(this.options.centered) ? -(target_size.total_h/2).round() : ''
-		});
-	},
-	
-	show_loader:function(){
-		this.mainbox.addClass('mbox-loading');
-	},
-	
-	hide_loader:function(){
-		this.mainbox.removeClass('mbox-loading');
-	},
-
-	clear_content:function(){
-		this.filebox.empty();
-		this.caption.empty();
-		this.count.empty();
-		$$(this.bottom,this.controls).setStyle('height','');
-	},
-	
-	hide_bottom:function(){
-		this.caption.setStyle('display','none');
-		this.bottom.setStyle('visibility','hidden');
-	},
-
-	show_bottom:function(){
-		this.caption.setStyle('display','block');
-		this.bottom.setStyle('visibility','visible');
-	},
-	
-	appear:function(){
-		if(!this.options.centered){ this.mainbox.setStyle('top',window.getScroll().y+this.options.marginTop); }
-		this.overlay_show_fx.start(this.options.overlayOpacity);
-	},
-	
-	disappear:function(){
-		this.cancel_effects();
-		
-		this.current_file = null;
-		this.ready = false;
-		this.mode = 'standard';
-
-		$$(this.prev, this.next, this.playpause, this.count).setStyle('display','none');
-		this.playpause.setStyle('backgroundPosition','0 0');
-
-		this.count.empty();
-		this.caption.setStyle('display','none').empty();
-		this.bottom.setStyle('visibility','hidden');
-		
-		//TODO anche opacity a 0 se si usa un tween per il file
-		this.filebox.setStyle('height','').empty();
-		
-		this.mainbox.setStyles({
-			'opacity':0,
-			'display':'none',
-			'width':this.options.initialWidth,
-			'height':this.options.initialHeight,
-			'marginLeft':-(this.options.initialWidth/2),
-			'marginTop':(this.options.centered) ? -(this.options.initialHeight/2) : '',
-			'top':(this.options.centered) ? '50%' : ''
-		});
-		
-		this.filebox.setStyle('opacity',0);
-		
-		this.overlay_hide_fx.start(0);
-		
-		//this.fireEvent('disappear');
-	},//end disappear
-	
-	cancel_effects:function(){
-		[this.mainbox_resize_fx,
-		this.mainbox_hide_fx,
-		this.mainbox_show_fx,
-		this.overlay_hide_fx,
-		this.overlay_show_fx
-		].each(function(fx){ fx.cancel(); });
-	},
-	
-	set_mode:function(gallery_type){
- 		
-		this.mode = gallery_type;
-		var close_w = this.close.getComputedSize().width;
-		var prev_w = this.prev.getComputedSize().width;
-		var next_w = this.next.getComputedSize().width;
-		var playpause_w = this.playpause.getComputedSize().width;
-		var offset = this.mainbox.getStyle('border-right-width').toInt();//for design purposes
-		
-		switch(gallery_type){
-			case 'autoplay':
-				$$(this.playpause,this.close,this.next,this.prev,this.count).setStyle('display','block');
-				this.controls.setStyle('width',close_w+prev_w+next_w+playpause_w+offset);
-				break;
-			case 'single':
-				$$(this.playpause,this.next,this.prev,this.count).setStyle('display','none');
-				this.controls.setStyle('width',close_w+offset);
-				break;
-			case 'standard':
-				$$(this.close,this.next,this.prev,this.count).setStyle('display','block');
-				this.playpause.setStyle('display','none');
-				this.controls.setStyle('width',close_w+prev_w+next_w+offset);
-				break;
-			default:
-				return;
-		}
-	
-		this.caption.setStyle('margin-right',this.controls.getComputedSize().totalWidth);
-	},//end set_mode
-	
-	set_paused:function(paused){
-		this.paused = paused;
-		var pos = (this.paused) ? '0 -66px' : '';
-		this.playpause.setStyle('background-position',pos);
-	},
-	
-	update_count:function(index,length){
-		this.count.set('text',index+' '+this.options.imageOfText+' '+length);
-	},
-
-	resetOverlaySize:function(){
-		if(this.overlay.getStyle('opacity') == 0){ return; };//resize only if visible
-		var h = window.getScrollSize().y+window.getScroll().y;
-		this.overlay.setStyles({ 'height':h, 'top':-window.getScroll().y });
-	},
-	
-	clear:function(){
-		this.overlay.destroy();
-		this.mainbox.destroy();
-	}
-	
-});//END
-
-
-
-
-
-//Class: MilkboxGallery
-//args: source,options 
-//	*source: element, elements, array
-//	*options: name, autoplay, autoplay_delay
-
-var MilkboxGallery = new Class({
-
-	Implements:[Options,Events],
-
-	options:{//set all the options here
-		name:null,
-		autoplay:null,
-		autoplay_delay:null,
-		remove_title:true
-	},
-
-	initialize:function(source,options){
-		
-		this.setOptions(options);
-		
-		this.source = source;
-		this.external = false;
-		this.items = null;
-		this.name = this.options.name;
-		this.type = null;//'autoplay','standard','single'
-		this.prepare_gallery();
-		this.prepare_elements();
-	},
-
-	prepare_gallery:function(){
-		switch(typeOf(this.source)){
-			case 'element'://single
-				if(this.check_extension(this.source.href)){ this.items = [this.source]; }
-				else{ alert('Wrong file extension: '+this.source.href); }
-				break;
-			case 'elements'://html
-				this.items = this.source.filter(function(link){ return this.check_extension(link.href); },this);
-				break;
-			case 'array'://xml, array
-				this.items = this.source.filter(function(link){ return this.check_extension(link.href); },this);
-				this.external = true;
-				break;
-			default:
-				return;
-		}
-		
-		if(this.items.length == 0){ alert('Warning: gallery '+this.name+' is empty'); }
-	},
-	
-	//turns everything into an object
-	prepare_elements:function(){
-		this.items = this.items.map(function(item){
-			var splitted_url = item.href.split('?');
-			var output = {};
-			output.element = (typeOf(item) == 'element') ? item : null;
-			output.href = splitted_url[0];
-			output.vars = (splitted_url[1]) ? splitted_url[1].parseQueryString() : null;
-			output.size = null;
-			output.caption = (output.element) ? output.element.get('title') : item.title;
-			if(this.options.remove_title && output.element){ output.element.removeProperty('title') }
-			
-			var size_string = (output.element) ? output.element.get('data-milkbox-size') : item.size;
-			if(size_string){ output.size = Object.map(this.get_item_props(size_string),function(value,key){ return value.toInt(); }); }
-			
-			var extras = (output.element) ? output.element.get('data-milkbox-extras') : item.extras;
-			output.extras = (extras) ? extras : '';
-			
-			return output;
-		},this);
-		
-		if(this.items.length == 0) return;
-		
-		this.type = (this.items.length == 1) ? 'single' : (this.options.autoplay) ? 'autoplay' : 'standard';
-	},
-	
-	check_extension:function(string){
-		var splitted, regular_file, dyn_url;
-		
-		splitted  = string.split('?')[0];
-		
-		regular_file = splitted.test(/\.(gif|jpg|jpeg|png|swf|html)$/i);
-		if(!regular_file){ dyn_url = splitted.test(/\/\d+$/); }
-		
-		var pass = (regular_file || dyn_url) ? true : false;
-		
-		return pass;
-	},
-	
-	get_index_of:function(item){
-		var index = (typeOf(item) == 'string') ? this.items.indexOf(this.items.filter(function(i){ return i.href === item; })[0]) : this.items.indexOf(item);
-		return this.items.indexOf(item);
-	},
-	
-	get_item:function(index){
-		return this.items[index];
-	},
-	
-	get_item_props:function(prop_string){
-		var props = {};
-		var s = prop_string.split(',').each(function(p,i){
-			var clean = p.trim().split(':');
-			props[clean[0].trim()] = clean[1].trim();
-		},this);
-		return props;
-	},
-	
-	refresh:function(){
-		this.type = (this.items.length == 1) ? 'single' : (this.options.autoplay) ? 'autoplay' : 'standard';
-	},
-	
-	clear:function(){
-		this.source = null;
-		this.items = null;
-	}
-
-});//end MilkboxGallery
-
-
-
-//Creating Milkbox instance: you can comment this code and instantiate Milkbox somewhere else instead.
-if( typeof __MILKBOX_NO_AUTOINIT__ == 'undefined' || __MILKBOX_NO_AUTOINIT__ == false)
-{
-  window.addEvent('domready', function(){ 
-    //milkbox = new Milkbox({overlayOpacity:1, fileboxBorderWidth:'10px', fileboxBorderColor:'#ff0000', fileboxPadding:'20px', centered:true});
-    milkbox = new Milkbox({ 
-      //autoPlay:true
-    });
-  });
-}
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/MootoolsFileManager/mootools-filemanager/LICENSE b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/MootoolsFileManager/mootools-filemanager/LICENSE
deleted file mode 100644
index 143adfe..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/MootoolsFileManager/mootools-filemanager/LICENSE
+++ /dev/null
@@ -1,24 +0,0 @@
-MooTools FileManager - MIT License

-

-Copyright (c) 2011 Christoph Pojer

-

-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.
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/MootoolsFileManager/mootools-filemanager/Language/Language.br.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/MootoolsFileManager/mootools-filemanager/Language/Language.br.js
deleted file mode 100644
index f8bd2ff..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/MootoolsFileManager/mootools-filemanager/Language/Language.br.js
+++ /dev/null
@@ -1,125 +0,0 @@
-/*

-Script: Language.br.js

-	MooTools FileManager - Language Strings in Brazilian Portuguese

-

-Translation:

-	[Fabiana Pires](http://twitter.com/nervosinha)

-*/

-

-FileManager.Language.br = {

-	more: 'Detalhes',

-	width: 'Largura:',

-	height: 'Altura:',

-

-	ok: 'Ok',

-	open: 'Selecione o arquivo',

-	upload: 'Upload',

-	create: 'Criar pasta',

-	createdir: 'Por favor especifique o nome da pasta:',

-	cancel: 'Cancelar',

-	error: 'Erro',

-

-	information: 'Informação',

-	type: 'Tipo:',

-	size: 'Tamanho:',

-	dir: 'Caminho:',

-	modified: 'Última modificação:',

-	preview: 'Pré-visualização',

-	close: 'Fechar',

-	destroy: 'Apagar',

-	destroyfile: 'Tem certeza que deseja apagar este arquivo?',

-

-	rename: 'Renomear',

-	renamefile: 'Por favor especifique o novo nome do arquivo:',

-	rn_mv_cp: 'Rename/Move/Copy',

-

-	download: 'Download',

-	nopreview: '<i>Pré-visualização indisponível</i>',

-

-	title: 'Título:',

-	artist: 'Artista:',

-	album: 'Album:',

-	length: 'Tamanho:',

-	bitrate: 'Bitrate:',

-

-	deselect: 'Desfazer',

-

-	nodestroy: 'Apagar arquivos está desabilitado neste servidor.',

-

-	toggle_side_boxes: 'Thumbnail view',

-	toggle_side_list: 'List view',

-	show_dir_thumb_gallery: 'Show thumbnails of the files in the preview pane',

-	drag_n_drop: 'Drag & drop has been enabled for this directory',

-	drag_n_drop_disabled: 'Drag & drop has been temporarily disabled for this directory',

-	goto_page: 'Go to page',

-

-	'backend.disabled': 'Não é permitido enviar arquivos neste servidor.',

-	'backend.authorized': 'Você não está autenticado para enviar arquivos neste servidor.',

-	'backend.path': 'A pasta especificada não existe. Por favor contate o administrador do site.',

-	'backend.exists': 'A pasta especificada já existe. Por favor contate o administrador do site.',

-	'backend.mime': 'O tipo de arquivo especificado não é permitido.',

-	'backend.extension': 'O arquivo enviado é de tipo desconhecido ou proibido.',

-	'backend.size': 'O tamanho do arquivo enviado é muito grande para ser processado neste servidor. Por favor, envie um arquivo menor.',

-	'backend.partial': 'O arquivo enviado foi corrompido, por favor envie o arquivo novamente.',

-	'backend.nofile': 'Não existe arquivo especificado para ser enviado.',

-	'backend.default': 'Erro no envio do arquivo.',

-	'backend.path_not_writable': 'You do not have write/upload permissions for this directory.',

-	'backend.filename_maybe_too_large': 'The filename/path is probably too long for the server filesystem. Please retry with a shorter file name.',

-	'backend.fmt_not_allowed': 'You are not allowed to upload this file format/name.',

-	'backend.read_error': 'Cannot read / download the specified file.',

-	'backend.unidentified_error': 'An unindentified error occurred while communicating with the backend (web server).',

-

-	'backend.nonewfile': 'A new name for the file to be moved / copied is missing.',

-	'backend.corrupt_img': 'This file is a not a image or a corrupt file: ', // path

-	'backend.resize_inerr': 'This file could not be resized due to an internal error.',

-	'backend.copy_failed': 'An error occurred while copying the file / directory: ', // oldlocalpath : newlocalpath

-	'backend.delete_cache_entries_failed': 'An error occurred when attempting to delete the item cache (thumbnails, metadata)',

-	'backend.mkdir_failed': 'An error occurred when attempting to create the directory: ', // path

-	'backend.move_failed': 'An error occurred while moving / renaming the file / directory: ', // oldlocalpath : newlocalpath

-	'backend.path_tampering': 'Path tampering detected.',

-	'backend.realpath_failed': 'Cannot translate the given file specification to a valid storage location: ', // $path

-	'backend.unlink_failed': 'An error occurred when attempting to delete the file / directory: ',  // path

-

-	// Image.class.php:

-	'backend.process_nofile': 'The image processing unit did not receive a valid file location to work on.',

-	'backend.imagecreatetruecolor_failed': 'The image processing unit failed: GD imagecreatetruecolor() failed.',

-	'backend.imagealphablending_failed': 'The image processing unit failed: cannot perform the required image alpha blending.',

-	'backend.imageallocalpha50pctgrey_failed': 'The image processing unit failed: cannot allocate space for the alpha channel and the 50% background.',

-	'backend.imagecolorallocatealpha_failed': 'The image processing unit failed: cannot allocate space for the alpha channel for this color image.',

-	'backend.imagerotate_failed': 'The image processing unit failed: GD imagerotate() failed.',

-	'backend.imagecopyresampled_failed': 'The image processing unit failed: GD imagecopyresampled() failed. Image resolution: ', /* x * y */

-	'backend.imagecopy_failed': 'The image processing unit failed: GD imagecopy() failed.',

-	'backend.imageflip_failed': 'The image processing unit failed: cannot flip the image.',

-	'backend.imagejpeg_failed': 'The image processing unit failed: GD imagejpeg() failed.',

-	'backend.imagepng_failed': 'The image processing unit failed: GD imagepng() failed.',

-	'backend.imagegif_failed': 'The image processing unit failed: GD imagegif() failed.',

-	'backend.imagecreate_failed': 'The image processing unit failed: GD imagecreate() failed.',

-	'backend.cvt2truecolor_failed': 'conversion to True Color failed. Image resolution: ', /* x * y */

-	'backend.no_imageinfo': 'Corrupt image or not an image file at all.',

-	'backend.img_will_not_fit': 'Server error: image does not fit in available RAM; minimum required (estimate): ', /* XXX MBytes */

-	'backend.unsupported_imgfmt': 'unsupported image format: ',    /* jpeg/png/gif/... */

-

-	/* FU */

-	uploader: {

-		unknown: 'Erro desconhecido',

-		sizeLimitMin: 'Não é permitido anexar "<em>${name}</em>" (${size}), o tamanho mínimo para o arquivo é de <strong>${size_min}</strong>!',

-		sizeLimitMax: 'Não é permitido anexar "<em>${name}</em>" (${size}), o tamanho máximo para o arquivo é de <strong>${size_max}</strong>!',

-		mod_security: 'No response was given from the uploader, this may mean that "mod_security" is active on the server and one of the rules in mod_security has cancelled this request.  If you can not disable mod_security, you may need to use the NoFlash Uploader.'

-	},

-

-	flash: {

-		hidden: 'Para habilitar o uploader, desbloqueie a função em seu browser e recarregue a página (veja Adblock).',

-		disabled: 'Para habilitar o uploader, habilite o arquivo Flash e recarregue a página (veja Flashblock).',

-		flash: 'Para enviar arquivos é necessário instalar o <a href="http://www.adobe.com/shockwave/download/download.cgi?P1_Prod_Version=ShockwaveFlash">Adobe Flash Player</a>.'

-	},

-

-	resizeImages: 'Redimensionar imagens grandes ao enviar',

-

-	serialize: 'Save gallery',

-	gallery: {

-		text: 'Image caption',

-		save: 'Save',

-		remove: 'Remove from gallery',

-		drag: 'Drag items here to create a gallery...'

-	}

-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/MootoolsFileManager/mootools-filemanager/Language/Language.cs.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/MootoolsFileManager/mootools-filemanager/Language/Language.cs.js
deleted file mode 100644
index bb3b326..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/MootoolsFileManager/mootools-filemanager/Language/Language.cs.js
+++ /dev/null
@@ -1,125 +0,0 @@
-/*

-Script: Language.cs.js

-	MooTools FileManager - Language Strings in Czech

-

-Translation:

-	[Matěj Grabovský](http://mgrabovsky.is-game.com)

-*/

-

-FileManager.Language.cs = {

-	more: 'Podrobnosti',

-	width: 'Šířka:',

-	height: 'Výška:',

-

-	ok: 'Ok',

-	open: 'Vybrat soubor',

-	upload: 'Nahrát',

-	create: 'Vytvořit složku',

-	createdir: 'Prosím zadejte název složky:',

-	cancel: 'Storno',

-	error: 'Chyba',

-

-	information: 'Informace',

-	type: 'Typ:',

-	size: 'Velikost:',

-	dir: 'Cesta:',

-	modified: 'Naposledy změněno:',

-	preview: 'Náhled',

-	close: 'Zavřít',

-	destroy: 'Smazat',

-	destroyfile: 'Určitě chcete smazat tento soubor?',

-

-	rename: 'Přejmenovat',

-	renamefile: 'Prosím zadejte název nového souboru:',

-	rn_mv_cp: 'Rename/Move/Copy',

-

-	download: 'Stáhnout',

-	nopreview: '<i>Náhled není dostupný</i>',

-

-	title: 'Název:',

-	artist: 'Umělec:',

-	album: 'Album:',

-	length: 'Délka:',

-	bitrate: 'Přenosová rychlost:',

-

-	deselect: 'Odstranit z výběru',

-

-	nodestroy: 'Mazání souborů je na tomto serveru zakázáno.',

-

-	toggle_side_boxes: 'Thumbnail view',

-	toggle_side_list: 'List view',

-	show_dir_thumb_gallery: 'Show thumbnails of the files in the preview pane',

-	drag_n_drop: 'Drag & drop has been enabled for this directory',

-	drag_n_drop_disabled: 'Drag & drop has been temporarily disabled for this directory',

-	goto_page: 'Go to page',

-

-	'backend.disabled': 'Nahrávání souborů je na tomto serveru zakázáno.',

-	'backend.authorized': 'Nemáte právo nahrávat soubory.',

-	'backend.path': 'Specifikovaná složka pro nahrávání neexistuje. Prosím kontaktujte správce těchto stránek.',

-	'backend.exists': 'Specifikovaný soubor již existuje. Prosím kontaktujte správce těchto stránek.',

-	'backend.mime': 'Specifikovaný typ souboru není povolen.',

-	'backend.extension': 'Nahrávaný soubor má neznámou nebo zakázanou příponu.',

-	'backend.size': 'Velikost nahrávaného souboru je přílíš velká. Prosím nahrajte menší soubor.',

-	'backend.partial': 'Nahrávaný soubor byl nahrán jen zčásti. Prosím nahrajte ho znovu.',

-	'backend.nofile': 'Nebyl vybrán žádný soubor pro nahrání.',

-	'backend.default': 'Něco se nepovedlo při nahrávání souboru.',

-	'backend.path_not_writable': 'You do not have write/upload permissions for this directory.',

-	'backend.filename_maybe_too_large': 'The filename/path is probably too long for the server filesystem. Please retry with a shorter file name.',

-	'backend.fmt_not_allowed': 'You are not allowed to upload this file format/name.',

-	'backend.read_error': 'Cannot read / download the specified file.',

-	'backend.unidentified_error': 'An unindentified error occurred while communicating with the backend (web server).',

-

-	'backend.nonewfile': 'A new name for the file to be moved / copied is missing.',

-	'backend.corrupt_img': 'This file is a not a image or a corrupt file: ', // path

-	'backend.resize_inerr': 'This file could not be resized due to an internal error.',

-	'backend.copy_failed': 'An error occurred while copying the file / directory: ', // oldlocalpath : newlocalpath

-	'backend.delete_cache_entries_failed': 'An error occurred when attempting to delete the item cache (thumbnails, metadata)',

-	'backend.mkdir_failed': 'An error occurred when attempting to create the directory: ', // path

-	'backend.move_failed': 'An error occurred while moving / renaming the file / directory: ', // oldlocalpath : newlocalpath

-	'backend.path_tampering': 'Path tampering detected.',

-	'backend.realpath_failed': 'Cannot translate the given file specification to a valid storage location: ', // $path

-	'backend.unlink_failed': 'An error occurred when attempting to delete the file / directory: ',  // path

-

-	// Image.class.php:

-	'backend.process_nofile': 'The image processing unit did not receive a valid file location to work on.',

-	'backend.imagecreatetruecolor_failed': 'The image processing unit failed: GD imagecreatetruecolor() failed.',

-	'backend.imagealphablending_failed': 'The image processing unit failed: cannot perform the required image alpha blending.',

-	'backend.imageallocalpha50pctgrey_failed': 'The image processing unit failed: cannot allocate space for the alpha channel and the 50% background.',

-	'backend.imagecolorallocatealpha_failed': 'The image processing unit failed: cannot allocate space for the alpha channel for this color image.',

-	'backend.imagerotate_failed': 'The image processing unit failed: GD imagerotate() failed.',

-	'backend.imagecopyresampled_failed': 'The image processing unit failed: GD imagecopyresampled() failed. Image resolution: ', /* x * y */

-	'backend.imagecopy_failed': 'The image processing unit failed: GD imagecopy() failed.',

-	'backend.imageflip_failed': 'The image processing unit failed: cannot flip the image.',

-	'backend.imagejpeg_failed': 'The image processing unit failed: GD imagejpeg() failed.',

-	'backend.imagepng_failed': 'The image processing unit failed: GD imagepng() failed.',

-	'backend.imagegif_failed': 'The image processing unit failed: GD imagegif() failed.',

-	'backend.imagecreate_failed': 'The image processing unit failed: GD imagecreate() failed.',

-	'backend.cvt2truecolor_failed': 'conversion to True Color failed. Image resolution: ', /* x * y */

-	'backend.no_imageinfo': 'Corrupt image or not an image file at all.',

-	'backend.img_will_not_fit': 'Server error: image does not fit in available RAM; minimum required (estimate): ', /* XXX MBytes */

-	'backend.unsupported_imgfmt': 'unsupported image format: ',    /* jpeg/png/gif/... */

-

-	/* FU */

-	uploader: {

-		unknown: 'Neznámá chyba',

-		sizeLimitMin: 'Nelze přidat soubor „<em>${name}</em>“ (${size}), minimální povolená velikost souboru je <strong>${size_min}</strong>!',

-		sizeLimitMax: 'Nelze přidat soubor „<em>${name}</em>“ (${size}), maximální povolená velikost souboru je <strong>${size_max}</strong>!',

-		mod_security: 'No response was given from the uploader, this may mean that "mod_security" is active on the server and one of the rules in mod_security has cancelled this request.  If you can not disable mod_security, you may need to use the NoFlash Uploader.'

-	},

-

-	flash: {

-		hidden: null,

-		disabled: null,

-		flash: 'Pokud chcete nahrávat soubory, musíte mít nainstalovaný <a href="http://www.adobe.com/shockwave/download/download.cgi?P1_Prod_Version=ShockwaveFlash">Adobe Flash</a>'

-	},

-

-	resizeImages: 'Změnšit velké obrázky při nahrávání',

-

-	serialize: 'Save gallery',

-	gallery: {

-		text: 'Image caption',

-		save: 'Save',

-		remove: 'Remove from gallery',

-		drag: 'Drag items here to create a gallery...'

-	}

-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/MootoolsFileManager/mootools-filemanager/Language/Language.da.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/MootoolsFileManager/mootools-filemanager/Language/Language.da.js
deleted file mode 100644
index 24873b0..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/MootoolsFileManager/mootools-filemanager/Language/Language.da.js
+++ /dev/null
@@ -1,125 +0,0 @@
-/*

-Script: Language.da.js

-	MooTools FileManager - Language Strings in Danish

-

-Translation:

-	Jan Ebsen

-*/

-

-FileManager.Language.da = {

-	more: 'Detaljer',

-	width: 'Bredde:',

-	height: 'Højde:',

-

-	ok: 'Ok',

-	open: 'Vælg fil',

-	upload: 'Upload',

-	create: 'Opret mappe',

-	createdir: 'Angiv venligst mappe navn:',

-	cancel: 'Anuller',

-	error: 'Fejl',

-

-	information: 'Information',

-	type: 'Type:',

-	size: 'Størrelse:',

-	dir: 'Sti:',

-	modified: 'Sidst ændret:',

-	preview: 'Miniature',

-	close: 'Luk',

-	destroy: 'Slet',

-	destroyfile: 'Er du sikker på du vil slette denne fil?',

-

-	rename: 'Omdøb',

-	renamefile: 'Skriv nyt filnavn:',

-	rn_mv_cp: 'Rename/Move/Copy',

-

-	download: 'Download',

-	nopreview: '<i>Ingen miniature tilgængelig</i>',

-

-	title: 'Titel:',

-	artist: 'Kunstner:',

-	album: 'Album:',

-	length: 'Længde:',

-	bitrate: 'Bitrate:',

-

-	deselect: 'Fravælg',

-

-	nodestroy: 'Det er ikke muligt at slette filer på serveren.',

-

-	toggle_side_boxes: 'Thumbnail view',

-	toggle_side_list: 'List view',

-	show_dir_thumb_gallery: 'Show thumbnails of the files in the preview pane',

-	drag_n_drop: 'Drag & drop has been enabled for this directory',

-	drag_n_drop_disabled: 'Drag & drop has been temporarily disabled for this directory',

-	goto_page: 'Go to page',

-

-	'backend.disabled': 'Det er ikke muligt at uploade filer på serveren.',

-	'backend.authorized': 'Du har ikke rettigheder til at uploade filer.',

-	'backend.path': 'Upload mappen findes ikke. Kontakt venligst sidens administrator.',

-	'backend.exists': 'Upload mappen findes allerede. Kontakt venligst sidens administrator.',

-	'backend.mime': 'Fil-typen er ikke tilladt.',

-	'backend.extension': 'Filen er af en ukendt, eller ulovlig type.',

-	'backend.size': 'Filen er for stor, upload venligst en mindre fil.',

-	'backend.partial': 'Filen blev kun delvist uploaded, prøv venligst igen.',

-	'backend.nofile': 'Der er ikke angivet nogen fil til upload.',

-	'backend.default': 'Noget gik galt med fil-uploaderen.',

-	'backend.path_not_writable': 'You do not have write/upload permissions for this directory.',

-	'backend.filename_maybe_too_large': 'The filename/path is probably too long for the server filesystem. Please retry with a shorter file name.',

-	'backend.fmt_not_allowed': 'You are not allowed to upload this file format/name.',

-	'backend.read_error': 'Cannot read / download the specified file.',

-	'backend.unidentified_error': 'An unindentified error occurred while communicating with the backend (web server).',

-

-	'backend.nonewfile': 'A new name for the file to be moved / copied is missing.',

-	'backend.corrupt_img': 'This file is a not a image or a corrupt file: ', // path

-	'backend.resize_inerr': 'This file could not be resized due to an internal error.',

-	'backend.copy_failed': 'An error occurred while copying the file / directory: ', // oldlocalpath : newlocalpath

-	'backend.delete_cache_entries_failed': 'An error occurred when attempting to delete the item cache (thumbnails, metadata)',

-	'backend.mkdir_failed': 'An error occurred when attempting to create the directory: ', // path

-	'backend.move_failed': 'An error occurred while moving / renaming the file / directory: ', // oldlocalpath : newlocalpath

-	'backend.path_tampering': 'Path tampering detected.',

-	'backend.realpath_failed': 'Cannot translate the given file specification to a valid storage location: ', // $path

-	'backend.unlink_failed': 'An error occurred when attempting to delete the file / directory: ',  // path

-

-	// Image.class.php:

-	'backend.process_nofile': 'The image processing unit did not receive a valid file location to work on.',

-	'backend.imagecreatetruecolor_failed': 'The image processing unit failed: GD imagecreatetruecolor() failed.',

-	'backend.imagealphablending_failed': 'The image processing unit failed: cannot perform the required image alpha blending.',

-	'backend.imageallocalpha50pctgrey_failed': 'The image processing unit failed: cannot allocate space for the alpha channel and the 50% background.',

-	'backend.imagecolorallocatealpha_failed': 'The image processing unit failed: cannot allocate space for the alpha channel for this color image.',

-	'backend.imagerotate_failed': 'The image processing unit failed: GD imagerotate() failed.',

-	'backend.imagecopyresampled_failed': 'The image processing unit failed: GD imagecopyresampled() failed. Image resolution: ', /* x * y */

-	'backend.imagecopy_failed': 'The image processing unit failed: GD imagecopy() failed.',

-	'backend.imageflip_failed': 'The image processing unit failed: cannot flip the image.',

-	'backend.imagejpeg_failed': 'The image processing unit failed: GD imagejpeg() failed.',

-	'backend.imagepng_failed': 'The image processing unit failed: GD imagepng() failed.',

-	'backend.imagegif_failed': 'The image processing unit failed: GD imagegif() failed.',

-	'backend.imagecreate_failed': 'The image processing unit failed: GD imagecreate() failed.',

-	'backend.cvt2truecolor_failed': 'conversion to True Color failed. Image resolution: ', /* x * y */

-	'backend.no_imageinfo': 'Corrupt image or not an image file at all.',

-	'backend.img_will_not_fit': 'Server error: image does not fit in available RAM; minimum required (estimate): ', /* XXX MBytes */

-	'backend.unsupported_imgfmt': 'unsupported image format: ',    /* jpeg/png/gif/... */

-

-	/* FU */

-	uploader: {

-		unknown: 'Ukendt fejl',

-		sizeLimitMin: 'Du kan ikke tilføje "<em>${name}</em>" (${size}), mindst tilladte filstørrelse er <strong>${size_min}</strong>!',

-		sizeLimitMax: 'Du kan ikke tilføje "<em>${name}</em>" (${size}), højst tilladte filstørrelse er <strong>${size_max}</strong>!',

-		mod_security: 'No response was given from the uploader, this may mean that "mod_security" is active on the server and one of the rules in mod_security has cancelled this request.  If you can not disable mod_security, you may need to use the NoFlash Uploader.'

-	},

-

-	flash: {

-		hidden: null,

-		disabled: null,

-		flash: 'For at uploade filer skal du installere <a href="http://www.adobe.com/shockwave/download/download.cgi?P1_Prod_Version=ShockwaveFlash">Adobe Flash</a>.'

-	},

-

-	resizeImages: 'Scaler store billeder ved upload',

-

-	serialize: 'Save gallery',

-	gallery: {

-		text: 'Image caption',

-		save: 'Save',

-		remove: 'Remove from gallery',

-		drag: 'Drag items here to create a gallery...'

-	}

-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/MootoolsFileManager/mootools-filemanager/Language/Language.de.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/MootoolsFileManager/mootools-filemanager/Language/Language.de.js
deleted file mode 100644
index d47bd61..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/MootoolsFileManager/mootools-filemanager/Language/Language.de.js
+++ /dev/null
@@ -1,125 +0,0 @@
-/*
-Script: Language.de.js
-	MooTools FileManager - Language Strings in German
-
-Translation:
-	[Christoph Pojer](http://cpojer.net)
-*/
-
-FileManager.Language.de = {
-	more: 'Details',
-	width: 'Breite:',
-	height: 'Höhe:',
-
-	ok: 'Ok',
-	open: 'Datei wählen',
-	upload: 'Datei hochladen',
-	create: 'Ordner erstellen',
-	createdir: 'Bitte gib einen Ordnernamen ein:',
-	cancel: 'Abbrechen',
-	error: 'Fehler',
-
-	information: 'Information',
-	type: 'Typ:',
-	size: 'Größe:',
-	dir: 'Verzeichnis:',
-	modified: 'Zuletzt bearbeitet:',
-	preview: 'Vorschau',
-	close: 'Schließen',
-	destroy: 'Löschen',
-	destroyfile: 'Bist du sicher, dass du diese Datei löschen möchtest?',
-
-	rename: 'Umbenennen',
-	renamefile: 'Gib einen neuen Dateinamen ein:',
-	rn_mv_cp: 'Rename/Move/Copy',
-
-	download: 'Download',
-	nopreview: '<i>Keine Vorschau verfügbar</i>',
-
-	title: 'Titel:',
-	artist: 'Artist:',
-	album: 'Album:',
-	length: 'Länge:',
-	bitrate: 'Bitrate:',
-
-	deselect: 'Entfernen',
-
-	nodestroy: 'Dateien löschen wurde auf diesem Server deaktiviert.',
-
-	toggle_side_boxes: 'Thumbnail view',
-	toggle_side_list: 'List view',
-	show_dir_thumb_gallery: 'Show thumbnails of the files in the preview pane',
-	drag_n_drop: 'Drag & drop has been enabled for this directory',
-	drag_n_drop_disabled: 'Drag & drop has been temporarily disabled for this directory',
-	goto_page: 'Go to page',
-
-	'backend.disabled': 'Dieser Funktion wurde auf diesem Server deaktiviert.',
-	'backend.authorized': 'Akt fehlgeschlagen: Du hast keine Genehmigung.',
-	'backend.path': 'Der angegebene Ordner oder Datei existiert nicht. Bitte kontaktiere den Administrator dieser Website.',
-	'backend.exists': 'Der angegebene Speicherort existiert bereits. Bitte kontaktiere den Administrator dieser Website.',
-	'backend.mime': 'Der angegebene Dateityp ist nicht erlaubt.',
-	'backend.extension': 'Die Datei hat eine unbekannte oder unerlaubte Datei-Erweiterung.',
-	'backend.size': 'Die Datei, die du hochgeladen hast, ist zu groß um sie auf diesem Server zu verarbeiten. Bitte lade eine kleinere Datei hoch.',
-	'backend.partial': 'Die Datei wurde nur teilweise hochgeladen. Bitte lade sie erneut hoch.',
-	'backend.nofile': 'Es wurde keine Datei angezeigt/hochgeladen oder der Datei konnte nicht gefunden werden.',
-	'backend.default': 'Der Datei-Upload ist fehlgeschlagen.',
-	'backend.path_not_writable': 'You do not have write/upload permissions for this directory.',
-	'backend.filename_maybe_too_large': 'The filename/path is probably too long for the server filesystem. Please retry with a shorter file name.',
-	'backend.fmt_not_allowed': 'You are not allowed to upload this file format/name.',
-	'backend.read_error': 'Cannot read / download the specified file.',
-	'backend.unidentified_error': 'An unindentified error occurred while communicating with the backend (web server).',
-
-	'backend.nonewfile': 'A new name for the file to be moved / copied is missing.',
-	'backend.corrupt_img': 'This file is a not a image or a corrupt file: ', // path
-	'backend.resize_inerr': 'This file could not be resized due to an internal error.',
-	'backend.copy_failed': 'An error occurred while copying the file / directory: ', // oldlocalpath : newlocalpath
-	'backend.delete_cache_entries_failed': 'An error occurred when attempting to delete the item cache (thumbnails, metadata)',
-	'backend.mkdir_failed': 'An error occurred when attempting to create the directory: ', // path
-	'backend.move_failed': 'An error occurred while moving / renaming the file / directory: ', // oldlocalpath : newlocalpath
-	'backend.path_tampering': 'Path tampering detected.',
-	'backend.realpath_failed': 'Cannot translate the given file specification to a valid storage location: ', // $path
-	'backend.unlink_failed': 'An error occurred when attempting to delete the file / directory: ',  // path
-
-	// Image.class.php:
-	'backend.process_nofile': 'The image processing unit did not receive a valid file location to work on.',
-	'backend.imagecreatetruecolor_failed': 'The image processing unit failed: GD imagecreatetruecolor() failed.',
-	'backend.imagealphablending_failed': 'The image processing unit failed: cannot perform the required image alpha blending.',
-	'backend.imageallocalpha50pctgrey_failed': 'The image processing unit failed: cannot allocate space for the alpha channel and the 50% background.',
-	'backend.imagecolorallocatealpha_failed': 'The image processing unit failed: cannot allocate space for the alpha channel for this color image.',
-	'backend.imagerotate_failed': 'The image processing unit failed: GD imagerotate() failed.',
-	'backend.imagecopyresampled_failed': 'The image processing unit failed: GD imagecopyresampled() failed. Image resolution: ', /* x * y */
-	'backend.imagecopy_failed': 'The image processing unit failed: GD imagecopy() failed.',
-	'backend.imageflip_failed': 'The image processing unit failed: cannot flip the image.',
-	'backend.imagejpeg_failed': 'The image processing unit failed: GD imagejpeg() failed.',
-	'backend.imagepng_failed': 'The image processing unit failed: GD imagepng() failed.',
-	'backend.imagegif_failed': 'The image processing unit failed: GD imagegif() failed.',
-	'backend.imagecreate_failed': 'The image processing unit failed: GD imagecreate() failed.',
-	'backend.cvt2truecolor_failed': 'conversion to True Color failed. Image resolution: ', /* x * y */
-	'backend.no_imageinfo': 'Corrupt image or not an image file at all.',
-	'backend.img_will_not_fit': 'Server error: image does not fit in available RAM; minimum required (estimate): ', /* XXX MBytes */
-	'backend.unsupported_imgfmt': 'unsupported image format: ',    /* jpeg/png/gif/... */
-
-	/* FU */
-	uploader: {
-		unknown: 'Unbekannter Fehler',
-		sizeLimitMin: 'Die Datei "<em>${name}</em>" (${size}), ist zu klein. Minimaldateigröße: <strong>${size_min}</strong>!',
-		sizeLimitMax: 'Die Datei "<em>${name}</em>" (${size}), ist zu groß. Dateigrößen-Limit: <strong>${size_max}</strong>!',
-		mod_security: 'No response was given from the uploader, this may mean that "mod_security" is active on the server and one of the rules in mod_security has cancelled this request.  If you can not disable mod_security, you may need to use the NoFlash Uploader.'
-	},
-
-	flash: {
-		hidden: 'Um den Uploader benutzen zu können, muss er im Browser freigegeben werden und die Seite muss neu geladen werden (Adblock).',
-		disabled: 'Um den Uploader benutzen zu können, muss die geblockte Flash Datei freigegeben werden und die Seite muss neu geladen werden (Flashblock).',
-		flash: 'Um Dateien hochzuladen muss <a href="http://www.adobe.com/shockwave/download/download.cgi?P1_Prod_Version=ShockwaveFlash">Adobe Flash</a> installiert werden.'
-	},
-
-	resizeImages: 'Große Bilder bei Upload verkleinern',
-
-	serialize: 'Galerie speichern',
-	gallery: {
-		text: 'Bildtext',
-		save: 'Speichern',
-		remove: 'Entfernen',
-		drag: 'Verschiebe Bilder in diesen Bereich um eine Galerie zu erstellen...'
-	}
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/MootoolsFileManager/mootools-filemanager/Language/Language.en.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/MootoolsFileManager/mootools-filemanager/Language/Language.en.js
deleted file mode 100644
index 787a085..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/MootoolsFileManager/mootools-filemanager/Language/Language.en.js
+++ /dev/null
@@ -1,125 +0,0 @@
-/*
-Script: Language.en.js
-	MooTools FileManager - Language Strings in English
-
-Translation:
-	[Christoph Pojer](http://cpojer.net)
-*/
-
-FileManager.Language.en = {
-	more: 'Details',
-	width: 'Width:',
-	height: 'Height:',
-
-	ok: 'Ok',
-	open: 'Select file',
-	upload: 'Upload',
-	create: 'Create folder',
-	createdir: 'Please specify a folder name:',
-	cancel: 'Cancel',
-	error: 'Error',
-
-	information: 'Information',
-	type: 'Type:',
-	size: 'Size:',
-	dir: 'Path:',
-	modified: 'Last modified:',
-	preview: 'Preview',
-	close: 'Close',
-	destroy: 'Delete',
-	destroyfile: 'Are you sure to delete this file?',
-
-	rename: 'Rename',
-	renamefile: 'Please enter a new file name:',
-	rn_mv_cp: 'Rename/Move/Copy',
-
-	download: 'Download',
-	nopreview: '<i>No preview available</i>',
-
-	title: 'Title:',
-	artist: 'Artist:',
-	album: 'Album:',
-	length: 'Length:',
-	bitrate: 'Bitrate:',
-
-	deselect: 'Deselect',
-
-	nodestroy: 'Deleting files has been disabled on this Server.',
-
-	toggle_side_boxes: 'Thumbnail view',
-	toggle_side_list: 'List view',
-	show_dir_thumb_gallery: 'Show thumbnails of the files in the preview pane',
-	drag_n_drop: 'Drag & drop has been enabled for this directory',
-	drag_n_drop_disabled: 'Drag & drop has been temporarily disabled for this directory',
-	goto_page: 'Go to page',
-
-	'backend.disabled': 'This operation has been disabled on this Server.',
-	'backend.authorized': 'You are not authorized to perform this operation.',
-	'backend.path': 'The specified Folder does not exist. Please contact the administrator of this Website.',
-	'backend.exists': 'The specified Location does already exist. Please contact the administrator of this Website.',
-	'backend.mime': 'The specified file-type is not allowed.',
-	'backend.extension': 'The uploaded file has an unknown or forbidden file extension.',
-	'backend.size': 'The size of the file you uploaded is too big to be processed on this server. Please upload a smaller file.',
-	'backend.partial': 'The file you uploaded was only partially uploaded, please upload the file again.',
-	'backend.nofile': 'There was no file specified or the file does not exist.',
-	'backend.default': 'Something went wrong with the File-Upload.',
-	'backend.path_not_writable': 'You do not have write/upload permissions for this directory.',
-	'backend.filename_maybe_too_large': 'The filename/path is probably too long for the server filesystem. Please retry with a shorter file name.',
-	'backend.fmt_not_allowed': 'You are not allowed to upload this file format/name.',
-	'backend.read_error': 'Cannot read / download the specified file.',
-	'backend.unidentified_error': 'An unindentified error occurred while communicating with the backend (web server).',
-
-	'backend.nonewfile': 'A new name for the file to be moved / copied is missing.',
-	'backend.corrupt_img': 'This file is a not a image or a corrupt file: ', // path
-	'backend.resize_inerr': 'This file could not be resized due to an internal error.',
-	'backend.copy_failed': 'An error occurred while copying the file / directory: ', // oldlocalpath : newlocalpath
-	'backend.delete_cache_entries_failed': 'An error occurred when attempting to delete the item cache (thumbnails, metadata)',
-	'backend.mkdir_failed': 'An error occurred when attempting to create the directory: ', // path
-	'backend.move_failed': 'An error occurred while moving / renaming the file / directory: ', // oldlocalpath : newlocalpath
-	'backend.path_tampering': 'Path tampering detected.',
-	'backend.realpath_failed': 'Cannot translate the given file specification to a valid storage location: ', // $path
-	'backend.unlink_failed': 'An error occurred when attempting to delete the file / directory: ',  // path
-
-	// Image.class.php:
-	'backend.process_nofile': 'The image processing unit did not receive a valid file location to work on.',
-	'backend.imagecreatetruecolor_failed': 'The image processing unit failed: GD imagecreatetruecolor() failed.',
-	'backend.imagealphablending_failed': 'The image processing unit failed: cannot perform the required image alpha blending.',
-	'backend.imageallocalpha50pctgrey_failed': 'The image processing unit failed: cannot allocate space for the alpha channel and the 50% background.',
-	'backend.imagecolorallocatealpha_failed': 'The image processing unit failed: cannot allocate space for the alpha channel for this color image.',
-	'backend.imagerotate_failed': 'The image processing unit failed: GD imagerotate() failed.',
-	'backend.imagecopyresampled_failed': 'The image processing unit failed: GD imagecopyresampled() failed. Image resolution: ', /* x * y */
-	'backend.imagecopy_failed': 'The image processing unit failed: GD imagecopy() failed.',
-	'backend.imageflip_failed': 'The image processing unit failed: cannot flip the image.',
-	'backend.imagejpeg_failed': 'The image processing unit failed: GD imagejpeg() failed.',
-	'backend.imagepng_failed': 'The image processing unit failed: GD imagepng() failed.',
-	'backend.imagegif_failed': 'The image processing unit failed: GD imagegif() failed.',
-	'backend.imagecreate_failed': 'The image processing unit failed: GD imagecreate() failed.',
-	'backend.cvt2truecolor_failed': 'conversion to True Color failed. Image resolution: ', /* x * y */
-	'backend.no_imageinfo': 'Corrupt image or not an image file at all.',
-	'backend.img_will_not_fit': 'Server error: image does not fit in available RAM; minimum required (estimate): ', /* XXX MBytes */
-	'backend.unsupported_imgfmt': 'unsupported image format: ',    /* jpeg/png/gif/... */
-
-	/* FU */
-	uploader: {
-		unknown: 'Unknown Error',
-		sizeLimitMin: 'You can not attach "<em>${name}</em>" (${size}), the file size minimum is <strong>${size_min}</strong>!',
-		sizeLimitMax: 'You can not attach "<em>${name}</em>" (${size}), the file size limit is <strong>${size_max}</strong>!',
-		mod_security: 'No response was given from the uploader, this may mean that "mod_security" is active on the server and one of the rules in mod_security has cancelled this request.  If you can not disable mod_security, you may need to use the NoFlash Uploader.'
-	},
-
-	flash: {
-		hidden: 'To enable the embedded uploader, unblock it in your browser and refresh (see Adblock).',
-		disabled: 'To enable the embedded uploader, enable the blocked Flash movie  and refresh (see Flashblock).',
-		flash: 'In order to upload files you need to install <a href="http://www.adobe.com/shockwave/download/download.cgi?P1_Prod_Version=ShockwaveFlash">Adobe Flash</a>.'
-	},
-
-	resizeImages: 'Resize big images on upload',
-
-	serialize: 'Save gallery',
-	gallery: {
-		text: 'Image caption',
-		save: 'Save',
-		remove: 'Remove from gallery',
-		drag: 'Drag items here to create a gallery...'
-	}
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/MootoolsFileManager/mootools-filemanager/Language/Language.es.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/MootoolsFileManager/mootools-filemanager/Language/Language.es.js
deleted file mode 100644
index d06d462..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/MootoolsFileManager/mootools-filemanager/Language/Language.es.js
+++ /dev/null
@@ -1,126 +0,0 @@
-/*

-Script: Language.es.js

-	MooTools FileManager - Language Strings in Spanish

-

-Translation:

-	[Sergio Rubio](http://rubiojr.netcorex.org)

-*/

-

-FileManager.Language.es = {

-	more: 'Detalles',

-	width: 'Anchura:',

-	height: 'Altura:',

-

-	ok: 'Ok',

-	open: 'Seleccionar Fichero',

-	upload: 'Subir ficheros',

-	create: 'Crear carpeta',

-	createdir: 'Especifica el nombre de la carpeta:',

-	cancel: 'Cancelar',

-	error: 'Error',

-

-	information: 'Información',

-	type: 'Tipo:',

-	size: 'Tamaño:',

-	dir: 'Ruta:',

-	modified: 'Última modificación:',

-	preview: 'Previsualización',

-	close: 'Cerrar',

-	destroy: 'Borrar',

-	destroyfile: '¿Seguro que deseas borrar el fichero?',

-

-	rename: 'Renombrar',

-	renamefile: 'Especifica un nuevo nombre para el fichero:',

-	rn_mv_cp: 'Rename/Move/Copy',

-

-	download: 'Descargar',

-	nopreview: '<i>No hay previsualizacion disponible</i>',

-

-	title: 'Título:',

-	artist: 'Artista:',

-	album: 'Album:',

-	length: 'Duración:',

-	bitrate: 'Bitrate:',

-

-	deselect: 'Desmarcar',

-

-	nodestroy: 'El borrado de ficheros ha sido deshabilitado.',

-

-	toggle_side_boxes: 'Thumbnail view',

-	toggle_side_list: 'List view',

-	show_dir_thumb_gallery: 'Show thumbnails of the files in the preview pane',

-	drag_n_drop: 'Drag & drop has been enabled for this directory',

-	drag_n_drop_disabled: 'Drag & drop has been temporarily disabled for this directory',

-	goto_page: 'Go to page',

-

-	'backend.disabled': 'La carga de archivos ha sido deshabilitada.',

-	'backend.authorized': 'Necesitas autorización para subir ficheros.',

-	'backend.path': 'La carpeta destino especificada no existe. Contacta con el administrador del sitio web.',

-	'backend.exists': 'El la ruta destino ya existe. Por favor, contacta con el administrador del sitio web.',

-	'backend.mime': 'No se permite subir el tipo de fichero especificado.',

-	'backend.extension': 'El fichero subido tienen una extensión no permitida o desconocida.',

-	'backend.size': 'El tamaño del fichero que intentas subir es demasiado grande para ser procesado por el servidor. Por favor, sube un fichero mas pequeño.',

-	'backend.partial': 'El fichero se ha subido parcialmente, por favor, sube el fichero de nuevo.',

-	'backend.nofile': 'No se especificó el fichero a subir.',

-	'backend.default': 'Algo falló durante la carga del fichero.',

-	'backend.path_not_writable': 'You do not have write/upload permissions for this directory.',

-	'backend.filename_maybe_too_large': 'The filename/path is probably too long for the server filesystem. Please retry with a shorter file name.',

-	'backend.fmt_not_allowed': 'You are not allowed to upload this file format/name.',

-	'backend.read_error': 'Cannot read / download the specified file.',

-	'backend.unidentified_error': 'An unindentified error occurred while communicating with the backend (web server).',

-

-	'backend.nonewfile': 'A new name for the file to be moved / copied is missing.',

-	'backend.corrupt_img': 'This file is a not a image or a corrupt file: ', // path

-	'backend.resize_inerr': 'This file could not be resized due to an internal error.',

-	'backend.copy_failed': 'An error occurred while copying the file / directory: ', // oldlocalpath : newlocalpath

-	'backend.delete_cache_entries_failed': 'An error occurred when attempting to delete the item cache (thumbnails, metadata)',

-	'backend.mkdir_failed': 'An error occurred when attempting to create the directory: ', // path

-	'backend.move_failed': 'An error occurred while moving / renaming the file / directory: ', // oldlocalpath : newlocalpath

-	'backend.path_tampering': 'Path tampering detected.',

-	'backend.realpath_failed': 'Cannot translate the given file specification to a valid storage location: ', // $path

-	'backend.unlink_failed': 'An error occurred when attempting to delete the file / directory: ',  // path

-

-	// Image.class.php:

-	'backend.process_nofile': 'The image processing unit did not receive a valid file location to work on.',

-	'backend.imagecreatetruecolor_failed': 'The image processing unit failed: GD imagecreatetruecolor() failed.',

-	'backend.imagealphablending_failed': 'The image processing unit failed: cannot perform the required image alpha blending.',

-	'backend.imageallocalpha50pctgrey_failed': 'The image processing unit failed: cannot allocate space for the alpha channel and the 50% background.',

-	'backend.imagecolorallocatealpha_failed': 'The image processing unit failed: cannot allocate space for the alpha channel for this color image.',

-	'backend.imagerotate_failed': 'The image processing unit failed: GD imagerotate() failed.',

-	'backend.imagecopyresampled_failed': 'The image processing unit failed: GD imagecopyresampled() failed. Image resolution: ', /* x * y */

-	'backend.imagecopy_failed': 'The image processing unit failed: GD imagecopy() failed.',

-	'backend.imageflip_failed': 'The image processing unit failed: cannot flip the image.',

-	'backend.imagejpeg_failed': 'The image processing unit failed: GD imagejpeg() failed.',

-	'backend.imagepng_failed': 'The image processing unit failed: GD imagepng() failed.',

-	'backend.imagegif_failed': 'The image processing unit failed: GD imagegif() failed.',

-	'backend.imagecreate_failed': 'The image processing unit failed: GD imagecreate() failed.',

-	'backend.cvt2truecolor_failed': 'conversion to True Color failed. Image resolution: ', /* x * y */

-	'backend.no_imageinfo': 'Corrupt image or not an image file at all.',

-	'backend.img_will_not_fit': 'image does not fit in available RAM; minimum required (estimate): ', /* XXX MBytes */

-	'backend.unsupported_imgfmt': 'unsupported image format: ',    /* jpeg/png/gif/... */

-

-	/* FU */

-	uploader: {

-		unknown: 'Error desconocido',

-		duplicate: 'No se puede subir "<em>${name}</em>" (${size}), ya ha sido añadido!',

-		sizeLimitMin: 'No se puede subir "<em>${name}</em>" (${size}), el tamaño mínimo de fichero es <strong>${size_min}</strong>!',

-		sizeLimitMax: 'No se puede subir "<em>${name}</em>" (${size}), el tamaño máximo de fichero es <strong>${size_max}</strong>!',

-		mod_security: 'No response was given from the uploader, this may mean that "mod_security" is active on the server and one of the rules in mod_security has cancelled this request.  If you can not disable mod_security, you may need to use the NoFlash Uploader.'

-	},

-

-	flash: {

-		hidden: null,

-		disabled: null,

-		flash: 'Para poder subir ficheros necesitas instalar <a href="http://www.adobe.com/shockwave/download/download.cgi?P1_Prod_Version=ShockwaveFlash">Adobe Flash</a>.'

-	},

-

-	resizeImages: 'Redimensionar las imágenes grandes al subirlas',

-

-	serialize: 'Save gallery',

-	gallery: {

-		text: 'Image caption',

-		save: 'Save',

-		remove: 'Remove from gallery',

-		drag: 'Drag items here to create a gallery...'

-	}

-};

diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/MootoolsFileManager/mootools-filemanager/Language/Language.fi.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/MootoolsFileManager/mootools-filemanager/Language/Language.fi.js
deleted file mode 100644
index 2d316d8..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/MootoolsFileManager/mootools-filemanager/Language/Language.fi.js
+++ /dev/null
@@ -1,126 +0,0 @@
-/*

-Script: Language.fi.js

-	MooTools FileManager - Language Strings in Finnish

-

-Translation:

-	[Jabis Sevón](http://pumppumedia.com)

-*/

-

-FileManager.Language.fi = {

-	more: 'Lisätiedot',

-	width: 'Leveys:',

-	height: 'Korkeus:',

-

-	ok: 'Ok',

-	open: 'Valitse tiedosto',

-	upload: 'Lähetä',

-	create: 'Luo kansio',

-	createdir: 'Kansion nimi:',

-	cancel: 'Peruuta',

-	error: 'Virhe',

-

-	information: 'Tiedot',

-	type: 'Tyyppi:',

-	size: 'Koko:',

-	dir: 'Polku:',

-	modified: 'Viimeksi muokattu:',

-	preview: 'Esikatselu',

-	close: 'Sulje',

-	destroy: 'Poista',

-	destroyfile: 'Haluatko varmasti poistaa tiedoston?',

-

-	rename: 'Nimeä uudelleen',

-	renamefile: 'Syötä tiedoston uusi nimi:',

-	rn_mv_cp: 'Rename/Move/Copy',

-

-	download: 'Lataa',

-	nopreview: '<i>Esikatselua ei voida näyttää</i>',

-

-	title: 'Kappaleen nimi:',

-	artist: 'Artisti:',

-	album: 'Albumi:',

-	length: 'Pituus:',

-	bitrate: 'Bitrate:',

-

-	deselect: 'Poista valinta',

-

-	nodestroy: 'Tiedostojen poisto otettu käytöstä.',

-

-	toggle_side_boxes: 'Thumbnail view',

-	toggle_side_list: 'List view',

-	show_dir_thumb_gallery: 'Show thumbnails of the files in the preview pane',

-	drag_n_drop: 'Drag & drop has been enabled for this directory',

-	drag_n_drop_disabled: 'Drag & drop has been temporarily disabled for this directory',

-	goto_page: 'Go to page',

-

-	'backend.disabled': 'Tiedostojen lähetys otettu käytöstä.',

-	'backend.authorized': 'Sinulla ei ole oikeuksia tiedostojen lähettämiseen.',

-	'backend.path': 'Määritettyä kansiota ei löydy. Ole hyvä ja ota yhteyttä sivuston ylläpitäjään.',

-	'backend.exists': 'Tiedosto on jo olemassa - siirto peruttu. Ole hyvä ja ota yhteyttä sivuston ylläpitäjään.',

-	'backend.mime': 'Tiedostotyyppi ei ole sallittujen listalla - siirto peruttu.',

-	'backend.extension': 'Tiedostopääte tuntematon, tai ei sallittujen listalla - siirto peruttu.',

-	'backend.size': 'Tiedostokoko liian suuri palvelimelle. Ole hyvä ja siirrä pienempiä tiedostoja.',

-	'backend.partial': 'Tiedonsiirto onnistui vain osittain - siirto epäonnistui. Ole hyvä ja siirrä tiedosto uudestaan',

-	'backend.nofile': 'Tiedostoa ei määritetty.',

-	'backend.default': 'Tiedonsiirto epäonnistui tunnistamattomasta syystä.',

-	'backend.path_not_writable': 'You do not have write/upload permissions for this directory.',

-	'backend.filename_maybe_too_large': 'The filename/path is probably too long for the server filesystem. Please retry with a shorter file name.',

-	'backend.fmt_not_allowed': 'You are not allowed to upload this file format/name.',

-	'backend.read_error': 'Cannot read / download the specified file.',

-	'backend.unidentified_error': 'An unindentified error occurred while communicating with the backend (web server).',

-

-	'backend.nonewfile': 'A new name for the file to be moved / copied is missing.',

-	'backend.corrupt_img': 'This file is a not a image or a corrupt file: ', // path

-	'backend.resize_inerr': 'This file could not be resized due to an internal error.',

-	'backend.copy_failed': 'An error occurred while copying the file / directory: ', // oldlocalpath : newlocalpath

-	'backend.delete_cache_entries_failed': 'An error occurred when attempting to delete the item cache (thumbnails, metadata)',

-	'backend.mkdir_failed': 'An error occurred when attempting to create the directory: ', // path

-	'backend.move_failed': 'An error occurred while moving / renaming the file / directory: ', // oldlocalpath : newlocalpath

-	'backend.path_tampering': 'Path tampering detected.',

-	'backend.realpath_failed': 'Cannot translate the given file specification to a valid storage location: ', // $path

-	'backend.unlink_failed': 'An error occurred when attempting to delete the file / directory: ',  // path

-

-	// Image.class.php:

-	'backend.process_nofile': 'The image processing unit did not receive a valid file location to work on.',

-	'backend.imagecreatetruecolor_failed': 'The image processing unit failed: GD imagecreatetruecolor() failed.',

-	'backend.imagealphablending_failed': 'The image processing unit failed: cannot perform the required image alpha blending.',

-	'backend.imageallocalpha50pctgrey_failed': 'The image processing unit failed: cannot allocate space for the alpha channel and the 50% background.',

-	'backend.imagecolorallocatealpha_failed': 'The image processing unit failed: cannot allocate space for the alpha channel for this color image.',

-	'backend.imagerotate_failed': 'The image processing unit failed: GD imagerotate() failed.',

-	'backend.imagecopyresampled_failed': 'The image processing unit failed: GD imagecopyresampled() failed. Image resolution: ', /* x * y */

-	'backend.imagecopy_failed': 'The image processing unit failed: GD imagecopy() failed.',

-	'backend.imageflip_failed': 'The image processing unit failed: cannot flip the image.',

-	'backend.imagejpeg_failed': 'The image processing unit failed: GD imagejpeg() failed.',

-	'backend.imagepng_failed': 'The image processing unit failed: GD imagepng() failed.',

-	'backend.imagegif_failed': 'The image processing unit failed: GD imagegif() failed.',

-	'backend.imagecreate_failed': 'The image processing unit failed: GD imagecreate() failed.',

-	'backend.cvt2truecolor_failed': 'conversion to True Color failed. Image resolution: ', /* x * y */

-	'backend.no_imageinfo': 'Corrupt image or not an image file at all.',

-	'backend.img_will_not_fit': 'Server error: image does not fit in available RAM; minimum required (estimate): ', /* XXX MBytes */

-	'backend.unsupported_imgfmt': 'unsupported image format: ',    /* jpeg/png/gif/... */

-

-	/* FU */

-	uploader: {

-		unknown: 'Tunnistamaton virhe',

-		duplicate: 'Et voi lisätä seuraavaa tiedostoa: "<em>${name}</em>" (${size}), koska se on jo siirtolistalla!',

-		sizeLimitMin: 'Et voi lisätä seuraavaa tiedostoa: "<em>${name}</em>" (${size}). Tiedostojen minimikoko on <strong>${size_min}</strong>!',

-		sizeLimitMax: 'Et voi lisätä seuraavaa tiedostoa: "<em>${name}</em>" (${size}). Tiedostojen maksimikoko on <strong>${size_max}</strong>!',

-		mod_security: 'No response was given from the uploader, this may mean that "mod_security" is active on the server and one of the rules in mod_security has cancelled this request.  If you can not disable mod_security, you may need to use the NoFlash Uploader.'

-	},

-

-	flash: {

-		hidden: null,

-		disabled: null,

-		flash: 'Käyttääksesi FileManageria, tarvitset Adobe Flash Playerin. <a href="http://www.adobe.com/shockwave/download/download.cgi?P1_Prod_Version=ShockwaveFlash">Lataa tästä</a>.'

-	},

-

-	resizeImages: 'Pienennä liian suuret kuvat automaattisesti siirron yhteydessä',

-

-	serialize: 'Save gallery',

-	gallery: {

-		text: 'Image caption',

-		save: 'Save',

-		remove: 'Remove from gallery',

-		drag: 'Drag items here to create a gallery...'

-	}

-};

diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/MootoolsFileManager/mootools-filemanager/Language/Language.fr.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/MootoolsFileManager/mootools-filemanager/Language/Language.fr.js
deleted file mode 100644
index 6ef3ae6..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/MootoolsFileManager/mootools-filemanager/Language/Language.fr.js
+++ /dev/null
@@ -1,126 +0,0 @@
-/*

-Script: Language.fr.js

-	MooTools FileManager - Language Strings in French

-

-Translation:

-	[Samuel Sanchez](http://www.kromack.com)

-*/

-

-FileManager.Language.fr = {

-	more: 'Détails',

-	width: 'Largeur :',

-	height: 'Hauteur :',

-

-	ok: 'Ok',

-	open: 'Sélectionner un fichier',

-	upload: 'Téléverser',

-	create: 'Créer un dossier',

-	createdir: 'Merci de spécifier un nom de dossier :',

-	cancel: 'Annuler',

-	error: 'Erreur',

-

-	information: 'Informations',

-	type: 'Type :',

-	size: 'Taille :',

-	dir: 'Chemin :',

-	modified: 'Modifié le :',

-	preview: 'Aperçu',

-	close: 'Fermer',

-	destroy: 'Supprimer',

-	destroyfile: 'Voulez-vous vraiment supprimer ce fichier ?',

-

-	rename: 'Renommer',

-	renamefile: 'Merci de spécifier un nouveau nom de fichier :',

-	rn_mv_cp: 'Rename/Move/Copy',

-

-	download: 'Télécharger',

-	nopreview: '<i>Aucun aperçu disponible</i>',

-

-	title: 'Titre :',

-	artist: 'Artiste :',

-	album: 'Album :',

-	length: 'Durée :',

-	bitrate: 'Débit :',

-

-	deselect: 'Désélectionner',

-

-	nodestroy: 'La suppression de fichier a été désactivée sur ce serveur.',

-

-	toggle_side_boxes: 'Vue miniatures',

-	toggle_side_list: 'Vue liste',

-	show_dir_thumb_gallery: 'Voir les miniatures dans le panneau de prévisualisation',

-	drag_n_drop: 'Le glisser / déposé est actif pour ce dossier',

-	drag_n_drop_disabled: 'Le glisser / déposé est temporairement inactif pour ce dossier',

-	goto_page: 'Aller à la page',

-

-	'backend.disabled': 'L\'upload de fichier a été désactivé sur ce serveur.',

-	'backend.authorized': 'Vous n\'êtes pas authentifié et ne pouvez pas téléverser de fichier.',

-	'backend.path': 'Le répertoire d\'upload spécifié n\'existe pas. Merci de contacter l\'administrateur de ce site Internet.',

-	'backend.exists': 'Le chemin de d\'upload spécifié existe déjà. Merci de contacter l\'administrateur de ce site Internet.',

-	'backend.mime': 'Le type de fichier spécifié n\'est pas autorisé.',

-	'backend.extension': 'Le fichier uploadé a une extension inconnue ou interdite.',

-	'backend.size': 'La taille de votre fichier est trop grande pour être uploadée sur ce serveur. Merci de sélectionner un fichier moins lourd.',

-	'backend.partial': 'Le fichier a été partiellement uploadé, merci de recommencer l\'opération.',

-	'backend.nofile': 'Aucun fichier n\'a été spécifié.',

-	'backend.default': 'Une erreur s\'est produite.',

-	'backend.path_not_writable': 'Problème de droit d\'écriture sur le dossier.',

-	'backend.filename_maybe_too_large': 'Le chemin ou nom de fichier est probablement trop long. Réessayez avec un nom plus court.',

-	'backend.fmt_not_allowed': 'Le format ou nom de fichier que vous souhaitez uploader n\'est pas autorisé.',

-	'backend.read_error': 'Cannot read / download the specified file.',

-	'backend.unidentified_error': 'Une erreur inconnue est survenue lors de la communication avec le serveur.',

-

-	'backend.nonewfile': 'Le nouveau nom de fichier est manquant.',

-	'backend.corrupt_img': 'Ce fichier est corrompu ou n\'est pas une image : ', // path

-	'backend.resize_inerr': 'Ce fichier ne peut être redimensionné (erreur interne).',

-	'backend.copy_failed': 'Une erreur est survenue lors de la copie de ce fichier / dossier : ', // oldlocalpath : newlocalpath

-	'backend.delete_cache_entries_failed': 'Une erreur est survenue lors de la suppression du cache (thumbnails, metadata)',

-	'backend.mkdir_failed': 'Une erreur est survenue lors de la création du dossier : ', // path

-	'backend.move_failed': 'Une erreur est survenue lors du déplacement / renommage du fichier / dossier : ', // oldlocalpath : newlocalpath

-	'backend.path_tampering': 'Altération de chemin détectée.',

-	'backend.realpath_failed': 'Impossible de traduire le chemin de ce fichier en emplacement valide : ', // $path

-	'backend.unlink_failed': 'Une erreur est survenue lors de la suppression du fichier / dossier : ',  // path

-

-	// Image.class.php:

-	'backend.process_nofile': 'Le chemin du fichier à traiter n\'est pas valide.',

-	'backend.imagecreatetruecolor_failed': 'Le traitement de l\'image a échoué : GD imagecreatetruecolor().',

-	'backend.imagealphablending_failed': 'Le traitement de l\'image a échoué : Blending alpha impossible.',

-	'backend.imageallocalpha50pctgrey_failed': 'Le traitement de l\'image a échoué : Mémoire insuffisante pour alpha channel et fond 50%.',

-	'backend.imagecolorallocatealpha_failed': 'Le traitement de l\'image a échoué : Mémoire insuffisante pour alpha channel.',

-	'backend.imagerotate_failed': 'Le traitement de l\'image a échoué : GD imagerotate().',

-	'backend.imagecopyresampled_failed': 'Le traitement de l\'image a échoué : GD imagecopyresampled(). Résolution image : ', /* x * y */

-	'backend.imagecopy_failed': 'Le traitement de l\'image a échoué : GD imagecopy().',

-	'backend.imageflip_failed': 'Le traitement de l\'image a échoué : Flip impossible.',

-	'backend.imagejpeg_failed': 'Le traitement de l\'image a échoué : GD imagejpeg().',

-	'backend.imagepng_failed': 'Le traitement de l\'image a échoué : GD imagepng().',

-	'backend.imagegif_failed': 'Le traitement de l\'image a échoué : GD imagegif().',

-	'backend.imagecreate_failed': 'Le traitement de l\'image a échoué : GD imagecreate().',

-	'backend.cvt2truecolor_failed': 'conversion to True Color failed. Résolution image : ', /* x * y */

-	'backend.no_imageinfo': 'Image corrompu ou fichier non image.',

-	'backend.img_will_not_fit': 'Erreur serveur: Mémoire insuffisante; Minimum requis : ', /* XXX MBytes */

-	'backend.unsupported_imgfmt': 'Format non supporté : ',    /* jpeg/png/gif/... */

-

-	/* FU */

-	uploader: {

-		unknown: 'Erreur inconnue',

-		duplicate: 'Vous ne pouvez pas ajouter "<em>${name}</em>" (${size}), car l\'élément est déjà ajoutée !',

-		sizeLimitMin: 'Vous ne pouvez pas ajouter "<em>${name}</em>" (${size}), la taille minimale des fichiers est de <strong>${size_min}</strong>!',

-		sizeLimitMax: 'Vous ne pouvez pas ajouter "<em>${name}</em>" (${size}), la taille maximale des fichiers est de <strong>${size_max}</strong>!',

-		mod_security: 'Aucune réponse de l\'uploadeur. "mod_security" est peut-être actif sur le serveur et un des rôles a annulé cette requête.  Si vous ne pouvez désactiver mod_security, il vous faut utiliser NoFlash Uploader.'

-	},

-

-	flash: {

-		hidden: null,

-		disabled: null,

-		flash: 'Dans le but d\'uploader des fichiers, vous devez installer <a href="http://www.adobe.com/shockwave/download/download.cgi?P1_Prod_Version=ShockwaveFlash">Adobe Flash</a>.'

-	},

-

-	resizeImages: 'Redimensionner pendant l\'upload',

-

-	serialize: 'Sauver la galerie',

-	gallery: {

-		text: 'Texte de l\'image',

-		save: 'Sauver',

-		remove: 'Retirer de la galerie',

-		drag: 'Glissez des images ici pour créer une galerie...'

-	}

-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/MootoolsFileManager/mootools-filemanager/Language/Language.it.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/MootoolsFileManager/mootools-filemanager/Language/Language.it.js
deleted file mode 100644
index 3e1f6b7..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/MootoolsFileManager/mootools-filemanager/Language/Language.it.js
+++ /dev/null
@@ -1,125 +0,0 @@
-/*

-Script: Language.it.js

-	MooTools FileManager - Language Strings in English

-

-Translation:

-	Moreno Monga

-*/

-

-FileManager.Language.it = {

-	more: 'Dettagli',

-	width: 'Larghezza:',

-	height: 'Altezza:',

-

-	ok: 'Ok',

-	open: 'Seleziona file',

-	upload: 'Upload',

-	create: 'Crea cartella',

-	createdir: 'Specifica il nome della cartella:',

-	cancel: 'Annulla',

-	error: 'Errore',

-

-	information: 'Informazioni',

-	type: 'Tipo:',

-	size: 'Dimensione:',

-	dir: 'Percorso:',

-	modified: 'Ultima modifica:',

-	preview: 'Anteprima',

-	close: 'Chiudi',

-	destroy: 'Cancella',

-	destroyfile: 'Sei sicuro di voler cancellare questo file?',

-

-	rename: 'Rinomina',

-	renamefile: 'Scrivi un nuovo nome per il file:',

-	rn_mv_cp: 'Rename/Move/Copy',

-

-	download: 'Download',

-	nopreview: '<i>Non sono disponibili anteprime</i>',

-

-	title: 'Titolo:',

-	artist: 'Artista:',

-	album: 'Album:',

-	length: 'Lunghezza:',

-	bitrate: 'Bitrate:',

-

-	deselect: 'Deseleziona',

-

-	nodestroy: 'La cancellazioni dei file è disabilitata.',

-

-	toggle_side_boxes: 'Thumbnail view',

-	toggle_side_list: 'List view',

-	show_dir_thumb_gallery: 'Show thumbnails of the files in the preview pane',

-	drag_n_drop: 'Drag & drop has been enabled for this directory',

-	drag_n_drop_disabled: 'Drag & drop has been temporarily disabled for this directory',

-	goto_page: 'Go to page',

-

-	'backend.disabled': 'L Upload dei file è disabilitato.',

-	'backend.authorized': 'Non sei autorizzato a fare l upload dei file.',

-	'backend.path': 'La cartella degli upload non esiste. Contattare il webmaster.',

-	'backend.exists': 'La cartella specificata per gli upload esiste già. Contattare il webmaster.',

-	'backend.mime': 'Il tipo del file specificato non è consentito.',

-	'backend.extension': 'Il tipo di file che si vuole caricare non è consentito o è sconosciuto.',

-	'backend.size': 'La dimensione del file è troppo grande per essere processato. Ricarica un file con dimensioni ridotte.',

-	'backend.partial': 'Il file è stato parzialmente caricato. Per favore, prova a ricaricarlo.',

-	'backend.nofile': 'Non è stato specificato alcun file da caricare.',

-	'backend.default': 'Mi spiace, l operazione non è andata a buon fine.',

-	'backend.path_not_writable': 'You do not have write/upload permissions for this directory.',

-	'backend.filename_maybe_too_large': 'The filename/path is probably too long for the server filesystem. Please retry with a shorter file name.',

-	'backend.fmt_not_allowed': 'You are not allowed to upload this file format/name.',

-	'backend.read_error': 'Cannot read / download the specified file.',

-	'backend.unidentified_error': 'An unindentified error occurred while communicating with the backend (web server).',

-

-	'backend.nonewfile': 'A new name for the file to be moved / copied is missing.',

-	'backend.corrupt_img': 'This file is a not a image or a corrupt file: ', // path

-	'backend.resize_inerr': 'This file could not be resized due to an internal error.',

-	'backend.copy_failed': 'An error occurred while copying the file / directory: ', // oldlocalpath : newlocalpath

-	'backend.delete_cache_entries_failed': 'An error occurred when attempting to delete the item cache (thumbnails, metadata)',

-	'backend.mkdir_failed': 'An error occurred when attempting to create the directory: ', // path

-	'backend.move_failed': 'An error occurred while moving / renaming the file / directory: ', // oldlocalpath : newlocalpath

-	'backend.path_tampering': 'Path tampering detected.',

-	'backend.realpath_failed': 'Cannot translate the given file specification to a valid storage location: ', // $path

-	'backend.unlink_failed': 'An error occurred when attempting to delete the file / directory: ',  // path

-

-	// Image.class.php:

-	'backend.process_nofile': 'The image processing unit did not receive a valid file location to work on.',

-	'backend.imagecreatetruecolor_failed': 'The image processing unit failed: GD imagecreatetruecolor() failed.',

-	'backend.imagealphablending_failed': 'The image processing unit failed: cannot perform the required image alpha blending.',

-	'backend.imageallocalpha50pctgrey_failed': 'The image processing unit failed: cannot allocate space for the alpha channel and the 50% background.',

-	'backend.imagecolorallocatealpha_failed': 'The image processing unit failed: cannot allocate space for the alpha channel for this color image.',

-	'backend.imagerotate_failed': 'The image processing unit failed: GD imagerotate() failed.',

-	'backend.imagecopyresampled_failed': 'The image processing unit failed: GD imagecopyresampled() failed. Image resolution: ', /* x * y */

-	'backend.imagecopy_failed': 'The image processing unit failed: GD imagecopy() failed.',

-	'backend.imageflip_failed': 'The image processing unit failed: cannot flip the image.',

-	'backend.imagejpeg_failed': 'The image processing unit failed: GD imagejpeg() failed.',

-	'backend.imagepng_failed': 'The image processing unit failed: GD imagepng() failed.',

-	'backend.imagegif_failed': 'The image processing unit failed: GD imagegif() failed.',

-	'backend.imagecreate_failed': 'The image processing unit failed: GD imagecreate() failed.',

-	'backend.cvt2truecolor_failed': 'conversion to True Color failed. Image resolution: ', /* x * y */

-	'backend.no_imageinfo': 'Corrupt image or not an image file at all.',

-	'backend.img_will_not_fit': 'Server error: image does not fit in available RAM; minimum required (estimate): ', /* XXX MBytes */

-	'backend.unsupported_imgfmt': 'unsupported image format: ',    /* jpeg/png/gif/... */

-

-	/* FU */

-	uploader: {

-		unknown: 'Errore sconosciuto',

-		sizeLimitMin: 'Non puoi caricare "<em>${name}</em>" (${size}), la dimensione minima del file è <strong>${size_min}</strong>!',

-		sizeLimitMax: 'Non puoi caricare "<em>${name}</em>" (${size}), la dimensione massima del file è <strong>${size_max}</strong>!',

-		mod_security: 'No response was given from the uploader, this may mean that "mod_security" is active on the server and one of the rules in mod_security has cancelled this request.  If you can not disable mod_security, you may need to use the NoFlash Uploader.'

-	},

-

-	flash: {

-		hidden: 'To enable the embedded uploader, unblock it in your browser and refresh (see Adblock).',

-		disabled: 'To enable the embedded uploader, enable the blocked Flash movie  and refresh (see Flashblock).',

-		flash: 'In order to upload files you need to install <a href="http://www.adobe.com/shockwave/download/download.cgi?P1_Prod_Version=ShockwaveFlash">Adobe Flash</a>.'

-	},

-

-	resizeImages: 'Ridimensiona immagini grandi',

-

-	serialize: 'Salva galleria',

-	gallery: {

-		text: 'Titolo immagine',

-		save: 'Salva',

-		remove: 'Rimuovi dalla galleria',

-		drag: 'Sposta gli oggetti qui per creare una galleria...'

-	}

-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/MootoolsFileManager/mootools-filemanager/Language/Language.nl.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/MootoolsFileManager/mootools-filemanager/Language/Language.nl.js
deleted file mode 100644
index ef80eb5..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/MootoolsFileManager/mootools-filemanager/Language/Language.nl.js
+++ /dev/null
@@ -1,125 +0,0 @@
-/*

-Script: Language.nl.js

-	MooTools FileManager - Language Strings in Dutch

-

-Translation:

-	[Dave De Vos](http://wnz.be)

-*/

-

-FileManager.Language.nl = {

-	more: 'Details',

-	width: 'Breedte:',

-	height: 'Hoogte:',

-

-	ok: 'Ok',

-	open: 'Kies bestand',

-	upload: 'Uploaden',

-	create: 'Maak map',

-	createdir: 'Geef een map-naam op:',

-	cancel: 'Annuleren',

-	error: 'Fout',

-

-	information: 'Informatie',

-	type: 'Type:',

-	size: 'Grootte:',

-	dir: 'Locatie:',

-	modified: 'Laatste wijziging:',

-	preview: 'Voorbeeld',

-	close: 'Sluiten',

-	destroy: 'Verwijderen',

-	destroyfile: 'Ben je zeker dat je dit bestand wil verwijderen?',

-

-	rename: 'Naam wijzigen',

-	renamefile: 'Geef een nieuwe bestandsnaam op:',

-	rn_mv_cp: 'Rename/Move/Copy',

-

-	download: 'Downloaden',

-	nopreview: '<i>Géén voorbeeld beschikbaar</i>',

-

-	title: 'Titel:',

-	artist: 'Artiest:',

-	album: 'Album:',

-	length: 'Lengte:',

-	bitrate: 'Bitrate:',

-

-	deselect: 'Deselecteren',

-

-	nodestroy: 'Het is niet mogelijk bestanden te verwijderen op deze server.',

-

-	toggle_side_boxes: 'Thumbnail view',

-	toggle_side_list: 'List view',

-	show_dir_thumb_gallery: 'Show thumbnails of the files in the preview pane',

-	drag_n_drop: 'Drag & drop has been enabled for this directory',

-	drag_n_drop_disabled: 'Drag & drop has been temporarily disabled for this directory',

-	goto_page: 'Go to page',

-

-	'backend.disabled': 'Deze operatie is uitgeschakeld op deze server.',

-	'backend.authorized': 'Je hebt geen toestemming om deze aktie uit te voeren.',

-	'backend.path': 'Deze map bestaat niet.  Contacteer de beheerder van deze website voor hulp.',

-	'backend.exists': 'Deze locatie bestaat reeds. Contacteer de beheerder van deze website voor hulp.',

-	'backend.mime': 'Dit bestandstype is niet toegelaten.',

-	'backend.extension': 'Het bestand heeft een onbekende of niet-toegelaten extensie.',

-	'backend.size': 'Het bestand is te groot voor verwerking.  Probeer opnieuw met een kleiner bestand.',

-	'backend.partial': 'Het bestand dat je verstuurde werd slechts gedeeltelijk ontvangen, probeer het bestand opnieuw te versturen.',

-	'backend.nofile': 'Er werd géén bestand verstuurd of het bestand / folder kon niet worden gevonden.',

-	'backend.default': 'Er ging iets fout bij het uploaden van het bestand.',

-	'backend.path_not_writable': 'You do not have write/upload permissions for this directory.',

-	'backend.filename_maybe_too_large': 'The filename/path is probably too long for the server filesystem. Please retry with a shorter file name.',

-	'backend.fmt_not_allowed': 'You are not allowed to upload this file format/name.',

-	'backend.read_error': 'Cannot read / download the specified file.',

-	'backend.unidentified_error': 'An unindentified error occurred while communicating with the backend (web server).',

-

-	'backend.nonewfile': 'A new name for the file to be moved / copied is missing.',

-	'backend.corrupt_img': 'This file is a not a image or a corrupt file: ', // path

-	'backend.resize_inerr': 'This file could not be resized due to an internal error.',

-	'backend.copy_failed': 'An error occurred while copying the file / directory: ', // oldlocalpath : newlocalpath

-	'backend.delete_cache_entries_failed': 'An error occurred when attempting to delete the item cache (thumbnails, metadata)',

-	'backend.mkdir_failed': 'An error occurred when attempting to create the directory: ', // path

-	'backend.move_failed': 'An error occurred while moving / renaming the file / directory: ', // oldlocalpath : newlocalpath

-	'backend.path_tampering': 'Path tampering detected.',

-	'backend.realpath_failed': 'Cannot translate the given file specification to a valid storage location: ', // $path

-	'backend.unlink_failed': 'An error occurred when attempting to delete the file / directory: ',  // path

-

-	// Image.class.php:

-	'backend.process_nofile': 'The image processing unit did not receive a valid file location to work on.',

-	'backend.imagecreatetruecolor_failed': 'The image processing unit failed: GD imagecreatetruecolor() failed.',

-	'backend.imagealphablending_failed': 'The image processing unit failed: cannot perform the required image alpha blending.',

-	'backend.imageallocalpha50pctgrey_failed': 'The image processing unit failed: cannot allocate space for the alpha channel and the 50% background.',

-	'backend.imagecolorallocatealpha_failed': 'The image processing unit failed: cannot allocate space for the alpha channel for this color image.',

-	'backend.imagerotate_failed': 'The image processing unit failed: GD imagerotate() failed.',

-	'backend.imagecopyresampled_failed': 'The image processing unit failed: GD imagecopyresampled() failed. Image resolution: ', /* x * y */

-	'backend.imagecopy_failed': 'The image processing unit failed: GD imagecopy() failed.',

-	'backend.imageflip_failed': 'The image processing unit failed: cannot flip the image.',

-	'backend.imagejpeg_failed': 'The image processing unit failed: GD imagejpeg() failed.',

-	'backend.imagepng_failed': 'The image processing unit failed: GD imagepng() failed.',

-	'backend.imagegif_failed': 'The image processing unit failed: GD imagegif() failed.',

-	'backend.imagecreate_failed': 'The image processing unit failed: GD imagecreate() failed.',

-	'backend.cvt2truecolor_failed': 'conversion to True Color failed. Image resolution: ', /* x * y */

-	'backend.no_imageinfo': 'Corrupt image or not an image file at all.',

-	'backend.img_will_not_fit': 'Server error: image does not fit in available RAM; minimum required (estimate): ', /* XXX MBytes */

-	'backend.unsupported_imgfmt': 'unsupported image format: ',    /* jpeg/png/gif/... */

-

-	/* FU */

-	uploader: {

-		unknown: 'Onbekende fout',

-		sizeLimitMin: 'Je kan het bestand "<em>${name}</em>" (${size}) niet toevoegen, de minimum bestandsgrootte voor upload is <strong>${size_min}</strong>!',

-		sizeLimitMax: 'Je kan het bestand "<em>${name}</em>" (${size}) niet toevoegen, de minimum bestandsgrootte voor upload is <strong>${size_max}</strong>!',

-		mod_security: 'No response was given from the uploader, this may mean that "mod_security" is active on the server and one of the rules in mod_security has cancelled this request.  If you can not disable mod_security, you may need to use the NoFlash Uploader.'

-	},

-

-	flash: {

-		hidden: 'Om de ingebouwde uploader in te schakelen, deblokkeer deze in je browser en vernieuw de pagina (zie Adblock).',

-		disabled: 'Om de ingebouwde uploader in te schakelen, schakel het geblokkeerde Flash-component in en vernieuw de pagina (zie Flashblock).',

-		flash: 'Om bestanden te kunnen uploaden dien je <a href="http://www.adobe.com/shockwave/download/download.cgi?P1_Prod_Version=ShockwaveFlash">Adobe Flash</a> te installeren.'

-	},

-

-	resizeImages: 'Pas de dimensies van grote afbeeldingen aan',

-

-	serialize: 'Save gallery',

-	gallery: {

-		text: 'Image caption',

-		save: 'Save',

-		remove: 'Remove from gallery',

-		drag: 'Drag items here to create a gallery...'

-	}

-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/MootoolsFileManager/mootools-filemanager/Language/Language.no.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/MootoolsFileManager/mootools-filemanager/Language/Language.no.js
deleted file mode 100644
index f7d2b8d..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/MootoolsFileManager/mootools-filemanager/Language/Language.no.js
+++ /dev/null
@@ -1,123 +0,0 @@
-/*
-Script: Language.en.js
-	MooTools FileManager - Language Strings in Norwegian
-
-Translation:
-	[Eilen Amundsgård]
-*/
-
-FileManager.Language.no = {
-	more: 'Detaljer',
-	width: 'Bredde:',
-	height: 'Høyde:',
-
-	ok: 'Ok',
-	open: 'Velg fil',
-	upload: 'Last opp',
-	create: 'Opprett mappe',
-	createdir: 'Angi mappenavn:',
-	cancel: 'Avbryt',
-	error: 'Feil',
-
-	information: 'Informasjon',
-	type: 'Type:',
-	size: 'Størrelse:',
-	dir: 'Plassering:',
-	modified: 'Sist endret:',
-	preview: 'Forhåndsvisning',
-	close: 'Lukk',
-	destroy: 'Slett',
-	destroyfile: 'Er du sikker på at du vil slette denne filen?',
-
-	rename: 'Endre navn',
-	renamefile: 'Angi et nytt filnavn:',
-
-	download: 'Last ned',
-	nopreview: '<i>Ingen forhåndsvisning tilgjengelig</i>',
-
-	title: 'Tittel:',
-	artist: 'Artist:',
-	album: 'Album:',
-	length: 'Lengde:',
-	bitrate: 'Bitrate:',
-
-	deselect: 'Fjern markering',
-
-	nodestroy: 'Muligheten for å slette filer er deaktivert på denne serveren.',
-
-	toggle_side_boxes: 'Thumbnail visning',
-	toggle_side_list: 'Liste visning',
-	show_dir_thumb_gallery: 'Vis thumbnails av filene i forhåndsvisningsruten',
-	drag_n_drop: 'Drag & drop er aktivert for denne mappen',
-	drag_n_drop_disabled: 'Drag & drop er midlertidig deaktivert for denne mappen',
-	goto_page: 'Gå til siden',
-
-	'backend.disabled': 'Opplasting av filer er deaktivert på denne serveren.',
-	'backend.authorized': 'Du har ikke rettigheter til å laste opp filer.',
-	'backend.path': 'Den angitte opplastingsmappen eksisterer ikke. Vennligst kontakt denne sidens administrator.',
-	'backend.exists': 'Det angitte opplastingsplasseringen finnes allerede. Vennligst kontakt denne sidens administrator.',
-	'backend.mime': 'Den angitte filtypen er ikke lovlig.',
-	'backend.extension': 'Den opplastede filen er av en ukjent eller ulovlig filtype.',
-	'backend.size': 'Størrelsen på den opplastede filen er for stor til å bli behandlet på denne serveren. Vennligst last opp en mindre fil.',
-	'backend.partial': 'Filen du lastet opp ble bare delvis opplastet, vennligst prøv å laste opp filen på nytt.',
-	'backend.nofile': 'Ingen fil ble angitt for opplasting.',
-	'backend.default': 'Noe gikk galt under opplasting av filen.',
-	'backend.path_not_writable': 'Du har ikke skrive-/opplastingrettigheter for denne mappen.',
-	'backend.filename_maybe_too_large': 'Filnavnet/stien er sannsynligvis for lang for serverens filsystem. Vennligst forsøk igjen med et kortere filnavn.',
-	'backend.fmt_not_allowed': 'Du har ikke rettigheter til å laste opp filer av denne typen eller med dette navnet.',
-	'backend.unidentified_error': 'En uidentifiserbar feil oppsto under kontakten med backend (webserveren).',
-
-	'backend.nonewfile': 'Et nytt navn for filen som skal flyttes / kopieres mangler.',
-	'backend.corrupt_img': 'Dette er enten ikke en bildefil eller så er den korrupt: ', // path
-	'backend.resize_inerr': 'På grunn av en intern feil kan ikke denne filen endre størrelse.',
-	'backend.copy_failed': 'En feil oppstod under kopiering av filen/mappen: ', // oldlocalpath : newlocalpath
-	'backend.delete_cache_entries_failed': 'En feil oppstod under et forsøk på å slette objektets cache (thumbnails, metadata)',
-	'backend.mkdir_failed': 'En feil oppstod under et forsøk på å opprette mappen: ', // path
-	'backend.move_failed': 'En feil oppstod under flytting/endring av navn på filen/mappen: ', // oldlocalpath : newlocalpath
-	'backend.path_tampering': 'Forsøk på å endre plassering er oppdaget.',
-	'backend.realpath_failed': 'Kan ikke oversette den gitte filspesifikasjonen til en gylding lagringsadresse: ', // $path
-	'backend.unlink_failed': 'En feil oppstod under et forsøk på å slette filen/mappen: ',  // path
-
-	// Image.class.php:
-	'backend.process_nofile': 'Enheten for bildeprosessering fikk ikke en gyldig filplassering å jobbe på.',
-	'backend.imagecreatetruecolor_failed': 'Enheten for bildeprosessering feilet: GD imagecreatetruecolor() feilet.',
-	'backend.imagealphablending_failed': 'Enheten for bildeprosessering feilet: kan ikke utføre alpha blending på bildet.',
-	'backend.imageallocalpha50pctgrey_failed': 'Enheten for bildeprosessering feilet: kan ikke allokere plass for alpha kanalen og 50% bakgrunn.',
-	'backend.imagecolorallocatealpha_failed': 'Enheten for bildeprosessering feilet: kan ikke allokere plass for alpha kanalen for denne fargen.',
-	'backend.imagerotate_failed': 'Enheten for bildeprosessering feilet: GD imagerotate() feilet.',
-	'backend.imagecopyresampled_failed': 'Enheten for bildeprosessering feilet: GD imagecopyresampled() feilet. Bildeoppløsning: ', /* x * y */
-	'backend.imagecopy_failed': 'Enheten for bildeprosessering feilet: GD imagecopy() feilet.',
-	'backend.imageflip_failed': 'Enheten for bildeprosessering feilet: kan ikke rotere bildet.',
-	'backend.imagejpeg_failed': 'Enheten for bildeprosessering feilet: GD imagejpeg() feilet.',
-	'backend.imagepng_failed': 'Enheten for bildeprosessering feilet: GD imagepng() feilet.',
-	'backend.imagegif_failed': 'Enheten for bildeprosessering feilet: GD imagegif() feilet.',
-	'backend.imagecreate_failed': 'Enheten for bildeprosessering feilet: GD imagecreate() feilet.',
-	'backend.cvt2truecolor_failed': 'konvertering til True Color feilet. Bildeoppløsning: ', /* x * y */
-	'backend.no_imageinfo': 'Korrupt bilde eller ikke en bildefil.',
-	'backend.img_will_not_fit': 'Server feil: bildet får ikke plass i tilgjengelig RAM; minimumskrav (estimat): ', /* XXX MBytes */
-	'backend.unsupported_imgfmt': 'bildeformat ikke støttet: ',    /* jpeg/png/gif/... */
-
-	/* FU */
-	uploader: {
-		unknown: 'Ukjent feil',
-		sizeLimitMin: 'Du kan ikke laste opp "<em>${name}</em>" (${size}), minste tillatte størrelse er <strong>${size_min}</strong>!',
-		sizeLimitMax: 'Du kan ikke laste opp "<em>${name}</em>" (${size}), største tillatte størrelse er <strong>${size_max}</strong>!',
-		mod_security: 'Fikk ikke svar fra opplasteren, dette kan bety at "mod_security" er aktivert på serveren og at en av reglene i mod_security har avbrutt denne forespørselen. Hvis du ikke kan deaktivere mod_security, er det mulig du må bruke NoFlash opplasteren.'
-	},
-
-	flash: {
-		hidden: 'For å aktivere den innebygde opplasteren, fjern blokkeringen i din nettleser og oppdater siden (se Adblock).',
-		disabled: 'For å aktivere den innebygde opplasteren, aktiver den blokkerte Flashfilmen og oppdater siden (se Flashblock).',
-		flash: 'For å kunne laste opp filene dine må du installere <a href="http://www.adobe.com/shockwave/download/download.cgi?P1_Prod_Version=ShockwaveFlash">Adobe Flash</a>.'
-	},
-
-	resizeImages: 'Juster størrelse på store bilder under opplasting',
-
-	serialize: 'Lagre galleri',
-	gallery: {
-		text: 'Bildetittel',
-		save: 'Lagre',
-		remove: 'Fjern fra galleri',
-		drag: 'Dra filer hit for å lage et galleri...'
-	}
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/MootoolsFileManager/mootools-filemanager/Language/Language.pl.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/MootoolsFileManager/mootools-filemanager/Language/Language.pl.js
deleted file mode 100644
index 3d24630..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/MootoolsFileManager/mootools-filemanager/Language/Language.pl.js
+++ /dev/null
@@ -1,126 +0,0 @@
-/*

-Script: Language.pl.js

-	MooTools FileManager - Language Strings in Polish

-

-Translation:

-	[Marek Kalucki](http://www.webdeco.pl)

-    [Grzegorz Nakonieczny](http://naki.info/)

-*/

-

-FileManager.Language.pl = {

-	more: 'Szczegóły',

-	width: 'Szerokość:',

-	height: 'Wysokość:',

-

-	ok: 'Ok',

-	open: 'Wybierz plik',

-	upload: 'Wyślij',

-	create: 'Utwórz folder',

-	createdir: 'Podaj nazwę folderu:',

-	cancel: 'Anuluj',

-	error: 'Błąd',

-

-	information: 'Informacje',

-	type: 'Typ:',

-	size: 'Rozmiar:',

-	dir: 'Ścieżka:',

-	modified: 'Ost. modyfikacja:',

-	preview: 'Podgląd',

-	close: 'Zamknij',

-	destroy: 'Usuń',

-	destroyfile: 'Czy na pewno chcesz usunąć ten plik?',

-

-	rename: 'Zmień nazwę',

-	renamefile: 'Podaj nową nazwę pliku:',

-	rn_mv_cp: 'Rename/Move/Copy',

-

-	download: 'Pobierz',

-	nopreview: '<i>Podgląd niedostępny</i>',

-

-	title: 'Tytuł:',

-	artist: 'Wykonawca:',

-	album: 'Płyta:',

-	length: 'Długość:',

-	bitrate: 'Przepływność:',

-

-	deselect: 'Odznacz',

-

-	nodestroy: 'Usuwanie plików z serwera zostało wyłączone.',

-

-	toggle_side_boxes: 'Thumbnail view',

-	toggle_side_list: 'List view',

-	show_dir_thumb_gallery: 'Show thumbnails of the files in the preview pane',

-	drag_n_drop: 'Drag & drop has been enabled for this directory',

-	drag_n_drop_disabled: 'Drag & drop has been temporarily disabled for this directory',

-	goto_page: 'Go to page',

-

-	'backend.disabled': 'Wysyłanie plików na serwer zostało wyłączone.',

-	'backend.authorized': 'Nie jesteś upoważniony do wysyłania plików na serwer.',

-	'backend.path': 'Folder do wysyłania plików nie istnieje. Skontaktuj się z administratorem.',

-	'backend.exists': 'Folder do wysyłania plików istnieje. Skontaktuj się z administratorem.',

-	'backend.mime': 'Typ wybranego pliku jest niedozwolony.',

-	'backend.extension': 'Wysyłany plik ma nieznane lub niedozwolone rozszerzenie.',

-	'backend.size': 'Rozmiar wysyłanego pliku jest zbyt duży. Wyślij mniejszy plik (jeśli wysyłasz obrazy-zmniejsz obraz na swoim komputerze i ponów wysyłanie).',

-	'backend.partial': 'Plik nie został wysłany w całości. Ponów próbę wysyłki pliku.',

-	'backend.nofile': 'Nie wybrano pliku do wysyłki.',

-	'backend.default': 'Wystąpił błąd w trakcie wysyłki.',

-	'backend.path_not_writable': 'You do not have write/upload permissions for this directory.',

-	'backend.filename_maybe_too_large': 'The filename/path is probably too long for the server filesystem. Please retry with a shorter file name.',

-	'backend.fmt_not_allowed': 'You are not allowed to upload this file format/name.',

-	'backend.read_error': 'Cannot read / download the specified file.',

-	'backend.unidentified_error': 'An unindentified error occurred while communicating with the backend (web server).',

-

-	'backend.nonewfile': 'A new name for the file to be moved / copied is missing.',

-	'backend.corrupt_img': 'This file is a not a image or a corrupt file: ', // path

-	'backend.resize_inerr': 'This file could not be resized due to an internal error.',

-	'backend.copy_failed': 'An error occurred while copying the file / directory: ', // oldlocalpath : newlocalpath

-	'backend.delete_cache_entries_failed': 'An error occurred when attempting to delete the item cache (thumbnails, metadata)',

-	'backend.mkdir_failed': 'An error occurred when attempting to create the directory: ', // path

-	'backend.move_failed': 'An error occurred while moving / renaming the file / directory: ', // oldlocalpath : newlocalpath

-	'backend.path_tampering': 'Path tampering detected.',

-	'backend.realpath_failed': 'Cannot translate the given file specification to a valid storage location: ', // $path

-	'backend.unlink_failed': 'An error occurred when attempting to delete the file / directory: ',  // path

-

-	// Image.class.php:

-	'backend.process_nofile': 'The image processing unit did not receive a valid file location to work on.',

-	'backend.imagecreatetruecolor_failed': 'The image processing unit failed: GD imagecreatetruecolor() failed.',

-	'backend.imagealphablending_failed': 'The image processing unit failed: cannot perform the required image alpha blending.',

-	'backend.imageallocalpha50pctgrey_failed': 'The image processing unit failed: cannot allocate space for the alpha channel and the 50% background.',

-	'backend.imagecolorallocatealpha_failed': 'The image processing unit failed: cannot allocate space for the alpha channel for this color image.',

-	'backend.imagerotate_failed': 'The image processing unit failed: GD imagerotate() failed.',

-	'backend.imagecopyresampled_failed': 'The image processing unit failed: GD imagecopyresampled() failed. Image resolution: ', /* x * y */

-	'backend.imagecopy_failed': 'The image processing unit failed: GD imagecopy() failed.',

-	'backend.imageflip_failed': 'The image processing unit failed: cannot flip the image.',

-	'backend.imagejpeg_failed': 'The image processing unit failed: GD imagejpeg() failed.',

-	'backend.imagepng_failed': 'The image processing unit failed: GD imagepng() failed.',

-	'backend.imagegif_failed': 'The image processing unit failed: GD imagegif() failed.',

-	'backend.imagecreate_failed': 'The image processing unit failed: GD imagecreate() failed.',

-	'backend.cvt2truecolor_failed': 'conversion to True Color failed. Image resolution: ', /* x * y */

-	'backend.no_imageinfo': 'Corrupt image or not an image file at all.',

-	'backend.img_will_not_fit': 'Server error: image does not fit in available RAM; minimum required (estimate): ', /* XXX MBytes */

-	'backend.unsupported_imgfmt': 'unsupported image format: ',    /* jpeg/png/gif/... */

-

-	/* FU */

-	uploader: {

-		unknown: 'Wystąpił nieznany błąd.',

-		sizeLimitMin: 'Nie można wybrać "<em>${name}</em>" (${size}), minimalny rozmiar pliku to <strong>${size_min}</strong>!',

-		sizeLimitMax: 'Nie można wybrać "<em>${name}</em>" (${size}), maksymalny rozmiar pliku to <strong>${size_max}</strong>!',

-		mod_security: 'No response was given from the uploader, this may mean that "mod_security" is active on the server and one of the rules in mod_security has cancelled this request.  If you can not disable mod_security, you may need to use the NoFlash Uploader.'

-	},

-

-	flash: {

-		hidden: 'Aby włączyć wysyłanie plików, odblokuj go w swojej przeglądarce i odśwież stronę (prawdopodobnie wysyłanie plików jest blokowane przez wtyczkę Adblock).',

-		disabled: 'Aby włączyć wysyłanie plików, odblokuj obiekt Flash i odśwież stronę (prawdopodobnie wysyłanie plików blokowane jest przez wtyczkę Flashblock).',

-		flash: 'Aby wysyłać pliki na serwer, należy zainstalować w przeglądarce wtyczkę <a href="http://www.adobe.com/shockwave/download/download.cgi?P1_Prod_Version=ShockwaveFlash">Adobe Flash</a>.'

-	},

-

-	resizeImages: 'Zmniejsz duże obrazy w trakcie wysyłania',

-

-    serialize: 'Zapisz galerię',

-    gallery: {

-        text: 'Podpis',

-        save: 'Zapisz',

-        remove: 'Usuń element z galerii',

-        drag: 'Przeciągnij tutaj elementy aby utworzyć galerię...'

-    }

-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/MootoolsFileManager/mootools-filemanager/Language/Language.pt.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/MootoolsFileManager/mootools-filemanager/Language/Language.pt.js
deleted file mode 100644
index bbec8bc..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/MootoolsFileManager/mootools-filemanager/Language/Language.pt.js
+++ /dev/null
@@ -1,125 +0,0 @@
-/*
-Script: Language.pt.js
-	MooTools FileManager - Language Strings in European Portuguese
-
-Translation:
-	[Alexandre Rocha](http://twitter.com/procy0n)
-*/
-
-FileManager.Language.pt = {
-	more: 'Detalhes',
-	width: 'Largura:',
-	height: 'Altura:',
-
-	ok: 'Ok',
-	open: 'Seleccionar ficheiro',
-	upload: 'Enviar',
-	create: 'Criar pasta',
-	createdir: 'Por favor especifique o nome da pasta:',
-	cancel: 'Cancelar',
-	error: 'Erro',
-
-	information: 'Informação',
-	type: 'Tipo:',
-	size: 'Tamanho:',
-	dir: 'Caminho:',
-	modified: 'Última modificação:',
-	preview: 'Pré-visualizar',
-	close: 'Fechar',
-	destroy: 'Apagar',
-	destroyfile: 'Tem a certeza que quer apagar este ficheiro?',
-
-	rename: 'Renomear',
-	renamefile: 'Por favor introduza o novo nome do ficheiro:',
-	rn_mv_cp: 'Rename/Move/Copy',
-
-	download: 'Descarregar',
-	nopreview: '<i>Pré-visualização não disponível</i>',
-
-	title: 'Título:',
-	artist: 'Artista:',
-	album: 'Album:',
-	length: 'Duração:',
-	bitrate: 'Taxa de bits:',
-
-	deselect: 'Desfazer',
-
-	nodestroy: 'Apagamento de ficheiros desactivado neste servidor.',
-
-	toggle_side_boxes: 'Thumbnail view',
-	toggle_side_list: 'List view',
-	show_dir_thumb_gallery: 'Show thumbnails of the files in the preview pane',
-	drag_n_drop: 'Drag & drop has been enabled for this directory',
-	drag_n_drop_disabled: 'Drag & drop has been temporarily disabled for this directory',
-	goto_page: 'Go to page',
-
-	'backend.disabled': 'Envio de ficheiros desactivado neste servidor.',
-	'backend.authorized': 'Não está autenticado para o envio de ficheiros.',
-	'backend.path': 'A pasta especificada para envio de ficheiros não existe. Por favor contacte o administrador do site.',
-	'backend.exists': 'O caminho especificado já existe. Por favor contacte o administrador do site.',
-	'backend.mime': 'Tipo de ficheiro especificado não permitido.',
-	'backend.extension': 'Extensão do ficheiro enviado desconhecido ou não permitido.',
-	'backend.size': 'Tamanho do ficheiro demasiado grande para ser processado neste servidor. Por favor envie um ficheiro mais pequeno.',
-	'backend.partial': 'Envio incompleto do ficheiro, por favor tente novamente.',
-	'backend.nofile': 'Nenhum ficheiro seleccionado para enviar.',
-	'backend.default': 'Erro no envio do ficheiro.',
-	'backend.path_not_writable': 'You do not have write/upload permissions for this directory.',
-	'backend.filename_maybe_too_large': 'The filename/path is probably too long for the server filesystem. Please retry with a shorter file name.',
-	'backend.fmt_not_allowed': 'You are not allowed to upload this file format/name.',
-	'backend.read_error': 'Cannot read / download the specified file.',
-	'backend.unidentified_error': 'An unindentified error occurred while communicating with the backend (web server).',
-
-	'backend.nonewfile': 'A new name for the file to be moved / copied is missing.',
-	'backend.corrupt_img': 'This file is a not a image or a corrupt file: ', // path
-	'backend.resize_inerr': 'This file could not be resized due to an internal error.',
-	'backend.copy_failed': 'An error occurred while copying the file / directory: ', // oldlocalpath : newlocalpath
-	'backend.delete_cache_entries_failed': 'An error occurred when attempting to delete the item cache (thumbnails, metadata)',
-	'backend.mkdir_failed': 'An error occurred when attempting to create the directory: ', // path
-	'backend.move_failed': 'An error occurred while moving / renaming the file / directory: ', // oldlocalpath : newlocalpath
-	'backend.path_tampering': 'Path tampering detected.',
-	'backend.realpath_failed': 'Cannot translate the given file specification to a valid storage location: ', // $path
-	'backend.unlink_failed': 'An error occurred when attempting to delete the file / directory: ',  // path
-
-	// Image.class.php:
-	'backend.process_nofile': 'The image processing unit did not receive a valid file location to work on.',
-	'backend.imagecreatetruecolor_failed': 'The image processing unit failed: GD imagecreatetruecolor() failed.',
-	'backend.imagealphablending_failed': 'The image processing unit failed: cannot perform the required image alpha blending.',
-	'backend.imageallocalpha50pctgrey_failed': 'The image processing unit failed: cannot allocate space for the alpha channel and the 50% background.',
-	'backend.imagecolorallocatealpha_failed': 'The image processing unit failed: cannot allocate space for the alpha channel for this color image.',
-	'backend.imagerotate_failed': 'The image processing unit failed: GD imagerotate() failed.',
-	'backend.imagecopyresampled_failed': 'The image processing unit failed: GD imagecopyresampled() failed. Image resolution: ', /* x * y */
-	'backend.imagecopy_failed': 'The image processing unit failed: GD imagecopy() failed.',
-	'backend.imageflip_failed': 'The image processing unit failed: cannot flip the image.',
-	'backend.imagejpeg_failed': 'The image processing unit failed: GD imagejpeg() failed.',
-	'backend.imagepng_failed': 'The image processing unit failed: GD imagepng() failed.',
-	'backend.imagegif_failed': 'The image processing unit failed: GD imagegif() failed.',
-	'backend.imagecreate_failed': 'The image processing unit failed: GD imagecreate() failed.',
-	'backend.cvt2truecolor_failed': 'conversion to True Color failed. Image resolution: ', /* x * y */
-	'backend.no_imageinfo': 'Corrupt image or not an image file at all.',
-	'backend.img_will_not_fit': 'Server error: image does not fit in available RAM; minimum required (estimate): ', /* XXX MBytes */
-	'backend.unsupported_imgfmt': 'unsupported image format: ',    /* jpeg/png/gif/... */
-
-	/* FU */
-	uploader: {
-		unknown: 'Erro desconhecido',
-		sizeLimitMin: 'Não é permitido anexar "<em>${name}</em>" (${size}), o tamanho mínimo do ficheiro é de<strong>${size_min}</strong>!',
-		sizeLimitMax: 'Não é permitido anexar "<em>${name}</em>" (${size}), o tamanho máximo do ficheiro é de <strong>${size_max}</strong>!',
-		mod_security: 'No response was given from the uploader, this may mean that "mod_security" is active on the server and one of the rules in mod_security has cancelled this request.  If you can not disable mod_security, you may need to use the NoFlash Uploader.'
-	},
-
-	flash: {
-		hidden: 'Para activar o envio, desbloqueie-o no navegador e recarregue a página (ver Adblock).',
-		disabled: 'Para activar o envio, active o ficheiro Flash e recarregue a página (ver Flashblock).',
-		flash: 'Para enviar ficheiros precisa de instalar <a href="http://www.adobe.com/shockwave/download/download.cgi?P1_Prod_Version=ShockwaveFlash">Adobe Flash</a>.'
-	},
-
-	resizeImages: 'Redimensionar imagens grandes ao enviar',
-
-	serialize: 'Guardar galeria',
-	gallery: {
-		text: 'Legenda da imagem',
-		save: 'Guardar',
-		remove: 'Remover da galeria',
-		drag: 'Arraste os items para criar a galeria...'
-	}
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/MootoolsFileManager/mootools-filemanager/Language/Language.ru.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/MootoolsFileManager/mootools-filemanager/Language/Language.ru.js
deleted file mode 100644
index b4bcbf2..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/MootoolsFileManager/mootools-filemanager/Language/Language.ru.js
+++ /dev/null
@@ -1,125 +0,0 @@
-/*

-Script: Language.ru.js

-	MooTools FileManager - Language Strings in Russian

-

-Translation:

-	[Ilya V. Goryachev](http://cok-studio.ru/)

-*/

-

-FileManager.Language.ru = {

-	more: 'Подробнее',

-	width: 'Ширина:',

-	height: 'Высота:',

-

-	ok: 'Ok',

-	open: 'Выбрать файл',

-	upload: 'Загрузка',

-	create: 'Создать папку',

-	createdir: 'Пожалуйста укажите имя папки:',

-	cancel: 'Отмена',

-	error: 'Ошибка',

-

-	information: 'Информация',

-	type: 'Тип:',

-	size: 'Размер:',

-	dir: 'Путь:',

-	modified: 'Последнее изменение:',

-	preview: 'Предпросмотр',

-	close: 'Закрыть',

-	destroy: 'Удалить',

-	destroyfile: 'Уверены, что хотите удалить этот файл?',

-

-	rename: 'Переименовать',

-	renamefile: 'Пожалуйста укажите имя файла:',

-	rn_mv_cp: 'Rename/Move/Copy',

-

-	download: 'Скачать',

-	nopreview: '<i>Предпросмотр недоступен</i>',

-

-	title: 'Название:',

-	artist: 'Исполнитель:',

-	album: 'Альбом:',

-	length: 'Продолжительность:',

-	bitrate: 'Битрэйт:',

-

-	deselect: 'Снять выделение',

-

-	nodestroy: 'Удаление файлов отключено на сервере.',

-

-	toggle_side_boxes: 'Thumbnail view',

-	toggle_side_list: 'List view',

-	show_dir_thumb_gallery: 'Show thumbnails of the files in the preview pane',

-	drag_n_drop: 'Drag & drop has been enabled for this directory',

-	drag_n_drop_disabled: 'Drag & drop has been temporarily disabled for this directory',

-	goto_page: 'Go to page',

-

-	'backend.disabled': 'Загрузка файлов отключена на сервере.',

-	'backend.authorized': 'Вам не разрешено загружать файлы.',

-	'backend.path': 'Указанная директория для загрузки файлов не существует. Пожалуйста обратитесь к администратору сайта.',

-	'backend.exists': 'Указанная директория для загрузки файлов уже существует. Пожалуйста обратитесь к администратору сайта',

-	'backend.mime': 'Такой тип файла не поддерживается.',

-	'backend.extension': 'Загруженный файл не опознан или такое расширение не разрешено.',

-	'backend.size': 'Размер загружаемого файла слишком велик. Пожалуйста загрузите файл поменьше.',

-	'backend.partial': 'Файл был загружен частично, пожалуйста загрузите этот файл еще раз.',

-	'backend.nofile': 'Не указаны файлы для загрузки.',

-	'backend.default': 'При загрузке файлов что-то пошло не так.',

-	'backend.path_not_writable': 'You do not have write/upload permissions for this directory.',

-	'backend.filename_maybe_too_large': 'The filename/path is probably too long for the server filesystem. Please retry with a shorter file name.',

-	'backend.fmt_not_allowed': 'You are not allowed to upload this file format/name.',

-	'backend.read_error': 'Cannot read / download the specified file.',

-	'backend.unidentified_error': 'An unindentified error occurred while communicating with the backend (web server).',

-

-	'backend.nonewfile': 'A new name for the file to be moved / copied is missing.',

-	'backend.corrupt_img': 'This file is a not a image or a corrupt file: ', // path

-	'backend.resize_inerr': 'This file could not be resized due to an internal error.',

-	'backend.copy_failed': 'An error occurred while copying the file / directory: ', // oldlocalpath : newlocalpath

-	'backend.delete_cache_entries_failed': 'An error occurred when attempting to delete the item cache (thumbnails, metadata)',

-	'backend.mkdir_failed': 'An error occurred when attempting to create the directory: ', // path

-	'backend.move_failed': 'An error occurred while moving / renaming the file / directory: ', // oldlocalpath : newlocalpath

-	'backend.path_tampering': 'Path tampering detected.',

-	'backend.realpath_failed': 'Cannot translate the given file specification to a valid storage location: ', // $path

-	'backend.unlink_failed': 'An error occurred when attempting to delete the file / directory: ',  // path

-

-	// Image.class.php:

-	'backend.process_nofile': 'The image processing unit did not receive a valid file location to work on.',

-	'backend.imagecreatetruecolor_failed': 'The image processing unit failed: GD imagecreatetruecolor() failed.',

-	'backend.imagealphablending_failed': 'The image processing unit failed: cannot perform the required image alpha blending.',

-	'backend.imageallocalpha50pctgrey_failed': 'The image processing unit failed: cannot allocate space for the alpha channel and the 50% background.',

-	'backend.imagecolorallocatealpha_failed': 'The image processing unit failed: cannot allocate space for the alpha channel for this color image.',

-	'backend.imagerotate_failed': 'The image processing unit failed: GD imagerotate() failed.',

-	'backend.imagecopyresampled_failed': 'The image processing unit failed: GD imagecopyresampled() failed. Image resolution: ', /* x * y */

-	'backend.imagecopy_failed': 'The image processing unit failed: GD imagecopy() failed.',

-	'backend.imageflip_failed': 'The image processing unit failed: cannot flip the image.',

-	'backend.imagejpeg_failed': 'The image processing unit failed: GD imagejpeg() failed.',

-	'backend.imagepng_failed': 'The image processing unit failed: GD imagepng() failed.',

-	'backend.imagegif_failed': 'The image processing unit failed: GD imagegif() failed.',

-	'backend.imagecreate_failed': 'The image processing unit failed: GD imagecreate() failed.',

-	'backend.cvt2truecolor_failed': 'conversion to True Color failed. Image resolution: ', /* x * y */

-	'backend.no_imageinfo': 'Corrupt image or not an image file at all.',

-	'backend.img_will_not_fit': 'Server error: image does not fit in available RAM; minimum required (estimate): ', /* XXX MBytes */

-	'backend.unsupported_imgfmt': 'unsupported image format: ',    /* jpeg/png/gif/... */

-

-	/* FU */

-	uploader: {

-		unknown: 'Неизвестная ошибка',

-		sizeLimitMin: 'Невозможно прикрепить файл "<em>${name}</em>" (${size}), минимальный размер фала <strong>${size_min}</strong>!',

-		sizeLimitMax: 'Невозможно прикрепить файл "<em>${name}</em>" (${size}), максимальный размер файла <strong>${size_max}</strong>!',

-		mod_security: 'No response was given from the uploader, this may mean that "mod_security" is active on the server and one of the rules in mod_security has cancelled this request.  If you can not disable mod_security, you may need to use the NoFlash Uploader.'

-	},

-

-	flash: {

-		hidden: 'Чтобы включить embedded загрузчик, разблокируйте подключаемые элементы в вашем браузере (см. Блокировку рекламы).',

-		disabled: 'Чтобы включить embedded загрузчик, снимите блокировку флеш и обновите страницу (см. Блокировка флеш).',

-		flash: 'Чтобы загружать файлы, Вам необходимо установить <a href="http://www.adobe.com/shockwave/download/download.cgi?P1_Prod_Version=ShockwaveFlash">Adobe Flash</a>.'

-	},

-

-	resizeImages: 'Менять размер больших изображений при загрузке',

-

-	serialize: 'Save gallery',

-	gallery: {

-		text: 'Image caption',

-		save: 'Save',

-		remove: 'Remove from gallery',

-		drag: 'Drag items here to create a gallery...'

-	}

-};

diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/MootoolsFileManager/mootools-filemanager/Language/Language.se.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/MootoolsFileManager/mootools-filemanager/Language/Language.se.js
deleted file mode 100644
index 7d7fe83..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/MootoolsFileManager/mootools-filemanager/Language/Language.se.js
+++ /dev/null
@@ -1,126 +0,0 @@
-/*

-Script: Language.se.js

-	MooTools FileManager - Language Strings in Swedish

-

-Translation:

-	[Marcus *xintron* Carlsson](http://xintron.se)

-*/

-

-FileManager.Language.se = {

-	more: 'Detaljer',

-	width: 'Bredd:',

-	height: 'Höjd:',

-

-	ok: 'Ok',

-	open: 'Välj fil',

-	upload: 'Ladda upp',

-	create: 'Skapa mapp',

-	createdir: 'Vänligen ange ett mapp-namn:',

-	cancel: 'Avbryt',

-	error: 'Fel',

-

-	information: 'Information',

-	type: 'Typ:',

-	size: 'Storlek:',

-	dir: 'Sökväg:',

-	modified: 'Senast ändad:',

-	preview: 'Förhandsgranska',

-	close: 'Stäng',

-	destroy: 'Ta bort',

-	destroyfile: 'Är du säker på att du vill ta bort filen?',

-

-	rename: 'Döp om',

-	renamefile: 'Vänligen ange ett nytt filnamn:',

-	rn_mv_cp: 'Rename/Move/Copy',

-

-	download: 'Ladda ner',

-	nopreview: '<i>Ingen förhandsgranskning tillgänglig</i>',

-

-	title: 'Titel:',

-	artist: 'Artist:',

-	album: 'Album:',

-	length: 'Längd:',

-	bitrate: 'Bitrate:',

-

-	deselect: 'Avmarkera',

-

-	nodestroy: 'Funktionen ta bort filer är avstängd på denna server.',

-

-	toggle_side_boxes: 'Thumbnail view',

-	toggle_side_list: 'List view',

-	show_dir_thumb_gallery: 'Show thumbnails of the files in the preview pane',

-	drag_n_drop: 'Drag & drop has been enabled for this directory',

-	drag_n_drop_disabled: 'Drag & drop has been temporarily disabled for this directory',

-	goto_page: 'Go to page',

-

-	'backend.disabled': 'Uppladdning är avstängt på denna server.',

-	'backend.authorized': 'Du har inte behörighet att ladda upp filer.',

-	'backend.path': 'Den angivna uppladdnings-mappen existerar inte. Vänligen kontakta serveradministratören.',

-	'backend.exists': 'Den angivna uppladdnings-mappen existerar redan. Vänligen kontakta serveradministratören.',

-	'backend.mime': 'Denna filtyp accepteras inte på denna server.',

-	'backend.extension': 'Den uppladdade filen har en okänd eller förbjuden filändelse.',

-	'backend.size': 'Filen är för stor för denna server. Vänligen ladda upp en mindre fil.',

-	'backend.partial': 'Ett fel uppstod och hela filen kunde inte laddas upp. Vänligen försök igen.',

-	'backend.nofile': 'Du måste välja en fil att ladda upp.',

-	'backend.default': 'Ett fel inträffade under uppladdningen.',

-	'backend.path_not_writable': 'You do not have write/upload permissions for this directory.',

-	'backend.filename_maybe_too_large': 'The filename/path is probably too long for the server filesystem. Please retry with a shorter file name.',

-	'backend.fmt_not_allowed': 'You are not allowed to upload this file format/name.',

-	'backend.read_error': 'Cannot read / download the specified file.',

-	'backend.unidentified_error': 'An unindentified error occurred while communicating with the backend (web server).',

-

-	'backend.nonewfile': 'A new name for the file to be moved / copied is missing.',

-	'backend.corrupt_img': 'This file is a not a image or a corrupt file: ', // path

-	'backend.resize_inerr': 'This file could not be resized due to an internal error.',

-	'backend.copy_failed': 'An error occurred while copying the file / directory: ', // oldlocalpath : newlocalpath

-	'backend.delete_cache_entries_failed': 'An error occurred when attempting to delete the item cache (thumbnails, metadata)',

-	'backend.mkdir_failed': 'An error occurred when attempting to create the directory: ', // path

-	'backend.move_failed': 'An error occurred while moving / renaming the file / directory: ', // oldlocalpath : newlocalpath

-	'backend.path_tampering': 'Path tampering detected.',

-	'backend.realpath_failed': 'Cannot translate the given file specification to a valid storage location: ', // $path

-	'backend.unlink_failed': 'An error occurred when attempting to delete the file / directory: ',  // path

-

-	// Image.class.php:

-	'backend.process_nofile': 'The image processing unit did not receive a valid file location to work on.',

-	'backend.imagecreatetruecolor_failed': 'The image processing unit failed: GD imagecreatetruecolor() failed.',

-	'backend.imagealphablending_failed': 'The image processing unit failed: cannot perform the required image alpha blending.',

-	'backend.imageallocalpha50pctgrey_failed': 'The image processing unit failed: cannot allocate space for the alpha channel and the 50% background.',

-	'backend.imagecolorallocatealpha_failed': 'The image processing unit failed: cannot allocate space for the alpha channel for this color image.',

-	'backend.imagerotate_failed': 'The image processing unit failed: GD imagerotate() failed.',

-	'backend.imagecopyresampled_failed': 'The image processing unit failed: GD imagecopyresampled() failed. Image resolution: ', /* x * y */

-	'backend.imagecopy_failed': 'The image processing unit failed: GD imagecopy() failed.',

-	'backend.imageflip_failed': 'The image processing unit failed: cannot flip the image.',

-	'backend.imagejpeg_failed': 'The image processing unit failed: GD imagejpeg() failed.',

-	'backend.imagepng_failed': 'The image processing unit failed: GD imagepng() failed.',

-	'backend.imagegif_failed': 'The image processing unit failed: GD imagegif() failed.',

-	'backend.imagecreate_failed': 'The image processing unit failed: GD imagecreate() failed.',

-	'backend.cvt2truecolor_failed': 'conversion to True Color failed. Image resolution: ', /* x * y */

-	'backend.no_imageinfo': 'Corrupt image or not an image file at all.',

-	'backend.img_will_not_fit': 'Server error: image does not fit in available RAM; minimum required (estimate): ', /* XXX MBytes */

-	'backend.unsupported_imgfmt': 'unsupported image format: ',    /* jpeg/png/gif/... */

-

-	/* FU */

-	uploader: {

-		unknown: 'Okänt fel',

-		duplicate: 'Du kan inte ladda upp "<em>${name}</em>" (${size}), filen existerar redan!',

-		sizeLimitMin: 'Du kan inte ladda upp "<em>${name}</em>" (${size}), minsta storlek som accepteras är <strong>${size_min}</strong>!',

-		sizeLimitMax: 'Du kan inte ladda upp "<em>${name}</em>" (${size}), filens storlek får inte överstiga <strong>${size_max}</strong>!',

-		mod_security: 'No response was given from the uploader, this may mean that "mod_security" is active on the server and one of the rules in mod_security has cancelled this request.  If you can not disable mod_security, you may need to use the NoFlash Uploader.'

-	},

-

-	flash: {

-		hidden: null,

-		disabled: null,

-		flash: 'För att kunna ladda upp filer behöver du ha <a href="http://www.adobe.com/shockwave/download/download.cgi?P1_Prod_Version=ShockwaveFlash">Adobe Flash</a> installerat.'

-	},

-

-	resizeImages: 'Ändra storleken på bilden under uppladdningen',

-

-	serialize: 'Save gallery',

-	gallery: {

-		text: 'Image caption',

-		save: 'Save',

-		remove: 'Remove from gallery',

-		drag: 'Drag items here to create a gallery...'

-	}

-};

diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/MootoolsFileManager/mootools-filemanager/Language/language.zh.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/MootoolsFileManager/mootools-filemanager/Language/language.zh.js
deleted file mode 100644
index c11c0c6..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/MootoolsFileManager/mootools-filemanager/Language/language.zh.js
+++ /dev/null
@@ -1,123 +0,0 @@
-/*
-Script: Language.en.js
-	MooTools FileManager - Language Strings in Simplified Chinese
-
-Translation:
-	[Ronfey Li] (email: tangdaoke@gmail.com)
-*/
-
-FileManager.Language.zh = {
-	more: '详细',
-	width: '宽:',
-	height: '高:',
-
-	ok: '好',
-	open: '选择文件',
-	upload: '上传',
-	create: '新建文件夹',
-	createdir: '请指定一个文件夹:',
-	cancel: '取消',
-	error: '出错',
-
-	information: '详细信息',
-	type: '类别:',
-	size: '大小:',
-	dir: '路径:',
-	modified: '最后更改:',
-	preview: '预览',
-	close: '关闭',
-	destroy: '删除',
-	destroyfile: '确定删除此文件?',
-
-	rename: '重命名',
-	renamefile: '请输入新的文件名:',
-
-	download: '下载',
-	nopreview: '<i>不适用</i>',
-
-	title: '标题:',
-	artist: '艺术家:',
-	album: '专辑:',
-	length: '时间:',
-	bitrate: '比率:',
-
-	deselect: '取消选择',
-
-	nodestroy: '删除受限.',
-
-	toggle_side_boxes: '缩略图视图',
-	toggle_side_list: '列表视图',
-	show_dir_thumb_gallery: '预览面板显示文件缩略图',
-	drag_n_drop: '此文件夹的拖放功能已开启',
-	drag_n_drop_disabled: '此文件夹的拖放功能已暂时关闭',
-	goto_page: '转至页码',
-
-	'backend.disabled': '上传受限。',
-	'backend.authenticated': '您没有上传的权限。',
-	'backend.path': '上传文件夹不存在,请联系网管。',
-	'backend.exists': '上传位置已经存在,请联系网管。',
-	'backend.mime': '禁止的文件类型。',
-	'backend.extension': '上传未知或是禁止的文件类型。',
-	'backend.size': '文件过大,请重新上传小些的文件。',
-	'backend.partial': '上传的文件不完全,请重新上传。',
-	'backend.nofile': '没有指定文件。',
-	'backend.default': '上传出错。',
-	'backend.path_not_writable': '您没有更改或上传此文件夹的权限。',
-	'backend.filename_maybe_too_large': '文件名过长。请重新输入短些的名称。',
-	'backend.fmt_not_allowed': '此文件类型禁止上传。',
-	'backend.unidentified_error': '与后台服务器通讯发生未知错误。',
-
-	'backend.nonewfile': '找不到待拷贝或移动的文件的新名称.',
-	'backend.corrupt_img': '此文件不是图像或者已损坏: ', // path
-	'backend.resize_inerr': '出现内部错误此文件不能更改大小.',
-	'backend.copy_failed': '复制错误: ', // oldlocalpath : newlocalpath
-	'backend.delete_cache_entries_failed': '删除图像缓存(缩略图,元数据)出错',
-	'backend.mkdir_failed': '创建文件夹出错:', // path
-	'backend.move_failed': '移动/重命名文件或文件夹出错: ', // oldlocalpath : newlocalpath
-	'backend.path_tampering': '检测到路径更改.',
-	'backend.realpath_failed': '不能保存到有效的路径: ', // $path
-	'backend.unlink_failed': '删除文件或文件夹出错: ',  // path
-
-	// Image.class.php:
-	'backend.process_nofile': '图像处理器收到无效的文件路径。',
-	'backend.imagecreatetruecolor_failed': '图像处理器出错: GD imagecreatetruecolor() 失败.',
-	'backend.imagealphablending_failed': '图像处理器出错: 不能执行图像alpha混合.',
-	'backend.imageallocalpha50pctgrey_failed': '图像处理器出错: 不能分配空间给alpha通道和50%背景。',
-	'backend.imagecolorallocatealpha_failed': '图像处理器出错: 不能分配空间给当前彩色图像的alpha通道。',
-	'backend.imagerotate_failed': '图像处理器出错: GD imagerotate() 失败.',
-	'backend.imagecopyresampled_failed': '图像处理器出错: GD imagecopyresampled() 失败. 图像分辨率: ', /* x * y */
-	'backend.imagecopy_failed': '图像处理器出错: GD imagecopy() 失败.',
-	'backend.imageflip_failed': '图像处理器出错: 不能翻转图像.',
-	'backend.imagejpeg_failed': '图像处理器出错: GD imagejpeg() 失败.',
-	'backend.imagepng_failed': '图像处理器出错: GD imagepng() 失败.',
-	'backend.imagegif_failed': '图像处理器出错: GD imagegif() 失败.',
-	'backend.imagecreate_failed': '图像处理器出错:GD imagecreate() 失败.',
-	'backend.cvt2truecolor_failed': '转换真彩色失败。图像分辨率: ', /* x * y */
-	'backend.no_imageinfo': '损坏的图像或者文件不是图像.',
-	'backend.img_will_not_fit': '服务器出错: 内存不够;最低要求(估计): ', /* XXX MBytes */
-	'backend.unsupported_imgfmt': '不支持的图像格式: ',    /* jpeg/png/gif/... */
-
-	/* FU */
-	uploader: {
-		unknown: '未知错误',
-		sizeLimitMin: '添加 "<em>${name}</em>" (${size})失败, 文件不足<strong>${size_min}</strong>!',
-		sizeLimitMax: '添加 "<em>${name}</em>" (${size})失败, 文件超过<strong>${size_max}</strong>!',
-		mod_security: '上传器没有反应,很可能是因为“mod_security”是开启的同时它的其中一个规则取消了上传请求。如果您不能解除“mod_security”,请使用非flash上传器。'
-	},
-
-	flash: {
-		hidden: '为了使上传器生效,取消浏览器阻止,然后刷新 (见Adblock).',
-		disabled: '为了使上传器生效, 取消阻止Flash,然后刷新 (见Flashblock).',
-		flash: '上传前需安装好<a href="http://www.adobe.com/shockwave/download/download.cgi?P1_Prod_Version=ShockwaveFlash">Adobe Flash</a>.'
-	},
-
-	resizeImages: '缩小大尺寸图像',
-
-	serialize: '保存为画廊',
-	gallery: {
-		text: '图片描述',
-		save: '保存',
-		remove: '从画廊移除',
-		drag: '拖动至此创建画廊...'
-	}
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/MootoolsFileManager/mootools-filemanager/Source/FileManager.TinyMCE.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/MootoolsFileManager/mootools-filemanager/Source/FileManager.TinyMCE.js
deleted file mode 100644
index db95e4c..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/MootoolsFileManager/mootools-filemanager/Source/FileManager.TinyMCE.js
+++ /dev/null
@@ -1,67 +0,0 @@
-/*
----
-
-description: MooTools FileManager for integration with [TinyMCE](http://tinymce.moxiecode.com/)
-
-authors: Christoph Pojer (@cpojer)
-
-license: MIT-style license.
-
-requires: [Core/*]
-
-provides: FileManager.TinyMCE
-
-Usage:
-  - Pass this to the "file_browser_callback"-option of TinyMCE: FileManager.TinyMCE(function(){ return {FileManagerOptions}; });
-  - See the Demo for an example.
-...
-*/
-
-FileManager.TinyMCE = function(options){
-	/*
-	 * field: Id of the element to set value in.
-	 * url: value currently stored in the indicated element
-	 * type: Type of browser to open image/file/flash: 'file' ~ page links, 'image' ~ insert picture, 'media' ~ insert media/movie
-	 * win: window object reference
-	 */
-	return function(field, url, type, win){
-		var manager;                // jsLint warning fix
-		manager = new FileManager(Object.append({
-			onComplete: function(path, file, mgr) {
-				if (!win.document)
-					return;
-				//path = manager.escapeRFC3986(path);
-				win.document.getElementById(field).value = path;
-				if (win.ImageDialog) {
-					win.ImageDialog.showPreviewImage(path, 1);
-				}
-				this.container.destroy();
-			}
-		}, options(type),
-		{
-			zIndex: 400000,
-			styles: {
-				'width': '90%',
-				'height': '90%'
-			}
-		}));
-		var src = win.document.getElementById(field).value;
-
-		src = decodeURI(src);
-
-		if (src.length > 0)
-		{
-			//src = this.documentBaseURI.toAbsolute(src);
-		}
-		if (src.match(/^[a-z]+:/i))
-		{
-			// strip off scheme + authority sections:
-			src = src.replace(/^[a-z]+:(\/\/?)[^\/]*/i, '');
-		}
-
-		// pass full path to 'preselect': backend will take care of it for us
-		manager.show(null, null, (src.length > 0 ? src : null));
-		return manager;
-	};
-};
-
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/MootoolsFileManager/mootools-filemanager/Source/FileManager.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/MootoolsFileManager/mootools-filemanager/Source/FileManager.js
deleted file mode 100644
index d8e6727..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/MootoolsFileManager/mootools-filemanager/Source/FileManager.js
+++ /dev/null
@@ -1,3986 +0,0 @@
-/*
----
-
-description: FileManager
-
-authors: Christoph Pojer (@cpojer), Fabian Vogelsteller (@frozeman)
-
-license: MIT-style license
-
-requires:
-  core/1.3.2: '*'
-  more/1.3.2.1: [Request.Queue, Array.Extras, String.QueryString, Hash, Element.Delegation, Element.Measure, Fx.Scroll, Fx.SmoothScroll, Drag, Drag.Move, Assets, Tips, Scroller ]
-
-provides: Filemanager
-
-...
-*/
-
-var FileManager = new Class({
-
-	Implements: [Options, Events],
-
-	Request: null,
-	RequestQueue: null,
-	Directory: null,
-	Current: null,
-	ID: null,
-
-	options: {
-		/*
-		 * onComplete: function(           // Fired when the 'Select' button is clicked
-		 *                      path,      // URLencoded absolute URL path to selected file
-		 *                      file,      // the file specs object: .name, .path, .size, .date, .mime, .icon, .icon48, .thumb48, .thumb250
-		 *                      fmobj      // reference to the FileManager instance which fired the event
-		 *                     )
-		 *
-		 * onModify: function(             // Fired when either the 'Rename' or 'Delete' icons are clicked or when a file is drag&dropped.
-		 *                                 // Fired AFTER the action is executed.
-		 *                    file,        // a CLONE of the file specs object: .name, .path, .size, .date, .mime, .icon, .icon48, .thumb48, .thumb250
-		 *                    json,        // The JSON data as sent by the server for this 'destroy/rename/move/copy' request
-		 *                    mode,        // string specifying the action: 'destroy', 'rename', 'move', 'copy'
-		 *                    fmobj        // reference to the FileManager instance which fired the event
-		 *                   )
-		 *
-		 * onShow: function(               // Fired AFTER the file manager is rendered
-		 *                  fmobj          // reference to the FileManager instance which fired the event
-		 *                 )
-		 *
-		 * onHide: function(               // Fired AFTER the file manager is removed from the DOM
-		 *                  fmobj          // reference to the FileManager instance which fired the event
-		 *                 )
-		 *
-		 * onScroll: function(             // Cascade of the window scroll event
-		 *                    e,           // reference to the event object (argument passed from the window.scroll event)
-		 *                    fmobj        // reference to the FileManager instance which fired the event
-		 *                   )
-		 *
-		 * onPreview: function(            // Fired when the preview thumbnail image is clicked
-		 *                     src,        // this.get('src') ???
-		 *                     fmobj,      // reference to the FileManager instance which fired the event
-		 *                     el          // reference to the 'this' ~ the element which was clicked
-		 *                    )
-		 *
-		 * onDetails: function(            // Fired when an item is picked from the files list to be previewed
-		 *                                 // Fired AFTER the server request is completed and BEFORE the preview is rendered.
-		 *                     json,       // The JSON data as sent by the server for this 'detail' request
-		 *                     fmobj       // reference to the FileManager instance which fired the event
-		 *                    )
-		 *
-		 * onHidePreview: function(        // Fired when the preview is hidden (e.g. when uploading)
-		 *                                 // Fired BEFORE the preview is removed from the DOM.
-		 *                         fmobj   // reference to the FileManager instance which fired the event
-		 *                        )
-		 */
-		directory: '',                    // (string) the directory (relative path) which should be loaded on startup (show).
-		url: null,
-		assetBasePath: null,
-		language: 'en',
-		selectable: false,
-		destroy: false,
-		rename: false,
-		move_or_copy: false,
-		download: false,
-		createFolders: false,
-		filter: '',
-		listType: 'thumb',								// the standard list type can be 'list' or 'thumb'
-    keyboardNavigation: true,         // set to false to turn off keyboard navigation (tab, up/dn/pageup/pagedn etc)
-		detailInfoMode: '',               // (string) whether you want to receive extra metadata on select/etc. and/or view this metadata in the preview pane (modes: '', '+metaHTML', '+metaJSON'. Modes may be combined)
-    previewHandlers: {},              // [partial] mimetype: function, function is called with previewArea (DOM element, put preview in here), fileDetails
-                                      // eg { 'audio': function(previewArea,fileDetails){ previewArea.adopt(new Element('div', {text:'Hello World'});} }                            
-		deliverPathAsLegalURL: false,     // (boolean) TRUE: deliver 'legal URL' paths, i.e. 'directory'-rooted, FALSE: deliver absolute URI paths.
-		hideOnClick: false,
-		hideClose: false,
-		hideOverlay: false,
-		hideOnDelete: false,
-		hideOnSelect: true,               // (boolean). Default to true. If set to false, it leavers the FM open after a picture select.
-    showDirGallery: true,
-		thumbSize4DirGallery: 120,        // To set the thumb gallery container size for each thumb (dir-gal-thumb-bg); depending on size, it will pick either the small or large thumbnail provided by the backend and scale that one
-		zIndex: 1000,
-		styles: {},
-		listPaginationSize: 100,          // add pagination per N items for huge directories (speed up interaction)
-		listPaginationAvgWaitTime: 2000,  // adaptive pagination: strive to, on average, not spend more than this on rendering a directory chunk
-    listMaxSuggestedDirSizeForThumbnails: 30, // if a directory load has more than this many items (dirs+files), and the view mode is currently thumbs
-                                              // it is dropped back to the listing view mode, the user can still switch back, at their own risk!
-		standalone: true,                 // (boolean). Default to true. If set to false, returns the Filemanager without enclosing window / overlay.
-		parentContainer: null,            // (string). ID of the parent container. If not set, FM will consider its first container parent for fitSizes();
-		propagateData: {},                // extra query parameters sent with every request to the backend
-		verbose: false,
-		mkServerRequestURL: null          // (function) specify your own alternative URL/POST data constructor when you use a framework/system which requires such.   function([object] fm_obj, [string] request_code, [assoc.array] post_data)
-	},
-
-	/*
-	 * hook items are objects (kinda associative arrays, as they are used here), where each
-	 * key item is called when the hook is invoked.
-	 */
-	hooks: {
-		show: {},                         // invoked after the 'show' event
-		cleanup: {},                      // invoked before the 'hide' event
-		cleanupPreview: {},               // invoked before the 'hidePreview' event
-		fill: {}                          // invoked after the fill operation has completed
-	},
-
-	initialize: function(options) {
-		this.options.mkServerRequestURL = this.mkServerRequestURL;
-
-		this.setOptions(options);
-    
-    if(typeof this.options.previewHandlers.audio === 'undefined')
-    {
-      this.options.previewHandlers.audio = this.audioPreview.bind(this);
-    }
-    
-		this.diag.verbose = this.options.verbose;
-		this.ID = String.uniqueID();
-		this.droppables = [];
-		this.assetBasePath = this.options.assetBasePath.replace(/(\/|\\)*$/, '/');
-		this.root = null;
-		this.CurrentDir = null;
-		this.listType = this.options.listType;
-		this.dialogOpen = false;
-		this.storeHistory = false;
-		this.fmShown = false;
-		this.drop_pending = 0;           // state: 0: no drop pending, 1: copy pending, 2: move pending
-		this.view_fill_timer = null;     // timer reference when fill() is working chunk-by-chunk.
-		this.view_fill_startindex = 0;   // offset into the view JSON array: which part of the entire view are we currently watching?
-		this.view_fill_json = null;      // the latest JSON array describing the entire list; used with pagination to hop through huge dirs without repeatedly consulting the server.
-		this.listPaginationLastSize = this.options.listPaginationSize;
-		this.Request = null;
-		this.downloadIframe = null;
-		this.downloadForm = null;
-		this.drag_is_active = false;
-		this.ctrl_key_pressed = false;
-		this.pending_error_dialog = null;
-		// timer for dir-gallery click / dblclick events:
-		this.dir_gallery_click_timer = null;
-
-		var dbg_cnt = 0;
-
-		this.RequestQueue = new Request.Queue({
-			concurrent: 3,              // 3 --> 75% max load on a quad core server
-			autoAdvance: true,
-			stopOnFailure: false,
-
-			onRequest: (function(){
-				//this.diag.log('request queue: onRequest: ', arguments);
-			}).bind(this),
-
-			onComplete: (function(name){
-				//this.diag.log('request queue: onComplete: ', arguments);
-
-				// clean out the item from the queue; doesn't seem to happen automatically :-(
-				var cnt = 0;
-				Object.each(this.RequestQueue.requests, function() {
-					cnt++;
-				});
-				// cut down on the number of reports:
-				if (Math.abs(cnt - dbg_cnt) >= 25)
-				{
-					this.diag.log('request queue: name counts: ', cnt, ', queue length: ', this.RequestQueue.queue.length);
-					dbg_cnt = cnt;
-				}
-
-			}).bind(this),
-
-			onCancel: (function(){
-				this.diag.log('request queue: onCancel: ', arguments);
-			}).bind(this),
-
-			onSuccess: (function(){
-				//this.diag.log('request queue: onSuccess: ', arguments);
-			}).bind(this),
-
-			onFailure: (function(name){
-				this.diag.log('request queue: onFailure: ', arguments);
-			}).bind(this),
-
-			onException: (function(name){
-				this.diag.log('request queue: onException: ', arguments);
-			}).bind(this)
-
-		});
-
-		// add a special custom routine to the queue object: we want to be able to clear PART OF the queue!
-		this.RequestQueue.cancel_bulk = (function(marker)
-		{
-			Object.each(this.requests, function(q, name)
-			{
-				var n = name.split(':');
-				if (n[0] === marker)
-				{
-					// match! revert by removing the request (and cancelling it!)
-					this.cancel(name);
-					this.removeRequest(name);
-
-					this.clear(name);           // eek, a full table scan! yech.
-					delete this.requests[name];
-					delete this.reqBinders[name];
-				}
-			}, this);
-
-			// now that we have cleared out all those requests, some of which may have been running at the time, we need to resume the loading:
-			this.resume();
-
-		}).bind(this.RequestQueue);
-
-		this.language = Object.clone(FileManager.Language.en);
-		if (this.options.language !== 'en') {
-			this.language = Object.merge(this.language, FileManager.Language[this.options.language]);
-		}
-
-// Partikule
-		if (!this.options.standalone)
-		{
-			this.options.hideOverlay = true;
-			this.options.hideClose = true;
-		}
-// /Partikule
-
-		this.container = new Element('div', {
-			'class': 'filemanager-container' + (Browser.opera ? ' filemanager-engine-presto' : '') + (Browser.ie ? ' filemanager-engine-trident' : '') + (Browser.ie8 ? '4' : '') + (Browser.ie9 ? '5' : ''),
-			styles:
-			{
-				'z-index': this.options.zIndex
-			}
-		});
-		this.filemanager = new Element('div', {
-			'class': 'filemanager',
-			styles: Object.append({},
-			this.options.styles,
-			{
-				'z-index': this.options.zIndex + 1
-			})
-		}).inject(this.container);
-		this.header = new Element('div', {
-			'class': 'filemanager-header' /* ,
-			styles:
-			{
-				'z-index': this.options.zIndex + 3
-			} */
-		}).inject(this.filemanager);
-		this.menu = new Element('div', {
-			'class': 'filemanager-menu' /* ,
-			styles:
-			{
-				'z-index': this.options.zIndex + 2
-			} */
-		}).inject(this.filemanager);
-		this.loader = new Element('div', {'class': 'loader', opacity: 0, tween: {duration: 'short'}}).inject(this.header);
-		this.previewLoader = new Element('div', {'class': 'loader', opacity: 0, tween: {duration: 'short'}});
-		this.browserLoader = new Element('div', {'class': 'loader', opacity: 0, tween: {duration: 'short'}});
-		// switch the path, from clickable to input text
-		this.clickablePath = new Element('span', {'class': 'filemanager-dir'});
-		this.selectablePath = new Element('input',{'type': 'text', 'class': 'filemanager-dir', 'readonly': 'readonly'});
-		this.pathTitle = new Element('a', {href:'#','class': 'filemanager-dir-title',text: this.language.dir}).addEvent('click',(function(e) {
-			this.diag.log('pathTitle-click event: ', e, ' @ ', e.target.outerHTML);
-			e.stop();
-			if (this.header.getElement('span.filemanager-dir') !== null) {
-				this.selectablePath.setStyle('width',(this.header.getSize().x - this.pathTitle.getSize().x - 55));
-				this.selectablePath.replaces(this.clickablePath);
-			}
-			else {
-				this.clickablePath.replaces(this.selectablePath);
-			}
-		}).bind(this));
-		this.header.adopt(this.pathTitle,this.clickablePath);
-
-// Partikule
-// Because the header is positioned -30px before the container, we hide it for the moment if the FM isn't standalone.
-// Need to think about a better integration
-		if (!this.options.standalone)
-		{
-			this.header.hide();
-			this.filemanager.setStyle('width', '100%');
-		}
-// /Partikule
-
-		var self = this;
-
-		this.browsercontainer = new Element('div',{'class': 'filemanager-browsercontainer'}).inject(this.filemanager);
-		this.browserheader = new Element('div',{'class': 'filemanager-browserheader'}).inject(this.browsercontainer);
-		this.browserheader.adopt(this.browserLoader);
-		this.browserScroll = new Element('div', {'class': 'filemanager-browserscroll'}).inject(this.browsercontainer).addEvents({
-			'mouseover': (function(e) {
-					//this.diag.log('mouseover: ', e);
-
-					// sync mouse and keyboard-driven browsing: the keyboard requires that we keep track of the hovered item,
-					// so we cannot simply leave it to a :hover CSS style. Instead, we find out which element is currently
-					// hovered:
-					var row = null;
-					if (e.target)
-					{
-						row = (e.target.hasClass('fi') ? e.target : e.target.getParent('span.fi'));
-						if (row)
-						{
-							row.addClass('hover');
-						}
-					}
-					this.browser.getElements('span.fi.hover').each(function(span) {
-						// prevent screen flicker: only remove the class for /other/ nodes:
-						if (span != row) {
-							span.removeClass('hover');
-							var rowicons = span.getElements('img.browser-icon');
-							if (rowicons)
-							{
-								rowicons.each(function(icon) {
-									icon.set('tween', {duration: 'short'}).fade(0);
-								});
-							}
-						}
-					});
-
-					if  (row)
-					{
-						var icons = row.getElements('img.browser-icon');
-						if (icons)
-						{
-							icons.each(function(icon) {
-								if (e.target == icon)
-								{
-									icon.set('tween', {duration: 'short'}).fade(1);
-								}
-								else
-								{
-									icon.set('tween', {duration: 'short'}).fade(0.5);
-								}
-							});
-						}
-					}
-				}).bind(this),
-
-			/* 'mouseout' */
-			'mouseleave': (function(e) {
-					//this.diag.log('mouseout: ', e);
-
-					// only bother us when the mouse cursor has just left the browser area; anything inside there is handled
-					// by the recurring 'mouseover' event above...
-					//
-					// - do NOT remove the 'hover' marker from the row; it will be used by the keyboard!
-					// - DO fade out the action icons, though!
-					this.browser.getElements('span.fi.hover').each(function(span) {
-						var rowicons = span.getElements('img.browser-icon');
-						if (rowicons)
-						{
-							rowicons.each(function(icon) {
-								icon.set('tween', {duration: 'short'}).fade(0);
-							});
-						}
-					});
-
-				}).bind(this)
-			});
-		this.browserMenu_thumb = new Element('a',{
-				'id':'toggle_side_boxes',
-				'class':'listType',
-				'style' : 'margin-right: 10px;',
-				'title': this.language.toggle_side_boxes
-			}).setStyle('opacity',0.5).addEvents({
-				click: this.toggleList.bind(this)
-			});
-		this.browserMenu_list = new Element('a',{
-				'id':'toggle_side_list',
-				'class':'listType',
-				'title': this.language.toggle_side_list
-			}).setStyle('opacity',1).addEvents({
-				click: this.toggleList.bind(this)
-			});
-
-		if(this.listType == 'thumb') {
-			this.browserMenu_thumb.setStyle('opacity',1);
-      this.browserMenu_list.setStyle('opacity',0.5);      
-      this.browserMenu_thumb.store('set', true);
-			this.browserMenu_list.store('set', false);
-		}
-		else
-    {
-      this.browserMenu_thumb.setStyle('opacity',0.5);
-      this.browserMenu_list.setStyle('opacity',1);      
-      this.browserMenu_thumb.store('set', false);
-      this.browserMenu_list.store('set', true);
-    }
-
-		// Add a scroller to scroll the browser list when dragging a file
-		this.scroller = new Scroller(this.browserScroll, {
-			onChange: function(x, y)
-			{
-				// restrict scrolling to Y direction only!
-				//this.element.scrollTo(x, y);
-				var scroll = this.element.getScroll();
-				this.element.scrollTo(scroll.x, y);
-			}
-		});
-
-    if(this.options.showDirGallery)
-    {
-// Partikule : Thumbs list in preview panel
-		this.browserMenu_thumbList = new Element('a',{
-				'id': 'show_dir_thumb_gallery',
-				'title': this.language.show_dir_thumb_gallery
-			}).addEvent('click', function()
-			{
-				// do NOT change the jsGET history carrying our browsing so far; the fact we want to view the dirtree should
-				// *NOT* blow away the recall in which directory we are (and what item is currently selected):
-
-				//if (typeof jsGET !== 'undefined')
-				//  jsGET.clear();
-
-				// no need to request the dirscan again: after all, we only wish to render another view of the same directory.
-				// (This means, however, that we MAY requesting any deferred thumbnails)
-
-				//self.load(self.options.directory, true);
-				//return self.deselect();   // nothing to return on a click event, anyway. And do NOT loose the selection!
-
-				// the code you need here is identical to clicking on the current directory in the top path bar:
-				// show the 'directory' info in the detail pane again (this is a way to get back from previewing single files to previewing the directory as a gallery)
-				this.diag.log('show_dir_Thumb_gallery button click: current directory!', this.CurrentDir, ', startdir: ', this.options.directory);
-				this.fillInfo();
-			}.bind(this));
-// /Partikule
-    }
-
-		this.browser_dragndrop_info = new Element('a',{
-				'id':'drag_n_drop',
-				'title': this.language.drag_n_drop_disabled
-			}); // .setStyle('visibility', 'hidden');
-		this.browser_paging = new Element('div',{
-				'id':'fm_view_paging'
-			}).setStyle('opacity', 0); // .setStyle('visibility', 'hidden');
-		this.browser_paging_first = new Element('a',{
-				'id':'paging_goto_first'
-			}).setStyle('opacity', 1).addEvents({
-				click: this.paging_goto_first.bind(this)
-			});
-		this.browser_paging_prev = new Element('a',{
-				'id':'paging_goto_previous'
-			}).setStyle('opacity', 1).addEvents({
-				click: this.paging_goto_prev.bind(this)
-			});
-		this.browser_paging_next = new Element('a',{
-				'id':'paging_goto_next'
-			}).setStyle('opacity', 1).addEvents({
-				click: this.paging_goto_next.bind(this)
-			});
-		this.browser_paging_last = new Element('a',{
-				'id':'paging_goto_last'
-			}).setStyle('opacity', 1).addEvents({
-				click: this.paging_goto_last.bind(this)
-			});
-		this.browser_paging_info = new Element('span',{
-				'id':'paging_info',
-				'text': ''
-			});
-		this.browser_paging.adopt([this.browser_paging_first, this.browser_paging_prev, this.browser_paging_info, this.browser_paging_next, this.browser_paging_last]);
-
-// Partikule : Added the browserMenu_thumbList to the browserheader
-		this.browserheader.adopt([this.browserMenu_thumbList, this.browserMenu_thumb, this.browserMenu_list, this.browser_dragndrop_info, this.browser_paging]);
-// /Partikule
-
-		this.browser = new Element('ul', {'class': 'filemanager-browser'}).inject(this.browserScroll);
-
-		if (this.options.createFolders) this.addMenuButton('create');
-		if (this.options.download) this.addMenuButton('download');
-		if (this.options.selectable) this.addMenuButton('open');
-
-		this.info = new Element('div', {'class': 'filemanager-infos'});
-
-		this.info_head = new Element('div', {
-			'class': 'filemanager-head',
-			styles:
-			{
-				opacity: 0
-			}
-		}).adopt([
-			new Element('img', {'class': 'filemanager-icon'}),
-			new Element('h1')
-		]);
-
-		this.preview = new Element('div', {'class': 'filemanager-preview'}).addEvent('click:relay(img.preview)', function() {
-			self.fireEvent('preview', [this.get('src'), self, this]);
-		});
-
-		// We need to group the headers and lists together because we may
-		// use some CSS to reorganise it a bit in the custom event handler.  So we create "filemanager-preview-area" which
-		// will contain the h2 for the preview and also the preview content returned from
-		// Backend/FileManager.php
-		this.preview_area = new Element('div', {'class': 'filemanager-preview-area',
-			styles:
-			{
-				opacity: 0
-			}
-		});
-
-// Partikule. Removed new Element('h2', {'class': 'filemanager-headline' :
-// 1. To gain more vertical space for preview
-// 2. Because the user knows this is info about the file
-		this.preview_area.adopt([
-			//new Element('h2', {'class': 'filemanager-headline', text: this.language.more}),
-			this.preview
-		]);
-
-// Partikule.
-// 1. To gain more vertical space for preview
-// 2. Because the user knows this is info about the file
-// 3. Less is more :-)
-		this.info.adopt([this.info_head, this.preview_area]).inject(this.filemanager);
-// /Partikule
-
-// Partikule
-// Add of the thumbnail list in the preview panel
-
-// We fill this one while we render the directory tree view to ensure that the deferred thumbnail loading system
-// (using 'detail / mode=direct' requests to obtain the actual thumbnail paths) doesn't become a seriously complex
-// mess.
-// This way, any updates coming from the server are automatically edited into this list; whether it is shown or
-// not depends on the decisions in fillInfo()
-//
-// Usage:
-// - One doubleclick on one thumb in this list will select the file : quicker select
-// - One click displays the preview, but with the file in bigger format : less clicks to see the picture wider.
-
-		// Thumbs list container (in preview panel)
-		this.dir_filelist = new Element('div', {'class': 'filemanager-filelist'});
-		// creates a list, HELPS to make the thumblist DRAGABLE
-		this.dir_filelist_thumbUl = new Element('ul');
-		this.dir_filelist_thumbUl.inject(this.dir_filelist);
-
-// /Partikule
-
-		if (!this.options.hideClose) {
-			this.closeIcon = new Element('a', {
-				'class': 'filemanager-close',
-				opacity: 0.5,
-				title: this.language.close,
-				events: {click: this.hide.bind(this)}
-			}).inject(this.filemanager).addEvent('mouseover',function() {
-					this.fade(1);
-				}).addEvent('mouseout',function() {
-					this.fade(0.5);
-				});
-		}
-
-		this.tips = new Tips({
-			className: 'tip-filebrowser',
-			offsets: {x: 15, y: 0},
-			text: null,
-			showDelay: 50,
-			hideDelay: 50,
-			onShow: function() {
-				this.tip.setStyle('z-index', self.options.zIndex + 501).set('tween', {duration: 'short'}).setStyle('display', 'block').fade(1);
-			},
-			onHide: function() {
-				this.tip.fade(0).get('tween').chain(function() {
-					this.element.setStyle('display', 'none');
-				});
-			}
-		});
-
-		// add toolTips
-		if (!this.options.hideClose) {
-			this.tips.attach(this.closeIcon);
-		}
-		this.tips.attach(this.browserMenu_thumb);
-		this.tips.attach(this.browserMenu_list);
-		this.tips.attach(this.browserMenu_thumbList);
-
-		this.imageadd = Asset.image(this.assetBasePath + 'Images/add.png', {
-			'class': 'browser-add',
-			styles:
-			{
-				'z-index': this.options.zIndex + 1600
-			}
-		}).setStyle('opacity', 0).set('tween', {duration: 'short'}).inject(this.container);
-
-		if (!this.options.hideOverlay) {
-			this.overlay = new Overlay(Object.append((this.options.hideOnClick ? {
-				events: {
-					click: this.hide.bind(this)
-				}
-			} : {}),
-			{
-				styles:
-				{
-					'z-index': this.options.zIndex - 1
-				}
-			}));
-		}
-
-		this.bound = {
-			keydown: (function(e)
-			{
-				// at least FF on Win will trigger this function multiple times when keys are depressed for a long time. Hence time consuming actions are don in 'keyup' whenever possible.
-
-				this.diag.log('keydown: key press: ', e);
-				if (e.control || e.meta)
-				{
-					if (this.drag_is_active && !this.ctrl_key_pressed)
-					{
-						// only init the fade when actually switching CONTROL key states!
-						this.imageadd.fade(1);
-					}
-					this.ctrl_key_pressed = true;
-				}
-			}).bind(this),
-
-			keyup: (function(e)
-			{
-				this.diag.log('keyup: key press: ', e);
-				if (!e.control && !e.meta)
-				{
-					if (/* this.drag_is_active && */ this.ctrl_key_pressed)
-					{
-						// only init the fade when actually switching CONTROL key states!
-						this.imageadd.fade(0);
-					}
-					this.ctrl_key_pressed = false;
-				}
-
-				if (!this.dialogOpen)
-				{
-					switch (e.key)
-					{
-            
-					case 'tab':
-            if(this.options.keyboardNavigation)
-            {
-						e.stop();
-						this.toggleList();
-            }
-						break;
-
-					case 'esc':
-						e.stop();
-						this.hide();
-						break;
-					}
-				}
-			}).bind(this),
-			keyboardInput: (function(e)
-			{
-				this.diag.log('keyboardInput key press: ', e);
-				if (this.dialogOpen) return;
-				switch (e.key)
-				{
-				case 'up':
-				case 'down':
-				case 'pageup':
-				case 'pagedown':
-				case 'home':
-				case 'end':
-				case 'enter':
-				case 'delete':
-          if(this.options.keyboardNavigation)
-          {
-					e.preventDefault();
-					this.browserSelection(e.key);
-					break;
-          }
-				}
-			}).bind(this),
-
-			scroll: (function(e)
-			{
-				this.fireEvent('scroll', [e, this]);
-				this.fitSizes();
-			}).bind(this)
-		};
-
-		if (this.options.standalone)
-		{
-			this.container.inject(document.body);
-
-			// ->> autostart filemanager when set
-			this.initialShow();
-		}
-		else
-		{
-			this.options.hideOverlay = true;
-		}
-		return this;
-	},
-
-	initialShowBase: function() {
-		if (typeof jsGET !== 'undefined' && jsGET.get('fmID') == this.ID) {
-			this.show();
-		}
-		else {
-			window.addEvent('jsGETloaded',(function() {
-				if (typeof jsGET !== 'undefined' && jsGET.get('fmID') == this.ID)
-					this.show();
-			}).bind(this));
-		}
-	},
-
-	// overridable method:
-	initialShow: function() {
-		this.initialShowBase();
-	},
-
-	allow_DnD: function(j, pagesize)
-	{
-		if (!this.options.move_or_copy)
-			return false;
-
-		if (!j || !j.dirs || !j.files || !pagesize)
-			return true;
-
-		return (j.dirs.length + j.files.length <= pagesize * 4);
-	},
-
-	/*
-	 * default method to produce a suitable request URL/POST; as several frameworks out there employ url rewriting, one way or another,
-	 * we now allow users to provide their own construction method to replace this one: simply provide your own method in
-	 *   options.mkServerRequestURL
-	 * Like this one, it MUST return an object, containing two properties:
-	 *
-	 *   url:  (string) contains the URL sent to the server for the given event/request (which is always transmitted as a POST request)
-	 *   data: (assoc. array): extra parameters added to this POST. (Mainly there in case a framework wants to have the 'event' parameter
-	 *         transmitted as a POST data element, rather than having it included in the request URL itself in some form.
-	 *
-	 * WARNING: 'this' in here is actually **NOT** pointing at the FM instance; use 'fm_obj' for that!
-	 *
-	 *          In fact, 'this' points at the 'fm_obj.options' object, but consider that an 'undocumented feature'
-	 *          as it may change in the future without notice!
-	 */
-	mkServerRequestURL: function(fm_obj, request_code, post_data)
-	{
-    // HACK: Encode the post_data to get around mod_security issues
-    function rot13(s)
-    {
-        return (s ? s : this).split('').map(function(_)
-        {
-            if (!_.match(/[A-Za-z]/)) return _;
-            c = Math.floor(_.charCodeAt(0) / 97);
-            k = (_.toLowerCase().charCodeAt(0) - 83) % 26 || 26;
-            return String.fromCharCode(k + ((c == 0) ? 64 : 96));
-        }).join('');
-    }
-   // console.log(rot13(JSON.encode(post_data)));
-    
-    post_data = { encoded_data: rot13(JSON.encode(post_data)) };
-    
-		return {
-			url: (fm_obj.options.url + (fm_obj.options.url.indexOf('?') == -1 ? '?' : '&') + Object.toQueryString({
-					event: request_code
-				})).replace(/&&/, '&'),
-			data: post_data
-		};
-	},
-
-	fitSizes: function()
-	{
-		if (this.options.standalone)
-		{
-			this.filemanager.center(this.offsets);
-		}
-		else
-		{
-			var parent = (this.options.parentContainer !== null ? document.id(this.options.parentContainer) : this.container.getParent());
-			if (parent)
-			{
-				parentSize = parent.getSize();
-				this.filemanager.setStyle('height', parentSize.y);
-			}
-		}
-
-		var containerSize = this.filemanager.getSize();
-		var headerSize = this.browserheader.getSize();
-		var menuSize = this.menu.getSize();
-		this.browserScroll.setStyle('height',containerSize.y - headerSize.y);
-		this.info.setStyle('height',containerSize.y - menuSize.y);
-	},
-
-	// see also: http://cass-hacks.com/articles/discussion/js_url_encode_decode/
-	// and: http://xkr.us/articles/javascript/encode-compare/
-	// This is a much simplified version as we do not need exact PHP rawurlencode equivalence.
-	//
-	// We have one mistake to fix: + instead of %2B. We don't mind
-	// that * and / remain unencoded. Not exactly RFC3986, but there you have it...
-	//
-	// WARNING: given the above, we ASSUME this function will ONLY be used to encode the
-	//          a single URI 'path', 'query' or 'fragment' component at a time!
-	escapeRFC3986: function(s) {
-		return encodeURI(s.toString()).replace(/\+/g, '%2B').replace(/#/g, '%23');
-	},
-	unescapeRFC3986: function(s) {
-		return decodeURI(s.toString().replace(/%23/g, '#').replace(/%2B/g, '+'));
-	},
-
-	// -> catch a click on an element in the file/folder browser
-	relayClick: function(e, el) {
-		if (e) e.stop();
-
-		// if the clicked elelement is from the preview gallery, get the corresponding element
-		if(el.retrieve('el_ref'))
-				el = el.retrieve('el_ref');
-
-		// ignore mouse clicks while drag&drop + resulting copy/move is pending.
-		//
-		// Theoretically only the first click originates from the same mouse event as the 'drop' event, so we
-		// COULD reset 'drop_pending' after processing that one.
-		if (this.drop_pending !== 0)
-		{
-			this.drop_pending = 0;
-		}
-		else
-		{
-			this.storeHistory = true;
-
-			var file = el.retrieve('file');
-			this.diag.log('on relayClick file = ', file, ', current directory: ', this.CurrentDir, '@ el = ', el);
-			if (el.retrieve('edit')) {
-				el.eliminate('edit');
-				return;
-			}
-			if (file.mime === 'text/directory')
-			{
-				el.addClass('selected');
-				// reset the paging to page #0 as we clicked to change directory
-				this.store_view_fill_startindex(0);
-				this.load(file.path);
-				return;
-			}
-
-			// when we're right smack in the middle of a drag&drop, which may end up as a MOVE, do NOT send a 'detail' request
-			// alongside (through fillInfo) as that may lock the file being moved, server-side.
-			// It's good enough to disable the detail view, if we want/need to.
-			//
-			// Note that this.drop_pending tracks the state of the drag&drop state machine -- more functions may check this one!
-			if (this.Current) {
-				this.Current.removeClass('selected');
-			}
-			// ONLY do this when we're doing a COPY or on a failed attempt...
-			// CORRECTION: as even a failed 'drop' action will have moved the cursor, we can't keep this one selected right now:
-			this.Current = el.addClass('selected');
-			// We need to have Current assigned before fillInfo because fillInfo adds to it
-			this.fillInfo(file);
-
-			this.switchButton4Current();
-
-			// // // now make sure we can see the selected item in the left pane: scroll there:
-			this.browserSelection('current');
-		}
-	},
-
-// Partikule
-
-	/**
-	* Catches double clicks and open the file if selectable is true */
-	relayDblClick: function(e, el)
-	{
-		if(this.options.selectable === false)
-			return;
-		if (e) e.stop();
-
-		this.diag.log('on relayDblClick file = ', el.retrieve('file'), ', current dir: ', this.CurrentDir);
-
-		this.tips.hide();
-
-		this.CurrentFile = el.retrieve('file');
-
-		if (this.CurrentFile.mime !== 'text/directory')
-			this.open_on_click(null);
-	},
-
-// /Partikule
-
-	toggleList: function(e) {
-		if (e) e.stop();
-    if(e && e.target && document.id(e.target).retrieve('set', false)) return; // Already Set
-                            
-		$$('.filemanager-browserheader a.listType').setStyle('opacity',0.5);
-		if (!this.browserMenu_thumb.retrieve('set',false)) {
-			this.browserMenu_list.store('set',false);
-			this.browserMenu_thumb.store('set',true).setStyle('opacity',1);
-			this.listType = 'thumb';
-			if (typeof jsGET !== 'undefined') jsGET.set('fmListType=thumb');
-		} else {
-			this.browserMenu_thumb.store('set',false);
-			this.browserMenu_list.store('set',true).setStyle('opacity',1);
-			this.listType = 'list';
-			if (typeof jsGET !== 'undefined') jsGET.set('fmListType=list');
-		}
-		this.diag.log('on toggleList dir = ', this.CurrentDir, e);
-
-		// abort any still running ('antiquated') fill chunks and reset the store before we set up a new one:
-		this.RequestQueue.cancel_bulk('fill');
-		clearTimeout(this.view_fill_timer);
-		this.view_fill_timer = null;
-
-		this.fill(null, this.get_view_fill_startindex(), this.listPaginationLastSize);
-	},
-
-	/*
-	 * Gets called from the jsGET listener.
-	 *
-	 * Is fired for two reasons:
-	 *
-	 * 1) the user clicked on a file or directory to view and that change was also pushed to the history through one or more jsGET.set() calls.
-	 *    (In this case, we've already done what needed doing, so we should not redo that effort in here!)
-	 *
-	 * 2) the user went back in browser history or manually edited the URI hash section.
-	 *    (This is an 'change from the outside' and exactly what this listener is for. This time around, we should follow up on those changes!)
-	 */
-	hashHistory: function(vars)
-	{
-		this.storeHistory = false;
-		this.diag.log('hasHistory:', vars);
-		if (vars.changed['fmPath'] === '')
-			vars.changed['fmPath'] = '/';
-
-		Object.each(vars.changed, function(value, key) {
-			this.diag.log('on hashHistory key = ', key, 'value = ', value);
-			switch (key)
-			{
-			case 'fmPath':
-				if (this.CurrentDir && this.CurrentDir.path !== value)
-				{
-					this.load(value);
-				}
-				break;
-
-			case 'fmFile':
-				var hot_item = (this.Current && this.Current.retrieve('file'));
-				if (hot_item === null || value !== hot_item.name)
-				{
-					this.browser.getElements('span.fi span').each((function(current)
-					{
-						current.getParent('span.fi').removeClass('hover');
-						if (current.get('title') == value)
-						{
-							this.deselect(null);
-							this.Current = current.getParent('span.fi');
-							new Fx.Scroll(this.browserScroll,{duration: 'short', offset: {x: 0, y: -(this.browserScroll.getSize().y/4)}}).toElement(this.Current);
-							this.Current.addClass('selected');
-							this.diag.log('on hashHistory @ fillInfo key = ', key, 'value = ', value, 'source = ', current, 'file = ', current.getParent('span.fi').retrieve('file'));
-							this.fillInfo(this.Current.retrieve('file'));
-						}
-					}).bind(this));
-				}
-				break;
-			}
-		},this);
-	},
-
-	// Add the ability to specify a path (relative to the base directory) and a file to preselect
-	show: function(e, loaddir, preselect) {
-		if (e) e.stop();
-
-		this.diag.log('on show: ', e, ', loaddir:', loaddir, ', preselect: ', preselect);
-		if (this.fmShown) {
-			return;
-		}
-		this.fmShown = true;
-
-		if (typeof preselect === 'undefined') preselect = null;
-		if (typeof loaddir === 'undefined') loaddir = null;
-
-		if (loaddir === null && typeof jsGET !== 'undefined')
-		{
-			if (jsGET.get('fmPath') !== null)
-			{
-				loaddir = jsGET.get('fmPath');
-			}
-		}
-		if (loaddir === null)
-		{
-			if (this.CurrentDir)
-			{
-				loaddir = this.CurrentDir.path;
-			}
-			else
-			{
-				loaddir = this.options.directory;
-			}
-		}
-
-		// get and set history
-		if (typeof jsGET !== 'undefined') {
-			if (jsGET.get('fmFile')) {
-				this.diag.log('on show: set onShow on fmFile: ', jsGET.get('fmFile'));
-			}
-			if (jsGET.get('fmListType') !== null) {
-				$$('.filemanager-browserheader a.listType').setStyle('opacity',0.5);
-				this.listType = jsGET.get('fmListType');
-				if (this.listType === 'thumb')
-					this.browserMenu_thumb.store('set',true).setStyle('opacity',1);
-				else
-					this.browserMenu_list.store('set',true).setStyle('opacity',1);
-			}
-			jsGET.set({
-				'fmID': this.ID,
-				'fmPath': loaddir
-			});
-			this.hashListenerId = jsGET.addListener(this.hashHistory, false, this);
-		}
-
-		this.load(loaddir, preselect);
-		if (!this.options.hideOverlay) {
-			this.overlay.show();
-		}
-
-		this.show_our_info_sections(false);
-		this.container.fade(0).setStyles({
-				display: 'block'
-			});
-
-		window.addEvents({
-			'scroll': this.bound.scroll,
-			'resize': this.bound.scroll
-		});
-		// add keyboard navigation
-		this.diag.log('add keyboard nav on show file = ', loaddir);
-		document.addEvent('keydown', this.bound.keydown);
-		document.addEvent('keyup', this.bound.keyup);
-		if ((Browser.Engine && (Browser.Engine.trident || Browser.Engine.webkit)) || (Browser.ie || Browser.chrome || Browser.safari))
-			document.addEvent('keydown', this.bound.keyboardInput);
-		else
-			document.addEvent('keypress', this.bound.keyboardInput);
-		this.container.fade(1);
-
-		this.fitSizes();
-		this.fireEvent('show', [this]);
-		this.fireHooks('show');
-
-// Partikule : If not standalone, returns the HTML content
-		if (!this.options.standalone)
-		{
-			return this.container;
-		}
-// /Partikule
-	},
-
-	hide: function(e) {
-		if (e) e.stop();
-		this.diag.log('on hide', e, this);
-		if (!this.fmShown) {
-			return;
-		}
-		this.fmShown = false;
-
-		// stop hashListener
-		if (typeof jsGET !== 'undefined') {
-			jsGET.removeListener(this.hashListenerId);
-			jsGET.remove(['fmID','fmPath','fmFile','fmListType','fmPageIdx']);
-		}
-
-		if (!this.options.hideOverlay) {
-			this.overlay.hide();
-		}
-		this.tips.hide();
-		this.browser.empty();
-		this.container.setStyle('display', 'none');
-
-		// remove keyboard navigation
-		this.diag.log('REMOVE keyboard nav on hide');
-		window.removeEvent('scroll', this.bound.scroll).removeEvent('resize', this.bound.scroll);
-		document.removeEvent('keydown', this.bound.keydown);
-		document.removeEvent('keyup', this.bound.keyup);
-		if ((Browser.Engine && (Browser.Engine.trident || Browser.Engine.webkit)) || (Browser.ie || Browser.chrome || Browser.safari))
-			document.removeEvent('keydown', this.bound.keyboardInput);
-		else
-			document.removeEvent('keypress', this.bound.keyboardInput);
-
-		this.fireHooks('cleanup');
-		this.fireEvent('hide', [this]);
-	},
-
-	// hide the FM info <div>s. do NOT hide the outer info <div> itself, as the Uploader (and possibly other derivatives) may choose to show their own content there!
-	show_our_info_sections: function(state) {
-		if (!state)
-		{
-			this.info_head.fade(0).get('tween').chain(function() {
-				this.element.setStyle('display', 'none');
-			});
-			this.preview_area.fade(0).get('tween').chain(function() {
-				this.element.setStyle('display', 'none');
-			});
-		}
-		else
-		{
-			this.info_head.setStyle('display', 'block').fade(1);
-			this.preview_area.setStyle('display', 'block').fade(1);
-		}
-	},
-
-	open_on_click: function(e) {
-		if (e) e.stop();
-
-		if (!this.Current)
-			return;
-
-		var file = this.Current.retrieve('file');
-		this.fireEvent('complete', [
-			(this.options.deliverPathAsLegalURL ? file.path : this.escapeRFC3986(this.normalize('/' + this.root + file.path))), // the absolute URL for the selected file, rawURLencoded
-			file,                 // the file specs: .name, .path, .size, .date, .mime, .icon, .icon48, .thumb48, .thumb250
-			this
-		]);
-
-		// Only hide if hideOnSelect is true
-		if (this.options.hideOnSelect)
-		{
-			this.hide();
-		}
-	},
-
-	download_on_click: function(e) {
-		e.stop();
-		if (!this.Current) {
-			return;
-		}
-		this.diag.log('download: ', this.Current.retrieve('file'));
-		var file = this.Current.retrieve('file');
-		this.download(file);
-	},
-
-	download: function(file) {
-		var self = this;
-		var dummyframe_active = false;
-
-		// the chained display:none code inside the Tips class doesn't fire when the 'Save As' dialog box appears right away (happens in FF3.6.15 at least):
-		if (this.tips.tip) {
-			this.tips.tip.setStyle('display', 'none');
-		}
-
-		// discard old iframe, if it exists:
-		if (this.downloadIframe)
-		{
-			// remove from the menu (dispose) and trash it (destroy)
-			this.downloadIframe.dispose().destroy();
-			this.downloadIframe = null;
-		}
-		if (this.downloadForm)
-		{
-			// remove from the menu (dispose) and trash it (destroy)
-			this.downloadForm.dispose().destroy();
-			this.downloadForm = null;
-		}
-
-		this.downloadIframe = new IFrame({
-				src: 'about:blank',
-				name: '_downloadIframe',
-				styles: {
-					display: 'none'
-				},
-			    events: {
-					load: function()
-					{
-						var iframe = this;
-						self.diag.log('download response: ', this, ', iframe: ', self.downloadIframe, ', ready: ', (1 * dummyframe_active));
-
-						// make sure we don't act on premature firing of the event in MSIE / Safari browsers:
-						if (!dummyframe_active)
-							return;
-
-						var response = null;
-						Function.attempt(function() {
-								response = iframe.contentDocument.documentElement.textContent;
-							},
-							function() {
-								response = iframe.contentWindow.document.innerText;
-							},
-							function() {
-								response = iframe.contentDocument.innerText;
-							},
-							function() {
-								response = "{status: 0, error: \"Download: download assumed okay: can't find response.\"}";
-							}
-						);
-
-						var j = JSON.decode(response);
-
-						if (j && !j.status)
-						{
-							self.showError('' + j.error);
-						}
-						else if (!j)
-						{
-							self.showError('bugger! No or faulty JSON response! ' + response);
-						}
-					}
-				}
-			});
-		this.menu.adopt(this.downloadIframe);
-
-		this.downloadForm = new Element('form', {target: '_downloadIframe', method: 'post', enctype: 'multipart/form-data'});
-		this.menu.adopt(this.downloadForm);
-
-		var tx_cfg = this.options.mkServerRequestURL(this, 'download', Object.merge({},
-						this.options.propagateData,
-						{
-							file: file.path,
-							filter: this.options.filter
-						}));
-
-		this.downloadForm.action = tx_cfg.url;
-
-		Object.each(tx_cfg.data,
-					function(v, k)
-					{
-						this.downloadForm.adopt((new Element('input')).set({type: 'hidden', name: k, value: v}));
-					}.bind(this));
-
-		dummyframe_active = true;
-
-		return this.downloadForm.submit();
-	},
-
-	create_on_click: function(e) {
-		e.stop();
-		var input = new Element('input', {'class': 'createDirectory'});
-		var click_ok_f = (function(e) {
-			this.diag.log('create on click: KEYBOARD handler: key press: ', e);
-
-			if (e.key === 'enter') {
-				e.stopPropagation();
-				e.target.getParent('div.filemanager-dialog').getElement('button.filemanager-dialog-confirm').fireEvent('click');
-			}
-		}).bind(this);
-
-		new FileManager.Dialog(this.language.createdir, {
-			language: {
-				confirm: this.language.create,
-				decline: this.language.cancel
-			},
-			content: [
-				input
-			],
-			autofocus_on: 'input.createDirectory',
-			zIndex: this.options.zIndex + 900,
-			onOpen: this.onDialogOpen.bind(this),
-			onClose: (function() {
-				input.removeEvent('keyup', click_ok_f);
-				this.onDialogClose();
-			}).bind(this),
-			onShow: (function() {
-				this.diag.log('add key up on create dialog:onShow');
-				input.addEvent('keyup', click_ok_f);
-			}).bind(this),
-			onConfirm: (function() {
-				if (this.Request) this.Request.cancel();
-
-				// abort any still running ('antiquated') fill chunks and reset the store before we set up a new one:
-				this.reset_view_fill_store();
-
-				var tx_cfg = this.options.mkServerRequestURL(this, 'create', {
-								file: input.get('value'),
-								directory: this.CurrentDir.path,
-								filter: this.options.filter
-							});
-
-				this.Request = new FileManager.Request({
-					url: tx_cfg.url,
-					data: tx_cfg.data,
-					onRequest: function() {},
-					onSuccess: (function(j) {
-						if (!j || !j.status) {
-							this.browserLoader.fade(0);
-							return;
-						}
-
-						this.deselect(null);
-						this.show_our_info_sections(false);
-
-						// make sure we store the JSON list!
-						this.reset_view_fill_store(j);
-
-						// the 'view' request may be an initial reload: keep the startindex (= page shown) intact then:
-						this.fill(j, this.get_view_fill_startindex());
-					}).bind(this),
-					onComplete: function() {},
-					onError: (function(text, error) {
-						this.browserLoader.fade(0);
-					}).bind(this),
-					onFailure: (function(xmlHttpRequest) {
-						this.browserLoader.fade(0);
-					}).bind(this)
-				}, this).send();
-			}).bind(this)
-		});
-	},
-
-	deselect: function(el) {
-		if (el && this.Current != el) {
-			return;
-		}
-		this.diag.log('deselect:Current', el);
-		if (el) {
-			this.fillInfo();
-		}
-		if (this.Current) {
-			this.Current.removeClass('selected');
-		}
-		this.Current = null;
-		this.switchButton4Current();
-	},
-
-	// add the ability to preselect a file in the dir
-	load: function(dir, preselect) {
-
-		if (typeof preselect === 'undefined') preselect = null;
-
-		this.deselect(null);
-		this.show_our_info_sections(false);
-
-		if (this.Request) this.Request.cancel();
-
-		this.diag.log("### 'view' request: onRequest invoked @ load(): ", dir, ', preselect: ', preselect);
-
-		// abort any still running ('antiquated') fill chunks and reset the store before we set up a new one:
-		this.reset_view_fill_store();
-
-		var tx_cfg = this.options.mkServerRequestURL(this, 'view', {
-						directory: dir,
-						filter: this.options.filter,
-						file_preselect: (preselect || '')
-					});
-
-		this.diag.log('load(): view URI: ', dir, this.listType, tx_cfg);
-
-		this.Request = new FileManager.Request({
-			url: tx_cfg.url,
-			data: tx_cfg.data,
-			onRequest: function() {},
-			onSuccess: (function(j) {
-				this.diag.log("### 'view' request: onSuccess invoked", j);
-				if (!j || !j.status) {
-					this.browserLoader.fade(0);
-					return;
-				}
-       
-       if(this.listType == 'thumb' && (j.files.length + j.dirs.length) > this.options.listMaxSuggestedDirSizeForThumbnails) 
-       {
-          this.listType = 'list';
-          this.browserMenu_thumb.setStyle('opacity',0.5);
-          this.browserMenu_list.setStyle('opacity',1);      
-          this.browserMenu_thumb.store('set', false);
-          this.browserMenu_list.store('set', true);
-       }
-         
-				// make sure we store the JSON list!
-				this.reset_view_fill_store(j);
-
-				// the 'view' request may be an initial reload: keep the startindex (= page shown) intact then:
-				// Xinha: add the ability to preselect a file in the dir
-				var start_idx = this.get_view_fill_startindex();
-				preselect = null;
-				if (j.preselect_index > 0)
-				{
-					start_idx = j.preselect_index - 1;
-					preselect = j.preselect_name;
-				}
-				this.fill(j, start_idx, null, null, preselect);
-			}).bind(this),
-			onComplete: (function() {
-				this.diag.log("### 'view' request: onComplete invoked");
-				this.fitSizes();
-			}).bind(this),
-			onError: (function(text, error) {
-				// a JSON error
-				this.diag.log("### 'view' request: onError invoked", text, error);
-				this.browserLoader.fade(0);
-			}).bind(this),
-			onFailure: (function(xmlHttpRequest) {
-				// a generic (non-JSON) communication failure
-				this.diag.log("### 'view' request: onFailure invoked", xmlHttpRequest);
-				this.browserLoader.fade(0);
-			}).bind(this)
-		}, this).send();
-	},
-
-	delete_from_dircache: function(file)
-	{
-		var items;
-		var i;
-
-		if (this.view_fill_json)
-		{
-			if (file.mime === 'text/directory')
-			{
-				items = this.view_fill_json.dirs;
-			}
-			else
-			{
-				items = this.view_fill_json.files;
-			}
-
-			for (i = items.length - 1; i >= 0; i--)
-			{
-				var item = items[i];
-				if (item.name === file.name)
-				{
-					items.splice(i, 1);
-					break;
-				}
-			}
-		}
-	},
-
-	destroy_noQasked: function(file) {
-
-		if (this.Request) this.Request.cancel();
-
-		this.browserLoader.fade(1);
-
-		if ((typeof jsGET !== 'undefined') && this.storeHistory)
-		{
-			if (file.mime !== 'text/directory')
-			{
-				// TODO: really, a full check should also check whether the fmPath equals the this.CurrentDir.path
-				if (file.name === jsGET.get('fmFile'))
-				{
-					// this will ensure the subsequent fill() action will revert the detail view to the directory details.
-					jsGET.remove(['fmFile']);
-				}
-			}
-		}
-
-		var tx_cfg = this.options.mkServerRequestURL(this, 'destroy', {
-						file: file.name,
-						directory: this.CurrentDir.path,
-						filter: this.options.filter
-					});
-
-		this.Request = new FileManager.Request({
-			url: tx_cfg.url,
-			data: tx_cfg.data,
-			onRequest: function() {},
-			onSuccess: (function(j) {
-				if (!j || !j.status) {
-					this.browserLoader.fade(0);
-					return;
-				}
-
-				this.fireEvent('modify', [Object.clone(file), j, 'destroy', this]);
-
-				// remove entry from cached JSON directory list and remove the item from the view.
-				// This is particularly important when working on a paginated directory and afterwards the pages are jumped back & forth:
-				// the next time around, this item should NOT appear in the list anymore!
-				this.deselect(file.element);
-
-				var rerendering_list = false;
-				if (this.view_fill_json)
-				{
-					this.delete_from_dircache(file);  /* do NOT use j.name, as that one can be 'cleaned up' as part of the 'move' operation! */
-
-					// minor caveat: when we paginate the directory list, then browsing to the next page will skip one item (which would
-					// have been the first on the next page). The brute-force fix for this is to force a re-render of the page when in
-					// pagination view mode:
-					if (this.view_fill_json.dirs.length + this.view_fill_json.files.length > this.listPaginationLastSize)
-					{
-						// similar activity as load(), but without the server communication...
-
-						// abort any still running ('antiquated') fill chunks and reset the store before we set up a new one:
-						this.RequestQueue.cancel_bulk('fill');
-						clearTimeout(this.view_fill_timer);
-						this.view_fill_timer = null;
-
-						// was here before
-					}
-				}
-
-				// -> move this here, so it always reloads the thumbnail pane in the preview window
-						rerendering_list = true;
-						this.fill(null, this.get_view_fill_startindex(), this.listPaginationLastSize);
-
-				// make sure fade does not clash with parallel directory (re)load:
-				if (!rerendering_list)
-				{
-					var p = file.element.getParent();
-					if (p) {
-						p.fade(0).get('tween').chain(function() {
-							this.element.destroy();
-						});
-					}
-				}
-				this.browserLoader.fade(0);
-
-				// clear preview pane thumbnails
-				// this.dir_filelist.empty();
-
-			}).bind(this),
-			onComplete: function() {},
-			onError: (function(text, error) {
-				this.browserLoader.fade(0);
-			}).bind(this),
-			onFailure: (function(xmlHttpRequest) {
-				this.browserLoader.fade(0);
-			}).bind(this)
-		}, this).send();
-	},
-
-	destroy: function(file) {
-		if (this.options.hideOnDelete) {
-			this.destroy_noQasked(file);
-		}
-		else {
-			new FileManager.Dialog(this.language.destroyfile, {
-				language: {
-					confirm: this.language.destroy,
-					decline: this.language.cancel
-				},
-				zIndex: this.options.zIndex + 900,
-				onOpen: this.onDialogOpen.bind(this),
-				onClose: this.onDialogClose.bind(this),
-				onConfirm: (function() {
-					this.destroy_noQasked(file);
-				}).bind(this)
-			});
-		}
-	},
-
-	rename: function(file) {
-		var name = file.name;
-		var input = new Element('input', {'class': 'rename', value: name});
-
-		this.diag.log('### rename: ', Object.clone(file));
-
-		new FileManager.Dialog(this.language.renamefile, {
-			language: {
-				confirm: this.language.rename,
-				decline: this.language.cancel
-			},
-			content: [
-				input
-			],
-			autofocus_on: 'input.rename',
-			zIndex: this.options.zIndex + 900,
-			onOpen: this.onDialogOpen.bind(this),
-			onClose: this.onDialogClose.bind(this),
-			onShow: (function() {
-				this.diag.log('add key up on rename dialog:onShow');
-				input.addEvent('keyup', (function(e) {
-					this.diag.log('rename: KEYBOARD handler: key press: ', e);
-
-					if (e.key === 'enter') {
-						e.stopPropagation();
-						e.target.getParent('div.filemanager-dialog').getElement('button.filemanager-dialog-confirm').fireEvent('click');
-					}
-				}).bind(this));
-			}).bind(this),
-			onConfirm: (function() {
-				if (this.Request) this.Request.cancel();
-
-				this.browserLoader.fade(1);
-
-				this.diag.log('### rename: going to rename: ', Object.clone(file), ' to ', input.get('value'));
-
-				var tx_cfg = this.options.mkServerRequestURL(this, 'move', {
-								file: file.name,
-								name: input.get('value'),
-								directory: this.CurrentDir.path,
-								filter: this.options.filter
-							});
-
-				this.Request = new FileManager.Request({
-					url: tx_cfg.url,
-					data: tx_cfg.data,
-					onRequest: function() {},
-					onSuccess: (function(j) {
-						if (!j || !j.status) {
-							this.browserLoader.fade(0);
-							return;
-						}
-						this.diag.log('move : onSuccess: file = ', Object.clone(file), ', json: ', j);
-						this.fireEvent('modify', [Object.clone(file), j, 'rename', this]);
-						file.element.getElement('span.filemanager-filename').set('text', j.name).set('title', j.name);
-						file.element.addClass('selected');
-						file.name = j.name;
-						this.diag.log('move : onSuccess going to fillInfo: file = ', Object.clone(file), ', json: ', j);
-						this.fillInfo(file);
-						this.browserLoader.fade(0);
-					}).bind(this),
-					onComplete: function() {},
-					onError: (function(text, error) {
-						this.browserLoader.fade(0);
-					}).bind(this),
-					onFailure: (function(xmlHttpRequest) {
-						this.browserLoader.fade(0);
-					}).bind(this)
-				}, this).send();
-			}).bind(this)
-		});
-	},
-
-	browserSelection: function(direction) {
-		var csel,current;
-
-		this.diag.log('browserSelection : direction = ', direction);
-		if (this.browser.getElement('li') === null) return;
-
-		if (direction === 'go-bottom')
-		{
-			// select first item of next page
-			current = this.browser.getFirst('li').getElement('span.fi');
-
-			// blow away any lingering 'selected' after a page switch like that
-			csel = this.browser.getElement('span.fi.selected');
-			if (csel !== null)
-				csel.removeClass('selected');
-		}
-		else if (direction === 'go-top')
-		{
-			// select last item of previous page
-			current = this.browser.getLast('li').getElement('span.fi');
-
-			// blow away any lingering 'selected' after a page switch like that
-			csel = this.browser.getElement('span.fi.selected');
-			if (csel !== null)
-				csel.removeClass('selected');
-		}
-		else if (this.browser.getElement('span.fi.hover') === null && this.browser.getElement('span.fi.selected') === null)
-		{
-			// none is selected: select first item (folder/file)
-			current = this.browser.getFirst('li').getElement('span.fi');
-		}
-		else if(direction === 'current') {
-			current = this.Current;
-		}
-		else
-		{
-			// select the current file/folder or the one with hover
-			current = null;
-			if (this.browser.getElement('span.fi.hover') === null && this.browser.getElement('span.fi.selected') !== null) {
-				current = this.browser.getElement('span.fi.selected');
-			}
-			else if (this.browser.getElement('span.fi.hover') !== null) {
-				current = this.browser.getElement('span.fi.hover');
-			}
-		}
-
-		this.browser.getElements('span.fi.hover').each(function(span) {
-			span.removeClass('hover');
-		});
-
-		var stepsize = 1, next, currentFile;
-
-		switch (direction) {
-		// go down
-		case 'end':
-			stepsize = 1E5;
-			/* fallthrough */
-		case 'pagedown':
-			if (stepsize == 1) {
-				if (current.getPosition(this.browserScroll).y + current.getSize().y * 2 < this.browserScroll.getSize().y) {
-					stepsize = Math.floor((this.browserScroll.getSize().y - current.getPosition(this.browserScroll).y) / current.getSize().y) - 1;
-					if (stepsize < 1)
-						stepsize = 1;
-				}
-				else {
-					stepsize = Math.floor(this.browserScroll.getSize().y / current.getSize().y);
-				}
-			}
-			/* fallthrough */
-		case 'down':
-			current = current.getParent('li');
-			this.diag.log('key DOWN: stepsize = ', stepsize);
-
-			// when we're at the bottom of the view and there are more pages, go to the next page:
-			next = current.getNext('li');
-			if (next === null)
-			{
-				if (this.paging_goto_next(null, 'go-bottom'))
-					break;
-			}
-			else
-			{
-				for ( ; stepsize > 0; stepsize--) {
-					next = current.getNext('li');
-					if (next === null)
-						break;
-					current = next;
-				}
-			}
-			current = current.getElement('span.fi');
-			/* fallthrough */
-		case 'go-bottom':        // 'faked' key sent when done shifting one pagination page down
-			current.addClass('hover');
-			this.Current = current;
-			direction = 'down';
-			break;
-
-		// go up
-		case 'home':
-			stepsize = 1E5;
-			/* fallthrough */
-		case 'pageup':
-			if (stepsize == 1) {
-				// when at the top of the viewport, a full page scroll already happens /visually/ when you go up 1: that one will end up at the /bottom/, after all.
-				stepsize = Math.floor(current.getPosition(this.browserScroll).y / current.getSize().y);
-				if (stepsize < 1)
-					stepsize = 1;
-			}
-			/* fallthrough */
-		case 'up':
-			current = current.getParent('li');
-			this.diag.log('key UP: stepsize = ', stepsize);
-
-			// when we're at the top of the view and there are pages before us, go to the previous page:
-			var previous = current.getPrevious('li');
-			if (previous === null)
-			{
-				if (this.paging_goto_prev(null, 'go-top'))
-					break;
-			}
-			else
-			{
-				for ( ; stepsize > 0; stepsize--) {
-					previous = current.getPrevious('li');
-					if (previous === null)
-						break;
-					current = previous;
-				}
-			}
-			current = current.getElement('span.fi');
-			/* fallthrough */
-		case 'go-top':        // 'faked' key sent when done shifting one pagination page up
-			current.addClass('hover');
-			this.Current = current;
-			direction = 'up';
-			break;
-
-		case 'none':        // 'faked' key sent when picking a row 'remotely', i.e. when we don't know where we are currently, but when we want to scroll to 'current' anyhow
-			current.addClass('hover');
-			this.Current = current;
-			break;
-
-		// select
-		case 'enter':
-			this.storeHistory = true;
-			this.Current = current;
-			csel = this.browser.getElement('span.fi.selected');
-			if (csel !== null) // remove old selected one
-				csel.removeClass('selected');
-
-			current.addClass('selected');
-			currentFile = current.retrieve('file');
-			this.diag.log('on key ENTER file = ', currentFile);
-			if (currentFile.mime === 'text/directory') {
-				this.load(currentFile.path /*.replace(this.root,'')*/);
-			}
-			else {
-				this.fillInfo(currentFile);
-			}
-			break;
-
-		// delete file/directory:
-		case 'delete':
-			this.storeHistory = true;
-			this.Current = current;
-			this.browser.getElements('span.fi.selected').each(function(span) {
-				span.removeClass('selected');
-			});
-
-			// and before we go and delete the entry, see if we pick the next one down or up as our next cursor position:
-			var parent = current.getParent('li');
-			next = parent.getNext('li');
-			if (next === null) {
-				next = parent.getPrevious('li');
-			}
-			if (next !== null) {
-				next = next.getElement('span.fi');
-				next.addClass('hover');
-			}
-
-			currentFile = current.retrieve('file');
-			this.diag.log('on key DELETE file = ', currentFile);
-			this.destroy(currentFile);
-
-			current = next;
-			this.Current = current;
-			break;
-		}
-
-		// make sure to scroll the view so the selected/'hovered' item is within visible range:
-
-		this.diag.log('key handler: current X/Y = ', current.getPosition(this.browserScroll), ', H/W/SCROLL = ', this.browserScroll.getSize(), ', 1U/SIZE = ', current.getSize());
-		var dy, browserScrollFx;
-		if (direction !== 'up' && current.getPosition(this.browserScroll).y + current.getSize().y * 2 >= this.browserScroll.getSize().y)
-		{
-			// make scroll duration slightly dependent on the distance to travel:
-			dy = (current.getPosition(this.browserScroll).y + current.getSize().y * 2 - this.browserScroll.getSize().y);
-			dy = 50 * dy / this.browserScroll.getSize().y;
-			this.diag.log('key @ direction = UP: DUR: ', dy);
-			browserScrollFx = new Fx.Scroll(this.browserScroll, { duration: (dy < 150 ? 150 : dy > 1000 ? 1000 : dy.toInt()) });
-			browserScrollFx.toElement(current);
-		}
-		else if (direction !== 'down' && current.getPosition(this.browserScroll).y <= current.getSize().y)
-		{
-			var sy = this.browserScroll.getScroll().y + current.getPosition(this.browserScroll).y - this.browserScroll.getSize().y + current.getSize().y * 2;
-
-			// make scroll duration slightly dependent on the distance to travel:
-			dy = this.browserScroll.getScroll().y - sy;
-			dy = 50 * dy / this.browserScroll.getSize().y;
-			this.diag.log('key @ direction = DOWN: SY = ', sy, ', DUR: ', dy);
-			browserScrollFx = new Fx.Scroll(this.browserScroll, { duration: (dy < 150 ? 150 : dy > 1000 ? 1000 : dy.toInt()) });
-			browserScrollFx.start(current.getPosition(this.browserScroll).x, (sy >= 0 ? sy : 0));
-		}
-	},
-
-	// -> cancel dragging
-	revert_drag_n_drop: function(el) {
-		el.fade(1).removeClass('drag').removeClass('move').setStyles({
-		//	'z-index': 'auto',
-			position: 'relative',
-			width: 'auto',
-			left: 0,
-			top: 0
-		}).inject(el.retrieve('parent'));
-    try{ el.setStyle('z-index', 'auto'); } catch(e) { el.setStyle('z-index', ''); } // IE<8 Complains about 'auto' for z-index
-		// also dial down the opacity of the icons within this row (download, rename, delete):
-		var icons = el.getElements('img.browser-icon');
-		if (icons) {
-			icons.each(function(icon) {
-				icon.fade(0);
-			});
-		}
-
-		this.diag.log('DISABLE keyboard up/down on revert');
-		this.drag_is_active = false;
-		this.imageadd.fade(0);
-	},
-
-	// clicked 'first' button in the paged list/thumb view:
-	paging_goto_prev: function(e, kbd_dir)
-	{
-		if (e) e.stop();
-		var startindex = this.get_view_fill_startindex();
-		if (!startindex)
-			return false;
-
-		return this.paging_goto_helper(startindex - this.listPaginationLastSize, this.listPaginationLastSize, kbd_dir);
-	},
-	paging_goto_next: function(e, kbd_dir)
-	{
-		if (e) e.stop();
-		var startindex = this.get_view_fill_startindex();
-		if (this.view_fill_json && startindex > this.view_fill_json.dirs.length + this.view_fill_json.files.length - this.listPaginationLastSize)
-			return false;
-
-		return this.paging_goto_helper(startindex + this.listPaginationLastSize, this.listPaginationLastSize, kbd_dir);
-	},
-	paging_goto_first: function(e, kbd_dir)
-	{
-		if (e) e.stop();
-		var startindex = this.get_view_fill_startindex();
-		if (!startindex)
-			return false;
-
-		return this.paging_goto_helper(0, null, kbd_dir);
-	},
-	paging_goto_last: function(e, kbd_dir)
-	{
-		if (e) e.stop();
-		var startindex = this.get_view_fill_startindex();
-		if (this.view_fill_json && startindex > this.view_fill_json.dirs.length + this.view_fill_json.files.length - this.options.listPaginationSize)
-			return false;
-
-		return this.paging_goto_helper(2E9 /* ~ maxint */, null, kbd_dir);
-	},
-	paging_goto_helper: function(startindex, pagesize, kbd_dir)
-	{
-		// similar activity as load(), but without the server communication...
-		this.deselect(null);
-		this.show_our_info_sections(false);
-
-		// abort any still running ('antiquated') fill chunks and reset the store before we set up a new one:
-		this.RequestQueue.cancel_bulk('fill');
-		clearTimeout(this.view_fill_timer);
-		this.view_fill_timer = null;
-
-		return this.fill(null, startindex, pagesize, kbd_dir);
-	},
-
-	fill: function(j, startindex, pagesize, kbd_dir, preselect)
-	{
-		var j_item_count;
-
-		if (typeof preselect === 'undefined') preselect = null;
-
-		if (!pagesize)
-		{
-			pagesize = this.options.listPaginationSize;
-			this.listPaginationLastSize = pagesize;
-		}
-		// else: pagesize specified means stick with that one. (useful to keep pagesize intact when going prev/next)
-
-		if (!j)
-		{
-			j = this.view_fill_json;
-		}
-
-		j_item_count = j.dirs.length + j.files.length;
-
-		startindex = parseInt(startindex, 10);     // make sure it's an int number
-		if (isNaN(startindex))
-		{
-			startindex = 0;
-		}
-
-		if (!pagesize)
-		{
-			// no paging: always go to position 0 then!
-			startindex = 0;
-		}
-		else if (startindex > j_item_count)
-		{
-			startindex = j_item_count;
-		}
-		else if (startindex < 0)
-		{
-			startindex = 0;
-		}
-		// always make sure startindex is exactly on a page edge: this is important to keep the page numbers
-		// in the tooltips correct!
-		startindex = Math.floor(startindex / pagesize);
-		startindex *= pagesize;
-
-		// keyboard navigation sets the 'hover' class on the 'current' item: remove any of those:
-		this.browser.getElements('span.fi.hover').each(function(span) {
-			span.removeClass('hover');
-		});
-
-		this.diag.log('# fill: JSON = ', j, ', mgr: ', this);
-		this.root = j.root;
-		this.CurrentDir = j.this_dir;
-		this.browser.empty();
-
-		// Adding the thumbnail list in the preview panel: blow away any pre-existing list now, as we'll generate a new one now:
-		this.dir_filelist_thumbUl.empty();
-
-		// set history
-		if (typeof jsGET !== 'undefined' && this.storeHistory)
-		{
-			jsGET.set({'fmPath': this.CurrentDir.path});
-		}
-
-		var current_path = this.normalize(this.root + this.CurrentDir.path);
-		var text = [], pre = [];
-		// on error reported by backend, there WON'T be a JSON 'root' element at all times:
-		//
-		// TODO: how to handle that error condition correctly?
-		if (!j.root)
-		{
-			this.showError('' + j.error);
-			return false;
-		}
-		var rootPath = '/' + j.root;
-		var rootParent = this.dirname(rootPath);
-		var rplen = rootParent.length;
-		current_path.split('/').each((function(folderName) {
-			if (!folderName) return;
-
-			pre.push(folderName);
-			var path = ('/'+pre.join('/')+'/');
-			this.diag.log('on fill: display directory path chunks: JSON root = ', j.root, ', path: ' , path, ', folder: ', folderName, ', root: ', rootPath, ', parent: ', rootParent);
-			if (path.length <= rplen) {
-				// add non-clickable path
-				text.push(new Element('span', {'class': 'icon', text: folderName}));
-			} else {
-				// add clickable path
-				text.push(new Element('a', {
-						'class': 'icon',
-						href: '#',
-						text: folderName
-					}).addEvent('click', (function(e) {
-						e.stop();
-						path = path.replace(j.root,'');
-						this.diag.log('## path section - click event: ', e, ', path: ', path);
-						this.load(path);
-					}).bind(this))
-				);
-			}
-			text.push(new Element('span', {text: ' / '}));
-		}).bind(this));
-
-		text.pop();
-		text[text.length-1].addClass('selected').removeEvents('click').addEvent('click', (function(e) {
-			e.stop();
-			// show the 'directory' info in the detail pane again (this is a way to get back from previewing single files to previewing the directory as a gallery)
-			this.diag.log('click: fillInfo: current directory!');
-			this.fillInfo();
-		}).bind(this));
-		this.selectablePath.set('value', '/' + current_path);
-		this.clickablePath.empty().adopt(new Element('span', {text: '/ '}), text);
-
-		if (!j.dirs || !j.files) {
-			return false;
-		}
-
-		// ->> generate browser list
-		var els = [[], []];
-
-		/*
-		 * For very large directories, where the number of directories in there and/or the number of files is HUGE (> 200),
-		 * we DISABLE drag&drop functionality.
-		 *
-		 * Yes, we could have opted for the alternative, which is splitting up the .makeDraggable() activity in multiple
-		 * setTimeout(callback, 0) initiated chunks in order to spare the user the hassle of a 'slow script' dialog,
-		 * but in reality drag&drop is ludicrous in such an environment; currently we do not (yet) support autoscrolling
-		 * the list to enable drag&dropping it to elements further away that the current viewport can hold at the same time,
-		 * but drag&drop in a 500+ image carrying directory is resulting in a significant load of the browser anyway;
-		 * alternative means to move/copy files should be provided in such cases instead.
-		 *
-		 * Hence we run through the list here and abort / limit the drag&drop assignment process when the hardcoded number of
-		 * directories or files have been reached (support_DnD_for_this_dir).
-		 *
-		 * TODO: make these numbers 'auto adaptive' based on timing measurements: how long does it take to initialize
-		 *       a view on YOUR machine? --> adjust limits accordingly.
-		 */
-		var support_DnD_for_this_dir = this.allow_DnD(j, pagesize);
-		var starttime = new Date().getTime();
-		this.diag.log('fill list size = ', j_item_count);
-
-		var endindex = j_item_count;
-		var paging_now = 0;
-		if (pagesize)
-		{
-			// endindex MAY point beyond j_item_count; that's okay; we check the boundary every time in the other fill chunks.
-			endindex = startindex + pagesize;
-			// however for reasons of statistics gathering, we keep it bound to j_item_count at the moment:
-			if (endindex > j_item_count) endindex = j_item_count;
-
-			if (pagesize < j_item_count)
-			{
-				var pagecnt = Math.ceil(j_item_count / pagesize);
-				var curpagno = Math.floor(startindex / pagesize) + 1;
-
-				this.browser_paging_info.set('text', '' + curpagno + '/' + pagecnt);
-
-				if (curpagno > 1)
-				{
-					this.browser_paging_first.set('title', this.language.goto_page + ' 1');
-					this.browser_paging_first.fade(1);
-					this.browser_paging_prev.set('title', this.language.goto_page + ' ' + (curpagno - 1));
-					this.browser_paging_prev.fade(1);
-				}
-				else
-				{
-					this.browser_paging_first.set('title', '---');
-					this.browser_paging_first.fade(0.25);
-					this.browser_paging_prev.set('title', '---');
-					this.browser_paging_prev.fade(0.25);
-				}
-				if (curpagno < pagecnt)
-				{
-					this.browser_paging_last.set('title', this.language.goto_page + ' ' + pagecnt);
-					this.browser_paging_last.fade(1);
-					this.browser_paging_next.set('title', this.language.goto_page + ' ' + (curpagno + 1));
-					this.browser_paging_next.fade(1);
-				}
-				else
-				{
-					this.browser_paging_last.set('title', '---');
-					this.browser_paging_last.fade(0.25);
-					this.browser_paging_next.set('title', '---');
-					this.browser_paging_next.fade(0.25);
-				}
-
-				paging_now = 1;
-			}
-		}
-		this.browser_paging.fade(paging_now);
-		// fix for MSIE8: also fade out the pagination icons themselves
-		if (!paging_now)
-		{
-			this.browser_paging_first.fade(0);
-			this.browser_paging_prev.fade(0);
-			this.browser_paging_last.fade(0);
-			this.browser_paging_next.fade(0);
-		}
-
-		// remember pagination position history
-		this.store_view_fill_startindex(startindex);
-
-		// reset the fillInfo fire marker:
-		this.fillInfoOnFillFired = false;
-
-		this.view_fill_timer = this.fill_chunkwise_1.delay(1, this, [startindex, endindex, endindex - startindex, pagesize, support_DnD_for_this_dir, starttime, els, kbd_dir, preselect]);
-
-		return true;
-	},
-
-	list_row_maker: function(thumbnail_url, file)
-	{
-		return file.element = new Element('span', {'class': 'fi ' + this.listType, href: '#'}).adopt(
-			new Element('span', {
-				'class': this.listType,
-				'styles': {
-					'background-image': 'url(' + (thumbnail_url ? thumbnail_url : this.assetBasePath + 'Images/loader.gif') + ')'
-				}
-			}).addClass('fm-thumb-bg'),
-			new Element('span', {'class': 'filemanager-filename', text: file.name, title: file.name})
-		).store('file', file);
-	},
-
-	dir_gallery_item_maker: function(thumbnail_url, file)
-	{
-		var el = new Element('div', {
-			'class': 'fi',
-			'title': file.name
-		}).adopt(
-			new Element('div', {
-				'class': 'dir-gal-thumb-bg',
-				'styles': {
-					'width': this.options.thumbSize4DirGallery + 'px',
-					'height': this.options.thumbSize4DirGallery + 'px',
-					'background-image': 'url(' + (thumbnail_url ? thumbnail_url : this.assetBasePath + 'Images/loader.gif') + ')'
-				}
-			}),
-			new Element('div', {
-				'class': 'name',
-				'styles': {
-					'width': this.options.thumbSize4DirGallery + 'px'
-				},
-				'text': file.name
-			})
-		);
-		this.tips.attach(el);
-		return el;
-	},
-
-	dir_gallery_set_actual_img: function(file, dg_el)
-	{
-		// calculate which thumb to use and how to center it:
-		var img_url, iw, ih, ds, mt, mb, ml, mr, ratio;
-
-		ds = this.options.thumbSize4DirGallery;
-		if (ds > 48)
-		{
-			img_url = file.thumb250;
-			iw = file.thumb250_width;
-			ih = file.thumb250_height;
-		}
-		else
-		{
-			img_url = file.thumb48;
-			iw = file.thumb48_width;
-			ih = file.thumb48_height;
-		}
-
-		// 'zoom' image to fit area:
-		if (iw > ds)
-		{
-			var redux = ds / iw;
-			iw *= redux;
-			ih *= redux;
-		}
-		if (ih > ds)
-		{
-			var redux = ds / ih;
-			iw *= redux;
-			ih *= redux;
-		}
-		iw = Math.round(iw);
-		ih = Math.round(ih);
-		ml = Math.round((ds - iw) / 2);
-		mr = ds - ml - iw;
-		mt = Math.round((ds - ih) / 2);
-		mb = ds - mt - ih;
-
-		var self = this;
-
-		Asset.image(img_url, {
-			styles: {
-				width: iw,
-				height: ih,
-				'margin-left': ml,
-				'margin-top': mt,
-				'margin-right': mr,
-				'margin-bottom': mb
-			},
-			onLoad: function() {
-				var img_el = this;
-				var img_div = dg_el.getElement('div.dir-gal-thumb-bg').setStyle('background-image', '');
-				img_div.adopt(img_el);
-			},
-			onError: function() {
-				self.diag.log('dirgallery image asset: error!');
-				var iconpath = self.assetBasePath + 'Images/Icons/Large/default-error.png';
-				dg_el.getElement('div.dir-gal-thumb-bg').setStyle('background-image', 'url(' + iconpath + ')');
-			},
-			onAbort: function() {
-				self.diag.log('dirgallery image asset: ABORT!');
-				var iconpath = self.assetBasePath + 'Images/Icons/Large/default-error.png';
-				dg_el.getElement('div.dir-gal-thumb-bg').setStyle('background-image', 'url(' + iconpath + ')');
-			}
-		});
-	},
-
-	/*
-	 * The old one-function-does-all fill() would take an awful long time when processing large directories. This function
-	 * contains the most costly code chunk of the old fill() and has adjusted the looping through the j.dirs[] and j.files[] lists
-	 * in such a way that we can 'chunk it up': we can measure the time consumed so far and when we have spent more than
-	 * X milliseconds in the loop, we stop and allow the loop to commence after a minimal delay.
-	 *
-	 * The delay is the way to relinquish control to the browser and as a thank-you NOT get the dreaded
-	 * 'slow script, continue or abort?' dialog in your face. Ahh, the joy of cooperative multitasking is back again! :-)
-	 */
-	fill_chunkwise_1: function(startindex, endindex, render_count, pagesize, support_DnD_for_this_dir, starttime, els, kbd_dir, preselect) {
-
-		var idx, file, loop_duration;
-		var self = this;
-		var j = this.view_fill_json;
-		var loop_starttime = new Date().getTime();
-		var fmFile = (typeof jsGET !== 'undefined' ? jsGET.get('fmFile') : null);
-
-		var duration = new Date().getTime() - starttime;
-		//this.diag.log(' + time duration @ fill_chunkwise_1(', startindex, '): ', duration);
-
-		/*
-		 * Note that the '< j.dirs.length' / '< j.files.length' checks MUST be kept around: one of the fastest ways to abort/cancel
-		 * the render is emptying the dirs[] + files[] array, as that would abort the loop on the '< j.dirs.length' / '< j.files.length'
-		 * condition.
-		 *
-		 * This, together with killing our delay-timer, is done when anyone calls reset_view_fill_store() to
-		 * abort this render pronto.
-		 */
-
-		// first loop: only render directories, when the indexes fit the range: 0 .. j.dirs.length-1
-		// Assume several directory aspects, such as no thumbnail hassle (it's one of two icons anyway, really!)
-		var el, editButtons;
-
-		for (idx = startindex; idx < endindex && idx < j.dirs.length; idx++)
-		{
-			file = j.dirs[idx];
-
-		if (idx % 10 === 0) {
-				// try not to spend more than 100 msecs per (UI blocking!) loop run!
-				loop_duration = new Date().getTime() - loop_starttime;
-				duration = new Date().getTime() - starttime;
-				//this.diag.log(' + time taken so far = ', duration, ' / ', loop_duration, ' @ elcnt = ', idx);
-
-				/*
-				 * Are we running in adaptive pagination mode? yes: calculate estimated new pagesize and adjust average (EMA) when needed.
-				 *
-				 * Do this here instead of at the very end so that pagesize will adapt, particularly when user does not want to wait for
-				 * this render to finish.
-				 */
-				this.adaptive_update_pagination_size(idx, endindex, render_count, pagesize, duration, 1.0 / 7.0, 1.1, 0.1 / 1000);
-
-				if (loop_duration >= 100)
-				{
-					this.view_fill_timer = this.fill_chunkwise_1.delay(1, this, [idx, endindex, render_count, pagesize, support_DnD_for_this_dir, starttime, els, kbd_dir, preselect]);
-					return; // end call == break out of loop
-				}
-			}
-
-			file.dir = j.path;
-
-			//this.diag.log('fill_chunkwise_1: dir = file: ', file, ' at index: ', idx);
-
-			// This is just a raw image
-			el = this.list_row_maker((this.listType === 'thumb' ? file.icon48 : file.icon), file);
-
-			//this.diag.log('add DIRECTORY click event to ', file);
-			el.addEvent('click', (function(e) {
-				self.diag.log('is_dir:CLICK: ', e);
-				var node = this;
-				self.relayClick.apply(self, [e, node]);
-			}).bind(el));
-
-			editButtons = [];
-
-			// rename, delete icon
-			if (file.name !== '..')
-			{
-				if (this.options.rename) editButtons.push('rename');
-				if (this.options.destroy) editButtons.push('destroy');
-			}
-
-			editButtons.each(function(v) {
-				//icons.push(
-				Asset.image(this.assetBasePath + 'Images/' + v + '.png', {title: this.language[v]}).addClass('browser-icon').setStyle('opacity', 0).addEvent('mouseup', (function(e, target) {
-					// this = el, self = FM instance
-					e.preventDefault();
-					this.store('edit', true);
-					// can't use 'file' in here directly anymore either:
-					var file = this.retrieve('file');
-					self.tips.hide();
-					self[v](file);
-				}).bind(el)).inject(el,'top');
-				//);
-			}, this);
-
-			els[1].push(el);
-			//if (file.name === '..') el.fade(0.7);
-			el.inject(new Element('li',{'class':this.listType}).inject(this.browser)).store('parent', el.getParent());
-			//icons = $$(icons.map((function(icon) {
-			//  this.showFunctions(icon,icon,0.5,1);
-			//  this.showFunctions(icon,el.getParent('li'),1);
-			//}).bind(this)));
-
-			// you CANNOT 'preselect' a directory as if it were a file, so we don't need to check against the 'preselect' or 'fmFile' values here!
-		}
-
-		// and another, ALMOST identical, loop to render the files. Note that these buggers have their own peculiarities... and make sure the index is adjusted to point into files[]
-		var dir_count = j.dirs.length;
-
-		// skip files[] rendering, when the startindex still points inside dirs[]  ~  too many directories to fit any files on this page!
-		if (idx >= dir_count)
-		{
-			var dg_el;
-
-			for ( ; idx < endindex && idx - dir_count < j.files.length; idx++)
-			{
-				file = j.files[idx - dir_count];
-
-				if (idx % 10 === 0) {
-					// try not to spend more than 100 msecs per (UI blocking!) loop run!
-					loop_duration = new Date().getTime() - loop_starttime;
-					duration = new Date().getTime() - starttime;
-					//this.diag.log('time taken so far = ', duration, ' / ', loop_duration, ' @ elcnt = ', idx);
-
-					/*
-					 * Are we running in adaptive pagination mode? yes: calculate estimated new pagesize and adjust average (EMA) when needed.
-					 *
-					 * Do this here instead of at the very end so that pagesize will adapt, particularly when user does not want to wait for
-					 * this render to finish.
-					 */
-					this.adaptive_update_pagination_size(idx, endindex, render_count, pagesize, duration, 1.0 / 7.0, 1.1, 0.1 / 1000);
-
-					if (loop_duration >= 100)
-					{
-						this.view_fill_timer = this.fill_chunkwise_1.delay(1, this, [idx, endindex, render_count, pagesize, support_DnD_for_this_dir, starttime, els, kbd_dir, preselect]);
-						return; // end call == break out of loop
-					}
-				}
-
-				file.dir = j.path;
-
-				//this.diag.log('fill_chunkwise_1: files: file: ', file, ' at index: ', idx - dir_count);
-
-				// As we now have two views into the directory, we have to fetch the thumbnails, even when we're in 'list' view: the direcory gallery will need them!
-				// Besides, fetching the thumbs and all right after we render the directory also makes these thumbs + metadata available for drag&drop gallery and
-				// 'select mode', so they don't always have to ask for the meta data when it is required there and then.
-				if (file.thumb48 ||  this.listType !== 'thumb' || !file.thumbs_deferred)
-				{
-					// This is just a raw image
-					el = this.list_row_maker((this.listType === 'thumb' ? (file.thumb48 ? file.thumb48 : file.icon48) : file.icon), file);
-
-					dg_el = this.dir_gallery_item_maker(file.icon48, file);
-					if (file.thumb48)
-					{
-						this.dir_gallery_set_actual_img(file, dg_el);
-					}
-				}
-				else    // thumbs_deferred...
-				{
-					// We must AJAX POST our propagateData, so we need to do the post and take the url to the
-					// thumbnail from the post results.
-					//
-					// The alternative here, taking only 1 round trip instead of 2, would have been to FORM POST
-					// to a tiny iframe, which is suitably sized to contain the generated thumbnail and the POST
-					// actually returning the binary image data, thus the iframe contents becoming the thumbnail image.
-
-					// update this one alongside the 'el':
-					dg_el = this.dir_gallery_item_maker(file.icon48, file);
-
-					el = (function(file, dg_el) {           // Closure
-						var iconpath = this.assetBasePath + 'Images/Icons/' + (this.listType === 'thumb' ? 'Large/' : '') + 'default-error.png';
-						var list_row = this.list_row_maker((this.listType === 'thumb' ? file.icon48 : file.icon), file);
-
-						var tx_cfg = this.options.mkServerRequestURL(this, 'detail', {
-										directory: this.dirname(file.path),
-										file: file.name,
-										filter: this.options.filter,
-										mode: 'direct' + this.options.detailInfoMode
-									});
-
-						var req = new FileManager.Request({
-							url: tx_cfg.url,
-							data: tx_cfg.data,
-							fmDisplayErrors: false,   // Should we display the error here? No, we just display the general error icon instead
-							onRequest: function() {},
-							onSuccess: (function(j) {
-								if (!j || !j.status || !j.thumb48)
-								{
-									list_row.getElement('span.fm-thumb-bg').setStyle('background-image', 'url(' + (this.listType === 'thumb' ? (j.icon48 ? j.icon48 : iconpath) : (j.icon ? j.icon : iconpath)) + ')');
-									dg_el.getElement('div.dir-gal-thumb-bg').setStyle('background-image', 'url(' + (j.icon48 ? j.icon48 : iconpath) + ')');
-								}
-								else
-								{
-									list_row.getElement('span.fm-thumb-bg').setStyle('background-image', 'url(' + (this.listType === 'thumb' ? j.thumb48 : j.icon) + ')');
-									if (j.thumb48)
-									{
-										this.dir_gallery_set_actual_img(j, dg_el);
-									}
-								}
-
-								// update the stored json for this file as well:
-								file = Object.merge(file, j);
-
-								delete file.error;
-								delete file.status;
-								delete file.content;
-
-								if (file.element)
-								{
-									file.element.store('file', file);
-								}
-							}).bind(this),
-							onError: (function(text, error) {
-								list_row.getElement('span.fm-thumb-bg').setStyle('background-image', 'url(' + iconpath + ')');
-								dg_el.getElement('div.dir-gal-thumb-bg').setStyle('background-image', 'url(' + iconpath + ')');
-							}).bind(this),
-							onFailure: (function(xmlHttpRequest) {
-								list_row.getElement('span.fm-thumb-bg').setStyle('background-image', 'url(' + iconpath + ')');
-								dg_el.getElement('div.dir-gal-thumb-bg').setStyle('background-image', 'url(' + iconpath + ')');
-							}).bind(this)
-						}, this);
-
-						this.RequestQueue.addRequest('fill:' + String.uniqueID(), req);
-						req.send();
-
-						return list_row;
-					}).bind(this)(file, dg_el);
-				}
-
-				/*
-				 * WARNING: for some (to me) incomprehensible reason the old code which bound the event handlers to 'this==self' and which used the 'el' variable
-				 *          available here, does NOT WORK ANY MORE - tested in FF3.6. Turns out 'el' is pointing anywhere but where you want it by the time
-				 *          the event handler is executed.
-				 *
-				 *          The 'solution' which I found was to rely on the 'self' reference instead and bind to 'el'. If the one wouldn't work, the other shouldn't,
-				 *          but there you have it: this way around it works. FF3.6.14 :-(
-				 *
-				 * EDIT 2011/03/16: the problem started as soon as the old Array.each(function(...) {...}) by the chunked code which uses a for loop:
-				 *
-				 *              http://jibbering.com/faq/notes/closures/
-				 *
-				 *          as it says there:
-				 *
-				 *              A closure is formed when one of those inner functions is made accessible outside of the function in which it was
-				 *              contained, so that it may be executed after the outer function has returned. At which point it still has access to
-				 *              the local variables, parameters and inner function declarations of its outer function. Those local variables,
-				 *              parameter and function declarations (initially) >>>> have the values that they had when the outer function returned <<<<
-				 *              and may be interacted with by the inner function.
-				 *
-				 *          The >>>> <<<< emphasis is mine: in the .each() code, each el was a separate individual, while due to the for loop,
-				 *          the last 'el' to exist at all is the one created during the last round of the loop in that chunk. Which explains the
-				 *          observed behaviour before the fix: the file names associated with the 'el' element object were always pointing
-				 *          at some item further down the list, not necessarily the very last one, but always these references were 'grouped':
-				 *          multiple rows would produce the same filename.
-				 *
-				 * EXTRA: 2011/04/09: why you don't want to add this event for any draggable item!
-				 *
-				 *          It turns out that IE9 (IE6-8 untested as I write this) and Opera do NOT fire the 'click' event after the drag operation is
-				 *          'cancel'led, while other browsers fire both (Chrome/Safari/FF3).
-				 *          For the latter ones, the event handler sequence after a simple click on a draggable item is:
-				 *            - Drag::onBeforeStart
-				 *            - Drag::onCancel
-				 *            - 'click'
-				 *          while a tiny amount of dragging produces this sequence instead:
-				 *            - Drag::onBeforeStart
-				 *            - Drag::onStart
-				 *            - Drag::onDrop
-				 *            - 'click'
-				 *
-				 *          Meanwhile, Opera and IE9 do this:
-				 *            - Drag::onBeforeStart
-				 *            - Drag::onCancel
-				 *            - **NO** click event!
-				 *          while a tiny amount of dragging produces this sequence instead:
-				 *            - Drag::onBeforeStart
-				 *            - Drag::onStart
-				 *            - Drag::onDrop
-				 *            - **NO** click event!
-				 *
-				 *          which explains why the old implementation did not simply register this 'click' event handler and had 'revert' fake the 'click'
-				 *          event instead.
-				 *          HOWEVER, the old way, using revert() (now called revert_drag_n_drop()) was WAY too happy to hit the 'click' event handler. In
-				 *          fact, the only spot where such 'manually firing' was desirable is when the drag operation is CANCELLED. And only there!
-				 */
-
-				// 2011/04/09: only register the 'click' event when the element is NOT a draggable:
-				if (!support_DnD_for_this_dir)
-				{
-					self.diag.log('add FILE click event to ', file);
-					el.addEvent('click', (function(e) {
-						self.diag.log('is_file:CLICK: ', e);
-						var node = this;
-						self.relayClick.apply(self, [e, node]);
-					}).bind(el));
-				}
-
-				// add double click functionality to the list elements
-				if(this.options.selectable === true) {
-					el.addEvent('dblclick', (function(e) {
-						self.diag.log('is_file:DBLCLICK: ', e);
-						var node = this;
-						self.relayDblClick.apply(self, [e, node]);
-					}).bind(el));
-				}
-
-				editButtons = [];
-
-				// download, rename, delete icon
-				if (this.options.download) editButtons.push('download');
-				if (this.options.rename) editButtons.push('rename');
-				if (this.options.destroy) editButtons.push('destroy');
-
-				editButtons.each(function(v) {
-					Asset.image(this.assetBasePath + 'Images/' + v + '.png', {title: this.language[v]}).addClass('browser-icon').setStyle('opacity', 0).addEvent('mouseup', (function(e, target) {
-						// this = el, self = FM instance
-						e.preventDefault();
-						this.store('edit', true);
-						// can't use 'file' in here directly anymore either:
-						var file = this.retrieve('file');
-						self.tips.hide();
-						self[v](file);
-					}).bind(el)).inject(el,'top');
-				}, this);
-
-				els[0].push(el);
-				el.inject(new Element('li',{'class':this.listType}).inject(this.browser)).store('parent', el.getParent());
-
-				// ->> LOAD the FILE/IMAGE from history when PAGE gets REFRESHED (only directly after refresh)
-				//this.diag.log('fill on PRESELECT (test): onShow = ', this.fillInfoOnFillFired, ', file = ', file, ', fmFile = ', fmFile, ', preselect = ', preselect);
-				if (!this.fillInfoOnFillFired)
-				{
-					if (preselect)
-					{
-						if (preselect === file.name)
-						{
-							this.deselect(null);
-							this.Current = file.element;
-							new Fx.Scroll(this.browserScroll,{duration: 'short', offset: {x: 0, y: -(this.browserScroll.getSize().y/4)}}).toElement(file.element);
-							file.element.addClass('selected');
-							this.diag.log('fill on PRESELECT: fillInfo: file = ', file);
-							this.fillInfo(file);
-							this.fillInfoOnFillFired = true;
-						}
-					}
-					else if (fmFile)
-					{
-						if (fmFile === file.name)
-						{
-							this.deselect(null);
-							this.Current = file.element;
-							new Fx.Scroll(this.browserScroll,{duration: 'short', offset: {x: 0, y: -(this.browserScroll.getSize().y/4)}}).toElement(file.element);
-							file.element.addClass('selected');
-							this.diag.log('fill: fillInfo: file = ', file);
-							this.fillInfo(file);
-							this.fillInfoOnFillFired = true;
-						}
-					}
-				}
-
-
-// Partikule
-// Thumbs list
-// edit: Fabian Vogelsteller: made thumblist DRAGGABLE
-
-				// use a closure to keep a reference to the current dg_el, otherwise dg_el, file, etc. will carry the values they got at the end of the loop!
-				(function(dg_el, el, file)
-				{
-					var thumbLi = new Element('li');
-
-					dg_el.store('el_ref', el).store('file',file).store('parent',thumbLi);
-
-					thumbLi.inject(this.dir_filelist_thumbUl);
-					dg_el.inject(thumbLi);
-				}).bind(this)(dg_el, el, file);
-
-// / Partikule
-			}
-		}
-
-		// when we get here, we have rendered all files in the current page and we know whether we have fired off a fillInfo on a preselect/history-recalled file now, or not:
-		if (!this.fillInfoOnFillFired)
-		{
-			this.diag.log('fill internal: fillInfo: file = ', j, j.this_dir);
-			this.fillInfo(j.this_dir);
-			this.fillInfoOnFillFired = true;
-		}
-
-		// check how much we've consumed so far:
-		duration = new Date().getTime() - starttime;
-		//this.diag.log(' + time taken in array traversal = ', duration);
-
-		// go to the next stage, right after these messages... ;-)
-		this.view_fill_timer = this.fill_chunkwise_2.delay(1, this, [render_count, pagesize, support_DnD_for_this_dir, starttime, els, kbd_dir]);
-	},
-
-	/*
-	 * See comment for fill_chunkwise_1(): the makeDraggable() is a loop in itself and taking some considerable time
-	 * as well, so make it happen in a 'fresh' run here...
-	 */
-	fill_chunkwise_2: function(render_count, pagesize, support_DnD_for_this_dir, starttime, els, kbd_dir) {
-
-		var duration = new Date().getTime() - starttime;
-		//this.diag.log(' + time duration @ fill_chunkwise_2() begin: ', duration);
-
-		// check how much we've consumed so far:
-		duration = new Date().getTime() - starttime;
-		//this.diag.log(' + time taken in array traversal + revert = ', duration);
-
-		// -> made preview thumblist DRAGGABLE
-		// add the thumbnail pane in preview window to the dropable elements
-		this.dir_filelist.getChildren('ul li div.fi').each((function(thumb){
-			els[0].push(thumb);
-		}).bind(this));
-
-		// make draggable
-		if (support_DnD_for_this_dir) {
-			// -> make draggable
-			$$(els[0]).makeDraggable({
-				droppables: $$(this.droppables.combine(els[1])),
-				//stopPropagation: true,
-
-				// We position the element relative to its original position; this ensures the drag always works with arbitrary container.
-				onDrag: (function(el, e)
-				{
-					var dpos = el.retrieve('delta_pos');
-
-					el.setStyles({
-						display: 'block',
-						left: e.page.x + dpos.x,
-						top: e.page.y + dpos.y
-					});
-
-					this.imageadd.setStyles({
-						'left': e.page.x + dpos.x - 12,
-						'top': e.page.y + dpos.y + 2
-					});
-				}).bind(this),
-
-				onBeforeStart: (function(el) {
-					// you CANNOT use .container to get good x/y coords as in standalone mode, this <div> has a bogus position;
-					//var cpos = this.container.getPosition();
-
-					// start the scroller
-					this.scroller.start();
-				}).bind(this),
-
-				// FIX: do not deselect item when aborting dragging _another_ item!
-				onCancel: (function(el) {
-					this.diag.log('draggable:onCancel', el);
-					this.scroller.stop();
-					this.revert_drag_n_drop(el);
-					/*
-					 * Fixing the 'click' on FF+Opera (other browsers do get that event for any item which is made draggable):
-					 * a basic mouse'click' appears as the event sequence onBeforeStart + onCancel.
-					 *
-					 * NOTE that onStart is NOT invoked! When it is, it's a drag operation, no matter if it's successful as a drag&drop or not.
-					 *
-					 * So we then manually fire the 'click' event. See also the comment near the 'click' event handler registration in fill_chunkwise_1()
-					 * about the different behaviour in different browsers.
-					 */
-					this.relayClick(null, el);
-				}).bind(this),
-
-				onStart: (function(el, e) {
-					this.diag.log('draggable:onStart', el);
-					this.tips.hide();
-
-					var position = el.getPosition();
-					var dpos = {
-						x: position.x - e.page.x,
-						y: position.y - e.page.y
-					};
-					/*
-					 * Use the element size (Y) for IE-fixing heuristics:
-					 * in IE the mouse is already quite some distance away before the onStart fires,
-					 * we need to restrict the vertical position of the dragged element in such a way
-					 * that it will reside 'under the mouse cursor'.
-					 */
-					var elsize = el.getSize();
-					if (dpos.y > 0)
-						dpos.y = -Math.round(elsize.y / 2);
-					else if (dpos.y < -elsize.y)
-						dpos.y = -Math.round(elsize.y / 2);
-
-					this.diag.log('~~~ positions at start: ', position, dpos, e);
-
-					el.store('delta_pos', dpos);
-
-					el.addClass('drag').setStyles({
-						'z-index': this.options.zIndex + 1500,
-						'position': 'absolute',
-						'width': el.getWidth() - el.getStyle('paddingLeft').toInt() - el.getStyle('paddingRight').toInt(),
-						'display': 'none',
-						'left': e.page.x + dpos.x,
-						'top': e.page.y + dpos.y
-					}).inject(this.container);
-
-					el.fade(0.7).addClass('move');
-
-					this.diag.log('ENABLE keyboard up/down on drag start');
-
-					// FIX wrong visual when CONTROL key is kept depressed between drag&drops: the old code discarded the relevant keyboard handler; we simply switch visuals but keep the keyboard handler active.
-					// This state change will be reverted in revert_drag_n_drop().
-					this.drag_is_active = true;
-					this.imageadd.fade(0 + this.ctrl_key_pressed);
-				}).bind(this),
-
-				onEnter: function(el, droppable) {
-					droppable.addClass('droppable');
-				},
-
-				onLeave: function(el, droppable) {
-					droppable.removeClass('droppable');
-				},
-
-				onDrop: (function(el, droppable, e) {
-					this.diag.log('draggable:onDrop', el, droppable, e);
-					this.scroller.stop();
-
-					var is_a_move = !(e.control || e.meta);
-					this.drop_pending = 1 + is_a_move;
-
-					if (!is_a_move || !droppable) {
-						el.setStyles({left: 0, top: 0});
-					}
-
-					var dir = null;
-					if (droppable) {
-						droppable.addClass('selected').removeClass('droppable');
-						(function() {
-							droppable.removeClass('selected');
-						}).delay(300);
-						if (this.onDragComplete(el, droppable)) {
-							this.drop_pending = 0;
-
-							this.revert_drag_n_drop(el);   // go and request the details anew, then refresh them in the view
-							return;
-						}
-
-						dir = droppable.retrieve('file');
-						this.diag.log('on drop dir = ', dir);
-					}
-
-					if ((!this.options.move_or_copy) || (is_a_move && !droppable)) {
-						this.drop_pending = 0;
-
-						this.revert_drag_n_drop(el);   // go and request the details anew, then refresh them in the view
-						return;
-					}
-
-					this.revert_drag_n_drop(el);       // do not send the 'detail' request in here: this.drop_pending takes care of that!
-
-					var file = el.retrieve('file');
-					this.diag.log('on drop file = ', file, ', current dir:', this.CurrentDir, ', droppable: ', droppable);
-
-					if (this.Request) this.Request.cancel();
-
-					var tx_cfg = this.options.mkServerRequestURL(this, 'move', {
-									file: file.name,
-									filter: this.options.filter,
-									directory: this.CurrentDir.path,
-									newDirectory: (dir ? dir.path : this.CurrentDir.path),
-									copy: is_a_move ? 0 : 1
-								});
-
-					this.Request = new FileManager.Request({
-						url: tx_cfg.url,
-						data: tx_cfg.data,
-						onSuccess: (function(j) {
-							if (!j || !j.status) {
-								this.drop_pending = 0;
-								this.browserLoader.fade(0);
-								return;
-							}
-
-							this.fireEvent('modify', [Object.clone(file), j, (is_a_move ? 'move' : 'copy'), this]);
-
-							var rerendering_list = false;
-
-							// remove entry from cached JSON directory list and remove the item from the view when this was a move!
-							// This is particularly important when working on a paginated directory and afterwards the pages are jumped back & forth:
-							// the next time around, this item should NOT appear in the list anymore!
-							if (is_a_move)
-							{
-								this.deselect(file.element);
-
-								if (this.view_fill_json)
-								{
-									this.delete_from_dircache(file);  /* do NOT use j.name, as that one can be 'cleaned up' as part of the 'move' operation! */
-
-									// minor caveat: when we paginate the directory list, then browsing to the next page will skip one item (which would
-									// have been the first on the next page). The brute-force fix for this is to force a re-render of the page when in
-									// pagination view mode:
-									if (this.view_fill_json.dirs.length + this.view_fill_json.files.length > this.listPaginationLastSize)
-									{
-										// similar activity as load(), but without the server communication...
-
-										// abort any still running ('antiquated') fill chunks and reset the store before we set up a new one:
-										this.RequestQueue.cancel_bulk('fill');
-										clearTimeout(this.view_fill_timer);
-										this.view_fill_timer = null;
-
-										// was here
-									}
-								}
-
-								// -> moves this here so it always reloads the thumbnail pane in the preview window
-								rerendering_list = true;
-								this.fill(null, this.get_view_fill_startindex(), this.listPaginationLastSize);
-
-								// make sure fade does not clash with parallel directory (re)load:
-								if (!rerendering_list)
-								{
-									var p = file.element.getParent();
-									if (p) {
-										p.fade(0).get('tween').chain(function() {
-											this.element.destroy();
-										});
-									}
-								}
-							}
-							else
-							{
-								if (!dir)
-								{
-									// copied to the very same directory:
-									rerendering_list = true;
-									this.load(this.CurrentDir.path);
-								}
-							}
-
-							this.drop_pending = 0;
-							this.browserLoader.fade(0);
-						}).bind(this),
-						onError: (function(text, error) {
-							this.drop_pending = 0;
-							this.browserLoader.fade(0);
-						}).bind(this),
-						onFailure: (function(xmlHttpRequest) {
-							this.drop_pending = 0;
-							this.browserLoader.fade(0);
-						}).bind(this)
-					}, this).send();
-				}).bind(this)
-			});
-
-			this.browser_dragndrop_info.setStyle('background-position', '0px 0px');
-			this.browser_dragndrop_info.set('title', this.language.drag_n_drop);
-		}
-
-		// add tooltip for drag n drop icon
-		this.tips.attach(this.browser_dragndrop_info);
-
-		// check how much we've consumed so far:
-		duration = new Date().getTime() - starttime;
-		//this.diag.log(' + time taken in make draggable = ', duration);
-
-		$$(els[0].combine(els[1])).setStyles({'left': 0, 'top': 0});
-
-		// check how much we've consumed so far:
-		duration = new Date().getTime() - starttime;
-		//this.diag.log(' + time taken in setStyles = ', duration);
-
-		this.adaptive_update_pagination_size(render_count, render_count, render_count, pagesize, duration, 1.0 / 7.0, 1.02, 0.1 / 1000);
-
-		// go to the next stage, right after these messages... ;-)
-		this.view_fill_timer = this.fill_chunkwise_3.delay(1, this, [render_count, pagesize, support_DnD_for_this_dir, starttime, kbd_dir]);
-	},
-
-	/*
-	 * See comment for fill_chunkwise_1(): the tooltips need to be assigned with each icon (2..3 per list item)
-	 * and apparently that takes some considerable time as well for large directories and slightly slower machines.
-	 */
-	fill_chunkwise_3: function(render_count, pagesize, support_DnD_for_this_dir, starttime, kbd_dir) {
-
-		var duration = new Date().getTime() - starttime;
-		//this.diag.log(' + time duration @ fill_chunkwise_3() begin:', duration);
-
-		this.tips.attach(this.browser.getElements('img.browser-icon'));
-		this.browser_dragndrop_info.fade(1);
-
-		// check how much we've consumed so far:
-		duration = new Date().getTime() - starttime;
-		//this.diag.log(' + time taken in tips.attach = ', duration);
-
-		// when a render is completed, we have maximum knowledge, i.e. maximum prognosis power: shorter tail on the EMA is our translation of that.
-		this.adaptive_update_pagination_size(render_count, render_count, render_count, pagesize, duration, 1.0 / 5.0, 1.0, 0);
-
-		// we're done: erase the timer so it can be garbage collected
-		//this.RequestQueue.cancel_bulk('fill');    -- do NOT do this!
-		clearTimeout(this.view_fill_timer);
-		this.view_fill_timer = null;
-
-		// make sure the selection, when keyboard driven, is marked correctly
-		if (kbd_dir)
-		{
-			this.browserSelection(kbd_dir);
-		}
-
-		this.browserLoader.fade(0);
-
-		this.fireHooks('fill');
-	},
-
-	adaptive_update_pagination_size: function(currentindex, endindex, render_count, pagesize, duration, EMA_factor, future_fudge_factor, compensation)
-	{
-		var avgwait = this.options.listPaginationAvgWaitTime;
-		if (avgwait)
-		{
-			// we can now estimate how much time we'll need to process the entire list:
-			var orig_startindex = endindex - render_count;
-			var done_so_far = currentindex - orig_startindex;
-			// the 1.3 is a heuristic covering for chunk_2+3 activity
-			done_so_far /= parseFloat(render_count);
-			// at least 5% of the job should be done before we start using our info for estimation/extrapolation
-			if (done_so_far > 0.05)
-			{
-				/*
-				 * and it turns out our fudge factors are not telling the whole story: the total number of elements
-				 * to render are still a factor then.
-				 */
-				future_fudge_factor *= (1 + compensation * render_count);
-
-				var t_est = duration * future_fudge_factor / done_so_far;
-
-				// now take the configured _desired_ maximum average wait time and see how we should fare:
-				var p_est = render_count * avgwait / t_est;
-
-				// EMA + sensitivity: the closer to our current target, the better our info:
-				var tail = EMA_factor * (0.9 + 0.1 * done_so_far);
-				var newpsize = tail * p_est + (1 - tail) * pagesize;
-
-				// apply limitations: never reduce more than 50%, never increase more than 20%:
-				var delta = newpsize / pagesize;
-				if (delta < 0.5)
-					newpsize = 0.5 * pagesize;
-				else if (delta > 1.2)
-					newpsize = 1.2 * pagesize;
-				newpsize = newpsize.toInt();
-
-				// and never let it drop below rediculous values:
-				if (newpsize < 20)
-					newpsize = 20;
-
-				//this.diag.log('::auto-tune pagination: new page = ', newpsize, ' @ tail:', tail, ', p_est: ', p_est, ', psize:', pagesize, ', render:', render_count, ', done%:', done_so_far, ', delta index:', currentindex - orig_startindex, ', t_est:', t_est, ', dur:', duration, ', pdelta: ', delta);
-				this.options.listPaginationSize = newpsize;
-			}
-		}
-	},
-
-	fillInfo: function(file) {
-
-		if (!file) file = this.CurrentDir;
-		if (!file) return;
-
-		// set file history
-		this.diag.log('fillInfo: ', this.storeHistory, ', file: ', Object.clone(file));
-		if (typeof jsGET !== 'undefined' && this.storeHistory) {
-			if (file.mime !== 'text/directory')
-				jsGET.set({'fmFile': file.name});
-			else
-				jsGET.remove(['fmFile']);
-		}
-
-		var icon = file.icon;
-
-		this.switchButton4Current();
-
-		this.fireHooks('cleanupPreview');
-		// We need to remove our custom attributes form when the preview is hidden
-		this.fireEvent('hidePreview', [this]);
-
-		this.preview.empty();
-
-		//if (file.mime === 'text/directory') return;
-
-		if (this.drop_pending == 0)
-		{
-			if (this.Request) this.Request.cancel();
-
-			var dir = this.CurrentDir.path;
-
-			this.diag.log('fillInfo: request detail for file: ', Object.clone(file), ', dir: ', dir);
-      if(file.mime === 'text/directory')
-      {    
-        if(file.readme && file.readme.length) { this.preview.set('html', file.readme); this.preview_area.setStyle('display', 'block').fade('in'); return; }
-        if(this.options.showDirGallery === false) return;    
-      }
-      
-			var tx_cfg = this.options.mkServerRequestURL(this, 'detail', {
-							directory: this.dirname(file.path),
-							// fixup for root directory detail requests:
-							file: (file.mime === 'text/directory' && file.path === '/') ? '/' : file.name,
-							filter: this.options.filter,
-							// provide either direct links to the thumbnails (when available in cache) or PHP event trigger URLs for delayed thumbnail image creation (performance optimization: faster page render):
-							mode: 'direct' + this.options.detailInfoMode
-						});
-
-			this.Request = new FileManager.Request({
-				url: tx_cfg.url,
-				data: tx_cfg.data,
-				onRequest: (function() {
-					this.previewLoader.inject(this.preview);
-					this.previewLoader.fade(1);
-					this.show_our_info_sections(false);
-				}).bind(this),
-				onSuccess: (function(j) {
-
-					if (!j || !j.status) {
-						this.previewLoader.dispose();
-						return;
-					}
-
-					// speed up DOM tree manipulation: detach .info from document temporarily:
-					this.info.dispose();
-
-					this.info_head.getElement('img').set({
-							src: icon,
-							alt: file.mime
-						});
-
-					this.info_head.getElement('h1').set('text', file.name);
-					this.info_head.getElement('h1').set('title', file.name);
-          
-          // don't wait for the fade to finish to set up the new content
-          var prev = this.preview.removeClass('filemanager-loading').set('html', '');
-
-          if(typeof this.options.previewHandlers[j.mime] === 'function')
-          {
-            this.options.previewHandlers[j.mime](prev, j);
-          }
-          else if(typeof this.options.previewHandlers[j.mime.split('/')[0]] === 'function')
-          {
-            this.options.previewHandlers[j.mime.split('/')[0]](prev, j);
-          }
-          else
-          {
-            prev.set('html', (j.content ? j.content.substitute(this.language, /\\?\$\{([^{}]+)\}/g) : '')).getElement('img.preview');           
-          }
-          
-					if (file.mime === 'text/directory')
-					{
-						// only show the image set when this directory is also the current one (other directory detail views can result from a directory rename operation!
-						this.diag.log('? fillInfo for DIR: ', file, ', currentDir: ', this.CurrentDir);
-						if (file.path === this.CurrentDir.path)
-						{
-							this.preview.adopt(this.dir_filelist);
-						}
-					}
-
-					// and plug in the manipulated DOM subtree again:
-					this.info.inject(this.filemanager);
-					this.show_our_info_sections(true);
-
-					this.previewLoader.fade(0).get('tween').chain((function() {
-						this.previewLoader.dispose();
-					}).bind(this));
-
-					var els = this.preview.getElements('button');
-					if (els) {
-						els.addEvent('click', function(e) {
-							e.stop();
-							window.open(this.get('value'));
-						});
-					}
-
-					if (prev && !j.thumb250 && j.thumbs_deferred)
-					{
-						var iconpath = this.assetBasePath + 'Images/Icons/Large/default-error.png';
-
-						if (0)
-						{
-							prev.set('src', iconpath);
-							prev.setStyles({
-								'width': '',
-								'height': '',
-								'background': 'none'
-							});
-						}
-
-						var tx_cfg = this.options.mkServerRequestURL(this, 'detail', {
-										directory: this.dirname(file.path),
-										file: file.name,
-										filter: this.options.filter,
-										mode: 'direct' + this.options.detailInfoMode
-									});
-
-						var req = new FileManager.Request({
-							url: tx_cfg.url,
-							data: tx_cfg.data,
-							fmDisplayErrors: false,   // Should we display the error here? No, we just display the general error icon instead
-							onRequest: function() {},
-							onSuccess: (function(j) {
-								var img_url = (j.icon48 ? j.icon48 : iconpath);
-								if (j && j.status && j.thumb250)
-								{
-									img_url = j.thumb250;
-								}
-
-								prev.set('src', img_url);
-								prev.addEvent('load', function() {
-									// when the thumb250 image has loaded, remove the loader animation in the background ...
-									//this.setStyle('background', 'none');
-									// ... AND blow away the encoded 'width' and 'height' styles: after all, the thumb250 generation MAY have failed.
-									// In that case, an icon is produced by the backend, but it will have different dimensions, and we don't want to
-									// distort THAT one, either.
-									this.setStyles({
-										'width': '',
-										'height': '',
-										'background': 'none'
-									});
-								});
-
-								// Xinha: We need to add in a form for setting the attributes of images etc,
-								// so we add this event and pass it the information we have about the item
-								// as returned by Backend/FileManager.php
-								this.fireEvent('details', [j, this]);
-
-								// update the stored json for this file as well:
-
-								// now mix with the previously existing 'file' info (as produced by a 'view' run):
-								file = Object.merge(file, j);
-
-								// remove unwanted JSON elements:
-								delete file.status;
-								delete file.error;
-								delete file.content;
-
-								if (file.element)
-								{
-									file.element.store('file', file);
-								}
-
-								if (typeof milkbox !== 'undefined')
-								{
-									milkbox.reloadPageGalleries();
-								}
-							}).bind(this),
-							onError: (function(text, error) {
-								prev.set('src', iconpath);
-								prev.setStyles({
-									'width': '',
-									'height': '',
-									'background': 'none'
-								});
-							}).bind(this),
-							onFailure: (function(xmlHttpRequest) {
-								prev.set('src', iconpath);
-								prev.setStyles({
-									'width': '',
-									'height': '',
-									'background': 'none'
-								});
-							}).bind(this)
-						}, this);
-
-						this.RequestQueue.addRequest('info:' + String.uniqueID(), req);
-						req.send();
-					}
-					else
-					{
-						// Xinha: We need to add in a form for setting the attributes of images etc,
-						// so we add this event and pass it the information we have about the item
-						// as returned by Backend/FileManager.php
-						this.fireEvent('details', [j, this]);
-
-						// We also want to hold onto the data so we can access it later on,
-						// e.g. when selecting the image.
-
-						// now mix with the previously existing 'file' info (as produced by a 'view' run):
-						file = Object.merge(file, j);
-
-						// remove unwanted JSON elements:
-						delete file.status;
-						delete file.error;
-						delete file.content;
-
-						if (file.element)
-						{
-							file.element.store('file', file);
-						}
-
-						if (typeof milkbox !== 'undefined')
-						{
-							milkbox.reloadPageGalleries();
-						}
-					}
-				}).bind(this),
-				onError: (function(text, error) {
-					this.previewLoader.dispose();
-				}).bind(this),
-				onFailure: (function(xmlHttpRequest) {
-					this.previewLoader.dispose();
-				}).bind(this)
-			}, this).send();
-		}
-	},
-
-  audioPreview: function(previewArea, fileDetails)
-  {
-    var dl = new Element('dl')
-                .adopt(new Element('dt').set('text', this.language['title']))
-                .adopt(new Element('dd').set('text', fileDetails.title))
-                .adopt(new Element('dt').set('text', this.language['artist']))
-                .adopt(new Element('dd').set('text', fileDetails.artist))
-                .adopt(new Element('dt').set('text', this.language['album']))
-                .adopt(new Element('dd').set('text', fileDetails.album))
-                .adopt(new Element('dt').set('text', this.language['length']))
-                .adopt(new Element('dd').set('text', fileDetails.length))
-                .adopt(new Element('dt').set('text', this.language['bitrate']))
-                .adopt(new Element('dd').set('text', fileDetails.bitrate))
-              .inject(previewArea);
-              
-    previewArea = new Element('div', {'class': 'filemanager-preview-content'}).inject(previewArea);
-    
-    var dewplayer = this.assetBasePath + '/dewplayer.swf';
-                  
-    new Element('object', {
-        type:   'application/x-shockwave-flash', 
-        data:   dewplayer,
-        width:  200,
-        height: 20,
-        style: 'margin-left:auto;margin-right:auto;display:block;'
-      })
-      .adopt(new Element('param', {name:'wmode',     value:'transparent'}))
-      .adopt(new Element('param', {name:'movie',     value:dewplayer}))
-      .adopt(new Element('param', {name:'flashvars', value:'mp3='+fileDetails.url+'&volume=50&showtime=1'}))              
-      .inject(previewArea);           
-      
-    return previewArea.parentNode;
-  },
-  
-	showFunctions: function(icon,appearOn,opacityBefore,opacityAfter) {
-		var opacity = [opacityBefore || 1, opacityAfter || 0];
-		icon.set({
-			opacity: opacity[1]
-		});
-
-		document.id(appearOn).addEvents({
-			mouseenter: (function() {
-							this.setStyle('opacity', opacity[0]);
-						}).bind(icon),
-			mouseleave: (function() {
-							this.setStyle('opacity', opacity[1]);
-						}).bind(icon)
-		});
-		return icon;
-	},
-
-	normalize: function(str) {
-		return str.replace(/\/+/g, '/');
-	},
-
-	dirname: function(path) {
-		var sects = path.split('/');
-		var topdir = sects.pop();
-		if (topdir === '')
-		{
-			// path has trailing '/'; keep it that way!
-			sects.pop();
-			sects.push('');
-		}
-		return sects.join('/');
-	},
-
-	switchButton4Current: function() {
-		var chk = !!this.Current;
-		var els = [];
-		els.push(this.menu.getElement('button.filemanager-open'));
-		els.push(this.menu.getElement('button.filemanager-download'));
-		els.each(function(el) {
-			if (el)
-			{
-				el.set('disabled', !chk)[(chk ? 'remove' : 'add') + 'Class']('disabled');
-			}
-		});
-	},
-
-	// adds buttons to the file main menu, which onClick start a method with the same name
-	addMenuButton: function(name) {
-		var el = new Element('div', {
-			'class': 'filemanager-button filemanager-' + name,
-			text: this.language[name]
-		}).inject(this.menu, 'top');
-
-		if (this[name+'_on_click'])
-		{
-			el.addEvent('click', this[name+'_on_click'].bind(this));
-		}
-		return el;
-	},
-
-	// clear the view chunk timer, erase the JSON store but do NOT reset the pagination to page 0:
-	// we may be reloading and we don't want to destroy the page indicator then!
-	reset_view_fill_store: function(j)
-	{
-		this.view_fill_startindex = 0;   // offset into the view JSON array: which part of the entire view are we currently watching?
-		if (this.view_fill_json)
-		{
-			// make sure the old 'fill' run is aborted ASAP: clear the old files[] array to break
-			// the heaviest loop in fill:
-			this.view_fill_json.files = [];
-			this.view_fill_json.dirs = [];
-		}
-
-		this.reset_fill();
-
-		this.view_fill_json = ((j && j.status) ? j : null);      // clear out the old JSON data and set up possibly new data.
-		// ^^^ the latest JSON array describing the entire list; used with pagination to hop through huge dirs without repeatedly
-		//     consulting the server. The server doesn't need to know we're so slow we need pagination now! ;-)
-	},
-
-
-	// clear the view chunk timer only. We are probably redrawing the list view!
-	reset_fill: function()
-	{
-		this.browser_dragndrop_info.fade(0.5);
-		this.browser_dragndrop_info.setStyle('background-position', '0px -16px');
-		this.browser_dragndrop_info.set('title', this.language.drag_n_drop_disabled);
-
-		// as this is a long-running process, make sure the hourglass-equivalent is visible for the duration:
-		this.browserLoader.fade(1);
-
-		this.browser_paging.fade(0);
-
-		// abort any still running ('antiquated') fill chunks:
-		this.RequestQueue.cancel_bulk('fill');
-		clearTimeout(this.view_fill_timer);
-		this.view_fill_timer = null;     // timer reference when fill() is working chunk-by-chunk.
-	},
-
-	store_view_fill_startindex: function(idx)
-	{
-		this.view_fill_startindex = idx;
-		if (typeof jsGET !== 'undefined' /* && this.storeHistory */) {
-			jsGET.set({'fmPageIdx': idx});
-		}
-	},
-
-	get_view_fill_startindex: function(idx)
-	{
-		// we don't care about null, undefined or 0 here: as we keep close track of the startindex, any nonzero valued setting wins out.
-		if (!idx)
-		{
-			idx = this.view_fill_startindex;
-		}
-		if (typeof jsGET !== 'undefined' && !idx)
-		{
-			idx = jsGET.get('fmPageIdx');
-		}
-		return parseInt(idx ? idx : 0, 10);
-	},
-
-	fireHooks: function(hook) {
-		var args = Array.slice(arguments, 1);
-		for(var key in this.hooks[hook]) {
-			this.hooks[hook][key].apply(this, args);
-		}
-		return this;
-	},
-
-	cvtXHRerror2msg: function(xmlHttpRequest) {
-		var status = xmlHttpRequest.status;
-		var orsc = xmlHttpRequest.onreadystatechange;
-		var response = (xmlHttpRequest.responseText || this.language['backend.unidentified_error']);
-
-		var text = response.substitute(this.language, /\\?\$\{([^{}]+)\}/g);
-		return text;
-	},
-
-	showError: function(text) {
-		var errorText = '' + text;
-
-		if (!errorText) {
-			errorText = this.language['backend.unidentified_error'];
-		}
-		errorText = errorText.substitute(this.language, /\\?\$\{([^{}]+)\}/g);
-
-		if (this.pending_error_dialog)
-		{
-			this.pending_error_dialog.appendMessage(errorText);
-		}
-		else
-		{
-			this.pending_error_dialog = new FileManager.Dialog(this.language.error, {
-				buttons: ['confirm'],
-				language: {
-					confirm: this.language.ok
-				},
-				content: [
-					errorText
-				],
-				zIndex: this.options.zIndex + 1000,
-				onOpen: this.onDialogOpen.bind(this),
-				onClose: function()
-				{
-					this.pending_error_dialog = null;
-					this.onDialogClose();
-				}.bind(this)
-			});
-		}
-	},
-
-	showMessage: function(textOrElement, title) {
-		if (!title) title = '';
-		new FileManager.Dialog(title, {
-			buttons: ['confirm'],
-			language: {
-				confirm: this.language.ok
-			},
-			content: [
-				textOrElement
-			],
-			zIndex: this.options.zIndex + 950,
-			onOpen: this.onDialogOpen.bind(this),
-			onClose: this.onDialogClose.bind(this)
-		});
-	},
-
-	onRequest: function() {
-		this.loader.fade(1);
-	},
-	onComplete: function() {
-		//this.loader.fade(0);
-	},
-	onSuccess: function() {
-		this.loader.fade(0);
-	},
-	onError: function() {
-		this.loader.fade(0);
-	},
-	onFailure: function() {
-		this.loader.fade(0);
-	},
-	onDialogOpen: function() {
-		this.dialogOpen = true;
-		this.onDialogOpenWhenUpload.apply(this);
-	},
-	onDialogClose: function() {
-		this.dialogOpen = false;
-		this.onDialogCloseWhenUpload.apply(this);
-	},
-	onDialogOpenWhenUpload: function() {},
-	onDialogCloseWhenUpload: function() {},
-	onDragComplete: function() {
-		return false;   // return TRUE when the drop action is unwanted
-	},
-
-	// dev/diag shortcuts:
-
-	// always return a string; dump object/array/... in 'arr' to human readable string:
-	diag:
-	{
-		verbose: false,
-		dump: function(arr, level, max_depth, max_lines, no_show)
-		{
-			return '';
-		},
-		log: function(/* ... */)
-		{
-			if (!this.verbose) return;
-
-			if (typeof console !== 'undefined')
-			{
-				// WARNING: MS IE9 (+ v8?) says: this object doesn't support the 'apply' method. :-(((
-				// Also, MSIE 8/9 doesn't show object dumps like you'd expect; Firebug Lite allegedly fixes that,
-				// but this is code which intends to 'hide' all that shite, so we can simply write diag.log() and
-				// not bother where it will end up.
-				if (console.info && console.info.apply)
-				{
-					console.info.apply(console, arguments);
-				}
-				else if (console.log && console.log.apply)
-				{
-					console.log.apply(console, arguments);
-				}
-				else if (console.info || console.log)
-				{
-					// the MSIE downgrade
-					var l = (console.info || console.log);
-					var a;
-					var lt = '';
-					var m, e, v;
-					var multiobj = 0;   // count items dumped without inter-WS
-					for (a in arguments)
-					{
-						multiobj++;
-						a = arguments[a];
-						switch (typeof a)
-						{
-						case 'undefined':
-							lt += '(undefined)';
-							break;
-
-						case 'null':
-							lt += '(null)';
-							break;
-
-						case 'object':
-							lt += '{';
-							m = '';
-							for (e in a)
-							{
-								lt += m;
-
-								v = a[e];
-								//if (typeof e !== 'string') continue;
-								switch (typeof v)
-								{
-								case 'function':
-									continue;               // skip these
-
-								case 'undefined':
-									lt += e + ': (undefined)';
-									break;
-
-								case 'null':
-									lt += e + ': (null)';
-									break;
-
-								case 'object':
-									// nuts of course: IE9 has objects which turn out as === null and clunk on .toString() as a consequence   >:-S
-									if (v === null)
-									{
-										lt += e + ': (null)';
-									}
-									else
-									{
-										lt += e + ': ' + v.toString();
-									}
-									break;
-
-								case 'string':
-									lt += e + ': "' + v + '"';
-									break;
-
-								default:
-									lt += e + ': ' + v.toString();
-									break;
-								}
-								m = ', ';
-							}
-							lt += '}';
-							break;
-
-						case 'string':
-							// reset inter-WS formatting assist:
-							multiobj = 0;
-							lt += a;
-							break;
-
-						default:
-							try
-							{
-								m = a.toString();
-							}
-							catch (e)
-							{
-								m = '(*clunk*)';
-							}
-							lt += v;
-							break;
-						}
-						if (multiobj >= 1)
-						{
-							lt += ' ';
-						}
-					}
-				}
-			}
-		}
-	}
-});
-
-FileManager.Request = new Class({
-	Extends: Request.JSON,
-
-	options:
-	{
-		secure:          true, // Isn't this true by default anyway in REQUEST.JSON?
-		fmDisplayErrors: true  // Automatically display errors - ** your onSuccess still gets called, just ignore if it's an error **
-	},
-
-	initialize: function(options, filebrowser) {
-		this.parent(options);
-
-		this.options.data = Object.merge({}, filebrowser.options.propagateData, this.options.data);
-
-		if (this.options.fmDisplayErrors)
-		{
-			this.addEvents({
-				success: function(j)
-				{
-					if (!j)
-					{
-						filebrowser.showError();
-					}
-					else if (!j.status)
-					{
-						filebrowser.showError(('' + j.error).substitute(filebrowser.language, /\\?\$\{([^{}]+)\}/g));
-					}
-				}.bind(this),
-
-				error: function(text, error)
-				{
-					filebrowser.showError(text);
-				},
-
-				failure: function(xmlHttpRequest)
-				{
-					var text = filebrowser.cvtXHRerror2msg(xmlHttpRequest);
-					filebrowser.showError(text);
-				}
-			});
-		}
-
-		this.addEvents({
-			request: filebrowser.onRequest.bind(filebrowser),
-			complete: filebrowser.onComplete.bind(filebrowser),
-			success: filebrowser.onSuccess.bind(filebrowser),
-			error: filebrowser.onError.bind(filebrowser),
-			failure: filebrowser.onFailure.bind(filebrowser)
-		});
-	}
-});
-
-FileManager.Language = {};
-
-(function() {
-
-// ->> load DEPENDENCIES
-if (typeof __MFM_ASSETS_DIR__ === 'undefined')
-{
-	var __DIR__ = (function() {
-			var scripts = document.getElementsByTagName('script');
-			var script = scripts[scripts.length - 1].src;
-			var host = window.location.href.replace(window.location.pathname+window.location.hash,'');
-			return script.substring(0, script.lastIndexOf('/')).replace(host,'') + '/';
-	})();
-	__MFM_ASSETS_DIR__ = __DIR__ + "../Assets";
-}
-Asset.javascript(__MFM_ASSETS_DIR__+'/js/milkbox/milkbox.js');
-Asset.css(__MFM_ASSETS_DIR__+'/js/milkbox/css/milkbox.css');
-Asset.css(__MFM_ASSETS_DIR__+'/Css/FileManager.css');
-Asset.css(__MFM_ASSETS_DIR__+'/Css/Additions.css');
-if(Browser.ie && Browser.version <= 7) 
-{   
-  Asset.css(__MFM_ASSETS_DIR__+'/Css/FileManager_ie7.css');
-}
-
-
-if( typeof __MFM_USE_BACK_BUTTON_NAVIGATION__ != 'undefined' && __MFM_USE_BACK_BUTTON_NAVIGATION__ )
-{
-  Asset.javascript(__MFM_ASSETS_DIR__+'/js/jsGET.js', {
-    events: {
-      load: (function() {
-        window.fireEvent('jsGETloaded');
-      }).bind(this)
-    }
-  });
-}
-
-Element.implement({
-
-	center: function(offsets) {
-		var scroll = document.getScroll();
-		var offset = document.getSize();
-		var size = this.getSize();
-		var values = {x: 'left', y: 'top'};
-
-		if (!offsets) {
-			offsets = {};
-		}
-
-		for (var z in values) {
-			var style = scroll[z] + (offset[z] - size[z]) / 2 + (offsets[z] || 0);
-			this.setStyle(values[z], (z === 'y' && style < 30) ? 30 : style);
-		}
-		return this;
-	}
-
-});
-
-FileManager.Dialog = new Class({
-
-	Implements: [Options, Events],
-
-	options: {
-		/*
-		 * onShow: function() {},
-		 * onOpen: function() {},
-		 * onConfirm: function() {},
-		 * onDecline: function() {},
-		 * onClose: function() {},
-		 */
-		request: null,
-		buttons: ['confirm', 'decline'],
-		language: {},
-		zIndex: 2000,
-		autofocus_on: null // (string) suitable as a .getElement() argument or NULL for default. Example: 'button.filemanager-dialog-confirm'
-	},
-
-	initialize: function(text, options) {
-		this.setOptions(options);
-		this.dialogOpen = false;
-
-		this.content_el = new Element('div', {
-			'class': 'filemanager-dialog-content'
-		}).adopt([
-			typeOf(text) === 'string' ? this.str2el(text) : text
-		]);
-
-		this.el = new Element('div', {
-			'class': 'filemanager-dialog' + (Browser.ie ? ' filemanager-dialog-engine-trident' : '') + (Browser.ie ? ' filemanager-dialog-engine-trident' : '') + (Browser.ie8 ? '4' : '') + (Browser.ie9 ? '5' : ''),
-			opacity: 0,
-			tween: {duration: 'short'},
-			styles:
-			{
-				'z-index': this.options.zIndex
-			}
-		}).adopt(this.content_el);
-
-		if (typeof this.options.content !== 'undefined') {
-			this.options.content.each((function(content) {
-				if (content)
-				{
-					if (typeOf(content) !== 'string')
-					{
-						this.content_el.adopt(content);
-					}
-					else
-					{
-						this.content_el.adopt(this.str2el(content));
-					}
-				}
-			}).bind(this));
-		}
-
-		Array.each(this.options.buttons, function(v) {
-			new Element('button', {'class': 'filemanager-dialog-' + v, text: this.options.language[v]}).addEvent('click', (function(e) {
-				if (e) e.stop();
-				this.fireEvent(v).fireEvent('close');
-				//if (!this.options.hideOverlay)
-				this.overlay.hide();
-				this.destroy();
-			}).bind(this)).inject(this.el);
-		}, this);
-
-		this.overlay = new Overlay({
-			'class': 'filemanager-overlay filemanager-overlay-dialog',
-			events: {
-				click: this.fireEvent.pass('close', this)
-			},
-			//tween: {duration: 'short'},
-			styles:
-			{
-				'z-index': this.options.zIndex - 1
-			}
-		});
-
-		this.bound = {
-			scroll: (function() {
-				if (!this.el)
-					this.destroy();
-				else
-					this.el.center();
-			}).bind(this),
-
-			keyesc: (function(e) {
-				window.FileManager.prototype.diag.log('keyEsc: key press: ', e);
-				if (e.key === 'esc') {
-					e.stopPropagation();
-					this.destroy();
-				}
-			}).bind(this)
-		};
-
-		this.show();
-	},
-
-	show: function() {
-		this.overlay.show();
-
-		var self = this;
-		this.fireEvent('open');
-		this.el.setStyle('display', 'block').inject(document.body);
-		this.restrictSize();
-		var autofocus_el = (this.options.autofocus_on ? this.el.getElement(this.options.autofocus_on) : (this.el.getElement('button.filemanager-dialog-confirm') || this.el.getElement('button')));
-		if (autofocus_el)
-		{
-				// HTML5 support: see    http://diveintohtml5.org/detect.html
-			autofocus_el.setProperty('autofocus', 'autofocus');
-      try{autofocus_el.focus();}catch(e) { /* IE<8 Failes */ }
-		}
-		this.el.center().fade(1).get('tween').chain((function() {
-				// Safari / Chrome have trouble focussing on things not yet fully rendered!
-				// see   http://stackoverflow.com/questions/2074347/focus-not-working-in-safari-or-chrome
-				// and   http://www.mkyong.com/javascript/focus-is-not-working-in-ie-solution/
-				if (autofocus_el)
-				{
-					if (0)                  // the delay suggested as a fix there is part of the fade()...
-					{
-						(function(el) {
-							el.focus();
-						}).delay(1, this, [autofocus_el]);
-					}
-					else
-					{
-						//autofocus_el.set('tabIndex', 0);   // http://code.google.com/p/chromium/issues/detail?id=27868#c15
-						// ^-- not needed.  When you debug JS in a Webkit browser, you're toast when it comes to getting input field focus, period.   :-(
-						autofocus_el.focus();
-					}
-				}
-			}).bind(this));
-
-		self.fireEvent('show');
-
-		window.FileManager.prototype.diag.log('add key up(ESC)/resize/scroll on show 1500');
-		document.addEvents({
-			'scroll': this.bound.scroll,
-			'resize': this.bound.scroll,
-			'keyup': this.bound.keyesc
-		});
-	},
-
-	appendMessage: function(text) {
-		this.content_el.adopt([
-			typeOf(text) === 'string' ? this.str2el(text) : text
-		]);
-		this.restrictSize();
-		this.el.center();
-	},
-
-	restrictSize: function()
-	{
-		// make sure the dialog never is larger than the viewport!
-		var ddim = this.el.getSize();
-		var vdim = window.getSize();
-		var maxx = (vdim.x - 20) * 0.85; // heuristic: make dialog a little smaller than the screen itself and keep a place for possible outer scrollbars
-		if (ddim.x >= maxx)
-		{
-			this.el.setStyle('width', maxx.toInt());
-		}
-		ddim = this.el.getSize();
-		var cdim = this.content_el.getSize();
-		var maxy = (vdim.y - 20) * 0.85; // heuristic: make dialog a little less high than the screen itself and keep a place for possible outer scrollbars
-		if (ddim.y >= maxy)
-		{
-			// first attempt to correct this by making the dialog wider:
-			var x = ddim.x * 2.0;
-			while (x < maxx && ddim.y >= maxy)
-			{
-				this.el.setStyle('width', x.toInt());
-				ddim = this.el.getSize();
-				x = ddim.x * 1.3;
-			}
-
-			cdim = this.content_el.getSize();
-			if (ddim.y >= maxy)
-			{
-				var y = maxy - ddim.y + cdim.y;
-				this.content_el.setStyles({
-					height: y.toInt(),
-					overflow: 'auto'
-				});
-			}
-		}
-	},
-
-	str2el: function(text)
-	{
-		var el = new Element('div');
-		if (text.indexOf('<') != -1 && text.indexOf('>') != -1)
-		{
-			try
-			{
-				el.set('html', text);
-			}
-			catch(e)
-			{
-				el.set('text', text);
-			}
-		}
-		else
-		{
-			el.set('text', text);
-		}
-		return el;
-	},
-
-	destroy: function() {
-		if (this.el) {
-			this.el.fade(0).get('tween').chain((function() {
-				if (!this.options.hideOverlay) {
-					this.overlay.destroy();
-				}
-				this.el.destroy();
-			}).bind(this));
-		}
-		window.FileManager.prototype.diag.log('remove key up(ESC) on destroy');
-		document.removeEvent('scroll', this.bound.scroll).removeEvent('resize', this.bound.scroll).removeEvent('keyup', this.bound.keyesc);
-		this.fireEvent('close');
-	}
-});
-
-this.Overlay = new Class({
-
-	initialize: function(options) {
-		this.el = new Element('div', Object.append({
-			'class': 'filemanager-overlay'
-		}, options)).inject(document.body);
-	},
-
-	show: function() {
-		this.objects = $$('object, select, embed').filter(function(el) {
-			if (el.id === 'SwiffFileManagerUpload' || el.style.visibility === 'hidden') {
-				return false;
-			}
-			else {
-				el.style.visibility = 'hidden';
-				return true;
-			}
-		});
-
-		this.resize();
-
-		this.el.setStyle('display', 'block');
-		this.el.fade('hide').fade(0.5);
-
-		window.addEvent('resize', this.resize.bind(this));
-
-		return this;
-	},
-
-	hide: function() {
-		if (!Browser.ie) {
-			this.el.fade(0).get('tween').chain((function() {
-				this.revertObjects();
-				this.el.setStyle('display', 'none');
-			}).bind(this));
-		} else {
-			this.revertObjects();
-			this.el.setStyle('display', 'none');
-		}
-
-		window.removeEvent('resize', this.resize);
-
-		return this;
-	},
-
-	resize: function() {
-		if (!this.el) {
-			this.destroy();
-		}
-		else {
-			document.id(this.el).setStyles({ // IE7 thinks this.el is no longer a mootools object, ^shrug^
-				width: document.getScrollWidth(),
-				height: document.getScrollHeight()
-			});
-		}
-	},
-
-	destroy: function() {
-		this.revertObjects().el.destroy();
-	},
-
-	revertObjects: function() {
-		if (this.objects && this.objects.length) {
-			this.objects.each(function(el) {
-					el.setStyle('visibility', 'visible');
-			});
-		}
-
-		return this;
-	}
-});
-
-})();
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/MootoolsFileManager/mootools-filemanager/Source/Gallery.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/MootoolsFileManager/mootools-filemanager/Source/Gallery.js
deleted file mode 100755
index 58f6bb6..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/MootoolsFileManager/mootools-filemanager/Source/Gallery.js
+++ /dev/null
@@ -1,794 +0,0 @@
-/*
----
-
-description: Adds functionality to create a gallery out of a list of images
-
-authors: Christoph Pojer (@cpojer)
-
-license: MIT-style license.
-
-requires:
-  core/1.4.5: '*'
-  more/1.4.0.1: [Sortables]
-
-provides: FileManager.Gallery
-
-...
-*/
-
-(function() {
-
-FileManager.Gallery = new Class({
-
-	Extends: FileManager,
-
-	options:
-	{
-		closeCaptionEditorOnMouseOut: true  // TRUE: will save & close caption editor popup dialog when you move the mouse out there
-	},
-
-	hooks: {
-		fill: {
-			populate: function() {
-				// now we have a valid 'this.root' and we need that to preprocess the paths specified on populate(). So we have a go!
-				this.startPopulatingTheGallery();
-			}
-		}
-	},
-
-	initialize: function(options)
-	{
-		this.offsets = {y: -72};
-		this.imgContainerSize = { x: 75, y: 56 };
-		this.captionImgContainerSize = { x: 250, y: 250 };
-		this.isSorting = false;
-		this.populate_queue = [];
-
-		// make sure our 'complete' event does NOT clash with the base class event by simply never allowing it: you CANNOT have options.selectable and gallery mode at the same time!
-		// (If you do, the caller will have a hard time detecting /who/ sent the 'complete' event; the only way would be to inspect the argument list and deduce the 'origin' from there.)
-		options.selectable = false;
-
-		this.parent(options);
-
-		this.addEvents({
-			scroll: function(e, self) {
-				self.show_gallery();
-			},
-
-			show: function(self) {
-				self.gallery.empty();
-				self.files = {};
-
-				self.show_gallery();
-				self.populate();
-			},
-
-			hide: function(self) {
-				if (!self.keepGalleryData) {
-					self.gallery.empty();
-					self.files = {};
-				}
-				else {
-					self.keepGalleryData = false;
-				}
-				self.hideClone();
-				// self.wrapper.setStyle('display', 'none');
-			},
-
-			modify: function(file, json, mode, self) {
-				// mode is one of (destroy, rename, move, copy): only when mode=copy, does the file remain where it was before!
-				if (mode !== 'copy')
-				{
-					self.erasePicture(file.path);
-				}
-			}
-		});
-
-		this.addMenuButton('serialize');
-		this.galleryContainer = new Element('div', {
-			'class': 'filemanager-gallery',
-			styles:
-			{
-				'z-index': this.options.zIndex - 10
-			}
-		}).inject(this.container);
-		this.gallery = new Element('ul').inject(this.galleryContainer);
-
-		var timer = null;
-		var self = this;
-
-		this.input = new Element('textarea', {name: 'imgCaption'});
-
-		var imgdiv = new Element('div', {'class': 'img'});
-		this.wrapper = new Element('div', {
-			'class': 'filemanager-wrapper',
-			styles:
-			{
-				'z-index': this.options.zIndex + 750,
-				'opacity': 0,
-				'display': 'none'
-			},
-			tween: {duration: 'short'}
-		}).adopt(
-			new Element('span', {text: this.language.gallery.text}),
-			this.input,
-			imgdiv,
-			new Element('button', {text: this.language.gallery.save}).addEvent('click', function(e) {
-				self.removeClone(e, this);
-			})
-		);
-
-		// stop filemanager window events when you hit enter
-		this.gallery_keyboard_handler = (function(e)
-		{
-			this.diag.log('gallery KEYBOARD handler: key press: ', e);
-
-			if (this.dialogOpen) return;
-
-			// don't propagate any keyboard code to the filemanager keyboard handler (e.g. TAB)
-			e.stopPropagation();
-
-			if (e.key == 'enter')
-			{
-				// deactivated to allow multiple line caption. \n will later be transformed into <br>
-				//self.removeClone(e, this);
-			}
-		}).bind(this);
-
-		if ((Browser.Engine && (Browser.Engine.trident || Browser.Engine.webkit)) || (Browser.ie || Browser.chrome || Browser.safari))
-		{
-			this.input.addEvent('keydown', this.gallery_keyboard_handler);
-			// also make sure keyboard navigation actually works in the caption editor pane: catch ENTER on button, etc. from bubbling up to the filemanager handler:
-			this.wrapper.addEvent('keydown', this.gallery_keyboard_handler);
-		}
-		else
-		{
-			this.input.addEvent('keypress', this.gallery_keyboard_handler);
-			// also make sure keyboard navigation actually works in the caption editor pane: catch ENTER on button, etc. from bubbling up to the filemanager handler:
-			this.wrapper.addEvent('keypress', this.gallery_keyboard_handler);
-		}
-		// also make sure keyboard navigation actually works in the caption editor pane: catch ENTER on button, etc. from bubbling up to the filemanager handler:
-		this.wrapper.addEvent('keyup', this.gallery_keyboard_handler);
-
-		this.wrapper.inject(document.body);
-
-		var wrapper_pos = this.wrapper.getCoordinates();
-		var imgdiv_pos = imgdiv.getCoordinates();
-		this.captionDialogOffsets = {
-			x: Math.round(wrapper_pos.left - imgdiv_pos.left - (imgdiv_pos.width - this.captionImgContainerSize.x) / 2),
-			y: Math.round(wrapper_pos.top - imgdiv_pos.top - (imgdiv_pos.height - this.captionImgContainerSize.y) / 2),
-			h: wrapper_pos.height,
-			w: wrapper_pos.width
-		};
-		this.droppables.push(this.gallery);
-
-		this.keepGalleryData = false;
-		this.files = {};
-		this.animation = {};
-
-		this.howto = new Element('div', {
-			'class': 'howto',
-			styles:
-			{
-				'z-index': this.options.zIndex + 15
-			},
-			text: this.language.gallery.drag
-		}).inject(this.galleryContainer);
-		this.switchButton();
-
-		// invoke the parent method directly
-		this.initialShowBase();
-
-		// add CAPTION OVERLAY
-		this.captionOverlay = new Overlay({
-			'class': 'filemanager-overlay filemanager-overlay-dialog filemanager-overlay-caption',
-			events: {
-				click: (function() {
-					this.removeClone();
-					this.captionOverlay.hide();
-				}).bind(this)
-			},
-			styles: {
-				'z-index': this.options.zIndex + 11
-			}
-		});
-
-
-		// -> create SORTABLE list
-		this.sortable = new Sortables(this.gallery, {
-			clone: false,
-			//revert: true,
-			//opacity: 1,
-			onStart: (function() {
-				this.isSorting = true;
-			}).bind(this),
-			onSort: (function(li) {
-				newOrder = this.sortable.serialize((function(element, index) {
-					return this.files[element.retrieve('imageName')];
-				}).bind(this));
-
-				// create new order of images
-				this.files = {};
-				newOrder.each(function(file) {
-					if (file) {
-						this.files[file.legal_path] = file;
-					}
-				}, this);
-			}).bind(this)
-		});
-	},
-
-	// override the parent's initialShow method: we do not want to jump to the jsGET-stored position again!
-	initialShow: function() {
-	},
-
-	show_gallery: function()
-	{
-		this.galleryContainer.setStyles({
-			opacity: 0,
-			display: 'block'
-		});
-
-		this.filemanager.setStyles({
-			top: '10%',
-			height: '60%'
-		});
-
-		this.fitSizes();
-
-		var size = this.filemanager.getSize();
-		var pos = this.filemanager.getPosition();
-
-		// determine how many images we can show next to one another:
-		var galWidthComp = 2;    // 2px not accounted for in the Width calculation; without these the width slowly grows instead of 'jump' to fit one more/less image horizontally
-		var imgMarginWidth = 4;  // 4px unaccounted for in the element width
-		var radiiCorr = 40;      // correction for the radii in the FileManager container: looks better that way; must at least be 20
-		var imgWidth = 84;       // derived from current CSS; bad form to do it this way, but this is a good guess when there's no image in there yet.
-		var scrollbarCorr = 20;  // correction for optional Y scrollbar when the number of images doesn't fit in two rows anymore.
-
-		var imgs = this.galleryContainer.getElements('li');
-		if (imgs && imgs[0])
-		{
-			// when we HAVE images, derive the width from one of those!
-			imgWidth = imgs[0].getWidth() + imgMarginWidth;
-		}
-		var galWidth = this.galleryContainer.getWidth();
-		var g_rem = (galWidth - scrollbarCorr) % imgWidth;
-		var img_cnt = Math.floor((size.x - g_rem - scrollbarCorr - radiiCorr) / imgWidth);
-		if (img_cnt < 3) img_cnt = 3;
-		var gw = img_cnt * imgWidth + g_rem + scrollbarCorr;
-
-		this.galleryContainer.setStyles({
-			top: pos.y + size.y - 1,
-			left: pos.x + (size.x - gw) / 2,
-			width: gw - 2,
-			opacity: 1
-		});
-
-		this.hideClone();
-		// this.wrapper.setStyle('display', 'none');
-	},
-
-	// override the parent's allow_DnD method: always allow drag and drop as otherwise we cannot construct our gallery!
-	allow_DnD: function(j, pagesize) {
-		return true;
-	},
-
-	show_caption_editor: function(img_el, li_wrapper, file)
-	{
-		var self = this;
-
-		// -> add overlay
-		$$('filemanager-overlay-caption').addEvent('click', function(e) {
-			this.removeClone(null,li_wrapper);
-		}.bind(this));
-		this.captionOverlay.show();
-
-		var name = file.path;
-
-		var pos = img_el.getCoordinates();
-		var oml = img_el.getStyle('margin-left').toInt();
-		var omt = img_el.getStyle('margin-top').toInt();
-		pos.left -= oml;
-		pos.top -= omt;
-
-		var vp = window.getSize();
-
-		this.hideClone();
-
-		var pic = file.thumb250;
-		var w = file.thumb250_width;
-		var h = file.thumb250_height;
-
-		if (!pic)
-		{
-			pic = file.icon48;
-			w = 48;
-			h = 48;
-		}
-
-		// now calculate the scaled image dimensions for this one:
-		var cw = this.captionImgContainerSize.x;
-		var ch = this.captionImgContainerSize.y;
-		var redux;
-		if (w > cw)
-		{
-			redux = cw / w;
-			w *= redux;
-			h *= redux;
-		}
-		if (h > ch)
-		{
-			redux = ch / h;
-			w *= redux;
-			h *= redux;
-		}
-		w = Math.round(w);
-		h = Math.round(h);
-		var ml, mk, mt, mb;
-		ml = Math.round((cw - w) / 2);
-		mr = cw - ml - w;
-		mt = Math.round((ch - h) / 2);
-		mb = ch - mt - h;
-
-		var nl, nt;
-		//nl = Math.round(pos.left - (w - pos.width) / 2);
-		//nt = pos.top - (h - pos.height);
-		nl = Math.round((vp.x - this.captionDialogOffsets.w) / 2 - this.captionDialogOffsets.x);
-		nt = Math.round((vp.y - this.captionDialogOffsets.h) / 2 - this.captionDialogOffsets.y);
-
-		this.animation = {
-			from: {
-				width: pos.width,
-				height: pos.height,
-				left: pos.left,
-				top: pos.top,
-				'margin-left': oml,
-				'margin-top': omt
-			},
-			to: {
-				width: w,
-				height: h,
-				left: nl,
-				top: nt,
-				'margin-left': ml,
-				'margin-top': mt
-			}
-		};
-
-		this.input.removeEvents('blur').addEvent('blur', function() {
-			if (!self.files[name])
-				return;
-			self.files[name].caption = (this.value || '');
-		});
-
-		// clone image for caption container
-		//li_wrapper.setStyle('opacity', 0);
-		this.clone = img_el.clone();
-		this.clone.store('file', file).store('parent', li_wrapper).addClass('filemanager-clone').set({
-			styles: {
-				position: 'relative',
-				width: w,
-				height: h,
-				top: ((260- h) / 2) - 2,
-				left: ((260- w) / 2) - 1,
-				'z-index': this.options.zIndex + 800
-			}
-		}).inject(self.wrapper.getChildren('div.img')[0]);
-
-		// blend in the caption container
-		if (!this.files[name])
-			return;
-		this.input.set('value', self.files[name].caption || '');
-		this.wrapper.setStyles({
-			'position':'fixed',
-			'display': 'block',
-			'left': this.animation.to.left /* -12 */,
-			'top': this.animation.to.top - this.captionDialogOffsets.y /* -53 */
-		}).fade('hide').fade(1).get('tween').chain((function() {
-			this.input.focus();
-		}).bind(this));
-	},
-
-	img_injector: function(file, imgcontainer, li_wrapper)
-	{
-		var pic = file.thumb250;
-		var w = file.thumb250_width;
-		var h = file.thumb250_height;
-
-		if (!pic)
-		{
-			pic = file.icon48;
-			w = 48;
-			h = 48;
-		}
-
-		// now calculate the scaled image dimensions for this one:
-		var cw = this.imgContainerSize.x;
-		var ch = this.imgContainerSize.y;
-		var redux;
-		if (w > cw)
-		{
-			redux = cw / w;
-			w *= redux;
-			h *= redux;
-		}
-		if (h > ch)
-		{
-			redux = ch / h;
-			w *= redux;
-			h *= redux;
-		}
-		w = Math.round(w);
-		h = Math.round(h);
-		var ml, mk, mt, mb;
-		ml = Math.round((cw - w) / 2);
-		mr = cw - ml - w;
-		mt = Math.round((ch - h) / 2);
-		mb = ch - mt - h;
-
-		var self = this;
-		var img = Asset.image(pic, {
-			styles: {
-				width: w,
-				height: h,
-				'margin-top': mt,
-				'margin-bottom': mb,
-				'margin-left': ml,
-				'margin-right': mr
-			},
-			onLoad: function() {
-				var img_el = this;
-				li_wrapper.setStyle('background', 'none').addEvent('click', function(e) {
-					if (e) e.stop();
-					if (!self.isSorting) {
-						self.show_caption_editor(img_el, li_wrapper, file);
-					}
-					self.isSorting = false;
-				});
-			},
-			onError: function() {
-				self.diag.log('image asset: error!');
-				var iconpath = self.assetBasePath + 'Images/Icons/Large/default-error.png';
-				this.src = iconpath;
-			},
-			onAbort: function() {
-				self.diag.log('image asset: ABORT!');
-				var iconpath = self.assetBasePath + 'Images/Icons/Large/default-error.png';
-				this.src = iconpath;
-			}
-		});
-
-		img.inject(imgcontainer);
-	},
-
-	onDragComplete: function(el, droppable, caption) {
-
-		if (typeof caption === 'undefined') {
-			caption = '';
-		}
-
-		this.imageadd.fade(0);
-
-		if (this.howto) {
-			this.howto.destroy();
-			this.howto = null;
-		}
-
-		if (!droppable || droppable != this.gallery)
-			return false;
-
-		var file;
-		if (typeof el === 'string')
-		{
-			var part = el.split('/');
-			file = {
-				name: part.pop(),
-				path: this.normalize(el),
-				mime: 'unknown/unknown',
-				thumbs_deferred: true
-			};
-		}
-		else
-		{
-			el.setStyles({left: '', top: ''});
-			file = el.retrieve('file');
-		}
-
-		var name = file.path;
-
-		// when the item already exists in the gallery, do not add it again:
-		if (this.files[name])
-			return true;
-
-		// store & display item in gallery:
-		var self = this;
-		var destroyIcon = Asset.image(this.assetBasePath + 'Images/destroy.png').set({
-			'class': 'filemanager-remove',
-			title: this.language.gallery.remove,
-			events: {
-				click: function(e) {
-					if(e) e.stop();
-					self.erasePicture(name);
-				}
-			}
-		});
-		// hide on start
-		destroyIcon.setStyle('opacity',0);
-
-		/**
-		* as 'imgcontainer.getSize() won't deliver the dimensions as set in the CSS, we turn it the other way around:
-		* we set the w/h of the image container here explicitly; the CSS can be used for other bits of styling.
-		*/
-		var imgcontainer = new Element('div', {
-			'class': 'gallery-image',
-			'title': file.name,
-			styles: {
-				width: this.imgContainerSize.x,
-				height: this.imgContainerSize.y
-			}
-		});
-		this.tips.attach(imgcontainer);
-
-		// STORE the IMAGE PATH in the li FOR the SORTABLE
-		var li = new Element('li').store('imageName', name).adopt(
-			imgcontainer,
-			destroyIcon
-		).inject(this.gallery);
-
-		this.files[name] = {
-			legal_path: name,
-			caption: caption,
-			file: file,
-			element: li
-		};
-
-		this.showFunctions(destroyIcon,li,1);
-		this.tips.attach(destroyIcon);
-		this.switchButton();
-
-		// When the file info is lacking thumbnail info, fetch it by firing a 'detail' request and taking it from there.
-		// Also send our flavour of the 'detail' request when the thumbnail is yet to be generated.
-		if (file.thumbs_deferred)
-		{
-			// request full file info for this one! PLUS direct-access thumbnails!
-
-			// do NOT set this.Request as this is a parallel request; mutiple ones may be fired when onDragComplete is, for instance, invoked from the array-loop inside populate()
-
-			var tx_cfg = this.options.mkServerRequestURL(this, 'detail', {
-							directory: this.dirname(file.path),
-							file: file.name,
-							filter: this.options.filter,
-							mode: 'direct' + this.options.detailInfoMode           // provide direct links to the thumbnail files
-						});
-
-			var req = new FileManager.Request({
-				url: tx_cfg.url,
-				data: tx_cfg.data,
-				onRequest: function() {},
-				onSuccess: (function(j)
-				{
-					if (!this.files[name])
-						return;
-
-					if (!j || !j.status) {
-						var msg = ('' + j.error).substitute(this.language, /\\?\$\{([^{}]+)\}/g);
-
-						this.files[name].caption = msg;
-						return;
-					}
-
-					// the desired behaviour anywhere is NOT identical to that when handling the FileManager 'details' request/event!
-					this.fireEvent('galleryDetails', [j, this]);
-
-					// We also want to hold onto the data so we can access it later on,
-					// e.g. when returning the gallery collection to the user.
-
-					// now mix with the previously existing 'file' info:
-					file = Object.merge(file, j);
-
-					// remove unwanted JSON elements:
-					delete file.thumbs_deferred;
-					delete file.status;
-					delete file.error;
-					delete file.content;
-
-					if (file.element)
-					{
-						file.element.store('file', file);
-					}
-
-					// and update the gallery pane:
-					li.store('file', file);
-
-					//this.onDragComplete(li, droppable);
-					this.files[name].file = file;
-
-					this.img_injector(file, imgcontainer, li);
-
-				}).bind(this),
-				onError: (function(text, error) {
-				}).bind(this),
-				onFailure: (function(xmlHttpRequest) {
-				}).bind(this)
-			}, this);
-
-			this.RequestQueue.addRequest('populate:' + String.uniqueID(), req);
-			req.send();
-
-			// while the 'details' request is sent off, keep a 'loader' animation in the spot where the thumbnail/image should end up once we've got that info from the 'details' request
-		}
-		else
-		{
-			// we already have all required information. Go show the image in the gallery pane!
-			this.img_injector(file, imgcontainer, li);
-		}
-
-		// -> add this list item to the SORTABLE
-		this.sortable.addItems(li);
-
-		return true;
-	},
-
-	removeClone: function(e, target) {
-		if (e) e.stop();
-
-		// remove the overlay
-		$$('filemanager-overlay-caption').removeEvents('click');
-		this.captionOverlay.hide();
-
-		if (!this.clone || (e && e.relatedTarget && ([this.clone, this.wrapper].contains(e.relatedTarget) || (e && this.wrapper.contains(e.relatedTarget) && e.relatedTarget != this.wrapper))))
-			return;
-		if (this.clone.get('morph').timer)
-			return;
-
-		var file = this.clone.retrieve('file');
-		if (!file)
-			return;
-
-		var name = file.path;
-
-		if (!this.files[name])
-			return;
-
-		this.files[name].caption = (this.input.value || '');
-
-		self = this;
-
-		this.wrapper.fade(0).get('tween').chain(function() {
-			this.element.setStyle('display', 'none');
-			self.clone.destroy();
-		});
-	},
-
-	hideClone: function() {
-		if (!this.clone)
-			return;
-
-		this.clone.get('morph').cancel();
-		var parent = this.clone.retrieve('parent');
-		if (parent) {
-			//parent.setStyle('opacity', 1);
-		}
-		this.clone.destroy();
-		this.wrapper.setStyles({
-			opacity: 0,
-			'display': 'none'
-		});
-	},
-
-	erasePicture: function(name) {
-		if (this.files[name])
-		{
-			this.tips.hide();
-
-			var self = this;
-			this.files[name].element.set('tween', {duration: 'short'}).removeEvents('click').fade(0).get('tween').chain(function() {
-				this.element.destroy();
-				self.switchButton();
-				delete self.files[name];
-			});
-		}
-	},
-
-	switchButton: function() {
-		if (typeof this.gallery != 'undefined') {
-			var chk = !!this.gallery.getChildren().length;
-			this.menu.getElement('button.filemanager-serialize').set('disabled', !chk)[(chk ? 'remove' : 'add') + 'Class']('disabled');
-		}
-	},
-
-	populate: function(data, path_is_urlencoded /* default = TRUE */)
-	{
-		this.diag.log('GALLERY.populate: ', data, ', is_urlencoded: ', path_is_urlencoded);
-
-		if (typeof path_is_urlencoded == 'undefined' || path_is_urlencoded === null)
-			path_is_urlencoded = true;    // set default to TRUE
-		else
-			path_is_urlencoded = !!path_is_urlencoded;
-
-		//
-		// WARNING: these items are abs.path encoded and we to convert them to 'legal URL' directory space or the server will reject these on security grounds.
-		//          But we don't know the 'legal URL root' path as that is a server-side setting, so we MUST delay the population of the gallery until our first
-		//          request has arrived with this desperately needed item.
-		//          We wait for the dirscan ('view' request) to complete; actually we wait until the fill() has finished as by that time we'll be sure
-		//          to have a valid this.root (or a grandiose server comm failure!)
-		//          Until that time, we push all items to populate the gallery with on the populate stack.
-
-		Object.each(data || {}, function(v, i) {
-			this.diag.log('GALLERY.populate push: index = ', i, ', value = ', v, ', enc: ', (1 * path_is_urlencoded));
-			if (path_is_urlencoded)
-			{
-				i = this.unescapeRFC3986(i);
-			}
-			this.populate_queue.push({
-					path: i,
-					caption: v
-				});
-		}, this);
-	},
-
-	startPopulatingTheGallery: function()
-	{
-		if (!this.root)
-		{
-			this.diag.log('### FATAL error in startPopulatingTheGallery(): no valid .root path!');
-			return;
-		}
-
-		var count = this.populate_queue.length;
-		if (count)
-		{
-			// we've got work to do, folks!
-			var i;
-			var abs_root = this.normalize('/' + this.root);
-
-			for (i = 0; i < count; ++i)
-			{
-				// LIFO queue:
-				var item = this.populate_queue.shift();
-				var path = item.path;
-
-				// coded so that we support 'legal URL space' items and 'absolute URL path' items at the same time:
-				// when paths start with the root directory, we'll strip that off to make them 'legal URL space' compliant filespecs.
-				if (path.indexOf(abs_root) === 0)
-				{
-					path = path.substr(this.root.length);
-				}
-				if (path)
-				{
-					this.onDragComplete(path, this.gallery, item.caption);
-				}
-				else
-				{
-					this.diag.log('### gallery populate: invalid input (not in legal URL space): ', item, ', root: ', this.root);
-				}
-			}
-		}
-	},
-
-	serialize_on_click: function(e) {
-		if (e) e.stop();
-
-		var serialized = {};
-		var metas = {};
-		var index = 0;
-		Object.each(this.files,function(file)
-		{
-			var path = (this.options.deliverPathAsLegalURL ? file.file.path : this.escapeRFC3986(this.normalize('/' + this.root + file.file.path)));  // the absolute URL for the given file, rawURLencoded
-			var caption = (file.caption || '');
-			serialized[path] = caption;
-			var m = Object.clone(file.file);
-			m['order_no'] = index++;
-			m['caption'] = caption;
-			m['pathRFC3986'] = path;
-			metas[path] = m;
-		}, this);
-		this.keepGalleryData = true;
-		this.hide(e);
-		this.fireEvent('complete', [serialized, metas, this.root, this]);
-	}
-});
-
-})();
-
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/MootoolsFileManager/mootools-filemanager/Source/NoFlash.Uploader.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/MootoolsFileManager/mootools-filemanager/Source/NoFlash.Uploader.js
deleted file mode 100644
index 4ff8920..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/MootoolsFileManager/mootools-filemanager/Source/NoFlash.Uploader.js
+++ /dev/null
@@ -1,880 +0,0 @@
-/**
-Uploader Implementation Not Requiring Flash
-===============================================================================
-
-This class implements Upload functionality into the FileManager using 
-either HTML5 Uploads via XMLHTTPRequest if the browser supports that, 
-or a hidden file input and submitting to an iframe otherwise.
-
-HTML5 Uploads can handle uploading multiple files with progress indications.
-
-Fallback uploads present a standard file field to facilitate picking a single
-file and an upload button to upload it (posts to a hidden iframe).
-
-Tested In
-----------
-
-Working Fully With HTML5 Multiple Uploads
-
-  * Linux Chrome 65.0.3325.18
-  * Linux Firefox 58 (see note for Firefox users below)
-  * Linux Opera 50
-  * Linux Chromium 63.0.3239.132
-  
-  * Windows IE 11
-  
-  * Mac OSX Safari 9.1.1 (11601.6.17)
-
-Working Fallback Single Upload At A Time
-
-  * Windows IE 8 - Falls back to iframe upload
-  * Windows IE 9 - Falls back to iframe upload
-
-
-FIREFOX USERS NOTICE
--------------------------------------------------------------------------------
-
-The Firefox file selection dialog can be HORRIBLY broken, unusable, this is not 
-a bug in MFM, it's firefox.  If you start firefox with the MOZ_USE_XINPUT2=1 
-environment variable, it fixes it!
-
-@author James Sleeman <james@gogo.co.nz>
-@license MIT-style License
-
-*/
-
-FileManager.implement({
-
-	options: {
-		resizeImages: true,
-		upload: true,
-		uploadAuthData: {}             // deprecated; use FileManager.propagateData instead!
-	},
-
-	hooks: {
-		show: {
-			upload: function() {
-				this.startUpload();
-			}
-		},
-
-		cleanup: {
-			upload: function() {
-				this.hideUpload();
-			}
-		}
-	},
-
-	onDialogOpenWhenUpload: function() {
-
-	},
-
-	onDialogCloseWhenUpload: function() {
-
-	},
-
-  /** Create the file input field and inject it into the given form element
-   */
-  
-	make_file_input: function(form_el)
-	{
-		var fileinput = (new Element('input')).set({
-			type: 'file',
-			name: 'Filedata',
-			id: 'filemanager_upload_Filedata',
-      multiple: 'multiple'
-		});
-    
-    // fileinput.style.visibility = 'hidden';
-    
-		if (form_el.getElement('input[type=file]'))
-		{
-			fileinput.replaces(form_el.getElement('input[type=file]'));
-		}
-		else
-		{
-			form_el.adopt(fileinput);
-		}
-		return form_el;
-	},
-
-  /** Cleanup after ourselves when the filemanager window is closed
-   * 
-   *  @TODO This may not be entirely necessary now, leaving it anyway.
-   */
-  
-	hideUpload: function()
-	{
-		if (!this.options.upload || !this.upload) return;
-
-		if (this.upload.uploadButton.label)
-		{
-			this.upload.uploadButton.label.fade(0).get('tween').chain(function() {
-				this.element.dispose().destroy();
-			});
-			this.upload.uploadButton.label = null;
-		}
-		if (this.upload.uploadButton)
-		{
-			this.upload.uploadButton.fade(0).get('tween').chain(function() {
-				this.element.dispose().destroy();
-			});
-			this.upload.uploadButton = null;
-		}
-		if (this.upload.form)
-		{
-			this.upload.inputs = null;
-
-			this.upload.form.dispose().destroy();
-			this.upload.form = null;
-		}
-		this.menu.setStyle('height', '');
-
-		if (this.upload.resizer)
-		{
-			this.upload.resizer.dispose().destroy();
-			this.upload.resizer = null;
-		}
-		
-    // discard old iframe, if it exists:
-    if (this.upload.dummyframe)
-    {
-      // remove from the menu (dispose) and trash it (destroy)
-      this.upload.dummyframe.dispose().destroy();
-      this.upload.dummyframe = null;
-    }
-	},
-
-  /** Setup out upload interface.
-   * 
-   *  Creates the upload button, the container for the form field, calls out to create the form field
-   *  the area for the upload list, and the resizing checkbox.
-   *
-   */
-  
-	startUpload: function()
-	{
-		if (!this.options.upload) {
-			return;
-		}
-
-		var self = this;
-
-		this.upload = {
-			inputs: {},
-			resizer: null,
-      dummyframe: null,
-      dummyframe_active: false,     // prevent premature firing of the load event (hello, MSIE!) to cause us serious trouble in there
-      can_support_xhr:   typeof ((new Element('input')).set({
-        type: 'file',
-        name: 'Filedata',
-        multiple: 'multiple'
-      })).files == 'undefined' ? false : true,
-      
-			form: (new Element('form'))
-				// .set('action', tx_cfg.url)
-				.set('method', 'post')
-				.set('enctype', 'multipart/form-data')
-        .set('target', 'dummyframe')
-				.setStyles({
-					'float': 'left',
-					'padding-left': '3px',
-					'display': 'block'
-			}),
-
-			uploadButton: this.addMenuButton('upload').inject(this.menu, 'bottom').addEvents({				
-				mouseenter: function() {
-					this.addClass('hover');
-				},
-				mouseleave: function() {
-					this.removeClass('hover');
-					this.blur();
-				},
-				mousedown: function() {
-					this.focus();
-				}
-			}),
-
-      list: new Element('ul', {'class': 'filemanager-uploader-list'}),
-      uploader: new Element('div', {opacity: 0, 'class': 'filemanager-uploader-area'}).adopt(
-        new Element('h2', {text: this.language.upload}),
-        new Element('div', {'class': 'filemanager-uploader'})
-      )
-		};
-    this.upload.uploader.getElement('div').adopt(this.upload.list);
-
-    if(this.upload.can_support_xhr)
-    {
-      this.upload.form.setStyle('visibility', 'hidden');
-      this.upload.uploadButton.addEvent('click',  function(e) {
-          e.stop();
-
-          self.upload.form.getElement('input[type=file]').removeEvents('change');
-          self.upload.form.getElement('input[type=file]').addEvent('change', self.doUpload.bind(self));
-          
-          self.upload.form.getElement('input[type=file]').click();
-          
-      }); 
-    }
-    else
-    {
-      this.upload.uploadButton.addEvent('click',  function(e) {
-          e.stop()
-          self.doUploadFallback();
-      }); 
-    }
-    
-		if (this.options.resizeImages)
-		{
-			this.upload.resizer = new Element('div', {'class': 'checkbox'});
-			var check = (function()
-			{
-				this.toggleClass('checkboxChecked');
-			}).bind(this.upload.resizer);
-			check();
-			this.upload.uploadButton.label = new Element('label', { 'class': 'filemanager-resize' }).adopt(
-				this.upload.resizer,
-				new Element('span', {text: this.language.resizeImages})
-			).addEvent('click', check).inject(this.menu);
-		}
-
-		this.make_file_input(self.upload.form);
-
-		self.upload.form.inject(this.menu, 'top');
-		//this.menu.setStyle('height', '60px');
-
-  },
-
-  
-  /** Change handler for the form field, actually do the uploads.
-   * 
-   *  Note that if you don't select a different file in the form field, no change, so no re-upload
-   *  unless you actually pick a different file (as well or instead).
-   * 
-   */
-  
-  doUpload: function()
-  {
-    if(this.upload.form.getElement('input[type=file]').files.length == 0) return;
-
-    // Notice here that propagateData is not passed into mkServerRequestURL
-    //   this is how the rest of the system works too so it can't really be changed
-    //   because mkServerRequestURL is passed into FileManager.Request normally
-    //   and the propagateData is added there.
-                      
-    var tx_cfg = this.options.mkServerRequestURL(this, 'upload', Object.merge({},
-        /*this.options.propagateData, */
-        (this.options.uploadAuthData || {}), {
-          directory: (this.CurrentDir ? this.CurrentDir.path : '/'),
-          filter: this.options.filter,
-          resize: this.options.resizeImages ? this.upload.resizer.hasClass('checkboxChecked') : false,
-          reportContentType: 'text/plain'
-        }));
-    
-    var files = this.upload.form.getElement('input[type=file]').files;
-    var fieldName = this.upload.form.getElement('input[type=file]').name;
-    var i     = 0;
-    var self = this;
-    
-    // Construct the entries in the upload list for each file
-    var fileUIs = [ ];
-    for(var i = 0; i < files.length; i++)
-    {
-      fileUIs[i] = new FileManager.UploadListEntry(files[i], self);
-            
-      // @TODO Validate client side here
-      // fileUIs[i].invalidate("Testing");
-      
-    }
-    
-    i = 0;
-    
-    // Show the upload list of files
-    this.show_our_info_sections(false);
-    this.info.adopt(this.upload.uploader.setStyle('display', 'block'));
-    this.upload.uploader.fade(1);
-    
-    // Display spinner
-    self.browserLoader.fade(1);
-    
-    // When the list becomes empty (all files uploaded) remove it and update
-    //  the selected file to the first valid one, that is, the first one that
-    //  uploaded OK.
-    var hideList = function()
-    {
-      if(self.upload.uploader.getElements('li').length)
-      {
-        hideList.delay(1000);
-      }
-      else
-      {
-        self.upload.uploader.fade(0).get('tween').chain(function() {
-          self.upload.uploader.setStyle('display', 'none');
-          self.show_our_info_sections(true);
-            
-          // Hide spinner
-          self.browserLoader.fade(0);
-          
-          // Update
-          for(var x = 0; x < fileUIs.length; x++)
-          {
-            if(fileUIs[x].valid)
-            {
-              self.load(self.CurrentDir.path, fileUIs[x].nameOnServer);
-            }
-          }
-        });            
-      }
-    };
-    hideList();
-      
-    
-    // This is where the actual upload of the files happens:
-    //  take file i,
-    //    if it's not valid, skip it
-    //    create a new request object
-    //       append the file to it
-    //       append tx_cfg.data (above) and the propagateData to it
-    //       attach a progress event to it which calls the file's UI and tells it to update
-    //       attach success/fail events to it which calls the file's UI and tells it to update
-    //    start the upload
-    //       wait asynchronously until it's done
-    //       tell the file's UI that it's done and the result
-    //         (the file's UI will remove itself from the list after a short delay)
-    //    next i
-
-    
-    var doUploadNextFile = function()
-    {
-      if(i <= files.length-1)
-      {
-        var file   = files[i];      
-        var fileUI = fileUIs[i];
-        
-        if(!fileUI.valid)
-        {
-          i++;
-          return doUploadNextFile();
-        }
-        
-        // For testing progess bar
-        if(0)
-        {
-          var p = 1;
-          (function(){
-            if(p<100)
-              fileUI.progress(p++);
-          }).periodical(500);
-          return;
-        }
-        
-        var upload = new FileManager.FileUploadRequest({
-          url: tx_cfg.url
-        });
-        
-        upload.append(fieldName, file);
-        Object.each(Object.merge(tx_cfg.data, self.options.propagateData), function(v,k) { upload.append(k,v); });
-        
-        upload.addEvent('progress', function(event, a){          
-          if(event.total && event.loaded)
-          {
-            fileUI.progress((event.loaded / event.total) * 100);
-          }
-        });
-        
-        upload.addEvent('success', function(responseText){
-          fileUI.complete({'text': responseText});
-        });
-        
-        upload.addEvent('failure', function(responseXhr){
-          fileUI.complete(responseXhr);
-        });
-        
-        upload.send();
-        
-        (function waitTillDone(){
-          if(!upload.isRunning())
-          {
-            i++;
-            doUploadNextFile();
-            
-            fileUI.progress(100);
-            fileUI.complete(upload);
-          }
-          else
-          {
-            waitTillDone.delay(500);
-          }
-        }).delay(500);
-      }
-    }
-    
-    doUploadNextFile();
-  },
-  
-  /** Change handler for the form field that does not require HTML5, or much more than form fields.
-   * 
-   *  Uses the hidden iframe.
-   * 
-   *  Note that if you don't select a different file in the form field, no change, so no re-upload
-   *  unless you actually pick a different file (as well or instead).
-   * 
-   */
-  
-  doUploadFallback: function()
-  {
-    var self = this;
-    
-    // discard old iframe, if it exists:
-    if (this.upload.dummyframe)
-    {
-      // remove from the menu (dispose) and trash it (destroy)
-      this.upload.dummyframe.dispose().destroy();
-      this.upload.dummyframe = null;
-    }
-
-    this.upload.dummyframe = (new IFrame).set({src: 'about:blank', name: 'dummyframe'}).setStyles({display: 'none'});
-    this.menu.adopt(this.upload.dummyframe);
-    
-    this.upload.dummyframe.addEvent('load', function()
-    {
-      var iframe = this;
-      self.diag.log('NoFlash upload response: ', this, ', iframe: ', self.upload.dummyframe, ', ready:', (1 * self.upload.dummyframe_active));
-
-      // make sure we don't act on premature firing of the event in MSIE browsers:
-      if (!self.upload.dummyframe_active)
-        return;
-
-      self.browserLoader.fade(0);
-
-      var response = null;
-      Function.attempt(function() {
-          response = iframe.contentDocument.documentElement.innerText;
-        },
-        function() {
-          response = iframe.contentDocument.documentElement.textContent;
-        },
-        function() {
-          response = iframe.contentWindow.document.innerText;
-        },
-        function() {
-          response = iframe.contentDocument.innerText;
-        },
-        function() {
-          // Maybe this.contentDocument.documentElement.innerText isn't where we need to look?
-          //debugger;
-          response = "{status: 0, error: \"noFlashUpload: document innerText grab FAIL: Can't find response.\"}";
-        }
-      );
-
-      var j = JSON.decode(response);
-
-      if (j && !j.status)
-      {
-        self.showError('' + j.error);
-        self.load(self.CurrentDir.path);
-      }
-      else if (j)
-      {
-        self.load(self.CurrentDir.path, j.name);
-      }
-      else
-      {
-        // IE9 fires the load event on init! :-(
-        if (self.CurrentDir)
-        {
-          self.showError('No or faulty JSON response! ' + response);
-          self.load(self.CurrentDir.path);
-        }
-      }
-
-      // Clear the file input, to do this it is remade
-      self.make_file_input(self.upload.form);
-    });
-        
-    // Notice here that propagateData is not passed into mkServerRequestURL
-    //   this is how the rest of the system works too so it can't really be changed
-    //   because mkServerRequestURL is passed into FileManager.Request normally
-    //   and the propagateData is added there.
-                      
-    var tx_cfg = this.options.mkServerRequestURL(this, 'upload', Object.merge({},
-        /*this.options.propagateData, */
-        (this.options.uploadAuthData || {}), {
-          directory: (this.CurrentDir ? this.CurrentDir.path : '/'),
-          filter: this.options.filter,
-          resize: this.options.resizeImages ? this.upload.resizer.hasClass('checkboxChecked') : false,
-          reportContentType: 'text/plain'
-        }));
-    
-    self.upload.form.action = tx_cfg.url;
-    self.upload.form.getElements('input[type=hidden]').each(function(e){e.destroy();});
-    
-    Object.each(Object.merge(tx_cfg.data, self.options.propagateData), function(v,k) { 
-      var input = new Element('input').set({type: 'hidden', name: k, value: v, id: 'filemanager_upload_' + k });
-      self.upload.form.adopt(input);    
-    });
-    
-    self.upload.dummyframe_active = true;
-    self.browserLoader.fade(0);
-    self.upload.form.submit();
-    
-  }
-  
-  
-});
-
-
-/** The UploadListEntry class handles entries in the file upload list
- * 
- *  Pass it an HTML5 file object (taken from input[type=file].files) 
- *  and the file manager to which it is being attached.
- * 
- *  During initialisation the UploadListEntry will inject an <li> into 
- *    [filemanager].upload.list
- *  which must already be created.
- * 
- * You can then call 
- *   invalidate("Reason") to invalidate the file and produce a message
- *   invalidate(false)    to invalidate the file and not produce a message
- *   progress(0 .. 100) to set the progress bar for the file
- *   complete({text: 'jsonencodedresponse'}) to complete the file with a json response
- *   complete(XMLHTTPRequest) to fail the file with some non-json failure
- */
-
-FileManager.UploadListEntry = new Class({
-
-  Implements: Events,
-  
-  initialize: function(file, fm) 
-  {
-    this.file = file;
-    this.base = fm;    
-    
-    this.valid = true;
-    this.validationError = null;
-    this.has_completed  = false;
-    
-    this.id =  String.uniqueID();
-    
-    this.addEvents({
-      start: this.onStart,
-      progress: this.onProgress,
-      stop: this.onStop,
-      complete: this.onComplete
-    });
-    
-    this.render();
-  },
-
-  /** Mark the upload as invalid/failed, display a message, highlight and remove the file.
-   * 
-   *  With no reason, no message is displayed, with a reason a message is displayed. 
-   * 
-   *  @param reason String|false
-   */
-  
-  invalidate: function(reason) 
-  {
-    this.valid = false;
-    this.validationError = reason;
-    
-    if(reason)
-    {
-      var message = this.base.language.uploader.unknown;
-      var sub = {
-        name: this.file.name,
-        size: this.formatUnit(this.file.size, 'b')
-      };
-
-      if (this.base.language.uploader[this.validationError]) {
-        message = this.base.language.uploader[this.validationError];
-      }
-      else
-      {
-        message = this.validationError;
-      }
-
-      if (this.validationError === 'sizeLimitMin')
-        sub.size_min = this.formatUnit(this.base.options.fileSizeMin, 'b');
-      else if (this.validationError === 'sizeLimitMax')
-        sub.size_max = this.formatUnit(this.base.options.fileSizeMax, 'b');
-
-      this.base.showError(message.substitute(sub, /\\?\$\{([^{}]+)\}/g));
-    }
-    
-    this.highlightAndClear();
-  },
-  
-  /** Highlight the file in the list and then remove it from the list (ie when it's finished/failed)
-   * 
-   *  Used by invalidate, and complete
-   */
-  
-  highlightAndClear: function()
-  {
-    var self = this;
-    
-    // Highlight the line
-    self.ui.element.set('tween', {duration: 1000}).highlight(null, (self.valid ? '#e6efc2' : '#f0c2c2')).get('tween').chain(function(){self.ui.element.style.backgroundColor=(self.valid ? '#e6efc2' : '#f0c2c2');});
-    
-    // Remove it after a delay
-    (function() {
-      self.ui.element.setStyle('overflow', 'hidden').morph({
-        opacity: 0,
-        height: 0
-      }).get('morph').chain(function() {
-        self.ui.element.destroy();
-      });
-    }).delay(self.valid ? 2500 : 5000, self);
-  },
-  
-  /** Format a number into a human readable size 
-   * 
-   */
-  
-  formatUnit: function(base, type, join) {
-    var unitLabels =  {
-      b: [{min: 1, unit: 'B'}, {min: 1024, unit: 'kB'}, {min: 1048576, unit: 'MB'}, {min: 1073741824, unit: 'GB'}],
-      s: [{min: 1, unit: 's'}, {min: 60, unit: 'm'}, {min: 3600, unit: 'h'}, {min: 86400, unit: 'd'}]
-    };
-    var labels = unitLabels[(type == 'bps') ? 'b' : type];
-    var append = (type == 'bps') ? '/s' : '';
-    var i, l = labels.length, value;
-
-    if (base < 1) return '0 ' + labels[0].unit + append;
-
-    if (type == 's') {
-      var units = [];
-
-      for (i = l - 1; i >= 0; i--) {
-        value = Math.floor(base / labels[i].min);
-        if (value) {
-          units.push(value + ' ' + labels[i].unit);
-          base -= value * labels[i].min;
-          if (!base) break;
-        }
-      }
-
-      return (join === false) ? units : units.join(join || ', ');
-    }
-
-    for (i = l - 1; i >= 0; i--) {
-      value = labels[i].min;
-      if (base >= value) break;
-    }
-
-    return (base / value).toFixed(1) + ' ' + labels[i].unit + append;
-  },
-  
-  /** Draw the list item 
-   *
-   */
-  
-  render: function() {
-    var self = this;
-    if (!this.valid) {
-
-      return this;
-    }
-
-    this.ui = {};
-    this.ui.icon = new Asset.image(this.base.assetBasePath+'Images/Icons/' + this.file.name.replace(/.*\./, '').toLowerCase() + '.png', {
-      'class': 'icon',
-      onerror: function() {
-        new Asset.image(self.base.assetBasePath + 'Images/Icons/default.png').replaces(this);
-      }
-    });
-    this.ui.element = new Element('li', {'class': 'file', id: 'file-' + this.id});
-    // keep filename in display box at reasonable length:
-    var laname = this.file.name;
-    if (laname.length > 36) {
-      laname = laname.substr(0, 36) + '...';
-    }
-    this.ui.title = new Element('span', {'class': 'file-title', text: laname, title: this.file.name});
-    this.ui.size = new Element('span', {'class': 'file-size', text: this.formatUnit(this.file.size, 'b')});
-
-    this.ui.cancel = new Asset.image(this.base.assetBasePath+'Images/cancel.png', {'class': 'file-cancel', title: this.base.language.cancel}).addEvent('click', function() {
-      self.invalidate(false); // No reason
-      self.base.tips.hide();
-      self.base.tips.detach(this);
-    });
-    this.base.tips.attach(this.ui.cancel);
-
-    var progress = new Element('img', {'class': 'file-progress', src: this.base.assetBasePath+'Images/bar.gif'});
-
-
-    this.ui.element.adopt(
-      this.ui.cancel,
-      progress,
-      this.ui.icon,
-      this.ui.title,
-      this.ui.size
-    ).inject(this.base.upload.list).highlight();
-
-    this.ui.progress = progress;
-    
-    // Initialise the progress position to zero     
-    this.ui.progress.setStyle('background-position-x', Math.floor(100-((0/100)*20+40))+'%');
-  },
-
-  /** Update the progress bar of the list item.
-   * 
-   *  @param integer 0 to 100 percent
-   */
-  
-  progress: function(percentLoaded){
-    if(this.has_completed) return;
-    
-    this.ui.element.addClass('file-running');
-    
-    // Setting the backhround to between 60% for empty and 40% for full works
-    //   so that is a range of 20, an offset of 40, flipped backwards (100-N)    
-    this.ui.progress.setStyle('background-position-x', (100-((percentLoaded/100)*20+40))+'%');
-  },
-  
-  /** Mark the file as completed, and then remove from the list.
-   * 
-   *  @param object {text: 'jsonencodedresponse'}
-   */
-  
-  complete: function(response)
-  {
-    var self = this;
-    
-    if(this.has_completed) return;
-                               
-    this.response = response;
-    
-    var jsonresponse = null;
-
-    this.has_completed = true;
-    this.ui.cancel = this.ui.cancel.destroy();
-
-    try
-    {
-      jsonresponse = JSON.decode(response.text);
-    }
-    catch(e)
-    {
-      this.base.diag.log(response);
-    }
-
-    if (typeof jsonresponse === 'undefined' || jsonresponse == null)
-    {
-      if (response == null || !response.text)
-      {
-        // The 'mod_security' has shown to be one of the most unhelpful error messages ever; particularly when it happened on a lot on boxes which had a guaranteed utter lack of mod_security and friends.
-        // So we restrict this report to the highly improbable case where we get to receive /nothing/ /at/ /all/.
-        this.invalidate(this.base.language.uploader.mod_security);
-      }
-      else
-      {
-        this.invalidate(("Server response:\n" + this.response.text).substitute(this.base.language, /\\?\$\{([^{}]+)\}/g));
-      }
-    }
-    else if (!jsonresponse.status)
-    {
-      this.invalidate(('' + jsonresponse.error).substitute(this.base.language, /\\?\$\{([^{}]+)\}/g));
-    }
-    else
-    {
-      this.valid = true;
-      this.nameOnServer = jsonresponse.name;
-    }
-
-    this.highlightAndClear();
-  }
-
-});
-
-
-/** This class is used to handle the file uploads themselves (XMLHTTPRequest)
- * 
- * It does extend Request, but you should't expect everything to work, it is
- * not really general purpose.
- * 
- * Taken originally from https://gist.github.com/mloberg/1342473 and messed 
- *  about a bit.
- *
- * Important differences to Request
- * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- * use append() to insert your form data (key and value, which might be a file)
- * add a progress event listener to get progress of the UPLOAD not the DOWNLOAD
- * send does not accept options, pass them to the constructor only
- *   (namely {url: '....'} )
- * I don't know if POST() or GET() etc aliases will work, just use send()
- * 
- */
-
-FileManager.FileUploadRequest = new Class({
-
-  Extends: Request,
-  
-  options: {
-    emulation: false,
-    urlEncoded: false
-  },
-  
-  initialize: function(options){
-    this.xhr = new Browser.Request();
-    this.formData = new FormData();
-    this.setOptions(options);
-    this.headers = this.options.headers;
-  },
-  
-  /** Append "something" to the request.
-   *   
-   *  In Our case that something is either a field name and value 
-   *   ( you don't seem to need to encode it yourself)
-   *  or field name and a file taken from an (input[type=file]).files list
-   * 
-   *  It's kinda nice how it "just works", and also kinda worrying.
-   */
-  
-  append: function(key, value){
-    this.formData.append(key, value);
-    return this.formData;
-  },
-  
-  reset: function(){
-    this.formData = new FormData();
-  },
-  
-  send: function(){
-    var url = this.options.url;
-    
-    this.options.isSuccess = this.options.isSuccess || this.isSuccess;
-    this.running = true;
-    
-    var xhr = this.xhr;
-    xhr.open('POST', url, true);
-    xhr.onreadystatechange = this.onStateChange.bind(this);
-    
-    if (('onprogress' in xhr))
-    {
-      xhr.onloadstart = this.loadstart.bind(this);
-      
-      // By attaching to xhr.upload we get progress of that, 
-      // rather than the unknowable response progress
-      xhr.upload.onprogress = this.progress.bind(this);
-    }
-    
-    Object.each(this.headers, function(value, key){
-      try{
-        xhr.setRequestHeader(key, value);
-      }catch(e){
-        this.fireEvent('exception', [key, value]);
-      }
-    }, this);
-    
-
-    
-    this.fireEvent('request');
-    xhr.send(this.formData);
-    
-    if(!this.options.async) this.onStateChange();
-    if(this.options.timeout) this.timer = this.timeout.delay(this.options.timeout, this);
-    return this;
-  }
-
-});
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/MootoolsFileManager/mootools-filemanager/Source/Uploader.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/MootoolsFileManager/mootools-filemanager/Source/Uploader.js
deleted file mode 100644
index 1c83803..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/MootoolsFileManager/mootools-filemanager/Source/Uploader.js
+++ /dev/null
@@ -1,423 +0,0 @@
-/*
----
-
-description: Implements Upload functionality into the FileManager based on [FancyUpload](http://digitarald.de)
-
-authors: Christoph Pojer (@cpojer)
-
-license: MIT-style license.
-
-requires: [Core/*]
-
-provides: Filemanager.Uploader
-
-...
-*/
-
-FileManager.implement({
-
-	options: {
-		resizeImages: true,
-		upload: true,
-		uploadAuthData: {},            // deprecated; use FileManager.propagateData instead!
-		uploadTimeLimit: 260,
-		uploadFileSizeMax: 2600 * 2600 * 25
-	},
-
-	hooks: {
-		show: {
-			upload: function() {
-				this.startUpload();
-			}
-		},
-
-		cleanup: {
-			upload: function() {
-				if (!this.options.upload || !this.upload) return;
-
-				if (this.upload.uploader) {
-					this.upload.uploader.fade(0).get('tween').chain(function() {
-						this.element.dispose();
-					});
-				}
-			}
-		}
-	},
-
-	onDialogOpenWhenUpload: function() {
-		if (this.swf && this.swf.box) this.swf.box.setStyle('visibility', 'hidden');
-	},
-
-	onDialogCloseWhenUpload: function() {
-		if (this.swf && this.swf.box) this.swf.box.setStyle('visibility', 'visible');
-	},
-
-	startUpload: function() {
-
-		if (!this.options.upload || this.swf) return;
-
-		var self = this;
-		this.upload = {
-			button: this.addMenuButton('upload').inject(this.menu, 'bottom').addEvents({
-				click: function() {
-					return false;
-				},
-				mouseenter: function() {
-					this.addClass('hover');
-				},
-				mouseleave: function() {
-					this.removeClass('hover');
-					this.blur();
-				},
-				mousedown: function() {
-					this.focus();
-				}
-			}),
-			list: new Element('ul', {'class': 'filemanager-uploader-list'}),
-			uploader: new Element('div', {opacity: 0, 'class': 'filemanager-uploader-area'}).adopt(
-				new Element('h2', {text: this.language.upload}),
-				new Element('div', {'class': 'filemanager-uploader'})
-			),
-			lastFileUploaded: null,  // name of the last successfully uploaded file; will be preselected in the list view
-			error_count: 0
-		};
-		this.upload.uploader.getElement('div').adopt(this.upload.list);
-
-		if (this.options.resizeImages) {
-			var resizer = new Element('div', {'class': 'checkbox'});
-			var check = (function() {
-					this.toggleClass('checkboxChecked');
-				}).bind(resizer);
-			check();
-			this.upload.label = new Element('label').adopt(
-				resizer,
-				new Element('span', {text: this.language.resizeImages})
-			).addEvent('click', check).inject(this.menu);
-		}
-
-		var File = new Class({
-
-			Extends: Swiff.Uploader.File,
-
-			initialize: function(base, data) {
-
-				this.parent(base, data);
-				this.has_completed = false;
-
-				var tx_cfg = self.options.mkServerRequestURL(self, 'upload', {
-								directory: self.CurrentDir.path,
-								filter: self.options.filter,
-								resize: (self.options.resizeImages && resizer.hasClass('checkboxChecked')) ? 1 : 0
-							});
-
-				self.diag.log('Uploader: setOptions', tx_cfg);
-
-				this.setOptions(tx_cfg);
-			},
-
-			render: function() {
-				if (this.invalid) {
-					var message = self.language.uploader.unknown;
-					var sub = {
-						name: this.name,
-						size: Swiff.Uploader.formatUnit(this.size, 'b')
-					};
-
-					if (self.language.uploader[this.validationError]) {
-						message = self.language.uploader[this.validationError];
-					}
-
-					if (this.validationError === 'sizeLimitMin')
-						sub.size_min = Swiff.Uploader.formatUnit(this.base.options.fileSizeMin, 'b');
-					else if (this.validationError === 'sizeLimitMax')
-						sub.size_max = Swiff.Uploader.formatUnit(this.base.options.fileSizeMax, 'b');
-
-					self.showError(message.substitute(sub, /\\?\$\{([^{}]+)\}/g));
-					return this;
-				}
-
-				this.addEvents({
-					open: this.onOpen,
-					remove: this.onRemove,
-					requeue: this.onRequeue,
-					progress: this.onProgress,
-					stop: this.onStop,
-					complete: this.onComplete
-				});
-
-				this.ui = {};
-				this.ui.icon = new Asset.image(self.assetBasePath+'Images/Icons/' + this.extension + '.png', {
-					'class': 'icon',
-					onerror: function() {
-						new Asset.image(self.assetBasePath + 'Images/Icons/default.png').replaces(this);
-					}
-				});
-				this.ui.element = new Element('li', {'class': 'file', id: 'file-' + this.id});
-				// keep filename in display box at reasonable length:
-				var laname = this.name;
-				if (laname.length > 36) {
-					laname = laname.substr(0, 36) + '...';
-				}
-				this.ui.title = new Element('span', {'class': 'file-title', text: laname, title: this.name});
-				this.ui.size = new Element('span', {'class': 'file-size', text: Swiff.Uploader.formatUnit(this.size, 'b')});
-
-				var file = this;
-				this.ui.cancel = new Asset.image(self.assetBasePath+'Images/cancel.png', {'class': 'file-cancel', title: self.language.cancel}).addEvent('click', function() {
-					file.remove();
-					self.tips.hide();
-					self.tips.detach(this);
-				});
-				self.tips.attach(this.ui.cancel);
-
-				var progress = new Element('img', {'class': 'file-progress', src: self.assetBasePath+'Images/bar.gif'});
-
-				this.ui.element.adopt(
-					this.ui.cancel,
-					progress,
-					this.ui.icon,
-					this.ui.title,
-					this.ui.size
-				).inject(self.upload.list).highlight();
-
-				this.ui.progress = new Fx.ProgressBar(progress).set(0);
-
-				this.base.reposition();
-
-				return this.parent();
-			},
-
-			onOpen: function() {
-				this.ui.element.addClass('file-running');
-			},
-
-			onRemove: function() {
-				this.ui = this.ui.element.destroy();
-
-				// when all items in the list have been cancelled/removed, and the transmission of the files is done, i.e. after the onComplete has fired, destroy the list!
-				var cnt = self.upload.list.getElements('li').length;
-				if (cnt == 0 && this.has_completed)
-				{
-					self.upload.uploader.fade(0).get('tween').chain(function() {
-						self.upload.uploader.setStyle('display', 'none');
-					});
-				}
-			},
-
-			onProgress: function() {
-				this.ui.progress.start(this.progress.percentLoaded);
-			},
-
-			onStop: function() {
-				this.remove();
-			},
-
-			onComplete: function(file_obj)
-			{
-				self.diag.log('File-onComplete', arguments, ', fileList: ', self.swf.fileList);
-
-				var response = null;
-				var failure = true;
-
-				this.has_completed = true;
-
-				this.ui.progress = this.ui.progress.cancel().element.destroy();
-				this.ui.cancel = this.ui.cancel.destroy();
-
-				try
-				{
-					response = JSON.decode(this.response.text);
-				}
-				catch(e)
-				{
-					self.diag.log(this.response);
-				}
-
-				if (typeof response === 'undefined' || response == null)
-				{
-					if (this.response == null || !this.response.text)
-					{
-						// The 'mod_security' has shown to be one of the most unhelpful error messages ever; particularly when it happened on a lot on boxes which had a guaranteed utter lack of mod_security and friends.
-						// So we restrict this report to the highly improbable case where we get to receive /nothing/ /at/ /all/.
-						self.showError(self.language.uploader.mod_security);
-					}
-					else
-					{
-						self.showError(("Server response:\n" + this.response.text).substitute(self.language, /\\?\$\{([^{}]+)\}/g));
-					}
-				}
-				else if (!response.status)
-				{
-					self.showError(('' + response.error).substitute(self.language, /\\?\$\{([^{}]+)\}/g));
-				}
-				else
-				{
-					failure = false;
-				}
-
-				this.ui.element.set('tween', {duration: 2000}).highlight(!failure ? '#e6efc2' : '#f0c2c2');
-				(function() {
-					this.ui.element.setStyle('overflow', 'hidden').morph({
-						opacity: 0,
-						height: 0
-					}).get('morph').chain(function() {
-						this.element.destroy();
-						var cnt = self.upload.list.getElements('li').length;
-						if (cnt == 0)
-						{
-							self.upload.uploader.fade(0).get('tween').chain(function() {
-								self.upload.uploader.setStyle('display', 'none');
-							});
-						}
-					});
-				}).delay(!failure ? 1000 : 5000, this);
-
-				if (failure)
-				{
-					self.upload.error_count++;
-				}
-
-				// don't wait for the cute delays to start updating the directory view!
-				var cnt = self.upload.list.getElements('li').length;
-				var fcnt = self.swf.fileList.length;
-				self.diag.log('upload:onComplete for FILE', file_obj, cnt, fcnt);
-			}
-		});
-
-		this.getFileTypes = function() {
-			var fileTypes = {};
-			if (this.options.filter == 'image')
-				fileTypes = {'Images (*.jpg, *.gif, *.png)': '*.jpg; *.jpeg; *.bmp; *.gif; *.png'};
-			if (this.options.filter == 'video')
-				fileTypes = {'Videos (*.avi, *.flv, *.mov, *.mpeg, *.mpg, *.wmv, *.mp4)': '*.avi; *.flv; *.fli; *.movie; *.mpe; *.qt; *.viv; *.mkv; *.vivo; *.mov; *.mpeg; *.mpg; *.wmv; *.mp4'};
-			if (this.options.filter == 'audio')
-				fileTypes = {'Audio (*.aif, *.mid, *.mp3, *.mpga, *.rm, *.wav)': '*.aif; *.aifc; *.aiff; *.aif; *.au; *.mka; *.kar; *.mid; *.midi; *.mp2; *.mp3; *.mpga; *.ra; *.ram; *.rm; *.rpm; *.snd; *.wav; *.tsi'};
-			if (this.options.filter == 'text')
-				fileTypes = {'Text (*.txt, *.rtf, *.rtx, *.html, *.htm, *.css, *.as, *.xml, *.tpl)': '*.txt; *.rtf; *.rtx; *.html; *.htm; *.css; *.as; *.xml; *.tpl'};
-			if (this.options.filter == 'application')
-				fileTypes = {'Application (*.bin, *.doc, *.exe, *.iso, *.js, *.odt, *.pdf, *.php, *.ppt, *.swf, *.rar, *.zip)': '*.ai; *.bin; *.ccad; *.class; *.cpt; *.dir; *.dms; *.drw; *.doc; *.dvi; *.dwg; *.eps; *.exe; *.gtar; *.gz; *.js; *.latex; *.lnk; *.lnk; *.oda; *.odt; *.ods; *.odp; *.odg; *.odc; *.odf; *.odb; *.odi; *.odm; *.ott; *.ots; *.otp; *.otg; *.pdf; *.php; *.pot; *.pps; *.ppt; *.ppz; *.pre; *.ps; *.rar; *.set; *.sh; *.skd; *.skm; *.smi; *.smil; *.spl; *.src; *.stl; *.swf; *.tar; *.tex; *.texi; *.texinfo; *.tsp; *.unv; *.vcd; *.vda; *.xlc; *.xll; *.xlm; *.xls; *.xlw; *.zip'};
-
-			return fileTypes;
-		};
-
-		this.diag.log('Uploader: SWF init');
-		this.swf = new Swiff.Uploader({
-			id: 'SwiffFileManagerUpload',
-			path: this.assetBasePath + 'Swiff.Uploader.swf',
-			queued: false,
-			target: this.upload.button,
-			allowDuplicates: true,
-			instantStart: true,
-			appendCookieData: true, // pass along any session cookie data, etc. in the request section (PHP: $_GET[])
-			verbose: this.options.verbose,
-			data: Object.merge({},
-				self.options.propagateData,
-				(self.options.uploadAuthData || {})
-			),
-			fileClass: File,
-			timeLimit: self.options.uploadTimeLimit,
-			fileSizeMax: self.options.uploadFileSizeMax,
-			typeFilter: this.getFileTypes(),
-			zIndex: this.options.zIndex + 3000,
-			onSelectSuccess: function() {
-				self.diag.log('FlashUploader: onSelectSuccess', arguments, ', fileList: ', self.swf.fileList);
-				//self.fillInfo();
-				self.show_our_info_sections(false);
-				//self.info.getElement('h2.filemanager-headline').setStyle('display', 'none');
-				self.info.adopt(self.upload.uploader.setStyle('display', 'block'));
-				self.upload.uploader.fade(1);
-			},
-			onComplete: function(info) {
-				this.diag.log('FlashUploader: onComplete', arguments, ', fileList: ', self.swf.fileList);
-
-				// don't wait for the cute delays to start updating the directory view!
-				var cnt = this.upload.list.getElements('li').length;
-				var fcnt = this.swf.fileList.length;
-				this.diag.log('upload:onComplete', info, cnt, fcnt);
-				// add a 5 second delay when there were upload errors:
-				(function() {
-					this.load(this.CurrentDir.path, this.upload.lastFileUploaded);
-					// this.fillInfo();
-				}).bind(this).delay(this.upload.error_count > 0 ? 5500 : 1);
-			}.bind(this),
-			onFileComplete: function(f) {
-				self.diag.log('FlashUploader: onFileComplete', arguments, ', fileList: ', self.swf.fileList);
-				self.upload.lastFileUploaded = f.name.replace(/\s+/g, '_').replace(/_{2,}/g, '_');
-			},
-			onFail: function(error) {
-				self.diag.log('FlashUploader: onFail', arguments, ', swf: ', self.swf, ', fileList: ', (typeof self.swf !== 'undefined' ? self.swf : '---'));
-				if (error !== 'empty') {
-					$$(self.upload.button, self.upload.label).dispose();
-					self.showError(self.language.flash[error] || self.language.flash.flash);
-				}
-			},
-
-			onLoad: function() {
-				self.diag.log('FlashUploader: onLoad', arguments, ', fileList: ', self.swf.fileList);
-			},
-			onStart: function() {
-				self.diag.log('FlashUploader: onStart', arguments, ', fileList: ', self.swf.fileList);
-			},
-			onQueue: function() {
-				self.diag.log('FlashUploader: onQueue', arguments, ', fileList: ', self.swf.fileList);
-			},
-			onBrowse: function() {
-				self.diag.log('FlashUploader: onBrowse', arguments, ', fileList: ', self.swf.fileList);
-			},
-			onDisabledBrowse: function() {
-				self.diag.log('FlashUploader: onDisabledBrowse', arguments, ', fileList: ', self.swf.fileList);
-			},
-			onCancel: function() {
-				self.diag.log('FlashUploader: onCancel', arguments, ', fileList: ', self.swf.fileList);
-			},
-			onSelect: function() {
-				self.diag.log('FlashUploader: onSelect', arguments, ', fileList: ', self.swf.fileList);
-			},
-			onSelectFail: function() {
-				self.diag.log('FlashUploader: onSelectFail', arguments, ', fileList: ', self.swf.fileList);
-			},
-
-			onButtonEnter: function() {
-				self.diag.log('FlashUploader: onButtonEnter', arguments, ', fileList: ', self.swf.fileList);
-			},
-			onButtonLeave: function() {
-				self.diag.log('FlashUploader: onButtonLeave', arguments, ', fileList: ', self.swf.fileList);
-			},
-			onButtonDown: function() {
-				self.diag.log('FlashUploader: onButtonDown', arguments, ', fileList: ', self.swf.fileList);
-			},
-			onButtonDisable: function() {
-				self.diag.log('FlashUploader: onButtonDisable', arguments, ', fileList: ', self.swf.fileList);
-			},
-
-			onFileStart: function() {
-				self.diag.log('FlashUploader: onFileStart', arguments, ', fileList: ', self.swf.fileList);
-			},
-			onFileStop: function() {
-				self.diag.log('FlashUploader: onFileStop', arguments, ', fileList: ', self.swf.fileList);
-			},
-			onFileRequeue: function() {
-				self.diag.log('FlashUploader: onFileRequeue', arguments, ', fileList: ', self.swf.fileList);
-			},
-			onFileOpen: function() {
-				self.diag.log('FlashUploader: onFileOpen', arguments, ', fileList: ', self.swf.fileList);
-			},
-			onFileProgress: function() {
-				self.diag.log('FlashUploader: onFileProgress', arguments, ', fileList: ', self.swf.fileList);
-			},
-			onFileRemove: function() {
-				self.diag.log('FlashUploader: onFileRemove', arguments, ', fileList: ', self.swf.fileList);
-			},
-
-			onBeforeStart: function() {
-				self.diag.log('FlashUploader: onBeforeStart', arguments, ', fileList: ', self.swf.fileList);
-			},
-			onBeforeStop: function() {
-				self.diag.log('FlashUploader: onBeforeStop', arguments, ', fileList: ', self.swf.fileList);
-			},
-			onBeforeRemove: function() {
-				self.diag.log('FlashUploader: onBeforeRemove', arguments, ', fileList: ', self.swf.fileList);
-			}
-		});
-	}
-});
-
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/MootoolsFileManager/mootools-filemanager/Source/Uploader/Fx.ProgressBar.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/MootoolsFileManager/mootools-filemanager/Source/Uploader/Fx.ProgressBar.js
deleted file mode 100644
index dd508ff..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/MootoolsFileManager/mootools-filemanager/Source/Uploader/Fx.ProgressBar.js
+++ /dev/null
@@ -1,78 +0,0 @@
-/*
----
-name: Fx.ProgressBar
-
-description: Fx.ProgressBar
-
-requires: [Core/Fx.Transitions, Core/Fx, Core/Class]
-
-provides: [Fx.ProgressBar]
-
-version: 1.1
-
-license: MIT License
-
-author: Harald Kirschner <http://digitarald.de>
-...
-*/
-
-Fx.ProgressBar = new Class({
-
-  Extends: Fx,
-
-  options: {
-    text: null,
-    url: null,
-    transition: Fx.Transitions.Circ.easeOut,
-    fit: true,
-    link: 'cancel'
-  },
-
-  initialize: function(element, options) {
-    this.element = document.id(element);
-    this.parent(options);
-
-    var url = this.options.url;
-    if (url) {
-      this.element.setStyles({
-        'background-image': 'url(' + url + ')',
-        'background-repeat': 'no-repeat'
-      });
-    }
-
-    if (this.options.fit) {
-      url = url || this.element.getStyle('background-image').replace(/^url\(["']?|["']?\)$/g, '');
-      if (url) {
-        var fill = new Image();
-        fill.onload = function() {
-          this.fill = fill.width;
-          fill = fill.onload = null;
-          this.set(this.now || 0);
-        }.bind(this);
-        fill.src = url;
-        if (!this.fill && fill.width) fill.onload();
-      }
-    } else {
-      this.set(0);
-    }
-  },
-
-  start: function(to, total) {
-    return this.parent(this.now, (arguments.length == 1 || !total) ? to.limit(0, 100) : to / total * 100);
-  },
-
-  set: function(to) {
-    this.now = to;
-    var css = (this.fill)
-      ? (((this.fill / -2) + (to / 100) * (this.element.width || 1) || 0).round() + 'px')
-      : ((100 - to) + '%');
-
-    this.element.setStyle('backgroundPosition', css + ' 0px').title = Math.round(to) + '%';
-
-    var text = document.id(this.options.text);
-    if (text) text.set('text', Math.round(to) + '%');
-
-    return this;
-  }
-
-});
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/MootoolsFileManager/mootools-filemanager/Source/Uploader/Swiff.Uploader.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/MootoolsFileManager/mootools-filemanager/Source/Uploader/Swiff.Uploader.js
deleted file mode 100644
index 9969929..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/MootoolsFileManager/mootools-filemanager/Source/Uploader/Swiff.Uploader.js
+++ /dev/null
@@ -1,508 +0,0 @@
-/*
----
-name: Swiff.Uploader
-
-description: Swiff.Uploader - Flash FileReference Control
-
-requires: [Core/Swiff, Core/Fx, Core/Class, Core/Class.Extras, Core/Browser, Core/Element]
-
-provides: [Swiff.Uploader, Swiff.Uploader.File]
-
-version: 3.0
-
-license: MIT License
-
-author: Harald Kirschner <http://digitarald.de>
-author: Valerio Proietti, <http://mad4milk.net>
-...
-*/
-
-Swiff.Uploader = new Class({
-
-  Extends: Swiff,
-
-  Implements: Events,
-
-  options: {
-    path: 'Swiff.Uploader.swf',
-
-    target: null,
-    zIndex: 9999,
-
-    callBacks: null,
-    params: {
-      wMode: 'opaque',
-      menu: 'false',
-      allowScriptAccess: 'always'
-    },
-
-    typeFilter: null,
-    multiple: true,
-    queued: true,
-    verbose: false,
-    height: 30,
-    width: 100,
-    passStatus: null,
-
-    url: null,
-    method: null,
-    data: null,
-    mergeData: true,
-    fieldName: null,
-
-    fileSizeMin: 1,
-    fileSizeMax: null, // Official limit is 100 MB for FileReference, but I tested up to 2Gb!
-    allowDuplicates: false,
-    timeLimit: (Browser.Platform.linux) ? 0 : 30,
-
-    policyFile: null,
-    buttonImage: null,
-
-    fileListMax: 0,
-    fileListSizeMax: 0,
-
-    instantStart: false,
-    appendCookieData: false,
-
-    fileClass: null
-    /*
-    onLoad: function(){},
-    onFail: function(){},
-    onStart: function(){},
-    onQueue: function(){},
-    onComplete: function(){},
-    onBrowse: function(){},
-    onDisabledBrowse: function(){},
-    onCancel: function(){},
-    onSelect: function(){},
-    onSelectSuccess: function(){},
-    onSelectFail: function(){},
-
-    onButtonEnter: function(){},
-    onButtonLeave: function(){},
-    onButtonDown: function(){},
-    onButtonDisable: function(){},
-
-    onFileStart: function(){},
-    onFileStop: function(){},
-    onFileRequeue: function(){},
-    onFileOpen: function(){},
-    onFileProgress: function(){},
-    onFileComplete: function(){},
-    onFileRemove: function(){},
-
-    onBeforeStart: function(){},
-    onBeforeStop: function(){},
-    onBeforeRemove: function(){}
-    */
-  },
-
-  initialize: function(options) {
-    // protected events to control the class, added
-    // before setting options (which adds own events)
-    this.addEvent('load', this.initializeSwiff, true)
-      .addEvent('select', this.processFiles, true)
-      .addEvent('complete', this.update, true)
-      .addEvent('fileRemove', function(file) {
-        this.fileList.erase(file);
-      }.bind(this), true);
-
-    this.setOptions(options);
-
-    // callbacks are no longer in the options, every callback
-    // is fired as event, this is just compat
-    if (this.options.callBacks) {
-      Object.each(this.options.callBacks, function(fn, name) {
-        this.addEvent(name, fn);
-      }, this);
-    }
-
-    this.options.callBacks = {
-      fireCallback: this.fireCallback.bind(this)
-    };
-
-    var path = this.options.path;
-    if (!path.contains('?')) path += '?noCache=' + Date.now(); // cache in IE
-
-    // container options for Swiff class
-    this.options.container = this.box = new Element('span', {'class': 'swiff-uploader-box',events: { click: function(e) { e.stopPropagation(); } }}).inject(document.id(this.options.container) || document.body);
-
-    // target
-    this.target = document.id(this.options.target);
-    if(this.target) {
-      var scroll = window.getScroll();
-      this.box.setStyles({
-        position: 'absolute',
-        visibility: 'visible',
-        zIndex: this.options.zIndex,
-        overflow: 'hidden',
-        height: 1, width: 1,
-        top: scroll.y, left: scroll.x
-      });
-
-      // we force wMode to transparent for the overlay effect
-      this.parent(path, {
-        params: {
-          wMode: 'transparent'
-        },
-        height: '100%',
-        width: '100%'
-      });
-
-      this.target.addEvent('mouseenter', this.reposition.bind(this));
-
-      // button interactions, relayed to to the target
-      this.addEvents({
-        buttonEnter: this.targetRelay.pass('mouseenter',this),
-        buttonLeave: this.targetRelay.pass('mouseleave',this),
-        buttonDown: this.targetRelay.pass('mousedown',this),
-        buttonDisable: this.targetRelay.pass('disable',this)
-      });
-
-      this.reposition();
-      window.addEvent('resize', this.reposition.bind(this));
-    } else {
-      this.parent(path);
-    }
-
-    this.inject(this.box);
-
-    this.fileList = [];
-
-    this.size = this.uploading = this.bytesLoaded = this.percentLoaded = 0;
-
-    if (Browser.Plugins.Flash.version < 9) {
-      this.fireEvent('fail', ['flash']);
-    } else {
-      this.verifyLoad.delay(1000, this);
-    }
-  },
-
-  verifyLoad: function() {
-    if (this.loaded) return;
-    if (!this.object.parentNode) {
-      this.fireEvent('fail', ['disabled']);
-    } else if (this.object.style.display == 'none') {
-      this.fireEvent('fail', ['hidden']);
-    } else if (!this.object.offsetWidth) {
-      this.fireEvent('fail', ['empty']);
-    }
-  },
-
-  fireCallback: function(name, args) {
-    // file* callbacks are relayed to the specific file
-    if (name.substr(0, 4) == 'file') {
-      // updated queue data is the second argument
-      if (args.length > 1) this.update(args[1]);
-      var data = args[0];
-
-      var file = this.findFile(data.id);
-      this.fireEvent(name, file || data, 5);
-      if (file) {
-        var fire = name.replace(/^file([A-Z])/, function($0, $1) {
-          return $1.toLowerCase();
-        });
-        file.update(data).fireEvent(fire, [data], 10);
-      }
-    } else {
-      this.fireEvent(name, args, 5);
-    }
-  },
-
-  update: function(data) {
-    // the data is saved right to the instance
-    Object.append(this, data);
-    this.fireEvent('queue', [this], 10);
-    return this;
-  },
-
-  findFile: function(id) {
-    for (var i = 0; i < this.fileList.length; i++) {
-      if (this.fileList[i].id == id) return this.fileList[i];
-    }
-    return null;
-  },
-
-  initializeSwiff: function() {
-    this.appendCookieData();          // looks like there's a bit of trouble with xSetOptions, so we circumvent it by passing it all in one go through xInitialize
-	// if (typeof console !== 'undefined' && console.log) console.log('initializeSwiff: data count = ' + this.options.data.length + ' : ' + this.options.data);
-
-    // extracted options for the swf
-    this.remote('xInitialize', {
-      typeFilter: this.options.typeFilter,
-      multiple: this.options.multiple,
-      queued: this.options.queued,
-      verbose: this.options.verbose,
-      width: this.options.width,
-      height: this.options.height,
-      passStatus: this.options.passStatus,
-      url: this.options.url,
-      method: this.options.method,
-      data: this.options.data,
-      mergeData: this.options.mergeData,
-      fieldName: this.options.fieldName,
-      fileSizeMin: this.options.fileSizeMin,
-      fileSizeMax: this.options.fileSizeMax,
-      allowDuplicates: this.options.allowDuplicates,
-      timeLimit: this.options.timeLimit,
-      policyFile: this.options.policyFile,
-      buttonImage: this.options.buttonImage
-    });
-
-    this.loaded = true;
-  },
-
-  targetRelay: function(name) {
-    if (this.target) this.target.fireEvent(name);
-  },
-
-  reposition: function(coords) {
-    // update coordinates, manual or automatically
-    coords = coords || (this.target && this.target.offsetHeight) ? this.target.getCoordinates(this.box.getOffsetParent()) : {top: window.getScrollTop(), left: 0, width: 40, height: 40};
-    this.box.setStyles(coords);
-    this.fireEvent('reposition', [coords, this.box, this.target]);
-  },
-
-  setOptions: function(options) {
-	// if (typeof console !== 'undefined' && console.log) console.log('Swiff.Uploader: BASE::setOptions');
-    if (options) {
-      if (options.url) options.url = Swiff.Uploader.qualifyPath(options.url);
-      if (options.buttonImage) options.buttonImage = Swiff.Uploader.qualifyPath(options.buttonImage);
-      this.parent(options);
-      if (this.loaded) {
-		this.remote('xSetOptions', options);
-    }
-    }
-    return this;
-  },
-
-  setEnabled: function(status) {
-    this.remote('xSetEnabled', status);
-  },
-
-  start: function() {
-    this.fireEvent('beforeStart');
-    this.remote('xStart');
-  },
-
-  stop: function() {
-    this.fireEvent('beforeStop');
-    this.remote('xStop');
-  },
-
-  remove: function() {
-    this.fireEvent('beforeRemove');
-    this.remote('xRemove');
-  },
-
-  fileStart: function(file) {
-    this.remote('xFileStart', file.id);
-  },
-
-  fileStop: function(file) {
-    this.remote('xFileStop', file.id);
-  },
-
-  fileRemove: function(file) {
-    this.remote('xFileRemove', file.id);
-  },
-
-  fileRequeue: function(file) {
-    this.remote('xFileRequeue', file.id);
-  },
-
-  appendCookieData: function() {
-    var append = this.options.appendCookieData;
-	// if (typeof console !== 'undefined' && console.log) console.log('appendCookieData: ' + (1 * append) + ' / ' + append);
-    if (!append) return;
-
-    var hash = {};
-    //if (typeof console !== 'undefined' && console.log) console.log('appendCookieData: ENTIRE cookie: "' + document.cookie + '"');
-    document.cookie.split(/;\s*/).each(function(cookie) {
-      cookie = cookie.split('=');
-      //if (typeof console !== 'undefined' && console.log) console.log('appendCookieData: cookie: "' + cookie[0] + '"(' + cookie.length + ') = "' + (cookie.length > 1 ? cookie[1] : '???') + '"');
-      if (cookie.length == 2) {
-        //hash['\"' + decodeURIComponent(cookie[0]) + '\"'] = decodeURIComponent(cookie[1]);    // allow session IDs such as the ASP.NET ones, which come with a dot, etc.
-        hash[decodeURIComponent(cookie[0])] = decodeURIComponent(cookie[1]);
-      }
-    });
-
-    var data = this.options.data || {};
-    if (typeOf(append) == 'string') {
-      data[append] = hash;
-  } else {
-    Object.append(data, hash);
-  }
-    this.setOptions({data: data});
-  },
-
-  processFiles: function(successraw, failraw, queue) {
-    var cls = this.options.fileClass || Swiff.Uploader.File;
-
-    var fail = [], success = [];
-
-    if (successraw) {
-      successraw.each(function(data) {
-        var ret = new cls(this, data);
-        if (!ret.validate()) {
-          ret.remove.delay(10, ret);
-          fail.push(ret);
-        } else {
-          this.size += data.size;
-          this.fileList.push(ret);
-          success.push(ret);
-          ret.render();
-        }
-      }, this);
-
-      this.fireEvent('selectSuccess', [success], 10);
-    }
-
-    if (failraw || fail.length) {
-      fail.append((failraw) ? failraw.map(function(data) {
-        return new cls(this, data);
-      }, this) : []).each(function(file) {
-        file.invalidate().render();
-      });
-
-      this.fireEvent('selectFail', [fail], 10);
-    }
-
-    this.update(queue);
-
-    if (this.options.instantStart && success.length) this.start();
-  }
-
-});
-
-Object.append(Swiff.Uploader, {
-
-  STATUS_QUEUED: 0,
-  STATUS_RUNNING: 1,
-  STATUS_ERROR: 2,
-  STATUS_COMPLETE: 3,
-  STATUS_STOPPED: 4,
-
-  log: function() {
-    if (window.console && console.info) console.info.apply(console, arguments);
-  },
-
-  unitLabels: {
-    b: [{min: 1, unit: 'B'}, {min: 1024, unit: 'kB'}, {min: 1048576, unit: 'MB'}, {min: 1073741824, unit: 'GB'}],
-    s: [{min: 1, unit: 's'}, {min: 60, unit: 'm'}, {min: 3600, unit: 'h'}, {min: 86400, unit: 'd'}]
-  },
-
-  formatUnit: function(base, type, join) {
-    var labels = Swiff.Uploader.unitLabels[(type == 'bps') ? 'b' : type];
-    var append = (type == 'bps') ? '/s' : '';
-    var i, l = labels.length, value;
-
-    if (base < 1) return '0 ' + labels[0].unit + append;
-
-    if (type == 's') {
-      var units = [];
-
-      for (i = l - 1; i >= 0; i--) {
-        value = Math.floor(base / labels[i].min);
-        if (value) {
-          units.push(value + ' ' + labels[i].unit);
-          base -= value * labels[i].min;
-          if (!base) break;
-        }
-      }
-
-      return (join === false) ? units : units.join(join || ', ');
-    }
-
-    for (i = l - 1; i >= 0; i--) {
-      value = labels[i].min;
-      if (base >= value) break;
-    }
-
-    return (base / value).toFixed(1) + ' ' + labels[i].unit + append;
-  }
-
-});
-
-Swiff.Uploader.qualifyPath = (function() {
-
-  var anchor;
-
-  return function(path) {
-    (anchor || (anchor = new Element('a'))).href = path;
-    return anchor.href;
-  };
-
-})();
-
-Swiff.Uploader.File = new Class({
-
-  Implements: Events,
-
-  initialize: function(base, data) {
-    this.base = base;
-    this.update(data);
-  },
-
-  update: function(data) {
-    return Object.append(this, data);
-  },
-
-  validate: function() {
-    var options = this.base.options;
-
-    if (options.fileListMax && this.base.fileList.length >= options.fileListMax) {
-      this.validationError = 'fileListMax';
-      return false;
-    }
-
-    if (options.fileListSizeMax && (this.base.size + this.size) > options.fileListSizeMax) {
-      this.validationError = 'fileListSizeMax';
-      return false;
-    }
-
-    return true;
-  },
-
-  invalidate: function() {
-    this.invalid = true;
-    this.base.fireEvent('fileInvalid', this, 10);
-    return this.fireEvent('invalid', this, 10);
-  },
-
-  render: function() {
-    return this;
-  },
-
-  setOptions: function(options) {
-	//if (typeof console !== 'undefined' && console.log) console.log('Swiff.Uploader: File::setOptions');
-    if (options) {
-      if (options.url) {
-		options.url = Swiff.Uploader.qualifyPath(options.url);
-    }
-      this.base.remote('xFileSetOptions', this.id, options);
-      this.options = Object.merge(this.base.options, options);
-    }
-    return this;
-  },
-
-  start: function() {
-    this.base.fileStart(this);
-    return this;
-  },
-
-  stop: function() {
-    this.base.fileStop(this);
-    return this;
-  },
-
-  remove: function() {
-    this.base.fileRemove(this);
-    return this;
-  },
-
-  requeue: function() {
-    this.base.fileRequeue(this);
-  }
-
-});
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/PasteText/PasteText.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/PasteText/PasteText.js
deleted file mode 100644
index 85a8ca3..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/PasteText/PasteText.js
+++ /dev/null
@@ -1,141 +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 PasteText(editor) {

-	this.editor = editor;

-	var cfg = editor.config;

-	var self = this;

-

-	cfg.registerButton({

-		id       : "pastetext",

-		tooltip  : this._lc("Paste as Plain Text"),

-		image    : editor.imgURL("ed_paste_text.gif", "PasteText"),

-		textMode : false,

-		action   : function() { self.show(); }

-	});

-

-	cfg.addToolbarElement("pastetext", ["paste", "killword"], 1);

-}

-

-PasteText._pluginInfo = {

-	name          : "PasteText",

-	version       : "1.2",

-	developer     : "Michael Harris",

-	developer_url : "http://www.jonesadvisorygroup.com",

-	c_owner       : "Jones Advisory Group",

-	sponsor       : "Jones International University",

-	sponsor_url   : "http://www.jonesinternational.edu",

-	license       : "htmlArea"

-};

-

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

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

-};

-

-Xinha.Config.prototype.PasteText =

-{

-	showParagraphOption : true,

-	newParagraphDefault :true

-}

-

-PasteText.prototype.onGenerateOnce = function()

-{

-	var self = PasteText;

-	if (self.loading) return;

-	self.loading = true;

-	Xinha._getback(Xinha.getPluginDir("PasteText") + '/popups/paste_text.html', function(getback) { self.html = getback;});

-};

-

-PasteText.prototype._prepareDialog = function()

-{

-	var self = this;

-	var editor = this.editor;

-

-	var self = this;

-

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

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

-

-	// Connect the OK and Cancel buttons

-	this.dialog.getElementById('ok').onclick = function() {self.apply();}

-

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

-

-	// do some tweaking 

-	if (editor.config.PasteText.showParagraphOption)

-	{

-		this.dialog.getElementById("paragraphOption").style.display = "";

-	}

-	if (editor.config.PasteText.newParagraphDefault)

-	{

-		this.dialog.getElementById("insertParagraphs").checked = true;

-	}

-

-	// we can setup a custom function that cares for sizes etc. when the dialog is resized

-	this.dialog.onresize = function ()

-	{

-		this.getElementById("inputArea").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

-		- parseInt(this.rootElem.style.paddingBottom,10) // we have a padding at the bottom, gotta take this into acount

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

-		

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

-

-	}

-};

-

-PasteText.prototype.show = function()

-{

-	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();

-

-	this.dialog.getElementById("inputArea").focus();

-};

-

-// and finally ... take some action

-PasteText.prototype.apply = function()

-{

-	// the hide method of the dialog object returns the values of the inputs AND hides the dialog

-	// could also use this.dialog.getValues() here and hide it at the end

-	var returnValues = this.dialog.hide();

-	

-	var html = returnValues.inputArea;

-	var insertParagraphs = returnValues.insertParagraphs;

-	html = html.replace(/</g, "&lt;");

-	html = html.replace(/>/g, "&gt;");

-	if ( returnValues.insertParagraphs)

-	{

-		html = html.replace(/\t/g,"&nbsp;&nbsp;&nbsp;&nbsp;");

-		html = html.replace(/\n+/g,"</p><p>");

-		html="<p>" + html + "</p>";

-		if (Xinha.is_ie)

-		{

-			this.editor.insertHTML(html);

-		}

-		else

-		{

-      this.editor.insertHTML(html);

-			// this.editor.execCommand("inserthtml",false,html);

-		}

-	}

-	else

-	{

-		html = html.replace(/\n/g,"<br />");

-		this.editor.insertHTML(html);

-	}

-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/PasteText/img/ed_paste_text.gif b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/PasteText/img/ed_paste_text.gif
deleted file mode 100644
index 039a649..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/PasteText/img/ed_paste_text.gif
+++ /dev/null
Binary files differ
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/PasteText/lang/ch.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/PasteText/lang/ch.js
deleted file mode 100644
index 9d78e44..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/PasteText/lang/ch.js
+++ /dev/null
@@ -1,14 +0,0 @@
-// I18N constants
-// LANG: "ch", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Cancel": "取消",
-    "OK": "好"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/PasteText/lang/cz.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/PasteText/lang/cz.js
deleted file mode 100644
index 36b9929..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/PasteText/lang/cz.js
+++ /dev/null
@@ -1,14 +0,0 @@
-// I18N constants
-// LANG: "cz", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Cancel": "Zrušit",
-    "OK": "OK"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/PasteText/lang/da.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/PasteText/lang/da.js
deleted file mode 100644
index 20fc0d0..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/PasteText/lang/da.js
+++ /dev/null
@@ -1,14 +0,0 @@
-// I18N constants
-// LANG: "da", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Cancel": "Annuller",
-    "OK": "OK"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/PasteText/lang/de.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/PasteText/lang/de.js
deleted file mode 100644
index 7bba7de..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/PasteText/lang/de.js
+++ /dev/null
@@ -1,16 +0,0 @@
-// I18N constants
-// LANG: "de", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Cancel": "Abbrechen",
-    "Insert text in new paragraph": "Neue Absätze eifügen",
-    "OK": "OK",
-    "Paste as Plain Text": "unformatierten Text einfügen"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/PasteText/lang/ee.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/PasteText/lang/ee.js
deleted file mode 100644
index ba916e9..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/PasteText/lang/ee.js
+++ /dev/null
@@ -1,14 +0,0 @@
-// I18N constants
-// LANG: "ee", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Cancel": "Loobu",
-    "OK": "OK"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/PasteText/lang/el.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/PasteText/lang/el.js
deleted file mode 100644
index f6e006c..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/PasteText/lang/el.js
+++ /dev/null
@@ -1,14 +0,0 @@
-// I18N constants
-// LANG: "el", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Cancel": "Ακύρωση",
-    "OK": "Εντάξει"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/PasteText/lang/es.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/PasteText/lang/es.js
deleted file mode 100644
index 9f23c0f..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/PasteText/lang/es.js
+++ /dev/null
@@ -1,14 +0,0 @@
-// I18N constants
-// LANG: "es", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Cancel": "Cancelar",
-    "OK": "Aceptar"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/PasteText/lang/eu.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/PasteText/lang/eu.js
deleted file mode 100644
index 3bc9dbb..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/PasteText/lang/eu.js
+++ /dev/null
@@ -1,14 +0,0 @@
-// I18N constants
-// LANG: "eu", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Cancel": "Utzi",
-    "OK": "Ados"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/PasteText/lang/fa.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/PasteText/lang/fa.js
deleted file mode 100644
index 84e7f7e..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/PasteText/lang/fa.js
+++ /dev/null
@@ -1,14 +0,0 @@
-// I18N constants
-// LANG: "fa", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Cancel": "انصراف",
-    "OK": "بله"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/PasteText/lang/fi.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/PasteText/lang/fi.js
deleted file mode 100644
index 82552b9..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/PasteText/lang/fi.js
+++ /dev/null
@@ -1,14 +0,0 @@
-// I18N constants
-// LANG: "fi", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Cancel": "Peruuta",
-    "OK": "Hyväksy"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/PasteText/lang/fr.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/PasteText/lang/fr.js
deleted file mode 100644
index 26fa8f3..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/PasteText/lang/fr.js
+++ /dev/null
@@ -1,15 +0,0 @@
-// I18N constants
-// LANG: "fr", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Cancel": "Annuler",
-    "OK": "OK",
-    "Paste as Plain Text": "Copier comme texte pur"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/PasteText/lang/he.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/PasteText/lang/he.js
deleted file mode 100644
index a602f7c..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/PasteText/lang/he.js
+++ /dev/null
@@ -1,14 +0,0 @@
-// I18N constants
-// LANG: "he", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Cancel": "ביטול",
-    "OK": "אישור"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/PasteText/lang/hu.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/PasteText/lang/hu.js
deleted file mode 100644
index b38528d..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/PasteText/lang/hu.js
+++ /dev/null
@@ -1,14 +0,0 @@
-// I18N constants
-// LANG: "hu", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Cancel": "Mégsem",
-    "OK": "Rendben"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/PasteText/lang/it.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/PasteText/lang/it.js
deleted file mode 100644
index a0acb45..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/PasteText/lang/it.js
+++ /dev/null
@@ -1,14 +0,0 @@
-// I18N constants
-// LANG: "it", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Cancel": "Annullamento",
-    "OK": "OK"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/PasteText/lang/ja.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/PasteText/lang/ja.js
deleted file mode 100644
index 108a302..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/PasteText/lang/ja.js
+++ /dev/null
@@ -1,15 +0,0 @@
-// I18N constants
-// LANG: "ja", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Cancel": "中止",
-    "OK": "OK",
-    "Paste as Plain Text": "プレーンテキストとして貼り付け"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/PasteText/lang/lc_base.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/PasteText/lang/lc_base.js
deleted file mode 100644
index e02e013..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/PasteText/lang/lc_base.js
+++ /dev/null
@@ -1,28 +0,0 @@
-// I18N constants
-//
-// LANG: "en", ENCODING: UTF-8
-// Author: Translator-Name, <email@example.com>
-//
-// Last revision: 2018-04-12
-// 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).
-//
-// (Please, remove information below)
-// 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.)
-
-{
-    "Cancel": "",
-    "Insert text in new paragraph": "",
-    "OK": "",
-    "Paste as Plain Text": ""
-}
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/PasteText/lang/lt.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/PasteText/lang/lt.js
deleted file mode 100644
index d118909..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/PasteText/lang/lt.js
+++ /dev/null
@@ -1,14 +0,0 @@
-// I18N constants
-// LANG: "lt", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Cancel": "Atšaukti",
-    "OK": "OK"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/PasteText/lang/lv.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/PasteText/lang/lv.js
deleted file mode 100644
index f83d5d3..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/PasteText/lang/lv.js
+++ /dev/null
@@ -1,14 +0,0 @@
-// I18N constants
-// LANG: "lv", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Cancel": "Atcelt",
-    "OK": "Labi"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/PasteText/lang/nb.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/PasteText/lang/nb.js
deleted file mode 100644
index 5cb64c4..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/PasteText/lang/nb.js
+++ /dev/null
@@ -1,15 +0,0 @@
-// I18N constants
-// LANG: "nb", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Cancel": "Avbryt",
-    "OK": "OK",
-    "Paste as Plain Text": "Lim inn som ren tekst"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/PasteText/lang/nl.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/PasteText/lang/nl.js
deleted file mode 100644
index 8669f15..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/PasteText/lang/nl.js
+++ /dev/null
@@ -1,15 +0,0 @@
-// I18N constants
-// LANG: "nl", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Cancel": "Annuleren",
-    "OK": "OK",
-    "Paste as Plain Text": "Kopieer als platte tekst (geen opmaak)"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/PasteText/lang/pl.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/PasteText/lang/pl.js
deleted file mode 100644
index 1d0fdce..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/PasteText/lang/pl.js
+++ /dev/null
@@ -1,15 +0,0 @@
-// I18N constants
-// LANG: "pl", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Cancel": "Anuluj",
-    "OK": "OK",
-    "Paste as Plain Text": "Wklej jako czysty tekst"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/PasteText/lang/pt_br.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/PasteText/lang/pt_br.js
deleted file mode 100644
index 1b45eb9..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/PasteText/lang/pt_br.js
+++ /dev/null
@@ -1,18 +0,0 @@
-// I18N constants
-// LANG: "pt_br", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Cancel": "Cancelar",
-    "OK": "OK",
-    "Paste as Plain Text": "Colar um texto básico",
-    "__OBSOLETE__": {
-        "Paste Text": "Colar Texto"
-    }
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/PasteText/lang/ro.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/PasteText/lang/ro.js
deleted file mode 100644
index 9d6e1c3..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/PasteText/lang/ro.js
+++ /dev/null
@@ -1,14 +0,0 @@
-// I18N constants
-// LANG: "ro", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Cancel": "Renunţă",
-    "OK": "Acceptă"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/PasteText/lang/ru.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/PasteText/lang/ru.js
deleted file mode 100644
index 631a383..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/PasteText/lang/ru.js
+++ /dev/null
@@ -1,15 +0,0 @@
-// I18N constants
-// LANG: "ru", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Cancel": "Отмена",
-    "OK": "OK",
-    "Paste as Plain Text": "Вставить как обычный текст"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/PasteText/lang/sh.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/PasteText/lang/sh.js
deleted file mode 100644
index 62e76f7..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/PasteText/lang/sh.js
+++ /dev/null
@@ -1,14 +0,0 @@
-// I18N constants
-// LANG: "sh", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Cancel": "Poništi",
-    "OK": "OK"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/PasteText/lang/si.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/PasteText/lang/si.js
deleted file mode 100644
index 7674892..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/PasteText/lang/si.js
+++ /dev/null
@@ -1,14 +0,0 @@
-// I18N constants
-// LANG: "si", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Cancel": "Prekliči",
-    "OK": "V redu"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/PasteText/lang/sr.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/PasteText/lang/sr.js
deleted file mode 100644
index b7ee6f5..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/PasteText/lang/sr.js
+++ /dev/null
@@ -1,14 +0,0 @@
-// I18N constants
-// LANG: "sr", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Cancel": "Поништи",
-    "OK": "OK"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/PasteText/lang/sv.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/PasteText/lang/sv.js
deleted file mode 100644
index 98336d8..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/PasteText/lang/sv.js
+++ /dev/null
@@ -1,14 +0,0 @@
-// I18N constants
-// LANG: "sv", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Cancel": "Avbryt",
-    "OK": "OK"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/PasteText/lang/th.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/PasteText/lang/th.js
deleted file mode 100644
index 9da9c8d..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/PasteText/lang/th.js
+++ /dev/null
@@ -1,14 +0,0 @@
-// I18N constants
-// LANG: "th", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Cancel": "ยกเลิก",
-    "OK": "ตกลง"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/PasteText/lang/tr.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/PasteText/lang/tr.js
deleted file mode 100644
index 8a4e22a..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/PasteText/lang/tr.js
+++ /dev/null
@@ -1,14 +0,0 @@
-// I18N constants
-// LANG: "tr", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Cancel": "İptal",
-    "OK": "Tamam"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/PasteText/lang/vn.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/PasteText/lang/vn.js
deleted file mode 100644
index 2d82e02..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/PasteText/lang/vn.js
+++ /dev/null
@@ -1,14 +0,0 @@
-// I18N constants
-// LANG: "vn", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Cancel": "Hủy",
-    "OK": "Đồng ý"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/PasteText/popups/paste_text.html b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/PasteText/popups/paste_text.html
deleted file mode 100644
index 6ce2e7a..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/PasteText/popups/paste_text.html
+++ /dev/null
@@ -1,9 +0,0 @@
-<h1 id="[h1]"><l10n>Paste as Plain Text</l10n></h1>

-<textarea name="[inputArea]" id="[inputArea]" style="font-family:monospace;height:300px;border:none;"></textarea>

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

-<label style="float:left;display:none" id="[paragraphOption]">

-<input type="checkbox" id="[insertParagraphs]" name="[insertParagraphs]" value="on" /> <l10n>Insert text in new paragraph</l10n> 

-</label>

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

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

-</div>

diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/PreserveScripts/PreserveScripts.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/PreserveScripts/PreserveScripts.js
deleted file mode 100644
index b410498..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/PreserveScripts/PreserveScripts.js
+++ /dev/null
@@ -1,84 +0,0 @@
-/*------------------------------------------*\
-PreserveScripts for Xinha
-____________________
-Replace blocks of of PHP or JavaScript with icons in the editor, this way making it possible to edit sourcecode containing PHP, 
-and preventing Javascript from being accidentally deleted because it's normally invisible
-
-\*------------------------------------------*/
-
-function PreserveScripts(editor) {
-	this.editor = editor;
-}
-
-PreserveScripts._pluginInfo = {
-  name          : "PreserveScripts",
-  version       : "1.0",
-  developer     : "Raimund Meyer",
-  developer_url : "http://x-webservice.net",
-  c_owner       : "Raimund Meyer",
-  sponsor       : "",
-  sponsor_url   : "",
-  license       : "LGPL"
-}
-Xinha.Config.prototype.PreserveScripts =
-{
-	'preservePHP' : true,
-	'preserveJS' : true
-}
-PreserveScripts.prototype.inwardHtml = function(html)
-{
-	var s = this;
-	var c = s.editor.config.PreserveScripts;
-	this.storage = {}; //empty the cache
-	var i = 1;
-	var index=0;
-	html = html.replace(/\n?<\?(php)?(\s|[^\s])*?\?>\n?/ig,
-		function(m)
-		{
-			if ( c.preservePHP ) // if config set to false wipe out php completely, otherwise ugly fragments may remain
-			{
-				index = html.indexOf(m,index);
-				
-				index+=m.length
-				
-				var after = html.substring( index, html.length );
-				
-				//strip out php
-				s.storage['preservescripts_'+i] = m;
-				after=after.replace(/\n?<\?(php)?(\s|[^\s])*?\?>\n?/ig,'');
-				
-				if ( after.match(/^[^<]*>/) ) // make sure cursor is in an editable area (outside tags, script blocks, entities, and inside the body)
-				{
-					var r = '[preservescripts_'+i+']=preservescripts';
-				}else{
-					var r = '<img title="PHP" id="preservescripts_'+i+'" src="'+Xinha.getPluginDir("PreserveScripts")+'/php.png" />';
-				}
-				i++;
-				return r;
-			}
-			else
-			{
-				return '';
-			}
-		});
-	if ( c.preserveJS )
-	{
-		html = html.replace(/\n?<script(\s|[^\s])*?<\/script>\n?/g,
-			function(m)
-			{
-				s.storage['preservescripts_'+i] = m;
-				var r = '<img title="JavaScript" id="preservescripts_'+i+'" src="' + Xinha.getPluginDir("PreserveScripts") + '/js.png" />';
-				i++;
-				return r;
-			});	
-	}
-	return html;
-}
-
-PreserveScripts.prototype.outwardHtml = function(html)
-{
-	var s = this;
-	html = html.replace(/\[(preservescripts_\d+)\](="preservescripts"|=preservescripts)?/g,function(m0,m1){return s.storage[m1];});
-	html = html.replace(/<img[^>]*id="(preservescripts_\d+)"[^>]*>/g,function(m0,m1){return s.storage[m1];});
-	return html;
-}
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/PreserveScripts/js.png b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/PreserveScripts/js.png
deleted file mode 100644
index 41f5e42..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/PreserveScripts/js.png
+++ /dev/null
Binary files differ
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/PreserveScripts/lang/lc_base.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/PreserveScripts/lang/lc_base.js
deleted file mode 100644
index 64cd781..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/PreserveScripts/lang/lc_base.js
+++ /dev/null
@@ -1,26 +0,0 @@
-// I18N constants
-//
-// LANG: "en", ENCODING: UTF-8
-// Author: Translator-Name, <email@example.com>
-//
-// Last revision: 2018-04-12
-// 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).
-//
-// (Please, remove information below)
-// 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.)
-
-{
-    "JavaScript": "",
-    "PHP": ""
-}
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/PreserveScripts/php.png b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/PreserveScripts/php.png
deleted file mode 100644
index a1bffb1..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/PreserveScripts/php.png
+++ /dev/null
Binary files differ
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/PreserveScripts/php.svg b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/PreserveScripts/php.svg
deleted file mode 100755
index f72adc4..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/PreserveScripts/php.svg
+++ /dev/null
@@ -1,152 +0,0 @@
-<?xml version="1.0" encoding="UTF-8" standalone="no"?>
-<!-- Created with Inkscape (http://www.inkscape.org/) -->
-<svg
-   xmlns:dc="http://purl.org/dc/elements/1.1/"
-   xmlns:cc="http://creativecommons.org/ns#"
-   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
-   xmlns:svg="http://www.w3.org/2000/svg"
-   xmlns="http://www.w3.org/2000/svg"
-   xmlns:xlink="http://www.w3.org/1999/xlink"
-   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
-   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
-   width="16px"
-   height="16px"
-   id="svg2168"
-   sodipodi:version="0.32"
-   inkscape:version="0.46"
-   inkscape:export-filename="/home/raimund/www/x/plugins/PreserveScripts/js.png"
-   inkscape:export-xdpi="89.342918"
-   inkscape:export-ydpi="89.342918"
-   sodipodi:docbase="/home/raimund/www/x/plugins/PreserveScripts"
-   sodipodi:docname="php.svg"
-   inkscape:output_extension="org.inkscape.output.svg.inkscape">
-  <defs
-     id="defs2170">
-    <linearGradient
-       id="linearGradient3500">
-      <stop
-         style="stop-color:#7296cf;stop-opacity:1;"
-         offset="0"
-         id="stop3502" />
-      <stop
-         id="stop3508"
-         offset="1"
-         style="stop-color:#000000;stop-opacity:1;" />
-    </linearGradient>
-    <inkscape:perspective
-       sodipodi:type="inkscape:persp3d"
-       inkscape:vp_x="0 : 8 : 1"
-       inkscape:vp_y="0 : 1000 : 0"
-       inkscape:vp_z="16 : 8 : 1"
-       inkscape:persp3d-origin="8 : 5.3333333 : 1"
-       id="perspective3498" />
-    <linearGradient
-       inkscape:collect="always"
-       id="linearGradient3213">
-      <stop
-         style="stop-color:#f9f0f0;stop-opacity:1;"
-         offset="0"
-         id="stop3215" />
-      <stop
-         style="stop-color:#f9f0f0;stop-opacity:0;"
-         offset="1"
-         id="stop3217" />
-    </linearGradient>
-    <linearGradient
-       inkscape:collect="always"
-       xlink:href="#linearGradient3213"
-       id="linearGradient3219"
-       x1="1.4376229"
-       y1="11.5"
-       x2="5"
-       y2="11.5"
-       gradientUnits="userSpaceOnUse" />
-    <linearGradient
-       inkscape:collect="always"
-       xlink:href="#linearGradient3213"
-       id="linearGradient3271"
-       gradientUnits="userSpaceOnUse"
-       x1="1.4376229"
-       y1="11.5"
-       x2="5"
-       y2="11.5" />
-    <linearGradient
-       inkscape:collect="always"
-       xlink:href="#linearGradient3500"
-       id="linearGradient3506"
-       x1="2.8584621"
-       y1="1.5776196"
-       x2="17.599249"
-       y2="21.65107"
-       gradientUnits="userSpaceOnUse" />
-  </defs>
-  <sodipodi:namedview
-     id="base"
-     pagecolor="#ffffff"
-     bordercolor="#666666"
-     borderopacity="1.0"
-     inkscape:pageopacity="0.0"
-     inkscape:pageshadow="2"
-     inkscape:zoom="45.25"
-     inkscape:cx="8"
-     inkscape:cy="8"
-     inkscape:current-layer="layer1"
-     showgrid="true"
-     inkscape:grid-bbox="true"
-     inkscape:document-units="px"
-     showguides="true"
-     inkscape:guide-bbox="true"
-     inkscape:window-width="1280"
-     inkscape:window-height="952"
-     inkscape:window-x="0"
-     inkscape:window-y="48">
-    <sodipodi:guide
-       orientation="horizontal"
-       position="13.999829"
-       id="guide3279" />
-    <sodipodi:guide
-       orientation="horizontal"
-       position="1.03125"
-       id="guide3281" />
-    <sodipodi:guide
-       orientation="vertical"
-       position="2.003762"
-       id="guide3283" />
-  </sodipodi:namedview>
-  <metadata
-     id="metadata2173">
-    <rdf:RDF>
-      <cc:Work
-         rdf:about="">
-        <dc:format>image/svg+xml</dc:format>
-        <dc:type
-           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
-      </cc:Work>
-    </rdf:RDF>
-  </metadata>
-  <g
-     id="layer1"
-     inkscape:label="Layer 1"
-     inkscape:groupmode="layer">
-    <path
-       style="fill:url(#linearGradient3506);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.74000001000000004;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1"
-       d="M 7.7985807,0.065727613 C 14.746805,0.1010246 16.103261,6.6540083 16.20884,8.1654862 L 15.95808,16 L 0.031440832,16 L -6.2746845e-16,8.1251636 C 0.022741976,4.1872904 2.8185579,0.035229736 7.7985807,0.065727613 z "
-       id="rect3273"
-       sodipodi:nodetypes="cccccc"
-       inkscape:export-filename="/home/raimund/www/x/plugins/PreservePHP/tag.png"
-       inkscape:export-xdpi="89.97699"
-       inkscape:export-ydpi="89.97699" />
-    <text
-       xml:space="preserve"
-       style="font-size:7.18612623000000017px;font-style:normal;font-weight:normal;fill:#eceeed;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Bitstream Vera Sans"
-       x="9.1872959"
-       y="13.058194"
-       id="text3275"
-       transform="scale(0.8731191,1.1453191)"><tspan
-         sodipodi:role="line"
-         id="tspan3277"
-         x="9.1872959"
-         y="13.058194"
-         style="font-weight:bold;text-align:center;text-anchor:middle;font-family:DejaVu Sans;fill:#eceeed;fill-opacity:1">PHP</tspan></text>
-  </g>
-</svg>
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/PreserveSelection/PreserveSelection.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/PreserveSelection/PreserveSelection.js
deleted file mode 100644
index d2240b4..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/PreserveSelection/PreserveSelection.js
+++ /dev/null
@@ -1,209 +0,0 @@
-/**
- PreserveSelection for Xinha
- ===============================================================================
- 
- Originally developed by AdamJ in ticket #1544 as a Gecko patch.  Pluginised by 
- James Sleeman.
- 
- This plugin preserves the selected text when switching between wysiwyg and 
- source modes, eg, select hello world in the wysiwyg mode, and switch to
- source mode and hello world will be selected there also.
- 
- Note that this plugin works a bit differently as it over-rides existing 
- features of the Gecko/WebKit module loaded in the browser.
-*/
-
-PreserveSelection._pluginInfo = {
-  name          : "PreserveSelection",
-  version       : "1.0",
-  developer     : "AdamJ, James Sleeman",
-  developer_url : "http://trac.xinha.org/ticket/1544",
-  sponsor       : "",
-  sponsor_url   : "",
-  license       : "htmlArea"
-}
-
-function PreserveSelection(editor)
-{
-  this.editor = editor;
-};
-
-Xinha.ccStart = String.fromCharCode(8286); 
-Xinha.ccEnd   = String.fromCharCode(8285); 
-
-PreserveSelection.prototype.onGenerateOnce = function()
-{
-  var editor = this.editor;
-  
-  editor.setCC =  function ( target )
-  {
-    var ccStart = Xinha.ccStart;
-    var ccEnd = Xinha.ccEnd;
-    try
-    {
-      if ( target == "textarea" )
-      {
-        var ta = this._textArea;
-        var startIndex = ta.selectionStart;
-        var endIndex = ta.selectionEnd;
-      
-      var after=ta.value.substring( startIndex, ta.value.length );
-      if ( after.match(/^[^<]*>/) ) // make sure cursor is in an editable area (outside tags, script blocks, entities, and inside the body)
-        {
-          var tagEnd = after.indexOf(">") + 1;
-          startIndex+=tagEnd;
-        }
-      
-      var after=ta.value.substring( endIndex, ta.value.length );
-      if ( after.match(/^[^<]*>/) ) // make sure cursor is in an editable area (outside tags, script blocks, entities, and inside the body)
-        {
-          var tagEnd = after.indexOf(">") + 1;
-          endIndex+=tagEnd;
-        }
-      
-        var before = ta.value.substring( 0, startIndex )
-        var middle = ta.value.substring( startIndex, endIndex )
-        var after = ta.value.substring( endIndex, ta.value.length );
-
-        ta.value = before + ccStart + middle + ccEnd + after;
-        ta.value = ta.value.replace(new RegExp ('(&[^'+ccStart+';]*?)('+ccStart+')([^'+ccStart+']*?;)'), "$1$3$2");
-        ta.value = ta.value.replace(new RegExp ('(<script[^>]*>[^'+ccStart+']*?)('+ccStart+')([^'+ccStart+']*?<\/script>)'), "$1$3$2");
-        ta.value = ta.value.replace(new RegExp ('^([^'+ccStart+']*)('+ccStart+')([^'+ccStart+']*<body[^>]*>)(.*?)'), "$1$3$2$4");
-      }
-      else
-      {
-        var sel = this.getSelection();
-      
-      var range=sel.getRangeAt(0);
-      var collapsed=range.collapsed;
-      
-
-      if(range.startContainer.nodeType==3){
-        range.startContainer.insertData(range.startOffset,ccStart);
-      }else if(range.startContainer.nodeType==1){
-        if( range.startOffset ){
-          var startTextNode=range.startContainer.insertBefore( this._doc.createTextNode(ccStart), range.startContainer.childNodes[range.startOffset] );
-        }else{
-          var startTextNode=range.startContainer.appendChild( this._doc.createTextNode(ccStart) );
-        }
-      }else{
-        alert(range.startContainer.nodeType);
-      }
-      
-      
-      if( collapsed==false ){
-        if(range.endContainer.nodeType==3){
-          range.endContainer.insertData(range.endOffset,ccEnd);
-        }else if(range.endContainer.nodeType==1){
-          if( range.endOffset ){
-            var endTextNode=range.endContainer.insertBefore( this._doc.createTextNode(ccEnd), range.endContainer.childNodes[range.endOffset] );
-          }else{
-            var endTextNode=range.endContainer.appendChild( this._doc.createTextNode(ccEnd) );
-          }
-        }else{
-          alert(range.endContainer.nodeType);
-        }
-      }
-      }
-    } catch (e) {}
-  };
-  
-  editor.findCC = function ( target )
-  {
-    var ccStart = Xinha.ccStart;
-    var ccEnd = Xinha.ccEnd;
-    
-    if ( target == 'textarea' )
-    {
-      var ta = this._textArea;
-      
-      var startPos = ta.value.indexOf( ccStart );
-      if ( startPos == -1 ) return;
-      
-      var endPos = ta.value.indexOf( ccEnd );
-      
-      if ( endPos != -1 ){ 
-
-        if( startPos<endPos ){
-          pos1=startPos;
-          pos2=endPos;
-        }else{
-          pos1=endPos;
-          pos2=startPos;
-        }
-      
-        var middle = pos1 + ccStart.length;
-        var before =  ta.value.substring( 0, pos1 );
-        var middle = ta.value.substring( middle, pos2 );
-        var after = ta.value.substring(pos2 + ccEnd.length);
-        ta.value = before;
-      
-        ta.scrollTop = ta.scrollHeight;
-        var scrollPos = ta.scrollTop;
-        
-        ta.value += middle;
-        ta.value += after;
-        ta.setSelectionRange(pos1,pos2-1);
-      }else{
-        
-        var end = startPos + ccStart.length;
-        var before =  ta.value.substring( 0, startPos );
-        var after = ta.value.substring( end, ta.value.length );
-        ta.value = before;
-      
-        ta.scrollTop = ta.scrollHeight;
-        var scrollPos = ta.scrollTop;
-        
-        ta.value += after;
-        ta.setSelectionRange(startPos,startPos);
-      }
-    
-      ta.focus();
-      
-      ta.scrollTop = scrollPos;
-
-    }
-    else
-    {
-      try
-      {
-        var doc = this._doc; 
-      doc.body.innerHTML = doc.body.innerHTML.replace(new RegExp(ccStart),'<span id="XinhaEditingStart"></span>');
-      doc.body.innerHTML = doc.body.innerHTML.replace(new RegExp(ccEnd),'<span id="XinhaEditingEnd"></span>');
-      var startEl = doc.getElementById('XinhaEditingStart');
-      var endEl = doc.getElementById('XinhaEditingEnd');
-      
-      this.forceRedraw();
-      var range;
-      var collapsed = typeof collapseToStart == "undefined" ? true : false;
-      var sel = this.getSelection();
-      range = this._doc.createRange();
-      if ( !startEl ){
-        sel.removeAllRanges();
-        return;
-      }
-      // Tables and Images get selected as "objects" rather than the text contents
-      if ( !endEl && startEl.tagName && startEl.tagName.toLowerCase().match(/table|img|input|textarea|select/) ){
-        range.selectNode(startEl);
-      }else{
-        range.selectNodeContents(startEl);
-      }
-      
-      if( endEl ){
-        range.setStart(startEl,0);
-        range.setEnd(endEl,0);
-      }
-
-      sel.removeAllRanges();
-      sel.addRange(range);
-      
-      this.scrollToElement(startEl);
-      startEl.parentNode.removeChild(startEl);          
-      endEl.parentNode.removeChild(endEl);
-      
-      this._iframe.contentWindow.focus();
-      } catch (e) {}
-    }
-  };
-
-};
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/QuickTag/QuickTag.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/QuickTag/QuickTag.js
deleted file mode 100644
index 73b28d9..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/QuickTag/QuickTag.js
+++ /dev/null
@@ -1,53 +0,0 @@
-/*---------------------------------------*\

- Quick Tag Editor Plugin for HTMLArea-3.0

- -----------------------------------------

- author: Cau guanabara 

- e-mail: caugb@ibest.com.br

-\*---------------------------------------*/

-

-function QuickTag(editor) {

-  var cfg = editor.config;

-  var self = this;

-

-  cfg.registerButton({

-	id       : "quickeditor",

-	tooltip  : this._lc("Quick Tag Editor"),

-	image    : editor.imgURL("ed_quicktag.gif", "QuickTag"), 

-	textMode : false,

-  action   : function(editor) { 

-               self.buttonPress(editor); 

-             }

-  });

-  cfg.addToolbarElement("quickeditor", "htmlmode", 1);  

-}

-

-QuickTag.prototype.buttonPress = function(editor) { 

-var self = this;

-var sel = editor.getSelectedHTML().replace(/(<[^>]*>|&nbsp;|\n|\r)/g,""); 

-var param = new Object();

-param.editor = editor;

-

-  if(/\w/.test(sel))

-    editor._popupDialog("plugin://QuickTag/quicktag", function(p) { self.setTag(editor, p); }, param);

-  else

-    alert(this._lc('You have to select some text'));

-};

-

-QuickTag.prototype.setTag = function(editor, param) {

-editor.surroundHTML(param.tagopen,param.tagclose);

-};

-

-QuickTag._pluginInfo = {

-name          : "QuickTag",

-version       : "1.0 - beta",

-developer     : "Cau Guanabara",

-developer_url : "mailto:caugb@ibest.com.br",

-c_owner       : "Cau Guanabara",

-sponsor       : "Independent production",

-sponsor_url   : "http://www.netflash.com.br/gb/HA3-rc1/examples/quick-tag.html",

-license       : "htmlArea"

-};

-

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

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

-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/QuickTag/img/ed_quicktag.gif b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/QuickTag/img/ed_quicktag.gif
deleted file mode 100644
index 2ae5ce5..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/QuickTag/img/ed_quicktag.gif
+++ /dev/null
Binary files differ
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/QuickTag/lang/ch.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/QuickTag/lang/ch.js
deleted file mode 100644
index 62e5bd6..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/QuickTag/lang/ch.js
+++ /dev/null
@@ -1,13 +0,0 @@
-// I18N constants
-// LANG: "ch", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Cancel": "取消"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/QuickTag/lang/cz.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/QuickTag/lang/cz.js
deleted file mode 100644
index c26a48b..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/QuickTag/lang/cz.js
+++ /dev/null
@@ -1,13 +0,0 @@
-// I18N constants
-// LANG: "cz", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Cancel": "Zrušit"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/QuickTag/lang/da.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/QuickTag/lang/da.js
deleted file mode 100644
index 2f85401..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/QuickTag/lang/da.js
+++ /dev/null
@@ -1,13 +0,0 @@
-// I18N constants
-// LANG: "da", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Cancel": "Annuller"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/QuickTag/lang/de.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/QuickTag/lang/de.js
deleted file mode 100644
index af690f1..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/QuickTag/lang/de.js
+++ /dev/null
@@ -1,24 +0,0 @@
-// I18N constants
-// LANG: "de", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "ATTRIBUTES": "ATTRIBUTES",
-    "Cancel": "Cancel",
-    "Colors": "Colors",
-    "Enter the TAG you want to insert": "Enter the TAG you want to insert",
-    "No CSS class avaiable": "No CSS classes avaiable",
-    "OPTIONS": "OPTIONS",
-    "Ok": "Ok",
-    "Quick Tag Editor": "Quick TAG Editor",
-    "TAGs": "TAGs",
-    "There are some unclosed quote": "There are some unclosed quote",
-    "This attribute already exists in the TAG": "This attribute already exists in the TAG",
-    "You have to select some text": "You have to select some text"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/QuickTag/lang/ee.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/QuickTag/lang/ee.js
deleted file mode 100644
index aacd840..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/QuickTag/lang/ee.js
+++ /dev/null
@@ -1,13 +0,0 @@
-// I18N constants
-// LANG: "ee", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Cancel": "Loobu"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/QuickTag/lang/el.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/QuickTag/lang/el.js
deleted file mode 100644
index 7b4695f..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/QuickTag/lang/el.js
+++ /dev/null
@@ -1,13 +0,0 @@
-// I18N constants
-// LANG: "el", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Cancel": "Ακύρωση"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/QuickTag/lang/es.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/QuickTag/lang/es.js
deleted file mode 100644
index 113ea9e..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/QuickTag/lang/es.js
+++ /dev/null
@@ -1,13 +0,0 @@
-// I18N constants
-// LANG: "es", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Cancel": "Cancelar"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/QuickTag/lang/eu.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/QuickTag/lang/eu.js
deleted file mode 100644
index 1021bf7..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/QuickTag/lang/eu.js
+++ /dev/null
@@ -1,13 +0,0 @@
-// I18N constants
-// LANG: "eu", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Cancel": "Utzi"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/QuickTag/lang/fa.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/QuickTag/lang/fa.js
deleted file mode 100644
index fd57189..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/QuickTag/lang/fa.js
+++ /dev/null
@@ -1,13 +0,0 @@
-// I18N constants
-// LANG: "fa", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Cancel": "انصراف"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/QuickTag/lang/fi.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/QuickTag/lang/fi.js
deleted file mode 100644
index 0233ac0..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/QuickTag/lang/fi.js
+++ /dev/null
@@ -1,13 +0,0 @@
-// I18N constants
-// LANG: "fi", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Cancel": "Peruuta"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/QuickTag/lang/fr.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/QuickTag/lang/fr.js
deleted file mode 100644
index e075279..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/QuickTag/lang/fr.js
+++ /dev/null
@@ -1,24 +0,0 @@
-// I18N constants
-// LANG: "fr", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "ATTRIBUTES": "ATTRIBUTS",
-    "Cancel": "Annuler",
-    "Colors": "Couleurs",
-    "Enter the TAG you want to insert": "Entrez la balise que vous voulez insérer",
-    "No CSS class avaiable": "Pas de classe CSS accessible",
-    "OPTIONS": "OPTIONS",
-    "Ok": "OK",
-    "Quick Tag Editor": "Editeur rapide de balise",
-    "TAGs": "Balises",
-    "There are some unclosed quote": "Il y a des apostrophes mal fermées",
-    "This attribute already exists in the TAG": "Cet attribute existe déjà sur cette balise",
-    "You have to select some text": "Vous devez sélectionner du texte"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/QuickTag/lang/he.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/QuickTag/lang/he.js
deleted file mode 100644
index f65ddc7..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/QuickTag/lang/he.js
+++ /dev/null
@@ -1,13 +0,0 @@
-// I18N constants
-// LANG: "he", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Cancel": "ביטול"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/QuickTag/lang/hu.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/QuickTag/lang/hu.js
deleted file mode 100644
index 58d5664..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/QuickTag/lang/hu.js
+++ /dev/null
@@ -1,13 +0,0 @@
-// I18N constants
-// LANG: "hu", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Cancel": "Mégsem"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/QuickTag/lang/it.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/QuickTag/lang/it.js
deleted file mode 100644
index 2aba43a..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/QuickTag/lang/it.js
+++ /dev/null
@@ -1,13 +0,0 @@
-// I18N constants
-// LANG: "it", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Cancel": "Annullamento"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/QuickTag/lang/ja.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/QuickTag/lang/ja.js
deleted file mode 100644
index 499086c..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/QuickTag/lang/ja.js
+++ /dev/null
@@ -1,24 +0,0 @@
-// I18N constants
-// LANG: "ja", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "ATTRIBUTES": "属性",
-    "Cancel": "中止",
-    "Colors": "色",
-    "Enter the TAG you want to insert": "挿入したいタグを入力",
-    "No CSS class avaiable": "CSSクラスがありません",
-    "OPTIONS": "選択肢",
-    "Ok": "OK",
-    "Quick Tag Editor": "クイックタグエディタ",
-    "TAGs": "タグ",
-    "There are some unclosed quote": "閉じていない引用符があります",
-    "This attribute already exists in the TAG": "タグにはすでに同じ属性があります",
-    "You have to select some text": "テキストを選択しなければなりません"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/QuickTag/lang/lc_base.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/QuickTag/lang/lc_base.js
deleted file mode 100644
index 06672f9..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/QuickTag/lang/lc_base.js
+++ /dev/null
@@ -1,37 +0,0 @@
-// I18N constants
-//
-// LANG: "en", ENCODING: UTF-8
-// Author: Translator-Name, <email@example.com>
-//
-// Last revision: 2018-04-12
-// 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).
-//
-// (Please, remove information below)
-// 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.)
-
-{
-    "',\r\n                           'cl': '": "",
-    "ATTRIBUTES": "",
-    "Cancel": "",
-    "Colors": "",
-    "Enter the TAG you want to insert": "",
-    "No CSS class avaiable": "",
-    "OPTIONS": "",
-    "Ok": "",
-    "Quick Tag Editor": "",
-    "TAGs": "",
-    "There are some unclosed quote": "",
-    "This attribute already exists in the TAG": "",
-    "You have to select some text": ""
-}
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/QuickTag/lang/lt.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/QuickTag/lang/lt.js
deleted file mode 100644
index dbbc674..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/QuickTag/lang/lt.js
+++ /dev/null
@@ -1,13 +0,0 @@
-// I18N constants
-// LANG: "lt", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Cancel": "Atšaukti"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/QuickTag/lang/lv.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/QuickTag/lang/lv.js
deleted file mode 100644
index 0bc68d5..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/QuickTag/lang/lv.js
+++ /dev/null
@@ -1,13 +0,0 @@
-// I18N constants
-// LANG: "lv", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Cancel": "Atcelt"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/QuickTag/lang/nb.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/QuickTag/lang/nb.js
deleted file mode 100644
index e1f5a04..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/QuickTag/lang/nb.js
+++ /dev/null
@@ -1,24 +0,0 @@
-// I18N constants
-// LANG: "nb", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "ATTRIBUTES": "ATTRIBUTTER",
-    "Cancel": "Avbryt",
-    "Colors": "Farger",
-    "Enter the TAG you want to insert": "Skriv inn taggen du vil ønsker å sette inn",
-    "No CSS class avaiable": "Ingen CSS klasse tilgjengelig",
-    "OPTIONS": "EGENSKAPER",
-    "Ok": "OK",
-    "Quick Tag Editor": "Kjapp TAGG-Editor",
-    "TAGs": "TAGGer",
-    "There are some unclosed quote": "Det mangler et hermetegn",
-    "This attribute already exists in the TAG": "Denne attributten eksisterer allerede i taggen",
-    "You have to select some text": "Du må velge noe tekst"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/QuickTag/lang/nl.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/QuickTag/lang/nl.js
deleted file mode 100644
index 68a4cde..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/QuickTag/lang/nl.js
+++ /dev/null
@@ -1,24 +0,0 @@
-// I18N constants
-// LANG: "nl", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "ATTRIBUTES": "ATTRIBUTEN",
-    "Cancel": "Annuleren",
-    "Colors": "Kleuren",
-    "Enter the TAG you want to insert": "Voer de Tag naam in",
-    "No CSS class avaiable": "Geen CSS class beschikbaar",
-    "OPTIONS": "OPTIES",
-    "Ok": "Ok",
-    "Quick Tag Editor": "Quick Tag Editor",
-    "TAGs": "TAGs",
-    "There are some unclosed quote": "Er zijn niet gesloten quotes",
-    "This attribute already exists in the TAG": "Dit attribuut bestaat al in de tag",
-    "You have to select some text": "Selecteer tekst"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/QuickTag/lang/pl.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/QuickTag/lang/pl.js
deleted file mode 100644
index 92b33af..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/QuickTag/lang/pl.js
+++ /dev/null
@@ -1,24 +0,0 @@
-// I18N constants
-// LANG: "pl", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "ATTRIBUTES": "ATRYBUTY",
-    "Cancel": "Anuluj",
-    "Colors": "Kolory",
-    "Enter the TAG you want to insert": "Podaj TAG, który chcesz wstawić",
-    "No CSS class avaiable": "Brak dostępnych klas CSS",
-    "OPTIONS": "OPCJE",
-    "Ok": "Ok",
-    "Quick Tag Editor": "Edytor Quick Tag",
-    "TAGs": "TAGi",
-    "There are some unclosed quote": "Są jakieś niezamknięte cudzysłowia",
-    "This attribute already exists in the TAG": "TAG posiada już ten atrybut",
-    "You have to select some text": "Musisz zaznaczyć tekst."
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/QuickTag/lang/pt_br.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/QuickTag/lang/pt_br.js
deleted file mode 100644
index db4fdf1..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/QuickTag/lang/pt_br.js
+++ /dev/null
@@ -1,24 +0,0 @@
-// I18N constants
-// LANG: "pt_br", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "ATTRIBUTES": "ATRIBUTOS",
-    "Cancel": "Cancelar",
-    "Colors": "Cores",
-    "Enter the TAG you want to insert": "Entre com a TAG que deseja inserir",
-    "No CSS class avaiable": "Não há classes CSS disponível",
-    "OPTIONS": "OPÇÕES",
-    "Ok": "Ok",
-    "Quick Tag Editor": "Editor Rápido",
-    "TAGs": "TAGs",
-    "There are some unclosed quote": "Há uma ou mais aspas sem fechamento",
-    "This attribute already exists in the TAG": "Esse atributo já existe na TAG",
-    "You have to select some text": "É preciso selecionar algum texto"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/QuickTag/lang/ro.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/QuickTag/lang/ro.js
deleted file mode 100644
index 4c4e19f..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/QuickTag/lang/ro.js
+++ /dev/null
@@ -1,13 +0,0 @@
-// I18N constants
-// LANG: "ro", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Cancel": "Renunţă"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/QuickTag/lang/ru.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/QuickTag/lang/ru.js
deleted file mode 100644
index f569cfd..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/QuickTag/lang/ru.js
+++ /dev/null
@@ -1,13 +0,0 @@
-// I18N constants
-// LANG: "ru", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Cancel": "Отмена"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/QuickTag/lang/sh.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/QuickTag/lang/sh.js
deleted file mode 100644
index 603b0c4..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/QuickTag/lang/sh.js
+++ /dev/null
@@ -1,13 +0,0 @@
-// I18N constants
-// LANG: "sh", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Cancel": "Poništi"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/QuickTag/lang/si.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/QuickTag/lang/si.js
deleted file mode 100644
index 103d160..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/QuickTag/lang/si.js
+++ /dev/null
@@ -1,13 +0,0 @@
-// I18N constants
-// LANG: "si", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Cancel": "Prekliči"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/QuickTag/lang/sr.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/QuickTag/lang/sr.js
deleted file mode 100644
index 8d966e6..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/QuickTag/lang/sr.js
+++ /dev/null
@@ -1,13 +0,0 @@
-// I18N constants
-// LANG: "sr", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Cancel": "Поништи"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/QuickTag/lang/sv.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/QuickTag/lang/sv.js
deleted file mode 100644
index 18b6397..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/QuickTag/lang/sv.js
+++ /dev/null
@@ -1,13 +0,0 @@
-// I18N constants
-// LANG: "sv", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Cancel": "Avbryt"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/QuickTag/lang/th.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/QuickTag/lang/th.js
deleted file mode 100644
index bd36b85..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/QuickTag/lang/th.js
+++ /dev/null
@@ -1,13 +0,0 @@
-// I18N constants
-// LANG: "th", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Cancel": "ยกเลิก"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/QuickTag/lang/tr.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/QuickTag/lang/tr.js
deleted file mode 100644
index 163623d..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/QuickTag/lang/tr.js
+++ /dev/null
@@ -1,13 +0,0 @@
-// I18N constants
-// LANG: "tr", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Cancel": "İptal"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/QuickTag/lang/vn.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/QuickTag/lang/vn.js
deleted file mode 100644
index ec2d779..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/QuickTag/lang/vn.js
+++ /dev/null
@@ -1,13 +0,0 @@
-// I18N constants
-// LANG: "vn", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Cancel": "Hủy"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/QuickTag/popups/quicktag.html b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/QuickTag/popups/quicktag.html
deleted file mode 100644
index 48cc170..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/QuickTag/popups/quicktag.html
+++ /dev/null
@@ -1,354 +0,0 @@
-<html>
-<head>
-<title>Quick Tag Editor</title>
-<script type="text/javascript" src="../tag-lib.js"></script>
-<script type="text/javascript" src="../../../popups/popup.js"></script>
-<script type="text/javascript">
-
-window.resizeTo(400, 180);
-var QuickTag = window.opener.QuickTag;
-var curTag = 'none';
-var curTagOpt = false;
-var CSSEdit = false;
-var editor = null;
-
-function Init() {
-  __dlg_translate("QuickTag");
-  __dlg_init();
-
-  var param = window.dialogArguments;
-  editor = param['editor'];
-  var selectext = param['selectedText']; // sem uso...
-
-  createDropdown("tags");
-
-  var to = document.getElementById('tagopen');
-  if (document.all) 
-    to.attachEvent("onkeypress", function(e) { choice_dropdown(e) });
-  else 
-    to.addEventListener("keypress", function(e) { choice_dropdown(e) }, true);
-  to.focus();
-
-  document.getElementById('bt_colors').style.display = 'none';
-  document.body.onkeypress = __dlg_key_press;
-}
-
-function onCancel() {
-  __dlg_close(null);
-  return false;
-}
-
-function quoteTest(val) {
-  var er = /^\w+\s*(\w+=\"[^\"]*\"\s*|\w+=\'[^\']*\'\s*)*$/;
-  return er.test(val);
-}
-
-function onOK() {
-  var el = document.getElementById('tagopen');
-  if(!el.value) {
-  alert(HTMLArea._lc("Enter the TAG you want to insert", "QuickTag"));
-  el.focus();
-  return false;
-  }
-  if(!quoteTest(el.value)) {
-    alert(HTMLArea._lc("There are some unclosed quote", "QuickTag"));
-    el.focus();
-    el.select();
-    return false;
-  }
-  var param = {};
-  var cleanTO = document.getElementById('tagopen').value.replace(/(<|>)/g,"");
-  param.tagopen = "<"+cleanTO+">";
-  param.tagclose = param.tagopen.replace(/^<(\w+) ?.*>/,"</$1>");
-
-  var subtag = subTagLib[curTag];
-  if(typeof subtag == 'object') {
-    param.tagopen = param.tagopen+subtag.op;
-    param.tagclose = subtag.cl+param.tagclose;
-  }
-
-  __dlg_close(param);
-  return false;
-}
-
-function __dlg_key_press(ev) {
-  ev || (ev = window.event);
-  switch(ev.keyCode) {
-    case 13:
-    document.getElementById('bt_ok').click();
-      break;
-    case 27:
-    __dlg_close();
-    return false;
-  }
-  return true;
-}
-
-function selchange() {
-  var toadd = document.getElementById('selectag').value;
-  var oldval = document.getElementById('tagopen').value;
-  var text = (oldval+toadd).replace(/^\s*(.+)\s*$/,"$1");
-  var atrib = /(\w+)=\"$/.test(toadd) ? toadd.replace(/(\w+)=\"$/, "$1") : null;
-  var showcolors = (/color\: ?$/.test(toadd)) ? true : false;
-  var noCSSclasses = false;
-  var obj = null;
-  curTag = text.replace(/(^\w+) ?.*$/, "$1");
-  curTagOpt = (tagLib[curTag] == true);
-
-  if(atrib) {
-    var atrer = eval('/'+atrib+'=/ig');
-    if(atrer.test(oldval) && !(/[^=]\"$/.test(toadd))) {
-      alert(HTMLArea._lc("This attribute already exists in the TAG", "QuickTag"));
-      return false;
-    }
-
-    switch(atrib) {
-    case 'style':
-      CSSEdit = true;
-      break;
-    case 'class':
-      if(captureClasses() == 0) noCSSclasses = true;
-      break;
-    case 'color': case 'bgcolor': case 'bordercolor':
-    case 'bordercolorlight': case 'bordercolordark':
-      showcolors = true;
-      break;
-    }
-
-    if(curTagOpt == true)
-      obj = eval('opAtt_'+curTag+'["'+atrib+'"]');
-    else
-      obj = opAtt_all[atrib];
-  }
-  else if(!CSSEdit && (/(^\w+$|\"$)/.test(toadd))) {
-    obj = 'all';
-    if(curTagOpt == true) obj = curTag;
-    toadd += ' ';
-  }
-
-  if(CSSEdit && quoteTest(text))
-    CSSEdit = false;
-
-  if(showcolors)
-    document.getElementById('bt_colors').style.display = '';
-
-  if(obj)
-    createDropdown(obj);
-  else if(!CSSEdit)
-    document.getElementById('showselect').style.visibility = 'hidden';
-
-  if(noCSSclasses) {
-    document.getElementById('showselect').innerHTML = HTMLArea._lc("No CSS class avaiable", "QuickTag");
-    document.getElementById('showselect').style.visibility = 'visible';
-  }
-
-  addchanges();
-
-  function addchanges() {
-    document.getElementById('tagopen').focus();
-    document.getElementById('tagopen').value += toadd;
-  }
-}
-
-function captureClasses() {
-  var cont = 0;
-  // If there is no '<HTML>' in the HTMLArea content, when using
-  // styleSheets[..].rule, IE generates an error.
-  // In this case, we lost the classes in external CSS files.
-  // If FullPage is loaded, there is no problem.
-  if(!(/<\s*html\s*>/i.test(editor.getHTML())) && document.all) {
-    var styles = editor._doc.getElementsByTagName("style");
-    for(var i in styles) {
-      var cont = styles[i].innerHTML;
-      if(typeof cont != 'undefined') {
-        var cls = cont.match(/\.\w+/ig,"");
-        for(j in cls) if(/^\.\w+$/.test(cls[j])) {
-          var classname = cls[j].replace(/\./,"")+'"';
-          opAtt_all['class'][cls[j]] = classname;
-          cont++;
-        }
-      }
-    }
-    return cont;
-  }
-
-  var styleSheet = null;
-  var styles = editor._doc.styleSheets;
-
-  for (var i = 0; i < styles.length; i++) {
-    styleSheet = styles[i];
-    if(document.all)
-      var _rules = styleSheet.rules;
-    else
-      var _rules = styleSheet.cssRules;
-    for (var j = 0; j < _rules.length; j++) {
-      rule = _rules[j];
-      if(/^\.\w+$/.test(rule.selectorText)) {
-        var classname = rule.selectorText.replace(/\./,"")+'"';
-        opAtt_all['class'][rule.selectorText] = classname;
-        cont++;
-      }
-    }
-  }
-  return cont;
-}
-
-function choice_dropdown(e) {
-  if (document.all) Key = e.keyCode;
-  else Key = e.charCode;
-
-  if(Key != 32) return;
-
-  var text = document.getElementById('tagopen').value.replace(/^\s*([^\s]+)\s*$/,"$1");
-
-  if(CSSEdit && quoteTest(text)) CSSEdit = false;
-  if(CSSEdit) return;
-
-  if(curTag == 'none') {
-    curTag = text.replace(/(^\w+) ?.*$/, "$1");
-    curTagOpt = tagLib[curTag];
-  }
-
-  if(!/\w/.test(text)) {
-    document.getElementById('tagopen').value = '';
-    createDropdown("tags");
-    return;
-  }
-
-  var att = 'all';
-  if(curTagOpt == true)
-    att = curTag;
-
-  createDropdown(att);
-}
-
-function createDropdown(type) {
-  var _div = document.getElementById('showselect');
-  while(_div.hasChildNodes())
-    _div.removeChild(_div.firstChild);
-  _div.style.visibility = 'visible';
-
-  var _sel = document.createElement("select");
-  _sel.id = "selectag";
-  _sel.onchange = function() { selchange(); };
-
-  if(typeof type == 'object') {
-    var obj = type;
-    forObj(HTMLArea._lc("OPTIONS", "QuickTag"));
-    _div.appendChild(_sel);
-    return;
-  }
-
-  if(type == 'tags') {
-    var obj = allTags;
-    forObj(HTMLArea._lc("TAGs", "QuickTag"));
-    _div.appendChild(_sel);
-    return;
-  }
-
-  type = type.replace(/^h[1-6]$/,"h");
-  var topt = eval('opTag_'+type);
-  if(typeof topt == 'object') 
-    var obj = topt;
-  else 
-    return;
-
-  forObj(HTMLArea._lc("ATTRIBUTES", "QuickTag"));
-  _div.appendChild(_sel);
-
-  function forObj(first) {
-    if(first) {
-      var _op = document.createElement("option");
-      _op.appendChild(document.createTextNode(first));
-      _sel.appendChild(_op);
-    }
-    for(i in obj) {
-      var opt = document.createElement("option");
-      opt.appendChild(document.createTextNode(i));
-      opt.value = obj[i];
-      _sel.appendChild(opt);
-    }
-  }
-}
-
-function colors() {
-  var colloc = window.location.toString().replace(/plugins.+$/,"") +
-               "popups/select_color.html";
-  window.open(colloc, 'colors', "toolbar=no,location=no,directories=no," +
-              "status=no,menubar=no,scrollbars=no,resizable=no,width=240,height=182");
-}
-
-// simulation of Dialog._return - select_color.html needs it.
-var Dialog = new Object();
-Dialog._return = function (val) {
-  if(val != null) {
-    if(CSSEdit)
-      val += '; ';
-    else
-      val += '"';
-    document.getElementById('tagopen').focus();
-    document.getElementById('tagopen').value += "#"+val;
-    document.getElementById('bt_colors').style.display = 'none';
-  }
-};
-</script>
-<style type="text/css">
-html, body {
-background: ButtonFace;
-color: ButtonText;
-font: 11px Tahoma,Verdana,sans-serif;
-margin: 0px;
-padding: 0px;
-border-width: 0px;
-}
-body { padding: 5px; }
-table { font: 11px Tahoma,Verdana,sans-serif; }
-select, input, button { font: 11px Tahoma,Verdana,sans-serif; }
-button { width: 70px; }
-.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;
-}
-.buttons {
-border-top: 1px solid #999;
-padding: 5px;
-text-align: right;
-height: 20px;
-}
-form { padding: 0px; margin: 0px; }
-</style>
-</head>
-  <body class="dialog" onload="Init()">
-<form action="" method="get">
-  <div class="title" style="width: 360px">Quick Tag Editor</div>
-  <div style="text-align: center;">
-  <table border="0" width="370">
-    <tbody>
-      <tr>
-        <td colspan="2" style="text-align: center;" style="padding: 3px; background-color: #e9e9e9;">
-        <strong style="font-size: 14px">&lt;</strong>
-        <input id="tagopen" type="text" style="background-color: #e9e9e9; width: 327px; border-width: 0px;">
-        <strong style="font-size: 14px">&gt;</strong>
-        </td>
-      </tr>
-    </tbody>
-  </table>
-  </div>
-<div class="space"></div>
-<div class="buttons">
-<button type="button" id="bt_colors" onclick="colors();">Colors</button>
-<button type="button" id="bt_ok" onclick="return onOK();">Ok</button>
-<button type="button" onclick="return onCancel();">Cancel</button>
-</div>
-<div id="showselect" style="position:absolute; left:7px; top:75px; width:150px; z-index:100; visibility: visible; height: 13px; color: red;">
-</div>
-</form>
-</body>
-</html>
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/QuickTag/tag-lib.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/QuickTag/tag-lib.js
deleted file mode 100644
index 27cdb10..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/QuickTag/tag-lib.js
+++ /dev/null
@@ -1,356 +0,0 @@
-/*

-  TAG Library for QuickTag Plugin  

-  -------------------------------

-  

-  allTags = All tags that appears in the first dropdown ('TAGS') {'caption': 'value'}  

-  tagLib = The tags with options (just to check if current TAG have options) {'[TAG]': true}

-  subTagLib = Complements for some tags that needs it (TABLE) 

-    {'[TAG]': {'op': 'after tag open', 'cl': 'before tag close'}}

-  opTag_all = Common attributes to all TAGS {'caption': 'value'}  

-  opAtt_all = Options for the common attributes {'attribute': {'caption': 'value'}}

-  opTag_[TAG] = Attributes for [TAG] {'caption': 'value'}

-  opAtt_[TAG] = Options for the [TAG] attributes {'attribute': {'caption': 'value'}}

-  

-*/

-

-var allTags = {

-'a': 'a',

-'a (full)': 'a href="" target=""',

-'address': 'address',

-'b': 'b',

-'big': 'big',

-'blockquote': 'blockquote',

-'code': 'code',

-'div': 'div',

-'em': 'em',

-'fieldset': 'fieldset',

-'font': 'font',

-'font (full)': 'font face="" size="" color=""',

-'h1': 'h1',

-'h2': 'h2',

-'h3': 'h3',

-'h4': 'h4',

-'h5': 'h5',

-'h6': 'h6',

-'i': 'i',

-'legend': 'legend',

-'li': 'li',

-'ol': 'ol',

-'ul': 'ul',

-'p': 'p',

-'pre': 'pre',

-'small': 'small',

-'span': 'span',

-'strong': 'strong',

-'sub': 'sub',

-'sup': 'sup',

-'table': 'table'

-};

-

-// tags with options

-var tagLib =  {

-'a': true, 

-'div': true, 

-'font': true, 

-'h1': true,

-'h2': true,

-'h3': true,

-'h4': true,

-'h5': true,

-'h6': true,

-'p': true,

-'table': true

-};

-// tags that needs some complement               v-- Avoid lc_parse_strings.php

-var subTagLib = {'table': {'op': '<tbody><tr><td'+'>',

-                           'cl': '</td></tr></tbody>'}

-};

-

-var opTag_a = {

-'href': 'href="',

-'name': 'name="',

-'target': 'target="'

-};

-var opAtt_a = {

-'href': {'http://': 'http://',

-         'https://': 'https://',

-         'ftp://': 'ftp://',

-         'mailto:': 'mailto:',

-         '#': '#"'},

-'target': {'_top': '_top"',

-           '_self': '_self"',

-           '_parent': '_parent"',

-           '_blank': '_blank"'}

-};

-

-var opTag_font = {

-'face': 'face="',

-'size': 'size="',

-'color': 'color="'

-};

-var opAtt_font = {

-'face': {'Verdana': 'Verdana"',

-         'Arial': 'Arial"',

-         'Tahoma': 'Tahoma"',

-         'Courier New': 'Courier New"',

-         'Times New Roman': 'Times New Roman"'},

-'size': {'1': '1"','2': '2"','3': '3"','4': '4"','5': '5"','6': '6"',

-         '+1': '+1"','+2': '+2"','+3': '+3"','+4': '+4"','+5': '+5"','+6': '+6"',

-         '-1': '-1"','-2': '-2"','-3': '-3"','-4': '-4"','-5': '-5"','-6': '-6"'}

-};

-

-var opTag_div = {

-'align': 'align="'

-};

-var opAtt_div = {

-'align': {'center': 'center"',

-          'left': 'left"',

-          'right': 'right"',

-          'justify': 'justify"'}

-};

-

-var opTag_h = {

-'align': 'align="'

-};

-var opAtt_h = {

-'align': {'center': 'center"',

-          'left': 'left"',

-          'right': 'right"',

-          'justify': 'justify"'}

-};

-

-var opTag_p = {

-'align': 'align="'

-};

-var opAtt_p = {

-'align': {'center': 'center"',

-          'left': 'left"',

-          'right': 'right"',

-          'justify': 'justify"'}

-};

-

-var opTag_table = {

-'align': 'align="',

-'width': 'width="',

-'height': 'height="',

-'cellpadding': 'cellpadding="',

-'cellspacing': 'cellspacing="',

-'background': 'background="',

-'bgcolor': 'bgcolor="',

-'border': 'border="',

-'bordercolor': 'bordercolor="',

-'bordercolorlight': 'bordercolorlight="',

-'bordercolordark': 'bordercolordark="'

-};

-var opAtt_table = {

-'align': {'center': 'center"',

-          'left': 'left"',

-          'right': 'right"'}

-};

-

-// for all tags 

-var opTag_all = {

-'class': 'class="',

-'dir': 'dir="',

-'id': 'id="',

-'lang': 'lang="',

-'onFocus': 'onFocus="',

-'onBlur': 'onBlur="',

-'onClick': 'onClick="',

-'onDblClick': 'onDblClick="',

-'onMouseDown': 'onMouseDown="',

-'onMouseUp': 'onMouseUp="',

-'onMouseOver': 'onMouseOver="',

-'onMouseMove': 'onMouseMove="',

-'onMouseOut': 'onMouseOut="',

-'onKeyPress': 'onKeyPress="',

-'onKeyDown': 'onKeyDown="',

-'onKeyUp': 'onKeyUp="',

-'style': 'style="',

-'title': 'title='+'"' // //  <-- Avoid lc_parse_strings.php

-};

-var opAtt_all = {

-'class': {},

-'dir': {'rtl': 'rtl"','ltr': 'ltr"'},

-'lang': {'Afrikaans ': 'af"',

-         'Albanian ': 'sq"',

-         'Arabic ': 'ar"',

-         'Basque ': 'eu"',

-         'Breton ': 'br"',

-         'Bulgarian ': 'bg"',

-         'Belarusian ': 'be"',

-         'Catalan ': 'ca"',

-         'Chinese ': 'zh"',

-         'Croatian ': 'hr"',

-         'Czech ': 'cs"',

-         'Danish ': 'da"',

-         'Dutch ': 'nl"',

-         'English ': 'en"',

-         'Estonian ': 'et"',

-         'Faeroese ': 'fo"',

-         'Farsi ': 'fa"',

-         'Finnish ': 'fi"',

-         'French ': 'fr"',

-         'Gaelic ': 'gd"',

-         'German ': 'de"',

-         'Greek ': 'el"',

-         'Hebrew ': 'he"',

-         'Hindi ': 'hi"',

-         'Hungarian ': 'hu"',

-         'Icelandic ': 'is"',

-         'Indonesian ': 'id"',

-         'Italian ': 'it"',

-         'Japanese ': 'ja"',

-         'Korean ': 'ko"',

-         'Latvian ': 'lv"',

-         'Lithuanian ': 'lt"',

-         'Macedonian ': 'mk"',

-         'Malaysian ': 'ms"',

-         'Maltese ': 'mt"',

-         'Norwegian ': 'no"',

-         'Polish ': 'pl"',

-         'Portuguese ': 'pt"',

-         'Rhaeto-Romanic ': 'rm"',

-         'Romanian ': 'ro"',

-         'Russian ': 'ru"',

-         'Sami ': 'sz"',

-         'Serbian ': 'sr"',

-         'Setswana ': 'tn"',

-         'Slovak ': 'sk"',

-         'Slovenian ': 'sl"',

-         'Spanish ': 'es"',

-         'Sutu ': 'sx"',

-         'Swedish ': 'sv"',

-         'Thai ': 'th"',

-         'Tsonga ': 'ts"',

-         'Turkish ': 'tr"',

-         'Ukrainian ': 'uk"',

-         'Urdu ': 'ur"',

-         'Vietnamese ': 'vi"',

-         'Xhosa ': 'xh"',

-         'Yiddish ': 'yi"',

-         'Zulu': 'zu"'},

-'style': {'azimuth': 'azimuth: ',

-          'background': 'background: ',

-          'background-attachment': 'background-attachment: ',

-          'background-color': 'background-color: ',

-          'background-image': 'background-image: ',

-          'background-position': 'background-position: ',

-          'background-repeat': 'background-repeat: ',

-          'border': 'border: ',

-          'border-bottom': 'border-bottom: ',

-          'border-left': 'border-left: ',

-          'border-right': 'border-right: ',

-          'border-top': 'border-top: ',

-          'border-bottom-color': 'border-bottom-color: ',

-          'border-left-color': 'border-left-color: ',

-          'border-right-color': 'border-right-color: ',

-          'border-top-color': 'border-top-color: ',

-          'border-bottom-style': 'border-bottom-style: ',

-          'border-left-style': 'border-left-style: ',

-          'border-right-style': 'border-right-style: ',

-          'border-top-style': 'border-top-style: ',

-          'border-bottom-width': 'border-bottom-width: ',

-          'border-left-width': 'border-left-width: ',

-          'border-right-width': 'border-right-width: ',

-          'border-top-width': 'border-top-width: ',

-          'border-collapse': 'border-collapse: ',

-          'border-color': 'border-color: ',

-          'border-style': 'border-style: ',

-          'border-width': 'border-width: ',

-          'bottom': 'bottom: ',

-          'caption-side': 'caption-side: ',

-          'cell-spacing': 'cell-spacing: ',

-          'clear': 'clear: ',

-          'clip': 'clip: ',

-          'color': 'color: ',

-          'column-span': 'column-span: ',

-          'content': 'content: ',

-          'cue': 'cue: ',

-          'cue-after': 'cue-after: ',

-          'cue-before': 'cue-before: ',

-          'cursor': 'cursor: ',

-          'direction': 'direction: ',

-          'display': 'display: ',

-          'elevation': 'elevation: ',

-          'filter': 'filter: ',

-          'float': 'float: ',

-          'font-family': 'font-family: ',

-          'font-size': 'font-size: ',

-          'font-size-adjust': 'font-size-adjust: ',

-          'font-style': 'font-style: ',

-          'font-variant': 'font-variant: ',

-          'font-weight': 'font-weight: ',

-          'height': 'height: ',

-          '!important': '!important: ',

-          'left': 'left: ',

-          'letter-spacing': 'letter-spacing: ',

-          'line-height': 'line-height: ',

-          'list-style': 'list-style: ',

-          'list-style-image': 'list-style-image: ',

-          'list-style-position': 'list-style-position: ',

-          'list-style-type': 'list-style-type: ',

-          'margin': 'margin: ',

-          'margin-bottom': 'margin-bottom: ',

-          'margin-left': 'margin-left: ',

-          'margin-right': 'margin-right: ',

-          'margin-top': 'margin-top: ',

-          'marks': 'marks: ',

-          'max-height': 'max-height: ',

-          'min-height': 'min-height: ',

-          'max-width': 'max-width: ',

-          'min-width': 'min-width: ',

-          'orphans': 'orphans: ',

-          'overflow': 'overflow: ',

-          'padding': 'padding: ',

-          'padding-bottom': 'padding-bottom: ',

-          'padding-left': 'padding-left: ',

-          'padding-right': 'padding-right: ',

-          'padding-top': 'padding-top: ',

-          'page-break-after': 'page-break-after: ',

-          'page-break-before': 'page-break-before: ',

-          'pause': 'pause: ',

-          'pause-after': 'pause-after: ',

-          'pause-before': 'pause-before: ',

-          'pitch': 'pitch: ',

-          'pitch-range': 'pitch-range: ',

-          'play-during': 'play-during: ',

-          'position': 'position: ',

-          'richness': 'richness: ',

-          'right': 'right: ',

-          'row-span': 'row-span: ',

-          'size': 'size: ',

-          'speak': 'speak: ',

-          'speak-date': 'speak-date: ',

-          'speak-header': 'speak-header: ',

-          'speak-numeral': 'speak-numeral: ',

-          'speak-punctuation': 'speak-punctuation: ',

-          'speak-time': 'speak-time: ',

-          'speech-rate': 'speech-rate: ',

-          'stress': 'stress: ',

-          'table-layout': 'table-layout: ',

-          'text-align': 'text-align: ',

-          'text-decoration': 'text-decoration: ',

-          'text-indent': 'text-indent: ',

-          'text-shadow': 'text-shadow: ',

-          'text-transform': 'text-transform: ',

-          'top': 'top: ',

-          'vertical-align': 'vertical-align: ',

-          'visibility': 'visibility: ',

-          'voice-family': 'voice-family: ',

-          'volume': 'volume: ',

-          'white-space': 'white-space: ',

-          'widows': 'widows: ',

-          'width': 'width: ',

-          'word-spacing': 'word-spacing: ',

-          'z-index': 'z-index: ' }

-};

-

-// add the common items to all objects

-for(var i in tagLib) {

-i = i.replace(/^h[1-6]$/,"h"); // h1 .. h6

-  for(var j in opTag_all)

-    eval('opTag_'+i+'["'+j+'"] = opTag_all["'+j+'"];');

-  for(var j in opAtt_all)

-    eval('opAtt_'+i+'["'+j+'"] = opAtt_all["'+j+'"];');

-}
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/SaveOnBlur/SaveOnBlur.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/SaveOnBlur/SaveOnBlur.js
deleted file mode 100644
index 8ca5679..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/SaveOnBlur/SaveOnBlur.js
+++ /dev/null
@@ -1,47 +0,0 @@
-/** Save the content of the editor to the text area when blurring (losing focus).
- *
- * @author Peter Siewert 
- * @see Ticket #1433
- */
- 
-SaveOnBlur._pluginInfo = {
-  name:"SaveOnBlur",
-  version:"1.0",
-  developer:"Peter Siewert",
-  developer_url:"http://xinha.org",
-  sponsor:"",
-  sponsor_url:"",
-  license:"htmlArea"
-};
-
-function SaveOnBlur(editor){
-  this.editor=editor;
-}
-
-SaveOnBlur.prototype.onKeyPress=function(){
-  this.queue_xinha_update_textarea();
-  return false;
-};
-
-SaveOnBlur.prototype.onMouseDown=function(){
-  this.queue_xinha_update_textarea();
-  return false;
-};
-
-SaveOnBlur.prototype.queue_xinha_update_textarea = function()
-{
-  var blurry = this;
-  
-  if(!this._attach_blur)
-  {
-  
-    Xinha._addEvent(this.editor._iframe, 'blur', function(){ blurry.xinha_update_textarea(); }); // IE
-    Xinha._addEvent(this.editor._doc, 'blur',    function(){ blurry.xinha_update_textarea(); }); // GECKO
-    this._attach_blur = 1;
-  }
-}
-
-SaveOnBlur.prototype.xinha_update_textarea = function()
-{
-  this.editor._textArea.value=this.editor.outwardHtml(this.editor.getHTML());
-}
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/SaveSubmit/README.txt b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/SaveSubmit/README.txt
deleted file mode 100644
index 22a71d8..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/SaveSubmit/README.txt
+++ /dev/null
@@ -1,15 +0,0 @@
-SaveSubmit for Xinha
-
-developed by Raimund Meyer (ray) xinha @ raimundmeyer.de
-
-Registers a button for submiting the Xinha form using asynchronous
-postback for sending the data to the server
-
-Usage: This should be a drop-in replacement for a normal submit button.
-While saving a message is displayed to inform the user what's going on.
-On successful transmission the output of the target script is shown, so it should print some information
-about the success of saving.
-
-ATTENTION: The data sent by this method is always UTF-8 encoded, regardless of the actual charset used. So, if you 
-are using a different encoding you have to convert on the server side.
-
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/SaveSubmit/SaveSubmit.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/SaveSubmit/SaveSubmit.js
deleted file mode 100644
index 8bebc6f..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/SaveSubmit/SaveSubmit.js
+++ /dev/null
@@ -1,159 +0,0 @@
-/*------------------------------------------*\
-SaveSubmit for Xinha
-____________________
-
-See README.txt for information
-
-\*------------------------------------------*/
-
-function SaveSubmit(editor) {
-	this.editor = editor;
-	this.changed = false;
-	var self = this;
-	var cfg = editor.config;
-	this.textarea = this.editor._textArea;
-
-	cfg.registerIcon('savesubmitchanged', Xinha.getPluginDir("SaveSubmit")+"/img/ed_save_red.gif");
-	cfg.registerIcon('savesubmitunchanged', Xinha.getPluginDir("SaveSubmit")+"/img/ed_save_green.gif");
-
-	cfg.registerButton({
-	id       : "savesubmit",
-	tooltip  : self._lc("Save"),
-	image    : cfg.iconList.savesubmitunchanged,
-	textMode : false,
-	action   :  function() {
-			self.save();
-		}
-	});
-	cfg.addToolbarElement("savesubmit", "popupeditor", -1);
-}
-
-SaveSubmit.prototype._lc = function(string) {
-    return Xinha._lc(string, 'SaveSubmit');
-}
-
-SaveSubmit._pluginInfo = {
-  name          : "SaveSubmit",
-  version       : "1.0",
-  developer     : "Raimund Meyer",
-  developer_url : "http://x-webservice.net",
-  c_owner       : "Raimund Meyer",
-  sponsor       : "",
-  sponsor_url   : "",
-  license       : "htmlArea"
-}
-
-SaveSubmit.prototype.onKeyPress = function(ev) {
-	if ( ev.ctrlKey && this.editor.getKey(ev) == 's') {
-			this.save(this.editor);
-			Xinha._stopEvent(ev);
-			return true;
-	}
-	else {
-		if (!this.changed) {
-			if (this.getChanged()) this.setChanged();
-			return false;
-		}
-	}
-}
-SaveSubmit.prototype.onExecCommand = function (cmd) {
-	if (this.changed && cmd == 'undo') { 
-		if (this.initial_html == this.editor.getInnerHTML()) this.setUnChanged();
-		return false;
-	}
-}
-SaveSubmit.prototype.onUpdateToolbar = function () {
-  if (!this.initial_html) this.initial_html = this.editor.getInnerHTML();
-	if (!this.changed) {
-		if (this.getChanged()) this.setChanged();
-		return false;
-	}	
-}
-SaveSubmit.prototype.getChanged = function() {
-	if (this.initial_html === null) this.initial_html = this.editor.getInnerHTML();
-	if (this.initial_html != this.editor.getInnerHTML() && this.changed == false) {
-		this.changed = true;
-		return true;
-	}
-	else return false;
-}
-SaveSubmit.prototype.setChanged = function() {
-	this.editor._toolbarObjects.savesubmit.swapImage(this.editor.config.iconList.savesubmitchanged);
-	this.editor.updateToolbar();
-}
-SaveSubmit.prototype.setUnChanged = function() {
-	this.changed = false;
-	this.editor._toolbarObjects.savesubmit.swapImage(this.editor.config.iconList.savesubmitunchanged);
-}
-SaveSubmit.prototype.changedReset = function() {
-	this.initial_html = null;
-	this.setUnChanged();
-}
-
-SaveSubmit.prototype.save =  function() {
-	this.buildMessage();
-	var editor = this.editor;
-	var self =this;
-	var form = editor._textArea.form;
-	form.onsubmit();
-
-	var name, value, content ='';
-	
-	for (var i=0;i<form.elements.length;i++)
-	{
-		if (( form.elements[i].type == 'checkbox' || form.elements[i].type == 'radio' ) && !form.elements[i].checked ) continue;
-
-		content += ((i>0) ? '&' : '') + form.elements[i].name + '=' + encodeURIComponent(form.elements[i].value);
-	}
-	var url = editor._textArea.form.action || window.location.href;
-	Xinha._postback(url, content, function(getback) {
-
-		if (getback) {
-			self.setMessage(getback);
-			//self.setMessage(self._lc("Ready"));
-			self.changedReset();
-		}
-		removeMessage = function() { self.removeMessage()} ;
-		window.setTimeout("removeMessage()",1000);
-	});
-}
-
-SaveSubmit.prototype.setMessage = function(string) {
-  var textarea = this.textarea;
-  if ( !document.getElementById("message_sub_" + textarea.id)) { return ; }
-  var elt = document.getElementById("message_sub_" + textarea.id);
-  elt.innerHTML = Xinha._lc(string, 'SaveSubmit');
-}
-
-SaveSubmit.prototype.removeMessage = function() {
-  var textarea = this.textarea;
-  if (!document.getElementById("message_" + textarea.id)) { return ; }
-  document.body.removeChild(document.getElementById("message_" + textarea.id));
-}
-
-//ripped mokhet's loading message function
-SaveSubmit.prototype.buildMessage   = function() {
-
-	var textarea = this.textarea;
-	var htmlarea = this.editor._htmlArea;
-	var loading_message = document.createElement("div");
-	loading_message.id = "message_" + textarea.id;
-	loading_message.className = "loading";
-	loading_message.style.width    = htmlarea.offsetWidth +'px' ;//(this.editor._iframe.offsetWidth != 0) ? this.editor._iframe.offsetWidth +'px' : this.editor._initial_ta_size.w;
-
-	loading_message.style.left     = Xinha.findPosX(htmlarea) +  'px';
-	loading_message.style.top      = (Xinha.findPosY(htmlarea) + parseInt(htmlarea.offsetHeight) / 2) - 50 +  'px';
-
-	var loading_main = document.createElement("div");
-	loading_main.className = "loading_main";
-	loading_main.id = "loading_main_" + textarea.id;
-	loading_main.appendChild(document.createTextNode(this._lc("Saving...")));
-
-	var loading_sub = document.createElement("div");
-	loading_sub.className = "loading_sub";
-	loading_sub.id = "message_sub_" + textarea.id;
-	loading_sub.appendChild(document.createTextNode(this._lc("in progress")));
-	loading_message.appendChild(loading_main);
-	loading_message.appendChild(loading_sub);
-	document.body.appendChild(loading_message);
-}
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/SaveSubmit/img/ed_save_green.gif b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/SaveSubmit/img/ed_save_green.gif
deleted file mode 100644
index 6804a74..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/SaveSubmit/img/ed_save_green.gif
+++ /dev/null
Binary files differ
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/SaveSubmit/img/ed_save_red.gif b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/SaveSubmit/img/ed_save_red.gif
deleted file mode 100644
index e4289b4..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/SaveSubmit/img/ed_save_red.gif
+++ /dev/null
Binary files differ
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/SaveSubmit/lang/da.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/SaveSubmit/lang/da.js
deleted file mode 100644
index ed56e38..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/SaveSubmit/lang/da.js
+++ /dev/null
@@ -1,13 +0,0 @@
-// I18N constants
-// LANG: "da", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Save": "Gem"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/SaveSubmit/lang/de.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/SaveSubmit/lang/de.js
deleted file mode 100644
index dc8a82d..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/SaveSubmit/lang/de.js
+++ /dev/null
@@ -1,16 +0,0 @@
-// I18N constants
-// LANG: "de", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Ready": "Fertig",
-    "Save": "Speichern",
-    "Saving...": "Speichern...",
-    "in progress": "in Arbeit"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/SaveSubmit/lang/es.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/SaveSubmit/lang/es.js
deleted file mode 100644
index 4f211f9..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/SaveSubmit/lang/es.js
+++ /dev/null
@@ -1,13 +0,0 @@
-// I18N constants
-// LANG: "es", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Save": "Guardar"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/SaveSubmit/lang/fr.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/SaveSubmit/lang/fr.js
deleted file mode 100644
index c8b3197..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/SaveSubmit/lang/fr.js
+++ /dev/null
@@ -1,16 +0,0 @@
-// I18N constants
-// LANG: "fr", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Ready": "Prêt",
-    "Save": "Enregistrer",
-    "Saving...": "Enregistrement...",
-    "in progress": "en cours"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/SaveSubmit/lang/ja.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/SaveSubmit/lang/ja.js
deleted file mode 100644
index e016989..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/SaveSubmit/lang/ja.js
+++ /dev/null
@@ -1,16 +0,0 @@
-// I18N constants
-// LANG: "ja", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Ready": "レディ",
-    "Save": "保存",
-    "Saving...": "保存中...",
-    "in progress": "処理中"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/SaveSubmit/lang/lc_base.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/SaveSubmit/lang/lc_base.js
deleted file mode 100644
index d6b7961..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/SaveSubmit/lang/lc_base.js
+++ /dev/null
@@ -1,28 +0,0 @@
-// I18N constants
-//
-// LANG: "en", ENCODING: UTF-8
-// Author: Translator-Name, <email@example.com>
-//
-// Last revision: 2018-04-12
-// 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).
-//
-// (Please, remove information below)
-// 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.)
-
-{
-    "Ready": "",
-    "Save": "",
-    "Saving...": "",
-    "in progress": ""
-}
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/SaveSubmit/lang/nb.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/SaveSubmit/lang/nb.js
deleted file mode 100644
index 70fa61e..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/SaveSubmit/lang/nb.js
+++ /dev/null
@@ -1,13 +0,0 @@
-// I18N constants
-// LANG: "nb", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Save": "Lagre"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/SaveSubmit/lang/nl.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/SaveSubmit/lang/nl.js
deleted file mode 100644
index d8afa11..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/SaveSubmit/lang/nl.js
+++ /dev/null
@@ -1,16 +0,0 @@
-// I18N constants
-// LANG: "nl", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Ready": "Klaar",
-    "Save": "Opslaan",
-    "Saving...": "Bezig met opslaan...",
-    "in progress": "bezig met opslaan..."
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/SaveSubmit/lang/pl.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/SaveSubmit/lang/pl.js
deleted file mode 100644
index aae6880..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/SaveSubmit/lang/pl.js
+++ /dev/null
@@ -1,13 +0,0 @@
-// I18N constants
-// LANG: "pl", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Save": "Zapisz"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/SaveSubmit/lang/pt_br.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/SaveSubmit/lang/pt_br.js
deleted file mode 100644
index 6347005..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/SaveSubmit/lang/pt_br.js
+++ /dev/null
@@ -1,16 +0,0 @@
-// I18N constants
-// LANG: "pt_br", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Ready": "Pronto",
-    "Save": "Salvar",
-    "Saving...": "Gravando...",
-    "in progress": "em processo"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/SaveSubmit/lang/ru.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/SaveSubmit/lang/ru.js
deleted file mode 100644
index 6f24903..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/SaveSubmit/lang/ru.js
+++ /dev/null
@@ -1,16 +0,0 @@
-// I18N constants
-// LANG: "ru", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Ready": "Готово",
-    "Save": "Сохранить",
-    "Saving...": "Сохранение...",
-    "in progress": "пожалуйста, ждите"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/SetId/SetId.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/SetId/SetId.js
deleted file mode 100644
index 947a33f..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/SetId/SetId.js
+++ /dev/null
@@ -1,88 +0,0 @@
-function SetId(editor) {

-  this.editor = editor;

-  var cfg = editor.config;

-  var self = this;

-

-  // register the toolbar buttons provided by this plugin

-  cfg.registerButton({

-    id       : "setid",

-    tooltip  : this._lc("Set Id and Name"),

-    image    : editor.imgURL("set-id.gif", "SetId"),

-    textMode : false,

-    action   : function(editor) {

-                 self.buttonPress(editor);

-               }

-  });

-  cfg.addToolbarElement("setid", "createlink", 1);

-}

-

-SetId._pluginInfo = {

-  name          : "SetId",

-  version       : "2.0",

-  developer     : "Udo Schmal",

-  developer_url : "http://www.schaffrath-neuemedien.de",

-  c_owner       : "Udo Schmal",

-  sponsor       : "L.N.Schaffrath NeueMedien",

-  sponsor_url   : "http://www.schaffrath-neuemedien.de",

-  license       : "htmlArea"

-};

-

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

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

-};

-

-

-SetId.prototype.onGenerate = function() {

-  this.editor.addEditorStylesheet(Xinha.getPluginDir("SetId") + '/set-id.css');

-};

-

-SetId.prototype.buttonPress = function(editor) {

-  var outparam = null;

-  var html = editor.getSelectedHTML();

-  var sel  = editor._getSelection();

-  var range  = editor._createRange(sel);

-  var node = editor._activeElement(sel);

-  if (node)

-    outparam = { name : node.id };

-  else

-    outparam = { name : '' };

-

-  editor._popupDialog( "plugin://SetId/set_id", function( param ) {

-    if ( param ) {

-      var name = param["name"];

-      if (name == "" || name == null) {

-        if (node) {

-          node.removeAttribute("name");

-          node.removeAttribute("id");

-          node.removeAttribute("title");

-          if (node.className == "hasid") {

-            node.removeAttribute("class");

-          }

-        }

-        return;

-      }

-      try {

-        var doc = editor._doc;

-        if (!node) {

-          node = doc.createElement("span");

-          node.id = name;

-          node.name = name;

-          node.title = name;

-          node.className = "hasid";

-          node.innerHTML = html;

-          if (Xinha.is_ie) {

-            range.pasteHTML(node.outerHTML);

-          } else {

-            editor.insertNodeAtSelection(node);

-          }

-        } else {

-          node.id = name;

-          node.name = name;

-          node.title = name;

-          node.className = "hasid";

-        }

-      }

-      catch (e) { }

-    }

-  }, outparam);

-};

diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/SetId/img/placeholder.gif b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/SetId/img/placeholder.gif
deleted file mode 100644
index 2c34277..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/SetId/img/placeholder.gif
+++ /dev/null
Binary files differ
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/SetId/img/set-id.gif b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/SetId/img/set-id.gif
deleted file mode 100644
index 4f6ee90..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/SetId/img/set-id.gif
+++ /dev/null
Binary files differ
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/SetId/lang/ch.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/SetId/lang/ch.js
deleted file mode 100644
index 9d78e44..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/SetId/lang/ch.js
+++ /dev/null
@@ -1,14 +0,0 @@
-// I18N constants
-// LANG: "ch", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Cancel": "取消",
-    "OK": "好"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/SetId/lang/cz.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/SetId/lang/cz.js
deleted file mode 100644
index 36b9929..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/SetId/lang/cz.js
+++ /dev/null
@@ -1,14 +0,0 @@
-// I18N constants
-// LANG: "cz", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Cancel": "Zrušit",
-    "OK": "OK"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/SetId/lang/da.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/SetId/lang/da.js
deleted file mode 100644
index 20fc0d0..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/SetId/lang/da.js
+++ /dev/null
@@ -1,14 +0,0 @@
-// I18N constants
-// LANG: "da", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Cancel": "Annuller",
-    "OK": "OK"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/SetId/lang/de.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/SetId/lang/de.js
deleted file mode 100644
index dfef600..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/SetId/lang/de.js
+++ /dev/null
@@ -1,19 +0,0 @@
-// I18N constants
-// LANG: "de", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Cancel": "Abbrechen",
-    "Delete": "Löschen",
-    "OK": "OK",
-    "Set Id and Name": "Objekt ID und Name einfügen",
-    "__OBSOLETE__": {
-        "Name/Id": "Name (ID)"
-    }
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/SetId/lang/ee.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/SetId/lang/ee.js
deleted file mode 100644
index ba916e9..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/SetId/lang/ee.js
+++ /dev/null
@@ -1,14 +0,0 @@
-// I18N constants
-// LANG: "ee", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Cancel": "Loobu",
-    "OK": "OK"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/SetId/lang/el.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/SetId/lang/el.js
deleted file mode 100644
index f6e006c..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/SetId/lang/el.js
+++ /dev/null
@@ -1,14 +0,0 @@
-// I18N constants
-// LANG: "el", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Cancel": "Ακύρωση",
-    "OK": "Εντάξει"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/SetId/lang/es.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/SetId/lang/es.js
deleted file mode 100644
index 95fd8cb..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/SetId/lang/es.js
+++ /dev/null
@@ -1,15 +0,0 @@
-// I18N constants
-// LANG: "es", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Cancel": "Cancelar",
-    "Delete": "Suprimir",
-    "OK": "Aceptar"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/SetId/lang/eu.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/SetId/lang/eu.js
deleted file mode 100644
index 3bc9dbb..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/SetId/lang/eu.js
+++ /dev/null
@@ -1,14 +0,0 @@
-// I18N constants
-// LANG: "eu", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Cancel": "Utzi",
-    "OK": "Ados"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/SetId/lang/fa.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/SetId/lang/fa.js
deleted file mode 100644
index 84e7f7e..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/SetId/lang/fa.js
+++ /dev/null
@@ -1,14 +0,0 @@
-// I18N constants
-// LANG: "fa", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Cancel": "انصراف",
-    "OK": "بله"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/SetId/lang/fi.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/SetId/lang/fi.js
deleted file mode 100644
index 82552b9..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/SetId/lang/fi.js
+++ /dev/null
@@ -1,14 +0,0 @@
-// I18N constants
-// LANG: "fi", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Cancel": "Peruuta",
-    "OK": "Hyväksy"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/SetId/lang/fr.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/SetId/lang/fr.js
deleted file mode 100644
index d415524..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/SetId/lang/fr.js
+++ /dev/null
@@ -1,15 +0,0 @@
-// I18N constants
-// LANG: "fr", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Cancel": "Annuler",
-    "Delete": "Supprimer",
-    "OK": "OK"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/SetId/lang/he.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/SetId/lang/he.js
deleted file mode 100644
index a602f7c..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/SetId/lang/he.js
+++ /dev/null
@@ -1,14 +0,0 @@
-// I18N constants
-// LANG: "he", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Cancel": "ביטול",
-    "OK": "אישור"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/SetId/lang/hu.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/SetId/lang/hu.js
deleted file mode 100644
index b38528d..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/SetId/lang/hu.js
+++ /dev/null
@@ -1,14 +0,0 @@
-// I18N constants
-// LANG: "hu", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Cancel": "Mégsem",
-    "OK": "Rendben"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/SetId/lang/it.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/SetId/lang/it.js
deleted file mode 100644
index a0acb45..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/SetId/lang/it.js
+++ /dev/null
@@ -1,14 +0,0 @@
-// I18N constants
-// LANG: "it", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Cancel": "Annullamento",
-    "OK": "OK"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/SetId/lang/ja.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/SetId/lang/ja.js
deleted file mode 100644
index 11586b0..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/SetId/lang/ja.js
+++ /dev/null
@@ -1,21 +0,0 @@
-// I18N constants
-// LANG: "ja", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Cancel": "中止",
-    "Delete": "削除",
-    "ID/Name:": "ID/名前:",
-    "OK": "OK",
-    "Set ID/Name": "IDと名前の設定",
-    "Set Id and Name": "IDと名前の設定",
-    "__OBSOLETE__": {
-        "Name/Id": "名前/ID"
-    }
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/SetId/lang/lc_base.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/SetId/lang/lc_base.js
deleted file mode 100644
index 094f2b6..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/SetId/lang/lc_base.js
+++ /dev/null
@@ -1,31 +0,0 @@
-// I18N constants
-//
-// LANG: "en", ENCODING: UTF-8
-// Author: Translator-Name, <email@example.com>
-//
-// Last revision: 2018-04-12
-// 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).
-//
-// (Please, remove information below)
-// 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.)
-
-{
-    "Cancel": "",
-    "Delete": "",
-    "ID/Name:": "",
-    "OK": "",
-    "Set ID/Name": "",
-    "Set Id and Name": "",
-    "Set Id/Name": ""
-}
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/SetId/lang/lt.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/SetId/lang/lt.js
deleted file mode 100644
index d118909..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/SetId/lang/lt.js
+++ /dev/null
@@ -1,14 +0,0 @@
-// I18N constants
-// LANG: "lt", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Cancel": "Atšaukti",
-    "OK": "OK"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/SetId/lang/lv.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/SetId/lang/lv.js
deleted file mode 100644
index f83d5d3..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/SetId/lang/lv.js
+++ /dev/null
@@ -1,14 +0,0 @@
-// I18N constants
-// LANG: "lv", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Cancel": "Atcelt",
-    "OK": "Labi"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/SetId/lang/nb.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/SetId/lang/nb.js
deleted file mode 100644
index 70a10d9..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/SetId/lang/nb.js
+++ /dev/null
@@ -1,19 +0,0 @@
-// I18N constants
-// LANG: "nb", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Cancel": "Avbryt",
-    "Delete": "Slett",
-    "OK": "OK",
-    "Set Id and Name": "Sett ID og navn",
-    "__OBSOLETE__": {
-        "Name/Id": "Navn (ID)"
-    }
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/SetId/lang/nl.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/SetId/lang/nl.js
deleted file mode 100644
index 1cf9207..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/SetId/lang/nl.js
+++ /dev/null
@@ -1,21 +0,0 @@
-// I18N constants
-// LANG: "nl", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Cancel": "Annuleren",
-    "Delete": "Verwijderen",
-    "ID/Name:": "ID/Naam:",
-    "OK": "OK",
-    "Set ID/Name": "ID/Naam instellen",
-    "Set Id and Name": "ID en Naam instellen",
-    "__OBSOLETE__": {
-        "Name/Id": "Naam/ID"
-    }
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/SetId/lang/pl.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/SetId/lang/pl.js
deleted file mode 100644
index 5b43de2..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/SetId/lang/pl.js
+++ /dev/null
@@ -1,15 +0,0 @@
-// I18N constants
-// LANG: "pl", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Cancel": "Anuluj",
-    "Delete": "Usuń",
-    "OK": "OK"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/SetId/lang/pt_br.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/SetId/lang/pt_br.js
deleted file mode 100644
index 1d7b932..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/SetId/lang/pt_br.js
+++ /dev/null
@@ -1,22 +0,0 @@
-// I18N constants
-// LANG: "pt_br", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Cancel": "Cancelar",
-    "Delete": "Apagar",
-    "ID/Name:": "ID/Nome:",
-    "OK": "OK",
-    "Set ID/Name": "Definir ID/Nome",
-    "Set Id and Name": "Definir Id e Nome",
-    "Set Id/Name": "Definir Id/Nome",
-    "__OBSOLETE__": {
-        "Name/Id": "Nome/Id"
-    }
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/SetId/lang/ro.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/SetId/lang/ro.js
deleted file mode 100644
index 9d6e1c3..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/SetId/lang/ro.js
+++ /dev/null
@@ -1,14 +0,0 @@
-// I18N constants
-// LANG: "ro", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Cancel": "Renunţă",
-    "OK": "Acceptă"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/SetId/lang/ru.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/SetId/lang/ru.js
deleted file mode 100644
index fad59f2..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/SetId/lang/ru.js
+++ /dev/null
@@ -1,14 +0,0 @@
-// I18N constants
-// LANG: "ru", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Cancel": "Отмена",
-    "OK": "OK"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/SetId/lang/sh.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/SetId/lang/sh.js
deleted file mode 100644
index 62e76f7..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/SetId/lang/sh.js
+++ /dev/null
@@ -1,14 +0,0 @@
-// I18N constants
-// LANG: "sh", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Cancel": "Poništi",
-    "OK": "OK"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/SetId/lang/si.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/SetId/lang/si.js
deleted file mode 100644
index 7674892..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/SetId/lang/si.js
+++ /dev/null
@@ -1,14 +0,0 @@
-// I18N constants
-// LANG: "si", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Cancel": "Prekliči",
-    "OK": "V redu"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/SetId/lang/sr.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/SetId/lang/sr.js
deleted file mode 100644
index b7ee6f5..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/SetId/lang/sr.js
+++ /dev/null
@@ -1,14 +0,0 @@
-// I18N constants
-// LANG: "sr", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Cancel": "Поништи",
-    "OK": "OK"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/SetId/lang/sv.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/SetId/lang/sv.js
deleted file mode 100644
index 98336d8..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/SetId/lang/sv.js
+++ /dev/null
@@ -1,14 +0,0 @@
-// I18N constants
-// LANG: "sv", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Cancel": "Avbryt",
-    "OK": "OK"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/SetId/lang/th.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/SetId/lang/th.js
deleted file mode 100644
index 9da9c8d..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/SetId/lang/th.js
+++ /dev/null
@@ -1,14 +0,0 @@
-// I18N constants
-// LANG: "th", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Cancel": "ยกเลิก",
-    "OK": "ตกลง"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/SetId/lang/tr.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/SetId/lang/tr.js
deleted file mode 100644
index 1d2c8b9..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/SetId/lang/tr.js
+++ /dev/null
@@ -1,15 +0,0 @@
-// I18N constants
-// LANG: "tr", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Cancel": "İptal",
-    "Delete": "Sil",
-    "OK": "Tamam"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/SetId/lang/vn.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/SetId/lang/vn.js
deleted file mode 100644
index 2d82e02..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/SetId/lang/vn.js
+++ /dev/null
@@ -1,14 +0,0 @@
-// I18N constants
-// LANG: "vn", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Cancel": "Hủy",
-    "OK": "Đồng ý"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/SetId/popups/set_id.html b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/SetId/popups/set_id.html
deleted file mode 100644
index 1ae59e4..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/SetId/popups/set_id.html
+++ /dev/null
@@ -1,58 +0,0 @@
-<html>
-<head>
-  <title>Set Id/Name</title>
-  <link rel="stylesheet" type="text/css" href="../../../popups/popup.css" />
-  <script type="text/javascript" src="../../../popups/popup.js"></script>
-  <script type="text/javascript">
-window.resizeTo(350, 100);
-function Init() {
-  __dlg_translate("SetId");
-  __dlg_init();
-  var param = window.dialogArguments;
-  if (param) {
-    document.getElementById("name").value = param["name"];
-  }
-  document.getElementById("name").focus();
-}
-
-function onOK() {
-  // pass data back to the calling window
-  var param = new Object();
-  param["name"] = document.getElementById("name").value;
-  __dlg_close(param);
-  return false;
-}
-
-function onDelete() {
-  // pass data back to the calling window
-  var param = new Object();
-  param["name"] = "";
-  __dlg_close(param);
-  return false;
-}
-
-function onCancel() {
-  __dlg_close(null);
-  return false;
-}
-</script>
-</head>
-
-<body class="dialog" onload="Init()">
-<div class="title">Set ID/Name</div>
-<form>
-<table border="0" style="width: 300px;">
-  <tr>
-    <td class="label">ID/Name:</td>
-    <td><input type="text" id="name" style="width: 200px" /></td>
-  </tr>
-</table>
-
-<div id="buttons">
-  <button type="submit" name="ok" onclick="return onOK();">OK</button>
-  <button type="button" name="delete" onclick="return onDelete();">Delete</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-1.5.1/plugins/SetId/set-id.css b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/SetId/set-id.css
deleted file mode 100644
index 01abaa0..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/SetId/set-id.css
+++ /dev/null
@@ -1,7 +0,0 @@
-.hasid {

-  background-image: url(img/set-id.gif);

-  background-repeat: no-repeat;

-  background-position: left top;

-  padding-left: 19px;

-  border: 1px dotted blue;

-}

diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/SmartReplace/SmartReplace.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/SmartReplace/SmartReplace.js
deleted file mode 100644
index e299084..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/SmartReplace/SmartReplace.js
+++ /dev/null
@@ -1,369 +0,0 @@
-/*------------------------------------------*\

- SmartReplace for Xinha

- _______________________

-	 

-\*------------------------------------------*/

-

-function SmartReplace(editor) {

-	this.editor = editor;

-	this._wasShowing = false; // Set true when switching to textmode if the dialog is visible, so it can be restored

-	var cfg = editor.config;

-	var self = this;

-	

-	cfg.registerButton

-	({

-		id       : "smartreplace",

-		tooltip  : this._lc("SmartReplace"),

-		image    : [_editor_url +'iconsets/Tango/ed_buttons_main.png',3,8],

-		textMode : false,

-		action   : function(e, objname, obj) { self.buttonPress(null, obj); }

-	});

-	cfg.addToolbarElement("smartreplace", "htmlmode", 1);

-}

-

-SmartReplace._pluginInfo = {

-  name          : "SmartReplace",

-  version       : "1.0",

-  developer     : "Raimund Meyer",

-  developer_url : "http://x-webservice.net",

-  c_owner       : "Raimund Meyer",

-  sponsor       : "",

-  sponsor_url   : "",

-  license       : "htmlArea"

-};

-

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

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

-};

-

-Xinha.Config.prototype.SmartReplace =

-{

-	'defaultActive' : true,

-	'quotes' : null//[String.fromCharCode(187),String.fromCharCode(171),String.fromCharCode(8250),String.fromCharCode(8249)]

-}

-SmartReplace.prototype.toggleActivity = function(newState) 

-{

-	if (typeof newState != 'undefined')

-	{

-		this.active = newState;

-	}

-	else

-	{

-		this.active = this.active ? false : true;		

-	}

-	this.editor._toolbarObjects.smartreplace.state("active", this.active);

-}

-

-SmartReplace.prototype.onUpdateToolbar = function() {

-	this.editor._toolbarObjects.smartreplace.state("active", this.active);

-}

-

-SmartReplace.prototype.onGenerate = function() {

-	this.active = this.editor.config.SmartReplace.defaultActive;

-	this.editor._toolbarObjects.smartreplace.state("active", this.active);

-	

-	var self = this;

-	Xinha._addEvent(

-		self.editor._doc,

-		 "keypress",

-		function (event)

-		{

-		  return self.keyEvent(Xinha.is_ie ? self.editor._iframe.contentWindow.event : event);

-		});

-	

-	var quotes = this.editor.config.SmartReplace.quotes;

-   

-	if (quotes && typeof quotes == 'object')

-	{

-		this.openingQuotes = quotes[0];

-		this.closingQuotes = quotes[1];

-		this.openingQuote  = quotes[2];

-		this.closingQuote  = quotes[3];

-	}

-	else

-	{

-		this.openingQuotes = this._lc("OpeningDoubleQuotes");

-		this.closingQuote  = this._lc("ClosingSingleQuote");

-		this.closingQuotes = this._lc("ClosingDoubleQuotes");

-		this.openingQuote  = this._lc("OpeningSingleQuote");

-	}

-	

-	if (this.openingQuotes == 'OpeningDoubleQuotes') //If nothing else is defined, English style as default

-	{

-		this.openingQuotes = String.fromCharCode(8220);

-		this.closingQuotes = String.fromCharCode(8221);

-		this.openingQuote = String.fromCharCode(8216);

-		this.closingQuote = String.fromCharCode(8217);

-	}

-};

-

-SmartReplace.prototype.keyEvent = function(ev)

-{

-	if ( !this.active) return true;

-	var editor = this.editor;

-	var charCode =  Xinha.is_ie ? ev.keyCode : ev.which;

-

-	var key = String.fromCharCode(charCode);

-

-	if ( key == '"' || key == "'")

-	{

-		Xinha._stopEvent(ev);

-		return this.smartQuotes(key);

-	}

-	if (charCode == 32) //space bar

-	{

-		return this.smartReplace(ev, 2, /^\s-/, ' '+String.fromCharCode(8211), false); // space-space -> dash 

-	}

-	if ( key == '.' ) // ... -> ellipsis

-	{

-		return this.smartReplace(ev, 2, /\.\./, String.fromCharCode(8230), true);

-	}

-	return true;

-}

-

-SmartReplace.prototype.smartQuotes = function(kind)

-{

-	if (kind == "'")

-	{

-		var opening = this.openingQuote;

-		var closing = this.closingQuote;

-	}

-	else

-	{

-		var opening = this.openingQuotes;

-		var closing = this.closingQuotes;

-	}

-	

-	var editor = this.editor;

-		

-	var sel = editor.getSelection();

-

-	if (Xinha.is_ie)

-	{

-		var r = editor.createRange(sel);

-		if (r.text !== '')

-		{

-			r.text = '';

-		}

-		r.moveStart('character', -1);

-		

-		if(r.text.match(/\S/))

-		{

-			r.moveStart('character', +1);

-			r.text = closing;

-		}

-		else

-		{

-			r.moveStart('character', +1);

-			r.text = opening;

-		}

-	}

-	else

-	{

-		var r = editor.createRange(sel);

-

-		if (!r.collapsed)

-		{

-			editor.insertNodeAtSelection(document.createTextNode(''));

-		}

-		if (r.startOffset > 0) r.setStart(r.startContainer, r.startOffset -1);

-

-		

-		if(r.toString().match(/[^\s\xA0]/))

-		{;

-			r.collapse(false);

-			editor.insertNodeAtSelection(document.createTextNode(closing));

-		}

-		else

-		{

-			editor.insertNodeAtSelection(document.createTextNode(r.toString()+opening));			

-		}

-		editor.getSelection().collapseToEnd();

-	}

-	return false;

-}

-

-SmartReplace.prototype.smartReplace = function(ev, lookback, re, replace, stopEvent)

-{

-	var editor = this.editor;

-	var sel = this.editor.getSelection();

-	var r = this.editor.createRange(sel);

-	

-	if (Xinha.is_ie)

-	{

-		r.moveStart('character', -lookback);

-		

-		if(r.text.match(re))

-		{

-			r.text = replace;

-			if (stopEvent) 

-			{

-				Xinha._stopEvent(ev);

-				return false

-			}

-		}

-	}

-	else

-	{

-		if (r.startOffset > 1) r.setStart(r.startContainer, r.startOffset -lookback);

-

-		if(r.toString().match(re))

-		{

-			this.editor.insertNodeAtSelection(document.createTextNode(replace));

-			r.deleteContents();

-			r.collapse(true);

-		  if (stopEvent) 

-		  {

-				Xinha._stopEvent(ev);

-				return false

-		  }

-		}

-		editor.getSelection().collapseToEnd();

-	}

-	return true;

-}

-

-SmartReplace.prototype.replaceAll = function()

-{

-	var doubleQuotes = [

-							'&quot;',

-							String.fromCharCode(8220),

-							String.fromCharCode(8221),

-							String.fromCharCode(8222),

-							String.fromCharCode(187),

-							String.fromCharCode(171)

-							

-						];

-	var singleQuotes = [

-							"'",

-							String.fromCharCode(8216),

-							String.fromCharCode(8217),

-							String.fromCharCode(8218),

-							String.fromCharCode(8250),

-							String.fromCharCode(8249)

-						];

-	

-	var html = this.editor.getHTML();

-	var reOpeningDouble = new RegExp ('(\\s|^|>)('+doubleQuotes.join('|')+')(\\S)','g');

-	html = html.replace(reOpeningDouble,'$1'+this.openingQuotes+'$3');

-	

-	var reOpeningSingle = new RegExp ('(\\s|^|>)('+singleQuotes.join('|')+')(\\S)','g');

-	html = html.replace(reOpeningSingle,'$1'+this.openingQuote+'$3');

-	

-	var reClosingDouble = new RegExp ('(\\S)('+doubleQuotes.join('|')+')','g');

-	html = html.replace(reClosingDouble,'$1'+this.closingQuotes);

-	

-	var reClosingSingle = new RegExp ('(\\S)('+singleQuotes.join('|')+')','g');

-	html = html.replace(reClosingSingle,'$1'+this.closingQuote);

-	

-	var reDash    = new RegExp ('( |&nbsp;)(-)( |&nbsp;)','g');

-	html = html.replace(reDash,' '+String.fromCharCode(8211)+' ');

-	

-	this.editor.setHTML(html);

-}

-

-SmartReplace.prototype.buttonPress = function(opts, obj)

-{

-	var self = this;

-

-	if ( this.dialog.rootElem.style.display != 'none')

-	{

-		return this.dialog.hide();

-	}

-	var doOK = function()

-	{

-		var opts = self.dialog.hide();

-		self.toggleActivity((opts.enable) ? true : false); 

-		if (opts.convert)

-		{

-			self.replaceAll();

-			self.dialog.getElementById("convert").checked = false;

-		}

-	}

-	var inputs = 

-	{

-		enable : self.active ? "on" : '',

-		convert: ''

-	};

-	this.show(inputs, doOK);

-};

-

-SmartReplace.prototype.onGenerateOnce = function()

-{

-  this._prepareDialog();

-};

-

-SmartReplace.prototype._prepareDialog = function()

-{

-  var self = this;

-  var editor = this.editor;

-

-  if(!this.html)

-  {

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

-	return;

-  }

-  

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

-  this.dialog = new Xinha.Dialog(editor, this.html, 'SmartReplace',{},{modal:false});

-  this.dialog.attachToPanel('top');

-

-  this.dialog.getElementById('enable').onchange = function ()

-  {

-  	self.toggleActivity(this.checked); 

-  }

-  this.dialog.getElementById('convert').onchange = function ()

-  {

-  	self.dialog.getElementById('ok').style.display = ( this.checked ) ? '' : 'none'; 

-  }

-  this.dialog.getElementById('ok').onclick = function ()

-  {

-  	self.replaceAll();

-  	self.dialog.getElementById('convert').checked = false; 

-  	this.style.display =  'none'; 

-  }

-  this.ready = true;

-};

-

-SmartReplace.prototype.show = function(inputs)

-{

-  if(!this.ready)

-  {

-    var self = this;

-    window.setTimeout(function() {self.show(inputs,ok,cancel);},100);

-	return;

-  }

-

-  // Connect the OK and Cancel buttons

-  var self = this;

-

-  this.dialog.show(inputs);

-

-  // Init the sizes

-  this.dialog.onresize();

-};

-

-SmartReplace.prototype.onBeforeMode = function(mode)

-{

-  switch(mode)

-  {

-    case 'textmode':      

-      if ( this.dialog.rootElem.style.display != 'none')

-      {

-        this._wasShowing = true;

-        this.dialog.hide();

-      }

-      else

-      {

-        this._wasShowing = false;

-      }

-      break;

-      

-    case 'wysiwyg':

-      if(this._wasShowing)

-      {

-        this.buttonPress();

-      }

-      break;

-  }

-}
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/SmartReplace/dialog.html b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/SmartReplace/dialog.html
deleted file mode 100644
index 146e0f3..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/SmartReplace/dialog.html
+++ /dev/null
@@ -1,16 +0,0 @@
-<h1 id="[h1]"><l10n>SmartReplace Settings</l10n></h1>
-<div style="margin-left: 10px;">
-<table style="width: 100%;border:none">
-  <tr>
-    <td style="width:15px"><input type="checkbox" id="[enable]" name="[enable]" value="on" /></td>
-    <td style="text-align:left"><l10n>Enable automatic replacements</l10n></td>
-  </tr>
-  <tr>
-    <td style="width:15px"><input type="checkbox" id="[convert]" name="[convert]" value="on" /></td>
-    <td style="text-align:left"><l10n>Convert all quotes and dashes in the current document</l10n> <input style="display:none" type="button" id="[ok]" value="_(OK)" /></td>
-  </tr>
-</table>
-</div>
-<div class="buttons">
-  
-</div>
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/SmartReplace/img/SmartReplace.svg b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/SmartReplace/img/SmartReplace.svg
deleted file mode 100644
index 0981816..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/SmartReplace/img/SmartReplace.svg
+++ /dev/null
@@ -1,231 +0,0 @@
-<?xml version="1.0" encoding="UTF-8" standalone="no"?>
-<!-- Created with Inkscape (http://www.inkscape.org/) -->
-<svg
-   xmlns:dc="http://purl.org/dc/elements/1.1/"
-   xmlns:cc="http://creativecommons.org/ns#"
-   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
-   xmlns:svg="http://www.w3.org/2000/svg"
-   xmlns="http://www.w3.org/2000/svg"
-   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
-   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
-   width="18"
-   height="18"
-   id="svg2"
-   sodipodi:version="0.32"
-   inkscape:version="0.46"
-   version="1.0"
-   inkscape:export-filename="/home/raimund/www/x-all/trunk/plugins/SmartReplace/img/smartquotes.png"
-   inkscape:export-xdpi="89"
-   inkscape:export-ydpi="89"
-   sodipodi:docname="SmartReplace.svg"
-   inkscape:output_extension="org.inkscape.output.svg.inkscape">
-  <defs
-     id="defs4">
-    <linearGradient
-       id="linearGradient3195">
-      <stop
-         style="stop-color:#001aea;stop-opacity:0.49803922;"
-         offset="0"
-         id="stop3197" />
-      <stop
-         id="stop3199"
-         offset="1"
-         style="stop-color:#002fe9;stop-opacity:0;" />
-    </linearGradient>
-    <linearGradient
-       id="linearGradient3181">
-      <stop
-         id="stop3191"
-         offset="0"
-         style="stop-color:#001aea;stop-opacity:0.49803922;" />
-      <stop
-         style="stop-color:#002fe9;stop-opacity:0;"
-         offset="1"
-         id="stop3185" />
-    </linearGradient>
-    <inkscape:perspective
-       sodipodi:type="inkscape:persp3d"
-       inkscape:vp_x="0 : 526.18109 : 1"
-       inkscape:vp_y="0 : 1000 : 0"
-       inkscape:vp_z="744.09448 : 526.18109 : 1"
-       inkscape:persp3d-origin="372.04724 : 350.78739 : 1"
-       id="perspective10" />
-    <filter
-       inkscape:collect="always"
-       id="filter3877"
-       x="-0.55226434"
-       width="2.1045287"
-       y="-0.58763633"
-       height="2.1752727">
-      <feGaussianBlur
-         inkscape:collect="always"
-         stdDeviation="0.3258841"
-         id="feGaussianBlur3879" />
-    </filter>
-    <filter
-       inkscape:collect="always"
-       id="filter3881"
-       x="-0.54981541"
-       width="2.0996308"
-       y="-0.58503054"
-       height="2.1700611">
-      <feGaussianBlur
-         inkscape:collect="always"
-         stdDeviation="0.32443901"
-         id="feGaussianBlur3883" />
-    </filter>
-    <filter
-       inkscape:collect="always"
-       id="filter3885"
-       x="-0.54981541"
-       width="2.0996308"
-       y="-0.58503054"
-       height="2.1700611">
-      <feGaussianBlur
-         inkscape:collect="always"
-         stdDeviation="0.32443901"
-         id="feGaussianBlur3887" />
-    </filter>
-    <filter
-       inkscape:collect="always"
-       id="filter3889"
-       x="-0.55226434"
-       width="2.1045287"
-       y="-0.58763633"
-       height="2.1752727">
-      <feGaussianBlur
-         inkscape:collect="always"
-         stdDeviation="0.3258841"
-         id="feGaussianBlur3891" />
-    </filter>
-  </defs>
-  <sodipodi:namedview
-     id="base"
-     pagecolor="#ffffff"
-     bordercolor="#666666"
-     borderopacity="1.0"
-     inkscape:pageopacity="0.0"
-     inkscape:pageshadow="2"
-     inkscape:zoom="11.2"
-     inkscape:cx="3.6727167"
-     inkscape:cy="7.2058218"
-     inkscape:document-units="px"
-     inkscape:current-layer="layer1"
-     showgrid="false"
-     inkscape:window-width="1280"
-     inkscape:window-height="950"
-     inkscape:window-x="0"
-     inkscape:window-y="25" />
-  <metadata
-     id="metadata7">
-    <rdf:RDF>
-      <cc:Work
-         rdf:about="">
-        <dc:format>image/svg+xml</dc:format>
-        <dc:type
-           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
-      </cc:Work>
-    </rdf:RDF>
-  </metadata>
-  <g
-     inkscape:label="Ebene 1"
-     inkscape:groupmode="layer"
-     id="layer1">
-    <g
-       id="g3525"
-       transform="matrix(0.9733519,-0.2293166,0.2293166,0.9733519,-3.033483,1.7621106)"
-       style="fill:#6ab100;fill-opacity:1;stroke:#0a0404;stroke-width:0.3;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
-       inkscape:export-filename="/home/raimund/www/x-all/trunk/plugins/SmartReplace/img/smartquotes.png"
-       inkscape:export-xdpi="89"
-       inkscape:export-ydpi="89">
-      <path
-         sodipodi:nodetypes="csssccc"
-         id="text3506"
-         d="M 3.5711284,17.43093 C 6.1261974,16.072436 7.6673543,14.051257 7.6673543,12.096351 C 7.6673543,10.207713 6.3289811,8.9486184 4.3417056,8.9486184 C 2.5572129,8.9486184 1.1782838,10.075177 1.1782838,11.566207 C 1.1782838,12.858433 2.0705327,13.719919 3.8144686,13.98499 C 3.3683454,14.680805 2.8005503,15.244085 1.8271908,15.939899 L 3.5711284,17.43093"
-         style="font-size:53.06053924999999793px;font-style:normal;font-weight:normal;fill:#6ab100;fill-opacity:1;stroke:#0a0404;stroke-width:0.3;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;font-family:Bitstream Vera Sans" />
-      <path
-         sodipodi:nodetypes="csssccc"
-         id="path3511"
-         d="M 8.5708472,17.559606 C 11.125916,16.201112 12.667073,14.179933 12.667073,12.225028 C 12.667073,10.336389 11.328699,9.0772948 9.3414241,9.0772948 C 7.5569308,9.0772948 6.1780022,10.203854 6.1780022,11.694883 C 6.1780022,12.987109 7.070251,13.848595 8.8141872,14.113668 C 8.3680643,14.809481 7.8002686,15.372761 6.8269087,16.068575 L 8.5708472,17.559606"
-         style="font-size:53.06053924999999793px;font-style:normal;font-weight:normal;fill:#6ab100;fill-opacity:1;stroke:#0a0404;stroke-width:0.3;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;font-family:Bitstream Vera Sans" />
-    </g>
-    <g
-       id="g3529"
-       transform="matrix(0.8776155,-0.4793652,0.4793652,0.8776155,-2.0925674,6.3465565)"
-       style="fill:#6ab100;fill-opacity:1;stroke:#0a0404;stroke-width:0.30000001;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
-       inkscape:export-xdpi="89"
-       inkscape:export-ydpi="89"
-       inkscape:export-filename="/home/raimund/www/x-all/trunk/plugins/SmartReplace/img/smartquotes.png">
-      <g
-         id="g3533"
-         transform="matrix(0.9735196,0.2286037,-0.2286037,0.9735196,1.4901311,-2.5784836)"
-         style="fill:#6ab100;fill-opacity:1;stroke:#0a0404;stroke-width:0.3;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1">
-        <path
-           style="font-size:53.06053924999999793px;font-style:normal;font-weight:normal;fill:#6ab100;fill-opacity:1;stroke:#0a0404;stroke-width:0.3;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;font-family:Bitstream Vera Sans"
-           d="M 10.226832,0.83736305 C 7.671763,2.1958571 6.1306056,4.2170361 6.1306056,6.1719421 C 6.1306056,8.0605802 7.468979,9.3196749 9.456255,9.3196749 C 11.240747,9.3196749 12.619676,8.1931161 12.619676,6.7020861 C 12.619676,5.4098602 11.727428,4.5483741 9.983492,4.2833031 C 10.429615,3.5874881 10.99741,3.0242082 11.97077,2.3283942 L 10.226832,0.83736305"
-           id="path3517"
-           sodipodi:nodetypes="csssccc" />
-        <path
-           style="font-size:53.06053924999999793px;font-style:normal;font-weight:normal;fill:#6ab100;fill-opacity:1;stroke:#0a0404;stroke-width:0.3;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;font-family:Bitstream Vera Sans"
-           d="M 15.226549,0.96603925 C 12.671481,2.3245333 11.130324,4.3457123 11.130324,6.3006173 C 11.130324,8.1892563 12.468698,9.4483509 14.455973,9.4483509 C 16.240466,9.4483509 17.619394,8.3217913 17.619394,6.8307623 C 17.619394,5.5385363 16.727146,4.6770503 14.983209,4.4119773 C 15.429332,3.7161643 15.997128,3.1528843 16.970488,2.4570703 L 15.226549,0.96603925"
-           id="path3519"
-           sodipodi:nodetypes="csssccc" />
-      </g>
-    </g>
-    <path
-       sodipodi:type="arc"
-       style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:#fff9f9;stroke-width:0;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;filter:url(#filter3881)"
-       id="path3466"
-       sodipodi:cx="-1.9413869"
-       sodipodi:cy="4.3516784"
-       sodipodi:rx="0.71026349"
-       sodipodi:ry="0.66291261"
-       d="M -1.2311234,4.3516784 A 0.71026349,0.66291261 0 1 1 -2.6516504,4.3516784 A 0.71026349,0.66291261 0 1 1 -1.2311234,4.3516784 z"
-       transform="matrix(-2.3526407,-0.5386773,0.5386773,-2.3526407,-0.1710357,15.798211)"
-       inkscape:transform-center-x="-10.971117"
-       inkscape:transform-center-y="14.704344"
-       inkscape:export-filename="/home/raimund/www/x-all/trunk/plugins/SmartReplace/img/path3468.png"
-       inkscape:export-xdpi="89"
-       inkscape:export-ydpi="89" />
-    <path
-       sodipodi:type="arc"
-       style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:#fff9f9;stroke-width:0;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;filter:url(#filter3877)"
-       id="path3468"
-       sodipodi:cx="-1.9413869"
-       sodipodi:cy="4.3516784"
-       sodipodi:rx="0.71026349"
-       sodipodi:ry="0.66291261"
-       d="M -1.2311234,4.3516784 A 0.71026349,0.66291261 0 1 1 -2.6516504,4.3516784 A 0.71026349,0.66291261 0 1 1 -1.2311234,4.3516784 z"
-       transform="matrix(-2.3422083,-0.5362885,0.5362885,-2.3422083,4.74989,14.66942)"
-       inkscape:export-xdpi="89"
-       inkscape:export-ydpi="89" />
-    <path
-       sodipodi:type="arc"
-       style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:#fff9f9;stroke-width:0;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;filter:url(#filter3885)"
-       id="path3729"
-       sodipodi:cx="-1.9413869"
-       sodipodi:cy="4.3516784"
-       sodipodi:rx="0.71026349"
-       sodipodi:ry="0.66291261"
-       d="M -1.2311234,4.3516784 A 0.71026349,0.66291261 0 1 1 -2.6516504,4.3516784 A 0.71026349,0.66291261 0 1 1 -1.2311234,4.3516784 z"
-       transform="matrix(-2.3526407,-0.5386773,0.5386773,-2.3526407,-4.7993142,20.634394)"
-       inkscape:transform-center-x="-10.971117"
-       inkscape:transform-center-y="14.704344"
-       inkscape:export-filename="/home/raimund/www/x-all/trunk/plugins/SmartReplace/img/path3468.png"
-       inkscape:export-xdpi="89"
-       inkscape:export-ydpi="89" />
-    <path
-       sodipodi:type="arc"
-       style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:#fff9f9;stroke-width:0;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;filter:url(#filter3889)"
-       id="path3731"
-       sodipodi:cx="-1.9413869"
-       sodipodi:cy="4.3516784"
-       sodipodi:rx="0.71026349"
-       sodipodi:ry="0.66291261"
-       d="M -1.2311234,4.3516784 A 0.71026349,0.66291261 0 1 1 -2.6516504,4.3516784 A 0.71026349,0.66291261 0 1 1 -1.2311234,4.3516784 z"
-       transform="matrix(-2.3422083,-0.5362885,0.5362885,-2.3422083,0.3001829,20.041317)"
-       inkscape:export-filename="/home/raimund/www/x-all/trunk/plugins/SmartReplace/img/path3468.png"
-       inkscape:export-xdpi="89"
-       inkscape:export-ydpi="89" />
-  </g>
-</svg>
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/SmartReplace/img/smartquotes.png b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/SmartReplace/img/smartquotes.png
deleted file mode 100644
index 961ae45..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/SmartReplace/img/smartquotes.png
+++ /dev/null
Binary files differ
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/SmartReplace/lang/ch.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/SmartReplace/lang/ch.js
deleted file mode 100644
index b1e6b20..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/SmartReplace/lang/ch.js
+++ /dev/null
@@ -1,13 +0,0 @@
-// I18N constants
-// LANG: "ch", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "OK": "好"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/SmartReplace/lang/cz.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/SmartReplace/lang/cz.js
deleted file mode 100644
index 01f2e8f..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/SmartReplace/lang/cz.js
+++ /dev/null
@@ -1,13 +0,0 @@
-// I18N constants
-// LANG: "cz", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "OK": "OK"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/SmartReplace/lang/da.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/SmartReplace/lang/da.js
deleted file mode 100644
index ce5e364..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/SmartReplace/lang/da.js
+++ /dev/null
@@ -1,13 +0,0 @@
-// I18N constants
-// LANG: "da", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "OK": "OK"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/SmartReplace/lang/de.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/SmartReplace/lang/de.js
deleted file mode 100644
index 3a6cbe9..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/SmartReplace/lang/de.js
+++ /dev/null
@@ -1,20 +0,0 @@
-// I18N constants
-// LANG: "de", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "ClosingDoubleQuotes": "“",
-    "ClosingSingleQuote": "‘",
-    "Convert all quotes and dashes in the current document": "Alle Anführungszeichen und Gedankenstriche umwandeln",
-    "Enable automatic replacements": "Automatische Ersetzung aktivieren",
-    "OK": "OK",
-    "OpeningDoubleQuotes": "„",
-    "OpeningSingleQuote": "‚",
-    "SmartReplace Settings": "SmartReplace Einstellungen"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/SmartReplace/lang/ee.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/SmartReplace/lang/ee.js
deleted file mode 100644
index 276bee0..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/SmartReplace/lang/ee.js
+++ /dev/null
@@ -1,13 +0,0 @@
-// I18N constants
-// LANG: "ee", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "OK": "OK"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/SmartReplace/lang/el.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/SmartReplace/lang/el.js
deleted file mode 100644
index e068038..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/SmartReplace/lang/el.js
+++ /dev/null
@@ -1,13 +0,0 @@
-// I18N constants
-// LANG: "el", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "OK": "Εντάξει"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/SmartReplace/lang/es.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/SmartReplace/lang/es.js
deleted file mode 100644
index d3d01fd..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/SmartReplace/lang/es.js
+++ /dev/null
@@ -1,13 +0,0 @@
-// I18N constants
-// LANG: "es", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "OK": "Aceptar"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/SmartReplace/lang/eu.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/SmartReplace/lang/eu.js
deleted file mode 100644
index 22b9fe5..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/SmartReplace/lang/eu.js
+++ /dev/null
@@ -1,13 +0,0 @@
-// I18N constants
-// LANG: "eu", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "OK": "Ados"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/SmartReplace/lang/fa.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/SmartReplace/lang/fa.js
deleted file mode 100644
index 4ba41c9..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/SmartReplace/lang/fa.js
+++ /dev/null
@@ -1,13 +0,0 @@
-// I18N constants
-// LANG: "fa", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "OK": "بله"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/SmartReplace/lang/fi.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/SmartReplace/lang/fi.js
deleted file mode 100644
index f6aed2d..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/SmartReplace/lang/fi.js
+++ /dev/null
@@ -1,13 +0,0 @@
-// I18N constants
-// LANG: "fi", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "OK": "Hyväksy"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/SmartReplace/lang/fr.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/SmartReplace/lang/fr.js
deleted file mode 100644
index 8fadb6a..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/SmartReplace/lang/fr.js
+++ /dev/null
@@ -1,22 +0,0 @@
-// I18N constants
-// LANG: "fr", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "ClosingDoubleQuotes": "«",
-    "Convert all quotes and dashes in the current document": "Convertir tous les guillemets et tirets dans le document actuel",
-    "Enable automatic replacements": "Activer le remplacement automatique",
-    "OK": "OK",
-    "OpeningDoubleQuotes": "»",
-    "SmartReplace Settings": "Paramètres SmartReplace",
-    "__OBSOLETE__": {
-        "ClosingSingleQuote": "",
-        "OpeningSingleQuote": ""
-    }
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/SmartReplace/lang/he.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/SmartReplace/lang/he.js
deleted file mode 100644
index 82f72fa..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/SmartReplace/lang/he.js
+++ /dev/null
@@ -1,13 +0,0 @@
-// I18N constants
-// LANG: "he", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "OK": "אישור"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/SmartReplace/lang/hu.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/SmartReplace/lang/hu.js
deleted file mode 100644
index 15f9159..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/SmartReplace/lang/hu.js
+++ /dev/null
@@ -1,13 +0,0 @@
-// I18N constants
-// LANG: "hu", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "OK": "Rendben"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/SmartReplace/lang/it.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/SmartReplace/lang/it.js
deleted file mode 100644
index f4fed23..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/SmartReplace/lang/it.js
+++ /dev/null
@@ -1,13 +0,0 @@
-// I18N constants
-// LANG: "it", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "OK": "OK"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/SmartReplace/lang/ja.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/SmartReplace/lang/ja.js
deleted file mode 100644
index 4ef9b57..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/SmartReplace/lang/ja.js
+++ /dev/null
@@ -1,20 +0,0 @@
-// I18N constants
-// LANG: "ja", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "ClosingDoubleQuotes": "“",
-    "ClosingSingleQuote": "‘",
-    "Convert all quotes and dashes in the current document": "文書内の引用符とダッシュをすべて変換",
-    "Enable automatic replacements": "自動置換の有効化",
-    "OK": "OK",
-    "OpeningDoubleQuotes": "„",
-    "OpeningSingleQuote": "‚",
-    "SmartReplace Settings": "SmartReplace設定"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/SmartReplace/lang/lc_base.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/SmartReplace/lang/lc_base.js
deleted file mode 100644
index 8d0f62f..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/SmartReplace/lang/lc_base.js
+++ /dev/null
@@ -1,33 +0,0 @@
-// I18N constants
-//
-// LANG: "en", ENCODING: UTF-8
-// Author: Translator-Name, <email@example.com>
-//
-// Last revision: 2018-04-12
-// 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).
-//
-// (Please, remove information below)
-// 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.)
-
-{
-    "ClosingDoubleQuotes": "",
-    "ClosingSingleQuote": "",
-    "Convert all quotes and dashes in the current document": "",
-    "Enable automatic replacements": "",
-    "OK": "",
-    "OpeningDoubleQuotes": "",
-    "OpeningSingleQuote": "",
-    "SmartReplace": "",
-    "SmartReplace Settings": ""
-}
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/SmartReplace/lang/lt.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/SmartReplace/lang/lt.js
deleted file mode 100644
index a4c006a..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/SmartReplace/lang/lt.js
+++ /dev/null
@@ -1,13 +0,0 @@
-// I18N constants
-// LANG: "lt", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "OK": "OK"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/SmartReplace/lang/lv.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/SmartReplace/lang/lv.js
deleted file mode 100644
index 17e6c8c..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/SmartReplace/lang/lv.js
+++ /dev/null
@@ -1,13 +0,0 @@
-// I18N constants
-// LANG: "lv", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "OK": "Labi"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/SmartReplace/lang/nb.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/SmartReplace/lang/nb.js
deleted file mode 100644
index fcdba02..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/SmartReplace/lang/nb.js
+++ /dev/null
@@ -1,13 +0,0 @@
-// I18N constants
-// LANG: "nb", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "OK": "OK"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/SmartReplace/lang/nl.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/SmartReplace/lang/nl.js
deleted file mode 100644
index 8610e0c..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/SmartReplace/lang/nl.js
+++ /dev/null
@@ -1,20 +0,0 @@
-// I18N constants
-// LANG: "nl", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "ClosingDoubleQuotes": "“",
-    "ClosingSingleQuote": "‘",
-    "Convert all quotes and dashes in the current document": "Converteer alle quotes en schuine strepen",
-    "Enable automatic replacements": "Automatisch vervangen inschakelen",
-    "OK": "OK",
-    "OpeningDoubleQuotes": "„",
-    "OpeningSingleQuote": "‚",
-    "SmartReplace Settings": "SmartReplace Instellingen"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/SmartReplace/lang/pl.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/SmartReplace/lang/pl.js
deleted file mode 100644
index ab7535b..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/SmartReplace/lang/pl.js
+++ /dev/null
@@ -1,13 +0,0 @@
-// I18N constants
-// LANG: "pl", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "OK": "OK"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/SmartReplace/lang/pt_br.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/SmartReplace/lang/pt_br.js
deleted file mode 100644
index d7ec12f..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/SmartReplace/lang/pt_br.js
+++ /dev/null
@@ -1,20 +0,0 @@
-// I18N constants
-// LANG: "pt_br", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Convert all quotes and dashes in the current document": "Converter todas as citações e hífens no documento atual",
-    "Enable automatic replacements": "Ativar substituições automáticas",
-    "OK": "OK",
-    "SmartReplace": "Substituição Rápida",
-    "SmartReplace Settings": "Configurações da Substituição Rápida",
-    "__OBSOLETE__": {
-        "Cancel": "Cancelar"
-    }
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/SmartReplace/lang/ro.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/SmartReplace/lang/ro.js
deleted file mode 100644
index b14100b..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/SmartReplace/lang/ro.js
+++ /dev/null
@@ -1,13 +0,0 @@
-// I18N constants
-// LANG: "ro", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "OK": "Acceptă"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/SmartReplace/lang/ru.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/SmartReplace/lang/ru.js
deleted file mode 100644
index 407318b..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/SmartReplace/lang/ru.js
+++ /dev/null
@@ -1,13 +0,0 @@
-// I18N constants
-// LANG: "ru", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "OK": "OK"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/SmartReplace/lang/sh.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/SmartReplace/lang/sh.js
deleted file mode 100644
index 03bad6b..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/SmartReplace/lang/sh.js
+++ /dev/null
@@ -1,13 +0,0 @@
-// I18N constants
-// LANG: "sh", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "OK": "OK"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/SmartReplace/lang/si.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/SmartReplace/lang/si.js
deleted file mode 100644
index 93b7a8b..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/SmartReplace/lang/si.js
+++ /dev/null
@@ -1,13 +0,0 @@
-// I18N constants
-// LANG: "si", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "OK": "V redu"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/SmartReplace/lang/sr.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/SmartReplace/lang/sr.js
deleted file mode 100644
index 5671f11..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/SmartReplace/lang/sr.js
+++ /dev/null
@@ -1,13 +0,0 @@
-// I18N constants
-// LANG: "sr", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "OK": "OK"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/SmartReplace/lang/sv.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/SmartReplace/lang/sv.js
deleted file mode 100644
index 24b2b3b..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/SmartReplace/lang/sv.js
+++ /dev/null
@@ -1,13 +0,0 @@
-// I18N constants
-// LANG: "sv", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "OK": "OK"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/SmartReplace/lang/th.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/SmartReplace/lang/th.js
deleted file mode 100644
index c8e2a8f..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/SmartReplace/lang/th.js
+++ /dev/null
@@ -1,13 +0,0 @@
-// I18N constants
-// LANG: "th", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "OK": "ตกลง"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/SmartReplace/lang/tr.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/SmartReplace/lang/tr.js
deleted file mode 100644
index 1ead104..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/SmartReplace/lang/tr.js
+++ /dev/null
@@ -1,13 +0,0 @@
-// I18N constants
-// LANG: "tr", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "OK": "Tamam"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/SmartReplace/lang/vn.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/SmartReplace/lang/vn.js
deleted file mode 100644
index 58d927f..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/SmartReplace/lang/vn.js
+++ /dev/null
@@ -1,13 +0,0 @@
-// I18N constants
-// LANG: "vn", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "OK": "Đồng ý"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/SmartReplace/readme.txt b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/SmartReplace/readme.txt
deleted file mode 100644
index 6e82907..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/SmartReplace/readme.txt
+++ /dev/null
@@ -1,15 +0,0 @@
-One irritating thing with text processing is the total absence of some typographic essentials on the keyboard -- "real" (typographic) quotes and the dash, typically miss-typed as inch or second sign (") and the hyphon(-).
-
-This plugin lends the good old Word behaviour to Xinha, as ",', and - get converted to their respective typographic correct relatives while typing.
-It also replaces ... with the ellipsis sign (which is three dots combined in one glyph that is considered typographically better).
-
- Configuration (to change the quote style from default English):
-  * through language file (see lang/de.js)
-  * through a config variable (an array that holds four values: opening single quote, closing single quote, opening double quote, closing double quote)
-  
- Additional config option:
-  * disable automatic replacement by default
-  
- Additional features:
-  * can be switched on/off
-  * convert all quotes/dashes in a document that still has the boring  "/- stuff
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/Stylist/Stylist.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/Stylist/Stylist.js
deleted file mode 100644
index 620c030..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/Stylist/Stylist.js
+++ /dev/null
@@ -1,717 +0,0 @@
-/**
- * Add an empty css_style to Config object's prototype
- *  the format is { '.className' : 'Description' }
- */
-
-Xinha.Config.prototype.css_style = { };
-
-/**
- * This method loads an external stylesheet and uses it in the stylist
- *
- * @param string URL to the stylesheet
- * @param hash Alternate descriptive names for your classes 
- *              { '.fooclass': 'Foo Description' }
- * @param bool If set true then @import rules in the stylesheet are skipped,
- *   otherwise they will be incorporated if possible.
- */
- 
-Xinha.Config.prototype.stylistLoadStylesheet = function(url, altnames, skip_imports)
-{
-  if(!altnames) altnames = { };
-  var newStyles = Xinha.ripStylesFromCSSFile(url, skip_imports);
-  for(var i in newStyles)
-  {
-    if(altnames[i])
-    {
-      this.css_style[i] = altnames[i];
-    }
-    else
-    {
-      this.css_style[i] = newStyles[i];
-    }
-  }
-  
-  for(var x = 0; x < this.pageStyleSheets.length; x++)
-  {
-    if(this.pageStyleSheets[x] == url) return;
-  }
-  this.pageStyleSheets[this.pageStyleSheets.length] = url;
-};
-
-/**
- * This method takes raw style definitions and uses them in the stylist
- *
- * @param string CSS
- *
- * @param hash Alternate descriptive names for your classes 
- *              { '.fooclass': 'Foo Description' }
- *
- * @param bool If set true then @import rules in the stylesheet are skipped,
- *   otherwise they will be incorporated if possible.
- *
- * @param string If skip_imports is false, this string should contain
- *   the "URL" of the stylesheet these styles came from (doesn't matter
- *   if it exists or not), it is used when resolving relative URLs etc.  
- *   If not provided, it defaults to Xinha.css in the Xinha root.
- */
- 
-Xinha.Config.prototype.stylistLoadStyles = function(styles, altnames, skip_imports, imports_relative_to)
-{
-  if(!altnames) altnames = { };
-  var newStyles = Xinha.ripStylesFromCSSString(styles, skip_imports);
-  for(var i in newStyles)
-  {
-    if(altnames[i])
-    {
-      this.css_style[i] = altnames[i];
-    }
-    else
-    {
-      this.css_style[i] = newStyles[i];
-    }
-  }
-  this.pageStyle += styles;
-};
-
-
-
-/**
- * Fill the stylist panel with styles that may be applied to the current selection.  Styles
- * are supplied in the css_style property of the Xinha.Config object, which is in the format
- * { '.className' : 'Description' }
- * classes that are defined on a specific tag (eg 'a.email_link') are only shown in the panel
- *    when an element of that type is selected.
- * classes that are defined with selectors/psuedoclasses (eg 'a.email_link:hover') are never
- *    shown (if you have an 'a.email_link' without the pseudoclass it will be shown of course)
- * multiple classes (eg 'a.email_link.staff_member') are shown as a single class, and applied
- *    to the element as multiple classes (class="email_link staff_member")
- * you may click a class name in the stylist panel to add it, and click again to remove it
- * you may add multiple classes to any element
- * spans will be added where no single _and_entire_ element is selected
- */
-Xinha.prototype._fillStylist = function()
-{
-  if(!this.plugins.Stylist.instance.dialog) return false;
-  var main = this.plugins.Stylist.instance.dialog.main;
-  main.innerHTML = '';
-
-  var may_apply = true;
-  var sel       = this._getSelection();
-
-  // What is applied
-  // var applied = this._getAncestorsClassNames(this._getSelection());
-
-  // Get an active element
-  var active_elem = this._activeElement(sel);
-
-  for(var x in this.config.css_style)
-  {
-    var tag   = null;
-    var className = x.trim();
-    var applicable = true;
-    var apply_to   = active_elem;
-
-    if(applicable && /[^a-zA-Z0-9_.-]/.test(className))
-    {
-      applicable = false; // Only basic classes are accepted, no selectors, etc.. presumed
-                          // that if you have a.foo:visited you'll also have a.foo
-      // alert('complex');
-    }
-
-    if(className.indexOf('.') < 0)
-    {
-      // No class name, just redefines a tag
-      applicable = false;
-    }
-
-    if(applicable && (className.indexOf('.') > 0))
-    {
-      // requires specific html tag
-      tag = className.substring(0, className.indexOf('.')).toLowerCase();
-      className = className.substring(className.indexOf('.'), className.length);
-
-      // To apply we must have an ancestor tag that is the right type
-      if(active_elem != null && active_elem.tagName.toLowerCase() == tag)
-      {
-        applicable = true;
-        apply_to = active_elem;
-      }
-      else
-      {
-        if(this._getFirstAncestor(this._getSelection(), [tag]) != null)
-        {
-          applicable = true;
-          apply_to = this._getFirstAncestor(this._getSelection(), [tag]);
-        }
-        else
-        {
-          // alert (this._getFirstAncestor(this._getSelection(), tag));
-          // If we don't have an ancestor, but it's a div/span/p/hx stle, we can make one
-          if(( tag == 'div' || tag == 'span' || tag == 'p'
-              || (tag.substr(0,1) == 'h' && tag.length == 2 && tag != 'hr')))
-          {
-            if(!this._selectionEmpty(this._getSelection()))
-            {
-              applicable = true;
-              apply_to = 'new';
-            }
-            else
-            {
-              // See if we can get a paragraph or header that can be converted
-              apply_to = this._getFirstAncestor(sel, ['p', 'h1', 'h2', 'h3', 'h4', 'h5', 'h6', 'h7']);
-              if(apply_to != null)
-              {
-                applicable = true;
-              }
-              else
-              {
-                applicable = false;
-              }
-            }
-          }
-          else
-          {
-            applicable = false;
-          }
-        }
-      }
-    }
-
-    if(applicable)
-    {
-      // Remove the first .
-      className = className.substring(className.indexOf('.'), className.length);
-
-      // Replace any futher ones with spaces (for multiple class definitions)
-      className = className.replace('.', ' ');
-
-      if(apply_to == null)
-      {
-        if(this._selectionEmpty(this._getSelection()))
-        {
-          // Get the previous element and apply to that
-          apply_to = this._getFirstAncestor(this._getSelection(), null);
-        }
-        else
-        {
-          apply_to = 'new';
-          tag      = 'span';
-        }
-      }
-    }
-
-    var applied    = (this._ancestorsWithClasses(sel, tag, className).length > 0 ? true : false);
-    var applied_to = this._ancestorsWithClasses(sel, tag, className);
-
-    if(applicable)
-    {
-      var anch = document.createElement('a');
-      anch.onfocus = function () { this.blur() } // prevent dotted line around link that causes horizontal scrollbar
-      anch._stylist_className = className.trim();
-      anch._stylist_applied   = applied;
-      anch._stylist_appliedTo = applied_to;
-      anch._stylist_applyTo = apply_to;
-      anch._stylist_applyTag = tag;
-
-      anch.innerHTML = this.config.css_style[x];
-      anch.href = 'javascript:void(0)';
-      var editor = this;
-      anch.onclick = function()
-      {
-        if(this._stylist_applied == true)
-        {
-          editor._stylistRemoveClasses(this._stylist_className, this._stylist_appliedTo);
-        }
-        else
-        {
-          editor._stylistAddClasses(this._stylist_applyTo, this._stylist_applyTag, this._stylist_className);
-        }
-        return false;
-      }
-
-      anch.style.display = 'block';
-      anch.style.paddingLeft = '3px';
-      anch.style.paddingTop = '1px';
-      anch.style.paddingBottom = '1px';
-      anch.style.textDecoration = 'none';
-
-      if(applied)
-      {
-        anch.style.background = 'Highlight';
-        anch.style.color = 'HighlightText';
-      }
-      anch.style.position = 'relative';
-      main.appendChild(anch);
-    }
-  }
-
-  if(main.childNodes.length)
-  {
-    this.plugins.Stylist.instance.dialog.show();
-  }
-};
-
-
-/**
- * Add the given classes (space seperated list) to the currently selected element
- * (will add a span if none selected)
- */
-Xinha.prototype._stylistAddClasses = function(el, tag, classes)
-  {
-    if(el == 'new')
-    {
-      this.insertHTML('<' + tag + ' class="' + classes + '">' + this.getSelectedHTML() + '</' + tag + '>');
-    }
-    else
-    {
-      if(tag != null && el.tagName.toLowerCase() != tag)
-      {
-        // Have to change the tag!
-        var new_el = this.switchElementTag(el, tag);
-
-        if(typeof el._stylist_usedToBe != 'undefined')
-        {
-          new_el._stylist_usedToBe = el._stylist_usedToBe;
-          new_el._stylist_usedToBe[new_el._stylist_usedToBe.length] = {'tagName' : el.tagName, 'className' : el.getAttribute('class')};
-        }
-        else
-        {
-          new_el._stylist_usedToBe = [{'tagName' : el.tagName, 'className' : el.getAttribute('class')}];
-        }
-
-        Xinha.addClasses(new_el, classes);
-      }
-      else
-      {
-        Xinha._addClasses(el, classes);
-      }
-    }
-    this.focusEditor();
-    this.updateToolbar();
-  };
-
-/**
- * Remove the given classes (space seperated list) from the given elements (array of elements)
- */
-Xinha.prototype._stylistRemoveClasses = function(classes, from)
-  {
-    for(var x = 0; x < from.length; x++)
-    {
-      this._stylistRemoveClassesFull(from[x], classes);
-    }
-    this.focusEditor();
-    this.updateToolbar();
-  };
-
-Xinha.prototype._stylistRemoveClassesFull = function(el, classes)
-{
-  if(el != null)
-  {
-    var thiers = el.className.trim().split(' ');
-    var new_thiers = [ ];
-    var ours   = classes.split(' ');
-    for(var x = 0; x < thiers.length; x++)
-    {
-      var exists = false;
-      for(var i = 0; exists == false && i < ours.length; i++)
-      {
-        if(ours[i] == thiers[x])
-        {
-          exists = true;
-        }
-      }
-      if(exists == false)
-      {
-        new_thiers[new_thiers.length] = thiers[x];
-      }
-    }
-
-    if(new_thiers.length == 0 && el._stylist_usedToBe && el._stylist_usedToBe.length > 0 && el._stylist_usedToBe[el._stylist_usedToBe.length - 1].className != null)
-    {
-      // Revert back to what we were IF the classes are identical
-      var last_el = el._stylist_usedToBe[el._stylist_usedToBe.length - 1];
-      var last_classes = Xinha.arrayFilter(last_el.className.trim().split(' '), function(c) { if (c == null || c.trim() == '') { return false;} return true; });
-
-      if(
-        (new_thiers.length == 0)
-        ||
-        (
-        Xinha.arrayContainsArray(new_thiers, last_classes)
-        && Xinha.arrayContainsArray(last_classes, new_thiers)
-        )
-      )
-      {
-        el = this.switchElementTag(el, last_el.tagName);
-        new_thiers = last_classes;
-      }
-      else
-      {
-        // We can't rely on the remembered tags any more
-        el._stylist_usedToBe = [ ];
-      }
-    }
-
-    if(     new_thiers.length > 0
-        ||  el.tagName.toLowerCase() != 'span'
-        || (el.id && el.id != '')
-      )
-    {
-      el.className = new_thiers.join(' ').trim();
-    }
-    else
-    {
-      // Must be a span with no classes and no id, so we can splice it out
-      var prnt = el.parentNode;
-      var tmp;
-      while (el.hasChildNodes())
-      {
-        if (el.firstChild.nodeType == 1)
-        {
-          // if el.firstChild is an element, we've got to recurse to make sure classes are
-          // removed from it and and any of its children.
-          this._stylistRemoveClassesFull(el.firstChild, classes);
-        }
-        tmp = el.removeChild(el.firstChild);
-        prnt.insertBefore(tmp, el);
-      }
-      prnt.removeChild(el);
-    }
-  }
-};
-
-/**
- * Change the tag of an element
- */
-Xinha.prototype.switchElementTag = function(el, tag)
-{
-  var prnt = el.parentNode;
-  var new_el = this._doc.createElement(tag);
-
-  if(Xinha.is_ie || el.hasAttribute('id'))    new_el.setAttribute('id', el.getAttribute('id'));
-  if(Xinha.is_ie || el.hasAttribute('style')) new_el.setAttribute('style', el.getAttribute('style'));
-
-  var childs = el.childNodes;
-  for(var x = 0; x < childs.length; x++)
-  {
-    new_el.appendChild(childs[x].cloneNode(true));
-  }
-
-  prnt.insertBefore(new_el, el);
-  new_el._stylist_usedToBe = [el.tagName];
-  prnt.removeChild(el);
-  this.selectNodeContents(new_el);
-  return new_el;
-};
-
-Xinha.prototype._getAncestorsClassNames = function(sel)
-{
-  // Scan upwards to find a block level element that we can change or apply to
-  var prnt = this._activeElement(sel);
-  if(prnt == null)
-  {
-    prnt = (Xinha.is_ie ? this._createRange(sel).parentElement() : this._createRange(sel).commonAncestorContainer);
-  }
-
-  var classNames = [ ];
-  while(prnt)
-  {
-    if(prnt.nodeType == 1)
-    {
-      var classes = prnt.className.trim().split(' ');
-      for(var x = 0; x < classes.length; x++)
-      {
-        classNames[classNames.length] = classes[x];
-      }
-
-      if(prnt.tagName.toLowerCase() == 'body') break;
-      if(prnt.tagName.toLowerCase() == 'table'  ) break;
-    }
-      prnt = prnt.parentNode;
-  }
-
-  return classNames;
-};
-
-Xinha.prototype._ancestorsWithClasses = function(sel, tag, classes)
-{
-  var ancestors = [ ];
-  var prnt = this._activeElement(sel);
-  if(prnt == null)
-  {
-    try
-    {
-      prnt = (Xinha.is_ie ? this._createRange(sel).parentElement() : this._createRange(sel).commonAncestorContainer);
-    }
-    catch(e)
-    {
-      return ancestors;
-    }
-  }
-  var search_classes = classes.trim().split(' ');
-
-  while(prnt)
-  {
-    if(prnt.nodeType == 1 && prnt.className)
-    {
-      if(tag == null || prnt.tagName.toLowerCase() == tag)
-      {
-        var classes = prnt.className.trim().split(' ');
-        var found_all = true;
-        for(var i = 0; i < search_classes.length; i++)
-        {
-          var found_class = false;
-          for(var x = 0; x < classes.length; x++)
-          {
-            if(search_classes[i] == classes[x])
-            {
-              found_class = true;
-              break;
-            }
-          }
-
-          if(!found_class)
-          {
-            found_all = false;
-            break;
-          }
-        }
-
-        if(found_all) ancestors[ancestors.length] = prnt;
-      }
-      if(prnt.tagName.toLowerCase() == 'body')    break;
-      if(prnt.tagName.toLowerCase() == 'table'  ) break;
-    }
-    prnt = prnt.parentNode;
-  }
-
-  return ancestors;
-};
-
-
-Xinha.ripStylesFromCSSFile = function(URL, skip_imports)
-{
-  var css = Xinha._geturlcontent(URL);
- 
-  return Xinha.ripStylesFromCSSString(css, skip_imports, URL);
-};
-
-Xinha.ripStylesFromCSSString = function(css, skip_imports, imports_relative_to)
-{
-  if(!skip_imports)
-  {    
-    if(!imports_relative_to) 
-    {
-      imports_relative_to = _editor_url + 'Xinha.css'
-    }
-    
-    var seen = { };
-    
-    function resolve_imports(css, url)
-    {
-      seen[url] = true; // protects against infinite recursion
-      
-      var RE_atimport = '@import\\s*(url\\()?["\'](.*)["\'].*';
-      var imports = css.match(new RegExp(RE_atimport,'ig'));
-      var m, file, re = new RegExp(RE_atimport,'i');
-
-      if (imports)
-      {
-        var path = url.replace(/\?.*$/,'').split("/");
-        path.pop();
-        path = path.join('/');
-        for (var i=0;i<imports.length;i++)
-        {
-          m = imports[i].match(re);
-          file = m[2];
-          if (!file.match(/^([^:]+\:)?\//))
-          {
-            file = Xinha._resolveRelativeUrl(path,file);
-          }
-                    
-          if(seen[file]) continue;
-          
-          css += resolve_imports(Xinha._geturlcontent(file), file);
-        }
-      }
-      
-      return css;
-    }
-    
-    css = resolve_imports(css, imports_relative_to);
-  }
-
-  // We are only interested in the selectors, the rules are not important
-  //  so we'll drop out all coments and rules
-  var RE_comment = /\/\*(.|\r|\n)*?\*\//g;
-  var RE_rule    = /\{(.|\r|\n)*?\}/g;
-  var RE_special = /\@[a-zA-Z]+[^;]*;/g;
-
-  css = css.replace(RE_comment, '');
-  css = css.replace(RE_special, ',');
-  css = css.replace(RE_rule, ',');
-
-  // And split on commas
-  css = css.split(',');
-
-  // And add those into our structure
-  var selectors = { };
-  for(var x = 0; x < css.length; x++)
-  {
-    if(css[x].trim())
-    {
-      selectors[css[x].trim()] = css[x].trim();
-    }
-  }
-
-
-  return selectors;
-};
-
-// Make our right side panel and insert appropriatly
-function Stylist(editor, args)
-{
-  this.editor = editor;
- 
-  var stylist = this;
-
-}
-
-Stylist._pluginInfo =
-{
-  name     : "Stylist",
-  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/"
-};
-
-Stylist.prototype.onGenerateOnce = function()
-{
-  var cfg = this.editor.config;
-  if(typeof cfg.css_style != 'undefined' && Xinha.objectProperties(cfg.css_style).length != 0)
-  {
-    this._prepareDialog();
-  }
-
-};
-Stylist.prototype._prepareDialog = function()
-{
-  var editor = this.editor;
-  var stylist = this;
-
-  var html = '<h1><l10n>Styles</l10n></h1>';
-  
-  this.dialog = new Xinha.Dialog(editor, html, 'Stylist',{width:200},{modal:false,closable:false});
-	Xinha._addClass( this.dialog.rootElem, 'Stylist' );
-	this.dialog.attachToPanel('right');
-  // this.dialog.show();
-  
-	var dialog = this.dialog;
-	var main = this.dialog.main;
-	var caption = this.dialog.captionBar;
-	
-  main.style.overflow = "auto";
-  main.style.height = this.editor._framework.ed_cell.offsetHeight - caption.offsetHeight + 'px';
-
-  editor.notifyOn('modechange',
-  function(e,args)
-  {
-    if (!dialog.attached)
-    {
-      return;
-    }
-    switch(args.mode)
-    {
-      case 'text':
-      {
-        dialog.hide();
-        break;
-      }
-      case 'wysiwyg':
-      {
-        dialog.show();
-        break;
-      }
-    }
-  }
-  );
-  editor.notifyOn('panel_change',
-  function(e,args)
-  {
-    if (!dialog.attached)
-    {
-      return;
-    }
-    switch (args.action)
-    {
-      case 'show':
-      var newHeight = main.offsetHeight - args.panel.offsetHeight;
-      main.style.height = ((newHeight > 0) ?  main.offsetHeight - args.panel.offsetHeight : 0) + 'px';
-      dialog.rootElem.style.height = caption.offsetHeight + "px";
-      editor.sizeEditor();
-      break;
-      case 'hide':
-      stylist.resize();
-      break;
-    }
-  }
-  );
-  editor.notifyOn('before_resize',
-  function()
-  {
-    if (!dialog.attached)
-    {
-      return;
-    }
-    dialog.rootElem.style.height = caption.offsetHeight + "px";
-  }
-  );
-  editor.notifyOn('resize',
-  function()
-  {
-    if (!dialog.attached)
-    {
-      return;
-    }
-    stylist.resize();
-  }
-  );
-}
-Stylist.prototype.resize = function()
-{
-  var editor = this.editor;
-  var rootElem = this.dialog.rootElem;
-  
-  if (rootElem.style.display == 'none') return;
-  
-  var panelContainer = rootElem.parentNode;
-
-  var newSize = panelContainer.offsetHeight;
-  for (var i=0; i < panelContainer.childNodes.length;++i)
-  {
-    if (panelContainer.childNodes[i] == rootElem || !panelContainer.childNodes[i].offsetHeight)
-    {
-      continue;
-    }
-    newSize -= panelContainer.childNodes[i].offsetHeight;
-  }
-  rootElem.style.height = newSize-5 + 'px';
-  this.dialog.main.style.height = newSize - this.dialog.captionBar.offsetHeight -5 + 'px';
-}
-
-Stylist.prototype.onUpdateToolbar = function()
-{
-  if(this.dialog)
-  {
-    if(this._timeoutID)
-    {
-      window.clearTimeout(this._timeoutID);
-    }
-
-    var e = this.editor;
-    this._timeoutID = window.setTimeout(function() { if(e.editorIsActivated()) e._fillStylist(); }, 500);
-  }
-};
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/Stylist/lang/de.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/Stylist/lang/de.js
deleted file mode 100644
index efc24e9..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/Stylist/lang/de.js
+++ /dev/null
@@ -1,13 +0,0 @@
-// I18N constants
-// LANG: "de", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Styles": "Stile"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/Stylist/lang/fr.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/Stylist/lang/fr.js
deleted file mode 100644
index 082146d..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/Stylist/lang/fr.js
+++ /dev/null
@@ -1,13 +0,0 @@
-// I18N constants
-// LANG: "fr", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Styles": "Styles"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/Stylist/lang/ja.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/Stylist/lang/ja.js
deleted file mode 100644
index ba898f1..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/Stylist/lang/ja.js
+++ /dev/null
@@ -1,13 +0,0 @@
-// I18N constants
-// LANG: "ja", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Styles": "スタイル"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/Stylist/lang/lc_base.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/Stylist/lang/lc_base.js
deleted file mode 100644
index 354b51d..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/Stylist/lang/lc_base.js
+++ /dev/null
@@ -1,25 +0,0 @@
-// I18N constants
-//
-// LANG: "en", ENCODING: UTF-8
-// Author: Translator-Name, <email@example.com>
-//
-// Last revision: 2018-04-12
-// 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).
-//
-// (Please, remove information below)
-// 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.)
-
-{
-    "Styles": ""
-}
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/Stylist/lang/nb.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/Stylist/lang/nb.js
deleted file mode 100644
index fd58260..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/Stylist/lang/nb.js
+++ /dev/null
@@ -1,13 +0,0 @@
-// I18N constants
-// LANG: "nb", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Styles": "Stiler"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/Stylist/lang/nl.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/Stylist/lang/nl.js
deleted file mode 100644
index 47e8d94..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/Stylist/lang/nl.js
+++ /dev/null
@@ -1,13 +0,0 @@
-// I18N constants
-// LANG: "nl", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Styles": "Style"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/Stylist/lang/pl.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/Stylist/lang/pl.js
deleted file mode 100644
index 129a308..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/Stylist/lang/pl.js
+++ /dev/null
@@ -1,13 +0,0 @@
-// I18N constants
-// LANG: "pl", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Styles": "Style"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/Stylist/lang/pt_br.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/Stylist/lang/pt_br.js
deleted file mode 100644
index c9d58de..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/Stylist/lang/pt_br.js
+++ /dev/null
@@ -1,13 +0,0 @@
-// I18N constants
-// LANG: "pt_br", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Styles": "Estilos"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/Stylist/lang/ru.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/Stylist/lang/ru.js
deleted file mode 100644
index 2ff97e2..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/Stylist/lang/ru.js
+++ /dev/null
@@ -1,13 +0,0 @@
-// I18N constants
-// LANG: "ru", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Styles": "Стили"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/SuperClean/SuperClean.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/SuperClean/SuperClean.js
deleted file mode 100644
index e35a437..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/SuperClean/SuperClean.js
+++ /dev/null
@@ -1,182 +0,0 @@
-/** superClean combines HTMLTidy, Word Cleaning and font stripping into a single function
- *  it works a bit differently in how it asks for parameters */
-
-function SuperClean(editor, args)
-{
-  this.editor = editor;
-  var superclean = this;
-  editor._superclean_on = false;
-  editor.config.registerButton('superclean', this._lc("Clean up HTML"), [_editor_url +'iconsets/Tango/ed_buttons_main.png',6,4], true, function(e, objname, obj) { superclean._superClean(null, obj); });
-
-  // See if we can find 'killword' and replace it with superclean
-  editor.config.addToolbarElement("superclean", "killword", 0);
-}
-
-SuperClean._pluginInfo =
-{
-  name     : "SuperClean",
-  version  : "1.0",
-  developer: "James Sleeman, Niko Sams",
-  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/"
-};
-
-SuperClean.prototype._lc = function(string) {
-    return Xinha._lc(string, 'SuperClean');
-};
-
-Xinha.Config.prototype.SuperClean =
-{
-  // set to the URL of a handler for html tidy, this handler
-  //  (see tidy.php for an example) must that a single post variable
-  //  "content" which contains the HTML to tidy, and return javascript like
-  //  editor.setHTML('<strong>Tidied Html</strong>')
-  // it's called through XMLHTTPRequest
-  'tidy_handler': Xinha.getPluginDir("SuperClean") + '/tidy.php',
-
-  // set additional arguments needed for the tidy request 
-  'tidy_args' : {},  
-
-  //avaliable filters (these are built-in filters)
-  // You can either use
-  //    'filter_name' : "Label/Description String"
-  // or 'filter_name' : {label: "Label", checked: true/false, filterFunction: function(html) { ... return html;} }
-  // filterFunction in the second format above is optional.
-
-  'filters': { 'tidy':          {label:Xinha._lc('General tidy up and correction of some problems.', 'SuperClean'), checked:true, fullonly: true},
-               'word_clean':    {label:Xinha._lc('Clean bad HTML from Microsoft Word.', 'SuperClean'), checked:true, fullonly: true},              
-               'word':          {label:Xinha._lc('Vigorously purge HTML from Microsoft Word.', 'SuperClean'), checked:false, fullonly: true},
-               'remove_faces':  {label:Xinha._lc('Remove custom typefaces (font "styles").', 'SuperClean'),checked:true},
-               'remove_sizes':  {label:Xinha._lc('Remove custom font sizes.', 'SuperClean'),checked:true},
-               'remove_colors': {label:Xinha._lc('Remove custom text colors.', 'SuperClean'),checked:true},
-               'remove_emphasis': {label:Xinha._lc('Remove emphasis and annotations.', 'SuperClean'), checked:true},
-               'remove_sup_sub':  {label:Xinha._lc('Remove superscripts and subscripts.', 'SuperClean'), checked:false},
-               'remove_alignment': {label:Xinha._lc('Remove alignment (left/right/justify).', 'SuperClean'),checked:true},
-               'remove_all_css_classes': {label:Xinha._lc('Remove all classes (CSS).', 'SuperClean'), checked: false},
-               'remove_all_css_styles':         {label:Xinha._lc('Remove all styles (CSS).', 'SuperClean'),checked:true},
-               'remove_lang': {label:Xinha._lc('Remove lang attributes.', 'SuperClean'),checked:true},
-               'remove_fancy_quotes': {label:Xinha._lc('Replace directional quote marks with non-directional quote marks.', 'SuperClean'), checked:false},
-  //additional custom filters (defined in plugins/SuperClean/filters/word.js)
-               'paragraph':{label:Xinha._lc('Remove Paragraphs', 'SuperClean'), checked:false},
-               'remove_all_tags': {label:Xinha._lc('Remove All HTML Tags', 'SuperClean'), checked:false }
-             },
-  //if false all filters are applied, if true a dialog asks what filters should be used
-  'show_dialog': true
-};
-
-SuperClean.filterFunctions = { };
-
-/** Helper function to strip tags from given html.
- * 
- * @param string
- * @param array|string An array pf tag names, or a tag name string
- * @param bool         true == completely remove tag and contents, false == remove tag only
- * @return string
- */
-
-SuperClean.stripTags = function(html, tagNames, completelyRemove)
-{
-  if(typeof tagNames == 'string')
-  {
-    tagNames = [ tagNames ];
-  }
-  
-  for(var i = 0; i < tagNames.length; i++)
-  {
-    var tagName = tagNames[i];
-    if(completelyRemove)
-    {
-      html = html.replace(new RegExp('<'+tagName+'( [^>]*)?>.*?</'+tagName+'( [^>]*)?>', 'gi'), '');
-    }
-    else
-    {
-      html = html.replace(new RegExp('</?'+tagName+'( [^>]*)?>', 'gi'), '');
-    }
-  }
-  
-  return html;
-}
-
-SuperClean.stripAttributes = function(html, attributeNames)
-{
-  if(typeof attributeNames == 'string')
-  {
-    attributeNames = [ attributeNames ];
-  }
-  
-  for(var i = 0; i < attributeNames.length; i++)
-  {
-    var attributeName = attributeNames[i];
-    
-    // @TODO - make this less likely to false-positive outside of tags
-    html = html.replace(new RegExp(' ('+attributeName+'="[^"]*"|'+attributeName+'=\'[^\']*\'|'+attributeName+'=[^ >]*)', 'gi'), ' ');    
-  }
-  
-  return html;
-}
-
-SuperClean.prototype.onGenerateOnce = function()
-{
-
-  if(this.editor.config.tidy_handler)
-  {
-    //for backwards compatibility
-    this.editor.config.SuperClean.tidy_handler = this.editor.config.tidy_handler;
-    this.editor.config.tidy_handler = null;
-  }
-  if(!this.editor.config.SuperClean.tidy_handler && this.editor.config.filters.tidy) {
-    //unset tidy-filter if no tidy_handler
-    this.editor.config.filters.tidy = null;
-  }
-  SuperClean.loadAssets();
-  this.loadFilters();
-};
-
-SuperClean.prototype.onUpdateToolbar = function()
-{ 
-  if (!(SuperClean.methodsReady && SuperClean.html))
-  {
-    this.editor._toolbarObjects.superclean.state("enabled", false);
-  }
-  else this.onUpdateToolbar = null;
-};
-
-SuperClean.loadAssets = function()
-{
-  var self = SuperClean;
-  if (self.loading) return;
-  self.loading = true;
-  Xinha._getback(Xinha.getPluginDir("SuperClean") + '/pluginMethods.js', function(getback) { eval(getback); self.methodsReady = true; });
-  Xinha._getback( Xinha.getPluginDir("SuperClean") + '/dialog.html', function(getback) { self.html = getback; } );
-};
-
-SuperClean.prototype.loadFilters = function()
-{
-  var sc = this;
-  //load the filter-functions
-  for(var filter in this.editor.config.SuperClean.filters)
-  {
-    if (/^(remove_colors|remove_sizes|remove_faces|remove_lang|word_clean|remove_fancy_quotes|tidy|remove_emphasis|remove_sup_sub|remove_alignment|remove_all_css_classes|remove_all_css_styles|remove_all_tags)$/.test(filter)) continue; //skip built-in functions
-    
-    if(!SuperClean.filterFunctions[filter])
-    {
-      var filtDetail = this.editor.config.SuperClean.filters[filter];
-      if(typeof filtDetail.filterFunction != 'undefined')
-      {
-        SuperClean.filterFunctions[filter] = filterFunction;
-      }
-      else
-      {
-        Xinha._getback(Xinha.getPluginDir("SuperClean") + '/filters/'+filter+'.js',
-                      function(func) {
-                        eval('SuperClean.filterFunctions.'+filter+'='+func+';');
-                        sc.loadFilters();
-                      });
-      }
-      return;
-    }
-  }
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/SuperClean/dialog.html b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/SuperClean/dialog.html
deleted file mode 100644
index f3f88d9..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/SuperClean/dialog.html
+++ /dev/null
@@ -1,24 +0,0 @@
-<h1 id="[h1]"><l10n>Clean up HTML</l10n></h1>
-<div style="margin-left: 10px;margin-right:10px;" id="[main]">
-    <l10n>Please select from the following cleaning options...</l10n>
-    <!--filters-->
-    
-    
-    
-    <fieldset style="margin-top:10px;">
-      <legend><l10n>Cleaning Scope</l10n></legend>
-      <select name="[scope]">
-        <option value="full"><l10n>Clean Entire Editor Contents<l10n></option>
-        <option value="selection"><l10n>Clean Selection Only</l10n></option>
-      </select>
-      <p id="[note]"><l10n>^ - Items so marked operate on the entire editor contents regardless of this setting.</l10n></p>
-    </fieldset>
-</div>
-
-<div id="[waiting]" style="display:none;margin:3em 1em;text-align:center"><l10n>Please stand by while cleaning in process...</l10n></div>
-<div id="[alert]" style="display:none;margin:3em 1em;text-align:center"></l10n></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-1.5.1/plugins/SuperClean/filters/paragraph.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/SuperClean/filters/paragraph.js
deleted file mode 100644
index 041a575..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/SuperClean/filters/paragraph.js
+++ /dev/null
@@ -1,6 +0,0 @@
-function(html) {
-  html = html.replace(/<\s*p[^>]*>/gi, '');
-  html = html.replace(/<\/\s*p\s*>/gi, '');
-  html = html.trim();
-  return html;
-} 
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/SuperClean/filters/word.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/SuperClean/filters/word.js
deleted file mode 100644
index 495a719..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/SuperClean/filters/word.js
+++ /dev/null
@@ -1,53 +0,0 @@
-function(html) {
-    // Remove HTML comments
-	html = html.replace(/<!--[\w\s\d@{}:.;,'"%!#_=&|?~()[*+\/\-\]]*-->/gi, "" );
-	html = html.replace(/<!--[^\0]*-->/gi, '');
-    // Remove all HTML tags
-	html = html.replace(/<\/?\s*HTML[^>]*>/gi, "" );
-    // Remove all BODY tags
-    html = html.replace(/<\/?\s*BODY[^>]*>/gi, "" );
-    // Remove all META tags
-	html = html.replace(/<\/?\s*META[^>]*>/gi, "" );
-    // Remove all SPAN tags
-	html = html.replace(/<\/?\s*SPAN[^>]*>/gi, "" );
-	// Remove all FONT tags
-    html = html.replace(/<\/?\s*FONT[^>]*>/gi, "");
-    // Remove all IFRAME tags.
-    html = html.replace(/<\/?\s*IFRAME[^>]*>/gi, "");
-    // Remove all STYLE tags & content
-	html = html.replace(/<\/?\s*STYLE[^>]*>(.|[\n\r\t])*<\/\s*STYLE\s*>/gi, "" );
-    // Remove all TITLE tags & content
-	html = html.replace(/<\s*TITLE[^>]*>(.|[\n\r\t])*<\/\s*TITLE\s*>/gi, "" );
-	// Remove javascript
-    html = html.replace(/<\s*SCRIPT[^>]*>[^\0]*<\/\s*SCRIPT\s*>/gi, "");
-    // Remove all HEAD tags & content
-	html = html.replace(/<\s*HEAD[^>]*>(.|[\n\r\t])*<\/\s*HEAD\s*>/gi, "" );
-	// Remove Class attributes
-	html = html.replace(/<\s*(\w[^>]*) class=([^ |>]*)([^>]*)/gi, "<$1$3") ;
-	// Remove Style attributes
-	html = html.replace(/<\s*(\w[^>]*) style="([^"]*)"([^>]*)/gi, "<$1$3") ;
-	// Remove Lang attributes
-	html = html.replace(/<\s*(\w[^>]*) lang=([^ |>]*)([^>]*)/gi, "<$1$3") ;
-	// Remove XML elements and declarations
-	html = html.replace(/<\\?\?xml[^>]*>/gi, "") ;
-	// Remove Tags with XML namespace declarations: <o:p></o:p>
-	html = html.replace(/<\/?\w+:[^>]*>/gi, "") ;
-	// Replace the &nbsp;
-	html = html.replace(/&nbsp;/, " " );
-
-	// Transform <p><br /></p> to <br>
-	//html = html.replace(/<\s*p[^>]*>\s*<\s*br\s*\/>\s*<\/\s*p[^>]*>/gi, "<br>");
-	html = html.replace(/<\s*p[^>]*><\s*br\s*\/?>\s*<\/\s*p[^>]*>/gi, "<br>");
-	
-	// Remove <P> 
-	html = html.replace(/<\s*p[^>]*>/gi, "");
-	
-	// Replace </p> with <br>
-	html = html.replace(/<\/\s*p[^>]*>/gi, "<br>");
-	
-	// Remove any <br> at the end
-	html = html.replace(/(\s*<br>\s*)*$/, "");
-	
-	html = html.trim();
-	return html;
-} 
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/SuperClean/img/ed_superclean.gif b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/SuperClean/img/ed_superclean.gif
deleted file mode 100644
index 53180a8..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/SuperClean/img/ed_superclean.gif
+++ /dev/null
Binary files differ
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/SuperClean/lang/ch.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/SuperClean/lang/ch.js
deleted file mode 100644
index 9d78e44..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/SuperClean/lang/ch.js
+++ /dev/null
@@ -1,14 +0,0 @@
-// I18N constants
-// LANG: "ch", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Cancel": "取消",
-    "OK": "好"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/SuperClean/lang/cz.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/SuperClean/lang/cz.js
deleted file mode 100644
index 36b9929..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/SuperClean/lang/cz.js
+++ /dev/null
@@ -1,14 +0,0 @@
-// I18N constants
-// LANG: "cz", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Cancel": "Zrušit",
-    "OK": "OK"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/SuperClean/lang/da.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/SuperClean/lang/da.js
deleted file mode 100644
index 4f9353f..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/SuperClean/lang/da.js
+++ /dev/null
@@ -1,28 +0,0 @@
-// I18N constants
-// LANG: "da", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Cancel": "Annuller",
-    "Clean up HTML": "Rengør HTML",
-    "General tidy up and correction of some problems.": "Generel oprydning og rettelse af diverse problemer.",
-    "OK": "OK",
-    "Please select from the following cleaning options...": "Vælg et eller flere af følgende rengøringsværktøjer...",
-    "Remove custom font sizes.": "Slet skriftstørrelser.",
-    "Remove custom text colors.": "Slet tekstfarver.",
-    "Remove custom typefaces (font \"styles\").": "Slet skriftsnit (font \"styles\").",
-    "Remove lang attributes.": "Slet lang attributter.",
-    "Replace directional quote marks with non-directional quote marks.": "Erstat directional anførselstegn med ikke-directional anførselstegn",
-    "__OBSOLETE__": {
-        "Clean bad HTML from Microsoft Word": "Rengør uønsket HTML fra Microsoft Word",
-        "Go": "Ok",
-        "Tidy failed.  Check your HTML for syntax errors.": "Tidy mislykkedes. Tjek din HTML for syntaksfejl.",
-        "You don't have anything to tidy!": "Der er ikke noget at rengøre!"
-    }
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/SuperClean/lang/de.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/SuperClean/lang/de.js
deleted file mode 100644
index 437ca8d..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/SuperClean/lang/de.js
+++ /dev/null
@@ -1,28 +0,0 @@
-// I18N constants
-// LANG: "de", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Cancel": "Abbrechen",
-    "Clean up HTML": "HTML säubern",
-    "General tidy up and correction of some problems.": "Allgemeines aufräumen und Korrektur einiger Probleme.",
-    "OK": "OK",
-    "Please select from the following cleaning options...": "Bitte Optionen auswählen...",
-    "Please stand by while cleaning in process...": "Bitte warten Sie, während die Säuberung läuft...",
-    "Remove custom font sizes.": "Schriftgrößen entfernen (font size).",
-    "Remove custom text colors.": "Schriftfarben entfernen (font color).",
-    "Remove custom typefaces (font \"styles\").": "Schriftarten entfernen (font face).",
-    "Remove lang attributes.": "Sprachattribute entfernen.",
-    "__OBSOLETE__": {
-        "Clean bad HTML from Microsoft Word": "Schlechtes HTML aus Microsoft Word aufräumen",
-        "Go": "Go",
-        "Tidy failed.  Check your HTML for syntax errors.": "Säubern fehlgeschlagen. Überprüfen Sie Ihren Code auf Fehler.",
-        "You don't have anything to tidy!": "Es gibt nichts zu säubern...!"
-    }
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/SuperClean/lang/ee.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/SuperClean/lang/ee.js
deleted file mode 100644
index ba916e9..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/SuperClean/lang/ee.js
+++ /dev/null
@@ -1,14 +0,0 @@
-// I18N constants
-// LANG: "ee", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Cancel": "Loobu",
-    "OK": "OK"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/SuperClean/lang/el.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/SuperClean/lang/el.js
deleted file mode 100644
index f6e006c..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/SuperClean/lang/el.js
+++ /dev/null
@@ -1,14 +0,0 @@
-// I18N constants
-// LANG: "el", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Cancel": "Ακύρωση",
-    "OK": "Εντάξει"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/SuperClean/lang/es.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/SuperClean/lang/es.js
deleted file mode 100644
index 9f23c0f..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/SuperClean/lang/es.js
+++ /dev/null
@@ -1,14 +0,0 @@
-// I18N constants
-// LANG: "es", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Cancel": "Cancelar",
-    "OK": "Aceptar"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/SuperClean/lang/eu.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/SuperClean/lang/eu.js
deleted file mode 100644
index 3bc9dbb..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/SuperClean/lang/eu.js
+++ /dev/null
@@ -1,14 +0,0 @@
-// I18N constants
-// LANG: "eu", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Cancel": "Utzi",
-    "OK": "Ados"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/SuperClean/lang/fa.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/SuperClean/lang/fa.js
deleted file mode 100644
index 84e7f7e..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/SuperClean/lang/fa.js
+++ /dev/null
@@ -1,14 +0,0 @@
-// I18N constants
-// LANG: "fa", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Cancel": "انصراف",
-    "OK": "بله"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/SuperClean/lang/fi.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/SuperClean/lang/fi.js
deleted file mode 100644
index 82552b9..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/SuperClean/lang/fi.js
+++ /dev/null
@@ -1,14 +0,0 @@
-// I18N constants
-// LANG: "fi", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Cancel": "Peruuta",
-    "OK": "Hyväksy"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/SuperClean/lang/fr.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/SuperClean/lang/fr.js
deleted file mode 100644
index b0530d7..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/SuperClean/lang/fr.js
+++ /dev/null
@@ -1,27 +0,0 @@
-// I18N constants
-// LANG: "fr", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Cancel": "Annuler",
-    "Clean up HTML": "Nettoyer le code HTML",
-    "General tidy up and correction of some problems.": "Nettoyage générique et correction des problèmes mineurs.",
-    "OK": "OK",
-    "Please select from the following cleaning options...": "Veuillez sélectionner une option de nettoyage.",
-    "Remove custom font sizes.": "Supprimer les tailles de polices personnalisées.",
-    "Remove custom text colors.": "Supprimer les couleurs de texte personalisées.",
-    "Remove custom typefaces (font \"styles\").": "Supprimer les polices personalisées (font \"styles\").",
-    "Remove lang attributes.": "Supprimer les attributs de langue.",
-    "__OBSOLETE__": {
-        "Clean bad HTML from Microsoft Word": "Nettoyer les balises HTML de Microsoft Word",
-        "Go": "Commencer",
-        "Tidy failed.  Check your HTML for syntax errors.": "Tidy a échoué. Vérifier la syntaxe HTML.",
-        "You don't have anything to tidy!": "Rien à transmettre à tidy !"
-    }
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/SuperClean/lang/he.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/SuperClean/lang/he.js
deleted file mode 100644
index a602f7c..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/SuperClean/lang/he.js
+++ /dev/null
@@ -1,14 +0,0 @@
-// I18N constants
-// LANG: "he", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Cancel": "ביטול",
-    "OK": "אישור"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/SuperClean/lang/hu.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/SuperClean/lang/hu.js
deleted file mode 100644
index b38528d..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/SuperClean/lang/hu.js
+++ /dev/null
@@ -1,14 +0,0 @@
-// I18N constants
-// LANG: "hu", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Cancel": "Mégsem",
-    "OK": "Rendben"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/SuperClean/lang/it.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/SuperClean/lang/it.js
deleted file mode 100644
index a0acb45..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/SuperClean/lang/it.js
+++ /dev/null
@@ -1,14 +0,0 @@
-// I18N constants
-// LANG: "it", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Cancel": "Annullamento",
-    "OK": "OK"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/SuperClean/lang/ja.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/SuperClean/lang/ja.js
deleted file mode 100644
index d4105ef..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/SuperClean/lang/ja.js
+++ /dev/null
@@ -1,29 +0,0 @@
-// I18N constants
-// LANG: "ja", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Cancel": "中止",
-    "Clean up HTML": "HTMLのクリーンナップ",
-    "General tidy up and correction of some problems.": "一般的な適正化といくつかの問題を修正します。",
-    "OK": "OK",
-    "Please select from the following cleaning options...": "以下のクリーンナップオプションを選択してください...",
-    "Remove custom font sizes.": "独自フォントサイズ設定の除去。",
-    "Remove custom text colors.": "独自文字色設定の除去。",
-    "Remove custom typefaces (font \"styles\").": "独自フォント名設定の除去 (font face)。",
-    "Remove lang attributes.": "言語属性の除去。",
-    "Replace directional quote marks with non-directional quote marks.": "方向つき引用符を方向なし引用符に置換。",
-    "__OBSOLETE__": {
-        "CANCEL": "中止",
-        "Clean bad HTML from Microsoft Word": "Microsoft Wordによる不正なHTMLの清潔化",
-        "Go": "実行",
-        "Tidy failed.  Check your HTML for syntax errors.": "適正化に失敗しました。HTMLの文法エラーを確認してください。",
-        "You don't have anything to tidy!": "適正化するものは何もありません!"
-    }
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/SuperClean/lang/lc_base.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/SuperClean/lang/lc_base.js
deleted file mode 100644
index da8fff9..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/SuperClean/lang/lc_base.js
+++ /dev/null
@@ -1,46 +0,0 @@
-// I18N constants
-//
-// LANG: "en", ENCODING: UTF-8
-// Author: Translator-Name, <email@example.com>
-//
-// Last revision: 2018-04-12
-// 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).
-//
-// (Please, remove information below)
-// 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.)
-
-{
-    "Cancel": "",
-    "Clean Selection Only": "",
-    "Clean bad HTML from Microsoft Word.": "",
-    "Clean up HTML": "",
-    "Cleaning Scope": "",
-    "General tidy up and correction of some problems.": "",
-    "OK": "",
-    "Please select from the following cleaning options...": "",
-    "Please stand by while cleaning in process...": "",
-    "Remove All HTML Tags": "",
-    "Remove Paragraphs": "",
-    "Remove alignment (left/right/justify).": "",
-    "Remove all classes (CSS).": "",
-    "Remove all styles (CSS).": "",
-    "Remove custom font sizes.": "",
-    "Remove custom text colors.": "",
-    "Remove custom typefaces (font \"styles\").": "",
-    "Remove emphasis and annotations.": "",
-    "Remove lang attributes.": "",
-    "Remove superscripts and subscripts.": "",
-    "Replace directional quote marks with non-directional quote marks.": "",
-    "Vigorously purge HTML from Microsoft Word.": ""
-}
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/SuperClean/lang/lt.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/SuperClean/lang/lt.js
deleted file mode 100644
index d118909..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/SuperClean/lang/lt.js
+++ /dev/null
@@ -1,14 +0,0 @@
-// I18N constants
-// LANG: "lt", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Cancel": "Atšaukti",
-    "OK": "OK"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/SuperClean/lang/lv.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/SuperClean/lang/lv.js
deleted file mode 100644
index f83d5d3..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/SuperClean/lang/lv.js
+++ /dev/null
@@ -1,14 +0,0 @@
-// I18N constants
-// LANG: "lv", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Cancel": "Atcelt",
-    "OK": "Labi"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/SuperClean/lang/nb.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/SuperClean/lang/nb.js
deleted file mode 100644
index c4ee434..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/SuperClean/lang/nb.js
+++ /dev/null
@@ -1,27 +0,0 @@
-// I18N constants
-// LANG: "nb", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Cancel": "Avbryt",
-    "Clean up HTML": "Vask HTML kode",
-    "General tidy up and correction of some problems.": "Generell opprydding i HTML koden samt korrigering av typiske feil",
-    "OK": "OK",
-    "Please select from the following cleaning options...": "Vennligst velg blandt de forskjellige mulighetene å vaske/ rydde i HTML koden",
-    "Remove custom font sizes.": "Fjerne egendefinerte skriftstørrelser (font size)",
-    "Remove custom text colors.": "Fjerne egendefinerte skriftfarger (font color)",
-    "Remove custom typefaces (font \"styles\").": "Fjerne egendefinerte skrifttyper (font face)",
-    "Remove lang attributes.": "Fjerne lang-attributter.",
-    "__OBSOLETE__": {
-        "Clean bad HTML from Microsoft Word": "Vask HTML kode for feil og problemer etter Microsoft Word",
-        "Go": "Utfør",
-        "Tidy failed.  Check your HTML for syntax errors.": "Tidy (Programmet som retter HTML koden) feilet. Vennligst se over HTML koden for feil.",
-        "You don't have anything to tidy!": "Det finnes ingen HTML kode å vaske!"
-    }
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/SuperClean/lang/nl.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/SuperClean/lang/nl.js
deleted file mode 100644
index 1bc8a8b..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/SuperClean/lang/nl.js
+++ /dev/null
@@ -1,27 +0,0 @@
-// I18N constants
-// LANG: "nl", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Cancel": "Annuleren",
-    "Clean up HTML": "HTML opschonen",
-    "General tidy up and correction of some problems.": "Algemeen opschonen en correctie",
-    "OK": "OK",
-    "Please select from the following cleaning options...": "Selecteer de gewenste opschoon opties...",
-    "Remove custom font sizes.": "Verwijder aangepaste lettergroottes (font size)",
-    "Remove custom text colors.": "Verwijder aangepaste tekstkleuren (font color)",
-    "Remove custom typefaces (font \"styles\").": "Verwijder aangepaste lettertypes (font face)",
-    "Remove lang attributes.": "Verwijder alle taal (lang) attributen.",
-    "__OBSOLETE__": {
-        "Clean bad HTML from Microsoft Word": "Overbodige/verkeerde HTML van Microsoft Word opschonen",
-        "Go": "Opschonen",
-        "Tidy failed.  Check your HTML for syntax errors.": "Tidy mislukt. Controleer HTML op fouten.",
-        "You don't have anything to tidy!": "Er is niets om op te schonen!"
-    }
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/SuperClean/lang/pl.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/SuperClean/lang/pl.js
deleted file mode 100644
index 7779afc..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/SuperClean/lang/pl.js
+++ /dev/null
@@ -1,14 +0,0 @@
-// I18N constants
-// LANG: "pl", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Cancel": "Anuluj",
-    "OK": "OK"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/SuperClean/lang/pt_br.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/SuperClean/lang/pt_br.js
deleted file mode 100644
index 488fd3f..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/SuperClean/lang/pt_br.js
+++ /dev/null
@@ -1,26 +0,0 @@
-// I18N constants
-// LANG: "pt_br", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Cancel": "Cancelar",
-    "Clean up HTML": "Limpar HTML",
-    "General tidy up and correction of some problems.": "Limpesa geral e correção de alguns problemas.",
-    "OK": "OK",
-    "Please select from the following cleaning options...": "Por favor, selecione uma das opções de limpesa...",
-    "Remove custom font sizes.": "Remover tamanho de fontes personalizados (font size).",
-    "Remove custom text colors.": "Remover cores de texto personalizados (font color).",
-    "Remove custom typefaces (font \"styles\").": "Remover tipos de letras personalizadas (font \"styles\").",
-    "Remove lang attributes.": "Remover atributos de idioma.",
-    "__OBSOLETE__": {
-        "Clean bad HTML from Microsoft Word": "Limpar códigos mal formatados do Microsoft Word",
-        "Tidy failed.  Check your HTML for syntax errors.": "Limpesa falhou. Verifique seu HTML por erros de sintaxe.",
-        "You don't have anything to tidy!": "Você não possui nada para limpar!"
-    }
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/SuperClean/lang/ro.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/SuperClean/lang/ro.js
deleted file mode 100644
index 9d6e1c3..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/SuperClean/lang/ro.js
+++ /dev/null
@@ -1,14 +0,0 @@
-// I18N constants
-// LANG: "ro", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Cancel": "Renunţă",
-    "OK": "Acceptă"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/SuperClean/lang/ru.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/SuperClean/lang/ru.js
deleted file mode 100644
index fad59f2..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/SuperClean/lang/ru.js
+++ /dev/null
@@ -1,14 +0,0 @@
-// I18N constants
-// LANG: "ru", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Cancel": "Отмена",
-    "OK": "OK"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/SuperClean/lang/sh.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/SuperClean/lang/sh.js
deleted file mode 100644
index 62e76f7..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/SuperClean/lang/sh.js
+++ /dev/null
@@ -1,14 +0,0 @@
-// I18N constants
-// LANG: "sh", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Cancel": "Poništi",
-    "OK": "OK"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/SuperClean/lang/si.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/SuperClean/lang/si.js
deleted file mode 100644
index 7674892..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/SuperClean/lang/si.js
+++ /dev/null
@@ -1,14 +0,0 @@
-// I18N constants
-// LANG: "si", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Cancel": "Prekliči",
-    "OK": "V redu"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/SuperClean/lang/sr.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/SuperClean/lang/sr.js
deleted file mode 100644
index b7ee6f5..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/SuperClean/lang/sr.js
+++ /dev/null
@@ -1,14 +0,0 @@
-// I18N constants
-// LANG: "sr", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Cancel": "Поништи",
-    "OK": "OK"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/SuperClean/lang/sv.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/SuperClean/lang/sv.js
deleted file mode 100644
index 98336d8..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/SuperClean/lang/sv.js
+++ /dev/null
@@ -1,14 +0,0 @@
-// I18N constants
-// LANG: "sv", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Cancel": "Avbryt",
-    "OK": "OK"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/SuperClean/lang/th.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/SuperClean/lang/th.js
deleted file mode 100644
index 9da9c8d..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/SuperClean/lang/th.js
+++ /dev/null
@@ -1,14 +0,0 @@
-// I18N constants
-// LANG: "th", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Cancel": "ยกเลิก",
-    "OK": "ตกลง"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/SuperClean/lang/tr.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/SuperClean/lang/tr.js
deleted file mode 100644
index 8a4e22a..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/SuperClean/lang/tr.js
+++ /dev/null
@@ -1,14 +0,0 @@
-// I18N constants
-// LANG: "tr", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Cancel": "İptal",
-    "OK": "Tamam"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/SuperClean/lang/vn.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/SuperClean/lang/vn.js
deleted file mode 100644
index 2d82e02..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/SuperClean/lang/vn.js
+++ /dev/null
@@ -1,14 +0,0 @@
-// I18N constants
-// LANG: "vn", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Cancel": "Hủy",
-    "OK": "Đồng ý"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/SuperClean/pluginMethods.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/SuperClean/pluginMethods.js
deleted file mode 100644
index 6412621..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/SuperClean/pluginMethods.js
+++ /dev/null
@@ -1,357 +0,0 @@
-SuperClean.prototype._superClean = function(opts, obj)
-{
-  if(this.editor.config.SuperClean.show_dialog && !this._dialog)
-  {
-    this._dialog = new SuperClean.Dialog(this);
-  }
-  var superclean = this;
-
-  // Do the clean if we got options
-  var doOK = function()
-  {
-    superclean._dialog.dialog.getElementById("main").style.display = "none";
-    superclean._dialog.dialog.getElementById("waiting").style.display = "";
-    superclean._dialog.dialog.getElementById("buttons").style.display = "none";
-    
-  	var opts = superclean._dialog.dialog.getValues();
-    var editor = superclean.editor;
-
-    if(opts.word_clean) editor._wordClean();
-    
-    var D;
-    
-    if(opts['scope'].value == 'selection')
-    {
-      D = editor.getSelectedHTML();
-    }
-    else
-    {
-      D = editor.getEditorContent();
-    }
-
-    for(var filter in editor.config.SuperClean.filters)
-    {
-      if(filter=='tidy' || filter=='word_clean') continue;
-      
-      // Any full only ones need to happen later
-      if(typeof filter == 'object' && filter.fullonly) continue;
-      
-      if(opts[filter])
-      {
-        D = SuperClean.filterFunctions[filter](D, editor);
-      }
-    }
-
-    D = D.replace(/(style|class)="\s*"/gi, '');
-    D = D.replace(/<(font|span)\s*>/gi, '');
-
-    if(opts['scope'].value == 'selection')
-    {
-      editor.insertHTML(D);
-    }
-    else
-    {
-      editor.setEditorContent(D);
-    }
-
-    // Do the full only ones
-    D = editor.getEditorContent();
-    for(var filter in editor.config.SuperClean.filters)
-    {
-      // Skip tidy we do that last, and word_clean was done
-      // first
-      if(filter=='tidy' || filter=='word_clean') continue;
-      
-      // Any full only ones need to happen last
-      if(typeof filter == 'object' && filter.fullonly && opts[filter])
-      {
-        D = SuperClean.filterFunctions[filter](D, editor);
-      }
-    }
-    
-    if(opts.tidy)
-    {
-      var callback = function(javascriptResponse) 
-      { 
-        eval("var response = " + javascriptResponse);
-        switch (response.action)
-        {
-          case 'setHTML':
-            editor.setEditorContent(response.value);
-            superclean._dialog.hide();
-          break;
-          case 'alert':
-            superclean._dialog.dialog.getElementById("buttons").style.display = "";
-            superclean._dialog.dialog.getElementById("ok").style.display = "none";
-            superclean._dialog.dialog.getElementById("waiting").style.display = "none"; 
-            superclean._dialog.dialog.getElementById("alert").style.display = ""; 
-            superclean._dialog.dialog.getElementById("alert").innerHTML = superclean._lc(response.value);
-          break;
-          default: // make the dialog go away if sth goes wrong, who knows...
-           superclean._dialog.hide();
-          break;
-        }
-      }
-      
-      var args = editor.config.SuperClean.tidy_args; 
-      if ( typeof args != 'object' ) 
-      { 
-        args = {}; 
-      } 
-      args['content'] =  editor.getInnerHTML(); 
-     
-      Xinha._postback(editor.config.SuperClean.tidy_handler, args, callback);       
-    }
-    else
-    {
-      superclean._dialog.hide();
-    }
-    return true;
-  }
-
-  if(this.editor.config.SuperClean.show_dialog)
-  {
-    var inputs = {};
-    this._dialog.show(inputs, doOK);
-  }
-  else
-  {
-    var editor = this.editor;
-    var html = editor.getEditorContent();
-    for(var filter in editor.config.SuperClean.filters)
-    {
-      if(filter=='tidy') continue; //call tidy last
-      html = SuperClean.filterFunctions[filter](html, editor);
-    }
-
-    html = html.replace(/(style|class)="\s*"/gi, '');
-    html = html.replace(/<(font|span)\s*>/gi, '');
-
-    editor.setEditorContent(html);
-
-    if(editor.config.SuperClean.filters.tidy)
-    {
-      SuperClean.filterFunctions.tidy(html, editor);
-    }
-  }
-};
-
-SuperClean.filterFunctions.remove_colors = function(D)
-{
-  D = D.replace(/color="?[^" >]*"?/gi, '');
-  // { (stops jedit's fold breaking)
-  D = D.replace(/([^-])color:[^;}"']+;?/gi, '$1');
-  return(D);
-};
-SuperClean.filterFunctions.remove_sizes = function(D)
-{
-  D = D.replace(/size="?[^" >]*"?/gi, '');
-  // { (stops jedit's fold breaking)
-  D = D.replace(/font-size:[^;}"']+;?/gi, '');
-  return(D);
-};
-SuperClean.filterFunctions.remove_faces = function(D)
-{
-  D = D.replace(/face="?[^" >]*"?/gi, '');
-  // { (stops jedit's fold breaking)
-  D = D.replace(/font-family:[^;}"']+;?/gi, '');
-  return(D);
-};
-SuperClean.filterFunctions.remove_lang = function(D)
-{
-  D = D.replace(/lang="?[^" >]*"?/gi, '');
-  return(D);
-};
-SuperClean.filterFunctions.word_clean = function(html, editor)
-{
-  editor.setHTML(html);
-  editor._wordClean();
-  return editor.getInnerHTML();
-};
-
-SuperClean.filterFunctions.remove_fancy_quotes = function(D)
-{
-  D = D.replace(new RegExp(String.fromCharCode(8216),"g"),"'");
-  D = D.replace(new RegExp(String.fromCharCode(8217),"g"),"'");
-  D = D.replace(new RegExp(String.fromCharCode(8218),"g"),"'");
-  D = D.replace(new RegExp(String.fromCharCode(8219),"g"),"'");
-  D = D.replace(new RegExp(String.fromCharCode(8220),"g"),"\"");
-  D = D.replace(new RegExp(String.fromCharCode(8221),"g"),"\"");
-  D = D.replace(new RegExp(String.fromCharCode(8222),"g"),"\"");
-  D = D.replace(new RegExp(String.fromCharCode(8223),"g"),"\"");
-  return D;
-};
-
-SuperClean.filterFunctions.tidy = function(html, editor)
-{
-  var callback = function(javascriptResponse) 
-  {
-    eval("var response = " + javascriptResponse);
-    switch (response.action)
-    {
-      case 'setHTML':
-        editor.setEditorContent(response.value);
-      break;
-      case 'alert':
-        alert(Xinha._lc(response.value, 'SuperClean'));
-      break;
-    }
-  }
-  
-  var args = editor.config.SuperClean.tidy_args; 
-  if ( typeof args != 'object' ) 
-  { 
-    args = {}; 
-  }
-  args['content'] =  html; 
-  
-  Xinha._postback(editor.config.SuperClean.tidy_handler, args, callback);         
-};
-
-SuperClean.filterFunctions.remove_emphasis = function(html)
-{  
-  html = SuperClean.stripTags(html, [ 'b', 'strong', 'i', 'em', 'u', 'mark', 'ins','abbr', 'acronym', 'kbd', 'samp', 'strike', 's'  ]);
-  
-  // for del we delete it entirely or it would be confising (<del>old thing</del> <ins>new thing</ins> would become old thing new thing)  
-  html = SuperClean.stripTags(html, [ 'del' ], true);
-  
-  html = html.replace(/font-weight:[^;}"']+;?/gi, '');
-  html = html.replace(/font-style:[^;}"']+;?/gi, '');
-  return html;
-};
-
-SuperClean.filterFunctions.remove_sup_sub = function(html)
-{
-  return SuperClean.stripTags(html, ['sup', 'sub']).replace(/vertical-align:\s*(sub|super)[^;}"']+;?/gi);
-};
-
-SuperClean.filterFunctions.remove_alignment = function(html)
-{
-  return html.replace(/ align=[^\s|>]*/gi,'').replace(/(text-align|vertical-align|float):[^;}"']+;?/gi, '');
-};
-
-SuperClean.filterFunctions.remove_all_css_classes = function(html)
-{
-  return SuperClean.stripAttributes(html, 'class');
-};
-
-SuperClean.filterFunctions.remove_all_css_styles = function(html)
-{
-  return SuperClean.stripAttributes(html, 'style');
-};
-
-SuperClean.filterFunctions.remove_all_tags = function(html)
-{
-  return  html.replace(/<[\!]*?[^<>]*?>/g, "");
-};
-
-SuperClean.Dialog = function (SuperClean)
-{
-  var  lDialog = this;
-  this.Dialog_nxtid = 0;
-  this.SuperClean = SuperClean;
-  this.id = { }; // This will be filled below with a replace, nifty
-
-  this.ready = false;
-  this.dialog = false;
-
-  // load the dTree script
-  this._prepareDialog();
-
-};
-
-SuperClean.Dialog.prototype._prepareDialog = function()
-{
-  var lDialog = this;
-  var SuperClean = this.SuperClean;
-
-  var html = window.SuperClean.html;
-
-  var htmlFilters = "";
-  for(var filter in this.SuperClean.editor.config.SuperClean.filters)
-  {
-    htmlFilters += "    <div>\n";
-    var filtDetail = this.SuperClean.editor.config.SuperClean.filters[filter];
-    if(typeof filtDetail.label == 'undefined')
-    {
-      htmlFilters += "        <input type=\"checkbox\" name=\"["+filter+"]\" id=\"["+filter+"]\" checked value=\"on\" />\n";
-      htmlFilters += "        <label for=\"["+filter+"]\">"+this.SuperClean.editor.config.SuperClean.filters[filter]+"</label>\n";
-    }
-    else
-    {
-      htmlFilters += "        <input type=\"checkbox\" name=\"["+filter+"]\" id=\"["+filter+"]\" value=\"on\"" + (filtDetail.checked ? "checked" : "") + " />\n";
-      htmlFilters += "        <label for=\"["+filter+"]\">"+filtDetail.label+(filtDetail.fullonly?'^ ':'')+"</label>\n";
-    }
-    htmlFilters += "    </div>\n";
-  }
-  html = html.replace('<!--filters-->', htmlFilters);
-
-
-  // Now we have everything we need, so we can build the dialog.
-  var dialog = this.dialog = new Xinha.Dialog(SuperClean.editor, html, 'SuperClean',{width:400});
-
-  this.ready = true;
-};
-
-SuperClean.Dialog.prototype._lc = SuperClean.prototype._lc;
-
-SuperClean.Dialog.prototype.show = function(inputs, ok, cancel)
-{
-  if(!this.ready)
-  {
-    var lDialog = this;
-    window.setTimeout(function() {lDialog.show(inputs,ok,cancel);},100);
-    return;
-  }
-
-  // Connect the OK and Cancel buttons
-  var dialog = this.dialog;
-  var lDialog = this;
-  if(ok)
-  {
-    this.dialog.getElementById('ok').onclick = ok;
-  }
-  else
-  {
-    this.dialog.getElementById('ok').onclick = function() {lDialog.hide();};
-  }
-
-  if(cancel)
-  {
-    this.dialog.getElementById('cancel').onclick = cancel;
-  }
-  else
-  {
-    this.dialog.getElementById('cancel').onclick = function() { lDialog.hide()};
-  }
-
-  // If there is selected text, set that the default scope
-  if(this.SuperClean.editor.hasSelectedText())
-  {
-    this.dialog.getElementsByName('scope')[0].selectedIndex = 1;
-  }
-  else
-  {
-    this.dialog.getElementsByName('scope')[0].selectedIndex = 0;
-  }
-  
-  // Show the dialog
-  this.SuperClean.editor.disableToolbar(['fullscreen','SuperClean']);
-
-  this.dialog.show(inputs);
-
-  // Init the sizes
-  this.dialog.onresize();
-};
-
-SuperClean.Dialog.prototype.hide = function()
-{
-  var ret = this.dialog.hide();
-  this.SuperClean.editor.enableToolbar();
-  this.dialog.getElementById("main").style.display = "";
-  this.dialog.getElementById("buttons").style.display = "";
-  this.dialog.getElementById("waiting").style.display = "none";
-  this.dialog.getElementById("alert").style.display = "none";
-  this.dialog.getElementById("ok").style.display = "";
-  return ret;
-};
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/SuperClean/tidy.php b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/SuperClean/tidy.php
deleted file mode 100644
index 9ff7981..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/SuperClean/tidy.php
+++ /dev/null
@@ -1,179 +0,0 @@
-<?php
-  /** This PHP file is intended for use with XMLHTTPRequest from Xinha
-   * it requrns javascript to set the Xinha html with tidied html that is
-   * submitted in a $_POST parameter called 'content'
-   */
-
-  if(get_magic_quotes_gpc())
-  {
-    // trigger_error('Magic Quotes GPC is on, cleaning GPC.', E_USER_NOTICE);
-    $to_clean = array(&$_GET, &$_POST, &$_REQUEST, &$_COOKIE);
-    while(count($to_clean))
-    {
-      $cleaning =& $to_clean[array_pop(array_keys($to_clean))];
-      unset($to_clean[array_pop(array_keys($to_clean))]);
-      foreach(array_keys($cleaning) as $k)
-      {
-        if(is_array($cleaning[$k]))
-        {
-          $to_clean[] =& $cleaning[$k];
-        }
-        else
-        {
-          $cleaning[$k] = stripslashes($cleaning[$k]);
-        }
-      }
-    }
-  }
-
-  header('Content-Type: text/javascript; charset=utf-8');
-
-  /** Function to POST some data to a URL */
-  function PostIt($DataStream, $URL)
-  {
-
-//  Strip http:// from the URL if present
-    $URL = preg_replace("/^https?:\/\//i", "", $URL);
-
-//  Separate into Host and URI
-    $Host = substr($URL, 0, strpos($URL, "/"));
-    $URI = strstr($URL, "/");
-
-//  Form up the request body
-    $ReqBody = "";
-    while (list($key, $val) = each($DataStream)) {
-      if ($ReqBody) $ReqBody.= "&";
-      $ReqBody.= $key."=".urlencode($val);
-    }
-    $ContentLength = strlen($ReqBody);
-
-//  Generate the request header
-    $ReqHeader =
-      "POST $URI HTTP/1.0\n".
-      "Host: $Host\n".
-      "User-Agent: PostIt\n".
-      "Content-Type: application/x-www-form-urlencoded\n".
-      "Content-Length: $ContentLength\n\n".
-      "$ReqBody\n";
-
-//     echo $ReqHeader;
-
-
-//  Open the connection to the host
-    $socket = fsockopen($Host, 80, $errno, $errstr);
-    if (!$socket) {
-      $result = "($errno) $errstr";
-      return $Result;
-    }
-
-    fputs($socket, $ReqHeader);
-
-    $result = '';
-    while(!feof($socket))
-    {
-      $result .= fgets($socket);
-    }
-    return $result;
-  }
-
-
-  function js_encode($string)
-  {
-    static $strings = "\\,\",',%,&,<,>,{,},@,\n,\r";
-
-    if(!is_array($strings))
-    {
-      $tr = array();
-      foreach(explode(',', $strings) as $chr)
-      {
-        $tr[$chr] = sprintf('\x%02X', ord($chr));
-      }
-      $strings = $tr;
-    }
-
-    return strtr($string, $strings);
-  }
-
-  // Any errors would screq up our javascript
-  error_reporting(0);
-  ini_set('display_errors', false);
-
-  if(trim(@$_REQUEST['content']))
-  {
-    // PHP's urldecode doesn't understand %uHHHH for unicode
-    $_REQUEST['content'] = preg_replace('/%u([a-f0-9]{4,4})/ei', 'utf8_chr(0x$1)', $_REQUEST['content']);
-    function utf8_chr($num)
-    {
-      if($num<128)return chr($num);
-      if($num<1024)return chr(($num>>6)+192).chr(($num&63)+128);
-      if($num<32768)return chr(($num>>12)+224).chr((($num>>6)&63)+128).chr(($num&63)+128);
-      if($num<2097152)return chr(($num>>18)+240).chr((($num>>12)&63)+128).chr((($num>>6)&63)+128) .chr(($num&63)+128);
-      return '';
-    }
-    ob_start();
-      passthru("echo " .  escapeshellarg($_REQUEST['content']) . " | tidy -q -i -u -wrap 9999 -utf8 -bare -asxhtml 2>/dev/null", $result);
-      $content = ob_get_contents();
-    ob_end_clean();
-
-    if(strlen($content) < 4)
-    {
-      // Tidy on the local machine failed, try a post
-      $res_1
-        = PostIt(
-          array
-            (
-              '_function' => 'tidy',
-              '_html'   => $_REQUEST['content'],
-              'char-encoding' => 'utf8',
-              '_output'       => 'warn',
-              'indent'        => 'auto',
-              'wrap'          => 9999,
-              'break-before-br' => 'y',
-              'bare'          => 'n',
-              'word-2000'     => 'n',
-              'drop-empty-paras' => 'y',
-              'drop-font-tags' => 'n',
-
-            ),
-          'http://infohound.net/tidy/tidy.pl');
-
-      if(preg_match('/<a href="([^"]+)" title'.'="Save the tidied HTML/', $res_1, $m))
-      {
-        $tgt = strtr($m[1], array_flip(get_html_translation_table(HTML_ENTITIES)));
-        $content = implode('', file('http://infohound.net/tidy/' . $tgt));
-      }
-    }
-
-    if(strlen($content) && ! preg_match('/<\/body>/i', $_REQUEST['content']))
-    {
-      if( preg_match('/<body[^>]*>(.*)<\/body>/is', $content, $matches) )
-      {
-        $content = $matches[1];
-      }
-    }
-    elseif(!strlen($content))
-    {
-      $content = $_REQUEST['content'];
-    }
-
-    if($content)
-    {
-      ?>
-      {action:'setHTML',value:'<?php echo js_encode($content) ?>'};
-      <?php
-    }
-    else
-    {
-      ?>
-      {action:'alert',value:'Tidy failed.  Check your HTML for syntax errors.'};
-      <?php
-    }
-  }
-  else
-  {
-    ?>
-    {action:'alert',value:"You don't have anything to tidy!"}
-    <?php
-  }
-
-?>
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/TableOperations/TableOperations.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/TableOperations/TableOperations.js
deleted file mode 100644
index cb6b5bf..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/TableOperations/TableOperations.js
+++ /dev/null
@@ -1,974 +0,0 @@
-// Table Operations Plugin for HTMLArea-3.0
-// Implementation by Mihai Bazon.  Sponsored by http://www.bloki.com
-//
-// htmlArea v3.0 - Copyright (c) 2002 interactivetools.com, inc.
-// This notice MUST stay intact for use (see license.txt).
-//
-// A free WYSIWYG editor replacement for <textarea> fields.
-// For full source code and docs, visit http://www.interactivetools.com/
-//
-// Version 3.0 developed by Mihai Bazon for InteractiveTools.
-//   http://dynarch.com/mishoo
-//
-// $Id: TableOperations.js 1402 2018-02-19 07:35:49Z gogo $
-
-// Object that will encapsulate all the table operations provided by
-// HTMLArea-3.0 (except "insert table" which is included in the main file)
-Xinha.Config.prototype.TableOperations = {
-  'showButtons' : true, // Set to false to hide all but inserttable and toggleborders buttons on the toolbar
-  // this is useful if you have the ContextMenu plugin and want to save toolbar space
-  // (the context menu can perform all the button operations)
-  'tabToNext':   true, // Hit tab in a table cell goes to next (shift for prev) cell
-  'dblClickOpenTableProperties': false, // Double click on a cell to open table properties (I don't like this, it's unintuitive when you double-click to select a word, perhaps if it was default only for empty cells - James)
-  'toolbarLayout': 'compact', // 'compact' or anything else will give you full
-  'renameSplitCellButton': 'Unmerge Cells', // Split cell isn't a very obvious term, it implies being able to make new cells, really it is unmerging merged cells and can only be used in that context
-  'noFrameRulesOptions': true, // Disable "Frame and Border" options in the table properties, these are confusing (and not very good)
-  'addToolbarLineBreak': true // By default TableOperations adds a 'linebreak' in the toolbar.
-  // Set to false to prevent this and instead just append the buttons without a 'linebreak'.
-}
-
-function TableOperations(editor) {
-  this.editor = editor;
-
-  var cfg = editor.config;
-  var self = this;
-
-  // register the toolbar buttons provided by this plugin
-
-  // Remove existing inserttable and toggleborders, we will replace it in our group
-  cfg.removeToolbarElement(' inserttable toggleborders ');
-
-  var toolbar;
-  if( cfg.TableOperations.addToolbarLineBreak ) {
-    toolbar = ["linebreak"];
-  } else {
-    toolbar = ["inserttable"];
-  }
-
-  var bl = [ ];
-  var tb_order = null;
-  switch(editor.config.TableOperations.toolbarLayout)
-  {
-    case 'compact':
-      tb_order = [
-        null,
-        'inserttable',
-        'toggleborders',
-        'table-prop',
-        'row-prop',
-        'cell-prop',
-        null,
-        'row-insert-above',
-        'row-insert-under',
-        'row-delete',
-
-        'col-insert-before',
-        'col-insert-after',
-        'col-delete',
-        null,
-        'cell-merge',
-        'cell-split'
-      ];
-      
-      break;    
-      
-    default:
-      break;
-  }
-  
-  if(tb_order != null)
-  {
-    for(var i = 0; i < tb_order.length; i++)
-    {
-      if(tb_order[i] == null)
-      {
-        bl.push(null);
-      }
-      else if(tb_order[i].match(/inserttable|toggleborders/))
-      {
-        bl.push(tb_order[i]);
-      }
-      else
-      {
-        for(var j = 0; j < TableOperations.btnList.length; j++)
-        {
-          if(TableOperations.btnList[j] != null && TableOperations.btnList[j][0] == tb_order[i])
-          {
-            bl.push(TableOperations.btnList[j]);
-          }          
-        }
-      }
-    }
-  }
-  else
-  {
-    bl.push(null);
-    bl.push('inserttable');
-    bl.push('toggleborders');
-    for(var j = 0; j < TableOperations.btnList.length; j++)
-    {
-      bl.push(TableOperations.btnList[j]);
-    }
-  }
-  
-  
-  for (var i = 0; i < bl.length; ++i) {
-    var btn = bl[i];
-    
-    if (!btn) {
-      if(cfg.TableOperations.showButtons) toolbar.push("separator");
-    }
-    else if(typeof btn == 'string')
-    {
-      toolbar.push(btn);
-    } else {
-      
-      if(this.editor.config.TableOperations.renameSplitCellButton)
-      {
-        if(btn[0] == 'cell-split')
-        {
-          btn[2] = this.editor.config.TableOperations.renameSplitCellButton;
-        }
-      }
-      
-      var id = "TO-" + btn[0];
-      cfg.registerButton(id, Xinha._lc(btn[2], "TableOperations"), editor.imgURL(btn[0] + ".gif", "TableOperations"), false,
-                         function(editor, id) {
-                           // dispatch button press event
-                           self.buttonPress(editor, id);
-                         }, btn[1]);
-      if(cfg.TableOperations.showButtons) toolbar.push(id);
-    }
-  }
-  
-
-  // add a new line in the toolbar
-  cfg.toolbar.push(toolbar);
-  
-  if ( typeof PopupWin == 'undefined' )
-  {
-    Xinha._loadback(_editor_url + 'modules/Dialogs/popupwin.js');
-  }
-  if ( typeof Xinha.InlineStyler == 'undefined' )
-  {
-    Xinha._loadback(_editor_url + 'modules/InlineStyler/InlineStyler.js');
-  }
-
-  if(cfg.TableOperations.doubleClickOpenTableProperties)
-  {
-    cfg.dblclickList['td'] = [function() { self.dialogTableProperties() }];
-    cfg.dblclickList['th'] = [function() { self.dialogTableProperties() }];
-  }
-}
-
-TableOperations._pluginInfo = {
-  name          : "TableOperations",
-  version       : "1.0",
-  developer     : "Mihai Bazon",
-  developer_url : "http://dynarch.com/mishoo/",
-  c_owner       : "Mihai Bazon",
-  sponsor       : "Zapatec Inc.",
-  sponsor_url   : "http://www.bloki.com",
-  license       : "htmlArea"
-};
-
-TableOperations.prototype._lc = function(string) {
-  return Xinha._lc(string, 'TableOperations');
-};
-
-/************************
- * UTILITIES
- ************************/
-
-// retrieves the closest element having the specified tagName in the list of
-// ancestors of the current selection/caret.
-TableOperations.prototype.getClosest = function(tagName) {
-  var editor = this.editor;
-  var ancestors = editor.getAllAncestors();
-  var ret = null;
-  tagName = ("" + tagName).toLowerCase();
-  for (var i = 0; i < ancestors.length; ++i) {
-    var el = ancestors[i];
-    if (el.tagName.toLowerCase() == tagName) {
-      ret = el;
-      break;
-    }
-  }
-  return ret;
-};
-
-TableOperations.prototype.getClosestMatch = function(regExpTagName) {
-  var editor = this.editor;
-  
-  var sel = editor.getSelection();
-  
-  // Safari is really weird, if you right click in a cell with (only?) whitespace
-  // it selects the entire contents of the cell and the end of the selection is 
-  // inside the next cell. We have collapse to start to get this to work!  
-  sel.collapseToStart();
-  /*
-  if(typeof sel.focusNode != 'undefined' && typeof sel.focusNode.tagName != 'undefined' && sel.focusNode.tagName.match(regExpTagName))
-  {
-    return sel.focusNode;
-  }
-  */
-  
-  var currentElement = editor.activeElement(sel) ? editor.activeElement(sel) : editor.getParentElement(sel);
-
-  if(typeof currentElement.tagName != 'undefined' && currentElement.tagName.match(regExpTagName))
-  {
-    return currentElement;
-  }
-  
-  var ancestors = editor.getAllAncestors();
-  var ret = null;
-  
-  for (var i = 0; i < ancestors.length; ++i) {
-    var el = ancestors[i];
-    if (el.tagName.toLowerCase().match(regExpTagName)) {
-      ret = el;
-      break;
-    }
-  }
-  return ret;
-};
-// this function gets called when some button from the TableOperations toolbar
-// was pressed.
-TableOperations.prototype.buttonPress = function(editor, button_id) {
-  this.editor = editor;
-  var mozbr = Xinha.is_gecko ? "<br />" : "";
-
-  // helper function that clears the content in a table row
-  function clearRow(tr) {
-    [ 'td', 'th' ].forEach(function(e)
-    {
-    var tds = tr.getElementsByTagName(e);
-    for (var i = tds.length; --i >= 0;) {
-      var td = tds[i];
-      td.rowSpan = 1;
-      td.innerHTML = mozbr;
-    }
-    });
-  }
-
-  function splitRow(td) {
-    var n = parseInt("" + td.rowSpan);
-    var nc = parseInt("" + td.colSpan);
-    td.rowSpan = 1;
-    tr = td.parentNode;
-    var itr = tr.rowIndex;
-    var trs = tr.parentNode.rows;
-    var index = td.cellIndex;
-    while (--n > 0) {
-      tr = trs[++itr];
-      var otd = editor._doc.createElement("td");
-      otd.colSpan = td.colSpan;
-      otd.innerHTML = mozbr;
-      tr.insertBefore(otd, tr.cells[index]);
-    }
-    editor.forceRedraw();
-    editor.updateToolbar();
-  }
-
-  function splitCol(td) {
-    var nc = parseInt("" + td.colSpan);
-    td.colSpan = 1;
-    tr = td.parentNode;
-    var ref = td.nextSibling;
-    while (--nc > 0) {
-      var otd = editor._doc.createElement("td");
-      otd.rowSpan = td.rowSpan;
-      otd.innerHTML = mozbr;
-      tr.insertBefore(otd, ref);
-    }
-    editor.forceRedraw();
-    editor.updateToolbar();
-  }
-
-  function splitCell(td) {
-    var nc = parseInt("" + td.colSpan);
-    splitCol(td);
-    var items = td.parentNode.cells;
-    var index = td.cellIndex;
-    while (nc-- > 0) {
-      splitRow(items[index++]);
-    }
-  }
-
-  function selectNextNode(el) {
-    var node = el.nextSibling;
-    while (node && node.nodeType != 1) {
-      node = node.nextSibling;
-    }
-    if (!node) {
-      node = el.previousSibling;
-      while (node && node.nodeType != 1) {
-        node = node.previousSibling;
-      }
-    }
-    if (!node) {
-      node = el.parentNode;
-    }
-    editor.selectNodeContents(node);
-  }
-
-  function cellMerge(table, cell_index, row_index, no_cols, no_rows) {
-    var rows = [];
-    var cells = [];
-    try {
-      for (i=row_index; i<row_index+no_rows; i++) {
-        var row = table.rows[i];
-        for (j=cell_index; j<cell_index+no_cols; j++) {
-          if (row.cells[j].colSpan > 1 || row.cells[j].rowSpan > 1) {
-            splitCell(row.cells[j]);
-          }
-          cells.push(row.cells[j]);
-        }
-        if (cells.length > 0) {
-          rows.push(cells);
-          cells = [];
-        }
-      }
-    } catch(e) { 
-      alert("Invalid selection");
-      return false;
-    }
-    var row_index1 = rows[0][0].parentNode.rowIndex;
-    var row_index2 = rows[rows.length-1][0].parentNode.rowIndex;
-    var row_span2 = rows[rows.length-1][0].rowSpan;
-    var HTML = "";
-    for (i = 0; i < rows.length; ++i) {
-      var cells = rows[i];
-      for (var j = 0; j < cells.length; ++j) {
-        var cell = cells[j];
-        HTML += cell.innerHTML;
-        (i || j) && (cell.parentNode.removeChild(cell));
-      }
-    }
-    var td = rows[0][0];
-    td.innerHTML = HTML;
-    td.rowSpan = row_index2 - row_index1 + row_span2;
-    var col_span = 0;
-    for(j=0; j<rows[0].length; j++) {
-      col_span += rows[0][j].colSpan;
-    }
-    td.colSpan = col_span;
-    editor.selectNodeContents(td);
-    editor.forceRedraw();
-    editor.focusEditor();
-  }
-
-  switch (button_id) {
-    // ROWS
-
-  case "TO-row-insert-above":
-  case "TO-row-insert-under":
-    var tr = this.getClosest("tr");
-    if (!tr) {
-      break;
-    }
-    var otr = tr.cloneNode(true);
-    clearRow(otr);
-    tr.parentNode.insertBefore(otr, /under/.test(button_id) ? tr.nextSibling : tr);
-    editor.forceRedraw();
-    editor.focusEditor();
-    break;
-  case "TO-row-delete":
-    var tr = this.getClosest("tr");
-    if (!tr) {
-      break;
-    }
-    var par = tr.parentNode;
-    if (par.rows.length == 1) {
-      alert(Xinha._lc("Xinha cowardly refuses to delete the last row in table.", "TableOperations"));
-      break;
-    }
-    // set the caret first to a position that doesn't
-    // disappear.
-    selectNextNode(tr);
-    par.removeChild(tr);
-    editor.forceRedraw();
-    editor.focusEditor();
-    editor.updateToolbar();
-    break;
-  case "TO-row-split":
-    var td = this.getClosestMatch(/^(td|th)$/i);
-    if (!td) {
-      break;
-    }
-    splitRow(td);
-    break;
-
-    // COLUMNS
-
-  case "TO-col-insert-before":
-  case "TO-col-insert-after":
-    var td = this.getClosestMatch(/^(td|th)$/i);
-    if (!td) {
-      break;
-    }
-    var rows = td.parentNode.parentNode.rows;
-    var index = td.cellIndex;
-    var lastColumn = (td.parentNode.cells.length == index + 1);
-    for (var i = rows.length; --i >= 0;) {
-      var tr = rows[i];
-      var otd = editor._doc.createElement("td");
-      otd.innerHTML = mozbr;
-      if (lastColumn && Xinha.is_ie) 
-      {
-        tr.insertBefore(otd);
-      } 
-      else 
-      {
-        var ref = tr.cells[index + (/after/.test(button_id) ? 1 : 0)];
-        tr.insertBefore(otd, ref);
-      }
-    }
-    editor.focusEditor();
-    break;
-  case "TO-col-split":
-    var td = this.getClosestMatch(/^(td|th)$/i);
-    if (!td) {
-      break;
-    }
-    splitCol(td);
-    break;
-  case "TO-col-delete":
-    var td = this.getClosestMatch(/^(td|th)$/i);
-    if (!td) {
-      break;
-    }
-    var index = td.cellIndex;
-    if (td.parentNode.cells.length == 1) {
-      alert(Xinha._lc("Xinha cowardly refuses to delete the last column in table.", "TableOperations"));
-      break;
-    }
-    // set the caret first to a position that doesn't disappear
-    selectNextNode(td);
-    var rows = td.parentNode.parentNode.rows;
-    for (var i = rows.length; --i >= 0;) {
-      var tr = rows[i];
-      tr.removeChild(tr.cells[index]);
-    }
-    editor.forceRedraw();
-    editor.focusEditor();
-    editor.updateToolbar();
-    break;
-
-    // CELLS
-
-  case "TO-cell-split":
-    var td = this.getClosestMatch(/^(td|th)$/i);
-    if (!td) {
-      break;
-    }
-    splitCell(td);
-    break;
-  case "TO-cell-insert-before":
-  case "TO-cell-insert-after":
-    var td = this.getClosestMatch(/^(td|th)$/i);
-    if (!td) {
-      break;
-    }
-    var tr = td.parentNode;
-    var otd = editor._doc.createElement("td");
-    otd.innerHTML = mozbr;
-    tr.insertBefore(otd, /after/.test(button_id) ? td.nextSibling : td);
-    editor.forceRedraw();
-    editor.focusEditor();
-    break;
-  case "TO-cell-delete":
-    var td = this.getClosestMatch(/^(td|th)$/i);
-    if (!td) {
-      break;
-    }
-    if (td.parentNode.cells.length == 1) {
-      alert(Xinha._lc("Xinha cowardly refuses to delete the last cell in row.", "TableOperations"));
-      break;
-    }
-    // set the caret first to a position that doesn't disappear
-    selectNextNode(td);
-    td.parentNode.removeChild(td);
-    editor.forceRedraw();
-    editor.updateToolbar();
-    break;
-  case "TO-cell-merge":
-    //Mozilla, as opposed to IE, allows the selection of several cells, which is fine :)
-    var sel = editor._getSelection();
-    if (!Xinha.is_ie && sel.rangeCount > 1) {
-      var range = sel.getRangeAt(0);
-      var td = range.startContainer.childNodes[range.startOffset];
-      var tr = td.parentNode;
-      var cell_index = td.cellIndex;
-      var row_index = tr.rowIndex;
-      var row_index2 = 0;
-      var rownum = row_index;
-      var no_cols = 0;
-      var row_colspan = 0;
-      var td2, tr2;
-      for(i=0; i<sel.rangeCount; i++) {
-        range = sel.getRangeAt(i);
-        td2 = range.startContainer.childNodes[range.startOffset];
-        tr2 = td2.parentNode;
-        if(tr2.rowIndex != rownum) {
-          rownum = tr2.rowIndex;
-          row_colspan = 0;
-        }
-        row_colspan += td2.colSpan;
-        if(row_colspan > no_cols) {
-          no_cols = row_colspan;
-        }
-        if(tr2.rowIndex + td2.rowSpan - 1 > row_index2) {
-          row_index2 = tr2.rowIndex + td2.rowSpan - 1;
-        }
-      }
-      var no_rows = row_index2 - row_index + 1;
-      var table = tr.parentNode;
-      cellMerge(table, cell_index, row_index, no_cols, no_rows); 
-    } else {
-      // Internet Explorer "browser" or not more than one cell selected in Moz
-      var td = this.getClosestMatch(/^(td|th)$/i);
-      if (!td) {
-        alert(Xinha._lc("Please click into some cell", "TableOperations"));
-        break;
-      }
-      var tr = td.parentNode;
-      var cell_index = td.cellIndex;
-      var row_index = tr.rowIndex;
-      // pass cellMerge and the indices so apply() can call cellMerge and know 
-      // what cell was selected when the dialog was opened
-      this.dialogMerge(cellMerge, cell_index, row_index);
-    }
-    break;
-
-    // PROPERTIES
-
-  case "TO-table-prop":
-    this.dialogTableProperties();
-    break;
-
-  case "TO-row-prop":
-    this.dialogRowCellProperties(false);
-    break;
-
-  case "TO-cell-prop":
-    this.dialogRowCellProperties(true);
-    break;
-
-  default:
-    alert("Button [" + button_id + "] not yet implemented");
-  }
-};
-
-// the list of buttons added by this plugin
-TableOperations.btnList = [
-  // table properties button
-  ["table-prop",       "table", "Table properties"],
-  null, // separator
-
-  // ROWS
-  ["row-prop",         "tr", "Row properties"],
-  ["row-insert-above", "tr", "Insert row before"],
-  ["row-insert-under", "tr", "Insert row after"],
-  ["row-delete",       "tr", "Delete row"],
-  ["row-split",        "td[rowSpan!=1]", "Split row"],
-  null,
-
-  // COLS
-  ["col-insert-before", ["td","th"], "Insert column before"],
-  ["col-insert-after",  ["td","th"], "Insert column after"],
-  ["col-delete",        ["td","th"], "Delete column"],
-  ["col-split",         ["td[colSpan!=1]","th[colSpan!=1]"], "Split column"],
-  null,
-
-  // CELLS
-  ["cell-prop",          ["td","th"], "Cell properties"],
-  ["cell-insert-before", ["td","th"], "Insert cell before"],
-  ["cell-insert-after",  ["td","th"], "Insert cell after"],
-  ["cell-delete",        ["td","th"], "Delete cell"],
-  ["cell-merge",         "tr", "Merge cells"],
-  ["cell-split",         ["td[colSpan!=1,rowSpan!=1]","th[colSpan!=1,rowSpan!=1]"], "Split cell"]
-];
-
-/* 
- This is just to convince the lc_parse_strings.php to collect
- these strings, they are actually translated in the register button 
- function.
-
- Xinha._lc("Table properties", 'TableOperations'); 
-
- Xinha._lc("Row properties", 'TableOperations'); 
- Xinha._lc("Insert row before", 'TableOperations'); 
- Xinha._lc("Insert row after", 'TableOperations'); 
- Xinha._lc("Delete row", 'TableOperations'); 
- Xinha._lc("Split row", 'TableOperations'); 
-
- Xinha._lc("Insert column before", 'TableOperations'); 
- Xinha._lc("Insert column after", 'TableOperations'); 
- Xinha._lc("Delete column", 'TableOperations'); 
- Xinha._lc("Split column", 'TableOperations'); 
-
- Xinha._lc("Cell properties", 'TableOperations'); 
- Xinha._lc("Insert cell before", 'TableOperations'); 
- Xinha._lc("Insert cell after", 'TableOperations'); 
- Xinha._lc("Delete cell", 'TableOperations'); 
- Xinha._lc("Merge cells", 'TableOperations'); 
- Xinha._lc("Merge cells", 'TableOperations'); 
-
-*/
-
-TableOperations.prototype.dialogMerge = function(merge_func, cell_index, row_index) {
-  var table = this.getClosest("table");
-  var self = this;
-  var editor = this.editor;
-
-  if (!this.dialogMergeCellsHtml) {
-    Xinha._getback(Xinha.getPluginDir("TableOperations") + '/popups/dialogMergeCells.html', function(getback) { self.dialogMergeCellsHtml = getback; self.dialogMerge(merge_func, cell_index, row_index); });
-    return;
-  }
-
-  if (!this.dialogMergeCells) {
-    this.dialogMergeCells = new Xinha.Dialog(editor, this.dialogMergeCellsHtml, 'TableOperations', {width:400});
-    this.dialogMergeCells.getElementById('cancel').onclick = function() { self.dialogMergeCells.hide(); };
-  }
-
-  var dialog = this.dialogMergeCells;
-  function apply() {
-    dialog.hide();
-    no_cols = parseInt(dialog.getElementById('f_cols').value,10) + 1;
-    no_rows = parseInt(dialog.getElementById('f_rows').value,10) + 1;
-    merge_func(table, cell_index, row_index, no_cols, no_rows);    
-    return
-  }
-
-  this.dialogMergeCells.getElementById('ok').onclick = apply;
-  this.dialogMergeCells.show();
-  this.dialogMergeCells.getElementById('f_cols').focus();
-}
-
-TableOperations.prototype.dialogTableProperties = function() {
-
-  var table = this.getClosest("table");
-  var self = this;
-  var editor = this.editor;
-
-  if(!this.dialogTablePropertiesHtml){ // retrieve the raw dialog contents
-    Xinha._getback( Xinha.getPluginDir("TableOperations") + '/popups/dialogTable.html', function(getback) { self.dialogTablePropertiesHtml = getback; self.dialogTableProperties(); });
-    return;
-  }
-  if (!this.dialogTable) {
-    // Now we have everything we need, so we can build the dialog.
-    this.dialogTable = new Xinha.Dialog(editor, this.dialogTablePropertiesHtml, 'TableOperations',{width:440})
-    this.dialogTable.getElementById('cancel').onclick = function() { self.dialogTable.hide()};
-  }
-  var dialog = this.dialogTable;
-  
-  var Styler = new Xinha.InlineStyler(table, this.editor, dialog);
-  
-  function apply() {
-    var params = dialog.hide();
-    Styler.applyStyle(params);
-    
-    for (var i in params) {
-      if(typeof params[i] == 'function') continue;
-      var val = params[i];
-      //if (val == null) continue;
-      if (typeof val == 'object' && val != null && val.tagName) val = val.value;
-      switch (i) {
-      case "caption":
-        if (/\S/.test(val)) {
-          // contains non white-space characters
-          var caption = table.getElementsByTagName("caption")[0];
-          if (!caption) {
-            caption = dialog.editor._doc.createElement("caption");
-            table.insertBefore(caption, table.firstChild);
-          }
-          caption.innerHTML = val;
-        } else {
-          // search for caption and delete it if found
-          var caption = table.getElementsByTagName("caption")[0];
-          if (caption) {
-            caption.parentNode.removeChild(caption);
-          }
-        }
-        break;
-      case "summary":
-        table.summary = val;
-        break;
-      case "align":
-        table.align = val;
-        break;
-      case "spacing":
-        table.cellSpacing = val;
-        break;
-      case "padding":
-        table.cellPadding = val;
-        break;
-      case "borders":
-        if(!editor.config.TableOperations.noFrameRulesOptions) table.border = val;
-        break;
-      case "frames":
-        if(!editor.config.TableOperations.noFrameRulesOptions) table.frame = val;
-        break;
-      case "rules":
-        if(!editor.config.TableOperations.noFrameRulesOptions) table.rules = val;
-        break;
-      }
-    }
-
-    // Without frame and rules options, apply the border style
-    // also to the cells in the table, this is what the user 
-    // will probably want (they can change it later per-cell)
-    if(editor.config.TableOperations.noFrameRulesOptions)
-    {
-      var applyTo = [ ];
-      function findCells(inThis)
-      {
-        for(var i = 0; i < inThis.childNodes.length; i++)
-        {
-          if(inThis.childNodes[i].nodeType == 1 && inThis.childNodes[i].tagName.toLowerCase().match(/tbody|thead|tr/))
-          {
-            findCells(inThis.childNodes[i]);
-          }
-          else if(inThis.childNodes[i].nodeType == 1 && inThis.childNodes[i].tagName.toLowerCase().match(/td|th/))
-          {
-            applyTo.push(inThis.childNodes[i]);
-          }
-        }
-      }
-      findCells(table);
-      
-      for(var i = 0; i < applyTo.length; i++)
-      {
-        Styler.element = applyTo[i];
-        Styler.applyStyleIfMatch(params, /border($|Color|Width|Style)/);
-      }
-      
-      // It is also friendly to remove table borders as it tends to override
-      // and this could be confusing when styling borders (user thinks it didn't work)
-      Xinha._removeClass(table, 'htmtableborders');
-    }
-    
-    // various workarounds to refresh the table display (Gecko,
-    // what's going on?! do not disappoint me!)
-    self.editor.forceRedraw();
-    self.editor.focusEditor();
-    self.editor.updateToolbar();
-    var save_collapse = table.style.borderCollapse;
-    table.style.borderCollapse = "collapse";
-    table.style.borderCollapse = "separate";
-    table.style.borderCollapse = save_collapse;
-  }
-  
-  var st_layout = Styler.createStyleLayoutFieldset();
-  var p = dialog.getElementById("TO_layout");
-  p.replaceChild(st_layout,p.firstChild);
-  
-  var st_prop = Styler.createStyleFieldset();
-  p = dialog.getElementById("TO_style");
-  p.replaceChild(st_prop,p.firstChild);
-
-  if(editor.config.TableOperations.noFrameRulesOptions)
-  {
-    dialog.getElementById('TO_frameRules').style.display = 'none';
-  }
-  
-  this.dialogTable.getElementById('ok').onclick = apply;
-
-  // gather element's values
-  var values = {};
-  var capel = table.getElementsByTagName("caption")[0];
-  if (capel) {
-    values['caption'] = capel.innerHTML;
-  }
-  else values['caption'] = "";
-  values['summary'] = table.summary;
-  
-  values['spacing'] = table.cellSpacing;
-  values['padding'] = table.cellPadding;
-  var f_borders = table.border;
-  
-  values['frames'] = table.frame;
-  values['rules'] = table.rules;
-  
-  this.dialogTable.show(values);
-};
-
-TableOperations.prototype.dialogRowCellProperties = function(cell) {
-  // retrieve existing values
-  var element = cell ? this.getClosestMatch(/^(td|th)$/i) : this.getClosest("tr");
-  var table = this.getClosest("table");
-
-  var self = this;
-  var editor = this.editor;
-
-  if(!self.dialogRowCellPropertiesHtml) // retrieve the raw dialog contents
-  {
-    Xinha._getback( Xinha.getPluginDir("TableOperations") + '/popups/dialogRowCell.html', function(getback) { self.dialogRowCellPropertiesHtml = getback; self.dialogRowCellProperties(cell); });
-    return;
-  }
-  if (!this.dialogRowCell) {
-    // Now we have everything we need, so we can build the dialog.
-    this.dialogRowCell = new Xinha.Dialog(editor, self.dialogRowCellPropertiesHtml, 'TableOperations',{width:440})
-    this.dialogRowCell.getElementById('cancel').onclick = function() { self.dialogRowCell.hide()};
-  }
-  
-  var dialog = this.dialogRowCell;
-  dialog.getElementById('title').innerHTML = cell ? Xinha._lc("Cell Properties", "TableOperations") : Xinha._lc("Row Properties", "TableOperations");
-  var Styler = new Xinha.InlineStyler(element, self.editor, dialog);
-  
-  // Insert a cell type selector into the layout section
-  var typeRow    = dialog.createElement('tr');
-  var typeLabel  = dialog.createElement('th');
-  typeLabel.className = 'label';
-  typeLabel.innerHTML = Xinha._lc('Cell Type:', 'TableOperations');
-  var typeSelect = dialog.createElement('select', 'to_type_select');
-  typeSelect.options[0] = new Option(Xinha._lc('Do Not Change','TableOperations'));
-  typeSelect.options[1] = new Option(Xinha._lc('Normal (td)','TableOperations'), 'td');
-  typeSelect.options[2] = new Option(Xinha._lc('Header (th)','TableOperations'), 'th');
-  
-  typeRow.appendChild(typeLabel);
-  typeRow.appendChild(typeSelect);
-  
-  function apply() {
-    var params = dialog.hide();
-    
-    // If we need to change the cell type(s)
-    if(typeSelect.selectedIndex > 0)
-    {
-      if(element.tagName.toLowerCase() == 'tr')
-      {
-        // Change td into th
-        var toChange = element.getElementsByTagName(typeSelect.options[typeSelect.selectedIndex].value == 'td' ? 'th': 'td');
-        for(var i = toChange.length-1; i >= 0; i--)
-        {
-          if(element == toChange[i].parentNode)
-          {
-            var newNode = editor.convertNode(toChange[i], typeSelect.options[typeSelect.selectedIndex].value);
-            if(toChange[i].parentNode)
-            {
-              toChange[i].parentNode.replaceChild(newNode,toChange[i]);
-            }
-          }
-        }
-      }
-      else
-      {
-        if(element.tagName.toLowerCase() != typeSelect.options[typeSelect.selectedIndex].value)
-        {          
-          Styler.element = editor.convertNode(element, typeSelect.options[typeSelect.selectedIndex].value);
-          if(element.parentNode)
-          {
-            element.parentNode.replaceChild(Styler.element,element);
-          }
-          element = Styler.element
-        }
-      }
-    }
-    
-    Styler.applyStyle(params);    
-    
-    // various workarounds to refresh the table display (Gecko,
-    // what's going on?! do not disappoint me!)
-    self.editor.forceRedraw();
-    self.editor.focusEditor();
-    self.editor.updateToolbar();
-    var save_collapse = table.style.borderCollapse;
-    table.style.borderCollapse = "collapse";
-    table.style.borderCollapse = "separate";
-    table.style.borderCollapse = save_collapse;
-  }
-  
-  var st_layout = Styler.createStyleLayoutFieldset();
-  var p = dialog.getElementById("TO_layout");
-  p.replaceChild(st_layout,p.firstChild);
-  
-  // Insert the type selector into the Layout section
-  p.getElementsByTagName('table')[0].appendChild(typeRow);
-  
-  
-  var st_prop = Styler.createStyleFieldset();
-  p = dialog.getElementById("TO_style");
-  p.replaceChild(st_prop,p.firstChild);
-
-  
-  this.dialogRowCell.getElementById('ok').onclick = apply;
-  this.dialogRowCell.show();
-};
-
-TableOperations.prototype.onKeyPress = function(ev)
-{
-  var editor = this.editor;
- 
-  // Not enabled, drop out
-  if(!editor.config.TableOperations.tabToNext) return false;
-  
-  if( ev.keyCode !== 9 ) { return false; }
-
-  var currentcell = editor.getElementIsOrEnclosingSelection(['td','th']);
-  
-  if( currentcell === null ) 
-  {
-    // Not in a table cell, drop through for others
-    return false;
-  }
-
-  Xinha._stopEvent(ev);
-    
-  // find the next cell, get all the cells (td/th) which are in this table
-  // find ourself in that list
-  // set the new cell to pick to be the current index +/- 1
-  // select that new cell
-  var row = currentcell.parentNode;
-  var candidates = [ ];
-  var all = row.parentNode.getElementsByTagName("*")
-  var ourindex = null;
-  
-  for(var i = 0; i < all.length; i++)
-  {
-    // Same table (or tbody/thead)
-    if(all[i].parentNode.parentNode != currentcell.parentNode.parentNode) continue;
-    
-    if(all[i].tagName.toLowerCase() == 'td' || all[i].tagName.toLowerCase() == 'th')
-    {
-      candidates[candidates.length] = all[i];
-      if(all[i] == currentcell) ourindex=candidates.length-1;
-    }
-  }
-  
-  var nextIndex = null;
-  if(ev.shiftKey)
-  {
-     nextIndex = Math.max(0,ourindex-1);
-  }
-  else
-  {
-    nextIndex = Math.min(ourindex+1, candidates.length-1);
-  }
-  
-  if(ourindex == nextIndex)
-  {
-    // No other cell to go to, stop now
-    // maybe @TODO add a new row?
-    return true;
-  }
-  
-  editor.selectNodeContents(candidates[nextIndex]);
-  
-  /* If you wanted to collapse the selection to put the caret before/after it, you coudl do this.
-   *  but I think having it selected
-   * is more natural, that's how spreadsheets work (you tab into a field and start typing it will
-   * replace the field contents with the new contents)
-   
-      if(ourindex < nextIndex)
-      {
-        sel.collapseToEnd();
-      }
-      else
-      {
-        sel.collapseToEnd();
-      }
-  */
-
-  return true;
-}
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/TableOperations/img/cell-delete.gif b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/TableOperations/img/cell-delete.gif
deleted file mode 100644
index 2fd629b..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/TableOperations/img/cell-delete.gif
+++ /dev/null
Binary files differ
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/TableOperations/img/cell-insert-after.gif b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/TableOperations/img/cell-insert-after.gif
deleted file mode 100644
index ddea8a0..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/TableOperations/img/cell-insert-after.gif
+++ /dev/null
Binary files differ
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/TableOperations/img/cell-insert-before.gif b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/TableOperations/img/cell-insert-before.gif
deleted file mode 100644
index 2e7b36b..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/TableOperations/img/cell-insert-before.gif
+++ /dev/null
Binary files differ
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/TableOperations/img/cell-merge.gif b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/TableOperations/img/cell-merge.gif
deleted file mode 100644
index 2da38f3..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/TableOperations/img/cell-merge.gif
+++ /dev/null
Binary files differ
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/TableOperations/img/cell-prop.gif b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/TableOperations/img/cell-prop.gif
deleted file mode 100644
index e9495aa..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/TableOperations/img/cell-prop.gif
+++ /dev/null
Binary files differ
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/TableOperations/img/cell-split.gif b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/TableOperations/img/cell-split.gif
deleted file mode 100644
index 0b22593..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/TableOperations/img/cell-split.gif
+++ /dev/null
Binary files differ
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/TableOperations/img/col-delete.gif b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/TableOperations/img/col-delete.gif
deleted file mode 100644
index 5202886..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/TableOperations/img/col-delete.gif
+++ /dev/null
Binary files differ
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/TableOperations/img/col-insert-after.gif b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/TableOperations/img/col-insert-after.gif
deleted file mode 100644
index a1ffb6e..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/TableOperations/img/col-insert-after.gif
+++ /dev/null
Binary files differ
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/TableOperations/img/col-insert-before.gif b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/TableOperations/img/col-insert-before.gif
deleted file mode 100644
index 1a3359f..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/TableOperations/img/col-insert-before.gif
+++ /dev/null
Binary files differ
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/TableOperations/img/col-split.gif b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/TableOperations/img/col-split.gif
deleted file mode 100644
index 2fbe949..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/TableOperations/img/col-split.gif
+++ /dev/null
Binary files differ
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/TableOperations/img/row-delete.gif b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/TableOperations/img/row-delete.gif
deleted file mode 100644
index 1fed389..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/TableOperations/img/row-delete.gif
+++ /dev/null
Binary files differ
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/TableOperations/img/row-insert-above.gif b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/TableOperations/img/row-insert-above.gif
deleted file mode 100644
index 3cbeceb..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/TableOperations/img/row-insert-above.gif
+++ /dev/null
Binary files differ
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/TableOperations/img/row-insert-under.gif b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/TableOperations/img/row-insert-under.gif
deleted file mode 100644
index 89fc588..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/TableOperations/img/row-insert-under.gif
+++ /dev/null
Binary files differ
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/TableOperations/img/row-prop.gif b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/TableOperations/img/row-prop.gif
deleted file mode 100644
index 7a90011..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/TableOperations/img/row-prop.gif
+++ /dev/null
Binary files differ
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/TableOperations/img/row-split.gif b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/TableOperations/img/row-split.gif
deleted file mode 100644
index 8d799f1..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/TableOperations/img/row-split.gif
+++ /dev/null
Binary files differ
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/TableOperations/img/table-prop.gif b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/TableOperations/img/table-prop.gif
deleted file mode 100644
index 10ec553..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/TableOperations/img/table-prop.gif
+++ /dev/null
Binary files differ
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/TableOperations/lang/ch.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/TableOperations/lang/ch.js
deleted file mode 100644
index 9d78e44..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/TableOperations/lang/ch.js
+++ /dev/null
@@ -1,14 +0,0 @@
-// I18N constants
-// LANG: "ch", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Cancel": "取消",
-    "OK": "好"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/TableOperations/lang/cz.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/TableOperations/lang/cz.js
deleted file mode 100644
index 1fed0b5..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/TableOperations/lang/cz.js
+++ /dev/null
@@ -1,90 +0,0 @@
-// I18N constants
-// LANG: "cz", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "All four sides": "Všechny čtyři strany",
-    "Borders": "Obrysy",
-    "Cancel": "Zrušit",
-    "Caption": "Titulek",
-    "Cell Properties": "Vlastnosti buňky",
-    "Cell properties": "Vlastnosti buňky",
-    "Delete cell": "Smazat buňku",
-    "Delete column": "Smazat sloupec",
-    "Delete row": "Smazat řádek",
-    "Description": "Popis",
-    "Frames": "Rámečky",
-    "Insert cell after": "Vložit buňku za",
-    "Insert cell before": "Vložit buňku před",
-    "Insert column after": "Vložit sloupec za",
-    "Insert column before": "Vložit sloupec před",
-    "Insert row after": "Smazat řádek pod",
-    "Insert row before": "Smazat řádek nad",
-    "Merge cells": "Spojit buňky",
-    "No rules": "Žádné čáry",
-    "No sides": "Žádné strany",
-    "OK": "OK",
-    "Padding": "Odsazování",
-    "Please click into some cell": "Prosím klikněte do některé buňky",
-    "Row Properties": "Vlastnosti řádku",
-    "Row properties": "Vlastnosti řádku",
-    "Rules will appear between all rows and columns": "Čáry mezi všemi řádky i sloupci",
-    "Rules will appear between columns only": "Čáry pouze mezi sloupci",
-    "Rules will appear between rows only": "Čáry pouze mezi řádky",
-    "Spacing": "Mezery",
-    "Spacing and padding": "Mezery a odsazování",
-    "Split column": "Rozdělit sloupec",
-    "Split row": "Rozdělit řádek",
-    "Summary": "Shrnutí",
-    "Table Properties": "Vlastnosti tabulky",
-    "Table properties": "Vlastnosti tabulky",
-    "The bottom side only": "Pouze spodní strana",
-    "The left-hand side only": "Pouze levá strana",
-    "The right and left sides only": "Pouze levá a pravá strana",
-    "The right-hand side only": "Pouze pravá strana",
-    "The top and bottom sides only": "Pouze horní a dolní strana",
-    "The top side only": "Pouze horní strana",
-    "Xinha cowardly refuses to delete the last cell in row.": "Xinha zbaběle odmítá smazat poslední buňku v řádku.",
-    "Xinha cowardly refuses to delete the last column in table.": "Xinha zbaběle odmítá smazat poslední sloupec v tabulce.",
-    "Xinha cowardly refuses to delete the last row in table.": "Xinha zbaběle odmítá smazat poslední řádek v tabulce.",
-    "pixels": "pixelů",
-    "__OBSOLETE__": {
-        "Align": "Zarovnání",
-        "Background": "Pozadí",
-        "Baseline": "Základní linka",
-        "Border": "Obrys",
-        "Bottom": "Dolů",
-        "Center": "Na střed",
-        "Char": "Znak",
-        "Collapsed borders": "Stlačené okraje",
-        "Color": "Barva",
-        "FG Color": "Barva popředí",
-        "Float": "Obtékání",
-        "Height": "Výška",
-        "How many columns would you like to merge?": "Kolik sloupců si přejete spojit?",
-        "How many rows would you like to merge?": "Kolik řádků si přejete spojit?",
-        "Image URL": "Adresa obrázku",
-        "Justify": "Do stran",
-        "Layout": "Rozložení",
-        "Left": "Vlevo",
-        "Margin": "Okraj",
-        "Middle": "Na střed",
-        "None": "Žádné",
-        "Right": "Vpravo",
-        "Rules": "Čáry",
-        "Split cell": "Rozdělit buňku",
-        "Style [CSS]": "Kaskádové styly (CSS)",
-        "Text align": "Zarovnání textu",
-        "Top": "Nahoru",
-        "Unset color": "Zrušit barvu",
-        "Vertical align": "Svislé zarovnání",
-        "Width": "Šířka",
-        "percent": "procent"
-    }
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/TableOperations/lang/da.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/TableOperations/lang/da.js
deleted file mode 100644
index 60f1208..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/TableOperations/lang/da.js
+++ /dev/null
@@ -1,91 +0,0 @@
-// I18N constants
-// LANG: "da", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "All four sides": "Alle fire sider",
-    "Borders": "Kanter",
-    "Cancel": "Fortryd",
-    "Caption": "Titel",
-    "Cell Properties": "Celle egenskaber",
-    "Cell properties": "Celle egenskaber",
-    "Delete cell": "Slet celle",
-    "Delete column": "Slet kollonne",
-    "Delete row": "Slet række",
-    "Description": "Beskrivelse",
-    "Frames": "Udvendig",
-    "Insert cell after": "Indsæt celle efter",
-    "Insert cell before": "Indsæt celle før",
-    "Insert column after": "Indsæt kolonne efter",
-    "Insert column before": "Indsæt kolonne før",
-    "Insert row after": "Indsæt række efter",
-    "Insert row before": "Indsæt række før",
-    "Merge cells": "Sammensæt celler",
-    "No rules": "Ingen rammer",
-    "No sides": "Ingen sider",
-    "OK": "OK",
-    "Padding": "Margen",
-    "Please click into some cell": "Klik på en celle",
-    "Row Properties": "Række egenskaber",
-    "Row properties": "Række egenskaber",
-    "Rows": "Rækker:",
-    "Rules will appear between all rows and columns": "Rammer mellem rækker og kolonner",
-    "Rules will appear between columns only": "Kun rammer mellem kolonner",
-    "Rules will appear between rows only": "Kun rammer mellem rækker",
-    "Spacing": "Afstand",
-    "Spacing and padding": "Afstand og margen",
-    "Split column": "Opdel kolonne",
-    "Split row": "Opdel række",
-    "Summary": "Beskrivelse",
-    "Table Properties": "Tabel egenskaber",
-    "Table properties": "Tabel egenskaber",
-    "The bottom side only": "Kun i bunden",
-    "The left-hand side only": "Kun i højre side",
-    "The right and left sides only": "Kun i siderne",
-    "The right-hand side only": "Kun i venstre side",
-    "The top and bottom sides only": "Kun i top og bund",
-    "The top side only": "Kun i toppen",
-    "Xinha cowardly refuses to delete the last cell in row.": "Du kan ikke slette den sidste celle i en række.",
-    "Xinha cowardly refuses to delete the last column in table.": "Du kan ikke slette den sidste kolonne i en tabel.",
-    "Xinha cowardly refuses to delete the last row in table.": "Du kan ikke slette den sidste række i en tabel.",
-    "pixels": "pixel",
-    "__OBSOLETE__": {
-        "Align": "Placer",
-        "Background": "Baggrund",
-        "Baseline": "Bundlinie",
-        "Border": "Kant",
-        "Bottom": "Bund",
-        "Center": "Centrer",
-        "Char": "Plads",
-        "Collapsed borders": "Sammensmelt rammer",
-        "Color": "Farve",
-        "FG Color": "Font farve",
-        "Float": "Justering",
-        "Height": "Højde",
-        "How many columns would you like to merge?": "Hvor mange kollonner vil du samle?",
-        "How many rows would you like to merge?": "Hvor mange rækker vil du samle?",
-        "Image URL": "Billede URL",
-        "Justify": "Lige margener",
-        "Layout": "Opsætning",
-        "Left": "Venstre",
-        "Margin": "Margen",
-        "Middle": "Centrer",
-        "None": "Ingen",
-        "Right": "Højre",
-        "Rules": "Invendig",
-        "Split cell": "Opdel celle",
-        "Style [CSS]": "Stil [CSS]",
-        "Text align": "Tekst",
-        "Top": "Top",
-        "Unset color": "Farve ikke valgt",
-        "Vertical align": "Vertikal placering",
-        "Width": "Bredde",
-        "percent": "procent"
-    }
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/TableOperations/lang/de.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/TableOperations/lang/de.js
deleted file mode 100644
index daaf998..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/TableOperations/lang/de.js
+++ /dev/null
@@ -1,91 +0,0 @@
-// I18N constants
-// LANG: "de", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "All four sides": "Alle 4 Seiten",
-    "Borders": "Rahmen",
-    "Cancel": "Abbrechen",
-    "Caption": "Überschrift",
-    "Cell Properties": "Zellenoptionen",
-    "Cell properties": "Zellenoptionen",
-    "Delete cell": "Zelle löschen",
-    "Delete column": "Spalte löschen",
-    "Delete row": "Reihe loeschen",
-    "Description": "Beschreibung",
-    "Frames": "Rahmen",
-    "Insert cell after": "Zelle einfügen nach",
-    "Insert cell before": "Zelle einfügen vor",
-    "Insert column after": "Spalte einfügen nach",
-    "Insert column before": "Spalte einfügen vor",
-    "Insert row after": "Reihe einfügen nach",
-    "Insert row before": "Reihe einfügen vor",
-    "Merge cells": "Zellen zusammenfügen",
-    "No rules": "Keine Gitterlinien",
-    "No sides": "Keine Ränder",
-    "OK": "OK",
-    "Padding": "Innenabstand",
-    "Please click into some cell": "Bitte eine Zelle auswählen",
-    "Row Properties": "Zeilenoptionen",
-    "Row properties": "Reiheneinstellungen",
-    "Rows": "Zeilen:",
-    "Rules will appear between all rows and columns": "Linien zwischen Zeilen und Spalten",
-    "Rules will appear between columns only": "Linien zwischen Spalten",
-    "Rules will appear between rows only": "Linien zwischen  Zeilen",
-    "Spacing": "Abstand",
-    "Spacing and padding": "Abstände",
-    "Split column": "Spalte teilen",
-    "Split row": "Reihen aufteilen",
-    "Summary": "Zusammenfassung",
-    "Table Properties": "Tabellenoptionen",
-    "Table properties": "Tabellenoptionen",
-    "The bottom side only": "Nur untere Seite",
-    "The left-hand side only": "Nur linke Seite",
-    "The right and left sides only": "Nur linke und rechte Seite",
-    "The right-hand side only": "Nur rechte Seite",
-    "The top and bottom sides only": "Nur obere und untere Seite",
-    "The top side only": "Nur obere Seite",
-    "Xinha cowardly refuses to delete the last cell in row.": "Letzte Zelle in dieser Zeile kann nicht gelöscht werden",
-    "Xinha cowardly refuses to delete the last column in table.": "Letzte Spalte in dieser Tabelle kann nicht gelöscht werden",
-    "Xinha cowardly refuses to delete the last row in table.": "Letzte Reihe in dieser Tabelle kann nicht gelöscht werden",
-    "pixels": "Pixel",
-    "__OBSOLETE__": {
-        "Align": "Ausrichtung",
-        "Background": "Hintergrund",
-        "Baseline": "Grundlinie",
-        "Border": "Rahmen",
-        "Bottom": "Unten",
-        "Center": "Zentriert",
-        "Char": "Zeichen",
-        "Collapsed borders": "Rahmen fallen zusammen",
-        "Color": "Farbe",
-        "FG Color": "Vordergrundfarbe",
-        "Float": "Float",
-        "Height": "Höhe",
-        "How many columns would you like to merge?": "Wieviele Spalten wollen Sie verbinden?",
-        "How many rows would you like to merge?": "Wieviele Zeilen wollen Sie verbinden?",
-        "Image URL": "Bild-URL",
-        "Justify": "Blocksatz",
-        "Layout": "Layout",
-        "Left": "Links",
-        "Margin": "Rand",
-        "Middle": "Mitte",
-        "None": "Keine",
-        "Right": "Rechts",
-        "Rules": "Linien",
-        "Split cell": "Zellen teilen",
-        "Style [CSS]": "Style [CSS]",
-        "Text align": "Textausrichtung",
-        "Top": "Oben",
-        "Unset color": "Farbe entfernen",
-        "Vertical align": "Vertikale Ausrichtung",
-        "Width": "Breite",
-        "percent": "%"
-    }
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/TableOperations/lang/ee.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/TableOperations/lang/ee.js
deleted file mode 100644
index ba916e9..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/TableOperations/lang/ee.js
+++ /dev/null
@@ -1,14 +0,0 @@
-// I18N constants
-// LANG: "ee", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Cancel": "Loobu",
-    "OK": "OK"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/TableOperations/lang/el.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/TableOperations/lang/el.js
deleted file mode 100644
index e52deff..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/TableOperations/lang/el.js
+++ /dev/null
@@ -1,90 +0,0 @@
-// I18N constants
-// LANG: "el", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "All four sides": "Και οι 4 πλευρές",
-    "Borders": "Περιγράμματα",
-    "Cancel": "Ακύρωση",
-    "Caption": "Λεζάντα",
-    "Cell Properties": "Ιδιότητες Κελιού",
-    "Cell properties": "Ιδιότητες κελιού",
-    "Delete cell": "Διαγραφή κελιού",
-    "Delete column": "Διαγραφή στήλης",
-    "Delete row": "Διαγραφή γραμμής",
-    "Description": "Περιγραφή",
-    "Frames": "Frames",
-    "Insert cell after": "Εισαγωγή κελιού μετά",
-    "Insert cell before": "Εισαγωγή κελιού πριν",
-    "Insert column after": "Εισαγωγή στήλης μετά",
-    "Insert column before": "Εισαγωγή στήλης πριν",
-    "Insert row after": "Εισαγωγή γραμμής πριν",
-    "Insert row before": "Εισαγωγή γραμμής μετά",
-    "Merge cells": "Συγχώνευση κελιών",
-    "No rules": "Χωρίς Γραμμές",
-    "No sides": "No sides",
-    "OK": "Εντάξει",
-    "Padding": "Εσοχή",
-    "Please click into some cell": "Κάντε κλικ μέσα σε κάποιο κελί",
-    "Row Properties": "Ιδιότητες Γραμμής",
-    "Row properties": "Ιδιότητες γραμμής",
-    "Rules will appear between all rows and columns": "Γραμμές θα εμφανίζονται μεταξύ όλων των γραμμών και στηλών",
-    "Rules will appear between columns only": "Γραμμές θα εμφανίζονται μόνο μεταξύ στηλών",
-    "Rules will appear between rows only": "Γραμμές θα εμφανίζονται μόνο μεταξύ γραμμών",
-    "Spacing": "Αποστάσεις",
-    "Spacing and padding": "Αποστάσεις και εσοχές",
-    "Split column": "Διαίρεση στήλης",
-    "Split row": "Διαίρεση γραμμής",
-    "Summary": "Σύνοψη",
-    "Table Properties": "Ιδιότητες πίνακα",
-    "Table properties": "Ιδιότητες πίνακα",
-    "The bottom side only": "Η κάτω πλευρά μόνο",
-    "The left-hand side only": "Η αριστερή πλευρά μόνο",
-    "The right and left sides only": "Οι δεξιές και αριστερές πλευρές μόνο",
-    "The right-hand side only": "Η δεξιά πλευρά μόνο",
-    "The top and bottom sides only": "Οι πάνω και κάτω πλευρές μόνο",
-    "The top side only": "Η πάνω πλευρά μόνο",
-    "Xinha cowardly refuses to delete the last cell in row.": "Δεν μπορεί να διαγραφεί το τελευταίο κελί σε μια γραμμή.",
-    "Xinha cowardly refuses to delete the last column in table.": "Δεν μπορεί να διαγραφεί η τελευταία στήλη σε ένα πίνακα.",
-    "Xinha cowardly refuses to delete the last row in table.": "Δεν μπορεί να διαγραφεί η τελευταία γραμμή σε ένα πίνακα.",
-    "pixels": "pixels",
-    "__OBSOLETE__": {
-        "Align": "Στοίχηση",
-        "Background": "Φόντο",
-        "Baseline": "Baseline",
-        "Border": "Περίγραμμα",
-        "Bottom": "Κάτω μέρος",
-        "Center": "Κέντρο",
-        "Char": "Χαρακτήρας",
-        "Collapsed borders": "Συμπτυγμένα περιγράμματα",
-        "Color": "Χρώμα",
-        "FG Color": "Χρώμα αντικειμένων",
-        "Float": "Float",
-        "Height": "Ύψος",
-        "How many columns would you like to merge?": "Πόσες στήλες θέλετε να ενώσετε;",
-        "How many rows would you like to merge?": "Πόσες γραμμές θέλετε να ενώσετε;",
-        "Image URL": "URL εικόνας",
-        "Justify": "Πλήρης στοίχηση",
-        "Layout": "Διάταξη",
-        "Left": "Αριστερά",
-        "Margin": "Περιθώριο",
-        "Middle": "Κέντρο",
-        "None": "Τίποτα",
-        "Right": "Δεξιά",
-        "Rules": "Γραμμές",
-        "Split cell": "Διαίρεση κελιού",
-        "Style [CSS]": "Στυλ [CSS]",
-        "Text align": "Στοίχηση κειμένου",
-        "Top": "Πάνω",
-        "Unset color": "Αναίρεση χρώματος",
-        "Vertical align": "Κατακόρυφη στοίχηση",
-        "Width": "Πλάτος",
-        "percent": "τοις εκατόν"
-    }
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/TableOperations/lang/es.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/TableOperations/lang/es.js
deleted file mode 100644
index f5a76e8..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/TableOperations/lang/es.js
+++ /dev/null
@@ -1,91 +0,0 @@
-// I18N constants
-// LANG: "es", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "All four sides": "Todos los cuatro lados",
-    "Borders": "Bordes",
-    "Cancel": "Cancelar",
-    "Caption": "Título",
-    "Cell Properties": "Propiedades de la Celda",
-    "Cell properties": "Propiedades de la celda",
-    "Delete cell": "Suprimir celda",
-    "Delete column": "Suprimir columna",
-    "Delete row": "Suprimir fila",
-    "Description": "Descripción",
-    "Frames": "Marcos",
-    "Insert cell after": "Insertar celda detrás",
-    "Insert cell before": "Insertar celda delante",
-    "Insert column after": "Insertar columna detrás",
-    "Insert column before": "Insertar columna delante",
-    "Insert row after": "Insertar fila detrás",
-    "Insert row before": "Insertar fila delante",
-    "Merge cells": "Unir celdas",
-    "No rules": "Ninguna regla",
-    "No sides": "Ningún lado",
-    "OK": "Aceptar",
-    "Padding": "Relleno (Padding)",
-    "Please click into some cell": "Por favor, haz clic en alguna celda",
-    "Row Properties": "Propiedades de la Fila",
-    "Row properties": "Propiedades de la fila",
-    "Rows": "Filas:",
-    "Rules will appear between all rows and columns": "Las líneas aparecerán entre todas las filas y columnas",
-    "Rules will appear between columns only": "Las líneas aparecerán solo entre las columnas",
-    "Rules will appear between rows only": "Las líneas aparecerán solo entre las filas",
-    "Spacing": "Espaciado",
-    "Spacing and padding": "Espaciado y Relleno",
-    "Split column": "Dividir columna",
-    "Split row": "Dividir fila",
-    "Summary": "Resumen",
-    "Table Properties": "Propiedades de la Tabla",
-    "Table properties": "Propiedades de la tabla",
-    "The bottom side only": "Solo el lado inferior",
-    "The left-hand side only": "Solo el lado izquierdo",
-    "The right and left sides only": "Solo los lados derecho e izquierdo",
-    "The right-hand side only": "Solo el lado derecho",
-    "The top and bottom sides only": "Solo los lados superior e inferior",
-    "The top side only": "Solo el lado superior",
-    "Xinha cowardly refuses to delete the last cell in row.": "Xinha se reusa cobardemente a eliminar la última celda en la fila.",
-    "Xinha cowardly refuses to delete the last column in table.": "Xinha se reusa cobardemente a eliminar la última columna en la tabla.",
-    "Xinha cowardly refuses to delete the last row in table.": "Xinha se reusa cobardemente a eliminar la última fila en la tabla.",
-    "pixels": "píxeles",
-    "__OBSOLETE__": {
-        "Align": "Alinear",
-        "Background": "Fondo",
-        "Baseline": "Línea base",
-        "Border": "Borde",
-        "Bottom": "Abajo",
-        "Center": "Centrar",
-        "Char": "Carácter",
-        "Collapsed borders": "Bordes colapsados",
-        "Color": "Color",
-        "FG Color": "Color Principal",
-        "Float": "Flotante",
-        "Height": "Altura",
-        "How many columns would you like to merge?": "¿Cuántas columnas desea unir?",
-        "How many rows would you like to merge?": "¿Cuántas filas desea unir?",
-        "Image URL": "URL de la imágen",
-        "Justify": "Justificar",
-        "Layout": "Diseño",
-        "Left": "Izquierda",
-        "Margin": "Margen",
-        "Middle": "Medio",
-        "None": "Ninguno",
-        "Right": "Derecha",
-        "Rules": "Líneas",
-        "Split cell": "Dividir celda",
-        "Style [CSS]": "Estilo [CSS]",
-        "Text align": "Alineación del texto",
-        "Top": "Alto",
-        "Unset color": "Remover color",
-        "Vertical align": "Alineación vertical",
-        "Width": "Ancho",
-        "percent": "por ciento"
-    }
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/TableOperations/lang/eu.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/TableOperations/lang/eu.js
deleted file mode 100644
index a6358d1..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/TableOperations/lang/eu.js
+++ /dev/null
@@ -1,16 +0,0 @@
-// I18N constants
-// LANG: "eu", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Cancel": "Utzi",
-    "OK": "Ados",
-    "Rows": "Lerroak:",
-    "Spacing": "Tartea"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/TableOperations/lang/fa.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/TableOperations/lang/fa.js
deleted file mode 100644
index cfc17c2..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/TableOperations/lang/fa.js
+++ /dev/null
@@ -1,16 +0,0 @@
-// I18N constants
-// LANG: "fa", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Cancel": "انصراف",
-    "OK": "بله",
-    "Rows": "ردیف ها",
-    "Spacing": "فاصله گذاری"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/TableOperations/lang/fi.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/TableOperations/lang/fi.js
deleted file mode 100644
index 3b46a7d..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/TableOperations/lang/fi.js
+++ /dev/null
@@ -1,80 +0,0 @@
-// I18N constants
-// LANG: "fi", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "All four sides": "Kaikki neljä sivua",
-    "Borders": "Reunat",
-    "Cancel": "Peruuta",
-    "Caption": "Otsikko",
-    "Cell Properties": "Solun asetukset",
-    "Cell properties": "Solun asetukset",
-    "Delete cell": "Poista solu",
-    "Delete column": "Poista sarake",
-    "Delete row": "Poista rivi",
-    "Description": "Kuvaus",
-    "Frames": "Kehykset",
-    "Insert cell after": "Lisää solu perään",
-    "Insert cell before": "Lisää solu ennen",
-    "Insert column after": "Lisää sarake perään",
-    "Insert column before": "Lisää sarake ennen",
-    "Insert row after": "Lisää rivi alapuolelle",
-    "Insert row before": "Lisää rivi yläpuolelle",
-    "Merge cells": "Yhdistä solut",
-    "No rules": "Ei viivoja",
-    "No sides": "Ei sivuja",
-    "OK": "Hyväksy",
-    "Padding": "Palstantäyte",
-    "Row Properties": "Rivin asetukset",
-    "Row properties": "Rivin asetukset",
-    "Rules will appear between all rows and columns": "Viivat jokaisen rivin ja sarakkeen välillä",
-    "Rules will appear between columns only": "Viivat ainoastaan sarakkeiden välillä",
-    "Rules will appear between rows only": "Viivat ainoastaan rivien välillä",
-    "Spacing": "Palstatila",
-    "Split column": "Jaa sarake",
-    "Split row": "Jaa rivi",
-    "Summary": "Yhteenveto",
-    "Table Properties": "Taulukon asetukset",
-    "Table properties": "Taulukon asetukset",
-    "The bottom side only": "Ainoastaan alapuolelle",
-    "The left-hand side only": "Ainoastaan vasenreuna",
-    "The right and left sides only": "Oikea- ja vasenreuna",
-    "The right-hand side only": "Ainoastaan oikeareuna",
-    "The top and bottom sides only": "Ylä- ja alapuoli.",
-    "The top side only": "Ainoastaan yläpuoli",
-    "Xinha cowardly refuses to delete the last cell in row.": "Ei voida poistaa viimeistä solua rivistä.",
-    "Xinha cowardly refuses to delete the last column in table.": "Ei voida poistaa viimeistä saraketta taulusta.",
-    "Xinha cowardly refuses to delete the last row in table.": "Ei voida poistaa viimeistä riviä taulusta.",
-    "pixels": "pikseliä",
-    "__OBSOLETE__": {
-        "Align": "Kohdistus",
-        "Background": "Tausta",
-        "Baseline": "Takaraja",
-        "Border": "Reuna",
-        "Bottom": "Alle",
-        "Center": "Keskelle",
-        "Char": "Merkki",
-        "Collapsed borders": "Luhistetut reunat",
-        "Color": "Väri",
-        "FG Color": "FG Väri",
-        "Image URL": "Kuvan osoite",
-        "Layout": "Sommittelu",
-        "Left": "Vasen",
-        "Margin": "Marginaali",
-        "Middle": "Keskelle",
-        "Right": "Oikea",
-        "Rules": "Viivat",
-        "Split cell": "Jaa solu",
-        "Style [CSS]": "Tyyli [CSS]",
-        "Top": "Ylös",
-        "Vertical align": "Vertikaali kohdistus",
-        "Width": "Leveys",
-        "percent": "prosenttia"
-    }
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/TableOperations/lang/fr.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/TableOperations/lang/fr.js
deleted file mode 100644
index 63f481a..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/TableOperations/lang/fr.js
+++ /dev/null
@@ -1,91 +0,0 @@
-// I18N constants
-// LANG: "fr", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "All four sides": "Quatre cotés",
-    "Borders": "Bordures",
-    "Cancel": "Annuler",
-    "Caption": "Étiquette",
-    "Cell Properties": "Propriétés de cellule",
-    "Cell properties": "Cell properties",
-    "Delete cell": "Supprimer une cellule",
-    "Delete column": "Supprimer la colonne",
-    "Delete row": "Supprimer une rangée",
-    "Description": "Description",
-    "Frames": "Vues",
-    "Insert cell after": "Insérer une cellule après",
-    "Insert cell before": "Insérer une cellule avant",
-    "Insert column after": "Insérer une colonne après",
-    "Insert column before": "Insérer une colonne avant",
-    "Insert row after": "Insérer une rangée après",
-    "Insert row before": "Insérer une rangée avant",
-    "Merge cells": "Fusionner les cellules",
-    "No rules": "Aucune règle",
-    "No sides": "Aucun côté",
-    "OK": "OK",
-    "Padding": "Remplissage",
-    "Please click into some cell": "Cliquer sur une cellule",
-    "Row Properties": "Propriétés de rangée",
-    "Row properties": "Propriétés de rangée",
-    "Rows": "Lignes",
-    "Rules will appear between all rows and columns": "Règles entre les rangées et les cellules",
-    "Rules will appear between columns only": "Règles entre les colonnes seulement",
-    "Rules will appear between rows only": "Règles entre les rangées seulement",
-    "Spacing": "Espacement",
-    "Spacing and padding": "Espacement et remplissage",
-    "Split column": "Diviser une colonne",
-    "Split row": "Diviser la rangée",
-    "Summary": "Sommaire",
-    "Table Properties": "Propriétés de table",
-    "Table properties": "Propriétés de table",
-    "The bottom side only": "Côté du bas seulement",
-    "The left-hand side only": "Côté gauche seulement",
-    "The right and left sides only": "Côté gauche et droit seulement",
-    "The right-hand side only": "Côté droit seulement",
-    "The top and bottom sides only": "Côté haut et bas seulement",
-    "The top side only": "Côté haut seulement",
-    "Xinha cowardly refuses to delete the last cell in row.": "Il est impossible de supprimer la dernière cellule de la rangée.",
-    "Xinha cowardly refuses to delete the last column in table.": "Il est impossible de supprimer la dernière colonne de la table.",
-    "Xinha cowardly refuses to delete the last row in table.": "Il est impossible de supprimer la dernière rangée de la table",
-    "pixels": "pixels",
-    "__OBSOLETE__": {
-        "Align": "Aligner",
-        "Background": "Arrière plan",
-        "Baseline": "Ligne de base",
-        "Border": "Bordure",
-        "Bottom": "Bas",
-        "Center": "Centre",
-        "Char": "Charactère",
-        "Collapsed borders": "Bordure effondrés",
-        "Color": "Couleur",
-        "FG Color": "Couleur de face",
-        "Float": "Flotteur",
-        "Height": "Largeur",
-        "How many columns would you like to merge?": "Combien de colonnes voulez-vous fusionner?",
-        "How many rows would you like to merge?": "Combien de rangées voulez-vous fusionner?",
-        "Image URL": "URL pour l'image",
-        "Justify": "Justifié",
-        "Layout": "Arrangement",
-        "Left": "Gauche",
-        "Margin": "Marge",
-        "Middle": "Milieu",
-        "None": "Aucun",
-        "Right": "Droit",
-        "Rules": "Les règles",
-        "Split cell": "Diviser la cellule",
-        "Style [CSS]": "Style [CSS]",
-        "Text align": "Alignement",
-        "Top": "Haut",
-        "Unset color": "Enlever la couleur",
-        "Vertical align": "Vertical",
-        "Width": "Longeur",
-        "percent": "%"
-    }
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/TableOperations/lang/he.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/TableOperations/lang/he.js
deleted file mode 100644
index ae254a4..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/TableOperations/lang/he.js
+++ /dev/null
@@ -1,90 +0,0 @@
-// I18N constants
-// LANG: "he", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "All four sides": "כל ארבעת הצדדים",
-    "Borders": "גבולות",
-    "Cancel": "ביטול",
-    "Caption": "כותרת",
-    "Cell Properties": "מאפייני תא",
-    "Cell properties": "מאפייני תא",
-    "Delete cell": "מחק תא",
-    "Delete column": "מחק טור",
-    "Delete row": "מחק שורה",
-    "Description": "תיאור",
-    "Frames": "מסגרות",
-    "Insert cell after": "הכנס תא אחרי",
-    "Insert cell before": "הכנס תא לפני",
-    "Insert column after": "הכנס טור אחרי",
-    "Insert column before": "הכנס טור לפני",
-    "Insert row after": "הכנס שורה אחרי",
-    "Insert row before": "הכנס שורה לפני",
-    "Merge cells": "מזג תאים",
-    "No rules": "ללא קווים",
-    "No sides": "ללא צדדים",
-    "OK": "אישור",
-    "Padding": "ריווח בשוליים",
-    "Please click into some cell": "אנא לחץ על תא כלשהו",
-    "Row Properties": "מאפייני שורה",
-    "Row properties": "מאפייני שורה",
-    "Rules will appear between all rows and columns": "קווים יופיעו בין כל השורות והטורים",
-    "Rules will appear between columns only": "קווים יופיעו בין טורים בלבד",
-    "Rules will appear between rows only": "קווים יופיעו בין שורות בלבד",
-    "Spacing": "ריווח",
-    "Spacing and padding": "ריווח ושוליים",
-    "Split column": "פצל טור",
-    "Split row": "פצל שורה",
-    "Summary": "סיכום",
-    "Table Properties": "מאפייני טבלה",
-    "Table properties": "מאפייני טבלה",
-    "The bottom side only": "הצד התחתון בלבד",
-    "The left-hand side only": "הצד השמאלי בלבד",
-    "The right and left sides only": "הצדדים הימני והשמאלי בלבד",
-    "The right-hand side only": "הצד הימני בלבד",
-    "The top and bottom sides only": "הצדדים העליון והתחתון בלבד",
-    "The top side only": "הצד העליון בלבד",
-    "Xinha cowardly refuses to delete the last cell in row.": "Xinha מסרב בפחדנות למחוק את התא האחרון בשורה.",
-    "Xinha cowardly refuses to delete the last column in table.": "Xinha מסרב בפחדנות למחוק את הטור האחרון בטבלה.",
-    "Xinha cowardly refuses to delete the last row in table.": "Xinha מסרב בפחדנות למחוק את השורה האחרונה בטבלה.",
-    "pixels": "פיקסלים",
-    "__OBSOLETE__": {
-        "Align": "ישור",
-        "Background": "רקע",
-        "Baseline": "קו בסיס",
-        "Border": "גבול",
-        "Bottom": "תחתון",
-        "Center": "מרכז",
-        "Char": "תו",
-        "Collapsed borders": "גבולות קורסים",
-        "Color": "צבע",
-        "FG Color": "צבע קידמה",
-        "Float": "מרחף",
-        "Height": "גובה",
-        "How many columns would you like to merge?": "כמה טורים ברצונך למזג?",
-        "How many rows would you like to merge?": "כמה שורות ברצונך למזג?",
-        "Image URL": "URL התמונה",
-        "Justify": "ישור",
-        "Layout": "פריסה",
-        "Left": "שמאל",
-        "Margin": "שוליים",
-        "Middle": "אמצע",
-        "None": "אין",
-        "Right": "ימין",
-        "Rules": "קווים",
-        "Split cell": "פצל תא",
-        "Style [CSS]": "סגנון [CSS]",
-        "Text align": "ישור טקסט",
-        "Top": "עליון",
-        "Unset color": "צבע לא נבחר",
-        "Vertical align": "יישור אנכי",
-        "Width": "רוחב",
-        "percent": "אחוז"
-    }
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/TableOperations/lang/hu.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/TableOperations/lang/hu.js
deleted file mode 100644
index b38528d..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/TableOperations/lang/hu.js
+++ /dev/null
@@ -1,14 +0,0 @@
-// I18N constants
-// LANG: "hu", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Cancel": "Mégsem",
-    "OK": "Rendben"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/TableOperations/lang/it.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/TableOperations/lang/it.js
deleted file mode 100644
index a791271..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/TableOperations/lang/it.js
+++ /dev/null
@@ -1,90 +0,0 @@
-// I18N constants
-// LANG: "it", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "All four sides": "Tutti e quattro i lati",
-    "Borders": "Bordi",
-    "Cancel": "Annullamento",
-    "Caption": "Titolo",
-    "Cell Properties": "Proprietà della Cella",
-    "Cell properties": "Proprietà della cella",
-    "Delete cell": "Cancella cella",
-    "Delete column": "Cancella colonna",
-    "Delete row": "Cancella riga",
-    "Description": "Descrizione",
-    "Frames": "Frames",
-    "Insert cell after": "Inserisci cella dopo",
-    "Insert cell before": "Inserisci cella prima",
-    "Insert column after": "Inserisci colonna dopo",
-    "Insert column before": "Inserisci colonna prima",
-    "Insert row after": "Inserisci riga dopo",
-    "Insert row before": "Inserisci riga prima",
-    "Merge cells": "Unisci celle",
-    "No rules": "Nessun righello",
-    "No sides": "Nessun lato",
-    "OK": "OK",
-    "Padding": "Padding",
-    "Please click into some cell": "Per favore, clicca in una cella",
-    "Row Properties": "Proprietà della Riga",
-    "Row properties": "Proprietà della riga",
-    "Rules will appear between all rows and columns": "Le linee appariranno tra tutte le righe e colonne",
-    "Rules will appear between columns only": "Le linee appariranno solo tra le colonne",
-    "Rules will appear between rows only": "Le linee appariranno solo tra le righe",
-    "Spacing": "Spaziatura",
-    "Spacing and padding": "Spaziatura e Padding",
-    "Split column": "Dividi colonna",
-    "Split row": "Dividi riga",
-    "Summary": "Sommario",
-    "Table Properties": "Proprietà della Tabella",
-    "Table properties": "Proprietà della Tabella",
-    "The bottom side only": "Solo la parte inferiore",
-    "The left-hand side only": "Solo la parte sinistra",
-    "The right and left sides only": "Solo destra e sinistra",
-    "The right-hand side only": "Solo la parte destra",
-    "The top and bottom sides only": "Solo sopra e sotto",
-    "The top side only": "Solo la parte sopra",
-    "Xinha cowardly refuses to delete the last cell in row.": "Xinha si rifiuta codardamente di cancellare l'ultima cella nella riga.",
-    "Xinha cowardly refuses to delete the last column in table.": "Xinha si rifiuta codardamente di cancellare l'ultima colonna nella tabella.",
-    "Xinha cowardly refuses to delete the last row in table.": "Xinha si rifiuta codardamente di cancellare l'ultima riga nella tabella.",
-    "pixels": "pixels",
-    "__OBSOLETE__": {
-        "Align": "Allinea",
-        "Background": "Sfondo",
-        "Baseline": "Allineamento",
-        "Border": "Bordo",
-        "Bottom": "Basso",
-        "Center": "Centra",
-        "Char": "Carattere",
-        "Collapsed borders": "Bordi chiusi",
-        "Color": "Colore",
-        "FG Color": "Colore Principale",
-        "Float": "Fluttuante",
-        "Height": "Altezza",
-        "How many columns would you like to merge?": "Quante colonne vuoi unire?",
-        "How many rows would you like to merge?": "Quante righe vuoi unire?",
-        "Image URL": "URL dell'Immagine",
-        "Justify": "Justifica",
-        "Layout": "Layout",
-        "Left": "Sinistra",
-        "Margin": "Margine",
-        "Middle": "Centrale",
-        "None": "Nulla",
-        "Right": "Destra",
-        "Rules": "Linee",
-        "Split cell": "Dividi cella",
-        "Style [CSS]": "Stile [CSS]",
-        "Text align": "Allineamento del Testo",
-        "Top": "Alto",
-        "Unset color": "Rimuovi colore",
-        "Vertical align": "Allineamento verticale",
-        "Width": "Larghezza",
-        "percent": "percento"
-    }
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/TableOperations/lang/ja.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/TableOperations/lang/ja.js
deleted file mode 100644
index 3f041e3..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/TableOperations/lang/ja.js
+++ /dev/null
@@ -1,96 +0,0 @@
-// I18N constants
-// LANG: "ja", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "All four sides": "四辺すべて",
-    "Borders": "境界線",
-    "Cancel": "中止",
-    "Caption": "キャプション",
-    "Cell Properties": "セルプロパティ",
-    "Cell properties": "セルのプロパティ",
-    "Columns": "列数:",
-    "Delete cell": "セルの削除",
-    "Delete column": "列の削除",
-    "Delete row": "行の削除",
-    "Description": "説明",
-    "Frame and borders": "外枠と境界線",
-    "Frames": "外枠",
-    "Insert cell after": "次にセルを挿入",
-    "Insert cell before": "前にセルを挿入",
-    "Insert column after": "右に列を挿入",
-    "Insert column before": "左に列を挿入",
-    "Insert row after": "下に行を挿入",
-    "Insert row before": "上に行を挿入",
-    "Merge Cells": "セルの結合",
-    "Merge cells": "セルの結合",
-    "No rules": "区切りなし",
-    "No sides": "外枠なし",
-    "OK": "OK",
-    "Padding": "余白",
-    "Please click into some cell": "いずれかのセル内をクリックしてください",
-    "Row Properties": "行プロパティ",
-    "Row properties": "行のプロパティ",
-    "Rows": "行数:",
-    "Rules will appear between all rows and columns": "すべての行間と列間に線を引く",
-    "Rules will appear between columns only": "列の間にのみ線を引く",
-    "Rules will appear between rows only": "行の間にのみ線を引く",
-    "Spacing": "間隔",
-    "Spacing and padding": "間隔と余白",
-    "Split column": "列の分割",
-    "Split row": "行の分割",
-    "Summary": "要約",
-    "Table Properties": "テーブルのプロパティ",
-    "Table properties": "テーブルのプロパティ",
-    "The bottom side only": "下辺のみ",
-    "The left-hand side only": "左辺のみ",
-    "The right and left sides only": "左右辺のみ",
-    "The right-hand side only": "右辺のみ",
-    "The top and bottom sides only": "上下辺のみ",
-    "The top side only": "上辺のみ",
-    "Xinha cowardly refuses to delete the last cell in row.": "安全のために、行にひとつだけ残っている列の削除は拒否されます。",
-    "Xinha cowardly refuses to delete the last column in table.": "安全のために、テーブルにひとつだけ残っている列の削除は拒否されます。",
-    "Xinha cowardly refuses to delete the last row in table.": "安全のために、テーブルにひとつだけ残っている行の削除は拒否されます。",
-    "pixels": "ピクセル",
-    "__OBSOLETE__": {
-        "Align": "行揃え",
-        "Background": "背景",
-        "Baseline": "ベースライン",
-        "Border": "境界線",
-        "Bottom": "下",
-        "CSS Style": "CSSスタイル",
-        "Center": "中央",
-        "Char": "文字",
-        "Collapsed borders": "隣接境界線を重ねる",
-        "Color": "色",
-        "FG Color": "前景色",
-        "Float": "フロート",
-        "Height": "高さ",
-        "How many columns would you like to merge?": "何列結合しますか?",
-        "How many rows would you like to merge?": "何行結合しますか?",
-        "Image URL": "画像URL",
-        "Justify": "両端揃え",
-        "Layout": "レイアウト",
-        "Left": "左",
-        "Margin": "間隔",
-        "Middle": "中",
-        "None": "なし",
-        "Please select the cells you want to merge.": "結合したいセルを複数選択してください。",
-        "Right": "右",
-        "Rules": "区切り",
-        "Split cell": "セルの分割",
-        "Style [CSS]": "スタイル [CSS]",
-        "Text align": "水平位置",
-        "Top": "上",
-        "Unset color": "色指定解除",
-        "Vertical align": "垂直位置",
-        "Width": "幅",
-        "percent": "パーセント"
-    }
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/TableOperations/lang/lc_base.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/TableOperations/lang/lc_base.js
deleted file mode 100644
index 0b839b3..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/TableOperations/lang/lc_base.js
+++ /dev/null
@@ -1,80 +0,0 @@
-// I18N constants
-//
-// LANG: "en", ENCODING: UTF-8
-// Author: Translator-Name, <email@example.com>
-//
-// Last revision: 2018-04-12
-// 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).
-//
-// (Please, remove information below)
-// 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.)
-
-{
-    "All four sides": "",
-    "Borders": "",
-    "Cancel": "",
-    "Caption": "",
-    "Cell Properties": "",
-    "Cell Type:": "",
-    "Cell properties": "",
-    "Cells down": "",
-    "Cells to the right, and": "",
-    "Columns": "",
-    "Delete cell": "",
-    "Delete column": "",
-    "Delete row": "",
-    "Description": "",
-    "Do Not Change": "",
-    "Frame and borders": "",
-    "Frames": "",
-    "Header (th)": "",
-    "Insert cell after": "",
-    "Insert cell before": "",
-    "Insert column after": "",
-    "Insert column before": "",
-    "Insert row after": "",
-    "Insert row before": "",
-    "Merge Cells": "",
-    "Merge cells": "",
-    "Merge current cell with:": "",
-    "No rules": "",
-    "No sides": "",
-    "Normal (td)": "",
-    "OK": "",
-    "Padding": "",
-    "Please click into some cell": "",
-    "Row Properties": "",
-    "Row properties": "",
-    "Rows": "",
-    "Rules will appear between all rows and columns": "",
-    "Rules will appear between columns only": "",
-    "Rules will appear between rows only": "",
-    "Spacing": "",
-    "Spacing and padding": "",
-    "Split column": "",
-    "Split row": "",
-    "Summary": "",
-    "Table Properties": "",
-    "Table properties": "",
-    "The bottom side only": "",
-    "The left-hand side only": "",
-    "The right and left sides only": "",
-    "The right-hand side only": "",
-    "The top and bottom sides only": "",
-    "The top side only": "",
-    "Xinha cowardly refuses to delete the last cell in row.": "",
-    "Xinha cowardly refuses to delete the last column in table.": "",
-    "Xinha cowardly refuses to delete the last row in table.": "",
-    "pixels": ""
-}
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/TableOperations/lang/lt.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/TableOperations/lang/lt.js
deleted file mode 100644
index d118909..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/TableOperations/lang/lt.js
+++ /dev/null
@@ -1,14 +0,0 @@
-// I18N constants
-// LANG: "lt", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Cancel": "Atšaukti",
-    "OK": "OK"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/TableOperations/lang/lv.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/TableOperations/lang/lv.js
deleted file mode 100644
index f83d5d3..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/TableOperations/lang/lv.js
+++ /dev/null
@@ -1,14 +0,0 @@
-// I18N constants
-// LANG: "lv", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Cancel": "Atcelt",
-    "OK": "Labi"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/TableOperations/lang/nb.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/TableOperations/lang/nb.js
deleted file mode 100644
index 72a565e..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/TableOperations/lang/nb.js
+++ /dev/null
@@ -1,90 +0,0 @@
-// I18N constants
-// LANG: "nb", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "All four sides": "Alle fire sider",
-    "Borders": "Kantlinjer",
-    "Cancel": "Avbryt",
-    "Caption": "Overskrift",
-    "Cell Properties": "Celleegenskaper",
-    "Cell properties": "Egenskaper for celle",
-    "Delete cell": "Slett celle",
-    "Delete column": "Slett kolonne",
-    "Delete row": "Slett rad",
-    "Description": "Beskrivelse",
-    "Frames": "rammer",
-    "Insert cell after": "Sett inn celle etter",
-    "Insert cell before": "Sett inn celle foran",
-    "Insert column after": "Skyt inn kolonne etter",
-    "Insert column before": "Skyt inn kolonne før",
-    "Insert row after": "Skyt inn rad etter",
-    "Insert row before": "Skyt inn rad foran",
-    "Merge cells": "Slå sammen celler",
-    "No rules": "Ingen linjal",
-    "No sides": "Ingen sider",
-    "OK": "OK",
-    "Padding": "Luft",
-    "Please click into some cell": "Klikk i en eller annen celle",
-    "Row Properties": "Egenskaper for rad",
-    "Row properties": "Egenskaper for rad",
-    "Rules will appear between all rows and columns": "Linjer vil synes mellom alle rader og kolonner",
-    "Rules will appear between columns only": "Linjer vil synes kun mellom kolonner",
-    "Rules will appear between rows only": "Linjer vil synes kun mellom rader",
-    "Spacing": "Luft",
-    "Spacing and padding": "Luft",
-    "Split column": "Del kolonne",
-    "Split row": "Del rad",
-    "Summary": "Sammendrag",
-    "Table Properties": "Tabellegenskaper",
-    "Table properties": "Tabellegenskaper",
-    "The bottom side only": "Bunnen kun",
-    "The left-hand side only": "Venstresiden kun",
-    "The right and left sides only": "Høyre- og venstresiden kun",
-    "The right-hand side only": "Høyresiden kun",
-    "The top and bottom sides only": "The top and bottom sides only",
-    "The top side only": "Overkanten kun",
-    "Xinha cowardly refuses to delete the last cell in row.": "Xinha nekter å slette siste cellen i tabellen.",
-    "Xinha cowardly refuses to delete the last column in table.": "Xinha nekter å slette siste kolonnen i tabellen.",
-    "Xinha cowardly refuses to delete the last row in table.": "Xinha nekter å slette siste raden i tabellen.",
-    "pixels": "billedpunkter",
-    "__OBSOLETE__": {
-        "Align": "Juster",
-        "Background": "Bakgrund",
-        "Baseline": "Grunnlinje",
-        "Border": "Kantlinje",
-        "Bottom": "Bunn",
-        "Center": "Sentrer",
-        "Char": "Tegn",
-        "Collapsed borders": "Fjern kantlinjer",
-        "Color": "Farge",
-        "FG Color": "FG farge",
-        "Float": "Flytende",
-        "Height": "Høyde",
-        "How many columns would you like to merge?": "Hvor mange kolonner vil du slå sammen?",
-        "How many rows would you like to merge?": "Hvor mange rader vil du slå sammen?",
-        "Image URL": "Bildets URL",
-        "Justify": "Juster",
-        "Layout": "Layout",
-        "Left": "Venstre",
-        "Margin": "Marg",
-        "Middle": "Midten",
-        "None": "Ingen",
-        "Right": "Høyre",
-        "Rules": "Linjer",
-        "Split cell": "Del celle",
-        "Style [CSS]": "Stil [CSS]",
-        "Text align": "Juster tekst",
-        "Top": "Overkant",
-        "Unset color": "Ikke-bestemt farge",
-        "Vertical align": "Vertikal justering",
-        "Width": "Bredde",
-        "percent": "prosent"
-    }
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/TableOperations/lang/nl.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/TableOperations/lang/nl.js
deleted file mode 100644
index 7d921ef..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/TableOperations/lang/nl.js
+++ /dev/null
@@ -1,92 +0,0 @@
-// I18N constants
-// LANG: "nl", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "All four sides": "Alle 4 zijden",
-    "Borders": "Randen",
-    "Cancel": "Annuleren",
-    "Caption": "Opmerking",
-    "Cell Properties": "Celeigenschappen",
-    "Cell properties": "Celeigenschappen",
-    "Columns": "Kolommen:",
-    "Delete cell": "Cel verwijderen",
-    "Delete column": "Kolom verwijderen",
-    "Delete row": "Rij verwijderen",
-    "Description": "Omschrijving",
-    "Frames": "Frames",
-    "Insert cell after": "Voeg cel toe achter",
-    "Insert cell before": "Voeg cel toe voor",
-    "Insert column after": "Kolom invoegen achter",
-    "Insert column before": "Kolom invoegen voor",
-    "Insert row after": "Rij invoegen onder",
-    "Insert row before": "Rij invoegen boven",
-    "Merge cells": "Cellen samenvoegen",
-    "No rules": "Geen regels",
-    "No sides": "Geen zijlijnen",
-    "OK": "OK",
-    "Padding": "Celmarge",
-    "Please click into some cell": "Klik in een cel a.u.b.",
-    "Row Properties": "Rijeigenschappen",
-    "Row properties": "Rij eigenschappen",
-    "Rows": "Rijen:",
-    "Rules will appear between all rows and columns": "Regels verschijnen tussen alle rijen en kolommen",
-    "Rules will appear between columns only": "Regels verschijnen enkel tussen de kolommen",
-    "Rules will appear between rows only": "Regels verschijnen enkel tussen de rijen",
-    "Spacing": "marge",
-    "Spacing and padding": "Celmarge en afstand tussen cellen",
-    "Split column": "Kolom splitsen",
-    "Split row": "Rij splitsen",
-    "Summary": "Overzicht",
-    "Table Properties": "Tabel eigenschappen",
-    "Table properties": "Tabel eigenschappen",
-    "The bottom side only": "Enkel aan de onderkant",
-    "The left-hand side only": "Enkel aan de linkerkant",
-    "The right and left sides only": "Enkel aan de linker en rechterkant",
-    "The right-hand side only": "Enkel aan de rechterkant",
-    "The top and bottom sides only": "Enkel aan de bovenen onderkant",
-    "The top side only": "Enkel aan de bovenkant",
-    "Xinha cowardly refuses to delete the last cell in row.": "Xinha kan de laatste cel in deze tabel niet verwijderen.",
-    "Xinha cowardly refuses to delete the last column in table.": "Xinha kan de laatste kolom in deze tabel niet verwijderen.",
-    "Xinha cowardly refuses to delete the last row in table.": "Xinha kan de laatste rij in deze tabel niet verwijderen.",
-    "pixels": "pixels",
-    "__OBSOLETE__": {
-        "Align": "Uitlijning",
-        "Background": "Achtergrond",
-        "Baseline": "Basis",
-        "Border": "Rand",
-        "Bottom": "Onder",
-        "Center": "Centreren",
-        "Char": "Karakter",
-        "Collapsed borders": "Geen randen",
-        "Color": "Kleur",
-        "FG Color": "Voorgrond",
-        "Float": "Zwevend",
-        "Height": "Hoogte",
-        "How many columns would you like to merge?": "Hoeveel kolommen wilt u samenvoegen?",
-        "How many rows would you like to merge?": "Hoeveel rijen wilt u samenvoegen?",
-        "Image URL": "Afbeelding URL",
-        "Justify": "Uitvullen",
-        "Layout": "Opmaak",
-        "Left": "Links",
-        "Margin": "Marge",
-        "Middle": "Midden",
-        "None": "Geen",
-        "Right": "Rechts",
-        "Rules": "Regels",
-        "Split cell": "Cel splitsen",
-        "Style [CSS]": "CSS Style",
-        "Text align": "Text uitlijning",
-        "Top": "Boven",
-        "Unset color": "Wis kleur",
-        "Vertical align": "Vertikale uitlijning",
-        "Width": "Breedte",
-        "percent": "procent"
-    }
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/TableOperations/lang/pl.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/TableOperations/lang/pl.js
deleted file mode 100644
index b248684..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/TableOperations/lang/pl.js
+++ /dev/null
@@ -1,93 +0,0 @@
-// I18N constants
-// LANG: "pl", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "All four sides": "Wszystkie 4 strony",
-    "Borders": "Ramki",
-    "Cancel": "Anuluj",
-    "Caption": "Podpis",
-    "Cell Properties": "Właściwości komórki",
-    "Cell properties": "Właściwości komórki",
-    "Delete cell": "Usuń komórkę",
-    "Delete column": "Usuń kolumnę",
-    "Delete row": "Usuń wiersz",
-    "Description": "Opis",
-    "Frame and borders": "Obramowania",
-    "Frames": "Ramki zewn.",
-    "Insert cell after": "Wstaw komórkę po",
-    "Insert cell before": "Wstaw komórkę przed",
-    "Insert column after": "Wstaw kolumnę po",
-    "Insert column before": "Wstaw kolumnę przed",
-    "Insert row after": "Wstaw wiersz po",
-    "Insert row before": "Wstaw wiersz przed",
-    "Merge cells": "Scal komórki",
-    "No rules": "Bez wewnętrzych",
-    "No sides": "Bez ramek",
-    "OK": "OK",
-    "Padding": "Wcięcia",
-    "Please click into some cell": "Kliknij w jakąś komórkę",
-    "Row Properties": "Właściwości wiersza",
-    "Row properties": "Właściwości wiersza",
-    "Rows": "Wierszy:",
-    "Rules will appear between all rows and columns": "Linie będą widoczne pomiędzy kolumnami i wierszami",
-    "Rules will appear between columns only": "Linie będą widoczne tylko pomiędzy kolumnami",
-    "Rules will appear between rows only": "Linie będą widoczne tylko pomiędzy wierszami",
-    "Spacing": "Odstęp",
-    "Spacing and padding": "Spacjowanie",
-    "Split column": "Rozdziel kolumnę",
-    "Split row": "Rozdziel wiersz",
-    "Summary": "Podsumowanie",
-    "Table Properties": "Właściwości tabeli",
-    "Table properties": "Właściwości tabeli",
-    "The bottom side only": "Tylko dolna linia",
-    "The left-hand side only": "Tylko lewa linia",
-    "The right and left sides only": "Lewa i prawa linia",
-    "The right-hand side only": "Tylko prawa linia",
-    "The top and bottom sides only": "Górna i dolna linia",
-    "The top side only": "Tylko górna linia",
-    "Xinha cowardly refuses to delete the last cell in row.": "Nie możesz skasować ostatniej komórki w wierszu.",
-    "Xinha cowardly refuses to delete the last column in table.": "Nie możesz skasować ostatniej kolumny w tabeli.",
-    "Xinha cowardly refuses to delete the last row in table.": "Nie możesz skasować ostatniego wiersza w tabeli.",
-    "pixels": "pikseli",
-    "__OBSOLETE__": {
-        "Align": "Wyrównanie",
-        "Background": "Tło",
-        "Baseline": "Linia bazowa",
-        "Border": "Ramka",
-        "Bottom": "Dół",
-        "CSS Style": "Styl CSS",
-        "Center": "Środek",
-        "Char": "Znak",
-        "Collapsed borders": "Ramki skolapsowane",
-        "Color": "Kolor",
-        "FG Color": "Kolor czcionek",
-        "Float": "Opływanie",
-        "Height": "Wysokość",
-        "How many columns would you like to merge?": "Ile kolumn chcesz scalić?",
-        "How many rows would you like to merge?": "Ile wierszy chcesz scalić?",
-        "Image URL": "URL obrazka",
-        "Justify": "Wyjustuj",
-        "Layout": "Layout",
-        "Left": "Lewo",
-        "Margin": "Margines",
-        "Middle": "Środek",
-        "None": "Brak",
-        "Right": "Prawo",
-        "Rules": "Linie wewn.",
-        "Split cell": "Rozdziel komórkę",
-        "Style [CSS]": "Styl [CSS]",
-        "Text align": "Wyr. w poziomie",
-        "Top": "Góra",
-        "Unset color": "Usuń kolor",
-        "Vertical align": "Wyr. w pionie",
-        "Width": "Szerokość",
-        "percent": "%"
-    }
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/TableOperations/lang/pt_br.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/TableOperations/lang/pt_br.js
deleted file mode 100644
index 98321af..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/TableOperations/lang/pt_br.js
+++ /dev/null
@@ -1,94 +0,0 @@
-// I18N constants
-// LANG: "pt_br", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "All four sides": "todos os quatro lados",
-    "Borders": "Bordas",
-    "Cancel": "Cancelar",
-    "Caption": "Captação",
-    "Cell Properties": "Propriedades da célula",
-    "Cells down": "Células para baixo",
-    "Cells to the right, and": "Células para direita, e",
-    "Columns": "Colunas",
-    "Delete cell": "Apagar célula",
-    "Delete column": "Apagar coluna",
-    "Delete row": "Apagar linha",
-    "Description": "Descrição",
-    "Frame and borders": "Frames e bordas",
-    "Frames": "Frames",
-    "Insert cell after": "Inserir célula antes",
-    "Insert cell before": "Inserir célula depois",
-    "Insert column after": "Inserir coluna antes",
-    "Insert column before": "Inserir coluna depois",
-    "Insert row after": "Inserir linha depois",
-    "Insert row before": "Inserir linha antes",
-    "Merge Cells": "Mesclar Células",
-    "Merge current cell with:": "Mesclar célula atual com:",
-    "No rules": "Sem regras",
-    "No sides": "Sem lados",
-    "OK": "OK",
-    "Padding": "Espaço interno",
-    "Please click into some cell": "Por favor, clique em alguma célula",
-    "Row Properties": "Propriedades da Linha",
-    "Rows": "Linhas",
-    "Rules will appear between all rows and columns": "As Regras apareceram entre todas as linhas e colunas",
-    "Rules will appear between columns only": "Regras apareceram somente nas colunas",
-    "Rules will appear between rows only": "Regras apareceram somente nas linhas",
-    "Spacing": "Espaçamento",
-    "Spacing and padding": "Espaçamentos",
-    "Split column": "Separar colunas",
-    "Split row": "Separar linhas",
-    "Summary": "Sumário",
-    "Table Properties": "Propriedades da Tabela",
-    "The bottom side only": "Somente na parte inferior",
-    "The left-hand side only": "Somente na parte esquerda",
-    "The right and left sides only": "Somente nas parte direita e esquerda",
-    "The right-hand side only": "Somente na parte direita",
-    "The top and bottom sides only": "Somente na parte inferior e superior",
-    "The top side only": "Somente na parte superior",
-    "Xinha cowardly refuses to delete the last cell in row.": "Xinha recusa-se a apagar a última célula na linha",
-    "Xinha cowardly refuses to delete the last column in table.": "Xinha recusa-se a apagar a última coluna da tabela",
-    "Xinha cowardly refuses to delete the last row in table.": "Xinha recusa-se a apagar a última linha da tabela",
-    "pixels": "Pixel",
-    "__OBSOLETE__": {
-        "Align": "Alinhamento",
-        "Background": "Fundo",
-        "Baseline": "Linha de base",
-        "Border": "Bordar",
-        "Bottom": "Botão",
-        "CSS Style": "Estilo (CSS)",
-        "Center": "Centralizar",
-        "Char": "Caracter",
-        "Collapsed borders": "Bordas fechadas",
-        "Color": "Cores",
-        "FG Color": "Cor de primeiro plano",
-        "Float": "Flutuante",
-        "Height": "Altura",
-        "How many columns would you like to merge?": "Quantas colunas você deseja mesclar?",
-        "How many rows would you like to merge?": "Quantas linhas você deseja mesclar?",
-        "Image URL": "URL da imagem",
-        "Justify": "Justificado",
-        "Layout": "Layout",
-        "Left": "Esquerda",
-        "Margin": "Margem",
-        "Middle": "Meio",
-        "None": "Nenhum",
-        "Right": "Direita",
-        "Rules": "Regras",
-        "Split cell": "Separar célula",
-        "Style [CSS]": "Estilo [CSS]",
-        "Text align": "Alinhamento do texto",
-        "Top": "Topo",
-        "Unset color": "Cor não definida",
-        "Vertical align": "Alinhamento vertical",
-        "Width": "Largura",
-        "percent": "%"
-    }
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/TableOperations/lang/ro.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/TableOperations/lang/ro.js
deleted file mode 100644
index 6791aad..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/TableOperations/lang/ro.js
+++ /dev/null
@@ -1,90 +0,0 @@
-// I18N constants
-// LANG: "ro", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "All four sides": "Toate părţile",
-    "Borders": "Chenare",
-    "Cancel": "Renunţă",
-    "Caption": "Titlu de tabel",
-    "Cell Properties": "Proprietăţile celulei",
-    "Cell properties": "Proprietăţile celulei",
-    "Delete cell": "Şterge celula",
-    "Delete column": "Şterge coloana",
-    "Delete row": "Şterge rândul",
-    "Description": "Descriere",
-    "Frames": "Chenare",
-    "Insert cell after": "Inserează o celulă la dreapta",
-    "Insert cell before": "Inserează o celulă la stânga",
-    "Insert column after": "Inserează o coloană la dreapta",
-    "Insert column before": "Inserează o coloană la stânga",
-    "Insert row after": "Inserează un rând după",
-    "Insert row before": "Inserează un rând înainte",
-    "Merge cells": "Uneşte celulele",
-    "No rules": "Fără linii",
-    "No sides": "Fără părţi",
-    "OK": "Acceptă",
-    "Padding": "Spaţiere",
-    "Please click into some cell": "Vă rog să daţi click într-o celulă",
-    "Row Properties": "Proprietăţile liniei",
-    "Row properties": "Proprietăţile rândului",
-    "Rules will appear between all rows and columns": "Vor apărea linii între toate rândurile şi coloanele",
-    "Rules will appear between columns only": "Vor apărea doar linii verticale",
-    "Rules will appear between rows only": "Vor apărea doar linii orizontale",
-    "Spacing": "Între celule",
-    "Spacing and padding": "Spaţierea",
-    "Split column": "Împarte coloana",
-    "Split row": "Împarte rândul",
-    "Summary": "Sumar",
-    "Table Properties": "Proprietăţile tabelei",
-    "Table properties": "Proprietăţile tabelei",
-    "The bottom side only": "Doar partea de jos",
-    "The left-hand side only": "Doar partea din stânga",
-    "The right and left sides only": "Partea din stânga şi cea din dreapta",
-    "The right-hand side only": "Doar partea din dreapta",
-    "The top and bottom sides only": "Partea de sus si cea de jos",
-    "The top side only": "Doar partea de sus",
-    "Xinha cowardly refuses to delete the last cell in row.": "Xinha refuză cu laşitate să şteargă ultima celulă din rând.",
-    "Xinha cowardly refuses to delete the last column in table.": "Xinha refuză cu laşitate să şteargă ultima coloamă din tabela.",
-    "Xinha cowardly refuses to delete the last row in table.": "Xinha refuză cu laşitate să şteargă ultimul rând din tabela.",
-    "pixels": "pixeli",
-    "__OBSOLETE__": {
-        "Align": "Aliniere",
-        "Background": "Fundal",
-        "Baseline": "Baseline",
-        "Border": "Chenar",
-        "Bottom": "Jos",
-        "Center": "Centru",
-        "Char": "Caracter",
-        "Collapsed borders": "Chenare asimilate",
-        "Color": "Culoare",
-        "FG Color": "Culoare text",
-        "Float": "Poziţie",
-        "Height": "Înălţimea",
-        "How many columns would you like to merge?": "Câte coloane vrei să uneşti?",
-        "How many rows would you like to merge?": "Câte linii vrei să uneşti?",
-        "Image URL": "URL-ul imaginii",
-        "Justify": "Justify",
-        "Layout": "Aranjament",
-        "Left": "Stânga",
-        "Margin": "Margine",
-        "Middle": "Mijloc",
-        "None": "Nimic",
-        "Right": "Dreapta",
-        "Rules": "Linii",
-        "Split cell": "Împarte celula",
-        "Style [CSS]": "Stil [CSS]",
-        "Text align": "Aliniere",
-        "Top": "Sus",
-        "Unset color": "Dezactivează culoarea",
-        "Vertical align": "Aliniere pe verticală",
-        "Width": "Lăţime",
-        "percent": "procente"
-    }
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/TableOperations/lang/ru.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/TableOperations/lang/ru.js
deleted file mode 100644
index 12b5052..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/TableOperations/lang/ru.js
+++ /dev/null
@@ -1,91 +0,0 @@
-// I18N constants
-// LANG: "ru", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "All four sides": "Все 4 стороны",
-    "Borders": "Рамки",
-    "Cancel": "Отмена",
-    "Caption": "Заголовок",
-    "Cell Properties": "Свойства ячеек",
-    "Cell properties": "Свойства ячеек",
-    "Delete cell": "Удалить ячейку",
-    "Delete column": "Удалить столбец",
-    "Delete row": "Удалить строку",
-    "Description": "Описание",
-    "Frames": "Фреймы",
-    "Insert cell after": "Вставить ячейку после",
-    "Insert cell before": "Вставить ячейку до",
-    "Insert column after": "Вставить столбец после",
-    "Insert column before": "Вставить столбец до",
-    "Insert row after": "Вставить строку после",
-    "Insert row before": "Вставить строку до",
-    "Merge cells": "Объединить ячейки",
-    "No rules": "Нет линейки",
-    "No sides": "Нет сторон",
-    "OK": "OK",
-    "Padding": "Поля",
-    "Please click into some cell": "Пожалуйста щелкните в некоторые ячейки",
-    "Row Properties": "Свойства строк",
-    "Row properties": "Свойства строки",
-    "Rows": "Строки",
-    "Rules will appear between all rows and columns": "Линейки появятся между всеми строками и столбцами",
-    "Rules will appear between columns only": "Линейки появятся только между столбцами",
-    "Rules will appear between rows only": "Линейки появятся только между строками",
-    "Spacing": "Отступы",
-    "Spacing and padding": "Поля и отступы",
-    "Split column": "Разделить столбец",
-    "Split row": "Разделить строку",
-    "Summary": "Сводка",
-    "Table Properties": "Свойства таблиц",
-    "Table properties": "Свойства таблиц",
-    "The bottom side only": "Только нижний край",
-    "The left-hand side only": "Только левый край",
-    "The right and left sides only": "Только левый и правый край",
-    "The right-hand side only": "Только правый край",
-    "The top and bottom sides only": "Только верхний и нижний край",
-    "The top side only": "Только верхний край",
-    "Xinha cowardly refuses to delete the last cell in row.": "Xinha отказалась удалять последнюю ячейку в строке.",
-    "Xinha cowardly refuses to delete the last column in table.": "Xinha отказалась удалять последний столбец в таблице.",
-    "Xinha cowardly refuses to delete the last row in table.": "Xinha отказалась удалять последнюю строку в таблице.",
-    "pixels": "пикселей",
-    "__OBSOLETE__": {
-        "Align": "Выравнивание",
-        "Background": "Фон",
-        "Baseline": "Базовая линия",
-        "Border": "Рамка",
-        "Bottom": "Низ",
-        "Center": "Центр",
-        "Char": "Символ",
-        "Collapsed borders": "Накладывающиеся рамки",
-        "Color": "Цвет",
-        "FG Color": "Цвет переднего плана",
-        "Float": "Обтекание",
-        "Height": "Высота",
-        "How many columns would you like to merge?": "Сколько столбцов вы хотите объединить?",
-        "How many rows would you like to merge?": "Сколько строк вы хотите объединить?",
-        "Image URL": "URL картинки",
-        "Justify": "По правому краю",
-        "Layout": "Раскладка",
-        "Left": "Лево",
-        "Margin": "Отступ",
-        "Middle": "Середина",
-        "None": "Ничего",
-        "Right": "Право",
-        "Rules": "Линейки",
-        "Split cell": "Разделить ячейку",
-        "Style [CSS]": "Стиль [CSS]",
-        "Text align": "Выравнивание теста",
-        "Top": "Верх",
-        "Unset color": "Отменить цвет",
-        "Vertical align": "Вертикальное  выравнивание",
-        "Width": "Ширина",
-        "percent": "процентов"
-    }
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/TableOperations/lang/sh.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/TableOperations/lang/sh.js
deleted file mode 100644
index aa2e048..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/TableOperations/lang/sh.js
+++ /dev/null
@@ -1,16 +0,0 @@
-// I18N constants
-// LANG: "sh", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Cancel": "Poništi",
-    "OK": "OK",
-    "Rows": "Redovi",
-    "Spacing": "Razmak"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/TableOperations/lang/si.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/TableOperations/lang/si.js
deleted file mode 100644
index 7674892..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/TableOperations/lang/si.js
+++ /dev/null
@@ -1,14 +0,0 @@
-// I18N constants
-// LANG: "si", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Cancel": "Prekliči",
-    "OK": "V redu"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/TableOperations/lang/sr.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/TableOperations/lang/sr.js
deleted file mode 100644
index 30fb1bc..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/TableOperations/lang/sr.js
+++ /dev/null
@@ -1,16 +0,0 @@
-// I18N constants
-// LANG: "sr", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Cancel": "Поништи",
-    "OK": "OK",
-    "Rows": "Редови",
-    "Spacing": "Размак"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/TableOperations/lang/sv.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/TableOperations/lang/sv.js
deleted file mode 100755
index 2b320ec..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/TableOperations/lang/sv.js
+++ /dev/null
@@ -1,91 +0,0 @@
-// I18N constants
-// LANG: "sv", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "All four sides": "Alla fyra sidor",
-    "Borders": "Kantlinjer",
-    "Cancel": "Avbryt",
-    "Caption": "Överskrift",
-    "Cell Properties": "Cellegenskaper",
-    "Cell properties": "Egenskaper for cell",
-    "Delete cell": "Radera cell",
-    "Delete column": "Radera kolumn",
-    "Delete row": "Radera rad",
-    "Description": "Beskrivning",
-    "Frames": "ramar",
-    "Insert cell after": "Infoga cell efter",
-    "Insert cell before": "Infoga cell före",
-    "Insert column after": "Infoga kolumn efter",
-    "Insert column before": "Infoga kolumn före",
-    "Insert row after": "Infoga rad efter",
-    "Insert row before": "Infoga rad före",
-    "Merge cells": "Slå samman celler",
-    "No rules": "Ingen linjal",
-    "No sides": "Inga sidor",
-    "OK": "OK",
-    "Padding": "Luft",
-    "Please click into some cell": "Klicka i valfri cell",
-    "Row Properties": "Egenskaper for rad",
-    "Row properties": "Egenskaper för rad",
-    "Rows": "Rader:",
-    "Rules will appear between all rows and columns": "Linjaler kommer att synas mellan alla rader och kolumner",
-    "Rules will appear between columns only": "Linjaler kommer enbart synas mellan kolumner",
-    "Rules will appear between rows only": "Linjaler kommer enbart synas mellan rader",
-    "Spacing": "Mellanrum",
-    "Spacing and padding": "Mellanrum och luft",
-    "Split column": "Dela kolumn",
-    "Split row": "Dela rad",
-    "Summary": "Sammandrag",
-    "Table Properties": "Tabellegenskaper",
-    "Table properties": "Tabellegenskaper",
-    "The bottom side only": "Nederkanten enbart",
-    "The left-hand side only": "Vänstersidan enbart",
-    "The right and left sides only": "Höger- och vänstersidan enbart",
-    "The right-hand side only": "Högersidan enbart",
-    "The top and bottom sides only": "Över- och nederkanten enbart",
-    "The top side only": "Överkanten enbart",
-    "Xinha cowardly refuses to delete the last cell in row.": "Xinha nekar att radera sista cellen i tabellen.",
-    "Xinha cowardly refuses to delete the last column in table.": "Xinha nekar att radera sista kolumnen i tabellen.",
-    "Xinha cowardly refuses to delete the last row in table.": "Xinha nekar att radera sista raden i tabellen.",
-    "pixels": "bildpunkter",
-    "__OBSOLETE__": {
-        "Align": "Justera",
-        "Background": "Bakgrund",
-        "Baseline": "Baslinje",
-        "Border": "Kantlinje",
-        "Bottom": "Botten",
-        "Center": "Centrera",
-        "Char": "Tecken",
-        "Collapsed borders": "Osynliga kantlinjer",
-        "Color": "Färg",
-        "FG Color": "Förgrundsfärg",
-        "Float": "Flytande",
-        "Height": "Höjd",
-        "How many columns would you like to merge?": "Hur många kolumner vill du slå samman?",
-        "How many rows would you like to merge?": "Hur många rader vill du slå samman?",
-        "Image URL": "Bildens URL",
-        "Justify": "Justera",
-        "Layout": "Layout",
-        "Left": "Venster",
-        "Margin": "Marginal",
-        "Middle": "Mitten",
-        "None": "Ingen",
-        "Right": "Höger",
-        "Rules": "Linjaler",
-        "Split cell": "Dela cell",
-        "Style [CSS]": "Stil [CSS]",
-        "Text align": "Justera text",
-        "Top": "Överkant",
-        "Unset color": "Obestämd färg",
-        "Vertical align": "Vertikal justering",
-        "Width": "Bredd",
-        "percent": "procent"
-    }
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/TableOperations/lang/th.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/TableOperations/lang/th.js
deleted file mode 100644
index 9da9c8d..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/TableOperations/lang/th.js
+++ /dev/null
@@ -1,14 +0,0 @@
-// I18N constants
-// LANG: "th", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Cancel": "ยกเลิก",
-    "OK": "ตกลง"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/TableOperations/lang/tr.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/TableOperations/lang/tr.js
deleted file mode 100644
index ff1bd48..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/TableOperations/lang/tr.js
+++ /dev/null
@@ -1,91 +0,0 @@
-// I18N constants
-// LANG: "tr", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "All four sides": "Dört kenarı da",
-    "Borders": "Kenarlıklar",
-    "Cancel": "İptal",
-    "Caption": "Başlık",
-    "Cell Properties": "Hücre özellikleri",
-    "Cell properties": "Satır özellikleri",
-    "Delete cell": "Hücreyi sil",
-    "Delete column": "Sütunu sil",
-    "Delete row": "Sırayı sil",
-    "Description": "Tanım",
-    "Frames": "Çerçeveler",
-    "Insert cell after": "Sağına satır ekle",
-    "Insert cell before": "Soluna satır ekle",
-    "Insert column after": "Sağına sütun ekle",
-    "Insert column before": "Soluna sütun ekle",
-    "Insert row after": "Soluna sıra ekle",
-    "Insert row before": "Sağına sıra ekle",
-    "Merge cells": "Satırları birleştir",
-    "No rules": "Çizgi olmasın",
-    "No sides": "Kenar olmasın",
-    "OK": "Tamam",
-    "Padding": "İç boşluk",
-    "Please click into some cell": "Lütfen bir hücre seçin",
-    "Row Properties": "Satır özellikleri",
-    "Row properties": "Sıra özellikleri",
-    "Rows": "Satır:",
-    "Rules will appear between all rows and columns": "Tüm satır ve sütunların arasında",
-    "Rules will appear between columns only": "Yalnızca sütunların arasında",
-    "Rules will appear between rows only": "Yalnızca satırların arasında",
-    "Spacing": "Aralık",
-    "Spacing and padding": "Aralıklar",
-    "Split column": "Sütunu böl",
-    "Split row": "Sütunu böl",
-    "Summary": "Özet",
-    "Table Properties": "Tablo özellikleri",
-    "Table properties": "Tablo özellikleri",
-    "The bottom side only": "Yalnız alt taraf",
-    "The left-hand side only": "Yalnız sol taraf",
-    "The right and left sides only": "Yalnız sağ ve sol taraf",
-    "The right-hand side only": "Yalnız sağ taraf",
-    "The top and bottom sides only": "Yalnız üst ve alt taraf",
-    "The top side only": "Yalnız üst taraf",
-    "Xinha cowardly refuses to delete the last cell in row.": "Satırdaki son hücre silinemez",
-    "Xinha cowardly refuses to delete the last column in table.": "Tablodaki son sütun silinemez",
-    "Xinha cowardly refuses to delete the last row in table.": "Tablodaki son satır silinemez",
-    "pixels": "Piksel",
-    "__OBSOLETE__": {
-        "Align": "Hizala",
-        "Background": "Arka plan",
-        "Baseline": "Taban çizgisi",
-        "Border": "Kenarlık",
-        "Bottom": "Alt",
-        "Center": "Ortala",
-        "Char": "Karakter",
-        "Collapsed borders": "Daraltılmış kenarlıklar",
-        "Color": "Renk",
-        "FG Color": "Ön plan rengi",
-        "Float": "Kaydır",
-        "Height": "Yükseklik",
-        "How many columns would you like to merge?": "Kaç sütun birleştirmek istiyorsunuz?",
-        "How many rows would you like to merge?": "Kaç satır birleştirmek istiyorsunuz?",
-        "Image URL": "Resim URL'si",
-        "Justify": "Yasla",
-        "Layout": "Düzen",
-        "Left": "Sol",
-        "Margin": "Kenar boşluğu",
-        "Middle": "Ortala",
-        "None": "Hiçbiri",
-        "Right": "Sağ",
-        "Rules": "Çizgi",
-        "Split cell": "Satırı böl",
-        "Style [CSS]": "Stil [CSS]",
-        "Text align": "Metin hizası",
-        "Top": "Yukarı",
-        "Unset color": "Rengi kaldır",
-        "Vertical align": "Dikey hiza",
-        "Width": "Genişlik",
-        "percent": "%"
-    }
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/TableOperations/lang/vn.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/TableOperations/lang/vn.js
deleted file mode 100644
index 2d82e02..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/TableOperations/lang/vn.js
+++ /dev/null
@@ -1,14 +0,0 @@
-// I18N constants
-// LANG: "vn", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Cancel": "Hủy",
-    "OK": "Đồng ý"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/TableOperations/popups/dialogMergeCells.html b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/TableOperations/popups/dialogMergeCells.html
deleted file mode 100644
index a891ec1..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/TableOperations/popups/dialogMergeCells.html
+++ /dev/null
@@ -1,26 +0,0 @@
-<h1 id="[h1]"><l10n>Merge Cells</l10n></h1>
-<table width="100%">
-  <tr>
-    <td colspan="2">
-      <l10n>Merge current cell with:</l10n>
-    </td>
-  </tr>
-  <tr>
-    <td style="text-align: right;" width="30%"><input type="text" name="[cols]" value="0" id="[f_cols]" size="4" title="Columns" /></td>
-    <td width="70%"><l10n>Cells to the right, and</l10n></td>
-  </tr>
-  <tr>
-    <td style="text-align: right;"><input type="text" name="[rows]" value="0" id="[f_rows]" size="4" title="Rows" /></td>
-    <td><l10n>Cells down</l10n></td>
-  </tr>
-  <tr>
-    <td colspan="2" style="text-align: right;">
-      <hr />
-      <div class="buttons" id="[buttons]">
-	<input type="button" id="[ok]" value="_(OK)" />
-	<input type="button" id="[cancel]" value="_(Cancel)" />
-      </div>
-    </td>
-  </tr>
-</table>
-
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/TableOperations/popups/dialogRowCell.html b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/TableOperations/popups/dialogRowCell.html
deleted file mode 100644
index 17e8edd..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/TableOperations/popups/dialogRowCell.html
+++ /dev/null
@@ -1,15 +0,0 @@
-<h1 id="[title]">Title</h1>
-<table style="width:100%">
-    <tr>
-        <td id="[TO_layout]"><br />
-        </td>
-    </tr>
-    <tr>
-        <td id="[TO_style]"><br />
-        </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-1.5.1/plugins/TableOperations/popups/dialogTable.html b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/TableOperations/popups/dialogTable.html
deleted file mode 100644
index f3a73c6..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/TableOperations/popups/dialogTable.html
+++ /dev/null
@@ -1,119 +0,0 @@
- <h1 id="[h1]"><l10n>Table Properties</l10n></h1>
-  <table style="width: 100%;">
-      <tbody>
-          <tr>
-              <td>
-                  <fieldset>
-                      <legend>
-                          <l10n>Description</l10n>
-                      </legend>
-                      <table style="width: 100%;">
-                          <tbody>
-                              <tr>
-                                  <td class="label">
-                                      <l10n>Caption</l10n>:
-                                  </td>
-                                  <td class="value">
-                                      <input name="[caption]" value="" type="text">
-                                  </td>
-                              </tr>
-                              <tr>
-                                  <td class="label">
-                                      <l10n>Summary</l10n>:
-                                  </td>
-                                  <td class="value">
-                                      <input name="[summary]" value="" type="text">
-                                  </td>
-                              </tr>
-                          </tbody>
-                      </table>
-                  </fieldset>
-              </td>
-          </tr>
-          <tr>
-              <td id="[TO_layout]"><br />
-              </td>
-          </tr>
-          <tr>
-              <td>
-                  <fieldset>
-                      <legend>
-                          <l10n>Spacing and padding</l10n>
-                      </legend>
-                      <table style="width: 100%;">
-                          <tbody>
-                              <tr>
-                                  <td class="label">
-                                      <l10n>Spacing</l10n>:
-                                  </td>
-                                  <td>
-                                      <input name="[spacing]" size="5" value="" type="text">&nbsp;<l10n>Padding</l10n>: <input name="[padding]" size="5" value="5" type="text">&nbsp;&nbsp;<l10n>pixels</l10n> 
-                                  </td>
-                              </tr>
-                          </tbody>
-                      </table>
-                  </fieldset>
-              </td>
-          </tr>
-          <tr>
-              <td id="[TO_frameRules]">
-                  <fieldset>
-                      <legend>
-                          <l10n>Frame and borders</l10n>
-                      </legend>
-                      <table width="100%">
-                          <tbody>
-                              <tr>
-                                  <td class="label">
-                                      <l10n>Borders</l10n>:
-                                  </td>
-                                  <td>
-                                      <input name="[borders]" size="5" value="" type="text">&nbsp;&nbsp;<l10n>pixels</l10n>
-                                  </td>
-                              </tr>
-                              <tr>
-                                  <td class="label">
-                                      <l10n>Frames</l10n>:
-                                  </td>
-                                  <td>
-                                      <select name="[frames]">
-                                          <option value="void"><l10n>No sides</l10n></option>
-                                          <option value="above"><l10n>The top side only</l10n></option>
-                                          <option value="below"><l10n>The bottom side only</l10n></option>
-                                          <option value="hsides"><l10n>The top and bottom sides only</l10n></option>
-                                          <option value="vsides"><l10n>The right and left sides only</l10n></option>
-                                          <option value="lhs"><l10n>The left-hand side only</l10n></option>
-                                          <option value="rhs"><l10n>The right-hand side only</l10n></option>
-                                          <option value="box"><l10n>All four sides</l10n></option>
-                                      </select>
-                                  </td>
-                              </tr>
-                              <tr>
-                                  <td class="label">
-                                      <l10n>Rules:
-                                  </td>
-                                  <td>
-                                      <select name="[rules]">
-                                          <option value="none"><l10n>No rules</l10n></option>
-                                          <option value="rows"><l10n>Rules will appear between rows only</l10n></option>
-                                          <option value="cols"><l10n>Rules will appear between columns only</l10n></option>
-                                          <option value="all"><l10n>Rules will appear between all rows and columns</l10n></option>
-                                      </select>
-                                  </td>
-                              </tr>
-                          </tbody>
-                      </table>
-                  </fieldset>
-              </td>
-          </tr>
-          <tr>
-              <td id="[TO_style]"><br />
-              </td>
-          </tr>
-      </tbody>
-  </table>
-<div class="buttons" id="[buttons]">
-  <input type="button" id="[ok]"     value="_(OK)"     />
-  <input type="button" id="[cancel]" value="_(Cancel)" />
-</div>
-
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/TableOperations/popups/merge_cells.html b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/TableOperations/popups/merge_cells.html
deleted file mode 100755
index 90c5145..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/TableOperations/popups/merge_cells.html
+++ /dev/null
@@ -1,68 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
-<html>
-
-<head>
-  <title>Merge Cells</title>
-
-<link rel="stylesheet" type="text/css" href="../../../popups/popup.css" />
-<style type="text/css">
-  html,body {width: 400px; height: 150px;}
-</style>
-<script type="text/javascript" src="../../../popups/popup.js"></script>
-
-<script type="text/javascript">
-function Init() {
-  window.resizeTo(400,170);
-	__dlg_init();
- 	document.getElementById("f_cols").focus();
-}
-
-function onOK() {
-  var param = new Object();
-  param["f_cols"] = document.getElementById("f_cols").value;
-  param["f_rows"] = document.getElementById("f_rows").value;
-  __dlg_close(param);
-  return false;
-}
-
-function onCancel() {
-  __dlg_close(null);
-  return false;
-}
-</script>
-
-</head>
-
-<body onload="Init()">
-<form action="" method="get">
-<table width="100%">
-<tr>
-  <td colspan="2">
-	<div class="title">Merge Cells</div>
-  </td>
-</tr>
-<tr>
-  <td colspan="2">
-	Merge current cell with:
-  </td>
-</tr>
-<tr>
-  <td style="text-align: right;" width="30%"><input type="text" name="cols" value="0" id="f_cols" size="4" title="Columns" /></td>
-  <td width="70%">Cells to the right, and</td>
-</tr>
-<tr>
-  <td style="text-align: right;"><input type="text" name="rows" value="0" id="f_rows" size="4" title="Rows" /></td>
-  <td>Cells down</td>
-</tr>
-<tr>
-  <td colspan="2" style="text-align: right;">
-    <hr />
-    <button type="button" name="ok" onclick="return onOK();">OK</button>
-    <button type="button" name="cancel" onclick="return onCancel();">Cancel</button>
-  </td>
-</tr>
-</table>
-</form>
-
-</body>
-</html>
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/UnsavedChanges/UnsavedChanges.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/UnsavedChanges/UnsavedChanges.js
deleted file mode 100644
index 1d21426..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/UnsavedChanges/UnsavedChanges.js
+++ /dev/null
@@ -1,55 +0,0 @@
-function UnsavedChanges(editor) {
-    // Keep a copy of the editor to perform any necessary functions
-    var editor = editor;
-
-    // Private variable for storing the unmodified contents.  This is necessary
-    // because whenDocReady needs a closure to reference this object.
-    var defaultValue;
-
-    // Variable to allow the protector to be bypassed in the case of submit.
-    var bypass = false;
-
-    var protector = function(event) {
-        if (bypass) {
-            return;
-        }
-
-        if (defaultValue != (editor.getEditorContent ? editor.getEditorContent() : editor.outwardHtml(editor.getHTML()))) {
-            // This needs to use _lc for multiple languages
-            var dirty_prompt = Xinha._lc('You have unsaved changes in the editor', 'UnsavedChanges');
-            event.returnValue = dirty_prompt;
-            return dirty_prompt;
-        }
-    }
-
-    this.onBeforeSubmit = function() {
-        bypass = true;
-    }
-
-    // Setup to be called when the plugin is loaded.
-    // We need a copy of the initial content for detection to work properly, so
-    // we will setup a callback for when the document is ready to store an
-    // unmodified copy of the content.
-    this.onGenerate = function() {
-        editor.whenDocReady(function () {
-            // Copy the original, unmodified contents to check for changes
-            defaultValue = defaultValue || (editor.getEditorContent ? editor.getEditorContent() : editor.outwardHtml(editor.getHTML()));
-
-            // Set up the blocker
-            Xinha._addEvent(window, 'beforeunload', protector);
-        });
-    }
-
-}
-
-// An object containing metadata for this plugin
-UnsavedChanges._pluginInfo = {
-    name:'UnsavedChanges',
-    version:'3.7',
-    developer:'Douglas Mayle',
-    developer_url:'http://douglas.mayle.org',
-    c_owner:'Douglas Mayle',
-    sponsor:'The Open Planning Project',
-    sponsor_url:'http://topp.openplans.org',
-    license:'LGPL'
-}
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/UnsavedChanges/lang/es.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/UnsavedChanges/lang/es.js
deleted file mode 100644
index 2ef9f9f..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/UnsavedChanges/lang/es.js
+++ /dev/null
@@ -1,13 +0,0 @@
-// I18N constants
-// LANG: "es", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "You have unsaved changes in the editor": "Usted no ha guardado sus modificaciones"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/UnsavedChanges/lang/fr.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/UnsavedChanges/lang/fr.js
deleted file mode 100644
index a0baab6..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/UnsavedChanges/lang/fr.js
+++ /dev/null
@@ -1,13 +0,0 @@
-// I18N constants
-// LANG: "fr", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "You have unsaved changes in the editor": "Vous n'avez pas enregistré vos modifications"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/UnsavedChanges/lang/fr_ca.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/UnsavedChanges/lang/fr_ca.js
deleted file mode 100644
index 2d28409..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/UnsavedChanges/lang/fr_ca.js
+++ /dev/null
@@ -1,13 +0,0 @@
-// I18N constants
-// LANG: "fr_ca", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "You have unsaved changes in the editor": "Tu n'as pas enregistré tes modifications"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/UnsavedChanges/lang/lc_base.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/UnsavedChanges/lang/lc_base.js
deleted file mode 100644
index 202be56..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/UnsavedChanges/lang/lc_base.js
+++ /dev/null
@@ -1,25 +0,0 @@
-// I18N constants
-//
-// LANG: "en", ENCODING: UTF-8
-// Author: Translator-Name, <email@example.com>
-//
-// Last revision: 2018-04-12
-// 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).
-//
-// (Please, remove information below)
-// 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.)
-
-{
-    "You have unsaved changes in the editor": ""
-}
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/WebKitResize/WebKitResize.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/WebKitResize/WebKitResize.js
deleted file mode 100644
index 225ab9c..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/WebKitResize/WebKitResize.js
+++ /dev/null
@@ -1,127 +0,0 @@
-/**
-  = WebKit Image Resizer =
-  
-  The WebKit based (or similar) browsers, including Chrome (and Edge)
-  don't support drag-to-size images or tables, which is a pain.
-  
-  This plugin implements the EditorBoost jQuery resizing plugin
-    http://www.editorboost.net/Webkitresize/Index
-  jQuery is required, naturally, if it's not already loaded 
-  then we will load our own version, so ensure you load your version
-  first if you need a newer one (then this might break, but oh well).
-  
-    
-  == Usage ==._
-  Instruct Xinha to load the WebKitImageResuze plugin (follow the NewbieGuide),
-  
-  You can also specify to enable the TD and TABLE resizing for Gecko 
-  (Firefox, and IE11 predominatly) as these also don't have support for
-  sizing those (but can size images)., this is enabled by default, you
-  can disable with...
-  
-  xinha_config.WebKitResize.enableTDForGeckoAlso = false;
-  xinha_config.WebKitResize.enableTABLEForGeckoAlso = false;
-  
-  == Caution ==
-  This only works acceptably in either:
-    Standards Mode  (eg Doctype <!DOCTYPE html> )
-    Quirks Mode     (eg no doctype              )
-    
-  it does not work great in "Almost Standards Mode" because scrolling throws
-  the resize border out of place, ,that's ok if you don't need to scroll, 
-  either because your text is small, or you are in FullScreen mode or 
-  something, but anyway.
-  
- 
- * @author $Author$
- * @version $Id$
- * @package WebKitResize
- */
-
-
-WebKitResize._pluginInfo = {
-  name          : "WebKit Image Resize",
-  version       : "1.0",
-  developer     : "EditorBoost, James Sleeman (Xinha)",
-  developer_url : "http://www.editorboost.net/Webkitresize/Index",
-  license       : "GPLv3"
-};
-
-Xinha.Config.prototype.WebKitResize = {
-  enableTDForGeckoAlso:     true,
-  enableTABLEForGeckoAlso:  true
-};
-
-function WebKitResize(editor)
-{
-    this.editor = editor;
-    
-    if(Xinha.is_webkit || this.editor.config.WebKitResize.enableTDForGeckoAlso || this.editor.config.WebKitResize.enableTABLEForGeckoAlso)
-    {
-        Xinha.loadLibrary('jQuery')
-        .loadScript('jquery.mb.browser.min.js', 'WebKitResize')
-        .loadScript('jquery.webkitresize.js',   'WebKitResize');
-    }
-}
-
-
-WebKitResize.prototype.onGenerateOnce = function()
-{
-  // jQuery not loaded yet?
-  if(!(typeof jQuery != 'undefined' && jQuery.fn && jQuery.fn.webkitimageresize))
-  {
-    var self = this;
-    window.setTimeout(function(){self.onGenerateOnce()}, 500);
-    return;
-  }
-  
-  try
-  {
-    if(Xinha.is_webkit)
-    {
-      jQuery(this.editor._iframe).webkitimageresize();
-    }
-    
-    if(Xinha.is_webkit || Xinha.is_gecko && this.editor.config.WebKitResize.enableTABLEForGeckoAlso) 
-    {
-      jQuery(this.editor._iframe).webkittableresize();
-    }
-    
-    if(Xinha.is_webkit || Xinha.is_gecko && this.editor.config.WebKitResize.enableTDForGeckoAlso) 
-    {
-      jQuery(this.editor._iframe).webkittdresize();
-    }
-  }
-  catch(e) { }
-}
-
-// When changing modes, make sure that we stop displaying the handles
-// if they were displaying, otherwise they create duplicates (because
-// the images are recreated).
-WebKitResize.prototype.onBeforeMode = function(mode)
-{
-  if(mode == 'textmode')
-  {
-    if(typeof this.editor._iframe._WebKitImageResizeEnd == 'function')
-      this.editor._iframe._WebKitImageResizeEnd();
-    
-    if(typeof this.editor._iframe._WebKitTableResizeEnd == 'function')
-      this.editor._iframe._WebKitTableResizeEnd();
-    
-    if(typeof this.editor._iframe._WebKitTdResizeEnd == 'function')
-      this.editor._iframe._WebKitTdResizeEnd();
-  }
-}
-
-WebKitResize.prototype.onMode = function(mode)
-{
-  if(mode == 'textmode')
-  {
-    
-  }
-  else
-  {
-    if(typeof this.editor._iframe._WebKitImageResizeStart == 'function')
-      this.editor._iframe._WebKitImageResizeStart();
-  }
-}
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/WebKitResize/jquery.mb.browser.min.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/WebKitResize/jquery.mb.browser.min.js
deleted file mode 100644
index aad868c..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/WebKitResize/jquery.mb.browser.min.js
+++ /dev/null
@@ -1,23 +0,0 @@
-/*
- * ******************************************************************************
- *  jquery.mb.components
- *  file: jquery.mb.browser.min.js
- *
- *  Copyright (c) 2001-2013. Matteo Bicocchi (Pupunzi);
- *  Open lab srl, Firenze - Italy
- *  email: matteo@open-lab.com
- *  site: 	http://pupunzi.com
- *  blog:	http://pupunzi.open-lab.com
- * 	http://open-lab.com
- *
- *  Licences: MIT, GPL
- *  http://www.opensource.org/licenses/mit-license.php
- *  http://www.gnu.org/licenses/gpl.html
- *
- *  last modified: 17/01/13 0.12
- *  *****************************************************************************
- */
-(function(){if(!jQuery.browser){jQuery.browser={};jQuery.browser.mozilla=!1;jQuery.browser.webkit=!1;jQuery.browser.opera=!1;jQuery.browser.msie=!1;var a=navigator.userAgent;jQuery.browser.name=navigator.appName;jQuery.browser.fullVersion=""+parseFloat(navigator.appVersion);jQuery.browser.majorVersion=parseInt(navigator.appVersion,10);var c,b;if(-1!=(b=a.indexOf("Opera"))){if(jQuery.browser.opera=!0,jQuery.browser.name="Opera",jQuery.browser.fullVersion=a.substring(b+6),-1!=(b=a.indexOf("Version")))jQuery.browser.fullVersion=
-a.substring(b+8)}else if(-1!=(b=a.indexOf("MSIE")))jQuery.browser.msie=!0,jQuery.browser.name="Microsoft Internet Explorer",jQuery.browser.fullVersion=a.substring(b+5);else if(-1!=(b=a.indexOf("Chrome")))jQuery.browser.webkit=!0,jQuery.browser.name="Chrome",jQuery.browser.fullVersion=a.substring(b+7);else if(-1!=(b=a.indexOf("Safari"))){if(jQuery.browser.webkit=!0,jQuery.browser.name="Safari",jQuery.browser.fullVersion=a.substring(b+7),-1!=(b=a.indexOf("Version")))jQuery.browser.fullVersion=a.substring(b+
-8)}else if(-1!=(b=a.indexOf("Firefox")))jQuery.browser.mozilla=!0,jQuery.browser.name="Firefox",jQuery.browser.fullVersion=a.substring(b+8);else if((c=a.lastIndexOf(" ")+1)<(b=a.lastIndexOf("/")))jQuery.browser.name=a.substring(c,b),jQuery.browser.fullVersion=a.substring(b+1),jQuery.browser.name.toLowerCase()==jQuery.browser.name.toUpperCase()&&(jQuery.browser.name=navigator.appName);if(-1!=(a=jQuery.browser.fullVersion.indexOf(";")))jQuery.browser.fullVersion=jQuery.browser.fullVersion.substring(0,
-a);if(-1!=(a=jQuery.browser.fullVersion.indexOf(" ")))jQuery.browser.fullVersion=jQuery.browser.fullVersion.substring(0,a);jQuery.browser.majorVersion=parseInt(""+jQuery.browser.fullVersion,10);isNaN(jQuery.browser.majorVersion)&&(jQuery.browser.fullVersion=""+parseFloat(navigator.appVersion),jQuery.browser.majorVersion=parseInt(navigator.appVersion,10));jQuery.browser.version=jQuery.browser.majorVersion}})(jQuery);
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/WebKitResize/jquery.webkitresize.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/WebKitResize/jquery.webkitresize.js
deleted file mode 100644
index a2b0081..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/WebKitResize/jquery.webkitresize.js
+++ /dev/null
@@ -1,1063 +0,0 @@
-/* 

-* Webkitresize (http://editorboost.net/webkitresize)

-* Copyright 2012 Editorboost. All rights reserved. 

-*

-* Webkitresize commercial licenses may be obtained at http://editorboost.net/home/licenses.

-* If you do not own a commercial license, this file shall be governed by the

-* GNU General Public License (GPL) version 3. For GPL requirements, please

-* review: http://www.gnu.org/copyleft/gpl.html

-*

-* Version date: March 19 2013

-* REQUIRES: jquery 1.7.1+

-*/

-

-; (function ($) {

-    $.fn.webkitimageresize = function (options) {

-        return this.each(function () {

-

-            if (!$.browser.webkit) {

-                return;

-            }

-

-

-            var settings = $.extend({

-            }, options);

-

-            var lastCrc;

-            var imageResizeinProgress = false;

-            var currentImage;

-            var currentImage_HxW_Rate;

-            var currentImage_WxH_Rate;

-            var initialHeight;

-            var initialWidth;

-

-            var methods = {

-                

-                guidGenerator: function() {

-                    var S4 = function() {

-                       return (((1+Math.random())*0x10000)|0).toString(16).substring(1);

-                    };

-                    return (S4()+S4()+"-"+S4()+"-"+S4()+"-"+S4()+"-"+S4()+S4()+S4());

-                },

-

-                guidFilter: function(context){

-                    return "[data-guid='" + context.guid + "']";

-                },

-

-                removeResizeElements: function (context) {

-                    $(".img-resize-selector").filter(methods.guidFilter(context)).remove();

-                    $(".img-resize-region").filter(methods.guidFilter(context)).remove();

-                },

-

-                imageClick: function (context, img) {

-                    if (settings.beforeElementSelect) {

-                        settings.beforeElementSelect(img);

-                    }

-

-                    methods.removeResizeElements(context);

-                    currentImage = img;

-

-                    var imgHeight = $(img).outerHeight();

-                    var imgWidth = $(img).outerWidth();

-                    var iframePos = context.$ifrm.offset();

-                    var imgPosition = $(img).offset();       

-                    var ifrmScrollTop = Math.max(context.ifrm.contentWindow.document.documentElement.scrollTop, context.$ifrmBody.scrollTop());

-                    var ifrmScrollLeft = Math.max(context.ifrm.contentWindow.document.documentElement.scrollLeft, context.$ifrmBody.scrollLeft());

-

-                    context.$docBody.append("<span data-guid='" + context.guid + "' class='img-resize-selector' style='margin:10px;position:absolute;top:" + (iframePos.top + imgPosition.top - ifrmScrollTop + imgHeight - 10) + "px;left:" + (iframePos.left + imgPosition.left - ifrmScrollLeft + imgWidth - 10) + "px;border:solid 2px red;width:6px;height:6px;cursor:se-resize;z-index:1000;'></span>");

-

-                    context.$docBody.append("<span data-guid='" + context.guid + "' class='img-resize-region region-top-right' style='position:absolute;z-index:1000;top:" + (iframePos.top + imgPosition.top - ifrmScrollTop) + "px;left:" + (iframePos.left + imgPosition.left - ifrmScrollLeft) + "px;border:dashed 1px grey;width:" + imgWidth + "px;height:0px;'></span>");

-                    context.$docBody.append("<span data-guid='" + context.guid + "' class='img-resize-region region-top-down' style='position:absolute;z-index:1000;top:" + (iframePos.top + imgPosition.top - ifrmScrollTop) + "px;left:" + (iframePos.left + imgPosition.left - ifrmScrollLeft) + "px;border:dashed 1px grey;width:0px;height:" + imgHeight + "px;'></span>");

-

-                    context.$docBody.append("<span data-guid='" + context.guid + "' class='img-resize-region region-right-down' style='position:absolute;z-index:1000;top:" + (iframePos.top + imgPosition.top - ifrmScrollTop) + "px;left:" + (iframePos.left + imgPosition.left - ifrmScrollLeft + imgWidth) + "px;border:dashed 1px grey;width:0px;height:" + imgHeight + "px;'></span>");

-                    context.$docBody.append("<span data-guid='" + context.guid + "' class='img-resize-region region-down-left' style='position:absolute;z-index:1000;top:" + (iframePos.top + imgPosition.top - ifrmScrollTop + imgHeight) + "px;left:" + (iframePos.left + imgPosition.left - ifrmScrollLeft) + "px;border:dashed 1px grey;width:" + imgWidth + "px;height:0px;'></span>");

-

-

-                    var dragStop = function () {                        

-                        if (imageResizeinProgress) {

-                            $(currentImage)

-                                .css("width", $(".region-top-right").filter(methods.guidFilter(context)).width() + "px")

-                                .css('height', $(".region-top-down").filter(methods.guidFilter(context)).height() + "px");

-                            methods.refresh(context);

-                            $(currentImage).click();

-

-                            context.$ifrm.trigger('webkitresize-updatecrc', [methods.crc(context.$ifrmBody.html())]);

-

-                            imageResizeinProgress = false;

-

-                            if (settings.afterResize) {

-                                settings.afterResize(currentImage);

-                            }

-                        }

-                    };

-

-                    var iframeMouseMove = function (e) {

-                        if (imageResizeinProgress) {

-

-                            var resWidth = imgWidth;

-                            var resHeight = imgHeight;

-

-                            resHeight = e.pageY - imgPosition.top;

-                            resWidth = e.pageX - imgPosition.left;

-

-                            if (resHeight < 1) {

-                                resHeight = 1;

-                            }

-                            if (resWidth < 1) {

-                                resWidth = 1;

-                            }

-                            

-                            if(settings.keepAspectRatio || e.ctrlKey){

-                                var heightDiff = initialHeight - resHeight;

-                                if(heightDiff < 0){

-                                    heightDiff = heightDiff * -1.0;

-                                }

-                                var widthDiff = initialWidth - resWidth;

-                                if(widthDiff < 0){

-                                    widthDiff = widthDiff * -1.0;

-                                }

-

-                                if(heightDiff > widthDiff){

-                                    resWidth = resHeight * currentImage_WxH_Rate;

-                                }

-                                else{

-                                    resHeight = resWidth * currentImage_HxW_Rate;

-                                }      

-                            }                           

-

-                            $(".img-resize-selector").filter(methods.guidFilter(context)).css("top", (iframePos.top + imgPosition.top - ifrmScrollTop + resHeight - 10) + 'px').css("left", (iframePos.left + imgPosition.left - ifrmScrollLeft + resWidth - 10) + "px");

-                            $(".region-top-right").filter(methods.guidFilter(context)).css("width", resWidth + "px");

-                            $(".region-top-down").filter(methods.guidFilter(context)).css("height", resHeight + "px");

-

-                            $(".region-right-down").filter(methods.guidFilter(context)).css("left", (iframePos.left + imgPosition.left - ifrmScrollLeft + resWidth) + "px").css("height", resHeight + "px");

-                            $(".region-down-left").filter(methods.guidFilter(context)).css("top", (iframePos.top + imgPosition.top - ifrmScrollTop + resHeight) + "px").css("width", resWidth + "px");

-                        }

-

-                        return false;

-                    };

-

-

-                    var windowMouseMove = function (e) {

-                        if (imageResizeinProgress) {

-

-                            var resWidth = imgWidth;

-                            var resHeight = imgHeight;

-

-                            resHeight = e.pageY - (iframePos.top + imgPosition.top - ifrmScrollTop);

-                            resWidth = e.pageX - (iframePos.left + imgPosition.left - ifrmScrollLeft);

-

-                            if (resHeight < 1) {

-                                resHeight = 1;

-                            }

-                            if (resWidth < 1) {

-                                resWidth = 1;

-                            }

-                            

-                            if(settings.keepAspectRatio || e.ctrlKey){

-                                var heightDiff = initialHeight - resHeight;

-                                if(heightDiff < 0){

-                                    heightDiff = heightDiff * -1.0;

-                                }

-                                var widthDiff = initialWidth - resWidth;

-                                if(widthDiff < 0){

-                                    widthDiff = widthDiff * -1.0;

-                                }

-

-                                if(heightDiff > widthDiff){

-                                    resWidth = resHeight * currentImage_WxH_Rate;

-                                }

-                                else{

-                                    resHeight = resWidth * currentImage_HxW_Rate;

-                                }       

-                            }                        

-

-                            $(".img-resize-selector").filter(methods.guidFilter(context)).css("top", (iframePos.top + imgPosition.top - ifrmScrollTop + resHeight - 10) + 'px').css("left", (iframePos.left + imgPosition.left - ifrmScrollLeft + resWidth - 10) + "px");

-                            $(".region-top-right").filter(methods.guidFilter(context)).css("width", resWidth + "px");

-                            $(".region-top-down").filter(methods.guidFilter(context)).css("height", resHeight + "px");

-

-                            $(".region-right-down").filter(methods.guidFilter(context)).css("left", (iframePos.left + imgPosition.left - ifrmScrollLeft + resWidth) + "px").css("height", resHeight + "px");

-                            $(".region-down-left").filter(methods.guidFilter(context)).css("top", (iframePos.top + imgPosition.top - ifrmScrollTop + resHeight) + "px").css("width", resWidth + "px");

-                        }

-

-                        return false;

-                    };

-

-                    $(".img-resize-selector").filter(methods.guidFilter(context)).mousedown(function (e) {

-                        if (settings.beforeResizeStart) {

-                            settings.beforeResizeStart(currentImage);

-                        }

-                        

-                        var imgH = $(currentImage).height();

-                        var imgW = $(currentImage).width();

-

-                        currentImage_HxW_Rate = imgH / imgW;

-                        currentImage_WxH_Rate = imgW / imgH;

-                        if(imgH > imgW){

-                            initialHeight = 0;

-                            initialWidth = (imgH - imgW) * -1;

-                        }

-                        else{

-                            initialWidth = 0;

-                            initialHeight = (imgW - imgH) * -1;

-                        }

-

-                        imageResizeinProgress = true;

-

-                        return false;

-                    });

-

-                    $(context.ifrm.contentWindow.document).mouseup(function () {

-                        if (imageResizeinProgress) {

-                            dragStop();

-                        }

-                    });

-

-                    $(window.document).mouseup(function () {

-                        if (imageResizeinProgress) {

-                            dragStop();

-                        }

-                    });

-

-                    $(context.ifrm.contentWindow.document).mousemove(function (e) {

-                        iframeMouseMove(e);

-                    });

-

-                    $(window.document).mousemove(function (e) {

-                        windowMouseMove(e);

-                    });

-

-                    if (settings.afterElementSelect) {

-                        settings.afterElementSelect(currentImage);

-                    }

-                },

-

-                rebind: function (context) {

-                    context.$ifrm.contents().find("img").each(function (i, v) {

-                        $(v).unbind('click');

-                        $(v).click(function (e) {

-                            if (e.target == v) {

-                                methods.imageClick(context, v);

-                            }

-                        });

-                    });

-                },

-                

-                debind: function (context) {

-                    context.$ifrm.contents().find("img").each(function (i, v) {

-                        $(v).unbind('click');                        

-                    });

-                },

-

-                refresh: function (context) {                                                   

-                    methods.rebind(context);

-                    

-                    methods.removeResizeElements(context);

-                    

-                    if (!currentImage) {

-                        if (settings.afterRefresh) {

-                            settings.afterRefresh(null);

-                        }

-                        return;

-                    }

-                    

-                    var img = currentImage;

-

-                    var imgHeight = $(img).outerHeight();

-                    var imgWidth = $(img).outerWidth();

-                    var iframePos = context.$ifrm.offset();

-                    var imgPosition = $(img).offset();

-                    var ifrmScrollTop = context.$ifrmBody.scrollTop();

-                    var ifrmScrollLeft = context.$ifrmBody.scrollLeft();

-

-                    context.$docBody.append("<span data-guid='" + context.guid + "' class='img-resize-selector' style='position:absolute;top:" + (iframePos.top + imgPosition.top - ifrmScrollTop + imgHeight) + "px;left:" + (iframePos.left + imgPosition.left - ifrmScrollLeft + imgWidth) + "px;border:solid 2px red;width:6px;height:6px;cursor:se-resize;z-index:1000;'></span>");

-

-                    context.$docBody.append("<span data-guid='" + context.guid + "' class='img-resize-region' style='position:absolute;z-index:1000;top:" + (iframePos.top + imgPosition.top - ifrmScrollTop) + "px;left:" + (iframePos.left + imgPosition.left - ifrmScrollLeft) + "px;border:dashed 1px grey;width:" + imgWidth + "px;height:0px;'></span>");

-                    context.$docBody.append("<span data-guid='" + context.guid + "' class='img-resize-region' style='position:absolute;z-index:1000;top:" + (iframePos.top + imgPosition.top - ifrmScrollTop) + "px;left:" + (iframePos.left + imgPosition.left - ifrmScrollLeft) + "px;border:dashed 1px grey;width:0px;height:" + imgHeight + "px;'></span>");

-

-                    context.$docBody.append("<span data-guid='" + context.guid + "' class='img-resize-region' style='position:absolute;z-index:1000;top:" + (iframePos.top + imgPosition.top - ifrmScrollTop) + "px;left:" + (iframePos.left + imgPosition.left - ifrmScrollLeft + imgWidth) + "px;border:dashed 1px grey;width:0px;height:" + imgHeight + "px;'></span>");

-                    context.$docBody.append("<span data-guid='" + context.guid + "' class='img-resize-region' style='position:absolute;z-index:1000;top:" + (iframePos.top + imgPosition.top - ifrmScrollTop + imgHeight) + "px;left:" + (iframePos.left + imgPosition.left - ifrmScrollLeft) + "px;border:dashed 1px grey;width:" + imgWidth + "px;height:0px;'></span>");

-

-                    lastCrc = methods.crc(context.$ifrmBody.html());

-

-                    if (settings.afterRefresh) {

-                        settings.afterRefresh(currentImage);

-                    }

-                },

-

-                reset: function (context) {

-                    if (currentImage != null) {

-                        currentImage = null;

-                        imageResizeinProgress = false;

-                        methods.removeResizeElements(context);

-

-                        if (settings.afterReset) {

-                            settings.afterReset();

-                        }

-                    }

-                    methods.rebind(context);

-                },

-

-                crc: function (str) {

-                    var hash = 0;

-                    if (str.length == 0) return hash;

-                    for (i = 0; i < str.length; i++) {

-                        char = str.charCodeAt(i);

-                        hash = ((hash << 5) - hash) + char;

-                        hash = hash & hash;

-                    }

-                    return hash;

-                }

-            };

-

-            var ifrm = this;

-            var $ifrm = $(this);

-            var $docBody = $("body");

-            var $ifrmBody = $ifrm.contents().find("body");

-

-            lastCrc = methods.crc($ifrmBody.html());

-

-            if (!$ifrm.is('iframe')) {

-                return;

-            }

-

-            var context = {

-                ifrm: ifrm,

-                $ifrm: $ifrm,

-                $docBody: $docBody,

-                $ifrmBody: $ifrmBody,

-                guid: methods.guidGenerator()

-            };

-

-            ifrm.contentWindow.addEventListener('scroll', function () {

-                methods.reset(context);

-            }, false);

-

-            $(ifrm.contentWindow.document).mouseup(function (e) {

-                if (!imageResizeinProgress) {

-                    var x = (e.x) ? e.x : e.clientX;

-                    var y = (e.y) ? e.y : e.clientY;

-                    var mouseUpElement = ifrm.contentWindow.document.elementFromPoint(x, y);

-                    if (mouseUpElement) {

-                        var matchingElement;

-                        var $select = context.$ifrm.contents().find(settings.selector);

-                        var $parentsSelect = $(mouseUpElement).parents();

-                        for (var psi = 0; psi < $parentsSelect.length; psi++) {

-                            for (var i = 0; i < $select.length; i++) {

-                                if ($select[i] == $parentsSelect[psi]) {

-                                    matchingElement = $select[i];

-                                    break;

-                                }

-                            }

-                            if (matchingElement) {

-                                break;

-                            }

-                        }

-                        if (!matchingElement) {

-                            methods.reset(context);

-                        }

-                        else {

-                            methods.imageClick(context, matchingElement);

-                        }

-                    }

-                }

-            });            

-

-            $(document).keyup(function (e) {

-                if (e.keyCode == 27) {

-                    methods.reset(context);

-                }

-            });

-

-            $(ifrm.contentWindow.document).keyup(function (e) {

-                if (e.keyCode == 27) {

-                    methods.reset(context);

-                }

-            });

-

-

-            if (!ifrm.crcChecker) {

-                ifrm.crcChecker = setInterval(function () {

-                    var currentCrc = methods.crc($ifrmBody.html());

-                    if (lastCrc != currentCrc) {

-                        $ifrm.trigger('webkitresize-crcchanged', [currentCrc]);

-                    }

-                }, 1000);

-            }

-

-            $(window).resize(function(){

-                methods.reset(context);

-            });

-

-            $ifrm.bind('webkitresize-crcchanged', function (event, crc) {

-                lastCrc = crc;

-                methods.reset(context);

-            });

-

-            $ifrm.bind('webkitresize-updatecrc', function (event, crc) {                

-                lastCrc = crc;

-            });

-            

-            methods.refresh(context);

-

-            ifrm._WebKitImageResizeEnd   = function(){ methods.reset(context); methods.removeResizeElements(context); methods.debind(context); }

-            ifrm._WebKitImageResizeStart = function(){ methods.reset(context); context.$ifrmBody = $ifrm.contents().find("body"); }

-        });

-    };

-

-

-    $.fn.webkittableresize = function (options) {

-        return this.each(function () {

-

-            if (!$.browser.webkit) {

-            //    return;

-            }

-

-

-            var settings = $.extend({

-            }, options);

-

-            var lastCrc;

-            var tableResizeinProgress = false;

-            var currenttable;

-

-            var methods = {

-

-                guidGenerator: function() {

-                    var S4 = function() {

-                       return (((1+Math.random())*0x10000)|0).toString(16).substring(1);

-                    };

-                    return (S4()+S4()+"-"+S4()+"-"+S4()+"-"+S4()+"-"+S4()+S4()+S4());

-                },

-

-                guidFilter: function(context){

-                    return "[data-guid='" + context.guid + "']";

-                },

-

-                removeResizeElements: function (context) {

-                    $(".resize-selector").filter(methods.guidFilter(context)).remove();

-                    $(".resize-region").filter(methods.guidFilter(context)).remove();

-                },

-

-                tableClick: function (context, tbl) {

-                    if (settings.beforeElementSelect) {

-                        settings.beforeElementSelect(tbl);

-                    }

-

-                    methods.removeResizeElements(context);

-                    currenttable = tbl;

-

-                    var tblHeight = $(tbl).outerHeight();

-                    var tblWidth = $(tbl).outerWidth();

-                    var iframePos = context.$ifrm.offset();

-                    var tblPosition = $(tbl).offset();

-                    var ifrmScrollTop = Math.max(context.ifrm.contentWindow.document.documentElement.scrollTop, context.$ifrmBody.scrollTop());

-                    var ifrmScrollLeft = Math.max(context.ifrm.contentWindow.document.documentElement.scrollLeft, context.$ifrmBody.scrollLeft());

-

-                    context.$docBody.append("<span data-guid='" + context.guid + "' class='resize-selector' style='margin:10px;position:absolute;top:" + (iframePos.top + tblPosition.top - ifrmScrollTop + tblHeight - 10) + "px;left:" + (iframePos.left + tblPosition.left - ifrmScrollLeft + tblWidth - 10) + "px;border:solid 2px red;width:6px;height:6px;cursor:se-resize;z-index:1000;'></span>");

-

-                    context.$docBody.append("<span data-guid='" + context.guid + "' class='resize-region region-top-right' style='position:absolute;z-index:1000;top:" + (iframePos.top + tblPosition.top - ifrmScrollTop) + "px;left:" + (iframePos.left + tblPosition.left - ifrmScrollLeft) + "px;border:dashed 1px grey;width:" + tblWidth + "px;height:0px;'></span>");

-                    context.$docBody.append("<span data-guid='" + context.guid + "' class='resize-region region-top-down' style='position:absolute;z-index:1000;top:" + (iframePos.top + tblPosition.top - ifrmScrollTop) + "px;left:" + (iframePos.left + tblPosition.left - ifrmScrollLeft) + "px;border:dashed 1px grey;width:0px;height:" + tblHeight + "px;'></span>");

-

-                    context.$docBody.append("<span data-guid='" + context.guid + "' class='resize-region region-right-down' style='position:absolute;z-index:1000;top:" + (iframePos.top + tblPosition.top - ifrmScrollTop) + "px;left:" + (iframePos.left + tblPosition.left - ifrmScrollLeft + tblWidth) + "px;border:dashed 1px grey;width:0px;height:" + tblHeight + "px;'></span>");

-                    context.$docBody.append("<span data-guid='" + context.guid + "' class='resize-region region-down-left' style='position:absolute;z-index:1000;top:" + (iframePos.top + tblPosition.top - ifrmScrollTop + tblHeight) + "px;left:" + (iframePos.left + tblPosition.left - ifrmScrollLeft) + "px;border:dashed 1px grey;width:" + tblWidth + "px;height:0px;'></span>");

-

-

-                    var dragStop = function () {

-                        if (tableResizeinProgress) {

-                            $(currenttable)

-                                .css("width", $(".region-top-right").filter(methods.guidFilter(context)).width() + "px")

-                                .css('height', $(".region-top-down").filter(methods.guidFilter(context)).height() + "px");

-                            methods.refresh(context);

-                            $(currenttable).click();

-

-                            context.$ifrm.trigger('webkitresize-updatecrc', [methods.crc(context.$ifrmBody.html())]);

-                            context.$ifrm.trigger('webkitresize-table-resized', []);

-

-                            tableResizeinProgress = false;

-

-                            if (settings.afterResize) {

-                                settings.afterResize(currenttable);

-                            }

-                        }

-                    };

-

-                    var iframeMouseMove = function (e) {

-                        if (tableResizeinProgress) {

-

-                            var resWidth = tblWidth;

-                            var resHeight = tblHeight;

-

-                            resHeight = e.pageY - tblPosition.top;

-                            resWidth = e.pageX - tblPosition.left;

-

-                            if (resHeight < 1) {

-                                resHeight = 1;

-                            }

-                            if (resWidth < 1) {

-                                resWidth = 1;

-                            }

-

-                            $(".resize-selector").filter(methods.guidFilter(context)).css("top", (iframePos.top + tblPosition.top - ifrmScrollTop + resHeight - 10) + 'px').css("left", (iframePos.left + tblPosition.left - ifrmScrollLeft + resWidth - 10) + "px");

-                            $(".region-top-right").filter(methods.guidFilter(context)).css("width", resWidth + "px");

-                            $(".region-top-down").filter(methods.guidFilter(context)).css("height", resHeight + "px");

-

-                            $(".region-right-down").filter(methods.guidFilter(context)).css("left", (iframePos.left + tblPosition.left - ifrmScrollLeft + resWidth) + "px").css("height", resHeight + "px");

-                            $(".region-down-left").filter(methods.guidFilter(context)).css("top", (iframePos.top + tblPosition.top - ifrmScrollTop + resHeight) + "px").css("width", resWidth + "px");

-                        }

-

-                        return false;

-                    };

-

-

-                    var windowMouseMove = function (e) {

-                        if (tableResizeinProgress) {

-

-                            var resWidth = tblWidth;

-                            var resHeight = tblHeight;

-

-                            resHeight = e.pageY - (iframePos.top + tblPosition.top - ifrmScrollTop);

-                            resWidth = e.pageX - (iframePos.left + tblPosition.left - ifrmScrollLeft);

-

-                            if (resHeight < 1) {

-                                resHeight = 1;

-                            }

-                            if (resWidth < 1) {

-                                resWidth = 1;

-                            }

-

-                            $(".resize-selector").filter(methods.guidFilter(context)).css("top", (iframePos.top + tblPosition.top - ifrmScrollTop + resHeight - 10) + 'px').css("left", (iframePos.left + tblPosition.left - ifrmScrollLeft + resWidth - 10) + "px");

-                            $(".region-top-right").filter(methods.guidFilter(context)).css("width", resWidth + "px");

-                            $(".region-top-down").filter(methods.guidFilter(context)).css("height", resHeight + "px");

-

-                            $(".region-right-down").filter(methods.guidFilter(context)).css("left", (iframePos.left + tblPosition.left - ifrmScrollLeft + resWidth) + "px").css("height", resHeight + "px");

-                            $(".region-down-left").filter(methods.guidFilter(context)).css("top", (iframePos.top + tblPosition.top - ifrmScrollTop + resHeight) + "px").css("width", resWidth + "px");

-                        }

-

-                        return false;

-                    };

-

-                    $(".resize-selector").filter(methods.guidFilter(context)).mousedown(function (e) {

-                        if (settings.beforeResizeStart) {

-                            settings.beforeResizeStart(currenttable);

-                        }

-                        tableResizeinProgress = true;

-                        return false;

-                    });

-

-                    $("*").mouseup(function () {

-                        if (tableResizeinProgress) {

-                            dragStop();

-                        }

-                    });

-

-                    $(context.ifrm.contentWindow).mousemove(function (e) {

-                        iframeMouseMove(e);

-                    });

-

-                    $(window).mousemove(function (e) {

-                        windowMouseMove(e);

-                    });

-

-                    if (settings.afterElementSelect) {

-                        settings.afterElementSelect(currenttable);

-                    }

-                },

-

-                rebind: function (context) {

-                    context.$ifrm.contents().find("table").each(function (i, v) {

-                        $(v).unbind('click');

-                        $(v).click(function (e) {

-                            if (e.target == v || (($(e.target).is('td')||$(e.target).is('th')) && $(e.target).parents("table")[0] == v)) {

-                                methods.tableClick(context, v);

-                            }

-                        });

-                    });

-                },

-

-                debind: function (context) {

-                    context.$ifrm.contents().find("table").each(function (i, v) {

-                        $(v).unbind('click');                        

-                    });

-                },

-

-                refresh: function (context) {

-                    methods.rebind(context);

-

-                    methods.removeResizeElements(context);

-

-                    if (!currenttable) {

-                        if (settings.afterRefresh) {

-                            settings.afterRefresh(null);

-                        }

-                        return;

-                    }

-

-                    var tbl = currenttable;

-

-                    var tblHeight = $(tbl).outerHeight();

-                    var tblWidth = $(tbl).outerWidth();

-                    var iframePos = context.$ifrm.offset();

-                    var tblPosition = $(tbl).offset();

-                    var ifrmScrollTop = context.$ifrmBody.scrollTop();

-                    var ifrmScrollLeft = context.$ifrmBody.scrollLeft();

-

-                    context.$docBody.append("<span data-guid='" + context.guid + "' class='resize-selector' style='position:absolute;top:" + (iframePos.top + tblPosition.top - ifrmScrollTop + tblHeight) + "px;left:" + (iframePos.left + tblPosition.left - ifrmScrollLeft + tblWidth) + "px;border:solid 2px red;width:6px;height:6px;cursor:se-resize;z-index:1000;'></span>");

-

-                    context.$docBody.append("<span data-guid='" + context.guid + "' class='resize-region' style='position:absolute;z-index:1000;top:" + (iframePos.top + tblPosition.top - ifrmScrollTop) + "px;left:" + (iframePos.left + tblPosition.left - ifrmScrollLeft) + "px;border:dashed 1px grey;width:" + tblWidth + "px;height:0px;'></span>");

-                    context.$docBody.append("<span data-guid='" + context.guid + "' class='resize-region' style='position:absolute;z-index:1000;top:" + (iframePos.top + tblPosition.top - ifrmScrollTop) + "px;left:" + (iframePos.left + tblPosition.left - ifrmScrollLeft) + "px;border:dashed 1px grey;width:0px;height:" + tblHeight + "px;'></span>");

-

-                    context.$docBody.append("<span data-guid='" + context.guid + "' class='resize-region' style='position:absolute;z-index:1000;top:" + (iframePos.top + tblPosition.top - ifrmScrollTop) + "px;left:" + (iframePos.left + tblPosition.left - ifrmScrollLeft + tblWidth) + "px;border:dashed 1px grey;width:0px;height:" + tblHeight + "px;'></span>");

-                    context.$docBody.append("<span data-guid='" + context.guid + "' class='resize-region' style='position:absolute;z-index:1000;top:" + (iframePos.top + tblPosition.top - ifrmScrollTop + tblHeight) + "px;left:" + (iframePos.left + tblPosition.left - ifrmScrollLeft) + "px;border:dashed 1px grey;width:" + tblWidth + "px;height:0px;'></span>");

-

-                    lastCrc = methods.crc(context.$ifrmBody.html());

-

-                    if (settings.afterRefresh) {

-                        settings.afterRefresh(currenttable);

-                    }

-                },

-

-                reset: function (context) {

-                    if (currenttable != null) {

-                        currenttable = null;

-                        tableResizeinProgress = false;

-                        methods.removeResizeElements(context);

-

-                        if (settings.afterReset) {

-                            settings.afterReset();

-                        }

-                    }

-

-                    methods.rebind(context);

-                },

-

-                crc: function (str) {

-                    var hash = 0;

-                    if (str.length == 0) return hash;

-                    for (i = 0; i < str.length; i++) {

-                        char = str.charCodeAt(i);

-                        hash = ((hash << 5) - hash) + char;

-                        hash = hash & hash;

-                    }

-                    return hash;

-                }

-

-            };

-

-            var ifrm = this;

-            var $ifrm = $(this);

-            var $docBody = $("body");

-            var $ifrmBody = $ifrm.contents().find("body");

-

-            lastCrc = methods.crc($ifrmBody.html());

-

-            if (!$ifrm.is('iframe')) {

-                return;

-            }

-

-            var context = {

-                ifrm: ifrm,

-                $ifrm: $ifrm,

-                $docBody: $docBody,

-                $ifrmBody: $ifrmBody,

-                guid: methods.guidGenerator()

-            };

-

-            ifrm.contentWindow.addEventListener('scroll', function () {

-                methods.reset(context);

-            }, false);

-

-            $(ifrm.contentWindow.document).mouseup(function (e) {

-                if (!tableResizeinProgress) {

-                    var x = (e.x) ? e.x : e.clientX;

-                    var y = (e.y) ? e.y : e.clientY;

-                    var mouseUpElement = ifrm.contentWindow.document.elementFromPoint(x, y);

-                    if (mouseUpElement) {

-                        var matchingElement;

-                        var $select = context.$ifrm.contents().find(settings.selector);

-                        var $parentsSelect = $(mouseUpElement).parents();

-                        for (var psi = 0; psi < $parentsSelect.length; psi++) {

-                            for (var i = 0; i < $select.length; i++) {

-                                if ($select[i] == $parentsSelect[psi]) {

-                                    matchingElement = $select[i];

-                                    break;

-                                }

-                            }

-                            if (matchingElement) {

-                                break;

-                            }

-                        }

-                        if (!matchingElement) {

-                            methods.reset(context);

-                        }

-                        else {

-                            methods.tableClick(context, matchingElement);

-                        }

-                    }

-                }

-            });

-

-            $(document).keyup(function (e) {

-                if (e.keyCode == 27) {

-                    methods.reset(context);

-                }

-            });

-

-            if (!ifrm.crcChecker) {

-                ifrm.crcChecker = setInterval(function () {

-                    var currentCrc = methods.crc($ifrmBody.html());

-                    if (lastCrc != currentCrc) {

-                        $ifrm.trigger('webkitresize-crcchanged', [currentCrc]);

-                    }

-                }, 1000);

-            }

-

-            $(window).resize(function(){

-                methods.reset(context);

-            });

-

-            $ifrm.bind('webkitresize-crcchanged', function (event, crc) {

-                lastCrc = crc;

-                methods.reset(context);

-            });

-

-            $ifrm.bind('webkitresize-updatecrc', function (event, crc) {

-                lastCrc = crc;

-            });

-

-            methods.refresh(context);

-

-            ifrm._WebKitTableResizeEnd = function(){ methods.reset(context); methods.removeResizeElements(context); methods.debind(context); }

-            ifrm._WebKitImageResizeStart = function(){ methods.reset(context); context.$ifrmBody = $ifrm.contents().find("body"); }

-        });

-    };

-

-

-    $.fn.webkittdresize = function (options) {

-        return this.each(function () {

-

-            if (!$.browser.webkit) {

-           //     return;

-            }

-

-

-            var settings = $.extend({

-            }, options);

-

-            var lastCrc;

-            var tdResizeinProgress = false;

-            var currenttd;

-

-            var methods = {

-

-                guidGenerator: function() {

-                    var S4 = function() {

-                       return (((1+Math.random())*0x10000)|0).toString(16).substring(1);

-                    };

-                    return (S4()+S4()+"-"+S4()+"-"+S4()+"-"+S4()+"-"+S4()+S4()+S4());

-                },

-

-                guidFilter: function(context){

-                    return "[data-guid='" + context.guid + "']";

-                },

-

-                removeResizeElements: function (context) {

-                    $(".td-resize-selector").filter(methods.guidFilter(context)).remove();

-                    $(".td-resize-region").filter(methods.guidFilter(context)).remove();

-                },

-

-                tdClick: function (context, td) {

-                    if (settings.beforeElementSelect) {

-                        settings.beforeElementSelect(td);

-                    }

-

-                    methods.removeResizeElements(context);

-                    currenttd = td;

-

-                    var tdHeight = $(td).outerHeight();

-                    var tdWidth = $(td).outerWidth();

-                    var iframePos = context.$ifrm.offset();

-                    var tdPosition = $(td).offset();

-                    var ifrmScrollTop = Math.max(context.ifrm.contentWindow.document.documentElement.scrollTop, context.$ifrmBody.scrollTop());

-                    var ifrmScrollLeft = Math.max(context.ifrm.contentWindow.document.documentElement.scrollLeft, context.$ifrmBody.scrollLeft());

-

-                    context.$docBody.append("<span data-guid='" + context.guid + "' class='td-resize-selector' style='margin:10px;position:absolute;top:" + (iframePos.top + tdPosition.top - ifrmScrollTop + tdHeight - 10) + "px;left:" + (iframePos.left + tdPosition.left - ifrmScrollLeft + tdWidth - 10) + "px;border:solid 2px red;width:6px;height:6px;cursor:se-resize;z-index:1000;'></span>");

-

-                    context.$docBody.append("<span data-guid='" + context.guid + "' class='td-resize-region td-region-top-right' style='position:absolute;z-index:1000;top:" + (iframePos.top + tdPosition.top - ifrmScrollTop) + "px;left:" + (iframePos.left + tdPosition.left - ifrmScrollLeft) + "px;border:dashed 1px green;width:" + tdWidth + "px;height:0px;'></span>");

-                    context.$docBody.append("<span data-guid='" + context.guid + "' class='td-resize-region td-region-top-down' style='position:absolute;z-index:1000;top:" + (iframePos.top + tdPosition.top - ifrmScrollTop) + "px;left:" + (iframePos.left + tdPosition.left - ifrmScrollLeft) + "px;border:dashed 1px green;width:0px;height:" + tdHeight + "px;'></span>");

-

-                    context.$docBody.append("<span data-guid='" + context.guid + "' class='td-resize-region td-region-right-down' style='position:absolute;z-index:1000;top:" + (iframePos.top + tdPosition.top - ifrmScrollTop) + "px;left:" + (iframePos.left + tdPosition.left - ifrmScrollLeft + tdWidth) + "px;border:dashed 1px green;width:0px;height:" + tdHeight + "px;'></span>");

-                    context.$docBody.append("<span data-guid='" + context.guid + "' class='td-resize-region td-region-down-left' style='position:absolute;z-index:1000;top:" + (iframePos.top + tdPosition.top - ifrmScrollTop + tdHeight) + "px;left:" + (iframePos.left + tdPosition.left - ifrmScrollLeft) + "px;border:dashed 1px green;width:" + tdWidth + "px;height:0px;'></span>");

-

-

-                    var dragStop = function () {

-                        if (tdResizeinProgress) {

-                            $(currenttd)

-                                .css("width", $(".td-region-top-right").filter(methods.guidFilter(context)).width() + "px")

-                                .css('height', $(".td-region-top-down").filter(methods.guidFilter(context)).height() + "px");

-                            methods.refresh(context);

-                            $(currenttd).click();

-

-                            context.$ifrm.trigger('webkitresize-updatecrc', [methods.crc(context.$ifrmBody.html())]);

-

-                            tdResizeinProgress = false;

-

-                            if (settings.afterResize) {

-                                settings.afterResize(currenttd);

-                            }

-                        }

-                    };

-

-                    var iframeMouseMove = function (e) {

-                        if (tdResizeinProgress) {

-

-                            var resWidth = tdWidth;

-                            var resHeight = tdHeight;

-

-                            resHeight = e.pageY - tdPosition.top;

-                            resWidth = e.pageX - tdPosition.left;

-

-                            if (resHeight < 1) {

-                                resHeight = 1;

-                            }

-                            if (resWidth < 1) {

-                                resWidth = 1;

-                            }

-

-                            $(".td-resize-selector").filter(methods.guidFilter(context)).css("top", (iframePos.top + tdPosition.top - ifrmScrollTop + resHeight - 10) + 'px').css("left", (iframePos.left + tdPosition.left - ifrmScrollLeft + resWidth - 10) + "px");

-                            $(".td-region-top-right").filter(methods.guidFilter(context)).css("width", resWidth + "px");

-                            $(".td-region-top-down").filter(methods.guidFilter(context)).css("height", resHeight + "px");

-

-                            $(".td-region-right-down").filter(methods.guidFilter(context)).css("left", (iframePos.left + tdPosition.left - ifrmScrollLeft + resWidth) + "px").css("height", resHeight + "px");

-                            $(".td-region-down-left").filter(methods.guidFilter(context)).css("top", (iframePos.top + tdPosition.top - ifrmScrollTop + resHeight) + "px").css("width", resWidth + "px");

-                        }

-

-                        return false;

-                    };

-

-

-                    var windowMouseMove = function (e) {

-                        if (tdResizeinProgress) {

-

-                            var resWidth = tdWidth;

-                            var resHeight = tdHeight;

-

-                            resHeight = e.pageY - (iframePos.top + tdPosition.top - ifrmScrollTop);

-                            resWidth = e.pageX - (iframePos.left + tdPosition.left - ifrmScrollLeft);

-

-                            if (resHeight < 1) {

-                                resHeight = 1;

-                            }

-                            if (resWidth < 1) {

-                                resWidth = 1;

-                            }

-

-                            $(".td-resize-selector").filter(methods.guidFilter(context)).css("top", (iframePos.top + tdPosition.top - ifrmScrollTop + resHeight - 10) + 'px').css("left", (iframePos.left + tdPosition.left - ifrmScrollLeft + resWidth - 10) + "px");

-                            $(".td-region-top-right").filter(methods.guidFilter(context)).css("width", resWidth + "px");

-                            $(".td-region-top-down").filter(methods.guidFilter(context)).css("height", resHeight + "px");

-

-                            $(".td-region-right-down").filter(methods.guidFilter(context)).css("left", (iframePos.left + tdPosition.left - ifrmScrollLeft + resWidth) + "px").css("height", resHeight + "px");

-                            $(".td-region-down-left").filter(methods.guidFilter(context)).css("top", (iframePos.top + tdPosition.top - ifrmScrollTop + resHeight) + "px").css("width", resWidth + "px");

-                        }

-

-                        return false;

-                    };

-

-                    $(".td-resize-selector").filter(methods.guidFilter(context)).mousedown(function (e) {

-                        if (settings.beforeResizeStart) {

-                            settings.beforeResizeStart(currenttd);

-                        }

-                        tdResizeinProgress = true;

-                        return false;

-                    });

-

-                    $("*").mouseup(function () {

-                        if (tdResizeinProgress) {

-                            dragStop();

-                        }

-                    });

-

-                    $(context.ifrm.contentWindow).mousemove(function (e) {

-                        iframeMouseMove(e);

-                    });

-

-                    $(window).mousemove(function (e) {

-                        windowMouseMove(e);

-                    });

-

-                    if (settings.afterElementSelect) {

-                        settings.afterElementSelect(currenttd);

-                    }

-                },

-

-                rebind: function (context) {

-                    context.$ifrm.contents().find("td,th").each(function (i, v) {

-                        $(v).unbind('click');

-                        $(v).click(function (e) {

-                            if (e.target == v) {

-                                methods.tdClick(context, v);

-                            }

-                        });

-                    });

-                },

-                

-                debind: function (context) {

-                    context.$ifrm.contents().find("td,th").each(function (i, v) {

-                        $(v).unbind('click');                        

-                    });

-                },

-

-                refresh: function (context) {

-                    methods.rebind(context);

-

-                    methods.removeResizeElements(context);

-

-                    if (!currenttd) {

-                        if (settings.afterRefresh) {

-                            settings.afterRefresh(null);

-                        }

-                        return;

-                    }

-

-                    var td = currenttd;

-

-                    var tdHeight = $(td).outerHeight();

-                    var tdWidth = $(td).outerWidth();

-                    var iframePos = context.$ifrm.offset();

-                    var tdPosition = $(td).offset();

-                    var ifrmScrollTop = context.$ifrmBody.scrollTop();

-                    var ifrmScrollLeft = context.$ifrmBody.scrollLeft();

-

-                    context.$docBody.append("<span data-guid='" + context.guid + "' class='td-resize-selector' style='position:absolute;top:" + (iframePos.top + tdPosition.top - ifrmScrollTop + tdHeight) + "px;left:" + (iframePos.left + tdPosition.left - ifrmScrollLeft + tdWidth) + "px;border:solid 2px red;width:6px;height:6px;cursor:se-resize;z-index:1000;'></span>");

-

-                    context.$docBody.append("<span data-guid='" + context.guid + "' class='td-resize-region' style='position:absolute;z-index:1000;top:" + (iframePos.top + tdPosition.top - ifrmScrollTop) + "px;left:" + (iframePos.left + tdPosition.left - ifrmScrollLeft) + "px;border:dashed 1px green;width:" + tdWidth + "px;height:0px;'></span>");

-                    context.$docBody.append("<span data-guid='" + context.guid + "' class='td-resize-region' style='position:absolute;z-index:1000;top:" + (iframePos.top + tdPosition.top - ifrmScrollTop) + "px;left:" + (iframePos.left + tdPosition.left - ifrmScrollLeft) + "px;border:dashed 1px green;width:0px;height:" + tdHeight + "px;'></span>");

-

-                    context.$docBody.append("<span data-guid='" + context.guid + "' class='td-resize-region' style='position:absolute;z-index:1000;top:" + (iframePos.top + tdPosition.top - ifrmScrollTop) + "px;left:" + (iframePos.left + tdPosition.left - ifrmScrollLeft + tdWidth) + "px;border:dashed 1px green;width:0px;height:" + tdHeight + "px;'></span>");

-                    context.$docBody.append("<span data-guid='" + context.guid + "' class='td-resize-region' style='position:absolute;z-index:1000;top:" + (iframePos.top + tdPosition.top - ifrmScrollTop + tdHeight) + "px;left:" + (iframePos.left + tdPosition.left - ifrmScrollLeft) + "px;border:dashed 1px green;width:" + tdWidth + "px;height:0px;'></span>");

-

-                    lastCrc = methods.crc(context.$ifrmBody.html());

-

-                    if (settings.afterRefresh) {

-                        settings.afterRefresh(currenttd);

-                    }

-                },

-

-                reset: function (context) {

-                    if (currenttd != null) {

-                        currenttd = null;

-                        tdResizeinProgress = false;

-                        methods.removeResizeElements(context);

-

-                        if (settings.afterReset) {

-                            settings.afterReset();

-                        }

-                    }

-

-                    methods.rebind(context);

-                },

-

-                crc: function (str) {

-                    var hash = 0;

-                    if (str.length == 0) return hash;

-                    for (i = 0; i < str.length; i++) {

-                        char = str.charCodeAt(i);

-                        hash = ((hash << 5) - hash) + char;

-                        hash = hash & hash;

-                    }

-                    return hash;

-                }

-

-            };

-

-            var ifrm = this;

-            var $ifrm = $(this);

-            var $docBody = $("body");

-            var $ifrmBody = $ifrm.contents().find("body");

-

-            lastCrc = methods.crc($ifrmBody.html());

-

-            if (!$ifrm.is('iframe')) {

-                return;

-            }

-

-            var context = {

-                ifrm: ifrm,

-                $ifrm: $ifrm,

-                $docBody: $docBody,

-                $ifrmBody: $ifrmBody,

-                guid: methods.guidGenerator()

-            };

-

-            ifrm.contentWindow.addEventListener('scroll', function () {

-                methods.reset(context);

-            }, false);

-

-            $(ifrm.contentWindow.document).mouseup(function (e) {

-                if (!tdResizeinProgress) {

-                    var x = (e.x) ? e.x : e.clientX;

-                    var y = (e.y) ? e.y : e.clientY;

-                    var mouseUpElement = ifrm.contentWindow.document.elementFromPoint(x, y);

-                    if (mouseUpElement) {

-                        var matchingElement;

-                        var $select = context.$ifrm.contents().find(settings.selector);

-                        var $parentsSelect = $(mouseUpElement).parents();

-                        for (var psi = 0; psi < $parentsSelect.length; psi++) {

-                            for (var i = 0; i < $select.length; i++) {

-                                if ($select[i] == $parentsSelect[psi]) {

-                                    matchingElement = $select[i];

-                                    break;

-                                }

-                            }

-                            if (matchingElement) {

-                                break;

-                            }

-                        }

-                        if (!matchingElement) {

-                            methods.reset(context);

-                        }

-                        else {

-                            methods.tdClick(context, matchingElement);

-                        }

-                    }

-                }                

-            });

-

-            $(document).keyup(function (e) {

-                if (e.keyCode == 27) {

-                    methods.reset(context);

-                }

-            });

-

-            if (!ifrm.crcChecker) {

-                ifrm.crcChecker = setInterval(function () {

-                    var currentCrc = methods.crc($ifrmBody.html());

-                    if (lastCrc != currentCrc) {

-                        $ifrm.trigger('webkitresize-crcchanged', [currentCrc]);

-                    }

-                }, 1000);

-            }

-

-            $(window).resize(function(){

-                methods.reset(context);

-            });

-

-            $ifrm.bind('webkitresize-crcchanged', function (event, crc) {

-                lastCrc = crc;

-                methods.reset(context);

-            });

-

-            $ifrm.bind('webkitresize-updatecrc', function (event, crc) {

-                lastCrc = crc;

-            });

-

-            $ifrm.bind('webkitresize-table-resized', function () {

-                methods.reset(context);

-            });

-

-            methods.refresh(context);

-

-            ifrm._WebKitTdResizeEnd = function(){ methods.reset(context); methods.removeResizeElements(context); methods.debind(context);  }

-            ifrm._WebKitImageResizeStart = function(){ methods.reset(context); context.$ifrmBody = $ifrm.contents().find("body"); }

-        });

-    };

-})(jQuery);
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/WysiwygWrap/WysiwygWrap.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/WysiwygWrap/WysiwygWrap.js
deleted file mode 100644
index 839bbab..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/plugins/WysiwygWrap/WysiwygWrap.js
+++ /dev/null
@@ -1,101 +0,0 @@
-/**
- *  WYSIWYG Wrap Plugin
- * 
- *  The purpose of this plugin is to wrap the content being edited in Xinha
- *  with certain elements of given ID and/or class when in the WYSIWYG view.
- *
- *  The reason for this is to assist when styling content.
- *
- */
-
-WysiwygWrap._pluginInfo = {
-  name          : "WYSIWYG Wrap",
-  version       : "1.0",
-  developer     : "James Sleeman",
-  developer_url : "http://www.gogo.co.nz/",
-  c_owner       : "James Sleeman",
-  license       : "htmlArea"
-};
-
-Xinha.Config.prototype.WysiwygWrap =
-{
-  'elements' : [ ]
-  // 'elements' : [ 'div.class#id', 'ul', 'li' ]
-};
-
-
-function WysiwygWrap(editor) {
-  this.editor = editor;    
-}
-
-/** Take HTML and wrap it with the elements. 
- *
- * @param string
- * @return string
- */
- 
-WysiwygWrap.prototype.inwardHtml = function(html)
-{
-  for(var x = this.editor.config.WysiwygWrap.elements.length - 1; x >= 0; x--)
-  {
-    var e = { tagName: this.editor.config.WysiwygWrap.elements[x], className: '', id: '' };    
-    if(e.tagName.match(/#(.+)$/))
-    {
-      e.id        = RegExp.$1;
-      e.tagName   = e.tagName.replace(/#(.+)$/,'');
-    }
-    
-    if(e.tagName.match(/[^.]*\.(.+)$/))
-    {
-      e.className = RegExp.$1.replace('.', ' ');
-      e.tagName   = e.tagName.replace(/\..+$/, '');
-    }
-    
-    if(!e.tagName.length) 
-    { 
-      e.tagName = 'div'; 
-    }
-    
-    html = '<'+e.tagName+' id="'+e.id+'" class="'+e.className+'">'+html+'</'+e.tagName+'>';
-  }
-  
-  return html;
-}
-
-/** Take HTML and strip it from the elements. 
- *
- * @param string
- * @return string
- */
- 
-WysiwygWrap.prototype.outwardHtml = function(html)
-{
-  for(var x = 0; x < this.editor.config.WysiwygWrap.elements.length; x++)
-  {
-    var e = { tagName: this.editor.config.WysiwygWrap.elements[x], className: '', id: '' };    
-    if(e.tagName.match(/#(.+)$/))
-    {
-      e.id        = RegExp.$1;
-      e.tagName   = e.tagName.replace(/#(.+)$/,'');
-    }
-    
-    if(e.tagName.match(/[^.]*\.(.+)$/))
-    {
-      e.className = RegExp.$1.replace('.', ' ');
-      e.tagName   = e.tagName.replace(/\..+$/, '');
-    }
-    
-    if(!e.tagName.length) 
-    { 
-      e.tagName = 'div'; 
-    }
-
-    var r1 = new RegExp('^(\\s|\\n|\\r)*<'+e.tagName+'[^>]*>(\\s|\\n|\\r)*', 'i');
-    var r2 = new RegExp('(\\s|\\n|\\r)*</'+e.tagName+'[^>]*>(\\s|\\n|\\r)*$', 'i');
-  
-    html = html.replace(r1, '');
-    html = html.replace(r2, '');
-  }
-  
-  return html;
-}
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/popups/blank.html b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/popups/blank.html
deleted file mode 100644
index 45d5f7a..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.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-1.5.1/popups/editor_help.html b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/popups/editor_help.html
deleted file mode 100644
index 9aa7a89..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.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-1.5.1/popups/popup.css b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/popups/popup.css
deleted file mode 100644
index 7bf9358..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.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-1.5.1/popups/popup.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/popups/popup.js
deleted file mode 100644
index 80d06cf..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/popups/popup.js
+++ /dev/null
@@ -1,140 +0,0 @@
-// htmlArea v3.0 - Copyright (c) 2002, 2003 interactivetools.com, inc.
-// This copyright notice MUST stay intact for use (see license.txt).
-//
-// Portions (c) dynarch.com, 2003
-//
-// A free WYSIWYG editor replacement for <textarea> fields.
-// For full source code and docs, visit http://www.interactivetools.com/
-//
-// Version 3.0 developed by Mihai Bazon.
-//   http://dynarch.com/mishoo
-//
-// $Id:popup.js 929 2008-01-09 21:10:59Z ray $
-if(typeof Xinha == 'undefined')
-  Xinha = window.opener.Xinha;
-
-// Backward compatibility will be removed some time or not?
-HTMLArea = Xinha;
-
-function getAbsolutePos(el) {
-	var r = { x: el.offsetLeft, y: el.offsetTop };
-	if (el.offsetParent) {
-		var tmp = getAbsolutePos(el.offsetParent);
-		r.x += tmp.x;
-		r.y += tmp.y;
-	}
-	return r;
-}
-
-function comboSelectValue(c, val) {
-	var ops = c.getElementsByTagName("option");
-	for (var i = ops.length; --i >= 0;) {
-		var op = ops[i];
-		op.selected = (op.value == val);
-	}
-	c.value = val;
-}
-
-function __dlg_onclose() {
-	opener.Dialog._return(null);
-}
-// ray: I mark this on deprecated, because bottom is never used
-function __dlg_init( bottom, win_dim ) {
-  __xinha_dlg_init(win_dim);
-}
-
-function __xinha_dlg_init( win_dim ) {
-  if(window.__dlg_init_done) return true;
-  
-  if(window.opener._editor_skin) {
-    var head = document.getElementsByTagName("head")[0];
-    var link = document.createElement("link");
-    link.type = "text/css";
-    link.href = window.opener._editor_url + 'skins/' + window.opener._editor_skin + '/skin.css';
-    link.rel = "stylesheet";
-    head.appendChild(link);
-  }
-  if (!window.dialogArguments && opener.Dialog._arguments)
-  {
-    window.dialogArguments = opener.Dialog._arguments;
-  }
-  
-
-  var page = Xinha.pageSize(window);
-  if ( !win_dim )
-  {
-    win_dim = {width:page.x, height: page.y};
-  }
-  window.resizeTo(win_dim.width, win_dim.height);
-
-  var dim = Xinha.viewportSize(window);
-
-  window.resizeBy(0, page.y - dim.y);
-
-  if(win_dim.top && win_dim.left)
-  {
-    window.moveTo(win_dim.left,win_dim.top);
-  }
-  else
-  {
-    if (!Xinha.is_ie)
-    {
-      var x = opener.screenX + (opener.outerWidth - win_dim.width) / 2;
-      var y = opener.screenY + (opener.outerHeight - win_dim.height) / 2;
-    }
-    else
-    {//IE does not have window.outer... , so center it on the screen at least
-      var x =  (self.screen.availWidth - win_dim.width) / 2;
-      var y =  (self.screen.availHeight - win_dim.height) / 2;	
-    }
-    window.moveTo(x,y);
-  }
-  
-  Xinha.addDom0Event(document.body, 'keypress', __dlg_close_on_esc);
-  window.__dlg_init_done = true;
-}
-
-function __dlg_translate(context) {
-	var types = ["input", "select", "legend", "span", "option", "td", "th", "button", "div", "label", "a", "img"];
-	for (var type = 0; type < types.length; ++type) {
-		var spans = document.getElementsByTagName(types[type]);
-		for (var i = spans.length; --i >= 0;) {
-			var span = spans[i];
-			if (span.firstChild && span.firstChild.data) {
-				var txt = Xinha._lc(span.firstChild.data, context);
-				if (txt) {
-					span.firstChild.data = txt;
-				}
-			}
-			if (span.title) {
-				var txt = Xinha._lc(span.title, context);
-				if (txt) {
-					span.title = txt;
-				}
-			}
-			if (span.tagName.toLowerCase() == 'input' && 
-					(/^(button|submit|reset)$/i.test(span.type))) {
-				var txt = Xinha._lc(span.value, context);
-				if (txt) {
-					span.value = txt;
-				}
-			}
-		}
-	}
-	document.title = Xinha._lc(document.title, context);
-}
-
-// closes the dialog and passes the return info upper.
-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-1.5.1/popups/select_color.html b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/popups/select_color.html
deleted file mode 100644
index 89e0e67..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.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-1.5.1/release-notes.txt b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/release-notes.txt
deleted file mode 100644
index 75f6aaa..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/release-notes.txt
+++ /dev/null
@@ -1,491 +0,0 @@
-Xinha - The Community-Built Online HTML Editor
-
-For bug reports, forum, and updates go to 
-http://xinha.org
-
-Release History
-
-== Xinha 1.5 "A Long Time Coming" ==
-
-A long time passed between the release of 0.96.1 and 1.5, during this time Xinha was in daily reliable use, especially by users of Chrome and other "good" browsers, perhaps not so much IE.  In early 2018 James Sleeman (gogo) got inspired in a few weeks of free time to do some updates to bring Xinha back to up to speed with all browsers, adding new features cleaning up old bugs, and generally making Xinha ready for it's next 5 or 10 years of reliable service to come.
-
-=== Bugs Fixed ===
-  * #1595 suhoshin caused issues with MootoolsFileManager
-  * #1619 dTree's Node object conflicting with DOM
-  * [1332] iPhone/iPad Fixes
-  * [1332] Stylist startup reliablility fix
-  * [1336] Fix for a console warning in Chrome
-  * #1609  Rename the CSS plugin to CSSDropDowns to avoid the native CSS Object in Firefox
-  * #1601  Fix status bar width
-  * #1589  Fix crash in Equation plugin
-  * #1568  Fix some 7 bit clean URLs with TransformInnerHTML
-  * #1520  Remove class attributes correctly when cleaning word
-  * #1487  Prevent "Disco Fever" with multiple editors due to a race condition in some circumstances
-  * #1480  Fix some oddities with InsertAnchor plugin
-  * #1420  Remove the Save As button, this is not relevant any more.
-  * #1245  Fix percent width and height in DOMwalk
-  * #1361  Increase the z-Index for the "loading" message
-  * [1360] Small fix for SmartReplace plugin
-  * #1279  Change ereg to preg in SuperClean tidy php 
-  * [1367] Improve warnings (in the console) for deprecated plugins.
-  * #1578  Fix ColorPicker scrolling and positioning
-  * [1373] Fix padding of skin-less buttons in the toolbar.
-  * #1358  Hide SmartReplace when in textmode
-  * #1612  Fix list element creation in some circumstances in Gecko
-  * #1422  Fix algorithm for determining selected font styles (implementational difference only)
-  * #1484  Rewrite expandRelativeUrl to work properly
-  * [1400] Repair Greek Translations
-  * [1401] Repair Latvian Translations
-  * [1413] Fix for the toolbar in IE10
-
-  
-=== New Features and Improvements ===
-  * Add a new way of loading Xinha which is much easier, called XinhaEasy.js, this can also be used from a CDN type arrangement, even if you want to use PHP plugins (which are on your local server).  See the examples and the NewbieGuide  
-  * [1332] New Plugin event onBeforeSubmitTextarea
-  * #1602  Allow setting editor events after makeEditors and before startEditors
-  * #1600  Improve scrolling when a new paragraph is entered
-  * #1546  Add an onMouseUp event
-  * #1391  Improve PreserveScripts plugin.
-  * #1511  Improve SuperClean plugin
-  * #1476  Improve ContextMenu when using native browser spell checking
-  * #1432  Support title attribute in the Linker plugin
-  * #1343  Add some Turkish translations
-  * #1489  Add some Portuguese Brazilian translations
-  * #1163  Add editing support for th in TableOperations
-  * [1366] Add a .htaccess to unsupported_plugins to restrict access to possible security threatening plugins to approved IP addresses.
-  * [1371] Update MootoolsFileManager to no longer require Flash (uses HTML5 uploading) amongst some other small improvements.
-  * [1378] Improve handling of tab key, add configuration tabSpanClass and tabSpanContents
-  * #1617  Implement tab/shift-tab for TableOperations
-  * #1163  Allow changing table cells between td/th in TableOperations
-  * #1550  Make some features of TableOperations less confusing and improve border styling.
-  * [1394] Rewrite key event handling to make key events more standardised (#1393) 
-  * [1397] Improve the undo/redo by also remembering the caret position and restoring that on undo/redo (#360)
-  * #1135  Update SuperClean to incorporate UnFormat functionality
-  * [1402] Rebuild the translation system and language files entirely.  See http://trac.xinha.org/wiki/Documentation/DevelopingForXinha/Translating
-  * [1403] Use merged translation files by default  
-  * [1418] Add configuration option resizableEditor which allows drag-resize.  Works in Chrome, not that well in the others.
-  * [1421] Reduce the "pinging" to load plugins by utilising a Plugin Manifest so Xinha knows what plugins it has in it's distribution.  This also makes using Xinha from an Amazon S3 served environment possible.
-  * [1423] Improve lock-down of the contrib folder, accessing this folder from a web browser is not necessary or desirable.
-  
-=== New Plugins ===
-  * WebKitResize Provides drag-resize for images, tables and table cells in WebKit Browsers, also for tables and cells in Gecko Browsers.
-  * EncodeOutput Provides ability to encode the generated HTML of Xinha in some manners before submitting it to the server, for example to avoid mod_security issues.
-  * ListOperations Provides tab/shift-tab functionality when editing lists ( #1614 )
-  * FancySelects Provides "fancy" selects for the font style etc which show the font in use.  Uses the select2 jQuery component behind the scenes (jQuery is loaded automatically if necessary).
-  * PreserveSelection Allows selected text in the WYSIWYG view to also be selected when you switch to textmode (#1544)
-    
-  
-=== Deprecated Plugins ===
-  * [1351] Deprecate SpellChecker plugin, native browser spell checking works well enough and executing aspell on hosts never really worked that reliably.
-  * [1355] Deprecate the PersistantStorage and associated plugins, these are abandoned.
-  * [1366] Deprecate ExtendedFileManager and ImageManager, the MootoolsFileManager should be used instead of both.
-  * #1135  Deprecate UnFormat, SuperClean now has it's features.
-
-== Xinha 1.0 ==
-
-Xinha 1.0 was never actually released, it was just the stable but "Unreleased Trunk" between 0.96.1 released in 2010 and 1.5 released in 2018.
-
-=== Improvements ===
- * Update MootoolsFileManager to a new version
- * [1313] Reduce PHP Session locking
- * #1541 [1296] [1289] More Configurable FormatBlock options
- * [1294] Better documentation for multistage loader
- 
- === Bugs Fixed ===
- * #1581 #1524 #1577 IE Fixes (especially IE9)
- * [1313] Fixes to InsertTable, DOMWalk, Stylist and PasteText
- * #1298 CSS Styling gets inserted into table cell after viewing source
- * [1301] Remoive old charactermap popup (disused)
- * #1528 Dutch LangMarks translation fix
- * #1534 Allow "fullscreen" as toolbar element.
- * #1525 Extend freezescript to apply to plain script tags
- * #1526 Hide media objects behind div-type dialogs
- * Updates to MootoolsFileManager
- * #1532 Fix indexOf implementation (for IE)
- * #1553 Fix `editor._createLink` method and ability to double-click on links to edit them
- * #1556 Fix `editor._insertTable` method
- * #1559 DefinitionList plugin's `<dl>` button throws a JS error if the cursor context is the `<body>` element
- * #1555 Mark DoubleClick plugin as unsupported, since its functionality is now in core (`config.dblclickList`, as of 0.96.1 release)
- * #1561 Move DefinitionList plugin's toolbar buttons near the standard orderedlist and unorderedlist buttons
- * #1560 If TableOperations is installed, you can now double-click on tables to edit their properties
- * #1557 Russian translation for DefinitionList
- * #1538 Add a configuration option for TableOperations to prevent it from trying to add a linebreak to the toolbar
- * #1545 Fix typo in UnFormat plugin
- * #1530 Fix a DefinitionList? syntax error and jslint warnings
- * Improve some documentation of configuration options (#1536, #1537)
- * #1534 Allow the use of "fullscreen" as a toolbar element, as an alternative to "popupeditor"
-
-
-== Xinha 0.96.1 ==
-=== 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-1.5.1/skins/blue-look/button-background.png b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/skins/blue-look/button-background.png
deleted file mode 100644
index 9680684..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/skins/blue-look/button-background.png
+++ /dev/null
Binary files differ
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/skins/blue-look/separator.gif b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/skins/blue-look/separator.gif
deleted file mode 100644
index 5ae3d59..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/skins/blue-look/separator.gif
+++ /dev/null
Binary files differ
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/skins/blue-look/skin.css b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/skins/blue-look/skin.css
deleted file mode 100644
index 9be971d..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/skins/blue-look/skin.css
+++ /dev/null
@@ -1,110 +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 .toolbarRow td.toolBarElement
-{
-  margin:0px; padding:0px;
-}
-
-.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-1.5.1/skins/blue-look/skin.xml b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/skins/blue-look/skin.xml
deleted file mode 100644
index 5fae0be..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/skins/blue-look/skin.xml
+++ /dev/null
@@ -1,11 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<skin>
-  <meta name="name" value="blue-look" />
-  <meta name="developer" value="" />
-  <meta name="developer_url" value="" />
-  <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-1.5.1/skins/blue-metallic/button-background.png b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/skins/blue-metallic/button-background.png
deleted file mode 100644
index 41c18db..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/skins/blue-metallic/button-background.png
+++ /dev/null
Binary files differ
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/skins/blue-metallic/separator.gif b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/skins/blue-metallic/separator.gif
deleted file mode 100644
index bc9297a..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/skins/blue-metallic/separator.gif
+++ /dev/null
Binary files differ
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/skins/blue-metallic/skin.css b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/skins/blue-metallic/skin.css
deleted file mode 100644
index 1c6b806..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/skins/blue-metallic/skin.css
+++ /dev/null
@@ -1,103 +0,0 @@
-.htmlarea .toolbar { background-color:#f7f8fd;}

-

-.htmlarea .toolbarRow

-{

-  /*background-image: url(button-background.png);*/

-  background-color: #C5DCEC;

-  margin-top:2px;

-  margin-bottom:2px;

-  border:1px solid #7A8A99;

-  padding:2px;

-  -moz-border-radius:4px;

-  margin:4px;

-  height:25px;

-}

-

-.htmlarea .toolbar .button {

-  background-image: url(button-background.png);

-  width:20px;

-  height:21px;

-  padding:1px;

-  border:0px;

-}

-

-.buttonImageContainer

-{

-  position:relative;

-  left:1px;

-  top :1px;

-}

-

-.htmlarea .toolbar .separator

-{

-  margin:0px;

-  background-image: url(separator.gif);

-  border:1px #f7f8fd;

-  width:   7px;

-  height: 21px;

-  padding: 0px;

-}

-

-.htmlarea .toolbar a.button:hover,

-.htmlarea .toolbar a.buttonDisabled:hover

-{

-  padding: 0px;

-  border: 1px solid;

-  border-color: #7A8A99;

-}

-

-.htmlarea .toolbar .button.buttonActive,

-.htmlarea .toolbar .button.buttonPressed

-{

-  padding: 0px;

-  border: 1px solid;

-  border-color: #79A4CC #FFFFFF #FFFFFF #79A4CC;

-}

-

-.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: #EEEEEE;

-}

-.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-1.5.1/skins/green-look/button-background.gif b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/skins/green-look/button-background.gif
deleted file mode 100644
index d137119..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/skins/green-look/button-background.gif
+++ /dev/null
Binary files differ
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/skins/green-look/separator.gif b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/skins/green-look/separator.gif
deleted file mode 100644
index 0357233..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/skins/green-look/separator.gif
+++ /dev/null
Binary files differ
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/skins/green-look/skin.css b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/skins/green-look/skin.css
deleted file mode 100644
index b278580..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.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-1.5.1/skins/inditreuse/README b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/skins/inditreuse/README
deleted file mode 100644
index b66accd..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/skins/inditreuse/README
+++ /dev/null
@@ -1,9 +0,0 @@
-Skin inditreuse

-Author: Kyle Kochis (http://completesiteservices.com/)

-This work is licensed under the Creative Commons Attribution-ShareAlike License.

-To view a copy of this license, visit http://creativecommons.org/licenses/by-sa/2.0/

-or send a letter to

-Creative Commons,

-559 Nathan Abbott Way

-Stanford, California 94305

-USA
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/skins/inditreuse/back.png b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/skins/inditreuse/back.png
deleted file mode 100644
index 7a71fe6..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/skins/inditreuse/back.png
+++ /dev/null
Binary files differ
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/skins/inditreuse/button-background.png b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/skins/inditreuse/button-background.png
deleted file mode 100644
index 5e4a827..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/skins/inditreuse/button-background.png
+++ /dev/null
Binary files differ
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/skins/inditreuse/hover.png b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/skins/inditreuse/hover.png
deleted file mode 100644
index 5e45483..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/skins/inditreuse/hover.png
+++ /dev/null
Binary files differ
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/skins/inditreuse/selected.png b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/skins/inditreuse/selected.png
deleted file mode 100644
index 5ade5f7..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/skins/inditreuse/selected.png
+++ /dev/null
Binary files differ
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/skins/inditreuse/separator.png b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/skins/inditreuse/separator.png
deleted file mode 100644
index cb77e5d..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/skins/inditreuse/separator.png
+++ /dev/null
Binary files differ
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/skins/inditreuse/skin.css b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/skins/inditreuse/skin.css
deleted file mode 100644
index a85197e..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/skins/inditreuse/skin.css
+++ /dev/null
@@ -1,81 +0,0 @@
-.htmlarea .toolbar {

-	background-color:#889fc9;

-  background-image:url(back.png);

-  background-repeat:repeat-y;

-}

-.htmlarea .toolbarRow {

-  margin-top:2px;

-  margin-bottom:2px;

-  background-image:url(button-background.png);

-  height:25px;

-}

-.htmlarea .toolbar .button {

-  width:20px;

-  height:20px;

-  padding:1px;

-  border:none;

-  background-image:url(button-background.png);

-}

-.buttonImageContainer {

-  position:relative;

-  left:1px;

-  top:1px;

-}

-.htmlarea .toolbar .separator {

-  margin:0;

-  background-image: url(separator.png);

-  width:7px;

-  height:20px;

-  padding:1px;

-  border:none;

-}

-.htmlarea .toolbar a.button:hover {

-  border:none !important;

-  padding:1px;

-  background-image:url(hover.png);

-}

-.htmlarea .toolbar .button.buttonPressed

-{

-  padding:1px;

-  background-image:url(selected.png);

-}

-.htmlarea .statusBar {

-  padding:0;

-  height:20px;

-  background-image:url(button-background.png);

-  background-repeat:repeat-x;

-  background-color:#889fc9;

-  color:ButtonText;

-  font:11px helvetica,arial,sans-serif;

-}

-

-.htmlarea .statusBar .statusBarWidgetContainer

-{

-  background-image: url(button-background.png);

-  background-repeat: repeat-x;

-  background-color: #889fc9;

-}

-

-.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:#889fc9;

-}

-.dialog {

-  background-color:#889fc9;

-}

-.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-1.5.1/skins/silva/dialog.jpg b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/skins/silva/dialog.jpg
deleted file mode 100644
index 05676b5..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/skins/silva/dialog.jpg
+++ /dev/null
Binary files differ
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/skins/silva/html.gif b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/skins/silva/html.gif
deleted file mode 100644
index ddd6531..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/skins/silva/html.gif
+++ /dev/null
Binary files differ
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/skins/silva/skin.css b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/skins/silva/skin.css
deleted file mode 100644
index 5044b56..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.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-1.5.1/skins/silva/skin.xml b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/skins/silva/skin.xml
deleted file mode 100644
index cfe00d3..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.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-1.5.1/skins/silva/statusbar.png b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/skins/silva/statusbar.png
deleted file mode 100644
index 16db3c6..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/skins/silva/statusbar.png
+++ /dev/null
Binary files differ
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/skins/silva/toolbar.png b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/skins/silva/toolbar.png
deleted file mode 100644
index 6f46299..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/skins/silva/toolbar.png
+++ /dev/null
Binary files differ
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/skins/titan/README b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/skins/titan/README
deleted file mode 100644
index 1272a27..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/skins/titan/README
+++ /dev/null
@@ -1,12 +0,0 @@
-Skin Titan, a modification of Skin inditreuse by Mike Harris (www.jonesstandard.org)

-I simply changed the background to look more like nickel, and the dots on the separator have been replaced.  

-Everything else is the same.

-

-Skin inditreuse Author: Kyle Kochis (http://completesiteservices.com/)

-This work is licensed under the Creative Commons Attribution-ShareAlike License.

-To view a copy of this license, visit http://creativecommons.org/licenses/by-sa/2.0/

-or send a letter to

-Creative Commons,

-559 Nathan Abbott Way

-Stanford, California 94305

-USA
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/skins/titan/back.png b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/skins/titan/back.png
deleted file mode 100644
index 7a71fe6..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/skins/titan/back.png
+++ /dev/null
Binary files differ
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/skins/titan/button-background.png b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/skins/titan/button-background.png
deleted file mode 100644
index 4ee6aae..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/skins/titan/button-background.png
+++ /dev/null
Binary files differ
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/skins/titan/hover.png b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/skins/titan/hover.png
deleted file mode 100644
index 2e87d84..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/skins/titan/hover.png
+++ /dev/null
Binary files differ
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/skins/titan/selected.png b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/skins/titan/selected.png
deleted file mode 100644
index ffcf8a5..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/skins/titan/selected.png
+++ /dev/null
Binary files differ
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/skins/titan/separator.png b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/skins/titan/separator.png
deleted file mode 100644
index 75e009f..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/skins/titan/separator.png
+++ /dev/null
Binary files differ
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/skins/titan/skin.css b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/skins/titan/skin.css
deleted file mode 100644
index dc65fbd..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/skins/titan/skin.css
+++ /dev/null
@@ -1,81 +0,0 @@
-.htmlarea .toolbar {

-        background-color:#889fc9;

-  background-image:url(back.png);

-  background-repeat:repeat-y;

-}

-.htmlarea .toolbarRow {

-  margin-top:2px;

-  margin-bottom:2px;

-  background-image:url(button-background.png);

-  height:25px;

-}

-.htmlarea .toolbar .button {

-  width:20px;

-  height:20px;

-  padding:1px;

-  border:none;

-  background-image:url(button-background.png);

-}

-.buttonImageContainer {

-  position:relative;

-  left:1px;

-  top:1px;

-}

-.htmlarea .toolbar .separator {

-  margin:0;

-  background-image: url(separator.png);

-  width:7px;

-  height:20px;

-  padding:1px;

-  border:none;

-}

-.htmlarea .toolbar a.button:hover {

-  border:none !important;

-  padding:1px;

-  background-image:url(hover.png);

-}

-.htmlarea .toolbar .button.buttonPressed

-{

-  padding:1px;

-  background-image:url(selected.png);

-}

-.htmlarea .statusBar {

-  padding:0;

-  height:20px;

-  background-image:url(button-background.png);

-  background-repeat:repeat-x;

-  background-color:#889fc9;

-  color:ButtonText;

-  font:11px helvetica,arial,sans-serif;

-}

-

-.htmlarea .statusBar .statusBarWidgetContainer

-{

-  background-image: url(button-background.png);

-  background-repeat: repeat-x;

-  background-color: #889fc9;

-}

-

-.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:#889fc9;

-}

-.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-1.5.1/skins/xp-blue/back.png b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/skins/xp-blue/back.png
deleted file mode 100644
index 478debb..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/skins/xp-blue/back.png
+++ /dev/null
Binary files differ
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/skins/xp-blue/button-background.png b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/skins/xp-blue/button-background.png
deleted file mode 100644
index 69488d3..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/skins/xp-blue/button-background.png
+++ /dev/null
Binary files differ
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/skins/xp-blue/hover.png b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/skins/xp-blue/hover.png
deleted file mode 100644
index f55e355..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/skins/xp-blue/hover.png
+++ /dev/null
Binary files differ
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/skins/xp-blue/selected.png b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/skins/xp-blue/selected.png
deleted file mode 100644
index c0c3339..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/skins/xp-blue/selected.png
+++ /dev/null
Binary files differ
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/skins/xp-blue/separator.png b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/skins/xp-blue/separator.png
deleted file mode 100644
index 02ceb37..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/skins/xp-blue/separator.png
+++ /dev/null
Binary files differ
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/skins/xp-blue/skin.css b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/skins/xp-blue/skin.css
deleted file mode 100644
index c8f8564..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/skins/xp-blue/skin.css
+++ /dev/null
@@ -1,84 +0,0 @@
-.htmlarea .toolbar {

-	background-color:#c3daf9;

-  background-image:url(back.png);

-  background-repeat:repeat-y;

-}

-.htmlarea .toolbarRow {

-  margin-top:2px;

-  margin-bottom:2px;

-  background-image:url(button-background.png);

-  height:25px;  

-}

-.htmlarea .toolbar .button {

-  width:20px;

-  height:20px;

-  padding:1px;

-  border:none;

-  background-image:url(button-background.png);

-}

-.buttonImageContainer {

-  position:relative;

-  left:1px;

-  top:1px;

-}

-.htmlarea .toolbar .separator {

-  margin:0;

-  background-image:url(separator.png);

-  width:7px;

-  height:20px;

-  padding:0;

-}

-.separator {

-  border:none;

-}

-.htmlarea .toolbar a.button:hover {

-  border:1px solid #003355;

-  padding:0;

-  background-image:url(hover.png);

-}

-.htmlarea .toolbar .button.buttonPressed

-{

-  border:1px solid #003355;

-  padding:0;

-  background-image:url(selected.png);

-}

-.htmlarea .statusBar {

-  padding:0;

-  height:20px;

-  background-image:url(button-background.png);

-  background-repeat:repeat-x;

-  background-color:#c3daf9;

-  color:ButtonText;

-  font:11px helvetica,arial,sans-serif;

-}

-

-.htmlarea .statusBar .statusBarWidgetContainer

-{

-  background-image: url(button-background.png);

-  background-repeat: repeat-x;

-  background-color: #c3daf9;

-}

-

-.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:#c3daf9;

-}

-.dialog {

-  background-color:#c3daf9;

-}

-.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-1.5.1/skins/xp-green/back.png b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/skins/xp-green/back.png
deleted file mode 100644
index 0d0a749..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/skins/xp-green/back.png
+++ /dev/null
Binary files differ
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/skins/xp-green/button-background.png b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/skins/xp-green/button-background.png
deleted file mode 100644
index 81a4657..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/skins/xp-green/button-background.png
+++ /dev/null
Binary files differ
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/skins/xp-green/hover.png b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/skins/xp-green/hover.png
deleted file mode 100644
index f55e355..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/skins/xp-green/hover.png
+++ /dev/null
Binary files differ
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/skins/xp-green/selected.png b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/skins/xp-green/selected.png
deleted file mode 100644
index c0c3339..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/skins/xp-green/selected.png
+++ /dev/null
Binary files differ
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/skins/xp-green/separator.png b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/skins/xp-green/separator.png
deleted file mode 100644
index 18c5a57..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/skins/xp-green/separator.png
+++ /dev/null
Binary files differ
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/skins/xp-green/skin.css b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/skins/xp-green/skin.css
deleted file mode 100644
index 4a284dc..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/skins/xp-green/skin.css
+++ /dev/null
@@ -1,84 +0,0 @@
-.htmlarea .toolbar {

-  background-color:#f2f0e4;

-  background-image:url(back.png);

-  background-repeat:repeat-y;

-}

-.htmlarea .toolbarRow {

-  margin-top:2px;

-  margin-bottom:2px;

-  background-image:url(button-background.png);

-  height:25px;

-}

-.htmlarea .toolbar .button {

-  width:20px;

-  height:20px;

-  padding:1px;

-  border:none;

-  background-image:url(button-background.png);

-}

-.buttonImageContainer {

-  position:relative;

-  left:1px;

-  top:1px;

-}

-.htmlarea .toolbar .separator {

-  margin:0;

-  background-image:url(separator.png);

-  width:7px;

-  height:20px;

-  padding:0;

-}

-.separator {

-  border:none;

-}

-.htmlarea .toolbar a.button:hover {

-  border:1px solid #335500;

-  padding:0;

-  background-image:url(hover.png);

-}

-.htmlarea .toolbar .button.buttonPressed

-{

-  border:1px solid #335500;

-  padding:0;

-  background-image:url(selected.png);

-}

-.htmlarea .statusBar {

-  padding:0;

-  height:20px;

-  background-image:url(button-background.png);

-  background-repeat:repeat-x;

-  background-color:#f2f0e4;

-  color:ButtonText;

-  font:11px helvetica,arial,sans-serif;

-}

-

-.htmlarea .statusBar .statusBarWidgetContainer

-{

-  background-image: url(button-background.png);

-  background-repeat: repeat-x;

-  background-color: #f2f0e4;

-}

-

-.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:#f2f0e4;

-}

-.dialog {

-  background-color:#f2f0e4;

-}

-.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-1.5.1/unsupported_plugins/.htaccess b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/.htaccess
deleted file mode 100644
index 4e7b8b5..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/.htaccess
+++ /dev/null
@@ -1,105 +0,0 @@
-<IfModule mod_setenvif.c>
-  
-  ErrorDocument 403 "This request has been denied because the plugin is potentially vulnerable and your IP is not approved. Developers can add approved IP addresses to the [...]/xinha/unsupported_plugins/.htaccess file"
-  
-  # Some unsupported plugins are potentially more dangerous to have 
-  #  open-to-the-world than others due to the potential for unknown or
-  #  crept-in-through-php-updates type vulnerabilities
-  #
-  # As a result those plugins (see further below) are limited to approved
-  #  ip addresses only, which you can set below.
-  
-  # Localhost only by default, I figure if you are running locally there
-  # isn't much more bad can happen than already is.
-  ########################################################################
-  SetEnvIf Remote_Addr 127\.0\.0\.1 approved_ip
-  
-  # The following ranges are the Private IPv4 Space
-  # If you are allowing only your local network to access this, just 
-  # uncomment the appropriate one(s)
-  ########################################################################
-  # SetEnvIf Remote_Addr 192\.168\.[0-9]+\.[0-9]+    approved_ip
-  # SetEnvIf Remote_Addr 10\.[0-9]+\.[0-9]+\.[0-9]+  approved_ip
-  # SetEnvIf Remote_Addr 172\.1[6-9]\.[0-9]+\.[0-9]+ approved_ip
-  # SetEnvIf Remote_Addr 172\.2[0-9]\.[0-9]+\.[0-9]+ approved_ip
-  # SetEnvIf Remote_Addr 172\.3[0-1]\.[0-9]+\.[0-9]+ approved_ip
-  ########################################################################
-  
-  # Add additional SetEnvIf to approve further IP addresses, note that 
-  #  the IP address is a regular express, be sure to escape the dots.
-  ########################################################################
-  # SetEnvIf Remote_Addr 111\.111\.111\.111         approved_ip
-  # SetEnvIf Remote_Addr 123\.123\.123\.123         approved_ip
-  #########################################################################
-  
-  # Plugin List
-  #########################################################################
-  # We mark the safe plugins, anything not marked (commented out) is 
-  #  regarded to be a potential threat.
-  
-  #SetEnvIf Request_URI "/BackgroundImage/" not_a_security_threat
-  #SetEnvIf Request_URI "/DoubleClick/" not_a_security_threat
-  #SetEnvIf Request_URI "/Filter/" not_a_security_threat
-  #SetEnvIf Request_URI "/InsertMarquee/" not_a_security_threat
-  #SetEnvIf Request_URI "/NoteServer/" not_a_security_threat  
-  #SetEnvIf Request_URI "/Template/" not_a_security_threat
-  
-  SetEnvIf Request_URI "/ExtendedFileManager/"  security_threat
-  SetEnvIf Request_URI "/HtmlTidy/"             security_threat
-  SetEnvIf Request_URI "/ImageManager/"         security_threat
-  SetEnvIf Request_URI "/InsertPicture/"        security_threat
-  SetEnvIf Request_URI "/SpellChecker/"         security_threat
-  
-  SetEnvIf Request_URI "/PersistentStorage/"    security_threat
-    SetEnvIf Request_URI "/PSFixed/"            security_threat
-    SetEnvIf Request_URI "/PSLocal/"            security_threat
-    SetEnvIf Request_URI "/PSServer/"           security_threat
-  
-  # And this is where we deny things, hopefully this concoction of rules
-  #  works in most typical Apache situations.
-  
-  # Apache < 2.3
-  <IfModule !mod_authz_core.c>
-      # Deny,Allow means
-      #  if both match then allow,
-      #  else if neither match then allow,
-      #  else if deny matches then deny,
-      #  else if allow matches then allow      
-      Order Deny,Allow
-      Deny from env=security_threat
-      Allow from env=approved_ip
-  </IfModule>
-
-  # Apache >= 2.3
-  <IfModule mod_authz_core.c>
-    
-    # Which has the compatibility module, we will have to use
-    #  this also to make sure that is denied in case the
-    #  vhose includes old rules too which would override
-    #  the new Require directives
-    <IfModule mod_access_compat.c>
-      Order Deny,Allow
-      Deny from env=security_threat
-      Allow from env=approved_ip
-    </IfModule>
-    
-    # Finally Apache >= 2.3 properly (why did they make this so confusing)
-    <RequireAny>
-      # Deny everybody by default
-      Require all denied
-      
-      # Except if it's not a security threat
-      <RequireAll>
-        Require all granted
-        Require not env security_threat
-      </RequireAll>
-      
-      # Except if it's an approved IP
-      <RequireAll>
-        Require all granted
-        Require env approved_ip
-      </RequireAll>
-    </RequireAny>
-  </IfModule>
-  
-</IfModule>
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/BackgroundImage/BackgroundImage.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/BackgroundImage/BackgroundImage.js
deleted file mode 100644
index fcaa7e8..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/BackgroundImage/BackgroundImage.js
+++ /dev/null
@@ -1,136 +0,0 @@
-// BackgroundImage plugin for Xinha

-// Sponsored by http://www.schaffrath-neuemedien.de

-// Implementation by Udo Schmal

-// based on TinyMCE (http://tinymce.moxiecode.com/) Distributed under LGPL by Moxiecode Systems AB

-//

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

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

-

-function BackgroundImage(editor) {

-  this.editor = editor;

-  var cfg = editor.config;

-  var self = this;

-  cfg.registerButton({

-    id       : "bgImage",

-    tooltip  : Xinha._lc("Set page background image",  'BackgroundImage'),

-    image    : editor.imgURL("ed_bgimage.gif", "BackgroundImage"),

-    textMode : false,

-    action   : function(editor) {

-      self.show();

-    }

-  })

-  cfg.addToolbarElement("bgImage", "inserthorizontalrule", 1);

-}

-

-BackgroundImage._pluginInfo = {

-  name          : "BackgroundImage",

-  version       : "1.0",

-  developer     : "Udo Schmal",

-  developer_url : "http://www.schaffrath-neuemedien.de/",

-  c_owner       : "Udo Schmal & Schaffrath NeueMedien",

-  sponsor       : "L.N.Schaffrath NeueMedien",

-  sponsor_url   : "http://www.schaffrath-neuemedien.de.de/",

-  license       : "htmlArea"

-};

-

-BackgroundImage.prototype.onGenerateOnce = function(editor){

-  // Load assets

-  var self = BackgroundImage;

-  if (self.loading) return;

-

-  // A list of jpgs that are expected to be in ./backgrounds with thumbnails.

-  var backgrounds = {blufur:'',palecnvs:'', ppplcnvs:'', ylwsand:''};

-

-  self.loading = true;

-  self.methodsReady = true;

-

-  // When we get back from loading the dialog, we'll process our image template to handle as many images as specified.

-  Xinha._getback(Xinha.getPluginDir('BackgroundImage') + '/dialog.html', function(getback) {

-

-    // Replace the template line with one line per image.

-    self.html = getback.replace(/<template>(.*?)<\/template>/ig, function(fullString, template) {

-      var replacement = '';

-

-      for (bg in backgrounds)

-      {

-        var thumbURL = Xinha.getPluginDir('BackgroundImage') + '/backgrounds/thumbnails/' + bg + '.jpg';

-        var imageURL = Xinha.getPluginDir('BackgroundImage') + '/backgrounds/' + bg + '.jpg';

-        replacement += template.replace(/%thumbnail%/,thumbURL).replace(/%image%/,imageURL);

-      }

-      return replacement;

-    });

-    self.dialogReady = true;

-  });

-}

-

-BackgroundImage.prototype.onUpdateToolbar = function(editor){

-  // Keep our toolbar image greyed until we're fully loaded.

-  if (!(BackgroundImage.dialogReady && BackgroundImage.methodsReady))

-  {

-    this.editor._toolbarObjects.BackgroundImage.state("enabled", false);

-  }

-  else this.onUpdateToolbar = null;

-

-}

-

-BackgroundImage.prototype.prepareDialog = function(editor){

-  var self = this;

-  var editor = this.editor;

-

-  var dialog = this.dialog = new Xinha.Dialog(editor, BackgroundImage.html, 'Xinha',{width:400})

-  //

-  // Hookup the buttons with our actions

-  dialog.getElementById('set').onclick = function() {self.apply();}

-  dialog.getElementById('delete').onclick = function() {self.deleteBg();}

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

-  

-  this.dialogReady = true;

-}

-

-BackgroundImage.prototype.show = function(editor){

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

-

-  var editor = this.editor;

-

-  // After clearing the background property, it returns the current URL, and so

-  // we need to check the extension to find out if it really has a background.

-  if (editor._doc.body.background.split('.').pop() in {jpg:'', gif:'', png:'', jpeg:'', tiff:''})

-  {

-    var background = editor._doc.body.background;

-  }

-  else

-  {

-    var background = '';

-  }

-  var values = 

-  {

-    "background"      : background

-  }

-

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

-  this.dialog.show(values);

-}

-

-BackgroundImage.prototype.deleteBg = function(){

-  var editor = this.editor;

-  this.dialog.hide();

-

-  if (Xinha.is_ie)

-    editor.focusEditor();

-

-    editor._doc.body.background = "";

-}

-

-BackgroundImage.prototype.apply = function(){

-  var editor = this.editor;

-  var doc = editor._doc;

-  

-  // selection is only restored on dialog.hide()

-  var param = this.dialog.hide();

-  // assign the given arguments

-  

-  if (Xinha.is_ie)

-    editor.focusEditor();

-

-  doc.body.background = param.background;

-};

diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/BackgroundImage/backgrounds/blufur.jpg b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/BackgroundImage/backgrounds/blufur.jpg
deleted file mode 100644
index 27df6c6..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/BackgroundImage/backgrounds/blufur.jpg
+++ /dev/null
Binary files differ
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/BackgroundImage/backgrounds/palecnvs.jpg b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/BackgroundImage/backgrounds/palecnvs.jpg
deleted file mode 100644
index 52a88ab..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/BackgroundImage/backgrounds/palecnvs.jpg
+++ /dev/null
Binary files differ
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/BackgroundImage/backgrounds/ppplcnvs.jpg b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/BackgroundImage/backgrounds/ppplcnvs.jpg
deleted file mode 100644
index d8dfc0e..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/BackgroundImage/backgrounds/ppplcnvs.jpg
+++ /dev/null
Binary files differ
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/BackgroundImage/backgrounds/thumbnails/blufur.jpg b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/BackgroundImage/backgrounds/thumbnails/blufur.jpg
deleted file mode 100644
index f4ac484..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/BackgroundImage/backgrounds/thumbnails/blufur.jpg
+++ /dev/null
Binary files differ
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/BackgroundImage/backgrounds/thumbnails/palecnvs.jpg b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/BackgroundImage/backgrounds/thumbnails/palecnvs.jpg
deleted file mode 100644
index 4867a36..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/BackgroundImage/backgrounds/thumbnails/palecnvs.jpg
+++ /dev/null
Binary files differ
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/BackgroundImage/backgrounds/thumbnails/ppplcnvs.jpg b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/BackgroundImage/backgrounds/thumbnails/ppplcnvs.jpg
deleted file mode 100644
index d8dfc0e..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/BackgroundImage/backgrounds/thumbnails/ppplcnvs.jpg
+++ /dev/null
Binary files differ
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/BackgroundImage/backgrounds/thumbnails/ylwsand.jpg b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/BackgroundImage/backgrounds/thumbnails/ylwsand.jpg
deleted file mode 100644
index 1e11aa9..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/BackgroundImage/backgrounds/thumbnails/ylwsand.jpg
+++ /dev/null
Binary files differ
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/BackgroundImage/backgrounds/ylwsand.jpg b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/BackgroundImage/backgrounds/ylwsand.jpg
deleted file mode 100644
index 1e11aa9..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/BackgroundImage/backgrounds/ylwsand.jpg
+++ /dev/null
Binary files differ
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/BackgroundImage/dialog.html b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/BackgroundImage/dialog.html
deleted file mode 100644
index 1f190d4..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/BackgroundImage/dialog.html
+++ /dev/null
@@ -1,15 +0,0 @@
-<h1 id="[h1]"><l10n>Set Page Background Image</l10n></h1>
-
-<form action="" method="get">
-<table style="text-align: center;" border="0" cellspacing="0" cellpadding="6">
-  <tr style="text-align: center; vertical-align: top;">
-    <template><td><input type="radio" name="[background]" value="%image%" /><img border="1" src="%thumbnail%" width="50" height="50"></td></template>
-  </tr>
-</table>
-<div class="space"></div>
-<div id="[buttons]">
-  <input type="button" id="[set]" value="_(Set Background)" />
-  <input type="button" id="[delete]" style="width:auto" value="_(Remove Current Background)" />
-  <input type="button" id="[cancel]" value="_(Cancel)" />
-</div>
-</form>
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/BackgroundImage/img/ed_bgimage.gif b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/BackgroundImage/img/ed_bgimage.gif
deleted file mode 100644
index fc57d38..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/BackgroundImage/img/ed_bgimage.gif
+++ /dev/null
Binary files differ
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/BackgroundImage/lang/b5.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/BackgroundImage/lang/b5.js
deleted file mode 100644
index 513bd77..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/BackgroundImage/lang/b5.js
+++ /dev/null
@@ -1,15 +0,0 @@
-// I18N constants
-// LANG: "b5", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "__OBSOLETE__": {
-        "___ TRANSLATOR NOTE   ___": "*** BACKGROUNDIMAGE IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***"
-    }
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/BackgroundImage/lang/ch.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/BackgroundImage/lang/ch.js
deleted file mode 100644
index 89f664c..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/BackgroundImage/lang/ch.js
+++ /dev/null
@@ -1,16 +0,0 @@
-// I18N constants
-// LANG: "ch", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Cancel": "取消",
-    "__OBSOLETE__": {
-        "___ TRANSLATOR NOTE   ___": "*** BACKGROUNDIMAGE IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***"
-    }
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/BackgroundImage/lang/cz.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/BackgroundImage/lang/cz.js
deleted file mode 100644
index 7930936..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/BackgroundImage/lang/cz.js
+++ /dev/null
@@ -1,16 +0,0 @@
-// I18N constants
-// LANG: "cz", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Cancel": "Zrušit",
-    "__OBSOLETE__": {
-        "___ TRANSLATOR NOTE   ___": "*** BACKGROUNDIMAGE IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***"
-    }
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/BackgroundImage/lang/da.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/BackgroundImage/lang/da.js
deleted file mode 100644
index 1bede4a..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/BackgroundImage/lang/da.js
+++ /dev/null
@@ -1,16 +0,0 @@
-// I18N constants
-// LANG: "da", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Cancel": "Annuller",
-    "__OBSOLETE__": {
-        "___ TRANSLATOR NOTE   ___": "*** BACKGROUNDIMAGE IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***"
-    }
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/BackgroundImage/lang/de.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/BackgroundImage/lang/de.js
deleted file mode 100644
index b88cfee..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/BackgroundImage/lang/de.js
+++ /dev/null
@@ -1,19 +0,0 @@
-// I18N constants
-// LANG: "de", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Cancel": "Abbrechen",
-    "Remove Current Background": "Aktuellen Hintergrund entfernen",
-    "Set Page Background Image": "Seiten-Hintergrundbild setzen",
-    "Set page background image": "Seiten-Hintergrundbild setzen",
-    "__OBSOLETE__": {
-        "___ TRANSLATOR NOTE   ___": "*** BACKGROUNDIMAGE IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***"
-    }
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/BackgroundImage/lang/ee.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/BackgroundImage/lang/ee.js
deleted file mode 100644
index 699c1ea..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/BackgroundImage/lang/ee.js
+++ /dev/null
@@ -1,16 +0,0 @@
-// I18N constants
-// LANG: "ee", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Cancel": "Loobu",
-    "__OBSOLETE__": {
-        "___ TRANSLATOR NOTE   ___": "*** BACKGROUNDIMAGE IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***"
-    }
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/BackgroundImage/lang/el.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/BackgroundImage/lang/el.js
deleted file mode 100644
index eaa3813..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/BackgroundImage/lang/el.js
+++ /dev/null
@@ -1,16 +0,0 @@
-// I18N constants
-// LANG: "el", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Cancel": "Ακύρωση",
-    "__OBSOLETE__": {
-        "___ TRANSLATOR NOTE   ___": "*** BACKGROUNDIMAGE IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***"
-    }
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/BackgroundImage/lang/es.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/BackgroundImage/lang/es.js
deleted file mode 100644
index d54ce29..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/BackgroundImage/lang/es.js
+++ /dev/null
@@ -1,16 +0,0 @@
-// I18N constants
-// LANG: "es", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Cancel": "Cancelar",
-    "__OBSOLETE__": {
-        "___ TRANSLATOR NOTE   ___": "*** BACKGROUNDIMAGE IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***"
-    }
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/BackgroundImage/lang/eu.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/BackgroundImage/lang/eu.js
deleted file mode 100644
index e9f155a..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/BackgroundImage/lang/eu.js
+++ /dev/null
@@ -1,16 +0,0 @@
-// I18N constants
-// LANG: "eu", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Cancel": "Utzi",
-    "__OBSOLETE__": {
-        "___ TRANSLATOR NOTE   ___": "*** BACKGROUNDIMAGE IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***"
-    }
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/BackgroundImage/lang/fa.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/BackgroundImage/lang/fa.js
deleted file mode 100644
index e4ebd57..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/BackgroundImage/lang/fa.js
+++ /dev/null
@@ -1,16 +0,0 @@
-// I18N constants
-// LANG: "fa", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Cancel": "انصراف",
-    "__OBSOLETE__": {
-        "___ TRANSLATOR NOTE   ___": "*** BACKGROUNDIMAGE IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***"
-    }
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/BackgroundImage/lang/fi.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/BackgroundImage/lang/fi.js
deleted file mode 100644
index 24e7b49..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/BackgroundImage/lang/fi.js
+++ /dev/null
@@ -1,16 +0,0 @@
-// I18N constants
-// LANG: "fi", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Cancel": "Peruuta",
-    "__OBSOLETE__": {
-        "___ TRANSLATOR NOTE   ___": "*** BACKGROUNDIMAGE IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***"
-    }
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/BackgroundImage/lang/fr.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/BackgroundImage/lang/fr.js
deleted file mode 100644
index 8b80cbf..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/BackgroundImage/lang/fr.js
+++ /dev/null
@@ -1,19 +0,0 @@
-// I18N constants
-// LANG: "fr", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Cancel": "Annuler",
-    "Remove Current Background": "Supprimer le fond actuel",
-    "Set Page Background Image": "Définir l'Image de Fond",
-    "Set page background image": "Définir l'image de fond",
-    "__OBSOLETE__": {
-        "___ TRANSLATOR NOTE   ___": "*** BACKGROUNDIMAGE IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***"
-    }
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/BackgroundImage/lang/fr_ca.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/BackgroundImage/lang/fr_ca.js
deleted file mode 100644
index e5628bf..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/BackgroundImage/lang/fr_ca.js
+++ /dev/null
@@ -1,15 +0,0 @@
-// I18N constants
-// LANG: "fr_ca", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "__OBSOLETE__": {
-        "___ TRANSLATOR NOTE   ___": "*** BACKGROUNDIMAGE IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***"
-    }
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/BackgroundImage/lang/gb.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/BackgroundImage/lang/gb.js
deleted file mode 100644
index f8a5b4e..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/BackgroundImage/lang/gb.js
+++ /dev/null
@@ -1,15 +0,0 @@
-// I18N constants
-// LANG: "gb", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "__OBSOLETE__": {
-        "___ TRANSLATOR NOTE   ___": "*** BACKGROUNDIMAGE IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***"
-    }
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/BackgroundImage/lang/he.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/BackgroundImage/lang/he.js
deleted file mode 100644
index 77a4792..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/BackgroundImage/lang/he.js
+++ /dev/null
@@ -1,16 +0,0 @@
-// I18N constants
-// LANG: "he", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Cancel": "ביטול",
-    "__OBSOLETE__": {
-        "___ TRANSLATOR NOTE   ___": "*** BACKGROUNDIMAGE IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***"
-    }
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/BackgroundImage/lang/hu.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/BackgroundImage/lang/hu.js
deleted file mode 100644
index 1d0767f..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/BackgroundImage/lang/hu.js
+++ /dev/null
@@ -1,16 +0,0 @@
-// I18N constants
-// LANG: "hu", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Cancel": "Mégsem",
-    "__OBSOLETE__": {
-        "___ TRANSLATOR NOTE   ___": "*** BACKGROUNDIMAGE IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***"
-    }
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/BackgroundImage/lang/it.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/BackgroundImage/lang/it.js
deleted file mode 100644
index ffeeca1..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/BackgroundImage/lang/it.js
+++ /dev/null
@@ -1,16 +0,0 @@
-// I18N constants
-// LANG: "it", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Cancel": "Annullamento",
-    "__OBSOLETE__": {
-        "___ TRANSLATOR NOTE   ___": "*** BACKGROUNDIMAGE IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***"
-    }
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/BackgroundImage/lang/ja.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/BackgroundImage/lang/ja.js
deleted file mode 100644
index ba1b217..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/BackgroundImage/lang/ja.js
+++ /dev/null
@@ -1,19 +0,0 @@
-// I18N constants
-// LANG: "ja", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Cancel": "中止",
-    "Remove Current Background": "現在の背景画像を除去",
-    "Set Page Background Image": "ページの背景画像を設定",
-    "Set page background image": "ページの背景画像を設定",
-    "__OBSOLETE__": {
-        "___ TRANSLATOR NOTE   ___": "*** BACKGROUNDIMAGE IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***"
-    }
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/BackgroundImage/lang/lc_base.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/BackgroundImage/lang/lc_base.js
deleted file mode 100644
index 269246f..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/BackgroundImage/lang/lc_base.js
+++ /dev/null
@@ -1,29 +0,0 @@
-// I18N constants
-//
-// LANG: "en", ENCODING: UTF-8
-// Author: Translator-Name, <email@example.com>
-//
-// Last revision: 2018-04-12
-// 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).
-//
-// (Please, remove information below)
-// 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.)
-
-{
-    "Cancel": "",
-    "Remove Current Background": "",
-    "Set Background": "",
-    "Set Page Background Image": "",
-    "Set page background image": ""
-}
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/BackgroundImage/lang/lt.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/BackgroundImage/lang/lt.js
deleted file mode 100644
index dae5a65..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/BackgroundImage/lang/lt.js
+++ /dev/null
@@ -1,16 +0,0 @@
-// I18N constants
-// LANG: "lt", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Cancel": "Atšaukti",
-    "__OBSOLETE__": {
-        "___ TRANSLATOR NOTE   ___": "*** BACKGROUNDIMAGE IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***"
-    }
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/BackgroundImage/lang/lv.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/BackgroundImage/lang/lv.js
deleted file mode 100644
index 339be0e..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/BackgroundImage/lang/lv.js
+++ /dev/null
@@ -1,16 +0,0 @@
-// I18N constants
-// LANG: "lv", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Cancel": "Atcelt",
-    "__OBSOLETE__": {
-        "___ TRANSLATOR NOTE   ___": "*** BACKGROUNDIMAGE IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***"
-    }
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/BackgroundImage/lang/nb.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/BackgroundImage/lang/nb.js
deleted file mode 100644
index bdf4472..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/BackgroundImage/lang/nb.js
+++ /dev/null
@@ -1,19 +0,0 @@
-// I18N constants
-// LANG: "nb", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Cancel": "Avbryt",
-    "Remove Current Background": "Fjern gjeldende bakgrunn",
-    "Set Page Background Image": "Velg bakgrunnsbilde på Siden",
-    "Set page background image": "Velg bakgrunnsbilde på siden",
-    "__OBSOLETE__": {
-        "___ TRANSLATOR NOTE   ___": "*** BACKGROUNDIMAGE IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***"
-    }
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/BackgroundImage/lang/nl.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/BackgroundImage/lang/nl.js
deleted file mode 100644
index ddaf340..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/BackgroundImage/lang/nl.js
+++ /dev/null
@@ -1,19 +0,0 @@
-// I18N constants
-// LANG: "nl", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Cancel": "Annuleren",
-    "Remove Current Background": "Huidige Achtergrond Afbeelding Verwijderen",
-    "Set Page Background Image": "Pagina Achtergrond Afbeelding Instellen",
-    "Set page background image": "Pagina achtergrond afbeelding instellen",
-    "__OBSOLETE__": {
-        "___ TRANSLATOR NOTE   ___": "*** BACKGROUNDIMAGE IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***"
-    }
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/BackgroundImage/lang/pl.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/BackgroundImage/lang/pl.js
deleted file mode 100644
index b3d9c93..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/BackgroundImage/lang/pl.js
+++ /dev/null
@@ -1,16 +0,0 @@
-// I18N constants
-// LANG: "pl", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Cancel": "Anuluj",
-    "__OBSOLETE__": {
-        "___ TRANSLATOR NOTE   ___": "*** BACKGROUNDIMAGE IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***"
-    }
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/BackgroundImage/lang/pt_br.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/BackgroundImage/lang/pt_br.js
deleted file mode 100644
index 1daf35d..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/BackgroundImage/lang/pt_br.js
+++ /dev/null
@@ -1,19 +0,0 @@
-// I18N constants
-// LANG: "pt_br", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Cancel": "Cancelar",
-    "Remove Current Background": "Remover fundo atual",
-    "Set Page Background Image": "Definir Imagem de Fundo",
-    "Set page background image": "Definir imagem de fundo",
-    "__OBSOLETE__": {
-        "___ TRANSLATOR NOTE   ___": "*** BACKGROUNDIMAGE IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***"
-    }
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/BackgroundImage/lang/ro.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/BackgroundImage/lang/ro.js
deleted file mode 100644
index 1091f09..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/BackgroundImage/lang/ro.js
+++ /dev/null
@@ -1,16 +0,0 @@
-// I18N constants
-// LANG: "ro", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Cancel": "Renunţă",
-    "__OBSOLETE__": {
-        "___ TRANSLATOR NOTE   ___": "*** BACKGROUNDIMAGE IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***"
-    }
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/BackgroundImage/lang/ru.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/BackgroundImage/lang/ru.js
deleted file mode 100644
index 247fe4e..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/BackgroundImage/lang/ru.js
+++ /dev/null
@@ -1,16 +0,0 @@
-// I18N constants
-// LANG: "ru", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Cancel": "Отмена",
-    "__OBSOLETE__": {
-        "___ TRANSLATOR NOTE   ___": "*** BACKGROUNDIMAGE IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***"
-    }
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/BackgroundImage/lang/sh.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/BackgroundImage/lang/sh.js
deleted file mode 100644
index 2dc8fb2..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/BackgroundImage/lang/sh.js
+++ /dev/null
@@ -1,16 +0,0 @@
-// I18N constants
-// LANG: "sh", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Cancel": "Poništi",
-    "__OBSOLETE__": {
-        "___ TRANSLATOR NOTE   ___": "*** BACKGROUNDIMAGE IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***"
-    }
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/BackgroundImage/lang/si.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/BackgroundImage/lang/si.js
deleted file mode 100644
index 65140e8..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/BackgroundImage/lang/si.js
+++ /dev/null
@@ -1,16 +0,0 @@
-// I18N constants
-// LANG: "si", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Cancel": "Prekliči",
-    "__OBSOLETE__": {
-        "___ TRANSLATOR NOTE   ___": "*** BACKGROUNDIMAGE IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***"
-    }
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/BackgroundImage/lang/sr.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/BackgroundImage/lang/sr.js
deleted file mode 100644
index 48046b1..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/BackgroundImage/lang/sr.js
+++ /dev/null
@@ -1,16 +0,0 @@
-// I18N constants
-// LANG: "sr", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Cancel": "Поништи",
-    "__OBSOLETE__": {
-        "___ TRANSLATOR NOTE   ___": "*** BACKGROUNDIMAGE IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***"
-    }
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/BackgroundImage/lang/sv.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/BackgroundImage/lang/sv.js
deleted file mode 100644
index 0b511b8..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/BackgroundImage/lang/sv.js
+++ /dev/null
@@ -1,16 +0,0 @@
-// I18N constants
-// LANG: "sv", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Cancel": "Avbryt",
-    "__OBSOLETE__": {
-        "___ TRANSLATOR NOTE   ___": "*** BACKGROUNDIMAGE IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***"
-    }
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/BackgroundImage/lang/th.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/BackgroundImage/lang/th.js
deleted file mode 100644
index 938997e..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/BackgroundImage/lang/th.js
+++ /dev/null
@@ -1,16 +0,0 @@
-// I18N constants
-// LANG: "th", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Cancel": "ยกเลิก",
-    "__OBSOLETE__": {
-        "___ TRANSLATOR NOTE   ___": "*** BACKGROUNDIMAGE IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***"
-    }
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/BackgroundImage/lang/tr.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/BackgroundImage/lang/tr.js
deleted file mode 100644
index 1883286..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/BackgroundImage/lang/tr.js
+++ /dev/null
@@ -1,16 +0,0 @@
-// I18N constants
-// LANG: "tr", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Cancel": "İptal",
-    "__OBSOLETE__": {
-        "___ TRANSLATOR NOTE   ___": "*** BACKGROUNDIMAGE IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***"
-    }
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/BackgroundImage/lang/vn.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/BackgroundImage/lang/vn.js
deleted file mode 100644
index b386a93..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/BackgroundImage/lang/vn.js
+++ /dev/null
@@ -1,16 +0,0 @@
-// I18N constants
-// LANG: "vn", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Cancel": "Hủy",
-    "__OBSOLETE__": {
-        "___ TRANSLATOR NOTE   ___": "*** BACKGROUNDIMAGE IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***"
-    }
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/BackgroundImage/lang/zh_cn.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/BackgroundImage/lang/zh_cn.js
deleted file mode 100644
index 76050f3..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/BackgroundImage/lang/zh_cn.js
+++ /dev/null
@@ -1,15 +0,0 @@
-// I18N constants
-// LANG: "zh_cn", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "__OBSOLETE__": {
-        "___ TRANSLATOR NOTE   ___": "*** BACKGROUNDIMAGE IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***"
-    }
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ClientsideSpellcheck/ClientsideSpellcheck.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ClientsideSpellcheck/ClientsideSpellcheck.js
deleted file mode 100644
index 8742bb4..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ClientsideSpellcheck/ClientsideSpellcheck.js
+++ /dev/null
@@ -1,62 +0,0 @@
-// IE Spell Implementation for XINHA

-//Client-side spell check plugin

-//This implements the API for ieSpell, which is owned by Red Egg Software 

-//For more info about ieSpell, go to http://www.iespell.com/index.htm

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

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

-

-

-function ClientsideSpellcheck(editor) {

-  this.editor = editor;

-

-  var cfg = editor.config;

-  var bl = ClientsideSpellcheck.btnList;

-  var self = this;

-

-  // see if we can find the mode switch button, insert this before that

-  var id = "clientsidespellcheck";

-  

-  

-  cfg.registerButton(id, this._lc("Spell Check using ieSpell"), editor.imgURL("clientside-spellcheck.gif", "ClientsideSpellcheck"), false,

-             function(editor, id) {

-               // dispatch button press event

-               self.buttonPress(editor, id);

-             });

-

-  if(Xinha.is_ie) {

-    cfg.addToolbarElement("clientsidespellcheck", "print", 1);

-}

-

-}

-

-ClientsideSpellcheck._pluginInfo = {

-  name          : "ClientsideSpellcheck",

-  version       : "1.0",

-  developer     : "Michael Harris",

-  developer_url : "http://www.jonesinternational.edu",

-  c_owner       : "Red Egg Software",

-  sponsor       : "Jones International University",

-  sponsor_url   : "http://www.jonesinternational.edu",

-  license       : "htmlArea"

-};

-

-

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

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

-};

-

-ClientsideSpellcheck.prototype.buttonPress = function(editor) {

-

-	try {

-		var tmpis = new ActiveXObject("ieSpell.ieSpellExtension");

-		tmpis.CheckAllLinkedDocuments(document);

-	}

-	catch(exception) {

- 		if(exception.number==-2146827859) {

-			if (confirm(this.lc("ieSpell not detected.  Click Ok to go to download page.")))

-				window.open("http://www.iespell.com/download.php","DownLoad");

-		} else {

-			alert(this.lc("ieSpell can only be used in Internet Explorer"));

-		}

-	}

-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ClientsideSpellcheck/img/clientside-spellcheck.gif b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ClientsideSpellcheck/img/clientside-spellcheck.gif
deleted file mode 100644
index dc8435c..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ClientsideSpellcheck/img/clientside-spellcheck.gif
+++ /dev/null
Binary files differ
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ClientsideSpellcheck/img/he-spell-check.gif b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ClientsideSpellcheck/img/he-spell-check.gif
deleted file mode 100644
index 8015d2f..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ClientsideSpellcheck/img/he-spell-check.gif
+++ /dev/null
Binary files differ
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ClientsideSpellcheck/lang/b5.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ClientsideSpellcheck/lang/b5.js
deleted file mode 100644
index aa2677a..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ClientsideSpellcheck/lang/b5.js
+++ /dev/null
@@ -1,15 +0,0 @@
-// I18N constants
-// LANG: "b5", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "__OBSOLETE__": {
-        "___ TRANSLATOR NOTE   ___": "*** CLIENTSIDESPELLCHECK IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***"
-    }
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ClientsideSpellcheck/lang/ch.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ClientsideSpellcheck/lang/ch.js
deleted file mode 100644
index ad413af..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ClientsideSpellcheck/lang/ch.js
+++ /dev/null
@@ -1,15 +0,0 @@
-// I18N constants
-// LANG: "ch", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "__OBSOLETE__": {
-        "___ TRANSLATOR NOTE   ___": "*** CLIENTSIDESPELLCHECK IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***"
-    }
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ClientsideSpellcheck/lang/cz.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ClientsideSpellcheck/lang/cz.js
deleted file mode 100644
index 83063a7..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ClientsideSpellcheck/lang/cz.js
+++ /dev/null
@@ -1,15 +0,0 @@
-// I18N constants
-// LANG: "cz", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "__OBSOLETE__": {
-        "___ TRANSLATOR NOTE   ___": "*** CLIENTSIDESPELLCHECK IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***"
-    }
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ClientsideSpellcheck/lang/da.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ClientsideSpellcheck/lang/da.js
deleted file mode 100644
index 0eb3c2e..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ClientsideSpellcheck/lang/da.js
+++ /dev/null
@@ -1,15 +0,0 @@
-// I18N constants
-// LANG: "da", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "__OBSOLETE__": {
-        "___ TRANSLATOR NOTE   ___": "*** CLIENTSIDESPELLCHECK IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***"
-    }
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ClientsideSpellcheck/lang/de.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ClientsideSpellcheck/lang/de.js
deleted file mode 100644
index 77710ed..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ClientsideSpellcheck/lang/de.js
+++ /dev/null
@@ -1,17 +0,0 @@
-// I18N constants
-// LANG: "de", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Spell Check using ieSpell": "Englische Rechtschreibkontrolle mit ieSpell",
-    "__OBSOLETE__": {
-        "ieSpell can only be used in Internet Explorer": "ieSpell kann nur mit dem Internet Explorer benutzt werden",
-        "ieSpell not detected.  Click Ok to go to download page.": "ieSpell wurde nicht gefunden. Drücken sie Ok um ieSpeck herunter zu laden."
-    }
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ClientsideSpellcheck/lang/ee.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ClientsideSpellcheck/lang/ee.js
deleted file mode 100644
index cfd19f5..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ClientsideSpellcheck/lang/ee.js
+++ /dev/null
@@ -1,15 +0,0 @@
-// I18N constants
-// LANG: "ee", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "__OBSOLETE__": {
-        "___ TRANSLATOR NOTE   ___": "*** CLIENTSIDESPELLCHECK IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***"
-    }
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ClientsideSpellcheck/lang/el.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ClientsideSpellcheck/lang/el.js
deleted file mode 100644
index ac3d982..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ClientsideSpellcheck/lang/el.js
+++ /dev/null
@@ -1,15 +0,0 @@
-// I18N constants
-// LANG: "el", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "__OBSOLETE__": {
-        "___ TRANSLATOR NOTE   ___": "*** CLIENTSIDESPELLCHECK IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***"
-    }
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ClientsideSpellcheck/lang/es.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ClientsideSpellcheck/lang/es.js
deleted file mode 100644
index e4d035f..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ClientsideSpellcheck/lang/es.js
+++ /dev/null
@@ -1,15 +0,0 @@
-// I18N constants
-// LANG: "es", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "__OBSOLETE__": {
-        "___ TRANSLATOR NOTE   ___": "*** CLIENTSIDESPELLCHECK IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***"
-    }
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ClientsideSpellcheck/lang/eu.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ClientsideSpellcheck/lang/eu.js
deleted file mode 100644
index 52aee44..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ClientsideSpellcheck/lang/eu.js
+++ /dev/null
@@ -1,15 +0,0 @@
-// I18N constants
-// LANG: "eu", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "__OBSOLETE__": {
-        "___ TRANSLATOR NOTE   ___": "*** CLIENTSIDESPELLCHECK IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***"
-    }
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ClientsideSpellcheck/lang/fa.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ClientsideSpellcheck/lang/fa.js
deleted file mode 100644
index d3ac7b6..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ClientsideSpellcheck/lang/fa.js
+++ /dev/null
@@ -1,15 +0,0 @@
-// I18N constants
-// LANG: "fa", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "__OBSOLETE__": {
-        "___ TRANSLATOR NOTE   ___": "*** CLIENTSIDESPELLCHECK IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***"
-    }
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ClientsideSpellcheck/lang/fi.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ClientsideSpellcheck/lang/fi.js
deleted file mode 100644
index f422d92..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ClientsideSpellcheck/lang/fi.js
+++ /dev/null
@@ -1,15 +0,0 @@
-// I18N constants
-// LANG: "fi", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "__OBSOLETE__": {
-        "___ TRANSLATOR NOTE   ___": "*** CLIENTSIDESPELLCHECK IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***"
-    }
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ClientsideSpellcheck/lang/fr.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ClientsideSpellcheck/lang/fr.js
deleted file mode 100644
index 867f5a7..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ClientsideSpellcheck/lang/fr.js
+++ /dev/null
@@ -1,15 +0,0 @@
-// I18N constants
-// LANG: "fr", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "__OBSOLETE__": {
-        "___ TRANSLATOR NOTE   ___": "*** CLIENTSIDESPELLCHECK IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***"
-    }
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ClientsideSpellcheck/lang/fr_ca.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ClientsideSpellcheck/lang/fr_ca.js
deleted file mode 100644
index e3e712a..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ClientsideSpellcheck/lang/fr_ca.js
+++ /dev/null
@@ -1,15 +0,0 @@
-// I18N constants
-// LANG: "fr_ca", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "__OBSOLETE__": {
-        "___ TRANSLATOR NOTE   ___": "*** CLIENTSIDESPELLCHECK IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***"
-    }
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ClientsideSpellcheck/lang/gb.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ClientsideSpellcheck/lang/gb.js
deleted file mode 100644
index 8766607..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ClientsideSpellcheck/lang/gb.js
+++ /dev/null
@@ -1,15 +0,0 @@
-// I18N constants
-// LANG: "gb", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "__OBSOLETE__": {
-        "___ TRANSLATOR NOTE   ___": "*** CLIENTSIDESPELLCHECK IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***"
-    }
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ClientsideSpellcheck/lang/he.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ClientsideSpellcheck/lang/he.js
deleted file mode 100644
index 5db73b2..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ClientsideSpellcheck/lang/he.js
+++ /dev/null
@@ -1,15 +0,0 @@
-// I18N constants
-// LANG: "he", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "__OBSOLETE__": {
-        "___ TRANSLATOR NOTE   ___": "*** CLIENTSIDESPELLCHECK IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***"
-    }
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ClientsideSpellcheck/lang/hu.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ClientsideSpellcheck/lang/hu.js
deleted file mode 100644
index 39f6203..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ClientsideSpellcheck/lang/hu.js
+++ /dev/null
@@ -1,15 +0,0 @@
-// I18N constants
-// LANG: "hu", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "__OBSOLETE__": {
-        "___ TRANSLATOR NOTE   ___": "*** CLIENTSIDESPELLCHECK IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***"
-    }
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ClientsideSpellcheck/lang/it.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ClientsideSpellcheck/lang/it.js
deleted file mode 100644
index 846d649..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ClientsideSpellcheck/lang/it.js
+++ /dev/null
@@ -1,15 +0,0 @@
-// I18N constants
-// LANG: "it", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "__OBSOLETE__": {
-        "___ TRANSLATOR NOTE   ___": "*** CLIENTSIDESPELLCHECK IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***"
-    }
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ClientsideSpellcheck/lang/ja.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ClientsideSpellcheck/lang/ja.js
deleted file mode 100644
index e520c66..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ClientsideSpellcheck/lang/ja.js
+++ /dev/null
@@ -1,17 +0,0 @@
-// I18N constants
-// LANG: "ja", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Spell Check using ieSpell": "スペルチェックに ieSpell を使う",
-    "__OBSOLETE__": {
-        "ieSpell can only be used in Internet Explorer": "ieSpell は Internet Explorer でのみ使用できます",
-        "ieSpell not detected.  Click Ok to go to download page.": "ieSpell が検知されませんでした。OK をクリックしてダウンロードページを開いてください。"
-    }
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ClientsideSpellcheck/lang/lc_base.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ClientsideSpellcheck/lang/lc_base.js
deleted file mode 100644
index f43fa36..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ClientsideSpellcheck/lang/lc_base.js
+++ /dev/null
@@ -1,25 +0,0 @@
-// I18N constants
-//
-// LANG: "en", ENCODING: UTF-8
-// Author: Translator-Name, <email@example.com>
-//
-// Last revision: 2018-04-12
-// 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).
-//
-// (Please, remove information below)
-// 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.)
-
-{
-    "Spell Check using ieSpell": ""
-}
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ClientsideSpellcheck/lang/lt.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ClientsideSpellcheck/lang/lt.js
deleted file mode 100644
index 1dbbd1b..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ClientsideSpellcheck/lang/lt.js
+++ /dev/null
@@ -1,15 +0,0 @@
-// I18N constants
-// LANG: "lt", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "__OBSOLETE__": {
-        "___ TRANSLATOR NOTE   ___": "*** CLIENTSIDESPELLCHECK IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***"
-    }
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ClientsideSpellcheck/lang/lv.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ClientsideSpellcheck/lang/lv.js
deleted file mode 100644
index 6d8887a..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ClientsideSpellcheck/lang/lv.js
+++ /dev/null
@@ -1,15 +0,0 @@
-// I18N constants
-// LANG: "lv", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "__OBSOLETE__": {
-        "___ TRANSLATOR NOTE   ___": "*** CLIENTSIDESPELLCHECK IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***"
-    }
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ClientsideSpellcheck/lang/nb.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ClientsideSpellcheck/lang/nb.js
deleted file mode 100644
index 4c8ce4f..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ClientsideSpellcheck/lang/nb.js
+++ /dev/null
@@ -1,15 +0,0 @@
-// I18N constants
-// LANG: "nb", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "__OBSOLETE__": {
-        "___ TRANSLATOR NOTE   ___": "*** CLIENTSIDESPELLCHECK IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***"
-    }
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ClientsideSpellcheck/lang/nl.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ClientsideSpellcheck/lang/nl.js
deleted file mode 100644
index a9d0f68..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ClientsideSpellcheck/lang/nl.js
+++ /dev/null
@@ -1,17 +0,0 @@
-// I18N constants
-// LANG: "nl", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Spell Check using ieSpell": "Engelse spellingscontrole met ieSpell",
-    "__OBSOLETE__": {
-        "ieSpell can only be used in Internet Explorer": "ieSpell kan alleen worden gebruikt in Internet Explorer",
-        "ieSpell not detected.  Click Ok to go to download page.": "ieSpell werd niet gevonden. Klik op Ok om ieSpell te downloaden"
-    }
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ClientsideSpellcheck/lang/pl.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ClientsideSpellcheck/lang/pl.js
deleted file mode 100644
index 356815d..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ClientsideSpellcheck/lang/pl.js
+++ /dev/null
@@ -1,15 +0,0 @@
-// I18N constants
-// LANG: "pl", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "__OBSOLETE__": {
-        "___ TRANSLATOR NOTE   ___": "*** CLIENTSIDESPELLCHECK IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***"
-    }
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ClientsideSpellcheck/lang/pt_br.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ClientsideSpellcheck/lang/pt_br.js
deleted file mode 100644
index eab7855..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ClientsideSpellcheck/lang/pt_br.js
+++ /dev/null
@@ -1,13 +0,0 @@
-// I18N constants
-// LANG: "pt_br", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Spell Check using ieSpell": "Verificação Ortográfica utilizando ieSpell"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ClientsideSpellcheck/lang/ro.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ClientsideSpellcheck/lang/ro.js
deleted file mode 100644
index f2124d4..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ClientsideSpellcheck/lang/ro.js
+++ /dev/null
@@ -1,15 +0,0 @@
-// I18N constants
-// LANG: "ro", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "__OBSOLETE__": {
-        "___ TRANSLATOR NOTE   ___": "*** CLIENTSIDESPELLCHECK IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***"
-    }
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ClientsideSpellcheck/lang/ru.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ClientsideSpellcheck/lang/ru.js
deleted file mode 100644
index c7aaa27..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ClientsideSpellcheck/lang/ru.js
+++ /dev/null
@@ -1,15 +0,0 @@
-// I18N constants
-// LANG: "ru", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "__OBSOLETE__": {
-        "___ TRANSLATOR NOTE   ___": "*** CLIENTSIDESPELLCHECK IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***"
-    }
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ClientsideSpellcheck/lang/sh.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ClientsideSpellcheck/lang/sh.js
deleted file mode 100644
index cc5c960..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ClientsideSpellcheck/lang/sh.js
+++ /dev/null
@@ -1,15 +0,0 @@
-// I18N constants
-// LANG: "sh", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "__OBSOLETE__": {
-        "___ TRANSLATOR NOTE   ___": "*** CLIENTSIDESPELLCHECK IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***"
-    }
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ClientsideSpellcheck/lang/si.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ClientsideSpellcheck/lang/si.js
deleted file mode 100644
index 5535ceb..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ClientsideSpellcheck/lang/si.js
+++ /dev/null
@@ -1,15 +0,0 @@
-// I18N constants
-// LANG: "si", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "__OBSOLETE__": {
-        "___ TRANSLATOR NOTE   ___": "*** CLIENTSIDESPELLCHECK IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***"
-    }
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ClientsideSpellcheck/lang/sr.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ClientsideSpellcheck/lang/sr.js
deleted file mode 100644
index 408eeed..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ClientsideSpellcheck/lang/sr.js
+++ /dev/null
@@ -1,15 +0,0 @@
-// I18N constants
-// LANG: "sr", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "__OBSOLETE__": {
-        "___ TRANSLATOR NOTE   ___": "*** CLIENTSIDESPELLCHECK IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***"
-    }
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ClientsideSpellcheck/lang/sv.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ClientsideSpellcheck/lang/sv.js
deleted file mode 100644
index de9410d..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ClientsideSpellcheck/lang/sv.js
+++ /dev/null
@@ -1,15 +0,0 @@
-// I18N constants
-// LANG: "sv", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "__OBSOLETE__": {
-        "___ TRANSLATOR NOTE   ___": "*** CLIENTSIDESPELLCHECK IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***"
-    }
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ClientsideSpellcheck/lang/th.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ClientsideSpellcheck/lang/th.js
deleted file mode 100644
index 94e233a..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ClientsideSpellcheck/lang/th.js
+++ /dev/null
@@ -1,15 +0,0 @@
-// I18N constants
-// LANG: "th", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "__OBSOLETE__": {
-        "___ TRANSLATOR NOTE   ___": "*** CLIENTSIDESPELLCHECK IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***"
-    }
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ClientsideSpellcheck/lang/tr.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ClientsideSpellcheck/lang/tr.js
deleted file mode 100644
index 007f16f..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ClientsideSpellcheck/lang/tr.js
+++ /dev/null
@@ -1,15 +0,0 @@
-// I18N constants
-// LANG: "tr", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "__OBSOLETE__": {
-        "___ TRANSLATOR NOTE   ___": "*** CLIENTSIDESPELLCHECK IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***"
-    }
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ClientsideSpellcheck/lang/vn.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ClientsideSpellcheck/lang/vn.js
deleted file mode 100644
index b16fed9..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ClientsideSpellcheck/lang/vn.js
+++ /dev/null
@@ -1,15 +0,0 @@
-// I18N constants
-// LANG: "vn", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "__OBSOLETE__": {
-        "___ TRANSLATOR NOTE   ___": "*** CLIENTSIDESPELLCHECK IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***"
-    }
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ClientsideSpellcheck/lang/zh_cn.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ClientsideSpellcheck/lang/zh_cn.js
deleted file mode 100644
index eb5701a..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ClientsideSpellcheck/lang/zh_cn.js
+++ /dev/null
@@ -1,15 +0,0 @@
-// I18N constants
-// LANG: "zh_cn", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "__OBSOLETE__": {
-        "___ TRANSLATOR NOTE   ___": "*** CLIENTSIDESPELLCHECK IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***"
-    }
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/DoubleClick/DoubleClick.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/DoubleClick/DoubleClick.js
deleted file mode 100644
index 41ea0ab..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/DoubleClick/DoubleClick.js
+++ /dev/null
@@ -1,62 +0,0 @@
-// Double Click Plugin for Xinha

-// Implementation by Marijn Kampf http://www.marijn.org

-// Sponsored by http://www.smiling-faces.com

-//

-// (c) Marijn Kampf 2004.

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

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

-//

-// Cut-n-paste version of double click plugin.

-// Almost no original code used. Based on

-// Luis HTMLarea and Mihai Bazon Context Menu

-//

-//

-//

-

-DoubleClick._pluginInfo = {

-  name          : "DoubleClick",

-  version       : "1.1",

-  developer     : "Marijn Kampf",

-  developer_url : "http://www.marijn.org",

-  c_owner       : "Marijn Kampf",

-  sponsor       : "smiling-faces.com",

-  sponsor_url   : "http://www.smiling-faces.com",

-  license       : "htmlArea"

-};

-

-function DoubleClick(editor) {

-  this.editor = editor;

-

-  // ADDING CUSTOM DOUBLE CLICK ACTIONS

-  // format of the dblClickList elements is "TAGNAME: [ ACTION ]"

-  //    - TAGNAME: tagname of the tag that is double clicked

-  //    - ACTION: function that gets called when the button is clicked.

-  //              it has the following prototype:

-  //                 function(editor, event)

-  //              - editor is the Xinha object that triggered the call

-  //              - target is the selected object

-  this.editor.dblClickList = {

-    // Edit Link dialog

-    a: [ function(e, target) {e.execCommand("createlink", false, target);} ],

-    // Follow link

-    //a: [ function(editor, target) { window.location = target.href; properties(target); } ],

-

-    img: [ function(e) {e.execCommand("insertimage");} ],

-    td: [ function(e) {e.execCommand("inserttable");} ]

-  };

-}

-

-DoubleClick.prototype.onGenerate = function() {

-  var self = this;

-  var config = this.editor.config;

-  for( var i in this.editor.dblClickList ) {

-      if( typeof i != 'string' ) {

-	  continue;

-      }

-      var actions = this.editor.dblClickList[i];

-      if( typeof actions != 'object' ) {

-	  continue;

-      }

-      this.editor.config.dblclickList[i] = actions;

-  }

-};

diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ExtendedFileManager/Classes/ExtendedFileManager.php b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ExtendedFileManager/Classes/ExtendedFileManager.php
deleted file mode 100644
index 56e267e..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ExtendedFileManager/Classes/ExtendedFileManager.php
+++ /dev/null
@@ -1,819 +0,0 @@
-<?php
-/**
- * ExtendedFileManager, list images, directories, and thumbnails.
- * Authors: Wei Zhuo, Afru, Krzysztof Kotowicz, Raimund Meyer
- * Version: Updated on 08-01-2005 by Afru
- * Version: Updated on 04-07-2006 by Krzysztof Kotowicz
- * Version: Updated on 29-10-2006 by Raimund Meyer
- * Package: ExtendedFileManager (EFM 1.1.3)
- * http://www.afrusoft.com/htmlarea
- */
-
-/**
- * We use classes from ImageManager to avoid code duplication
- */
-require_once '../ImageManager/Classes/Files.php';
-
-/**
- * ExtendedFileManager Class.
- * @author Wei Zhuo, Afru, Krzysztof Kotowicz, Raimund Meyer
- * @version $Id: ExtendedFileManager.php 1171 2009-03-19 22:06:09Z ray $
- */
-class ExtendedFileManager 
-{
-	/**
-	 * Configuration array.
-	 */
-	var $config;
-
-	/**
-	 * Array of directory information.
-	 */
-	var $dirs;
-	
-    /**
-     * Manager mode - image | link
-     */
-	var $mode;
-
-	/**
-	 * Constructor. Create a new Image Manager instance.
-	 * @param array $config configuration array, see config.inc.php
-	 */
-	function ExtendedFileManager($config, $mode = null)
-	{
-		$this->config = $config;
-		
-		$this->mode = empty($mode) ? (empty($config['insert_mode']) ? 'image' : $config['insert_mode']): $mode;
-	}
-
-	/**
-	 * Get the base directory.
-	 * @return string base dir, see config.inc.php
-	 */
-	function getImagesDir()
-	{
-		if ($this->mode == 'link' && isset($this->config['files_dir']))
-			Return $this->config['files_dir'];
-		else Return $this->config['images_dir'];
-	}
-
-	/**
-	 * Get the base URL.
-	 * @return string base url, see config.inc.php
-	 */
-	function getImagesURL()
-	{
-		if ($this->mode == 'link' && isset($this->config['files_url']))
-				Return $this->config['files_url'];
-		else Return $this->config['images_url'];
-	}
-
-	function isValidBase()
-	{
-		return is_dir($this->getImagesDir());
-	}
-
-	/**
-	 * Get the tmp file prefix.
-     * @return string tmp file prefix.
-	 */
-	function getTmpPrefix() 
-	{
-		Return $this->config['tmp_prefix'];
-	}
-
-	/**
-	 * Get the sub directories in the base dir.
-	 * Each array element contain
-	 * the relative path (relative to the base dir) as key and the 
-	 * full path as value.
-	 * @return array of sub directries
-	 * <code>array('path name' => 'full directory path', ...)</code>
-	 */
-	function getDirs() 
-	{
-		if(is_null($this->dirs))
-		{
-			$dirs = $this->_dirs($this->getImagesDir(),'/');
-			ksort($dirs);
-			$this->dirs = $dirs;
-		}
-		return $this->dirs;
-	}
-
-	/**
-	 * Recursively travese the directories to get a list
-	 * of accessable directories.
-	 * @param string $base the full path to the current directory
-	 * @param string $path the relative path name
-	 * @return array of accessiable sub-directories
-	 * <code>array('path name' => 'full directory path', ...)</code>
-	 */
-	function _dirs($base, $path) 
-	{
-		$base = Files::fixPath($base);
-		$dirs = array();
-
-		if($this->isValidBase() == false)
-			return $dirs;
-
-		$d = @dir($base);
-		
-		while (false !== ($entry = $d->read())) 
-		{
-			//If it is a directory, and it doesn't start with
-			// a dot, and if is it not the thumbnail directory
-			if(is_dir($base.$entry) 
-				&& substr($entry,0,1) != '.'
-				&& $this->isThumbDir($entry) == false) 
-			{
-				$relative = Files::fixPath($path.$entry);
-				$fullpath = Files::fixPath($base.$entry);
-				$dirs[$relative] = $fullpath;
-				$dirs = array_merge($dirs, $this->_dirs($fullpath, $relative));
-			}
-		}
-		$d->close();
-
-		Return $dirs;
-	}
-
-	/**
-	 * Get all the files and directories of a relative path.
-	 * @param string $path relative path to be base path.
-	 * @return array of file and path information.
-	 * <code>array(0=>array('relative'=>'fullpath',...), 1=>array('filename'=>fileinfo array(),...)</code>
-	 * fileinfo array: <code>array('url'=>'full url', 
-	 *                       'relative'=>'relative to base', 
-	 *                        'fullpath'=>'full file path', 
-	 *                        'image'=>imageInfo array() false if not image,
-	 *                        'stat' => filestat)</code>
-	 */
-	function getFiles($path) 
-	{
-		$files = array();
-		$dirs = array();
-
-        $valid_extensions = $this->mode == 'image' ? $this->config['allowed_image_extensions'] : $this->config['allowed_link_extensions'];
-
-		if($this->isValidBase() == false)
-			return array($files,$dirs);
-
-		$path = Files::fixPath($path);
-		$base = Files::fixPath($this->getImagesDir());
-		$fullpath = Files::makePath($base,$path);
-
-
-		$d = @dir($fullpath);
-		
-		while (false !== ($entry = $d->read())) 
-		{
-			//not a dot file or directory
-			if(substr($entry,0,1) != '.')
-			{
-				if(is_dir($fullpath.$entry)
-					&& $this->isThumbDir($entry) == false)
-				{
-					$relative = Files::fixPath($path.$entry);
-					$full = Files::fixPath($fullpath.$entry);
-					$count = $this->countFiles($full);
-					$dirs[$relative] = array('fullpath'=>$full,'entry'=>$entry,'count'=>$count, 'stat'=>stat($fullpath.$entry));
-				}
-
-				else if(is_file($fullpath.$entry) && $this->isThumb($entry)==false && $this->isTmpFile($entry) == false) 
-				{
-					$afruext = strtolower(substr(strrchr($entry, "."), 1));
-
-                    if(in_array($afruext,$valid_extensions))
-					{
-
-						$file['url'] = Files::makePath($this->config['base_url'],$path).$entry;
-						$file['relative'] = $path.$entry;
-						$file['fullpath'] = $fullpath.$entry;
-						$img = $this->getImageInfo($fullpath.$entry);
-						if(!is_array($img)) $img[0]=$img[1]=0;
-						$file['image'] = $img;
-						$file['stat'] = stat($fullpath.$entry);
-						$file['ext'] = $afruext;
-						$files[$entry] = $file;
-					}
-
-				}
-			}
-		}
-		$d->close();
-		ksort($dirs);
-		ksort($files);
-		
-		Return array($dirs, $files);
-	}	
-
-	/**
-	 * Count the number of files and directories in a given folder
-	 * minus the thumbnail folders and thumbnails.
-	 */
-	function countFiles($path) 
-	{
-		$total = 0;
-
-		if(is_dir($path)) 
-		{
-			$d = @dir($path);
-
-			while (false !== ($entry = $d->read())) 
-			{
-				//echo $entry."<br>";
-				if(substr($entry,0,1) != '.'
-					&& $this->isThumbDir($entry) == false
-					&& $this->isTmpFile($entry) == false
-					&& $this->isThumb($entry) == false) 
-				{
-					$total++;
-				}
-			}
-			$d->close();
-		}
-		return $total;
-	}
-
-	/**
-	 * Get image size information.
-	 * @param string $file the image file
-	 * @return array of getImageSize information, 
-	 *  false if the file is not an image.
-	 */
-	function getImageInfo($file) 
-	{
-		Return @getImageSize($file);
-	}
-
-	/**
-	 * Check if the file contains the thumbnail prefix.
-	 * @param string $file filename to be checked
-	 * @return true if the file contains the thumbnail prefix, false otherwise.
-	 */
-	function isThumb($file) 
-	{
-		$len = strlen($this->config['thumbnail_prefix']);
-		if(substr($file,0,$len)==$this->config['thumbnail_prefix'])
-			Return true;
-		else
-			Return false;
-	}
-
-	/**
-	 * Check if the given directory is a thumbnail directory.
-	 * @param string $entry directory name
-	 * @return true if it is a thumbnail directory, false otherwise
-	 */
-	function isThumbDir($entry) 
-	{
-		if($this->config['thumbnail_dir'] == false
-			|| strlen(trim($this->config['thumbnail_dir'])) == 0)
-			Return false;		
-		else
-			Return ($entry == $this->config['thumbnail_dir']);
-	}
-
-	/**
-	 * Check if the given file is a tmp file.
-	 * @param string $file file name
-	 * @return boolean true if it is a tmp file, false otherwise
-	 */
-	function isTmpFile($file) 
-	{
-		$len = strlen($this->config['tmp_prefix']);
-		if(substr($file,0,$len)==$this->config['tmp_prefix'])
-			Return true;
-		else
-			Return false;	 	
-	}
-
-	/**
-	 * For a given image file, get the respective thumbnail filename
-	 * no file existence check is done.
-	 * @param string $fullpathfile the full path to the image file
-	 * @return string of the thumbnail file
-	 */
-	function getThumbName($fullpathfile) 
-	{
-		$path_parts = pathinfo($fullpathfile);
-		
-		$thumbnail = $this->config['thumbnail_prefix'].$path_parts['basename'];
-
-		if($this->config['safe_mode'] == true
-			|| strlen(trim($this->config['thumbnail_dir'])) == 0)
-		{
-			Return Files::makeFile($path_parts['dirname'],$thumbnail);
-		}
-		else
-		{
-			if(strlen(trim($this->config['thumbnail_dir'])) > 0)
-			{
-				$path = Files::makePath($path_parts['dirname'],$this->config['thumbnail_dir']);
-				if(!is_dir($path))
-					Files::createFolder($path);
-				Return Files::makeFile($path,$thumbnail);
-			}
-			else //should this ever happen?
-			{
-				//error_log('ExtendedFileManager: Error in creating thumbnail name');
-			}
-		}
-	}
-	
-	/**
-	 * Similar to getThumbName, but returns the URL, base on the
-	 * given base_url in config.inc.php
-	 * @param string $relative the relative image file name, 
-	 * relative to the base_dir path
-	 * @return string the url of the thumbnail
-	 */
-	function getThumbURL($relative) 
-	{
-		$path_parts = pathinfo($relative);
-		$thumbnail = $this->config['thumbnail_prefix'].$path_parts['basename'];
-		if($path_parts['dirname']=='\\') $path_parts['dirname']='/';
-
-		if($this->config['safe_mode'] == true
-			|| strlen(trim($this->config['thumbnail_dir'])) == 0)
-		{
-			Return Files::makeFile($this->getImagesURL(),$thumbnail);
-		}
-		else
-		{
-			if(strlen(trim($this->config['thumbnail_dir'])) > 0)
-			{
-				$path = Files::makePath($path_parts['dirname'],$this->config['thumbnail_dir']);
-				$url_path = Files::makePath($this->getImagesURL(), $path);
-				Return Files::makeFile($url_path,$thumbnail);
-			}
-			else //should this ever happen?
-			{
-				//error_log('ExtendedFileManager: Error in creating thumbnail url');
-			}
-
-		}
-	}
-
-   /**
-    * For a given image file, get the respective resized filename
-    * no file existence check is done.
-    * @param string $fullpathfile the full path to the image file
-    * @param integer $width the intended width
-    * @param integer $height the intended height
-    * @param boolean $mkDir whether to attempt to make the resized_dir if it doesn't exist
-    * @return string of the resized filename
-    */
-	function getResizedName($fullpathfile, $width, $height, $mkDir = TRUE)
-	{
-		$path_parts = pathinfo($fullpathfile);
-
-		$thumbnail = $this->config['resized_prefix']."_{$width}x{$height}_{$path_parts['basename']}";
-
-		if( strlen(trim($this->config['resized_dir'])) == 0 || $this->config['safe_mode'] == true )
-		{
-			Return Files::makeFile($path_parts['dirname'],$thumbnail);
-		}
-		else
-		{
-      $path = Files::makePath($path_parts['dirname'],$this->config['resized_dir']);
-      if($mkDir && !is_dir($path))
-        Files::createFolder($path);
-      Return Files::makeFile($path,$thumbnail);
-		}
-	}
-
-	/**
-	 * Check if the given path is part of the subdirectories
-	 * under the base_dir.
-	 * @param string $path the relative path to be checked
-	 * @return boolean true if the path exists, false otherwise
-	 */
-	function validRelativePath($path) 
-	{
-		$dirs = $this->getDirs();
-		if($path == '/')
-			Return true;
-		//check the path given in the url against the 
-		//list of paths in the system.
-		for($i = 0; $i < count($dirs); $i++)
-		{
-			$key = key($dirs);
-			//we found the path
-			if($key == $path)
-				Return true;
-		
-			next($dirs);
-		}		
-		Return false;
-	}
-
-	/**
-	 * Process uploaded files, assumes the file is in 
-	 * $_FILES['upload'] and $_POST['dir'] is set.
-	 * The dir must be relative to the base_dir and exists.
-	 * @return null
-	 */
-	function processUploads() 
-	{
-		if($this->isValidBase() == false)
-			return;
-
-		$relative = null;
-
-		if(isset($_POST['dir'])) 
-			$relative = rawurldecode($_POST['dir']);
-		else
-			return;
-
-		//check for the file, and must have valid relative path
-		if(isset($_FILES['upload']) && $this->validRelativePath($relative))
-		{
-			Return $this->_processFiles($relative, $_FILES['upload']);
-		}
-	}
-
-	/**
-	 * Process upload files. The file must be an 
-	 * uploaded file. Any duplicate
-	 * file will be renamed. See Files::copyFile for details
-	 * on renaming.
-	 * @param string $relative the relative path where the file
-	 * should be copied to.
-	 * @param array $file the uploaded file from $_FILES
-	 * @return boolean true if the file was processed successfully, 
-	 * false otherwise
-	 */
-	function _processFiles($relative, $file)
-	{
-		
-		if($file['error']!=0)
-		{
-			Return false;
-		}
-
-		if(!is_uploaded_file($file['tmp_name']))
-		{
-			Files::delFile($file['tmp_name']);
-			Return false;
-		}
-
-        $valid_extensions = $this->mode == 'image' ? $this->config['allowed_image_extensions'] : $this->config['allowed_link_extensions'];
-        $max_size = $this->mode == 'image' ? $this->config['max_filesize_kb_image'] : $this->config['max_filesize_kb_link'];
-		$afruext = strtolower(substr(strrchr($file['name'], "."), 1));
-
-		if(!in_array($afruext, $valid_extensions))
-		{
-			Files::delFile($file['tmp_name']);
-			Return 'Cannot upload $extension='.$afruext.'$ Files. Permission denied.';
-		}
-
-		if($file['size']>($max_size*1024))
-		{
-			Files::delFile($file['tmp_name']);
-			Return 'Unble to upload file. Maximum file size [$max_size='.$max_size.'$ KB] exceeded.';
-		}
-
-		if(!empty($this->config['max_foldersize_mb']) &&  (Files::dirSize($this->getImagesDir()))+$file['size']> ($this->config['max_foldersize_mb']*1048576))
-		{
-			Files::delFile($file['tmp_name']);
-			Return ("Cannot upload. Maximum folder size reached. Delete unwanted files and try again.");
-		}
-
-		//now copy the file
-		$path = Files::makePath($this->getImagesDir(),$relative);
-		$result = Files::copyFile($file['tmp_name'], $path, $file['name']);
-
-		//no copy error
-		if(!is_int($result))
-		{
-			Files::delFile($file['tmp_name']);
-			Return 'File "$file='.$file['name'].'$" successfully uploaded.';
-		}
-
-		//delete tmp files.
-		Files::delFile($file['tmp_name']);
-		Return false;
-
-	}
-
-
-	function getDiskInfo()
-	{
-        if (empty($this->config['max_foldersize_mb']))
-            return '';
-            
-		$tmpFreeSize=($this->config['max_foldersize_mb']*1048576)-Files::dirSize($this->getImagesDir());
-
-		if(!is_numeric($tmpFreeSize) || $tmpFreeSize<0)	$tmpFreeSize=0;
-        
-		Return 'Total Size : $max_foldersize_mb='.$this->config['max_foldersize_mb'].'$ MB, Free Space: $free_space='.Files::formatSize($tmpFreeSize).'$';
-	}
-
-
-
-	/**
-	 * Get the URL of the relative file.
-	 * basically appends the relative file to the 
-	 * base_url given in config.inc.php
-	 * @param string $relative a file the relative to the base_dir
-	 * @return string the URL of the relative file.
-	 */
-	function getFileURL($relative) 
-	{
-		Return Files::makeFile($this->getImagesURL(),$relative);
-	}
-
-	/**
-	 * Get the fullpath to a relative file.
-	 * @param string $relative the relative file.
-	 * @return string the full path, .ie. the base_dir + relative.
-	 */
-	function getFullPath($relative) 
-	{
-		Return Files::makeFile($this->getImagesDir(),$relative);;
-	}
-
-	/**
-	 * Get the default thumbnail.
-	 * @return string default thumbnail, empty string if 
-	 * the thumbnail doesn't exist.
-	 */
-	function getDefaultThumb() 
-	{
-		if(is_file($this->config['default_thumbnail']))
-			Return $this->config['default_thumbnail'];
-		else 
-			Return '';
-	}
-
-
-	/**
-	 * Checks image size. If the image size is less than default size
-	 * returns the original size else returns default size to display thumbnail
-	*/
-	function checkImageSize($relative)
-	{
-		$fullpath = Files::makeFile($this->getImagesDir(),$relative);
-
-		$afruext = strtolower(substr(strrchr($relative, "."), 1));
-		
-		if(!in_array($afruext,$this->config['thumbnail_extensions']))
-		{
-			$imgInfo=array(0,0);
-			Return $imgInfo;
-		}
-		else
-		{
-			$imgInfo = @getImageSize($fullpath);
-			//not an image
-			if(!is_array($imgInfo))
-			{
-				$imgInfo=array(0,0);
-				Return $imgInfo;
-			}
-			else
-			{
-				if($imgInfo[0] > $this->config['thumbnail_width'])
-				$imgInfo[0] = $this->config['thumbnail_width'];
-
-				if($imgInfo[1] > $this->config['thumbnail_height'])
-				$imgInfo[1] = $this->config['thumbnail_height'];
-
-				Return $imgInfo;
-			}
-		}
-
-	}
-
-
-	/**
-	 * Get the thumbnail url to be displayed. 
-	 * If the thumbnail exists, and it is up-to-date
-	 * the thumbnail url will be returns. If the 
-	 * file is not an image, a default image will be returned.
-	 * If it is an image file, and no thumbnail exists or 
-	 * the thumbnail is out-of-date (i.e. the thumbnail 
-	 * modified time is less than the original file)
-	 * then a thumbs.php?img=filename.jpg is returned.
-	 * The thumbs.php url will generate a new thumbnail
-	 * on the fly. If the image is less than the dimensions
-	 * of the thumbnails, the image will be display instead.
-	 * @param string $relative the relative image file.
-	 * @return string the url of the thumbnail, be it
-	 * actually thumbnail or a script to generate the
-	 * thumbnail on the fly.
-	 */
-	function getThumbnail($relative) 
-	{
-		global $IMConfig;
-		
-		$fullpath = Files::makeFile($this->getImagesDir(),$relative);
-
-		//not a file???
-		if(!is_file($fullpath))
-			Return $this->getDefaultThumb();
-
-		$afruext = strtolower(substr(strrchr($relative, "."), 1));
-		
-		if(!in_array($afruext,$this->config['thumbnail_extensions']))
-		{
-			if(is_file('icons/'.$afruext.'.gif')) 
-				Return('icons/'.$afruext.'.gif');
-			else
-				Return $this->getDefaultThumb();
-		}
-
-		$imgInfo = @getImageSize($fullpath);
-
-		//not an image
-		if(!is_array($imgInfo))
-			Return $this->getDefaultThumb();
-
-
-		//Returning original image as thumbnail without Image Library by Afru
-		if(!$this->config['img_library']) Return $this->getFileURL($relative);
-
-
-		//the original image is smaller than thumbnails,
-		//so just return the url to the original image.
-		if ($imgInfo[0] <= $this->config['thumbnail_width']
-		 && $imgInfo[1] <= $this->config['thumbnail_height'])
-			Return $this->getFileURL($relative);
-
-		$thumbnail = $this->getThumbName($fullpath);
-		
-		//check for thumbnails, if exists and
-		// it is up-to-date, return the thumbnail url
-		if(is_file($thumbnail))
-		{
-			if(filemtime($thumbnail) >= filemtime($fullpath))
-				Return $this->getThumbURL($relative);
-		}
-
-		//well, no thumbnail was found, so ask the thumbs.php
-		//to generate the thumbnail on the fly.
-		Return $IMConfig['backend_url'] . '__function=thumbs&img='.rawurlencode($relative)."&mode=$this->mode";
-	}
-
-	/**
-	 * Delete and specified files.
-	 * @return boolean true if delete, false otherwise
-	 */
-	function deleteFiles() 
-	{
-		if(isset($_GET['delf']))
-			return $this->_delFile(rawurldecode($_GET['delf']));
-        return false;
-	}
-
-	/**
-	 * Delete and specified directories.
-	 * @return boolean true if delete, false otherwise
-	 */
-	function deleteDirs() 
-	{
-		 if(isset($_GET['deld']))
-			return $this->_delDir(rawurldecode($_GET['deld']));		
-		 else
-			 Return false;
-	}
-
-	/**
-	 * Delete the relative file, and any thumbnails.
-	 * @param string $relative the relative file.
-	 * @return boolean true if deleted, false otherwise.
-	 */
-	function _delFile($relative) 
-	{
-		$fullpath = Files::makeFile($this->getImagesDir(),$relative);
-	
-		$afruext = strtolower(substr(strrchr($relative, "."), 1));
-
-        $valid_extensions = $this->mode == 'image' ? $this->config['allowed_image_extensions'] : $this->config['allowed_link_extensions'];
-
-		if(!in_array($afruext,$valid_extensions))
-		{
-			return false;
-		}
-
-		//check that the file is an image
-		if(is_array($this->getImageInfo($fullpath)))
-		{
-			$thumbnail = $this->getThumbName($fullpath);
-			Files::delFile($thumbnail);
-		}
-
-		Return Files::delFile($fullpath);
-	}
-
-	/**
-	 * Delete directories recursively.
-	 * @param string $relative the relative path to be deleted.
-	 * @return boolean true if deleted, false otherwise.
-	 */
-	function _delDir($relative) 
-	{
-		$fullpath = Files::makePath($this->getImagesDir(),$relative);
-	//	if($this->countFiles($fullpath) <= 0)
-			return Files::delFolder($fullpath,true); //delete recursively.
-		//else
-			//Return false;
-	}
-
-	/**
-	 * Create new directories.
-	 * If in safe_mode, nothing happens.
-	 * @return boolean true if created, false otherwise.
-	 */
-	function processNewDir() 
-	{
-		if($this->config['safe_mode'] == true)
-			Return false;
-
-		if(isset($_GET['newDir']) && isset($_GET['dir']))
-		{
-			$newDir = rawurldecode($_GET['newDir']);
-			$dir = rawurldecode($_GET['dir']);
-			$path = Files::makePath($this->getImagesDir(),$dir);
-			$fullpath = Files::makePath($path, Files::escape($newDir));
-			if(is_dir($fullpath))
-				Return false;
-
-			Return Files::createFolder($fullpath);
-		}
-	}
-
-	/**
-	 * Renames files if certain GET variables are set
-	 * @return bool
-	 */
-	function processRenames()
-	{
-		if(!empty($_GET['rename']) && !empty($_GET['renameTo']))
-		{
-			// new file name (without path and extension)
-			$newName = Files::escape(rawurldecode($_GET['renameTo']));
-			$newName = str_replace('.', '', $newName);
-
-			// path to file (from base images directory)
-			$oldName = rawurldecode($_GET['rename']);
-
-			// strip parent dir ("..") to avoid escaping from base directiory
-			$oldName = preg_replace('#\.\.#', '', $oldName);
-
-			if (is_dir($oldPath = Files::makeFile($this->getImagesDir(), $_GET['dir'].$oldName)))
-			{
-				$newPath = Files::makeFile($this->getImagesDir(), $_GET['dir'].$newName);
-				return Files::rename($oldPath,$newPath);
-			}
-			else 
-			{
-				// path to old file
-				$oldPath = Files::makeFile($this->getImagesDir(), $oldName);
-	
-				$ret = Files::renameFile($oldPath, $newName);
-				if ($ret === true) {
-					// delete old thumbnail
-					Files::delFile($this->getThumbname($oldPath));
-				}
-			}
-			return $ret;
-		}
-		
-		return null;
-	}
-
-	function processPaste()
-	{
-		switch ($_GET['paste'])
-		{
-			case 'copyFile':
-				$src = Files::makeFile($this->getImagesDir(), $_GET['srcdir'].$_GET['file']);
-				$file = $_GET['file'];
-				$dest = Files::makeFile($this->getImagesDir(), $_GET['dir']);
-				return Files::copyFile($src,$dest,$file);
-			break;
-			case 'copyDir':
-				$basePath = $this->getImagesDir();
-				$src = $_GET['srcdir'].$_GET['file'];
-				$dest = $_GET['dir'].$_GET['file'];
-				return Files::copyDir($basePath,$src,$dest);
-			break;
-			case 'moveFile':
-				$src = Files::makeFile($this->getImagesDir(), $_GET['srcdir'].$_GET['file']);
-				$dest = Files::makeFile($this->getImagesDir(), $_GET['dir'].$_GET['file']);
-				return Files::rename($src,$dest);
-			break;
-			case 'moveDir':
-				$src = Files::makeFile($this->getImagesDir(), $_GET['srcdir'].$_GET['file']);
-				$dest = Files::makeFile($this->getImagesDir(), $_GET['dir'].$_GET['file']);
-				return Files::rename($src,$dest);
-			break;
-		}
-	}
-}
-
-?>
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ExtendedFileManager/ExtendedFileManager.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ExtendedFileManager/ExtendedFileManager.js
deleted file mode 100644
index 4caaf56..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ExtendedFileManager/ExtendedFileManager.js
+++ /dev/null
@@ -1,329 +0,0 @@
-/**

- * ExtendedFileManager extended-file-manager.js file.

- * Authors: Wei Zhuo, Afru, Krzysztof Kotowicz, Raimund Meyer

- * Modified by: Krzysztof Kotowicz <koto@webworkers.pl>

- * Version: Updated on 08-01-2005 by Afru

- * Version: Modified on 20-06-2006 by Krzysztof Kotowicz

- * Version: Updated on 29-10-2006 by Raimund Meyer

- * Version: Updated on 20-01-2008 by Raimund Meyer

- * Package: ExtendedFileManager (EFM 1.4)

- */

-

-/**

- * For installation details see Readme.txt in the plugin folder

- *

- */

-

-function ExtendedFileManager(editor)

-{

-

-    this.editor = editor;

-

-    var cfg = editor.config;

-    var toolbar = cfg.toolbar;

-    var self = this;

-    

-    if (cfg.ExtendedFileManager.use_linker) {

-        cfg.registerButton({

-            id        : "linkfile",

-            tooltip   : Xinha._lc("Insert File Link",'ExtendedFileManager'),

-            image     : Xinha.getPluginDir('ExtendedFileManager') + '/img/ed_linkfile.gif',

-            textMode  : false,

-            action    : function(editor) {

-                    editor._linkFile();

-                  }

-            });

-        cfg.addToolbarElement("linkfile", "createlink", 1);

-        };

-

-    var manager = editor.config.ExtendedFileManager.backend + '__function=manager';

-    if(cfg.ExtendedFileManager.backend_config != null)

-    {

-      manager += '&backend_config='

-        + encodeURIComponent(cfg.ExtendedFileManager.backend_config);

-      manager += '&backend_config_hash='

-        + encodeURIComponent(cfg.ExtendedFileManager.backend_config_hash);

-      manager += '&backend_config_secret_key_location='

-        + encodeURIComponent(cfg.ExtendedFileManager.backend_config_secret_key_location);

-    }

-

-    if(cfg.ExtendedFileManager.backend_data != null)

-    {

-        for ( var i in cfg.ExtendedFileManager.backend_data )

-        {

-            manager += '&' + i + '=' + encodeURIComponent(cfg.ExtendedFileManager.backend_data[i]);

-        }

-    }

-    cfg.ExtendedFileManager.manager = manager;

-}

-

-ExtendedFileManager._pluginInfo = {

-    name          : "ExtendedFileManager",

-    version       : "1.4",

-    developer     : "Afru, Krzysztof Kotowicz, Raimund Meyer",

-    developer_url : "http://xinha.org",

-    license       : "htmlArea"

-};

-

-Xinha.Config.prototype.ExtendedFileManager =

-{

-  'use_linker': true,

-  'backend'    : Xinha.getPluginDir('ExtendedFileManager') + '/backend.php?__plugin=ExtendedFileManager&',

-  'backend_data' : null,

-  // deprecated keys, use passing data through e.g. xinha_pass_to_php_backend()

-  'backend_config'     : null,

-  'backend_config_hash': null,

-  'backend_config_secret_key_location': 'Xinha:ExtendedFileManager'

-};

-

-// Over ride the _insertImage function in htmlarea.js.

-// Open up the ExtendedFileManger script instead.

-if(typeof ImageManager == 'undefined')

-{

-Xinha.prototype._insertImage = function(image) {

-

-    var editor = this;  // for nested functions

-    var outparam = {"editor" : this, param : null};

-    

-    if (typeof image == "undefined") {

-        image = this.getParentElement();

-        if (image && !/^img$/i.test(image.tagName))

-            image = null;

-    }

-

-    if (image) {

-        outparam.param = {

-            f_url    : Xinha.is_ie ? image.src : image.getAttribute("src"),

-            f_alt    : image.alt,

-            f_title  : image.title,

-            f_border : image.style.borderWidth ? image.style.borderWidth : image.border,

-            f_align  : image.align,

-            f_width  : image.width,

-            f_height  : image.height,

-            f_padding: image.style.padding,

-            f_margin : image.style.margin,

-            f_backgroundColor: image.style.backgroundColor,

-            f_borderColor: image.style.borderColor,

-            baseHref: editor.config.baseHref

-        };

-

-        // compress 'top right bottom left' syntax into one value if possible

-        outparam.param.f_border = shortSize(outparam.param.f_border);

-        outparam.param.f_padding = shortSize(outparam.param.f_padding);

-        outparam.param.f_margin = shortSize(outparam.param.f_margin);

-

-        // convert rgb() calls to rgb hex

-        outparam.param.f_backgroundColor = convertToHex(outparam.param.f_backgroundColor);

-        outparam.param.f_borderColor = convertToHex(outparam.param.f_borderColor);

-

-    }

-    Dialog(this.config.ExtendedFileManager.manager, function(param){

-        if (!param)

-        {   // user must have pressed Cancel

-            return false;

-        }

-

-        var img = image;

-        if (!img) {

-        	if ( !param.f_url ) return false;

-            if (Xinha.is_ie) {

-                var sel = editor.getSelection();

-                var range = editor.createRange(sel);

-                editor._doc.execCommand("insertimage", false, param.f_url);

-                img = range.parentElement();

-                // wonder if this works...

-                if (img.tagName.toLowerCase() != "img") {

-                    img = img.previousSibling;

-                }

-

-            } else {

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

-                img.src = param.f_url;

-                editor.insertNodeAtSelection(img);

-            }

-

-        } else {

-        	if ( !param.f_url ) { // delete the image if empty url passed

-        		img.parentNode.removeChild(img);

-        		editor.updateToolbar();

-        		return false;

-        	} else {

-                img.src = param.f_url;

-        	}

-        }

-

-        img.alt = img.alt ? img.alt : '';

-        

-        for (field in param)

-        {

-            var value = param[field];

-            switch (field)

-            {

-                case "f_alt"    : img.alt    = value; break;

-                case "f_title"  : img.title = value; break;

-                case "f_border" : 

-                    if (value)

-                    {

-                        img.style.borderWidth = /[^0-9]/.test(value) ? value : (value != '') ? (parseInt(value) + 'px') : '';

-                        if(img.style.borderWidth && !img.style.borderStyle)

-                        {

-                            img.style.borderStyle = 'solid';

-                        }

-                        else if (!img.style.borderWidth)

-                        {

-                        	img.style.border = '';

-                        }

-                    }

-                break;

-                case "f_borderColor": img.style.borderColor =  value; break;

-                case "f_backgroundColor": img.style.backgroundColor = value; break;

-                case "f_align"  : img.align  = value; break;

-                case "f_width"  : 

-                    if ( parseInt( value ) > 0 )

-                    {

-                        img.width = parseInt(value);

-                    }

-                break;

-                case "f_height"  : 

-                    if ( parseInt( value ) > 0 )

-                    {

-                        img.height = parseInt(value);

-                    }

-                break;

-                case "f_padding": img.style.padding =

-                                          /[^0-9]/.test(value) ? value : (value != '') ? (parseInt(value) + 'px') :''; break;

-                case "f_margin": img.style.margin =

-                                          /[^0-9]/.test(value) ? value : (value != '') ? (parseInt(value) + 'px') :''; break;

-            }

-        }

-

-    }, outparam);

-

-};

-}

-

-Xinha.prototype._linkFile = function(link) {

-

-    var editor = this;

-    var outparam = {"editor" : this, param : null};

-    if (typeof link == "undefined") {

-        link = this.getParentElement();

-        if (link) {

-            if (/^img$/i.test(link.tagName))

-                link = link.parentNode;

-            if (!/^a$/i.test(link.tagName))

-                link = null;

-        }

-    }

-    if (!link) {

-        var sel = editor.getSelection();

-        var range = editor.createRange(sel);

-        var compare = 0;

-        if (Xinha.is_ie) {

-            if ( sel.type == "Control" )

-                compare = range.length;

-            else

-                compare = range.compareEndPoints("StartToEnd", range);

-        } else {

-            compare = range.compareBoundaryPoints(range.START_TO_END, range);

-        }

-        if (compare == 0) {

-            alert(Xinha._lc("You must select some text before making a new link.", 'ExtendedFileManager'));

-            return;

-        }

-        outparam.param = {

-            f_href : '',

-            f_title : '',

-            f_target : '',

-            f_usetarget : editor.config.makeLinkShowsTarget,

-            baseHref: editor.config.baseHref

-        };

-    } 
-    else

-    {      

-        outparam.param = {

-            f_href   : Xinha.is_ie ? link.href : link.getAttribute("href"),

-            f_title  : link.title,

-            f_target : link.target,

-            f_usetarget : editor.config.makeLinkShowsTarget,

-            baseHref: editor.config.baseHref

-        };

-    }

-

-    Dialog(this.config.ExtendedFileManager.manager+'&mode=link', function(param){

-        if (!param)

-            return false;

-        var a = link;

-        if (!a) try {

-            editor._doc.execCommand("createlink", false, param.f_href);

-            a = editor.getParentElement();

-            var sel = editor.getSelection();

-            var range = editor.createRange(sel);

-            if (!Xinha.is_ie) {

-                a = range.startContainer;

-                if (!/^a$/i.test(a.tagName)) {

-                    a = a.nextSibling;

-                    if (a == null)

-                        a = range.startContainer.parentNode;

-                }

-            }

-        } catch(e) {}

-        else {

-            var href = param.f_href.trim();

-            editor.selectNodeContents(a);

-            if (href == "") {

-                editor._doc.execCommand("unlink", false, null);

-                editor.updateToolbar();

-                return false;

-            }

-            else {

-                a.href = href;

-            }

-        }

-        if (!(a && /^a$/i.test(a.tagName)))

-            return false;

-        a.target = param.f_target.trim();

-        a.title = param.f_title.trim();

-        editor.selectNodeContents(a);

-        editor.updateToolbar();

-    }, outparam);

-};

-

-function shortSize(cssSize)

-{

-    if(/ /.test(cssSize))

-    {

-        var sizes = cssSize.split(' ');

-        var useFirstSize = true;

-        for(var i = 1; i < sizes.length; i++)

-        {

-            if(sizes[0] != sizes[i])

-            {

-                useFirstSize = false;

-                break;

-            }

-        }

-        if(useFirstSize) cssSize = sizes[0];

-    }

-

-    return cssSize;

-}

-

-function convertToHex(color) {

-

-    if (typeof color == "string" && /, /.test.color)

-        color = color.replace(/, /, ','); // rgb(a, b) => rgb(a,b)

-

-    if (typeof color == "string" && / /.test.color) { // multiple values

-        var colors = color.split(' ');

-        var colorstring = '';

-        for (var i = 0; i < colors.length; i++) {

-            colorstring += Xinha._colorToRgb(colors[i]);

-            if (i + 1 < colors.length)

-                colorstring += " ";

-        }

-        return colorstring;

-    }

-

-    return Xinha._colorToRgb(color);

-}

diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ExtendedFileManager/Readme.txt b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ExtendedFileManager/Readme.txt
deleted file mode 100644
index ea19a87..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ExtendedFileManager/Readme.txt
+++ /dev/null
@@ -1,111 +0,0 @@
-Package : Extended File Manager EFM 1.1.1

-

-Version 1.1 created from 1.0 beta by Krzysztof Kotowicz <koto@webworkers.pl>

-

-Overview :

-----------

-

-Extended File Manager is an advanced plugin for Xinha 

-

-It works in two different modes.

-1). Insert Image Mode and 

-2). Insert File Link Mode.

-

-In Insert Image Mode, it replaces the basic insert image functionality of Xinha with its advanced image manager.

-

-If Insert File Link Mode is enabled, a new icon will be added to the toolbar with advanced file linking capability.

-

-

-

-Complete Features :

--------------------

-* Easy config.inc file that enables individual options for both modes.

-* Thumnail View 

-* List View 

-* Nice icons for both views 

-* Create Folders 

-* Vertical Scrolling 

-* Allowed extensions to view or upload.

-* File Uploads 

-* Max File upload limit 

-* Max Upload Folder size (Including all subfolders and files. A must see option.)

-* Dynamic display of available free space in the Upload Folder 

-* Dynamic Thumbnails using Image libraries or browser resize 

-* Image Editor (Actually done by Wei...a great addon) 

-* Can be used to insert images along with properties. 

-* Can be used to insert link to non-image files like pdf or zip.

-* You can specify image margin / padding / background and border colors

-* You may edit Alt/title tags for inserted images

-

-(Most of the features can be enabled/disabled as needed)

-

-Installation :

---------------

-

-Installing involves extracting the archive to 'plugins' subdirectory of Xinha

-and selecting the plugin in appropriate xinha_plugins list.

-

-Plugin may be configured via xinha_config.ExtendedFileManager object.

-Look into ImageManager plugin documentation as this plugin uses almost identical

-settings. All available options can be found in the file config.inc.php.

-

-// only snippets of code from initializing file shown below

-

-

-  xinha_plugins = xinha_plugins ? xinha_plugins :

-  [

-   'ContextMenu',

-   'SuperClean',

-   'CharacterMap',

-   'GetHtml',

-   'ExtendedFileManager',

-   /*'ImageManager',*/  // replace image manager with EFM

-   'Linker'

-  ];

-

-...

-

-//If you don't want to add a button for linking files and use only the advanced ImageManager

-xinha_config.ExtendedFileManager.use_linker = false;

-// pass the configuration to plugin

-if (xinha_config.ExtendedFileManager) {

-   	    with (xinha_config.ExtendedFileManager)

-        {

-            <?php

-

-            // define backend configuration for the plugin

-            $IMConfig = array();

-            $IMConfig['images_dir'] = '<images dir>';

-            $IMConfig['images_url'] = '<images url>';

-            $IMConfig['files_dir'] = '<files dir>';

-            $IMConfig['files_url'] = '<files url>';

-            $IMConfig['thumbnail_prefix'] = 't_';

-            $IMConfig['thumbnail_dir'] = 't';

-            $IMConfig['resized_prefix'] = 'resized_';

-            $IMConfig['resized_dir'] = '';

-            $IMConfig['tmp_prefix'] = '_tmp';

-            $IMConfig['max_filesize_kb_image'] = 2000;

-            // maximum size for uploading files in 'insert image' mode (2000 kB here)

-

-            $IMConfig['max_filesize_kb_link'] = 5000;

-            // maximum size for uploading files in 'insert link' mode (5000 kB here)

-

-            // Maximum upload folder size in Megabytes.

-            // Use 0 to disable limit

-            $IMConfig['max_foldersize_mb'] = 0;

-            

-            $IMConfig['allowed_image_extensions'] = array("jpg","gif","png");

-            $IMConfig['allowed_link_extensions'] = array("jpg","gif","pdf","ip","txt",

-                                                         "psd","png","html","swf",

-                                                         "xml","xls");

-

-            require_once '/path/to/xinha/contrib/php-xinha.php';

-            xinha_pass_to_php_backend($IMConfig);

-            

-            ?>

-        }

-}

-

-=====

-afrusoft@gmail.com - author of EFM 1.0 beta

-koto@webworkers.pl - EFM 1.1 (most of the code taken from Xinha codebase)
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ExtendedFileManager/assets/EditorContent.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ExtendedFileManager/assets/EditorContent.js
deleted file mode 100644
index 9f4a85a..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ExtendedFileManager/assets/EditorContent.js
+++ /dev/null
@@ -1,707 +0,0 @@
-/**
- * ImageEditor Interface file.
- * Authors: Wei Zhuo, Afru, Krzysztof Kotowicz
- * Version: Updated on 08-01-2005 by Afru
- * Version: Updated on 20-06-2006 by Krzysztof Kotowicz
- * Version: Updated on 04-11-2007 by Raimund Meyer
- * Package: ExtendedFileManager (EFM 1.4)
- * http://www.afrusoft.com/htmlarea
- */
-
-function MM_findObj(n, d) { //v4.01
-  var p,i,x;  if(!d) d=document; if((p=n.indexOf("?"))>0&&parent.frames.length) {
-    d=parent.frames[n.substring(p+1)].document; n=n.substring(0,p);}
-  if(!(x=d[n])&&d.all) x=d.all[n]; for (i=0;!x&&i<d.forms.length;i++) x=d.forms[i][n];
-  for(i=0;!x&&d.layers&&i<d.layers.length;i++) x=MM_findObj(n,d.layers[i].document);
-  if(!x && d.getElementById) x=d.getElementById(n); return x;
-}
-
-var pic_x, pic_y;
-function P7_Snap() { //v2.62 by PVII
-  var x,y,ox,bx,oy,p,tx,a,b,k,d,da,e,el,args=P7_Snap.arguments;a=parseInt(a);
-  for (k=0; k<(args.length-3); k+=4)
-   if ((g=MM_findObj(args[k]))!=null) {
-    el=eval(MM_findObj(args[k+1]));
-    a=parseInt(args[k+2]);b=parseInt(args[k+3]);
-    x=0;y=0;ox=0;oy=0;p="";tx=1;da="document.all['"+args[k]+"']";
-    if(document.getElementById) {
-     d="document.getElementsByName('"+args[k]+"')[0]";
-     if(!eval(d)) {d="document.getElementById('"+args[k]+"')";if(!eval(d)) {d=da;}}
-    }else if(document.all) {d=da;}
-    if (document.all || document.getElementById) {
-     while (tx==1) {p+=".offsetParent";
-      if(eval(d+p)) {x+=parseInt(eval(d+p+".offsetLeft"));y+=parseInt(eval(d+p+".offsetTop"));
-      }else{tx=0;}}
-     ox=parseInt(g.offsetLeft);oy=parseInt(g.offsetTop);var tw=x+ox+y+oy;
-     if(tw==0 || (navigator.appVersion.indexOf("MSIE 4")>-1 && navigator.appVersion.indexOf("Mac")>-1)) {
-      ox=0;oy=0;if(g.style.left){x=parseInt(g.style.left);y=parseInt(g.style.top);
-      }else{var w1=parseInt(el.style.width);bx=(a<0)?-5-w1:-10;
-      a=(Math.abs(a)<1000)?0:a;b=(Math.abs(b)<1000)?0:b;
-      //alert(event.clientX);
-      if (event == null) x=document.body.scrollLeft + bx;
-        else x=document.body.scrollLeft + event.clientX + bx;
-      if (event == null) y=document.body.scrollTop;
-        else y=document.body.scrollTop + event.clientY;}}
-   }else if (document.layers) {x=g.x;y=g.y;var q0=document.layers,dd="";
-    for(var s=0;s<q0.length;s++) {dd='document.'+q0[s].name;
-     if(eval(dd+'.document.'+args[k])) {x+=eval(dd+'.left');y+=eval(dd+'.top');break;}}}
-   if(el) {e=(document.layers)?el:el.style;
-   var xx=parseInt(x+ox+a),yy=parseInt(y+oy+b);
-   if(navigator.appName=="Netscape" && parseInt(navigator.appVersion)>4){xx+="px";yy+="px";}
-   if(navigator.appVersion.indexOf("MSIE 5")>-1 && navigator.appVersion.indexOf("Mac")>-1){
-    xx+=parseInt(document.body.leftMargin);yy+=parseInt(document.body.topMargin);
-    xx+="px";yy+="px";}e.left=xx;e.top=yy;}
-    pic_x = parseInt(xx); pic_y = parseInt(yy);
-    }
-}
-
-var ie=document.all;
-var ns6=document.getElementById&&!document.all;
-
-var dragapproved=false;
-var z,x,y,status, ant, canvas, content, pic_width, pic_height, image, resizeHandle, oa_w, oa_h, oa_x, oa_y, mx2, my2;
-
-function init_resize()
-{
-    //if(mode == "scale")
-    //{
-        P7_Snap('theImage','ant',0,0);
-
-        if (canvas == null)
-            canvas = MM_findObj("imgCanvas");
-
-        if (pic_width == null || pic_height == null)
-        {
-            image = MM_findObj("theImage");
-            pic_width = image.width;
-            pic_height = image.height;
-        }
-
-        if (ant == null)
-            ant = MM_findObj("ant");
-
-        ant.style.left = pic_x; ant.style.top = pic_y;
-        ant.style.width = pic_width; ant.style.height = pic_height;
-        ant.style.visibility = "visible";
-
-        drawBoundHandle();
-        jg_doc.paint();
-    //}
-}
-
-initEditor = function ()
-{
-    init_crop();
-    init_resize();
-    var markerImg = MM_findObj('markerImg', window.top.document);
-
-    if (markerImg.src.indexOf("img/t_white.gif")>0)
-        toggleMarker() ;
-	var theImage = document.getElementById('theImage');
-	theImage._width = theImage.width;
-	theImage._height = theImage.height;
-}
-
-function init_crop()
-{
-    //if(mode == "crop") {
-        P7_Snap('theImage','ant',0,0);
-    //}
-}
-
-function setMode(newMode)
-{
-    mode = newMode;
-    reset();
-}
-
-function reset()
-{
-    if (ant == null)
-        ant = MM_findObj("ant");
-
-    ant.style.visibility = "hidden";
-    ant.style.left = 0;
-    ant.style.top = 0;
-    ant.style.width = 0;
-    ant.style.height = 0;
-
-    mx2 = null;
-    my2 = null;
-
-    jg_doc.clear();
-    if(mode != 'measure')
-        showStatus();
-
-    if(mode == "scale") {
-        init_resize();
-    }
-
-    P7_Snap('theImage','ant',0,0);
-}
-
-function toggleMarker()
-{
-    if (ant == null)
-        ant = MM_findObj("ant");
-
-    if(ant.className=="selection")
-        ant.className="selectionWhite";
-    else
-        ant.className="selection";
-
-    if (jg_doc.getColor() == "#000000")
-        jg_doc.setColor("#FFFFFF");
-    else
-        jg_doc.setColor("#000000");
-
-    drawBoundHandle
-    jg_doc.paint();
-}
-
-function move(e)
-{
-    if (dragapproved)
-    {
-        var w = ns6? temp1+e.pageX - x : temp1+event.clientX + document.body.scrollLeft- x;
-        var h = ns6? temp2+e.pageY - y : temp2+event.clientY  + document.body.scrollTop - y;
-
-        if (ant != null)
-        {
-            if (w >= 0)
-            {
-                ant.style.left = x;
-                ant.style.width = w;
-            }
-            else
-            {
-                ant.style.left = x+w;
-                ant.style.width = -1*w;
-            }
-
-            if (h >= 0)
-            {
-                ant.style.top = y;
-                ant.style.height = h;
-            }
-            else
-            {
-                ant.style.top = y+h;
-                ant.style.height = -1*h
-            }
-        }
-
-        showStatus();
-        return false
-    }
-}
-
-function moveContent(e)
-{
-    if (dragapproved)
-    {
-
-        var dx =ns6? oa_x + e.clientX-x: oa_x + event.clientX-x
-        var dy =ns6? oa_y + e.clientY-y : oa_y + event.clientY-y
-
-        ant.style.left = dx;
-        ant.style.top = dy;
-
-        showStatus();
-
-        return false;
-    }
-}
-
-//Code add for constraints by Frédéric Klee <fklee@isuisse.com>
-function moveHandle(e)
-{
-    if (dragapproved)
-    {
-        var w = ns6? e.clientX - x : event.clientX - x;
-        var h = ns6? e.clientY - y : event.clientY - y;
-
-        var constrained = MM_findObj('constProp', window.top.document);
-        var orginal_height = document.theImage.height ;
-        var orginal_width = document.theImage.width ;
-        rapp = orginal_width/orginal_height ;
-        rapp_inv = orginal_height / orginal_width ;
-
-        switch(resizeHandle)
-        {
-
-            case "s-resize":
-                if (oa_h + h >= 0)
-                {
-                    ant.style.height = oa_h + h;
-                    if(constrained.checked)
-                    {
-                        ant.style.width = rapp * (oa_h + h) ;
-                        ant.style.left = oa_x - rapp * h/2;
-                    }
-
-                }
-                break;
-            case "e-resize":
-                if(oa_w + w >= 0)
-                {
-                    ant.style.width = oa_w + w;
-                    if(constrained.checked)
-                    {
-                        ant.style.height = rapp_inv * (oa_w + w) ;
-                        ant.style.top = oa_y - rapp_inv * w/2;
-                    }
-
-                }
-                break;
-            case "n-resize":
-                if (oa_h - h >= 0)
-                {
-                    ant.style.top = oa_y + h;
-                    ant.style.height = oa_h - h;
-                    if(constrained.checked)
-                    {
-                        ant.style.width = rapp * (oa_h - h) ;
-                        ant.style.left = oa_x + rapp * h/2;
-                    }
-
-                }
-                break;
-            case "w-resize":
-                if(oa_w - w >= 0)
-                {
-                    ant.style.left = oa_x + w;
-                    ant.style.width = oa_w - w;
-                    if(constrained.checked)
-                    {
-                        ant.style.height = rapp_inv * (oa_w - w) ;
-                        ant.style.top = oa_y + rapp_inv * w/2;
-                    }
-
-                }break;
-            case "nw-resize":
-                if(oa_h - h >= 0 && oa_w - w >= 0) {
-                    ant.style.left = oa_x + w;
-                    ant.style.width = oa_w - w;
-                    ant.style.top = oa_y + h;
-                    if(constrained.checked)
-                        ant.style.height = rapp_inv * (oa_w - w) ;
-                    else
-                        ant.style.height = oa_h - h;
-                }
-            break;
-            case "ne-resize":
-                if (oa_h - h >= 0 && oa_w + w >= 0){
-                    ant.style.top = oa_y + h;
-                    ant.style.width = oa_w + w;
-                    if(constrained.checked)
-                        ant.style.height = rapp_inv * (oa_w + w) ;
-                    else
-                        ant.style.height = oa_h - h;
-                }
-                break;
-            case "se-resize":
-                if (oa_h + h >= 0 && oa_w + w >= 0)
-                {
-                    ant.style.width = oa_w + w;
-                    if(constrained.checked)
-                        ant.style.height = rapp_inv * (oa_w + w) ;
-                    else
-                        ant.style.height = oa_h + h;
-                }
-                break;
-            case "sw-resize":
-                if (oa_h + h >= 0 && oa_w - w >= 0)
-                {
-                    ant.style.left = oa_x + w;
-                    ant.style.width = oa_w - w;
-                    if(constrained.checked)
-                        ant.style.height = rapp_inv * (oa_w - w) ;
-                    else
-                       ant.style.height = oa_h + h;
-                }
-        }
-
-        showStatus();
-        return false;
-
-    }
-}
-
-function drags(e)
-{
-    if (!ie&&!ns6)
-        return
-
-    var firedobj=ns6? e.target : event.srcElement
-    var topelement=ns6? "HTML" : "BODY"
-
-    while (firedobj.tagName!=topelement&&
-            !(firedobj.className=="crop"
-                || firedobj.className=="handleBox"
-                || firedobj.className=="selection" || firedobj.className=="selectionWhite"))
-    {
-        firedobj=ns6? firedobj.parentNode : firedobj.parentElement
-    }
-
-    if(firedobj.className=="handleBox") {
-
-        if(content != null) {
-            if(content.width != null && content.height != null) {
-                content.width = 0;
-                content.height = 0;
-            }
-        }
-        resizeHandle = firedobj.id;
-
-        x=ns6? e.clientX: event.clientX
-        y=ns6? e.clientY: event.clientY
-
-        oa_w = parseInt(ant.style.width);
-        oa_h = parseInt(ant.style.height);
-        oa_x = parseInt(ant.style.left);
-        oa_y = parseInt(ant.style.top);
-
-        dragapproved=true
-        document.onmousemove=moveHandle;
-        return false;
-    }
-    else
-    if((firedobj.className == "selection" || firedobj.className=="selectionWhite")&& mode == "crop") {
-
-        x=ns6? e.clientX: event.clientX
-        y=ns6? e.clientY: event.clientY
-
-        oa_x = parseInt(ant.style.left);
-        oa_y = parseInt(ant.style.top);
-
-        dragapproved=true
-        document.onmousemove=moveContent;
-        return false;
-    }
-    else
-    if (firedobj.className=="crop" && mode == "crop")
-    {
-        if(content != null) {
-            if(content.width != null && content.height != null) {
-                content.width = 0;
-                content.height = 0;
-            }
-        }
-
-        if (status == null)
-            status = MM_findObj("status");
-
-        if (ant == null)
-            ant = MM_findObj("ant");
-
-        if (canvas == null)
-            canvas = MM_findObj("imgCanvas");
-        if(content == null) {
-            content = MM_findObj("cropContent");
-        }
-
-        if (pic_width == null || pic_height == null)
-        {
-            image = MM_findObj("theImage");
-            pic_width = image.width;
-            pic_height = image.height;
-        }
-
-        ant.style.visibility = "visible";
-
-        obj = firedobj;
-        dragapproved=true
-        z=firedobj
-        temp1=parseInt(z.style.left+0)
-        temp2=parseInt(z.style.top+0)
-          
-        x=ns6? e.pageX: event.clientX + document.body.scrollLeft
-        y=ns6? e.pageY: event.clientY + document.body.scrollTop
-        document.onmousemove=move
-        return false
-    }
-        else if(firedobj.className=="crop" && mode == "measure") {
-
-            if (ant == null)
-                ant = MM_findObj("ant");
-
-            if (canvas == null)
-                canvas = MM_findObj("imgCanvas");
-
-            x=ns6? e.pageX: event.clientX + document.body.scrollLeft
-            y=ns6? e.pageY: event.clientY + document.body.scrollTop
-
-            dragapproved=true
-            document.onmousemove=measure
-
-            return false
-        }
-}
-
-function measure(e)
-{
-    if (dragapproved)
-    {
-        mx2 = ns6? e.pageX : event.clientX + document.body.scrollLeft;
-        my2 = ns6? e.pageY : event.clientY + document.body.scrollTop;
-
-        jg_doc.clear();
-        jg_doc.setStroke(Stroke.DOTTED);
-        jg_doc.drawLine(x,y,mx2,my2);
-        jg_doc.paint();
-        showStatus();
-        return false;
-    }
-}
-
-function setMarker(nx,ny,nw,nh)
-{
-    if (isNaN(nx)) nx = 0; 
-    if (isNaN(ny)) ny = 0; 
-    if (isNaN(nw)) nw = 0; 
-    if (isNaN(nh)) nh = 0; 
-
-    if (ant == null)
-        ant = MM_findObj("ant");
-
-    if (canvas == null)
-        canvas = MM_findObj("imgCanvas");
-    if(content == null) {
-        content = MM_findObj("cropContent");
-    }
-
-    if (pic_width == null || pic_height == null)
-    {
-        image = MM_findObj("theImage");
-        pic_width = image.width;
-        pic_height = image.height;
-    }
-
-    ant.style.visibility = "visible";
-
-    nx = pic_x + nx;
-    ny = pic_y + ny;
-
-    if (nw >= 0)
-    {
-        ant.style.left = nx;
-        ant.style.width = nw;
-    }
-    else
-    {
-        ant.style.left = nx+nw;
-        ant.style.width = -1*nw;
-    }
-
-    if (nh >= 0)
-    {
-        ant.style.top = ny;
-        ant.style.height = nh;
-    }
-    else
-    {
-        ant.style.top = ny+nh;
-        ant.style.height = -1*nh
-    }
-
-}
-
-function max(x,y)
-{
-    if(y > x)
-        return x;
-    else
-        return y;
-}
-
-function drawBoundHandle()
-{
-    if(ant == null || ant.style == null)
-        return false;
-
-    var ah = parseInt(ant.style.height);
-    var aw = parseInt(ant.style.width);
-    var ax = parseInt(ant.style.left);
-    var ay = parseInt(ant.style.top);
-
-    jg_doc.drawHandle(ax-15,ay-15,30,30,"nw-resize"); //upper left
-    jg_doc.drawHandle(ax-15,ay+ah-15,30,30,"sw-resize"); //lower left
-    jg_doc.drawHandle(ax+aw-15,ay-15,30,30,"ne-resize"); //upper right
-    jg_doc.drawHandle(ax+aw-15,ay+ah-15,30,30,"se-resize"); //lower right
-
-    jg_doc.drawHandle(ax+max(15,aw/10),ay-8,aw-2*max(15,aw/10),8,"n-resize"); //top middle
-    jg_doc.drawHandle(ax+max(15,aw/10),ay+ah,aw-2*max(15,aw/10),8,"s-resize"); //bottom middle
-    jg_doc.drawHandle(ax-8, ay+max(15,ah/10),8,ah-2*max(15,ah/10),"w-resize"); //left middle
-    jg_doc.drawHandle(ax+aw, ay+max(15,ah/10),8,ah-2*max(15,ah/10),"e-resize"); //right middle
-
-    jg_doc.drawHandleBox(ax-4,ay-4,8,8,"nw-resize"); //upper left
-    jg_doc.drawHandleBox(ax-4,ay+ah-4,8,8,"sw-resize"); //lower left
-    jg_doc.drawHandleBox(ax+aw-4,ay-4,8,8,"ne-resize"); //upper right
-    jg_doc.drawHandleBox(ax+aw-4,ay+ah-4,8,8,"se-resize"); //lower right
-
-    jg_doc.drawHandleBox(ax+aw/2-4,ay-4,8,8,"n-resize"); //top middle
-    jg_doc.drawHandleBox(ax+aw/2-4,ay+ah-4,8,8,"s-resize"); //bottom middle
-    jg_doc.drawHandleBox(ax-4, ay+ah/2-4,8,8,"w-resize"); //left middle
-    jg_doc.drawHandleBox(ax+aw-4, ay+ah/2-4,8,8,"e-resize"); //right middle
-}
-
-function showStatus()
-{
-    if(ant == null || ant.style == null) {
-        return false;
-    }
-    var zoom = 100 / parseInt( window.parent.document.getElementById('zoom').value, 10 );
-    if(mode == "measure") {
-
-        mx1 = x - pic_x;
-        my1 = y - pic_y;
-
-        mw = mx2 - x;
-        mh = my2 - y;
-
-        md = parseInt(Math.sqrt(mw*mw + mh*mh)*100)/100;
-
-        ma = (Math.atan(-1*mh/mw)/Math.PI)*180;
-        if(mw < 0 && mh < 0)
-            ma = ma+180;
-
-        if (mw <0 && mh >0)
-            ma = ma - 180;
-
-        ma = parseInt(ma*100)/100;
-
-        if (m_sx != null && !isNaN(mx1))
-            m_sx.value = mx1 * zoom +"px";
-        if (m_sy != null && !isNaN(my1))
-            m_sy.value = my1 * zoom+"px";
-        if(m_w != null && !isNaN(mw))
-            m_w.value = mw * zoom + "px";
-        if(m_h != null && !isNaN(mh))
-            m_h.value = mh * zoom + "px";
-
-        if(m_d != null && !isNaN(md))
-            m_d.value = md * zoom + "px";
-        if(m_a != null && !isNaN(ma))
-            m_a.value = ma + "";
-
-        if(r_ra != null &&!isNaN(ma))
-            r_ra.value = ma;
-
-        return false;
-    }
-
-    var ah = parseInt(ant.style.height);
-    var aw = parseInt(ant.style.width);
-    var ax = parseInt(ant.style.left);
-    var ay = parseInt(ant.style.top);
-
-    var cx = ax-pic_x<0?0:ax-pic_x;
-    var cy = ay-pic_y<0?0:ay-pic_y;
-    cx = cx>pic_width?pic_width:cx;
-    cy = cy>pic_height?pic_height:cy;
-
-    var cw = ax-pic_x>0?aw:aw-(pic_x-ax);
-    var ch = ay-pic_y>0?ah:ah-(pic_y-ay);
-
-    ch = ay+ah<pic_y+pic_height?ch:ch-(ay+ah-pic_y-pic_height);
-    cw = ax+aw<pic_x+pic_width?cw:cw-(ax+aw-pic_x-pic_width);
-
-    ch = ch<0?0:ch; cw = cw<0?0:cw;
-
-    if (ant.style.visibility == "hidden")
-    {
-        cx = ""; cy = ""; cw=""; ch="";
-    }
-
-    if(mode == 'crop') {
-        if(t_cx != null)
-            t_cx.value = cx * zoom ;
-        if (t_cy != null)
-            t_cy.value = cy * zoom ;
-        if(t_cw != null)
-            t_cw.value = cw * zoom ;
-        if (t_ch != null)
-            t_ch.value = ch * zoom ;
-    }
-    else if(mode == 'scale') {
-
-        var sw = aw, sh = ah;
-
-        if (s_sw.value.indexOf('%')>0 && s_sh.value.indexOf('%')>0)
-        {
-            sw = cw/pic_width;
-            sh = ch/pic_height;
-        }
-        if (s_sw != null)
-            s_sw.value = sw * zoom ;
-        if (s_sh != null)
-            s_sh.value = sh * zoom ;
-    }
-}
-
-function dragStopped()
-{
-    dragapproved=false;
-
-    if(ant == null || ant.style == null) {
-        return false;
-    }
-
-    if(mode == "measure") {
-        jg_doc.drawLine(x-4,y,x+4,y);
-        jg_doc.drawLine(x,y-4,x,y+4);
-        jg_doc.drawLine(mx2-4,my2,mx2+4,my2);
-        jg_doc.drawLine(mx2,my2-4,mx2,my2+4);
-
-        jg_doc.paint();
-        showStatus();
-        return false;
-    }
-        var ah = parseInt(ant.style.height);
-        var aw = parseInt(ant.style.width);
-        var ax = parseInt(ant.style.left);
-        var ay = parseInt(ant.style.top);
-        jg_doc.clear();
-
-        if(content != null) {
-            if(content.width != null && content.height != null) {
-                content.width = aw-1;
-                content.height = ah-1;
-            }
-        }
-        if(mode == "crop") {
-            //alert(pic_y);
-            jg_doc.fillRectPattern(pic_x,pic_y,pic_width,ay-pic_y,pattern);
-
-            var h1 = ah;
-            var y1 = ay;
-            if (ah+ay >= pic_height+pic_y)
-                h1 = pic_height+pic_y-ay;
-            else if (ay <= pic_y)
-            {
-                h1 = ay+ah-pic_y;
-                y1 = pic_y;
-            }
-            jg_doc.fillRectPattern(pic_x,y1,ax-pic_x,h1,pattern);
-            jg_doc.fillRectPattern(ax+aw,y1,pic_x+pic_width-ax-aw,h1,pattern);
-            jg_doc.fillRectPattern(pic_x,ay+ah,pic_width,pic_height+pic_y-ay-ah,pattern);
-        }
-        else if(mode == "scale") {
-            document.theImage.height = ah;
-            document.theImage.width = aw;
-            document.theImage.style.height = ah+" px";
-            document.theImage.style.width = aw+" px";
-
-            P7_Snap('theImage','ant',0,0);
-        }
-
-        drawBoundHandle();
-        jg_doc.paint();
-
-        showStatus();
-    return false;
-}
-
-document.onmousedown=drags;
-document.onmouseup=dragStopped;
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ExtendedFileManager/assets/ImageEditor.css b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ExtendedFileManager/assets/ImageEditor.css
deleted file mode 100644
index 7cefe46..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ExtendedFileManager/assets/ImageEditor.css
+++ /dev/null
@@ -1,76 +0,0 @@
-.icons {
-    font: 11px Tahoma,Verdana,sans-serif;
-    color: #666699;
-    text-align: center;
-    text-decoration: none;
-    border: 1px solid #EEEEFF;
-    -Moz-Border-Radius: 6px 6px 6px 6px;
-}
-
-body, td, p {
-    font: 11px Tahoma,Verdana,sans-serif;
-}
-.iconsOver {
-    font: 11px Tahoma,Verdana,sans-serif;
-    color: #666699;
-    text-align: center;
-    text-decoration: none;
-    background-color: #F9F9FF;
-    border: 1px solid #666699;
-    -Moz-Border-Radius: 6px 6px 6px 6px;
-}
-.topBar {
-    font: 11px Tahoma,Verdana,sans-serif;
-    color: #666699;
-}
-.iconsSel {
-    font: 11px Tahoma,Verdana,sans-serif;
-    color: #666699;
-    text-align: center;
-    text-decoration: none;
-    border: 1px solid #666699;
-    -Moz-Border-Radius: 6px 6px 6px 6px;
-}
-.iconText {
-    font: 11px Tahoma,Verdana,sans-serif;
-    color: #666699;
-    text-decoration: none;
-    text-align: center;
-}
-.measureStats{
-    width: 50px;
-}
-
-#slidercasing {
-    /*border:1px solid #CCCCCC;
-    background-color:#FFFFFF;*/
-    width:100px;
-    height:5px;
-    position:relative;
-    z-index:4;
-    padding:10px;
-}
-
-
-#slidertrack {
-    position:relative;
-    border:1px solid #CCCCCC;
-    background-color:#FFFFCC;
-    z-index:5;
-    height:5px;
-}
-
-
-#sliderbar {
-    position:absolute;
-    z-index:6;
-    border:1px solid #CCCCCC;
-    background-color:#DDDDDD;
-    width:15px;     
-    padding:0px;
-    height:20px; 
-    cursor: pointer;
-    top:2px;
-}
-
-select, input, button { font: 11px Tahoma,Verdana,sans-serif; }
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ExtendedFileManager/assets/dialog.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ExtendedFileManager/assets/dialog.js
deleted file mode 100644
index 39eb62b..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ExtendedFileManager/assets/dialog.js
+++ /dev/null
@@ -1,115 +0,0 @@
-// Dialog v3.0 - Copyright (c) 2003-2004 interactivetools.com, inc.

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

-//

-// Portions (c) dynarch.com, 2003-2004

-//

-// A free WYSIWYG editor replacement for <textarea> fields.

-// For full source code and docs, visit http://www.interactivetools.com/

-//

-// Version 3.0 developed by Mihai Bazon.

-//   http://dynarch.com/mishoo

-//

-// $Id: dialog.js 1084 2008-10-12 17:42:42Z ray $

-

-// Though "Dialog" looks like an object, it isn't really an object.  Instead

-// it's just namespace for protecting global symbols.

-

-function Dialog(url, action, init) {

-	if (typeof init == "undefined") {

-		init = window;	// pass this window object by default

-	}

-	if (typeof window.showModalDialog == 'function')

-	{

-		Dialog._return = action;

-		var r = window.showModalDialog(url, init, "dialogheight=10;dialogwidth=10;resizable=yes");

-	}

-	else

-	{

-		Dialog._geckoOpenModal(url, action, init);

-	}

-}

-

-Dialog._parentEvent = function(ev) {

-    setTimeout( function() { if (Dialog._modal && !Dialog._modal.closed) { Dialog._modal.focus() } }, 50);

-    if (Dialog._modal && !Dialog._modal.closed) {

-        Dialog._stopEvent(ev);

-    }

-};

-

-// should be a function, the return handler of the currently opened dialog.

-Dialog._return = null;

-

-// constant, the currently opened dialog

-Dialog._modal = null;

-

-// the dialog will read it's args from this variable

-Dialog._arguments = null;

-

-Dialog._geckoOpenModal = function(url, action, init) {

-    //var urlLink = "hadialog"+url.toString();

-    var myURL = "hadialog"+url;

-    var regObj = /\W/g;

-    myURL = myURL.replace(regObj,'_');

-    var dlg = window.open(url, myURL,

-                  "toolbar=no,menubar=no,personalbar=no,width=10,height=10," +

-                  "scrollbars=no,resizable=yes,modal=yes,dependable=yes");

-    Dialog._modal = dlg;

-    Dialog._arguments = init;

-

-    // capture some window's events

-    function capwin(w) {

-        Dialog._addEvent(w, "click", Dialog._parentEvent);

-        Dialog._addEvent(w, "mousedown", Dialog._parentEvent);

-        Dialog._addEvent(w, "focus", Dialog._parentEvent);

-    };

-    // release the captured events

-    function relwin(w) {

-        Dialog._removeEvent(w, "click", Dialog._parentEvent);

-        Dialog._removeEvent(w, "mousedown", Dialog._parentEvent);

-        Dialog._removeEvent(w, "focus", Dialog._parentEvent);

-    };

-    capwin(window);

-    // capture other frames

-    for (var i = 0; i < window.frames.length; capwin(window.frames[i++]));

-    // make up a function to be called when the Dialog ends.

-    Dialog._return = function (val) {

-        if (val && action) {

-            action(val);

-        }

-        relwin(window);

-        // capture other frames

-        for (var i = 0; i < window.frames.length; relwin(window.frames[i++]));

-        Dialog._modal = null;

-    };

-};

-

-// event handling

-

-Dialog._addEvent = function(el, evname, func) {

-    if (Dialog.is_ie) {

-        el.attachEvent("on" + evname, func);

-    } else {

-        el.addEventListener(evname, func, true);

-    }

-};

-

-Dialog._removeEvent = function(el, evname, func) {

-    if (Dialog.is_ie) {

-        el.detachEvent("on" + evname, func);

-    } else {

-        el.removeEventListener(evname, func, true);

-    }

-};

-

-Dialog._stopEvent = function(ev) {

-    if (Dialog.is_ie) {

-        ev.cancelBubble = true;

-        ev.returnValue = false;

-    } else {

-        ev.preventDefault();

-        ev.stopPropagation();

-    }

-};

-

-Dialog.agt = navigator.userAgent.toLowerCase();

-Dialog.is_ie = ((Dialog.agt.indexOf("msie") != -1) && (Dialog.agt.indexOf("opera") == -1));
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ExtendedFileManager/assets/dragTableCols.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ExtendedFileManager/assets/dragTableCols.js
deleted file mode 100644
index 61234c5..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ExtendedFileManager/assets/dragTableCols.js
+++ /dev/null
@@ -1,131 +0,0 @@
-/** makes the columns of a given table resizable with the mouse
- * @author Raimund Meyer
- * @param id {String} the id of the table
- */
-function dragTableCols (id)
-{
-	this.table = document.getElementById(id);
-	var ths = this.table.rows[0].cells;
-	this.ths = ths;
-	var self = this;
-	var c;
-	for (var j = 0; j < this.table.rows.length; j++) 
-	{
-		for (var i = 0; i < this.table.rows[j].cells.length; i++) 
-		{
-			c = this.table.rows[j].cells[i];
-			c._i = i;
-			dragTableCols.addEvent(c, 'mousemove', function(e)
-			{
-				self.cellMouseMove(e);
-			});
-			dragTableCols.addEvent(c, 'mouseover', function(e)
-			{
-				e = e ? e : window.event;
-				var t = e.target  || e.srcElement;
-				t._pos = dragTableCols.getElementTopLeft(t);
-			});
-		}
-	}
-	function deactivate ()
-	{
-		 self.drag = false; self._col = null; document.body.style.cursor = '';
-	}
-	dragTableCols.addEvent(document.body, 'mousemove',function (e) { self.bodyMouseMove(e); });
-	dragTableCols.addEvent(document.body, 'mouseup',deactivate);
-	
-
-}
-dragTableCols.prototype.cellMouseMove = function (e)
-{
-	e = e ? e : window.event;
-	var t = e.target || e.srcElement;
-	
-	if ( typeof dragTableCols == 'undefined' ) return;// sometimes happens, no idea why
-	if (!t._pos) 
-	{
-		t._pos = dragTableCols.getElementTopLeft(t);
-		return;
-	}
-	
-	if (t.tagName.toLowerCase() != 'td' && t.tagName.toLowerCase() != 'th') return;
-	var self = this;
-	function activate (e)
-	{
-		e = e ? e : window.event;
-		self.drag = true;
-		self.startX = t._pos.left + t.offsetWidth;
-		self._col = t;
-		var offsetWidth = t.offsetWidth;
-		self.startWidth = (t.width) ? parseInt(t.width, 10) : t.offsetWidth;
-		t.style.width = self.startWidth + 'px';
-		self.offset = t.offsetWidth - offsetWidth; //padding + border; 
-		t.style.width = self.startWidth - self.offset+ 'px';
-	}
-	// activate right side
-	if (t._pos.left + t.offsetWidth - dragTableCols.getPageX (e)  < 5 && t != t.parentNode.cells[t.parentNode.cells.length -1] )
-	{
-		t.style.cursor = 'e-resize';
-
-		dragTableCols.addEvent(t,'mousedown', activate);
-	}
-	else 
-	{
-		t.style.cursor = '';
-		dragTableCols.removeEvent(t,'mousedown', activate);
-	}
-}
-dragTableCols.prototype.bodyMouseMove = function (e)
-{
-	if (!this.drag) return true;
-	e = e ? e : window.event;
-	var mouseX = dragTableCols.getPageX (e);
-	var delta = mouseX - this.startX;
-	document.body.style.cursor = (delta < 0) ? 'e-resize' : 'w-resize';
-	var newWidth = this.startWidth + delta - this.offset;
-	this._col.style.width =  ((newWidth > 10 ) ? newWidth : 10 ) + 'px';
-	return true;
-}
-
-dragTableCols.addEvent = function (obj, evType, fn)
-{
-    if (obj.addEventListener) { obj.addEventListener(evType, fn, true); }
-    else if (obj.attachEvent) { obj.attachEvent("on"+evType, fn);}
-    else {  return false; }
-}
-dragTableCols.removeEvent = function (obj, evType, fn)
-{
-    if (obj.addEventListener) { obj.removeEventListener(evType, fn, true); }
-    else if (obj.detachEvent) { obj.detachEvent("on"+evType, fn); }
-    else {  return false; }
-}
-dragTableCols.getElementTopLeft = function(element) 
-{
-  var curleft = 0;
-  var curtop = 0;
-  if (element.offsetParent) 
-  {
-    curleft = element.offsetLeft
-    curtop = element.offsetTop
-    while (element = element.offsetParent) 
-    {
-      curleft += element.offsetLeft
-      curtop += element.offsetTop
-    }
-  }
-  return { top:curtop, left:curleft };
-}
-dragTableCols.getPageX = function (e)
-{
-	if ( e.pageX ) return e.pageX;
-	else if (document.documentElement && document.documentElement.scrollTop)
-	// Explorer 6 Strict
-	{
-		return document.documentElement.scrollLeft + e.clientX;
-
-	}
-	else if (document.body) // all other Explorers
-	{
-		return document.body.scrollLeft + e.clientX;
-	}
-}
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ExtendedFileManager/assets/editor.css b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ExtendedFileManager/assets/editor.css
deleted file mode 100644
index 6779dcf..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ExtendedFileManager/assets/editor.css
+++ /dev/null
@@ -1,184 +0,0 @@
-		body

-		{

-			margin: 0; padding: 0;

-			font: 11px Tahoma,Verdana,sans-serif;

-		}

-		select, input, button { font: 11px Tahoma,Verdana,sans-serif; }

-

-		#indicator

-		{

-			width: 20px;

-			height: 20px;

-			background-color: #eef;			

-			padding: 15px 20px;

-		}

-		* html #indicator

-		{

-			padding: 14px 22px;

-		}

-		#tools

-		{

-			background-color: #eef;

-			padding: 0;

-			border-left: 1px solid white;

-			border-bottom: 1px solid white;

-		}

-		#toolbar

-		{

-			background-color: #eef;

-			text-align: center;

-			padding: 5px;

-			border-top: 1px solid white;

-			border-right: 1px solid white;

-			vertical-align: top;

-			width:50px;

-		}

-		

-		#contents

-		{

-			position: relative;

-		}

-		

-		#editor

-		{

-			width: 100%;

-			height: 100%;

-		}

-

-		#toolbar a 

-		{

-			padding: 5px;

-			width: 40px;

-			display: block;

-			border: 1px solid #eef;

-			text-align: center;

-			text-decoration: none;

-			color: #669;

-			margin: 5px 0;

-		}

-		#toolbar a:hover

-		{

-			background-color: #F9F9FF;

-			border-color: #669;

-		}

-		

-		#toolbar a.iconActive

-		{

-			border-color: #669;

-		}

-

-		#toolbar a span

-		{

-			display: block;

-			text-decoration: none;

-			

-		}

-		#toolbar a img

-		{

-			border: 0 none;

-		}

-		

-		#tools .textInput

-		{

-			width: 3em;

-			vertical-align: 0px;

-

-		}

-		* html #tools .textInput

-		{

-			vertical-align: middle;

-		}

-		#tools .measureStats

-		{

-			width: 4.5em;

-			border: 0 none;

-			background-color: #eef;

-			vertical-align: 0px;

-		}

-		* html #tools .measureStats

-		{

-			vertical-align: middle;

-		}

-		#tools label

-		{

-			margin: 0 2px 0 5px;

-		}

-		#tools input

-		{

-			vertical-align: middle;

-		}

-		#tools .tool_inputs

-		{

-			padding-top: 10px;

-			float: left;			

-		}

-		#tools .div

-		{

-			vertical-align: middle;

-			margin: 0 5px;

-		}

-		#tools img

-		{

-			border: 0 none;

-		}

-		#tools a.buttons

-		{

-			margin-top: 10px;

-			border: 1px solid #eef;

-			display: block;

-			float: left;

-		}

-		#tools a.buttons:hover

-		{

-			background-color: #F9F9FF;

-			border-color: #669;

-		}

-		#slidercasing {

-    /*border:1px solid #CCCCCC;

-    background-color:#FFFFFF;*/

-    width:100px;

-    height:5px;

-    position:relative;

-    z-index:4;

-    padding:10px;

-	 top: 6px;

-	 margin: 0 -5px 0 -10px;

-

-	

-}

-

-

-#slidertrack {

-    position:relative;

-    border:1px solid #CCCCCC;

-    background-color:#FFFFCC;

-    z-index:5;

-    height:5px;

-}

-

-

-#sliderbar {

-    position:absolute;

-    z-index:6;

-    border:1px solid #CCCCCC;

-    background-color:#DDDDDD;

-    width:15px;     

-    padding:0px;

-    height:20px; 

-    cursor: pointer;

-    top:2px;

-}

-

-* html #slidercasing

-{

-	top:0;

-}

-

-

-#bottom

-{

-	position: relative;

-	top: 490px;

-}

-

-#save_filename {width: 100px;}
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ExtendedFileManager/assets/editor.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ExtendedFileManager/assets/editor.js
deleted file mode 100644
index 9fe0107..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ExtendedFileManager/assets/editor.js
+++ /dev/null
@@ -1,231 +0,0 @@
-/**

- * Functions for the ImageEditor interface, used by editor.php only

- * Authors: Wei Zhuo, Afru, Krzysztof Kotowicz

- * Version: Updated on 08-01-2005 by Afru

- * Version: Updated on 20-06-2006 by Krzysztof Kotowicz

- * Version: Updated on 20-01-2008 by Raimund Meyer

- * Package: ExtendedFileManager (EFM 1.4)

- */

-

-var current_action = null;

-var actions = ['crop', 'scale', 'rotate', 'measure', 'save'];

-var orginal_width = null, orginal_height=null;

-function toggle(action)

-{

-    if(current_action != action)

-    {

-

-        for (var i in actions)

-        {

-            if(actions[i] != action)

-            {

-                var tools = document.getElementById('tools_'+actions[i]);

-                tools.style.display = 'none';

-                var icon = document.getElementById('icon_'+actions[i]);

-                icon.className = '';

-            }

-        }

-

-        current_action = action;

-

-        var tools = document.getElementById('tools_'+action);

-        tools.style.display = 'block';

-        var icon = document.getElementById('icon_'+action);

-        icon.className = 'iconActive';

-

-        var indicator = document.getElementById('indicator_image');

-        indicator.src = 'img/'+action+'.gif';

-

-        editor.setMode(current_action);

-

-        //constraints on the scale,

-        //code by Frédéric Klee <fklee@isuisse.com>

-        if(action == 'scale')

-        {

-            var theImage = editor.window.document.getElementById('theImage');

-            orginal_width = theImage._width ;

-            orginal_height = theImage._height;

-

-            var w = document.getElementById('sw');

-            w.value = orginal_width ;

-            var h = document.getElementById('sh') ;

-            h.value = orginal_height ;

-        }

-		if ( action == 'save' )

-		{

-			var formatSelect = document.getElementById('save_format');

-			var format = document.getElementById('save_filename').value.match(/\.(gif|png|jpe?g)/i)[1].toLowerCase();

-			switch ( format )

-			{

-				case 'png':

-					formatSelect.selectedIndex = '3';

-				break;

-				case 'gif':

-					formatSelect.selectedIndex = '4';

-				break;

-				default:

-					formatSelect.selectedIndex = '0';

-				break;

-			}

-			formatSelect.onchange();

-		}

-    }

-}

-

-function toggleMarker()

-{

-    var marker = document.getElementById("markerImg");

-

-    if(marker != null && marker.src != null) {

-        if(marker.src.indexOf("t_black.gif") >= 0)

-            marker.src = "img/t_white.gif";

-        else

-            marker.src = "img/t_black.gif";

-

-        editor.toggleMarker();

-    }

-}

-

-//Togggle constraints, by Frédéric Klee <fklee@isuisse.com>

-function toggleConstraints()

-{

-    var lock = document.getElementById("scaleConstImg");

-    var checkbox = document.getElementById("constProp");

-

-    if(lock != null && lock.src != null) {

-        if(lock.src.indexOf("unlocked2.gif") >= 0)

-        {

-            lock.src = "img/islocked2.gif";

-            checkbox.checked = true;

-            checkConstrains('width');

-

-        }

-        else

-        {

-            lock.src = "img/unlocked2.gif";

-            checkbox.checked = false;

-        }

-    }

-}

-

-//check the constraints, by Frédéric Klee <fklee@isuisse.com>

-function checkConstrains(changed)

-{

-    var constrained = document.getElementById('constProp');

-    if(constrained.checked)

-    {

-        var w = document.getElementById('sw') ;

-        var width = w.value ;

-        var h = document.getElementById('sh') ;

-        var height = h.value ;

-

-        if(orginal_width > 0 && orginal_height > 0)

-        {

-            if(changed == 'width' && width > 0)

-                h.value = parseInt((width/orginal_width)*orginal_height);

-            else if(changed == 'height' && height > 0)

-                w.value = parseInt((height/orginal_height)*orginal_width);

-        }

-    }

-

-    updateMarker('scale') ;

-}

-

-function updateMarker(mode)

-{

-    if (mode == 'crop')

-    {

-        var t_cx = document.getElementById('cx');

-        var t_cy = document.getElementById('cy');

-        var t_cw = document.getElementById('cw');

-        var t_ch = document.getElementById('ch');

-

-        editor.setMarker(parseInt(t_cx.value), parseInt(t_cy.value), parseInt(t_cw.value), parseInt(t_ch.value));

-    }

-    else if(mode == 'scale') {

-        var s_sw = document.getElementById('sw');

-        var s_sh = document.getElementById('sh');

-        editor.setMarker(0, 0, parseInt(s_sw.value), parseInt(s_sh.value));

-    }

-}

-

-function rotateSubActionSelect(selection)

-{

-	var value = selection.options[selection.selectedIndex].value;

-	

-	var rotate_preset_select = document.getElementById('rotate_preset_select');

-	var flip = document.getElementById('flip');

-	var angle = document.getElementById('ra').parentNode;

-	

-	switch (value)

-	{

-		case 'rotate':

-			rotate_preset_select.style.display = '';

-			flip.style.display = 'none';

-			angle.style.display = '';

-		break;

-		case 'flip':

-			rotate_preset_select.style.display = 'none';

-			flip.style.display = '';

-			angle.style.display = 'none';

-		break;

-	}

-}

-function rotatePreset(selection)

-{

-    var value = selection.options[selection.selectedIndex].value;

-

-    if(value.length > 0 && parseInt(value) != 0) {

-        var ra = document.getElementById('ra');

-        ra.value = parseInt(value);

-    }

-}

-

-function updateFormat(selection)

-{

-    var selected = selection.options[selection.selectedIndex].value;

-

-    var values = selected.split(",");

-	if ( values[0] != 'jpeg' ) document.getElementById('slider').style.display = 'none';

-	else document.getElementById('slider').style.display = 'inline';

-    if(values.length >1) {

-        updateSlider(parseInt(values[1]));

-    }

-

-}

-function zoom()

-{

-	var theImage = editor.window.document.getElementById('theImage');

-	var value = document.getElementById('zoom').value;

-	theImage.width = theImage._width * parseInt( value, 10 ) / 100;	

-	theImage.height = theImage._height * parseInt( value, 10 )/ 100;

-	editor.reset();

-	editor.pic_width = null;

-	editor.pic_height = null;

-}

-function addEvent(obj, evType, fn)

-{

-    if (obj.addEventListener) { obj.addEventListener(evType, fn, true); return true; }

-    else if (obj.attachEvent) {  var r = obj.attachEvent("on"+evType, fn);  return r;  }

-    else {  return false; }

-}

-

-var init = function()

-{

-    if(window.opener)

-    {

-        __xinha_dlg_init();

-        __dlg_translate('ExtendedFileManager');

-    }

-	addEvent(window, 'resize', winOnResize);

-	try { window.moveTo(0,0); } catch (e) {}

-	window.resizeTo(window.screen.availWidth,window.screen.availHeight);

-	winOnResize();

-}

-function winOnResize ()

-{

-	if ( typeof editor.reset == 'function' && typeof editor.ant != 'undefined'  ) editor.reset();

-	var win = Xinha.viewportSize(window);

-	document.getElementById("contents").style.height = win.y - parseInt(document.getElementById("indicator").offsetHeight,10) - 5 + 'px';

-}

-Xinha.addOnloadHandler( init, window );
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ExtendedFileManager/assets/editorFrame.css b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ExtendedFileManager/assets/editorFrame.css
deleted file mode 100644
index d0d841b..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ExtendedFileManager/assets/editorFrame.css
+++ /dev/null
@@ -1,17 +0,0 @@
-body { margin: 0; padding: 0;  background-color: #eee; }
-table { width: 100%; }
-table td { text-align: center; }
-.crop{cursor:crosshair;}
-.selection { border: dotted 1px #000000; position:absolute; width: 0px; height: 1px; z-index:5; }
-.selectionWhite{ border: dotted 1px #FFFFFF; position:absolute; width: 0px; height: 1px; z-index:5; }
-.handleBox{ z-index:105; }
-.error { font-size:large; font-weight:bold; color:#c00; font-family: Helvetica, sans-serif; } 
-
-#n-resize  {cursor: n-resize  }
-#s-resize  {cursor: s-resize  }
-#w-resize  {cursor: w-resize  }
-#e-resize  {cursor: e-resize  }
-#nw-resize {cursor: nw-resize }
-#sw-resize {cursor: sw-resize }
-#ne-resize {cursor: ne-resize }
-#se-resize {cursor: se-resize }
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ExtendedFileManager/assets/editorFrame.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ExtendedFileManager/assets/editorFrame.js
deleted file mode 100644
index 86db4d3..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ExtendedFileManager/assets/editorFrame.js
+++ /dev/null
@@ -1,108 +0,0 @@
-/**

- * Javascript used by the editorFrame.php, it basically initializes the frame.

- * Authors: Wei Zhuo, Afru, Krzysztof Kotowicz

- * Version: Updated on 08-01-2005 by Afru

- * Version: Updated on 20-06-2006 by Krzysztof Kotowicz

- * Version: Updated on 20-01-2008 by Raimund Meyer

- * Package: ExtendedFileManager (EFM 1.4)

- * http://www.afrusoft.com/htmlarea

- */

-

-var topDoc = window.top.document;

-

-var t_cx = topDoc.getElementById('cx');

-var t_cy = topDoc.getElementById('cy');

-var t_cw = topDoc.getElementById('cw');

-var t_ch = topDoc.getElementById('ch');

-

-var m_sx = topDoc.getElementById('sx');

-var m_sy = topDoc.getElementById('sy');

-var m_w = topDoc.getElementById('mw');

-var m_h = topDoc.getElementById('mh');

-var m_a = topDoc.getElementById('ma');

-var m_d = topDoc.getElementById('md');

-

-var s_sw = topDoc.getElementById('sw');

-var s_sh = topDoc.getElementById('sh');

-

-var r_ra = topDoc.getElementById('ra');

-

-var pattern = "img/2x2.gif";

-

-function doSubmit(action)

-{

-    if (action == 'crop')

-    {

-        var url = _backend_url + "__function=editorFrame&img="+currentImageFile+"&action=crop&params="+parseInt(t_cx.value)+','+parseInt(t_cy.value)+','+ parseInt(t_cw.value)+','+parseInt(t_ch.value);

-

-        //alert(url);

-        location.href = url;

-

-        //location.reload();

-    }

-    else if (action == 'scale')

-    {

-        var url = _backend_url + "__function=editorFrame&img="+currentImageFile+"&action=scale&params="+parseInt(s_sw.value)+','+parseInt(s_sh.value);

-        //alert(url);

-        location.href = url;

-

-    }

-    else if (action == 'rotate')

-    {

-        var rotate_sub_action = topDoc.getElementById('rotate_sub_action');

-

-        if(rotate_sub_action.value == 'flip')

-            location.href = _backend_url + "__function=editorFrame&img="+currentImageFile+"&action=flip&params="+topDoc.getElementById('flip').value;

-        else if (isNaN(parseFloat(r_ra.value))==false)

-            location.href = _backend_url + "__function=editorFrame&img="+currentImageFile+"&action=rotate&params="+parseFloat(r_ra.value);

-    }

-    else if(action == 'save') {

-        var s_file = topDoc.getElementById('save_filename');

-        var s_format = topDoc.getElementById('save_format');

-        var s_quality = topDoc.getElementById('quality');

-

-        var format = s_format.value.split(",");

-        if(s_file.value.length <= 0)

-        {

-            alert(i18n('Please enter a filename to save.'));

-        }

-        else

-        {

-            var filename = encodeURI(s_file.value);

-			var quality = parseInt(s_quality.value);

-			var format = s_format.value.split(",");

-			var url = _backend_url + "__function=editorFrame&img="+currentImageFile+"&action=save&params="+format[0]+","+quality+"&file="+filename;

-	        location.href = url;

-        }

-    }

-	else if (action == 'preview') {

-		var s_format = topDoc.getElementById('save_format');

-        var s_quality = topDoc.getElementById('quality');

-		var quality = parseInt(s_quality.value);

-		var format = s_format.value.split(",");

-		var url = _backend_url + "__function=editorFrame&img="+currentImageFile+"&action=preview&params="+format[0]+","+quality+"&file="+filename;

-        location.href = url;

-	}

-}

-

-function addEvent(obj, evType, fn)

-{

-    if (obj.addEventListener) { obj.addEventListener(evType, fn, true); return true; }

-    else if (obj.attachEvent) {  var r = obj.attachEvent("on"+evType, fn);  return r;  }

-    else {  return false; }

-}

-

-var jg_doc;

-

-init = function()

-{

-    jg_doc = new jsGraphics("imgCanvas"); // draw directly into document

-    jg_doc.setColor("#000000"); // black

-	

-    initEditor();

-	if (window.parent.document.getElementById('zoom').value != '100') window.parent.zoom();

-	reset();

-	window.parent.document.getElementById('filesize').innerHTML = fileSize; 

-};

-

-addEvent(window, 'load', init);
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ExtendedFileManager/assets/hover.htc b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ExtendedFileManager/assets/hover.htc
deleted file mode 100644
index 4e81af4..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ExtendedFileManager/assets/hover.htc
+++ /dev/null
@@ -1,34 +0,0 @@
-<attach event="onmouseover" handler="hoverRollOver" />

-<attach event="onmouseout" handler="hoverRollOff" />

-<script type="text/javascript">

-//

-//	Simple behaviour for IE5+ to emulate :hover CSS pseudo-class.

-//  Experimental ver 0.1

-//

-//	This is an experimental version! Handle with care!

-//	Manual at: http://www.hszk.bme.hu/~hj130/css/list_menu/hover/

-//

-

-function hoverRollOver() {

-	

-	element.origClassName = element.className;	// backup origonal className

-	

-	var tempClassStr = element.className;		

-	

-	tempClassStr += "Hover";					// convert name+'Hover' the last class name	to emulate tag.class:hover

-	

-	tempClassStr = tempClassStr.replace(/\s/g,"Hover ");	//convert name+'Hover' the others to emulate tag.class:hover

-	

-	tempClassStr += " hover";				// add simple 'hover' class name to emulate tag:hover

-	

-	element.className = element.className + " " + tempClassStr; 

-	

-	//alert(element.className);

-	//window.status = element.className;		// only for TEST

-}

-function hoverRollOff() {

-	element.className = element.origClassName;

-}

-

-</script>

-

diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ExtendedFileManager/assets/imagelist.css b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ExtendedFileManager/assets/imagelist.css
deleted file mode 100644
index abd247d..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ExtendedFileManager/assets/imagelist.css
+++ /dev/null
@@ -1,55 +0,0 @@
-body { margin: 0; padding: 0;}

-.edit,.dir_holder .fileName, .thumb_holder .fileName    { font-size: 8pt; font-family: small-caption, sans-serif; padding-top: 3px;}

-.edit a { border: none; padding: 0; text-decoration:none; }

-.edit a:hover { background-color: ButtonHighlight; }

-.edit a img { border: none; vertical-align: bottom; }

-.noResult { font-size:large; font-weight:bold; color:#ccc; font-family: Helvetica, sans-serif;  text-align: center;  padding-top: 60px;   }

-.error { color:#c00; font-weight:bold; font-size: medium; font-family: Helvetica, sans-serif; text-align: center;  padding-top: 65px;}

-

-.dir_holder, .thumb_holder

-{

-  width:106px; height:132px;

-  float:left;

-  margin:6px 4px;

-  background-color:ButtonFace;

-  border: 1px outset;

-}

-

-.thumb_holder.active

-{

-  background:Highlight;

-  color:HighlightText;

-  border:1px dashed Highlight;

-}

-

-.dir_holder a.dir, .thumb_holder a.thumb

-{

-  height:85px;

-  display:block;

-  text-align:center;

-  padding:5px;

-  text-decoration:none;

-  overflow:hidden;

-}

-

-.thumb_holder a.thumb img

-{

-  border:1px solid black;

-}

-

-.dir_holder a.dir img

-{

-  border:none;

-}

-

-.listview { width:100%; }

-.listview td, .listview th { text-align:left; font-size:small; }

-.listview td.actions { text-align: right;width:111px }

-.listview td.actions img { border:0; }

-

-.listview thead th {background-color: ButtonFace; border: 1px solid threedface; border-color: ButtonHighlight ButtonShadow ButtonShadow ButtonHighlight; padding-top:2px; padding-bottom:2px; padding-left: 5px; padding-right: 5px; font-size: 9pt; font-family: "MS Sans Serif", "Bitstream Vera Sans", Geneva, Sans, sans-serif;font-weight:normal}

-.listview tbody td, .listview tbody th {overflow:hidden; padding-top:2px; padding-left: 3px; font-size: 9pt;  font-family: "MS Sans Serif", "Bitstream Vera Sans", Geneva, Sans, sans-serif;}

-.listview tbody a, listview tbody a:visited { font-weight: normal; text-decoration: none; color: #000; border:0px; padding:2px;}

-.listview tbody a:hover { background-color:#0B256B; color:#fff;}

-

-.listview tbody tr:hover {background-color: rgb(221,221,255)};

diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ExtendedFileManager/assets/images.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ExtendedFileManager/assets/images.js
deleted file mode 100644
index 7c27275..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ExtendedFileManager/assets/images.js
+++ /dev/null
@@ -1,313 +0,0 @@
-/**

- * Functions for the image listing, used by images.php only

- * Authors: Wei Zhuo, Afru, Krzysztof Kotowicz, Raimund Meyer

- * Version: Updated on 08-01-2005 by Afru

- * Version: Updated on 04-07-2006 by Krzysztof Kotowicz

- * Version: Updated on 17-11-2006 by Raimund Meyer

- * Package: ExtendedFileManager (EFM 1.1.3)

- * http://www.afrusoft.com/htmlarea

- */

-

-function i18n(str) {

-    return Xinha._lc(str, 'ExtendedFileManager');

-}

-

-function changeDir(newDir)

-{

-    showMessage('Loading');

-    var mode=window.top.document.getElementById('manager_mode').value;

-    var selection = window.top.document.getElementById('viewtype');

-    var viewtype = selection.options[selection.selectedIndex].value;

-    location.href = _backend_url + "__function=images&mode="+mode+"&dir="+newDir+"&viewtype="+viewtype;

-	document.cookie = "EFMStartDir" + mode + "="+newDir;

-}

-

-function newFolder(dir, newDir)

-{

-    var mode=window.top.document.getElementById('manager_mode').value;

-    var selection = window.top.document.getElementById('viewtype');

-    var viewtype = selection.options[selection.selectedIndex].value;

-    location.href = _backend_url + "__function=images&mode="+mode+"&dir="+dir+"&newDir="+newDir+"&viewtype="+viewtype;

-}

-

-function renameFile(oldPath) {

- // strip directory and extension

-  var oldName=oldPath.replace(/.*%2F/,'').replace(/\..*$/,'');

-  

-  var rename = function (newName)

-  {

-    if(newName == '' || newName == null || newName == oldName)

-    {

-        alert(i18n('Cancelled rename.'));

-        return false;

-    }

-    var mode=window.top.document.getElementById('manager_mode').value;

-    var selection = window.top.document.getElementById('dirPath');

-    var dir = selection.options[selection.selectedIndex].value;

-    selection = window.top.document.getElementById('viewtype');

-    var viewtype = selection.options[selection.selectedIndex].value;

-    location.href = _backend_url + "__function=images&mode="+mode+"&dir="+dir+"&rename="+oldPath+"&renameTo="+newName+"&viewtype="+viewtype;

-  }

-  

-   // IE7 has crippled the prompt()

-  if ( Xinha.ie_version > 6 )

-  {

-    popupPrompt(i18n("Please enter new name for this file..."), oldName, rename, i18n("Rename"));

-  }

-  else

-  {

-    var newName = prompt(i18n('Please enter new name for this file...'), oldName);

-    rename(newName);

-  }

-}

-function renameDir(oldName) 

-{

-  // strip directory and extension

-

-  function rename(newName)

-  {

-    if(newName == '' || newName == null || newName == oldName)

-    {

-      alert(i18n('Cancelled rename.'));

-      return false;

-    }

-    var mode=window.top.document.getElementById('manager_mode').value;

-    var selection = window.top.document.getElementById('dirPath');

-    var dir = selection.options[selection.selectedIndex].value;

-    selection = window.top.document.getElementById('viewtype');

-    var viewtype = selection.options[selection.selectedIndex].value;

-    location.href = _backend_url + "__function=images&mode="+mode+"&dir="+dir+"&rename="+oldName+"&renameTo="+newName+"&viewtype="+viewtype;

-  }

-  

-  // IE7 has crippled the prompt()

-  if ( Xinha.ie_version > 6 )

-  {

-    popupPrompt(i18n('Please enter new name for this folder...'), oldName, rename, i18n("Rename"));

-  }

-  else

-  {

-    var newName = prompt(i18n('Please enter new name for this folder...'), oldName);

-    rename(newName);

-  }

-}

-function copyFile(file,action)

-{

-	var selection = window.top.document.getElementById('dirPath');

-    var dir = selection.options[selection.selectedIndex].value;

-	window.top.pasteButton({'dir':dir,'file':file,'action':action+'File'});

-}

-function copyDir(dirToCopy,action)

-{

-	var selection = window.top.document.getElementById('dirPath');

-    var dir = selection.options[selection.selectedIndex].value;

-	window.top.pasteButton({'dir':dir,'file':dirToCopy,'action':action+'Dir'});

-}

-function paste(action)

-{

-    var mode=window.top.document.getElementById('manager_mode').value;

-    var selection = window.top.document.getElementById('dirPath');

-    var dir = selection.options[selection.selectedIndex].value;

-    selection = window.top.document.getElementById('viewtype');

-    var viewtype = selection.options[selection.selectedIndex].value;

-	location.href = _backend_url + "__function=images&mode="+mode+"&dir="+dir+"&paste="+action.action+"&srcdir="+action.dir+"&file="+action.file+"&viewtype="+viewtype;

-}

-//update the dir list in the parent window.

-function updateDir(newDir)

-{

-	var mode = window.top.document.getElementById('manager_mode').value;

-	document.cookie = "EFMStartDir" + mode + "="+newDir;

-    

-	var selection = window.top.document.getElementById('dirPath');

-    if(selection)

-    {

-        for(var i = 0; i < selection.length; i++)

-        {

-            var thisDir = selection.options[i].text;

-            if(thisDir == newDir)

-            {

-                selection.selectedIndex = i;

-                showMessage('Loading');

-                break;

-            }

-        }

-    }

-

-}

-

-function emptyProperties()

-{

-    toggleImageProperties(false);

-    var topDoc = window.top.document;

-    topDoc.getElementById('f_url').value = '';

-    topDoc.getElementById('f_alt').value = '';

-    topDoc.getElementById('f_title').value = '';

-    topDoc.getElementById('f_width').value = '';

-    topDoc.getElementById('f_margin').value = '';

-    topDoc.getElementById('f_height').value = '';

-    topDoc.getElementById('f_padding').value = '';

-    topDoc.getElementById('f_border').value = '';

-    topDoc.getElementById('f_borderColor').value = '';

-    topDoc.getElementById('f_backgroundColor').value = '';

-}

-

-function toggleImageProperties(val)

-{

-    var topDoc = window.top.document;

-    if(val==true)

-    {

-        topDoc.getElementById('f_width').value = '';

-        topDoc.getElementById('f_margin').value = '';

-        topDoc.getElementById('f_height').value = '';

-        topDoc.getElementById('f_padding').value = '';

-        topDoc.getElementById('f_border').value = '';

-        topDoc.getElementById('f_borderColor').value = '';

-        topDoc.getElementById('f_backgroundColor').value = '';

-    }

-    topDoc.getElementById('f_width').disabled = val;

-    topDoc.getElementById('f_margin').disabled = val;

-    topDoc.getElementById('f_height').disabled = val;

-    topDoc.getElementById('f_padding').disabled = val;

-    topDoc.getElementById('f_align').disabled = val;

-    topDoc.getElementById('f_border').disabled = val;

-    topDoc.getElementById('f_borderColor').value = '';

-    topDoc.getElementById('f_backgroundColor').value = '';

-    topDoc.getElementById('constrain_prop').disabled = val;

-}

-

-function selectImage(filename, alt, width, height)

-{

-    var topDoc = window.top.document;

-

-    if(topDoc.getElementById('manager_mode').value=="image")

-    {

-        var obj = topDoc.getElementById('f_url');  obj.value = filename;

-        obj = topDoc.getElementById('f_alt'); obj.value = alt;

-        obj = topDoc.getElementById('f_title'); obj.value = alt;

-

-        if(width==0 && height==0) toggleImageProperties(true);

-        else

-        {

-            toggleImageProperties(false);

-            var obj = topDoc.getElementById('f_width');  obj.value = width;

-            var obj = topDoc.getElementById('f_height'); obj.value = height;

-            var obj = topDoc.getElementById('orginal_width'); obj.value = width;

-            var obj = topDoc.getElementById('orginal_height'); obj.value = height;

-            update_selected();

-        }

-    }

-    else if (topDoc.getElementById('manager_mode').value=="link")

-    {

-        var obj = topDoc.getElementById('f_href');  obj.value = filename;

-        var obj = topDoc.getElementById('f_title'); obj.value = alt;

-    }

-

-    return false;

-}

-

-var _current_selected = null;

-

-function update_selected()

-{

-    var topDoc = window.top.document;

-    if(_current_selected)

-    {

-        _current_selected.className = _current_selected.className.replace(/(^| )active( |$)/, '$1$2');

-        _current_selected = null;

-    }

-    // Grab the current file, and highlight it if we have it

-    var c_file = topDoc.getElementById('f_url').value;

-    var selection = topDoc.getElementById('dirPath');

-    var currentDir = selection.options[selection.selectedIndex].text;

-    var dRe = new RegExp('^(' + currentDir.replace(/([\/\^$*+?.()|{}[\]])/g, '\\$1') + ')([^/]*)$');

-    if(dRe.test(c_file))

-    {

-        var holder = document.getElementById('holder_' + asc2hex(RegExp.$2));

-        if(holder)

-        {

-            _current_selected = holder;

-            holder.className += ' active';

-        }

-    }

-    showPreview(c_file);

-}

-

-function asc2hex(str)

-{

-    var hexstr = '';

-    for(var i = 0; i < str.length; i++)

-    {

-        var hex = (str.charCodeAt(i)).toString(16);

-        if(hex.length == 1) hex = '0' + hex;

-        hexstr += hex;

-    }

-    return hexstr;

-}

-

-function showMessage(newMessage)

-{

-    var topDoc = window.top.document;

-

-    var message = topDoc.getElementById('message');

-    var messages = topDoc.getElementById('messages');

-    if(message && messages)

-    {

-        if(message.firstChild)

-            message.removeChild(message.firstChild);

-

-        message.appendChild(topDoc.createTextNode(i18n(newMessage)));

-

-        messages.style.display = "block";

-    }

-}

-

-function updateDiskMesg(newMessage)

-{

-    var topDoc = window.top.document;

-

-    var diskmesg = topDoc.getElementById('diskmesg');

-    if(diskmesg)

-    {

-        if(diskmesg.firstChild)

-            diskmesg.removeChild(diskmesg.firstChild);

-

-        diskmesg.appendChild(topDoc.createTextNode(newMessage));

-

-    }

-}

-

-function addEvent(obj, evType, fn)

-{

-    if (obj.addEventListener) { obj.addEventListener(evType, fn, true); return true; }

-    else if (obj.attachEvent) {  var r = obj.attachEvent("on"+evType, fn);  return r;  }

-    else {  return false; }

-}

-

-function confirmDeleteFile(file)

-{

-    if(confirm(i18n('Delete file "$file=' + file +'$"?')))

-        return true;

-

-    return false;

-}

-

-function confirmDeleteDir(dir, count)

-{

-   /* if(count > 0)

-    {

-        alert(i18n("Folder is not empty. Please delete all Files and Subfolders inside."));

-        return false;

-    }*/

-

-    if(confirm(i18n('Delete folder "$dir=' + dir +'$"?')))

-        return true;

-

-    return false;

-}

-

-function showPreview(f_url)

-{

-    window.parent.document.getElementById('f_preview').src =

-    f_url ? window.parent._backend_url + '__function=thumbs&img=' + f_url :window.parent.opener.Xinha.getPluginDir('ExtendedFileManager')+'/img/1x1_transparent.gif';

-}

-

-addEvent(window, 'load', init);
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ExtendedFileManager/assets/manager.css b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ExtendedFileManager/assets/manager.css
deleted file mode 100644
index ad900ad..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ExtendedFileManager/assets/manager.css
+++ /dev/null
@@ -1,49 +0,0 @@
-html, body, .dialog {  background-color: ButtonFace;  color: ButtonText; font: 11px Tahoma,Verdana,sans-serif; margin: 0; padding: 0;}

-body { padding: 5px; }

-fieldset { padding: 0;}

-.title { background-color: #ddf; color: #000; font-weight: bold; font-size: 120%; padding: 3px 10px; margin-bottom: 10px; border-bottom: 1px  solid black; letter-spacing: 2px;}

-form { padding: 0px;  margin: 0 auto; width: 100%;}

-/*.dirWidth { width: 60%; }*/

-a { padding: 5px; border: 1px solid ButtonFace;	}	

-a img	{ border: 0; }	

-a:hover { border-color: ButtonHighlight ButtonShadow ButtonShadow ButtonHighlight; }

-.dirs {	padding: 1em; 	}

-

-.imageFrame { overflow-x:hidden; width: 100%; height: 155px; margin:0px; background-color: #fff;}

-.smallWidth{ width: 4em; }

-.largelWidth{ width: 30em; }

-.extralargelWidth{ width: 100%; }

-.inputTable { margin: 1em auto 1em 0;width:100%}

-select, input, button { font: 11px Tahoma,Verdana,sans-serif; }

-.buttons { width: 70px; text-align: center; }

-.clearboth{ clear: both; }

-#messages {opacity:0.8;filter:Alpha(opacity=85);position:relative;height:20px;margin-bottom:-30px;background-color: white;  border: none; text-align: center; padding: 5px; }

-#message  { font-size: 15px; font-weight: bold; color: #69c; }

-iframe { border:1px inset; border-right:none; border-left:none; border-bottom:none; }

-#controls {padding-bottom:10px;}

-table { margin-top:10px; }

-th, td { padding-right:3px; text-align:left; font-family:small-caption,helvetica,sans-serif; }

-.dirWidth {width: 59%}

-

-.buttonColor {

-  width :1em;

-  margin-left: 2px;

-  cursor: default;

-}

-

-.buttonColor .chooser, .buttonColor .nocolor {

-  height: 0.6em;

-  border: 1px solid;

-  padding: 0px 1em;

-  border-color: ButtonHighlight ButtonShadow ButtonShadow ButtonHighlight;

-}

-

-.buttonColor .buttonClick {

-  border-color: ButtonShadow ButtonHighlight ButtonHighlight ButtonShadow;

-}

-.buttonColor .buttonColor-hilite {

-  border-color: ButtonShadow ButtonHighlight ButtonHighlight ButtonShadow;

-}

-

-.buttonColor .nocolor { padding: 0px; }

-.buttonColor .nocolor-hilite { background-color: #fff; color: #f00; }

diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ExtendedFileManager/assets/manager.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ExtendedFileManager/assets/manager.js
deleted file mode 100644
index e29fefb..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ExtendedFileManager/assets/manager.js
+++ /dev/null
@@ -1,554 +0,0 @@
-/**

- * Functions for the ExtendedFileManager, used by manager.php only

- * Authors: Wei Zhuo, Afru, Krzysztof Kotowicz, Raimund Meyer

- * Version: Updated on 08-01-2005 by Afru

- * Version: Updated on 20-06-2006 by Krzysztof Kotowicz

- * Version: Updated on 17-11-2006 by Raimund Meyer

- * Version: Updated on 20-01-2008 by Raimund Meyer

- * Package: ExtendedFileManager (EFM 1.4)

- * http://www.afrusoft.com/htmlarea

- */

-

-function comboSelectValue(c, val) {

-    var ops = c.getElementsByTagName("option");

-    for (var i = ops.length; --i >= 0;) {

-        var op = ops[i];

-        op.selected = (op.value == val);

-    }

-    c.value = val;

-}

-

-//Translation

-function i18n(str) {

-    return Xinha._lc(str, 'ExtendedFileManager');

-}

-

-//set the alignment options

-function setAlign(align)

-{

-    var selection = document.getElementById('f_align');

-    for(var i = 0; i < selection.length; i++)

-    {

-        if(selection.options[i].value == align)

-        {

-            selection.selectedIndex = i;

-            break;

-        }

-    }

-}

-

-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 ()

-{

-	if (typeof imgManager == 'undefined' )

-	{

-		setTimeout(init,10); // sometimes we are too hasty

-		return;

-	}

-	

-	var w = 650;

-	var h = 600;

-	

-	window.resizeTo(w,h);

-	var page = Xinha.pageSize(window);

-	window.resizeTo(w,h);

-	

-	var dim = Xinha.viewportSize(window);

-

-	window.resizeBy(0, page.y - dim.y + 5);

-

-	dim = Xinha.viewportSize(window);

-	

-	if (!Xinha.is_ie)

-	{

-	  var x = opener.screenX + (opener.outerWidth - dim.x) / 2;

-	  var y = opener.screenY + (opener.outerHeight - dim.x) / 2;

-	}

-	else

-	{//IE does not have window.outer... , so center it on the screen at least

-	  var x =  (self.screen.availWidth - dim.x) / 2;

-	  var y =  (self.screen.availHeight - dim.y) / 2;	

-	}

-	window.moveTo(x,y);

-	

-	__xinha_dlg_init();

-    __dlg_translate('ExtendedFileManager');

-

-    var uploadForm = document.getElementById('uploadForm');

-    if(uploadForm) uploadForm.target = 'imgManager';

-    

-    var editor = window.dialogArguments.editor;

-

-    var param = window.dialogArguments.param;

-    var startDir = null;

-	

-    if(manager_mode=="image" && param)

-    {

-        var absoluteURL = new RegExp('^https?://');

-

-        if (param.f_url.length > 0 && !absoluteURL.test(param.f_url) && typeof param.baseHref == "string") {

-            // URL is not absolute, prepend baseHref

-            param.f_url = param.baseHref + param.f_url;

-        }

-

-        // strip base_url from url

-        var image_regex = new RegExp( '(https?://[^/]*)?' + base_url.replace(/\/$/, '') );

-        param.f_url = param.f_url.replace( image_regex, "" );

-

-        // The image URL may reference one of the automatically resized images

-        // (when the user alters the dimensions in the picker), clean that up

-        // so it looks right and we get back to a normal f_url

-        var rd = (_resized_dir) ? _resized_dir.replace(Xinha.RE_Specials, '\\$1') + '/' : '';

-        var rp = _resized_prefix.replace(Xinha.RE_Specials, '\\$1');

-        var dreg = new RegExp('^(.*/)' + rd + rp + '_([0-9]+)x([0-9]+)_([^/]+)$');

-

-        var match = param.f_url.match(dreg);

-

-        if(dreg.test(param.f_url))

-        {

-          param.f_url    = RegExp.$1 + RegExp.$4;

-          param.f_width  = RegExp.$2;

-          param.f_height = RegExp.$3;

-        }

-

-        document.getElementById("f_url").value = param["f_url"];

-        document.getElementById("f_alt").value = param["f_alt"];

-        document.getElementById("f_title").value = param["f_title"];

-        document.getElementById("f_border").value = param["f_border"];

-        document.getElementById("f_width").value = param["f_width"];

-        document.getElementById("f_height").value = param["f_height"];

-        document.getElementById("f_margin").value = param["f_margin"];

-        document.getElementById("f_padding").value = param["f_padding"];

-        document.getElementById("f_borderColor").value = param["f_borderColor"];

-        document.getElementById("f_backgroundColor").value = param["f_backgroundColor"];

-

-        setAlign(param["f_align"]);

-

-        document.getElementById("f_url").focus();

-

-        document.getElementById("orginal_width").value = param["f_width"];

-        document.getElementById("orginal_height").value = param["f_height"];

-

-        // Locate to the correct directory

-        var dreg = new RegExp('^(.*/)([^/]+)$');

-        if (dreg.test(param['f_url']))

-        {

-		  startDir = RegExp.$1;

-        }

-

-        document.getElementById('f_preview').src = _backend_url + '__function=thumbs&img=' + param.f_url;

-

-    }

-

-    else if(manager_mode=="link" && param)

-    {

-        var target_select = document.getElementById("f_target");

-        var absoluteURL = new RegExp('^(/|(https?://))');

-

-        if (param.f_href.length > 0 && !absoluteURL.test(param.f_href) && typeof param.baseHref == "string") {

-            // URL is not absolute, prepend baseHref

-            param.f_href = param.baseHref + param.f_href;

-        }

-

-        // strip base_url from href

-        var href_regex = new RegExp( '(https?://[^/]*)?' + base_url.replace(/\/$/, '') );

-        param.f_href = param.f_href.replace( href_regex, "" );

-

-        // Locate to the correct directory

-        var dreg = new RegExp('^(.*/)([^/]+)$');

-        if (dreg.test(param['f_href']))

-        {

-        	startDir = RegExp.$1;

-        }

-        else

-        {

-        	startDir = document.cookie.match(/EFMStartDirlink=(.*?)(;|$)/);

-        	if (startDir) startDir = startDir[1];

-        }

-        

-        if (param)

-        {

-            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 ( param["f_usetarget"] == false || manager_show_target != false)

-        {

-            document.getElementById("f_target_label").style.visibility = "hidden";

-            document.getElementById("f_target").style.visibility = "hidden";

-            document.getElementById("f_other_target").style.visibility = "hidden";

-        }

-        if (target_select && param["f_usetarget"] && manager_show_target != false)

-        {

-            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();

-    }

-    else if (!param)

-    {

-    	startDir = document.cookie.match(new RegExp ("EFMStartDir" + manager_mode + "=(.*?)(;|$)"));

-    	if (startDir)

-    	{

-    		startDir = startDir[1];

-    	}

-    }

-	if ( startDir )

-	{

-		iframeUrl += '&dir=' + startDir;

-		var dirPath = document.getElementById('dirPath');

-		for(var i = 0; i < dirPath.options.length; i++)

-		{

-			if(dirPath.options[i].value == encodeURIComponent(startDir))

-			{

-				dirPath.options[i].selected = true;

-				break;

-			}

-		}

-	};

-	imgManager.location.replace(iframeUrl);

-

-    if (manager_mode == 'image' && typeof Xinha.colorPicker != "undefined" && document.getElementById('f_backgroundColor') && document.getElementById('f_backgroundColor').type == 'text') {

-      // Hookup color pickers

-

-      var pickerConfig = {

-        cellsize:editor.config.colorPickerCellSize,

-        granularity:editor.config.colorPickerGranularity,

-        websafe:editor.config.colorPickerWebSafe,

-        savecolors:editor.config.colorPickerSaveColors

-      };

-

-      new Xinha.colorPicker.InputBinding(document.getElementById('f_backgroundColor'),pickerConfig);

-      new Xinha.colorPicker.InputBinding(document.getElementById('f_borderColor'),pickerConfig);

-    }

-	setTimeout(function() { resize();addEvent(window, 'resize', resize); }, 500);

-}

-

-function pasteButton(action)

-{

-	var buttonHolder = document.getElementById('pasteBtn');

-	if (!buttonHolder.firstChild)

-	{

-		var a = document.createElement('a');

-			a.href = "javascript:void(0);";

-			

-		var img = document.createElement('img');

-			img.src = window.opener.Xinha.getPluginDir('ExtendedFileManager')+'/img/edit_paste.gif';

-			img.alt = i18n('Paste');

-			a.appendChild(img);

-			buttonHolder.appendChild(a);

-	}

-	buttonHolder.onclick = function() {  

-				if(typeof imgManager != 'undefined') imgManager.paste(action);

-				if (action.action ==  'moveFile' || action.action ==  'moveDir' )

-				{

-					this.onclick = null;

-					this.removeChild(this.firstChild)

-				}

-	}

-	switch (action.action)

-	{

-		case 'copyFile':

-			buttonHolder.firstChild.title = i18n('Copy "$file='+action.file+'$" from "$dir='+decodeURIComponent(action.dir)+'$" here');			

-		break;

-		case 'copyDir':

-			buttonHolder.firstChild.title = i18n('Copy folder "$file='+action.file+'$" from "$dir='+decodeURIComponent(action.dir)+'$" here');		

-		break;

-		case 'moveFile':

-			buttonHolder.firstChild.title = i18n('Move "$file='+action.file+'$" from "$dir='+decodeURIComponent(action.dir)+'$" here');

-		break;

-		break;

-		case 'moveDir':

-			buttonHolder.firstChild.title = i18n('Move folder "$file='+action.file+'$" from "$dir='+decodeURIComponent(action.dir)+'$" here');

-		break;	

-	}

-	

-}

-function onCancel()

-{

-    __dlg_close(null);

-    return false;

-}

-

-function onOK()

-{

-    if(manager_mode=="image")

-    {

-        // pass data back to the calling window

-        var fields = ["f_url", "f_alt", "f_title", "f_align", "f_border", "f_margin", "f_padding", "f_height", "f_width", "f_borderColor", "f_backgroundColor"];

-        var param = new Object();

-        for (var i in fields)

-        {

-            var id = fields[i];

-            var el = document.getElementById(id);

-            if(id == "f_url" && el.value.indexOf('://') < 0 && el.value )

-                param[id] = makeURL(base_url,el.value);

-            else

-                param[id] = el.value;

-        }

-

-        // See if we need to resize the image

-        var origsize =

-        {

-          w:document.getElementById('orginal_width').value,

-          h:document.getElementById('orginal_height').value

-        }

-

-        if(  (origsize.w != param.f_width)

-          || (origsize.h != param.f_height) )

-        {

-          // Yup, need to resize

-          var resized = Xinha._geturlcontent(window.opener.Xinha.getPluginDir('ExtendedFileManager') + '/' + _backend_url + '&__function=resizer&img=' + encodeURIComponent(document.getElementById('f_url').value) + '&width=' + param.f_width + '&height=' + param.f_height);

-

-          // alert(resized);

-          resized = eval(resized);

-          if(resized)

-          {

-            param.f_url = makeURL(base_url, resized);

-          }

-        }

-        __dlg_close(param);

-        return false;

-    }

-    else if(manager_mode=="link")

-    {

-        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);

-

-            if(id == "f_href" && el.value.indexOf('://') < 0 )

-                param[id] = makeURL(base_url,el.value);

-            else

-                param[id] = el.value;

-

-        }

-        if (param.f_target == "_other")

-            param.f_target = document.getElementById("f_other_target").value;

-

-//          alert(param.f_target);

-          __dlg_close(param);

-        return false;

-    }

-}

-

-//similar to the Files::makeFile() in Files.php

-function makeURL(pathA, pathB)

-{

-    if(pathA.substring(pathA.length-1) != '/')

-        pathA += '/';

-

-    if(pathB.charAt(0) == '/');

-        pathB = pathB.substring(1);

-

-    return pathA+pathB;

-}

-

-function updateDir(selection)

-{

-    var newDir = selection.options[selection.selectedIndex].value;

-    changeDir(newDir);

-}

-

-function goUpDir()

-{

-    var selection = document.getElementById('dirPath');

-    var currentDir = selection.options[selection.selectedIndex].text;

-    if(currentDir.length < 2)

-        return false;

-    var dirs = currentDir.split('/');

-

-    var search = '';

-

-    for(var i = 0; i < dirs.length - 2; i++)

-    {

-        search += dirs[i]+'/';

-    }

-

-    for(var i = 0; i < selection.length; i++)

-    {

-        var thisDir = selection.options[i].text;

-        if(thisDir == search)

-        {

-            selection.selectedIndex = i;

-            var newDir = selection.options[i].value;

-            changeDir(newDir);

-            break;

-        }

-    }

-}

-

-function changeDir(newDir)

-{

-    if(typeof imgManager != 'undefined')

-        imgManager.changeDir(newDir);

-}

-

-function updateView()

-{

-    refresh();

-}

-

-function toggleConstrains(constrains)

-{

-    var lockImage = document.getElementById('imgLock');

-    var constrains = document.getElementById('constrain_prop');

-

-    if(constrains.checked)

-    {

-        lockImage.src = "img/locked.gif";

-        checkConstrains('width')

-    }

-    else

-    {

-        lockImage.src = "img/unlocked.gif";

-    }

-}

-

-function checkConstrains(changed)

-{

-    //alert(document.form1.constrain_prop);

-    var constrains = document.getElementById('constrain_prop');

-

-    if(constrains.checked)

-    {

-        var obj = document.getElementById('orginal_width');

-        var orginal_width = parseInt(obj.value);

-        var obj = document.getElementById('orginal_height');

-        var orginal_height = parseInt(obj.value);

-

-        var widthObj = document.getElementById('f_width');

-        var heightObj = document.getElementById('f_height');

-

-        var width = parseInt(widthObj.value);

-        var height = parseInt(heightObj.value);

-

-        if(orginal_width > 0 && orginal_height > 0)

-        {

-            if(changed == 'width' && width > 0) {

-                heightObj.value = parseInt((width/orginal_width)*orginal_height);

-            }

-

-            if(changed == 'height' && height > 0) {

-                widthObj.value = parseInt((height/orginal_height)*orginal_width);

-            }

-        }

-    }

-}

-

-function showMessage(newMessage)

-{

-    var message = document.getElementById('message');

-    var messages = document.getElementById('messages');

-    if(message.firstChild)

-        message.removeChild(message.firstChild);

-

-    message.appendChild(document.createTextNode(i18n(newMessage)));

-

-    messages.style.display = "block";

-}

-

-function addEvent(obj, evType, fn)

-{

-    if (obj.addEventListener) { obj.addEventListener(evType, fn, true); return true; }

-    else if (obj.attachEvent) {  var r = obj.attachEvent("on"+evType, fn);  return r;  }

-    else {  return false; }

-}

-

-function doUpload()

-{

-    var uploadForm = document.getElementById('uploadForm');

-    if(uploadForm)

-        showMessage('Uploading');

-}

-

-function refresh()

-{

-    var selection = document.getElementById('dirPath');

-    updateDir(selection);

-}

-

-function newFolder()

-{

-  function createFolder(folder)

-  {

-    var selection = document.getElementById('dirPath');

-    var dir = selection.options[selection.selectedIndex].value;

-

-    if(folder == thumbdir)

-    {

-      alert(i18n('Invalid folder name, please choose another folder name.'));

-      return false;

-    }

-

-    if (folder && folder != '' && typeof imgManager != 'undefined')

-    {

-      imgManager.newFolder(dir, encodeURI(folder));

-    }

-  }

-    // IE7 has crippled the prompt()

-  if ( Xinha.ie_version > 6 )

-  {

-    popupPrompt(i18n('Please enter name for new folder...'), i18n('Untitled'), createFolder, i18n("New Folder"));

-  }

-  else

-  {

-    var folder = prompt(i18n('Please enter name for new folder...'), i18n('Untitled'));

-    createFolder(folder);

-  }

-}

-

-

-function resize()

-{

-	var win = Xinha.viewportSize(window);

-	var m = document.getElementById('messages');

-	var messagesHeight = (m && m.style.display != 'none' ) ?  parseInt( document.getElementById('messages').offsetHeight, 10 ) : 0;

-	document.getElementById('imgManager').style.height = parseInt( win.y - 130 - document.getElementById('controls').offsetHeight, 10 ) - messagesHeight  + 'px';

-	return true;

-}

-

-Xinha.addOnloadHandler( init, window );
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ExtendedFileManager/assets/popup.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ExtendedFileManager/assets/popup.js
deleted file mode 100644
index 3b3828c..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ExtendedFileManager/assets/popup.js
+++ /dev/null
@@ -1,87 +0,0 @@
-// htmlArea v3.0 - Copyright (c) 2002, 2003 interactivetools.com, inc.

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

-//

-// Portions (c) dynarch.com, 2003

-//

-// A free WYSIWYG editor replacement for <textarea> fields.

-// For full source code and docs, visit http://www.interactivetools.com/

-//

-// Version 3.0 developed by Mihai Bazon.

-//   http://dynarch.com/mishoo

-//

-// $Id: popup.js 1084 2008-10-12 17:42:42Z ray $

-

-function __dlg_onclose() {

-    if(opener.Dialog._return)

-        opener.Dialog._return(null);

-}

-function __dlg_init( bottom, win_dim ) {

-  __xinha_dlg_init(win_dim);

-}

-

-function __xinha_dlg_init( win_dim ) {

-  if(window.__dlg_init_done) return true;

-  

-  if(window.opener._editor_skin) {

-    var head = document.getElementsByTagName("head")[0];

-    var link = document.createElement("link");

-    link.type = "text/css";

-    link.href = window.opener._editor_url + 'skins/' + window.opener._editor_skin + '/skin.css';

-    link.rel = "stylesheet";

-    head.appendChild(link);

-  }

-  if (!window.dialogArguments && opener.Dialog._arguments)

-  {

-    window.dialogArguments = opener.Dialog._arguments;

-  }

-

-  Xinha.addDom0Event(document.body, 'keypress', __dlg_close_on_esc);

-  window.__dlg_init_done = true;

-}

-function __dlg_translate(context) {

-    var types = ["span", "option", "td", "th", "button", "div", "label", "a","img", "legend"];

-    for (var type = 0; type < types.length; type++) {

-        var spans = document.getElementsByTagName(types[type]);

-        for (var i = spans.length; --i >= 0;) {

-            var span = spans[i];

-            if (span.firstChild && span.firstChild.data) {

-                var txt = Xinha._lc(span.firstChild.data, context);

-                if (txt)

-                    span.firstChild.data = txt;

-            }

-            if (span.title) {

-                var txt = Xinha._lc(span.title, context);

-                if (txt)

-                    span.title = txt;

-            }

-            if (span.alt) {

-                var txt = Xinha._lc(span.alt, context);

-                if (txt)

-                    span.alt = txt;

-            }

-        }

-    }

-    document.title = Xinha._lc(document.title, context);

-}

-

-// closes the dialog and passes the return info upper.

-function __dlg_close(val) {

-    opener.Dialog._return(val);

-    window.close();

-}

-

-function popupPrompt( prompt, value, handler, title)

-{

-  

-    Dialog("prompt.html", function(param)

-    {

-      if (!param) // user must have pressed Cancel

-      {

-        return false;

-      }

-      else

-      {

-        handler (param.value);

-      }

-    }, {prompt:prompt,value:value,title:title});

-}
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ExtendedFileManager/assets/slider.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ExtendedFileManager/assets/slider.js
deleted file mode 100644
index c203ef0..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ExtendedFileManager/assets/slider.js
+++ /dev/null
@@ -1,105 +0,0 @@
-/**
- * ImageEditor slider file.
- * Authors: Wei Zhuo, Afru, Krzysztof Kotowicz
- * Version: Updated on 08-01-2005 by Afru
- * Version: Updated on 20-06-2006 by Krzysztof Kotowicz
- * Package: ExtendedFileManager (EFM 1.1.1)
- * http://www.afrusoft.com/htmlarea
- */
-
-var ie=document.all;
-var ns6=document.getElementById&&!document.all;
-
-document.onmouseup = captureStop;
-
-var currentSlider = null,sliderField = null;
-var rangeMin = null, rangeMax= null, sx = -1, sy = -1, initX=0;
-
-function getMouseXY(e) {
-
-    //alert('hello');
-    x = ns6? e.clientX: event.clientX
-    y = ns6? e.clientY: event.clientY
-
-    if (sx < 0) sx = x; if (sy < 0) sy = y;
-
-    var dx = initX +(x-sx);
-
-    if (dx <= rangeMin)
-        dx = rangeMin;
-    else if (dx >= rangeMax)
-        dx = rangeMax;
-
-    var range = (dx-rangeMin)/(rangeMax - rangeMin)*100;
-
-    if (currentSlider !=  null)
-        currentSlider.style.left = dx+"px";
-
-    if (sliderField != null)
-    {
-        sliderField.value = parseInt(range);
-    }
-    return false;
-
-}
-
-function initSlider()
-{
-    if (currentSlider == null)
-        currentSlider = document.getElementById('sliderbar');
-
-    if (sliderField == null)
-        sliderField = document.getElementById('quality');
-
-    if (rangeMin == null)
-        rangeMin = 3
-    if (rangeMax == null)
-    {
-        var track = document.getElementById('slidertrack');
-        rangeMax = parseInt(track.style.width);
-    }
-
-}
-
-function updateSlider(value)
-{
-    initSlider();
-
-    var newValue = parseInt(value)/100*(rangeMax-rangeMin);
-
-    if (newValue <= rangeMin)
-        newValue = rangeMin;
-    else if (newValue >= rangeMax)
-        newValue = rangeMax;
-
-    if (currentSlider !=  null)
-        currentSlider.style.left = newValue+"px";
-
-    var range = newValue/(rangeMax - rangeMin)*100;
-
-    if (sliderField != null)
-        sliderField.value = parseInt(range);
-}
-
-function captureStart()
-{
-
-    initSlider();
-
-    initX = parseInt(currentSlider.style.left);
-    if (initX > rangeMax)
-        initX = rangeMax;
-    else if (initX < rangeMin)
-        initX = rangeMin;
-
-    document.onmousemove = getMouseXY;
-
-    return false;
-}
-
-function captureStop()
-{
-    sx = -1; sy = -1;
-    document.onmousemove = null;
-    return false;
-}
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ExtendedFileManager/assets/wz_jsgraphics.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ExtendedFileManager/assets/wz_jsgraphics.js
deleted file mode 100644
index d8e6f8e..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ExtendedFileManager/assets/wz_jsgraphics.js
+++ /dev/null
@@ -1,1160 +0,0 @@
-/***********************************************************************

-** Filename......:  wz_jsgraphics.js

-** Last changed..:  2 November 2007 by Raimund Meyer updated to new version  

-** Notes.........:  Modified by Xiang Wei ZHUO <wei@zhuo.org> for Image Editor, added extra commands l. 690-740

-**/ 

-

-/* This notice must be untouched at all times.

-

-wz_jsgraphics.js    v. 3.02

-The latest version is available at

-http://www.walterzorn.com

-or http://www.devira.com

-or http://www.walterzorn.de

-

-Copyright (c) 2002-2004 Walter Zorn. All rights reserved.

-Created 3. 11. 2002 by Walter Zorn (Web: http://www.walterzorn.com )

-Last modified: 26. 10. 2007

-

-Performance optimizations for Internet Explorer

-by Thomas Frank and John Holdsworth.

-fillPolygon method implemented by Matthieu Haller.

-

-High Performance JavaScript Graphics Library.

-Provides methods

-- to draw lines, rectangles, ellipses, polygons

-	with specifiable line thickness,

-- to fill rectangles, polygons, ellipses and arcs

-- to draw text.

-NOTE: Operations, functions and branching have rather been optimized

-to efficiency and speed than to shortness of source code.

-

-LICENSE: LGPL

-

-This library is free software; you can redistribute it and/or

-modify it under the terms of the GNU Lesser General Public

-License (LGPL) as published by the Free Software Foundation; either

-version 2.1 of the License, or (at your option) any later version.

-

-This library is distributed in the hope that it will be useful,

-but WITHOUT ANY WARRANTY; without even the implied warranty of

-MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU

-Lesser General Public License for more details.

-

-You should have received a copy of the GNU Lesser General Public

-License along with this library; if not, write to the Free Software

-Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA,

-or see http://www.gnu.org/copyleft/lesser.html

-*/

-

-

-var jg_ok, jg_ie, jg_fast, jg_dom, jg_moz;

-

-

-function _chkDHTM(x, i)

-{

-	x = document.body || null;

-	jg_ie = x && typeof x.insertAdjacentHTML != "undefined" && document.createElement;

-	jg_dom = (x && !jg_ie &&

-		typeof x.appendChild != "undefined" &&

-		typeof document.createRange != "undefined" &&

-		typeof (i = document.createRange()).setStartBefore != "undefined" &&

-		typeof i.createContextualFragment != "undefined");

-	jg_fast = jg_ie && document.all && !window.opera;

-	jg_moz = jg_dom && typeof x.style.MozOpacity != "undefined";

-	jg_ok = !!(jg_ie || jg_dom);

-}

-

-function _pntCnvDom()

-{

-	var x = this.wnd.document.createRange();

-	x.setStartBefore(this.cnv);

-	x = x.createContextualFragment(jg_fast? this._htmRpc() : this.htm);

-	if(this.cnv) this.cnv.appendChild(x);

-	this.htm = "";

-}

-

-function _pntCnvIe()

-{

-	if(this.cnv) this.cnv.insertAdjacentHTML("BeforeEnd", jg_fast? this._htmRpc() : this.htm);

-	this.htm = "";

-}

-

-function _pntDoc()

-{

-	this.wnd.document.write(jg_fast? this._htmRpc() : this.htm);

-	this.htm = '';

-}

-

-function _pntN()

-{

-	;

-}

-

-function _mkDiv(x, y, w, h)

-{

-	this.htm += '<div style="position:absolute;'+

-		'left:' + x + 'px;'+

-		'top:' + y + 'px;'+

-		'width:' + w + 'px;'+

-		'height:' + h + 'px;'+

-		'clip:rect(0,'+w+'px,'+h+'px,0);'+

-		'background-color:' + this.color +

-		(!jg_moz? ';overflow:hidden' : '')+

-		';"><\/div>';

-}

-

-function _mkDivIe(x, y, w, h)

-{

-	this.htm += '%%'+this.color+';'+x+';'+y+';'+w+';'+h+';';

-}

-

-function _mkDivPrt(x, y, w, h)

-{

-	this.htm += '<div style="position:absolute;'+

-		'border-left:' + w + 'px solid ' + this.color + ';'+

-		'left:' + x + 'px;'+

-		'top:' + y + 'px;'+

-		'width:0px;'+

-		'height:' + h + 'px;'+

-		'clip:rect(0,'+w+'px,'+h+'px,0);'+

-		'background-color:' + this.color +

-		(!jg_moz? ';overflow:hidden' : '')+

-		';"><\/div>';

-}

-

-var _regex =  /%%([^;]+);([^;]+);([^;]+);([^;]+);([^;]+);/g;

-function _htmRpc()

-{

-	return this.htm.replace(

-		_regex,

-		'<div style="overflow:hidden;position:absolute;background-color:'+

-		'$1;left:$2;top:$3;width:$4;height:$5"></div>\n');

-}

-

-function _htmPrtRpc()

-{

-	return this.htm.replace(

-		_regex,

-		'<div style="overflow:hidden;position:absolute;background-color:'+

-		'$1;left:$2;top:$3;width:$4;height:$5;border-left:$4px solid $1"></div>\n');

-}

-

-function _mkLin(x1, y1, x2, y2)

-{

-	if(x1 > x2)

-	{

-		var _x2 = x2;

-		var _y2 = y2;

-		x2 = x1;

-		y2 = y1;

-		x1 = _x2;

-		y1 = _y2;

-	}

-	var dx = x2-x1, dy = Math.abs(y2-y1),

-	x = x1, y = y1,

-	yIncr = (y1 > y2)? -1 : 1;

-

-	if(dx >= dy)

-	{

-		var pr = dy<<1,

-		pru = pr - (dx<<1),

-		p = pr-dx,

-		ox = x;

-		while(dx > 0)

-		{--dx;

-			++x;

-			if(p > 0)

-			{

-				this._mkDiv(ox, y, x-ox, 1);

-				y += yIncr;

-				p += pru;

-				ox = x;

-			}

-			else p += pr;

-		}

-		this._mkDiv(ox, y, x2-ox+1, 1);

-	}

-

-	else

-	{

-		var pr = dx<<1,

-		pru = pr - (dy<<1),

-		p = pr-dy,

-		oy = y;

-		if(y2 <= y1)

-		{

-			while(dy > 0)

-			{--dy;

-				if(p > 0)

-				{

-					this._mkDiv(x++, y, 1, oy-y+1);

-					y += yIncr;

-					p += pru;

-					oy = y;

-				}

-				else

-				{

-					y += yIncr;

-					p += pr;

-				}

-			}

-			this._mkDiv(x2, y2, 1, oy-y2+1);

-		}

-		else

-		{

-			while(dy > 0)

-			{--dy;

-				y += yIncr;

-				if(p > 0)

-				{

-					this._mkDiv(x++, oy, 1, y-oy);

-					p += pru;

-					oy = y;

-				}

-				else p += pr;

-			}

-			this._mkDiv(x2, oy, 1, y2-oy+1);

-		}

-	}

-}

-

-function _mkLin2D(x1, y1, x2, y2)

-{

-	if(x1 > x2)

-	{

-		var _x2 = x2;

-		var _y2 = y2;

-		x2 = x1;

-		y2 = y1;

-		x1 = _x2;

-		y1 = _y2;

-	}

-	var dx = x2-x1, dy = Math.abs(y2-y1),

-	x = x1, y = y1,

-	yIncr = (y1 > y2)? -1 : 1;

-

-	var s = this.stroke;

-	if(dx >= dy)

-	{

-		if(dx > 0 && s-3 > 0)

-		{

-			var _s = (s*dx*Math.sqrt(1+dy*dy/(dx*dx))-dx-(s>>1)*dy) / dx;

-			_s = (!(s-4)? Math.ceil(_s) : Math.round(_s)) + 1;

-		}

-		else var _s = s;

-		var ad = Math.ceil(s/2);

-

-		var pr = dy<<1,

-		pru = pr - (dx<<1),

-		p = pr-dx,

-		ox = x;

-		while(dx > 0)

-		{--dx;

-			++x;

-			if(p > 0)

-			{

-				this._mkDiv(ox, y, x-ox+ad, _s);

-				y += yIncr;

-				p += pru;

-				ox = x;

-			}

-			else p += pr;

-		}

-		this._mkDiv(ox, y, x2-ox+ad+1, _s);

-	}

-

-	else

-	{

-		if(s-3 > 0)

-		{

-			var _s = (s*dy*Math.sqrt(1+dx*dx/(dy*dy))-(s>>1)*dx-dy) / dy;

-			_s = (!(s-4)? Math.ceil(_s) : Math.round(_s)) + 1;

-		}

-		else var _s = s;

-		var ad = Math.round(s/2);

-

-		var pr = dx<<1,

-		pru = pr - (dy<<1),

-		p = pr-dy,

-		oy = y;

-		if(y2 <= y1)

-		{

-			++ad;

-			while(dy > 0)

-			{--dy;

-				if(p > 0)

-				{

-					this._mkDiv(x++, y, _s, oy-y+ad);

-					y += yIncr;

-					p += pru;

-					oy = y;

-				}

-				else

-				{

-					y += yIncr;

-					p += pr;

-				}

-			}

-			this._mkDiv(x2, y2, _s, oy-y2+ad);

-		}

-		else

-		{

-			while(dy > 0)

-			{--dy;

-				y += yIncr;

-				if(p > 0)

-				{

-					this._mkDiv(x++, oy, _s, y-oy+ad);

-					p += pru;

-					oy = y;

-				}

-				else p += pr;

-			}

-			this._mkDiv(x2, oy, _s, y2-oy+ad+1);

-		}

-	}

-}

-

-function _mkLinDott(x1, y1, x2, y2)

-{

-	if(x1 > x2)

-	{

-		var _x2 = x2;

-		var _y2 = y2;

-		x2 = x1;

-		y2 = y1;

-		x1 = _x2;

-		y1 = _y2;

-	}

-	var dx = x2-x1, dy = Math.abs(y2-y1),

-	x = x1, y = y1,

-	yIncr = (y1 > y2)? -1 : 1,

-	drw = true;

-	if(dx >= dy)

-	{

-		var pr = dy<<1,

-		pru = pr - (dx<<1),

-		p = pr-dx;

-		while(dx > 0)

-		{--dx;

-			if(drw) this._mkDiv(x, y, 1, 1);

-			drw = !drw;

-			if(p > 0)

-			{

-				y += yIncr;

-				p += pru;

-			}

-			else p += pr;

-			++x;

-		}

-	}

-	else

-	{

-		var pr = dx<<1,

-		pru = pr - (dy<<1),

-		p = pr-dy;

-		while(dy > 0)

-		{--dy;

-			if(drw) this._mkDiv(x, y, 1, 1);

-			drw = !drw;

-			y += yIncr;

-			if(p > 0)

-			{

-				++x;

-				p += pru;

-			}

-			else p += pr;

-		}

-	}

-	if(drw) this._mkDiv(x, y, 1, 1);

-}

-

-function _mkOv(left, top, width, height)

-{

-	var a = (++width)>>1, b = (++height)>>1,

-	wod = width&1, hod = height&1,

-	cx = left+a, cy = top+b,

-	x = 0, y = b,

-	ox = 0, oy = b,

-	aa2 = (a*a)<<1, aa4 = aa2<<1, bb2 = (b*b)<<1, bb4 = bb2<<1,

-	st = (aa2>>1)*(1-(b<<1)) + bb2,

-	tt = (bb2>>1) - aa2*((b<<1)-1),

-	w, h;

-	while(y > 0)

-	{

-		if(st < 0)

-		{

-			st += bb2*((x<<1)+3);

-			tt += bb4*(++x);

-		}

-		else if(tt < 0)

-		{

-			st += bb2*((x<<1)+3) - aa4*(y-1);

-			tt += bb4*(++x) - aa2*(((y--)<<1)-3);

-			w = x-ox;

-			h = oy-y;

-			if((w&2) && (h&2))

-			{

-				this._mkOvQds(cx, cy, x-2, y+2, 1, 1, wod, hod);

-				this._mkOvQds(cx, cy, x-1, y+1, 1, 1, wod, hod);

-			}

-			else this._mkOvQds(cx, cy, x-1, oy, w, h, wod, hod);

-			ox = x;

-			oy = y;

-		}

-		else

-		{

-			tt -= aa2*((y<<1)-3);

-			st -= aa4*(--y);

-		}

-	}

-	w = a-ox+1;

-	h = (oy<<1)+hod;

-	y = cy-oy;

-	this._mkDiv(cx-a, y, w, h);

-	this._mkDiv(cx+ox+wod-1, y, w, h);

-}

-

-function _mkOv2D(left, top, width, height)

-{

-	var s = this.stroke;

-	width += s+1;

-	height += s+1;

-	var a = width>>1, b = height>>1,

-	wod = width&1, hod = height&1,

-	cx = left+a, cy = top+b,

-	x = 0, y = b,

-	aa2 = (a*a)<<1, aa4 = aa2<<1, bb2 = (b*b)<<1, bb4 = bb2<<1,

-	st = (aa2>>1)*(1-(b<<1)) + bb2,

-	tt = (bb2>>1) - aa2*((b<<1)-1);

-

-	if(s-4 < 0 && (!(s-2) || width-51 > 0 && height-51 > 0))

-	{

-		var ox = 0, oy = b,

-		w, h,

-		pxw;

-		while(y > 0)

-		{

-			if(st < 0)

-			{

-				st += bb2*((x<<1)+3);

-				tt += bb4*(++x);

-			}

-			else if(tt < 0)

-			{

-				st += bb2*((x<<1)+3) - aa4*(y-1);

-				tt += bb4*(++x) - aa2*(((y--)<<1)-3);

-				w = x-ox;

-				h = oy-y;

-

-				if(w-1)

-				{

-					pxw = w+1+(s&1);

-					h = s;

-				}

-				else if(h-1)

-				{

-					pxw = s;

-					h += 1+(s&1);

-				}

-				else pxw = h = s;

-				this._mkOvQds(cx, cy, x-1, oy, pxw, h, wod, hod);

-				ox = x;

-				oy = y;

-			}

-			else

-			{

-				tt -= aa2*((y<<1)-3);

-				st -= aa4*(--y);

-			}

-		}

-		this._mkDiv(cx-a, cy-oy, s, (oy<<1)+hod);

-		this._mkDiv(cx+a+wod-s, cy-oy, s, (oy<<1)+hod);

-	}

-

-	else

-	{

-		var _a = (width-(s<<1))>>1,

-		_b = (height-(s<<1))>>1,

-		_x = 0, _y = _b,

-		_aa2 = (_a*_a)<<1, _aa4 = _aa2<<1, _bb2 = (_b*_b)<<1, _bb4 = _bb2<<1,

-		_st = (_aa2>>1)*(1-(_b<<1)) + _bb2,

-		_tt = (_bb2>>1) - _aa2*((_b<<1)-1),

-

-		pxl = new Array(),

-		pxt = new Array(),

-		_pxb = new Array();

-		pxl[0] = 0;

-		pxt[0] = b;

-		_pxb[0] = _b-1;

-		while(y > 0)

-		{

-			if(st < 0)

-			{

-				pxl[pxl.length] = x;

-				pxt[pxt.length] = y;

-				st += bb2*((x<<1)+3);

-				tt += bb4*(++x);

-			}

-			else if(tt < 0)

-			{

-				pxl[pxl.length] = x;

-				st += bb2*((x<<1)+3) - aa4*(y-1);

-				tt += bb4*(++x) - aa2*(((y--)<<1)-3);

-				pxt[pxt.length] = y;

-			}

-			else

-			{

-				tt -= aa2*((y<<1)-3);

-				st -= aa4*(--y);

-			}

-

-			if(_y > 0)

-			{

-				if(_st < 0)

-				{

-					_st += _bb2*((_x<<1)+3);

-					_tt += _bb4*(++_x);

-					_pxb[_pxb.length] = _y-1;

-				}

-				else if(_tt < 0)

-				{

-					_st += _bb2*((_x<<1)+3) - _aa4*(_y-1);

-					_tt += _bb4*(++_x) - _aa2*(((_y--)<<1)-3);

-					_pxb[_pxb.length] = _y-1;

-				}

-				else

-				{

-					_tt -= _aa2*((_y<<1)-3);

-					_st -= _aa4*(--_y);

-					_pxb[_pxb.length-1]--;

-				}

-			}

-		}

-

-		var ox = -wod, oy = b,

-		_oy = _pxb[0],

-		l = pxl.length,

-		w, h;

-		for(var i = 0; i < l; i++)

-		{

-			if(typeof _pxb[i] != "undefined")

-			{

-				if(_pxb[i] < _oy || pxt[i] < oy)

-				{

-					x = pxl[i];

-					this._mkOvQds(cx, cy, x, oy, x-ox, oy-_oy, wod, hod);

-					ox = x;

-					oy = pxt[i];

-					_oy = _pxb[i];

-				}

-			}

-			else

-			{

-				x = pxl[i];

-				this._mkDiv(cx-x, cy-oy, 1, (oy<<1)+hod);

-				this._mkDiv(cx+ox+wod, cy-oy, 1, (oy<<1)+hod);

-				ox = x;

-				oy = pxt[i];

-			}

-		}

-		this._mkDiv(cx-a, cy-oy, 1, (oy<<1)+hod);

-		this._mkDiv(cx+ox+wod, cy-oy, 1, (oy<<1)+hod);

-	}

-}

-

-function _mkOvDott(left, top, width, height)

-{

-	var a = (++width)>>1, b = (++height)>>1,

-	wod = width&1, hod = height&1, hodu = hod^1,

-	cx = left+a, cy = top+b,

-	x = 0, y = b,

-	aa2 = (a*a)<<1, aa4 = aa2<<1, bb2 = (b*b)<<1, bb4 = bb2<<1,

-	st = (aa2>>1)*(1-(b<<1)) + bb2,

-	tt = (bb2>>1) - aa2*((b<<1)-1),

-	drw = true;

-	while(y > 0)

-	{

-		if(st < 0)

-		{

-			st += bb2*((x<<1)+3);

-			tt += bb4*(++x);

-		}

-		else if(tt < 0)

-		{

-			st += bb2*((x<<1)+3) - aa4*(y-1);

-			tt += bb4*(++x) - aa2*(((y--)<<1)-3);

-		}

-		else

-		{

-			tt -= aa2*((y<<1)-3);

-			st -= aa4*(--y);

-		}

-		if(drw && y >= hodu) this._mkOvQds(cx, cy, x, y, 1, 1, wod, hod);

-		drw = !drw;

-	}

-}

-

-function _mkRect(x, y, w, h)

-{

-	var s = this.stroke;

-	this._mkDiv(x, y, w, s);

-	this._mkDiv(x+w, y, s, h);

-	this._mkDiv(x, y+h, w+s, s);

-	this._mkDiv(x, y+s, s, h-s);

-}

-

-function _mkRectDott(x, y, w, h)

-{

-	this.drawLine(x, y, x+w, y);

-	this.drawLine(x+w, y, x+w, y+h);

-	this.drawLine(x, y+h, x+w, y+h);

-	this.drawLine(x, y, x, y+h);

-}

-

-function jsgFont()

-{

-	this.PLAIN = 'font-weight:normal;';

-	this.BOLD = 'font-weight:bold;';

-	this.ITALIC = 'font-style:italic;';

-	this.ITALIC_BOLD = this.ITALIC + this.BOLD;

-	this.BOLD_ITALIC = this.ITALIC_BOLD;

-}

-var Font = new jsgFont();

-

-function jsgStroke()

-{

-	this.DOTTED = -1;

-}

-var Stroke = new jsgStroke();

-

-function jsGraphics(cnv, wnd)

-{

-	this.setColor = function(x)

-	{

-		this.color = x.toLowerCase();

-	};

-

-	this.setStroke = function(x)

-	{

-		this.stroke = x;

-		if(!(x+1))

-		{

-			this.drawLine = _mkLinDott;

-			this._mkOv = _mkOvDott;

-			this.drawRect = _mkRectDott;

-		}

-		else if(x-1 > 0)

-		{

-			this.drawLine = _mkLin2D;

-			this._mkOv = _mkOv2D;

-			this.drawRect = _mkRect;

-		}

-		else

-		{

-			this.drawLine = _mkLin;

-			this._mkOv = _mkOv;

-			this.drawRect = _mkRect;

-		}

-	};

-

-	this.setPrintable = function(arg)

-	{

-		this.printable = arg;

-		if(jg_fast)

-		{

-			this._mkDiv = _mkDivIe;

-			this._htmRpc = arg? _htmPrtRpc : _htmRpc;

-		}

-		else this._mkDiv = arg? _mkDivPrt : _mkDiv;

-	};

-

-	this.setFont = function(fam, sz, sty)

-	{

-		this.ftFam = fam;

-		this.ftSz = sz;

-		this.ftSty = sty || Font.PLAIN;

-	};

-

-	this.drawPolyline = this.drawPolyLine = function(x, y)

-	{

-		for (var i=x.length - 1; i;)

-		{--i;

-			this.drawLine(x[i], y[i], x[i+1], y[i+1]);

-		}

-	};

-/************** Xinha added *******************************************/

-	

-	this.setColor = new Function('arg', 'this.color = arg;');

-    this.getColor = new Function('return this.color');

-

-	this.fillRect = function(x, y, w, h)

-	{

-		this._mkDiv(x, y, w, h);

-	};

-	

-    this.fillRectPattern = function(x, y, w, h, url)

-    {

-        this.htm += '<div style="position:absolute;'+

-            'left:' + x + 'px;'+

-            'top:' + y + 'px;'+

-            'width:' + w + 'px;'+

-            'height:' + h + 'px;'+

-            'clip:rect(0,'+w+'px,'+h+'px,0);'+

-            'overflow:hidden;'+

-            //'background-color:' + this.color + ';'+

-            "background-image: url('" + url + "');"+

-            "layer-background-image: url('" + url + "');"+

-            'z-index:100;"><\/div>';

-        //alert(this.htm);

-    };

-

-    this.drawHandle = function(x, y, w, h, cursor)

-    {

-        

-        this.htm += '<div style="position:absolute;'+

-        'left:' + x + 'px;'+

-        'top:' + y + 'px;'+

-        'width:' + w + 'px;'+

-        'height:' + h + 'px;'+

-        'clip:rect(0,'+w+'px,'+h+'px,0);'+

-        'padding: 2px;overflow:hidden;'+

-        "cursor: '" + cursor + "';"+

-        '" class="handleBox" id="' + cursor + '" ><\/div>';

-    };

-	

-	this.drawHandleBox = function(x, y, w, h, cursor)

-    {

-        

-        this.htm += '<div style="position:absolute;'+

-        'left:' + x + 'px;'+

-        'top:' + y + 'px;'+

-        'width:' + w + 'px;'+

-        'height:' + h + 'px;'+

-        'clip:rect(0,'+(w+2)+'px,'+(h+2)+'px,0);'+

-        'overflow:hidden; border: solid 1px '+ this.color+';'+

-        "cursor: '" + cursor + "';"+

-        '" class="handleBox" id="' + cursor + '" ><\/div>';

-    };

-

-/************** end Xinha added *******************************************/

-	this.drawPolygon = function(x, y)

-	{

-		this.drawPolyline(x, y);

-		this.drawLine(x[x.length-1], y[x.length-1], x[0], y[0]);

-	};

-

-	this.drawEllipse = this.drawOval = function(x, y, w, h)

-	{

-		this._mkOv(x, y, w, h);

-	};

-

-	this.fillEllipse = this.fillOval = function(left, top, w, h)

-	{

-		var a = w>>1, b = h>>1,

-		wod = w&1, hod = h&1,

-		cx = left+a, cy = top+b,

-		x = 0, y = b, oy = b,

-		aa2 = (a*a)<<1, aa4 = aa2<<1, bb2 = (b*b)<<1, bb4 = bb2<<1,

-		st = (aa2>>1)*(1-(b<<1)) + bb2,

-		tt = (bb2>>1) - aa2*((b<<1)-1),

-		xl, dw, dh;

-		if(w) while(y > 0)

-		{

-			if(st < 0)

-			{

-				st += bb2*((x<<1)+3);

-				tt += bb4*(++x);

-			}

-			else if(tt < 0)

-			{

-				st += bb2*((x<<1)+3) - aa4*(y-1);

-				xl = cx-x;

-				dw = (x<<1)+wod;

-				tt += bb4*(++x) - aa2*(((y--)<<1)-3);

-				dh = oy-y;

-				this._mkDiv(xl, cy-oy, dw, dh);

-				this._mkDiv(xl, cy+y+hod, dw, dh);

-				oy = y;

-			}

-			else

-			{

-				tt -= aa2*((y<<1)-3);

-				st -= aa4*(--y);

-			}

-		}

-		this._mkDiv(cx-a, cy-oy, w, (oy<<1)+hod);

-	};

-

-	this.fillArc = function(iL, iT, iW, iH, fAngA, fAngZ)

-	{

-		var a = iW>>1, b = iH>>1,

-		iOdds = (iW&1) | ((iH&1) << 16),

-		cx = iL+a, cy = iT+b,

-		x = 0, y = b, ox = x, oy = y,

-		aa2 = (a*a)<<1, aa4 = aa2<<1, bb2 = (b*b)<<1, bb4 = bb2<<1,

-		st = (aa2>>1)*(1-(b<<1)) + bb2,

-		tt = (bb2>>1) - aa2*((b<<1)-1),

-		// Vars for radial boundary lines

-		xEndA, yEndA, xEndZ, yEndZ,

-		iSects = (1 << (Math.floor((fAngA %= 360.0)/180.0) << 3))

-				| (2 << (Math.floor((fAngZ %= 360.0)/180.0) << 3))

-				| ((fAngA >= fAngZ) << 16),

-		aBndA = new Array(b+1), aBndZ = new Array(b+1);

-		

-		// Set up radial boundary lines

-		fAngA *= Math.PI/180.0;

-		fAngZ *= Math.PI/180.0;

-		xEndA = cx+Math.round(a*Math.cos(fAngA));

-		yEndA = cy+Math.round(-b*Math.sin(fAngA));

-		_mkLinVirt(aBndA, cx, cy, xEndA, yEndA);

-		xEndZ = cx+Math.round(a*Math.cos(fAngZ));

-		yEndZ = cy+Math.round(-b*Math.sin(fAngZ));

-		_mkLinVirt(aBndZ, cx, cy, xEndZ, yEndZ);

-

-		while(y > 0)

-		{

-			if(st < 0) // Advance x

-			{

-				st += bb2*((x<<1)+3);

-				tt += bb4*(++x);

-			}

-			else if(tt < 0) // Advance x and y

-			{

-				st += bb2*((x<<1)+3) - aa4*(y-1);

-				ox = x;

-				tt += bb4*(++x) - aa2*(((y--)<<1)-3);

-				this._mkArcDiv(ox, y, oy, cx, cy, iOdds, aBndA, aBndZ, iSects);

-				oy = y;

-			}

-			else // Advance y

-			{

-				tt -= aa2*((y<<1)-3);

-				st -= aa4*(--y);

-				if(y && (aBndA[y] != aBndA[y-1] || aBndZ[y] != aBndZ[y-1]))

-				{

-					this._mkArcDiv(x, y, oy, cx, cy, iOdds, aBndA, aBndZ, iSects);

-					ox = x;

-					oy = y;

-				}

-			}

-		}

-		this._mkArcDiv(x, 0, oy, cx, cy, iOdds, aBndA, aBndZ, iSects);

-		if(iOdds >> 16) // Odd height

-		{

-			if(iSects >> 16) // Start-angle > end-angle

-			{

-				var xl = (yEndA <= cy || yEndZ > cy)? (cx - x) : cx;

-				this._mkDiv(xl, cy, x + cx - xl + (iOdds & 0xffff), 1);

-			}

-			else if((iSects & 0x01) && yEndZ > cy)

-				this._mkDiv(cx - x, cy, x, 1);

-		}

-	};

-

-/* fillPolygon method, implemented by Matthieu Haller.

-This javascript function is an adaptation of the gdImageFilledPolygon for Walter Zorn lib.

-C source of GD 1.8.4 found at http://www.boutell.com/gd/

-

-THANKS to Kirsten Schulz for the polygon fixes!

-

-The intersection finding technique of this code could be improved

-by remembering the previous intertersection, and by using the slope.

-That could help to adjust intersections to produce a nice

-interior_extrema. */

-	this.fillPolygon = function(array_x, array_y)

-	{

-		var i;

-		var y;

-		var miny, maxy;

-		var x1, y1;

-		var x2, y2;

-		var ind1, ind2;

-		var ints;

-

-		var n = array_x.length;

-		if(!n) return;

-

-		miny = array_y[0];

-		maxy = array_y[0];

-		for(i = 1; i < n; i++)

-		{

-			if(array_y[i] < miny)

-				miny = array_y[i];

-

-			if(array_y[i] > maxy)

-				maxy = array_y[i];

-		}

-		for(y = miny; y <= maxy; y++)

-		{

-			var polyInts = new Array();

-			ints = 0;

-			for(i = 0; i < n; i++)

-			{

-				if(!i)

-				{

-					ind1 = n-1;

-					ind2 = 0;

-				}

-				else

-				{

-					ind1 = i-1;

-					ind2 = i;

-				}

-				y1 = array_y[ind1];

-				y2 = array_y[ind2];

-				if(y1 < y2)

-				{

-					x1 = array_x[ind1];

-					x2 = array_x[ind2];

-				}

-				else if(y1 > y2)

-				{

-					y2 = array_y[ind1];

-					y1 = array_y[ind2];

-					x2 = array_x[ind1];

-					x1 = array_x[ind2];

-				}

-				else continue;

-

-				 //  Modified 11. 2. 2004 Walter Zorn

-				if((y >= y1) && (y < y2))

-					polyInts[ints++] = Math.round((y-y1) * (x2-x1) / (y2-y1) + x1);

-

-				else if((y == maxy) && (y > y1) && (y <= y2))

-					polyInts[ints++] = Math.round((y-y1) * (x2-x1) / (y2-y1) + x1);

-			}

-			polyInts.sort(_CompInt);

-			for(i = 0; i < ints; i+=2)

-				this._mkDiv(polyInts[i], y, polyInts[i+1]-polyInts[i]+1, 1);

-		}

-	};

-

-	this.drawString = function(txt, x, y)

-	{

-		this.htm += '<div style="position:absolute;white-space:nowrap;'+

-			'left:' + x + 'px;'+

-			'top:' + y + 'px;'+

-			'font-family:' +  this.ftFam + ';'+

-			'font-size:' + this.ftSz + ';'+

-			'color:' + this.color + ';' + this.ftSty + '">'+

-			txt +

-			'<\/div>';

-	};

-

-/* drawStringRect() added by Rick Blommers.

-Allows to specify the size of the text rectangle and to align the

-text both horizontally (e.g. right) and vertically within that rectangle */

-	this.drawStringRect = function(txt, x, y, width, halign)

-	{

-		this.htm += '<div style="position:absolute;overflow:hidden;'+

-			'left:' + x + 'px;'+

-			'top:' + y + 'px;'+

-			'width:'+width +'px;'+

-			'text-align:'+halign+';'+

-			'font-family:' +  this.ftFam + ';'+

-			'font-size:' + this.ftSz + ';'+

-			'color:' + this.color + ';' + this.ftSty + '">'+

-			txt +

-			'<\/div>';

-	};

-

-	this.drawImage = function(imgSrc, x, y, w, h, a)

-	{

-		this.htm += '<div style="position:absolute;'+

-			'left:' + x + 'px;'+

-			'top:' + y + 'px;'+

-			'width:' +  w + 'px;'+

-			'height:' + h + 'px;">'+

-			'<img src="' + imgSrc + '" width="' + w + '" height="' + h + '"' + (a? (' '+a) : '') + '>'+

-			'<\/div>';

-	};

-

-	this.clear = function()

-	{

-		this.htm = "";

-		if(this.cnv) this.cnv.innerHTML = "";

-	};

-

-	this._mkOvQds = function(cx, cy, x, y, w, h, wod, hod)

-	{

-		var xl = cx - x, xr = cx + x + wod - w, yt = cy - y, yb = cy + y + hod - h;

-		if(xr > xl+w)

-		{

-			this._mkDiv(xr, yt, w, h);

-			this._mkDiv(xr, yb, w, h);

-		}

-		else

-			w = xr - xl + w;

-		this._mkDiv(xl, yt, w, h);

-		this._mkDiv(xl, yb, w, h);

-	};

-	

-	this._mkArcDiv = function(x, y, oy, cx, cy, iOdds, aBndA, aBndZ, iSects)

-	{

-		var xrDef = cx + x + (iOdds & 0xffff), y2, h = oy - y, xl, xr, w;

-

-		if(!h) h = 1;

-		x = cx - x;

-

-		if(iSects & 0xff0000) // Start-angle > end-angle

-		{

-			y2 = cy - y - h;

-			if(iSects & 0x00ff)

-			{

-				if(iSects & 0x02)

-				{

-					xl = Math.max(x, aBndZ[y]);

-					w = xrDef - xl;

-					if(w > 0) this._mkDiv(xl, y2, w, h);

-				}

-				if(iSects & 0x01)

-				{

-					xr = Math.min(xrDef, aBndA[y]);

-					w = xr - x;

-					if(w > 0) this._mkDiv(x, y2, w, h);

-				}

-			}

-			else

-				this._mkDiv(x, y2, xrDef - x, h);

-			y2 = cy + y + (iOdds >> 16);

-			if(iSects & 0xff00)

-			{

-				if(iSects & 0x0100)

-				{

-					xl = Math.max(x, aBndA[y]);

-					w = xrDef - xl;

-					if(w > 0) this._mkDiv(xl, y2, w, h);

-				}

-				if(iSects & 0x0200)

-				{

-					xr = Math.min(xrDef, aBndZ[y]);

-					w = xr - x;

-					if(w > 0) this._mkDiv(x, y2, w, h);

-				}

-			}

-			else

-				this._mkDiv(x, y2, xrDef - x, h);

-		}

-		else

-		{

-			if(iSects & 0x00ff)

-			{

-				if(iSects & 0x02)

-					xl = Math.max(x, aBndZ[y]);

-				else

-					xl = x;

-				if(iSects & 0x01)

-					xr = Math.min(xrDef, aBndA[y]);

-				else

-					xr = xrDef;

-				y2 = cy - y - h;

-				w = xr - xl;

-				if(w > 0) this._mkDiv(xl, y2, w, h);

-			}

-			if(iSects & 0xff00)

-			{

-				if(iSects & 0x0100)

-					xl = Math.max(x, aBndA[y]);

-				else

-					xl = x;

-				if(iSects & 0x0200)

-					xr = Math.min(xrDef, aBndZ[y]);

-				else

-					xr = xrDef;

-				y2 = cy + y + (iOdds >> 16);

-				w = xr - xl;

-				if(w > 0) this._mkDiv(xl, y2, w, h);

-			}

-		}

-	};

-

-	this.setStroke(1);

-	this.setFont("verdana,geneva,helvetica,sans-serif", "12px", Font.PLAIN);

-	this.color = "#000000";

-	this.htm = "";

-	this.wnd = wnd || window;

-

-	if(!jg_ok) _chkDHTM();

-	if(jg_ok)

-	{

-		if(cnv)

-		{

-			if(typeof(cnv) == "string")

-				this.cont = document.all? (this.wnd.document.all[cnv] || null)

-					: document.getElementById? (this.wnd.document.getElementById(cnv) || null)

-					: null;

-			else if(cnv == window.document)

-				this.cont = document.getElementsByTagName("body")[0];

-			// If cnv is a direct reference to a canvas DOM node

-			// (option suggested by Andreas Luleich)

-			else this.cont = cnv;

-			// Create new canvas inside container DIV. Thus the drawing and clearing

-			// methods won't interfere with the container's inner html.

-			// Solution suggested by Vladimir.

-			this.cnv = this.wnd.document.createElement("div");

-			this.cnv.style.fontSize=0;

-			this.cont.appendChild(this.cnv);

-			this.paint = jg_dom? _pntCnvDom : _pntCnvIe;

-		}

-		else

-			this.paint = _pntDoc;

-	}

-	else

-		this.paint = _pntN;

-

-	this.setPrintable(false);

-}

-

-function _mkLinVirt(aLin, x1, y1, x2, y2)

-{

-	var dx = Math.abs(x2-x1), dy = Math.abs(y2-y1),

-	x = x1, y = y1,

-	xIncr = (x1 > x2)? -1 : 1,

-	yIncr = (y1 > y2)? -1 : 1,

-	p,

-	i = 0;

-	if(dx >= dy)

-	{

-		var pr = dy<<1,

-		pru = pr - (dx<<1);

-		p = pr-dx;

-		while(dx > 0)

-		{--dx;

-			if(p > 0)    //  Increment y

-			{

-				aLin[i++] = x;

-				y += yIncr;

-				p += pru;

-			}

-			else p += pr;

-			x += xIncr;

-		}

-	}

-	else

-	{

-		var pr = dx<<1,

-		pru = pr - (dy<<1);

-		p = pr-dy;

-		while(dy > 0)

-		{--dy;

-			y += yIncr;

-			aLin[i++] = x;

-			if(p > 0)    //  Increment x

-			{

-				x += xIncr;

-				p += pru;

-			}

-			else p += pr;

-		}

-	}

-	for(var len = aLin.length, i = len-i; i;)

-		aLin[len-(i--)] = x;

-};

-

-function _CompInt(x, y)

-{

-	return(x - y);

-}

-

diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ExtendedFileManager/backend.php b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ExtendedFileManager/backend.php
deleted file mode 100644
index f6c5f38..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ExtendedFileManager/backend.php
+++ /dev/null
@@ -1,110 +0,0 @@
-<?php 
-/**
-* Unified backend for ExtendedFileManager - copied from ImageManager
-*
-* Image Manager was originally developed by:
-*   Xiang Wei Zhuo, email: xiangweizhuo(at)hotmail.com Wei Shou.
-*
-* Unified backend sponsored by DTLink Software, http://www.dtlink.com
-* Implementation by Yermo Lamers, http://www.formvista.com
-*
-* (c) DTLink, LLC 2005.
-* Distributed under the same terms as Xinha itself.
-* This notice MUST stay intact for use (see license.txt).
-*
-* DESCRIPTION:
-*
-* Instead of using separate URL's for each function, ImageManager now
-* routes all requests to the server through this single, replaceable,
-* entry point. backend.php expects at least two URL variable parameters: 
-*
-* __plugin=ImageManager   for future expansion; identify the plugin being requested.
-* __function=thumbs|images|editorFrame|editor|manager  function being called.
-*
-* Having a single entry point that strictly adheres to a defined interface will 
-* make the backend code much easier to maintain and expand. It will make it easier
-* on integrators, not to mention it'll make it easier to have separate 
-* implementations of the backend in different languages (Perl, Python, ASP, etc.) 
-*
-* @see config.inc.php
-*/
-
-/**
-* ImageManager configuration
-*/
-
-require_once('config.inc.php');
-
-
-// Strip slashes if MQGPC is on
-set_magic_quotes_runtime(0);
-if(get_magic_quotes_gpc())
-{
-  $to_clean = array(&$_GET, &$_POST, &$_REQUEST, &$_COOKIE);
-  while(count($to_clean))
-  {
-    $cleaning =& $to_clean[array_pop($junk = array_keys($to_clean))];
-    unset($to_clean[array_pop($junk = array_keys($to_clean))]);
-    foreach(array_keys($cleaning) as $k)
-    {
-      if(is_array($cleaning[$k]))
-      {
-        $to_clean[] =& $cleaning[$k];
-      }
-      else
-      {
-        $cleaning[$k] = stripslashes($cleaning[$k]);
-      }
-    }
-  }
-}
-
-/**
-* ImageManager configuration
-*/
-
-$formVars = empty($_POST) ? $_GET : $_POST;
-
-// make sure the request is for us (this gives us the ability to eventually organize
-// a backend event handler system) For an include file the return doesn't make alot of
-// sense but eventually we'll want to turn all of this into at least functions 
-// separating out all the presentation HTML from the logic. (Right now all the HTML
-// used by ImageManager is in the same files as the PHP code ...)
-
-if ( @$formVars[ "__plugin" ] != "ExtendedFileManager" )
-	{
-	// not for us.
-
-	return true;
-	}
-
-// so we don't have to re-engineer the entire thing right now, since it's probably
-// going to get rewritten anyway, we just include the correct file based on the 
-// function request.
-
-switch ( @$formVars[ "__function" ] )
-	{
-
-	case "editor": 
-	case "editorFrame":
-	case "manager":
-	case "images":
-	case "thumbs":
-	case "resizer":
-
-		include_once $IMConfig['base_dir'] . '/' . $formVars['__function'] . '.php' ;
-		exit();
-		
-		break;
-
-	default:
-
-		break;
-
-	}	// end of switch.
-
-return false ;
-
-// END
-
-?>
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ExtendedFileManager/config.inc.php b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ExtendedFileManager/config.inc.php
deleted file mode 100644
index bcc5021..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ExtendedFileManager/config.inc.php
+++ /dev/null
@@ -1,413 +0,0 @@
-<?php

-

-/**

- * ExtendedFileManager configuration file.

- * Authors: Wei Zhuo, Afru

- * Version: Updated on 08-01-2005 by Afru

- * Version 1.1.2: Updated on 04-07-2006 by Krzysztof Kotowicz <koto@webworkers.pl>

- * Package: ExtendedFileManager

- * http://www.afrusoft.com/htmlarea

- */

-

-/*  Configuration file usage:

- *	There are two insertModes for this filemanager.

- *	One is "image" and another is "link".

- *	So you can assign config values as below

- *

- *	if($insertMode=="image") $IMConfig['property']=somevalueforimagemode;

- *	else if($insertMode=="link") $IMConfig['property']=somevalueforlinkmode;

- *

- *	(or) you can directly as $IMConfig['property']=somevalueforbothmodes;

- *

- *	Best of Luck :) Afru.

- */

- 

-/*

- *	Getting the mode for further differentiation

- */

-

-if(isset($_REQUEST['mode'])) $insertMode=$_REQUEST['mode'];

-	if(!isset($insertMode)) $insertMode="image";

-

-/**

-* Default backend URL

-*

-* URL to use for unified backend.

-*

-* The ?__plugin=ExtendedFileManager& is required.

-*/

-

-$IMConfig['backend_url'] = "backend.php?__plugin=ExtendedFileManager&";

-

-/**

-* Backend Installation Directory

-*

-* location of backend install; these are used to link to css and js

-* assets because we may have the front end installed in a different

-* directory than the backend. (i.e. nothing assumes that the frontend

-* and the backend are in the same directory)

-*/

-$IMConfig['base_dir'] = getcwd();

-$IMConfig['base_url'] = '';

-

-

-/*

-	 File system path to the directory you want to manage the images

-	 for multiple user systems, set it dynamically.

-

-	 NOTE: This directory requires write access by PHP. That is,

-		   PHP must be able to create files in this directory.

-		   Able to create directories is nice, but not necessary.

-*/

-$IMConfig['images_dir'] = 'demo_images';

-//You may set a different directory for the link mode; if you don't, the above setting will be used for both modes

-//$IMConfig['files_dir'] = 'demo_files';

-

-/*

- The URL to the above path, the web browser needs to be able to see it.

- Please remove scripting capabilities in this directory

- for this directory (i.e. disable PHP, Perl, CGI; see .htaccess file in demo_images folder).

-*/

-$IMConfig['images_url'] = str_replace( array("backend.php","manager.php"), "", $_SERVER["PHP_SELF"] ) . $IMConfig['images_dir'];

-//$IMConfig['files_url'] = 'url/to/files_dir';

-

-/*

-  Format of the Date Modified in list view.

-  It has to be a string understood by the PHP date() function (for possible values see http://http://php.net/manual/en/function.date.php)

-*/

-$IMConfig['date_format'] = "d.m.y H:i";

-/*

-  Possible values: true, false

-

-  TRUE - If PHP on the web server is in safe mode, set this to true.

-         SAFE MODE restrictions: directory creation will not be possible,

-		 only the GD library can be used, other libraries require

-		 Safe Mode to be off.

-

-  FALSE - Set to false if PHP on the web server is not in safe mode.

-*/

-$IMConfig['safe_mode'] = false;

-

-/*

-This specifies whether any image library is available to resize and edit images.TRUE - Thumbnails will be resized by image libraries and if there is no library, default thumbnail will be shown.

-FALSE - Thumbnails will be resized by browser ignoring image libraries.

-*/

-$IMConfig['img_library'] = true;

-

-

-/*

-View type when the File manager is in insert image mode.

-Valid values are "thumbview" and "listview".

-*/

-

-    

-if ($insertMode == 'image')

-	$IMConfig['view_type'] = "thumbview";

-	

-else if($insertMode == "link")

-	$IMConfig['view_type'] = "listview";

-

-$IMConfig['insert_mode'] = $insertMode;

-

-/* 

- Possible values: 'GD', 'IM', or 'NetPBM'

-

- The image manipulation library to use, either GD or ImageMagick or NetPBM.

- If you have safe mode ON, or don't have the binaries to other packages, 

- your choice is 'GD' only. Other packages require Safe Mode to be off.

-*/

-define('IMAGE_CLASS', 'GD');

-

-

-/*

- After defining which library to use, if it is NetPBM or IM, you need to

- specify where the binary for the selected library are. And of course

- your server and PHP must be able to execute them (i.e. safe mode is OFF).

- GD does not require the following definition.

-*/

-define('IMAGE_TRANSFORM_LIB_PATH', '/usr/bin/');

-//define('IMAGE_TRANSFORM_LIB_PATH', 'C:/"Program Files"/ImageMagick-5.5.7-Q16/');

-

-

-/*

-  The prefix for thumbnail files, something like .thumb will do. The

-  thumbnails files will be named as "prefix_imagefile.ext", that is,

-  prefix + orginal filename.

-*/

-$IMConfig['thumbnail_prefix'] = 't_';

-

-

-/*

-  Thumbnail can also be stored in a directory, this directory

-  will be created by PHP. If PHP is in safe mode, this parameter

-  is ignored, you can not create directories.

-

-  If you do not want to store thumbnails in a directory, set this

-  to false or empty string '';

-*/

-$IMConfig['thumbnail_dir'] = 't';

-

-/**

- * Resize files, or not.  If the dimensions for an image are changed

- * this will control if the image is actually resized.  

- *

- * Usually you want this true, unless you are very disk space concious.

- */

- 

-$IMConfig['resize_files'] = true;

-

-/**

-* Resized prefix

-*

-* The prefix for resized files, something like .resized will do.  The

-* resized files will be named <prefix>_<width>x<height>_<original>

-* resized files are created when one changes the dimensions of an image

-* in the image manager selection dialog - the image is scaled when the

-* user clicks the ok button.

-*/

-

-$IMConfig['resized_prefix'] = '.resized';

-

-// -------------------------------------------------------------------------

-

-/**

-* Resized Directory

-*

-* Resized images may also be stored in a directory, except in safe mode.

-*/

-

-$IMConfig['resized_dir'] = '';

-

-/*

-  Possible values: true, false

-

- TRUE -  Allow the user to create new sub-directories in the

-         $IMConfig['images_dir']/$IMConfig['files_dir'].

-

- FALSE - No directory creation.

-

- NOTE: If $IMConfig['safe_mode'] = true, this parameter

-       is ignored, you can not create directories

-*/

-$IMConfig['allow_new_dir'] = false;

-

-/*

-  Possible values: true, false

-

- TRUE -  Allow the user to edit image by image editor.

-

- FALSE - No edit icon will be displayed.

-

- NOTE: If $IMConfig['img_library'] = false, this parameter

-       is ignored, you can not edit images.

-*/

-$IMConfig['allow_edit_image'] = false;

-

-/*

-  Possible values: true, false

-

- TRUE -  Allow the user to rename files and folders.

-

- FALSE - No rename icon will be displayed.

-

-*/

-$IMConfig['allow_rename'] = false;

-

-/*

-  Possible values: true, false

-

- TRUE -  Allow the user to perform cut/copy/paste actions.

-

- FALSE - No cut/copy/paste icons will be displayed.

-

-*/

-$IMConfig['allow_cut_copy_paste'] = false;

-

-/*

-  Possible values: true, false

-

- TRUE -  Allow the user to delete files and folders.

-

- FALSE - No delete icon will be displayed.

-

-*/

-$IMConfig['allow_delete'] = false;

-

-/*

-  Possible values: true, false

-

-  TRUE - Display color pickers for image background / border colors

-

-  FALSE - Don't display color pickers

-*/

-$IMConfig['use_color_pickers'] = true;

-

-/*

-  Possible values: true, false

-

- TRUE -  Allow the user to set alt (alternative text) attribute.

-

- FALSE - No input field for alt attribute will be displayed.

-

- NOTE: The alt attribute is _obligatory_ for images, so <img alt="" /> will be inserted

-      if 'images_enable_alt' is set to false

-*/

-$IMConfig['images_enable_alt'] = true;

-

-/*

-  Possible values: true, false

-

- TRUE -  Allow the user to set title attribute (usually displayed when mouse is over element).

-

- FALSE - No input field for title attribute will be displayed.

-

-*/

-$IMConfig['images_enable_title'] = false;

-

-/*

-  Possible values: true, false

-

- TRUE -  Allow the user to set align attribute.

-

- FALSE - No selection box for align attribute will be displayed.

-

-*/

-$IMConfig['images_enable_align'] = true;

-

-/*

-  Possible values: true, false

-

- TRUE -  Allow the user to set margin, padding, and border styles for the image

-

- FALSE - No styling input fields will be displayed.

-

-*/

-$IMConfig['images_enable_styling'] = true;

-

-/*

-  Possible values: true, false

-

- TRUE -   Allow the user to set target attribute for link (the window in which the link will be opened).

-

- FALSE - No selection box for target attribute will be displayed.

-

-*/

-$IMConfig['link_enable_target'] = true;

-/*

-  Possible values: true, false

-

-  TRUE - Allow the user to upload files.

-

-  FALSE - No uploading allowed.

-*/

-$IMConfig['allow_upload'] = false;

-

-/* Maximum upload file size

-

-  Possible values: number, "max"

-

-  number - maximum size in Kilobytes.

-

-  "max"  - the maximum allowed by the server (the value is retrieved from the server configuration).

-*/

-$IMConfig['max_filesize_kb_image'] = 200;

-

-$IMConfig['max_filesize_kb_link'] = 5000;

-

-/* Maximum upload folder size in Megabytes. Use 0 to disable limit */

-$IMConfig['max_foldersize_mb'] = 0;

-

-/*

-Allowed extensions that can be shown and allowed to upload.

-Available icons are for "doc,fla,gif,gz,html,jpg,js,mov,pdf,php,png,ppt,rar,txt,xls,zip"

--Changed by AFRU.

-*/

-

-$IMConfig['allowed_image_extensions'] = array("jpg","gif","png","bmp");

-$IMConfig['allowed_link_extensions'] = array("jpg","gif","js","php","pdf","zip","txt","psd","png","html","swf","xml","xls","doc");

-

-

-/*

- The default thumbnail and list view icon in case thumbnails are not created and the files are of unknown.

-*/

-$IMConfig['default_thumbnail'] = 'icons/def.gif';

-$IMConfig['default_listicon'] = 'icons/def_small.gif';

-

-

-/*

-Only files with these extensions will be shown as thumbnails. All other files will be shown as icons.

-*/

-$IMConfig['thumbnail_extensions'] = array("jpg", "gif", "png", "bmp");

-

-/*

-  Thumbnail dimensions.

-*/

-$IMConfig['thumbnail_width'] = 84;

-$IMConfig['thumbnail_height'] = 84;

-

-/*

-  Image Editor temporary filename prefix.

-*/

-$IMConfig['tmp_prefix'] = '.editor_';

-

-

-// Standard PHP Backend Data Passing

-//  if data was passed using xinha_pass_to_php_backend() we merge the items

-//  provided into the Config

-require_once(realpath(dirname(__FILE__) . '/../../contrib/php-xinha.php'));

-if($passed_data = xinha_read_passed_data())

-{

-  $IMConfig = array_merge($IMConfig, $passed_data);

-  $IMConfig['backend_url'] .= xinha_passed_data_querystring() . '&';

-}

-// Deprecated config passing, don't use this way any more!

-elseif(isset($_REQUEST['backend_config']))

-{

-  if(get_magic_quotes_gpc()) {

-    $_REQUEST['backend_config'] = stripslashes($_REQUEST['backend_config']);

-  }

-  

-  if($_REQUEST['backend_config_secret_key_location'] !== 'Xinha:ExtendedFileManager')

-  {

-    trigger_error('Programming Error - please contact the website administrator/programmer to alert them to this problem. A non-default backend key location is being used to pass backend data to Xinha, but the same key location is not being used to receive data.  The special backend configuration has been ignored.  To resolve this, you should edit plugins/ExtendedFileManager/config.php and change the default key location from "Xinha:ExtendedFileManager" to your desired non default.  See: http://trac.xinha.org/ticket/1518', E_USER_ERROR);    

-  }

-  else

-  {

-  // Config specified from front end, check that it's valid

-  session_start();

-  if (!array_key_exists($_REQUEST['backend_config_secret_key_location'], $_SESSION))

-    die("Backend security error.");

-

-  $secret = $_SESSION[$_REQUEST['backend_config_secret_key_location']];

-

-  if($_REQUEST['backend_config_hash'] !== sha1($_REQUEST['backend_config'] . $secret))

-  {

-    die("Backend security error.");

-  }

-

-  $to_merge = unserialize($_REQUEST['backend_config']);

-  if(!is_array($to_merge))

-  {

-    die("Backend config syntax error.");

-  }

-

-  $IMConfig = array_merge($IMConfig, $to_merge);

-

-   // changed config settings keys in relation to ImageManager

-  $IMConfig['backend_url'] .= "backend_config=" . rawurlencode($_REQUEST['backend_config']) . '&';

-  $IMConfig['backend_url'] .= "backend_config_hash=" . rawurlencode($_REQUEST['backend_config_hash']) . '&';

-  $IMConfig['backend_url'] .= "backend_config_secret_key_location=" . rawurlencode($_REQUEST['backend_config_secret_key_location']) . '&';

-  }

-}

-if ($IMConfig['max_filesize_kb_link'] == "max")

-{

-  $IMConfig['max_filesize_kb_link'] = upload_max_filesize_kb();

-}

-

-if ($IMConfig['max_filesize_kb_image'] == "max")

-{

-  $IMConfig['max_filesize_kb_image'] = upload_max_filesize_kb();

-}

-// END

-

-?>

diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ExtendedFileManager/demo_images/.htaccess b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ExtendedFileManager/demo_images/.htaccess
deleted file mode 100644
index 98b45cf..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ExtendedFileManager/demo_images/.htaccess
+++ /dev/null
@@ -1,11 +0,0 @@
-<IfModule mod_php.c>
- php_flag engine off
-</IfModule>
-AddType text/html .html .htm .shtml .php .php3 .php4 .php5 .php6 .php7 .php8 .phtml .phtm .pl .py .cgi
-RemoveHandler .php
-RemoveHandler .php8
-RemoveHandler .php7
-RemoveHandler .php6
-RemoveHandler .php5
-RemoveHandler .php4
-RemoveHandler .php3
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ExtendedFileManager/demo_images/bikerpeep.jpg b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ExtendedFileManager/demo_images/bikerpeep.jpg
deleted file mode 100644
index a2e7028..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ExtendedFileManager/demo_images/bikerpeep.jpg
+++ /dev/null
Binary files differ
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ExtendedFileManager/demo_images/linux/.htaccess b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ExtendedFileManager/demo_images/linux/.htaccess
deleted file mode 100644
index e671b32..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ExtendedFileManager/demo_images/linux/.htaccess
+++ /dev/null
@@ -1,10 +0,0 @@
-
-<IfModule mod_php.c>
- php_flag engine off
-</IfModule>
-AddType text/html .html .htm .shtml .php .php3 .phtml .phtm .pl .py .cgi
-RemoveHandler .php
-RemoveHandler .php5
-RemoveHandler .php4
-RemoveHandler .php3
-
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ExtendedFileManager/demo_images/linux/linux.gif b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ExtendedFileManager/demo_images/linux/linux.gif
deleted file mode 100644
index 3f42d2c..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ExtendedFileManager/demo_images/linux/linux.gif
+++ /dev/null
Binary files differ
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ExtendedFileManager/demo_images/wesnoth078.jpg b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ExtendedFileManager/demo_images/wesnoth078.jpg
deleted file mode 100644
index ea37d1a..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ExtendedFileManager/demo_images/wesnoth078.jpg
+++ /dev/null
Binary files differ
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ExtendedFileManager/editor.php b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ExtendedFileManager/editor.php
deleted file mode 100644
index 3fb2626..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ExtendedFileManager/editor.php
+++ /dev/null
@@ -1,172 +0,0 @@
-<?php

-/**

- * ExtendedFileManager editor.php file.

- * Authors: Wei Zhuo, Afru, Krzysztof Kotowicz

- * Version: Updated on 08-01-2005 by Afru

- * Version: Updated on 21-06-2006 by Krzysztof Kotowicz

- * Version: Updated on 20-01-2008 by Raimund Meyer

- * Package: ExtendedFileManager (EFM 1.4)

- * http://www.afrusoft.com/htmlarea

- */

-if(isset($_REQUEST['mode'])) $insertMode=$_REQUEST['mode'];

-	if(!isset($insertMode)) $insertMode="image";

-

-require_once('config.inc.php');

-require_once('Classes/ExtendedFileManager.php');

-require_once('../ImageManager/Classes/ImageEditor.php');

-

-$manager = new ExtendedFileManager($IMConfig,$insertMode);

-$editor = new ImageEditor($manager);

-

-?>

-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

-

-<html>

-<head>

-	<title>Xinha Image Editor</title>

-	<link href="<?php print $IMConfig['base_url'];?>assets/editor.css" rel="stylesheet" type="text/css" />

-<script type="text/javascript" src="<?php print $IMConfig['base_url'];?>assets/slider.js"></script>

-<script type="text/javascript" src="../../popups/popup.js"></script>

-<script type="text/javascript" src="<?php print $IMConfig['base_url'];?>assets/popup.js"></script>

-<script type="text/javascript">

-/*<![CDATA[*/

-

-    var _backend_url = "<?php print $IMConfig['backend_url']."&mode=$insertMode"; ?>&";

-

-	if(window.opener)

-		Xinha = window.opener.Xinha;

-/*]]>*/

-</script>

-<script type="text/javascript" src="<?php print $IMConfig['base_url'];?>assets/editor.js"></script>

-</head>

-

-<body>

-<table style="width:100%">

-<tr>

-	<td id="indicator">

-    	<img src="<?php print $IMConfig['base_url'];?>img/spacer.gif" id="indicator_image" height="20" width="20" alt=""/>
-	</td>

-	<td id="tools">

-		<div id="tools_crop" style="display:none;">

-			<div class="tool_inputs">

-				<label for="cx">Start X:</label><input type="text" id="cx"  class="textInput" onchange="updateMarker('crop')"/>

-				<label for="cy">Start Y:</label><input type="text" id="cy" class="textInput" onchange="updateMarker('crop')"/>

-				<label for="cw">Width:</label><input type="text" id="cw" class="textInput" onchange="updateMarker('crop')"/>

-				<label for="ch">Height:</label><input type="text" id="ch" class="textInput" onchange="updateMarker('crop')"/>			<img src="<?php print $IMConfig['base_url'];?>img/div.gif" height="30" width="2" class="div" alt="|" />

-			</div>	

-			<a href="javascript:void(0);" onclick="editor.doSubmit('crop');" class="buttons" title="OK"><img src="<?php print $IMConfig['base_url'];?>img/btn_ok.gif" height="30" width="30" alt="OK" /></a>

-			<a href="javascript:void(0);" onclick="editor.reset();" class="buttons" title="Cancel"><img src="<?php print $IMConfig['base_url'];?>img/btn_cancel.gif" height="30" width="30" alt="Cancel" /></a>

-		</div>	

-		<div id="tools_scale" style="display:none;">

-			<div class="tool_inputs">

-				<label for="sw">Width:</label><input type="text" id="sw" class="textInput" onchange="checkConstrains('width')"/>

-				<a href="javascript:void(0);" onclick="toggleConstraints();" title="Lock"><img src="<?php print $IMConfig['base_url'];?>img/islocked2.gif" id="scaleConstImg" height="14" width="8" alt="Lock" class="div" /></a><label for="sh">Height:</label>

-				<input type="text" id="sh" class="textInput" onchange="checkConstrains('height')"/>

-				<input type="checkbox" id="constProp" value="1" checked="checked" onclick="toggleConstraints()"/>

-				<label for="constProp">Constrain Proportions</label>

-				<img src="<?php print $IMConfig['base_url'];?>img/div.gif" height="30" width="2" class="div" alt="|" />

-			</div>	

-			<a href="javascript:void(0);" onclick="editor.doSubmit('scale');" class="buttons" title="OK"><img src="<?php print $IMConfig['base_url'];?>img/btn_ok.gif" height="30" width="30" alt="OK" /></a>

-			<a href="javascript:void(0);" onclick="zoom();" class="buttons" title="Cancel"><img src="<?php print $IMConfig['base_url'];?>img/btn_cancel.gif" height="30" width="30" alt="Cancel" /></a>

-		</div>	

-		<div id="tools_rotate" style="display:none;">

-			<div class="tool_inputs">

-				<select id="rotate_sub_action" name="rotate_sub_action" onchange="rotateSubActionSelect(this)" style="margin-left: 10px; vertical-align: middle;">

-					<option selected="selected" value="rotate">Rotate Image</option>

-					<option value="flip">Flip Image</option>

-				</select>

-				<select id="rotate_preset_select" name="rotate_preset_select" onchange="rotatePreset(this)" style="margin-left: 20px; vertical-align: middle;">

-					<option>Preset</option>

-					<option value="180">Rotate 180 &deg;</option>

-					<option value="90">Rotate 90 &deg; CW</option>

-					<option value="-90">Rotate 90 &deg; CCW</option>

-				</select>

-				<select id="flip" name="flip" style="margin-left: 20px; vertical-align: middle;display:none">

-					<option value="hoz">Flip Horizontal</option>

-					<option value="ver">Flip Vertical</option>

-				</select>

-				<label for="ra">Angle:<input type="text" id="ra" class="textInput" /></label>

-				<img src="<?php print $IMConfig['base_url'];?>img/div.gif" height="30" width="2" class="div" alt="|" />

-			</div>	

-			<a href="javascript:void(0);" onclick="editor.doSubmit('rotate');" class="buttons" title="OK"><img src="<?php print $IMConfig['base_url'];?>img/btn_ok.gif" height="30" width="30" alt="OK" /></a>

-			<a href="javascript:void(0);" onclick="editor.reset();" class="buttons" title="Cancel"><img src="<?php print $IMConfig['base_url'];?>img/btn_cancel.gif" height="30" width="30" alt="Cancel" /></a>

-		</div>		

-		<div id="tools_measure" style="display:none;">

-			<div class="tool_inputs">

-				<label>X:</label><input type="text" class="measureStats" id="sx" />

-				<label>Y:</label><input type="text" class="measureStats" id="sy" />

-				<img src="<?php print $IMConfig['base_url'];?>img/div.gif" height="30" width="2" class="div" alt="|" />

-				<label>W:</label><input type="text" class="measureStats" id="mw" />

-				<label>H:</label><input type="text" class="measureStats" id="mh" />

-				<img src="<?php print $IMConfig['base_url'];?>img/div.gif" height="30" width="2" class="div" alt="|" />

-				<label>A:</label><input type="text" class="measureStats" id="ma" />		

-				<label>D:</label><input type="text" class="measureStats" id="md" />		

-				<img src="<?php print $IMConfig['base_url'];?>img/div.gif" height="30" width="2" class="div" alt="|" />

-				<button type="button" onclick="editor.reset();" >Clear</button>

-			</div>	

-		</div>

-		<div id="tools_save" style="display:none;">

-			<div class="tool_inputs">

-				<label for="save_filename">Filename:</label><input type="text" id="save_filename" value="<?php echo $editor->getDefaultSaveFile();?>"/>

-				<select name="format" id="save_format" style="margin-left: 10px; vertical-align: middle;" onchange="updateFormat(this)">

-	            <option value="jpeg,85">JPEG High</option>

-	            <option value="jpeg,60">JPEG Medium</option>

-	            <option value="jpeg,35">JPEG Low</option>

-	            <option value="png">PNG</option>

-				<?php if($editor->isGDGIFAble() != -1) { ?>

-	            <option value="gif">GIF</option>

-				<?php } ?>

-	         </select>

-			 <div id="slider" style="display:inline">

-				<label>Quality:</label>

-				<table style="display: inline; vertical-align: middle;" cellpadding="0" cellspacing="0">

-					<tr>

-					<td>

-						<div id="slidercasing"> 

-					<div id="slidertrack" style="width:100px"><img src="<?php print $IMConfig['base_url'];?>img/spacer.gif" width="1" height="1" border="0" alt="track" /></div>

-	            <div id="sliderbar" style="left:85px" onmousedown="captureStart();"><img src="<?php print $IMConfig['base_url'];?>img/spacer.gif" width="1" height="1" border="0" alt="track" /></div>

-				</div>	

-					</td>

-					</tr>

-				</table>

-				<input type="text" id="quality" onchange="updateSlider(this.value)" style="width: 2em;" value="85"/>

-			</div>

-			<img src="<?php print $IMConfig['base_url'];?>img/div.gif" height="30" width="2" class="div" alt="|" />

-			<div style="display:inline;font-size:10px">

-			<span>Filesize:</span> <span id="filesize"></span>

-			</div> 

-			<img src="<?php print $IMConfig['base_url'];?>img/div.gif" height="30" width="2" class="div" alt="|" />

-			</div>	

-			<button type="button" style="float:left;margin:17px 5px 0 ;" onclick="editor.doSubmit('preview')">Preview</button>

-			<button type="button" style="float:left;margin-top:17px;" onclick="editor.doSubmit('save');">Save</button>

-			</div>	

-	</td>

-</tr>

-<tr>

-	<td id="toolbar">

-		<a href="javascript:void(0);"  onclick="toggle('crop')" id="icon_crop" title="Crop"><img src="<?php print $IMConfig['base_url'];?>img/crop.gif" height="20" width="20" alt="Crop" /><span>Crop</span></a>

-		<a href="javascript:void(0);" onclick="toggle('scale')" id="icon_scale" title="Resize"><img src="<?php print $IMConfig['base_url'];?>img/scale.gif" height="20" width="20" alt="Resize" /><span>Resize</span></a>

-		<a href="javascript:void(0);" onclick="toggle('rotate')" id="icon_rotate" title="Rotate"><img src="<?php print $IMConfig['base_url'];?>img/rotate.gif" height="20" width="20" alt="Rotate" /><span>Rotate</span></a>

-		<a href="javascript:void(0);" onclick="toggle('measure')" id="icon_measure" title="Measure"><img src="<?php print $IMConfig['base_url'];?>img/measure.gif" height="20" width="20" alt="Measure" /><span>Measure</span></a>

-		<a href="javascript:void(0);" onclick="toggleMarker();" title="Toggle marker color"><img id="markerImg" src="<?php print $IMConfig['base_url'];?>img/t_black.gif" height="20" width="20" alt="Marker" /><span>Marker</span></a>

-		<a href="javascript:void(0);" onclick="toggle('save')" id="icon_save" title="Save"><img src="<?php print $IMConfig['base_url'];?>img/save.gif" height="20" width="20" alt="Save" /><span>Save</span></a>

-		<div style="margin-top:10px">Zoom</div>

-		<select id="zoom" onchange="zoom(this.value)">

-			<option value="10">10%</option>

-			<option value="25">25%</option>

-			<option value="50">50%</option>

-			<option value="75">75%</option>

-			<option value="100" selected="selected">100%</option>

-			<option value="200">200%</option>

-		</select>

-	</td>

-	<td id="contents">

-		<?php

-		$iframe_src = $IMConfig['backend_url'].'__function=editorFrame&img='.((isset($_GET['img'])) ? rawurlencode($_GET['img']) : '').'&mode='. $insertMode;

-		?>

-		<iframe src="<?php print htmlspecialchars($iframe_src) ?>" name="editor" id="editor"  scrolling="auto" title="Image Editor" frameborder="0"></iframe>

-	</td>

-</tr>

-</table>

-</body>

-</html>

diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ExtendedFileManager/editorFrame.php b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ExtendedFileManager/editorFrame.php
deleted file mode 100644
index 30fb310..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ExtendedFileManager/editorFrame.php
+++ /dev/null
@@ -1,84 +0,0 @@
-<?php

-/**

- * ExtendedFileManager editorframe.php file.

- * Authors: Wei Zhuo, Afru, Krzysztof Kotowicz

- * Version: Updated on 08-01-2005 by Afru

- * Version: Updated on 21-06-2006 by Krzysztof Kotowicz

- * Version: Updated on 20-01-2008 by Raimund Meyer

- * Package: ExtendedFileManager (EFM 1.4)

- * http://www.afrusoft.com/htmlarea

- */

-if(isset($_REQUEST['mode'])) $insertMode=$_REQUEST['mode'];

-	if(!isset($insertMode)) $insertMode="image";

-

-require_once('config.inc.php');

-require_once('Classes/ExtendedFileManager.php');

-require_once('../ImageManager/Classes/ImageEditor.php');

-

-$manager = new ExtendedFileManager($IMConfig,$insertMode);

-$editor = new ImageEditor($manager);

-$imageInfo = $editor->processImage();

-

-?>

-

-<html>

-<head>

-	<title></title>

-<link href="<?php print $IMConfig['base_url'];?>assets/editorFrame.css" rel="stylesheet" type="text/css" />

-<script type="text/javascript" src="<?php print $IMConfig['base_url'];?>assets/wz_jsgraphics.js"></script>

-<script type="text/javascript" src="<?php print $IMConfig['base_url'];?>assets/EditorContent.js"></script>

-<script type="text/javascript">

-    var _backend_url = "<?php print $IMConfig['backend_url']."&mode=$insertMode"; ?>&";

-

-    if(window.top)

-    	Xinha = window.top.Xinha;

-

-    function i18n(str) {

-        return Xinha._lc(str, 'ImageManager');

-    }

-

-	var mode = "<?php echo $editor->getAction(); ?>" //crop, scale, measure

-	var currentImageFile = "<?php if(count($imageInfo)>0) echo rawurlencode($imageInfo['file']); ?>";

-	var fileSize = "<?php echo (round($imageInfo['filesize'] / 1024,1)).' KB' ?>";

-	

-

-<?php if ($editor->isFileSaved() == 1) { ?>

-	alert(i18n('File saved.'));

-

-    window.parent.opener.parent.refresh();

-    window.parent.opener.selectImage

-    (

-  	'<?php echo $imageInfo['saveFile'] ?>',

-  	'<?php echo $imageInfo['saveFile'] ?>'.replace(/^.*\/?([^\/]*)$/, '$1'),

-  	<?php echo $imageInfo['width'] ?>,

-  	<?php echo $imageInfo['height'] ?>

-  	);

-  	window.parent.close();

-  	

-<?php } else if ($editor->isFileSaved() == -1) { ?>

-	alert(i18n('File was not saved.'));

-<?php } ?>

-

-</script>

-<script type="text/javascript" src="<?php print $IMConfig['base_url'];?>assets/editorFrame.js"></script>

-</head>

-

-<body>

-<div id="status"></div>

-<div id="ant" class="selection" style="visibility:hidden"><img src="<?php print $IMConfig['base_url'];?>img/spacer.gif" width="0" height="0" border="0" alt="" id="cropContent"></div>

-<?php if ($editor->isGDEditable() == -1) { ?>

-	<div style="text-align:center; padding:10px;"><span class="error">GIF format is not supported, image editing not supported.</span></div>

-<?php } ?>

-<table height="100%" width="100%">

-	<tr>

-		<td>

-<?php if(count($imageInfo) > 0 && is_file($imageInfo['fullpath'])) { ?>

-	<span id="imgCanvas" class="crop"><img src="<?php echo $imageInfo['src']; ?>" <?php echo $imageInfo['dimensions']; ?> alt="" id="theImage" name="theImage"></span>

-<?php } else { ?>

-	<span class="error">No Image Available</span>

-<?php } ?>

-		</td>

-	</tr>

-</table>

-</body>

-</html>

diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ExtendedFileManager/file-picker.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ExtendedFileManager/file-picker.js
deleted file mode 100644
index 0977727..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ExtendedFileManager/file-picker.js
+++ /dev/null
@@ -1,164 +0,0 @@
-/**
- * An input field File Picker utilising the Xinha ExtendedFileManager.
- *
- * Hijack the Xinha ExtendedFileManager plugin to provide a file URL picker
- * for any form input field in the form of a "Browse" button to the
- * right of the field, in the same manner as a file type input field
- * except it opens the familiar ExtendedFileManager dialog to upload/select
- * a file and returns the URL of the file to the field's value.
- *
- * Example Usage:
- *
- *  <script type="text/javascript">_editor_url = '/url/to/xinha';</script>
- *  <script type="text/javascript" src="file-picker.js" />
- *  <script type="text/javascript">
- *   <?php require_once('/path/to/xinha/contrib/php-xinha.php'); ?>
- *   with(FilePicker.prototype)
- *   {
- *     <?php 
- *      $Conf = array
- *       (
- *         'files_dir' => '/path/to/downloads', 
- *         'files_url' => '/url/to/downloads', 
- *         'show_full_options' => false, // Full options are not useful as a URL picker
- *         // See ExtendedFileManager for more configuration options !           
- *       );
- *      xinha_pass_to_php_backend($Conf);
- *     ?>
- *   }
- *
- *   window.onload = function() { new FilePicker(document.getElementById('idOfTheInputField')); }
- *  </script>
- *
- *
- * @author $Author$
- * @version $Id$
- * @package ImageManager
- */
-
-
-function FilePicker(field)
-{
-  this.field = field;
-  var picker = this;
-  
-  var but = document.createElement('input');   
-  but.type = 'button';
-  but.value = 'Browse'; 
-  but.onclick = function() { picker.popup_picker(); }
-     
-  field.parentNode.insertBefore(but,field.nextSibling);
-  field.size = '20';
-  field.style.textAlign = 'right';
-};
-
-FilePicker.prototype.backend             = _editor_url + 'plugins/ExtendedFileManager/backend.php?__plugin=ExtendedFileManager&';
-FilePicker.prototype.backend_data        = null;
-
-FilePicker.prototype.append_query_string = true;
-
-FilePicker.prototype.popup_picker = function()
-{
-  var picker = this; // closure for later  
-  var outparam = null;
-  if(picker.field.value)
-  {
-    outparam =
-		{      
-			f_href    : picker.field.value,
-      f_title   : '',
-      f_target  : '',
-      f_usetarget : false,
-      baseHref: null
-    };
-     
-  }
-
-  var manager = this.backend + '__function=manager&mode=link';
-  if(this.backend_config != null)
-  {
-    manager += '&backend_config='
-      + encodeURIComponent(this.backend_config);
-    manager += '&backend_config_hash='
-      + encodeURIComponent(this.backend_config_hash);
-    manager += '&backend_config_secret_key_location='
-      + encodeURIComponent(this.backend_config_secret_key_location);
-  }
-  
-  if(this.backend_data != null)
-  {
-    for ( var i in this.backend_data )
-    {
-      manager += '&' + i + '=' + encodeURIComponent(this.backend_data[i]);
-    }
-  }
-
-  Dialog(manager, function(param) {
-		if (!param) {	// user must have pressed Cancel
-			return false;
-		}
-    
-    picker.field.value = param.f_href;
-    
-		}, outparam);
-}
-
-// Dialog is part of Xinha, but we'll provide it here incase Xinha's not being
-// loaded.
-if(typeof Dialog == 'undefined')
-{
-  // htmlArea v3.0 - Copyright (c) 2003-2004 interactivetools.com, inc.
-  // This copyright notice MUST stay intact for use (see license.txt).
-  //
-  // Portions (c) dynarch.com, 2003-2004
-  //
-  // A free WYSIWYG editor replacement for <textarea> fields.
-  // For full source code and docs, visit http://www.interactivetools.com/
-  //
-  // Version 3.0 developed by Mihai Bazon.
-  //   http://dynarch.com/mishoo
-  //
-  // $Id: dialog.js 183 2005-05-20 06:11:44Z gogo $
-  
-  // Though "Dialog" looks like an object, it isn't really an object.  Instead
-  // it's just namespace for protecting global symbols.
-  
-  function Dialog(url, action, init) {
-    if (typeof init == "undefined") {
-      init = window;	// pass this window object by default
-    }
-    var dlg = window.open(url, "hadialog",
-              "toolbar=no,menubar=no,personalbar=no,width=10,height=10," +
-              "scrollbars=yes,resizable=yes,modal=yes,dependable=yes");
-    Dialog._modal = dlg;
-    Dialog._arguments = init;
-
-    // make up a function to be called when the Dialog ends.
-    Dialog._return = function (val) 
-    {
-      if (val && action) {
-        action(val);
-      }
-
-      Dialog._modal = null;
-    };
-    Dialog._modal.focus();
-  };
-     
-  // should be a function, the return handler of the currently opened dialog.
-  Dialog._return = null;
-  
-  // constant, the currently opened dialog
-  Dialog._modal = null;
-  
-  // the dialog will read it's args from this variable
-  Dialog._arguments = null;
- 
-}
-
-// Deprecated method for passing config, use above instead!
-//---------------------------------------------------------
-FilePicker.prototype.backend_config      = null;
-FilePicker.prototype.backend_config_hash = null;
-FilePicker.prototype.backend_config_secret_key_location = 'Xinha:ExtendedFileManager';
-//---------------------------------------------------------
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ExtendedFileManager/icons/def.gif b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ExtendedFileManager/icons/def.gif
deleted file mode 100644
index 2845b96..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ExtendedFileManager/icons/def.gif
+++ /dev/null
Binary files differ
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ExtendedFileManager/icons/def_small.gif b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ExtendedFileManager/icons/def_small.gif
deleted file mode 100644
index 54fd484..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ExtendedFileManager/icons/def_small.gif
+++ /dev/null
Binary files differ
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ExtendedFileManager/icons/doc.gif b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ExtendedFileManager/icons/doc.gif
deleted file mode 100644
index f197227..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ExtendedFileManager/icons/doc.gif
+++ /dev/null
Binary files differ
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ExtendedFileManager/icons/doc_small.gif b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ExtendedFileManager/icons/doc_small.gif
deleted file mode 100644
index a343a3c..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ExtendedFileManager/icons/doc_small.gif
+++ /dev/null
Binary files differ
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ExtendedFileManager/icons/fla.gif b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ExtendedFileManager/icons/fla.gif
deleted file mode 100644
index 7135f25..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ExtendedFileManager/icons/fla.gif
+++ /dev/null
Binary files differ
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ExtendedFileManager/icons/fla_small.gif b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ExtendedFileManager/icons/fla_small.gif
deleted file mode 100644
index 02b13d1..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ExtendedFileManager/icons/fla_small.gif
+++ /dev/null
Binary files differ
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ExtendedFileManager/icons/folder.gif b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ExtendedFileManager/icons/folder.gif
deleted file mode 100644
index 9003f58..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ExtendedFileManager/icons/folder.gif
+++ /dev/null
Binary files differ
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ExtendedFileManager/icons/folder_small.gif b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ExtendedFileManager/icons/folder_small.gif
deleted file mode 100644
index b50e98a..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ExtendedFileManager/icons/folder_small.gif
+++ /dev/null
Binary files differ
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ExtendedFileManager/icons/gif_small.gif b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ExtendedFileManager/icons/gif_small.gif
deleted file mode 100644
index 8377473..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ExtendedFileManager/icons/gif_small.gif
+++ /dev/null
Binary files differ
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ExtendedFileManager/icons/gz.gif b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ExtendedFileManager/icons/gz.gif
deleted file mode 100644
index f59ecef..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ExtendedFileManager/icons/gz.gif
+++ /dev/null
Binary files differ
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ExtendedFileManager/icons/gz_small.gif b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ExtendedFileManager/icons/gz_small.gif
deleted file mode 100644
index 639556e..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ExtendedFileManager/icons/gz_small.gif
+++ /dev/null
Binary files differ
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ExtendedFileManager/icons/html.gif b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ExtendedFileManager/icons/html.gif
deleted file mode 100644
index 2d54999..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ExtendedFileManager/icons/html.gif
+++ /dev/null
Binary files differ
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ExtendedFileManager/icons/html_small.gif b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ExtendedFileManager/icons/html_small.gif
deleted file mode 100644
index 2d30ebd..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ExtendedFileManager/icons/html_small.gif
+++ /dev/null
Binary files differ
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ExtendedFileManager/icons/jpg_small.gif b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ExtendedFileManager/icons/jpg_small.gif
deleted file mode 100644
index a6a4e78..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ExtendedFileManager/icons/jpg_small.gif
+++ /dev/null
Binary files differ
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ExtendedFileManager/icons/js.gif b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ExtendedFileManager/icons/js.gif
deleted file mode 100644
index 9ab9878..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ExtendedFileManager/icons/js.gif
+++ /dev/null
Binary files differ
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ExtendedFileManager/icons/js_small.gif b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ExtendedFileManager/icons/js_small.gif
deleted file mode 100644
index 24e14fb..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ExtendedFileManager/icons/js_small.gif
+++ /dev/null
Binary files differ
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ExtendedFileManager/icons/mov.gif b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ExtendedFileManager/icons/mov.gif
deleted file mode 100644
index 26b6595..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ExtendedFileManager/icons/mov.gif
+++ /dev/null
Binary files differ
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ExtendedFileManager/icons/mov_small.gif b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ExtendedFileManager/icons/mov_small.gif
deleted file mode 100644
index 5a35d21..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ExtendedFileManager/icons/mov_small.gif
+++ /dev/null
Binary files differ
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ExtendedFileManager/icons/pdf.gif b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ExtendedFileManager/icons/pdf.gif
deleted file mode 100644
index d3e3d55..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ExtendedFileManager/icons/pdf.gif
+++ /dev/null
Binary files differ
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ExtendedFileManager/icons/pdf_small.gif b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ExtendedFileManager/icons/pdf_small.gif
deleted file mode 100644
index 71e0059..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ExtendedFileManager/icons/pdf_small.gif
+++ /dev/null
Binary files differ
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ExtendedFileManager/icons/php.gif b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ExtendedFileManager/icons/php.gif
deleted file mode 100644
index 20e5636..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ExtendedFileManager/icons/php.gif
+++ /dev/null
Binary files differ
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ExtendedFileManager/icons/php_small.gif b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ExtendedFileManager/icons/php_small.gif
deleted file mode 100644
index 608691f..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ExtendedFileManager/icons/php_small.gif
+++ /dev/null
Binary files differ
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ExtendedFileManager/icons/png_small.gif b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ExtendedFileManager/icons/png_small.gif
deleted file mode 100644
index f2684ac..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ExtendedFileManager/icons/png_small.gif
+++ /dev/null
Binary files differ
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ExtendedFileManager/icons/ppt.gif b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ExtendedFileManager/icons/ppt.gif
deleted file mode 100644
index 4339292..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ExtendedFileManager/icons/ppt.gif
+++ /dev/null
Binary files differ
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ExtendedFileManager/icons/ppt_small.gif b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ExtendedFileManager/icons/ppt_small.gif
deleted file mode 100644
index f37bb09..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ExtendedFileManager/icons/ppt_small.gif
+++ /dev/null
Binary files differ
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ExtendedFileManager/icons/rar.gif b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ExtendedFileManager/icons/rar.gif
deleted file mode 100644
index e39549e..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ExtendedFileManager/icons/rar.gif
+++ /dev/null
Binary files differ
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ExtendedFileManager/icons/rar_small.gif b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ExtendedFileManager/icons/rar_small.gif
deleted file mode 100644
index eff38f4..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ExtendedFileManager/icons/rar_small.gif
+++ /dev/null
Binary files differ
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ExtendedFileManager/icons/txt.gif b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ExtendedFileManager/icons/txt.gif
deleted file mode 100644
index fe76a19..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ExtendedFileManager/icons/txt.gif
+++ /dev/null
Binary files differ
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ExtendedFileManager/icons/txt_small.gif b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ExtendedFileManager/icons/txt_small.gif
deleted file mode 100644
index 0279f99..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ExtendedFileManager/icons/txt_small.gif
+++ /dev/null
Binary files differ
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ExtendedFileManager/icons/xls.gif b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ExtendedFileManager/icons/xls.gif
deleted file mode 100644
index e99e099..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ExtendedFileManager/icons/xls.gif
+++ /dev/null
Binary files differ
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ExtendedFileManager/icons/xls_small.gif b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ExtendedFileManager/icons/xls_small.gif
deleted file mode 100644
index 347c0c3..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ExtendedFileManager/icons/xls_small.gif
+++ /dev/null
Binary files differ
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ExtendedFileManager/icons/zip.gif b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ExtendedFileManager/icons/zip.gif
deleted file mode 100644
index f59ecef..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ExtendedFileManager/icons/zip.gif
+++ /dev/null
Binary files differ
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ExtendedFileManager/icons/zip_small.gif b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ExtendedFileManager/icons/zip_small.gif
deleted file mode 100644
index 639556e..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ExtendedFileManager/icons/zip_small.gif
+++ /dev/null
Binary files differ
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ExtendedFileManager/images.php b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ExtendedFileManager/images.php
deleted file mode 100644
index 88c86d3..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ExtendedFileManager/images.php
+++ /dev/null
@@ -1,420 +0,0 @@
-<?php
-/**
- * ExtendedFileManager images.php file. Shows folders and files.
- * Authors: Wei Zhuo, Afru, Krzysztof Kotowicz, Raimund Meyer
- * Version: Updated on 08-01-2005 by Afru
- * Version: Updated on 04-07-2006 by Krzysztof Kotowicz
- * Version: Updated on 29-10-2006 by Raimund Meyer
- * Version: Updated on 20-01-2008 by Raimund Meyer
- * Package: ExtendedFileManager (EFM 1.4)
- * http://www.afrusoft.com/htmlarea
- */
-
-	if(isset($_REQUEST['mode'])) $insertMode=$_REQUEST['mode'];
-	if(!isset($insertMode)) $insertMode="image";
-
-require_once('config.inc.php');
-require_once('Classes/ExtendedFileManager.php');
-$backend_url_enc = htmlspecialchars( $IMConfig['backend_url'] );
-//default path is /
-$relative = '/';
-$manager = new ExtendedFileManager($IMConfig, $insertMode);
-
-//process any file uploads
-$uploadStatus=$manager->processUploads();
-
-//process any file renames
-$renameStatus=$manager->processRenames();
-
-//process paste
-$pasteStatus = (isset($_GET['paste'])) ? 	$manager->processPaste() : false;
-
-$refreshFile = ($IMConfig['allow_delete'] && $manager->deleteFiles()) ? true : false;
-
-$refreshDir = false;
-//process any directory functions
-if(($IMConfig['allow_delete'] && $manager->deleteDirs()) || $manager->processNewDir() || $pasteStatus || $renameStatus )
-	$refreshDir = true;
-
-
-$diskInfo=$manager->getDiskInfo();
-
-//check for any sub-directory request
-//check that the requested sub-directory exists
-//and valid
-if(isset($_REQUEST['dir']))
-{
-	$path = rawurldecode($_REQUEST['dir']);
-	if($manager->validRelativePath($path))
-		$relative = $path;
-}
-
-$afruViewType = (isset($_REQUEST['viewtype'])) ? $afruViewType=$_REQUEST['viewtype'] : '';
-
-if($afruViewType!="thumbview" && $afruViewType!="listview")
-{
-  $afruViewType=$IMConfig['view_type'];
-}
-//get the list of files and directories
-$list = $manager->getFiles($relative);
-
-
-/* ================= OUTPUT/DRAW FUNCTIONS ======================= */
-
-
-/**
- * Draw folders and files. Changed by Afru
- */
-function drawDirs_Files($list, &$manager) 
-{
-	global $relative, $afruViewType, $IMConfig, $insertMode,$backend_url_enc;
-
-    switch ($afruViewType) {
-        case 'listview':
-    		$maxNameLength = 30;
-    		?>
-            <table class="listview" id="listview">
-            <thead>
-            <tr><th>Name</th><th>Size</th><th>Image Size</th><th>Date Modified</th><th>&nbsp;</th></tr></thead>
-            <tbody>
-            <?php
-    		// start of foreach for draw listview folders .
-    		foreach($list[0] as $path => $dir)
-    		{ ?>
-    			<tr>
-    			<td><span style="width:20px;"><img src="<?php print $IMConfig['base_url'];?>icons/folder_small.gif" alt="" /></span>
-				<a href="<?php print $backend_url_enc; ?>__function=images&amp;mode=<?php echo $insertMode;?>&amp;dir=<?php echo rawurlencode($path); ?>&amp;viewtype=<?php echo $afruViewType; ?>" onclick="updateDir('<?php echo $path; ?>')" title="<?php echo $dir['entry']; ?>">
-    			<?php
-    			if(strlen($dir['entry'])>$maxNameLength) echo substr($dir['entry'],0,$maxNameLength)."..."; else echo $dir['entry'];
-    			?>
-    			</a></td>
-    			<td colspan="2" >Folder</td>
-
-    			<td ><?php echo date($IMConfig['date_format'],$dir['stat']['mtime']); ?></td>
-
-    			<td class="actions" >
-            <?php
-              if($IMConfig['allow_delete'])
-              {
-                ?>
-    				<a href="<?php print $backend_url_enc; ?>__function=images&amp;mode=<?php echo $insertMode;?>&amp;dir=<?php echo $relative; ?>&amp;deld=<?php echo rawurlencode($path); ?>&amp;viewtype=<?php echo $afruViewType; ?>" title="Trash" onclick="return confirmDeleteDir('<?php echo $dir['entry']; ?>', <?php echo $dir['count']; ?>);" style="border:0px;"><img src="<?php print $IMConfig['base_url'];?>img/edit_trash.gif" height="15" width="15" alt="Trash" border="0" /></a>
-                <?php
-              }
-            ?>
-			    	<?php if ($IMConfig['allow_rename']) { ?>
-			                    <a href="#" title="Rename" onclick="renameDir('<?php echo rawurlencode($dir['entry']);?>'); return false;"><img src="<?php print $IMConfig['base_url'];?>img/edit_rename.gif" height="15" width="15" alt="Rename" border="0" /></a>
-			        <?php }  ?>
-    				<?php if ($IMConfig['allow_cut_copy_paste']) { ?>
-                    <a href="#" title="Cut" onclick="copyDir('<?php echo rawurlencode($dir['entry']);?>','move'); return false;"><img src="<?php print $IMConfig['base_url'];?>img/edit_cut.gif" height="15" width="15" alt="Cut" /></a>
-                     <a href="#" title="Copy" onclick="copyDir('<?php echo rawurlencode($dir['entry']);?>','copy'); return false;"><img src="<?php print $IMConfig['base_url'];?>img/edit_copy.gif" height="15" width="15" alt="Copy" /></a>
-     		   		<?php }  ?>
-    			</td>
-    			</tr>
-    		  <?php
-    		} // end of foreach for draw listview folders .
-
-    		clearstatcache();
-
-    		// start of foreach for draw listview files .
-    		foreach($list[1] as $entry => $file)
-    		{
-    			?>
-                <tr>
-        		  <td>
-					<a href="#" class="thumb" style="cursor: pointer;vertical-align:middle;" ondblclick="this.onclick();window.top.onOK();" onclick="selectImage('<?php echo $file['relative'];?>', '<?php echo preg_replace('#\..{3,4}$#', '', $entry); ?>', <?php echo $file['image'][0];?>, <?php echo $file['image'][1]; ?>);return false;" title="<?php echo $entry; ?> - <?php echo Files::formatSize($file['stat']['size']); ?>" <?php if ($insertMode == 'image') { ?> onmouseover="showPreview('<?php echo $file['relative'];?>')" onmouseout="showPreview(window.parent.document.getElementById('f_url').value)" <?php } ?> >
-          <span style="width:20px;vertical-align:middle;"><img src="<?php print $IMConfig['base_url']; if(is_file('icons/'.$file['ext'].'_small.gif')) echo "icons/".$file['ext']."_small.gif"; else echo $IMConfig['default_listicon']; ?>" alt="" style="border:none;" /></span><span style="vertical-align:middle;">
-        			<?php
-        			if(strlen($entry)>$maxNameLength) echo substr($entry,0,$maxNameLength)."..."; else echo $entry;
-        			?></span>
-                  </a></td>
-                  <td><?php echo Files::formatSize($file['stat']['size']); ?></td>
-                  <td><?php if($file['image'][0] > 0){ echo $file['image'][0].'x'.$file['image'][1]; } ?></td>
-    			  <td ><?php echo date($IMConfig['date_format'],$file['stat']['mtime']); ?></td>
-                  <td class="actions">
-                    <?php if($IMConfig['img_library'] && $IMConfig['allow_edit_image'] && $file['image'][0] > 0) { ?>
-                    <a href="javascript:;" title="Edit" onclick="editImage('<?php echo rawurlencode($file['relative']);?>');"><img src="<?php print $IMConfig['base_url'];?>img/edit_pencil.gif" height="15" width="15" alt="Edit" border="0" /></a>
-                    <?php }  ?>  
-             <?php
-              if($IMConfig['allow_delete'])
-              {
-                ?>
-                    <a href="<?php print $backend_url_enc; ?>__function=images&amp;dir=<?php echo $relative; ?>&amp;delf=<?php echo rawurlencode($file['relative']);?>&amp;mode=<?php echo $insertMode;?>&amp;viewtype=<?php echo $afruViewType; ?>" title="Trash" onclick="return confirmDeleteFile('<?php echo $entry; ?>');"><img src="<?php print $IMConfig['base_url'];?>img/edit_trash.gif" height="15" width="15" alt="Trash" border="0" /></a>
-                 <?php
-               }
-             ?>
-        			<?php if ($IMConfig['allow_rename']) { ?>
-                    <a href="#" title="Rename" onclick="renameFile('<?php echo rawurlencode($file['relative']);?>'); return false;"><img src="<?php print $IMConfig['base_url'];?>img/edit_rename.gif" height="15" width="15" alt="Rename" border="0" /></a>
-                    <?php }  ?>
-        			<?php if ($IMConfig['allow_cut_copy_paste']) { ?>
-                    <a href="#" title="Cut" onclick="copyFile('<?php echo rawurlencode($entry);?>','move'); return false;"><img src="<?php print $IMConfig['base_url'];?>img/edit_cut.gif" height="15" width="15" alt="Cut" /></a>
-                     <a href="#" title="Copy" onclick="copyFile('<?php echo rawurlencode($entry);?>','copy'); return false;"><img src="<?php print $IMConfig['base_url'];?>img/edit_copy.gif" height="15" width="15" alt="Copy" /></a>
-                    <?php }  ?>
-                  </td>
-                </tr>
-    		  <?php
-    		}//end of foreach of draw listview files
-            ?>
-            </tbody>
-            </table>
-            <?php
-        break;
-        case 'thumbview': // thumbview is default
-        default:
-    		$maxFileNameLength=16;
-    		$maxFolderNameLength=16;
-    		// start of foreach for draw thumbview folders.
-    		foreach($list[0] as $path => $dir)
-    		{ ?>
-    <div class="dir_holder">
-      <a class="dir" href="<?php print $backend_url_enc;?>__function=images&amp;mode=<?php echo $insertMode;?>&amp;dir=<?php echo rawurlencode($path); ?>&amp;viewtype=<?php echo $afruViewType; ?>" onclick="updateDir('<?php echo $path; ?>')" title="<?php echo $dir['entry']; ?>"><img src="<?php print $IMConfig['base_url'];?>img/folder.gif" height="80" width="80" alt="<?php echo $dir['entry']; ?>" /></a>
-
-      <div class="fileName">
-      <?php if(strlen($dir['entry']) > $maxFolderNameLength)
-                echo substr($dir['entry'], 0, $maxFolderNameLength) . "...";
-              else
-                echo $dir['entry']; ?>
-      </div>
-      <div class="edit">
-      <?php
-        if($IMConfig['allow_delete'])
-        {
-          ?>
-        <a href="<?php print $backend_url_enc;?>__function=images&amp;mode=<?php echo $insertMode;?>&amp;dir=<?php echo $relative; ?>&amp;deld=<?php echo rawurlencode($path); ?>&amp;viewtype=<?php echo $afruViewType; ?>" title="Trash" onclick="return confirmDeleteDir('<?php echo $dir['entry']; ?>', <?php echo $dir['count']; ?>);"><img src="<?php print $IMConfig['base_url'];?>img/edit_trash.gif" height="15" width="15" alt="Trash" /></a>
-          <?php
-        }
-      ?>
-    	<?php if ($IMConfig['allow_rename']) { ?>
-                    <a href="#" title="Rename" onclick="renameDir('<?php echo rawurlencode($dir['entry']);?>'); return false;"><img src="<?php print $IMConfig['base_url'];?>img/edit_rename.gif" height="15" width="15" alt="Rename" border="0" /></a>
-        <?php }  ?>
-        <?php if ($IMConfig['allow_cut_copy_paste']) { ?>
-                    <a href="#" title="Cut" onclick="copyDir('<?php echo rawurlencode($dir['entry']);?>','move'); return false;"><img src="<?php print $IMConfig['base_url'];?>img/edit_cut.gif" height="15" width="15" alt="Cut" /></a>
-                     <a href="#" title="Copy" onclick="copyDir('<?php echo rawurlencode($dir['entry']);?>','copy'); return false;"><img src="<?php print $IMConfig['base_url'];?>img/edit_copy.gif" height="15" width="15" alt="Copy" /></a>
-        <?php }  ?>
-      </div>
-    </div>
-    		  <?php
-    		} // end of foreach for draw thumbview folders.
-
-
-    		// start of foreach for draw thumbview files.
-    		foreach($list[1] as $entry => $file)
-    		{
-    			$afruimgdimensions=$manager->checkImageSize($file['relative']);
-    			$thisFileNameLength = $maxFileNameLength;
-    			?>
-                <div class="thumb_holder" id="holder_<?php echo asc2hex($entry) ?>">
-                  <a href="#" class="thumb" style="cursor: pointer;" ondblclick="this.onclick();window.top.onOK();" onclick="selectImage('<?php echo $file['relative'];?>', '<?php echo preg_replace('#\..{3,4}$#', '', $entry); ?>', <?php echo $file['image'][0];?>, <?php echo $file['image'][1]; ?>);return false;" title="<?php echo $entry; ?> - <?php echo Files::formatSize($file['stat']['size']); ?>">
-                    <img src="<?php print $manager->getThumbnail($file['relative']); ?>" alt="<?php echo $entry; ?> - <?php echo Files::formatSize($file['stat']['size']); ?>" />
-                  </a>
-                   <div class="fileName">
-                   <?php
-            			if(strlen($entry) > $thisFileNameLength + 3) echo strtolower(substr($entry,0,$thisFileNameLength))."..."; else echo $entry;
-            		?>
-                   </div>
-                  <div class="edit">
-                    <?php if($IMConfig['img_library'] && $IMConfig['allow_edit_image'] && $file['image'][0] > 0 )
-                    { ?>
-                    <a href="javascript:;" title="Edit" onclick="editImage('<?php echo rawurlencode($file['relative']);?>');"><img src="<?php print $IMConfig['base_url'];?>img/edit_pencil.gif" height="15" width="15" alt="Edit" /></a>
-            		<?php $thisFileNameLength -= 3; } ?>
-                <?php
-                  if($IMConfig['allow_delete'])
-                  {
-                    ?>
-                    <a href="<?php print $backend_url_enc; ?>__function=images&amp;mode=<?php echo $insertMode;?>&amp;dir=<?php echo $relative; ?>&amp;delf=<?php echo rawurlencode($file['relative']);?>&amp;viewtype=<?php echo $afruViewType; ?>" title="Trash" onclick="return confirmDeleteFile('<?php echo $entry; ?>');"><img src="<?php print $IMConfig['base_url'];?>img/edit_trash.gif" height="15" width="15" alt="Trash" /></a>
-                    <?php
-                  }
-                ?>
-        			<?php if ($IMConfig['allow_rename']) { ?>
-                    <a href="#" title="Rename" onclick="renameFile('<?php echo rawurlencode($file['relative']);?>'); return false;"><img src="<?php print $IMConfig['base_url'];?>img/edit_rename.gif" height="15" width="15" alt="Rename" /></a>
-                    <?php $thisFileNameLength -= 3; }  ?>
-                	<?php if ($IMConfig['allow_cut_copy_paste']) { ?>
-                    <a href="#" title="Cut" onclick="copyFile('<?php echo rawurlencode($entry);?>','move'); return false;"><img src="<?php print $IMConfig['base_url'];?>img/edit_cut.gif" height="15" width="15" alt="Cut" /></a>
-                     <a href="#" title="Copy" onclick="copyFile('<?php echo rawurlencode($entry);?>','copy'); return false;"><img src="<?php print $IMConfig['base_url'];?>img/edit_copy.gif" height="15" width="15" alt="Copy" /></a>
-                    <?php $thisFileNameLength -= 6; }  ?>
-            		
-                  </div>
-                </div>
-    		  <?php
-    		}//end of foreach of draw thumbview files
-
-    }
-}//end of function drawDirs_Files
-
-
-/**
- * No directories and no files.
- */
-function drawNoResults() 
-{
-?>
-<div class="noResult">No Files Found</div>
-<?php
-}
-
-/**
- * No directories and no files.
- */
-function drawErrorBase(&$manager) 
-{
-?>
-<div class="error"><span>Invalid base directory:</span> <?php echo $manager->getImagesDir(); ?></div>
-<?php
-}
-
-/**
- * Utility to convert ascii string to hex
- */
-function asc2hex ($temp)
-{
-  $data = '';
-  $len = strlen($temp);
-  for ($i=0; $i<$len; $i++) $data.=sprintf("%02x",ord(substr($temp,$i,1)));
-  return $data;
-}
-
-?>
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
-    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-<html xmlns="http://www.w3.org/1999/xhtml">
-<head>
-	<title>File List</title>
-  <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
-	<link href="<?php print $IMConfig['base_url'];?>assets/imagelist.css" rel="stylesheet" type="text/css" />
-<script type="text/javascript" src="<?php print $IMConfig['base_url'];?>assets/dialog.js"></script>
-<script type="text/javascript">
-/*<![CDATA[*/
-
-    var _backend_url = "<?php print $IMConfig['backend_url']; ?>";
-
-	if(window.top)
-		Xinha = window.top.Xinha;
-
-	function hideMessage()
-	{
-		var topDoc = window.top.document;
-		var messages = topDoc.getElementById('messages');
-		if (messages)
-		{
-			messages.style.display = "none";
-		}
-		//window.parent.resize();
-	}
-
-	init = function()
-	{
-        __dlg_translate('ExtendedFileManager');
-        
-		hideMessage();
-		<?php if ($afruViewType == 'listview')
-			print "var d = new dragTableCols('listview');";
-		
-		if(isset($uploadStatus) && !is_numeric($uploadStatus) && !is_bool($uploadStatus))
-		echo "alert(i18n('$uploadStatus'));";
-		else if(isset($uploadStatus) && $uploadStatus==false)
-		echo 'alert(i18n("Unable to upload File. \nEither Maximum file size [$max_size='.($insertMode == 'image' ? $IMConfig['max_filesize_kb_image'] : $IMConfig['max_filesize_kb_link'] ).'$ KB] exceeded or\nFolder doesn\'t have write permission."));';
-		?>
-
-		<?php
-		if(isset($renameStatus) && !is_numeric($renameStatus) && !is_bool($renameStatus))
-		echo 'alert(i18n("'.$renameStatus.'"));';
-		else if(isset($renameStatus) && $renameStatus===false)
-		echo 'alert(i18n("Unable to rename file. File of the same name already exists or\nfolder doesn\'t have write permission."));';
-		?>
-		
-		<?php
-		if (isset($pasteStatus) && is_numeric($pasteStatus))
-		{
-			switch ($pasteStatus)
-			{
-				case 100 :
-					$pasteStatus = 'Source file/folder not found.';
-				break;
-				case 101 :
-					$pasteStatus = 'Copy failed.\nMaybe folder doesn\'t have write permission.';
-				break;
-				case 102 :
-					$pasteStatus = 'Could not create destination folder.';
-				break;
-				case 103 :
-					$pasteStatus = 'File pasted OK.';
-				break;
-				case 104 :
-					$pasteStatus = 'Destination file/folder already exists.';
-				break;
-			}
-		}
-		if(isset($pasteStatus) && !is_bool($pasteStatus))
-		{
-			echo 'alert(i18n("'.$pasteStatus.'"));';
-		}
-		?>
-
-		var topDoc = window.top.document;
-
-<?php
-	//we need to refesh the drop directory list
-	//save the current dir, delete all select options
-	//add the new list, re-select the saved dir.
-	if($refreshDir) 
-	{ 
-		$dirs = $manager->getDirs();
-?>
-		var selection = topDoc.getElementById('dirPath');
-		var currentDir = selection.options[selection.selectedIndex].text;
-
-		while(selection.length > 0)
-		{	selection.remove(0); }
-		
-		selection.options[selection.length] = new Option("/","<?php echo rawurlencode('/'); ?>");
-		<?php foreach($dirs as $relative=>$fullpath) { ?>
-		selection.options[selection.length] = new Option("<?php echo $relative; ?>","<?php echo rawurlencode($relative); ?>");
-		<?php } ?>
-		
-		for(var i = 0; i < selection.length; i++)
-		{
-			var thisDir = selection.options[i].text;
-			if(thisDir == currentDir)
-			{
-				selection.selectedIndex = i;
-				break;
-			}
-		}		
-<?php } ?>
-	}
-    
-	function editImage(image) 
-	{
-		var url = "<?php print $IMConfig['backend_url']; ?>__function=editor&img="+image+"&mode=<?php print $insertMode ?>";
-        Dialog(url, function(param)
-		{
-			if (!param) { // user must have pressed Cancel
-				return false;
-			} else
-			{
-				return true;
-			}
-		}, null);
-	}
-
-/*]]>*/
-</script>
-<script type="text/javascript" src="<?php print $IMConfig['base_url'];?>assets/images.js"></script>
-<script type="text/javascript" src="<?php print $IMConfig['base_url'];?>assets/popup.js"></script>
-<script type="text/javascript">
-<!--
-// Koto: why emptying? commented out
-//if(window.top.document.getElementById('manager_mode').value=="image")
-//emptyProperties();
-<?php if(isset($diskInfo)) echo 'updateDiskMesg(i18n(\''.$diskInfo.'\'));'; ?>
-//-->
-</script>
-<script type="text/javascript" src="<?php print $IMConfig['base_url'];?>assets/dragTableCols.js"></script>
-</head>
-
-<body>
-<?php if ($manager->isValidBase() == false) { drawErrorBase($manager); }
-	elseif(count($list[0]) > 0 || count($list[1]) > 0) { ?>
-	<?php drawDirs_Files($list, $manager); ?>
-<?php } else { drawNoResults(); } ?>
-</body>
-</html>
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ExtendedFileManager/img/1x1_transparent.gif b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ExtendedFileManager/img/1x1_transparent.gif
deleted file mode 100644
index 35d42e8..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ExtendedFileManager/img/1x1_transparent.gif
+++ /dev/null
Binary files differ
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ExtendedFileManager/img/2x2.gif b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ExtendedFileManager/img/2x2.gif
deleted file mode 100644
index 2f2ec4a..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ExtendedFileManager/img/2x2.gif
+++ /dev/null
Binary files differ
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ExtendedFileManager/img/2x2_w.gif b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ExtendedFileManager/img/2x2_w.gif
deleted file mode 100644
index 9b560a8..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ExtendedFileManager/img/2x2_w.gif
+++ /dev/null
Binary files differ
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ExtendedFileManager/img/btnFolderNew.gif b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ExtendedFileManager/img/btnFolderNew.gif
deleted file mode 100644
index 541d09b..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ExtendedFileManager/img/btnFolderNew.gif
+++ /dev/null
Binary files differ
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ExtendedFileManager/img/btnFolderNew1.gif b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ExtendedFileManager/img/btnFolderNew1.gif
deleted file mode 100644
index db01742..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ExtendedFileManager/img/btnFolderNew1.gif
+++ /dev/null
Binary files differ
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ExtendedFileManager/img/btnFolderUp.gif b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ExtendedFileManager/img/btnFolderUp.gif
deleted file mode 100644
index 36ac56f..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ExtendedFileManager/img/btnFolderUp.gif
+++ /dev/null
Binary files differ
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ExtendedFileManager/img/btnFolderUp1.gif b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ExtendedFileManager/img/btnFolderUp1.gif
deleted file mode 100644
index 7b7349d..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ExtendedFileManager/img/btnFolderUp1.gif
+++ /dev/null
Binary files differ
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ExtendedFileManager/img/btn_cancel.gif b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ExtendedFileManager/img/btn_cancel.gif
deleted file mode 100644
index ae9401c..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ExtendedFileManager/img/btn_cancel.gif
+++ /dev/null
Binary files differ
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ExtendedFileManager/img/btn_ok.gif b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ExtendedFileManager/img/btn_ok.gif
deleted file mode 100644
index e8b027c..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ExtendedFileManager/img/btn_ok.gif
+++ /dev/null
Binary files differ
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ExtendedFileManager/img/crop.gif b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ExtendedFileManager/img/crop.gif
deleted file mode 100644
index 8ef53b2..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ExtendedFileManager/img/crop.gif
+++ /dev/null
Binary files differ
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ExtendedFileManager/img/default.gif b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ExtendedFileManager/img/default.gif
deleted file mode 100644
index 7419c1d..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ExtendedFileManager/img/default.gif
+++ /dev/null
Binary files differ
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ExtendedFileManager/img/div.gif b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ExtendedFileManager/img/div.gif
deleted file mode 100644
index 6d25c02..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ExtendedFileManager/img/div.gif
+++ /dev/null
Binary files differ
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ExtendedFileManager/img/dots.gif b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ExtendedFileManager/img/dots.gif
deleted file mode 100644
index a213e5b..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ExtendedFileManager/img/dots.gif
+++ /dev/null
Binary files differ
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ExtendedFileManager/img/ed_linkfile.gif b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ExtendedFileManager/img/ed_linkfile.gif
deleted file mode 100644
index 38ac232..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ExtendedFileManager/img/ed_linkfile.gif
+++ /dev/null
Binary files differ
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ExtendedFileManager/img/ed_linkfile1.gif b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ExtendedFileManager/img/ed_linkfile1.gif
deleted file mode 100644
index 50fde2f..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ExtendedFileManager/img/ed_linkfile1.gif
+++ /dev/null
Binary files differ
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ExtendedFileManager/img/edit_active.gif b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ExtendedFileManager/img/edit_active.gif
deleted file mode 100644
index 928c25d..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ExtendedFileManager/img/edit_active.gif
+++ /dev/null
Binary files differ
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ExtendedFileManager/img/edit_copy.gif b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ExtendedFileManager/img/edit_copy.gif
deleted file mode 100644
index 7a14568..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ExtendedFileManager/img/edit_copy.gif
+++ /dev/null
Binary files differ
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ExtendedFileManager/img/edit_cut.gif b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ExtendedFileManager/img/edit_cut.gif
deleted file mode 100644
index 3d11146..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ExtendedFileManager/img/edit_cut.gif
+++ /dev/null
Binary files differ
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ExtendedFileManager/img/edit_paste.gif b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ExtendedFileManager/img/edit_paste.gif
deleted file mode 100644
index beea912..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ExtendedFileManager/img/edit_paste.gif
+++ /dev/null
Binary files differ
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ExtendedFileManager/img/edit_pencil.gif b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ExtendedFileManager/img/edit_pencil.gif
deleted file mode 100644
index 04fe5a2..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ExtendedFileManager/img/edit_pencil.gif
+++ /dev/null
Binary files differ
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ExtendedFileManager/img/edit_rename.gif b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ExtendedFileManager/img/edit_rename.gif
deleted file mode 100644
index e061d52..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ExtendedFileManager/img/edit_rename.gif
+++ /dev/null
Binary files differ
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ExtendedFileManager/img/edit_trash.gif b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ExtendedFileManager/img/edit_trash.gif
deleted file mode 100644
index 8754ac7..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ExtendedFileManager/img/edit_trash.gif
+++ /dev/null
Binary files differ
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ExtendedFileManager/img/folder.gif b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ExtendedFileManager/img/folder.gif
deleted file mode 100644
index 9003f58..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ExtendedFileManager/img/folder.gif
+++ /dev/null
Binary files differ
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ExtendedFileManager/img/hand.gif b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ExtendedFileManager/img/hand.gif
deleted file mode 100644
index 23c900f..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ExtendedFileManager/img/hand.gif
+++ /dev/null
Binary files differ
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ExtendedFileManager/img/islocked2.gif b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ExtendedFileManager/img/islocked2.gif
deleted file mode 100644
index 1dfd2ec..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ExtendedFileManager/img/islocked2.gif
+++ /dev/null
Binary files differ
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ExtendedFileManager/img/locked.gif b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ExtendedFileManager/img/locked.gif
deleted file mode 100644
index 9247238..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ExtendedFileManager/img/locked.gif
+++ /dev/null
Binary files differ
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ExtendedFileManager/img/measure.gif b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ExtendedFileManager/img/measure.gif
deleted file mode 100644
index 9e496db..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ExtendedFileManager/img/measure.gif
+++ /dev/null
Binary files differ
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ExtendedFileManager/img/noimages.gif b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ExtendedFileManager/img/noimages.gif
deleted file mode 100644
index 22e6dd3..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ExtendedFileManager/img/noimages.gif
+++ /dev/null
Binary files differ
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ExtendedFileManager/img/rotate.gif b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ExtendedFileManager/img/rotate.gif
deleted file mode 100644
index cf8764f..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ExtendedFileManager/img/rotate.gif
+++ /dev/null
Binary files differ
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ExtendedFileManager/img/save.gif b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ExtendedFileManager/img/save.gif
deleted file mode 100644
index dadb9b0..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ExtendedFileManager/img/save.gif
+++ /dev/null
Binary files differ
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ExtendedFileManager/img/scale.gif b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ExtendedFileManager/img/scale.gif
deleted file mode 100644
index e36bec3..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ExtendedFileManager/img/scale.gif
+++ /dev/null
Binary files differ
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ExtendedFileManager/img/spacer.gif b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ExtendedFileManager/img/spacer.gif
deleted file mode 100644
index fc25609..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ExtendedFileManager/img/spacer.gif
+++ /dev/null
Binary files differ
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ExtendedFileManager/img/t_black.gif b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ExtendedFileManager/img/t_black.gif
deleted file mode 100644
index 4f362f1..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ExtendedFileManager/img/t_black.gif
+++ /dev/null
Binary files differ
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ExtendedFileManager/img/t_white.gif b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ExtendedFileManager/img/t_white.gif
deleted file mode 100644
index bcddeec..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ExtendedFileManager/img/t_white.gif
+++ /dev/null
Binary files differ
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ExtendedFileManager/img/unlocked.gif b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ExtendedFileManager/img/unlocked.gif
deleted file mode 100644
index e28e7d1..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ExtendedFileManager/img/unlocked.gif
+++ /dev/null
Binary files differ
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ExtendedFileManager/img/unlocked2.gif b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ExtendedFileManager/img/unlocked2.gif
deleted file mode 100644
index ce703c9..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ExtendedFileManager/img/unlocked2.gif
+++ /dev/null
Binary files differ
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ExtendedFileManager/img/unlocked_empty.gif b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ExtendedFileManager/img/unlocked_empty.gif
deleted file mode 100644
index fe4e0d4..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ExtendedFileManager/img/unlocked_empty.gif
+++ /dev/null
Binary files differ
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ExtendedFileManager/lang/b5.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ExtendedFileManager/lang/b5.js
deleted file mode 100644
index 4ea3bf7..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ExtendedFileManager/lang/b5.js
+++ /dev/null
@@ -1,15 +0,0 @@
-// I18N constants
-// LANG: "b5", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "__OBSOLETE__": {
-        "___ TRANSLATOR NOTE   ___": "*** EXTENDEDFILEMANAGER IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***"
-    }
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ExtendedFileManager/lang/ch.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ExtendedFileManager/lang/ch.js
deleted file mode 100644
index e0c85a7..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ExtendedFileManager/lang/ch.js
+++ /dev/null
@@ -1,22 +0,0 @@
-// I18N constants
-// LANG: "ch", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Cancel": "取消",
-    "New window (_blank)": "新窗户(_blank)",
-    "None (use implicit)": "無(use implicit)",
-    "OK": "好",
-    "Same frame (_self)": "本匡 (_self)",
-    "Title (tooltip)": "主題 (tooltip):",
-    "Top frame (_top)": "上匡 (_top)",
-    "__OBSOLETE__": {
-        "___ TRANSLATOR NOTE   ___": "*** EXTENDEDFILEMANAGER IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***"
-    }
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ExtendedFileManager/lang/cz.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ExtendedFileManager/lang/cz.js
deleted file mode 100644
index 781b636..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ExtendedFileManager/lang/cz.js
+++ /dev/null
@@ -1,32 +0,0 @@
-// I18N constants
-// LANG: "cz", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Align": "Zarovnání",
-    "Baseline": "Základní linka",
-    "Border": "Obrys",
-    "Bottom": "Dolů",
-    "Cancel": "Zrušit",
-    "Color": "Barva",
-    "Height": "Výška",
-    "Height:": "Výška",
-    "Left": "Vlevo",
-    "Margin": "Okraj",
-    "Middle": "Na střed",
-    "OK": "OK",
-    "Padding": "Odsazování",
-    "Right": "Vpravo",
-    "Top": "Nahoru",
-    "Width": "Šířka",
-    "Width:": "Šířka",
-    "__OBSOLETE__": {
-        "___ TRANSLATOR NOTE   ___": "*** EXTENDEDFILEMANAGER IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***"
-    }
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ExtendedFileManager/lang/da.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ExtendedFileManager/lang/da.js
deleted file mode 100644
index b6ce734..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ExtendedFileManager/lang/da.js
+++ /dev/null
@@ -1,137 +0,0 @@
-// I18N constants
-// LANG: "da", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Absbottom": "Bund",
-    "Absmiddle": "Centreret",
-    "Align": "Placering",
-    "Alt": "Alt",
-    "Baseline": "Grundlinje",
-    "Border": "Ramme",
-    "Border Color": "Rammefarve",
-    "Bottom": "Tekstbund",
-    "Cancel": "Annuller",
-    "Clear": "Fortryd",
-    "Color": "Farve",
-    "Constrain Proportions": "Korrekt størrelsesforhold",
-    "Copy": "Kopier",
-    "Crop": "Beskær",
-    "Cut": "Klip",
-    "Directory": "Mappe",
-    "Directory Up": "Mappe op",
-    "Edit": "Rediger",
-    "File Manager": "Fil Manager",
-    "Filename:": "Filnavn:",
-    "Filesize:": "Filstørrelse:",
-    "Flip Horizontal": "Vend vandret",
-    "Flip Image": "Vend billede",
-    "Flip Vertical": "Vend lodret",
-    "GIF format is not supported, image editing not supported.": "GIF-Format ikke understøttet - kan ikke redigeres.",
-    "Height": "Højde",
-    "Height:": "Højde:",
-    "Insert File Link": "Indsæt fil-link",
-    "Invalid base directory:": "Ugyldig base mappe:",
-    "JPEG High": "JPEG høj",
-    "JPEG Low": "JPEG lav",
-    "JPEG Medium": "JPEG mellem",
-    "Left": "Venstre",
-    "Loading": "Henter",
-    "Lock": "Lås",
-    "Margin": "Margen",
-    "Marker": "Markør",
-    "Measure": "Målebånd",
-    "Middle": "Midt",
-    "New Folder": "Ny mappe",
-    "New window (_blank)": "Nyt vindue (_blank)",
-    "No Files Found": "Ingen filer fundet",
-    "No Image Available": "Ingen billeder tilgængelig",
-    "None (use implicit)": "ingen (implicit)",
-    "Not set": "Ubestemt",
-    "OK": "OK",
-    "Padding": "Spaltefyld",
-    "Positioning of this image": "Billedets position",
-    "Preview": "Smugkig",
-    "Quality:": "Kvalitet",
-    "Refresh": "Opdater",
-    "Rename": "Omdøb",
-    "Resize": "Ændre størrelse",
-    "Right": "Højre",
-    "Rotate": "Rotere",
-    "Rotate Image": "Drej billede",
-    "Same frame (_self)": "Samme ramme (_self)",
-    "Save": "Gem",
-    "Start X:": "Start X",
-    "Start Y:": "Start Y",
-    "Target Window": "Mål",
-    "Texttop": "Teksttop",
-    "Title (tooltip)": "Titel (Tooltip)",
-    "Toggle marker color": "Skift markørfarve",
-    "Top": "Top",
-    "Top frame (_top)": "Topramme (_top)",
-    "Trash": "Papirkurv",
-    "Upload": "Upload",
-    "W:": "W:",
-    "Width": "Bredde",
-    "Width:": "Bredde:",
-    "You must select some text before making a new link.": "Vælg venligst noget tekst før du laver et nyt link.",
-    "__OBSOLETE__": {
-        "Angle:": "Vinkel:",
-        "Cancelled rename.": "Fortryd omdøbning.",
-        "Cannot upload $extension Files. Permission denied.": "Kan ikke uploade $extension. Tilladelse nægtet.",
-        "Cannot upload. Maximum folder size reached. Delete unwanted files and try again.": "Kan ikke uploade. Den maksimale mappestørrelse er nået. Slet uønskede filer og prøv igen.",
-        "Copy \"$file\" from \"$dir\" here": "Kopier \"$file\" fra \"$dir\" her",
-        "Copy folder \"$file\" from \"$dir\" here": "Kopier mappe \"$file\" fra \"$dir\" her",
-        "Could not create destination folder.": "Kunne ikke lave destinationsmappe.",
-        "Date Modified": "Dato for redigering",
-        "Delete file \"$file\"?": "Slet filen \"$file\"?",
-        "Delete folder \"$dir\"?": "Slet mappen \"$dir\"?",
-        "Description:": "Beskrivelse:",
-        "Destination file/folder already exists.": "Destinations- fil/mappe findes allerede",
-        "File \"$file\" successfully uploaded.": "Filen \"$file\" blev uploadet.",
-        "File Name": "Filnavn",
-        "File pasted OK.": "File pasted OK.",
-        "File saved.": "Filen blev gemt.",
-        "File was not saved.": "Filen blev ikke gemt.",
-        "Folder Name:": "Mappenavn",
-        "Folder is not empty. Please delete all Files and Subfolders inside.": "Mappen er ikke tom. Slet venligst alle filer og undermappermapper i mappen først.",
-        "Free Space": "Fri plads",
-        "Image File": "Billedfil",
-        "Image Format": "Billedformat:",
-        "Image Size": "Billedstørrelse",
-        "Insert Image": "Indsæt billede",
-        "Invalid folder name, please choose another folder name.": "Ugyldigt mappenavn, vælg venligst et andet navn.",
-        "List View": "Listevisning",
-        "Maximum file size [$max_size KB] exceeded.": "Maksimal filstørrelse [$max_size KB] overskredet.",
-        "Move \"$file\" from \"$dir\" here": "Flyt \"$file\" fra \"$dir\" her",
-        "Move folder \"$file\" from \"$dir\" here": "Flyt mappe \"$file\" fra \"$dir\" her",
-        "Name": "Navn",
-        "No Image selected.": "Ingen billeder valgt.",
-        "Other": "Andre...",
-        "Paste": "Sæt ind",
-        "Paste failed.\nMaybe folder doesn't have write permission.": "Sæt ind fejlede.\nMåske har mappen ikke skriverettigheder.",
-        "Please delete all files/folders inside the folder you wish to delete first.": "Slet venligst alle filer/mapper i mappen før den slettes.",
-        "Please enter name for new folder...": "Indtast venligst navn på ny mappe...",
-        "Please enter new name for this file...": "Indtast venligst et nyt navn til denne fil...",
-        "Please enter new name for this folder...": "Indtast venligst et nyt navn til denne mappe...",
-        "Rotate 180 °": "Drej 180°",
-        "Rotate 90 ° CCW": "Drej 90° mod uret",
-        "Rotate 90 ° CW": "Drej 90° med uret",
-        "Size": "Størrelse",
-        "Source file/folder not found.": "Kilde- fil/mappe ikke fundet",
-        "Thumbnail View": "Miniatureportræt",
-        "Total Size": "Samlet størrelse",
-        "Total Size : $max_foldersize_mb MB, Free Space: $free_space": "Maks størrelse: $max_foldersize_mb MB, Fri plads: $free_space",
-        "Unable to rename file. File of the same name already exists or\nfolder doesn't have write permission.": "Filen kan ikke omdøbes. En fil med samme navn eksisterer allerede, \neller mappen har ikke skriverettigheder.",
-        "Unable to upload File. \nEither Maximum file size [$max_size KB] exceeded or\nFolder doesn't have write permission.": "Ikke muligt at uploade filen.\nEnten er den maksimale filstørrelse på [$max_size KB] nået\neller mappen har ikke skriverettigheder.",
-        "Untitled": "Ubetitlet",
-        "Uploading": "Uploader",
-        "Uploading...": "Uploader..."
-    }
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ExtendedFileManager/lang/de.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ExtendedFileManager/lang/de.js
deleted file mode 100644
index cd0b100..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ExtendedFileManager/lang/de.js
+++ /dev/null
@@ -1,138 +0,0 @@
-// I18N constants
-// LANG: "de", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Absbottom": "unten bündig",
-    "Absmiddle": "mittig",
-    "Align": "Anordnung",
-    "Alt": "Alt",
-    "Baseline": "Grundlinie",
-    "Border": "Rahmen",
-    "Border Color": "Rahmenfarbe",
-    "Bottom": "unten",
-    "Cancel": "Abbrechen",
-    "Clear": "Löschen",
-    "Color": "Farbe",
-    "Constrain Proportions": "Proportionen beibehalten",
-    "Copy": "Kopieren",
-    "Crop": "Beschneiden",
-    "Cut": "Ausschneiden",
-    "Directory": "Verzeichnis",
-    "Directory Up": "Aufwärts",
-    "Edit": "Bearbeiten",
-    "File Manager": "Dateimanager",
-    "Filename:": "Dateiname:",
-    "Filesize:": "Dateigröße:",
-    "Flip Horizontal": "hor. spiegeln",
-    "Flip Image": "Bild spiegeln",
-    "Flip Vertical": "ver. spiegeln",
-    "GIF format is not supported, image editing not supported.": "GIF-Format nicht unterstützt, bearbeiten nicht möglich.",
-    "Height": "Höhe",
-    "Height:": "Höhe:",
-    "Insert File Link": "Dateilink einfügen",
-    "Invalid base directory:": "Ungültiges Basisverzeichnis:",
-    "JPEG High": "JPEG hoch",
-    "JPEG Low": "JPEG niedrig",
-    "JPEG Medium": "JPEG mittel",
-    "Left": "links",
-    "Loading": "Laden",
-    "Lock": "Feststellen",
-    "Margin": "Aussenabstand",
-    "Marker": "Rahmen",
-    "Measure": "Maße",
-    "Middle": "zentriert",
-    "New Folder": "Neues Verzeichnis erstellen",
-    "New window (_blank)": "Neues Fenster (_blank)",
-    "No Files Found": "Keine Dateien gefunden",
-    "No Image Available": "Kein Bild verfügbar",
-    "None (use implicit)": "k.A. (implizit)",
-    "Not set": "nicht eingestellt",
-    "OK": "OK",
-    "Padding": "Innenabstand",
-    "Positioning of this image": "Anordnung dieses Bildes",
-    "Preview": "Vorschau",
-    "Quality:": "Qualität",
-    "Refresh": "Aktualisieren",
-    "Rename": "Umbenennen",
-    "Resize": "Größe ändern",
-    "Right": "rechts",
-    "Rotate": "Drehen",
-    "Rotate Image": "Bild drehen",
-    "Same frame (_self)": "Selber Rahmen (_self)",
-    "Save": "Speichern",
-    "Start X:": "Start X",
-    "Start Y:": "Start Y",
-    "Target Window": "Zielfenster",
-    "Texttop": "oben bündig",
-    "Title (tooltip)": "Titel (Tooltip)",
-    "Toggle marker color": "Farbe der Markierung umschalten",
-    "Top": "oben",
-    "Top frame (_top)": "Oberster Rahmen (_top)",
-    "Trash": "Papierkorb",
-    "Upload": "Hochladen",
-    "W:": "W:",
-    "Width": "Breite",
-    "Width:": "Breite:",
-    "You must select some text before making a new link.": "Bitte zuerst Text markieren.",
-    "Zoom": "Zoom",
-    "__OBSOLETE__": {
-        "Angle:": "Winkel:",
-        "Cancelled rename.": "Umbenennen abgebrochen.",
-        "Cannot upload $extension Files. Permission denied.": "$extension Dateien dürfen nicht hochgeladen werden.",
-        "Cannot upload. Maximum folder size reached. Delete unwanted files and try again.": "Die maximale Ordnergröße ist erreicht. Bitte löschen Sie Dateien, die Sie nicht mehr benötigen.",
-        "Copy \"$file\" from \"$dir\" here": "\"$file\" aus Ordner \"$dir\" hierher kopieren",
-        "Copy folder \"$file\" from \"$dir\" here": "\"Ordner $file\" aus \"$dir\" hierher kopieren",
-        "Could not create destination folder.": "Konnte Zielordner nicht erstellen.",
-        "Date Modified": "Datum letzte Änderung",
-        "Delete file \"$file\"?": "Datei \"$file\" löschen?",
-        "Delete folder \"$dir\"?": "Verzeichnis \"$dir\" löschen?",
-        "Description:": "Beschreibung:",
-        "Destination file/folder already exists.": "Zieldatei/-ordner existiert bereits",
-        "File \"$file\" successfully uploaded.": "Datei \"$file\" erfolgreich hochgeladen.",
-        "File Name": "Dateiname",
-        "File pasted OK.": "File pasted OK.",
-        "File saved.": "Datei gespeichert.",
-        "File was not saved.": "Datei wurde nicht gespeichert.",
-        "Folder Name:": "Verzeichnisname",
-        "Folder is not empty. Please delete all Files and Subfolders inside.": "Verzeichnis ist nicht leer. Bitte zuerst alle Unterordner und Dateien löschen.",
-        "Free Space": "Freier Speicher",
-        "Image File": "Bilddatei",
-        "Image Format": "Bildformat:",
-        "Image Size": "Bildgröße",
-        "Insert Image": "Bild einfügen",
-        "Invalid folder name, please choose another folder name.": "Ungültiger Verzeichnisname - bitte neu wählen.",
-        "List View": "Listenansicht",
-        "Maximum file size [$max_size KB] exceeded.": "Maximale Dateigröße [$max_size KB] überschritten.",
-        "Move \"$file\" from \"$dir\" here": "\"$file\" aus Ordner \"$dir\" hierher verschieben",
-        "Move folder \"$file\" from \"$dir\" here": "Ordner \"$file\" aus \"$dir\" hierher verschieben",
-        "Name": "Name",
-        "No Image selected.": "Kein Bild ausgewählt.",
-        "Other": "Andere...",
-        "Paste": "Einfügen",
-        "Paste failed.\nMaybe folder doesn't have write permission.": "Einfügen fehlgeschlagen.\nMöglicherweise hat der Ordner keine Schreibberechtigung.",
-        "Please delete all files/folders inside the folder you wish to delete first.": "Bitte zuerst alle untergeordneten Ordner löschen.",
-        "Please enter name for new folder...": "Bitte Namen für neuen Ordner eingeben...",
-        "Please enter new name for this file...": "Bitte neuen Namen für diese Datei eingeben...",
-        "Please enter new name for this folder...": "Bitte neuen Namen für diesen Ordner eingeben...",
-        "Rotate 180 °": "Drehung um 180°",
-        "Rotate 90 ° CCW": "Drehung um 90° gegen Uhrzeigersinn",
-        "Rotate 90 ° CW": "Drehung um 90° im Uhrzeigersinn",
-        "Size": "Größe",
-        "Source file/folder not found.": "Quelldatei/-ordner nicht gefunden",
-        "Thumbnail View": "Miniaturansicht",
-        "Total Size": "Gesamtgröße",
-        "Total Size : $max_foldersize_mb MB, Free Space: $free_space": "Max. Ordergröße: $max_foldersize_mb MB, noch frei: $free_space",
-        "Unable to rename file. File of the same name already exists or\nfolder doesn't have write permission.": "Umbenennen nicht möglich. Evtl. Dateiname schon vorhanden oder keine Schreibrechte.",
-        "Unable to upload File. \nEither Maximum file size [$max_size KB] exceeded or\nFolder doesn't have write permission.": "Konnte Datei nicht hochladen.\nEntweder die maximale Dateigröße [$max_size KB] ist überschritten\noder das Verzeichnis hat keine Schreibrechte.",
-        "Untitled": "Unbetitelt",
-        "Uploading": "Hochladen",
-        "Uploading...": "Lade hoch..."
-    }
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ExtendedFileManager/lang/ee.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ExtendedFileManager/lang/ee.js
deleted file mode 100644
index 57ae590..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ExtendedFileManager/lang/ee.js
+++ /dev/null
@@ -1,17 +0,0 @@
-// I18N constants
-// LANG: "ee", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Cancel": "Loobu",
-    "OK": "OK",
-    "__OBSOLETE__": {
-        "___ TRANSLATOR NOTE   ___": "*** EXTENDEDFILEMANAGER IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***"
-    }
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ExtendedFileManager/lang/el.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ExtendedFileManager/lang/el.js
deleted file mode 100644
index c208ff6..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ExtendedFileManager/lang/el.js
+++ /dev/null
@@ -1,39 +0,0 @@
-// I18N constants
-// LANG: "el", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Align": "Στοίχηση",
-    "Baseline": "Baseline",
-    "Border": "Περίγραμμα",
-    "Bottom": "Κάτω μέρος",
-    "Cancel": "Ακύρωση",
-    "Color": "Χρώμα",
-    "Copy": "Αντιγραφή",
-    "Cut": "Αποκοπή",
-    "Height": "Ύψος",
-    "Height:": "Ύψος",
-    "Left": "Αριστερά",
-    "Margin": "Περιθώριο",
-    "Middle": "Κέντρο",
-    "New window (_blank)": "Νέο παράθυρο (_blank)",
-    "None (use implicit)": "Κανένα (χρήση απόλυτου)",
-    "OK": "Εντάξει",
-    "Padding": "Εσοχή",
-    "Right": "Δεξιά",
-    "Same frame (_self)": "Ίδιο frame (_self)",
-    "Title (tooltip)": "Τίτλος (tooltip):",
-    "Top": "Πάνω",
-    "Top frame (_top)": "Πάνω frame (_top)",
-    "Width": "Πλάτος",
-    "Width:": "Πλάτος",
-    "__OBSOLETE__": {
-        "___ TRANSLATOR NOTE   ___": "*** EXTENDEDFILEMANAGER IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***"
-    }
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ExtendedFileManager/lang/es.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ExtendedFileManager/lang/es.js
deleted file mode 100644
index 97736cf..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ExtendedFileManager/lang/es.js
+++ /dev/null
@@ -1,103 +0,0 @@
-// I18N constants
-// LANG: "es", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Absbottom": "Inferior absoluto",
-    "Absmiddle": "Medio Absoluto",
-    "Align": "Alinear",
-    "Baseline": "Línea base",
-    "Border": "Borde",
-    "Bottom": "Inferior",
-    "Cancel": "Cancelar",
-    "Clear": "Eliminar",
-    "Color": "Color",
-    "Constrain Proportions": "Proporcional",
-    "Copy": "Copiar",
-    "Crop": "Recortar",
-    "Cut": "Cortar",
-    "Directory": "Directorio",
-    "Directory Up": "Directorio superior",
-    "Edit": "editar",
-    "Filename:": "Nombre del fichero:",
-    "Flip Horizontal": "invertir horizontalmente",
-    "Flip Image": "invertir imagen",
-    "Flip Vertical": "invertir verticalmente",
-    "GIF format is not supported, image editing not supported.": "No hay soporte para imágenes en formato GIF.",
-    "Height": "Alto",
-    "Height:": "Alto:",
-    "Invalid base directory:": "Directorio de inicio inválido:",
-    "JPEG High": "JPEG alto",
-    "JPEG Low": "JPEG bajo",
-    "JPEG Medium": "JPEG medio",
-    "Left": "Izquierda",
-    "Loading": "Cargar",
-    "Lock": "Bloquear",
-    "Margin": "Margen",
-    "Marker": "Marcador",
-    "Measure": "Dimensiones",
-    "Middle": "Medio",
-    "New Folder": "Crear directorio",
-    "New window (_blank)": "Nueva ventana (_blank)",
-    "No Image Available": "No hay imagen",
-    "None (use implicit)": "Vacío ( usar implícito )",
-    "Not set": "No definido",
-    "OK": "Aceptar",
-    "Padding": "Relleno (Padding)",
-    "Positioning of this image": "Posición de la imagen",
-    "Preview": "Previsualizar",
-    "Quality:": "Calidad",
-    "Refresh": "Actualizar",
-    "Resize": "Cambiar tamaño",
-    "Right": "Derecha",
-    "Rotate": "Girar",
-    "Rotate Image": "Girar imagen",
-    "Same frame (_self)": "Mismo marco (_self)",
-    "Save": "Guardar",
-    "Start X:": "Inicio X",
-    "Start Y:": "Inicio Y",
-    "Texttop": "Texto Superior",
-    "Title (tooltip)": "Título (Tooltip):",
-    "Top": "Superior",
-    "Top frame (_top)": "Marco superior (_top)",
-    "Trash": "Basura",
-    "Upload": "Subir",
-    "W:": "B:",
-    "Width": "Ancho",
-    "Width:": "Ancho:",
-    "__OBSOLETE__": {
-        "Align:": "Alineado:",
-        "Angle:": "Ángulo:",
-        "Border:": "Borde:",
-        "Color:": "Color:",
-        "Delete file?": "¿Borrar fichero?",
-        "Delete folder?": "¿Borrar directorio?",
-        "Description:": "Descripción:",
-        "File saved.": "Fichero guardado.",
-        "File was not saved.": "el fichero no ha sido guardado.",
-        "Folder Name:": "Nombre del directorio:",
-        "H Space": "espacio horizontal",
-        "Image File": "Fichero",
-        "Image Format": "Formato:",
-        "Image Manager": "Editor de imágenes",
-        "Insert Image": "insertar imagen",
-        "Invalid folder name, please choose another folder name.": "Nombre de directorio inválido... por favor elija otro nombre.",
-        "Margin:": "Margen exterior:",
-        "No Image selected.": "No ha seleccionado imagen.",
-        "No Images Found": "No se ha encontrado imagen",
-        "Padding:": "Margen interior:",
-        "Please delete all files/folders inside the folder you wish to delete first.": "Primero tiene que borrar todoas los ficheros de este directorio.",
-        "Rotate 180 °": "Girar 180º",
-        "Rotate 90 ° CCW": "Girar 90º sentido contrareloj",
-        "Rotate 90 ° CW": "Girar 90º sentido reloj",
-        "Upload:": "Subir:",
-        "Uploading...": "Subir...",
-        "V Space": "espacio vertical"
-    }
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ExtendedFileManager/lang/eu.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ExtendedFileManager/lang/eu.js
deleted file mode 100644
index 5d50b9b..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ExtendedFileManager/lang/eu.js
+++ /dev/null
@@ -1,36 +0,0 @@
-// I18N constants
-// LANG: "eu", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Absbottom": "Irudiaren behekaldean",
-    "Absmiddle": "Irudiaren erdian",
-    "Baseline": "Irudiaren oinean",
-    "Bottom": "Behean",
-    "Cancel": "Utzi",
-    "Left": "Ezkerretara",
-    "Middle": "Erdian",
-    "New window (_blank)": "Lehio berrian (_blank)",
-    "None (use implicit)": "Bat ere ez (implizituki erabili)",
-    "Not set": "Ez gaitua",
-    "OK": "Ados",
-    "Positioning of this image": "Irudiaren kokapena",
-    "Preview": "Aurrebista",
-    "Right": "Eskuinetara",
-    "Same frame (_self)": "Frame berean (_self)",
-    "Texttop": "Irudiaren goialdean",
-    "Title (tooltip)": "Izenburua (argibidea):",
-    "Top": "Goian",
-    "Top frame (_top)": "Goiko frame-an (_top)",
-    "Width": "Zabalera:",
-    "Width:": "Zabalera:",
-    "__OBSOLETE__": {
-        "___ TRANSLATOR NOTE   ___": "*** EXTENDEDFILEMANAGER IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***"
-    }
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ExtendedFileManager/lang/fa.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ExtendedFileManager/lang/fa.js
deleted file mode 100644
index eed945a..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ExtendedFileManager/lang/fa.js
+++ /dev/null
@@ -1,36 +0,0 @@
-// I18N constants
-// LANG: "fa", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Absbottom": "دقیقا پایین",
-    "Absmiddle": "دقیقا وسط",
-    "Baseline": "ابتدای خط",
-    "Bottom": "پایین",
-    "Cancel": "انصراف",
-    "Left": "چپ",
-    "Middle": "وسط",
-    "New window (_blank)": "پنجره جدید (_blank)",
-    "None (use implicit)": "هیچکدام (استفاده از بدون شرط)",
-    "Not set": "تنظیم نشده",
-    "OK": "بله",
-    "Positioning of this image": "موقعیت یابی تصویر",
-    "Preview": "پیش نمایش",
-    "Right": "راست",
-    "Same frame (_self)": "فریم یکسان (_self)",
-    "Texttop": "بالای متن",
-    "Title (tooltip)": "عنوان (راهنمای یک خطی)",
-    "Top": "بالا",
-    "Top frame (_top)": "فریم بالایی (_top)",
-    "Width": "طول",
-    "Width:": "طول",
-    "__OBSOLETE__": {
-        "___ TRANSLATOR NOTE   ___": "*** EXTENDEDFILEMANAGER IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***"
-    }
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ExtendedFileManager/lang/fi.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ExtendedFileManager/lang/fi.js
deleted file mode 100644
index 36d45ba..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ExtendedFileManager/lang/fi.js
+++ /dev/null
@@ -1,30 +0,0 @@
-// I18N constants
-// LANG: "fi", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Align": "Kohdistus",
-    "Baseline": "Takaraja",
-    "Border": "Reuna",
-    "Bottom": "Alle",
-    "Cancel": "Peruuta",
-    "Color": "Väri",
-    "Left": "Vasen",
-    "Margin": "Marginaali",
-    "Middle": "Keskelle",
-    "OK": "Hyväksy",
-    "Padding": "Palstantäyte",
-    "Right": "Oikea",
-    "Top": "Ylös",
-    "Width": "Leveys",
-    "Width:": "Leveys",
-    "__OBSOLETE__": {
-        "___ TRANSLATOR NOTE   ___": "*** EXTENDEDFILEMANAGER IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***"
-    }
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ExtendedFileManager/lang/fr.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ExtendedFileManager/lang/fr.js
deleted file mode 100644
index 1865710..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ExtendedFileManager/lang/fr.js
+++ /dev/null
@@ -1,138 +0,0 @@
-// I18N constants
-// LANG: "fr", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Absbottom": "Absbottom",
-    "Absmiddle": "Absmiddle",
-    "Align": "Alignement",
-    "Alt": "Alt",
-    "Baseline": "Baseline",
-    "Border": "Bordure",
-    "Border Color": "Couleur de la bordure",
-    "Bottom": "Bas",
-    "Cancel": "Annuler",
-    "Clear": "Effacer",
-    "Color": "Couleur",
-    "Constrain Proportions": "Maintenir les proportions",
-    "Copy": "Copier",
-    "Crop": "Recadrer",
-    "Cut": "Couper",
-    "Directory": "Répertoire",
-    "Directory Up": "Remonter",
-    "Edit": "Modifier",
-    "File Manager": "Gestionnaire de fichiers",
-    "Filename:": "Nom du fichier:",
-    "Filesize:": "Taille du fichier:",
-    "Flip Horizontal": "Symétrie hor.",
-    "Flip Image": "Symétrie",
-    "Flip Vertical": "Symétrie ver.",
-    "GIF format is not supported, image editing not supported.": "Le format GIF n'est pas supporté, édition d'image impossible.",
-    "Height": "Hauteur",
-    "Height:": "Hauteur:",
-    "Insert File Link": "Insérer un lien vers fichier",
-    "Invalid base directory:": "Dossier racine invalide:",
-    "JPEG High": "JPEG haut",
-    "JPEG Low": "JPEG bas",
-    "JPEG Medium": "JPEG moyen",
-    "Left": "Gauche",
-    "Loading": "Chargement",
-    "Lock": "Verrouiller",
-    "Margin": "Marge",
-    "Marker": "Marqueur",
-    "Measure": "Règle",
-    "Middle": "Milieu",
-    "New Folder": "Nouveau dossier",
-    "New window (_blank)": "Nouvelle fenêtre (_blank)",
-    "No Files Found": "Aucun fichier",
-    "No Image Available": "Aucune image disponible",
-    "None (use implicit)": "Aucune (implicite)",
-    "Not set": "Indéfini",
-    "OK": "OK",
-    "Padding": "Marge intérieure",
-    "Positioning of this image": "Position de cette image",
-    "Preview": "Aperçu ",
-    "Quality:": "Qualité:",
-    "Refresh": "Actualiser",
-    "Rename": "Renommer",
-    "Resize": "Redimen.",
-    "Right": "Droite",
-    "Rotate": "Pivoter",
-    "Rotate Image": "Pivoter l'image",
-    "Same frame (_self)": "Même frame (_self)",
-    "Save": "Enregistrer",
-    "Start X:": "Départ X",
-    "Start Y:": "Départ Y",
-    "Target Window": "Fenêtre cible",
-    "Texttop": "Texttop",
-    "Title (tooltip)": "Tooltip",
-    "Toggle marker color": "Changer la couleur du marqueur",
-    "Top": "Haut",
-    "Top frame (_top)": "Frame principale (_top)",
-    "Trash": "Corbeille",
-    "Upload": "Envoyer",
-    "W:": "W:",
-    "Width": "Largeur",
-    "Width:": "Largeur:",
-    "You must select some text before making a new link.": "Vous devez sélectionner du texte avant de faire un nouveau lien.",
-    "Zoom": "Zoom",
-    "__OBSOLETE__": {
-        "Angle:": "Angle:",
-        "Cancelled rename.": "Renommage annulé.",
-        "Cannot upload $extension Files. Permission denied.": "Impossible d'envoyer des fichiers $extension.",
-        "Cannot upload. Maximum folder size reached. Delete unwanted files and try again.": "La taille maximale pour le dossier est atteinte. Vous devez effacer des fichiers pour libérer de la place",
-        "Copy \"$file\" from \"$dir\" here": "Copier \"$file\" du dossier \"$dir\" ici",
-        "Copy folder \"$file\" from \"$dir\" here": "Copier le dossier \"$file\" de \"$dir\" ici",
-        "Could not create destination folder.": "Impossible de créer le dossier de destination.",
-        "Date Modified": "Date de modification",
-        "Delete file \"$file\"?": "Effacer le fichier \"$file\" ?",
-        "Delete folder \"$dir\"?": "Effacer le dossier \"$dir\" ?",
-        "Description:": "Description:",
-        "Destination file/folder already exists.": "Fichier/dossier déjà existant.",
-        "File \"$file\" successfully uploaded.": "Fichier \"$file\" envoyé.",
-        "File Name": "Nom du fichier",
-        "File pasted OK.": "Fichier correctement collé.",
-        "File saved.": "Fichier enregistré.",
-        "File was not saved.": "Le fichier n'a pas été enregistré.",
-        "Folder Name:": "Nom du dossier:",
-        "Folder is not empty. Please delete all Files and Subfolders inside.": "Le dossier n'est pas vide. Effacez tous les fichiers et sous-dossiers qu'il contient.",
-        "Free Space": "Espace libre",
-        "Image File": "Fichier image",
-        "Image Format": "Format d'image:",
-        "Image Size": "Dimensions de l'image",
-        "Insert Image": "Insérer une image",
-        "Invalid folder name, please choose another folder name.": "Nom de dossier invalide - choisissez un autre nomd de dossier.",
-        "List View": "Vue liste",
-        "Maximum file size [$max_size KB] exceeded.": "Taille de fichier [$max_size Ko] dépassée.",
-        "Move \"$file\" from \"$dir\" here": "Déplacer \"$file\" du dossier \"$dir\" ici",
-        "Move folder \"$file\" from \"$dir\" here": "Déplacer le dossier \"$file\" de \"$dir\" ici",
-        "Name": "Nom",
-        "No Image selected.": "Aucune image sélectionnée.",
-        "Other": "Autre...",
-        "Paste": "Coller",
-        "Paste failed.\nMaybe folder doesn't have write permission.": "Echec lors du coller.\nLe dossier n'à peut être pas les droits d'écriture.",
-        "Please delete all files/folders inside the folder you wish to delete first.": "Effacez s'il vous plaît tous les fichiers/dossiers dans le dossier que vous souhaitez effacer d'abord.",
-        "Please enter name for new folder...": "Entrez un nom pour le nouveau dossier...",
-        "Please enter new name for this file...": "Entrez un nouveau nom pour ce fichier...",
-        "Please enter new name for this folder...": "Entrez un nouveau nom pour ce dossier...",
-        "Rotate 180 °": "Rotation à 180°",
-        "Rotate 90 ° CCW": "Rotation à 90° antihoraire",
-        "Rotate 90 ° CW": "Rotation à 90° horaire",
-        "Size": "Taille",
-        "Source file/folder not found.": "Dossier ou fichier source introuvable.",
-        "Thumbnail View": "Vue miniatures",
-        "Total Size": "Taille totale",
-        "Total Size : $max_foldersize_mb MB, Free Space: $free_space": "Taille maximale: $max_foldersize_mb Mo, libre: $free_space",
-        "Unable to rename file. File of the same name already exists or\nfolder doesn't have write permission.": "Impossible de renommer le fichier. \n Un fichier de même nom existe déjà ou l'écriture est impossible.",
-        "Unable to upload File. \nEither Maximum file size [$max_size KB] exceeded or\nFolder doesn't have write permission.": "Impossible d'envoyer le fichier.\nSoit la taille maximale [$max_size Ko] est dépassée\nsoit le dossier ne possède pas les droits d'écriture.",
-        "Untitled": "Sans titre",
-        "Uploading": "Envoi",
-        "Uploading...": "Envoi en cours..."
-    }
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ExtendedFileManager/lang/fr_ca.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ExtendedFileManager/lang/fr_ca.js
deleted file mode 100644
index dddb512..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ExtendedFileManager/lang/fr_ca.js
+++ /dev/null
@@ -1,15 +0,0 @@
-// I18N constants
-// LANG: "fr_ca", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "__OBSOLETE__": {
-        "___ TRANSLATOR NOTE   ___": "*** EXTENDEDFILEMANAGER IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***"
-    }
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ExtendedFileManager/lang/gb.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ExtendedFileManager/lang/gb.js
deleted file mode 100644
index 3b38880..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ExtendedFileManager/lang/gb.js
+++ /dev/null
@@ -1,15 +0,0 @@
-// I18N constants
-// LANG: "gb", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "__OBSOLETE__": {
-        "___ TRANSLATOR NOTE   ___": "*** EXTENDEDFILEMANAGER IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***"
-    }
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ExtendedFileManager/lang/he.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ExtendedFileManager/lang/he.js
deleted file mode 100644
index 64cf608..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ExtendedFileManager/lang/he.js
+++ /dev/null
@@ -1,39 +0,0 @@
-// I18N constants
-// LANG: "he", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Align": "ישור",
-    "Baseline": "קו בסיס",
-    "Border": "גבול",
-    "Bottom": "תחתון",
-    "Cancel": "ביטול",
-    "Color": "צבע",
-    "Copy": "העתק",
-    "Cut": "גזור",
-    "Height": "גובה",
-    "Height:": "גובה",
-    "Left": "שמאל",
-    "Margin": "שוליים",
-    "Middle": "אמצע",
-    "New window (_blank)": "חלון חדש (_blank)",
-    "None (use implicit)": "ללא (השתמש ב-frame הקיים)",
-    "OK": "אישור",
-    "Padding": "ריווח בשוליים",
-    "Right": "ימין",
-    "Same frame (_self)": "אותו frame (_self)",
-    "Title (tooltip)": "כותרת (tooltip):",
-    "Top": "עליון",
-    "Top frame (_top)": "Frame עליון (_top)",
-    "Width": "רוחב",
-    "Width:": "רוחב",
-    "__OBSOLETE__": {
-        "___ TRANSLATOR NOTE   ___": "*** EXTENDEDFILEMANAGER IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***"
-    }
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ExtendedFileManager/lang/hu.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ExtendedFileManager/lang/hu.js
deleted file mode 100644
index c851b80..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ExtendedFileManager/lang/hu.js
+++ /dev/null
@@ -1,22 +0,0 @@
-// I18N constants
-// LANG: "hu", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Cancel": "Mégsem",
-    "New window (_blank)": "Új ablak (_blank)",
-    "None (use implicit)": "Nincs (use implicit)",
-    "OK": "Rendben",
-    "Same frame (_self)": "Ugyanabba a keretbe (_self)",
-    "Title (tooltip)": "Cím (tooltip):",
-    "Top frame (_top)": "Felső keret (_top)",
-    "__OBSOLETE__": {
-        "___ TRANSLATOR NOTE   ___": "*** EXTENDEDFILEMANAGER IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***"
-    }
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ExtendedFileManager/lang/it.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ExtendedFileManager/lang/it.js
deleted file mode 100644
index 38ad40d..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ExtendedFileManager/lang/it.js
+++ /dev/null
@@ -1,37 +0,0 @@
-// I18N constants
-// LANG: "it", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Align": "Allinea",
-    "Baseline": "Allineamento",
-    "Border": "Bordo",
-    "Bottom": "Basso",
-    "Cancel": "Annullamento",
-    "Color": "Colore",
-    "Height": "Altezza",
-    "Height:": "Altezza",
-    "Left": "Sinistra",
-    "Margin": "Margine",
-    "Middle": "Centrale",
-    "New window (_blank)": "Nuova finestra (_blank)",
-    "None (use implicit)": "Niente (usa implicito)",
-    "OK": "OK",
-    "Padding": "Padding",
-    "Right": "Destra",
-    "Same frame (_self)": "Stessa frame (_self)",
-    "Title (tooltip)": "Title (suggerimento):",
-    "Top": "Alto",
-    "Top frame (_top)": "Pagina intera (_top)",
-    "Width": "Larghezza",
-    "Width:": "Larghezza",
-    "__OBSOLETE__": {
-        "___ TRANSLATOR NOTE   ___": "*** EXTENDEDFILEMANAGER IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***"
-    }
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ExtendedFileManager/lang/ja.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ExtendedFileManager/lang/ja.js
deleted file mode 100644
index 2a1f638..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ExtendedFileManager/lang/ja.js
+++ /dev/null
@@ -1,142 +0,0 @@
-// I18N constants
-// LANG: "ja", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Absbottom": "下(絶対的)",
-    "Absmiddle": "中央(絶対的)",
-    "Align": "行揃え",
-    "Alt": "Alt",
-    "Baseline": "ベースライン",
-    "Border": "ボーダー",
-    "Border Color": "境界色:",
-    "Bottom": "下",
-    "Cancel": "中止",
-    "Clear": "クリア",
-    "Color": "色",
-    "Constrain Proportions": "縦横比を固定",
-    "Copy": "コピー",
-    "Crop": "切り抜き",
-    "Cut": "切り取り",
-    "Directory": "ディレクトリ",
-    "Directory Up": "親ディレクトリへ",
-    "Edit": "編集",
-    "File Manager": "ファイルマネージャ",
-    "Filename:": "ファイル名:",
-    "Flip Horizontal": "左右反転",
-    "Flip Image": "画像を反転",
-    "Flip Vertical": "上下反転",
-    "GIF format is not supported, image editing not supported.": "GIF形式はサポートされていないため、画像編集できません。",
-    "Height": "高さ",
-    "Height:": "高さ:",
-    "Insert File Link": "ファイルへのリンクを挿入",
-    "Invalid base directory:": "無効なディレクトリ:",
-    "JPEG High": "JPEG 高画質",
-    "JPEG Low": "JPEG 低画質",
-    "JPEG Medium": "JPEG 標準",
-    "Left": "左",
-    "Loading": "ロード中",
-    "Lock": "ロック",
-    "Margin": "間隔",
-    "Marker": "マーカー",
-    "Measure": "計測",
-    "Middle": "中央",
-    "New Folder": "新規フォルダ",
-    "New window (_blank)": "新しいウィンドウ (_blank)",
-    "No Files Found": "ファイルがありません",
-    "No Image Available": "画像がありません",
-    "None (use implicit)": "なし (デフォルトに任せる)",
-    "Not set": "なし",
-    "OK": "OK",
-    "Padding": "余白",
-    "Positioning of this image": "この画像の配置",
-    "Preview": "表示",
-    "Quality:": "画質:",
-    "Refresh": "更新",
-    "Rename": "名前の変更",
-    "Resize": "サイズ変更",
-    "Right": "右",
-    "Rotate": "回転",
-    "Rotate Image": "画像を回転",
-    "Same frame (_self)": "自己フレーム内 (_self)",
-    "Save": "保存",
-    "Start X:": "開始 X",
-    "Start Y:": "開始 Y",
-    "Target Window": "ターゲット",
-    "Texttop": "テキスト上部",
-    "Title (tooltip)": "タイトル",
-    "Top": "上",
-    "Top frame (_top)": "最上位フレーム (_top)",
-    "Trash": "削除",
-    "Upload": "アップロード",
-    "W:": "W:",
-    "Width": "幅",
-    "Width:": "幅:",
-    "You must select some text before making a new link.": "リンクを作成するにはテキストを選択する必要があります。",
-    "Zoom": "拡大率:",
-    "__OBSOLETE__": {
-        "Angle:": "角度:",
-        "Border Color:": "境界色:",
-        "Border:": "境界線:",
-        "Cancelled rename.": "名前変更を中止しました。",
-        "Cannot upload $extension Files. Permission denied.": "$extension ファイルをアップロードできません。操作は禁止されています。",
-        "Cannot upload. Maximum folder size reached. Delete unwanted files and try again.": "アップロードできません。フォルダ容量の上限に達しました。不要なファイルを削除して、再試行してください。",
-        "Color:": "色:",
-        "Copy \"$file\" from \"$dir\" here": "\"$file\" を \"$dir\" からここにコピー",
-        "Copy folder \"$file\" from \"$dir\" here": "フォルダ \"$file\" を \"$dir\" からここにコピー",
-        "Could not create destination folder.": "転送先フォルダを作成できませんでした。",
-        "Date Modified": "更新日",
-        "Delete file \"$file\"?": "ファイル \"$file\" を削除しますか?",
-        "Delete folder \"$dir\"?": "フォルダ \"$dir\" を削除しますか?",
-        "Description:": "説明:",
-        "Destination file/folder already exists.": "転送先ファイル/フォルダはすでに存在します。",
-        "File \"$file\" successfully uploaded.": "ファイル \"$file\" のアップロードに成功しました。",
-        "File Name": "ファイル名",
-        "File pasted OK.": "ファイルの貼り付けに成功しました。",
-        "File saved.": "ファイルを保存しました。",
-        "File was not saved.": "ファイルを保存できませんでした。",
-        "Folder Name:": "フォルダ名:",
-        "Folder is not empty. Please delete all Files and Subfolders inside.": "フォルダは空ではありません。中のファイルとサブフォルダをすべて削除してください。",
-        "Free Space": "空き容量",
-        "Image File": "画像ファイル",
-        "Image Format": "画像形式",
-        "Image Size": "画像サイズ",
-        "Insert Image": "画像の挿入",
-        "Invalid folder name, please choose another folder name.": "無効なフォルダ名です。別のフォルダ名を選んでください。",
-        "List View": "一覧表示",
-        "Margin:": "間隔:",
-        "Maximum file size [$max_size KB] exceeded.": "ファイルサイズ上限 [$max_size KB] を超えています。",
-        "Move \"$file\" from \"$dir\" here": "\"$file\" を \"$dir\" からここに移動",
-        "Move folder \"$file\" from \"$dir\" here": "フォルダ \"$file\" を \"$dir\" からここに移動",
-        "Name": "名前",
-        "No Image selected.": "画像が選択されていません。",
-        "Other": "その他",
-        "Padding:": "余白:",
-        "Paste": "貼り付け",
-        "Paste failed.\nMaybe folder doesn't have write permission.": "貼り付けに失敗しました。\nフォルダに書き込み権限がない可能性があります。",
-        "Please delete all files/folders inside the folder you wish to delete first.": "削除したいフォルダ内のファイルとフォルダを全て削除しておいてください。",
-        "Please enter name for new folder...": "新規フォルダの名前を入力してください...",
-        "Please enter new name for this file...": "ファイルの新しい名前を入力してください...",
-        "Please enter new name for this folder...": "このフォルダの新しい名前を入力してください...",
-        "Rotate 180 °": "180°",
-        "Rotate 90 ° CCW": "90° 反時計回り",
-        "Rotate 90 ° CW": "90° 時計回り",
-        "Size": "サイズ",
-        "Source file/folder not found.": "転送元ファイル/フォルダが見つかりません。",
-        "Thumbnail View": "サムネール表示",
-        "Total Size": "合計サイズ",
-        "Total Size : $max_foldersize_mb MB, Free Space: $free_space": "合計サイズ: $max_foldersize_mb MB, 空き容量: $free_space",
-        "Unable to rename file. File of the same name already exists or\nfolder doesn't have write permission.": "ファイル名を変更できません。同名のファイルが存在するか、\nフォルダに書き込み権限がありません。",
-        "Unable to upload File. \nEither Maximum file size [$max_size KB] exceeded or\nFolder doesn't have write permission.": "ファイルをアップロードできません。\nファイルサイズ上限 [$max_size KB] を超えているか、\nフォルダに書き込み権限がありません。",
-        "Untitled": "無題",
-        "Upload:": "アップロード:",
-        "Uploading": "アップロード中",
-        "Uploading...": "アップロード中..."
-    }
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ExtendedFileManager/lang/lc_base.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ExtendedFileManager/lang/lc_base.js
deleted file mode 100644
index 8328c96..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ExtendedFileManager/lang/lc_base.js
+++ /dev/null
@@ -1,123 +0,0 @@
-// I18N constants
-//
-// LANG: "en", ENCODING: UTF-8
-// Author: Translator-Name, <email@example.com>
-//
-// Last revision: 2018-04-12
-// 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).
-//
-// (Please, remove information below)
-// 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.)
-
-{
-    "10%": "",
-    "100%": "",
-    "200%": "",
-    "25%": "",
-    "50%": "",
-    "75%": "",
-    ">List View": "",
-    ">Thumbnail View": "",
-    "A:": "",
-    "Absbottom": "",
-    "Absmiddle": "",
-    "Align": "",
-    "Alt": "",
-    "Baseline": "",
-    "Border": "",
-    "Border Color": "",
-    "Bottom": "",
-    "Cancel": "",
-    "Clear": "",
-    "Color": "",
-    "Constrain Proportions": "",
-    "Copy": "",
-    "Crop": "",
-    "Cut": "",
-    "D:": "",
-    "Directory": "",
-    "Directory Up": "",
-    "Edit": "",
-    "File List": "",
-    "File Manager": "",
-    "Filename:": "",
-    "Filesize:": "",
-    "Flip Horizontal": "",
-    "Flip Image": "",
-    "Flip Vertical": "",
-    "Folder": "",
-    "GIF": "",
-    "GIF format is not supported, image editing not supported.": "",
-    "H:": "",
-    "Height": "",
-    "Height:": "",
-    "Image Editor": "",
-    "Image Selection": "",
-    "Insert File Link": "",
-    "Invalid base directory:": "",
-    "JPEG High": "",
-    "JPEG Low": "",
-    "JPEG Medium": "",
-    "Left": "",
-    "Loading": "",
-    "Lock": "",
-    "Margin": "",
-    "Marker": "",
-    "Maximum folder size limit reached. Upload disabled.": "",
-    "Measure": "",
-    "Middle": "",
-    "New Folder": "",
-    "New window (_blank)": "",
-    "No Files Found": "",
-    "No Image Available": "",
-    "None (use implicit)": "",
-    "Not set": "",
-    "OK": "",
-    "PNG": "",
-    "Padding": "",
-    "Please enter value": "",
-    "Positioning of this image": "",
-    "Preset": "",
-    "Preview": "",
-    "Quality:": "",
-    "Refresh": "",
-    "Rename": "",
-    "Resize": "",
-    "Right": "",
-    "Rotate": "",
-    "Rotate 180 &deg;": "",
-    "Rotate 90 &deg; CCW": "",
-    "Rotate 90 &deg; CW": "",
-    "Rotate Image": "",
-    "Same frame (_self)": "",
-    "Save": "",
-    "Start X:": "",
-    "Start Y:": "",
-    "Target Window": "",
-    "Texttop": "",
-    "Title (tooltip)": "",
-    "Toggle marker color": "",
-    "Top": "",
-    "Top frame (_top)": "",
-    "Trash": "",
-    "Upload": "",
-    "W:": "",
-    "Width": "",
-    "Width:": "",
-    "X:": "",
-    "Xinha Image Editor": "",
-    "Y:": "",
-    "You must select some text before making a new link.": "",
-    "Zoom": ""
-}
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ExtendedFileManager/lang/lt.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ExtendedFileManager/lang/lt.js
deleted file mode 100644
index 7c71a08..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ExtendedFileManager/lang/lt.js
+++ /dev/null
@@ -1,22 +0,0 @@
-// I18N constants
-// LANG: "lt", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Cancel": "Atšaukti",
-    "New window (_blank)": "Naujas langas (_blank)",
-    "None (use implicit)": "None (use implicit)",
-    "OK": "OK",
-    "Same frame (_self)": "Same frame (_self)",
-    "Title (tooltip)": "Pavadinimas (tooltip):",
-    "Top frame (_top)": "Top frame (_top)",
-    "__OBSOLETE__": {
-        "___ TRANSLATOR NOTE   ___": "*** EXTENDEDFILEMANAGER IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***"
-    }
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ExtendedFileManager/lang/lv.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ExtendedFileManager/lang/lv.js
deleted file mode 100644
index 65d4861..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ExtendedFileManager/lang/lv.js
+++ /dev/null
@@ -1,17 +0,0 @@
-// I18N constants
-// LANG: "lv", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Cancel": "Atcelt",
-    "OK": "Labi",
-    "__OBSOLETE__": {
-        "___ TRANSLATOR NOTE   ___": "*** EXTENDEDFILEMANAGER IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***"
-    }
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ExtendedFileManager/lang/nb.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ExtendedFileManager/lang/nb.js
deleted file mode 100644
index 7a7f3b9..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ExtendedFileManager/lang/nb.js
+++ /dev/null
@@ -1,135 +0,0 @@
-// I18N constants
-// LANG: "nb", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Align": "Juster",
-    "Alt": "Alt",
-    "Baseline": "Grunnlinje",
-    "Border": "Ramme",
-    "Border Color": "Ramme farge:",
-    "Bottom": "Bunn",
-    "Cancel": "Avbryt",
-    "Clear": "Tøm",
-    "Color": "Farge",
-    "Constrain Proportions": "Beholde proposjoner",
-    "Copy": "Copy",
-    "Crop": "Beskjær",
-    "Cut": "Cut",
-    "Directory": "Mappe",
-    "Directory Up": "Opp et nivå",
-    "Edit": "Rediger",
-    "File Manager": "Filbehandler",
-    "Filename:": "Filnavn:",
-    "Flip Horizontal": "Vend horisontal",
-    "Flip Image": "Vend bilde",
-    "Flip Vertical": "Vend vertikal",
-    "GIF format is not supported, image editing not supported.": "GIF format er ikke støttet og bilderedigering er derfor ikke tilgjengelig.",
-    "Height": "Høyde",
-    "Height:": "Høyde:",
-    "Insert File Link": "Sett inn lenke til fil",
-    "Invalid base directory:": "Ugyldig sti til mappe:",
-    "JPEG High": "JPEG høy",
-    "JPEG Low": "JPEG lav",
-    "JPEG Medium": "JPEG middels",
-    "Left": "Venstre",
-    "Loading": "Laster",
-    "Lock": "Lås",
-    "Margin": "Marg",
-    "Marker": "Markør",
-    "Measure": "Mål",
-    "Middle": "Midten",
-    "New Folder": "Ny mappe",
-    "New window (_blank)": "Eget vindu (_blank)",
-    "No Files Found": "Ingen filer funnet",
-    "No Image Available": "Inget bilde tilgjengelig.",
-    "None (use implicit)": "Ingen (bruk standardinnstilling)",
-    "OK": "OK",
-    "Padding": "Innvendig marg",
-    "Positioning of this image": "Bildepossisjon",
-    "Preview": "Forhåndsvisning",
-    "Quality:": "Kvalitet",
-    "Refresh": "Oppfrisk side",
-    "Rename": "Nytt navn",
-    "Resize": "Endre størrelse",
-    "Right": "Høyre",
-    "Rotate": "Roter",
-    "Rotate Image": "Roter bilde",
-    "Same frame (_self)": "Samme ramme (_self)",
-    "Save": "Lagre",
-    "Start X:": "Start X",
-    "Start Y:": "Start Y",
-    "Target Window": "Mål",
-    "Title (tooltip)": "Tittel (tooltip)",
-    "Top": "Overkant",
-    "Top frame (_top)": "Toppramme (_top)",
-    "Trash": "Søppel",
-    "Upload": "Last opp",
-    "W:": "L:",
-    "Width": "Bredde",
-    "Width:": "Bredde:",
-    "You must select some text before making a new link.": "Du må velge noe tekst før du kan lage en ny lenke.",
-    "Zoom": "Forstørr",
-    "__OBSOLETE__": {
-        "Angle:": "Vinkel:",
-        "Border Color:": "Ramme farge:",
-        "Cancelled rename.": "Omdøping av filnavn avbrutt.",
-        "Cannot upload $extension Files. Permission denied.": "Cannot upload $extension Files. Permission denied.",
-        "Cannot upload. Maximum folder size reached. Delete unwanted files and try again.": "Cannot upload. Maximum folder size reached. Delete unwanted files and try again.",
-        "Color:": "Farge:",
-        "Copy \"$file\" from \"$dir\" here": "Copy \"$file\" from \"$dir\" here",
-        "Copy folder \"$file\" from \"$dir\" here": "Copy folder \"$file\" from \"$dir\" here",
-        "Could not create destination folder.": "Could not create destination folder.",
-        "Date Modified": "Siste endret",
-        "Delete file \"$file\"?": "$file\n\nSlette fil?",
-        "Delete folder \"$dir\"?": "$dir\n\nSlette mappe?",
-        "Description:": "Beskrivelse:",
-        "Destination file/folder already exists.": "Destination file/folder already exists.",
-        "File \"$file\" successfully uploaded.": "File \"$file\" successfully uploaded.",
-        "File Name": "Filnavn",
-        "File pasted OK.": "File pasted OK.",
-        "File saved.": "Fil er lagret.",
-        "File was not saved.": "Filen ble ikke lagret.",
-        "Folder Name:": "Mappe navn",
-        "Folder is not empty. Please delete all Files and Subfolders inside.": "Mappen er ikke tom. Du må slette alle filer og mapper i mappen først.",
-        "Free Space": "Ledig plass",
-        "Image File": "Bildefil",
-        "Image Format": "Bildeformat:",
-        "Image Size": "Bilde størrelse",
-        "Insert Image": "Sett inn bilde",
-        "Invalid folder name, please choose another folder name.": "Ugyldig mappenavn, vennligst velg et annet mappenavn",
-        "List View": "Liste",
-        "Maximum file size [$max_size KB] exceeded.": "Maximum file size [$max_size KB] exceeded.",
-        "Move \"$file\" from \"$dir\" here": "Move \"$file\" from \"$dir\" here",
-        "Move folder \"$file\" from \"$dir\" here": "Move folder \"$file\" from \"$dir\" here",
-        "Name": "Navn",
-        "No Image selected.": "Inget bilde valgt.",
-        "Other": "Andre...",
-        "Paste": "Paste",
-        "Paste failed.\nMaybe folder doesn't have write permission.": "Paste failed.\nMaybe folder doesn't have write permission.",
-        "Please delete all files/folders inside the folder you wish to delete first.": "Vennligst slett alle filer og mapper i mappen du ønsker å slette først!",
-        "Please enter name for new folder...": "Skriv inn navn for ny mappe...",
-        "Please enter new name for this file...": "Vennligst skriv inn nytt navn for denne fil...",
-        "Please enter new name for this folder...": "Please enter new name for this folder...",
-        "Rotate 180 °": "Roter 180°",
-        "Rotate 90 ° CCW": "Roter 90° mot klokka",
-        "Rotate 90 ° CW": "Roter 90° med klokka",
-        "Size": "Størrelse",
-        "Source file/folder not found.": "Source file/folder not found.",
-        "Thumbnail View": "Miniatyrbilde",
-        "Total Size": "Total størrelse",
-        "Total Size : $max_foldersize_mb MB, Free Space: $free_space": "Total Size : $max_foldersize_mb MB, Free Space: $free_space",
-        "Unable to rename file. File of the same name already exists or\nfolder doesn't have write permission.": "Kan ikke omdøpe fil. En fil har allerede samme navn eller\nmappen har ikke skriverettigheter.",
-        "Unable to upload File. \nEither Maximum file size [$max_size KB] exceeded or\nFolder doesn't have write permission.": "Unable to upload File. \nEither Maximum file size [$max_size KB] exceeded or\nFolder doesn't have write permission.",
-        "Untitled": "Uten navn",
-        "Upload:": "Last opp:",
-        "Uploading": "Laster opp",
-        "Uploading...": "Laster opp..."
-    }
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ExtendedFileManager/lang/nl.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ExtendedFileManager/lang/nl.js
deleted file mode 100644
index ef29f1e..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ExtendedFileManager/lang/nl.js
+++ /dev/null
@@ -1,134 +0,0 @@
-// I18N constants
-// LANG: "nl", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Align": "Uitlijnen",
-    "Alt": "Alt",
-    "Baseline": "Basis",
-    "Border": "Kader",
-    "Border Color": "Kaderkleur:",
-    "Bottom": "Onder",
-    "Cancel": "Annuleren",
-    "Clear": "Wissen",
-    "Color": "Kleur",
-    "Constrain Proportions": "Proportie behouden",
-    "Copy": "Kopiëren",
-    "Crop": "Uitsneden",
-    "Cut": "Knippen",
-    "Directory": "Map",
-    "Directory Up": "Bovenliggende map",
-    "Edit": "Bewerken",
-    "File Manager": "Bestandsbeheer",
-    "Filename:": "Bestandsnaam:",
-    "Flip Horizontal": "hor. spiegelen",
-    "Flip Image": "Beeld spiegelen",
-    "Flip Vertical": "ver. spiegelen",
-    "GIF format is not supported, image editing not supported.": "GIF-format niet ondersteund, beeldbewerking niet ondersteund.",
-    "Height": "Hoog",
-    "Height:": "Hoogte:",
-    "Insert File Link": "Hypelink van bestandinvoegen",
-    "Invalid base directory:": "Ongeldig pad:",
-    "JPEG High": "JPEG hoog",
-    "JPEG Low": "JPEG laag",
-    "JPEG Medium": "JPEG midden",
-    "Left": "Links",
-    "Loading": "Laden",
-    "Lock": "Op-slot",
-    "Margin": "Inspringen",
-    "Marker": "Markeren",
-    "Measure": "Opmeten",
-    "Middle": "Midden",
-    "New Folder": "Nieuw map",
-    "New window (_blank)": "Nieuw venster (_blank)",
-    "No Files Found": "Geen bestaand gevonden",
-    "No Image Available": "Geen beeld beschikbaar",
-    "None (use implicit)": "Geen",
-    "OK": "OK",
-    "Padding": "Uitvullen",
-    "Positioning of this image": "Uitlijnen van dit beeld",
-    "Preview": "Voorbeeld",
-    "Quality:": "Kwaliteit",
-    "Refresh": "Vernieuwen",
-    "Rename": "Naam wijzigen",
-    "Resize": "Formaat wijzigen",
-    "Right": "Rechts",
-    "Rotate": "Draaien",
-    "Rotate Image": "Beeld draaien",
-    "Same frame (_self)": "Zelfde frame (_self)",
-    "Save": "Opslaan",
-    "Start X:": "Start X",
-    "Start Y:": "Start Y",
-    "Target Window": "Doel venster",
-    "Title (tooltip)": "Titel (tooltip)",
-    "Top": "Boven",
-    "Top frame (_top)": "Bovenste frame (_top)",
-    "Trash": "Prullenbak",
-    "Upload": "Upload",
-    "W:": "W:",
-    "Width": "Breed",
-    "Width:": "Breedte:",
-    "You must select some text before making a new link.": "Eerst tekst selecteren.",
-    "Zoom": "Vergroot/verklein",
-    "__OBSOLETE__": {
-        "Angle:": "Hoek:",
-        "Border Color:": "Kaderkleur:",
-        "Cancelled rename.": "Hernoemen geannuleerd.",
-        "Cannot upload $extension Files. Permission denied.": "Het is niet mogelijk om $extension bestanden te uploaden.",
-        "Cannot upload. Maximum folder size reached.": "Uploaden is niet mogelijk. De doel map is vol.",
-        "Color:": "Kleur:",
-        "Copy \"$file\" from \"$dir\" here": "Kopieer \"$file\" van \"$dir\" naar",
-        "Copy folder \"$file\" from \"$dir\" here": "Kopieer map \"$file\" van \"$dir\" naar",
-        "Could not create destination folder.": "Bestemmings map kon niet worden gemaakt..",
-        "Date Modified": "Datum aangepast",
-        "Delete file \"$file\"?": "Bestand \"$file\" verwijderen?",
-        "Delete folder \"$dir\"?": "Wis map \"$dir\"?",
-        "Description:": "Beschrijving:",
-        "Destination file/folder already exists.": "Bestemmings bestand/map bestaat al.",
-        "File \"$file\" successfully uploaded.": "\"$file\" bestand upload voltooid.",
-        "File Name": "Bestandsnaam",
-        "File saved.": "Bestand opgeslagen.",
-        "File was not saved.": "Bestand niet opgeslagen.",
-        "Folder Name:": "Map naam",
-        "Folder is not empty. Please delete all Files and Subfolders inside.": "Map is niet leeg. Verwijder eerst alle bestanden en onderliggendemappen.",
-        "Free Space": "Vrije ruimte",
-        "Image File": "Beeldbestand",
-        "Image Format": "Beeldformaat:",
-        "Image Size": "Beeld afmetingen",
-        "Insert Image": "Beeld invoegen",
-        "Invalid folder name, please choose another folder name.": "Ongeldig map naam, kies een andere naam s.v.p..",
-        "List View": "Lijst",
-        "Maximum file size [$max_size KB] exceeded.": "Maximale bestandgrootte [$max_size KB] overschreden.",
-        "Move \"$file\" from \"$dir\" here": "Verplaats \"$file\" van \"$dir\" naar",
-        "Move folder \"$file\" from \"$dir\" here": "Verplaats map \"$file\" van \"$dir\" naar",
-        "Name": "Naam",
-        "No Image selected.": "Geen beeld geselecteerd.",
-        "Other": "Andere...",
-        "Paste": "Plakken",
-        "Paste failed.\nMaybe folder doesn't have write permission.": "Plakken mislukt..\nDe map heeft mogelijk niet de juiste schrijfrechten.",
-        "Please delete all files/folders inside the folder you wish to delete first.": "Vewijder alle onderliggende bestanden/mappen eerst.",
-        "Please enter name for new folder...": "Naam van nieuwe map...",
-        "Please enter new name for this file...": "Nieuwe bestandsnaam...",
-        "Please enter new name for this folder...": "Geef een nieuwe naam voor deze map...",
-        "Rotate 180 °": "Draai 180° om",
-        "Rotate 90 ° CCW": "Draai links om 90°",
-        "Rotate 90 ° CW": "Draai rechts om 90°",
-        "Size": "Grootte",
-        "Source file/folder not found.": "Bron bestand/map niet gevonden.",
-        "Thumbnail View": "Miniaturen",
-        "Total Size": "Totaalgrootte",
-        "Total Size : $max_foldersize_mb MB, Free Space: $free_space": "Totaalgrootte: $max_foldersize_mb MB, nog vrij: $free_space",
-        "Unable to rename file. File of the same name already exists or\nfolder doesn't have write permission.": "Hernoemen niet mogelijk. Bestand bestaat al of\nmap heeft geen schrijf toestemming.",
-        "Unable to upload File. \nEither Maximum file size [$max_size KB] exceeded or\nFolder doesn't have write permission.": "Bestands upload niet mogelijk.\nMaximale bestandsgrootte [$max_size KB] overtreden\nof de map heeft geen schrijf toestemming.",
-        "Untitled": "Geen titel",
-        "Upload:": "Upload:",
-        "Uploading": "Uploaden",
-        "Uploading...": "Uploaden..."
-    }
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ExtendedFileManager/lang/pl.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ExtendedFileManager/lang/pl.js
deleted file mode 100644
index e73d563..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ExtendedFileManager/lang/pl.js
+++ /dev/null
@@ -1,133 +0,0 @@
-// I18N constants
-// LANG: "pl", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Absbottom": "Abs. dół",
-    "Absmiddle": "Abs. środek",
-    "Align": "Wyrównanie",
-    "Alt": "Alt",
-    "Baseline": "Linia bazowa",
-    "Border": "Ramka",
-    "Border Color": "Kolor ramki",
-    "Bottom": "Dół",
-    "Cancel": "Anuluj",
-    "Clear": "Wyczyść",
-    "Color": "Kolor",
-    "Constrain Proportions": "Zachowaj proporcje",
-    "Copy": "Kopiuj",
-    "Crop": "Przytnij",
-    "Cut": "Wytnij",
-    "Directory": "Katalog",
-    "Directory Up": "Katalog wyżej",
-    "Edit": "Edytuj",
-    "File Manager": "Menedżer plików",
-    "Filename:": "Nazwa pliku:",
-    "Flip Horizontal": "Odwróć poziomo",
-    "Flip Image": "Odwróć",
-    "Flip Vertical": "Odwróć pionowo",
-    "GIF format is not supported, image editing not supported.": "Brak obsługi plików GIF, edycja jest niemożliwa.",
-    "Height": "Wysokość",
-    "Height:": "Wysokość:",
-    "Insert File Link": "Wstaw odnośnik do pliku na serwerze",
-    "Invalid base directory:": "Nieprawidłowy katalog bazowy:",
-    "JPEG High": "JPEG wysoka",
-    "JPEG Low": "JPEG niska",
-    "JPEG Medium": "JPEG średnia",
-    "Left": "Do lewej",
-    "Loading": "Ładowanie",
-    "Lock": "Zablokuj",
-    "Margin": "Odstęp",
-    "Marker": "Zaznacz",
-    "Measure": "Zmierz",
-    "Middle": "Środek",
-    "New Folder": "Nowy katalog",
-    "New window (_blank)": "Nowe okno (_blank)",
-    "No Files Found": "Nie znaleziono plików",
-    "No Image Available": "Obrazek niedostępny",
-    "None (use implicit)": "Brak",
-    "Not set": "Nie ustawione",
-    "OK": "OK",
-    "Padding": "Wcięcie",
-    "Positioning of this image": "Wyrównanie tego obrazka na stronie",
-    "Preview": "Podgląd",
-    "Quality:": "Jakość",
-    "Refresh": "Odśwież",
-    "Rename": "Zmień nazwę",
-    "Resize": "Przeskaluj",
-    "Right": "Do prawej",
-    "Rotate": "Obróć",
-    "Rotate Image": "Obróć",
-    "Same frame (_self)": "Ta sama ramka (_self)",
-    "Save": "Zapisz",
-    "Start X:": "Początek X:",
-    "Start Y:": "Początek Y:",
-    "Target Window": "Docelowe okno",
-    "Texttop": "Góra tekstu",
-    "Title (tooltip)": "Tytuł",
-    "Top": "Góra",
-    "Top frame (_top)": "Główna ramka (_top)",
-    "Trash": "Usuń",
-    "Upload": "Wgraj",
-    "W:": "L:",
-    "Width": "Szerokość",
-    "Width:": "Szerokość:",
-    "You must select some text before making a new link.": "Zaznacz tekst przed dodaniem odnośnika.",
-    "__OBSOLETE__": {
-        "Angle:": "Kąt:",
-        "Cancelled rename.": "Anulowano zmianę nazwy pliku.",
-        "Cannot upload $extension Files. Permission denied.": "Nie można było wgrać pliku.\n\nNiedozwolone rozszerzenie pliku [$extension].",
-        "Cannot upload. Maximum folder size reached. Delete unwanted files and try again.": "Wgrywanie nie powiodło się.\n\nPrzekroczono dozwolony limit miejsca. Usuń niechciane pliki i spróbuj ponownie.",
-        "Copy \"$file\" from \"$dir\" here": "Skopiuj \"$file\" z \"$dir\" tutaj",
-        "Copy folder \"$file\" from \"$dir\" here": "Skopiuj folder \"$file\" z \"$dir\" tutaj",
-        "Could not create destination folder.": "Nie można było utworzyć folderu docelowego.",
-        "Date Modified": "Data ost.modyf.",
-        "Delete file \"$file\"?": "$file\n\nUsunąć plik?",
-        "Delete folder \"$dir\"?": "$dir\n\nUsunąć katalog ?",
-        "Destination file/folder already exists.": "Plik/folder docelowy już istnieje.",
-        "File \"$file\" successfully uploaded.": "Plik \"$file\" wgrano na serwer.",
-        "File Name": "Nazwa pliku",
-        "File pasted OK.": "Wklejono plik.",
-        "File saved.": "Zapisano plik.",
-        "File was not saved.": "Nie zapisano pliku.",
-        "Folder is not empty. Please delete all Files and Subfolders inside.": "Folder nie jest pusty. Najpierw usuń wszystkie pliki i podfoldery tego folderu.",
-        "Free Space": "Pozostało",
-        "Image File": "Plik obrazka",
-        "Image Format": "Format pliku:",
-        "Image Size": "Wymiary",
-        "Insert Image": "Wstaw obrazek",
-        "Invalid folder name, please choose another folder name.": "Nieprawidłowa nazwa katalogu, wybierz inną.",
-        "List View": "Lista",
-        "Maximum file size [$max_size KB] exceeded.": "Wgrywanie nie powiodło się.\n\nPrzekroczono maksymalny rozmiar pliku [$max_size KB].",
-        "Move \"$file\" from \"$dir\" here": "Przenieś \"$file\" z \"$dir\" tutaj",
-        "Move folder \"$file\" from \"$dir\" here": "Przenieś folder \"$file\" z \"$dir\" tutaj",
-        "Name": "Nazwa",
-        "No Image selected.": "Nie zaznaczono obrazka.",
-        "Other": "Inne...",
-        "Paste": "Wklej",
-        "Paste failed.\nMaybe folder doesn't have write permission.": "Wklejenie nie powiodło się.\nPrawdopodobnie nie masz praw zapisu w tym folderze.",
-        "Please delete all files/folders inside the folder you wish to delete first.": "Najpierw usuń wszystkie pliki i podkatalogi katalogu.",
-        "Please enter name for new folder...": "Podaj nazwę nowego folderu...",
-        "Please enter new name for this file...": "Podaj nową nazwę dla tego pliku...",
-        "Please enter new name for this folder...": "Podaj nową nazwę dla tego folderu...",
-        "Rotate 180 °": "Obróć 180°",
-        "Rotate 90 ° CCW": "Obróć 90° w lewo",
-        "Rotate 90 ° CW": "Obróć 90° w prawo",
-        "Size": "Rozmiar",
-        "Source file/folder not found.": "Nie znaleziono pliku/folderu źródłowego.",
-        "Thumbnail View": "Miniaturki",
-        "Total Size": "Miejsce na serwerze",
-        "Total Size : $max_foldersize_mb MB, Free Space: $free_space": "Dostępny limit: $max_foldersize_mb MB, Wolne: $free_space",
-        "Unable to rename file. File of the same name already exists or\nfolder doesn't have write permission.": "Nie mogłem zmienić nazwy pliku. Plik o nowej nazwie już istnieje\nlub prak praw zapisu do katalogu.",
-        "Unable to upload File. \nEither Maximum file size [$max_size KB] exceeded or\nFolder doesn't have write permission.": "Wgrywanie nie powiodło się.\n\nPrzekroczono maksymalny rozmiar pliku [$max_size KB] lub nie ma ustawionych praw zapisu do folderu.",
-        "Untitled": "Bez_nazwy",
-        "Uploading": "Wgrywam",
-        "Uploading...": "Wgrywanie..."
-    }
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ExtendedFileManager/lang/pt_br.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ExtendedFileManager/lang/pt_br.js
deleted file mode 100644
index a9e4009..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ExtendedFileManager/lang/pt_br.js
+++ /dev/null
@@ -1,105 +0,0 @@
-// I18N constants
-// LANG: "pt_br", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    ">List View": ">Lista",
-    ">Thumbnail View": ">Miniaturas",
-    "A:": "A:",
-    "Absbottom": "Inferior absoluto",
-    "Absmiddle": "Meio absoluto",
-    "Align": "Alinhamento",
-    "Alt": "Alt",
-    "Baseline": "Linha de base",
-    "Border": "Borda",
-    "Border Color": "Côr da Borda",
-    "Bottom": "Inferior",
-    "Cancel": "Cancelar",
-    "Clear": "Limpar",
-    "Color": "Côr",
-    "Constrain Proportions": "Manter Proporcionalidade",
-    "Copy": "Copiar",
-    "Crop": "Recortar",
-    "Cut": "Cortar",
-    "D:": "G:",
-    "Directory": "Diretório",
-    "Directory Up": "Diretório Acima",
-    "Edit": "Editar",
-    "File List": "Lista de Arquivos",
-    "File Manager": "Gerenciador de Arquivos",
-    "Filename:": "Nome do Arquivo:",
-    "Flip Horizontal": "Espelhar Horizontalmente",
-    "Flip Image": "Espelhar Imagem",
-    "Flip Vertical": "Espelhar Verticalmente",
-    "Folder": "Pasta",
-    "GIF": "GIF",
-    "GIF format is not supported, image editing not supported.": "Formato GIF não é suportado, não é possível editar imagem.",
-    "H:": "A:",
-    "Height": "Altura",
-    "Height:": "Altura:",
-    "Image Editor": "Editor de Imagem",
-    "Image Selection": "Seleção de Imagem",
-    "Insert File Link": "Inserir Link de Arquivo",
-    "Invalid base directory:": "Diretório base inválido",
-    "JPEG High": "JPEG Alto",
-    "JPEG Low": "JPEG Baixo",
-    "JPEG Medium": "JPEG Médio",
-    "Left": "Esquerda",
-    "Loading": "Carregando",
-    "Lock": "Travar",
-    "Margin": "Margem",
-    "Marker": "Marcar",
-    "Maximum folder size limit reached. Upload disabled.": "Atingido o limite máximo da pasta. Envio desativado.",
-    "Measure": "Medida:",
-    "Middle": "Meio",
-    "New Folder": "Nova Pasta",
-    "New window (_blank)": "Nova janela (_blank)",
-    "No Files Found": "Nenhum Arquivo Encontrado",
-    "No Image Available": "Nenhuma Imagem Disponível",
-    "None (use implicit)": "Nenhum (uso implícito)",
-    "Not set": "Não definido",
-    "OK": "OK",
-    "PNG": "PNG",
-    "Padding": "Espaçamento Interno",
-    "Please enter value": "Por favor, entre o valor",
-    "Positioning of this image": "Posicionamento desta imagem",
-    "Preview": "Visualizar",
-    "Quality:": "Qualidade:",
-    "Refresh": "Atualizar",
-    "Rename": "Renomear",
-    "Resize": "Redimencionar",
-    "Right": "Direita(o)",
-    "Rotate": "Rotacionar",
-    "Rotate 180 &deg;": "Rotacionar 180 &deg;",
-    "Rotate 90 &deg; CCW": "Rotacionar 90 &deg; anti-horário",
-    "Rotate 90 &deg; CW": "Rotacionar 90 &deg; horário",
-    "Rotate Image": "Rotacionar Imagem",
-    "Same frame (_self)": "Mesma frame (_self)",
-    "Save": "Gravar",
-    "Start X:": "Início X:",
-    "Start Y:": "Início Y",
-    "Target Window": "Janela Destino",
-    "Texttop": "Texto no topo",
-    "Title (tooltip)": "Título (tooltip)",
-    "Top": "Topo",
-    "Top frame (_top)": "Frame do topo (_top)",
-    "Trash": "Lixo",
-    "Upload": "Enviar",
-    "W:": "L:",
-    "Width": "Largura",
-    "Width:": "Largura:",
-    "X:": "X:",
-    "Y:": "Y:",
-    "You must select some text before making a new link.": "Você precisa selecionar um texto antes de criar um novo link.",
-    "Zoom": "Ampliação",
-    "__OBSOLETE__": {
-        "Angle:": "Angulo:",
-        "Image Format": "Formato da Imagem"
-    }
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ExtendedFileManager/lang/ro.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ExtendedFileManager/lang/ro.js
deleted file mode 100644
index 73f7571..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ExtendedFileManager/lang/ro.js
+++ /dev/null
@@ -1,37 +0,0 @@
-// I18N constants
-// LANG: "ro", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Align": "Aliniere",
-    "Baseline": "Baseline",
-    "Border": "Chenar",
-    "Bottom": "Jos",
-    "Cancel": "Renunţă",
-    "Color": "Culoare",
-    "Height": "Înălţimea",
-    "Height:": "Înălţimea",
-    "Left": "Stânga",
-    "Margin": "Margine",
-    "Middle": "Mijloc",
-    "New window (_blank)": "Fereastră nouă (_blank)",
-    "None (use implicit)": "Nimic (foloseşte ce-i implicit)",
-    "OK": "Acceptă",
-    "Padding": "Spaţiere",
-    "Right": "Dreapta",
-    "Same frame (_self)": "Aceeaşi fereastră (_self)",
-    "Title (tooltip)": "Titlul (tooltip):",
-    "Top": "Sus",
-    "Top frame (_top)": "Fereastra principală (_top)",
-    "Width": "Lăţime",
-    "Width:": "Lăţime",
-    "__OBSOLETE__": {
-        "___ TRANSLATOR NOTE   ___": "*** EXTENDEDFILEMANAGER IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***"
-    }
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ExtendedFileManager/lang/ru.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ExtendedFileManager/lang/ru.js
deleted file mode 100644
index f92cbdd..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ExtendedFileManager/lang/ru.js
+++ /dev/null
@@ -1,75 +0,0 @@
-// I18N constants
-// LANG: "ru", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Absbottom": "По нижней границе",
-    "Absmiddle": "По середине текста",
-    "Align": "Выравнивание",
-    "Baseline": "По нижней границе текста",
-    "Border": "Рамка",
-    "Bottom": "По нижнему краю",
-    "Cancel": "Отмена",
-    "Clear": "Очистить",
-    "Color": "Цвет",
-    "Constrain Proportions": "Сохранить пропорции",
-    "Crop": "Обрезать",
-    "Directory": "Папка",
-    "Directory Up": "Папка наверх",
-    "Edit": "Правка",
-    "Filename:": "Имя файла",
-    "Flip Horizontal": "Развернуть по горизонтали",
-    "Flip Image": "Развернуть картинку",
-    "Flip Vertical": "Развернуть по вертикали",
-    "GIF format is not supported, image editing not supported.": "Формат GIF не поддерживается, редактирование картинки не поддерживается.",
-    "Height": "Высота",
-    "Height:": "Высота",
-    "Invalid base directory:": "Неверная базовая папка:",
-    "JPEG High": "JPEG высок.",
-    "JPEG Low": "JPEG низк.",
-    "JPEG Medium": "JPEG средн.",
-    "Left": "По левому краю",
-    "Loading": "Загрузка",
-    "Lock": "Блокировка",
-    "Margin": "Отступ",
-    "Marker": "Маркер",
-    "Measure": "Измерение",
-    "Middle": "Посредине",
-    "New Folder": "Новая папка",
-    "New window (_blank)": "Новое окно (_blank)",
-    "No Image Available": "Нет доступных картинок",
-    "None (use implicit)": "По умолчанию",
-    "Not set": "Не установлено",
-    "OK": "OK",
-    "Padding": "Поля",
-    "Positioning of this image": "Расположение изображения",
-    "Preview": "Предварительный просмотр",
-    "Quality:": "Качество",
-    "Refresh": "Обновить",
-    "Resize": "Масшабировать",
-    "Right": "По правому краю",
-    "Rotate": "Повернуть",
-    "Rotate Image": "Повернуть картинку",
-    "Same frame (_self)": "То же окно (_self)",
-    "Save": "Сохранить",
-    "Start X:": "Начало X",
-    "Start Y:": "Начало Y",
-    "Texttop": "По верхней границе текста",
-    "Title (tooltip)": "Всплывающая подсказка",
-    "Top": "По верхнему краю",
-    "Top frame (_top)": "Родительское окно (_top)",
-    "Trash": "Корзина",
-    "Upload": "Загрузить",
-    "W:": "Ш:",
-    "Width": "Ширина",
-    "Width:": "Ширина",
-    "__OBSOLETE__": {
-        "___ TRANSLATOR NOTE   ___": "*** EXTENDEDFILEMANAGER IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***"
-    }
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ExtendedFileManager/lang/sh.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ExtendedFileManager/lang/sh.js
deleted file mode 100644
index 8557735..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ExtendedFileManager/lang/sh.js
+++ /dev/null
@@ -1,36 +0,0 @@
-// I18N constants
-// LANG: "sh", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Absbottom": "Apsolutno dno",
-    "Absmiddle": "Apsolutna sredina",
-    "Baseline": "Donja linija",
-    "Bottom": "Dno",
-    "Cancel": "Poništi",
-    "Left": "Levo",
-    "Middle": "Sredina",
-    "New window (_blank)": "Novom prozoru (_blank)",
-    "None (use implicit)": "koristi podrazumevano",
-    "Not set": "Nije postavljeno",
-    "OK": "OK",
-    "Positioning of this image": "Postavljanje ove slike",
-    "Preview": "Pregled",
-    "Right": "Desno",
-    "Same frame (_self)": "Isti frejm (_self)",
-    "Texttop": "Vrh teksta",
-    "Title (tooltip)": "Naziv (tooltip):",
-    "Top": "Vrh",
-    "Top frame (_top)": "Glavni frejm (_top)",
-    "Width": "Širina",
-    "Width:": "Širina",
-    "__OBSOLETE__": {
-        "___ TRANSLATOR NOTE   ___": "*** EXTENDEDFILEMANAGER IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***"
-    }
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ExtendedFileManager/lang/si.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ExtendedFileManager/lang/si.js
deleted file mode 100644
index bc9567b..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ExtendedFileManager/lang/si.js
+++ /dev/null
@@ -1,17 +0,0 @@
-// I18N constants
-// LANG: "si", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Cancel": "Prekliči",
-    "OK": "V redu",
-    "__OBSOLETE__": {
-        "___ TRANSLATOR NOTE   ___": "*** EXTENDEDFILEMANAGER IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***"
-    }
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ExtendedFileManager/lang/sr.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ExtendedFileManager/lang/sr.js
deleted file mode 100644
index ff939ed..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ExtendedFileManager/lang/sr.js
+++ /dev/null
@@ -1,36 +0,0 @@
-// I18N constants
-// LANG: "sr", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Absbottom": "Апсолутно дно",
-    "Absmiddle": "Апсолутна средина",
-    "Baseline": "Доња линија",
-    "Bottom": "Дно",
-    "Cancel": "Поништи",
-    "Left": "Лево",
-    "Middle": "Средина",
-    "New window (_blank)": "Новом прозору (_blank)",
-    "None (use implicit)": "користи подразумевано",
-    "Not set": "Није постављено",
-    "OK": "OK",
-    "Positioning of this image": "Постављање ове слике",
-    "Preview": "Преглед",
-    "Right": "Десно",
-    "Same frame (_self)": "Исти фрејм (_self)",
-    "Texttop": "Врх текста",
-    "Title (tooltip)": "Назив (tooltip):",
-    "Top": "Врх",
-    "Top frame (_top)": "Главни фрејм (_top)",
-    "Width": "Ширина",
-    "Width:": "Ширина",
-    "__OBSOLETE__": {
-        "___ TRANSLATOR NOTE   ___": "*** EXTENDEDFILEMANAGER IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***"
-    }
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ExtendedFileManager/lang/sv.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ExtendedFileManager/lang/sv.js
deleted file mode 100644
index a621366..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ExtendedFileManager/lang/sv.js
+++ /dev/null
@@ -1,43 +0,0 @@
-// I18N constants
-// LANG: "sv", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Align": "Justera",
-    "Baseline": "Baslinje",
-    "Border": "Kantlinje",
-    "Bottom": "Botten",
-    "Cancel": "Avbryt",
-    "Clear": "Töm",
-    "Color": "Färg",
-    "Copy": "Kopiera",
-    "Crop": "Beskjär",
-    "Cut": "Klipp ut",
-    "Height": "Höjd",
-    "Height:": "Höjd:",
-    "Left": "Venster",
-    "Margin": "Marginal",
-    "Middle": "Mitten",
-    "New window (_blank)": "Nytt fönster (_blank)",
-    "None (use implicit)": "Ingen (använd standardinställing)",
-    "OK": "OK",
-    "Padding": "Luft",
-    "Positioning of this image": "Bildens positionering",
-    "Preview": "Förhandsgranska",
-    "Right": "Höger",
-    "Same frame (_self)": "Samma ram (_self)",
-    "Title (tooltip)": "Titel (tooltip):",
-    "Top": "Överkant",
-    "Top frame (_top)": "Toppram (_top)",
-    "Width": "Bredd",
-    "Width:": "Bredd:",
-    "__OBSOLETE__": {
-        "___ TRANSLATOR NOTE   ___": "*** EXTENDEDFILEMANAGER IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***"
-    }
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ExtendedFileManager/lang/th.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ExtendedFileManager/lang/th.js
deleted file mode 100644
index 2dd1168..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ExtendedFileManager/lang/th.js
+++ /dev/null
@@ -1,17 +0,0 @@
-// I18N constants
-// LANG: "th", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Cancel": "ยกเลิก",
-    "OK": "ตกลง",
-    "__OBSOLETE__": {
-        "___ TRANSLATOR NOTE   ___": "*** EXTENDEDFILEMANAGER IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***"
-    }
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ExtendedFileManager/lang/tr.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ExtendedFileManager/lang/tr.js
deleted file mode 100644
index bca5750..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ExtendedFileManager/lang/tr.js
+++ /dev/null
@@ -1,43 +0,0 @@
-// I18N constants
-// LANG: "tr", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Absbottom": "Salt alta",
-    "Absmiddle": "Salt orta",
-    "Align": "Hizala",
-    "Baseline": "Taban hizası",
-    "Border": "Kenarlık",
-    "Bottom": "Alta",
-    "Cancel": "İptal",
-    "Color": "Renk",
-    "Height": "Yükseklik",
-    "Height:": "Yükseklik",
-    "Left": "Sola",
-    "Margin": "Kenar boşluğu",
-    "Middle": "Ortala",
-    "New window (_blank)": "Yeni pencere (_blank)",
-    "None (use implicit)": "Hiçbiri (Örtük)",
-    "Not set": "Ayarlanmamış",
-    "OK": "Tamam",
-    "Padding": "İç boşluk",
-    "Positioning of this image": "Resmi konumlandırma",
-    "Preview": "Önizleme",
-    "Right": "Sağa",
-    "Same frame (_self)": "Aynı çerçeve (_self)",
-    "Texttop": "Metin-üstte",
-    "Title (tooltip)": "Başlık (Araç ipucu):",
-    "Top": "Yukarı",
-    "Top frame (_top)": "En üst çerçeve (_top)",
-    "Width": "Genişlik",
-    "Width:": "Genişlik:",
-    "__OBSOLETE__": {
-        "___ TRANSLATOR NOTE   ___": "*** EXTENDEDFILEMANAGER IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***"
-    }
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ExtendedFileManager/lang/vn.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ExtendedFileManager/lang/vn.js
deleted file mode 100644
index 84f468c..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ExtendedFileManager/lang/vn.js
+++ /dev/null
@@ -1,22 +0,0 @@
-// I18N constants
-// LANG: "vn", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Cancel": "Hủy",
-    "New window (_blank)": "Cửa sổ mới (_blank)",
-    "None (use implicit)": "Không (sử dụng implicit)",
-    "OK": "Đồng ý",
-    "Same frame (_self)": "Trên cùng khung (_self)",
-    "Title (tooltip)": "Tiêu đề (của hướng dẫn):",
-    "Top frame (_top)": "Khung trên cùng (_top)",
-    "__OBSOLETE__": {
-        "___ TRANSLATOR NOTE   ___": "*** EXTENDEDFILEMANAGER IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***"
-    }
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ExtendedFileManager/lang/zh_cn.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ExtendedFileManager/lang/zh_cn.js
deleted file mode 100644
index b0e6a0b..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ExtendedFileManager/lang/zh_cn.js
+++ /dev/null
@@ -1,15 +0,0 @@
-// I18N constants
-// LANG: "zh_cn", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "__OBSOLETE__": {
-        "___ TRANSLATOR NOTE   ___": "*** EXTENDEDFILEMANAGER IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***"
-    }
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ExtendedFileManager/manager.php b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ExtendedFileManager/manager.php
deleted file mode 100644
index 32b1dbb..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ExtendedFileManager/manager.php
+++ /dev/null
@@ -1,287 +0,0 @@
-<?php
-/**
- * The main GUI for the ExtendedFileManager.
- * Authors: Wei Zhuo, Afru, Krzysztof Kotowicz, Raimund Meyer
- * Version: Updated on 08-01-2005 by Afru
- * Version: Updated on 04-07-2006 by Krzysztof Kotowicz
- * Version: Updated on 29-10-2006 by Raimund Meyer
- * Version: Updated on 20-01-2008 by Raimund Meyer
- * Package: ExtendedFileManager (EFM 1.4)
- * http://www.afrusoft.com/htmlarea
- */
-
-	if(isset($_REQUEST['mode'])) $insertMode=$_REQUEST['mode'];
-	if(!isset($insertMode)) $insertMode="image";
-
-	require_once('config.inc.php');
-	require_once('Classes/ExtendedFileManager.php');
-	
-	$manager = new ExtendedFileManager($IMConfig);
-	$dirs = $manager->getDirs();
-
-	// calculate number of table rows to span for the preview cell
-	$num_rows = 4; // filename & upload & disk info message & width+margin
-		
-	if ($insertMode=='image')
-	{
-		if ($IMConfig['images_enable_styling'] === false)
-		{
-			$hidden_fields[] = 'f_margin';
-			$hidden_fields[] = 'f_padding';
-			$hidden_fields[] = 'f_border';
-			$hidden_fields[] = 'f_backgroundColor';
-			$hidden_fields[] = 'f_borderColor';
-			$num_rows +=2;
-		}
-		else if ($IMConfig['use_color_pickers'] === false)
-		{
-			$hidden_fields[] = 'f_backgroundColor';
-			$hidden_fields[] = 'f_borderColor';
-			$num_rows +=2;
-		}
-		
-		if ($IMConfig['images_enable_align'] === false)
-		{
-			$hidden_fields[] = 'f_align';
-		}
-		if ($IMConfig['images_enable_alt'])
-		{
-			$num_rows++;
-		}
-		else 
-		{
-			$hidden_fields[] = 'f_alt';
-		}
-		if ($IMConfig['images_enable_title'])
-		{
-			$num_rows++;
-		}
-		else 
-		{
-			$hidden_fields[] = 'f_title';
-		}
-	}
-	
-	if ($insertMode == 'link')
-	{
-		if ($IMConfig['link_enable_target'] === false)
-		{
-			$hidden_fields[] = 'f_target';
-		}
-		$num_rows +=2;
-	}
-?>
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
-    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-<html xmlns="http://www.w3.org/1999/xhtml">
-<head>
-	<title>Insert <?php echo ($insertMode == 'image' ? 'Image' : 'File Link') ?></title>
-  <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
- <link href="<?php print $IMConfig['base_url'];?>assets/manager.css" rel="stylesheet" type="text/css" />
- <link href="../../popups/popup.css" rel="stylesheet" type="text/css" />
-<script type="text/javascript" src="../../popups/popup.js"></script>
-<script type="text/javascript" src="<?php print $IMConfig['base_url'];?>assets/popup.js"></script>
-<script type="text/javascript" src="<?php print $IMConfig['base_url'];?>assets/dialog.js"></script>
-<?php if (!empty($IMConfig['use_color_pickers'])) { ?><script type="text/javascript" src="../../modules/ColorPicker/ColorPicker.js"></script><?php } ?>
-<script type="text/javascript">
-/* <![CDATA[ */
-
-	if(window.opener)
-		Xinha = window.opener.Xinha;
-		
-	var thumbdir = "<?php echo $IMConfig['thumbnail_dir']; ?>";
-	var base_url = "<?php echo $manager->getImagesURL(); ?>";
-    var _backend_url = "<?php print $IMConfig['backend_url']; ?>";
-    var _resized_prefix = "<?php echo $IMConfig['resized_prefix']; ?>";
-  	var _resized_dir = "<?php echo $IMConfig['resized_dir']; ?>";
-    var manager_show_target = <?php echo ($insertMode == 'link' && $IMConfig['link_enable_target'] ? 'true'  : 'false') ?>;
-
-	<?php
-	if(isset($_REQUEST['mode']))
-	{
-		echo 'var manager_mode="'.$_REQUEST['mode'].'";';
-	}
-	else
-	{
-		echo 'var manager_mode="image";';
-	}
-	//IE doesn't like a relative URL when changing a window's location
-	$iframe_url = str_replace( array("backend.php","manager.php"), "", $_SERVER["PHP_SELF"] ) . $IMConfig['backend_url'];
-	?>
-	
-	var iframeUrl = '<?php print $iframe_url ?>__function=images&mode=<?php echo $insertMode;?>&viewtype=<?php echo $IMConfig['view_type'] ?>';
-
-/* ]]> */
-</script>
-<script type="text/javascript" src="<?php print $IMConfig['base_url'];?>assets/manager.js"></script>
-</head>
-<body class="dialog" >
-<div class="title">Insert <?php echo ($insertMode == 'image' ? 'Image' : 'File Link') ?></div>
-<form action="<?php print htmlspecialchars($IMConfig['backend_url']); ?>" id="uploadForm" method="post" enctype="multipart/form-data">
-<input type="hidden" name="__plugin" value="ExtendedFileManager" />
-<input type="hidden" name="__function" value="images" />
-<input type="hidden" name="mode" value="<?php echo $insertMode; ?>" />
-<input type="hidden" id="manager_mode" value="<?php echo $insertMode;?>" />
-<fieldset><legend>File Manager</legend>
-<table border="0" cellpadding="0" cellspacing="0" width="100%">
-<tr>
-<td nowrap="nowrap" style="padding:10px;">
-
-	<label for="dirPath">Directory</label>
-	<select name="dir" class="dirWidth" id="dirPath" onchange="updateDir(this)">
-	<option value="/">/</option>
-<?php foreach($dirs as $relative=>$fullpath) { ?>
-		<option value="<?php echo rawurlencode($relative); ?>"><?php echo $relative; ?></option>
-<?php } ?>
-	</select>
-
-	<a href="#" onclick="javascript: goUpDir();" title="Directory Up"><img src="<?php print $IMConfig['base_url'];?>img/btnFolderUp.gif" height="15" width="15" alt="Directory Up" /></a>
-
-
-<?php if($IMConfig['safe_mode'] == false && $IMConfig['allow_new_dir']) { ?>
-	<a href="#" onclick="newFolder();" title="New Folder"><img src="<?php print $IMConfig['base_url'];?>img/btnFolderNew.gif" height="15" width="15" alt="New Folder" /></a>
-<?php } ?>
-<span id="pasteBtn"></span>
-
-	<select name="viewtype" id="viewtype" onchange="updateView()">
-	<option value="thumbview" <?php if($IMConfig['view_type']=="thumbview") echo 'selected="selected"';?> >Thumbnail View</option>
-	<option value="listview" <?php if($IMConfig['view_type']=="listview") echo 'selected="selected"';?> >List View</option>
-	</select>
-</td>
-</tr>
-<tr><td style="padding:10px; padding-top:0px;">
-	<div id="messages"><span id="message">Loading</span><img src="<?php print $IMConfig['base_url'];?>img/dots.gif" width="22" height="12" alt="..." /></div>
-	<iframe src="about:blank" name="imgManager" id="imgManager" class="imageFrame" scrolling="auto" title="Image Selection" frameborder="0"></iframe>
-</td></tr>
-</table>
-</fieldset>
-<!-- image properties -->
-<div id="controls">
-	<table class="inputTable">
-		<tr>
-			<td style="text-align: right;" nowrap="nowrap"><label for="f_url"><?php if($insertMode=='image') echo 'File Name'; else echo 'URL';?></label></td>
-			<td colspan="5"><input type="text" id="<?php if($insertMode=='image') echo 'f_url'; else echo 'f_href';?>" class="largelWidth" value="" /></td>
-            <td rowspan="<?php echo $num_rows ?>" colspan="2" style="vertical-align: top; text-align: center;"><?php if($insertMode=='image') { ?>
-            <div style="padding:4px;background-color:#CCC;border:1px inset;width: 100px; height: 100px;">
-            <img src="<?php print $IMConfig['base_url'];?>img/1x1_transparent.gif" alt="" id="f_preview" />
-            </div>
-            <?php } else if($insertMode=="link" && $IMConfig['link_enable_target'] !== false) {?><label for="f_align" id="f_target_label">Target Window</label>
-			<select id="f_target" style="width:125px;">
-			  <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><br /><br />
-<input type="text" name="f_other_target" id="f_other_target" style="visibility:hidden; width:120px;" />
-            <?php } ?></td>
-            </tr>
-<?php if($insertMode == 'image' && $IMConfig['images_enable_alt']) { ?>
-		<tr>
-			<td style="text-align: right;"><label for="f_alt">Alt</label></td>
-			<td colspan="5"><input type="text" id="f_alt" class="largelWidth" value="" /></td>
-        </tr>
-<?php }
-      if ($insertMode == 'link' || $IMConfig['images_enable_title']) { ?>
-      <tr>
-			<td style="text-align: right;"><label for="f_title">Title (tooltip)</label></td>
-			<td colspan="5"><input type="text" id="f_title" class="largelWidth" value="" /></td>
-      </tr>
-<?php } ?>
-		<tr>
-<?php
-if (!empty($IMConfig['max_foldersize_mb']) && Files::dirSize($manager->getImagesDir()) > ($IMConfig['max_foldersize_mb']*1048576))
-{ ?>
-	<td colspan="6" style="text-align: right;">Maximum folder size limit reached. Upload disabled.</td>
-<?php }
-else if($IMConfig['allow_upload']) { ?>
-			<td style="text-align: right;"><label for="upload">Upload</label></td>
-			<td colspan="5">
-				<table cellpadding="0" cellspacing="0" border="0">
-                  <tr>
-                    <td><input type="hidden" name="MAX_FILE_SIZE" value="<?php echo $max = (($insertMode == 'image' ? $IMConfig['max_filesize_kb_image'] : $IMConfig['max_filesize_kb_link'] )*1024); ?>" />
-<input type="file" name="upload" id="upload" /></td>
-                    <td><button type="submit" name="submit" onclick="doUpload();">Upload</button>(<?php echo $max/1024 . 'KB'?> max.)</td>
-                  </tr>
-                </table>
-			</td>
-<?php } else { ?>
-			<td colspan="6"></td>
-<?php } ?>
-		</tr>
-		<tr>
-		 <td><?php if (!empty($hidden_fields)) foreach ($hidden_fields as $hf) echo "<input type=\"hidden\" id=\"{$hf}\" name=\"{$hf}\" value=\"\" />"; ?></td>
-		 <td colspan="5"><span id="diskmesg"></span></td>
-      </tr>
-<tr>
-			<td style="text-align: right;"><?php if($insertMode=='image') { ?> <label for="f_width">Width</label><?php }?></td>
-
-			<td><?php if($insertMode=='image') { ?> <input type="text" id="f_width" class="smallWidth" value="" onchange="javascript:checkConstrains('width');"/><?php } else echo "&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;";?></td>
-
-			<td rowspan="2"><?php if($insertMode=='image') { ?><img src="<?php print $IMConfig['base_url'];?>img/locked.gif" id="imgLock" width="25" height="32" alt="Constrained Proportions" />
-				<input type="hidden" id="orginal_width" />
-				<input type="hidden" id="orginal_height" />
-            <input type="checkbox" id="constrain_prop" checked="checked" onclick="javascript:toggleConstrains(this);" value="on" /><br />
-            <label for="constrain_prop">Constrain Proportions</label><?php }?>
-            </td>
-
-			<td rowspan="3" style="text-align: right;"></td>
-
-			<td style="text-align: right;"><?php if($insertMode=='image' && $IMConfig['images_enable_styling'] !== false) { ?><label for="f_margin">Margin</label><?php }?></td>
-
-			<td><?php if($insertMode=='image' && $IMConfig['images_enable_styling'] !== false) { ?><input type="text" id="f_margin" class="smallWidth" value="" /><?php } ?></td>
-</tr>
-<tr>
-			<td style="text-align: right;"><?php if($insertMode=='image') { ?><label for="f_height">Height</label><?php }?></td>
-
-			<td class="smallWidth"><?php if($insertMode=='image') { ?><input type="text" id="f_height" class="smallWidth" value="" onchange="javascript:checkConstrains('height');"/><?php }?></td>
-
-			<td style="text-align: right;"><?php if($insertMode=='image' && $IMConfig['images_enable_styling'] !== false) { ?><label for="f_padding">Padding</label><?php }?></td>
-
-			<td><?php if($insertMode=='image' && $IMConfig['images_enable_styling'] !== false) { ?><input type="text" id="f_padding" class="smallWidth" value="" />
-			<?php }?></td>
-
-            <?php if($insertMode=='image' && !empty($IMConfig['use_color_pickers']) && $IMConfig['images_enable_styling'] !== false) { ?>
-   	            <td style="text-align: left;">Color</td>
-  	            <td>
-                  <input name="f_backgroundColor" type="text" id="f_backgroundColor" size="7" />
-                </td>
-  	        <?php } ?>
-</tr>
-<tr>
-			<td style="text-align: right;"><?php if($insertMode=='image' && $IMConfig['images_enable_align'] !== false) { ?><label for="f_align">Align</label><?php }?></td>
-
-			<td colspan="2"><?php if($insertMode=='image' && $IMConfig['images_enable_align'] !== false) { ?>
-				<select size="1" id="f_align"  title="Positioning of this image">
-				  <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><?php } ?>
-			</td>
-
-			<td style="text-align: right;"><?php if($insertMode=='image' && $IMConfig['images_enable_styling'] !== false) { ?><label for="f_border">Border</label><?php }?></td>
-			<td><?php if($insertMode=='image' && $IMConfig['images_enable_styling'] !== false) { ?><input type="text" id="f_border" class="smallWidth" value="" /><?php }?></td>
-			<?php if($insertMode=='image' && !empty($IMConfig['use_color_pickers']) && $IMConfig['images_enable_styling'] !== false) { ?>
-  	        <td style="text-align: left;">Border Color</td>
-            <td><input name="f_borderColor" type="text" id="f_borderColor" size="7" /></td>
-            <?php } ?>
-</tr>
-</table>
-
-<!--// image properties -->	
-	<div style="text-align: right;"> 
-          <hr />
-		  <button type="button" class="buttons" onclick="return refresh();">Refresh</button>
-          <button type="button" class="buttons" onclick="return onOK();">OK</button>
-          <button type="button" class="buttons" onclick="return onCancel();">Cancel</button>
-    </div>
-</div>
-</form>
-</body>
-</html>
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ExtendedFileManager/prompt.html b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ExtendedFileManager/prompt.html
deleted file mode 100644
index ffe6784..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ExtendedFileManager/prompt.html
+++ /dev/null
@@ -1,92 +0,0 @@
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

-<html>

-<head>

-<title></title>

- <script type="text/javascript" src="../../popups/popup.js"></script>

- <style type="text/css">

- /*<![CDATA[*/

- html, body {  background-color: ButtonFace;  color: ButtonText; font: 11px Tahoma,Verdana,sans-serif; margin: 0; padding: 0;}

-body { padding: 5px; }

- .title { background-color: #ddf; color: #000; font-weight: bold; font-size: 120%; padding: 3px 10px; margin-bottom: 10px; border-bottom: 1px  solid black; letter-spacing: 2px;}

-select, input, button { font: 11px Tahoma,Verdana,sans-serif; }

-.buttons { width: 70px; text-align: center; }

-form { padding: 0px;  margin: 0;}

-form .elements{

-	padding: 10px; text-align: center;

-}

- /*]]>*/

- </style>

-<script type="text/javascript" src="../../popups/popup.js"></script>

-<script type="text/javascript">

-/*<![CDATA[*/

-	

-    if(window.opener)

-        HTMLArea = window.opener.HTMLArea;

-

-	init = function ()

-	{

-		__dlg_translate('ImageManager');

-		

-		var param = opener.Dialog._arguments;

-		

-		if ( param )

-		{

-		  if ( param.title )

-		  {

-		    document.title = param.title;

-		    document.getElementById("title").innerHTML = param.title;

-		  }

-		  if ( param.prompt )

-		  {

-		    document.getElementById("prompt").innerHTML = param.prompt;

-		  }

-		  if ( param.value )

-		  {

-		    document.getElementById("f_input").value = param.value;

-		  }

-		}

-		document.getElementById("f_input").focus();

-		

-		__xinha_dlg_init();

-		

-	};

-

-	function onCancel()

-	{

-		__dlg_close(null);

-		return false;

-	}

-

-	function onOK()

-	{

-		 // pass data back to the calling window

-	  __dlg_close({value:document.getElementById("f_input").value});

-	  return false;

-	}

-

-	function addEvent(obj, evType, fn)

-	{

-		if (obj.addEventListener) { obj.addEventListener(evType, fn, true); return true; }

-		else if (obj.attachEvent) {  var r = obj.attachEvent("on"+evType, fn);  return r;  }

-		else {  return false; }

-	}

-

-	addEvent(window, 'load', init);

-//-->

-</script>

-</head>

-<body >

-<div class="title" id="title" style="white-space:nowrap">Please enter value</div>

-<form action="">

-<div class="elements">

-	<label for="f_input" id="prompt"></label>

-	<input type="text" id="f_input" style="width:50%"/>

-</div>

-<div style="text-align: right;">

-	  <hr />

-	  <button type="button" class="buttons" onclick="return onOK();">OK</button>

-	  <button type="button" class="buttons" 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-1.5.1/unsupported_plugins/ExtendedFileManager/resizer.php b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ExtendedFileManager/resizer.php
deleted file mode 100644
index db61f6b..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ExtendedFileManager/resizer.php
+++ /dev/null
@@ -1,88 +0,0 @@
-<?php

-header('Content-Type: text/javascript; charset=UTF-8');

-

-/**

- * Resize images to a given size, and saving in a new file.

- * resize.php?img=/relative/path/to/image.jpg&width=<pixels>&height=<pixels>[&to=/relative/path/to/newimage.jpg]

- * relative to the base_dir given in config.inc.php

- * This is pretty much just thumbs.php with some mods, I'm too lazy to do it properly

- * @author $Author:ray $

- * @version $Id:resizer.php 922 2007-12-30 14:35:46Z ray $

- * @package ImageManager

- */

-

-require_once('config.inc.php');

-require_once('Classes/ExtendedFileManager.php');

-require_once('../ImageManager/Classes/Thumbnail.php');

-

-function js_fail($message)    { echo 'alert(\'ha ' . $message . '\'); false'; exit;   }

-function js_success($resultFile)    { echo '\'' . $resultFile . '\''; exit;   }

-

-//check for img parameter in the url

-if(!isset($_GET['img']) || !isset($_GET['width']) || !isset($_GET['height']))

-{

-  js_fail('Missing parameter.');

-}

-

-if($IMConfig['resize_files'] == FALSE)

-{

-    js_success($_GET['img']);

-}

-

-$manager = new ExtendedFileManager($IMConfig);

-

-//get the image and the full path to the image

-$image = $_GET['img'];

-$fullpath = Files::makeFile($manager->getImagesDir(),$image);

-

-//not a file, so exit

-if(!is_file($fullpath))

-{

-  js_fail("File {$fullpath} does not exist.");

-}

-

-$imgInfo = @getImageSize($fullpath);

-

-//Not an image, bail out.

-if(!is_array($imgInfo))

-{

-	js_fail("File {$fullpath} is not an image.");

-}

-

-if(!isset($_GET['to']))

-{

-  $resized    = $manager->getResizedName($fullpath,$_GET['width'],$_GET['height']);

-  $_GET['to'] = $manager->getResizedName($image,$_GET['width'],$_GET['height'], FALSE);

-}

-else

-{

-  $resized = Files::makeFile($manager->getImagesDir(),$_GET['to']);

-}

-

-// Check to see if it already exists

-if(is_file($resized))

-{

-	// And is newer

-	if(filemtime($resized) >= filemtime($fullpath))

-	{

-		js_success($_GET['to']);

-	}

-}

-

-

-

-// resize (thumbnailer will do this for us just fine)

-$thumbnailer = new Thumbnail($_GET['width'],$_GET['height']);

-$thumbnailer->proportional = FALSE;

-$thumbnailer->createThumbnail($fullpath, $resized);

-

-// did it work?

-if(is_file($resized))

-{

-	js_success($_GET['to']);

-}

-else

-{

-	js_fail("Resize Failed.");

-}

-?>
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ExtendedFileManager/thumbs.php b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ExtendedFileManager/thumbs.php
deleted file mode 100644
index 849bb19..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ExtendedFileManager/thumbs.php
+++ /dev/null
@@ -1,85 +0,0 @@
-<?php

-/**

- * On the fly Thumbnail generation.

- * Creates thumbnails given by thumbs.php?img=/relative/path/to/image.jpg

- * relative to the base_dir given in config.inc.php

- * Authors: Wei Zhuo, Afru, Krzysztof Kotowicz

- * Version: Updated on 08-01-2005 by Afru

- * Version: Updated on 21-06-2006 by Krzysztof Kotowicz

- * Package: ExtendedFileManager (EFM 1.1.1)

- * http://www.afrusoft.com/htmlarea

- */

-if(isset($_REQUEST['mode'])) $insertMode=$_REQUEST['mode'];

-if(!isset($insertMode)) $insertMode="image";

-

-require_once('config.inc.php');

-require_once('Classes/ExtendedFileManager.php');

-require_once('../ImageManager/Classes/Thumbnail.php');

-

-//check for img parameter in the url

-if(!isset($_GET['img']))

-	exit();

-

-$manager = new ExtendedFileManager($IMConfig,$insertMode);

-

-//get the image and the full path to the image

-$image = rawurldecode($_GET['img']);

-$fullpath = Files::makeFile($manager->getImagesDir(),$image);

-

-//not a file, so exit

-if(!is_file($fullpath))

-	exit();

-

-$imgInfo = @getImageSize($fullpath);

-

-//Not an image, send default thumbnail

-if(!is_array($imgInfo))

-{

-	//show the default image, otherwise we quit!

-	$default = $manager->getDefaultThumb();

-	if($default)

-	{

-		header('Location: '.$default);

-		exit();

-	}

-}

-//if the image is less than the thumbnail dimensions

-//send the original image as thumbnail

-if ($imgInfo[0] <= $IMConfig['thumbnail_width']

- && $imgInfo[1] <= $IMConfig['thumbnail_height'])

- {

-	 header('Location: '.$manager->getFileURL($image));

-	 exit();

- }

-

-//Check for thumbnails

-$thumbnail = $manager->getThumbName($fullpath);

-if(is_file($thumbnail))

-{

-	//if the thumbnail is newer, send it

-	if(filemtime($thumbnail) >= filemtime($fullpath))

-	{

-		header('Location: '.$manager->getThumbURL($image));

-		exit();

-	}

-}

-

-//creating thumbnails

-$thumbnailer = new Thumbnail($IMConfig['thumbnail_width'],$IMConfig['thumbnail_height']);

-$thumbnailer->createThumbnail($fullpath, $thumbnail);

-

-//Check for NEW thumbnails

-if(is_file($thumbnail))

-{

-	//send the new thumbnail

-	header('Location: '.$manager->getThumbURL($image));

-	exit();

-}

-else

-{

-	//show the default image, otherwise we quit!

-	$default = $manager->getDefaultThumb();

-	if($default)

-		header('Location: '.$default);

-}

-?>
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/Filter/Filter.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/Filter/Filter.js
deleted file mode 100644
index 3363594..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/Filter/Filter.js
+++ /dev/null
@@ -1,68 +0,0 @@
-// Filter plugin for Xinha
-// Implementation by Udo Schmal & Schaffrath NeueMedien
-// Original Author - Udo Schmal
-//
-// (c) Udo Schmal & Schaffrath NeueMedien 2004
-// Distributed under the same terms as HTMLArea itself.
-// This notice MUST stay intact for use (see license.txt).
-function Filter(editor) {
-  this.editor = editor;
-  var cfg = editor.config;
-  var self = this;
-  // register the toolbar buttons provided by this plugin
-  cfg.registerButton({
-    id: "filter",
-    tooltip  : this._lc("Filter"),
-    image    : editor.imgURL("ed_filter.gif", "Filter"),
-    textMode : false,
-    action   : function(editor) {
-                 self.buttonPress(editor);
-               }
-  });
-  if (!cfg.Filters)
-    cfg.Filters = ["Paragraph","Word"];
-  for (var i = 0; i < editor.config.Filters.length; i++) {
-    self.add(editor.config.Filters[i]);
-  }
-  cfg.addToolbarElement("filter", "removeformat", 1);
-}
-
-Filter._pluginInfo =
-{
-  name          : "Filter",
-  version       : "1.0",
-  developer     : "Udo Schmal (gocher)",
-  developer_url : "",
-  sponsor       : "L.N.Schaffrath NeueMedien",
-  sponsor_url   : "http://www.schaffrath-neuemedien.de/",
-  c_owner       : "Udo Schmal & Schaffrath-NeueMedien",
-  license       : "htmlArea"
-};
-
-Filter.prototype.add = function(filterName) {
-  if(eval('typeof ' + filterName) == 'undefined') {
-    var filter = Xinha.getPluginDir('Filter') + "/filters/" + filterName + ".js";
-    var head = document.getElementsByTagName("head")[0];
-    var evt = Xinha.is_ie ? "onreadystatechange" : "onload";
-    var script = document.createElement("script");
-    script.type = "text/javascript";
-    script.src = filter;
-    script[evt] = function() {
-      if(Xinha.is_ie && !/loaded|complete/.test(window.event.srcElement.readyState))  return;
-    }
-    head.appendChild(script);
-    //document.write("<script type='text/javascript' src='" + plugin_file + "'></script>");
-  }
-};
-
-Filter.prototype._lc = function(string) {
-    return Xinha._lc(string, 'Filter');
-};
-
-Filter.prototype.buttonPress = function(editor) {
-  var html = editor.getInnerHTML();
-  for (var i = 0; i < editor.config.Filters.length; i++) {
-    html = eval(editor.config.Filters[i])(html);
-  }
-  editor.setHTML(html);
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/Filter/filters/paragraph.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/Filter/filters/paragraph.js
deleted file mode 100644
index 3d4a3de..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/Filter/filters/paragraph.js
+++ /dev/null
@@ -1,6 +0,0 @@
-Paragraph = function(html) {
-  html = html.replace(/<\s*p[^>]*>/gi, '');
-  html = html.replace(/<\/\s*p\s*>/gi, '');
-  html = html.trim();
-  return html;
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/Filter/filters/word.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/Filter/filters/word.js
deleted file mode 100644
index 57cd995..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/Filter/filters/word.js
+++ /dev/null
@@ -1,53 +0,0 @@
-Word = function(html) {
-    // Remove HTML comments
-	html = html.replace(/<!--[\w\s\d@{}:.;,'"%!#_=&|?~()[*+\/\-\]]*-->/gi, "" );
-	html = html.replace(/<!--[^\0]*-->/gi, '');
-    // Remove all HTML tags
-	html = html.replace(/<\/?\s*HTML[^>]*>/gi, "" );
-    // Remove all BODY tags
-    html = html.replace(/<\/?\s*BODY[^>]*>/gi, "" );
-    // Remove all META tags
-	html = html.replace(/<\/?\s*META[^>]*>/gi, "" );
-    // Remove all SPAN tags
-	html = html.replace(/<\/?\s*SPAN[^>]*>/gi, "" );
-	// Remove all FONT tags
-    html = html.replace(/<\/?\s*FONT[^>]*>/gi, "");
-    // Remove all IFRAME tags.
-    html = html.replace(/<\/?\s*IFRAME[^>]*>/gi, "");
-    // Remove all STYLE tags & content
-	html = html.replace(/<\/?\s*STYLE[^>]*>(.|[\n\r\t])*<\/\s*STYLE\s*>/gi, "" );
-    // Remove all TITLE tags & content
-	html = html.replace(/<\s*TITLE[^>]*>(.|[\n\r\t])*<\/\s*TITLE\s*>/gi, "" );
-	// Remove javascript
-    html = html.replace(/<\s*SCRIPT[^>]*>[^\0]*<\/\s*SCRIPT\s*>/gi, "");
-    // Remove all HEAD tags & content
-	html = html.replace(/<\s*HEAD[^>]*>(.|[\n\r\t])*<\/\s*HEAD\s*>/gi, "" );
-	// Remove Class attributes
-	html = html.replace(/<\s*(\w[^>]*) class=([^ |>]*)([^>]*)/gi, "<$1$3") ;
-	// Remove Style attributes
-	html = html.replace(/<\s*(\w[^>]*) style="([^"]*)"([^>]*)/gi, "<$1$3") ;
-	// Remove Lang attributes
-	html = html.replace(/<\s*(\w[^>]*) lang=([^ |>]*)([^>]*)/gi, "<$1$3") ;
-	// Remove XML elements and declarations
-	html = html.replace(/<\\?\?xml[^>]*>/gi, "") ;
-	// Remove Tags with XML namespace declarations: <o:p></o:p>
-	html = html.replace(/<\/?\w+:[^>]*>/gi, "") ;
-	// Replace the &nbsp;
-	html = html.replace(/&nbsp;/, " " );
-
-	// Transform <p><br /></p> to <br>
-	//html = html.replace(/<\s*p[^>]*>\s*<\s*br\s*\/>\s*<\/\s*p[^>]*>/gi, "<br>");
-	html = html.replace(/<\s*p[^>]*><\s*br\s*\/?>\s*<\/\s*p[^>]*>/gi, "<br>");
-	
-	// Remove <P> 
-	html = html.replace(/<\s*p[^>]*>/gi, "");
-	
-	// Replace </p> with <br>
-	html = html.replace(/<\/\s*p[^>]*>/gi, "<br>");
-	
-	// Remove any <br> at the end
-	html = html.replace(/(\s*<br>\s*)*$/, "");
-	
-	html = html.trim();
-	return html;
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/Filter/img/ed_filter.gif b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/Filter/img/ed_filter.gif
deleted file mode 100644
index 53180a8..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/Filter/img/ed_filter.gif
+++ /dev/null
Binary files differ
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/Filter/lang/b5.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/Filter/lang/b5.js
deleted file mode 100644
index 6a0f1d9..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/Filter/lang/b5.js
+++ /dev/null
@@ -1,15 +0,0 @@
-// I18N constants
-// LANG: "b5", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "__OBSOLETE__": {
-        "___ TRANSLATOR NOTE   ___": "*** FILTER IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***"
-    }
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/Filter/lang/ch.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/Filter/lang/ch.js
deleted file mode 100644
index 71fa974..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/Filter/lang/ch.js
+++ /dev/null
@@ -1,15 +0,0 @@
-// I18N constants
-// LANG: "ch", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "__OBSOLETE__": {
-        "___ TRANSLATOR NOTE   ___": "*** FILTER IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***"
-    }
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/Filter/lang/cz.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/Filter/lang/cz.js
deleted file mode 100644
index b043ce7..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/Filter/lang/cz.js
+++ /dev/null
@@ -1,15 +0,0 @@
-// I18N constants
-// LANG: "cz", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "__OBSOLETE__": {
-        "___ TRANSLATOR NOTE   ___": "*** FILTER IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***"
-    }
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/Filter/lang/da.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/Filter/lang/da.js
deleted file mode 100644
index 1fc3b35..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/Filter/lang/da.js
+++ /dev/null
@@ -1,15 +0,0 @@
-// I18N constants
-// LANG: "da", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "__OBSOLETE__": {
-        "___ TRANSLATOR NOTE   ___": "*** FILTER IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***"
-    }
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/Filter/lang/de.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/Filter/lang/de.js
deleted file mode 100644
index ffbc664..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/Filter/lang/de.js
+++ /dev/null
@@ -1,16 +0,0 @@
-// I18N constants
-// LANG: "de", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Filter": "Filter",
-    "__OBSOLETE__": {
-        "___ TRANSLATOR NOTE   ___": "*** FILTER IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***"
-    }
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/Filter/lang/ee.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/Filter/lang/ee.js
deleted file mode 100644
index 5678376..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/Filter/lang/ee.js
+++ /dev/null
@@ -1,15 +0,0 @@
-// I18N constants
-// LANG: "ee", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "__OBSOLETE__": {
-        "___ TRANSLATOR NOTE   ___": "*** FILTER IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***"
-    }
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/Filter/lang/el.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/Filter/lang/el.js
deleted file mode 100644
index 5c46207..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/Filter/lang/el.js
+++ /dev/null
@@ -1,15 +0,0 @@
-// I18N constants
-// LANG: "el", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "__OBSOLETE__": {
-        "___ TRANSLATOR NOTE   ___": "*** FILTER IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***"
-    }
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/Filter/lang/es.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/Filter/lang/es.js
deleted file mode 100644
index 28a281d..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/Filter/lang/es.js
+++ /dev/null
@@ -1,15 +0,0 @@
-// I18N constants
-// LANG: "es", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "__OBSOLETE__": {
-        "___ TRANSLATOR NOTE   ___": "*** FILTER IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***"
-    }
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/Filter/lang/eu.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/Filter/lang/eu.js
deleted file mode 100644
index f19d5d0..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/Filter/lang/eu.js
+++ /dev/null
@@ -1,15 +0,0 @@
-// I18N constants
-// LANG: "eu", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "__OBSOLETE__": {
-        "___ TRANSLATOR NOTE   ___": "*** FILTER IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***"
-    }
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/Filter/lang/fa.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/Filter/lang/fa.js
deleted file mode 100644
index 1c27c40..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/Filter/lang/fa.js
+++ /dev/null
@@ -1,15 +0,0 @@
-// I18N constants
-// LANG: "fa", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "__OBSOLETE__": {
-        "___ TRANSLATOR NOTE   ___": "*** FILTER IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***"
-    }
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/Filter/lang/fi.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/Filter/lang/fi.js
deleted file mode 100644
index df8f2d4..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/Filter/lang/fi.js
+++ /dev/null
@@ -1,15 +0,0 @@
-// I18N constants
-// LANG: "fi", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "__OBSOLETE__": {
-        "___ TRANSLATOR NOTE   ___": "*** FILTER IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***"
-    }
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/Filter/lang/fr.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/Filter/lang/fr.js
deleted file mode 100644
index f68d09a..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/Filter/lang/fr.js
+++ /dev/null
@@ -1,15 +0,0 @@
-// I18N constants
-// LANG: "fr", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "__OBSOLETE__": {
-        "___ TRANSLATOR NOTE   ___": "*** FILTER IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***"
-    }
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/Filter/lang/fr_ca.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/Filter/lang/fr_ca.js
deleted file mode 100644
index fb4d0b6..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/Filter/lang/fr_ca.js
+++ /dev/null
@@ -1,15 +0,0 @@
-// I18N constants
-// LANG: "fr_ca", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "__OBSOLETE__": {
-        "___ TRANSLATOR NOTE   ___": "*** FILTER IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***"
-    }
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/Filter/lang/gb.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/Filter/lang/gb.js
deleted file mode 100644
index ec575b6..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/Filter/lang/gb.js
+++ /dev/null
@@ -1,15 +0,0 @@
-// I18N constants
-// LANG: "gb", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "__OBSOLETE__": {
-        "___ TRANSLATOR NOTE   ___": "*** FILTER IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***"
-    }
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/Filter/lang/he.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/Filter/lang/he.js
deleted file mode 100644
index b34aac7..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/Filter/lang/he.js
+++ /dev/null
@@ -1,15 +0,0 @@
-// I18N constants
-// LANG: "he", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "__OBSOLETE__": {
-        "___ TRANSLATOR NOTE   ___": "*** FILTER IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***"
-    }
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/Filter/lang/hu.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/Filter/lang/hu.js
deleted file mode 100644
index 4c95d2c..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/Filter/lang/hu.js
+++ /dev/null
@@ -1,15 +0,0 @@
-// I18N constants
-// LANG: "hu", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "__OBSOLETE__": {
-        "___ TRANSLATOR NOTE   ___": "*** FILTER IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***"
-    }
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/Filter/lang/it.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/Filter/lang/it.js
deleted file mode 100644
index 9b018c9..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/Filter/lang/it.js
+++ /dev/null
@@ -1,15 +0,0 @@
-// I18N constants
-// LANG: "it", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "__OBSOLETE__": {
-        "___ TRANSLATOR NOTE   ___": "*** FILTER IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***"
-    }
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/Filter/lang/ja.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/Filter/lang/ja.js
deleted file mode 100644
index 540a993..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/Filter/lang/ja.js
+++ /dev/null
@@ -1,13 +0,0 @@
-// I18N constants
-// LANG: "ja", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Filter": "フィルター"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/Filter/lang/lc_base.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/Filter/lang/lc_base.js
deleted file mode 100644
index 3bdc4a6..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/Filter/lang/lc_base.js
+++ /dev/null
@@ -1,25 +0,0 @@
-// I18N constants
-//
-// LANG: "en", ENCODING: UTF-8
-// Author: Translator-Name, <email@example.com>
-//
-// Last revision: 2018-04-12
-// 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).
-//
-// (Please, remove information below)
-// 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.)
-
-{
-    "Filter": ""
-}
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/Filter/lang/lt.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/Filter/lang/lt.js
deleted file mode 100644
index c10f535..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/Filter/lang/lt.js
+++ /dev/null
@@ -1,15 +0,0 @@
-// I18N constants
-// LANG: "lt", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "__OBSOLETE__": {
-        "___ TRANSLATOR NOTE   ___": "*** FILTER IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***"
-    }
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/Filter/lang/lv.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/Filter/lang/lv.js
deleted file mode 100644
index 1762e71..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/Filter/lang/lv.js
+++ /dev/null
@@ -1,15 +0,0 @@
-// I18N constants
-// LANG: "lv", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "__OBSOLETE__": {
-        "___ TRANSLATOR NOTE   ___": "*** FILTER IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***"
-    }
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/Filter/lang/nb.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/Filter/lang/nb.js
deleted file mode 100644
index 8634809..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/Filter/lang/nb.js
+++ /dev/null
@@ -1,15 +0,0 @@
-// I18N constants
-// LANG: "nb", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "__OBSOLETE__": {
-        "___ TRANSLATOR NOTE   ___": "*** FILTER IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***"
-    }
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/Filter/lang/nl.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/Filter/lang/nl.js
deleted file mode 100644
index f695771..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/Filter/lang/nl.js
+++ /dev/null
@@ -1,13 +0,0 @@
-// I18N constants
-// LANG: "nl", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Filter": "Filter"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/Filter/lang/pl.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/Filter/lang/pl.js
deleted file mode 100644
index ef971bb..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/Filter/lang/pl.js
+++ /dev/null
@@ -1,15 +0,0 @@
-// I18N constants
-// LANG: "pl", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "__OBSOLETE__": {
-        "___ TRANSLATOR NOTE   ___": "*** FILTER IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***"
-    }
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/Filter/lang/pt_br.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/Filter/lang/pt_br.js
deleted file mode 100644
index b6cafb3..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/Filter/lang/pt_br.js
+++ /dev/null
@@ -1,13 +0,0 @@
-// I18N constants
-// LANG: "pt_br", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Filter": "Filtro"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/Filter/lang/ro.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/Filter/lang/ro.js
deleted file mode 100644
index 803134a..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/Filter/lang/ro.js
+++ /dev/null
@@ -1,15 +0,0 @@
-// I18N constants
-// LANG: "ro", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "__OBSOLETE__": {
-        "___ TRANSLATOR NOTE   ___": "*** FILTER IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***"
-    }
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/Filter/lang/ru.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/Filter/lang/ru.js
deleted file mode 100644
index 576a5b6..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/Filter/lang/ru.js
+++ /dev/null
@@ -1,15 +0,0 @@
-// I18N constants
-// LANG: "ru", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "__OBSOLETE__": {
-        "___ TRANSLATOR NOTE   ___": "*** FILTER IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***"
-    }
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/Filter/lang/sh.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/Filter/lang/sh.js
deleted file mode 100644
index 85089b1..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/Filter/lang/sh.js
+++ /dev/null
@@ -1,15 +0,0 @@
-// I18N constants
-// LANG: "sh", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "__OBSOLETE__": {
-        "___ TRANSLATOR NOTE   ___": "*** FILTER IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***"
-    }
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/Filter/lang/si.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/Filter/lang/si.js
deleted file mode 100644
index ca3e2f0..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/Filter/lang/si.js
+++ /dev/null
@@ -1,15 +0,0 @@
-// I18N constants
-// LANG: "si", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "__OBSOLETE__": {
-        "___ TRANSLATOR NOTE   ___": "*** FILTER IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***"
-    }
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/Filter/lang/sr.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/Filter/lang/sr.js
deleted file mode 100644
index 0561d45..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/Filter/lang/sr.js
+++ /dev/null
@@ -1,15 +0,0 @@
-// I18N constants
-// LANG: "sr", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "__OBSOLETE__": {
-        "___ TRANSLATOR NOTE   ___": "*** FILTER IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***"
-    }
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/Filter/lang/sv.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/Filter/lang/sv.js
deleted file mode 100644
index 56471e4..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/Filter/lang/sv.js
+++ /dev/null
@@ -1,15 +0,0 @@
-// I18N constants
-// LANG: "sv", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "__OBSOLETE__": {
-        "___ TRANSLATOR NOTE   ___": "*** FILTER IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***"
-    }
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/Filter/lang/th.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/Filter/lang/th.js
deleted file mode 100644
index 642ea07..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/Filter/lang/th.js
+++ /dev/null
@@ -1,15 +0,0 @@
-// I18N constants
-// LANG: "th", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "__OBSOLETE__": {
-        "___ TRANSLATOR NOTE   ___": "*** FILTER IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***"
-    }
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/Filter/lang/tr.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/Filter/lang/tr.js
deleted file mode 100644
index 3881313..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/Filter/lang/tr.js
+++ /dev/null
@@ -1,15 +0,0 @@
-// I18N constants
-// LANG: "tr", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "__OBSOLETE__": {
-        "___ TRANSLATOR NOTE   ___": "*** FILTER IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***"
-    }
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/Filter/lang/vn.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/Filter/lang/vn.js
deleted file mode 100644
index 2fd13e2..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/Filter/lang/vn.js
+++ /dev/null
@@ -1,15 +0,0 @@
-// I18N constants
-// LANG: "vn", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "__OBSOLETE__": {
-        "___ TRANSLATOR NOTE   ___": "*** FILTER IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***"
-    }
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/Filter/lang/zh_cn.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/Filter/lang/zh_cn.js
deleted file mode 100644
index 575f354..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/Filter/lang/zh_cn.js
+++ /dev/null
@@ -1,15 +0,0 @@
-// I18N constants
-// LANG: "zh_cn", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "__OBSOLETE__": {
-        "___ TRANSLATOR NOTE   ___": "*** FILTER IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***"
-    }
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/HtmlTidy/HtmlTidy.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/HtmlTidy/HtmlTidy.js
deleted file mode 100644
index 7f224f2..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/HtmlTidy/HtmlTidy.js
+++ /dev/null
@@ -1,105 +0,0 @@
-// Plugin for htmlArea to run code through the server's HTML Tidy
-// By Adam Wright, for The University of Western Australia
-//
-// Distributed under the same terms as HTMLArea itself.
-// This notice MUST stay intact for use (see license.txt).
-
-function HtmlTidy(editor) {
-	this.editor = editor;
-
-	var cfg = editor.config;
-	var bl = HtmlTidy.btnList;
-	var self = this;
-
-	this.onMode = this.__onMode;
-
-	// register the toolbar buttons provided by this plugin
-	var toolbar = [];
-	for (var i = 0; i < bl.length; ++i) {
-		var btn = bl[i];
-		if (btn == "html-tidy") {
-			var id = "HT-html-tidy";
-			cfg.registerButton(id, this._lc("HTML Tidy"), editor.imgURL(btn[0] + ".gif", "HtmlTidy"), true,
-					   function(editor, id) {
-						   // dispatch button press event
-						   self.buttonPress(editor, id);
-					   }, btn[1]);
-			toolbar.push(id);
-		} else if (btn == "html-auto-tidy") {
-            var btnTxt = [this._lc("Auto-Tidy"), this._lc("Don't Tidy")];
-            var optionItems = new Object();
-            optionItems[btnTxt[0]] = "auto";
-            optionItems[btnTxt[1]] = "noauto";
-			var ht_class = {
-				id	: "HT-auto-tidy",
-				options	: optionItems,
-				action	: function (editor) { self.__onSelect(editor, this); },
-				refresh	: function (editor) { },
-				context	: "body"
-			};
-			cfg.registerDropdown(ht_class);
-		}
-	}
-
-	for (var i in toolbar) {
-		cfg.toolbar[0].push(toolbar[i]);
-	}
-}
-
-HtmlTidy._pluginInfo = {
-	name          : "HtmlTidy",
-	version       : "1.0",
-	developer     : "Adam Wright",
-	developer_url : "http://blog.hipikat.org/",
-	sponsor       : "The University of Western Australia",
-	sponsor_url   : "http://www.uwa.edu.au/",
-	license       : "htmlArea"
-};
-
-HtmlTidy.prototype._lc = function(string) {
-    return Xinha._lc(string, 'HtmlTidy');
-};
-
-HtmlTidy.prototype.__onSelect = function(editor, obj) {
-	// Get the toolbar element object
-	var elem = editor._toolbarObjects[obj.id].element;
-
-	// Set our onMode event appropriately
-	if (elem.value == "auto")
-		this.onMode = this.__onMode;
-	else
-		this.onMode = null;
-};
-
-HtmlTidy.prototype.__onMode = function(mode) {
-	if ( mode == "textmode" ) {
-		this.buttonPress(this.editor, "HT-html-tidy");
-	}
-};
-
-HtmlTidy.btnList = [
-		    null, // separator
-		    ["html-tidy"],
-		    ["html-auto-tidy"]
-];
-
-HtmlTidy.prototype.buttonPress = function(editor, id) {
-
-	switch (id)
-  {
-    case "HT-html-tidy":
-    {
-      var oldhtml = editor.getHTML();
-      if(oldhtml=="") break; //don't clean empty text
-      // Ask the server for some nice new html, based on the old...
-      Xinha._postback(Xinha.getPluginDir("HtmlTidy") + '/html-tidy-logic.php', {'htisource_name' : oldhtml},
-                            function(javascriptResponse) { eval(javascriptResponse) });
-    }
-		break;
-	}
-};
-
-HtmlTidy.prototype.processTidied = function(newSrc) {
-	editor = this.editor;
-	editor.setHTML(newSrc);
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/HtmlTidy/README b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/HtmlTidy/README
deleted file mode 100644
index a3e19f2..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/HtmlTidy/README
+++ /dev/null
@@ -1,104 +0,0 @@
-// Plugin for htmlArea to run code through the server's HTML Tidy
-// By Adam Wright, for The University of Western Australia
-//
-//   Email:      zeno@ucc.gu.uwa.edu.au
-//   Homepage:   http://blog.hipikat.org/
-//
-// Distributed under the same terms as HTMLArea itself.
-// This notice MUST stay intact for use (see license.txt).
-//
-// Version: 0.5
-// Released to the outside world: 04/03/04
-
-
-HtmlTidy is a plugin for the popular cross-browser TTY WYSIWYG editor,
-htmlArea (http://www.interactivetools.com/products/htmlarea/). HtmlTidy
-basically queries HTML Tidy (http://tidy.sourceforge.net/) on the
-server side, getting it to make-html-nice, instead of relying on masses
-of javascript, which the client would have to download.
-
-Hi, this is a quick explanation of how to install HtmlTidy. Much better
-documentation is probably required, and you're welcome to write it :)
-
-
-* The HtmlTidy directory you should have found this file in should
-  include the following:
-
-  - README
-        This file, providing help installing the plugin.
-
-  - html-tidy-config.cfg
-        This file contains the configuration options HTML Tidy uses to
-        clean html, and can be modified to suit your organizations
-        requirements.
-
-  - html-tidy-logic.php
-        This is the php script, which is queried with dirty html and is
-        responsible for invoking HTML Tidy, getting nice new html and
-        returning it to the client.
-
-  - html-tidy.js
-        The main htmlArea plugin, providing functionality to tidy html
-        through the htmlArea interface.
-
-  - htmlarea.js.onmode_event.diff
-        At the time of publishing, an extra event handler was required
-        inside the main htmlarea.js file. htmlarea.js may be patched
-        against this file to make the changes reuquired, but be aware
-        that the event handler may either now be in the core or
-        htmlarea.js may have changed enough to invalidate the patch.
-	
-	UPDATE: now it exists in the official htmlarea.js; applying
-	this patch is thus no longer necessary.
-
-  - img/html-tidy.gif
-        The HtmlTidy icon, for the htmlArea toolbar. Created by Dan
-        Petty for The University of Western Australia.
-
-  - lang/en.js
-        English language file. Add your own language files here and
-        please contribute back into the htmlArea community!
-
-  The HtmlArea directory should be extracted to your htmlarea/plugins/
-  directory.
-
-
-* Make sure the onMode event handler mentioned above, regarding
-  htmlarea.js.onmode_event.diff, exists in your htmlarea.js
-
-
-* html-tidy-logic.php should be executable, and your web server should
-  be configured to execute php scripts in the directory
-  html-tidy-logic.php exists in.
-
-
-* HTML Tidy needs to be installed on your server, and 'tidy' should be
-  an alias to it, lying in the PATH known to the user executing such
-  web scripts.
-
-
-* In your htmlArea configuration, do something like this:
-
-    HTMLArea.loadPlugin("HtmlTidy");
-
-    editor = new HTMLArea("doc");
-    editor.registerPlugin("HtmlTidy");
-
-
-* Then, in your htmlArea toolbar configuration, use:
-
-    - "HT-html-tidy"
-        This will create the 'tidy broom' icon on the toolbar, which
-        will attempt to tidy html source when clicked, and;
-
-    - "HT-auto-tidy"
-        This will create an "Auto Tidy" / "Don't Tidy" dropdown, to
-        select whether the source should be tidied automatically when
-        entering source view. On by default, if you'd like it otherwise
-        you can do so programatically after generating the toolbar :)
-        (Or just hack it to be otherwise...)
-    
-
-Thank you.
-
-Any bugs you find can be emailed to zeno@ucc.gu.uwa.edu.au
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/HtmlTidy/html-tidy-config.cfg b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/HtmlTidy/html-tidy-config.cfg
deleted file mode 100644
index 7616992..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/HtmlTidy/html-tidy-config.cfg
+++ /dev/null
@@ -1,29 +0,0 @@
-// Default configuration file for the htmlArea, HtmlTidy plugin
-// By Adam Wright, for The University of Western Australia
-//
-// Evertything you always wanted to know about HTML Tidy *
-// can be found at http://tidy.sourceforge.net/, and a
-// quick reference to the configuration options exists at
-// http://tidy.sourceforge.net/docs/quickref.html
-//
-// * But were afraid to ask
-//
-// Distributed under the same terms as HTMLArea itself.
-// This notice MUST stay intact for use (see license.txt).
-
-word-2000: yes
-clean: yes
-drop-font-tags: no
-doctype: auto
-drop-empty-paras: yes
-drop-proprietary-attributes: yes
-enclose-block-text: yes
-enclose-text: yes
-escape-cdata: yes
-logical-emphasis: yes
-indent: auto
-indent-spaces: 2
-break-before-br: yes
-output-xhtml: yes
-
-force-output: yes
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/HtmlTidy/html-tidy-logic.php b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/HtmlTidy/html-tidy-logic.php
deleted file mode 100755
index c457e0f..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/HtmlTidy/html-tidy-logic.php
+++ /dev/null
@@ -1,79 +0,0 @@
-<?php 
-##
-##  Plugin for htmlArea, to run code through the server's HTML Tidy
-##   By Adam Wright, for The University of Western Australia
-##    This is the server-side script, which dirty code is run through.
-##
-##  Distributed under the same terms as HTMLArea itself.
-##  This notice MUST stay intact for use (see license.txt).
-##
-
-	// Get the original source
-	$source = $_POST['htisource_name'];
-	$source = stripslashes($source);
-  $cwd = str_replace("\\","/",getcwd())."/";
-  
-	// Open a tidy process - I hope it's installed!
-	$descriptorspec = array(
-		0 => array("pipe", "r"),
-		1 => array("pipe", "w")
-	);
-	$process = @proc_open("tidy -utf8 -config {$cwd}html-tidy-config.cfg", $descriptorspec, $pipes);
-
-
-	// Make sure the program started and we got the hooks...
-	// Either way, get some source code into $source
-	if (is_resource($process)) {
-
-		// Feed untidy source into the stdin
-		fwrite($pipes[0], $source);
-		fclose($pipes[0]);
-
-		// Read clean source out to the browser
-		while (!feof($pipes[1])) {
-			//echo fgets($pipes[1], 1024);
-			$newsrc .= fgets($pipes[1], 1024);
-		}
-		fclose($pipes[1]);
-
-		// Clean up after ourselves
-		proc_close($process);
-
-	} else {
-    /* Use tidy if it's available from PECL */
-    if( function_exists('tidy_parse_string') )
-    {
-      $tempsrc = tidy_parse_string($source);
-      tidy_clean_repair();
-      $newsrc = tidy_get_output();
-    }
-    else
-    {
-      // Better give them back what they came with, so they don't lose it all...
-      $newsrc = "<body>\n" .$source. "\n</body>";
-    }
-	}
-
-	// Split our source into an array by lines
-	$srcLines = preg_split("/\n/",$newsrc,-1,PREG_SPLIT_NO_EMPTY);
-
-	// Get only the lines between the body tags
-	$startLn = 0;
-	while ( strpos( $srcLines[$startLn++], '<body' ) === false && $startLn < sizeof($srcLines) );
-	$endLn = $startLn;
-	while ( strpos( $srcLines[$endLn++], '</body' ) === false && $endLn < sizeof($srcLines) );
-
-	$srcLines = array_slice( $srcLines, $startLn, ($endLn - $startLn - 1) );
-
-	// Create a set of javascript code to compile a new source string
-	foreach ($srcLines as $line) {
-		$jsMakeSrc .= "\tns += '" . str_replace("'","\'",$line) . "\\n';\n";
-	}
-if(!sizeof($srcLines)) {
-    echo "alert(HTMLArea._lc('Tidy failed.  Check your HTML for syntax errors.', 'HtmlTidy'));\n";
-} else {
-?>
-var ns="";
-<?php echo $jsMakeSrc; ?>
-editor.setHTML(ns);
-<? } ?>
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/HtmlTidy/img/html-tidy.gif b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/HtmlTidy/img/html-tidy.gif
deleted file mode 100644
index 50cc6a7..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/HtmlTidy/img/html-tidy.gif
+++ /dev/null
Binary files differ
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/HtmlTidy/lang/b5.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/HtmlTidy/lang/b5.js
deleted file mode 100644
index 3de2062..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/HtmlTidy/lang/b5.js
+++ /dev/null
@@ -1,15 +0,0 @@
-// I18N constants
-// LANG: "b5", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "__OBSOLETE__": {
-        "___ TRANSLATOR NOTE   ___": "*** HTMLTIDY IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***"
-    }
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/HtmlTidy/lang/ch.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/HtmlTidy/lang/ch.js
deleted file mode 100644
index 49c8ace..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/HtmlTidy/lang/ch.js
+++ /dev/null
@@ -1,15 +0,0 @@
-// I18N constants
-// LANG: "ch", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "__OBSOLETE__": {
-        "___ TRANSLATOR NOTE   ___": "*** HTMLTIDY IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***"
-    }
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/HtmlTidy/lang/cz.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/HtmlTidy/lang/cz.js
deleted file mode 100644
index 95ae8c1..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/HtmlTidy/lang/cz.js
+++ /dev/null
@@ -1,15 +0,0 @@
-// I18N constants
-// LANG: "cz", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "__OBSOLETE__": {
-        "___ TRANSLATOR NOTE   ___": "*** HTMLTIDY IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***"
-    }
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/HtmlTidy/lang/da.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/HtmlTidy/lang/da.js
deleted file mode 100644
index d7a5494..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/HtmlTidy/lang/da.js
+++ /dev/null
@@ -1,16 +0,0 @@
-// I18N constants
-// LANG: "da", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Tidy failed.  Check your HTML for syntax errors.": "Tidy mislykkedes. Tjek din HTML for syntaksfejl.",
-    "__OBSOLETE__": {
-        "___ TRANSLATOR NOTE   ___": "*** HTMLTIDY IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***"
-    }
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/HtmlTidy/lang/de.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/HtmlTidy/lang/de.js
deleted file mode 100644
index 7f39de9..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/HtmlTidy/lang/de.js
+++ /dev/null
@@ -1,17 +0,0 @@
-// I18N constants
-// LANG: "de", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "HTML Tidy": "HTML Tidy",
-    "Tidy failed.  Check your HTML for syntax errors.": "Tidy fehlgeschlagen. Prüfen Sie den HTML Code nach Syntax-Fehlern.",
-    "__OBSOLETE__": {
-        "___ TRANSLATOR NOTE   ___": "*** HTMLTIDY IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***"
-    }
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/HtmlTidy/lang/ee.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/HtmlTidy/lang/ee.js
deleted file mode 100644
index 729da89..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/HtmlTidy/lang/ee.js
+++ /dev/null
@@ -1,15 +0,0 @@
-// I18N constants
-// LANG: "ee", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "__OBSOLETE__": {
-        "___ TRANSLATOR NOTE   ___": "*** HTMLTIDY IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***"
-    }
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/HtmlTidy/lang/el.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/HtmlTidy/lang/el.js
deleted file mode 100644
index 78d4cfe..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/HtmlTidy/lang/el.js
+++ /dev/null
@@ -1,15 +0,0 @@
-// I18N constants
-// LANG: "el", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "__OBSOLETE__": {
-        "___ TRANSLATOR NOTE   ___": "*** HTMLTIDY IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***"
-    }
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/HtmlTidy/lang/es.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/HtmlTidy/lang/es.js
deleted file mode 100644
index 9622038..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/HtmlTidy/lang/es.js
+++ /dev/null
@@ -1,15 +0,0 @@
-// I18N constants
-// LANG: "es", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "__OBSOLETE__": {
-        "___ TRANSLATOR NOTE   ___": "*** HTMLTIDY IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***"
-    }
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/HtmlTidy/lang/eu.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/HtmlTidy/lang/eu.js
deleted file mode 100644
index c056cb3..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/HtmlTidy/lang/eu.js
+++ /dev/null
@@ -1,15 +0,0 @@
-// I18N constants
-// LANG: "eu", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "__OBSOLETE__": {
-        "___ TRANSLATOR NOTE   ___": "*** HTMLTIDY IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***"
-    }
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/HtmlTidy/lang/fa.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/HtmlTidy/lang/fa.js
deleted file mode 100644
index 8caf203..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/HtmlTidy/lang/fa.js
+++ /dev/null
@@ -1,15 +0,0 @@
-// I18N constants
-// LANG: "fa", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "__OBSOLETE__": {
-        "___ TRANSLATOR NOTE   ___": "*** HTMLTIDY IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***"
-    }
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/HtmlTidy/lang/fi.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/HtmlTidy/lang/fi.js
deleted file mode 100644
index 2311a28..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/HtmlTidy/lang/fi.js
+++ /dev/null
@@ -1,15 +0,0 @@
-// I18N constants
-// LANG: "fi", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "__OBSOLETE__": {
-        "___ TRANSLATOR NOTE   ___": "*** HTMLTIDY IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***"
-    }
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/HtmlTidy/lang/fr.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/HtmlTidy/lang/fr.js
deleted file mode 100644
index 6d793a7..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/HtmlTidy/lang/fr.js
+++ /dev/null
@@ -1,16 +0,0 @@
-// I18N constants
-// LANG: "fr", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Auto-Tidy": "Tidy automatique",
-    "Don't Tidy": "Tidy non utilisé",
-    "HTML Tidy": "HTML Tidy",
-    "Tidy failed.  Check your HTML for syntax errors.": "Tidy a échoué. Vérifiez votre HTML for des erreurs de syntaxe"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/HtmlTidy/lang/fr_ca.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/HtmlTidy/lang/fr_ca.js
deleted file mode 100644
index 80a9bc7..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/HtmlTidy/lang/fr_ca.js
+++ /dev/null
@@ -1,15 +0,0 @@
-// I18N constants
-// LANG: "fr_ca", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "__OBSOLETE__": {
-        "___ TRANSLATOR NOTE   ___": "*** HTMLTIDY IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***"
-    }
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/HtmlTidy/lang/gb.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/HtmlTidy/lang/gb.js
deleted file mode 100644
index 923ac62..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/HtmlTidy/lang/gb.js
+++ /dev/null
@@ -1,15 +0,0 @@
-// I18N constants
-// LANG: "gb", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "__OBSOLETE__": {
-        "___ TRANSLATOR NOTE   ___": "*** HTMLTIDY IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***"
-    }
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/HtmlTidy/lang/he.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/HtmlTidy/lang/he.js
deleted file mode 100644
index ef67fd9..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/HtmlTidy/lang/he.js
+++ /dev/null
@@ -1,15 +0,0 @@
-// I18N constants
-// LANG: "he", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "__OBSOLETE__": {
-        "___ TRANSLATOR NOTE   ___": "*** HTMLTIDY IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***"
-    }
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/HtmlTidy/lang/hu.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/HtmlTidy/lang/hu.js
deleted file mode 100644
index dbbca85..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/HtmlTidy/lang/hu.js
+++ /dev/null
@@ -1,15 +0,0 @@
-// I18N constants
-// LANG: "hu", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "__OBSOLETE__": {
-        "___ TRANSLATOR NOTE   ___": "*** HTMLTIDY IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***"
-    }
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/HtmlTidy/lang/it.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/HtmlTidy/lang/it.js
deleted file mode 100644
index 02b7b0c..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/HtmlTidy/lang/it.js
+++ /dev/null
@@ -1,15 +0,0 @@
-// I18N constants
-// LANG: "it", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "__OBSOLETE__": {
-        "___ TRANSLATOR NOTE   ___": "*** HTMLTIDY IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***"
-    }
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/HtmlTidy/lang/ja.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/HtmlTidy/lang/ja.js
deleted file mode 100644
index a3a4328..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/HtmlTidy/lang/ja.js
+++ /dev/null
@@ -1,16 +0,0 @@
-// I18N constants
-// LANG: "ja", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Auto-Tidy": "自動適正化",
-    "Don't Tidy": "適正化しない",
-    "HTML Tidy": "HTML Tidy",
-    "Tidy failed.  Check your HTML for syntax errors.": "適正化に失敗しました。HTMLの文法エラーを確認してください。"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/HtmlTidy/lang/lc_base.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/HtmlTidy/lang/lc_base.js
deleted file mode 100644
index 098b9cf..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/HtmlTidy/lang/lc_base.js
+++ /dev/null
@@ -1,28 +0,0 @@
-// I18N constants
-//
-// LANG: "en", ENCODING: UTF-8
-// Author: Translator-Name, <email@example.com>
-//
-// Last revision: 2018-04-12
-// 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).
-//
-// (Please, remove information below)
-// 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.)
-
-{
-    "Auto-Tidy": "",
-    "Don't Tidy": "",
-    "HTML Tidy": "",
-    "Tidy failed.  Check your HTML for syntax errors.": ""
-}
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/HtmlTidy/lang/lt.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/HtmlTidy/lang/lt.js
deleted file mode 100644
index af45450..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/HtmlTidy/lang/lt.js
+++ /dev/null
@@ -1,15 +0,0 @@
-// I18N constants
-// LANG: "lt", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "__OBSOLETE__": {
-        "___ TRANSLATOR NOTE   ___": "*** HTMLTIDY IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***"
-    }
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/HtmlTidy/lang/lv.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/HtmlTidy/lang/lv.js
deleted file mode 100644
index a89de3d..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/HtmlTidy/lang/lv.js
+++ /dev/null
@@ -1,15 +0,0 @@
-// I18N constants
-// LANG: "lv", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "__OBSOLETE__": {
-        "___ TRANSLATOR NOTE   ___": "*** HTMLTIDY IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***"
-    }
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/HtmlTidy/lang/nb.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/HtmlTidy/lang/nb.js
deleted file mode 100644
index bd1dd71..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/HtmlTidy/lang/nb.js
+++ /dev/null
@@ -1,17 +0,0 @@
-// I18N constants
-// LANG: "nb", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "HTML Tidy": "HTML Tidy",
-    "Tidy failed.  Check your HTML for syntax errors.": "Tidy feilet. Sjekk HTML koden for syntaksfeil.",
-    "__OBSOLETE__": {
-        "___ TRANSLATOR NOTE   ___": "*** HTMLTIDY IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***"
-    }
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/HtmlTidy/lang/nl.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/HtmlTidy/lang/nl.js
deleted file mode 100644
index 193cfff..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/HtmlTidy/lang/nl.js
+++ /dev/null
@@ -1,16 +0,0 @@
-// I18N constants
-// LANG: "nl", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Tidy failed.  Check your HTML for syntax errors.": "Tidy mislukt. Controleer HTML op fouten.",
-    "__OBSOLETE__": {
-        "HT-html-tidy": "HTML opschonen"
-    }
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/HtmlTidy/lang/pl.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/HtmlTidy/lang/pl.js
deleted file mode 100644
index c3e291b..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/HtmlTidy/lang/pl.js
+++ /dev/null
@@ -1,15 +0,0 @@
-// I18N constants
-// LANG: "pl", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "__OBSOLETE__": {
-        "___ TRANSLATOR NOTE   ___": "*** HTMLTIDY IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***"
-    }
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/HtmlTidy/lang/pt_br.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/HtmlTidy/lang/pt_br.js
deleted file mode 100644
index 5264249..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/HtmlTidy/lang/pt_br.js
+++ /dev/null
@@ -1,16 +0,0 @@
-// I18N constants
-// LANG: "pt_br", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Auto-Tidy": "Auto-Tidy",
-    "Don't Tidy": "Sem Tidy",
-    "HTML Tidy": "HTML Tidy",
-    "Tidy failed.  Check your HTML for syntax errors.": "Tidy falhou. Verifique erros de sintaxe em seu HTML."
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/HtmlTidy/lang/ro.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/HtmlTidy/lang/ro.js
deleted file mode 100644
index 70e5a4f..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/HtmlTidy/lang/ro.js
+++ /dev/null
@@ -1,15 +0,0 @@
-// I18N constants
-// LANG: "ro", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "__OBSOLETE__": {
-        "___ TRANSLATOR NOTE   ___": "*** HTMLTIDY IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***"
-    }
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/HtmlTidy/lang/ru.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/HtmlTidy/lang/ru.js
deleted file mode 100644
index 2d40473..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/HtmlTidy/lang/ru.js
+++ /dev/null
@@ -1,15 +0,0 @@
-// I18N constants
-// LANG: "ru", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "__OBSOLETE__": {
-        "___ TRANSLATOR NOTE   ___": "*** HTMLTIDY IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***"
-    }
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/HtmlTidy/lang/sh.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/HtmlTidy/lang/sh.js
deleted file mode 100644
index 6acc3f1..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/HtmlTidy/lang/sh.js
+++ /dev/null
@@ -1,15 +0,0 @@
-// I18N constants
-// LANG: "sh", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "__OBSOLETE__": {
-        "___ TRANSLATOR NOTE   ___": "*** HTMLTIDY IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***"
-    }
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/HtmlTidy/lang/si.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/HtmlTidy/lang/si.js
deleted file mode 100644
index af536ab..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/HtmlTidy/lang/si.js
+++ /dev/null
@@ -1,15 +0,0 @@
-// I18N constants
-// LANG: "si", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "__OBSOLETE__": {
-        "___ TRANSLATOR NOTE   ___": "*** HTMLTIDY IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***"
-    }
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/HtmlTidy/lang/sr.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/HtmlTidy/lang/sr.js
deleted file mode 100644
index d1a7a80..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/HtmlTidy/lang/sr.js
+++ /dev/null
@@ -1,15 +0,0 @@
-// I18N constants
-// LANG: "sr", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "__OBSOLETE__": {
-        "___ TRANSLATOR NOTE   ___": "*** HTMLTIDY IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***"
-    }
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/HtmlTidy/lang/sv.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/HtmlTidy/lang/sv.js
deleted file mode 100644
index 305ab13..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/HtmlTidy/lang/sv.js
+++ /dev/null
@@ -1,15 +0,0 @@
-// I18N constants
-// LANG: "sv", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "__OBSOLETE__": {
-        "___ TRANSLATOR NOTE   ___": "*** HTMLTIDY IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***"
-    }
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/HtmlTidy/lang/th.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/HtmlTidy/lang/th.js
deleted file mode 100644
index 7f398ed..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/HtmlTidy/lang/th.js
+++ /dev/null
@@ -1,15 +0,0 @@
-// I18N constants
-// LANG: "th", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "__OBSOLETE__": {
-        "___ TRANSLATOR NOTE   ___": "*** HTMLTIDY IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***"
-    }
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/HtmlTidy/lang/tr.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/HtmlTidy/lang/tr.js
deleted file mode 100644
index 7ac6bdb..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/HtmlTidy/lang/tr.js
+++ /dev/null
@@ -1,15 +0,0 @@
-// I18N constants
-// LANG: "tr", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "__OBSOLETE__": {
-        "___ TRANSLATOR NOTE   ___": "*** HTMLTIDY IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***"
-    }
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/HtmlTidy/lang/vn.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/HtmlTidy/lang/vn.js
deleted file mode 100644
index ced8c16..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/HtmlTidy/lang/vn.js
+++ /dev/null
@@ -1,15 +0,0 @@
-// I18N constants
-// LANG: "vn", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "__OBSOLETE__": {
-        "___ TRANSLATOR NOTE   ___": "*** HTMLTIDY IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***"
-    }
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/HtmlTidy/lang/zh_cn.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/HtmlTidy/lang/zh_cn.js
deleted file mode 100644
index a8e6734..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/HtmlTidy/lang/zh_cn.js
+++ /dev/null
@@ -1,15 +0,0 @@
-// I18N constants
-// LANG: "zh_cn", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "__OBSOLETE__": {
-        "___ TRANSLATOR NOTE   ___": "*** HTMLTIDY IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***"
-    }
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ImageManager/Classes/Files.php b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ImageManager/Classes/Files.php
deleted file mode 100644
index 1bc9730..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ImageManager/Classes/Files.php
+++ /dev/null
@@ -1,333 +0,0 @@
-<?php
-/**
- * File Utilities.
- * @author $Author:koto $
- * @version $Id:Files.php 841 2007-05-27 13:31:51Z koto $
- * @package ImageManager
- */
-
-define('FILE_ERROR_NO_SOURCE', 100);
-define('FILE_ERROR_COPY_FAILED', 101);
-define('FILE_ERROR_DST_DIR_FAILED', 102);
-define('FILE_COPY_OK', 103);
-define('FILE_ERROR_DST_DIR_EXIST', 104);
-
-/**
- * File Utilities
- * @author $Author:koto $
- * @version $Id:Files.php 841 2007-05-27 13:31:51Z koto $
- * @package ImageManager
- * @subpackage files
- */
-class Files 
-{
-	
-	/**
-	 * Copy a file from source to destination. If unique == true, then if
-	 * the destination exists, it will be renamed by appending an increamenting 
-	 * counting number.
-	 * @param string $source where the file is from, full path to the files required
-	 * @param string $destination_file name of the new file, just the filename
-	 * @param string $destination_dir where the files, just the destination dir,
-	 * e.g., /www/html/gallery/
-	 * @param boolean $unique create unique destination file if true.
-	 * @return string the new copied filename, else error if anything goes bad.
-	 */
-	function copyFile($source, $destination_dir, $destination_file, $unique=true) 
-	{
-		if(!is_uploaded_file($source) && !(file_exists($source) && is_file($source))) 
-			return FILE_ERROR_NO_SOURCE;
-
-		$destination_dir = Files::fixPath($destination_dir);
-
-		if(!is_dir($destination_dir)) 
-			Return FILE_ERROR_DST_DIR_FAILED;
-
-		$filename = Files::escape($destination_file);
-
-		if($unique) 
-		{
-			$dotIndex = strrpos($destination_file, '.');
-			$ext = '';
-			if(is_int($dotIndex)) 
-			{
-				$ext = substr($destination_file, $dotIndex);
-				$base = substr($destination_file, 0, $dotIndex);
-			}
-			$counter = 0;
-			while(is_file($destination_dir.$filename)) 
-			{
-				$counter++;
-				$filename = $base.'_'.$counter.$ext;
-			}
-		}
-
-		if (!copy($source, $destination_dir.$filename))
-			return FILE_ERROR_COPY_FAILED;
-		
-		//verify that it copied, new file must exists
-		if (is_file($destination_dir.$filename))
-			Return $filename;
-		else
-			return FILE_ERROR_COPY_FAILED;
-	}
-
-	/**
-	 * Create a new folder.
-	 * @param string $newFolder specifiy the full path of the new folder.
-	 * @return boolean true if the new folder is created, false otherwise.
-	 */
-	function createFolder($newFolder) 
-	{
-		mkdir ($newFolder, 0777);
-		return chmod($newFolder, 0777);
-	}
-
-
-	/**
-	 * Escape the filenames, any non-word characters will be
-	 * replaced by an underscore.
-	 * @param string $filename the orginal filename
-	 * @return string the escaped safe filename
-	 */
-	function escape($filename)
-	{
-		Return preg_replace('/[^\w\._]/', '_', $filename);
-	}
-
-	/**
-	 * Delete a file.
-	 * @param string $file file to be deleted
-	 * @return boolean true if deleted, false otherwise.
-	 */
-	function delFile($file) 
-	{
-		if(is_file($file)) 
-			Return unlink($file);
-		else
-			Return false;
-	}
-
-	/**
-	 * Delete folder(s), can delete recursively.
-	 * @param string $folder the folder to be deleted.
-	 * @param boolean $recursive if true, all files and sub-directories
-	 * are delete. If false, tries to delete the folder, can throw
-	 * error if the directory is not empty.
-	 * @return boolean true if deleted.
-	 */
-	function delFolder($folder, $recursive=false) 
-	{
-		$deleted = true;
-		if($recursive) 
-		{
-			$d = dir($folder);
-			while (false !== ($entry = $d->read())) 
-			{
-				if ($entry != '.' && $entry != '..')
-				{
-					$obj = Files::fixPath($folder).$entry;
-					//var_dump($obj);
-					if (is_file($obj))
-					{
-						$deleted &= Files::delFile($obj);					
-					}
-					else if(is_dir($obj))
-					{
-						$deleted &= Files::delFolder($obj, $recursive);
-					}
-					
-				}
-			}
-			$d->close();
-
-		}
-
-		//$folder= $folder.'/thumbs';
-		//var_dump($folder);
-		if(is_dir($folder)) 
-			$deleted &= rmdir($folder);
-		else
-			$deleted &= false;
-
-		Return $deleted;
-	}
-
-	/**
-	 * Append a / to the path if required.
-	 * @param string $path the path
-	 * @return string path with trailing /
-	 */
-	function fixPath($path) 
-	{
-		//append a slash to the path if it doesn't exists.
-		if(!(substr($path,-1) == '/'))
-			$path .= '/';
-		Return $path;
-	}
-
-	/**
-	 * Concat two paths together. Basically $pathA+$pathB
-	 * @param string $pathA path one
-	 * @param string $pathB path two
-	 * @return string a trailing slash combinded path.
-	 */
-	function makePath($pathA, $pathB) 
-	{
-		$pathA = Files::fixPath($pathA);
-		if(substr($pathB,0,1)=='/')
-			$pathB = substr($pathB,1);
-		Return Files::fixPath($pathA.$pathB);
-	}
-
-	/**
-	 * Similar to makePath, but the second parameter
-	 * is not only a path, it may contain say a file ending.
-	 * @param string $pathA the leading path
-	 * @param string $pathB the ending path with file
-	 * @return string combined file path.
-	 */
-	function makeFile($pathA, $pathB) 
-	{		
-		$pathA = Files::fixPath($pathA);
-		if(substr($pathB,0,1)=='/')
-			$pathB = substr($pathB,1);
-		
-		Return $pathA.$pathB;
-	}
-
-	
-	/**
-	 * Format the file size, limits to Mb.
-	 * @param int $size the raw filesize
-	 * @return string formated file size.
-	 */
-	function formatSize($size) 
-	{
-		if($size < 1024) 
-			return $size.' bytes';	
-		else if($size >= 1024 && $size < 1024*1024) 
-			return sprintf('%01.2f',$size/1024.0).' KB';
-		else
-			return sprintf('%01.2f',$size/(1024.0*1024)).' MB';
-	}
-
-	/**
-	 * Returns size of a directory, with all file & subdirectory
-	 * sizes added up
-	 * @param string dir path
-	 * @return int
-	 */
-	function dirSize($dirName = '.')
-	{
-		$dir  = dir($dirName);
-		$size = 0;
-
-		while ($file = $dir->read()) {
-			if ($file != '.' && $file != '..')
-			{
-				if (is_dir("$dirName$file"))
-				{
-					$size += Files::dirSize($dirName . '/' . $file);
-				}
-				else
-				{
-					$size += filesize($dirName . '/' . $file);
-				}
-			}
-		}
-		$dir->close();
-		return $size;
-	}
-	
-	/**
-	 * Renames file, preserving its directory and extension
-	 * @param string $oldPath path to the old existing file
-	 * @param string new filename (just the name, without path or extension)
-	 * @author Krzysztof Kotowicz <koto@webworkers.pl>
-	 */
-	function renameFile($oldPath, $newName) {
-
-		if(!(file_exists($oldPath) && is_file($oldPath)))
-			return FILE_ERROR_NO_SOURCE;
-
-		$oldFileParts = pathinfo($oldPath);
-
-		$newPath = $oldFileParts['dirname'] . '/'
-				   . $newName
-				   . (!empty($oldFileParts['extension']) ? '.' . $oldFileParts['extension'] : '');
-
-		if (file_exists($newPath))
-			return false;
-
-		if (!rename($oldPath, $newPath))
-			return FILE_ERROR_COPY_FAILED;
-
-	}
-	
-	function rename ($oldPath,$newPath)
-	{
-		if(!(is_dir($oldPath) || is_file($oldPath)))
-			return FILE_ERROR_NO_SOURCE;
-		
-		if (file_exists($newPath))
-			return FILE_ERROR_DST_DIR_EXIST;
-
-		$ret = rename($oldPath, $newPath);
-		if (!$ret)
-			return FILE_ERROR_COPY_FAILED;
-		else return FILE_COPY_OK;
-	}
-	
-	/**
-	 * copy a directory and all subdirectories and files (recursive)
-	 * @author SBoisvert at Don'tSpamMe dot Bryxal dot ca (adapted from php.net)
-	 * @author Raimund Meyer
-	 * @param string base path
-	 * @param string source directory
-	 * @param string destination directory
-	 * @param bool   overwrite existing files
-	 *  
-	 * @return mixed bool true on pass, number on fail
-	 */
-  	function copyDir($basePath, $source, $dest, $overwrite = false)
-	{
-		if(!is_dir($basePath . $dest))
-		{
-			if (!@mkdir($basePath . $dest)) return FILE_ERROR_DST_DIR_FAILED;	
-		}
-		if($handle = opendir($basePath . $source))
-		{        // if the folder exploration is sucsessful, continue
-			while( ($file = readdir($handle)) !== false)
-			{ // as long as storing the next file to $file is successful, continue
-				if($file != '.' && $file != '..')
-				{
-					$path = $source . '/' . $file;
-					if(is_file($basePath . $path))
-					{
-						/*if(!is_file($basePath . $dest . '/' . $file) || $overwrite)
-						{
-							if(!@copy($basePath . $path, $basePath . $dest . '/' . $file))
-							{
-							  return FILE_ERROR_COPY_FAILED;
-							}
-						}*/
-						Files::copyFile($basePath . $path, $basePath . $dest . '/', $file, true);
-					} 
-					elseif(is_dir($basePath . $path))
-					{
-						if(!is_dir($basePath . $dest . '/' . $file))
-						{
-							mkdir($basePath . $dest . '/' . $file); // make subdirectory before subdirectory is copied
-							Files::copyDir($basePath, $path, $dest . '/' . $file, $overwrite); //recurse!
-						}
-					}
-				}
-			}
-			closedir($handle);
-		}
-		return true;
-	}
-}
-
-?>
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ImageManager/Classes/Flickr.php b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ImageManager/Classes/Flickr.php
deleted file mode 100644
index 1695534..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ImageManager/Classes/Flickr.php
+++ /dev/null
@@ -1,188 +0,0 @@
-<?php 
-/**
- * Simple functions to access the flickr API (yes I know this is the "Classes" directory and this isn't a class).
- * @author $Author: gogo $
- * @version $Id: images.php 877 2007-08-12 15:50:03Z gogo $
- * @package ImageManager
- */
- 
-require_once(dirname(__FILE__) . '/JSON_Compat.php');
-  
-function flickr_request($method, $params = array())
-{
-  global $IMConfig;
-  $flickr = "http://api.flickr.com/services/rest/?method={$method}&format=json&nojsoncallback=1&api_key=" . $IMConfig['Flickr']['Key'];
-  foreach($params as $k => $v)
-  {
-    $flickr .= "&{$k}=".rawurlencode($v);
-  }
-  
-  $feed = file_get_contents($flickr);
-  if($feed)
-  {
-    $feed = json_decode($feed, true);
-    if(!$feed || !isset($feed['stat']) || ($feed['stat'] != 'ok'))
-    {
-      print_r($params);
-      trigger_error($feed['message'], E_USER_ERROR);
-      return FALSE;
-    }
-  }    
-  else
-  {
-    trigger_error('Null response from Flickr', E_USER_ERROR);
-  }
-  
-  return $feed; 
-}
-
-function flickr_get_licenses()
-{
-  static $lics;
-  
-  if(!$lics) 
-  {
-    if(0 && isset($_SESSION['flickr_licenses']))
-    {
-      $lics = $_SESSION['flickr_licenses'];
-      return $lics;
-    }
-    
-    $lics = array();
-    $x = flickr_request('flickr.photos.licenses.getInfo');
-    $x = $x['licenses']['license'];
-    foreach($x as $l)
-    {
-      // Add out own descriptive "usage" text
-      switch($l['url'])
-      {        
-        case 'http://creativecommons.org/licenses/by/2.0/':
-        case 'http://creativecommons.org/licenses/by-sa/2.0/':
-          $l['usage'] = 'Attribution Required';
-          break;
-          
-        case 'http://creativecommons.org/licenses/by-nd/2.0/':
-          $l['usage'] = 'Attribution Required, No Modifications';
-          break;
-          
-        case 'http://creativecommons.org/licenses/by-nc-nd/2.0/':
-          $l['usage'] = 'Non Commercial ONLY, Attribution Required, No Modifications';
-          break;
-          
-        case 'http://creativecommons.org/licenses/by-nc/2.0/':          
-        case 'http://creativecommons.org/licenses/by-nc-sa/2.0/':
-          $l['usage'] = 'Non Commercial ONLY, Attribution Required';
-          break;
-          
-        default: 
-          $l['usage'] = 'Use ONLY Permitted With Written Permission';
-          break;
-      }
-      
-      // And our own identifier
-      switch($l['url'])
-      {        
-        case 'http://creativecommons.org/licenses/by/2.0/':
-          $l['x-id'] = 'cc2';
-          break;
-          
-        case 'http://creativecommons.org/licenses/by-sa/2.0/':
-          $l['x-id'] = 'ccsa2';
-          break;
-        
-        case 'http://creativecommons.org/licenses/by-nd/2.0/':
-          $l['x-id'] = 'ccnd2';
-          break;
-          
-        case 'http://creativecommons.org/licenses/by-nc-nd/2.0/':
-          $l['x-id'] = 'ccncnd2';
-          break;
-          
-        case 'http://creativecommons.org/licenses/by-nc/2.0/':          
-          $l['x-id'] = 'ccnc2';
-          break;
-          
-        case 'http://creativecommons.org/licenses/by-nc-sa/2.0/':
-          $l['x-id'] = 'ccncsa2';
-          break;
-          
-        default: 
-          $l['x-id'] = '';
-          break;
-      }
-      
-      $lics[$l['id']] = $l;      
-    }
-    
-    $_SESSION['flickr_licenses'] = $lics;
-  }
-  
-  return $lics;
-}
-
-function flickr_get_license_id_by_usage()
-{
-  $lics = flickr_get_licenses();
-  $use = array();
-  foreach($lics as $lic)
-  {
-    if(!isset($use[$lic['usage']]))
-    {
-      $use[$lic['usage']] = $lic['id'];
-    }
-    else
-    {
-      $use[$lic['usage']] .= "," . $lic['id'];
-    }
-  }
-  
-  return $use;
-}
-
-function flickr_is_default_license($licIDs)
-{
-  global $IMConfig;
-  $lics = flickr_get_licenses();
-  foreach($lics as $lic)
-  {
-    if($lic['url'] == $IMConfig['Flickr']['Default License'])
-    {
-      if(in_array($lic['id'], explode(',', $licIDs))) return TRUE; 
-    }
-  }
-  
-  return FALSE;
-}
-
-function flickr_get_default_usage_id()
-{
-  $usages = flickr_get_license_id_by_usage();
-  foreach($usages as $usage => $id)
-  {
-    if(flickr_is_default_license($id)) return $id;
-  }
-  
-  return 0;
-}
-
-function flickr_get_user_id($NameOrEmail)
-{
-  if(preg_match('/@/', $NameOrEmail))
-  {
-    $d = flickr_request('flickr.people.findByEmail', array('find_email' => $NameOrEmail));
-    if($d)
-    {
-     return $d['user']['id'];
-    }
-  }
-  else
-  {
-    $d = flickr_request('flickr.people.findByUsername', array('username' => $NameOrEmail));
-    if($d)
-    {
-      return $d['user']['id'];
-    }
-  }  
-}
-
-?>
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ImageManager/Classes/GD.php b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ImageManager/Classes/GD.php
deleted file mode 100644
index bb27331..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ImageManager/Classes/GD.php
+++ /dev/null
@@ -1,597 +0,0 @@
-<?php

-/***********************************************************************

-** Title.........:  GD Driver

-** Version.......:  1.0

-** Author........:  Xiang Wei ZHUO <wei@zhuo.org>

-** Filename......:  GD.php

-** Last changed..:  30 Aug 2003 

-** Notes.........:  Orginal is from PEAR

-**/

-// +----------------------------------------------------------------------+

-// | PHP Version 4                                                        |

-// +----------------------------------------------------------------------+

-// | Copyright (c) 1997-2002 The PHP Group                                |

-// +----------------------------------------------------------------------+

-// | This source file is subject to version 2.02 of the PHP license,      |

-// | that is bundled with this package in the file LICENSE, and is        |

-// | available at through the world-wide-web at                           |

-// | http://www.php.net/license/2_02.txt.                                 |

-// | If you did not receive a copy of the PHP license and are unable to   |

-// | obtain it through the world-wide-web, please send a note to          |

-// | license@php.net so we can mail you a copy immediately.               |

-// +----------------------------------------------------------------------+

-// | Authors: Peter Bowyer <peter@mapledesign.co.uk>                      |

-// |          Alan Knowles <alan@akbkhome.com>                            |

-// +----------------------------------------------------------------------+

-//

-//    Usage :

-//    $img    = new Image_Transform_GD();

-//    $angle  = -78;

-//    $img->load('magick.png');

-//

-//    if($img->rotate($angle,array('autoresize'=>true,'color_mask'=>array(255,0,0)))){

-//        $img->addText(array('text'=>"Rotation $angle",'x'=>0,'y'=>100,'font'=>'/usr/share/fonts/default/TrueType/cogb____.ttf'));

-//        $img->display();

-//    } else {

-//        echo "Error";

-//    }

-//

-//

-// $Id:GD.php 938 2008-01-22 20:13:47Z ray $

-//

-// Image Transformation interface using the GD library

-//

-

-require_once "../ImageManager/Classes/Transform.php";

-

-Class Image_Transform_Driver_GD extends Image_Transform

-{

-    /**

-     * Holds the image file for manipulation

-     */

-    var $imageHandle = '';

-

-    /**

-     * Holds the original image file

-     */

-    var $old_image = '';

-

-    /**

-     * Check settings

-     *

-     * @return mixed true or  or a PEAR error object on error

-     *

-     * @see PEAR::isError()

-     */

-    function Image_Transform_GD()

-    {

-        return;

-    } // End function Image

-

-    /**

-     * Load image

-     *

-     * @param string filename

-     *

-     * @return mixed none or a PEAR error object on error

-     * @see PEAR::isError()

-     */

-    function load($image)

-    {

-        $this->uid = md5($_SERVER['REMOTE_ADDR']);

-        $this->image = $image;

-        $this->_get_image_details($image);

-        $functionName = 'ImageCreateFrom' . $this->type;

-		

-		if(function_exists($functionName))

-		{

-			$this->imageHandle = $functionName($this->image);

-			if ( $this->type == 'png')

-			{

-				imageAlphaBlending($this->imageHandle, false);

-				imageSaveAlpha($this->imageHandle, true);

-			}

-		}

-    } // End load

-

-    /**

-     * addText

-     *

-     * @param   array   options     Array contains options

-     *                              array(

-     *                                  'text'  The string to draw

-     *                                  'x'     Horizontal position

-     *                                  'y'     Vertical Position

-     *                                  'Color' Font color

-     *                                  'font'  Font to be used

-     *                                  'size'  Size of the fonts in pixel

-     *                                  'resize_first'  Tell if the image has to be resized

-     *                                                  before drawing the text

-     *                              )

-     *

-     * @return none

-     * @see PEAR::isError()

-     */

-    function addText($params)

-    {

-        $default_params = array(

-                                'text' => 'This is Text',

-                                'x' => 10,

-                                'y' => 20,

-                                'color' => array(255,0,0),

-                                'font' => 'Arial.ttf',

-                                'size' => '12',

-                                'angle' => 0,

-                                'resize_first' => false // Carry out the scaling of the image before annotation?  Not used for GD

-                                );

-        $params = array_merge($default_params, $params);

-        extract($params);

-

-        if( !is_array($color) ){

-            if ($color[0]=='#'){

-                $this->colorhex2colorarray( $color );

-            } else {

-                include_once('Image/Transform/Driver/ColorsDefs.php');

-                $color = isset($colornames[$color])?$colornames[$color]:false;

-            }

-        }

-

-        $c = imagecolorresolve ($this->imageHandle, $color[0], $color[1], $color[2]);

-

-        if ('ttf' == substr($font, -3)) {

-            ImageTTFText($this->imageHandle, $size, $angle, $x, $y, $c, $font, $text);

-        } else {

-            ImagePSText($this->imageHandle, $size, $angle, $x, $y, $c, $font, $text);

-        }

-        return true;

-    } // End addText

-

-

-    /**

-     * Rotate image by the given angle

-     * Uses a fast rotation algorythm for custom angles

-     * or lines copy for multiple of 90 degrees

-     *

-     * @param int       $angle      Rotation angle

-     * @param array     $options    array(  'autoresize'=>true|false,

-     *                                      'color_mask'=>array(r,g,b), named color or #rrggbb

-     *                                   )

-     * @author Pierre-Alain Joye

-     * @return mixed none or a PEAR error object on error

-     * @see PEAR::isError()

-     */

-    function rotate($angle, $options=null)

-    {

-        if(function_exists('imagerotate')) {

-            $white = imagecolorallocatealpha ($this->imageHandle, 255, 255, 255, 127);

-			$this->imageHandle = imagerotate($this->imageHandle, $angle, $white);

-            return true;

-        }

-

-        if ( $options==null ){

-            $autoresize = true;

-            $color_mask = array(105,255,255);

-        } else {

-            extract( $options );

-        }

-

-        while ($angle <= -45) {

-            $angle  += 360;

-        }

-        while ($angle > 270) {

-            $angle  -= 360;

-        }

-

-        $t      = deg2rad($angle);

-

-        if( !is_array($color_mask) ){

-            if ($color[0]=='#'){

-                $this->colorhex2colorarray( $color_mask );

-            } else {

-                include_once('Image/Transform/Driver/ColorDefs.php');

-                $color = isset($colornames[$color_mask])?$colornames[$color_mask]:false;

-            }

-        }

-

-        // Do not round it, too much lost of quality

-        $cosT   = cos($t);

-        $sinT   = sin($t);

-

-        $img    =& $this->imageHandle;

-

-        $width  = $max_x  = $this->img_x;

-        $height = $max_y  = $this->img_y;

-        $min_y  = 0;

-        $min_x  = 0;

-

-        $x1     = round($max_x/2,0);

-        $y1     = round($max_y/2,0);

-

-        if ( $autoresize ){

-            $t      = abs($t);

-            $a      = round($angle,0);

-            switch((int)($angle)){

-                case 0:

-                        $width2     = $width;

-                        $height2    = $height;

-                    break;

-                case 90:

-                        $width2     = $height;

-                        $height2    = $width;

-                    break;

-                case 180:

-                        $width2     = $width;

-                        $height2    = $height;

-                    break;

-                case 270:

-                        $width2     = $height;

-                        $height2    = $width;

-                    break;

-                default:

-                    $width2     = (int)(abs(sin($t) * $height + cos($t) * $width));

-                    $height2    = (int)(abs(cos($t) * $height+sin($t) * $width));

-            }

-

-            $width2     -= $width2%2;

-            $height2    -= $height2%2;

-

-            $d_width    = abs($width - $width2);

-            $d_height   = abs($height - $height2);

-            $x_offset   = $d_width/2;

-            $y_offset   = $d_height/2;

-            $min_x2     = -abs($x_offset);

-            $min_y2     = -abs($y_offset);

-            $max_x2     = $width2;

-            $max_y2     = $height2;

-        }

-

-        $img2   = @$this->newImgPreserveAlpha( imagecreateTrueColor($width2,$height2) );

-

-        if ( !is_resource($img2) ){

-            return false;/*PEAR::raiseError('Cannot create buffer for the rotataion.',

-                                null, PEAR_ERROR_TRIGGER, E_USER_NOTICE);*/

-        }

-

-        $this->img_x = $width2;

-        $this->img_y = $height2;

-

-

-        imagepalettecopy($img2,$img);

-

-       $mask = imagecolorallocatealpha ($img2,$color_mask[0],$color_mask[1],$color_mask[2],127);

-        // use simple lines copy for axes angles

-        switch((int)($angle)){

-            case 0:

-                imagefill ($img2, 0, 0,$mask);

-                for ($y=0; $y < $max_y; $y++) {

-                    for ($x = $min_x; $x < $max_x; $x++){

-                        $c  = @imagecolorat ( $img, $x, $y);

-                        imagesetpixel($img2,$x+$x_offset,$y+$y_offset,$c);

-                    }

-                }

-                break;

-            case 90:

-                imagefill ($img2, 0, 0,$mask);

-                for ($x = $min_x; $x < $max_x; $x++){

-                    for ($y=$min_y; $y < $max_y; $y++) {

-                        $c  = imagecolorat ( $img, $x, $y);

-                        imagesetpixel($img2,$max_y-$y-1,$x,$c);

-                    }

-                }

-                break;

-            case 180:

-                imagefill ($img2, 0, 0,$mask);

-                for ($y=0; $y < $max_y; $y++) {

-                    for ($x = $min_x; $x < $max_x; $x++){

-                        $c  = @imagecolorat ( $img, $x, $y);

-                        imagesetpixel($img2, $max_x2-$x-1, $max_y2-$y-1, $c);

-                    }

-                }

-                break;

-            case 270:

-                imagefill ($img2, 0, 0,$mask);

-                for ($y=0; $y < $max_y; $y++) {

-                    for ($x = $max_x; $x >= $min_x; $x--){

-                        $c  = @imagecolorat ( $img, $x, $y);

-                        imagesetpixel($img2,$y,$max_x-$x-1,$c);

-                    }

-                }

-                break;

-            // simple reverse rotation algo

-            default:

-                $i=0;

-                for ($y = $min_y2; $y < $max_y2; $y++){

-

-                    // Algebra :)

-                    $x2 = round((($min_x2-$x1) * $cosT) + (($y-$y1) * $sinT + $x1),0);

-                    $y2 = round((($y-$y1) * $cosT - ($min_x2-$x1) * $sinT + $y1),0);

-

-                    for ($x = $min_x2; $x < $max_x2; $x++){

-

-                        // Check if we are out of original bounces, if we are

-                        // use the default color mask

-                        if ( $x2>=0 && $x2<$max_x && $y2>=0 && $y2<$max_y ){

-                            $c  = imagecolorat ( $img, $x2, $y2);

-                        } else {

-                            $c  = $mask;

-                        }

-                        imagesetpixel($img2,$x+$x_offset,$y+$y_offset,$c);

-

-                        // round verboten!

-                        $x2  += $cosT;

-                        $y2  -= $sinT;

-                    }

-                }

-                break;

-        }

-        $this->old_image    = $this->imageHandle;

-        $this->imageHandle  =  $img2;

-        return true;

-    }

-

-

-   /**

-    * Resize Action

-    *

-    * For GD 2.01+ the new copyresampled function is used

-    * It uses a bicubic interpolation algorithm to get far

-    * better result.

-    *

-    * @param int  $new_x new width

-    * @param int  $new_y new height

-    *

-    * @return true on success or pear error

-    * @see PEAR::isError()

-    */

-    function _resize($new_x, $new_y) {

-        if ($this->resized === true) {

-            return false; /*PEAR::raiseError('You have already resized the image without saving it.  Your previous resizing will be overwritten', null, PEAR_ERROR_TRIGGER, E_USER_NOTICE);*/

-        }

-        if(function_exists('ImageCreateTrueColor')){

-           $new_img = $this->newImgPreserveAlpha( ImageCreateTrueColor($new_x,$new_y) );

-        } else {

-            $new_img =ImageCreate($new_x,$new_y);

-        }

-

-        if(function_exists('ImageCopyResampled')){

-            ImageCopyResampled($new_img, $this->imageHandle, 0, 0, 0, 0, $new_x, $new_y, $this->img_x, $this->img_y);

-        } else {

-            ImageCopyResized($new_img, $this->imageHandle, 0, 0, 0, 0, $new_x, $new_y, $this->img_x, $this->img_y);

-        }

-

-        $this->old_image = $this->imageHandle;

-        $this->imageHandle = $new_img;

-        $this->resized = true;

-

-        $this->new_x = $new_x;

-        $this->new_y = $new_y;

-        return true;

-    }

-

-    /**

-     * Crop the image

-     *

-     * @param int $crop_x left column of the image

-     * @param int $crop_y top row of the image

-     * @param int $crop_width new cropped image width

-     * @param int $crop_height new cropped image height

-     */

-    function crop($new_x, $new_y, $new_width, $new_height) 

-    {

-        if(function_exists('ImageCreateTrueColor')){

-            $new_img =  $this->newImgPreserveAlpha(ImageCreateTrueColor($new_width,$new_height));

-        } else {

-            $new_img =ImageCreate($new_width,$new_height);

-        }

-        if(function_exists('ImageCopyResampled')){

-            ImageCopyResampled($new_img, $this->imageHandle, 0, 0, $new_x, $new_y,$new_width,$new_height,$new_width,$new_height);

-        } else {

-            ImageCopyResized($new_img, $this->imageHandle, 0, 0, $new_x, $new_y, $new_width,$new_height,$new_width,$new_height);

-        }

-        $this->old_image = $this->imageHandle;

-        $this->imageHandle = $new_img;

-        $this->resized = true;

-

-        $this->new_x = $new_x;

-        $this->new_y = $new_y;

-        return true;

-    }

-   

-    /**

-     * Flip the image horizontally or vertically

-     *

-     * @param boolean $horizontal true if horizontal flip, vertical otherwise

-     */

-    function flip($horizontal)

-    {

-        if(!$horizontal) {

-            $this->rotate(180);

-        }

-

-        $width = imagesx($this->imageHandle); 

-        $height = imagesy($this->imageHandle); 

-

-        for ($j = 0; $j < $height; $j++) { 

-                $left = 0; 

-                $right = $width-1; 

-

-

-                while ($left < $right) { 

-                    //echo " j:".$j." l:".$left." r:".$right."\n<br>";

-                    $t = imagecolorat($this->imageHandle, $left, $j); 

-                    imagesetpixel($this->imageHandle, $left, $j, imagecolorat($this->imageHandle, $right, $j)); 

-                    imagesetpixel($this->imageHandle, $right, $j, $t); 

-                    $left++; $right--; 

-                } 

-            

-        }

-

-        return true;

-    }

-

-

-    /**

-     * Adjust the image gamma

-     *

-     * @param float $outputgamma

-     *

-     * @return none

-     */

-    function gamma($outputgamma=1.0) {

-        ImageGammaCorrect($this->imageHandle, 1.0, $outputgamma);

-    }

-	function paletteToTrueColorWithTransparency()

-	{

-		$oldImg = $this->imageHandle;

-		$newImg = $this->newImgPreserveAlpha( imagecreatetruecolor($this->img_x,$this->img_y) );

-		imagecopy($newImg,$oldImg,0,0,0,0,$this->img_x,$this->img_y);

-

-		$this->imageHandle = $newImg;

-	}

-	

-	function newImgPreserveAlpha($newImg)

-	{

-		if ( $this->type == 'jpeg') return $newImg;

-		

-		// Turn off transparency blending (temporarily)

-		imagealphablending($newImg, false);

-		

-		// Create a new transparent color for image

-		if ( $transparent = imagecolortransparent($this->imageHandle) >= 0 )

-		{

-			if (imageistruecolor($this->imageHandle))

-			{

-				$red = ($transparent & 0xFF0000) >> 16;

-				$green = ($transparent & 0x00FF00) >> 8;

-				$blue = ($transparent & 0x0000FF);

-				$color_values = array('red' => $red, 'green' => $green, 'blue' => $blue);

-			}

-			else

-			{

-				$color_values = imagecolorsforindex($this->imageHandle,$transparent);

-

-			}

-			$color_values = imagecolorsforindex($this->imageHandle,$transparent);

-			$color = imagecolorallocatealpha($newImg, $color_values['red'],$color_values['green'],$color_values['blue'], 127);

-			$colort = imagecolorallocate($newImg, $color_values['red'],$color_values['green'],$color_values['blue']);

-		}

-		else

-		{

-			$color = imagecolorallocatealpha($newImg, 252, 2, 252, 127);

-			$colort = imagecolorallocate($newImg, 252, 2, 252);

-		}

-		imagecolortransparent($newImg,$colort);

-		

-		// Completely fill the background of the new image with allocated color.

-		imagefill($newImg, 0, 0, $color);

-		

-		// Restore transparency blending

-		imagesavealpha($newImg, true);

-		

-		return $newImg;

-	}

-	

-	function preserveTransparencyForPalette()

-	{

-		$new_img = imagecreatetruecolor($this->img_x,$this->img_y);

-		$truecolor = imageistruecolor($this->imageHandle);

-		$transparent = imagecolorallocate($new_img, 252,2,252); // nasty pinkish purple that hopefully doesn't exist in the image

-

-		imagecolortransparent($new_img, $transparent);

-		for ($i=0;$i<$this->img_y;$i++)

-		{

-			for ($j=0;$j<$this->img_x;$j++)

-			{

-				$c = imagecolorat($this->imageHandle,$j, $i);

-				if ($truecolor)

-				{

-					$a = ($c >> 24) & 0xFF;

-					$r = ($c >> 16) & 0xFF;

-					$g = ($c >> 8) & 0xFF;

-					$b = $c & 0xFF;

-					$color_values = array('red' => $r, 'green' => $g, 'blue' => $b, 'alpha' => $a);

-				}

-				else

-				{

-					$color_values = imagecolorsforindex($this->imageHandle,$c);

-				}

-				if ($color_values['alpha'] >= 126)

-				{

-					imagesetpixel($new_img, $j, $i, $transparent);

-				}

-				else

-				{

-					imagesetpixel($new_img, $j, $i, $c);

-				}

-			}

-		}

-		$this->imageHandle = $new_img;

-	}

-

-    /**

-     * Save the image file

-     *

-     * @param string  $filename the name of the file to write to

-     * @param int     $quality  output DPI, default is 85

-     * @param string  $types    define the output format, default

-     *                          is the current used format

-     *

-     * @return none

-     */

-    function save($filename, $type = '', $quality = 85)

-    {

-		$type           = $type==''? $this->type : $type;

-		$functionName   = 'image' . $type;

-

-		if(function_exists($functionName))

-		{

-			$this->old_image = $this->imageHandle;

-			if($type=='jpeg')

-				$functionName($this->imageHandle, $filename, $quality);

-			else

-				$functionName($this->imageHandle, $filename);

-			$this->imageHandle = $this->old_image;

-			$this->resized = false;

-		}

-    } // End save

-

-

-    /**

-     * Display image without saving and lose changes

-     *

-     * @param string type (JPG,PNG...);

-     * @param int quality 75

-     *

-     * @return none

-     */

-    function display($type = '', $quality = 75)

-    {

-        if ($type != '') {

-            $this->type = $type;

-        }

-        $functionName = 'Image' . $this->type;

-		if(function_exists($functionName))

-		{

-			header('Content-type: image/' . strtolower($this->type));

-			$functionName($this->imageHandle, '', $quality);

-			$this->imageHandle = $this->old_image;

-			$this->resized = false;

-			ImageDestroy($this->old_image);

-			$this->free();

-		}

-    }

-

-    /**

-     * Destroy image handle

-     *

-     * @return none

-     */

-    function free()

-    {

-        if ($this->imageHandle){

-            ImageDestroy($this->imageHandle);

-        }

-    }

-

-} // End class ImageGD

-?>

diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ImageManager/Classes/IM.php b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ImageManager/Classes/IM.php
deleted file mode 100644
index 0a71705..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ImageManager/Classes/IM.php
+++ /dev/null
@@ -1,239 +0,0 @@
-<?php

-

-/***********************************************************************

-** Title.........:  ImageMagick Driver

-** Version.......:  1.0

-** Author........:  Xiang Wei ZHUO <wei@zhuo.org>

-** Filename......:  IM.php

-** Last changed..:  30 Aug 2003 

-** Notes.........:  Orginal is from PEAR

-**/

-

-// +----------------------------------------------------------------------+

-// | PHP Version 4                                                        |

-// +----------------------------------------------------------------------+

-// | Copyright (c) 1997-2002 The PHP Group                                |

-// +----------------------------------------------------------------------+

-// | This source file is subject to version 2.02 of the PHP license,      |

-// | that is bundled with this package in the file LICENSE, and is        |

-// | available at through the world-wide-web at                           |

-// | http://www.php.net/license/2_02.txt.                                 |

-// | If you did not receive a copy of the PHP license and are unable to   |

-// | obtain it through the world-wide-web, please send a note to          |

-// | license@php.net so we can mail you a copy immediately.               |

-// +----------------------------------------------------------------------+

-// | Authors: Peter Bowyer <peter@mapledesign.co.uk>                      |

-// +----------------------------------------------------------------------+

-//

-// $Id:IM.php 937 2008-01-20 23:13:25Z ray $

-//

-// Image Transformation interface using command line ImageMagick

-//

-

-require_once "../ImageManager/Classes/Transform.php";

-

-Class Image_Transform_Driver_IM extends Image_Transform

-{

-    /**

-     * associative array commands to be executed

-     * @var array

-     */

-    var $command = array();

-

-    /**

-     *

-     *

-     */

-    function Image_Transform_Driver_IM()

-    {

-        return true;

-    } // End Image_IM

-

-    /**

-     * Load image

-     *

-     * @param string filename

-     *

-     * @return mixed none or a PEAR error object on error

-     * @see PEAR::isError()

-     */

-    function load($image)

-    {

-

-        $this->uid = md5($_SERVER['REMOTE_ADDR']);

-        /*if (!file_exists($image)) {

-            return PEAR::raiseError('The image file ' . $image . ' does\'t exist', true);

-        }*/

-        $this->image = $image;

-        $this->_get_image_details($image);

-    } // End load

-

-    /**

-     * Resize Action

-     *

-     * @param int   new_x   new width

-     * @param int   new_y   new height

-     *

-     * @return none

-     * @see PEAR::isError()

-     */

-    function _resize($new_x, $new_y)

-    {

-        /*if (isset($this->command['resize'])) {

-            return PEAR::raiseError("You cannot scale or resize an image more than once without calling save or display", true);

-        }*/

-        $this->command['resize'] = "-geometry ${new_x}x${new_y}!";

-

-        $this->new_x = $new_x;

-        $this->new_y = $new_y;

-    } // End resize

-

-    /**

-     * Crop the image

-     *

-     * @param int $crop_x left column of the image

-     * @param int $crop_y top row of the image

-     * @param int $crop_width new cropped image width

-     * @param int $crop_height new cropped image height

-     */

-    function crop($crop_x, $crop_y, $crop_width, $crop_height) 

-    {

-        $this->command['crop'] = "-crop {$crop_width}x{$crop_height}+{$crop_x}+{$crop_y}";

-    }

-

-    /**

-     * Flip the image horizontally or vertically

-     *

-     * @param boolean $horizontal true if horizontal flip, vertical otherwise

-     */

-    function flip($horizontal) 

-    {

-        if($horizontal)

-            $this->command['flop'] = "-flop";

-        else

-            $this->command['flip'] = "-flip";

-    }

-    /**

-     * rotate

-     *

-     * @param   int     angle   rotation angle

-     * @param   array   options no option allowed

-     *

-     */

-    function rotate($angle, $options=null)

-    {

-        if ('-' == $angle{0}) {

-            $angle = 360 - substr($angle, 1);

-        }

-         $this->command['rotate'] = "-rotate $angle";

-    } // End rotate

-

-    /**

-     * addText

-     *

-     * @param   array   options     Array contains options

-     *                              array(

-     *                                  'text'  The string to draw

-     *                                  'x'     Horizontal position

-     *                                  'y'     Vertical Position

-     *                                  'Color' Font color

-     *                                  'font'  Font to be used

-     *                                  'size'  Size of the fonts in pixel

-     *                                  'resize_first'  Tell if the image has to be resized

-     *                                                  before drawing the text

-     *                              )

-     *

-     * @return none

-     * @see PEAR::isError()

-     */

-    function addText($params)

-    {

-        $default_params = array(

-                                'text' => 'This is Text',

-                                'x' => 10,

-                                'y' => 20,

-                                'color' => 'red',

-                                'font' => 'Arial.ttf',

-                                'resize_first' => false // Carry out the scaling of the image before annotation?

-                                );

-         $params = array_merge($default_params, $params);

-         extract($params);

-         if (true === $resize_first) {

-             // Set the key so that this will be the last item in the array

-            $key = 'ztext';

-         } else {

-            $key = 'text';

-         }

-         $this->command[$key] = "-font $font -fill $color -draw 'text $x,$y \"$text\"'";

-         // Producing error: gs: not found gs: not found convert: Postscript delegate failed [No such file or directory].

-    } // End addText

-

-    /**

-     * Adjust the image gamma

-     *

-     * @param float $outputgamma

-     *

-     * @return none

-     */

-    function gamma($outputgamma=1.0) {

-        $this->command['gamma'] = "-gamma $outputgamma";

-    }

-	

-	function reduce_colors($number = 256)

-	{

-		 $this->command['colors'] = "-colors $number";

-	}

-    /**

-     * Save the image file

-     *

-     * @param string  $filename the name of the file to write to

-     * @param quality $quality  image dpi, default=75

-     * @param string  $type     (JPG,PNG...)

-     *

-     * @return none

-     */

-    function save($filename, $type='', $quality = 85)

-    {

-        $type == '' ? $this->type : $type;

-        $cmd = '' . IMAGE_TRANSFORM_LIB_PATH . 'convert ';

-		$cmd .= implode(' ', $this->command) . " -quality $quality ";

-		$cmd .= '"'.($this->image) . '" "' . ($filename) . '"';

-        

-        //$cmd = str_replace('/', '\\', $cmd);

-		//echo($cmd.'<br>');

-        exec($cmd,$retval);

-		//error_log('IM '.print_r($retval,true));

-    } // End save

-

-    /**

-     * Display image without saving and lose changes

-     *

-     * @param string type (JPG,PNG...);

-     * @param int quality 75

-     *

-     * @return none

-     */

-    function display($type = '', $quality = 75)

-    {

-        if ($type == '') {

-            header('Content-type: image/' . $this->type);

-            passthru(IMAGE_TRANSFORM_LIB_PATH . '  ' . implode(' ', $this->command) . " -quality $quality "  . escapeshellarg($this->image) . ' ' . strtoupper($this->type) . ":-");

-        } else {

-            header('Content-type: image/' . $type);

-            passthru(IMAGE_TRANSFORM_LIB_PATH . 'convert ' . implode(' ', $this->command) . " -quality $quality "  . escapeshellarg($this->image) . ' ' . strtoupper($type) . ":-");

-        }

-    }

-

-

-    /**

-     * Destroy image handle

-     *

-     * @return none

-     */

-    function free()

-    {

-        return true;

-    }

-

-} // End class ImageIM

-?>

diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ImageManager/Classes/ImageEditor.php b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ImageManager/Classes/ImageEditor.php
deleted file mode 100644
index 0df8c99..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ImageManager/Classes/ImageEditor.php
+++ /dev/null
@@ -1,502 +0,0 @@
-<?php

-/**

- * Image Editor. Editing tools, crop, rotate, scale and save.

- * @author $Author:ray $

- * @version $Id:ImageEditor.php 938 2008-01-22 20:13:47Z ray $

- * @package ImageManager

- */

-

-require_once('../ImageManager/Classes/Transform.php');

-

-/**

- * Handles the basic image editing capbabilities.

- * @author $Author:ray $

- * @version $Id:ImageEditor.php 938 2008-01-22 20:13:47Z ray $

- * @package ImageManager

- * @subpackage Editor

- */

-class ImageEditor 

-{

-	/**

-	 * ImageManager instance.

-	 */

-	var $manager;

-

-	/**

-	 * user based on IP address

-	 */

-	var $_uid;

-

-	/**

-	 * tmp file storage time.

-	 */

-	var $lapse_time =900; //15 mins

-

-	var $filesaved = 0;

-

-	/**

-	 * Create a new ImageEditor instance. Editing requires a 

-	 * tmp file, which is saved in the current directory where the

-	 * image is edited. The tmp file is assigned by md5 hash of the

-	 * user IP address. This hashed is used as an ID for cleaning up

-	 * the tmp files. In addition, any tmp files older than the

-	 * the specified period will be deleted.

-	 * @param ImageManager $manager the image manager, we need this

-	 * for some file and path handling functions.

-	 */

-	function ImageEditor($manager) 

-	{

-		$this->manager = $manager;

-		$this->_uid = md5($_SERVER['REMOTE_ADDR']);

-	}

-	

-	/**

-	 * Did we save a file?

-	 * @return int 1 if the file was saved sucessfully, 

-	 * 0 no save operation, -1 file save error.

-	 */

-	function isFileSaved() 

-	{

-		Return $this->filesaved;

-	}

-

-	/**

-	 * Process the image, if not action, just display the image.

-	 * @return array with image information, empty array if not an image.

-	 * <code>array('src'=>'url of the image', 'dimensions'=>'width="xx" height="yy"',

-	 * 'file'=>'image file, relative', 'fullpath'=>'full path to the image');</code>

-	 */

-	function processImage() 

-	{

-		if(isset($_GET['img']))

-			$relative = rawurldecode($_GET['img']);

-		else

-			Return array();

-		

-		//$relative = '/Series2004NoteFront.jpg';

-

-		$imgURL = $this->manager->getFileURL($relative);

-		$fullpath = $this->manager->getFullPath($relative);

-		

-		$imgInfo = @getImageSize($fullpath);

-		if(!is_array($imgInfo))

-			Return array();

-

-		$action = $this->getAction();

-

-		if(!is_null($action))

-		{

-			$image = $this->processAction($action, $relative, $fullpath);

-		}

-		else

-		{

-			$image['src'] = $imgURL;

-			$image['dimensions'] = $imgInfo[3];

-			$image['file'] = $relative;

-			$image['fullpath'] = $fullpath;

-			$image['filesize'] = @filesize($fullpath);

-		}

-

-		Return $image;

-	}

-

-	/**

-	 * Process the actions, crop, scale(resize), rotate, flip, and save.

-	 * When ever an action is performed, the result is save into a

-	 * temporary image file, see createUnique on the filename specs.

-	 * It does not return the saved file, alway returning the tmp file.

-	 * @param string $action, should be 'crop', 'scale', 'rotate','flip', or 'save'

-	 * @param string $relative the relative image filename

-	 * @param string $fullpath the fullpath to the image file

-	 * @return array with image information

-	 * <code>array('src'=>'url of the image', 'dimensions'=>'width="xx" height="yy"',

-	 * 'file'=>'image file, relative', 'fullpath'=>'full path to the image');</code>

-	 */

-	function processAction($action, $relative, $fullpath) 

-	{

-		$params = '';

-		

-		if(isset($_GET['params']))

-			$params = $_GET['params'];

-

-		$values =  explode(',',$params);

-		$saveFile = $this->getSaveFileName($values[0]);

-

-		$img = Image_Transform::factory(IMAGE_CLASS);

-		$img->load($fullpath);

-		

-		if ( is_callable( array($img,'paletteToTrueColorWithTransparency')) && !imageistruecolor($img->imageHandle))

-		{

-			$img->paletteToTrueColorWithTransparency();

-		}

-		switch ($action) 

-		{

-			case 'crop':

-				$img->crop(intval($values[0]),intval($values[1]),

-							intval($values[2]),intval($values[3]));

-			break;

-			case 'scale':

-				$img->resize(intval($values[0]),intval($values[1]));

-				break;

-			case 'rotate':

-				$img->rotate(floatval($values[0]));

-				break;

-			case 'flip':

-				if ($values[0] == 'hoz')

-					$img->flip(true);

-				else if($values[0] == 'ver') 

-					$img->flip(false);

-				break;

-			case 'save':

-				if(!is_null($saveFile))

-				{

-					$quality = intval($values[1]);

-		            if($quality <0) $quality = 85;

-					$newSaveFile = $this->makeRelative($relative, $saveFile);

-					$newSaveFile = $this->getUniqueFilename($newSaveFile);

-					

-					//get unique filename just returns the filename, so

-					//we need to make the relative path once more.

-					$newSaveFile = $this->makeRelative($relative, $newSaveFile);

-          			$image['saveFile'] = $newSaveFile;

-					$newSaveFullpath = $this->manager->getFullPath($newSaveFile);

-					if ( $values[0] == 'gif' && is_callable(array($img, 'preserveTransparencyForPalette')))

-					{

-						$img->preserveTransparencyForPalette();

-					}

-					$img->save($newSaveFullpath, $values[0], $quality);

-					if(is_file($newSaveFullpath))

-						$this->filesaved = 1;

-					else

-						$this->filesaved = -1;

-				}

-				break;

-				case 'preview':

-					$quality = intval($values[1]);

-					

-					

-					$image['file'] = $relative;

-					$image['fullpath'] = $fullpath;

-					

-					//create the tmp image file

-					$filename = $this->createUnique($fullpath);

-					$newRelative = $this->makeRelative($relative, $filename);

-					$newFullpath = $this->manager->getFullPath($newRelative);

-					$newURL = $this->manager->getFileURL($newRelative);

-					

-					

-					if ( $values[0] == 'gif' && is_callable(array($img, 'preserveTransparencyForPalette')))

-					{

-						$img->preserveTransparencyForPalette();

-					}

-					$img->save($newFullpath, $values[0] );

-					$img->free();

-			

-					//get the image information

-					$imgInfo = @getimagesize($newFullpath);

-				

-					$image['src'] = $newURL;

-			    	$image['width'] = $imgInfo[0];

-			   		$image['height'] = $imgInfo[1];

-					$image['dimensions'] = $imgInfo[3];

-					$image['file'] = $relative;

-					$image['fullpath'] = $fullpath;

-					$image['filesize'] = @filesize($newFullpath);

-

-					Return $image;

-	

-				break;

-		}

-		

-		//create the tmp image file

-		$filename = $this->createUnique($fullpath);

-		$newRelative = $this->makeRelative($relative, $filename);

-		$newFullpath = $this->manager->getFullPath($newRelative);

-		$newURL = $this->manager->getFileURL($newRelative);

-

-		//save the file.

-		$img->save($newFullpath, 'png' );

-		$img->free();

-

-		//get the image information

-		$imgInfo = @getimagesize($newFullpath);

-

-		$image['src'] = $newURL;

-    	$image['width'] = $imgInfo[0];

-   		$image['height'] = $imgInfo[1];

-		$image['dimensions'] = $imgInfo[3];

-		$image['file'] = $newRelative;

-		$image['fullpath'] = $newFullpath;

-		$image['filesize'] = @filesize($newFullpath);

-		$image['type'] = image_type_to_mime_type($imgInfo[2]);

-		

-		Return $image;

-	

-	}

-

-	/**

-	 * Get the file name base on the save name

-	 * and the save type.

-	 * @param string $type image type, 'jpeg', 'png', or 'gif'

-	 * @return string the filename according to save type

-	 */

-	function getSaveFileName($type) 

-	{

-		if(!isset($_GET['file']))

-			Return null;

-

-		$filename = Files::escape(rawurldecode($_GET['file']));

-		$index = strrpos($filename,'.');

-		$base = substr($filename,0,$index);

-		$ext = strtolower(substr($filename,$index+1,strlen($filename)));

-

-		if($type == 'jpeg' && !($ext=='jpeg' || $ext=='jpg'))

-		{

-			Return $base.'.jpeg';

-		}

-		if($type=='png' && $ext != 'png')

-			Return $base.'.png';

-		if($type=='gif' && $ext != 'gif')

-			Return $base.'.gif';

-

-    // Ensure type is in acceptable image types

-    $valid_extensions = $this->manager->config['allowed_image_extensions'];    

-    if(!in_array($ext, $valid_extensions))

-		{

-      return $base . ".".strtolower($type ? $type : 'jpg');

-		}

-    

-		Return $filename;

-	}

-

-	/**

-	 * Get the default save file name, used by editor.php.

-	 * @return string a suggestive filename, this should be unique

-	 */

-	function getDefaultSaveFile() 

-	{

-		if(isset($_GET['img']))

-			$relative = rawurldecode($_GET['img']);

-		else

-			Return null;

-

-		Return $this->getUniqueFilename($relative);

-	}

-

-	/**

-	 * Get a unique filename. If the file exists, the filename

-	 * base is appended with an increasing integer.

-	 * @param string $relative the relative filename to the base_dir

-	 * @return string a unique filename in the current path

-	 */

-	function getUniqueFilename($relative) 

-	{

-		$fullpath = $this->manager->getFullPath($relative);

-		

-		$pathinfo = pathinfo($fullpath);

-

-		$path = Files::fixPath($pathinfo['dirname']);

-		$file = Files::escape($pathinfo['basename']);

-		

-		$filename = $file;

-

-		$dotIndex = strrpos($file, '.');

-		$ext = '';

-

-		if(is_int($dotIndex)) 

-		{

-			$ext = substr($file, $dotIndex);

-			$base = substr($file, 0, $dotIndex);

-		}

-

-		$counter = 0;

-		while(is_file($path.$filename)) 

-		{

-			$counter++;

-			$filename = $base.'_'.$counter.$ext;

-		}

-		

-		Return $filename;

-		

-	}

-

-	/**

-	 * Specifiy the original relative path, a new filename

-	 * and return the new filename with relative path.

-	 * i.e. $pathA (-filename) + $file

-	 * @param string $pathA the relative file

-	 * @param string $file the new filename

-	 * @return string relative path with the new filename

-	 */

-	function makeRelative($pathA, $file) 

-	{

-		$index = strrpos($pathA,'/');

-		if(!is_int($index))

-			Return $file;

-

-		$path = substr($pathA, 0, $index);

-		Return Files::fixPath($path).$file;

-	}

-

-	/**

-	 * Get the action GET parameter

-	 * @return string action parameter

-	 */

-	function getAction() 

-	{

-		$action = null;

-		if(isset($_GET['action']))

-			$action = $_GET['action'];

-		Return $action;

-	}

-

-	/**

-	 * Generate a unique string based on md5(microtime()).

-	 * Well not so uniqe, as it is limited to 6 characters

-	 * @return string unique string.

-	 */

-    function uniqueStr()

-    {

-      return substr(md5(microtime()),0,6);

-    }

-

-	/**

-	 * Create unique tmp image file name.

-	 * The filename is based on the tmp file prefix

-	 * specified in config.inc.php plus 

-	 * the UID (basically a md5 of the remote IP)

-	 * and some random 6 character string.

-	 * This function also calls to clean up the tmp files.

-	 * @param string $file the fullpath to a file

-	 * @return string a unique filename for that path

-	 * NOTE: it only returns the filename, path no included.

-	 */

-	function createUnique($file) 

-	{

-		$pathinfo = pathinfo($file);

-		$path = Files::fixPath($pathinfo['dirname']);

-		$imgType = $this->getImageType($file);

-

-		$unique_str = $this->manager->getTmpPrefix().$this->_uid.'_'.$this->uniqueStr().".".$imgType;

-

-	   //make sure the the unique temp file does not exists

-        while (file_exists($path.$unique_str))

-        {

-            $unique_str = $this->manager->getTmpPrefix().$this->_uid.'_'.$this->uniqueStr().".".$imgType;

-        }

-

-		$this->cleanUp($path,$pathinfo['basename']);

-

-		Return $unique_str;

-	}

-

-	/**

-	 * Delete any tmp image files.

-	 * @param string $path the full path 

-	 * where the clean should take place.

-	 */

-	function cleanUp($path,$file) 

-	{

-		$path = Files::fixPath($path);

-

-		if(!is_dir($path))

-			Return false;

-

-		$d = @dir($path);

-		

-		$tmp = $this->manager->getTmpPrefix();

-		$tmpLen = strlen($tmp);

-

-		$prefix = $tmp.$this->_uid;

-		$len = strlen($prefix);

-

-		while (false !== ($entry = $d->read())) 

-		{

-			//echo $entry."<br>";

-			if(is_file($path.$entry) && $this->manager->isTmpFile($entry))

-			{

-				if(substr($entry,0,$len)==$prefix && $entry != $file)

-					Files::delFile($path.$entry);

-				else if(substr($entry,0,$tmpLen)==$tmp && $entry != $file)

-				{

-					if(filemtime($path.$entry)+$this->lapse_time < time())

-						Files::delFile($path.$entry);

-				}

-			}

-		}

-		$d->close();

-	}

-

-	/**

-	 * Get the image type base on an image file.

-	 * @param string $file the full path to the image file.

-	 * @return string of either 'gif', 'jpeg', 'png' or 'bmp'

-	 * otherwise it will return null.

-	 */

-	function getImageType($file) 

-	{

-		$imageInfo = @getImageSize($file);

-

-		if(!is_array($imageInfo))

-			Return null;

-

-		switch($imageInfo[2]) 

-		{

-			case 1:

-				Return 'gif';

-			case 2:

-				Return 'jpeg';

-			case 3:

-				Return 'png';

-			case 6:

-				Return 'bmp';

-		}

-

-		Return null;

-	}

-

-	/**

-	 * Check if the specified image can be edit by GD

-	 * mainly to check that GD can read and save GIFs

-	 * @return int 0 if it is not a GIF file, 1 is GIF is editable, -1 if not editable.

-	 */

-	function isGDEditable() 

-	{

-		if(isset($_GET['img']))

-			$relative = rawurldecode($_GET['img']);

-		else

-			Return 0;

-		if(IMAGE_CLASS != 'GD')

-			Return 0;

-

-		$fullpath = $this->manager->getFullPath($relative);

- 

-		$type = $this->getImageType($fullpath);

-		if($type != 'gif')

-			Return 0;

-

-		if(function_exists('ImageCreateFrom'.$type)

-			&& function_exists('image'.$type))

-			Return 1;

-		else

-			Return -1;

-	}

-

-	/**

-	 * Check if GIF can be edit by GD.

-	 * @return int 0 if it is not using the GD library, 1 is GIF is editable, -1 if not editable.

-	 */

-	function isGDGIFAble() 

-	{

-		if(IMAGE_CLASS != 'GD')

-			Return 0;

-

-		if(function_exists('ImageCreateFromGif')

-			&& function_exists('imagegif'))

-			Return 1;

-		else

-			Return -1;

-	}

-}

-

-?>

diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ImageManager/Classes/ImageManager.php b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ImageManager/Classes/ImageManager.php
deleted file mode 100644
index 6c4a5d5..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ImageManager/Classes/ImageManager.php
+++ /dev/null
@@ -1,672 +0,0 @@
-<?php

-/**

- * ImageManager, list images, directories, and thumbnails.

- * @author $Author:ray $

- * @version $Id:ImageManager.php 709 2007-01-30 23:22:04Z ray $

- * @package ImageManager

- */

-

-require_once('../ImageManager/Classes/Files.php');

-

-// uncomment to turn on debugging

-

-// _ddtOn();

-

-/**

- * ImageManager Class.

- * @author $Author:ray $

- * @version $Id:ImageManager.php 709 2007-01-30 23:22:04Z ray $

- */

-class ImageManager 

-{

-	/**

-	 * Configuration array.

-	 */

-	var $config;

-

-	/**

-	 * Array of directory information.

-	 */

-	var $dirs;

-

-	/**

-	 * Constructor. Create a new Image Manager instance.

-	 * @param array $config configuration array, see config.inc.php

-	 */

-	function ImageManager($config) 

-	{

-		$this->config = $config;

-	}

-

-	/**

-	 * Get the images base directory.

-	 * @return string base dir, see config.inc.php

-	 */

-	function getImagesDir() 

-	{

-		Return $this->config['images_dir'];

-	}

-

-	/**

-	 * Get the images base URL.

-	 * @return string base url, see config.inc.php

-	 */

-	function getImagesURL() 

-	{

-		Return $this->config['images_url'];

-	}

-

-	function isValidBase()

-	{

-		return is_dir($this->getImagesDir());

-	}

-

-	/**

-	 * Get the tmp file prefix.

-	 * @return string tmp file prefix.

-	 */

-	function getTmpPrefix() 

-	{

-		Return $this->config['tmp_prefix'];

-	}

-

-	/**

-	 * Get the sub directories in the base dir.

-	 * Each array element contain

-	 * the relative path (relative to the base dir) as key and the 

-	 * full path as value.

-	 * @return array of sub directries

-	 * <code>array('path name' => 'full directory path', ...)</code>

-	 */

-	function getDirs() 

-	{

-		if(is_null($this->dirs))

-		{

-			$dirs = $this->_dirs($this->getImagesDir(),'/');

-			ksort($dirs);

-			$this->dirs = $dirs;

-		}

-		return $this->dirs;

-	}

-

-	/**

-	 * Recursively travese the directories to get a list

-	 * of accessable directories.

-	 * @param string $base the full path to the current directory

-	 * @param string $path the relative path name

-	 * @return array of accessiable sub-directories

-	 * <code>array('path name' => 'full directory path', ...)</code>

-	 */

-	function _dirs($base, $path) 

-	{

-		$base = Files::fixPath($base);

-		$dirs = array();

-

-		if($this->isValidBase() == false)

-			return $dirs;

-

-		$d = @dir($base);

-		

-		while (false !== ($entry = $d->read())) 

-		{

-			//If it is a directory, and it doesn't start with

-			// a dot, and if is it not the thumbnail directory

-			if(is_dir($base.$entry) 

-				&& substr($entry,0,1) != '.'

-				&& $this->isThumbDir($entry) == false) 

-			{

-				$relative = Files::fixPath($path.$entry);

-				$fullpath = Files::fixPath($base.$entry);

-				$dirs[$relative] = $fullpath;

-				$dirs = array_merge($dirs, $this->_dirs($fullpath, $relative));

-			}

-		}

-		$d->close();

-

-		Return $dirs;

-	}

-

-	/**

-	 * Get all the files and directories of a relative path.

-	 * @param string $path relative path to be base path.

-	 * @return array of file and path information.

-	 * <code>array(0=>array('relative'=>'fullpath',...), 1=>array('filename'=>fileinfo array(),...)</code>

-	 * fileinfo array: <code>array('url'=>'full url', 

-	 *                       'relative'=>'relative to base', 

-	 *                        'fullpath'=>'full file path', 

-	 *                        'image'=>imageInfo array() false if not image,

-	 *                        'stat' => filestat)</code>

-	 */

-	function getFiles($path) 

-	{

-		$files = array();

-		$dirs = array();

-

-		if($this->isValidBase() == false)

-			return array($files,$dirs);

-

-		$path = Files::fixPath($path);

-		$base = Files::fixPath($this->getImagesDir());

-		$fullpath = Files::makePath($base,$path);

-

-

-		$d = @dir($fullpath);

-		

-		while (false !== ($entry = $d->read())) 

-		{

-			//not a dot file or directory

-			if(substr($entry,0,1) != '.')

-			{

-				if(is_dir($fullpath.$entry)

-					&& $this->isThumbDir($entry) == false)

-				{

-					$relative = Files::fixPath($path.$entry);

-					$full = Files::fixPath($fullpath.$entry);

-					$count = $this->countFiles($full);

-					$dirs[$relative] = array('fullpath'=>$full,'entry'=>$entry,'count'=>$count);

-				}

-				else if(is_file($fullpath.$entry) && $this->isThumb($entry)==false && $this->isTmpFile($entry) == false) 

-				{

-					$img = $this->getImageInfo($fullpath.$entry);

-

-					if(!(!is_array($img)&&$this->config['validate_images']))

-					{

-						$file['url'] = Files::makePath($this->config['base_url'],$path).$entry;

-						$file['relative'] = $path.$entry;

-						$file['fullpath'] = $fullpath.$entry;

-						$file['image'] = $img;

-						$file['stat'] = stat($fullpath.$entry);

-						$files[$entry] = $file;

-					}

-				}

-			}

-		}

-		$d->close();

-		ksort($dirs);

-		ksort($files);

-		

-		Return array($dirs, $files);

-	}	

-

-	/**

-	 * Count the number of files and directories in a given folder

-	 * minus the thumbnail folders and thumbnails.

-	 */

-	function countFiles($path) 

-	{

-		$total = 0;

-

-		if(is_dir($path)) 

-		{

-			$d = @dir($path);

-

-			while (false !== ($entry = $d->read())) 

-			{

-				//echo $entry."<br>";

-				if(substr($entry,0,1) != '.'

-					&& $this->isThumbDir($entry) == false

-					&& $this->isTmpFile($entry) == false

-					&& $this->isThumb($entry) == false) 

-				{

-					$total++;

-				}

-			}

-			$d->close();

-		}

-		return $total;

-	}

-

-	/**

-	 * Get image size information.

-	 * @param string $file the image file

-	 * @return array of getImageSize information, 

-	 *  false if the file is not an image.

-	 */

-	function getImageInfo($file) 

-	{

-		Return @getImageSize($file);

-	}

-

-	/**

-	 * Check if the file contains the thumbnail prefix.

-	 * @param string $file filename to be checked

-	 * @return true if the file contains the thumbnail prefix, false otherwise.

-	 */

-	function isThumb($file) 

-	{

-		$len = strlen($this->config['thumbnail_prefix']);

-		if(substr($file,0,$len)==$this->config['thumbnail_prefix'])

-			Return true;

-		else

-			Return false;

-	}

-

-	/**

-	 * Check if the given directory is a thumbnail directory.

-	 * @param string $entry directory name

-	 * @return true if it is a thumbnail directory, false otherwise

-	 */

-	function isThumbDir($entry) 

-	{

-		if($this->config['thumbnail_dir'] == false

-			|| strlen(trim($this->config['thumbnail_dir'])) == 0)

-			Return false;		

-		else

-			Return ($entry == $this->config['thumbnail_dir']);

-	}

-

-	/**

-	 * Check if the given file is a tmp file.

-	 * @param string $file file name

-	 * @return boolean true if it is a tmp file, false otherwise

-	 */

-	function isTmpFile($file) 

-	{

-		$len = strlen($this->config['tmp_prefix']);

-		if(substr($file,0,$len)==$this->config['tmp_prefix'])

-			Return true;

-		else

-			Return false;	 	

-	}

-

-	/**

-	 * For a given image file, get the respective thumbnail filename

-	 * no file existence check is done.

-	 * @param string $fullpathfile the full path to the image file

-	 * @return string of the thumbnail file

-	 */

-	function getThumbName($fullpathfile) 

-	{

-		$path_parts = pathinfo($fullpathfile);

-		

-		$thumbnail = $this->config['thumbnail_prefix'].$path_parts['basename'];

-

-		if( strlen(trim($this->config['thumbnail_dir'])) == 0 || $this->config['safe_mode'] == true)

-		{

-			Return Files::makeFile($path_parts['dirname'],$thumbnail);

-		}

-		else

-		{

-				$path = Files::makePath($path_parts['dirname'],$this->config['thumbnail_dir']);

-				if(!is_dir($path))

-					Files::createFolder($path);

-				Return Files::makeFile($path,$thumbnail);

-		}

-	}

-	

-	/**

-	 * Similar to getThumbName, but returns the URL, base on the

-	 * given base_url in config.inc.php

-	 * @param string $relative the relative image file name, 

-	 * relative to the base_dir path

-	 * @return string the url of the thumbnail

-	 */

-	function getThumbURL($relative) 

-	{

-

-		_ddt( __FILE__, __LINE__, "getThumbURL(): relative is '$relative'" );

-

-		$path_parts = pathinfo($relative);

-		$thumbnail = $this->config['thumbnail_prefix'].$path_parts['basename'];

-		if($path_parts['dirname']=='\\') $path_parts['dirname']='/';

-

-		if($this->config['safe_mode'] == true

-			|| strlen(trim($this->config['thumbnail_dir'])) == 0)

-		{

-			Return Files::makeFile($this->getImagesURL(),rawurlencode($thumbnail));

-		}

-		else

-		{

-			if(strlen(trim($this->config['thumbnail_dir'])) > 0)

-			{

-				$path = Files::makePath($path_parts['dirname'],$this->config['thumbnail_dir']);

-				$url_path = Files::makePath($this->getImagesURL(), $path);

-

-				_ddt( __FILE__, __LINE__, "getThumbURL(): url_path is '$url_path'" );

-

-				Return Files::makeFile($url_path,rawurlencode($thumbnail));

-			}

-			else //should this ever happen?

-			{

-				//error_log('ImageManager: Error in creating thumbnail url');

-			}

-

-		}

-	}

-

-

-	/**

-	 * For a given image file, get the respective resized filename

-	 * no file existence check is done.

-	 * @param string $fullpathfile the full path to the image file

-	 * @param integer $width the intended width

-	 * @param integer $height the intended height

-	 * @param boolean $mkDir whether to attempt to make the resized_dir if it doesn't exist

-	 * @return string of the resized filename

-	 */

-	function getResizedName($fullpathfile, $width, $height, $mkDir = TRUE)

-	{

-		$path_parts = pathinfo($fullpathfile);

-

-		$thumbnail = $this->config['resized_prefix']."_{$width}x{$height}_{$path_parts['basename']}";

-

-		if( strlen(trim($this->config['resized_dir'])) == 0 || $this->config['safe_mode'] == true )

-		{

-			Return Files::makeFile($path_parts['dirname'],$thumbnail);

-		}

-		else

-		{

-			$path = Files::makePath($path_parts['dirname'],$this->config['resized_dir']);

-			if($mkDir && !is_dir($path))

-				Files::createFolder($path);

-			Return Files::makeFile($path,$thumbnail);

-		}

-	}

-

-	/**

-	 * Check if the given path is part of the subdirectories

-	 * under the base_dir.

-	 * @param string $path the relative path to be checked

-	 * @return boolean true if the path exists, false otherwise

-	 */

-	function validRelativePath($path) 

-	{

-		$dirs = $this->getDirs();

-		if($path == '/')

-			Return true;

-		//check the path given in the url against the 

-		//list of paths in the system.

-		for($i = 0; $i < count($dirs); $i++)

-		{

-			$key = key($dirs);

-			//we found the path

-			if($key == $path)

-				Return true;

-		

-			next($dirs);

-		}		

-		Return false;

-	}

-

-	/**

-	 * Process uploaded files, assumes the file is in 

-	 * $_FILES['upload'] and $_POST['dir'] is set.

-	 * The dir must be relative to the base_dir and exists.

-	 * If 'validate_images' is set to true, only file with

-	 * image dimensions will be accepted.

-	 * @return null

-	 */

-	function processUploads() 

-	{

-		if($this->isValidBase() == false)

-			return;

-

-		$relative = null;

-

-		if(isset($_POST['dir'])) 

-			$relative = rawurldecode($_POST['dir']);

-		else

-			return;

-

-		//check for the file, and must have valid relative path

-		if(isset($_FILES['upload']) && $this->validRelativePath($relative))

-		{

-			$this->_processFiles($relative, $_FILES['upload']);

-		}

-	}

-

-	/**

-	 * Process upload files. The file must be an 

-	 * uploaded file. If 'validate_images' is set to

-	 * true, only images will be processed. Any duplicate

-	 * file will be renamed. See Files::copyFile for details

-	 * on renaming.

-	 * @param string $relative the relative path where the file

-	 * should be copied to.

-	 * @param array $file the uploaded file from $_FILES

-	 * @return boolean true if the file was processed successfully, 

-	 * false otherwise

-	 */

-	function _processFiles($relative, $file)

-	{

-		

-		if($file['error']!=0)

-		{

-			Return false;

-		}

-

-		if(!is_file($file['tmp_name']))

-		{

-			Return false;

-		}

-

-		if(!is_uploaded_file($file['tmp_name']))

-		{

-			Files::delFile($file['tmp_name']);

-			Return false;

-		}

-		

-

-		if($this->config['validate_images'] == true)

-		{

-			$imgInfo = @getImageSize($file['tmp_name']);

-			if(!is_array($imgInfo))

-			{

-				Files::delFile($file['tmp_name']);

-				Return false;

-			}

-		}

-    

-    $valid_extensions = $this->config['allowed_image_extensions'];

-    $afruext = strtolower(substr(strrchr($file['name'], "."), 1));

-    if(!in_array($afruext, $valid_extensions))

-		{

-			Files::delFile($file['tmp_name']);

-			Return 'Cannot upload $extension='.$afruext.'$ Files. Permission denied.';

-		}

-

-		//now copy the file

-		$path = Files::makePath($this->getImagesDir(),$relative);

-		$result = Files::copyFile($file['tmp_name'], $path, $file['name']);

-

-		//no copy error

-		if(!is_int($result))

-		{

-			Files::delFile($file['tmp_name']);

-			Return true;

-		}

-

-		//delete tmp files.

-		Files::delFile($file['tmp_name']);

-		Return false;

-	}

-

-	/**

-	 * Get the URL of the relative file.

-	 * basically appends the relative file to the 

-	 * base_url given in config.inc.php

-	 * @param string $relative a file the relative to the base_dir

-	 * @return string the URL of the relative file.

-	 */

-	function getFileURL($relative) 

-	{

-		Return Files::makeFile($this->getImagesURL(),$relative);

-	}

-

-	/**

-	 * Get the fullpath to a relative file.

-	 * @param string $relative the relative file.

-	 * @return string the full path, .ie. the base_dir + relative.

-	 */

-	function getFullPath($relative) 

-	{

-		Return Files::makeFile($this->getImagesDir(),$relative);;

-	}

-

-	/**

-	 * Get the default thumbnail.

-	 * @return string default thumbnail, empty string if 

-	 * the thumbnail doesn't exist.

-	 */

-	function getDefaultThumb() 

-	{

-

-		// FIXME: hack

-

-		Return $this->config['default_thumbnail'];

-

-		if(is_file($this->config['default_thumbnail']))

-			{

-			Return $this->config['default_thumbnail'];

-			}

-		else 

-			Return '';

-	}

-

-

-	/**

-	 * Get the thumbnail url to be displayed. 

-	 * If the thumbnail exists, and it is up-to-date

-	 * the thumbnail url will be returns. If the 

-	 * file is not an image, a default image will be returned.

-	 * If it is an image file, and no thumbnail exists or 

-	 * the thumbnail is out-of-date (i.e. the thumbnail 

-	 * modified time is less than the original file)

-	 * then a thumbs.php?img=filename.jpg is returned.

-	 * The thumbs.php url will generate a new thumbnail

-	 * on the fly. If the image is less than the dimensions

-	 * of the thumbnails, the image will be display instead.

-	 * @param string $relative the relative image file.

-	 * @return string the url of the thumbnail, be it

-	 * actually thumbnail or a script to generate the

-	 * thumbnail on the fly.

-	 */

-	function getThumbnail($relative) 

-	{

-

-		global $IMConfig;

-

-		_ddt( __FILE__, __LINE__, "getThumbnail(): top with '$relative'" );

-

-		$fullpath = Files::makeFile($this->getImagesDir(),$relative);

-

-		//not a file???

-		if(!is_file($fullpath))

-			Return $this->getDefaultThumb();

-

-		$imgInfo = @getImageSize($fullpath);

-		

-		//not an image

-		if(!is_array($imgInfo))

-			Return $this->getDefaultThumb();

-

-		//the original image is smaller than thumbnails,

-		//so just return the url to the original image.

-		if ($imgInfo[0] <= $this->config['thumbnail_width']

-		 && $imgInfo[1] <= $this->config['thumbnail_height'])

-			Return $this->getFileURL($relative);

-

-		$thumbnail = $this->getThumbName($fullpath);

-		

-		//check for thumbnails, if exists and

-		// it is up-to-date, return the thumbnail url

-		if(is_file($thumbnail))

-		{

-			if(filemtime($thumbnail) >= filemtime($fullpath))

-				{

-				_ddt( __FILE__, __LINE__, "getThumbnail(): returning url '" . $this->getThumbURL($relative) . "'" );

-

-				Return $this->getThumbURL($relative);

-				}

-		}

-

-		//well, no thumbnail was found, so ask the thumbs.php

-		//to generate the thumbnail on the fly.

-		Return $IMConfig['backend_url'] . '__function=thumbs&img='.rawurlencode($relative);

-	}

-

-	/**

-	 * Delete and specified files.

-	 * @return boolean true if delete, false otherwise

-	 */

-	function deleteFiles() 

-	{

-		if(isset($_GET['delf']))

-			$this->_delFile(rawurldecode($_GET['delf']));

-	}

-

-	/**

-	 * Delete and specified directories.

-	 * @return boolean true if delete, false otherwise

-	 */

-	function deleteDirs() 

-	{

-		 if(isset($_GET['deld']))

-			return $this->_delDir(rawurldecode($_GET['deld']));		

-		 else

-			 Return false;

-	}

-

-	/**

-	 * Delete the relative file, and any thumbnails.

-	 * @param string $relative the relative file.

-	 * @return boolean true if deleted, false otherwise.

-	 */

-	function _delFile($relative) 

-	{

-		$fullpath = Files::makeFile($this->getImagesDir(),$relative);

-		

-		//check that the file is an image

-		if($this->config['validate_images'] == true)

-		{

-			if(!is_array($this->getImageInfo($fullpath)))

-				return false; //hmmm not an Image!!???

-		}

-

-		$thumbnail = $this->getThumbName($fullpath);

-

-		if(Files::delFile($fullpath))

-			Return Files::delFile($thumbnail);

-		else

-			Return false;

-	}

-

-	/**

-	 * Delete directories recursively.

-	 * @param string $relative the relative path to be deleted.

-	 * @return boolean true if deleted, false otherwise.

-	 */

-	function _delDir($relative) 

-	{

-		$fullpath = Files::makePath($this->getImagesDir(),$relative);

-		if($this->countFiles($fullpath) <= 0)

-			return Files::delFolder($fullpath,true); //delete recursively.

-		else

-			Return false;

-	}

-

-	/**

-	 * Create new directories.

-	 * If in safe_mode, nothing happens.

-	 * @return boolean true if created, false otherwise.

-	 */

-	function processNewDir() 

-	{

-		if($this->config['safe_mode'] == true)

-			Return false;

-

-		if(isset($_GET['newDir']) && isset($_GET['dir']))

-		{

-			$newDir = rawurldecode($_GET['newDir']);

-			$dir = rawurldecode($_GET['dir']);

-			$path = Files::makePath($this->getImagesDir(),$dir);

-			$fullpath = Files::makePath($path, Files::escape($newDir));

-			if(is_dir($fullpath))

-				Return false;

-

-			Return Files::createFolder($fullpath);

-		}

-	}

-}

-

-?>

diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ImageManager/Classes/JSON.php b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ImageManager/Classes/JSON.php
deleted file mode 100644
index 436f782..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ImageManager/Classes/JSON.php
+++ /dev/null
@@ -1,806 +0,0 @@
-<?php
-/* vim: set expandtab tabstop=4 shiftwidth=4 softtabstop=4: */
-
-/**
- * Converts to and from JSON format.
- *
- * JSON (JavaScript Object Notation) is a lightweight data-interchange
- * format. It is easy for humans to read and write. It is easy for machines
- * to parse and generate. It is based on a subset of the JavaScript
- * Programming Language, Standard ECMA-262 3rd Edition - December 1999.
- * This feature can also be found in  Python. JSON is a text format that is
- * completely language independent but uses conventions that are familiar
- * to programmers of the C-family of languages, including C, C++, C#, Java,
- * JavaScript, Perl, TCL, and many others. These properties make JSON an
- * ideal data-interchange language.
- *
- * This package provides a simple encoder and decoder for JSON notation. It
- * is intended for use with client-side Javascript applications that make
- * use of HTTPRequest to perform server communication functions - data can
- * be encoded into JSON notation for use in a client-side javascript, or
- * decoded from incoming Javascript requests. JSON format is native to
- * Javascript, and can be directly eval()'ed with no further parsing
- * overhead
- *
- * All strings should be in ASCII or UTF-8 format!
- *
- * LICENSE: Redistribution and use in source and binary forms, with or
- * without modification, are permitted provided that the following
- * conditions are met: Redistributions of source code must retain the
- * above copyright notice, this list of conditions and the following
- * disclaimer. 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.
- *
- * THIS SOFTWARE IS PROVIDED ``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 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.
- *
- * @category
- * @package     Services_JSON
- * @author      Michal Migurski <mike-json@teczno.com>
- * @author      Matt Knapp <mdknapp[at]gmail[dot]com>
- * @author      Brett Stimmerman <brettstimmerman[at]gmail[dot]com>
- * @copyright   2005 Michal Migurski
- * @version     CVS: $Id: JSON.php,v 1.31 2006/06/28 05:54:17 migurski Exp $
- * @license     http://www.opensource.org/licenses/bsd-license.php
- * @link        http://pear.php.net/pepr/pepr-proposal-show.php?id=198
- */
-
-/**
- * Marker constant for Services_JSON::decode(), used to flag stack state
- */
-define('SERVICES_JSON_SLICE',   1);
-
-/**
- * Marker constant for Services_JSON::decode(), used to flag stack state
- */
-define('SERVICES_JSON_IN_STR',  2);
-
-/**
- * Marker constant for Services_JSON::decode(), used to flag stack state
- */
-define('SERVICES_JSON_IN_ARR',  3);
-
-/**
- * Marker constant for Services_JSON::decode(), used to flag stack state
- */
-define('SERVICES_JSON_IN_OBJ',  4);
-
-/**
- * Marker constant for Services_JSON::decode(), used to flag stack state
- */
-define('SERVICES_JSON_IN_CMT', 5);
-
-/**
- * Behavior switch for Services_JSON::decode()
- */
-define('SERVICES_JSON_LOOSE_TYPE', 16);
-
-/**
- * Behavior switch for Services_JSON::decode()
- */
-define('SERVICES_JSON_SUPPRESS_ERRORS', 32);
-
-/**
- * Converts to and from JSON format.
- *
- * Brief example of use:
- *
- * <code>
- * // create a new instance of Services_JSON
- * $json = new Services_JSON();
- *
- * // convert a complexe value to JSON notation, and send it to the browser
- * $value = array('foo', 'bar', array(1, 2, 'baz'), array(3, array(4)));
- * $output = $json->encode($value);
- *
- * print($output);
- * // prints: ["foo","bar",[1,2,"baz"],[3,[4]]]
- *
- * // accept incoming POST data, assumed to be in JSON notation
- * $input = file_get_contents('php://input', 1000000);
- * $value = $json->decode($input);
- * </code>
- */
-class Services_JSON
-{
-   /**
-    * constructs a new JSON instance
-    *
-    * @param    int     $use    object behavior flags; combine with boolean-OR
-    *
-    *                           possible values:
-    *                           - SERVICES_JSON_LOOSE_TYPE:  loose typing.
-    *                                   "{...}" syntax creates associative arrays
-    *                                   instead of objects in decode().
-    *                           - SERVICES_JSON_SUPPRESS_ERRORS:  error suppression.
-    *                                   Values which can't be encoded (e.g. resources)
-    *                                   appear as NULL instead of throwing errors.
-    *                                   By default, a deeply-nested resource will
-    *                                   bubble up with an error, so all return values
-    *                                   from encode() should be checked with isError()
-    */
-    function Services_JSON($use = 0)
-    {
-        $this->use = $use;
-    }
-
-   /**
-    * convert a string from one UTF-16 char to one UTF-8 char
-    *
-    * Normally should be handled by mb_convert_encoding, but
-    * provides a slower PHP-only method for installations
-    * that lack the multibye string extension.
-    *
-    * @param    string  $utf16  UTF-16 character
-    * @return   string  UTF-8 character
-    * @access   private
-    */
-    function utf162utf8($utf16)
-    {
-        // oh please oh please oh please oh please oh please
-        if(function_exists('mb_convert_encoding')) {
-            return mb_convert_encoding($utf16, 'UTF-8', 'UTF-16');
-        }
-
-        $bytes = (ord($utf16{0}) << 8) | ord($utf16{1});
-
-        switch(true) {
-            case ((0x7F & $bytes) == $bytes):
-                // this case should never be reached, because we are in ASCII range
-                // see: http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8
-                return chr(0x7F & $bytes);
-
-            case (0x07FF & $bytes) == $bytes:
-                // return a 2-byte UTF-8 character
-                // see: http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8
-                return chr(0xC0 | (($bytes >> 6) & 0x1F))
-                     . chr(0x80 | ($bytes & 0x3F));
-
-            case (0xFFFF & $bytes) == $bytes:
-                // return a 3-byte UTF-8 character
-                // see: http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8
-                return chr(0xE0 | (($bytes >> 12) & 0x0F))
-                     . chr(0x80 | (($bytes >> 6) & 0x3F))
-                     . chr(0x80 | ($bytes & 0x3F));
-        }
-
-        // ignoring UTF-32 for now, sorry
-        return '';
-    }
-
-   /**
-    * convert a string from one UTF-8 char to one UTF-16 char
-    *
-    * Normally should be handled by mb_convert_encoding, but
-    * provides a slower PHP-only method for installations
-    * that lack the multibye string extension.
-    *
-    * @param    string  $utf8   UTF-8 character
-    * @return   string  UTF-16 character
-    * @access   private
-    */
-    function utf82utf16($utf8)
-    {
-        // oh please oh please oh please oh please oh please
-        if(function_exists('mb_convert_encoding')) {
-            return mb_convert_encoding($utf8, 'UTF-16', 'UTF-8');
-        }
-
-        switch(strlen($utf8)) {
-            case 1:
-                // this case should never be reached, because we are in ASCII range
-                // see: http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8
-                return $utf8;
-
-            case 2:
-                // return a UTF-16 character from a 2-byte UTF-8 char
-                // see: http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8
-                return chr(0x07 & (ord($utf8{0}) >> 2))
-                     . chr((0xC0 & (ord($utf8{0}) << 6))
-                         | (0x3F & ord($utf8{1})));
-
-            case 3:
-                // return a UTF-16 character from a 3-byte UTF-8 char
-                // see: http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8
-                return chr((0xF0 & (ord($utf8{0}) << 4))
-                         | (0x0F & (ord($utf8{1}) >> 2)))
-                     . chr((0xC0 & (ord($utf8{1}) << 6))
-                         | (0x7F & ord($utf8{2})));
-        }
-
-        // ignoring UTF-32 for now, sorry
-        return '';
-    }
-
-   /**
-    * encodes an arbitrary variable into JSON format
-    *
-    * @param    mixed   $var    any number, boolean, string, array, or object to be encoded.
-    *                           see argument 1 to Services_JSON() above for array-parsing behavior.
-    *                           if var is a strng, note that encode() always expects it
-    *                           to be in ASCII or UTF-8 format!
-    *
-    * @return   mixed   JSON string representation of input var or an error if a problem occurs
-    * @access   public
-    */
-    function encode($var)
-    {
-        switch (gettype($var)) {
-            case 'boolean':
-                return $var ? 'true' : 'false';
-
-            case 'NULL':
-                return 'null';
-
-            case 'integer':
-                return (int) $var;
-
-            case 'double':
-            case 'float':
-                return (float) $var;
-
-            case 'string':
-                // STRINGS ARE EXPECTED TO BE IN ASCII OR UTF-8 FORMAT
-                $ascii = '';
-                $strlen_var = strlen($var);
-
-               /*
-                * Iterate over every character in the string,
-                * escaping with a slash or encoding to UTF-8 where necessary
-                */
-                for ($c = 0; $c < $strlen_var; ++$c) {
-
-                    $ord_var_c = ord($var{$c});
-
-                    switch (true) {
-                        case $ord_var_c == 0x08:
-                            $ascii .= '\b';
-                            break;
-                        case $ord_var_c == 0x09:
-                            $ascii .= '\t';
-                            break;
-                        case $ord_var_c == 0x0A:
-                            $ascii .= '\n';
-                            break;
-                        case $ord_var_c == 0x0C:
-                            $ascii .= '\f';
-                            break;
-                        case $ord_var_c == 0x0D:
-                            $ascii .= '\r';
-                            break;
-
-                        case $ord_var_c == 0x22:
-                        case $ord_var_c == 0x2F:
-                        case $ord_var_c == 0x5C:
-                            // double quote, slash, slosh
-                            $ascii .= '\\'.$var{$c};
-                            break;
-
-                        case (($ord_var_c >= 0x20) && ($ord_var_c <= 0x7F)):
-                            // characters U-00000000 - U-0000007F (same as ASCII)
-                            $ascii .= $var{$c};
-                            break;
-
-                        case (($ord_var_c & 0xE0) == 0xC0):
-                            // characters U-00000080 - U-000007FF, mask 110XXXXX
-                            // see http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8
-                            $char = pack('C*', $ord_var_c, ord($var{$c + 1}));
-                            $c += 1;
-                            $utf16 = $this->utf82utf16($char);
-                            $ascii .= sprintf('\u%04s', bin2hex($utf16));
-                            break;
-
-                        case (($ord_var_c & 0xF0) == 0xE0):
-                            // characters U-00000800 - U-0000FFFF, mask 1110XXXX
-                            // see http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8
-                            $char = pack('C*', $ord_var_c,
-                                         ord($var{$c + 1}),
-                                         ord($var{$c + 2}));
-                            $c += 2;
-                            $utf16 = $this->utf82utf16($char);
-                            $ascii .= sprintf('\u%04s', bin2hex($utf16));
-                            break;
-
-                        case (($ord_var_c & 0xF8) == 0xF0):
-                            // characters U-00010000 - U-001FFFFF, mask 11110XXX
-                            // see http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8
-                            $char = pack('C*', $ord_var_c,
-                                         ord($var{$c + 1}),
-                                         ord($var{$c + 2}),
-                                         ord($var{$c + 3}));
-                            $c += 3;
-                            $utf16 = $this->utf82utf16($char);
-                            $ascii .= sprintf('\u%04s', bin2hex($utf16));
-                            break;
-
-                        case (($ord_var_c & 0xFC) == 0xF8):
-                            // characters U-00200000 - U-03FFFFFF, mask 111110XX
-                            // see http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8
-                            $char = pack('C*', $ord_var_c,
-                                         ord($var{$c + 1}),
-                                         ord($var{$c + 2}),
-                                         ord($var{$c + 3}),
-                                         ord($var{$c + 4}));
-                            $c += 4;
-                            $utf16 = $this->utf82utf16($char);
-                            $ascii .= sprintf('\u%04s', bin2hex($utf16));
-                            break;
-
-                        case (($ord_var_c & 0xFE) == 0xFC):
-                            // characters U-04000000 - U-7FFFFFFF, mask 1111110X
-                            // see http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8
-                            $char = pack('C*', $ord_var_c,
-                                         ord($var{$c + 1}),
-                                         ord($var{$c + 2}),
-                                         ord($var{$c + 3}),
-                                         ord($var{$c + 4}),
-                                         ord($var{$c + 5}));
-                            $c += 5;
-                            $utf16 = $this->utf82utf16($char);
-                            $ascii .= sprintf('\u%04s', bin2hex($utf16));
-                            break;
-                    }
-                }
-
-                return '"'.$ascii.'"';
-
-            case 'array':
-               /*
-                * As per JSON spec if any array key is not an integer
-                * we must treat the the whole array as an object. We
-                * also try to catch a sparsely populated associative
-                * array with numeric keys here because some JS engines
-                * will create an array with empty indexes up to
-                * max_index which can cause memory issues and because
-                * the keys, which may be relevant, will be remapped
-                * otherwise.
-                *
-                * As per the ECMA and JSON specification an object may
-                * have any string as a property. Unfortunately due to
-                * a hole in the ECMA specification if the key is a
-                * ECMA reserved word or starts with a digit the
-                * parameter is only accessible using ECMAScript's
-                * bracket notation.
-                */
-
-                // treat as a JSON object
-                if (is_array($var) && count($var) && (array_keys($var) !== range(0, sizeof($var) - 1))) {
-                    $properties = array_map(array($this, 'name_value'),
-                                            array_keys($var),
-                                            array_values($var));
-
-                    foreach($properties as $property) {
-                        if(Services_JSON::isError($property)) {
-                            return $property;
-                        }
-                    }
-
-                    return '{' . join(',', $properties) . '}';
-                }
-
-                // treat it like a regular array
-                $elements = array_map(array($this, 'encode'), $var);
-
-                foreach($elements as $element) {
-                    if(Services_JSON::isError($element)) {
-                        return $element;
-                    }
-                }
-
-                return '[' . join(',', $elements) . ']';
-
-            case 'object':
-                $vars = get_object_vars($var);
-
-                $properties = array_map(array($this, 'name_value'),
-                                        array_keys($vars),
-                                        array_values($vars));
-
-                foreach($properties as $property) {
-                    if(Services_JSON::isError($property)) {
-                        return $property;
-                    }
-                }
-
-                return '{' . join(',', $properties) . '}';
-
-            default:
-                return ($this->use & SERVICES_JSON_SUPPRESS_ERRORS)
-                    ? 'null'
-                    : new Services_JSON_Error(gettype($var)." can not be encoded as JSON string");
-        }
-    }
-
-   /**
-    * array-walking function for use in generating JSON-formatted name-value pairs
-    *
-    * @param    string  $name   name of key to use
-    * @param    mixed   $value  reference to an array element to be encoded
-    *
-    * @return   string  JSON-formatted name-value pair, like '"name":value'
-    * @access   private
-    */
-    function name_value($name, $value)
-    {
-        $encoded_value = $this->encode($value);
-
-        if(Services_JSON::isError($encoded_value)) {
-            return $encoded_value;
-        }
-
-        return $this->encode(strval($name)) . ':' . $encoded_value;
-    }
-
-   /**
-    * reduce a string by removing leading and trailing comments and whitespace
-    *
-    * @param    $str    string      string value to strip of comments and whitespace
-    *
-    * @return   string  string value stripped of comments and whitespace
-    * @access   private
-    */
-    function reduce_string($str)
-    {
-        $str = preg_replace(array(
-
-                // eliminate single line comments in '// ...' form
-                '#^\s*//(.+)$#m',
-
-                // eliminate multi-line comments in '/* ... */' form, at start of string
-                '#^\s*/\*(.+)\*/#Us',
-
-                // eliminate multi-line comments in '/* ... */' form, at end of string
-                '#/\*(.+)\*/\s*$#Us'
-
-            ), '', $str);
-
-        // eliminate extraneous space
-        return trim($str);
-    }
-
-   /**
-    * decodes a JSON string into appropriate variable
-    *
-    * @param    string  $str    JSON-formatted string
-    *
-    * @return   mixed   number, boolean, string, array, or object
-    *                   corresponding to given JSON input string.
-    *                   See argument 1 to Services_JSON() above for object-output behavior.
-    *                   Note that decode() always returns strings
-    *                   in ASCII or UTF-8 format!
-    * @access   public
-    */
-    function decode($str)
-    {
-        $str = $this->reduce_string($str);
-
-        switch (strtolower($str)) {
-            case 'true':
-                return true;
-
-            case 'false':
-                return false;
-
-            case 'null':
-                return null;
-
-            default:
-                $m = array();
-
-                if (is_numeric($str)) {
-                    // Lookie-loo, it's a number
-
-                    // This would work on its own, but I'm trying to be
-                    // good about returning integers where appropriate:
-                    // return (float)$str;
-
-                    // Return float or int, as appropriate
-                    return ((float)$str == (integer)$str)
-                        ? (integer)$str
-                        : (float)$str;
-
-                } elseif (preg_match('/^("|\').*(\1)$/s', $str, $m) && $m[1] == $m[2]) {
-                    // STRINGS RETURNED IN UTF-8 FORMAT
-                    $delim = substr($str, 0, 1);
-                    $chrs = substr($str, 1, -1);
-                    $utf8 = '';
-                    $strlen_chrs = strlen($chrs);
-
-                    for ($c = 0; $c < $strlen_chrs; ++$c) {
-
-                        $substr_chrs_c_2 = substr($chrs, $c, 2);
-                        $ord_chrs_c = ord($chrs{$c});
-
-                        switch (true) {
-                            case $substr_chrs_c_2 == '\b':
-                                $utf8 .= chr(0x08);
-                                ++$c;
-                                break;
-                            case $substr_chrs_c_2 == '\t':
-                                $utf8 .= chr(0x09);
-                                ++$c;
-                                break;
-                            case $substr_chrs_c_2 == '\n':
-                                $utf8 .= chr(0x0A);
-                                ++$c;
-                                break;
-                            case $substr_chrs_c_2 == '\f':
-                                $utf8 .= chr(0x0C);
-                                ++$c;
-                                break;
-                            case $substr_chrs_c_2 == '\r':
-                                $utf8 .= chr(0x0D);
-                                ++$c;
-                                break;
-
-                            case $substr_chrs_c_2 == '\\"':
-                            case $substr_chrs_c_2 == '\\\'':
-                            case $substr_chrs_c_2 == '\\\\':
-                            case $substr_chrs_c_2 == '\\/':
-                                if (($delim == '"' && $substr_chrs_c_2 != '\\\'') ||
-                                   ($delim == "'" && $substr_chrs_c_2 != '\\"')) {
-                                    $utf8 .= $chrs{++$c};
-                                }
-                                break;
-
-                            case preg_match('/\\\u[0-9A-F]{4}/i', substr($chrs, $c, 6)):
-                                // single, escaped unicode character
-                                $utf16 = chr(hexdec(substr($chrs, ($c + 2), 2)))
-                                       . chr(hexdec(substr($chrs, ($c + 4), 2)));
-                                $utf8 .= $this->utf162utf8($utf16);
-                                $c += 5;
-                                break;
-
-                            case ($ord_chrs_c >= 0x20) && ($ord_chrs_c <= 0x7F):
-                                $utf8 .= $chrs{$c};
-                                break;
-
-                            case ($ord_chrs_c & 0xE0) == 0xC0:
-                                // characters U-00000080 - U-000007FF, mask 110XXXXX
-                                //see http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8
-                                $utf8 .= substr($chrs, $c, 2);
-                                ++$c;
-                                break;
-
-                            case ($ord_chrs_c & 0xF0) == 0xE0:
-                                // characters U-00000800 - U-0000FFFF, mask 1110XXXX
-                                // see http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8
-                                $utf8 .= substr($chrs, $c, 3);
-                                $c += 2;
-                                break;
-
-                            case ($ord_chrs_c & 0xF8) == 0xF0:
-                                // characters U-00010000 - U-001FFFFF, mask 11110XXX
-                                // see http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8
-                                $utf8 .= substr($chrs, $c, 4);
-                                $c += 3;
-                                break;
-
-                            case ($ord_chrs_c & 0xFC) == 0xF8:
-                                // characters U-00200000 - U-03FFFFFF, mask 111110XX
-                                // see http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8
-                                $utf8 .= substr($chrs, $c, 5);
-                                $c += 4;
-                                break;
-
-                            case ($ord_chrs_c & 0xFE) == 0xFC:
-                                // characters U-04000000 - U-7FFFFFFF, mask 1111110X
-                                // see http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8
-                                $utf8 .= substr($chrs, $c, 6);
-                                $c += 5;
-                                break;
-
-                        }
-
-                    }
-
-                    return $utf8;
-
-                } elseif (preg_match('/^\[.*\]$/s', $str) || preg_match('/^\{.*\}$/s', $str)) {
-                    // array, or object notation
-
-                    if ($str{0} == '[') {
-                        $stk = array(SERVICES_JSON_IN_ARR);
-                        $arr = array();
-                    } else {
-                        if ($this->use & SERVICES_JSON_LOOSE_TYPE) {
-                            $stk = array(SERVICES_JSON_IN_OBJ);
-                            $obj = array();
-                        } else {
-                            $stk = array(SERVICES_JSON_IN_OBJ);
-                            $obj = new stdClass();
-                        }
-                    }
-
-                    array_push($stk, array('what'  => SERVICES_JSON_SLICE,
-                                           'where' => 0,
-                                           'delim' => false));
-
-                    $chrs = substr($str, 1, -1);
-                    $chrs = $this->reduce_string($chrs);
-
-                    if ($chrs == '') {
-                        if (reset($stk) == SERVICES_JSON_IN_ARR) {
-                            return $arr;
-
-                        } else {
-                            return $obj;
-
-                        }
-                    }
-
-                    //print("\nparsing {$chrs}\n");
-
-                    $strlen_chrs = strlen($chrs);
-
-                    for ($c = 0; $c <= $strlen_chrs; ++$c) {
-
-                        $top = end($stk);
-                        $substr_chrs_c_2 = substr($chrs, $c, 2);
-
-                        if (($c == $strlen_chrs) || (($chrs{$c} == ',') && ($top['what'] == SERVICES_JSON_SLICE))) {
-                            // found a comma that is not inside a string, array, etc.,
-                            // OR we've reached the end of the character list
-                            $slice = substr($chrs, $top['where'], ($c - $top['where']));
-                            array_push($stk, array('what' => SERVICES_JSON_SLICE, 'where' => ($c + 1), 'delim' => false));
-                            //print("Found split at {$c}: ".substr($chrs, $top['where'], (1 + $c - $top['where']))."\n");
-
-                            if (reset($stk) == SERVICES_JSON_IN_ARR) {
-                                // we are in an array, so just push an element onto the stack
-                                array_push($arr, $this->decode($slice));
-
-                            } elseif (reset($stk) == SERVICES_JSON_IN_OBJ) {
-                                // we are in an object, so figure
-                                // out the property name and set an
-                                // element in an associative array,
-                                // for now
-                                $parts = array();
-                                
-                                if (preg_match('/^\s*(["\'].*[^\\\]["\'])\s*:\s*(\S.*),?$/Uis', $slice, $parts)) {
-                                    // "name":value pair
-                                    $key = $this->decode($parts[1]);
-                                    $val = $this->decode($parts[2]);
-
-                                    if ($this->use & SERVICES_JSON_LOOSE_TYPE) {
-                                        $obj[$key] = $val;
-                                    } else {
-                                        $obj->$key = $val;
-                                    }
-                                } elseif (preg_match('/^\s*(\w+)\s*:\s*(\S.*),?$/Uis', $slice, $parts)) {
-                                    // name:value pair, where name is unquoted
-                                    $key = $parts[1];
-                                    $val = $this->decode($parts[2]);
-
-                                    if ($this->use & SERVICES_JSON_LOOSE_TYPE) {
-                                        $obj[$key] = $val;
-                                    } else {
-                                        $obj->$key = $val;
-                                    }
-                                }
-
-                            }
-
-                        } elseif ((($chrs{$c} == '"') || ($chrs{$c} == "'")) && ($top['what'] != SERVICES_JSON_IN_STR)) {
-                            // found a quote, and we are not inside a string
-                            array_push($stk, array('what' => SERVICES_JSON_IN_STR, 'where' => $c, 'delim' => $chrs{$c}));
-                            //print("Found start of string at {$c}\n");
-
-                        } elseif (($chrs{$c} == $top['delim']) &&
-                                 ($top['what'] == SERVICES_JSON_IN_STR) &&
-                                 ((strlen(substr($chrs, 0, $c)) - strlen(rtrim(substr($chrs, 0, $c), '\\'))) % 2 != 1)) {
-                            // found a quote, we're in a string, and it's not escaped
-                            // we know that it's not escaped becase there is _not_ an
-                            // odd number of backslashes at the end of the string so far
-                            array_pop($stk);
-                            //print("Found end of string at {$c}: ".substr($chrs, $top['where'], (1 + 1 + $c - $top['where']))."\n");
-
-                        } elseif (($chrs{$c} == '[') &&
-                                 in_array($top['what'], array(SERVICES_JSON_SLICE, SERVICES_JSON_IN_ARR, SERVICES_JSON_IN_OBJ))) {
-                            // found a left-bracket, and we are in an array, object, or slice
-                            array_push($stk, array('what' => SERVICES_JSON_IN_ARR, 'where' => $c, 'delim' => false));
-                            //print("Found start of array at {$c}\n");
-
-                        } elseif (($chrs{$c} == ']') && ($top['what'] == SERVICES_JSON_IN_ARR)) {
-                            // found a right-bracket, and we're in an array
-                            array_pop($stk);
-                            //print("Found end of array at {$c}: ".substr($chrs, $top['where'], (1 + $c - $top['where']))."\n");
-
-                        } elseif (($chrs{$c} == '{') &&
-                                 in_array($top['what'], array(SERVICES_JSON_SLICE, SERVICES_JSON_IN_ARR, SERVICES_JSON_IN_OBJ))) {
-                            // found a left-brace, and we are in an array, object, or slice
-                            array_push($stk, array('what' => SERVICES_JSON_IN_OBJ, 'where' => $c, 'delim' => false));
-                            //print("Found start of object at {$c}\n");
-
-                        } elseif (($chrs{$c} == '}') && ($top['what'] == SERVICES_JSON_IN_OBJ)) {
-                            // found a right-brace, and we're in an object
-                            array_pop($stk);
-                            //print("Found end of object at {$c}: ".substr($chrs, $top['where'], (1 + $c - $top['where']))."\n");
-
-                        } elseif (($substr_chrs_c_2 == '/*') &&
-                                 in_array($top['what'], array(SERVICES_JSON_SLICE, SERVICES_JSON_IN_ARR, SERVICES_JSON_IN_OBJ))) {
-                            // found a comment start, and we are in an array, object, or slice
-                            array_push($stk, array('what' => SERVICES_JSON_IN_CMT, 'where' => $c, 'delim' => false));
-                            $c++;
-                            //print("Found start of comment at {$c}\n");
-
-                        } elseif (($substr_chrs_c_2 == '*/') && ($top['what'] == SERVICES_JSON_IN_CMT)) {
-                            // found a comment end, and we're in one now
-                            array_pop($stk);
-                            $c++;
-
-                            for ($i = $top['where']; $i <= $c; ++$i)
-                                $chrs = substr_replace($chrs, ' ', $i, 1);
-
-                            //print("Found end of comment at {$c}: ".substr($chrs, $top['where'], (1 + $c - $top['where']))."\n");
-
-                        }
-
-                    }
-
-                    if (reset($stk) == SERVICES_JSON_IN_ARR) {
-                        return $arr;
-
-                    } elseif (reset($stk) == SERVICES_JSON_IN_OBJ) {
-                        return $obj;
-
-                    }
-
-                }
-        }
-    }
-
-    /**
-     * @todo Ultimately, this should just call PEAR::isError()
-     */
-    function isError($data, $code = null)
-    {
-        if (class_exists('pear')) {
-            return PEAR::isError($data, $code);
-        } elseif (is_object($data) && (get_class($data) == 'services_json_error' ||
-                                 is_subclass_of($data, 'services_json_error'))) {
-            return true;
-        }
-
-        return false;
-    }
-}
-
-if (class_exists('PEAR_Error')) {
-
-    class Services_JSON_Error extends PEAR_Error
-    {
-        function Services_JSON_Error($message = 'unknown error', $code = null,
-                                     $mode = null, $options = null, $userinfo = null)
-        {
-            parent::PEAR_Error($message, $code, $mode, $options, $userinfo);
-        }
-    }
-
-} else {
-
-    /**
-     * @todo Ultimately, this class shall be descended from PEAR_Error
-     */
-    class Services_JSON_Error
-    {
-        function Services_JSON_Error($message = 'unknown error', $code = null,
-                                     $mode = null, $options = null, $userinfo = null)
-        {
-
-        }
-    }
-
-}
-    
-?>
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ImageManager/Classes/JSON_Compat.php b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ImageManager/Classes/JSON_Compat.php
deleted file mode 100644
index f731a5d..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ImageManager/Classes/JSON_Compat.php
+++ /dev/null
@@ -1,52 +0,0 @@
-<?php
-  /** If there is no json_encode() or json_decode() function already in existance (recent PHP will provide native)
-   *  use the PEAR::JSON class to do the job.
-   *
-   */
-   
-  if(!function_exists('json_decode'))
-  {
-        
-    function &get_json()
-    {
-      global $JSON_Singleton;
-      if(!isset($JSON_Singleton))
-      {
-        require_once(dirname(__FILE__) . '/JSON.php');
-        $JSON_Singleton = new Services_JSON();
-      }
-           
-      return $JSON_Singleton;
-    }
-    
-    function json_decode($str, $loose = FALSE) 
-    {
-      $json =& get_json();
-      
-      if($loose)
-      {
-        $json->use = SERVICES_JSON_LOOSE_TYPE;
-      }
-      else
-      {
-        $json->use = 0;
-      }
-      
-      return $json->decode($str);
-    }
-    
-    function json_encode($var, $loose = FALSE)
-    {
-      $json =& get_json();
-      if($loose)
-      {
-        $json->use = SERVICES_JSON_LOOSE_TYPE;
-      }
-      else
-      {
-        $json->use = 0;
-      }
-      return $json->encode($var);
-    }
-  }
-?>
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ImageManager/Classes/NetPBM.php b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ImageManager/Classes/NetPBM.php
deleted file mode 100644
index 2e3f58f..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ImageManager/Classes/NetPBM.php
+++ /dev/null
@@ -1,257 +0,0 @@
-<?php

-/***********************************************************************

-** Title.........:  NetPBM Driver

-** Version.......:  1.0

-** Author........:  Xiang Wei ZHUO <wei@zhuo.org>

-** Filename......:  NetPBM.php

-** Last changed..:  30 Aug 2003 

-** Notes.........:  Orginal is from PEAR

-**/

-

-// +----------------------------------------------------------------------+

-// | PHP Version 4                                                        |

-// +----------------------------------------------------------------------+

-// | Copyright (c) 1997-2002 The PHP Group                                |

-// +----------------------------------------------------------------------+

-// | This source file is subject to version 2.02 of the PHP license,      |

-// | that is bundled with this package in the file LICENSE, and is        |

-// | available at through the world-wide-web at                           |

-// | http://www.php.net/license/2_02.txt.                                 |

-// | If you did not receive a copy of the PHP license and are unable to   |

-// | obtain it through the world-wide-web, please send a note to          |

-// | license@php.net so we can mail you a copy immediately.               |

-// +----------------------------------------------------------------------+

-// | Authors: Peter Bowyer <peter@mapledesign.co.uk>                      |

-// +----------------------------------------------------------------------+

-//

-// $Id:NetPBM.php 709 2007-01-30 23:22:04Z ray $

-//

-// Image Transformation interface using command line NetPBM

-

-require_once "../ImageManager/Classes/Transform.php";

-

-Class Image_Transform_Driver_NetPBM extends Image_Transform

-{

-

-    /**

-     * associative array commands to be executed

-     * @var array

-     */

-    var $command = array();

-

-    /**

-     * Class Constructor

-     */

-    function Image_Transform_Driver_NetPBM()

-    {

-        $this->uid = md5($_SERVER['REMOTE_ADDR']);

-            

-        return true;

-    } // End function Image_NetPBM

-

-    /**

-     * Load image

-     *

-     * @param string filename

-     *

-     * @return mixed none or a PEAR error object on error

-     * @see PEAR::isError()

-     */

-    function load($image)

-    {

-        //echo $image;

-        $this->image = $image;

-        $this->_get_image_details($image);

-    } // End load

-

-    /**

-     * Resizes the image

-     *

-     * @return none

-     * @see PEAR::isError()

-     */

-    function _resize($new_x, $new_y)

-    {

-        // there's no technical reason why resize can't be called multiple

-        // times...it's just silly to do so

-

-        $this->command[] = IMAGE_TRANSFORM_LIB_PATH .

-                           "pnmscale -width $new_x -height $new_y";

-

-        $this->_set_new_x($new_x);

-        $this->_set_new_y($new_y);

-    } // End resize

-

-    /**

-     * Crop the image

-     *

-     * @param int $crop_x left column of the image

-     * @param int $crop_y top row of the image

-     * @param int $crop_width new cropped image width

-     * @param int $crop_height new cropped image height

-     */

-    function crop($crop_x, $crop_y, $crop_width, $crop_height) 

-    {

-        $this->command[] = IMAGE_TRANSFORM_LIB_PATH .

-                            "pnmcut -left $crop_x -top $crop_y -width $crop_width -height $crop_height";

-    }

-

-    /**

-     * Rotates the image

-     *

-     * @param int $angle The angle to rotate the image through

-     */

-    function rotate($angle)

-    {

-        $angle = -1*floatval($angle);

-

-        if($angle > 90)

-        {   

-            $this->command[] = IMAGE_TRANSFORM_LIB_PATH . "pnmrotate -noantialias 90";

-            $this->rotate(-1*($angle-90));

-        }

-        else if ($angle < -90)

-        {

-            $this->command[] = IMAGE_TRANSFORM_LIB_PATH . "pnmrotate -noantialias -90";

-            $this->rotate(-1*($angle+90));

-        }

-        else

-            $this->command[] = IMAGE_TRANSFORM_LIB_PATH . "pnmrotate -noantialias $angle";

-    } // End rotate

-

-    /**

-     * Flip the image horizontally or vertically

-     *

-     * @param boolean $horizontal true if horizontal flip, vertical otherwise

-     */

-    function flip($horizontal) 

-    {

-        if($horizontal) 

-            $this->command[] = IMAGE_TRANSFORM_LIB_PATH . "pnmflip -lr";

-        else

-            $this->command[] = IMAGE_TRANSFORM_LIB_PATH . "pnmflip -tb";

-    }

-

-    /**

-     * Adjust the image gamma

-     *

-     * @param float $outputgamma

-     *

-     * @return none

-     */

-    function gamma($outputgamma = 1.0) {

-        $this->command[13] = IMAGE_TRANSFORM_LIB_PATH . "pnmgamma $outputgamma";

-    }

-

-    /**

-     * adds text to an image

-     *

-     * @param   array   options     Array contains options

-     *             array(

-     *                  'text'          // The string to draw

-     *                  'x'             // Horizontal position

-     *                  'y'             // Vertical Position

-     *                  'Color'         // Font color

-     *                  'font'          // Font to be used

-     *                  'size'          // Size of the fonts in pixel

-     *                  'resize_first'  // Tell if the image has to be resized

-     *                                  // before drawing the text

-     *                   )

-     *

-     * @return none

-     */

-    function addText($params)

-    {

-        $default_params = array('text' => 'This is Text',

-                                'x' => 10,

-                                'y' => 20,

-                                'color' => 'red',

-                                'font' => 'Arial.ttf',

-                                'size' => '12',

-                                'angle' => 0,

-                                'resize_first' => false);

-        // we ignore 'resize_first' since the more logical approach would be

-        // for the user to just call $this->_resize() _first_ ;)

-        extract(array_merge($default_params, $params));

-        $this->command[] = "ppmlabel -angle $angle -colour $color -size "

-                           ."$size -x $x -y ".$y+$size." -text \"$text\"";

-    } // End addText

-

-    function _postProcess($type, $quality, $save_type)

-    {

-        $type = is_null($type) || $type==''? $this->type : $type;

-        $save_type = is_null($save_type) || $save_type==''? $this->type : $save_type;

-        //echo "TYPE:". $this->type;

-        array_unshift($this->command, IMAGE_TRANSFORM_LIB_PATH

-                      . $type.'topnm '. $this->image);

-        $arg = '';

-        switch(strtolower($save_type)){

-            case 'gif':

-                $this->command[] = IMAGE_TRANSFORM_LIB_PATH . "ppmquant 256";

-                $this->command[] = IMAGE_TRANSFORM_LIB_PATH . "ppmto$save_type";

-                break;

-            case 'jpg':

-            case 'jpeg':

-                $arg = "--quality=$quality";

-                $this->command[] = IMAGE_TRANSFORM_LIB_PATH . "ppmto$save_type $arg";

-                break;

-            default:

-                $this->command[] = IMAGE_TRANSFORM_LIB_PATH . "pnmto$save_type $arg";

-                break;

-        } // switch

-        return implode('|', $this->command);

-    } 

-

-    /**

-     * Save the image file

-     *

-     * @param string $filename the name of the file to write to

-     * @param string $type (jpeg,png...);

-     * @param int $quality 75

-     * @return none

-     */

-    function save($filename, $type=null, $quality = 85)

-    {

-        $cmd = $this->_postProcess('', $quality, $type) . ">$filename";

-            

-		//if we have windows server

-        if(isset($_ENV['OS']) && eregi('window',$_ENV['OS']))

-			$cmd = ereg_replace('/','\\',$cmd);

-        //echo $cmd."##";

-        $output = system($cmd);

-		error_log('NETPBM: '.$cmd);

-		//error_log($output);

-        $this->command = array();

-    } // End save

-

-

-    /**

-     * Display image without saving and lose changes

-     *

-     * @param string $type (jpeg,png...);

-     * @param int $quality 75

-     * @return none

-     */

-    function display($type = null, $quality = 75)

-    {

-        header('Content-type: image/' . $type);

-        $cmd = $this->_postProcess($type, $quality);

-        

-        passthru($cmd);

-        $this->command = array();

-    }

-

-    /**

-     * Destroy image handle

-     *

-     * @return none

-     */

-    function free()

-    {

-        // there is no image handle here

-        return true;

-    }

-

-

-} // End class NetPBM

-?>

diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ImageManager/Classes/Thumbnail.php b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ImageManager/Classes/Thumbnail.php
deleted file mode 100644
index 2ab455f..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ImageManager/Classes/Thumbnail.php
+++ /dev/null
@@ -1,125 +0,0 @@
-<?php

-/**

- * Create thumbnails.

- * @author $Author:ray $

- * @version $Id:Thumbnail.php 709 2007-01-30 23:22:04Z ray $

- * @package ImageManager

- */

-

-

-require_once('../ImageManager/Classes/Transform.php');

-

-/**

- * Thumbnail creation

- * @author $Author:ray $

- * @version $Id:Thumbnail.php 709 2007-01-30 23:22:04Z ray $

- * @package ImageManager

- * @subpackage Images

- */

-class Thumbnail 

-{

-	/**

-	 * Graphics driver, GD, NetPBM or ImageMagick.

-	 */

-	var $driver;

-

-	/**

-	 * Thumbnail default width.

-	 */

-	var $width = 96;

-

-	/**

-	 * Thumbnail default height.

-	 */

-	var $height = 96;

-

-	/**

-	 * Thumbnail default JPEG quality.

-	 */

-	var $quality = 85;

-

-	/**

-	 * Thumbnail is proportional

-	 */

-	var $proportional = true;

-

-	/**

-	 * Default image type is JPEG.

-	 */

-	var $type = 'jpeg';

-

-	/**

-	 * Create a new Thumbnail instance.

-	 * @param int $width thumbnail width

-	 * @param int $height thumbnail height

-	 */

-	function Thumbnail($width=96, $height=96) 

-	{

-		$this->driver = Image_Transform::factory(IMAGE_CLASS);

-		$this->width = $width;

-		$this->height = $height;

-	}

-

-	/**

-	 * Create a thumbnail.

-	 * @param string $file the image for the thumbnail

-	 * @param string $thumbnail if not null, the thumbnail will be saved

-	 * as this parameter value.

-	 * @return boolean true if thumbnail is created, false otherwise

-	 */

-	function createThumbnail($file, $thumbnail=null) 

-	{

-		if(!is_file($file)) 

-			Return false;

-

-		//error_log('Creating Thumbs: '.$file);

-

-		$this->driver->load($file);

-

-		if($this->proportional) 

-		{

-			$width = $this->driver->img_x;

-			$height = $this->driver->img_y;

-

-			if ($width > $height)

-				$this->height = intval($this->width/$width*$height);

-			else if ($height > $width)

-				$this->width = intval($this->height/$height*$width);

-		}

-

-		$this->driver->resize($this->width, $this->height);

-

-		if(is_null($thumbnail)) 

-			$this->save($file);

-		else

-			$this->save($thumbnail);

-

-

-		$this->free();

-

-		if(is_file($thumbnail)) 

-			Return true;

-		else

-			Return false;

-	}

-

-	/**

-	 * Save the thumbnail file.

-	 * @param string $file file name to be saved as.

-	 */

-	function save($file) 

-	{

-		$this->driver->save($file);

-	}

-

-	/**

-	 * Free up the graphic driver resources.

-	 */

-	function free() 

-	{

-		$this->driver->free();

-	}

-}

-

-

-?>
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ImageManager/Classes/Transform.php b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ImageManager/Classes/Transform.php
deleted file mode 100644
index 2663799..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ImageManager/Classes/Transform.php
+++ /dev/null
@@ -1,569 +0,0 @@
-<?php

-/***********************************************************************

-** Title.........:  Image Transformation Interface

-** Version.......:  1.0

-** Author........:  Xiang Wei ZHUO <wei@zhuo.org>

-** Filename......:  Transform.php

-** Last changed..:  30 Aug 2003 

-** Notes.........:  Orginal is from PEAR

-                    

-                    Added a few extra,

-                        - create unique filename in a particular directory,

-                          used for temp image files.

-                        - added cropping to GD, NetPBM, ImageMagick

-**/

-

-// +----------------------------------------------------------------------+

-// | PHP Version 4                                                        |

-// +----------------------------------------------------------------------+

-// | Copyright (c) 1997-2002 The PHP Group                                |

-// +----------------------------------------------------------------------+

-// | This source file is subject to version 2.02 of the PHP license,      |

-// | that is bundled with this package in the file LICENSE, and is        |

-// | available at through the world-wide-web at                           |

-// | http://www.php.net/license/2_02.txt.                                 |

-// | If you did not receive a copy of the PHP license and are unable to   |

-// | obtain it through the world-wide-web, please send a note to          |

-// | license@php.net so we can mail you a copy immediately.               |

-// +----------------------------------------------------------------------+

-// | Authors: Peter Bowyer <peter@mapledesign.co.uk>                      |

-// |          Alan Knowles <alan@akbkhome.com>                            |

-// |          Vincent Oostindie <vincent@sunlight.tmfweb.nl>              |

-// +----------------------------------------------------------------------+

-//

-// $Id:Transform.php 709 2007-01-30 23:22:04Z ray $

-//

-// Image Transformation interface

-//

-

-

-/**

- * The main "Image_Resize" class is a container and base class which

- * provides the static methods for creating Image objects as well as

- * some utility functions (maths) common to all parts of Image Resize.

- *

- * The object model of DB is as follows (indentation means inheritance):

- *

- * Image_Resize The base for each Image implementation.  Provides default

- * |            implementations (in OO lingo virtual methods) for

- * |            the actual Image implementations as well as a bunch of

- * |            maths methods.

- * |

- * +-Image_GD   The Image implementation for the PHP GD extension .  Inherits

- *              Image_Resize

- *              When calling DB::setup for GD images the object returned is an

- *              instance of this class.

- *

- * @package  Image Resize

- * @version  1.00

- * @author   Peter Bowyer <peter@mapledesign.co.uk>

- * @since    PHP 4.0

- */

-Class Image_Transform

-{

-    /**

-     * Name of the image file

-     * @var string

-     */

-    var $image = '';

-    /**

-     * Type of the image file (eg. jpg, gif png ...)

-     * @var string

-     */

-    var $type = '';

-    /**

-     * Original image width in x direction

-     * @var int

-     */

-    var $img_x = '';

-    /**

-     * Original image width in y direction

-     * @var int

-     */

-    var $img_y = '';

-    /**

-     * New image width in x direction

-     * @var int

-     */

-    var $new_x = '';

-    /**

-     * New image width in y direction

-     * @var int

-     */

-    var $new_y = '';

-    /**

-     * Path the the library used

-     * e.g. /usr/local/ImageMagick/bin/ or

-     * /usr/local/netpbm/

-     */

-    var $lib_path = '';

-    /**

-     * Flag to warn if image has been resized more than once before displaying

-     * or saving.

-     */

-     var $resized = false;

-

-

-     var $uid = '';

-

-     var $lapse_time =900; //15 mins

-

-    /**

-     * Create a new Image_resize object

-     *

-     * @param string $driver name of driver class to initialize

-     *

-     * @return mixed a newly created Image_Transform object, or a PEAR

-     * error object on error

-     *

-     * @see PEAR::isError()

-     * @see Image_Transform::setOption()

-     */

-    function &factory($driver)

-    {

-        if ('' == $driver) {

-            die("No image library specified... aborting.  You must call ::factory() with one parameter, the library to load.");

-

-        }

-        $this->uid = md5($_SERVER['REMOTE_ADDR']);

-

-        include_once "../ImageManager/Classes/$driver.php";

-

-        $classname = "Image_Transform_Driver_{$driver}";

-        $obj = new $classname;

-        return $obj;

-    }

-

-

-    /**

-     * Resize the Image in the X and/or Y direction

-     * If either is 0 it will be scaled proportionally

-     *

-     * @access public

-     *

-     * @param mixed $new_x (0, number, percentage 10% or 0.1)

-     * @param mixed $new_y (0, number, percentage 10% or 0.1)

-     *

-     * @return mixed none or PEAR_error

-     */

-    function resize($new_x = 0, $new_y = 0)

-    {

-        // 0 means keep original size

-        $new_x = (0 == $new_x) ? $this->img_x : $this->_parse_size($new_x, $this->img_x);

-        $new_y = (0 == $new_y) ? $this->img_y : $this->_parse_size($new_y, $this->img_y);

-        // Now do the library specific resizing.

-        return $this->_resize($new_x, $new_y);

-    } // End resize

-

-

-    /**

-     * Scale the image to have the max x dimension specified.

-     *

-     * @param int $new_x Size to scale X-dimension to

-     * @return none

-     */

-    function scaleMaxX($new_x)

-    {

-        $new_y = round(($new_x / $this->img_x) * $this->img_y, 0);

-        return $this->_resize($new_x, $new_y);

-    } // End resizeX

-

-    /**

-     * Scale the image to have the max y dimension specified.

-     *

-     * @access public

-     * @param int $new_y Size to scale Y-dimension to

-     * @return none

-     */

-    function scaleMaxY($new_y)

-    {

-        $new_x = round(($new_y / $this->img_y) * $this->img_x, 0);

-        return $this->_resize($new_x, $new_y);

-    } // End resizeY

-

-    /**

-     * Scale Image to a maximum or percentage

-     *

-     * @access public

-     * @param mixed (number, percentage 10% or 0.1)

-     * @return mixed none or PEAR_error

-     */

-    function scale($size)

-    {

-        if ((strlen($size) > 1) && (substr($size,-1) == '%')) {

-            return $this->scaleByPercentage(substr($size, 0, -1));

-        } elseif ($size < 1) {

-            return $this->scaleByFactor($size);

-        } else {

-            return $this->scaleByLength($size);

-        }

-    } // End scale

-

-    /**

-     * Scales an image to a percentage of its original size.  For example, if

-     * my image was 640x480 and I called scaleByPercentage(10) then the image

-     * would be resized to 64x48

-     *

-     * @access public

-     * @param int $size Percentage of original size to scale to

-     * @return none

-     */

-    function scaleByPercentage($size)

-    {

-        return $this->scaleByFactor($size / 100);

-    } // End scaleByPercentage

-

-    /**

-     * Scales an image to a factor of its original size.  For example, if

-     * my image was 640x480 and I called scaleByFactor(0.5) then the image

-     * would be resized to 320x240.

-     *

-     * @access public

-     * @param float $size Factor of original size to scale to

-     * @return none

-     */

-    function scaleByFactor($size)

-    {

-        $new_x = round($size * $this->img_x, 0);

-        $new_y = round($size * $this->img_y, 0);

-        return $this->_resize($new_x, $new_y);

-    } // End scaleByFactor

-

-    /**

-     * Scales an image so that the longest side has this dimension.

-     *

-     * @access public

-     * @param int $size Max dimension in pixels

-     * @return none

-     */

-    function scaleByLength($size)

-    {

-         if ($this->img_x >= $this->img_y) {

-            $new_x = $size;

-            $new_y = round(($new_x / $this->img_x) * $this->img_y, 0);

-        } else {

-            $new_y = $size;

-            $new_x = round(($new_y / $this->img_y) * $this->img_x, 0);

-        }

-        return $this->_resize($new_x, $new_y);

-    } // End scaleByLength

-

-

-    /**

-     *

-     * @access public

-     * @return void

-     */

-    function _get_image_details($image)

-    {

-        //echo $image;

-        $data = @GetImageSize($image);

-        #1 = GIF, 2 = JPG, 3 = PNG, 4 = SWF, 5 = PSD, 6 = BMP, 7 = TIFF(intel byte order), 8 = TIFF(motorola byte order,

-        # 9 = JPC, 10 = JP2, 11 = JPX, 12 = JB2, 13 = SWC

-        if (is_array($data)){

-            switch($data[2]){

-                case 1:

-                    $type = 'gif';

-                    break;

-                case 2:

-                    $type = 'jpeg';

-                    break;

-                case 3:

-                    $type = 'png';

-                    break;

-                case 4:

-                    $type = 'swf';

-                    break;

-                case 5:

-                    $type = 'psd';

-                case 6:

-                    $type = 'bmp';

-                case 7:

-                case 8:

-                    $type = 'tiff';

-                default:

-                    echo("We do not recognize this image format");

-            }

-            $this->img_x = $data[0];

-            $this->img_y = $data[1];

-            $this->type = $type;

-

-            return true;

-        } else {

-            echo("Cannot fetch image or images details.");

-            return null;

-        }

-        /*

-        $output = array(

-                        'width' => $data[0],

-                        'height' => $data[1],

-                        'type' => $type

-                        );

-        return $output;

-        */

-    }

-

-

-    /**

-     * Parse input and convert

-     * If either is 0 it will be scaled proportionally

-     *

-     * @access private

-     *

-     * @param mixed $new_size (0, number, percentage 10% or 0.1)

-     * @param int $old_size

-     *

-     * @return mixed none or PEAR_error

-     */

-    function _parse_size($new_size, $old_size)

-    {

-        if ('%' == $new_size) {

-            $new_size = str_replace('%','',$new_size);

-            $new_size = $new_size / 100;

-        }

-        if ($new_size > 1) {

-            return (int) $new_size;

-        } elseif ($new_size == 0) {

-            return (int) $old_size;

-        } else {

-            return (int) round($new_size * $old_size, 0);

-        }

-    }

-

-

-    function uniqueStr()

-    {

-      return substr(md5(microtime()),0,6);

-    }

-

-    //delete old tmp files, and allow only 1 file per remote host.

-    function cleanUp($id, $dir)

-    {

-        $d = dir($dir);

-        $id_length = strlen($id);

-

-        while (false !== ($entry = $d->read())) {

-            if (is_file($dir.'/'.$entry) && substr($entry,0,1) == '.' && !ereg($entry, $this->image))

-            {

-                //echo filemtime($this->directory.'/'.$entry)."<br>"; 

-                //echo time();

-

-                if (filemtime($dir.'/'.$entry) + $this->lapse_time < time())

-                    unlink($dir.'/'.$entry);

-

-                if (substr($entry, 1, $id_length) == $id)

-                {

-                    if (is_file($dir.'/'.$entry))

-                        unlink($dir.'/'.$entry);

-                }

-            }

-        }

-        $d->close();

-    }

-

-

-    function createUnique($dir)

-    {

-       $unique_str = '.'.$this->uid.'_'.$this->uniqueStr().".".$this->type;

-        

-       //make sure the the unique temp file does not exists

-        while (file_exists($dir.$unique_str))

-        {

-            $unique_str = '.'.$this->uid.'_'.$this->uniqueStr().".".$this->type;

-        }

-        

-      $this->cleanUp($this->uid, $dir);

-

-       return $unique_str;

-    }

-

-

-    /**

-     * Set the image width

-     * @param int $size dimension to set

-     * @since 29/05/02 13:36:31

-     * @return

-     */

-    function _set_img_x($size)

-    {

-        $this->img_x = $size;

-    }

-

-    /**

-     * Set the image height

-     * @param int $size dimension to set

-     * @since 29/05/02 13:36:31

-     * @return

-     */

-    function _set_img_y($size)

-    {

-        $this->img_y = $size;

-    }

-

-    /**

-     * Set the image width

-     * @param int $size dimension to set

-     * @since 29/05/02 13:36:31

-     * @return

-     */

-    function _set_new_x($size)

-    {

-        $this->new_x = $size;

-    }

-

-    /**

-     * Set the image height

-     * @param int $size dimension to set

-     * @since 29/05/02 13:36:31

-     * @return

-     */

-    function _set_new_y($size)

-    {

-        $this->new_y = $size;

-    }

-

-    /**

-     * Get the type of the image being manipulated

-     *

-     * @return string $this->type the image type

-     */

-    function getImageType()

-    {

-        return $this->type;

-    }

-

-    /**

-     *

-     * @access public

-     * @return string web-safe image type

-     */

-    function getWebSafeFormat()

-    {

-        switch($this->type){

-            case 'gif':

-            case 'png':

-                return 'png';

-                break;

-            default:

-                return 'jpeg';

-        } // switch

-    }

-

-    /**

-     * Place holder for the real resize method

-     * used by extended methods to do the resizing

-     *

-     * @access private

-     * @return PEAR_error

-     */

-    function _resize() {

-        return null; //PEAR::raiseError("No Resize method exists", true);

-    }

-

-    /**

-     * Place holder for the real load method

-     * used by extended methods to do the resizing

-     *

-     * @access public

-     * @return PEAR_error

-     */

-    function load($filename) {

-        return null; //PEAR::raiseError("No Load method exists", true);

-    }

-

-    /**

-     * Place holder for the real display method

-     * used by extended methods to do the resizing

-     *

-     * @access public

-     * @param string filename

-     * @return PEAR_error

-     */

-    function display($type, $quality) {

-        return null; //PEAR::raiseError("No Display method exists", true);

-    }

-

-    /**

-     * Place holder for the real save method

-     * used by extended methods to do the resizing

-     *

-     * @access public

-     * @param string filename

-     * @return PEAR_error

-     */

-    function save($filename, $type, $quality) {

-        return null; //PEAR::raiseError("No Save method exists", true);

-    }

-

-    /**

-     * Place holder for the real free method

-     * used by extended methods to do the resizing

-     *

-     * @access public

-     * @return PEAR_error

-     */

-    function free() {

-        return null; //PEAR::raiseError("No Free method exists", true);

-    }

-

-    /**

-     * Reverse of rgb2colorname.

-     *

-     * @access public

-     * @return PEAR_error

-     *

-     * @see rgb2colorname

-     */

-    function colorhex2colorarray($colorhex) {

-        $r = hexdec(substr($colorhex, 1, 2));

-        $g = hexdec(substr($colorhex, 3, 2));

-        $b = hexdec(substr($colorhex, 4, 2));

-        return array($r,$g,$b);

-    }

-

-    /**

-     * Reverse of rgb2colorname.

-     *

-     * @access public

-     * @return PEAR_error

-     *

-     * @see rgb2colorname

-     */

-    function colorarray2colorhex($color) {

-        $color = '#'.dechex($color[0]).dechex($color[1]).dechex($color[2]);

-        return strlen($color)>6?false:$color;

-    }

-

-

-    /* Methods to add to the driver classes in the future */

-    function addText()

-    {

-        return null; //PEAR::raiseError("No addText method exists", true);

-    }

-

-    function addDropShadow()

-    {

-        return null; //PEAR::raiseError("No AddDropShadow method exists", true);

-    }

-

-    function addBorder()

-    {

-        return null; //PEAR::raiseError("No addBorder method exists", true);

-    }

-

-    function crop()

-    {

-        return null; //PEAR::raiseError("No crop method exists", true);

-    }

-

-    function flip() 

-    {

-        return null;

-    }

-

-    function gamma()

-    {

-        return null; //PEAR::raiseError("No gamma method exists", true);

-    }

-}

-?>

diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ImageManager/ImageManager.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ImageManager/ImageManager.js
deleted file mode 100644
index bcc0ada..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ImageManager/ImageManager.js
+++ /dev/null
@@ -1,291 +0,0 @@
-/**
- * The ImageManager plugin javascript.
- * @author $Author:(local) $
- * @version $Id:image-manager.js 856M 2007-06-13 18:34:34Z (local) $
- * @package ImageManager
- */
-
-/**
- * To Enable the plug-in add the following line before Xinha is initialised.
- *
- * Xinha.loadPlugin("ImageManager");
- *
- * Then configure the config.inc.php file, that is all.
- * For up-to-date documentation, please visit http://www.zhuo.org/htmlarea/
- */
-
-/**
- * It is pretty simple, this file over rides the Xinha.prototype._insertImage
- * function with our own, only difference is the popupDialog url
- * point that to the php script.
- */
-
-function ImageManager(editor)
-{
-
-}
-
-ImageManager._pluginInfo = {
-	name          : "ImageManager",
-	version       : "1.0",
-	developer     : "Xiang Wei Zhuo",
-	developer_url : "http://www.zhuo.org/htmlarea/",
-	license       : "htmlArea"
-};
-
-
-// CONFIGURATION README:
-//
-//  It's useful to pass the configuration to the backend through javascript
-//  (this saves editing the backend config itself), this needs to be done
-//  in a trusted/secure manner... here is how to do it..
-//
-//  1. You need to be able to put PHP in your xinha_config setup
-//  2. In step 3 write something like
-//  --------------------------------------------------------------
-//  with (xinha_config.ImageManager)
-//  { 
-//    <?php 
-//      require_once('/path/to/xinha/contrib/php-xinha.php');
-//      xinha_pass_to_php_backend
-//      (       
-//        array
-//        (
-//         'images_dir' => '/home/your/directory',
-//         'images_url' => '/directory'
-//        )
-//      )
-//    ?>
-//  }
-//  --------------------------------------------------------------
-//
-//  this will work provided you are using normal file-based PHP sessions
-//  (most likely), if not, you may need to modify the php-xinha.php
-//  file to suit your setup.
-
-Xinha.Config.prototype.ImageManager =
-{
-  'backend'    : Xinha.getPluginDir("ImageManager") + '/backend.php?__plugin=ImageManager&',
-  'backend_data' : null,
-  
-  // Deprecated method for passing config, use above instead!
-  //---------------------------------------------------------
-  'backend_config'     : null,
-  'backend_config_hash': null,
-  'backend_config_secret_key_location': 'Xinha:ImageManager'
-  //---------------------------------------------------------
-};
-
-// Over ride the _insertImage function in htmlarea.js.
-// Open up the ImageManger script instead.
-
-Xinha.prototype._insertImage = function(image) {
-
-	var editor = this;	// for nested functions
-	var outparam = null;
-	if (typeof image == "undefined") {
-		image = this.getParentElement();
-		if (image && !/^img$/i.test(image.tagName))
-			image = null;
-	}
-
-	// the selection will have the absolute url to the image. 
-	// coerce it to be relative to the images directory.
-	//
-	// FIXME: we have the correct URL, but how to get it to select?
-	// FIXME: need to do the same for MSIE.
-
-	if ( image )
-		{
-
-		outparam =
-			{
-			f_url    : Xinha.is_ie ? image.src : image.src,
-			f_alt    : image.alt,
-			f_border : image.style.borderWidth ? image.style.borderWidth : image.border,
-			f_align  : image.align,
-			f_padding: image.style.padding,
-			f_margin : image.style.margin,
-			f_width  : image.width,
-			f_height  : image.height,
-      f_backgroundColor: image.style.backgroundColor,
-      f_borderColor: image.style.borderColor,
-      f_hspace:  image.hspace && image.hspace != '-1' ? parseInt(image.hspace) : '',
-      f_vspace: image.vspace && image.vspace != '-1' ? parseInt(image.vspace) : ''
-			};
-
-    function shortSize(cssSize)
-    {
-      if(/ /.test(cssSize))
-      {
-        var sizes = cssSize.split(' ');
-        var useFirstSize = true;
-        for(var i = 1; i < sizes.length; i++)
-        {
-          if(sizes[0] != sizes[i])
-          {
-            useFirstSize = false;
-            break;
-          }
-        }
-        if(useFirstSize) cssSize = sizes[0];
-      }
-      return cssSize;
-    }
-    outparam.f_border = shortSize(outparam.f_border);
-    outparam.f_padding = shortSize(outparam.f_padding);
-    outparam.f_margin = shortSize(outparam.f_margin);
-    
-    function convertToHex(color) {
-
-      if (typeof color == "string" && /, /.test.color)
-      color = color.replace(/, /, ','); // rgb(a, b) => rgb(a,b)
-
-      if (typeof color == "string" && / /.test.color) { // multiple values
-        var colors = color.split(' ');
-        var colorstring = '';
-        for (var i = 0; i < colors.length; i++) {
-          colorstring += Xinha._colorToRgb(colors[i]);
-          if (i + 1 < colors.length)
-          colorstring += " ";
-        }
-        return colorstring;
-      }
-
-      return Xinha._colorToRgb(color);
-    }
-    
-    outparam.f_backgroundColor = convertToHex(outparam.f_backgroundColor);
-    outparam.f_borderColor = convertToHex(outparam.f_borderColor);
-
-		} // end of if we selected an image before raising the dialog.
-
-	// the "manager" var is legacy code. Should probably reference the
-	// actual config variable in each place .. for now this is good enough.
-
-	// alert( "backend is '" + editor.config.ImageManager.backend + "'" );
-
-	var manager = editor.config.ImageManager.backend + '__function=manager';
-  if(editor.config.ImageManager.backend_config != null)
-  {
-    manager += '&backend_config='
-      + encodeURIComponent(editor.config.ImageManager.backend_config);
-    manager += '&backend_config_hash='
-      + encodeURIComponent(editor.config.ImageManager.backend_config_hash);
-    manager += '&backend_config_secret_key_location='
-      + encodeURIComponent(editor.config.ImageManager.backend_config_secret_key_location);
-  }
-  
-  if(editor.config.ImageManager.backend_data != null)
-  {
-    for ( var i in editor.config.ImageManager.backend_data )
-    {
-      manager += '&' + i + '=' + encodeURIComponent(editor.config.ImageManager.backend_data[i]);
-    }
-  }
-  
-	Dialog(manager, function(param) {
-		if (!param) {	// user must have pressed Cancel
-			return false;
-		}
-		var img = image;
-		if (!img) {
-			if (Xinha.is_ie) {
-        var sel = editor._getSelection();
-        var range = editor._createRange(sel);
-        editor._doc.execCommand("insertimage", false, param.f_url);
-				img = range.parentElement();
-				// wonder if this works...
-				if (img.tagName.toLowerCase() != "img") {
-					img = img.previousSibling;
-				}
-			} else {
-				img = document.createElement('img');
-        img.src = param.f_url;
-        editor.insertNodeAtSelection(img);
-			}
-		} else {			
-			img.src = param.f_url;
-		}
-		
-		for (field in param) {
-			var value = param[field];
-			switch (field) {
-			    case "f_alt"    : img.alt	 = value; break;
-			    case "f_border" :
-          if(value.length)
-          {           
-            img.style.borderWidth = /[^0-9]/.test(value) ? value :  (parseInt(value) + 'px');
-            if(img.style.borderWidth && !img.style.borderStyle)
-            {
-              img.style.borderStyle = 'solid';
-            }
-          }
-          else
-          {
-            img.style.borderWidth = '';
-            img.style.borderStyle = '';
-          }
-          break;
-          
-          case "f_borderColor": img.style.borderColor = value; break;
-          case "f_backgroundColor": img.style.backgroundColor = value; break;
-            
-          case "f_padding": 
-          {
-            if(value.length)
-            {
-              img.style.padding = /[^0-9]/.test(value) ? value :  (parseInt(value) + 'px'); 
-            }
-            else
-            {
-              img.style.padding = '';
-            }
-          }
-          break;
-          
-          case "f_margin": 
-          {
-            if(value.length)
-            {
-              img.style.margin = /[^0-9]/.test(value) ? value :  (parseInt(value) + 'px'); 
-            }
-            else
-            {
-              img.style.margin = '';
-            }
-          }
-          break;
-          
-			    case "f_align"  : img.align	 = value; break;
-            
-          case "f_width" : 
-          {
-            if(!isNaN(parseInt(value))) { img.width  = parseInt(value); } else { img.width = ''; }
-          }
-          break;
-          
-				  case "f_height":
-          {
-            if(!isNaN(parseInt(value))) { img.height = parseInt(value); } else { img.height = ''; }
-          }
-          break;
-          
-          case "f_hspace" : 
-          {
-            if(!isNaN(parseInt(value))) { img.hspace  = parseInt(value); } else { img.hspace = ''; }
-          }
-          break;
-          
-          case "f_vspace" : 
-          {
-            if(!isNaN(parseInt(value))) { img.vspace  = parseInt(value); } else { img.vspace = ''; }
-          }
-          break;
-			}
-
-		}
-		
-		
-	}, outparam);
-};
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ImageManager/README.txt b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ImageManager/README.txt
deleted file mode 100644
index fa99392..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ImageManager/README.txt
+++ /dev/null
@@ -1,150 +0,0 @@
-Originally Developed by: http://www.zhuo.org/htmlarea/
-
-> This is a plug-in for HTMLArea 3.0
-> 
-> The PHP ImageManager + Editor provides an interface to 
-> browser for image files on your web server. The Editor
-> allows some basic image manipulations such as, cropping,
-> rotation, flip, and scaling.
-> 
-> Further and up-to-date documentation can be found at
-> http://www.zhuo.org/htmlarea/docs/index.html
-> 
-> Cheer,
-> Wei
-
-2005-03-20 
-  by Yermo Lamers of DTLink, LLC (http://www.formvista.com/contact.html)
-
-Please post questions/comments/flames about this plugin in the Xinha forums
-at 
-
-   http://xinha.gogo.co.nz/punbb/viewforum.php?id=1
-
-------------------------------------------------------------------------------
-If you have GD installed and configured in PHP this should work out of the 
-box. 
-
-For production use see config.inc.php for configuration values. You will 
-want to adjust images_dir and images_url for your application.
-
-For demo purposes ImageManager is set up to view images in the
-
-   /xinha/plugins/ImageManager/demo_images
-
-directory. This is governed by the images_dir and images_url config options.
-
-The permissions on the demo_images directory may not be correct. The directory
-should be owned by the user your webserver runs as and should have 755 
-permissions.
-
---------------------------------------------------------------------------------
-
-By  default this ImageManager is set up to browse some graphics
-in plugins/ImageManager/demo_images.
-
-For  security reasons image uploading is turned off by default.
-You can enable it by editing config.inc.php.
-
----------------------------------
-For Developers
----------------------------------
-
-CHANGES FROM Wei's Original Code:
-
-Single Backend:								 
----------------
-
-All  requests  from  the javascript code back to the server now
-are  routed  through  a  single  configurable  backend  script,
-backend.php.
-
-Request URLs are of the form:
-
- <config backend URL>(?|&)__plugin=ImageManager&__function=<function>&arg=value&arg=value
-
-The default URL is plugins/xinha/backend.php.
-
-This  approach  makes  it  possible  to  completely replace the
-backend  with  a  perl  or ASP implementation without having to
-change any of the client side code.
-
-You  can  override  the  location  and  name of the backend.php
-script by setting the config.ImageManager.backend property from
-the  calling  page. Make sure the URL ends in an "&". The code,
-for now, assumes it can just tack on variables.
-
-For  the moment the javascript files in the assets directory do
-not  have access to the main editor object and as a result have
-not  access to the config. For the moment we use a _backend_url
-variable  output  from  PHP  to communicate the location of the
-backend  to  these  assets.  It's  a  kludge. Ideally all these
-config  values  should  be  set  from  the  calling page and be
-available through the editor.config.ImageManager object.
-
-Debug Messages
----------------
-
-The  php files include a simple debugging library, ddt.php. See
-config.inc.php  for  how  to  turn  it on. It can display trace
-messages to the browser or dump them to a log file.
-
-I'll  try  to  package  up  the client-side tracing-to-textarea
-_ddt()  functions  I've  put  together.  Having a trace message
-infrastructure has always served me well.
-
--------------
-Flakey Editor
--------------
-
-The  editor  I  use  is  flakey  (but  very  very fast). It has
-problems with tab to space conversion so if the indenting looks
-weird that's why.
-
-----
-TODO
-----
-
-ImageManager really needs a complete rewrite. 
-
-. ImageManager should appear in a pane instead of a popup
-  window using Sleeman's windowpane support.
-
-.  html  and  php code are intermixed. It would be very nice to
-use  some  kind  of templating for the dialogs; this templating
-should be done long hand so it can be re-used regardless of the
-backend implementation language.
-
-.  the  config  should  probably  be  some format that would be
-easily  read  by  multiple  implementations of the back end. It
-would  be nice to have a single configuration system regardless
-of whether the backend is PHP, Perl or ASP.
-
-.  javascript assets are not objects. Passing config options to
-the  assets  functions requires intermediate variables which is
-really  ugly.  Everything should be cleanly integrated into the
-object heirarchy akin to the way Linker is done.
-
-.  if  an  image is selected from the document editor window it
-should  be  focused  and  highlighted  in  the  image selection
-window.
-
-. fix fully-qualified url in image selection box under MSIE.
-
-. per-image permissions. We should include some kind of backend
-permissions      management      so      users     can     only
-delete/edit/move/rename images that they have uploaded.
-
-. add a CANCEL button and a SAVE AS button to the editor.
-
-.  add  a  list view akin to EFM. (and include image properties
-width/height/depth/etc.)
-
-.  figure  out  a way for ImageManager to work "out of the box"
-regardless of install.
-
-. client-side tracing.
-
-. fancy stuff like adding a UI to define rollovers, animations,
-etc.
-
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ImageManager/assets/EditorContent.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ImageManager/assets/EditorContent.js
deleted file mode 100644
index 35655f0..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ImageManager/assets/EditorContent.js
+++ /dev/null
@@ -1,749 +0,0 @@
-/***********************************************************************
-** Title.........:  Online Image Editor Interface
-** Version.......:  1.0
-** Author........:  Xiang Wei ZHUO <wei@zhuo.org>
-** Filename......:  EditorContents.js
-** Last changed..:  31 Mar 2004 
-** Notes.........:  Handles most of the interface routines for the ImageEditor.
-*
-* Added:  29 Mar 2004  - Constrainted resizing/scaling
-**/ 
-
-
-function MM_findObj(n, d) { //v4.01
-  var p,i,x;  if(!d) d=document; if((p=n.indexOf("?"))>0&&parent.frames.length) {
-    d=parent.frames[n.substring(p+1)].document; n=n.substring(0,p);}
-  if(!(x=d[n])&&d.all) x=d.all[n]; for (i=0;!x&&i<d.forms.length;i++) x=d.forms[i][n];
-  for(i=0;!x&&d.layers&&i<d.layers.length;i++) x=MM_findObj(n,d.layers[i].document);
-  if(!x && d.getElementById) x=d.getElementById(n); return x;
-}
-
-var pic_x, pic_y;
-function P7_Snap() { //v2.62 by PVII
-  var x,y,ox,bx,oy,p,tx,a,b,k,d,da,e,el,args=P7_Snap.arguments;a=parseInt(a);
-  for (k=0; k<(args.length-3); k+=4)
-   if ((g=MM_findObj(args[k]))!=null) {
-    el=eval(MM_findObj(args[k+1]));
-    a=parseInt(args[k+2]);b=parseInt(args[k+3]);
-    x=0;y=0;ox=0;oy=0;p="";tx=1;da="document.all['"+args[k]+"']";
-    if(document.getElementById) {
-     d="document.getElementsByName('"+args[k]+"')[0]";
-     if(!eval(d)) {d="document.getElementById('"+args[k]+"')";if(!eval(d)) {d=da;}}
-    }else if(document.all) {d=da;} 
-    if (document.all || document.getElementById) {
-     while (tx==1) {p+=".offsetParent";
-      if(eval(d+p)) {x+=parseInt(eval(d+p+".offsetLeft"));y+=parseInt(eval(d+p+".offsetTop"));
-      }else{tx=0;}}
-     ox=parseInt(g.offsetLeft);oy=parseInt(g.offsetTop);var tw=x+ox+y+oy;
-     if(tw==0 || (navigator.appVersion.indexOf("MSIE 4")>-1 && navigator.appVersion.indexOf("Mac")>-1)) {
-      ox=0;oy=0;if(g.style.left){x=parseInt(g.style.left);y=parseInt(g.style.top);
-      }else{var w1=parseInt(el.style.width);bx=(a<0)?-5-w1:-10;
-      a=(Math.abs(a)<1000)?0:a;b=(Math.abs(b)<1000)?0:b;
-      //alert(event.clientX);
-	  if (event == null) x=document.body.scrollLeft + bx;
-		else x=document.body.scrollLeft + event.clientX + bx;
-	  if (event == null) y=document.body.scrollTop;
-		else y=document.body.scrollTop + event.clientY;}}
-   }else if (document.layers) {x=g.x;y=g.y;var q0=document.layers,dd="";
-    for(var s=0;s<q0.length;s++) {dd='document.'+q0[s].name;
-     if(eval(dd+'.document.'+args[k])) {x+=eval(dd+'.left');y+=eval(dd+'.top');break;}}}
-   if(el) {e=(document.layers)?el:el.style;
-   var xx=parseInt(x+ox+a),yy=parseInt(y+oy+b);
-   //alert(xx+":"+yy);
-   if(navigator.appName=="Netscape" && parseInt(navigator.appVersion)>4){xx+="px";yy+="px";}
-   if(navigator.appVersion.indexOf("MSIE 5")>-1 && navigator.appVersion.indexOf("Mac")>-1){
-    xx+=parseInt(document.body.leftMargin);yy+=parseInt(document.body.topMargin);
-    xx+="px";yy+="px";}e.left=xx;e.top=yy;}
-    pic_x = parseInt(xx); pic_y = parseInt(yy);
-    //alert(xx+":"+yy);
-    }
-}
-
-var ie=document.all
-var ns6=document.getElementById&&!document.all
-
-var dragapproved=false
-var z,x,y,status, ant, canvas, content, pic_width, pic_height, image, resizeHandle, oa_w, oa_h, oa_x, oa_y, mx2, my2;
-
-
-function init_resize() 
-{
-    if(mode == "scale") 
-    {
-        P7_Snap('theImage','ant',0,0);
-
-        if (canvas == null)
-            canvas = MM_findObj("imgCanvas");
-
-        if (pic_width == null || pic_height == null)
-        {
-            image = MM_findObj("theImage");
-            pic_width = image.width;
-            pic_height = image.height;
-        }
-        
-        if (ant == null)
-            ant = MM_findObj("ant");
-
-        ant.style.left = pic_x; ant.style.top = pic_y;
-        ant.style.width = pic_width; ant.style.height = pic_height;
-        ant.style.visibility = "visible";
-
-        drawBoundHandle();
-        jg_doc.paint();
-    }
-}
-
-initEditor = function () 
-{
-    init_crop();
-    init_resize();
-    var markerImg = MM_findObj('markerImg', window.top.document);
-
-    if (markerImg.src.indexOf("img/t_white.gif")>0)
-        toggleMarker() ;
-};
-
-function init_crop() 
-{
-    //if(mode == "crop") {
-        P7_Snap('theImage','ant',0,0);
-    //}
-}
-
-function setMode(newMode) 
-{
-    mode = newMode;
-    reset();
-}
-
-function reset() 
-{
-    if (ant == null)
-        ant = MM_findObj("ant");
-
-    ant.style.visibility = "hidden";
-    ant.style.left = 0;
-    ant.style.top = 0;
-    ant.style.width = 0;
-    ant.style.height = 0;
-
-    mx2 = null;
-    my2 = null;
-
-    jg_doc.clear();
-    if(mode != 'measure')
-        showStatus();   
-
-    if(mode == "scale") {
-        init_resize();
-    }
-
-    P7_Snap('theImage','ant',0,0);
-}
-
-function toggleMarker() 
-{
-    //alert("Toggle");
-    if (ant == null)
-        ant = MM_findObj("ant");
-
-    if(ant.className=="selection")
-        ant.className="selectionWhite";
-    else
-        ant.className="selection";
-    
-    if (jg_doc.getColor() == "#000000")
-        jg_doc.setColor("#FFFFFF");
-    else
-        jg_doc.setColor("#000000");
-    
-    drawBoundHandle
-    jg_doc.paint();
-}
-
-
-function move(e)
-{
-    if (dragapproved)
-    {
-        //z.style.left=ns6? temp1+e.clientX-x: temp1+event.clientX-x
-        //z.style.top=ns6? temp2+e.clientY-y : temp2+event.clientY-y
-        var w = ns6? temp1+e.clientX - x : temp1+event.clientX - x;
-        var h = ns6? temp2+e.clientY - y : temp2+event.clientY - y;
-
-        //alert(canvas.style.left);
-        /*if (status !=null)
-        {
-            status.innerHTML  = "x:"+x+" y:"+y+" w:"+w+" h:"+h+" can_h:"+pic_height;
-            status.innerHTML += " can_w:"+pic_width+" px:"+pic_x+" py:"+pic_y;
-            status.innerHTML += " pix:"+image.style.left+" piy:"+image.style.top+" obj:"+obj.id;
-        }*/
-
-        /*jg_doc.clear();
-        jg_doc.fillRectPattern(0,0,Math.abs(w),Math.abs(h),pattern);
-        jg_doc.paint();
-*/
-        if (ant != null)
-        {
-            if (w >= 0)
-            {
-                ant.style.left = x;
-                ant.style.width = w;
-            }
-            else
-            {
-                ant.style.left = x+w;
-                ant.style.width = -1*w;
-            }
-
-            if (h >= 0)
-            {
-                ant.style.top = y;
-                ant.style.height = h;
-            }
-            else
-            {
-                ant.style.top = y+h;
-                ant.style.height = -1*h
-            }
-        }
-        
-        showStatus();
-        return false
-    }
-}
-
-function moveContent(e) 
-{
-    if (dragapproved)
-    {
-
-        var dx =ns6? oa_x + e.clientX-x: oa_x + event.clientX-x
-        var dy =ns6? oa_y + e.clientY-y : oa_y + event.clientY-y
-
-
-        /*if (status !=null)
-        {
-            status.innerHTML  = "x:"+x+" y:"+y+" dx:"+dx+" dy:"+dy;
-        }*/
-
-        ant.style.left = dx;
-        ant.style.top = dy;
-
-        showStatus();
-
-        return false;
-    }
-}
-
-//Code add for constraints by Frédéric Klee <fklee@isuisse.com>
-function moveHandle(e) 
-{
-    if (dragapproved)
-    {
-        var w = ns6? e.clientX - x : event.clientX - x;
-        var h = ns6? e.clientY - y : event.clientY - y;
-        
-		var constrained = MM_findObj('constProp', window.top.document);
-        var orginal_height = document.theImage.height ;
-        var orginal_width = document.theImage.width ;
-        rapp = orginal_width/orginal_height ;
-        rapp_inv = orginal_height / orginal_width ;
-
-        switch(resizeHandle) 
-        {
-
-            case "s-resize":
-                if (oa_h + h >= 0) 
-				{
-                    ant.style.height = oa_h + h;
-					if(constrained.checked) 
-					{
-						ant.style.width = rapp * (oa_h + h) ;
-                        ant.style.left = oa_x - rapp * h/2;
-					}
-
-				}
-                break;
-            case "e-resize":
-                if(oa_w + w >= 0)
-				{
-                    ant.style.width = oa_w + w;
-					if(constrained.checked) 
-					{
-                        ant.style.height = rapp_inv * (oa_w + w) ;
-                        ant.style.top = oa_y - rapp_inv * w/2;
-                    }
-
-				}
-                break;
-            case "n-resize":
-                if (oa_h - h >= 0)
-                {
-                    ant.style.top = oa_y + h;
-                    ant.style.height = oa_h - h;
-					if(constrained.checked) 
-					{
-						ant.style.width = rapp * (oa_h - h) ;
-                        ant.style.left = oa_x + rapp * h/2;
-                    }
-
-                }
-                break;
-            case "w-resize":
-                if(oa_w - w >= 0) 
-				{
-                    ant.style.left = oa_x + w;
-                    ant.style.width = oa_w - w;
-					if(constrained.checked) 
-					{
-						ant.style.height = rapp_inv * (oa_w - w) ;
-						ant.style.top = oa_y + rapp_inv * w/2;
-                    }
-
-                }break;
-            case "nw-resize":
-                if(oa_h - h >= 0 && oa_w - w >= 0) {
-                    ant.style.left = oa_x + w;
-                    ant.style.width = oa_w - w;
-                    ant.style.top = oa_y + h;
-                    if(constrained.checked) 
-                        ant.style.height = rapp_inv * (oa_w - w) ;
-                    else
-                        ant.style.height = oa_h - h;
-                }
-            break;
-            case "ne-resize":
-                if (oa_h - h >= 0 && oa_w + w >= 0){
-                    ant.style.top = oa_y + h;
-					ant.style.width = oa_w + w;
-					if(constrained.checked) 
-                        ant.style.height = rapp_inv * (oa_w + w) ;
-                    else
-                        ant.style.height = oa_h - h;
-                }
-                break;
-            case "se-resize":
-                if (oa_h + h >= 0 && oa_w + w >= 0) 
-                {
-                    ant.style.width = oa_w + w;
-                    if(constrained.checked)
-                        ant.style.height = rapp_inv * (oa_w + w) ;
-                    else
-                        ant.style.height = oa_h + h;
-                }
-                break;
-            case "sw-resize":
-                if (oa_h + h >= 0 && oa_w - w >= 0)
-                {
-                    ant.style.left = oa_x + w;
-                    ant.style.width = oa_w - w;
-					if(constrained.checked)
-                        ant.style.height = rapp_inv * (oa_w - w) ;
-                    else
-                       ant.style.height = oa_h + h;
-				}
-        }
-        
-        showStatus();
-        return false;
-        
-    }
-}
-
-function drags(e)
-{
-    if (!ie&&!ns6)
-        return
-    
-    var firedobj=ns6? e.target : event.srcElement
-    var topelement=ns6? "HTML" : "BODY"
-
-    while (firedobj.tagName!=topelement&&
-            !(firedobj.className=="crop" 
-                || firedobj.className=="handleBox" 
-                || firedobj.className=="selection" || firedobj.className=="selectionWhite"))
-    {
-        firedobj=ns6? firedobj.parentNode : firedobj.parentElement
-    }
-
-    if(firedobj.className=="handleBox") {
-        
-        if(content != null) {
-            if(content.width != null && content.height != null) {
-                content.width = 0;
-                content.height = 0;
-            }
-            //alert(content.width+":"+content.height);
-        }
-        resizeHandle = firedobj.id;
-        
-        /*if(status!=null) {
-            status.innerHTML  = " obj:"+firedobj.id;
-        }*/
-
-        x=ns6? e.clientX: event.clientX
-        y=ns6? e.clientY: event.clientY
-
-        oa_w = parseInt(ant.style.width);
-        oa_h = parseInt(ant.style.height);
-        oa_x = parseInt(ant.style.left);
-        oa_y = parseInt(ant.style.top);
-
-        dragapproved=true
-        document.onmousemove=moveHandle;
-        return false;
-    }
-    else
-    if((firedobj.className == "selection" || firedobj.className=="selectionWhite")&& mode == "crop") {
-        
-        x=ns6? e.clientX: event.clientX
-        y=ns6? e.clientY: event.clientY
-        
-        oa_x = parseInt(ant.style.left);
-        oa_y = parseInt(ant.style.top);
-
-        dragapproved=true
-        document.onmousemove=moveContent;
-        return false;
-    }
-    else
-    if (firedobj.className=="crop" && mode == "crop")
-    {
-        if(content != null) {
-            if(content.width != null && content.height != null) {
-                content.width = 0;
-                content.height = 0;
-            }
-            //alert(content.width+":"+content.height);
-        }
-
-        if (status == null)
-            status = MM_findObj("status");
-
-        if (ant == null)
-            ant = MM_findObj("ant");
-
-        if (canvas == null)
-            canvas = MM_findObj("imgCanvas");
-        if(content == null) {
-            content = MM_findObj("cropContent");
-        }
-
-        if (pic_width == null || pic_height == null)
-        {
-            image = MM_findObj("theImage");
-            pic_width = image.width;
-            pic_height = image.height;
-        }
-
-        ant.style.visibility = "visible";
-
-        obj = firedobj;
-        dragapproved=true
-        z=firedobj
-        temp1=parseInt(z.style.left+0)
-        temp2=parseInt(z.style.top+0)
-        x=ns6? e.clientX: event.clientX
-        y=ns6? e.clientY: event.clientY
-        document.onmousemove=move
-        return false
-    }
-        else if(firedobj.className=="crop" && mode == "measure") {
-
-            if (ant == null)
-                ant = MM_findObj("ant");
-
-            if (canvas == null)
-                canvas = MM_findObj("imgCanvas");
-
-            x=ns6? e.clientX: event.clientX
-            y=ns6? e.clientY: event.clientY
-
-                //jg_doc.draw
-            dragapproved=true
-            document.onmousemove=measure
-
-            return false
-        }
-}
-
-function measure(e) 
-{
-    if (dragapproved)
-    {
-        mx2 = ns6? e.clientX : event.clientX;
-        my2 = ns6? e.clientY : event.clientY;
-        
-        jg_doc.clear();
-        jg_doc.setStroke(Stroke.DOTTED); 
-        jg_doc.drawLine(x,y,mx2,my2);
-        jg_doc.paint();
-        showStatus();
-        return false;
-    }
-}
-
-function setMarker(nx,ny,nw,nh) 
-{
-    if (isNaN(nx)) nx = 0;
-    if (isNaN(ny)) ny = 0;
-    if (isNaN(nw)) nw = 0;
-    if (isNaN(nh)) nh = 0;
-  
-    if (ant == null)
-      ant = MM_findObj("ant");
-
-    if (canvas == null)
-        canvas = MM_findObj("imgCanvas");
-    if(content == null) {
-        content = MM_findObj("cropContent");
-    }
-
-    if (pic_width == null || pic_height == null)
-    {
-        image = MM_findObj("theImage");
-        pic_width = image.width;
-        pic_height = image.height;
-    }
-
-    ant.style.visibility = "visible";
-
-    nx = pic_x + nx;
-    ny = pic_y + ny;
-
-    if (nw >= 0)
-    {
-        ant.style.left = nx;
-        ant.style.width = nw;
-    }
-    else
-    {
-        ant.style.left = nx+nw;
-        ant.style.width = -1*nw;
-    }
-
-    if (nh >= 0)
-    {
-        ant.style.top = ny;
-        ant.style.height = nh;
-    }
-    else
-    {
-        ant.style.top = ny+nh;
-        ant.style.height = -1*nh
-    }
-
-    
-}
-
-function max(x,y) 
-{
-    if(y > x)
-        return x;
-    else 
-        return y;
-}
-
-function drawBoundHandle() 
-{
-    if(ant == null || ant.style == null) 
-        return false;
-
-    var ah = parseInt(ant.style.height);
-    var aw = parseInt(ant.style.width);
-    var ax = parseInt(ant.style.left);
-    var ay = parseInt(ant.style.top);
-
-    jg_doc.drawHandle(ax-15,ay-15,30,30,"nw-resize"); //upper left
-    jg_doc.drawHandle(ax-15,ay+ah-15,30,30,"sw-resize"); //lower left
-    jg_doc.drawHandle(ax+aw-15,ay-15,30,30,"ne-resize"); //upper right
-    jg_doc.drawHandle(ax+aw-15,ay+ah-15,30,30,"se-resize"); //lower right
-
-    jg_doc.drawHandle(ax+max(15,aw/10),ay-8,aw-2*max(15,aw/10),8,"n-resize"); //top middle
-    jg_doc.drawHandle(ax+max(15,aw/10),ay+ah,aw-2*max(15,aw/10),8,"s-resize"); //bottom middle
-    jg_doc.drawHandle(ax-8, ay+max(15,ah/10),8,ah-2*max(15,ah/10),"w-resize"); //left middle
-    jg_doc.drawHandle(ax+aw, ay+max(15,ah/10),8,ah-2*max(15,ah/10),"e-resize"); //right middle
-
-
-
-    jg_doc.drawHandleBox(ax-4,ay-4,8,8,"nw-resize"); //upper left
-    jg_doc.drawHandleBox(ax-4,ay+ah-4,8,8,"sw-resize"); //lower left
-    jg_doc.drawHandleBox(ax+aw-4,ay-4,8,8,"ne-resize"); //upper right
-    jg_doc.drawHandleBox(ax+aw-4,ay+ah-4,8,8,"se-resize"); //lower right
-
-    jg_doc.drawHandleBox(ax+aw/2-4,ay-4,8,8,"n-resize"); //top middle
-    jg_doc.drawHandleBox(ax+aw/2-4,ay+ah-4,8,8,"s-resize"); //bottom middle
-    jg_doc.drawHandleBox(ax-4, ay+ah/2-4,8,8,"w-resize"); //left middle
-    jg_doc.drawHandleBox(ax+aw-4, ay+ah/2-4,8,8,"e-resize"); //right middle
-
-    //jg_doc.paint();
-}
-
-function showStatus() 
-{
-    if(ant == null || ant.style == null) {
-        return false;
-    }
-
-    if(mode == "measure") {
-        //alert(pic_x);
-        mx1 = x - pic_x;
-        my1 = y - pic_y;
-
-        mw = mx2 - x;
-        mh = my2 - y;
-
-        md = parseInt(Math.sqrt(mw*mw + mh*mh)*100)/100;
-
-        ma = (Math.atan(-1*mh/mw)/Math.PI)*180;
-        if(mw < 0 && mh < 0)
-            ma = ma+180;
-
-        if (mw <0 && mh >0)
-            ma = ma - 180;
-
-        ma = parseInt(ma*100)/100;
-
-        if (m_sx != null && !isNaN(mx1))
-            m_sx.value = mx1+"px";
-        if (m_sy != null && !isNaN(my1))
-            m_sy.value = my1+"px";
-        if(m_w != null && !isNaN(mw))
-            m_w.value = mw + "px";
-        if(m_h != null && !isNaN(mh))
-            m_h.value = mh + "px";
-
-        if(m_d != null && !isNaN(md))
-            m_d.value = md + "px";
-        if(m_a != null && !isNaN(ma))
-            m_a.value = ma + "";
-
-        if(r_ra != null &&!isNaN(ma))
-            r_ra.value = ma;            
-
-        //alert("mx1:"+mx1+" my1"+my1);
-        return false;
-    }
-
-    var ah = parseInt(ant.style.height);
-    var aw = parseInt(ant.style.width);
-    var ax = parseInt(ant.style.left);
-    var ay = parseInt(ant.style.top);
-
-    var cx = ax-pic_x<0?0:ax-pic_x;
-    var cy = ay-pic_y<0?0:ay-pic_y;
-    cx = cx>pic_width?pic_width:cx;
-    cy = cy>pic_height?pic_height:cy;
-    
-    var cw = ax-pic_x>0?aw:aw-(pic_x-ax);
-    var ch = ay-pic_y>0?ah:ah-(pic_y-ay);
-
-    ch = ay+ah<pic_y+pic_height?ch:ch-(ay+ah-pic_y-pic_height);
-    cw = ax+aw<pic_x+pic_width?cw:cw-(ax+aw-pic_x-pic_width);
-
-    ch = ch<0?0:ch; cw = cw<0?0:cw;
-    
-    if (ant.style.visibility == "hidden")
-    {
-        cx = ""; cy = ""; cw=""; ch="";
-    }
-
-    if(mode == 'crop') {
-        if(t_cx != null)
-            t_cx.value = cx;
-        if (t_cy != null)   
-            t_cy.value = cy;
-        if(t_cw != null)
-            t_cw.value = cw;
-        if (t_ch != null)   
-            t_ch.value = ch;
-    }
-    else if(mode == 'scale') {
-
-        var sw = aw, sh = ah;
-
-        if (s_sw.value.indexOf('%')>0 && s_sh.value.indexOf('%')>0)
-        {   
-            sw = cw/pic_width;
-            sh = ch/pic_height;
-        }
-        if (s_sw != null)
-            s_sw.value = sw;
-        if (s_sh != null)
-            s_sh.value = sh;
-    }
-
-}
-
-function dragStopped()
-{
-    dragapproved=false;
-
-    if(ant == null || ant.style == null) {
-        return false;
-    }
-
-    if(mode == "measure") {
-        jg_doc.drawLine(x-4,y,x+4,y);
-        jg_doc.drawLine(x,y-4,x,y+4);
-        jg_doc.drawLine(mx2-4,my2,mx2+4,my2);
-        jg_doc.drawLine(mx2,my2-4,mx2,my2+4);
-
-        jg_doc.paint();
-        showStatus();
-        return false;
-    }
-        var ah = parseInt(ant.style.height);
-        var aw = parseInt(ant.style.width);
-        var ax = parseInt(ant.style.left);
-        var ay = parseInt(ant.style.top);
-        jg_doc.clear();
-        
-        if(content != null) {
-            if(content.width != null && content.height != null) {
-                content.width = aw-1;
-                content.height = ah-1;
-            }
-            //alert(content.width+":"+content.height);
-        }
-        if(mode == "crop") {
-            //alert(pic_y);
-            jg_doc.fillRectPattern(pic_x,pic_y,pic_width,ay-pic_y,pattern);
-            
-            var h1 = ah;
-            var y1 = ay;
-            if (ah+ay >= pic_height+pic_y)
-                h1 = pic_height+pic_y-ay;
-            else if (ay <= pic_y)
-            {
-                h1 = ay+ah-pic_y;
-                y1 = pic_y;
-            }
-            jg_doc.fillRectPattern(pic_x,y1,ax-pic_x,h1,pattern);
-            jg_doc.fillRectPattern(ax+aw,y1,pic_x+pic_width-ax-aw,h1,pattern);
-            jg_doc.fillRectPattern(pic_x,ay+ah,pic_width,pic_height+pic_y-ay-ah,pattern);
-        }
-        else if(mode == "scale") {
-            //alert("Resizing: iw:"+image.width+" nw:"+aw);
-            document.theImage.height = ah;
-            document.theImage.width = aw;
-            document.theImage.style.height = ah+" px";
-            document.theImage.style.width = aw+" px";
-
-            P7_Snap('theImage','ant',0,0);
-
-            //alert("After Resizing: iw:"+image.width+" nw:"+aw);
-        }
-
-        drawBoundHandle();
-        jg_doc.paint();
-    
-        showStatus();
-    return false;
-}
-
-document.onmousedown=drags
-document.onmouseup=dragStopped;
-
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ImageManager/assets/ImageEditor.css b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ImageManager/assets/ImageEditor.css
deleted file mode 100644
index 7cefe46..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ImageManager/assets/ImageEditor.css
+++ /dev/null
@@ -1,76 +0,0 @@
-.icons {
-    font: 11px Tahoma,Verdana,sans-serif;
-    color: #666699;
-    text-align: center;
-    text-decoration: none;
-    border: 1px solid #EEEEFF;
-    -Moz-Border-Radius: 6px 6px 6px 6px;
-}
-
-body, td, p {
-    font: 11px Tahoma,Verdana,sans-serif;
-}
-.iconsOver {
-    font: 11px Tahoma,Verdana,sans-serif;
-    color: #666699;
-    text-align: center;
-    text-decoration: none;
-    background-color: #F9F9FF;
-    border: 1px solid #666699;
-    -Moz-Border-Radius: 6px 6px 6px 6px;
-}
-.topBar {
-    font: 11px Tahoma,Verdana,sans-serif;
-    color: #666699;
-}
-.iconsSel {
-    font: 11px Tahoma,Verdana,sans-serif;
-    color: #666699;
-    text-align: center;
-    text-decoration: none;
-    border: 1px solid #666699;
-    -Moz-Border-Radius: 6px 6px 6px 6px;
-}
-.iconText {
-    font: 11px Tahoma,Verdana,sans-serif;
-    color: #666699;
-    text-decoration: none;
-    text-align: center;
-}
-.measureStats{
-    width: 50px;
-}
-
-#slidercasing {
-    /*border:1px solid #CCCCCC;
-    background-color:#FFFFFF;*/
-    width:100px;
-    height:5px;
-    position:relative;
-    z-index:4;
-    padding:10px;
-}
-
-
-#slidertrack {
-    position:relative;
-    border:1px solid #CCCCCC;
-    background-color:#FFFFCC;
-    z-index:5;
-    height:5px;
-}
-
-
-#sliderbar {
-    position:absolute;
-    z-index:6;
-    border:1px solid #CCCCCC;
-    background-color:#DDDDDD;
-    width:15px;     
-    padding:0px;
-    height:20px; 
-    cursor: pointer;
-    top:2px;
-}
-
-select, input, button { font: 11px Tahoma,Verdana,sans-serif; }
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ImageManager/assets/dialog.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ImageManager/assets/dialog.js
deleted file mode 100644
index 0a41dd1..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ImageManager/assets/dialog.js
+++ /dev/null
@@ -1,119 +0,0 @@
-// Dialog v3.0 - Copyright (c) 2003-2004 interactivetools.com, inc.
-// This copyright notice MUST stay intact for use (see license.txt).
-//
-// Portions (c) dynarch.com, 2003-2004
-//
-// A free WYSIWYG editor replacement for <textarea> fields.
-// For full source code and docs, visit http://www.interactivetools.com/
-//
-// Version 3.0 developed by Mihai Bazon.
-//   http://dynarch.com/mishoo
-//
-// $Id:dialog.js 929 2008-01-09 21:10:59Z ray $
-
-// Though "Dialog" looks like an object, it isn't really an object.  Instead
-// it's just namespace for protecting global symbols.
-
-function Dialog(url, action, init) {
-	if (typeof init == "undefined") {
-		init = window;	// pass this window object by default
-	}
-	if (typeof window.showModalDialog == 'function')
-	{
-		Dialog._return = action;
-		var r = window.showModalDialog(url, init, "dialogheight=10;dialogwidth=10;resizable=yes");
-	}
-	else
-	{
-		Dialog._geckoOpenModal(url, action, init);
-	}
-}
-
-Dialog._parentEvent = function(ev) {
-	setTimeout( function() { if (Dialog._modal && !Dialog._modal.closed) { Dialog._modal.focus() } }, 50);
-	if (Dialog._modal && !Dialog._modal.closed) {
-		Dialog._stopEvent(ev);
-	}
-};
-
-
-// should be a function, the return handler of the currently opened dialog.
-Dialog._return = null;
-
-// constant, the currently opened dialog
-Dialog._modal = null;
-
-// the dialog will read it's args from this variable
-Dialog._arguments = null;
-
-Dialog._geckoOpenModal = function(url, action, init) {
-	//var urlLink = "hadialog"+url.toString();
-	var myURL = "hadialog"+url;
-	var regObj = /\W/g;
-	myURL = myURL.replace(regObj,'_');
-	var dlg = window.open(url, myURL,
-			      "toolbar=no,menubar=no,personalbar=no,width=10,height=10," +
-			      "scrollbars=no,resizable=yes,modal=yes,dependable=yes");
-	Dialog._modal = dlg;
-	Dialog._arguments = init;
-
-	// capture some window's events
-	function capwin(w) {
-		Dialog._addEvent(w, "click", Dialog._parentEvent);
-		Dialog._addEvent(w, "mousedown", Dialog._parentEvent);
-		Dialog._addEvent(w, "focus", Dialog._parentEvent);
-	}
-	// release the captured events
-	function relwin(w) {
-		Dialog._removeEvent(w, "click", Dialog._parentEvent);
-		Dialog._removeEvent(w, "mousedown", Dialog._parentEvent);
-		Dialog._removeEvent(w, "focus", Dialog._parentEvent);
-	}
-	capwin(window);
-	// capture other frames
-	for (var i = 0; i < window.frames.length; capwin(window.frames[i++]));
-	// make up a function to be called when the Dialog ends.
-	Dialog._return = function (val) {
-		if (val && action) {
-			action(val);
-		}
-		relwin(window);
-		// capture other frames
-		for (var i = 0; i < window.frames.length; relwin(window.frames[i++]));
-		Dialog._modal = null;
-	};
-};
-
-
-// event handling
-
-Dialog._addEvent = function(el, evname, func) {
-	if (Dialog.is_ie) {
-		el.attachEvent("on" + evname, func);
-	} else {
-		el.addEventListener(evname, func, true);
-	}
-};
-
-
-Dialog._removeEvent = function(el, evname, func) {
-	if (Dialog.is_ie) {
-		el.detachEvent("on" + evname, func);
-	} else {
-		el.removeEventListener(evname, func, true);
-	}
-};
-
-
-Dialog._stopEvent = function(ev) {
-	if (Dialog.is_ie) {
-		ev.cancelBubble = true;
-		ev.returnValue = false;
-	} else {
-		ev.preventDefault();
-		ev.stopPropagation();
-	}
-};
-
-Dialog.agt = navigator.userAgent.toLowerCase();
-Dialog.is_ie	   = ((Dialog.agt.indexOf("msie") != -1) && (Dialog.agt.indexOf("opera") == -1));
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ImageManager/assets/editor.css b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ImageManager/assets/editor.css
deleted file mode 100644
index 0bb553d..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ImageManager/assets/editor.css
+++ /dev/null
@@ -1,194 +0,0 @@
-		body

-		{

-			margin: 0; padding: 0;

-			font: 11px Tahoma,Verdana,sans-serif;

-		}

-		select, input, button { font: 11px Tahoma,Verdana,sans-serif; }

-

-		#indicator

-		{

-			width: 25px;

-			height: 20px;

-			background-color: #eef;			

-			padding: 15px 20px;

-			position: absolute;

-			left: 0; top: 0;

-		}

-		* html #indicator

-		{

-			padding: 14px 22px;

-		}

-		#tools

-		{

-			width: 600px;

-			height: 50px;

-			background-color: #eef;

-			padding: 0;

-			position: absolute;

-			left: 63px;

-			border-left: 1px solid white;

-			border-bottom: 1px solid white;

-		}

-		#toolbar

-		{

-			width: 53px;

-			height: 435px;

-			background-color: #eef;

-			float: left;

-			text-align: center;

-			padding: 5px;

-			position: absolute;

-			top: 50px;

-			border-top: 1px solid white;

-			border-right: 1px solid white;

-		}

-		

-		#contents

-		{

-			width: 600px;

-			height: 445px;

-			position: absolute;

-			left: 64px; top: 51px;

-		}

-		

-		#editor

-		{

-			width: 600px;

-			height: 445px;

-		}

-

-		#toolbar a 

-		{

-			padding: 5px;

-			width: 40px;

-			display: block;

-			border: 1px solid #eef;

-			text-align: center;

-			text-decoration: none;

-			color: #669;

-			margin: 5px 0;

-		}

-		#toolbar a:hover

-		{

-			background-color: #F9F9FF;

-			border-color: #669;

-		}

-		

-		#toolbar a.iconActive

-		{

-			border-color: #669;

-		}

-

-		#toolbar a span

-		{

-			display: block;

-			text-decoration: none;

-			

-		}

-		#toolbar a img

-		{

-			border: 0 none;

-		}

-		

-		#tools .textInput

-		{

-			width: 3em;

-			vertical-align: 0px;

-

-		}

-		* html #tools .textInput

-		{

-			vertical-align: middle;

-		}

-		#tools .measureStats

-		{

-			width: 4.5em;

-			border: 0 none;

-			background-color: #eef;

-			vertical-align: 0px;

-		}

-		* html #tools .measureStats

-		{

-			vertical-align: middle;

-		}

-		#tools label

-		{

-			margin: 0 2px 0 5px;

-		}

-		#tools input

-		{

-			vertical-align: middle;

-		}

-		#tools #tool_inputs

-		{

-			padding-top: 10px;

-			float: left;			

-		}

-		#tools .div

-		{

-			vertical-align: middle;

-			margin: 0 5px;

-		}

-		#tools img

-		{

-			border: 0 none;

-		}

-		#tools a.buttons

-		{

-			margin-top: 10px;

-			border: 1px solid #eef;

-			display: block;

-			float: left;

-		}

-		#tools a.buttons:hover

-		{

-			background-color: #F9F9FF;

-			border-color: #669;

-		}

-		#slidercasing {

-    /*border:1px solid #CCCCCC;

-    background-color:#FFFFFF;*/

-    width:100px;

-    height:5px;

-    position:relative;

-    z-index:4;

-    padding:10px;

-	 top: 6px;

-	 margin: 0 -5px 0 -10px;

-

-	

-}

-

-

-#slidertrack {

-    position:relative;

-    border:1px solid #CCCCCC;

-    background-color:#FFFFCC;

-    z-index:5;

-    height:5px;

-}

-

-

-#sliderbar {

-    position:absolute;

-    z-index:6;

-    border:1px solid #CCCCCC;

-    background-color:#DDDDDD;

-    width:15px;     

-    padding:0px;

-    height:20px; 

-    cursor: pointer;

-    top:2px;

-}

-

-* html #slidercasing

-{

-	top:0;

-}

-

-

-#bottom

-{

-	position: relative;

-	top: 490px;

-}

diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ImageManager/assets/editor.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ImageManager/assets/editor.js
deleted file mode 100644
index b9c8e8b..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ImageManager/assets/editor.js
+++ /dev/null
@@ -1,172 +0,0 @@
-/**
- * Functions for the ImageEditor interface, used by editor.php only	
- * @author $Author:ray $
- * @version $Id:editor.js 677 2007-01-19 22:24:36Z ray $
- * @package ImageManager
- */
-
-	var current_action = null;
-	var actions = ['crop', 'scale', 'rotate', 'measure', 'save'];
-	var orginal_width = null, orginal_height=null;
-	function toggle(action) 
-	{
-		if(current_action != action)
-		{
-
-			for (var i in actions)
-			{
-				if(actions[i] != action)
-				{
-					var tools = document.getElementById('tools_'+actions[i]);
-					tools.style.display = 'none';
-					var icon = document.getElementById('icon_'+actions[i]);
-					icon.className = '';
-				}
-			}
-
-			current_action = action;
-			
-			var tools = document.getElementById('tools_'+action);
-			tools.style.display = 'block';
-			var icon = document.getElementById('icon_'+action);
-			icon.className = 'iconActive';
-
-			var indicator = document.getElementById('indicator_image');
-			indicator.src = 'img/'+action+'.gif';
-
-			editor.setMode(current_action);
-
-			//constraints on the scale,
-			//code by Frédéric Klee <fklee@isuisse.com>
-			if(action == 'scale') 
-			{
-				var theImage = editor.window.document.getElementById('theImage');
-				orginal_width = theImage.width ;
-				orginal_height = theImage.height;
-
-                var w = document.getElementById('sw');
-				w.value = orginal_width ;
-				var h = document.getElementById('sh') ;
-				h.value = orginal_height ;
-			}
-
-		}
-	}
-
-	function toggleMarker() 
-	{
-		var marker = document.getElementById("markerImg");
-		
-		if(marker != null && marker.src != null) {
-			if(marker.src.indexOf("t_black.gif") >= 0)
-				marker.src = "img/t_white.gif";
-			else
-				marker.src = "img/t_black.gif";
-
-			editor.toggleMarker();
-		}
-	}
-
-	//Togggle constraints, by Frédéric Klee <fklee@isuisse.com>
-	function toggleConstraints() 
-	{
-		var lock = document.getElementById("scaleConstImg");
-		var checkbox = document.getElementById("constProp");
-		
-		if(lock != null && lock.src != null) {
-			if(lock.src.indexOf("unlocked2.gif") >= 0)
-			{
-				lock.src = "img/islocked2.gif";
-				checkbox.checked = true;
-				checkConstrains('width');
-
-			}
-			else
-			{
-				lock.src = "img/unlocked2.gif";
-				checkbox.checked = false;
-			}
-		}
-	}
-	
-	//check the constraints, by Frédéric Klee <fklee@isuisse.com>
-	function checkConstrains(changed) 
-	{
-		var constrained = document.getElementById('constProp');
-		if(constrained.checked) 
-		{
-			var w = document.getElementById('sw') ;
-			var width = w.value ;
-			var h = document.getElementById('sh') ;
-			var height = h.value ;
-			
-			if(orginal_width > 0 && orginal_height > 0) 
-			{
-				if(changed == 'width' && width > 0) 
-					h.value = parseInt((width/orginal_width)*orginal_height);
-				else if(changed == 'height' && height > 0) 
-					w.value = parseInt((height/orginal_height)*orginal_width);
-			}
-		}
-		
-		updateMarker('scale') ;
-	}
-
-
-	function updateMarker(mode) 
-	{
-		if (mode == 'crop')
-		{
-			var t_cx = document.getElementById('cx');
-			var t_cy = document.getElementById('cy');
-			var t_cw = document.getElementById('cw');
-			var t_ch = document.getElementById('ch');
-
-			editor.setMarker(parseInt(t_cx.value), parseInt(t_cy.value), parseInt(t_cw.value), parseInt(t_ch.value));
-		}
-		else if(mode == 'scale') {
-			var s_sw = document.getElementById('sw');
-			var s_sh = document.getElementById('sh');
-			editor.setMarker(0, 0, parseInt(s_sw.value), parseInt(s_sh.value));
-		}
-	}
-
-	
-	function rotatePreset(selection) 
-	{
-		var value = selection.options[selection.selectedIndex].value;
-		
-		if(value.length > 0 && parseInt(value) != 0) {
-			var ra = document.getElementById('ra');
-			ra.value = parseInt(value);
-		}
-	}
-
-	function updateFormat(selection) 
-	{
-		var selected = selection.options[selection.selectedIndex].value;
-
-		var values = selected.split(",");
-		if(values.length >1) {
-			updateSlider(parseInt(values[1]));
-		}
-
-	}
-	function addEvent(obj, evType, fn)
-	{ 
-		if (obj.addEventListener) { obj.addEventListener(evType, fn, true); return true; } 
-		else if (obj.attachEvent) {  var r = obj.attachEvent("on"+evType, fn);  return r;  } 
-		else {  return false; } 
-	} 
-
-	init = function()
-	{
-		var bottom = document.getElementById('bottom');
-		if(window.opener)
-		{
-			__dlg_init(bottom);
-			__dlg_translate('ImageManager');
-		}
-	}
-
-	addEvent(window, 'load', init);
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ImageManager/assets/editorFrame.css b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ImageManager/assets/editorFrame.css
deleted file mode 100644
index a95e421..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ImageManager/assets/editorFrame.css
+++ /dev/null
@@ -1,8 +0,0 @@
-body { margin: 0; padding: 0;  background-color: #eee; }

-table { width: 100%; }

-table td { text-align: center; }

-.crop{cursor:crosshair;}

-.selection { border: dotted 1px #000000; position:absolute; width: 0px; height: 1px; z-index:5; }

-.selectionWhite{ border: dotted 1px #FFFFFF; position:absolute; width: 0px; height: 1px; z-index:5; }

-.handleBox{ z-index:105; }

-.error { font-size:large; font-weight:bold; color:#c00; font-family: Helvetica, sans-serif; } 
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ImageManager/assets/editorFrame.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ImageManager/assets/editorFrame.js
deleted file mode 100644
index 96af13b..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ImageManager/assets/editorFrame.js
+++ /dev/null
@@ -1,98 +0,0 @@
-/**
- * Javascript used by the editorFrame.php, it basically initializes the frame.
- * @author $Author:ray $
- * @version $Id:editorFrame.js 677 2007-01-19 22:24:36Z ray $
- * @package ImageManager
- */
-
-var topDoc = window.top.document;
-
-var t_cx = topDoc.getElementById('cx');
-var t_cy = topDoc.getElementById('cy');
-var t_cw = topDoc.getElementById('cw');
-var t_ch = topDoc.getElementById('ch');
-
-var m_sx = topDoc.getElementById('sx');
-var m_sy = topDoc.getElementById('sy');
-var m_w = topDoc.getElementById('mw');
-var m_h = topDoc.getElementById('mh');
-var m_a = topDoc.getElementById('ma');
-var m_d = topDoc.getElementById('md');
-
-var s_sw = topDoc.getElementById('sw');
-var s_sh = topDoc.getElementById('sh');
-
-var r_ra = topDoc.getElementById('ra');
-
-var pattern = "img/2x2.gif";
-
-function doSubmit(action)
-{
-    if (action == 'crop')
-    {
-        // backend_url is set by the calling page. For now we assume it contains
-		  // a trailing &
-
-        var url = _backend_url + "__function=editorFrame&img="+currentImageFile+"&action=crop&params="+parseInt(t_cx.value)+','+parseInt(t_cy.value)+','+ parseInt(t_cw.value)+','+parseInt(t_ch.value);
-
-        //alert(url);
-        location.href = url;
-
-        //location.reload();
-    }   
-    else if (action == 'scale')
-    {
-        var url = _backend_url + "__function=editorFrame&img="+currentImageFile+"&action=scale&params="+parseInt(s_sw.value)+','+parseInt(s_sh.value);
-        //alert(url);
-        location.href = url;
-        
-    }
-    else if (action == 'rotate')
-    {
-        var flip = topDoc.getElementById('flip');
-
-        if(flip.value == 'hoz' || flip.value == 'ver') 
-            location.href = _backend_url + "__function=editorFrame&img="+currentImageFile+"&action=flip&params="+flip.value;
-        else if (isNaN(parseFloat(r_ra.value))==false)
-            location.href = _backend_url + "__function=editorFrame&img="+currentImageFile+"&action=rotate&params="+parseFloat(r_ra.value);
-    }
-    else if(action == 'save') {
-        var s_file = topDoc.getElementById('save_filename');
-        var s_format = topDoc.getElementById('save_format');
-        var s_quality = topDoc.getElementById('quality');
-
-        var format = s_format.value.split(",");
-        if(s_file.value.length <= 0) 
-		{
-            alert(i18n('Please enter a filename to save.'));
-        }
-        else
-        {
-            var filename = encodeURI(s_file.value);
-            var quality = parseInt(s_quality.value);
-            var url = _backend_url + "__function=editorFrame&img="+currentImageFile+"&action=save&params="+format[0]+","+quality+"&file="+filename;
-            //alert(url);
-            location.href = url;
-        }
-    }
-}
-
-
-function addEvent(obj, evType, fn)
-{ 
-	if (obj.addEventListener) { obj.addEventListener(evType, fn, true); return true; } 
-	else if (obj.attachEvent) {  var r = obj.attachEvent("on"+evType, fn);  return r;  } 
-	else {  return false; } 
-} 
-
-var jg_doc
-
-init = function()
-{
-	jg_doc = new jsGraphics("imgCanvas"); // draw directly into document
-	jg_doc.setColor("#000000"); // black
-
-	initEditor();
-};
-
-addEvent(window, 'load', init);
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ImageManager/assets/hover.htc b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ImageManager/assets/hover.htc
deleted file mode 100644
index 555d820..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ImageManager/assets/hover.htc
+++ /dev/null
@@ -1,34 +0,0 @@
-<attach event="onmouseover" handler="hoverRollOver" />
-<attach event="onmouseout" handler="hoverRollOff" />
-<script type="text/javascript">
-//
-//	Simple behaviour for IE5+ to emulate :hover CSS pseudo-class.
-//  Experimental ver 0.1
-//
-//	This is an experimental version! Handle with care!
-//	Manual at: http://www.hszk.bme.hu/~hj130/css/list_menu/hover/
-//
-
-function hoverRollOver() {
-	
-	element.origClassName = element.className;	// backup origonal className
-	
-	var tempClassStr = element.className;		
-	
-	tempClassStr += "Hover";					// convert name+'Hover' the last class name	to emulate tag.class:hover
-	
-	tempClassStr = tempClassStr.replace(/\s/g,"Hover ");	//convert name+'Hover' the others to emulate tag.class:hover
-	
-	tempClassStr += " hover";				// add simple 'hover' class name to emulate tag:hover
-	
-	element.className = element.className + " " + tempClassStr; 
-	
-	//alert(element.className);
-	//window.status = element.className;		// only for TEST
-}
-function hoverRollOff() {
-	element.className = element.origClassName;
-}
-
-</script>
-
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ImageManager/assets/imagelist.css b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ImageManager/assets/imagelist.css
deleted file mode 100644
index 933ce15..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ImageManager/assets/imagelist.css
+++ /dev/null
@@ -1,48 +0,0 @@
-body { margin: 0; padding: 0; }

-.edit   { font-size: small; font-family: small-caption, sans-serif; padding-top: 3px;}

-.edit a { border: none; padding: 3px; text-decoration:none; }

-.edit a:hover { background-color: ButtonHighlight; }

-.edit a img { border: none; vertical-align: bottom; }

-.noResult { font-size:large; font-weight:bold; color:#ccc; font-family: Helvetica, sans-serif;  text-align: center;  padding-top: 60px;   }

-.error { color:#c00; font-weight:bold; font-size: medium; font-family: Helvetica, sans-serif; text-align: center;  padding-top: 65px;}

-

-.dir_holder, .thumb_holder

-{

-  width:110px; height:132px;

-  float:left;

-  margin:6px;

-  background-color:ButtonFace;

-  border: 1px outset;

-}

-

-.thumb_holder.active

-{

-  background:Highlight;

-  color:HighlightText;

-  border:1px dashed Highlight;

-}

-

-.dir_holder a.dir, .thumb_holder a.thumb

-{

-  height:100px;

-  display:block;

-  text-align:center;

-  padding:5px;

-  text-decoration:none;

-}

-

-.thumb_holder a.thumb img

-{

-  border:1px solid black;

-}

-

-.dir_holder a.dir img

-{

-  border:none;

-}

-.listview { width:100% }

-.listview td, .listview th { text-align:left; font-size:small; }

-.listview td.actions { text-align:right; }

-.listview td.actions img { border:0px; }

-

-.flk-license { font-size: xx-small; text-align:center; }

diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ImageManager/assets/images.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ImageManager/assets/images.js
deleted file mode 100644
index 302dbe8..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ImageManager/assets/images.js
+++ /dev/null
@@ -1,148 +0,0 @@
-/**
- * Functions for the image listing, used by images.php only	
- * @author $Author:gogo $
- * @version $Id:images.js 927 2008-01-08 03:40:02Z gogo $
- * @package ImageManager
- */
-
-	function i18n(str) {
-        return Xinha._lc(str, 'ImageManager');
-	}
-
-	function changeDir(newDir) 
-	{
-		showMessage('Loading');
-
-		// backend_url is defined in the calling page. For now we 
-		// assume it has a trailing &
-
-		location.href = _backend_url + "__function=images&dir="+encodeURIComponent(newDir);
-	}
-
-
-	function newFolder(dir, newDir) 
-	{
-		location.href = _backend_url + "__function=images&dir="+encodeURIComponent(dir)+"&newDir="+encodeURIComponent(newDir);
-	}
-
-	//update the dir list in the parent window.
-	function updateDir(newDir)
-	{
-		var selection = window.top.document.getElementById('dirPath');
-		if(selection)
-		{
-			for(var i = 0; i < selection.length; i++)
-			{
-				var thisDir = selection.options[i].text;
-				if(thisDir == newDir)
-				{
-					selection.selectedIndex = i;
-					showMessage('Loading');
-					break;
-				}
-			}		
-		}
-	}
-
-	function selectImage(filename, alt, width, height) 
-	{
-		var topDoc = window.top.document;
-		
-		var obj = topDoc.getElementById('f_url');  obj.value = filename;
-		var obj = topDoc.getElementById('f_width');  obj.value = width;
-		var obj = topDoc.getElementById('f_width'); obj.value = width;
-		var obj = topDoc.getElementById('f_height'); obj.value = height;
-		var obj = topDoc.getElementById('f_alt'); obj.value = alt;
-		var obj = topDoc.getElementById('orginal_width'); obj.value = width;
-		var obj = topDoc.getElementById('orginal_height'); obj.value = height;		
-    // Set preview for the selected
-    topDoc.getElementById('f_preview').src = window.parent._backend_url + '__function=thumbs&img=' + encodeURIComponent(filename);
-    
-    update_selected();
-	}
-
-  var _current_selected = null;
-  function update_selected()
-  {
-    var topDoc = window.top.document;
-    if(_current_selected)
-    {
-      _current_selected.className = _current_selected.className.replace(/(^| )active( |$)/, '$1$2');
-      _current_selected = null;
-    }
-    // Grab the current file, and highlight it if we have it
-    var c_file = topDoc.getElementById('f_url').value;
-    var selection = topDoc.getElementById('dirPath');
-		var currentDir = selection.options[selection.selectedIndex].text;
-    var dRe = new RegExp('^(' + currentDir.replace(/([\/\^$*+?.()|{}[\]])/g, '\\$1') + ')([^/]*)$');
-    if(dRe.test(c_file))
-    {
-      var holder = document.getElementById('holder_' + asc2hex(RegExp.$2));
-      if(holder)
-      {
-        _current_selected = holder;
-        holder.className += ' active';
-      }
-    }
-  }
-
-  function asc2hex(str)
-  {
-    var hexstr = '';
-    for(var i = 0; i < str.length; i++)
-    {
-      var hex = (str.charCodeAt(i)).toString(16);
-      if(hex.length == 1) hex = '0' + hex;
-      hexstr += hex;
-    }
-    return hexstr;
-  }
-
-	function showMessage(newMessage) 
-	{
-		var topDoc = window.top.document;
-
-		var message = topDoc.getElementById('message');
-		var messages = topDoc.getElementById('messages');
-		if(message && messages)
-		{
-			if(message.firstChild)
-				message.removeChild(message.firstChild);
-
-			message.appendChild(topDoc.createTextNode(i18n(newMessage)));
-			
-			messages.style.display = "block";
-		}
-	}
-
-	function addEvent(obj, evType, fn)
-	{ 
-		if (obj.addEventListener) { obj.addEventListener(evType, fn, true); return true; } 
-		else if (obj.attachEvent) {  var r = obj.attachEvent("on"+evType, fn);  return r;  } 
-		else {  return false; } 
-	} 
-
-	function confirmDeleteFile(file) 
-	{
-		if(confirm(i18n("Delete file?")))
-			return true;
-	
-		return false;		
-	}
-
-	function confirmDeleteDir(dir, count) 
-	{
-		if(count > 0)
-		{
-			alert(i18n("Please delete all files/folders inside the folder you wish to delete first."));
-			return;
-		}
-
-		if(confirm(i18n("Delete folder?"))) 
-			return true;
-
-		return false;
-	}
-
-	addEvent(window, 'load', init);
-  Xinha = window.parent.Xinha;
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ImageManager/assets/manager.css b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ImageManager/assets/manager.css
deleted file mode 100644
index be0584a..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ImageManager/assets/manager.css
+++ /dev/null
@@ -1,47 +0,0 @@
-html, body, .dialog {  background-color: ButtonFace;  color: ButtonText; font: 11px Tahoma,Verdana,sans-serif; margin: 0; padding: 0;}
-body { padding: 5px; }
-fieldset { padding: 0;}
-.title { background-color: #ddf; color: #000; font-weight: bold; font-size: 120%; padding: 3px 10px; margin-bottom: 10px; border-bottom: 1px  solid black; letter-spacing: 2px;}
-form { padding: 0px;  margin: 0 auto; width: 550px;}
-
-a { padding: 5px; border: 1px solid ButtonFace;	}	
-a img	{ border: 0; }	
-a:hover { border-color: ButtonHighlight ButtonShadow ButtonShadow ButtonHighlight; }
-.dirs {	padding: 1em; 	}
-.imageFrame { width: 100%; height: 145px; margin: 0 auto; margin-top: 1em; background-color: White;}
-#youtubeChooser .imageFrame { height: 155px; }
-.smallWidth{ width: 4em; }
-.largelWidth{ width: 22em; }
-.inputTable { margin: 1em auto; }
-select, input, button { font: 11px Tahoma,Verdana,sans-serif; }
-.buttons { width: 70px; text-align: center; }
-.clearboth{ clear: both; }
-#messages { position: relative; left: 175px; top: 115px; background-color: white; width:200px;  float: left; margin-top: -52px; border: 1px solid #ccc; text-align: center; padding: 15px; }
-#message  { font-size: 15px; font-weight: bold; color: #69c; }
-iframe { border:1px inset; border-right:none; border-left:none; border-bottom:none; }
-
-table { margin-top:10px; }
-th, td { padding-right:3px; text-align:left; font-family:small-caption,helvetica,sans-serif; }
-
-.buttonColor {
-  width :1em;
-  margin-left: 2px;
-  cursor: default;
-}
-
-.buttonColor .chooser, .buttonColor .nocolor {
-  height: 0.6em;
-  border: 1px solid;
-  padding: 0px 1em;
-  border-color: ButtonHighlight ButtonShadow ButtonShadow ButtonHighlight;
-}
-
-.buttonColor .buttonClick {
-  border-color: ButtonShadow ButtonHighlight ButtonHighlight ButtonShadow;
-}
-.buttonColor .buttonColor-hilite {
-  border-color: ButtonShadow ButtonHighlight ButtonHighlight ButtonShadow;
-}
-
-.buttonColor .nocolor { padding: 0px; }
-.buttonColor .nocolor-hilite { background-color: #fff; color: #f00; }
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ImageManager/assets/manager.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ImageManager/assets/manager.js
deleted file mode 100644
index 72f4bc8..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ImageManager/assets/manager.js
+++ /dev/null
@@ -1,341 +0,0 @@
-/**
- * Functions for the ImageManager, used by manager.php only	
- * @author $Author:gogo $
- * @version $Id:manager.js 877 2007-08-12 15:50:03Z gogo $
- * @package ImageManager
- */
-	
-	//Translation
-	function i18n(str) {
-        return Xinha._lc(str, 'ImageManager');
-	}
-
-
-	//set the alignment options
-	function setAlign(align) 
-	{
-		var selection = document.getElementById('f_align');
-		for(var i = 0; i < selection.length; i++)
-		{
-			if(selection.options[i].value == align)
-			{
-				selection.selectedIndex = i;
-				break;
-			}
-		}
-	}
-
-	//initialise the form
-  doneinit = 0; // Seems that in Opera the load event of the iframe re-fires this one also.
-	init = function () 
-	{
-    if(doneinit++) return;
-    
-		__dlg_init(null, {width:600,height:460});
-
-		__dlg_translate('ImageManager');
-        
-        // This is so the translated string shows up in the drop down.
-        document.getElementById("f_align").selectedIndex = 1;
-        document.getElementById("f_align").selectedIndex = 0;
-        
-
-		var uploadForm = document.getElementById('uploadForm');
-		if(uploadForm) uploadForm.target = 'imgManager';
-
-		var param = window.dialogArguments;
-		if (param) 
-		{
-      var image_regex = new RegExp( '(https?://[^/]*)?' + base_url.replace(/\/$/, '') );
-      param.f_url = param.f_url.replace( image_regex, "" );
-
-      // The image URL may reference one of the automatically resized images 
-      // (when the user alters the dimensions in the picker), clean that up
-      // so it looks right and we get back to a normal f_url
-      var rd = (_resized_dir) ? _resized_dir.replace(Xinha.RE_Specials, '\\$1') + '/' : '';
-      var rp = _resized_prefix.replace(Xinha.RE_Specials, '\\$1');
-      var dreg = new RegExp('^(.*/)' + rd + rp + '_([0-9]+)x([0-9]+)_([^/]+)$');
-  
-      if(dreg.test(param.f_url))
-      {
-        param.f_url    = RegExp.$1 + RegExp.$4;
-        param.f_width  = RegExp.$2;
-        param.f_height = RegExp.$3;
-      }
-      
-      for (var id in param)
-      {
-        if(id == 'f_align') continue;
-        if(document.getElementById(id))
-        {
-          document.getElementById(id).value = param[id];
-        }
-      }
-
-
-
-      document.getElementById("orginal_width").value = param["f_width"];
-			document.getElementById("orginal_height").value = param["f_height"];
-			setAlign(param["f_align"]);
-
-      // Locate to the correct directory
-      var dreg = new RegExp('^(.*/)([^/]+)$');
-      if(dreg.test(param['f_url']) && !(new RegExp('^https?://','i')).test(param['f_url']))
-      {
-        changeDir(RegExp.$1);
-        var dirPath = document.getElementById('dirPath');
-        for(var i = 0; i < dirPath.options.length; i++)
-        {
-          if(dirPath.options[i].value == encodeURIComponent(RegExp.$1))
-          {
-            dirPath.options[i].selected = true;
-            break;
-          }
-        }
-      }
-      document.getElementById('f_preview').src = _backend_url + '__function=thumbs&img=' + encodeURIComponent(param.f_url);      
-		}
-		
-		 // Hookup color pickers
-    new Xinha.colorPicker.InputBinding(document.getElementById('f_backgroundColor'));
-    new Xinha.colorPicker.InputBinding(document.getElementById('f_borderColor'));
-
-		document.getElementById("f_alt").focus();
-	};
-
-
-	function onCancel() 
-	{
-		__dlg_close(null);
-		return false;
-	}
-
-	function onOK() 
-	{
-		// pass data back to the calling window
-		var fields = ["f_url", "f_alt", "f_align", "f_width", "f_height", "f_padding", "f_margin", "f_border", "f_borderColor", "f_backgroundColor", 'f_hspace', 'f_vspace'];
-		var param = new Object();
-		for (var i in fields) 
-		{
-			var id = fields[i];
-			var el = document.getElementById(id);
-			if(id == "f_url" && el.value.indexOf('://') < 0 )
-				{
-
-				if ( el.value == "" )
-					{
-					alert( i18n("No Image selected.") );
-					return( false );
-					}
-
-				param[id] = makeURL(base_url,el.value);
-				}
-			else if (el)
-				param[id] = el.value;
-      // else alert("Missing " + fields[i]); <-- Not useful to tell people this, maybe for debugging.
-
-		}
-
-    // See if we need to resize the image
-    var origsize =
-    {
-      w:document.getElementById('orginal_width').value,
-      h:document.getElementById('orginal_height').value
-    }
-
-    if(  (origsize.w != param.f_width)
-      || (origsize.h != param.f_height) )
-    {
-      // Yup, need to resize
-      var resized = Xinha._geturlcontent(_backend_url + '&__function=resizer&img=' + encodeURIComponent(document.getElementById('f_url').value) + '&width=' + param.f_width + '&height=' + param.f_height);
-      // alert(resized);
-      resized = eval(resized);
-      if(resized)
-      {
-        param.f_url = makeURL(base_url, resized);
-      }
-    }
-
-
-		__dlg_close(param);
-		return false;
-	}
-
-	//similar to the Files::makeFile() in Files.php
-	function makeURL(pathA, pathB) 
-	{
-		if(pathA.substring(pathA.length-1) != '/')
-			pathA += '/';
-
-		if(pathB.charAt(0) == '/');	
-			pathB = pathB.substring(1);
-
-		return pathA+pathB;
-	}
-
-
-	function updateDir(selection) 
-	{
-		var newDir = selection.options[selection.selectedIndex].value;
-		changeDir(newDir);
-	}
-
-	function goUpDir() 
-	{
-		var selection = document.getElementById('dirPath');
-		var currentDir = selection.options[selection.selectedIndex].text;
-		if(currentDir.length < 2)
-			return false;
-		var dirs = currentDir.split('/');
-		
-		var search = '';
-
-		for(var i = 0; i < dirs.length - 2; i++)
-		{
-			search += dirs[i]+'/';
-		}
-
-		for(var i = 0; i < selection.length; i++)
-		{
-			var thisDir = selection.options[i].text;
-			if(thisDir == search)
-			{
-				selection.selectedIndex = i;
-				var newDir = selection.options[i].value;
-				changeDir(newDir);
-				break;
-			}
-		}
-	}
-
-	function changeDir(newDir) 
-	{
-		if(typeof imgManager != 'undefined')
-    {      
-	    imgManager.changeDir(newDir);
-    }
-	}
-
-	function toggleConstrains(constrains) 
-	{
-		var lockImage = document.getElementById('imgLock');
-		var constrains = document.getElementById('constrain_prop');
-
-		if(constrains.checked) 
-		{
-			lockImage.src = "img/locked.gif";	
-			checkConstrains('width') 
-		}
-		else
-		{
-			lockImage.src = "img/unlocked.gif";	
-		}
-	}
-
-	function checkConstrains(changed) 
-	{
-		//alert(document.form1.constrain_prop);
-		var constrains = document.getElementById('constrain_prop');
-		
-		if(constrains.checked) 
-		{
-			var obj = document.getElementById('orginal_width');
-			var orginal_width = parseInt(obj.value);
-			var obj = document.getElementById('orginal_height');
-			var orginal_height = parseInt(obj.value);
-
-			var widthObj = document.getElementById('f_width');
-			var heightObj = document.getElementById('f_height');
-			
-			var width = parseInt(widthObj.value);
-			var height = parseInt(heightObj.value);
-
-			if(orginal_width > 0 && orginal_height > 0) 
-			{
-				if(changed == 'width' && width > 0) {
-					heightObj.value = parseInt((width/orginal_width)*orginal_height);
-				}
-
-				if(changed == 'height' && height > 0) {
-					widthObj.value = parseInt((height/orginal_height)*orginal_width);
-				}
-			}			
-		}
-	}
-
-	function showMessage(newMessage) 
-	{
-		var message = document.getElementById('message');
-		var messages = document.getElementById('messages');
-		if(message.firstChild)
-			message.removeChild(message.firstChild);
-
-		message.appendChild(document.createTextNode(i18n(newMessage)));
-		
-		messages.style.display = '';
-	}
-
-	function addEvent(obj, evType, fn)
-	{ 
-		if (obj.addEventListener) { obj.addEventListener(evType, fn, true); return true; } 
-		else if (obj.attachEvent) {  var r = obj.attachEvent("on"+evType, fn);  return r;  } 
-		else {  return false; } 
-	} 
-
-	function doUpload() 
-	{
-		
-		var uploadForm = document.getElementById('uploadForm');
-		if(uploadForm)
-			showMessage('Uploading');
-	}
-
-	function refresh()
-	{
-		var selection = document.getElementById('dirPath');
-		updateDir(selection);
-	}
-
-
-	function newFolder()
-	{
-		function createFolder(folder)
-		{
-			var selection = document.getElementById('dirPath');
-			var dir = selection.options[selection.selectedIndex].value;
-
-			if(folder == thumbdir)
-			{
-				alert(i18n('Invalid folder name, please choose another folder name.'));
-				return false;
-			}
-
-			if (folder && folder != '' && typeof imgManager != 'undefined')
-			{
-				imgManager.newFolder(dir, encodeURI(folder));
-			}
-		}
-		// IE7 has crippled the prompt()
-		if (Xinha.ie_version > 6)
-		{
-			Dialog("newFolder.html", function(param)
-			{
-				if (!param) // user must have pressed Cancel
-				{
-					return false;
-				}
-				else
-				{
-					var folder = param['f_foldername'];
-					createFolder(folder);
-				}
-			}, null);
-		}
-		else
-		{
-			var folder = prompt(i18n('Please enter name for new folder...'), i18n('Untitled'));
-			createFolder(folder);
-		}
-	}
-  
-	addEvent(window, 'load', init);
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ImageManager/assets/popup.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ImageManager/assets/popup.js
deleted file mode 100644
index d599cc8..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ImageManager/assets/popup.js
+++ /dev/null
@@ -1,40 +0,0 @@
-// htmlArea v3.0 - Copyright (c) 2002, 2003 interactivetools.com, inc.

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

-//

-// Portions (c) dynarch.com, 2003

-//

-// A free WYSIWYG editor replacement for <textarea> fields.

-// For full source code and docs, visit http://www.interactivetools.com/

-//

-// Version 3.0 developed by Mihai Bazon.

-//   http://dynarch.com/mishoo

-//

-// $Id:popup.js 856 2007-06-13 18:34:34Z wymsy $

-

-// Override the ordinary popup.js translation to add translation for a few other HTML elements.

-

-function __dlg_translate(context) {

-    var types = ["span", "option", "td", "th", "button", "div", "label", "a","img", "legend"];

-    for (var type = 0; type < types.length; ++type) {

-        var spans = document.getElementsByTagName(types[type]);

-        for (var i = spans.length; --i >= 0;) {

-            var span = spans[i];

-            if (span.firstChild && span.firstChild.data) {

-                var txt = Xinha._lc(span.firstChild.data, context);

-                if (txt)

-                    span.firstChild.data = txt;

-            }

-            if (span.title) {

-                var txt = Xinha._lc(span.title, context);

-                if (txt)

-                    span.title = txt;

-            }

-            if (span.alt) {

-                var txt = Xinha._lc(span.alt, context);

-                if (txt)

-                    span.alt = txt;

-            }

-        }

-    }

-    document.title = Xinha._lc(document.title, context);

-}
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ImageManager/assets/slider.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ImageManager/assets/slider.js
deleted file mode 100644
index 5ddee75..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ImageManager/assets/slider.js
+++ /dev/null
@@ -1,105 +0,0 @@
-/***********************************************************************
-** Title.........:  Simple Lite Slider for Image Editor
-** Version.......:  1.1
-** Author........:  Xiang Wei ZHUO <wei@zhuo.org>
-** Filename......:  slider.js
-** Last changed..:  31 Mar 2004 
-** Notes.........:  Works in IE and Mozilla
-**/ 
-
-var ie=document.all
-var ns6=document.getElementById&&!document.all
-
-document.onmouseup = captureStop;
-
-var currentSlider = null,sliderField = null;
-var rangeMin = null, rangeMax= null, sx = -1, sy = -1, initX=0;
-
-function getMouseXY(e) {
-
-    //alert('hello');
-    x = ns6? e.clientX: event.clientX
-    y = ns6? e.clientY: event.clientY
-    
-    if (sx < 0) sx = x; if (sy < 0) sy = y;
-
-    var dx = initX +(x-sx);
-    
-    if (dx <= rangeMin)
-        dx = rangeMin;
-    else if (dx >= rangeMax)
-        dx = rangeMax;
-
-    var range = (dx-rangeMin)/(rangeMax - rangeMin)*100;
-
-    if (currentSlider !=  null)
-        currentSlider.style.left = dx+"px";
-        
-    if (sliderField != null)
-    {
-        sliderField.value = parseInt(range);
-    }
-    return false;
-
-}
-
-function initSlider()
-{
-    if (currentSlider == null)
-        currentSlider = document.getElementById('sliderbar');
-   
-    if (sliderField == null)
-        sliderField = document.getElementById('quality');
-
-    if (rangeMin == null)
-        rangeMin = 3
-    if (rangeMax == null)
-    {
-        var track = document.getElementById('slidertrack');
-        rangeMax = parseInt(track.style.width);
-    }
-
-}
-
-function updateSlider(value)
-{
-    initSlider();
-
-    var newValue = parseInt(value)/100*(rangeMax-rangeMin);
-
-    if (newValue <= rangeMin)
-        newValue = rangeMin;
-    else if (newValue >= rangeMax)
-        newValue = rangeMax;
-
-    if (currentSlider !=  null)
-        currentSlider.style.left = newValue+"px";
-    
-    var range = newValue/(rangeMax - rangeMin)*100;
-
-    if (sliderField != null)
-        sliderField.value = parseInt(range);
-}
-
-function captureStart()
-{
-    
-    initSlider();
-
-    initX = parseInt(currentSlider.style.left);
-    if (initX > rangeMax)
-        initX = rangeMax;
-    else if (initX < rangeMin)
-        initX = rangeMin;
-
-    document.onmousemove = getMouseXY;
-
-    return false;
-}
-
-function captureStop()
-{
-    sx = -1; sy = -1;
-    document.onmousemove = null;
-    return false;
-}
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ImageManager/assets/wz_jsgraphics.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ImageManager/assets/wz_jsgraphics.js
deleted file mode 100644
index b5c2151..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ImageManager/assets/wz_jsgraphics.js
+++ /dev/null
@@ -1,921 +0,0 @@
-/***********************************************************************
-** Title.........:  Javascript Graphics
-** Version.......:  1.0
-** Author........:  Xiang Wei ZHUO <wei@zhuo.org>
-** Filename......:  wz_jsgraphics.js
-** Last changed..:  31 Aug 2003  
-** Notes.........:  Modified for Image Editor, added extra commands
-**/ 
-
-/* This notice must be untouched at all times.
-
-wz_jsgraphics.js    v. 2.03
-The latest version is available at
-http://www.walterzorn.com
-or http://www.devira.com
-or http://www.walterzorn.de
-
-Copyright (c) 2002-2003 Walter Zorn. All rights reserved.
-Created 3. 11. 2002 by Walter Zorn <walter@kreuzotter.de>
-Last modified: 11. 6. 2003
-
-High Performance JavaScript Graphics Library.
-Provides methods
-- to draw lines, rectangles, ellipses, polygons
-  with specifiable line thickness,
-- to fill rectangles and ellipses
-- to draw text.
-NOTE: Operations, functions and branching have rather been optimized
-to efficiency and speed than to shortness of source code.
-
-This program is free software;
-you can redistribute it and/or modify it under the terms of the
-GNU General Public License as published by the Free Software Foundation;
-either version 2 of the License, or (at your option) any later version.
-This program is distributed in the hope that it will be useful,
-but WITHOUT ANY WARRANTY;
-without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
-See the GNU General Public License
-at http://www.gnu.org/copyleft/gpl.html for more details.
-*/
-
-
-
-
-
-var jg_ihtm, jg_ie, jg_dom,
-jg_n4 = (document.layers && typeof document.classes != "undefined");
-
-
-
-
-
-function chkDHTM(x, i)
-{
-    x = document.body || null;
-    jg_ie = (x && typeof x.insertAdjacentHTML != "undefined");
-    jg_dom = (x && !jg_ie &&
-        typeof x.appendChild != "undefined" &&
-        typeof document.createRange != "undefined" &&
-        typeof (i = document.createRange()).setStartBefore != "undefined" &&
-        typeof i.createContextualFragment != "undefined");
-    jg_ihtm = (!jg_ie && !jg_dom && x && typeof x.innerHTML != "undefined");
-}
-
-
-
-
-
-function pntDoc()
-{
-    this.wnd.document.write(this.htm);
-    this.htm = '';
-}
-
-
-
-
-
-function pntCnvDom()
-{
-    var x = document.createRange();
-    x.setStartBefore(this.cnv);
-    x = x.createContextualFragment(this.htm);
-    this.cnv.appendChild(x);
-    this.htm = '';
-}
-
-
-
-
-
-function pntCnvIe()
-{
-    this.cnv.insertAdjacentHTML("BeforeEnd", this.htm);
-    this.htm = '';
-}
-
-
-
-
-
-function pntCnvIhtm()
-{
-    this.cnv.innerHTML += this.htm;
-    this.htm = '';
-}
-
-
-
-
-
-function pntCnv()
-{
-    this.htm = '';
-}
-
-
-
-
-
-function mkDiv(x, y, w, h)
-{
-    this.htm += '<div style="position:absolute;'+
-        'left:' + x + 'px;'+
-        'top:' + y + 'px;'+
-        'width:' + w + 'px;'+
-        'height:' + h + 'px;'+
-        'clip:rect(0,'+w+'px,'+h+'px,0);'+
-        'overflow:hidden;background-color:' + this.color + ';'+
-        '"><\/div>';
-
-    //alert(this.htm);
-}
-
-
-
-
-function mkDivPrint(x, y, w, h)
-{
-    this.htm += '<div style="position:absolute;'+
-        'border-left:' + w + 'px solid ' + this.color + ';'+
-        'left:' + x + 'px;'+
-        'top:' + y + 'px;'+
-        'width:' + w + 'px;'+
-        'height:' + h + 'px;'+
-        'clip:rect(0,'+w+'px,'+h+'px,0);'+
-        'overflow:hidden;background-color:' + this.color + ';'+
-        '"><\/div>';
-}
-
-
-
-
-
-function mkLyr(x, y, w, h)
-{
-    this.htm += '<layer '+
-        'left="' + x + '" '+
-        'top="' + y + '" '+
-        'width="' + w + '" '+
-        'height="' + h + '" '+
-        'bgcolor="' + this.color + '"><\/layer>\n';
-}
-
-
-
-
-
-function mkLbl(txt, x, y)
-{
-    this.htm += '<div style="position:absolute;white-space:nowrap;'+
-        'left:' + x + 'px;'+
-        'top:' + y + 'px;'+
-        'font-family:' +  this.ftFam + ';'+
-        'font-size:' + this.ftSz + ';'+
-        'color:' + this.color + ';' + this.ftSty + '">'+
-        txt +
-        '<\/div>';
-}
-
-
-
-
-
-function mkLin(x1, y1, x2, y2)
-{
-    if (x1 > x2)
-    {
-        var _x2 = x2;
-        var _y2 = y2;
-        x2 = x1;
-        y2 = y1;
-        x1 = _x2;
-        y1 = _y2;
-    }
-    var dx = x2-x1, dy = Math.abs(y2-y1),
-    x = x1, y = y1,
-    yIncr = (y1 > y2)? -1 : 1;
-
-    if (dx >= dy)
-    {
-        var pr = dy<<1,
-        pru = pr - (dx<<1),
-        p = pr-dx,
-        ox = x;
-        while ((dx--) > 0)
-        {
-            ++x;
-            if (p > 0)
-            {
-                this.mkDiv(ox, y, x-ox, 1);
-                y += yIncr;
-                p += pru;
-                ox = x;
-            }
-            else p += pr;
-        }
-        this.mkDiv(ox, y, x2-ox+1, 1);
-    }
-
-    else
-    {
-        var pr = dx<<1,
-        pru = pr - (dy<<1),
-        p = pr-dy,
-        oy = y;
-        if (y2 <= y1)
-        {
-            while ((dy--) > 0)
-            {
-                if (p > 0)
-                {
-                    this.mkDiv(x++, y, 1, oy-y+1);
-                    y += yIncr;
-                    p += pru;
-                    oy = y;
-                }
-                else
-                {
-                    y += yIncr;
-                    p += pr;
-                }
-            }
-            this.mkDiv(x2, y2, 1, oy-y2+1);
-        }
-        else
-        {
-            while ((dy--) > 0)
-            {
-                y += yIncr;
-                if (p > 0)
-                {
-                    this.mkDiv(x++, oy, 1, y-oy);
-                    p += pru;
-                    oy = y;
-                }
-                else p += pr;
-            }
-            this.mkDiv(x2, oy, 1, y2-oy+1);
-        }
-    }
-}
-
-
-
-
-
-function mkLin2D(x1, y1, x2, y2)
-{
-    if (x1 > x2)
-    {
-        var _x2 = x2;
-        var _y2 = y2;
-        x2 = x1;
-        y2 = y1;
-        x1 = _x2;
-        y1 = _y2;
-    }
-    var dx = x2-x1, dy = Math.abs(y2-y1),
-    x = x1, y = y1,
-    yIncr = (y1 > y2)? -1 : 1;
-
-
-    var s = this.stroke;
-    if (dx >= dy)
-    {
-        if (s-0x3 > 0)
-        {
-            var _s = (s*dx*Math.sqrt(1+dy*dy/(dx*dx))-dx-(s>>1)*dy) / dx;
-            _s = (!(s-0x4)? Math.ceil(_s) : Math.round(_s)) + 1;
-        }
-        else var _s = s;
-        var ad = Math.ceil(s/2);
-
-        var pr = dy<<1,
-        pru = pr - (dx<<1),
-        p = pr-dx,
-        ox = x;
-        while ((dx--) > 0)
-        {
-            ++x;
-            if (p > 0)
-            {
-                this.mkDiv(ox, y, x-ox+ad, _s);
-                y += yIncr;
-                p += pru;
-                ox = x;
-            }
-            else p += pr;
-        }
-        this.mkDiv(ox, y, x2-ox+ad+1, _s);
-    }
-
-    else
-    {
-        if (s-0x3 > 0)
-        {
-            var _s = (s*dy*Math.sqrt(1+dx*dx/(dy*dy))-(s>>1)*dx-dy) / dy;
-            _s = (!(s-0x4)? Math.ceil(_s) : Math.round(_s)) + 1;
-        }
-        else var _s = s;
-        var ad = Math.round(s/2);
-
-        var pr = dx<<1,
-        pru = pr - (dy<<1),
-        p = pr-dy,
-        oy = y;
-        if (y2 <= y1)
-        {
-            ++ad;
-            while ((dy--) > 0)
-            {
-                if (p > 0)
-                {
-                    this.mkDiv(x++, y, _s, oy-y+ad);
-                    y += yIncr;
-                    p += pru;
-                    oy = y;
-                }
-                else
-                {
-                    y += yIncr;
-                    p += pr;
-                }
-            }
-            this.mkDiv(x2, y2, _s, oy-y2+ad);
-        }
-        else
-        {
-            while ((dy--) > 0)
-            {
-                y += yIncr;
-                if (p > 0)
-                {
-                    this.mkDiv(x++, oy, _s, y-oy+ad);
-                    p += pru;
-                    oy = y;
-                }
-                else p += pr;
-            }
-            this.mkDiv(x2, oy, _s, y2-oy+ad+1);
-        }
-    }
-}
-
-
-
-
-
-function mkLinDott(x1, y1, x2, y2)
-{
-    if (x1 > x2)
-    {
-        var _x2 = x2;
-        var _y2 = y2;
-        x2 = x1;
-        y2 = y1;
-        x1 = _x2;
-        y1 = _y2;
-    }
-    var dx = x2-x1, dy = Math.abs(y2-y1),
-    x = x1, y = y1,
-    yIncr = (y1 > y2)? -1 : 1,
-    drw = true;
-    if (dx >= dy)
-    {
-        var pr = dy<<1,
-        pru = pr - (dx<<1),
-        p = pr-dx;
-        while ((dx--) > 0)
-        {
-            if (drw) this.mkDiv(x, y, 1, 1);
-            drw = !drw;
-            if (p > 0)
-            {
-                y += yIncr;
-                p += pru;
-            }
-            else p += pr;
-            ++x;
-        }
-        if (drw) this.mkDiv(x, y, 1, 1);
-    }
-
-    else
-    {
-        var pr = dx<<1,
-        pru = pr - (dy<<1),
-        p = pr-dy;
-        while ((dy--) > 0)
-        {
-            if (drw) this.mkDiv(x, y, 1, 1);
-            drw = !drw;
-            y += yIncr;
-            if (p > 0)
-            {
-                ++x;
-                p += pru;
-            }
-            else p += pr;
-        }
-        if (drw) this.mkDiv(x, y, 1, 1);
-    }
-}
-
-
-
-
-
-function mkOv(left, top, width, height)
-{
-    var a = width>>1, b = height>>1,
-    wod = width&1, hod = (height&1)+1,
-    cx = left+a, cy = top+b,
-    x = 0, y = b,
-    ox = 0, oy = b,
-    aa = (a*a)<<1, bb = (b*b)<<1,
-    st = (aa>>1)*(1-(b<<1)) + bb,
-    tt = (bb>>1) - aa*((b<<1)-1),
-    w, h;
-    while (y > 0)
-    {
-        if (st < 0)
-        {
-            st += bb*((x<<1)+0x3);
-            tt += (bb<<1)*(++x);
-        }
-        else if (tt < 0)
-        {
-            st += bb*((x<<1)+0x3) - (aa<<1)*(y-1);
-            tt += (bb<<1)*(++x) - aa*(((y--)<<1)-0x3);
-            w = x-ox;
-            h = oy-y;
-            if (w&0x2 && h&0x2)
-            {
-                this.mkOvQds(cx, cy, -x+0x2, ox+wod, -oy, oy-1+hod, 1, 1);
-                this.mkOvQds(cx, cy, -x+1, x-1+wod, -y-1, y+hod, 1, 1);
-            }
-            else this.mkOvQds(cx, cy, -x+1, ox+wod, -oy, oy-h+hod, w, h);
-            ox = x;
-            oy = y;
-        }
-        else
-        {
-            tt -= aa*((y<<1)-0x3);
-            st -= (aa<<1)*(--y);
-        }
-    }
-    this.mkDiv(cx-a, cy-oy, a-ox+1, (oy<<1)+hod);
-    this.mkDiv(cx+ox+wod, cy-oy, a-ox+1, (oy<<1)+hod);
-}
-
-
-
-
-
-function mkOv2D(left, top, width, height)
-{
-    var s = this.stroke;
-    width += s-1;
-    height += s-1;
-    var a = width>>1, b = height>>1,
-    wod = width&1, hod = (height&1)+1,
-    cx = left+a, cy = top+b,
-    x = 0, y = b,
-    aa = (a*a)<<1, bb = (b*b)<<1,
-    st = (aa>>1)*(1-(b<<1)) + bb,
-    tt = (bb>>1) - aa*((b<<1)-1);
-
-
-    if (s-0x4 < 0 && (!(s-0x2) || width-0x33 > 0 && height-0x33 > 0))
-    {
-        var ox = 0, oy = b,
-        w, h,
-        pxl, pxr, pxt, pxb, pxw;
-        while (y > 0)
-        {
-            if (st < 0)
-            {
-                st += bb*((x<<1)+0x3);
-                tt += (bb<<1)*(++x);
-            }
-            else if (tt < 0)
-            {
-                st += bb*((x<<1)+0x3) - (aa<<1)*(y-1);
-                tt += (bb<<1)*(++x) - aa*(((y--)<<1)-0x3);
-                w = x-ox;
-                h = oy-y;
-
-                if (w-1)
-                {
-                    pxw = w+1+(s&1);
-                    h = s;
-                }
-                else if (h-1)
-                {
-                    pxw = s;
-                    h += 1+(s&1);
-                }
-                else pxw = h = s;
-                this.mkOvQds(cx, cy, -x+1, ox-pxw+w+wod, -oy, -h+oy+hod, pxw, h);
-                ox = x;
-                oy = y;
-            }
-            else
-            {
-                tt -= aa*((y<<1)-0x3);
-                st -= (aa<<1)*(--y);
-            }
-        }
-        this.mkDiv(cx-a, cy-oy, s, (oy<<1)+hod);
-        this.mkDiv(cx+a+wod-s+1, cy-oy, s, (oy<<1)+hod);
-    }
-
-
-    else
-    {
-        var _a = (width-((s-1)<<1))>>1,
-        _b = (height-((s-1)<<1))>>1,
-        _x = 0, _y = _b,
-        _aa = (_a*_a)<<1, _bb = (_b*_b)<<1,
-        _st = (_aa>>1)*(1-(_b<<1)) + _bb,
-        _tt = (_bb>>1) - _aa*((_b<<1)-1),
-
-        pxl = new Array(),
-        pxt = new Array(),
-        _pxb = new Array();
-        pxl[0] = 0;
-        pxt[0] = b;
-        _pxb[0] = _b-1;
-        while (y > 0)
-        {
-            if (st < 0)
-            {
-                st += bb*((x<<1)+0x3);
-                tt += (bb<<1)*(++x);
-                pxl[pxl.length] = x;
-                pxt[pxt.length] = y;
-            }
-            else if (tt < 0)
-            {
-                st += bb*((x<<1)+0x3) - (aa<<1)*(y-1);
-                tt += (bb<<1)*(++x) - aa*(((y--)<<1)-0x3);
-                pxl[pxl.length] = x;
-                pxt[pxt.length] = y;
-            }
-            else
-            {
-                tt -= aa*((y<<1)-0x3);
-                st -= (aa<<1)*(--y);
-            }
-
-            if (_y > 0)
-            {
-                if (_st < 0)
-                {
-                    _st += _bb*((_x<<1)+0x3);
-                    _tt += (_bb<<1)*(++_x);
-                    _pxb[_pxb.length] = _y-1;
-                }
-                else if (_tt < 0)
-                {
-                    _st += _bb*((_x<<1)+0x3) - (_aa<<1)*(_y-1);
-                    _tt += (_bb<<1)*(++_x) - _aa*(((_y--)<<1)-0x3);
-                    _pxb[_pxb.length] = _y-1;
-                }
-                else
-                {
-                    _tt -= _aa*((_y<<1)-0x3);
-                    _st -= (_aa<<1)*(--_y);
-                    _pxb[_pxb.length-1]--;
-                }
-            }
-        }
-
-        var ox = 0, oy = b,
-        _oy = _pxb[0],
-        l = pxl.length,
-        w, h;
-        for (var i = 0; i < l; i++)
-        {
-            if (typeof _pxb[i] != "undefined")
-            {
-                if (_pxb[i] < _oy || pxt[i] < oy)
-                {
-                    x = pxl[i];
-                    this.mkOvQds(cx, cy, -x+1, ox+wod, -oy, _oy+hod, x-ox, oy-_oy);
-                    ox = x;
-                    oy = pxt[i];
-                    _oy = _pxb[i];
-                }
-            }
-            else
-            {
-                x = pxl[i];
-                this.mkDiv(cx-x+1, cy-oy, 1, (oy<<1)+hod);
-                this.mkDiv(cx+ox+wod, cy-oy, 1, (oy<<1)+hod);
-                ox = x;
-                oy = pxt[i];
-            }
-        }
-        this.mkDiv(cx-a, cy-oy, 1, (oy<<1)+hod);
-        this.mkDiv(cx+ox+wod, cy-oy, 1, (oy<<1)+hod);
-    }
-}
-
-
-
-
-
-function mkOvDott(left, top, width, height)
-{
-    var a = width>>1, b = height>>1,
-    wod = width&1, hod = height&1,
-    cx = left+a, cy = top+b,
-    x = 0, y = b,
-    aa2 = (a*a)<<1, aa4 = aa2<<1, bb = (b*b)<<1,
-    st = (aa2>>1)*(1-(b<<1)) + bb,
-    tt = (bb>>1) - aa2*((b<<1)-1),
-    drw = true;
-    while (y > 0)
-    {
-        if (st < 0)
-        {
-            st += bb*((x<<1)+0x3);
-            tt += (bb<<1)*(++x);
-        }
-        else if (tt < 0)
-        {
-            st += bb*((x<<1)+0x3) - aa4*(y-1);
-            tt += (bb<<1)*(++x) - aa2*(((y--)<<1)-0x3);
-        }
-        else
-        {
-            tt -= aa2*((y<<1)-0x3);
-            st -= aa4*(--y);
-        }
-        if (drw) this.mkOvQds(cx, cy, -x, x+wod, -y, y+hod, 1, 1);
-        drw = !drw;
-    }
-}
-
-
-
-
-
-function mkRect(x, y, w, h)
-{
-    var s = this.stroke;
-    this.mkDiv(x, y, w, s);
-    this.mkDiv(x+w, y, s, h);
-    this.mkDiv(x, y+h, w+s, s);
-    this.mkDiv(x, y+s, s, h-s);
-}
-
-
-
-
-
-function mkRectDott(x, y, w, h)
-{
-    this.drawLine(x, y, x+w, y);
-    this.drawLine(x+w, y, x+w, y+h);
-    this.drawLine(x, y+h, x+w, y+h);
-    this.drawLine(x, y, x, y+h);
-}
-
-
-
-
-
-function jsgFont()
-{
-    this.PLAIN = 'font-weight:normal;';
-    this.BOLD = 'font-weight:bold;';
-    this.ITALIC = 'font-style:italic;';
-    this.ITALIC_BOLD = this.ITALIC + this.BOLD;
-    this.BOLD_ITALIC = this.ITALIC_BOLD;
-}
-var Font = new jsgFont();
-
-
-
-
-
-function jsgStroke()
-{
-    this.DOTTED = -1;
-}
-var Stroke = new jsgStroke();
-
-
-
-
-
-function jsGraphics(id, wnd)
-{
-    this.setColor = new Function('arg', 'this.color = arg;');
-
-
-    this.getColor = new Function('return this.color');
-
-    this.setStroke = function(x)
-    {
-        this.stroke = x;
-        if (!(x+1))
-        {
-            this.drawLine = mkLinDott;
-            this.mkOv = mkOvDott;
-            this.drawRect = mkRectDott;
-        }
-        else if (x-1 > 0)
-        {
-            this.drawLine = mkLin2D;
-            this.mkOv = mkOv2D;
-            this.drawRect = mkRect;
-        }
-        else
-        {
-            this.drawLine = mkLin;
-            this.mkOv = mkOv;
-            this.drawRect = mkRect;
-        }
-    };
-
-
-
-    this.setPrintable = function(arg)
-    {
-        this.printable = arg;
-        this.mkDiv = jg_n4? mkLyr : arg? mkDivPrint : mkDiv;
-    };
-
-
-
-    this.setFont = function(fam, sz, sty)
-    {
-        this.ftFam = fam;
-        this.ftSz = sz;
-        this.ftSty = sty || Font.PLAIN;
-    };
-
-
-
-    this.drawPolyline = this.drawPolyLine = function(x, y, s)
-    {
-        var i = x.length-1; while (i >= 0)
-            this.drawLine(x[i], y[i], x[--i], y[i]);
-    };
-
-
-
-    this.fillRect = function(x, y, w, h)
-    {
-        this.mkDiv(x, y, w, h);
-    };
-
-
-    this.fillRectPattern = function(x, y, w, h, url)
-    {
-        this.htm += '<div style="position:absolute;'+
-            'left:' + x + 'px;'+
-            'top:' + y + 'px;'+
-            'width:' + w + 'px;'+
-            'height:' + h + 'px;'+
-            'clip:rect(0,'+w+'px,'+h+'px,0);'+
-            'overflow:hidden;'+
-            //'background-color:' + this.color + ';'+
-            "background-image: url('" + url + "');"+
-            "layer-background-image: url('" + url + "');"+
-            'z-index:100;"><\/div>';
-        //alert(this.htm);
-    }
-
-    this.drawHandle = function(x, y, w, h, cursor)
-    {
-        
-        this.htm += '<div style="position:absolute;'+
-        'left:' + x + 'px;'+
-        'top:' + y + 'px;'+
-        'width:' + w + 'px;'+
-        'height:' + h + 'px;'+
-        'clip:rect(0,'+w+'px,'+h+'px,0);'+
-        'padding: 2px;overflow:hidden;'+
-        "cursor: '" + cursor + "';"+
-        '" class="handleBox" id="' + cursor + '" ><\/div>';
-    }
-
-    this.drawHandleBox = function(x, y, w, h, cursor)
-    {
-        
-        this.htm += '<div style="position:absolute;'+
-        'left:' + x + 'px;'+
-        'top:' + y + 'px;'+
-        'width:' + w + 'px;'+
-        'height:' + h + 'px;'+
-        'clip:rect(0,'+(w+2)+'px,'+(h+2)+'px,0);'+
-        'overflow:hidden; border: solid 1px '+ this.color+';'+
-        "cursor: '" + cursor + "';"+
-        '" class="handleBox" id="' + cursor + '" ><\/div>';
-
-        
-    }
-
-    this.drawPolygon = function(x, y)
-    {
-        this.drawPolyline(x, y);
-        this.drawLine(x[x.length-1], y[x.length-1], x[0], y[0]);
-    };
-
-
-
-    this.drawEllipse = this.drawOval = function(x, y, w, h)
-    {
-        this.mkOv(x, y, w, h);
-    };
-
-
-
-    this.fillEllipse = this.fillOval = function(left, top, w, h)
-    {
-        var a = (w -= 1)>>1, b = (h -= 1)>>1,
-        wod = (w&1)+1, hod = (h&1)+1,
-        cx = left+a, cy = top+b,
-        x = 0, y = b,
-        ox = 0, oy = b,
-        aa2 = (a*a)<<1, aa4 = aa2<<1, bb = (b*b)<<1,
-        st = (aa2>>1)*(1-(b<<1)) + bb,
-        tt = (bb>>1) - aa2*((b<<1)-1),
-        pxl, dw, dh;
-        if (w+1) while (y > 0)
-        {
-            if (st < 0)
-            {
-                st += bb*((x<<1)+0x3);
-                tt += (bb<<1)*(++x);
-            }
-            else if (tt < 0)
-            {
-                st += bb*((x<<1)+0x3) - aa4*(y-1);
-                pxl = cx-x;
-                dw = (x<<1)+wod;
-                tt += (bb<<1)*(++x) - aa2*(((y--)<<1)-0x3);
-                dh = oy-y;
-                this.mkDiv(pxl, cy-oy, dw, dh);
-                this.mkDiv(pxl, cy+oy-dh+hod, dw, dh);
-                ox = x;
-                oy = y;
-            }
-            else
-            {
-                tt -= aa2*((y<<1)-0x3);
-                st -= aa4*(--y);
-            }
-        }
-        this.mkDiv(cx-a, cy-oy, w+1, (oy<<1)+hod);
-    };
-
-
-
-    this.drawString = mkLbl;
-
-
-
-    this.clear = function()
-    {
-        this.htm = "";
-        if (this.cnv) this.cnv.innerHTML = this.defhtm;
-        
-    };
-
-
-
-    this.mkOvQds = function(cx, cy, xl, xr, yt, yb, w, h)
-    {
-        this.mkDiv(xr+cx, yt+cy, w, h);
-        this.mkDiv(xr+cx, yb+cy, w, h);
-        this.mkDiv(xl+cx, yb+cy, w, h);
-        this.mkDiv(xl+cx, yt+cy, w, h);
-    };
-
-
-    this.setStroke(1);
-    this.setPrintable(false);
-    this.setFont('verdana,geneva,helvetica,sans-serif', String.fromCharCode(0x31, 0x32, 0x70, 0x78), Font.PLAIN);
-    this.color = '#000000';
-    this.htm = '';
-    this.wnd = wnd || window;
-
-
-    if (!(jg_ie || jg_dom || jg_ihtm)) chkDHTM();
-    if (typeof id != 'string' || !id) this.paint = pntDoc;
-    else
-    {
-        this.cnv = document.all? (this.wnd.document.all[id] || null)
-            : document.getElementById? (this.wnd.document.getElementById(id) || null)
-            : null;
-        this.defhtm = (this.cnv && this.cnv.innerHTML)? this.cnv.innerHTML : '';
-        this.paint = jg_dom? pntCnvDom : jg_ie? pntCnvIe : jg_ihtm? pntCnvIhtm : pntCnv;
-    }
-}
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ImageManager/backend.php b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ImageManager/backend.php
deleted file mode 100644
index d34c0b6..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ImageManager/backend.php
+++ /dev/null
@@ -1,171 +0,0 @@
-<?php 
-/**
-* Unified backend for ImageManager 
-*
-* Image Manager was originally developed by:
-*   Xiang Wei Zhuo, email: xiangweizhuo(at)hotmail.com Wei Shou.
-*
-* Unified backend sponsored by DTLink Software, http://www.dtlink.com
-* Implementation by Yermo Lamers, http://www.formvista.com
-*
-* (c) DTLink, LLC 2005.
-* Distributed under the same terms as HTMLArea itself.
-* This notice MUST stay intact for use (see license.txt).
-*
-* DESCRIPTION:
-*
-* Instead of using separate URL's for each function, ImageManager now
-* routes all requests to the server through this single, replaceable,
-* entry point. backend.php expects at least two URL variable parameters: 
-*
-* __plugin=ImageManager   for future expansion; identify the plugin being requested.
-* __function=thumbs|images|editorFrame|editor|manager  function being called.
-*
-* Having a single entry point that strictly adheres to a defined interface will 
-* make the backend code much easier to maintain and expand. It will make it easier
-* on integrators, not to mention it'll make it easier to have separate 
-* implementations of the backend in different languages (Perl, Python, ASP, etc.) 
-*
-* @see config.inc.php
-*/
-
-// Strip slashes if MQGPC is on
-if(function_exists('set_magic_quotes_runtime')) @set_magic_quotes_runtime(0);
-if(get_magic_quotes_gpc())
-{
-  $to_clean = array(&$_GET, &$_POST, &$_REQUEST, &$_COOKIE);
-  while(count($to_clean))
-  {
-    $cleaning =& $to_clean[array_pop($junk = array_keys($to_clean))];
-    unset($to_clean[array_pop($junk = array_keys($to_clean))]);
-    foreach(array_keys($cleaning) as $k)
-    {
-      if(is_array($cleaning[$k]))
-      {
-        $to_clean[] =& $cleaning[$k];
-      }
-      else
-      {
-        $cleaning[$k] = stripslashes($cleaning[$k]);
-      }
-    }
-  }
-}
-
-/**
-* ImageManager configuration
-*/
-
-require_once('config.inc.php');
-
-/**
-* debug message library
-*/
-
-include_once( "ddt.php" );
-
-// uncomment to turn on debugging
-// _ddtOn();
-
-_ddt( __FILE__, __LINE__, "backend.php: top with query '" . $_SERVER["PHP_SELF"] . "' string '" . $_SERVER["QUERY_STRING"] . "'" );
-
-$formVars = empty($_POST) ? $_GET : $_POST;
-
-// make sure the request is for us (this gives us the ability to eventually organize
-// a backend event handler system) For an include file the return doesn't make alot of
-// sense but eventually we'll want to turn all of this into at least functions 
-// separating out all the presentation HTML from the logic. (Right now all the HTML
-// used by ImageManager is in the same files as the PHP code ...)
-
-if ( @$formVars[ "__plugin" ] != "ImageManager" )
-	{
-	// not for us.
-
-	_ddt( __FILE__, __LINE__, "request was not for us" );
-
-	return true;
-	}
-
-// so we don't have to re-engineer the entire thing right now, since it's probably
-// going to get rewritten anyway, we just include the correct file based on the 
-// function request.
-
-_ddt( __FILE__, __LINE__, "backend.php(): handling function '" . $formVars[ "__function" ] . "' base_dir is '" . $IMConfig["base_dir"] . "'" );
-
-switch ( @$formVars[ "__function" ] )
-	{
-
-	case "editor": 
-
-		include_once( $IMConfig['base_dir'] . "/editor.php" );
-		exit();
-		
-		break;
-
-	case "editorFrame":
-
-		include_once( $IMConfig['base_dir'] . "/editorFrame.php" );
-		exit();
-
-		break;
-
-	case "manager":
-
-		_ddt( __FILE__, __LINE__, "including '" . $IMConfig['base_dir'] . "/manager.php" );
-
-		include_once( $IMConfig['base_dir'] . "/manager.php" );
-		exit();
-
-		break;
-
-	case "images":
-
-		include_once( $IMConfig['base_dir'] . "/images.php" );
-		exit();
-
-		break;
-
-	case "thumbs":
-
-		include_once( $IMConfig['base_dir'] . "/thumbs.php" );
-		exit();
-
-		break;
-
-	case "resizer":
-
-		include_once( $IMConfig['base_dir'] . "/resizer.php" );
-		exit();
-
-		break;
-
-    
-	case "youtube":
-
-		include_once( $IMConfig['base_dir'] . "/youtube.php" );
-		exit();
-
-		break;
-    
-    
-	case "flickr":
-
-		include_once( $IMConfig['base_dir'] . "/flickr.php" );
-		exit();
-
-		break;
-    
-	default:
-
-		_ddt( __FILE__, __LINE__, "function request not supported" );
-		_error( __FILE__, __LINE__, "function request not supported" );
-
-		break;
-
-	}	// end of switch.
-
-return false ;
-
-// END
-
-?>
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ImageManager/config.inc.php b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ImageManager/config.inc.php
deleted file mode 100644
index fc7efc1..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ImageManager/config.inc.php
+++ /dev/null
@@ -1,460 +0,0 @@
-<?php
-
-/**
- * Image Manager configuration file.
- * @author $Author:gogo $
- * @version $Id:config.inc.php 830 2007-05-09 13:27:34Z gogo $
- * @package ImageManager
- *
- * @todo change all these config values to defines()
- */
-
-// REVISION HISTORY:
-//
-// 2005-03-20 Yermo Lamers (www.formvista.com):
-//	. unified backend.
-// . created a set of defaults that make sense for bundling with Xinha.
-
-// -------------------------------------------------------------------------
-
-/**
-* Default backend URL
-*
-* URL to use for unified backend.
-*
-* The ?__plugin=ImageManager& is required. 
-*/
-
-$IMConfig['backend_url'] = "backend.php?__plugin=ImageManager&";
-
-/**
-* Backend Installation Directory
-*
-* location of backend install; these are used to link to css and js
-* assets because we may have the front end installed in a different
-* directory than the backend. (i.e. nothing assumes that the frontend
-* and the backend are in the same directory)
-*/
-
-$IMConfig['base_dir'] = getcwd();
-$IMConfig['base_url'] = '';
-
-// ------------------------------------------------------------
-
-/**
-* Path to directory containing images.
-*
-* File system path to the directory you want to manage the images
-* for multiple user systems, set it dynamically.
-*
-* NOTE: This directory requires write access by PHP. That is, 
-* PHP must be able to create files in this directory.
-* Able to create directories is nice, but not necessary.
-*
-* CHANGE THIS: for out-of-the-box demo purposes we're setting this to ./demo_images
-* which has some graphics in it.
-*/
-
-// $IMConfig['images_dir'] = "/some/path/to/images/directory;
-
-$IMConfig['images_dir'] = "demo_images";
-
-// -------------------------------------------------------------------------
-
-/**
-* URL of directory containing images.
-*
-* The URL to the above path, the web browser needs to be able to see it.
-* It can be protected via .htaccess on apache or directory permissions on IIS,
-* check you web server documentation for futher information on directory protection
-* If this directory needs to be publicly accessiable, remove scripting capabilities
-* for this directory (i.e. disable PHP, Perl, CGI). We only want to store assets
-* in this directory and its subdirectories.
-*
-* CHANGE THIS: You need to change this to match the url where you have Xinha
-* installed. If the images show up blank chances are this is not set correctly.
-*/
-
-// $IMConfig['images_url'] = "/url/to/above";
-
-// try to figure out the URL of the sample images directory. For your installation
-// you will probably want to keep images in another directory.
-
-$IMConfig['images_url'] = str_replace( "backend.php", "", $_SERVER["PHP_SELF"] ) . "demo_images";
-
-// -------------------------------------------------------------------------
-
-/**
-* PHP Safe Mode?
-*
-* Possible values: true, false
-*
-* TRUE - If PHP on the web server is in safe mode, set this to true.
-* SAFE MODE restrictions: directory creation will not be possible,
-* only the GD library can be used, other libraries require
-* Safe Mode to be off.
-*
-* FALSE - Set to false if PHP on the web server is not in safe mode.
-*/
-
-$IMConfig['safe_mode'] = false;
-
-// -------------------------------------------------------------------------
-
-/**
-* Image Library to use.
-*
-* Possible values: 'GD', 'IM', or 'NetPBM'
-*
-* The image manipulation library to use, either GD or ImageMagick or NetPBM.
-* If you have safe mode ON, or don't have the binaries to other packages, 
-* your choice is 'GD' only. Other packages require Safe Mode to be off.
-*
-* DEFAULT: GD is probably the most likely to be available. 
-*/
-
-$IMConfig['IMAGE_CLASS'] = 'GD';
-
-
-// -------------------------------------------------------------------------
-
-/**
-* NetPBM or IM binary path.
-*
-* After defining which library to use, if it is NetPBM or IM, you need to
-* specify where the binary for the selected library are. And of course
-* your server and PHP must be able to execute them (i.e. safe mode is OFF).
-* GD does not require the following definition.
-*/
-
-$IMConfig['IMAGE_TRANSFORM_LIB_PATH'] ='/usr/bin/';
-
-// For windows, something like
-// C:/"Program Files"/ImageMagick-5.5.7-Q16/
-
-// -------------------------------------------------------------------------
-//                OPTIONAL SETTINGS 
-// -------------------------------------------------------------------------
-
-/**
-* Thumbnail prefix
-*
-* The prefix for thumbnail files, something like .thumb will do. The
-* thumbnails files will be named as "prefix_imagefile.ext", that is,
-*  prefix + orginal filename.
-*/
-
-$IMConfig['thumbnail_prefix'] = '.';
-
-// -------------------------------------------------------------------------
-
-/**
-* Thumbnail Directory
-*
-* Thumbnail can also be stored in a directory, this directory
-* will be created by PHP. If PHP is in safe mode, this parameter
-*  is ignored, you can not create directories. 
-*
-*  If you do not want to store thumbnails in a directory, set this
-*  to false or empty string '';
-*/
-
-$IMConfig['thumbnail_dir'] = '.thumbs';
-
-// -------------------------------------------------------------------------
-
-/**
- * Resize files, or not.  If the dimensions for an image are changed
- * this will control if the image is actually resized.  
- *
- * Usually you want this true, unless you are very disk space concious.
- */
- 
-$IMConfig['resize_files'] = true;
-
-// -------------------------------------------------------------------------
-
-/**
-* Resized prefix
-*
-* The prefix for resized files, something like .resized will do.  The
-* resized files will be named <prefix>_<width>x<height>_<original>
-* resized files are created when one changes the dimensions of an image
-* in the image manager selection dialog - the image is scaled when the
-* user clicks the ok button.
-*/
-
-$IMConfig['resized_prefix'] = '.resized';
-
-// -------------------------------------------------------------------------
-
-/**
-* Resized Directory
-*
-* Resized images may also be stored in a directory, except in safe mode.
-*/
-
-$IMConfig['resized_dir'] = '.resized';
-
-/**
- * Full options
- *
- * Determines whether the user is given options for padding, 
- * background/padding colour, margin, border and border colour. 
- */
-
-$IMConfig['show_full_options'] = true;
- 
-// -------------------------------------------------------------------------
-
-/**
-* Allow New Directories
-*
-*
-* Possible values: true, false
-*
-* TRUE -  Allow the user to create new sub-directories in the
-*        $IMConfig['base_dir'].
-*
-* FALSE - No directory creation.
-*
-* NOTE: If $IMConfig['safe_mode'] = true, this parameter
-*     is ignored, you can not create directories
-*
-* DEFAULT: for demo purposes we turn this off.
-*/
-
-$IMConfig['allow_new_dir'] = false;
-
-// -------------------------------------------------------------------------
-
-/**
-* Allow Uploads
-*
-*  Possible values: true, false
-*
-*  TRUE - Allow the user to upload files.
-*
-*  FALSE - No uploading allowed.
-*
-* DEFAULT: for demo purposes we turn this off.
-*/
-
-$IMConfig['allow_upload'] = false;
-
-// -------------------------------------------------------------------------
-
-/**
-* Allow Delete
-*
-*  Possible values: true, false
-*
-*  TRUE - Allow the user to delete files/dirs
-*
-*  FALSE - No deleting allowed.
-* 
-*/
-
-$IMConfig['allow_delete'] = false;
-
-// -------------------------------------------------------------------------
-
-/**
-* Allow Edit
-*
-*  Possible values: true, false
-*
-*  TRUE - Allow the user to edit files
-*
-*  FALSE - No editing allowed.
-* 
-*/
-
-$IMConfig['allow_edit'] = false;
-
-
-// -------------------------------------------------------------------------
-
-/**
-* Validate Images
-*
-* Possible values: true, false
-*
-* TRUE - If set to true, uploaded files will be validated based on the 
-*        function getImageSize, if we can get the image dimensions then 
-*        I guess this should be a valid image. Otherwise the file will be rejected.
-*
-* FALSE - All uploaded files will be processed.
-*
-* NOTE: If uploading is not allowed, this parameter is ignored.
-*/
-
-$IMConfig['validate_images'] = true;
-
-$IMConfig['allowed_image_extensions'] = array("jpg","gif","png","jpeg");
-
-// -------------------------------------------------------------------------
-
-/**
-* Default Thumnail.
-*
-* The default thumbnail if the thumbnails can not be created, either
-* due to error or bad image file.
-*/
-
-$IMConfig['default_thumbnail'] = 'img/default.gif';
-
-// -------------------------------------------------------------------------
-
-/**
-*  Thumbnail dimensions.
-*/
-
-$IMConfig['thumbnail_width'] = 96;
-$IMConfig['thumbnail_height'] = 96;
-
-// -------------------------------------------------------------------------
-
-/**
-* Editor Temporary File Prefix.
-*
-* Image Editor temporary filename prefix.
-*/
-
-$IMConfig['tmp_prefix'] = '.editor_';
-
-
-$IMConfig['ViewMode'] = 'thumbs';
-
-// -------------------------------------------------------------------------
-
-/** Margin Types 
- *  If your HTML will be used in an email, then using CSS type "margin"
- *  is not so reliable and you should set UseHSpaceVSpace to be true
- *  to go back to the old fashioned hspace="" and vspace="" attributes on
- *  images.
- */
-$IMConfig['UseHSpaceVSpace'] = false;
-
-// -------------------------------------------------------------------------
-
-/**
- * ImageManager/Picker can provide selection interfaces for more than just 
- * images on the server ("Pictures").
- *
- *  Local - the classical ImageManager for images stored on this server.
- *
- *  YouTube  - provides selection (but not upload etc) of videos on YouTube
- *    see smart-image.js for how to make the videos work as videos instead of
- *    static images.
- *
- *  Flickr   - provides selection (but not upload etc) of public images on Flickr
- *    Set 
- *       $IMConfig['Flickr'] = array('Key' => 'yourkeyhere');
- *    to turn on Flickr support.
- * 
- *    To get a key: http://www.flickr.com/services/api/keys/
- *
- *    WARNING: Flickr restricts commercial use of the API.  If your site is in any way even 
- *     remotely commercial you need to ask for a commercial key from flickr.
- *
- *    ADDITIONAL WARNING: Flickr requires that you provide a link back to them, preferably
- *     on the image itself (linking to the image) - you can use smart-image.js to do
- *     something like this. 
- *
- *    ADDITIONAL ADDITIONAL WARNING: It's up to you to comply with the image's license!! 
- */
- 
-$IMConfig['Local'] = TRUE;
-$IMConfig['YouTube']  = FALSE;
-$IMConfig['Flickr']   = FALSE;
-
-// These are some configurable defaults for Flickr, to override
-//  $IMConfig['Flickr'] = array('Whatever' => 'You Want');
-$FlickrDefaults = array
-(
-  // This is the URL as flickr provides it for the licence which you wish 
-  // to search on by default.  The default here is the least restrictive one.
-  'Default License' => 'http://creativecommons.org/licenses/by/2.0/',
-    
-);  
-
-
-////////////////////////////////////////////////////////////////////////////////
-//       ================== END OF CONFIGURATION =======================      //
-////////////////////////////////////////////////////////////////////////////////
-
-
-// Standard PHP Backend Data Passing
-//  if data was passed using xinha_pass_to_php_backend() we merge the items
-//  provided into the Config
-require_once(realpath(dirname(__FILE__) . '/../../contrib/php-xinha.php'));
-if($passed_data = xinha_read_passed_data())
-{
-  $IMConfig = array_merge($IMConfig, $passed_data);
-  $IMConfig['backend_url'] .= xinha_passed_data_querystring() . '&';
-  
-  if($IMConfig['Flickr'])
-  {
-    foreach($FlickrDefaults as $k => $v)
-    {
-      if(!isset($IMConfig['Flickr'][$k]))
-      {
-        $IMConfig['Flickr'][$k] = $v;
-      }
-    }
-  }
-}
-// Deprecated config passing, don't use this way any more!
-elseif(isset($_REQUEST['backend_config']))
-{
-  if(get_magic_quotes_gpc()) {
-    $_REQUEST['backend_config'] = stripslashes($_REQUEST['backend_config']);
-  }
-  
-  if($_REQUEST['backend_config_secret_key_location'] !== 'Xinha:ImageManager')
-  {
-    trigger_error('Programming Error - please contact the website administrator/programmer to alert them to this problem. A non-default backend key location is being used to pass backend data to Xinha, but the same key location is not being used to receive data.  The special backend configuration has been ignored.  To resolve this, you should edit plugins/ImageManager/config.php and change the default key location from "Xinha:ImageManager" to your desired non default.  See: http://trac.xinha.org/ticket/1518', E_USER_ERROR);    
-  }
-  else
-  {
-  
-  // Config specified from front end, check that it's valid
-  session_start();
-  $secret = $_SESSION[$_REQUEST['backend_config_secret_key_location']];
-
-  if($_REQUEST['backend_config_hash'] !== sha1($_REQUEST['backend_config'] . $secret))
-  {
-    die("Backend security error.");
-  }
-
-  $to_merge = unserialize($_REQUEST['backend_config']);
-  if(!is_array($to_merge))
-  {
-    die("Backend config syntax error.");
-  }
-
-  $IMConfig = array_merge($IMConfig, $to_merge);
-  $IMConfig['backend_url'] .= "backend_config=" . rawurlencode($_REQUEST['backend_config']) . '&';
-  $IMConfig['backend_url'] .= "backend_config_hash=" . rawurlencode($_REQUEST['backend_config_hash']) . '&';
-  $IMConfig['backend_url'] .= "backend_config_secret_key_location=" . rawurlencode($_REQUEST['backend_config_secret_key_location']) . '&';
-  }
-}
-
-define('IMAGE_CLASS', $IMConfig['IMAGE_CLASS']);
-define('IMAGE_TRANSFORM_LIB_PATH', $IMConfig['IMAGE_TRANSFORM_LIB_PATH']);
-define( "IM_CONFIG_LOADED", "yes" );
-
-// bring in the debugging library
-
-include_once( "ddt.php" );
-
-// uncomment to send debug messages to a local file
-// _setDebugLog( "/tmp/debug_log.txt" );
-
-// turn debugging on everywhere.
-// _ddtOn();
-
-// END
-
-?>
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ImageManager/ddt.php b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ImageManager/ddt.php
deleted file mode 100644
index 4992b8b..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ImageManager/ddt.php
+++ /dev/null
@@ -1,288 +0,0 @@
-<?php 
-/*
-This ddt library is released under the terms of the HTMLArea license. 
-See license.txt that is shipped with Xinha.
-*/
-
-// must be included after the configuration has been loaded.
-
-if ( ! defined( "IM_CONFIG_LOADED" ) )
-	die( "sorry" );
-
-/**
-* Debug and Error Message functions.
-*
-* These functions implement a procedural version of the formVista DDT debug
-* message system.
-*
-* @package formVista
-* @subpackage lib
-* @copyright DTLink, LLC 2005
-* @author Yermo Lamers
-* @see http://www.formvista.com/contact.html
-*/
-
-// REVISION HISTORY:
-//
-// 26 Jan 2001 YmL:
-//		. initial revision
-//
-// 2002-06-19 YmL:
-//		. added	logging	debug and error	messages to a file.
-//
-// 2004-02-06 YmL:
-//	.	added a newline to generated messages.
-//
-// 2005-01-09 YmL:
-//	.	now checks global $fvDEBUG[ "logfile" ] setting for 
-//		logfile to output to. 
-//	.	dumping to file has not been combined into a dumpmsg 
-//		method.
-//
-// 2005-02-25 YmL:
-//	.	added _error() support for cmdLine programs.
-//
-// 2005-03-20 YmL:
-//	.	changed license for this file to HTMLArea from RPL.
-//	.	quick hack to repurpose for Xinha.
-//
-// -------------------------------------------------------
-
-/**
-* dumps message to stdout or log file depending upon global.
-*
-* checks $fvDEBUG["logfile"] global for name of file to dump
-* messages to. Opens the file once.
-*/
-
-function dumpmsg( $msgline )
-{
-
-global $fvDEBUG;
-
-if ( @$fvDEBUG[ "logfile" ] != NULL )
-	{
-
-	// only open the file once and store the handle in the global
-	// fvDEBUG array .. for now.
-
-	if ( @$fvDEBUG[ "logfile_fp" ] == NULL )
-		{
-
-		// we clear out the debug file on each run.
-
-		if (( $fvDEBUG[ "logfile_fp" ] = fopen( $fvDEBUG[ "logfile" ], "a" )) == NULL )
-			{
-			die( "ddt(): unable to open debug log" );
-			return  false ;
-			}
-		}
-
-	fputs( $fvDEBUG[ "logfile_fp" ], "$msgline" );
-	fflush( $fvDEBUG[ "logfile_fp" ] );
-
-	}
-else
-	{
-	echo $msgline;
-	}
-
-}	// end of dumpmsg.
-
-/**
-* displays a formatted debugging message.
-*
-* If ddtOn() was called, outputs a formatted debugging message.
-*
-* @param string $file filename, usually __FILE__
-* @param string $line line number in file, usually __LINE__
-* @param string $msg debugging message to display
-*/
-
-function _ddt( $file, $line, $msg )
-{
-
-global $_DDT;
-global $_DDT_DEBUG_LOG;
-global $_DDT_CMDLINE;
-
-$basename = basename( $file );
-
-if ( @$_DDT == "yes" )
-	{
-
-	if ( @$_DDT_CMDLINE == "yes" )
-		{
-		dumpmsg( basename( $file ) . ":$line: $msg \n" );
-		flush();
-
-		}
-	else
-		{
-		dumpmsg( "<p>$basename:$line: $msg</p>\n" );
-		}
-	}
-
-}	// end of _ddt
-
-/**
-* displays a formatted dump of an associative array.
-*
-* If ddtOn() was called, outputs a formatted debugging message showing 
-* contents of array.
-*
-* @param string $file filename, usually __FILE__
-* @param string $line line number in file, usually __LINE__
-* @param string $msg debugging message to display
-* @param array $array_var array to dump.
-*/
-
-function _ddtArray( $file, $line, $msg,	$array_var )
-{
-
-global $_DDT;
-
-if ( $_DDT == "yes" )
-	{
-
-	dumpmsg( "<h2>$file:$line: $msg</h2>" );
-	
-	foreach	( $array_var as	$name => $value	)
-		{
-		dumpmsg( "<p><b>$name</b> => <b>$value</b>\n" );
-		}
-	}
-
-}	// end of _ddtArray
-
-// -----------------------------------------------------------------
-
-/**
-* Central Error Function.
-*
-* Displays a formatted error message to the user.
-* If the global _DDT_ERROR_LOG is set the error message is dumped 
-* to that file	instead	of being displayed to the user.
-*/
-
-function _error( $file,	$line, $msg )
-{
-
-global $_DDT_ERROR_LOG;
-global $_DDT_CMDLINE;
-
-if ( @$_DDT_ERROR_LOG == NULL )
-	{
-
-	if ( @$_DDT_CMDLINE == "yes" )
-		{
-		echo basename($file) . ":$line: $msg\n";
-		}
-	else
-		{
-		echo "<h2>$file:$line: $msg</h2>";
-		}
-	}
-else
-	{
-	 
-	if (( $fp = fopen( $_DDT_ERROR_LOG, "a"	)) != NULL )
-		{
-		fputs( $fp, date("D M j	G:i:s T	Y") . "	- $file:$line: $msg\n" );
-		fclose(	$fp );
-		}
-		
-	}
-	
-}	// end of _error
-
-// ----------------------------------------------------------------------
-
-function errorEcho( $title, $field )
-{
-
-global $error_msg;
-
-if ( $error_msg[ $field	] != ""	)
-	{
-	
-	echo "<FONT SIZE=\"+2\"	COLOR=\"RED\">$title</FONT>";
-	
-	}
-else
-	{
-	
-	echo $title;
-	
-	}
-	
-}	// end of errorEcho
-
-/**
-* turns on procedural debugging.
-*
-* Causes _ddt() calls to display debugging messages.
-*/
-
-function _ddtOn()
-{
-
-global $_DDT;
-
-$_DDT =	"yes";
-
-}
-
-/**
-* set error message destination.
-*
-* sets the destination for error messages.
-*
-* @param string $file full path to errorlog.
-*/
-
-function _setErrorLog( $errorLog )
-{
-
-global $_DDT_ERROR_LOG;
-
-$_DDT_ERROR_LOG	= $errorLog;
-
-}
-
-/**
-* set output file for debugging messages.
-*
-* sets the destination file for debugging messages.
-*
-* @param string $file full path to debuglog.
-*/
-
-function _setDebugLog( $debugLog )
-{
-
-global $fvDEBUG;
-
-$fvDEBUG[ "logfile" ] = $debugLog;
-
-}
-
-/**
-* set debugging output style to command line.
-*
-* tells ddt to format debugging messages for a 
-* command line program.
-*/
-
-function _ddtSetCmdLine()
-{
-
-global $_DDT_CMDLINE;
-
-$_DDT_CMDLINE = "yes";
-
-}
-
-// END
-
-?>
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ImageManager/demo_images/.htaccess b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ImageManager/demo_images/.htaccess
deleted file mode 100644
index 98b45cf..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ImageManager/demo_images/.htaccess
+++ /dev/null
@@ -1,11 +0,0 @@
-<IfModule mod_php.c>
- php_flag engine off
-</IfModule>
-AddType text/html .html .htm .shtml .php .php3 .php4 .php5 .php6 .php7 .php8 .phtml .phtm .pl .py .cgi
-RemoveHandler .php
-RemoveHandler .php8
-RemoveHandler .php7
-RemoveHandler .php6
-RemoveHandler .php5
-RemoveHandler .php4
-RemoveHandler .php3
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ImageManager/demo_images/bikerpeep.jpg b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ImageManager/demo_images/bikerpeep.jpg
deleted file mode 100644
index a2e7028..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ImageManager/demo_images/bikerpeep.jpg
+++ /dev/null
Binary files differ
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ImageManager/demo_images/linux/.htaccess b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ImageManager/demo_images/linux/.htaccess
deleted file mode 100644
index 98b45cf..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ImageManager/demo_images/linux/.htaccess
+++ /dev/null
@@ -1,11 +0,0 @@
-<IfModule mod_php.c>
- php_flag engine off
-</IfModule>
-AddType text/html .html .htm .shtml .php .php3 .php4 .php5 .php6 .php7 .php8 .phtml .phtm .pl .py .cgi
-RemoveHandler .php
-RemoveHandler .php8
-RemoveHandler .php7
-RemoveHandler .php6
-RemoveHandler .php5
-RemoveHandler .php4
-RemoveHandler .php3
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ImageManager/demo_images/linux/linux.gif b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ImageManager/demo_images/linux/linux.gif
deleted file mode 100644
index 3f42d2c..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ImageManager/demo_images/linux/linux.gif
+++ /dev/null
Binary files differ
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ImageManager/demo_images/wesnoth078.jpg b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ImageManager/demo_images/wesnoth078.jpg
deleted file mode 100644
index ea37d1a..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ImageManager/demo_images/wesnoth078.jpg
+++ /dev/null
Binary files differ
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ImageManager/editor.php b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ImageManager/editor.php
deleted file mode 100644
index 377366f..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ImageManager/editor.php
+++ /dev/null
@@ -1,149 +0,0 @@
-<?php 
-/**
- * The PHP Image Editor user interface.
- * @author $Author:ray $
- * @version $Id:editor.php 987 2008-04-12 12:39:04Z ray $
- * @package ImageManager
- */
-
-require_once('config.inc.php');
-require_once('Classes/ImageManager.php');
-require_once('Classes/ImageEditor.php');
-
-$manager = new ImageManager($IMConfig);
-$editor = new ImageEditor($manager);
-
-?>
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-
-<html>
-<head>
-	<title></title>
-<script type="text/javascript">
-_backend_url = "<?php print $IMConfig['backend_url']; ?>";
-</script>
-	<link href="<?php print $IMConfig['base_url'];?>assets/editor.css" rel="stylesheet" type="text/css" />	
-<script type="text/javascript" src="<?php print $IMConfig['base_url'];?>assets/slider.js"></script>
-<script type="text/javascript" src="../../popups/popup.js"></script>
-<script type="text/javascript" src="<?php print $IMConfig['base_url'];?>assets/popup.js"></script>
-<script type="text/javascript">
-/*<![CDATA[*/
-	window.resizeTo(673, 531);
-
-	if(window.opener)
-		HTMLArea = window.opener.HTMLArea;
-/*]]>*/
-</script>
-<script type="text/javascript" src="<?php print $IMConfig['base_url'];?>assets/editor.js"></script>
-</head>
-
-<body>
-<div id="indicator">
-<img src="<?php print $IMConfig['base_url'];?>img/spacer.gif" id="indicator_image" height="20" width="20" alt="" />
-</div>
-<div id="tools">
-	<div id="tools_crop" style="display:none;">
-		<div id="tool_inputs">
-			<label for="cx">Start X:</label><input type="text" id="cx"  class="textInput" onchange="updateMarker('crop')"/>
-			<label for="cy">Start Y:</label><input type="text" id="cy" class="textInput" onchange="updateMarker('crop')"/>
-			<label for="cw">Width:</label><input type="text" id="cw" class="textInput" onchange="updateMarker('crop')"/>
-			<label for="ch">Height:</label><input type="text" id="ch" class="textInput" onchange="updateMarker('crop')"/>
-			<img src="<?php print $IMConfig['base_url'];?>img/div.gif" height="30" width="2" class="div" alt="|" />
-		</div>	
-		<a href="javascript: editor.doSubmit('crop');" class="buttons" title="OK"><img src="<?php print $IMConfig['base_url'];?>img/btn_ok.gif" height="30" width="30" alt="OK" /></a>
-		<a href="javascript: editor.reset();" class="buttons" title="Cancel"><img src="<?php print $IMConfig['base_url'];?>img/btn_cancel.gif" height="30" width="30" alt="Cancel" /></a>		
-	</div>	
-	<div id="tools_scale" style="display:none;">
-		<div id="tool_inputs">
-			<label for="sw">Width:</label><input type="text" id="sw" class="textInput" onchange="checkConstrains('width')"/>
-			<a href="javascript:toggleConstraints();" title="Lock"><img src="<?php print $IMConfig['base_url'];?>img/islocked2.gif" id="scaleConstImg" height="14" width="8" alt="Lock" class="div" /></a><label for="sh">Height:</label>
-			<input type="text" id="sh" class="textInput" onchange="checkConstrains('height')"/>
-			<input type="checkbox" id="constProp" value="1" checked="checked" onclick="toggleConstraints()"/>
-			<label for="constProp">Constrain Proportions</label>
-			<img src="<?php print $IMConfig['base_url'];?>img/div.gif" height="30" width="2" class="div" alt="|" />
-		</div>	
-		<a href="javascript: editor.doSubmit('scale');" class="buttons" title="OK"><img src="<?php print $IMConfig['base_url'];?>img/btn_ok.gif" height="30" width="30" alt="OK" /></a>
-		<a href="javascript: editor.reset();" class="buttons" title="Cancel"><img src="<?php print $IMConfig['base_url'];?>img/btn_cancel.gif" height="30" width="30" alt="Cancel" /></a>		
-	</div>	
-	<div id="tools_rotate" style="display:none;">
-		<div id="tool_inputs">
-			<select id="flip" name="flip" style="margin-left: 10px; vertical-align: middle;">
-              <option selected="selected">Flip Image</option>
-              <option>-----------------</option>
-              <option value="hoz">Flip Horizontal</option>
-              <option value="ver">Flip Vertical</option>
-         </select>
-			<select name="rotate" onchange="rotatePreset(this)" style="margin-left: 20px; vertical-align: middle;">
-              <option selected="selected">Rotate Image</option>
-              <option>-----------------</option>
-
-              <option value="180">Rotate 180 &deg;</option>
-              <option value="90">Rotate 90 &deg; CW</option>
-              <option value="-90">Rotate 90 &deg; CCW</option>
-         </select>
-			<label for="ra">Angle:</label><input type="text" id="ra" class="textInput" />
-			<img src="<?php print $IMConfig['base_url'];?>img/div.gif" height="30" width="2" class="div" alt="|" />
-		</div>	
-		<a href="javascript: editor.doSubmit('rotate');" class="buttons" title="OK"><img src="<?php print $IMConfig['base_url'];?>img/btn_ok.gif" height="30" width="30" alt="OK" /></a>
-		<a href="javascript: editor.reset();" class="buttons" title="Cancel"><img src="<?php print $IMConfig['base_url'];?>img/btn_cancel.gif" height="30" width="30" alt="Cancel" /></a>		
-	</div>		
-	<div id="tools_measure" style="display:none;">
-		<div id="tool_inputs">
-			<label>X:</label><input type="text" class="measureStats" id="sx" />
-			<label>Y:</label><input type="text" class="measureStats" id="sy" />
-			<img src="<?php print $IMConfig['base_url'];?>img/div.gif" height="30" width="2" class="div" alt="|" />
-			<label>W:</label><input type="text" class="measureStats" id="mw" />
-			<label>H:</label><input type="text" class="measureStats" id="mh" />
-			<img src="<?php print $IMConfig['base_url'];?>img/div.gif" height="30" width="2" class="div" alt="|" />
-			<label>A:</label><input type="text" class="measureStats" id="ma" />		
-			<label>D:</label><input type="text" class="measureStats" id="md" />		
-			<img src="<?php print $IMConfig['base_url'];?>img/div.gif" height="30" width="2" class="div" alt="|" />
-			<button type="button" onclick="editor.reset();" >Clear</button>
-		</div>	
-	</div>
-	<div id="tools_save" style="display:none;">
-		<div id="tool_inputs">
-			<label for="save_filename">Filename:</label><input type="text" id="save_filename" value="<?php echo $editor->getDefaultSaveFile();?>"/>
-			<select name="format" id="save_format" style="margin-left: 10px; vertical-align: middle;" onchange="updateFormat(this)">
-            <option value="" selected="selected">Image Format</option>
-            <option value="">---------------------</option>
-            <option value="jpeg,85">JPEG High</option>
-            <option value="jpeg,60">JPEG Medium</option>
-            <option value="jpeg,35">JPEG Low</option>
-            <option value="png">PNG</option>
-			<?php if($editor->isGDGIFAble() != -1) { ?>
-            <option value="gif">GIF</option>
-			<?php } ?>
-         </select>
-			<label>Quality:</label>
-			<table style="display: inline; vertical-align: middle;" cellpadding="0" cellspacing="0">
-				<tr>
-				<td>
-					<div id="slidercasing"> 
-				<div id="slidertrack" style="width:100px"><img src="<?php print $IMConfig['base_url'];?>img/spacer.gif" width="1" height="1" border="0" alt="track" /></div>
-            <div id="sliderbar" style="left:85px" onmousedown="captureStart();"><img src="<?php print $IMConfig['base_url'];?>img/spacer.gif" width="1" height="1" border="0" alt="track" /></div>
-			</div>	
-				</td>
-				</tr>
-			</table>				
-			<input type="text" id="quality" onchange="updateSlider(this.value)" style="width: 2em;" value="85"/>
-			<img src="<?php print $IMConfig['base_url'];?>img/div.gif" height="30" width="2" class="div" alt="|" />
-		</div>	
-		<a href="javascript: editor.doSubmit('save');" class="buttons" title="OK"><img src="<?php print $IMConfig['base_url'];?>img/btn_ok.gif" height="30" width="30" alt="OK" /></a>
-		<a href="javascript: editor.reset();" class="buttons" title="Cancel"><img src="<?php print $IMConfig['base_url'];?>img/btn_cancel.gif" height="30" width="30" alt="Cancel" /></a>		
-	</div>	
-</div>
-<div id="toolbar">
-<a href="javascript:toggle('crop')" id="icon_crop" title="Crop"><img src="<?php print $IMConfig['base_url'];?>img/crop.gif" height="20" width="20" alt="Crop" /><span>Crop</span></a>
-<a href="javascript:toggle('scale')" id="icon_scale" title="Resize"><img src="<?php print $IMConfig['base_url'];?>img/scale.gif" height="20" width="20" alt="Resize" /><span>Resize</span></a>
-<a href="javascript:toggle('rotate')" id="icon_rotate" title="Rotate"><img src="<?php print $IMConfig['base_url'];?>img/rotate.gif" height="20" width="20" alt="Rotate" /><span>Rotate</span></a>
-<a href="javascript:toggle('measure')" id="icon_measure" title="Measure"><img src="<?php print $IMConfig['base_url'];?>img/measure.gif" height="20" width="20" alt="Measure" /><span>Measure</span></a>
-<a href="javascript: toggleMarker();" title="Marker"><img id="markerImg" src="<?php print $IMConfig['base_url'];?>img/t_black.gif" height="20" width="20" alt="Marker" /><span>Marker</span></a>
-<a href="javascript:toggle('save')" id="icon_save" title="Save"><img src="<?php print $IMConfig['base_url'];?>img/save.gif" height="20" width="20" alt="Save" /><span>Save</span></a>
-</div>
-<div id="contents">
-<iframe src="<?php print $IMConfig['backend_url']; ?>__function=editorFrame&img=<?php if(isset($_GET['img'])) echo rawurlencode($_GET['img']); ?>" name="editor" id="editor"  scrolling="auto" title="Image Editor" frameborder="0"></iframe>
-</div>
-<div id="bottom"></div>
-</body>
-</html>
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ImageManager/editorFrame.php b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ImageManager/editorFrame.php
deleted file mode 100644
index 66ac141..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ImageManager/editorFrame.php
+++ /dev/null
@@ -1,79 +0,0 @@
-<?php 
-/**
- * The frame that contains the image to be edited.
- * @author $Author:ray $
- * @version $Id:editorFrame.php 677 2007-01-19 22:24:36Z ray $
- * @package ImageManager
- */
-
-require_once('config.inc.php');
-require_once('Classes/ImageManager.php');
-require_once('Classes/ImageEditor.php');
-
-$manager = new ImageManager($IMConfig);
-$editor = new ImageEditor($manager);
-$imageInfo = $editor->processImage();
-
-?>
-
-<html>
-<head>
-	<title></title>
-<script type="text/javascript">
-_backend_url = "<?php print $IMConfig['backend_url']; ?>";
-</script>
-
-<link href="<?php print $IMConfig['base_url'];?>assets/editorFrame.css" rel="stylesheet" type="text/css" />	
-<script type="text/javascript" src="<?php print $IMConfig['base_url'];?>assets/wz_jsgraphics.js"></script>
-<script type="text/javascript" src="<?php print $IMConfig['base_url'];?>assets/EditorContent.js"></script>
-<script type="text/javascript">
-
-if(window.top)
-	HTMLArea = window.top.HTMLArea;
-
-function i18n(str) {
-    return HTMLArea._lc(str, 'ImageManager');
-}
-	
-	var mode = "<?php echo $editor->getAction(); ?>" //crop, scale, measure
-
-var currentImageFile = "<?php if(count($imageInfo)>0) echo rawurlencode($imageInfo['file']); ?>";
-
-<?php if ($editor->isFileSaved() == 1) { ?>
-	alert(i18n('File saved.'));
-  window.parent.opener.selectImage
-    (
-      '<?php echo $imageInfo['savedFile'] ?>',
-      '<?php echo $imageInfo['savedFile'] ?>'.replace(/^.*\/?([^\/]*)$/, '$1'),
-      <?php echo $imageInfo['width'] ?>,
-      <?php echo $imageInfo['height'] ?>
-    );
-  window.parent.opener.parent.refresh();
-  window.parent.close();
-<?php } else if ($editor->isFileSaved() == -1) { ?>
-	alert(i18n('File was not saved.'));
-<?php } ?>
-
-</script>
-<script type="text/javascript" src="<?php print $IMConfig['base_url'];?>assets/editorFrame.js"></script>
-</head>
-
-<body>
-<div id="status"></div>
-<div id="ant" class="selection" style="visibility:hidden"><img src="<?php print $IMConfig['base_url'];?>img/spacer.gif" width="0" height="0" border="0" alt="" id="cropContent"></div>
-<?php if ($editor->isGDEditable() == -1) { ?>
-	<div style="text-align:center; padding:10px;"><span class="error">GIF format is not supported, image editing not supported.</span></div>
-<?php } ?>
-<table height="100%" width="100%">
-	<tr>
-		<td>
-<?php if(count($imageInfo) > 0 && is_file($imageInfo['fullpath'])) { ?>
-	<span id="imgCanvas" class="crop"><img src="<?php echo $imageInfo['src']; ?>" <?php echo $imageInfo['dimensions']; ?> alt="" id="theImage" name="theImage"></span>
-<?php } else { ?>
-	<span class="error">No Image Available</span>
-<?php } ?>
-		</td>
-	</tr>
-</table>
-</body>
-</html>
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ImageManager/flickr.php b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ImageManager/flickr.php
deleted file mode 100644
index 9e898ff..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ImageManager/flickr.php
+++ /dev/null
@@ -1,263 +0,0 @@
-<?php 
-/**
- * Show a list of images in a long horizontal table.
- * @author $Author: gogo $
- * @version $Id: images.php 877 2007-08-12 15:50:03Z gogo $
- * @package ImageManager
- */
-
-require_once('config.inc.php');
-
-require_once('Classes/ImageManager.php');
-require_once('Classes/Flickr.php');
-
-// Search for youtube videos
-$opts = array(
-              'per_page'=> 20,
-              'sort'   => 'relevance',              
-              'extras' => 'license,owner_name,tags',
-              'license' => @$_REQUEST['flkLicense'] ? $_REQUEST['flkLicense'] : flickr_get_default_usage_id(),              
-              );
-
-if(@$_REQUEST['flkSearch'])
-{
-  $opts['text'] = $_REQUEST['flkSearch']; 
-}
-
-if(@$_REQUEST['flkUsername'])
-{
-  $user_id = flickr_get_user_id($_REQUEST['flkUsername']);
-  if($user_id)
-  {
-    $opts['user_id'] = $user_id;
-  }
-}
-
-$data = flickr_request('flickr.photos.search', $opts);
-
-
-$records = $data['photos']['photo'];
-
-// For future purposes, we may want an image manager
-$relative = '/';
-$manager = new ImageManager($IMConfig);
-
-/* ================= OUTPUT/DRAW FUNCTIONS ======================= */
-
-
-function rip_flickr_data($record)
-{  
-  $lics = flickr_get_licenses();
-  // echo '<pre>'; print_r($lics);  die();
-  
-  $title = $record['title'];
-  $license = $lics[$record['license']];
-  
-  // echo '<pre>';print_r($license); die();
-  
-  $description = '';
-  $sizes = flickr_request('flickr.photos.getSizes', array('photo_id' => $record['id']));
-  $sizes = $sizes['sizes'];
-  $thumbs = array(); // w:h => array( file, file, file)
-  $largest = array(0,'', 0, 0);   
-  $smallest = array(3000*3000,'', 3000, 3000); // Ok, hacky, sosumi
-  
-  foreach($sizes['size'] as $thumb) 
-  {
-    if($thumb['label'] == 'Square') continue; // These are a little smaller than default
-    if(!isset($thumbs["{$thumb['width']}x{$thumb['height']}"]))
-    {
-      $thumbs["{$thumb['width']}x{$thumb['height']}"]  = array();
-      
-      if(($thumb['width'] * $thumb['height']) > $largest[0])
-        $largest = array($thumb['width'] * $thumb['height'], $thumb['width'] . 'x' . $thumb['height'], $thumb['width'] , $thumb['height']);
-      
-      if(($thumb['width'] * $thumb['height']) < $smallest[0])
-        $smallest = array($thumb['width'] * $thumb['height'], $thumb['width'] . 'x' . $thumb['height'], $thumb['width'] , $thumb['height']);
-    }
-    $thumbs["{$thumb['width']}x{$thumb['height']}"][] = $thumb;
-    
-  }
-
-  // Find the main image link
-  $mainImage = $thumbs[$largest[1]];
-  $mainImage = array_pop($mainImage);
-  
-  // Find the thumb image link
-  $thumbImage = $thumbs[$smallest[1]];
-  $thumbImage = array_pop($thumbImage);
-  
-  // Final image to pass to manager (use query param to record the embed url)
-  $combinedImage = $mainImage['source'] . 
-  '?x-flickr-photo='.rawurlencode($record['id']) .
-  '&x-lic='.rawurlencode($license['x-id'])   .
-  '&x-uid='.rawurlencode($record['owner'])       .  
-  '&x-by='.rawurlencode($record['ownername'])    .   
-  '&x-tn='.rawurlencode($thumbImage['source']);
-  
-  
-  return array
-  (
-   'title'         => $title,
-   'description'   => $description,
-   'dimensions'    => "{$mainImage['width']}x{$mainImage['height']}",
-   'license'       => $license,
-   'mainImage'     => $mainImage['source'],
-   'thumbImage'    => $thumbImage['source'],
-   'combinedImage' => $combinedImage,
-   
-   'smallest' => $smallest,
-   'largest'  => $largest,
-   'thumbs'   => $thumbs,   
-  );
-}
-                           
-function drawFiles($list, &$manager)
-{
-	global $relative;
-	global $IMConfig;
-$IMConfig['ViewMode'] = 'thumbs';
-    switch($IMConfig['ViewMode'])
-    {
-      case 'details':
-      {
-        
-        ?>
-        <script language="Javascript">
-          <!--
-            function showPreview(f_url)
-            {              
-              window.parent.document.getElementById('f_preview').src = window.parent._backend_url + '__function=thumbs&img=' + encodeURIComponent(f_url);
-            }
-          //-->
-        </script>
-        <table class="listview">
-        <thead>
-        <tr><th>Title</th><th>Description</th><th>Dimensions</th></tr></thead>
-        <tbody>
-          <?php
-          foreach($list as $record)
-          {
-            
-            extract(rip_flickr_data($record));
-            
-            ?>
-            <tr>
-              <th><a href="#" class="thumb" style="cursor: pointer;" onclick="selectImage('<?php echo xinha_js_encode($combinedImage)?>', '<?php echo xinha_js_encode($title); ?>', <?php echo $largest[2];?>, <?php echo $largest[3]; ?>);return false;" title="<?php echo htmlspecialchars($title); ?> - <?php echo htmlspecialchars($dimensions); ?>" onmouseover="showPreview('<?php echo xinha_js_encode($combinedImage);?>')" onmouseout="showPreview(window.parent.document.getElementById('f_url').value)" ><?php echo htmlspecialchars($title) ?></a></th>
-              <td><?php echo htmlspecialchars($description); ?></td>
-              <td><?php echo htmlspecialchars($dimensions); ?>              
-            </tr>
-            <?php        
-          }
-          ?>
-        </tbody>
-        </table>
-        <?php
-      }      
-      break;
-      
-      case 'thumbs':
-      default      :
-      {
-        foreach($list as $record)
-        {
-          extract(rip_flickr_data($record));
-          ?>
-          <div class="thumb_holder" id="holder_<?php echo asc2hex($combinedImage) ?>">            
-            <a href="#" class="thumb" style="cursor: pointer;" onclick="selectImage('<?php echo xinha_js_encode($combinedImage)?>', '<?php echo xinha_js_encode($title); ?>', <?php echo $largest[2];?>, <?php echo $largest[3]; ?>);return false;" title="<?php echo htmlspecialchars($title); ?> - <?php echo htmlspecialchars($dimensions); ?>">
-              <img src="<?php print $thumbImage ?>" alt="<?php echo $title; ?> - <?php echo htmlspecialchars($dimensions); ?>"/>             
-            </a>
-            <div class="flk-license"><a href="<?php echo $license['url'] ?>" target="_blank"><?php echo htmlspecialchars($license['name']) ?></a></div>
-          </div>
-          <?php
-        }
-      }
-    }
-}//function drawFiles
-
-
-
-/**
- * No directories and no files.
- */
-function drawNoResults() 
-{
-?>
-<div class="noResult">No Photos Found</div>
-<?php 
-}
-
-/**
- * No directories and no files.
- */
-function drawErrorBase(&$manager) 
-{
-?>
-<div class="error"><span>Invalid base directory:</span> <?php echo $manager->config['images_dir']; ?></div>
-<?php 
-}
-
-/**
- * Utility to convert ascii string to hex
- */
-function asc2hex ($temp)
-{
-  $len = strlen($temp);
-  $data = "";
-  for ($i=0; $i<$len; $i++) $data.=sprintf("%02x",ord(substr($temp,$i,1)));
-  return $data;
-}
-
-?>
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-
-<html>
-<head>
-	<title>Flickr Picture List</title>
-  <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
-	<link href="<?php print $IMConfig['base_url'];?>assets/imagelist.css" rel="stylesheet" type="text/css" />
-  <script type="text/javascript">
-   _backend_url = "<?php print $IMConfig['backend_url']; ?>";
-  </script>
-
-<script type="text/javascript" src="<?php print $IMConfig['base_url'];?>assets/dialog.js"></script>
-<script type="text/javascript">
-/*<![CDATA[*/
-
-	if(window.top)
-    HTMLArea = Xinha    = window.top.Xinha;
-
-	function hideMessage()
-	{
-		var topDoc = window.top.document;
-		var messages = topDoc.getElementById('messages');
-		if(messages)
-			messages.style.display = "none";
-	}
-
-	init = function()
-	{
-	  __dlg_translate('ImageManager');
-		hideMessage();
-		var topDoc = window.top.document;
-
-//    update_selected();
-	}	
-	
-/*]]>*/
-</script>
-<script type="text/javascript" src="<?php print $IMConfig['base_url'];?>assets/images.js"></script>
-<script type="text/javascript" src="../../popups/popup.js"></script>
-<script type="text/javascript" src="assets/popup.js"></script>
-
-</head>
-
-<body class="flickr">
-<?php if ($manager->isValidBase() == false) { drawErrorBase($manager); } 
-	elseif(count($records)) { ?>
-
-	<?php drawFiles($records, $manager); ?>
-
-<?php } else { drawNoResults(); } ?>
-</body>
-</html>
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ImageManager/image-picker.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ImageManager/image-picker.js
deleted file mode 100644
index 9d90d8b..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ImageManager/image-picker.js
+++ /dev/null
@@ -1,205 +0,0 @@
-/**
- * An input field Image Picker utilising the Xinha ImageManager.
- *
- * Hijack the Xinha ImageManager plugin to provide an image URL picker
- * for any form input field in the form of a "Browse" button to the
- * right of the field, in the same manner as a file type input field
- * except it opens the familiar ImageManager dialog to upload/select/edit
- * an image and returns the URL of the image to the field's value.
- *
- * Example Usage:
- *
- *  <script type="text/javascript">_editor_url = '/url/to/xinha';</script>
- *  <script type="text/javascript" src="image-picker.js" />
- *  <script type="text/javascript">
- *   <?php require_once('/path/to/xinha/contrib/php-xinha.php'); ?>
- *   with(ImagePicker.prototype)
- *   {
- *     <?php 
- *      $Conf = array
- *       (
- *         'images_dir' => '/path/to/images', 
- *         'images_url' => '/url/to/images', 
- *         'show_full_options' => false, // Full options are not useful as a URL picker
- *         // See ImageManager for more configuration options !           
- *       );
- *      xinha_pass_to_php_backend($Conf);
- *     ?>
- *   }
- *
- *   window.onload = function() { new ImagePicker(document.getElementById('idOfTheInputField')); }
- *  </script>
- *
- *
- * @author $Author$
- * @version $Id$
- * @package ImageManager
- */
-
-
-function ImagePicker(field)
-{
-  this.field = field;
-  var picker = this;
-  
-  var but = document.createElement('input');   
-  but.type = 'button';
-  but.value = 'Browse'; 
-  but.onclick = function() { picker.popup_picker(); }
-     
-  field.parentNode.insertBefore(but,field.nextSibling);
-  field.size = '20';
-  field.style.textAlign = 'right';
-};
-
-ImagePicker.prototype.backend             = Xinha.getPluginDir('ImageManager') + '/backend.php?__plugin=ImageManager&';
-ImagePicker.prototype.backend_data        = null;
-
-ImagePicker.prototype.append_query_string = true;
-
-ImagePicker.prototype.popup_picker = function()
-{
-  var picker = this; // closure for later  
-  var outparam = null;
-  if(picker.field.value)
-  {
-    outparam =
-		{      
-			f_url    : picker.field.value,			
-			f_width  : null,
-			f_height  : null,
-     
-      // None of this stuff is useful to us, we return only a URL.
-      f_alt    : picker.field.value,
-			f_border : null,
-			f_align  : null,
-			f_padding: null,
-			f_margin : null,
-      f_backgroundColor: null,
-      f_borderColor: null,
-      f_border : null,
-      f_padding: null,
-      f_margin: null
-    };
-    
-    while(outparam.f_url.match(/[?&]((f_[a-z0-9]+)=([^&#]+))/i))
-    {
-      outparam[RegExp.$2] = decodeURIComponent(RegExp.$3);
-      outparam.f_url = outparam.f_url.replace(RegExp.$1, '');
-    }
-    
-    outparam.f_url = outparam.f_url.replace(/&{2,}/g, '&');
-    outparam.f_url = outparam.f_url.replace(/\?&*(#.*)?$/, ''); 
-  }
-
-  var manager = this.backend + '__function=manager';
-  if(this.backend_config != null)
-  {
-    manager += '&backend_config='
-      + encodeURIComponent(this.backend_config);
-    manager += '&backend_config_hash='
-      + encodeURIComponent(this.backend_config_hash);
-    manager += '&backend_config_secret_key_location='
-      + encodeURIComponent(this.backend_config_secret_key_location);
-  }
-  
-  if(this.backend_data != null)
-  {
-    for ( var i in this.backend_data )
-    {
-      manager += '&' + i + '=' + encodeURIComponent(this.backend_data[i]);
-    }
-  }
-
-  Dialog(manager, function(param) {
-		if (!param) {	// user must have pressed Cancel
-			return false;
-		}
-    
-    picker.field.value = param.f_url;
-    if(picker.append_query_string)
-    {
-      if(picker.field.value.match(/[?&](.*)$/))
-      {
-        if(RegExp.$1.length)
-        {
-          picker.field.value += '&';
-        }
-      }
-      else
-      {
-        picker.field.value += '?';
-      }
-      
-      for(var i in param)
-      {        
-        if(i == 'f_url' || param[i] == null || param[i] == 'null' || param[i] == '') continue;                
-        if(typeof param[i] == 'function') continue;
-        if(param[i].length = 0) continue;
-        
-        picker.field.value += i + '=' + encodeURIComponent(param[i]) + '&';
-      }
-    }
-    
-		}, outparam);
-}
-
-// Dialog is part of Xinha, but we'll provide it here incase Xinha's not being
-// loaded.
-if(typeof Dialog == 'undefined')
-{
-  // htmlArea v3.0 - Copyright (c) 2003-2004 interactivetools.com, inc.
-  // This copyright notice MUST stay intact for use (see license.txt).
-  //
-  // Portions (c) dynarch.com, 2003-2004
-  //
-  // A free WYSIWYG editor replacement for <textarea> fields.
-  // For full source code and docs, visit http://www.interactivetools.com/
-  //
-  // Version 3.0 developed by Mihai Bazon.
-  //   http://dynarch.com/mishoo
-  //
-  // $Id: dialog.js 183 2005-05-20 06:11:44Z gogo $
-  
-  // Though "Dialog" looks like an object, it isn't really an object.  Instead
-  // it's just namespace for protecting global symbols.
-  
-  function Dialog(url, action, init) {
-    if (typeof init == "undefined") {
-      init = window;	// pass this window object by default
-    }
-    var dlg = window.open(url, "hadialog",
-              "toolbar=no,menubar=no,personalbar=no,width=10,height=10," +
-              "scrollbars=yes,resizable=yes,modal=yes,dependable=yes");
-    Dialog._modal = dlg;
-    Dialog._arguments = init;
-
-    // make up a function to be called when the Dialog ends.
-    Dialog._return = function (val) 
-    {
-      if (val && action) {
-        action(val);
-      }
-
-      Dialog._modal = null;
-    };
-    Dialog._modal.focus();
-  };
-     
-  // should be a function, the return handler of the currently opened dialog.
-  Dialog._return = null;
-  
-  // constant, the currently opened dialog
-  Dialog._modal = null;
-  
-  // the dialog will read it's args from this variable
-  Dialog._arguments = null;
- 
-}
-
-// Deprecated method for passing config, use above instead!
-//---------------------------------------------------------
-ImagePicker.prototype.backend_config      = null;
-ImagePicker.prototype.backend_config_hash = null;
-ImagePicker.prototype.backend_config_secret_key_location = 'Xinha:ImageManager';
-//---------------------------------------------------------
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ImageManager/images.php b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ImageManager/images.php
deleted file mode 100644
index a0a4ef1..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ImageManager/images.php
+++ /dev/null
@@ -1,328 +0,0 @@
-<?php 
-/**
- * Show a list of images in a long horizontal table.
- * @author $Author:ray $
- * @version $Id:images.php 987 2008-04-12 12:39:04Z ray $
- * @package ImageManager
- */
-
-require_once('config.inc.php');
-require_once('ddt.php');
-require_once('Classes/ImageManager.php');
-
-// uncomment for debugging
-
-// _ddtOn();
-
-//default path is /
-$relative = '/';
-$manager = new ImageManager($IMConfig);
-
-//process any file uploads
-$manager->processUploads();
-
-if($IMConfig['allow_delete']) 
-{
-  $manager->deleteFiles();
-}
-
-$refreshDir = false;
-//process any directory functions
-if(($IMConfig['allow_delete'] && $manager->deleteDirs()) || $manager->processNewDir())
-	$refreshDir = true;
-
-//check for any sub-directory request
-//check that the requested sub-directory exists
-//and valid
-if(isset($_REQUEST['dir']))
-{
-	$path = rawurldecode($_REQUEST['dir']);
-	if($manager->validRelativePath($path))
-		$relative = $path;
-}
-
-
-$manager = new ImageManager($IMConfig);
-
-
-//get the list of files and directories
-$list = $manager->getFiles($relative);
-
-
-/* ================= OUTPUT/DRAW FUNCTIONS ======================= */
-
-/**
- * Draw the files in an table.
- */
-function drawFiles($list, &$manager)
-{
-	global $relative;
-	global $IMConfig;
-
-    switch($IMConfig['ViewMode'])
-    {
-      case 'details':
-      {
-        ?>
-        <script language="Javascript">
-          <!--
-            function showPreview(f_url)
-            {
-              
-              window.parent.document.getElementById('f_preview').src = 
-                window.parent._backend_url + '__function=thumbs&img=' + f_url;
-            }
-          //-->
-        </script>
-        <table class="listview">
-        <thead>
-        <tr><th>Name</th><th>Filesize</th><th>Dimensions</th></tr></thead>
-        <tbody>
-          <?php
-          foreach($list as $entry => $file)
-          {
-            ?>
-            <tr>
-              <th><a href="#" class="thumb" style="cursor: pointer;" onclick="selectImage('<?php echo $file['relative'];?>', '<?php echo $entry; ?>', <?php echo $file['image'][0];?>, <?php echo $file['image'][1]; ?>);return false;" title="<?php echo $entry; ?> - <?php echo Files::formatSize($file['stat']['size']); ?>" onmouseover="showPreview('<?php echo $file['relative'];?>')" onmouseout="showPreview(window.parent.document.getElementById('f_url').value)" ><?php echo $entry ?></a></th>
-              <td><?php echo Files::formatSize($file['stat']['size']); ?></td>
-              <td><?php if($file['image']){ echo $file['image'][0].'x'.$file['image'][1]; } ?></td>
-              <td class="actions">
-                <?php
-                  if($IMConfig['allow_delete'])
-                  {
-                    ?>
-                <a href="<?php print $IMConfig['backend_url']; ?>__function=images&dir=<?php echo $relative; ?>&amp;delf=<?php echo rawurlencode($file['relative']);?>" title="Trash" onclick="return confirmDeleteFile('<?php echo $entry; ?>');"><img src="<?php print $IMConfig['base_url'];?>img/edit_trash.gif" height="15" width="15" alt="Trash" border="0"  /></a>
-                    <?php
-                  }
-                ?>
-                <?php
-                  if($IMConfig['allow_edit'])
-                  {
-                    ?>
-                <a href="javascript:;" title="Edit" onclick="editImage('<?php echo rawurlencode($file['relative']);?>');"><img src="<?php print $IMConfig['base_url'];?>img/edit_pencil.gif" height="15" width="15" alt="Edit" border="0" /></a>
-                    <?php
-                  }
-                ?>
-              </td>
-            </tr>
-            <?php        
-          }
-          ?>
-        </tbody>
-        </table>
-        <?php
-      }      
-      break;
-      
-      case 'thumbs':
-      default      :
-      {
-	foreach($list as $entry => $file)
-	{
-		?>
-    <div class="thumb_holder" id="holder_<?php echo asc2hex($entry) ?>">
-      <a href="#" class="thumb" style="cursor: pointer;" onclick="selectImage('<?php echo $file['relative'];?>', '<?php echo $entry; ?>', <?php echo $file['image'][0];?>, <?php echo $file['image'][1]; ?>);return false;" title="<?php echo $entry; ?> - <?php echo Files::formatSize($file['stat']['size']); ?>">
-        <img src="<?php print $manager->getThumbnail($file['relative']); ?>" alt="<?php echo $entry; ?> - <?php echo Files::formatSize($file['stat']['size']); ?>"/>
-      </a>
-      <div class="edit">
-      
-      <?php
-        if($IMConfig['allow_delete'])
-        {
-          ?>
-        <a href="<?php print $IMConfig['backend_url']; ?>__function=images&dir=<?php echo $relative; ?>&amp;delf=<?php echo rawurlencode($file['relative']);?>" title="Trash" onclick="return confirmDeleteFile('<?php echo $entry; ?>');"><img src="<?php print $IMConfig['base_url'];?>img/edit_trash.gif" height="15" width="15" alt="Trash"  /></a>
-          <?php
-        }
-      ?>
-      
-      <?php
-        if($IMConfig['allow_edit'])
-        {
-          ?>
-        <a href="javascript:;" title="Edit" onclick="editImage('<?php echo rawurlencode($file['relative']);?>');"><img src="<?php print $IMConfig['base_url'];?>img/edit_pencil.gif" height="15" width="15" alt="Edit" /></a>
-          <?php
-        }
-      ?>
-        <?php if($file['image']){ echo $file['image'][0].'x'.$file['image'][1]; } else echo $entry;?>
-      </div>
-    </div>
-	  <?php
-        }
-      }
-    }	
-}//function drawFiles
-
-
-/**
- * Draw the directory.
- */
-function drawDirs($list, &$manager) 
-{
-	global $relative;
-   global $IMConfig;
-
-  switch($IMConfig['ViewMode'])
-  {
-    case 'details':
-    {
-        
-    }
-    break; 
-    
-    case 'thumbs':
-    default      :
-    {
-	foreach($list as $path => $dir) 
-	{ ?>
-    <div class="dir_holder">
-      <a class="dir" href="<?php print $IMConfig['backend_url'];?>__function=images&dir=<?php echo rawurlencode($path); ?>" onclick="updateDir('<?php echo $path; ?>')" title="<?php echo $dir['entry']; ?>"><img src="<?php print $IMConfig['base_url'];?>img/folder.gif" height="80" width="80" alt="<?php echo $dir['entry']; ?>" /></a>
-
-      <div class="edit">
-        <?php
-          if($IMConfig['allow_delete'])
-          {
-            ?>
-        <a href="<?php print $IMConfig['backend_url'];?>__function=images&dir=<?php echo $relative; ?>&amp;deld=<?php echo rawurlencode($path); ?>" title="Trash" onclick="return confirmDeleteDir('<?php echo $dir['entry']; ?>', <?php echo $dir['count']; ?>);"><img src="<?php print $IMConfig['base_url'];?>img/edit_trash.gif" height="15" width="15" alt="Trash"/></a>
-            <?php
-          }
-        ?>
-              
-        <?php echo $dir['entry']; ?>
-      </div>
-    </div>
-	  <?php 
-	} //foreach
-    }
-  }
-  
-	
-}//function drawDirs
-
-
-/**
- * No directories and no files.
- */
-function drawNoResults() 
-{
-?>
-<div class="noResult">No Images Found</div>
-<?php 
-}
-
-/**
- * No directories and no files.
- */
-function drawErrorBase(&$manager) 
-{
-?>
-<div class="error"><span>Invalid base directory:</span> <?php echo $manager->config['images_dir']; ?></div>
-<?php 
-}
-
-/**
- * Utility to convert ascii string to hex
- */
-function asc2hex ($temp)
-{
-  $len = strlen($temp);
-  $data = "";
-  for ($i=0; $i<$len; $i++) $data.=sprintf("%02x",ord(substr($temp,$i,1)));
-  return $data;
-}
-
-?>
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-
-<html>
-<head>
-	<title>Image List</title>
-  <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
-	<link href="<?php print $IMConfig['base_url'];?>assets/imagelist.css" rel="stylesheet" type="text/css" />
-<script type="text/javascript">
-_backend_url = "<?php print $IMConfig['backend_url']; ?>";
-</script>
-
-<script type="text/javascript" src="<?php print $IMConfig['base_url'];?>assets/dialog.js"></script>
-<script type="text/javascript">
-/*<![CDATA[*/
-
-	if(window.top)
-    HTMLArea = Xinha    = window.top.Xinha;
-
-	function hideMessage()
-	{
-		var topDoc = window.top.document;
-		var messages = topDoc.getElementById('messages');
-		if(messages)
-			messages.style.display = "none";
-	}
-
-	init = function()
-	{
-	  __dlg_translate('ImageManager');
-		hideMessage();
-		var topDoc = window.top.document;
-
-<?php 
-	//we need to refesh the drop directory list
-	//save the current dir, delete all select options
-	//add the new list, re-select the saved dir.
-	if($refreshDir) 
-	{ 
-		$dirs = $manager->getDirs();
-?>
-		var selection = topDoc.getElementById('dirPath');
-		var currentDir = selection.options[selection.selectedIndex].text;
-
-		while(selection.length > 0)
-		{	selection.remove(0); }
-		
-		selection.options[selection.length] = new Option("/","<?php echo rawurlencode('/'); ?>");	
-		<?php foreach($dirs as $relative=>$fullpath) { ?>
-		selection.options[selection.length] = new Option("<?php echo $relative; ?>","<?php echo rawurlencode($relative); ?>");		
-		<?php } ?>
-		
-		for(var i = 0; i < selection.length; i++)
-		{
-			var thisDir = selection.options[i].text;
-			if(thisDir == currentDir)
-			{
-				selection.selectedIndex = i;
-				break;
-			}
-		}		
-<?php } ?>
-    update_selected();
-	}	
-
-	function editImage(image) 
-	{
-		var url = "<?php print $IMConfig['backend_url']; ?>__function=editor&img="+image;
-		Dialog(url, function(param) 
-		{
-			if (!param) // user must have pressed Cancel
-				return false;
-			else
-			{
-				return true;
-			}
-		}, null);		
-	}
-
-/*]]>*/
-</script>
-<script type="text/javascript" src="<?php print $IMConfig['base_url'];?>assets/images.js"></script>
-<script type="text/javascript" src="../../popups/popup.js"></script>
-<script type="text/javascript" src="assets/popup.js"></script>
-</head>
-
-<body>
-<?php if ($manager->isValidBase() == false) { drawErrorBase($manager); } 
-	elseif(count($list[0]) > 0 || count($list[1]) > 0) { ?>
-
-	<?php drawDirs($list[0], $manager); ?>
-	<?php drawFiles($list[1], $manager); ?>
-
-<?php } else { drawNoResults(); } ?>
-</body>
-</html>
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ImageManager/img/2x2.gif b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ImageManager/img/2x2.gif
deleted file mode 100644
index 2f2ec4a..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ImageManager/img/2x2.gif
+++ /dev/null
Binary files differ
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ImageManager/img/2x2_w.gif b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ImageManager/img/2x2_w.gif
deleted file mode 100644
index 9b560a8..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ImageManager/img/2x2_w.gif
+++ /dev/null
Binary files differ
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ImageManager/img/btnFolderNew.gif b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ImageManager/img/btnFolderNew.gif
deleted file mode 100644
index db01742..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ImageManager/img/btnFolderNew.gif
+++ /dev/null
Binary files differ
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ImageManager/img/btnFolderUp.gif b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ImageManager/img/btnFolderUp.gif
deleted file mode 100644
index 7b7349d..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ImageManager/img/btnFolderUp.gif
+++ /dev/null
Binary files differ
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ImageManager/img/btn_cancel.gif b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ImageManager/img/btn_cancel.gif
deleted file mode 100644
index ae9401c..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ImageManager/img/btn_cancel.gif
+++ /dev/null
Binary files differ
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ImageManager/img/btn_ok.gif b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ImageManager/img/btn_ok.gif
deleted file mode 100644
index e8b027c..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ImageManager/img/btn_ok.gif
+++ /dev/null
Binary files differ
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ImageManager/img/crop.gif b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ImageManager/img/crop.gif
deleted file mode 100644
index 8ef53b2..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ImageManager/img/crop.gif
+++ /dev/null
Binary files differ
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ImageManager/img/default.gif b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ImageManager/img/default.gif
deleted file mode 100644
index 7419c1d..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ImageManager/img/default.gif
+++ /dev/null
Binary files differ
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ImageManager/img/div.gif b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ImageManager/img/div.gif
deleted file mode 100644
index 6d25c02..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ImageManager/img/div.gif
+++ /dev/null
Binary files differ
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ImageManager/img/dots.gif b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ImageManager/img/dots.gif
deleted file mode 100644
index a213e5b..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ImageManager/img/dots.gif
+++ /dev/null
Binary files differ
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ImageManager/img/edit_active.gif b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ImageManager/img/edit_active.gif
deleted file mode 100644
index 928c25d..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ImageManager/img/edit_active.gif
+++ /dev/null
Binary files differ
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ImageManager/img/edit_pencil.gif b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ImageManager/img/edit_pencil.gif
deleted file mode 100644
index 04fe5a2..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ImageManager/img/edit_pencil.gif
+++ /dev/null
Binary files differ
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ImageManager/img/edit_trash.gif b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ImageManager/img/edit_trash.gif
deleted file mode 100644
index 8754ac7..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ImageManager/img/edit_trash.gif
+++ /dev/null
Binary files differ
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ImageManager/img/folder.gif b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ImageManager/img/folder.gif
deleted file mode 100644
index 9003f58..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ImageManager/img/folder.gif
+++ /dev/null
Binary files differ
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ImageManager/img/hand.gif b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ImageManager/img/hand.gif
deleted file mode 100644
index 23c900f..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ImageManager/img/hand.gif
+++ /dev/null
Binary files differ
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ImageManager/img/islocked2.gif b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ImageManager/img/islocked2.gif
deleted file mode 100644
index 1dfd2ec..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ImageManager/img/islocked2.gif
+++ /dev/null
Binary files differ
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ImageManager/img/locked.gif b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ImageManager/img/locked.gif
deleted file mode 100644
index 9247238..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ImageManager/img/locked.gif
+++ /dev/null
Binary files differ
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ImageManager/img/measure.gif b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ImageManager/img/measure.gif
deleted file mode 100644
index 9e496db..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ImageManager/img/measure.gif
+++ /dev/null
Binary files differ
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ImageManager/img/noimages.gif b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ImageManager/img/noimages.gif
deleted file mode 100644
index 22e6dd3..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ImageManager/img/noimages.gif
+++ /dev/null
Binary files differ
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ImageManager/img/rotate.gif b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ImageManager/img/rotate.gif
deleted file mode 100644
index cf8764f..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ImageManager/img/rotate.gif
+++ /dev/null
Binary files differ
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ImageManager/img/save.gif b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ImageManager/img/save.gif
deleted file mode 100644
index dadb9b0..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ImageManager/img/save.gif
+++ /dev/null
Binary files differ
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ImageManager/img/scale.gif b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ImageManager/img/scale.gif
deleted file mode 100644
index e36bec3..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ImageManager/img/scale.gif
+++ /dev/null
Binary files differ
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ImageManager/img/spacer.gif b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ImageManager/img/spacer.gif
deleted file mode 100644
index fc25609..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ImageManager/img/spacer.gif
+++ /dev/null
Binary files differ
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ImageManager/img/t_black.gif b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ImageManager/img/t_black.gif
deleted file mode 100644
index 4f362f1..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ImageManager/img/t_black.gif
+++ /dev/null
Binary files differ
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ImageManager/img/t_white.gif b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ImageManager/img/t_white.gif
deleted file mode 100644
index bcddeec..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ImageManager/img/t_white.gif
+++ /dev/null
Binary files differ
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ImageManager/img/unlocked.gif b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ImageManager/img/unlocked.gif
deleted file mode 100644
index fe4e0d4..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ImageManager/img/unlocked.gif
+++ /dev/null
Binary files differ
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ImageManager/img/unlocked2.gif b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ImageManager/img/unlocked2.gif
deleted file mode 100644
index ce703c9..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ImageManager/img/unlocked2.gif
+++ /dev/null
Binary files differ
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ImageManager/lang/b5.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ImageManager/lang/b5.js
deleted file mode 100644
index 6929a0c..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ImageManager/lang/b5.js
+++ /dev/null
@@ -1,15 +0,0 @@
-// I18N constants
-// LANG: "b5", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "__OBSOLETE__": {
-        "___ TRANSLATOR NOTE   ___": "*** IMAGEMANAGER IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***"
-    }
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ImageManager/lang/ch.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ImageManager/lang/ch.js
deleted file mode 100644
index 073bf87..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ImageManager/lang/ch.js
+++ /dev/null
@@ -1,17 +0,0 @@
-// I18N constants
-// LANG: "ch", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Cancel": "取消",
-    "OK": "好",
-    "__OBSOLETE__": {
-        "___ TRANSLATOR NOTE   ___": "*** IMAGEMANAGER IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***"
-    }
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ImageManager/lang/cz.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ImageManager/lang/cz.js
deleted file mode 100644
index 005e773..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ImageManager/lang/cz.js
+++ /dev/null
@@ -1,25 +0,0 @@
-// I18N constants
-// LANG: "cz", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Baseline": "Základní linka",
-    "Bottom": "Dolů",
-    "Cancel": "Zrušit",
-    "Height:": "Výška",
-    "Left": "Vlevo",
-    "Middle": "Na střed",
-    "OK": "OK",
-    "Right": "Vpravo",
-    "Top": "Nahoru",
-    "Width:": "Šířka",
-    "__OBSOLETE__": {
-        "___ TRANSLATOR NOTE   ___": "*** IMAGEMANAGER IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***"
-    }
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ImageManager/lang/da.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ImageManager/lang/da.js
deleted file mode 100644
index 82e1d21..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ImageManager/lang/da.js
+++ /dev/null
@@ -1,64 +0,0 @@
-// I18N constants
-// LANG: "da", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Absbottom": "Bund",
-    "Absmiddle": "Centreret",
-    "Angle:": "Vinkel:",
-    "Baseline": "Grundlinje",
-    "Bottom": "Tekstbund",
-    "Cancel": "Annuller",
-    "Clear": "Fortryd",
-    "Constrain Proportions": "Korrekt størrelsesforhold",
-    "Crop": "Beskær",
-    "Directory": "Mappe",
-    "Directory Up": "Mappe op",
-    "Edit": "Rediger",
-    "Filename:": "Filnavn:",
-    "Flip Horizontal": "Vend vandret",
-    "Flip Image": "Vend billede",
-    "Flip Vertical": "Vend lodret",
-    "Folder Name:": "Mappenavn",
-    "GIF format is not supported, image editing not supported.": "GIF-Format ikke understøttet - kan ikke redigeres.",
-    "Height:": "Højde:",
-    "Image Format": "Billedformat:",
-    "Insert Image": "Indsæt billede",
-    "Invalid base directory:": "Ugyldig base mappe:",
-    "JPEG High": "JPEG høj",
-    "JPEG Low": "JPEG lav",
-    "JPEG Medium": "JPEG mellem",
-    "Left": "Venstre",
-    "Lock": "Lås",
-    "Marker": "Markør",
-    "Measure": "Målebånd",
-    "Middle": "Midt",
-    "New Folder": "Ny mappe",
-    "No Image Available": "Ingen billeder tilgængelig",
-    "Not set": "Ubestemt",
-    "OK": "OK",
-    "Positioning of this image": "Billedets position",
-    "Quality:": "Kvalitet",
-    "Refresh": "Opdater",
-    "Resize": "Ændre størrelse",
-    "Right": "Højre",
-    "Rotate": "Rotere",
-    "Rotate Image": "Drej billede",
-    "Save": "Gem",
-    "Start X:": "Start X",
-    "Start Y:": "Start Y",
-    "Texttop": "Teksttop",
-    "Top": "Top",
-    "Trash": "Papirkurv",
-    "W:": "W:",
-    "Width:": "Bredde:",
-    "__OBSOLETE__": {
-        "___ TRANSLATOR NOTE   ___": "*** IMAGEMANAGER IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***"
-    }
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ImageManager/lang/de.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ImageManager/lang/de.js
deleted file mode 100644
index 5909a4d..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ImageManager/lang/de.js
+++ /dev/null
@@ -1,89 +0,0 @@
-// I18N constants
-// LANG: "de", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Absbottom": "unten bündig",
-    "Absmiddle": "mittig",
-    "Angle:": "Winkel:",
-    "Baseline": "Grundlinie",
-    "Bottom": "unten",
-    "Cancel": "Abbrechen",
-    "Clear": "Entfernen",
-    "Constrain Proportions": "Proportional",
-    "Crop": "Beschneiden",
-    "Directory": "Ordner",
-    "Directory Up": "übergeordneter Ordner",
-    "Edit": "bearbeiten",
-    "Filename:": "Dateiname:",
-    "Flip Horizontal": "horizontal spiegeln",
-    "Flip Image": "Bild spiegeln",
-    "Flip Vertical": "vertikal spiegeln",
-    "Folder Name:": "Ordnername:",
-    "GIF format is not supported, image editing not supported.": "GIF Format wird nicht unterstützt, Bildbearbeitung wird nicht unterstützt.",
-    "Height:": "Höhe:",
-    "Image Format": "Bildformat:",
-    "Insert Image": "Bild einfügen",
-    "Invalid base directory:": "Ungültiges Startverzeichnis:",
-    "JPEG High": "JPEG hoch",
-    "JPEG Low": "JPEG niedrig",
-    "JPEG Medium": "JPEG mittel",
-    "Left": "links",
-    "Lock": "Sperren",
-    "Marker": "Marker",
-    "Measure": "Abmessungen",
-    "Middle": "zentriert",
-    "New Folder": "Neuer Ordner",
-    "No Image Available": "Kein Bild verfügbar",
-    "No Images Found": "Kein Bild gefunden",
-    "Not set": "nicht eingestellt",
-    "OK": "OK",
-    "Positioning of this image": "Anordnung dieses Bildes",
-    "Quality:": "Qualität",
-    "Refresh": "Aktualisieren",
-    "Resize": "Größe ändern",
-    "Right": "rechts",
-    "Rotate": "Drehen",
-    "Rotate Image": "Bild drehen",
-    "Save": "Speichern",
-    "Start X:": "Start X",
-    "Start Y:": "Start Y",
-    "Texttop": "oben bündig",
-    "Top": "oben",
-    "Trash": "Müll",
-    "W:": "B:",
-    "Width:": "Breite:",
-    "__OBSOLETE__": {
-        "Align:": "Ausrichtung:",
-        "Border": "Rand",
-        "Color:": "Farbe:",
-        "Delete file?": "Datei löschen?",
-        "Delete folder?": "Ordner löschen?",
-        "Description:": "Beschreibung:",
-        "File saved.": "Datei gespeichert.",
-        "File was not saved.": "Datei wurde nicht gespeichert.",
-        "H Space": "horizontaler Freiraum",
-        "Height": "Höhe",
-        "Image File": "Bilddatei",
-        "Image Manager": "Bildmanager",
-        "Invalid folder name, please choose another folder name.": "Ungültiger Ordnername, bitte wählen sie einen anderen Namen.",
-        "Loading": "Laden",
-        "Margin:": "Außenabstand:",
-        "No Image selected.": "Kein Bild ausgewählt.",
-        "Padding:": "Innenabstand:",
-        "Please delete all files/folders inside the folder you wish to delete first.": "Bitte löschen Sie zuerst alle Dateien im Ordner den Sie löschen möchten.",
-        "Rotate 180 °": "180° drehen",
-        "Rotate 90 ° CCW": "90° drehen gegen UZS",
-        "Rotate 90 ° CW": "90° drehen im UZS",
-        "Upload": "Hochladen",
-        "Uploading...": "Hochladen...",
-        "V Space": "vertikaler Freiraum",
-        "Width": "Breite"
-    }
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ImageManager/lang/ee.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ImageManager/lang/ee.js
deleted file mode 100644
index 94708a7..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ImageManager/lang/ee.js
+++ /dev/null
@@ -1,17 +0,0 @@
-// I18N constants
-// LANG: "ee", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Cancel": "Loobu",
-    "OK": "OK",
-    "__OBSOLETE__": {
-        "___ TRANSLATOR NOTE   ___": "*** IMAGEMANAGER IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***"
-    }
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ImageManager/lang/el.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ImageManager/lang/el.js
deleted file mode 100644
index ef0d25d..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ImageManager/lang/el.js
+++ /dev/null
@@ -1,25 +0,0 @@
-// I18N constants
-// LANG: "el", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Baseline": "Baseline",
-    "Bottom": "Κάτω μέρος",
-    "Cancel": "Ακύρωση",
-    "Height:": "Ύψος",
-    "Left": "Αριστερά",
-    "Middle": "Κέντρο",
-    "OK": "Εντάξει",
-    "Right": "Δεξιά",
-    "Top": "Πάνω",
-    "Width:": "Πλάτος",
-    "__OBSOLETE__": {
-        "___ TRANSLATOR NOTE   ___": "*** IMAGEMANAGER IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***"
-    }
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ImageManager/lang/es.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ImageManager/lang/es.js
deleted file mode 100644
index 9e6c3f0..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ImageManager/lang/es.js
+++ /dev/null
@@ -1,91 +0,0 @@
-// I18N constants
-// LANG: "es", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Absbottom": "Inferior absoluto",
-    "Absmiddle": "Medio Absoluto",
-    "Angle:": "Ángulo:",
-    "Baseline": "Línea base",
-    "Bottom": "Inferior",
-    "Cancel": "Cancelar",
-    "Clear": "Eliminar",
-    "Constrain Proportions": "Proporcional",
-    "Crop": "Recortar",
-    "Directory": "Directorio",
-    "Directory Up": "Directorio superior",
-    "Edit": "editar",
-    "Filename:": "Nombre del fichero:",
-    "Flip Horizontal": "invertir horizontalmente",
-    "Flip Image": "invertir imagen",
-    "Flip Vertical": "invertir verticalmente",
-    "Folder Name:": "Nombre del directorio:",
-    "GIF format is not supported, image editing not supported.": "No hay soporte para imágenes en formato GIF.",
-    "Height:": "Alto:",
-    "Image Format": "Formato:",
-    "Insert Image": "insertar imagen",
-    "Invalid base directory:": "Directorio de inicio inválido:",
-    "JPEG High": "JPEG alto",
-    "JPEG Low": "JPEG bajo",
-    "JPEG Medium": "JPEG medio",
-    "Left": "Izquierda",
-    "Lock": "Bloquear",
-    "Marker": "Marcador",
-    "Measure": "Dimensiones",
-    "Middle": "Medio",
-    "New Folder": "Crear directorio",
-    "No Image Available": "No hay imagen",
-    "No Images Found": "No se ha encontrado imagen",
-    "Not set": "No definido",
-    "OK": "Aceptar",
-    "Positioning of this image": "Posición de la imagen",
-    "Quality:": "Calidad",
-    "Refresh": "Actualizar",
-    "Resize": "Cambiar tamaño",
-    "Right": "Derecha",
-    "Rotate": "Girar",
-    "Rotate Image": "Girar imagen",
-    "Save": "Guardar",
-    "Start X:": "Inicio X",
-    "Start Y:": "Inicio Y",
-    "Texttop": "Texto Superior",
-    "Top": "Superior",
-    "Trash": "Basura",
-    "W:": "B:",
-    "Width:": "Ancho:",
-    "__OBSOLETE__": {
-        "Align:": "Alineado:",
-        "Border": "Borde",
-        "Border:": "Borde:",
-        "Color:": "Color:",
-        "Delete file?": "¿Borrar fichero?",
-        "Delete folder?": "¿Borrar directorio?",
-        "Description:": "Descripción:",
-        "File saved.": "Fichero guardado.",
-        "File was not saved.": "el fichero no ha sido guardado.",
-        "H Space": "espacio horizontal",
-        "Height": "Alto",
-        "Image File": "Fichero",
-        "Image Manager": "Editor de imágenes",
-        "Invalid folder name, please choose another folder name.": "Nombre de directorio inválido... por favor elija otro nombre.",
-        "Loading": "Cargar",
-        "Margin:": "Margen exterior:",
-        "No Image selected.": "No ha seleccionado imagen.",
-        "Padding:": "Margen interior:",
-        "Please delete all files/folders inside the folder you wish to delete first.": "Primero tiene que borrar todoas los ficheros de este directorio.",
-        "Rotate 180 °": "Girar 180º",
-        "Rotate 90 ° CCW": "Girar 90º sentido contrareloj",
-        "Rotate 90 ° CW": "Girar 90º sentido reloj",
-        "Upload": "Subir",
-        "Upload:": "Subir:",
-        "Uploading...": "Subir...",
-        "V Space": "espacio vertical",
-        "Width": "Ancho"
-    }
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ImageManager/lang/eu.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ImageManager/lang/eu.js
deleted file mode 100644
index f473ecb..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ImageManager/lang/eu.js
+++ /dev/null
@@ -1,30 +0,0 @@
-// I18N constants
-// LANG: "eu", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Absbottom": "Irudiaren behekaldean",
-    "Absmiddle": "Irudiaren erdian",
-    "Baseline": "Irudiaren oinean",
-    "Bottom": "Behean",
-    "Cancel": "Utzi",
-    "Insert Image": "Irudia txertatu",
-    "Left": "Ezkerretara",
-    "Middle": "Erdian",
-    "Not set": "Ez gaitua",
-    "OK": "Ados",
-    "Positioning of this image": "Irudiaren kokapena",
-    "Right": "Eskuinetara",
-    "Texttop": "Irudiaren goialdean",
-    "Top": "Goian",
-    "Width:": "Zabalera:",
-    "__OBSOLETE__": {
-        "___ TRANSLATOR NOTE   ___": "*** IMAGEMANAGER IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***"
-    }
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ImageManager/lang/fa.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ImageManager/lang/fa.js
deleted file mode 100644
index be0cebf..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ImageManager/lang/fa.js
+++ /dev/null
@@ -1,30 +0,0 @@
-// I18N constants
-// LANG: "fa", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Absbottom": "دقیقا پایین",
-    "Absmiddle": "دقیقا وسط",
-    "Baseline": "ابتدای خط",
-    "Bottom": "پایین",
-    "Cancel": "انصراف",
-    "Insert Image": "افزودن تصویر",
-    "Left": "چپ",
-    "Middle": "وسط",
-    "Not set": "تنظیم نشده",
-    "OK": "بله",
-    "Positioning of this image": "موقعیت یابی تصویر",
-    "Right": "راست",
-    "Texttop": "بالای متن",
-    "Top": "بالا",
-    "Width:": "طول",
-    "__OBSOLETE__": {
-        "___ TRANSLATOR NOTE   ___": "*** IMAGEMANAGER IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***"
-    }
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ImageManager/lang/fi.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ImageManager/lang/fi.js
deleted file mode 100644
index 4525d5e..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ImageManager/lang/fi.js
+++ /dev/null
@@ -1,24 +0,0 @@
-// I18N constants
-// LANG: "fi", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Baseline": "Takaraja",
-    "Bottom": "Alle",
-    "Cancel": "Peruuta",
-    "Left": "Vasen",
-    "Middle": "Keskelle",
-    "OK": "Hyväksy",
-    "Right": "Oikea",
-    "Top": "Ylös",
-    "Width:": "Leveys",
-    "__OBSOLETE__": {
-        "___ TRANSLATOR NOTE   ___": "*** IMAGEMANAGER IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***"
-    }
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ImageManager/lang/fr.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ImageManager/lang/fr.js
deleted file mode 100644
index a536eda..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ImageManager/lang/fr.js
+++ /dev/null
@@ -1,89 +0,0 @@
-// I18N constants
-// LANG: "fr", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Absbottom": "Absbottom",
-    "Absmiddle": "Absmiddle",
-    "Angle:": "Angle",
-    "Baseline": "Baseline",
-    "Bottom": "Bas",
-    "Cancel": "Annuler",
-    "Clear": "Effacer",
-    "Constrain Proportions": "Conserver les proportions",
-    "Crop": "Recadrer",
-    "Directory": "Répertoire",
-    "Directory Up": "Remonter",
-    "Edit": "Editer",
-    "Filename:": "Nom",
-    "Flip Horizontal": "Symétrie horizontale",
-    "Flip Image": "Symétrie",
-    "Flip Vertical": "Symétrie verticale",
-    "Folder Name:": "Nom du répertoire",
-    "GIF format is not supported, image editing not supported.": "Format GIF non supporté, édition d'image non supportée",
-    "Height:": "Hauteur",
-    "Image Format": "Format d'image",
-    "Insert Image": "Insérer une image",
-    "Invalid base directory:": "Répertoire de base invalide:",
-    "JPEG High": "JPEG haut",
-    "JPEG Low": "JPEG bas",
-    "JPEG Medium": "JPEG moyen",
-    "Left": "Gauche",
-    "Lock": "Cadenas",
-    "Marker": "Marqueur",
-    "Measure": "Mesure",
-    "Middle": "Milieu",
-    "New Folder": "Nouveau répertoire",
-    "No Image Available": "Aucune image disponible",
-    "No Images Found": "Aucune image trouvée",
-    "Not set": "Indéfini",
-    "OK": "OK",
-    "Positioning of this image": "Position de cette image",
-    "Quality:": "Qualité",
-    "Refresh": "Rafraîchir",
-    "Resize": "Retailler",
-    "Right": "Droite",
-    "Rotate": "Pivoter",
-    "Rotate Image": "Rotation",
-    "Save": "Sauver",
-    "Start X:": "Début X",
-    "Start Y:": "Début Y",
-    "Texttop": "Texttop",
-    "Top": "Haut",
-    "Trash": "Détruire",
-    "W:": "L:",
-    "Width:": "Largeur",
-    "__OBSOLETE__": {
-        "Align:": "Alignement",
-        "Border": "Bordure",
-        "Border:": "Bordure",
-        "Color:": "Couleur",
-        "Delete file?": "Suppression du fichier ?",
-        "Delete folder?": "Suppression du répertoire ?",
-        "File saved.": "Fichier sauvegardé.",
-        "File was not saved.": "Fichier non sauvegardé.",
-        "H Space": "Espace H",
-        "Height": "Hauteur",
-        "Image File": "Fichier",
-        "Image Manager": "Bibliothèque d'images",
-        "Invalid folder name, please choose another folder name.": "Nom de répertoire invalide, veuillez choisir un autre nom",
-        "Loading": "Chargement en cours",
-        "Margin:": "Marge",
-        "No Image selected.": "Aucune image sélectionnée.",
-        "Padding:": "Espacement",
-        "Please delete all files/folders inside the folder you wish to delete first.": "Veuillez tout d'abord supprimer tous les fichiers et répertoires contenus",
-        "Rotate 180 °": "Rotation 180°",
-        "Rotate 90 ° CCW": "Rotation 90° antihoraire",
-        "Rotate 90 ° CW": "Rotation 90° horaire",
-        "Upload": "Télécharger",
-        "Uploading...": "Chargement...",
-        "V Space": "Espace V",
-        "Width": "Largeur"
-    }
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ImageManager/lang/fr_ca.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ImageManager/lang/fr_ca.js
deleted file mode 100644
index cba6c2b..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ImageManager/lang/fr_ca.js
+++ /dev/null
@@ -1,15 +0,0 @@
-// I18N constants
-// LANG: "fr_ca", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "__OBSOLETE__": {
-        "___ TRANSLATOR NOTE   ___": "*** IMAGEMANAGER IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***"
-    }
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ImageManager/lang/gb.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ImageManager/lang/gb.js
deleted file mode 100644
index 6060678..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ImageManager/lang/gb.js
+++ /dev/null
@@ -1,15 +0,0 @@
-// I18N constants
-// LANG: "gb", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "__OBSOLETE__": {
-        "___ TRANSLATOR NOTE   ___": "*** IMAGEMANAGER IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***"
-    }
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ImageManager/lang/he.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ImageManager/lang/he.js
deleted file mode 100644
index 0f8f4b2..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ImageManager/lang/he.js
+++ /dev/null
@@ -1,25 +0,0 @@
-// I18N constants
-// LANG: "he", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Baseline": "קו בסיס",
-    "Bottom": "תחתון",
-    "Cancel": "ביטול",
-    "Height:": "גובה",
-    "Left": "שמאל",
-    "Middle": "אמצע",
-    "OK": "אישור",
-    "Right": "ימין",
-    "Top": "עליון",
-    "Width:": "רוחב",
-    "__OBSOLETE__": {
-        "___ TRANSLATOR NOTE   ___": "*** IMAGEMANAGER IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***"
-    }
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ImageManager/lang/hu.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ImageManager/lang/hu.js
deleted file mode 100644
index 40b0895..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ImageManager/lang/hu.js
+++ /dev/null
@@ -1,17 +0,0 @@
-// I18N constants
-// LANG: "hu", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Cancel": "Mégsem",
-    "OK": "Rendben",
-    "__OBSOLETE__": {
-        "___ TRANSLATOR NOTE   ___": "*** IMAGEMANAGER IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***"
-    }
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ImageManager/lang/it.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ImageManager/lang/it.js
deleted file mode 100644
index 638a8b8..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ImageManager/lang/it.js
+++ /dev/null
@@ -1,25 +0,0 @@
-// I18N constants
-// LANG: "it", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Baseline": "Allineamento",
-    "Bottom": "Basso",
-    "Cancel": "Annullamento",
-    "Height:": "Altezza",
-    "Left": "Sinistra",
-    "Middle": "Centrale",
-    "OK": "OK",
-    "Right": "Destra",
-    "Top": "Alto",
-    "Width:": "Larghezza",
-    "__OBSOLETE__": {
-        "___ TRANSLATOR NOTE   ___": "*** IMAGEMANAGER IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***"
-    }
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ImageManager/lang/ja.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ImageManager/lang/ja.js
deleted file mode 100644
index a3d1660..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ImageManager/lang/ja.js
+++ /dev/null
@@ -1,91 +0,0 @@
-// I18N constants
-// LANG: "ja", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Absbottom": "下(絶対的)",
-    "Absmiddle": "中央(絶対的)",
-    "Angle:": "角度:",
-    "Baseline": "ベースライン",
-    "Bottom": "下",
-    "Cancel": "中止",
-    "Clear": "クリア",
-    "Constrain Proportions": "縦横比を固定",
-    "Crop": "切り抜き",
-    "Directory": "ディレクトリ",
-    "Directory Up": "親ディレクトリへ",
-    "Edit": "編集",
-    "Filename:": "ファイル名:",
-    "Flip Horizontal": "左右反転",
-    "Flip Image": "画像を反転",
-    "Flip Vertical": "上下反転",
-    "Folder Name:": "フォルダ名:",
-    "GIF format is not supported, image editing not supported.": "GIF形式はサポートされていないため、画像編集できません。",
-    "Height:": "高さ:",
-    "Image Format": "画像形式",
-    "Insert Image": "画像の挿入",
-    "Invalid base directory:": "無効なディレクトリ:",
-    "JPEG High": "JPEG 高画質",
-    "JPEG Low": "JPEG 低画質",
-    "JPEG Medium": "JPEG 標準",
-    "Left": "左",
-    "Lock": "ロック",
-    "Marker": "マーカー",
-    "Measure": "計測",
-    "Middle": "中央",
-    "New Folder": "新規フォルダ",
-    "No Image Available": "画像がありません",
-    "Not set": "なし",
-    "OK": "OK",
-    "Positioning of this image": "この画像の配置",
-    "Quality:": "画質:",
-    "Refresh": "更新",
-    "Resize": "サイズ変更",
-    "Right": "右",
-    "Rotate": "回転",
-    "Rotate Image": "画像を回転",
-    "Save": "保存",
-    "Start X:": "開始 X",
-    "Start Y:": "開始 Y",
-    "Texttop": "テキスト上部",
-    "Top": "上",
-    "Trash": "削除",
-    "W:": "W:",
-    "Width:": "幅:",
-    "__OBSOLETE__": {
-        "Align:": "行揃え",
-        "Border": "ボーダー",
-        "Border:": "境界線:",
-        "Color:": "色:",
-        "Delete file \"$file\"?": "ファイル \"$file\" を削除しますか?",
-        "Delete folder \"$dir\"?": "フォルダ \"$dir\" を削除しますか?",
-        "Description:": "説明:",
-        "File saved.": "ファイルを保存しました。",
-        "File was not saved.": "ファイルを保存できませんでした。",
-        "H Space": "水平余白",
-        "Height": "高さ",
-        "Image File": "画像ファイル",
-        "Image Manager": "画像マネージャ",
-        "Invalid folder name, please choose another folder name.": "無効なフォルダ名です。別のフォルダ名を選んでください。",
-        "Loading": "ロード中",
-        "Margin:": "間隔:",
-        "No Files Found": "ファイルがありません",
-        "No Image selected.": "画像が選択されていません。",
-        "Padding:": "余白:",
-        "Please delete all files/folders inside the folder you wish to delete first.": "削除したいフォルダ内のファイルとフォルダを全て削除しておいてください。",
-        "Rotate 180 °": "180°",
-        "Rotate 90 ° CCW": "90° 反時計回り",
-        "Rotate 90 ° CW": "90° 時計回り",
-        "Upload": "アップロード",
-        "Upload:": "アップロード:",
-        "Uploading...": "アップロード中...",
-        "V Space": "垂直余白",
-        "Width": "幅"
-    }
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ImageManager/lang/lc_base.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ImageManager/lang/lc_base.js
deleted file mode 100644
index 287a5e9..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ImageManager/lang/lc_base.js
+++ /dev/null
@@ -1,99 +0,0 @@
-// I18N constants
-//
-// LANG: "en", ENCODING: UTF-8
-// Author: Translator-Name, <email@example.com>
-//
-// Last revision: 2018-04-12
-// 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).
-//
-// (Please, remove information below)
-// 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.)
-
-{
-    "A:": "",
-    "Absbottom": "",
-    "Absmiddle": "",
-    "Angle:": "",
-    "Baseline": "",
-    "Bottom": "",
-    "Cancel": "",
-    "Clear": "",
-    "Constrain Proportions": "",
-    "Crop": "",
-    "D:": "",
-    "Directory": "",
-    "Directory Up": "",
-    "Edit": "",
-    "Filename:": "",
-    "Flickr Picture List": "",
-    "Flickr Pictures": "",
-    "Flickr Selection": "",
-    "Flickr Username/Email": "",
-    "Flip Horizontal": "",
-    "Flip Image": "",
-    "Flip Vertical": "",
-    "Folder Name:": "",
-    "GIF": "",
-    "GIF format is not supported, image editing not supported.": "",
-    "H:": "",
-    "Height:": "",
-    "Image Editor": "",
-    "Image Format": "",
-    "Image List": "",
-    "Image Selection": "",
-    "Insert Image": "",
-    "Invalid base directory:": "",
-    "JPEG High": "",
-    "JPEG Low": "",
-    "JPEG Medium": "",
-    "Keyword": "",
-    "Left": "",
-    "Lock": "",
-    "Marker": "",
-    "Measure": "",
-    "Middle": "",
-    "New Folder": "",
-    "No Image Available": "",
-    "No Images Found": "",
-    "No Photos Found": "",
-    "No Videos Found": "",
-    "Not set": "",
-    "OK": "",
-    "PNG": "",
-    "Positioning of this image": "",
-    "Quality:": "",
-    "Refresh": "",
-    "Resize": "",
-    "Right": "",
-    "Rotate": "",
-    "Rotate 180 &deg;": "",
-    "Rotate 90 &deg; CCW": "",
-    "Rotate 90 &deg; CW": "",
-    "Rotate Image": "",
-    "Save": "",
-    "Start X:": "",
-    "Start Y:": "",
-    "Texttop": "",
-    "This Server": "",
-    "Top": "",
-    "Trash": "",
-    "W:": "",
-    "Width:": "",
-    "X:": "",
-    "Y:": "",
-    "YouTube Selection": "",
-    "YouTube Username": "",
-    "YouTube Video List": "",
-    "YouTube Videos": ""
-}
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ImageManager/lang/lt.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ImageManager/lang/lt.js
deleted file mode 100644
index 11086fc..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ImageManager/lang/lt.js
+++ /dev/null
@@ -1,17 +0,0 @@
-// I18N constants
-// LANG: "lt", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Cancel": "Atšaukti",
-    "OK": "OK",
-    "__OBSOLETE__": {
-        "___ TRANSLATOR NOTE   ___": "*** IMAGEMANAGER IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***"
-    }
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ImageManager/lang/lv.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ImageManager/lang/lv.js
deleted file mode 100644
index f564e47..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ImageManager/lang/lv.js
+++ /dev/null
@@ -1,17 +0,0 @@
-// I18N constants
-// LANG: "lv", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Cancel": "Atcelt",
-    "OK": "Labi",
-    "__OBSOLETE__": {
-        "___ TRANSLATOR NOTE   ___": "*** IMAGEMANAGER IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***"
-    }
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ImageManager/lang/nb.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ImageManager/lang/nb.js
deleted file mode 100644
index e5b0a43..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ImageManager/lang/nb.js
+++ /dev/null
@@ -1,85 +0,0 @@
-// I18N constants
-// LANG: "nb", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Angle:": "Vinkel:",
-    "Baseline": "Grunnlinje",
-    "Bottom": "Bunn",
-    "Cancel": "Avbryt",
-    "Clear": "Fjern",
-    "Constrain Proportions": "Behold proposjoner",
-    "Crop": "Beskjær",
-    "Directory": "Mappe",
-    "Directory Up": "Opp en mappe",
-    "Edit": "Rediger",
-    "Filename:": "Filnavn:",
-    "Flip Horizontal": "Vend horisontal",
-    "Flip Image": "Vend bilde",
-    "Flip Vertical": "Vend vertikal",
-    "Folder Name:": "Mappenavn:",
-    "GIF format is not supported, image editing not supported.": "Bildeformatet GIF er ikke støttet.",
-    "Height:": "Høyde:",
-    "Image Format": "Bildeformat:",
-    "Insert Image": "Sett inn bilde",
-    "Invalid base directory:": "Feil rot-mappe:",
-    "JPEG High": "JPEG høy",
-    "JPEG Low": "JPEG lav",
-    "JPEG Medium": "JPEG middelse",
-    "Left": "Venstre",
-    "Lock": "Sperre",
-    "Marker": "Marker",
-    "Measure": "Mål",
-    "Middle": "Midten",
-    "New Folder": "Ny mappe",
-    "No Image Available": "Inget bilde er tilgjengelig",
-    "No Images Found": "Ingen bilder funnet",
-    "OK": "OK",
-    "Positioning of this image": "Bildepossisjon",
-    "Quality:": "Kvalitet",
-    "Refresh": "Oppfrisk",
-    "Resize": "Endre størrelse",
-    "Right": "Høyre",
-    "Rotate": "Roter",
-    "Rotate Image": "Roter bilde",
-    "Save": "Lagre",
-    "Start X:": "Start X",
-    "Start Y:": "Start Y",
-    "Top": "Overkant",
-    "Trash": "Søppelkurv",
-    "W:": "B:",
-    "Width:": "Bredde:",
-    "__OBSOLETE__": {
-        "Align:": "Justering:",
-        "Border": "Ramme",
-        "Color:": "Farge:",
-        "Delete file?": "Slette fil?",
-        "Delete folder?": "Slett mappe?",
-        "Description:": "Beskrivelse:",
-        "File saved.": "Fil lagret.",
-        "File was not saved.": "Fil ble ikke lagret.",
-        "H Space": "horisontal marg",
-        "Height": "Høyde",
-        "Image File": "Bildefil",
-        "Image Manager": "Bildebehandler",
-        "Invalid folder name, please choose another folder name.": "Ugyldig mappenavn, vennligst velg et annet navn på mappen.",
-        "Loading": "Laster",
-        "Margin:": "Marg:",
-        "No Image selected.": "Inget bilde er valgt.",
-        "Padding:": "Innsidemarg:",
-        "Please delete all files/folders inside the folder you wish to delete first.": "Vennligst slett alle filer og mapper i mappen du ønsker å slette og prøv igjen.",
-        "Rotate 180 °": "Roter 180°",
-        "Rotate 90 ° CCW": "Roter 90° mot klokka",
-        "Rotate 90 ° CW": "Roter 90° med klokka",
-        "Upload": "Last opp",
-        "Uploading...": "Laster opp...",
-        "V Space": "vertikal marg",
-        "Width": "Bredde"
-    }
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ImageManager/lang/nl.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ImageManager/lang/nl.js
deleted file mode 100644
index 6d3b1bd..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ImageManager/lang/nl.js
+++ /dev/null
@@ -1,60 +0,0 @@
-// I18N constants
-// LANG: "nl", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Angle:": "Hoek:",
-    "Baseline": "Basis",
-    "Bottom": "Onder",
-    "Cancel": "Annuleren",
-    "Clear": "Leeg",
-    "Constrain Proportions": "Proportie behouden",
-    "Crop": "Passend maken",
-    "Directory": "Map",
-    "Directory Up": "Bovenliggende map",
-    "Edit": "Bewerken",
-    "Filename:": "Bestandsnaam:",
-    "Flip Horizontal": "hor. spiegelen",
-    "Flip Image": "Beeld spiegelen",
-    "Flip Vertical": "ver. spiegelen",
-    "Folder Name:": "Map naam",
-    "GIF format is not supported, image editing not supported.": "GIF-format niet ondersteund, beeldbewerking niet ondersteund.",
-    "Height:": "Hoogte:",
-    "Image Format": "Beeldformaat:",
-    "Insert Image": "Afbeelding invoegen",
-    "Invalid base directory:": "Ongeldig pad:",
-    "JPEG High": "JPEG hoog",
-    "JPEG Low": "JPEG laag",
-    "JPEG Medium": "JPEG midden",
-    "Left": "Links",
-    "Lock": "Op-slot",
-    "Marker": "Markeren",
-    "Measure": "Opmeten",
-    "Middle": "Midden",
-    "New Folder": "Nieuw map",
-    "No Image Available": "Geen beeld beschikbaar",
-    "OK": "OK",
-    "Positioning of this image": "Uitlijnen van dit beeld",
-    "Quality:": "Kwaliteit",
-    "Refresh": "Vernieuwen",
-    "Resize": "Formaat wijzigen",
-    "Right": "Rechts",
-    "Rotate": "Draaien",
-    "Rotate Image": "Beeld draaien",
-    "Save": "Opslaan",
-    "Start X:": "Start X",
-    "Start Y:": "Start Y",
-    "Top": "Boven",
-    "Trash": "Prullenbak",
-    "W:": "W:",
-    "Width:": "Breedte:",
-    "__OBSOLETE__": {
-        "Image Manager": "Afbeeldingen Beheer"
-    }
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ImageManager/lang/pl.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ImageManager/lang/pl.js
deleted file mode 100644
index 718f0e4..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ImageManager/lang/pl.js
+++ /dev/null
@@ -1,91 +0,0 @@
-// I18N constants
-// LANG: "pl", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Absbottom": "Abs. dół",
-    "Absmiddle": "Abs. środek",
-    "Angle:": "Kąt:",
-    "Baseline": "Linia bazowa",
-    "Bottom": "Dół",
-    "Cancel": "Anuluj",
-    "Clear": "Wyczyść",
-    "Constrain Proportions": "Zachowaj proporcje",
-    "Crop": "Przytnij",
-    "Directory": "Katalog",
-    "Directory Up": "Katalog wyżej",
-    "Edit": "Edytuj",
-    "Filename:": "Nazwa pliku:",
-    "Flip Horizontal": "Odwróć poziomo",
-    "Flip Image": "Odwróć",
-    "Flip Vertical": "Odwróć pionowo",
-    "Folder Name:": "Nazwa katalogu",
-    "GIF format is not supported, image editing not supported.": "Brak obsługi plików GIF, edycja jest niemożliwa.",
-    "Height:": "Wysokość:",
-    "Image Format": "Format pliku:",
-    "Insert Image": "Wstaw obrazek",
-    "Invalid base directory:": "Nieprawidłowy katalog bazowy:",
-    "JPEG High": "JPEG wysoka",
-    "JPEG Low": "JPEG niska",
-    "JPEG Medium": "JPEG średnia",
-    "Left": "Do lewej",
-    "Lock": "Zablokuj",
-    "Marker": "Zaznacz",
-    "Measure": "Zmierz",
-    "Middle": "Środek",
-    "New Folder": "Nowy katalog",
-    "No Image Available": "Obrazek niedostępny",
-    "No Images Found": "Nie znaleziono obrazków",
-    "Not set": "Nie ustawione",
-    "OK": "OK",
-    "Positioning of this image": "Wyrównanie tego obrazka na stronie",
-    "Quality:": "Jakość",
-    "Refresh": "Odśwież",
-    "Resize": "Przeskaluj",
-    "Right": "Do prawej",
-    "Rotate": "Obróć",
-    "Rotate Image": "Obróć",
-    "Save": "Zapisz",
-    "Start X:": "Początek X",
-    "Start Y:": "Początek Y",
-    "Texttop": "Góra tekstu",
-    "Top": "Góra",
-    "Trash": "Usuń",
-    "W:": "L:",
-    "Width:": "Szerokość:",
-    "__OBSOLETE__": {
-        "Align:": "Wyrównanie:",
-        "Border": "Ramka",
-        "Border:": "Ramka:",
-        "Color:": "Kolor:",
-        "Delete file?": "Usunąć plik?",
-        "Delete folder?": "Usunąć katalog ?",
-        "Description:": "Opis:",
-        "File saved.": "Zapisano plik.",
-        "File was not saved.": "Nie zapisano pliku.",
-        "H Space": "Odległość H",
-        "Height": "Wysokość",
-        "Image File": "Plik obrazka",
-        "Image Manager": "Menedżer obrazków",
-        "Invalid folder name, please choose another folder name.": "Nieprawidłowa nazwa katalogu, wybierz inną.",
-        "Loading": "Ładowanie",
-        "Margin:": "Margines:",
-        "No Image selected.": "Nie zaznaczono obrazka.",
-        "Padding:": "Wcięcie:",
-        "Please delete all files/folders inside the folder you wish to delete first.": "Najpierw usuń wszystkie pliki i podkatalogi katalogu.",
-        "Rotate 180 °": "Obróć 180°",
-        "Rotate 90 ° CCW": "Obróć 90° w lewo",
-        "Rotate 90 ° CW": "Obróć 90° w prawo",
-        "Upload": "Wgraj",
-        "Upload:": "Wgraj:",
-        "Uploading...": "Wgrywanie...",
-        "V Space": "Odległość V",
-        "Width": "Szerokość"
-    }
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ImageManager/lang/pt_br.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ImageManager/lang/pt_br.js
deleted file mode 100644
index d539b3c..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ImageManager/lang/pt_br.js
+++ /dev/null
@@ -1,102 +0,0 @@
-// I18N constants
-// LANG: "pt_br", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "A:": "A:",
-    "Absbottom": "Inferior absoluto",
-    "Absmiddle": "Meio absoluto",
-    "Angle:": "Ângulo:",
-    "Baseline": "Linha de base",
-    "Bottom": "Base",
-    "Cancel": "Cancelar",
-    "Clear": "Limpar",
-    "Constrain Proportions": "Manter proporções",
-    "Crop": "Recortar",
-    "D:": "G:",
-    "Directory": "Diretório",
-    "Directory Up": "Diretório Acima",
-    "Edit": "Editar",
-    "Filename:": "Nome do arquivo:",
-    "Flip Horizontal": "Espelhar Horizontalmente",
-    "Flip Image": "Espelhar Imagem",
-    "Flip Vertical": "Espelhar Verticalmente",
-    "Folder Name:": "Nome da Pasta:",
-    "GIF": "GIF",
-    "GIF format is not supported, image editing not supported.": "Formato GIF não é suportado, edição de imagem não é suportada.",
-    "H:": "A:",
-    "Height:": "Altura:",
-    "Image Editor": "Editor de Imagem",
-    "Image Format": "Formato da Imagem",
-    "Image List": "Lista de Imagens",
-    "Image Selection": "Seleção de Imagem",
-    "Insert Image": "Inserir Imagem",
-    "Invalid base directory:": "Diretório base inválido:",
-    "JPEG High": "JPEG Alto",
-    "JPEG Low": "JPEG Baixo",
-    "JPEG Medium": "JPEG Médio",
-    "Left": "Esquerda",
-    "Lock": "Travar",
-    "Marker": "Marcar",
-    "Measure": "Medida",
-    "Middle": "Meio",
-    "New Folder": "Nova Pasta",
-    "No Image Available": "Sem Imagem Disponível",
-    "No Images Found": "Nenhuma Imagem Encontrada",
-    "Not set": "Não definido",
-    "OK": "OK",
-    "PNG": "PNG",
-    "Positioning of this image": "Posicionamento desta imagem",
-    "Quality:": "Qualidade:",
-    "Refresh": "Atualização",
-    "Resize": "Redimencionar",
-    "Right": "Direita",
-    "Rotate": "Rotacionar",
-    "Rotate 180 &deg;": "Rotacionar 180 &deg;",
-    "Rotate 90 &deg; CCW": "Rotacionar 90 &deg; anti-horário",
-    "Rotate 90 &deg; CW": "Rotacionar 90 &deg; horário",
-    "Rotate Image": "Rotacionar Imagem",
-    "Save": "Gravar",
-    "Start X:": "Início X:",
-    "Start Y:": "Início Y:",
-    "Texttop": "Texto no topo",
-    "Top": "Topo",
-    "Trash": "Lixo",
-    "W:": "C:",
-    "Width:": "Largura:",
-    "X:": "X:",
-    "Y:": "Y:",
-    "__OBSOLETE__": {
-        "Align:": "Alinhamento:",
-        "Border": "Borda",
-        "Border:": "Borda:",
-        "Color:": "Côr:",
-        "Delete file?": "Apagar arquivo?",
-        "Delete folder?": "Apagar pasta?",
-        "Description:": "Descrição:",
-        "File saved.": "Arquivo gravado.",
-        "File was not saved.": "Arquivo não foi salvo.",
-        "H Space": "Espaço horiz.",
-        "Height": "Altura",
-        "Image File": "Arquivo Imagem",
-        "Image Manager": "Gerenciador de Imagens",
-        "Invalid folder name, please choose another folder name.": "Nome inválido para pasta, escolha outro nome.",
-        "Loading": "Lendo",
-        "Margin:": "Margem:",
-        "No Files Found": "Nenhum arquivo encontrado",
-        "No Image selected.": "Nenhuma imagem selecionada.",
-        "Padding:": "Espaçamento:",
-        "Please delete all files/folders inside the folder you wish to delete first.": "Por favor, primeiro apague todos os arquivos/pastas dentro da pasta que deseja apagar.",
-        "Upload": "Enviar",
-        "Upload:": "Enviar imagem:",
-        "Uploading...": "Enviando...",
-        "V Space": "Espaço vert.",
-        "Width": "Largura"
-    }
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ImageManager/lang/ro.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ImageManager/lang/ro.js
deleted file mode 100644
index 1bbffcf..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ImageManager/lang/ro.js
+++ /dev/null
@@ -1,25 +0,0 @@
-// I18N constants
-// LANG: "ro", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Baseline": "Baseline",
-    "Bottom": "Jos",
-    "Cancel": "Renunţă",
-    "Height:": "Înălţimea",
-    "Left": "Stânga",
-    "Middle": "Mijloc",
-    "OK": "Acceptă",
-    "Right": "Dreapta",
-    "Top": "Sus",
-    "Width:": "Lăţime",
-    "__OBSOLETE__": {
-        "___ TRANSLATOR NOTE   ___": "*** IMAGEMANAGER IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***"
-    }
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ImageManager/lang/ru.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ImageManager/lang/ru.js
deleted file mode 100644
index edb9092..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ImageManager/lang/ru.js
+++ /dev/null
@@ -1,89 +0,0 @@
-// I18N constants
-// LANG: "ru", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Absbottom": "По нижней границе",
-    "Absmiddle": "По середине текста",
-    "Angle:": "Угол",
-    "Baseline": "По нижней границе текста",
-    "Bottom": "По нижнему краю",
-    "Cancel": "Отмена",
-    "Clear": "Очистить",
-    "Constrain Proportions": "Сохранить пропорции",
-    "Crop": "Обрезать",
-    "Directory": "Папка",
-    "Directory Up": "Папка наверх",
-    "Edit": "Правка",
-    "Filename:": "Имя файла",
-    "Flip Horizontal": "Развернуть по горизонтали",
-    "Flip Image": "Развернуть картинку",
-    "Flip Vertical": "Развернуть по вертикали",
-    "Folder Name:": "Название папки:",
-    "GIF format is not supported, image editing not supported.": "Формат GIF не поддерживается, редактирование картинки не поддерживается.",
-    "Height:": "Высота",
-    "Image Format": "Формат картинки",
-    "Insert Image": "Вставка картинки",
-    "Invalid base directory:": "Неверная базовая папка:",
-    "JPEG High": "JPEG высок.",
-    "JPEG Low": "JPEG низк.",
-    "JPEG Medium": "JPEG средн.",
-    "Left": "По левому краю",
-    "Lock": "Блокировка",
-    "Marker": "Маркер",
-    "Measure": "Измерение",
-    "Middle": "Посредине",
-    "New Folder": "Новая папка",
-    "No Image Available": "Нет доступных картинок",
-    "No Images Found": "Картинок не найдено",
-    "Not set": "Не установлено",
-    "OK": "OK",
-    "Positioning of this image": "Расположение изображения",
-    "Quality:": "Качество",
-    "Refresh": "Обновить",
-    "Resize": "Масшабировать",
-    "Right": "По правому краю",
-    "Rotate": "Повернуть",
-    "Rotate Image": "Повернуть картинку",
-    "Save": "Сохранить",
-    "Start X:": "Начало X",
-    "Start Y:": "Начало Y",
-    "Texttop": "По верхней границе текста",
-    "Top": "По верхнему краю",
-    "Trash": "Корзина",
-    "W:": "Ш:",
-    "Width:": "Ширина",
-    "__OBSOLETE__": {
-        "Align:": "Выравнивание",
-        "Border": "Рамка",
-        "Border:": "Рамка",
-        "Color:": "Цвет",
-        "Delete file?": "Удалить файл?",
-        "Delete folder?": "Удалить папку?",
-        "File saved.": "Файл сохранен.",
-        "File was not saved.": "Файл не сохранен.",
-        "H Space": "Поле H",
-        "Height": "Высота",
-        "Image File": "Файл картинки",
-        "Image Manager": "Менеджер картинок",
-        "Invalid folder name, please choose another folder name.": "Неправильное имя папки, пожалуйста выберите другое.",
-        "Loading": "Загрузка",
-        "Margin:": "Отступ",
-        "No Image selected.": "Картинки не выбраны.",
-        "Padding:": "Поля",
-        "Please delete all files/folders inside the folder you wish to delete first.": "Пожалуйста удалите все файлы/папки в папке, которую вы хотите удалить.",
-        "Rotate 180 В°": "Повернуть на 180°",
-        "Rotate 90 В° CCW": "Повернуть на 90° против часовой",
-        "Rotate 90 В° CW": "Повернуть на 90° по часовой",
-        "Upload": "Загрузить",
-        "Uploading...": "Загрузка...",
-        "V Space": "Поле V",
-        "Width": "Ширина"
-    }
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ImageManager/lang/sh.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ImageManager/lang/sh.js
deleted file mode 100644
index b3f659c..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ImageManager/lang/sh.js
+++ /dev/null
@@ -1,30 +0,0 @@
-// I18N constants
-// LANG: "sh", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Absbottom": "Apsolutno dno",
-    "Absmiddle": "Apsolutna sredina",
-    "Baseline": "Donja linija",
-    "Bottom": "Dno",
-    "Cancel": "Poništi",
-    "Insert Image": "Ubaci sliku",
-    "Left": "Levo",
-    "Middle": "Sredina",
-    "Not set": "Nije postavljeno",
-    "OK": "OK",
-    "Positioning of this image": "Postavljanje ove slike",
-    "Right": "Desno",
-    "Texttop": "Vrh teksta",
-    "Top": "Vrh",
-    "Width:": "Širina",
-    "__OBSOLETE__": {
-        "___ TRANSLATOR NOTE   ___": "*** IMAGEMANAGER IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***"
-    }
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ImageManager/lang/si.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ImageManager/lang/si.js
deleted file mode 100644
index 6020c00..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ImageManager/lang/si.js
+++ /dev/null
@@ -1,17 +0,0 @@
-// I18N constants
-// LANG: "si", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Cancel": "Prekliči",
-    "OK": "V redu",
-    "__OBSOLETE__": {
-        "___ TRANSLATOR NOTE   ___": "*** IMAGEMANAGER IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***"
-    }
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ImageManager/lang/sr.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ImageManager/lang/sr.js
deleted file mode 100644
index 4bbf163..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ImageManager/lang/sr.js
+++ /dev/null
@@ -1,30 +0,0 @@
-// I18N constants
-// LANG: "sr", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Absbottom": "Апсолутно дно",
-    "Absmiddle": "Апсолутна средина",
-    "Baseline": "Доња линија",
-    "Bottom": "Дно",
-    "Cancel": "Поништи",
-    "Insert Image": "Убаци слику",
-    "Left": "Лево",
-    "Middle": "Средина",
-    "Not set": "Није постављено",
-    "OK": "OK",
-    "Positioning of this image": "Постављање ове слике",
-    "Right": "Десно",
-    "Texttop": "Врх текста",
-    "Top": "Врх",
-    "Width:": "Ширина",
-    "__OBSOLETE__": {
-        "___ TRANSLATOR NOTE   ___": "*** IMAGEMANAGER IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***"
-    }
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ImageManager/lang/sv.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ImageManager/lang/sv.js
deleted file mode 100755
index 574b9ab..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ImageManager/lang/sv.js
+++ /dev/null
@@ -1,29 +0,0 @@
-// I18N constants
-// LANG: "sv", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Baseline": "Baslinje",
-    "Bottom": "Botten",
-    "Cancel": "Avbryt",
-    "Clear": "Töm",
-    "Crop": "Beskjär",
-    "Height:": "Höjd:",
-    "Insert Image": "Infoga bild",
-    "Left": "Venster",
-    "Middle": "Mitten",
-    "OK": "OK",
-    "Positioning of this image": "Bildens positionering",
-    "Right": "Höger",
-    "Top": "Överkant",
-    "Width:": "Bredd:",
-    "__OBSOLETE__": {
-        "Image Manager": "Bildbehandlare"
-    }
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ImageManager/lang/th.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ImageManager/lang/th.js
deleted file mode 100644
index 4074548..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ImageManager/lang/th.js
+++ /dev/null
@@ -1,17 +0,0 @@
-// I18N constants
-// LANG: "th", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Cancel": "ยกเลิก",
-    "OK": "ตกลง",
-    "__OBSOLETE__": {
-        "___ TRANSLATOR NOTE   ___": "*** IMAGEMANAGER IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***"
-    }
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ImageManager/lang/tr.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ImageManager/lang/tr.js
deleted file mode 100644
index 35dd070..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ImageManager/lang/tr.js
+++ /dev/null
@@ -1,31 +0,0 @@
-// I18N constants
-// LANG: "tr", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Absbottom": "Salt alta",
-    "Absmiddle": "Salt orta",
-    "Baseline": "Taban hizası",
-    "Bottom": "Alta",
-    "Cancel": "İptal",
-    "Height:": "Yükseklik",
-    "Insert Image": "Resim ekle",
-    "Left": "Sola",
-    "Middle": "Ortala",
-    "Not set": "Ayarlanmamış",
-    "OK": "Tamam",
-    "Positioning of this image": "Resmi konumlandırma",
-    "Right": "Sağa",
-    "Texttop": "Metin-üstte",
-    "Top": "Yukarı",
-    "Width:": "Genişlik:",
-    "__OBSOLETE__": {
-        "___ TRANSLATOR NOTE   ___": "*** IMAGEMANAGER IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***"
-    }
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ImageManager/lang/vn.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ImageManager/lang/vn.js
deleted file mode 100644
index e5cacad..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ImageManager/lang/vn.js
+++ /dev/null
@@ -1,17 +0,0 @@
-// I18N constants
-// LANG: "vn", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Cancel": "Hủy",
-    "OK": "Đồng ý",
-    "__OBSOLETE__": {
-        "___ TRANSLATOR NOTE   ___": "*** IMAGEMANAGER IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***"
-    }
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ImageManager/lang/zh_cn.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ImageManager/lang/zh_cn.js
deleted file mode 100644
index 8ba528e..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ImageManager/lang/zh_cn.js
+++ /dev/null
@@ -1,15 +0,0 @@
-// I18N constants
-// LANG: "zh_cn", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "__OBSOLETE__": {
-        "___ TRANSLATOR NOTE   ___": "*** IMAGEMANAGER IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***"
-    }
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ImageManager/manager.php b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ImageManager/manager.php
deleted file mode 100644
index 1247de8..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ImageManager/manager.php
+++ /dev/null
@@ -1,368 +0,0 @@
-<?php
-/**
- * The main GUI for the ImageManager.
- * @author $Author:ray $
- * @version $Id:manager.php 987 2008-04-12 12:39:04Z ray $
- * @package ImageManager
- */
-
-	require_once('config.inc.php');
-	require_once('ddt.php');
-	require_once('Classes/ImageManager.php');
-	
-	$manager = new ImageManager($IMConfig);
-	$dirs = $manager->getDirs();
-
-?>
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-
-<html>
-<head>
-	<title>Insert Image</title>
-  <script type="text/javascript">
-    // temporary. An ImageManager rewrite will take care of this kludge.
-    _backend_url = "<?php print $IMConfig['backend_url']; ?>";
-    _resized_prefix = "<?php echo $IMConfig['resized_prefix']; ?>";
-    _resized_dir = "<?php echo $IMConfig['resized_dir']; ?>";
-  </script>
-  <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
- <link href="<?php print $IMConfig['base_url'];?>assets/manager.css" rel="stylesheet" type="text/css" />
-<script type="text/javascript" src="../../popups/popup.js"></script>
-<script type="text/javascript" src="assets/popup.js"></script>
-<script type="text/javascript" src="../../modules/ColorPicker/ColorPicker.js"></script>
-<script type="text/javascript" src="<?php print $IMConfig['base_url'];?>assets/dialog.js"></script>
-<script type="text/javascript">
-/*<![CDATA[*/
-	if(window.opener)
-		Xinha = HTMLArea = window.opener.Xinha;
-
-	var thumbdir = "<?php echo $IMConfig['thumbnail_dir']; ?>";
-	var base_url = "<?php echo $manager->getImagesURL(); ?>";
-/*]]>*/
-</script>
-<script type="text/javascript" src="<?php print $IMConfig['base_url'];?>assets/manager.js"></script>
-<?php
-  if(!$IMConfig['show_full_options'])
-  {
-    ?>
-    <style type="text/css">
-      .fullOptions { visibility:hidden; }
-    </style>
-    <?php
-  }
-?>
-
-<script type="text/javascript">
-  function switchChooser(toChooserPanel)
-  {
-    var ourPanel =  document.getElementById(toChooserPanel);
-    if(!ourPanel) return false; // Can't change, doesn't exist.
-    
-    // hide all panels
-    var d = document.getElementById('chooserFieldset').getElementsByTagName('div');
-    for(i = 0; i < d.length; i++)
-    {
-      if(d[i].className.match(/chooserPanel/))
-        d[i].style.display = 'none';      
-    }
-    
-    // show ours
-    ourPanel.style.display = 'block';
-  }
-</script>
-</head>
-<body>
-
-<form action="<?php print $IMConfig['backend_url'] ?>" id="uploadForm" method="post" enctype="multipart/form-data">
-
-<input type="hidden" name="__plugin" value="ImageManager" />
-<input type="hidden" name="__function" value="images" />
-
-<fieldset id="chooserFieldset">
-  <legend>
-    Choose From: 
-    <select onchange="switchChooser(this.options[this.selectedIndex].value)">
-    <?php
-      if($IMConfig['Local'])
-      {
-        ?>
-        <option value="picturesChooser">This Server</option>
-        <?php
-      }
-    ?>
-    
-    <?php
-      if($IMConfig['YouTube'])
-      {
-        ?>
-        <option value="youtubeChooser">YouTube Videos</option>
-        <?php
-      }
-    ?>
-    
-    <?php
-      if($IMConfig['Flickr'])
-      {
-        ?>
-        <option value="flickrChooser">Flickr Pictures</option>
-        <?php
-      }
-    ?>
-    </select>
-  </legend>
-    
-  <?php
-    if($IMConfig['Local'])
-    {
-      ?>
-  <div id="picturesChooser" class="chooserPanel">
-  <table width="100%">
-    <tr>
-      <th><label for="dirPath">Directory</label></th>
-      <td>
-        <select name="dir" class="dirWidth" id="dirPath" onchange="updateDir(this)">
-          <option value="/">/</option>
-          <?php
-            foreach($dirs as $relative=>$fullpath)
-            {
-              ?>
-              <option value="<?php echo rawurlencode($relative); ?>"><?php echo $relative; ?></option>
-              <?php
-            }
-          ?>
-        </select>
-      </td>
-      <td>
-        <a href="#" onclick="javascript: goUpDir();" title="Directory Up"><img src="<?php print $IMConfig['base_url']; ?>img/btnFolderUp.gif" height="15" width="15" alt="Directory Up" /></a>
-
-        <?php
-          if($IMConfig['safe_mode'] == false && $IMConfig['allow_new_dir'])
-          {
-            ?>
-            <a href="#" onclick="newFolder();" title="New Folder"><img src="<?php print $IMConfig['base_url']; ?>img/btnFolderNew.gif" height="15" width="15" alt="New Folder" /></a>
-            <?php
-          }
-          ?>
-      </td>
-    </tr>
-    <?php
-      if($IMConfig['allow_upload'] == TRUE)
-      {
-        ?>
-        <tr>
-          <th style="text-align: left;">Upload:</th>
-          <td colspan="2">
-            <input type="file" name="upload" id="upload" />
-            <input name="Upload" type="submit" id="Upload" value="Upload" onclick="doUpload();" />
-          </td>
-        </tr>
-        <?php
-      }
-    ?>
-
-  </table>
-
-  <div id="messages" style="display: none;"><span id="message"></span><img src="<?php print $IMConfig['base_url']; ?>img/dots.gif" width="22" height="12" alt="..." /></div>
-
-  <iframe src="<?php print $IMConfig['backend_url']; ?>__function=images" name="imgManager" id="imgManager" class="imageFrame" scrolling="auto" title="Image Selection" frameborder="0"></iframe>
-  </div>
-  <?php
-    }
-  ?>
-  
-  <?php
-    if($IMConfig['YouTube'])
-    {
-      ?>
-      <div id="youtubeChooser" style="display:none" class="chooserPanel">
-            
-        <table width="100%">
-          <tr>
-            <th><labelfor="ytUsername">YouTube Username</label></th>
-            <td>
-              <input type="text" name="ytUsername" id="ytUsername" />
-            </td>
-            
-            <th><labelfor="ytSearch">Keyword</label></th>
-            <td>
-              <input type="text" name="ytSearch" id="ytSearch" />
-            </td>     
-            <td>
-              <input type="button" value="Search" onclick="document.getElementById('ytManager').src='<?php print $IMConfig['backend_url']; ?>__function=youtube&ytSearch='+document.getElementById('ytSearch').value+'&ytUsername='+document.getElementById('ytUsername').value;" />
-            </td>
-          </tr>    
-        </table>
-      
-        <div id="messages" style="display: none;"><span id="message"></span><img SRC="<?php print $IMConfig['base_url']; ?>img/dots.gif" width="22" height="12" alt="..." /></div>
-      
-        <iframe src="<?php print $IMConfig['backend_url']; ?>__function=youtube" name="ytManager" id="ytManager" class="imageFrame" scrolling="auto" title="YouTube Selection" frameborder="0"></iframe>
-    
-      </div>
-      <?php
-    }
-  ?>
-    
-  <?php
-    if($IMConfig['Flickr'])
-    {
-      require_once('Classes/Flickr.php');
-      $lics = flickr_get_license_id_by_usage(); 
-      ?>
-      <div id="flickrChooser" style="display:none" class="chooserPanel">
-        <script type="text/javascript">
-          function flickr_go()
-          {
-            var u = '<?php print $IMConfig['backend_url']; ?>__function=flickr';
-            u += '&flkSearch='  + encodeURIComponent(document.getElementById('flkSearch').value);
-            u += '&flkUsername='+ encodeURIComponent(document.getElementById('flkUsername').value);
-            u += '&flkLicense=' + encodeURIComponent( document.getElementById('flkLicense').options[document.getElementById('flkLicense').selectedIndex].value );
-            
-            document.getElementById('flkManager').src= u;            
-          }
-        </script>
-        <table width="100%">
-          <tr>
-            <th><labelfor="ytUsername">Flickr Username/Email</label></th>
-            <td>
-              <input type="text" name="flkUsername" id="flkUsername" />
-            </td>
-            
-            <th><labelfor="ytSearch">Keyword</label></th>
-            <td>
-              <input type="text" name="flkSearch" id="flkSearch" />
-            </td>     
-            <td>
-              <input type="button" value="Search" onclick="flickr_go();" />
-            </td>
-          </tr>    
-          <tr>
-            <th>Usage Restriction:</th>
-            <td colspan="3">
-              <select name="flkLicense" id="flkLicense"  onchange="flickr_go();">
-                <?php
-                  foreach($lics as $usage => $licid)
-                  {
-                    ?>
-                    <option value="<?php echo $licid ?>" <?php if(flickr_is_default_license($licid)) echo 'selected="selected"' ?>> <?php echo $licid ?> <?php echo htmlspecialchars($usage) ?></li>
-                    <?php
-                  }
-                ?>
-              </select>
-            </td>         
-            <td><a href="http://flickr.com/" target="_blank">flickr.com</a></td>
-          </tr>
-        </table>
-      
-        <div id="messages" style="display: none;"><span id="message"></span><img SRC="<?php print $IMConfig['base_url']; ?>img/dots.gif" width="22" height="12" alt="..." /></div>
-      
-        <iframe src="<?php print $IMConfig['backend_url']; ?>__function=flickr" name="flkManager" id="flkManager" class="imageFrame" scrolling="auto" title="Flickr Selection" frameborder="0"></iframe>
-    
-      </div>
-      <?php
-    }
-  ?>
-</fieldset>
-
-<!-- image properties -->
-
-<table  border="0" cellspacing="0" cellpadding="0" width="100%">
-  <tr>
-    <th style="text-align: left;">Description:</th>
-    <td colspan="6">
-      <input type="text" id="f_alt" style="width:95%"/>
-    </td>
-    <td rowspan="4" width="100" height="100" style="vertical-align: middle;" style="padding:4px;background-color:#CCC;border:1px inset;">
-      <img src="" id="f_preview" />
-    </td>
-  </tr>
-
-  <tr>
-    <th style="text-align: left;">Width:</th>
-    <td >
-      <input id="f_width" type="text" name="f_width" size="4" onchange="javascript:checkConstrains('width');" />
-    </td>
-    <td rowspan="2">
-      <div  style="position:relative">
-        <img src="<?php print $IMConfig['base_url']; ?>img/locked.gif" id="imgLock" width="25" height="32" alt="Constrained Proportions" style="vertical-align: middle;" /><input type="checkbox" id="constrain_prop" checked="checked" onclick="javascript:toggleConstrains(this);" style="position:absolute;top:8px;left:0px;" value="on" />
-      </div>
-    </td>
-    <th style="text-align: left;" class="fullOptions">Margin:</th>
-    <td colspan="3" class="fullOptions">
-    <?php
-      if(@$IMConfig['UseHSpaceVSpace'])
-      {
-        ?>
-          <input name="f_hspace" type="text" id="f_hspace" size="3" />
-        x <input name="f_vspace" type="text" id="f_vspace" size="3" /> 
-        <?php
-      }
-      else
-      {
-        ?>
-        <input name="f_margin" type="text" id="f_margin" size="3" />
-        <?php
-      }
-    ?>      
-      px </td>
-  </tr>
-
-  <tr>
-    <th style="text-align: left;">Height:</th>
-    <td>
-      <input name="f_height" type="text" id="f_height" size="4" />
-    </td>
-    <th style="text-align: left;" class="fullOptions">Padding:</th>
-    <td  class="fullOptions">
-      <input name="f_padding" type="text" id="f_padding" size="3" />
-      px </td>
-    <th style="text-align: left;" class="fullOptions">Color:</th>
-    <td  class="fullOptions">
-      <input name="f_backgroundColor" type="text" id="f_backgroundColor" size="7" />
-     
-    </td>
-  </tr>
-
-
-  <tr class="fullOptions">
-    <th style="text-align: left;">Alignment:</th>
-    <td colspan="2">
-      <select size="1" 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>
-    </td>
-    <th style="text-align: left;">Border:</th>
-    <td>
-      <input name="f_border" type="text" id="f_border" size="3" />
-      px </td>
-    <th style="text-align: left;">Color:</th>
-    <td>
-      <input name="f_borderColor" type="text" id="f_borderColor" size="7" />
-      
-    </td>
-  </tr>
-
-</table>
-
-<div style="text-align: right;">
-  <hr />
-  <button type="button" class="buttons" onclick="return refresh();">Refresh</button>
-  <button type="button" class="buttons" onclick="return onOK();">OK</button>
-  <button type="button" class="buttons" onclick="return onCancel();">Cancel</button>
-</div>
-
-<!--// image properties -->
-<input type="hidden" id="orginal_width" />
-<input type="hidden" id="orginal_height" />
-<input type="hidden" id="f_url" class="largelWidth" value="" />
-</form>
-</body>
-</html>
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ImageManager/newFolder.html b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ImageManager/newFolder.html
deleted file mode 100644
index cf6c38b..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ImageManager/newFolder.html
+++ /dev/null
@@ -1,79 +0,0 @@
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

-<html>

-<head>

-<title>New Folder</title>

- <script type="text/javascript" src="../../popups/popup.js"></script>

- <style type="text/css">

- /*<![CDATA[*/

- html, body {  background-color: ButtonFace;  color: ButtonText; font: 11px Tahoma,Verdana,sans-serif; margin: 0; padding: 0;}

-body { padding: 5px; }

- .title { background-color: #ddf; color: #000; font-weight: bold; font-size: 120%; padding: 3px 10px; margin-bottom: 10px; border-bottom: 1px  solid black; letter-spacing: 2px;}

-select, input, button { font: 11px Tahoma,Verdana,sans-serif; }

-.buttons { width: 70px; text-align: center; }

-form { padding: 0px;  margin: 0;}

-form .elements{

-	padding: 10px; text-align: center;

-}

- /*]]>*/

- </style>

-<script type="text/javascript" src="assets/popup.js"></script>

-<script type="text/javascript">

-/*<![CDATA[*/

-	window.resizeTo(300, 160);

-

-    if(window.opener)

-        HTMLArea = window.opener.HTMLArea;

-

-	init = function ()

-	{

-		__dlg_init();

-		__dlg_translate('ImageManager');

-		document.getElementById("f_foldername").focus();

-	};

-

-	function onCancel()

-	{

-		__dlg_close(null);

-		return false;

-	}

-

-	function onOK()

-	{

-		 // pass data back to the calling window

-	  var fields = ["f_foldername"];

-	  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 addEvent(obj, evType, fn)

-	{

-		if (obj.addEventListener) { obj.addEventListener(evType, fn, true); return true; }

-		else if (obj.attachEvent) {  var r = obj.attachEvent("on"+evType, fn);  return r;  }

-		else {  return false; }

-	}

-

-	addEvent(window, 'load', init);

-//-->

-</script>

-</head>

-<body >

-<div class="title">New Folder</div>

-<form action="">

-<div class="elements">

-	<label for="f_foldername">Folder Name:</label>

-	<input type="text" id="f_foldername" />

-</div>

-<div style="text-align: right;">

-	  <hr />

-	  <button type="button" class="buttons" onclick="return onOK();">OK</button>

-	  <button type="button" class="buttons" 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-1.5.1/unsupported_plugins/ImageManager/resizer.php b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ImageManager/resizer.php
deleted file mode 100644
index 082ec1b..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ImageManager/resizer.php
+++ /dev/null
@@ -1,88 +0,0 @@
-<?php
-header('Content-Type: text/javascript; charset=UTF-8');
-
-/**
- * Resize images to a given size, and saving in a new file.
- * resize.php?img=/relative/path/to/image.jpg&width=<pixels>&height=<pixels>[&to=/relative/path/to/newimage.jpg]
- * relative to the base_dir given in config.inc.php
- * This is pretty much just thumbs.php with some mods, I'm too lazy to do it properly
- * @author $Author:ray $
- * @version $Id:resizer.php 922 2007-12-30 14:35:46Z ray $
- * @package ImageManager
- */
-
-require_once('config.inc.php');
-require_once('Classes/ImageManager.php');
-require_once('Classes/Thumbnail.php');
-
-function js_fail($message)    { echo 'alert(\'' . $message . '\'); false'; exit;   }
-function js_success($resultFile)    { echo '\'' . $resultFile . '\''; exit;   }
-
-//check for img parameter in the url
-if(!isset($_GET['img']) || !isset($_GET['width']) || !isset($_GET['height']))
-{
-  js_fail('Missing parameter.');
-}
-
-if($IMConfig['resize_files'] == FALSE)
-{
-  js_success($_GET['img']);
-}
-
-$manager = new ImageManager($IMConfig);
-
-//get the image and the full path to the image
-$image = $_GET['img'];
-$fullpath = Files::makeFile($manager->getImagesDir(),$image);
-
-//not a file, so exit
-if(!is_file($fullpath))
-{
-  js_fail("File {$fullpath} does not exist.");
-}
-
-$imgInfo = @getImageSize($fullpath);
-
-//Not an image, bail out.
-if(!is_array($imgInfo))
-{
-	js_fail("File {$fullpath} is not an image.");
-}
-
-if(!isset($_GET['to']))
-{
-  $resized    = $manager->getResizedName($fullpath,$_GET['width'],$_GET['height']);
-  $_GET['to'] = $manager->getResizedName($image,$_GET['width'],$_GET['height'], FALSE);
-}
-else
-{
-  $resized = Files::makeFile($manager->getImagesDir(),$_GET['to']);
-}
-
-// Check to see if it already exists
-if(is_file($resized))
-{
-	// And is newer
-	if(filemtime($resized) >= filemtime($fullpath))
-	{
-		js_success($_GET['to']);
-	}
-}
-
-
-
-// resize (thumbnailer will do this for us just fine)
-$thumbnailer = new Thumbnail($_GET['width'],$_GET['height']);
-$thumbnailer->proportional = FALSE;
-$thumbnailer->createThumbnail($fullpath, $resized);
-
-// did it work?
-if(is_file($resized))
-{
-	js_success($_GET['to']);
-}
-else
-{
-	js_fail("Resize Failed.");
-}
-?>
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ImageManager/smart-image.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ImageManager/smart-image.js
deleted file mode 100644
index ea1916d..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ImageManager/smart-image.js
+++ /dev/null
@@ -1,838 +0,0 @@
-
-/** The ImageManager plugin has the capability to also select other things and represent them as images.
- *  For example, it can select YouTube videos, and the image it returns will be the "large size thumbnail"
- *  of the video which YouTube provides, along with some "meta information" which is stored as a query string
- *  on the end of the image URL.
- *
- *  For example, a YouTube video url returned by ImageManager may look like this (I've inserted newlines here):
- *   http://img.youtube.com/vi/_ctBsZJmPv8/0.jpg
- *     ?x-shockwave-flash=http%3A%2F%2Fwww.youtube.com%2Fv%2F_ctBsZJmPv8
- *     &x-thumbnail=http%3A%2F%2Fimg.youtube.com%2Fvi%2F_ctBsZJmPv8%2F3.jpg
- *     &f_alt=CAW%20Sportcruiser%20ZK-JBZ%20does%20a%20touch%20and%20go%20at%20Tirohia
- *     &f_width=320
- *     &f_height=240
- *
- *  It should be clear what the meta information all means.
- *
- *  The job of SmartImages is to look through the page where you OUTPUT (use) the stuff you edited with
- *  Xinha/ImageManager/ImagePicker find images with the appropriate meta information, and replace them 
- *  with something other than an image (in this case, it would replace it with the YouTube video of course).
- *
- *  REPEAT: You need to use SmartImages (or make your own alternative) on the page(s) where you OUTPUT (use) 
- *  the content you edited with Xinha/ImageManager/ImagePicker.  If you don't, well, you just get to see a 
- *  static image, instead of the video (as will anybody with JS turned off etc, which is quite the bonus really!)
- *
- *  Example Usage:
- *    <head>
- *      <script type="text/javascript" src="/xinha/plugins/ImageManager/smart-image.js"></script>      
- *    </head>
- *    <body onload="SmartImages.replace_all();">
- * 
- *  If you want to do something fancy with youtube/flash smart images, check out the SmartImages.replace_flash
- *  method below where you can specify dimensions, background colour, pass data to the flash, and set attributes
- *  on the resulting object/embed.
- *
- * @author $Author: gogo $
- * @version $Id: image-manager.js 856 2007-06-13 18:34:34Z wymsy $
- * @package ImageManager 
- */  
-
-var SmartImages = 
-{
-  _flash_meta_re:  new RegExp(/\?.*(x-shockwave-flash)=([^&]+)/),
-  _flickr_meta_re: new RegExp(/\?.*(x-flickr-photo)=([^&]+)/),
-  /** Replace an image which has exta meta information on the query string 
-   *  (from selecting a video from youtube with the image manager/picker)
-   *  with the flash video referenced in that data.
-   *
-   *  @param Element|null Image element, or null to replace all images
-   *     which have the meta data.
-   *  @param Object|null  An object of parameters, or null for the default
-       {
-         width:   '100%',    // null for "same as image"
-         height:  '100%',    // null for "same as image"
-         bgcolor: '#000000', // null for transparent?
-         
-         embed_params: {
-            wmode: 'transparent'
-         },
-         
-         embed_attributes: {
-         
-         }
-         
-         flash_params: {
-           my_variable: 'something'
-         }
-       }
-   *
-   */
-  
-  replace_flash:
-    function (img, params)
-    {
-      if(!img)
-      {
-        var images = document.getElementsByTagName('img');
-              
-        for(var x = 0; x < images.length; x++)
-        {
-          if(images[x].src.match(SmartImages._flash_meta_re))
-          {
-            SmartImages.replace_flash(images[x], params);
-          }
-        }
-      }
-      else
-      {
-        var i = img;
-        if(!i.src.match(SmartImages._flash_meta_re))
-          return;
-        var swf = decodeURIComponent(RegExp.$2);
-        
-        if(!i.id)
-        {
-          i.id = 'ximg'+Math.floor(Math.random() * 100000);
-        }
-        
-        if(!params) params = { };
-        if(!params.embed_params) 
-          params.embed_params = { 'wmode':'transparent' };
-        if(!params.flash_params)
-          params.flash_params = { }
-        if(!params.embed_attributes)
-          params.embed_attributes = { }
-        if(!params.width)  params.width   = i.offsetWidth;
-        if(!params.height) params.height = i.offsetHeight;                
-        if(params.bgcolor) params.embed_params.bgcolor = params.bgcolor;
-        
-        swfobject.embedSWF(swf, i.id, params.width, params.height, '7.0.0', null, params.flash_params, params.embed_params, params.embed_attributes);          
-      }
-    },
-    
-  /** Add an overlay over flickr images which shows the copyright owner, and a link to the 
-   *  photo at flickr.  Flickr requires attribution of all images, this should I believe satisfy  
-   *  that requirement.
-   *
-   *  Note However that flickr expressly forbids any commercial use of thier API without 
-   *   a commercial API key, which they need you to apply for.
-   *
-   */
-   
-  attribute_flickr: 
-    function(img, params)
-    {
-      if(!img)
-      {
-        var images = document.getElementsByTagName('img');
-              
-        for(var x = 0; x < images.length; x++)
-        {
-          if(images[x].src.match(SmartImages._flickr_meta_re))
-          {
-            SmartImages.attribute_flickr(images[x], params);
-          }
-        }
-      }
-      else
-      {
-        var i = img;
-        if(!i.src.match(SmartImages._flickr_meta_re))
-          return;
-        
-        var meta = SmartImages.get_meta(i.src);
-        var inf = document.createElement('a');
-        inf.appendChild(document.createTextNode('© ' + meta['x-by']));
-        inf.appendChild(document.createTextNode(' - flickr.com '));
-        
-        inf.href = 'http://www.flickr.com/photos/'+meta['x-uid']+'/'+meta['x-flickr-photo']+'/';
-        inf.target = '_blank';
-        
-        inf.style.position   = 'absolute';
-        inf.style.display    = 'block';
-        inf.style.visibility = 'hidden';        
-        inf.className        = 'xinha-flickr-info';        
-        inf.style.backgroundColor = '#CCC';
-        inf.style.opacity    = '0.6';
-        inf.style.padding    = '2px';
-        inf.style.color      = 'black';
-        
-        i.xFlickrInfo = inf;
-                
-        // Need to append it before we position it
-        document.body.appendChild(i.xFlickrInfo);
-        i.xFlickrShow = function()
-          {
-            var p = SmartImages.get_position(this);
-            this.xFlickrInfo.style.top    = p.y + (this.offsetHeight - this.xFlickrInfo.offsetHeight) + 'px';                        
-            this.xFlickrInfo.style.left   = p.x + ((this.offsetWidth / 2) - (this.xFlickrInfo.offsetWidth / 2)) + 'px';
-            this.xFlickrInfo.style.visibility = 'visible';
-            
-            var im = this;
-            window.setTimeout(function() { im.xFlickrInfo.style.visibility = 'hidden'; }, 4000);
-          }
-          
-        
-        SmartImages.add_event(i, 'mouseover', function() { i.xFlickrShow(); });
-        SmartImages.add_event(window,'resize',function() { if(i.xFlickrInfo.style.visibility == 'visible') i.xFlickrShow(); });                
-      }
-  },
-  
-  get_meta: 
-    function(url)
-    {      
-      var outparam = { };
-      while(url.match(/[?&](([fx][_-][a-z0-9_-]+)=([^&#]+))/i))
-      {
-        try
-        {
-          outparam[RegExp.$2] = decodeURIComponent(RegExp.$3);
-        }
-        catch(e)
-        {
-          // Truncated component probably
-        }
-        url = url.replace(RegExp.$1, '');
-      }
-      
-      return outparam;
-    },
-        
-   /** Get the X/Y position of an element */
-   
-   get_position: function(obj) {
-        var x = 0;
-        var y = 0;
-        if (obj.offsetParent) {
-            x = obj.offsetLeft
-            y = obj.offsetTop
-            while (obj = obj.offsetParent) {
-                x += obj.offsetLeft
-                y += obj.offsetTop
-            }
-        }
-        return { 'x': x, 'y': y };
-    },
-    
-  /** Add event */
-  add_event: function(el, evname, func)
-  {
-    if(document.addEventListener)
-    {
-      el.addEventListener(evname, func, true);
-    }
-    else
-    {
-      el.attachEvent("on" + evname, func);
-    }
-  },
-  
-  /** Replace all the images that have appropriate meta information with
-   *  something more interesting.
-   */
-   
-  replace_all:
-    function()
-    {
-      SmartImages.replace_flash();
-      SmartImages.attribute_flickr();
-    }
-
-}
-
-
-// Below is the source for SWFObject, including it here rather than trying to do an include just to make it easier.
-if(typeof swfobject == 'undefined')
-{
-/*	SWFObject v2.0 rc2 <http://code.google.com/p/swfobject/>
-	Copyright (c) 2007 Geoff Stearns, Michael Williams, and Bobby van der Sluis
-	This software is released under the MIT License <http://www.opensource.org/licenses/mit-license.php>
-*/
-
-var swfobject = function() {
-	
-	var domLoadFnArr = [];
-	var regObjArr = [];
-	var timer = null;
-	var storedAltContent = null;
-	var isDomLoaded = false;
-	var isExpressInstallActive = false;
-	
-	/* Centralized function for browser feature detection
-		- Proprietary feature detection (conditional compiling) is used to detect Internet Explorer's features
-		- User agent string detection is only used when no alternative is possible
-		- Is executed directly for optimal performance
-	*/	
-	var ua = function() {
-		var w3cdom = typeof document.getElementById != "undefined" 	&& typeof document.getElementsByTagName != "undefined" && typeof document.createElement != "undefined" && typeof document.appendChild != "undefined" && typeof document.replaceChild != "undefined" && typeof document.removeChild != "undefined" && typeof document.cloneNode != "undefined";
-		var playerVersion = [0,0,0];
-		var d = null;
-		if (typeof navigator.plugins != "undefined" && typeof navigator.plugins["Shockwave Flash"] == "object") {
-			d = navigator.plugins["Shockwave Flash"].description;
-			if (d) {
-				d = d.replace(/^.*\s+(\S+\s+\S+$)/, "$1");
-				playerVersion[0] = parseInt(d.replace(/^(.*)\..*$/, "$1"), 10);
-				playerVersion[1] = parseInt(d.replace(/^.*\.(.*)\s.*$/, "$1"), 10);
-				playerVersion[2] = /r/.test(d) ? parseInt(d.replace(/^.*r(.*)$/, "$1"), 10) : 0;
-			}
-		}
-		else if (typeof window.ActiveXObject != "undefined") {
-			var a = null;
-			var fp6Crash = false;
-			try {
-				a = new ActiveXObject("ShockwaveFlash.ShockwaveFlash.7");
-			}
-			catch(e) {
-				try { 
-					a = new ActiveXObject("ShockwaveFlash.ShockwaveFlash.6");
-					playerVersion = [6,0,21];
-					a.AllowScriptAccess = "always";  // Introduced in fp6.0.47
-				}
-				catch(e) {
-					if (playerVersion[0] == 6) {
-						fp6Crash = true;
-					}
-				}
-				if (!fp6Crash) {
-					try {
-						a = new ActiveXObject("ShockwaveFlash.ShockwaveFlash");
-					}
-					catch(e) {}
-				}
-			}
-			if (!fp6Crash && a) { // a will return null when ActiveX is disabled
-				try {
-					d = a.GetVariable("$version");  // Will crash fp6.0.21/23/29
-					if (d) {
-						d = d.split(" ")[1].split(",");
-						playerVersion = [parseInt(d[0], 10), parseInt(d[1], 10), parseInt(d[2], 10)];
-					}
-				}
-				catch(e) {}
-			}
-		}
-		var u = navigator.userAgent.toLowerCase();
-		var p = navigator.platform.toLowerCase();
-		var webkit = /webkit/.test(u);
-		var webkitVersion = webkit ? parseFloat(u.replace(/^.*webkit\/(\d+(\.\d+)?).*$/, "$1")) : 0;
-		var ie = false;
-		var win = p ? /win/.test(p) : /win/.test(u);
-		var mac = p ? /mac/.test(p) : /mac/.test(u);
-		/*@cc_on
-			ie = true;
-			@if (@_win32)
-				win = true;
-			@elif (@_mac)
-				mac = true;
-			@end
-		@*/
-		return { w3cdom:w3cdom, playerVersion:playerVersion, webkit:webkit, webkitVersion:webkitVersion, ie:ie, win:win, mac:mac };
-	}();
-		
-	/* Cross-browser onDomLoad
-		- Based on Dean Edwards' solution: http://dean.edwards.name/weblog/2006/06/again/
-		- Will fire an event as soon as the DOM of a page is loaded (supported by Gecko based browsers - like Firefox -, IE, Opera9+, Safari)
-	*/ 
-	var onDomLoad = function() {
-		if (!ua.w3cdom) {
-			return;
-		}
-		addDomLoadEvent(main);
-		if (ua.ie && ua.win) {
-			try {  // Avoid a possible Operation Aborted error
-				document.write("<scr" + "ipt id=__ie_ondomload defer=true src=//:></scr" + "ipt>"); // String is split into pieces to avoid Norton AV to add code that can cause errors 
-				var s = document.getElementById("__ie_ondomload");
-				if (s) {
-					s.onreadystatechange = function() {
-						if (this.readyState == "complete") {
-							this.parentNode.removeChild(this);
-							callDomLoadFunctions();
-						}
-					};
-				}
-			}
-			catch(e) {}
-		}
-		if (ua.webkit && typeof document.readyState != "undefined") {
-			timer = setInterval(function() { if (/loaded|complete/.test(document.readyState)) { callDomLoadFunctions(); }}, 10);
-		}
-		if (typeof document.addEventListener != "undefined") {
-			document.addEventListener("DOMContentLoaded", callDomLoadFunctions, null);
-		}
-		addLoadEvent(callDomLoadFunctions);
-	}();
-	
-	function callDomLoadFunctions() {
-		if (isDomLoaded) {
-			return;
-		}
-		if (ua.ie && ua.win) { // Test if we can really add elements to the DOM; we don't want to fire it too early
-			var s = document.createElement("span");
-			try { // Avoid a possible Operation Aborted error
-				var t = document.getElementsByTagName("body")[0].appendChild(s);
-				t.parentNode.removeChild(t);
-			}
-			catch (e) {
-				return;
-			}
-		}
-		isDomLoaded = true;
-		if (timer) {
-			clearInterval(timer);
-			timer = null;
-		}
-		var dl = domLoadFnArr.length;
-		for (var i = 0; i < dl; i++) {
-			domLoadFnArr[i]();
-		}
-	}
-	
-	function addDomLoadEvent(fn) {
-		if (isDomLoaded) {
-			fn();
-		}
-		else { 
-			domLoadFnArr[domLoadFnArr.length] = fn; // Array.push() is only available in IE5.5+
-		}
-	}
-	
-	/* Cross-browser onload
-		- Based on James Edwards' solution: http://brothercake.com/site/resources/scripts/onload/
-		- Will fire an event as soon as a web page including all of its assets are loaded 
-	 */
-	function addLoadEvent(fn) {
-		if (typeof window.addEventListener != "undefined") {
-			window.addEventListener("load", fn, false);
-		}
-		else if (typeof document.addEventListener != "undefined") {
-			document.addEventListener("load", fn, false);
-		}
-		else if (typeof window.attachEvent != "undefined") {
-			window.attachEvent("onload", fn);
-		}
-		else if (typeof window.onload == "function") {
-			var fnOld = window.onload;
-			window.onload = function() {
-				fnOld();
-				fn();
-			};
-		}
-		else {
-			window.onload = fn;
-		}
-	}
-	
-	/* Main function
-		- Will preferably execute onDomLoad, otherwise onload (as a fallback)
-	*/
-	function main() { // Static publishing only
-		var rl = regObjArr.length;
-		for (var i = 0; i < rl; i++) { // For each registered object element
-			var id = regObjArr[i].id;
-			if (ua.playerVersion[0] > 0) { // If no fp is installed, we let the object element do its job (show alternative content)
-				var obj = document.getElementById(id);
-				if (obj) {
-					regObjArr[i].width = obj.getAttribute("width") ? obj.getAttribute("width") : "0";
-					regObjArr[i].height = obj.getAttribute("height") ? obj.getAttribute("height") : "0";
-					if (hasPlayerVersion(regObjArr[i].swfVersion)) { // Flash plug-in version >= Flash content version: Houston, we have a match!
-						if (ua.webkit && ua.webkitVersion < 312) { // Older webkit engines ignore the object element's nested param elements
-							fixParams(obj);
-						}
-					}
-					else if (regObjArr[i].expressInstall && !isExpressInstallActive && hasPlayerVersion([6,0,65]) && (ua.win || ua.mac)) { // Show the Adobe Express Install dialog if set by the web page author and if supported (fp6.0.65+ on Win/Mac OS only)
-						showExpressInstall(regObjArr[i]);
-					}
-					else { // Flash plug-in and Flash content version mismatch: display alternative content instead of Flash content
-						displayAltContent(obj);
-					}
-				}
-			}
-			createCSS("#" + id, "visibility:visible");
-		}
-	}
-	
-	/* Fix nested param elements, which are ignored by older webkit engines
-		- This includes Safari up to and including version 1.2.2 on Mac OS 10.3
-		- Fall back to the proprietary embed element
-	*/
-	function fixParams(obj) {
-		var nestedObj = obj.getElementsByTagName("object")[0];
-		if (nestedObj) {
-			var e = document.createElement("embed");	
-			var a = nestedObj.attributes;
-			if (a) {
-				var al = a.length;
-				for (var i = 0; i < al; i++) {
-					if (a[i].nodeName.toLowerCase() == "data") {
-						e.setAttribute("src", a[i].nodeValue);
-					}
-					else {
-						e.setAttribute(a[i].nodeName, a[i].nodeValue);
-					}
-				}
-			}
-			var c = nestedObj.childNodes;
-			if (c) {
-				var cl = c.length;
-				for (var j = 0; j < cl; j++) {
-					if (c[j].nodeType == 1 && c[j].nodeName.toLowerCase() == "param") {
-						e.setAttribute(c[j].getAttribute("name"), c[j].getAttribute("value"));
-					}
-				}
-			}
-			obj.parentNode.replaceChild(e, obj);
-		}
-	}
-	
-	/* Fix hanging audio/video threads and force open sockets and NetConnections to disconnect
-		- Occurs when unloading a web page in IE using fp8+ and innerHTML/outerHTML
-		- Dynamic publishing only
-	*/
-	function fixObjectLeaks(id) {
-		if (ua.ie && ua.win && hasPlayerVersion([8,0,0])) {
-			window.attachEvent("onunload", function () {
-				var obj = document.getElementById(id);
-				for (var i in obj) {
-					if (typeof obj[i] == "function") {
-						obj[i] = function() {};
-					}
-				}
-				obj.parentNode.removeChild(obj);
-			});
-		}
-	}
-	
-	/* Show the Adobe Express Install dialog
-		- Reference: http://www.adobe.com/cfusion/knowledgebase/index.cfm?id=6a253b75
-	*/
-	function showExpressInstall(regObj) {
-		isExpressInstallActive = true;
-		var obj = document.getElementById(regObj.id);
-		if (obj) {
-			if (regObj.altContentId) {
-				var ac = document.getElementById(regObj.altContentId);
-				if (ac) {
-					storedAltContent = ac;
-				}
-			}
-			else {
-				storedAltContent = abstractAltContent(obj);
-			}
-			if (!(/%$/.test(regObj.width)) && parseInt(regObj.width, 10) < 310) {
-				regObj.width = "310";
-			}
-			if (!(/%$/.test(regObj.height)) && parseInt(regObj.height, 10) < 137) {
-				regObj.height = "137";
-			}
-			var pt = ua.ie && ua.win ? "ActiveX" : "PlugIn";
-			document.title = document.title.slice(0, 47) + " - Flash Player Installation";
-			var dt = document.title;
-			var fv = "MMredirectURL=" + window.location + "&MMplayerType=" + pt + '&MMdoctitle=' + dt;
-			var replaceId = regObj.id;
-			// For IE when a SWF is loading (AND: not available in cache) wait for the onload event to fire to remove the original object element
-			// In IE you cannot properly cancel a loading SWF file without breaking browser load references, also obj.onreadystatechange doesn't work
-			if (ua.ie && ua.win && obj.readyState != 4) {
-				var newObj = document.createElement("div");
-				replaceId += "SWFObjectNew";
-				newObj.setAttribute("id", replaceId);
-				obj.parentNode.insertBefore(newObj, obj); // Insert placeholder div that will be replaced by the object element that loads expressinstall.swf
-				obj.style.display = "none";
-				window.attachEvent("onload", function() { obj.parentNode.removeChild(obj); });
-			}
-			createSWF({ data:regObj.expressInstall, id:"SWFObjectExprInst", width:regObj.width, height:regObj.height }, { flashvars:fv }, replaceId);
-		}
-	}
-	
-	/* Functions to abstract and display alternative content
-	*/
-	function displayAltContent(obj) {
-		if (ua.ie && ua.win && obj.readyState != 4) {
-			// For IE when a SWF is loading (AND: not available in cache) wait for the onload event to fire to remove the original object element
-			// In IE you cannot properly cancel a loading SWF file without breaking browser load references, also obj.onreadystatechange doesn't work
-			var el = document.createElement("div");
-			obj.parentNode.insertBefore(el, obj); // Insert placeholder div that will be replaced by the alternative content
-			el.parentNode.replaceChild(abstractAltContent(obj), el);
-			obj.style.display = "none";
-			window.attachEvent("onload", function() { obj.parentNode.removeChild(obj); });
-		}
-		else {
-			obj.parentNode.replaceChild(abstractAltContent(obj), obj);
-		}
-	}	
-
-	function abstractAltContent(obj) {
-		var ac = document.createElement("div");
-		if (ua.win && ua.ie) {
-			ac.innerHTML = obj.innerHTML;
-		}
-		else {
-			var nestedObj = obj.getElementsByTagName("object")[0];
-			if (nestedObj) {
-				var c = nestedObj.childNodes;
-				if (c) {
-					var cl = c.length;
-					for (var i = 0; i < cl; i++) {
-						if (!(c[i].nodeType == 1 && c[i].nodeName.toLowerCase() == "param") && !(c[i].nodeType == 8)) {
-							ac.appendChild(c[i].cloneNode(true));
-						}
-					}
-				}
-			}
-		}
-		return ac;
-	}
-	
-	/* Cross-browser dynamic SWF creation
-	*/
-	function createSWF(attObj, parObj, id) {
-		var r;
-		var el = document.getElementById(id);
-		if (typeof attObj.id == "undefined") { // if no 'id' is defined for the object element, it will inherit the 'id' from the alternative content
-			attObj.id = id;
-		}
-		if (ua.ie && ua.win) { // IE, the object element and W3C DOM methods do not combine: fall back to outerHTML
-			var att = "";
-			for (var i in attObj) {
-				if (attObj[i] != Object.prototype[i]) { // Filter out prototype additions from other potential libraries, like Object.prototype.toJSONString = function() {}
-					if (i == "data") {
-						parObj.movie = attObj[i];
-					}
-					else if (i.toLowerCase() == "styleclass") { // 'class' is an ECMA4 reserved keyword
-						att += ' class="' + attObj[i] + '"';
-					}
-					else if (i != "classid") {
-						att += ' ' + i + '="' + attObj[i] + '"';
-					}
-				}
-			}
-			var par = "";
-			for (var j in parObj) {
-				if (parObj[j] != Object.prototype[j]) { // Filter out prototype additions from other potential libraries
-					par += '<param name="' + j + '" value="' + parObj[j] + '" />';
-				}
-			}
-			el.outerHTML = '<object classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000"' + att + '>' + par + '</object>';
-			fixObjectLeaks(attObj.id); // This bug affects dynamic publishing only
-			r = document.getElementById(attObj.id);	
-		}
-		else if (ua.webkit && ua.webkitVersion < 312) { // Older webkit engines ignore the object element's nested param elements: fall back to the proprietary embed element
-			var e = document.createElement("embed");
-			e.setAttribute("type", "application/x-shockwave-flash");
-			for (var k in attObj) {
-				if (attObj[k] != Object.prototype[k]) { // Filter out prototype additions from other potential libraries
-					if (k == "data") {
-						e.setAttribute("src", attObj[k]);
-					}
-					else if (k.toLowerCase() == "styleclass") { // 'class' is an ECMA4 reserved keyword
-						e.setAttribute("class", attObj[k]);
-					}
-					else if (k != "classid") { // Filter out IE specific attribute
-						e.setAttribute(k, attObj[k]);
-					}
-				}
-			}
-			for (var l in parObj) {
-				if (parObj[l] != Object.prototype[l]) { // Filter out prototype additions from other potential libraries
-					if (l != "movie") { // Filter out IE specific param element
-						e.setAttribute(l, parObj[l]);
-					}
-				}
-			}
-			el.parentNode.replaceChild(e, el);
-			r = e;
-		}
-		else { // Well-behaving browsers
-			var o = document.createElement("object");
-			o.setAttribute("type", "application/x-shockwave-flash");
-			for (var m in attObj) {
-				if (attObj[m] != Object.prototype[m]) { // Filter out prototype additions from other potential libraries
-					if (m.toLowerCase() == "styleclass") { // 'class' is an ECMA4 reserved keyword
-						o.setAttribute("class", attObj[m]);
-					}
-					else if (m != "classid") { // Filter out IE specific attribute
-						o.setAttribute(m, attObj[m]);
-					}
-				}
-			}
-			for (var n in parObj) {
-				if (parObj[n] != Object.prototype[n] && n != "movie") { // Filter out prototype additions from other potential libraries and IE specific param element
-					createObjParam(o, n, parObj[n]);
-				}
-			}
-			el.parentNode.replaceChild(o, el);
-			r = o;
-		}
-		return r;
-	}
-
-	function createObjParam(el, pName, pValue) {
-		var p = document.createElement("param");
-		p.setAttribute("name", pName);	
-		p.setAttribute("value", pValue);
-		el.appendChild(p);
-	}
-	
-	function hasPlayerVersion(rv) {
-		return (ua.playerVersion[0] > rv[0] || (ua.playerVersion[0] == rv[0] && ua.playerVersion[1] > rv[1]) || (ua.playerVersion[0] == rv[0] && ua.playerVersion[1] == rv[1] && ua.playerVersion[2] >= rv[2])) ? true : false;
-	}
-	
-	/* Cross-browser dynamic CSS creation
-		- Based on Bobby van der Sluis' solution: http://www.bobbyvandersluis.com/articles/dynamicCSS.php
-	*/	
-	function createCSS(sel, decl) {
-		if (ua.ie && ua.mac) {
-			return;
-		}
-		var h = document.getElementsByTagName("head")[0]; 
-		var s = document.createElement("style");
-		s.setAttribute("type", "text/css");
-		s.setAttribute("media", "screen");
-		if (!(ua.ie && ua.win) && typeof document.createTextNode != "undefined") {
-			s.appendChild(document.createTextNode(sel + " {" + decl + "}"));
-		}
-		h.appendChild(s);
-		if (ua.ie && ua.win && typeof document.styleSheets != "undefined" && document.styleSheets.length > 0) {
-			var ls = document.styleSheets[document.styleSheets.length - 1];
-			if (typeof ls.addRule == "object") {
-				ls.addRule(sel, decl);
-			}
-		}
-	}
-	
-	return {
-		/* Public API
-			- Reference: http://code.google.com/p/swfobject/wiki/SWFObject_2_0_documentation
-		*/ 
-		registerObject: function(objectIdStr, swfVersionStr, xiSwfUrlStr) {
-			if (!ua.w3cdom || !objectIdStr || !swfVersionStr) {
-				return;
-			}
-			var regObj = {};
-			regObj.id = objectIdStr;
-			var v = swfVersionStr.split(".");
-			regObj.swfVersion = [parseInt(v[0], 10), parseInt(v[1], 10), parseInt(v[2], 10)];
-			regObj.expressInstall = xiSwfUrlStr ? xiSwfUrlStr : false;
-			regObjArr[regObjArr.length] = regObj;
-			createCSS("#" + objectIdStr, "visibility:hidden");
-		},
-		
-		getObjectById: function(objectIdStr) {
-			var r = null;
-			if (ua.w3cdom && isDomLoaded) {
-				var o = document.getElementById(objectIdStr);
-				if (o) {
-					var n = o.getElementsByTagName("object")[0];
-					if (!n || (n && typeof o.SetVariable != "undefined")) {
-				    	r = o;
-					}
-					else if (typeof n.SetVariable != "undefined") {
-						r = n;
-					}
-				}
-			}
-			return r;
-		},
-		
-		embedSWF: function(swfUrlStr, replaceElemIdStr, widthStr, heightStr, swfVersionStr, xiSwfUrlStr, flashvarsObj, parObj, attObj) {
-			if (!ua.w3cdom || !swfUrlStr || !replaceElemIdStr || !widthStr || !heightStr || !swfVersionStr) {
-				return;
-			}
-			widthStr += ""; // Auto-convert to string to make it idiot proof
-			heightStr += "";
-			if (hasPlayerVersion(swfVersionStr.split("."))) {
-				createCSS("#" + replaceElemIdStr, "visibility:hidden");
-				var att = (typeof attObj == "object") ? attObj : {};
-				att.data = swfUrlStr;
-				att.width = widthStr;
-				att.height = heightStr;
-				var par = (typeof parObj == "object") ? parObj : {};
-				if (typeof flashvarsObj == "object") {
-					for (var i in flashvarsObj) {
-						if (flashvarsObj[i] != Object.prototype[i]) { // Filter out prototype additions from other potential libraries
-							if (typeof par.flashvars != "undefined") {
-								par.flashvars += "&" + i + "=" + flashvarsObj[i];
-							}
-							else {
-								par.flashvars = i + "=" + flashvarsObj[i];
-							}
-						}
-					}
-				}
-				addDomLoadEvent(function() {
-					createSWF(att, par, replaceElemIdStr);
-					createCSS("#" + replaceElemIdStr, "visibility:visible");
-				});
-			}
-			else if (xiSwfUrlStr && !isExpressInstallActive && hasPlayerVersion([6,0,65]) && (ua.win || ua.mac)) {
-				createCSS("#" + replaceElemIdStr, "visibility:hidden");
-				addDomLoadEvent(function() {
-					var regObj = {};
-					regObj.id = regObj.altContentId = replaceElemIdStr;
-					regObj.width = widthStr;
-					regObj.height = heightStr;
-					regObj.expressInstall = xiSwfUrlStr;
-					showExpressInstall(regObj);
-					createCSS("#" + replaceElemIdStr, "visibility:visible");
-				});
-			}
-		},
-		
-		getFlashPlayerVersion: function() {
-			return { major:ua.playerVersion[0], minor:ua.playerVersion[1], release:ua.playerVersion[2] };
-		},
-		
-		hasFlashPlayerVersion: function(versionStr) {
-			return hasPlayerVersion(versionStr.split("."));
-		},
-		
-		createSWF: function(attObj, parObj, replaceElemIdStr) {
-			if (ua.w3cdom && isDomLoaded) {
-				return createSWF(attObj, parObj, replaceElemIdStr);
-			}
-			else {
-				return undefined;
-			}
-		},
-		
-		createCSS: function(sel, decl) {
-			if (ua.w3cdom) {
-				createCSS(sel, decl);
-			}
-		},
-		
-		addDomLoadEvent:addDomLoadEvent,
-		
-		addLoadEvent:addLoadEvent,
-		
-		getQueryParamValue: function(param) {
-			var q = document.location.search || document.location.hash;
-			if (param == null) {
-				return q;
-			}
-		 	if(q) {
-				var pairs = q.substring(1).split("&");
-				for (var i = 0; i < pairs.length; i++) {
-					if (pairs[i].substring(0, pairs[i].indexOf("=")) == param) {
-						return pairs[i].substring((pairs[i].indexOf("=") + 1));
-					}
-				}
-			}
-			return "";
-		},
-		
-		// For internal usage only
-		expressInstallCallback: function() {
-			if (isExpressInstallActive && storedAltContent) {
-				var obj = document.getElementById("SWFObjectExprInst");
-				if (obj) {
-					obj.parentNode.replaceChild(storedAltContent, obj);
-					storedAltContent = null;
-					isExpressInstallActive = false;
-				}
-			} 
-		}
-		
-	};
-
-}();
-}
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ImageManager/swfobject/expressinstall.html b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ImageManager/swfobject/expressinstall.html
deleted file mode 100644
index 52162ab..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ImageManager/swfobject/expressinstall.html
+++ /dev/null
@@ -1,73 +0,0 @@
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
-<!-- saved from url=(0014)about:internet -->
-<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
-<head>
-<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
-<title>SWFObject embed by Geoff Stearns (express install) @ deconcept</title>
-<!-- SWFObject embed by Geoff Stearns geoff@deconcept.com http://blog.deconcept.com/swfobject/ -->
-<script type="text/javascript" src="swfobject.js"></script>
-<style type="text/css">
-	
-	body {
-		background-color: #eeeeee;
-		font: .8em/1.3em verdana,arial,helvetica,sans-serif;
-	}
-
-	#info {
-		width: 300px;
-		overflow: auto;
-	}
-
-	#flashcontent {
-		border: solid 1px #000;
-		width: 300px;
-		height: 300px;
-		float: left;
-		margin: 15px 20px;
-	}
-
-</style>
-</head>
-<body>
-
-	<div id="flashcontent">
-		<strong>You need to upgrade your Flash Player</strong>
-		This is replaced by the Flash content. 
-		Place your alternate content here and users without the Flash plugin or with 
-		Javascript turned off will see this. Content here allows you to leave out <code>noscript</code> 
-		tags. Include a link to <a href="expressinstall.html?detectflash=false">bypass the detection</a> if you wish.
-	</div>
-
-	<script type="text/javascript">
-		// <![CDATA[
-		
-		var so = new SWFObject("so_tester.swf", "sotester", "300", "300", "9", "#FF6600");
-		so.addVariable("flashVarText", "this is passed in via FlashVars"); // this line is optional, but this example uses the variable and displays this text inside the flash movie
-		so.useExpressInstall('expressinstall.swf');
-		so.write("flashcontent");
-		
-		// ]]>
-	</script>
-
-	<div id="info">
-		<p>
-			This Flash movie was embedded using the <a href="http://blog.deconcept.com/swfobject/">SWFObject</a> embed method by <a href="http://blog.deconcept.com/">Geoff Stearns</a>.
-		</p>
-		<p>Other sample embeds:</p>
-		<ul>
-			<li><a href="swfobject.html">Basic Flash Embed with alternate content</a></li>
-			<li><a href="fullpage.html">Full page Flash embed</a></li>
-			<li>Basic Flash Embed with Express Install allowed</li>
-		</ul>
-		<p>You can also <a href="flashversion.html">view your installed Flash version</a>.</p>
-		<p>
-			<a href="view-source:http://blog.deconcept.com/swfobject/expressinstall.html">View source</a> (in mozilla, firefox) | <a href="swfobject_source.js">View Javascript</a>.
-		</p>
-		<p>
-			<a href="http://blog.deconcept.com/swfobject/swfobject1-4.zip">Download Source</a>.
-		</p>
-	</div>
-	
-	<p style="clear: both;margin-left: 20px"><a href="http://validator.w3.org/check?uri=referer">Validate XHTML</a> and <a href="http://jigsaw.w3.org/css-validator/check/referer">CSS</a></p>
-</body>
-</html>
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ImageManager/swfobject/expressinstall.swf b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ImageManager/swfobject/expressinstall.swf
deleted file mode 100644
index 613d69b..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ImageManager/swfobject/expressinstall.swf
+++ /dev/null
Binary files differ
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ImageManager/swfobject/swfobject.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ImageManager/swfobject/swfobject.js
deleted file mode 100644
index e7edd42..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ImageManager/swfobject/swfobject.js
+++ /dev/null
@@ -1,8 +0,0 @@
-/**
- * SWFObject v1.5: Flash Player detection and embed - http://blog.deconcept.com/swfobject/
- *
- * SWFObject is (c) 2007 Geoff Stearns and is released under the MIT License:
- * http://www.opensource.org/licenses/mit-license.php
- *
- */
-if(typeof deconcept=="undefined"){var deconcept=new Object();}if(typeof deconcept.util=="undefined"){deconcept.util=new Object();}if(typeof deconcept.SWFObjectUtil=="undefined"){deconcept.SWFObjectUtil=new Object();}deconcept.SWFObject=function(_1,id,w,h,_5,c,_7,_8,_9,_a){if(!document.getElementById){return;}this.DETECT_KEY=_a?_a:"detectflash";this.skipDetect=deconcept.util.getRequestParameter(this.DETECT_KEY);this.params=new Object();this.variables=new Object();this.attributes=new Array();if(_1){this.setAttribute("swf",_1);}if(id){this.setAttribute("id",id);}if(w){this.setAttribute("width",w);}if(h){this.setAttribute("height",h);}if(_5){this.setAttribute("version",new deconcept.PlayerVersion(_5.toString().split(".")));}this.installedVer=deconcept.SWFObjectUtil.getPlayerVersion();if(!window.opera&&document.all&&this.installedVer.major>7){deconcept.SWFObject.doPrepUnload=true;}if(c){this.addParam("bgcolor",c);}var q=_7?_7:"high";this.addParam("quality",q);this.setAttribute("useExpressInstall",false);this.setAttribute("doExpressInstall",false);var _c=(_8)?_8:window.location;this.setAttribute("xiRedirectUrl",_c);this.setAttribute("redirectUrl","");if(_9){this.setAttribute("redirectUrl",_9);}};deconcept.SWFObject.prototype={useExpressInstall:function(_d){this.xiSWFPath=!_d?"expressinstall.swf":_d;this.setAttribute("useExpressInstall",true);},setAttribute:function(_e,_f){this.attributes[_e]=_f;},getAttribute:function(_10){return this.attributes[_10];},addParam:function(_11,_12){this.params[_11]=_12;},getParams:function(){return this.params;},addVariable:function(_13,_14){this.variables[_13]=_14;},getVariable:function(_15){return this.variables[_15];},getVariables:function(){return this.variables;},getVariablePairs:function(){var _16=new Array();var key;var _18=this.getVariables();for(key in _18){_16[_16.length]=key+"="+_18[key];}return _16;},getSWFHTML:function(){var _19="";if(navigator.plugins&&navigator.mimeTypes&&navigator.mimeTypes.length){if(this.getAttribute("doExpressInstall")){this.addVariable("MMplayerType","PlugIn");this.setAttribute("swf",this.xiSWFPath);}_19="<embed type=\"application/x-shockwave-flash\" src=\""+this.getAttribute("swf")+"\" width=\""+this.getAttribute("width")+"\" height=\""+this.getAttribute("height")+"\" style=\""+this.getAttribute("style")+"\"";_19+=" id=\""+this.getAttribute("id")+"\" name=\""+this.getAttribute("id")+"\" ";var _1a=this.getParams();for(var key in _1a){_19+=[key]+"=\""+_1a[key]+"\" ";}var _1c=this.getVariablePairs().join("&");if(_1c.length>0){_19+="flashvars=\""+_1c+"\"";}_19+="/>";}else{if(this.getAttribute("doExpressInstall")){this.addVariable("MMplayerType","ActiveX");this.setAttribute("swf",this.xiSWFPath);}_19="<object id=\""+this.getAttribute("id")+"\" classid=\"clsid:D27CDB6E-AE6D-11cf-96B8-444553540000\" width=\""+this.getAttribute("width")+"\" height=\""+this.getAttribute("height")+"\" style=\""+this.getAttribute("style")+"\">";_19+="<param name=\"movie\" value=\""+this.getAttribute("swf")+"\" />";var _1d=this.getParams();for(var key in _1d){_19+="<param name=\""+key+"\" value=\""+_1d[key]+"\" />";}var _1f=this.getVariablePairs().join("&");if(_1f.length>0){_19+="<param name=\"flashvars\" value=\""+_1f+"\" />";}_19+="</object>";}return _19;},write:function(_20){if(this.getAttribute("useExpressInstall")){var _21=new deconcept.PlayerVersion([6,0,65]);if(this.installedVer.versionIsValid(_21)&&!this.installedVer.versionIsValid(this.getAttribute("version"))){this.setAttribute("doExpressInstall",true);this.addVariable("MMredirectURL",escape(this.getAttribute("xiRedirectUrl")));document.title=document.title.slice(0,47)+" - Flash Player Installation";this.addVariable("MMdoctitle",document.title);}}if(this.skipDetect||this.getAttribute("doExpressInstall")||this.installedVer.versionIsValid(this.getAttribute("version"))){var n=(typeof _20=="string")?document.getElementById(_20):_20;n.innerHTML=this.getSWFHTML();return true;}else{if(this.getAttribute("redirectUrl")!=""){document.location.replace(this.getAttribute("redirectUrl"));}}return false;}};deconcept.SWFObjectUtil.getPlayerVersion=function(){var _23=new deconcept.PlayerVersion([0,0,0]);if(navigator.plugins&&navigator.mimeTypes.length){var x=navigator.plugins["Shockwave Flash"];if(x&&x.description){_23=new deconcept.PlayerVersion(x.description.replace(/([a-zA-Z]|\s)+/,"").replace(/(\s+r|\s+b[0-9]+)/,".").split("."));}}else{if(navigator.userAgent&&navigator.userAgent.indexOf("Windows CE")>=0){var axo=1;var _26=3;while(axo){try{_26++;axo=new ActiveXObject("ShockwaveFlash.ShockwaveFlash."+_26);_23=new deconcept.PlayerVersion([_26,0,0]);}catch(e){axo=null;}}}else{try{var axo=new ActiveXObject("ShockwaveFlash.ShockwaveFlash.7");}catch(e){try{var axo=new ActiveXObject("ShockwaveFlash.ShockwaveFlash.6");_23=new deconcept.PlayerVersion([6,0,21]);axo.AllowScriptAccess="always";}catch(e){if(_23.major==6){return _23;}}try{axo=new ActiveXObject("ShockwaveFlash.ShockwaveFlash");}catch(e){}}if(axo!=null){_23=new deconcept.PlayerVersion(axo.GetVariable("$version").split(" ")[1].split(","));}}}return _23;};deconcept.PlayerVersion=function(_29){this.major=_29[0]!=null?parseInt(_29[0]):0;this.minor=_29[1]!=null?parseInt(_29[1]):0;this.rev=_29[2]!=null?parseInt(_29[2]):0;};deconcept.PlayerVersion.prototype.versionIsValid=function(fv){if(this.major<fv.major){return false;}if(this.major>fv.major){return true;}if(this.minor<fv.minor){return false;}if(this.minor>fv.minor){return true;}if(this.rev<fv.rev){return false;}return true;};deconcept.util={getRequestParameter:function(_2b){var q=document.location.search||document.location.hash;if(_2b==null){return q;}if(q){var _2d=q.substring(1).split("&");for(var i=0;i<_2d.length;i++){if(_2d[i].substring(0,_2d[i].indexOf("="))==_2b){return _2d[i].substring((_2d[i].indexOf("=")+1));}}}return "";}};deconcept.SWFObjectUtil.cleanupSWFs=function(){var _2f=document.getElementsByTagName("OBJECT");for(var i=_2f.length-1;i>=0;i--){_2f[i].style.display="none";for(var x in _2f[i]){if(typeof _2f[i][x]=="function"){_2f[i][x]=function(){};}}}};if(deconcept.SWFObject.doPrepUnload){if(!deconcept.unloadSet){deconcept.SWFObjectUtil.prepUnload=function(){__flash_unloadHandler=function(){};__flash_savedUnloadHandler=function(){};window.attachEvent("onunload",deconcept.SWFObjectUtil.cleanupSWFs);};window.attachEvent("onbeforeunload",deconcept.SWFObjectUtil.prepUnload);deconcept.unloadSet=true;}}if(!document.getElementById&&document.all){document.getElementById=function(id){return document.all[id];};}var getQueryParamValue=deconcept.util.getRequestParameter;var FlashObject=deconcept.SWFObject;var SWFObject=deconcept.SWFObject;
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ImageManager/swfobject/swfobject_source.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ImageManager/swfobject/swfobject_source.js
deleted file mode 100755
index caa256a..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ImageManager/swfobject/swfobject_source.js
+++ /dev/null
@@ -1,233 +0,0 @@
-/**
- * SWFObject v1.5: Flash Player detection and embed - http://blog.deconcept.com/swfobject/
- *
- * SWFObject is (c) 2007 Geoff Stearns and is released under the MIT License:
- * http://www.opensource.org/licenses/mit-license.php
- *
- */
-if(typeof deconcept == "undefined") var deconcept = new Object();
-if(typeof deconcept.util == "undefined") deconcept.util = new Object();
-if(typeof deconcept.SWFObjectUtil == "undefined") deconcept.SWFObjectUtil = new Object();
-deconcept.SWFObject = function(swf, id, w, h, ver, c, quality, xiRedirectUrl, redirectUrl, detectKey) {
-	if (!document.getElementById) { return; }
-	this.DETECT_KEY = detectKey ? detectKey : 'detectflash';
-	this.skipDetect = deconcept.util.getRequestParameter(this.DETECT_KEY);
-	this.params = new Object();
-	this.variables = new Object();
-	this.attributes = new Array();
-	if(swf) { this.setAttribute('swf', swf); }
-	if(id) { this.setAttribute('id', id); }
-	if(w) { this.setAttribute('width', w); }
-	if(h) { this.setAttribute('height', h); }
-	if(ver) { this.setAttribute('version', new deconcept.PlayerVersion(ver.toString().split("."))); }
-	this.installedVer = deconcept.SWFObjectUtil.getPlayerVersion();
-	if (!window.opera && document.all && this.installedVer.major > 7) {
-		// only add the onunload cleanup if the Flash Player version supports External Interface and we are in IE
-		deconcept.SWFObject.doPrepUnload = true;
-	}
-	if(c) { this.addParam('bgcolor', c); }
-	var q = quality ? quality : 'high';
-	this.addParam('quality', q);
-	this.setAttribute('useExpressInstall', false);
-	this.setAttribute('doExpressInstall', false);
-	var xir = (xiRedirectUrl) ? xiRedirectUrl : window.location;
-	this.setAttribute('xiRedirectUrl', xir);
-	this.setAttribute('redirectUrl', '');
-	if(redirectUrl) { this.setAttribute('redirectUrl', redirectUrl); }
-}
-deconcept.SWFObject.prototype = {
-	useExpressInstall: function(path) {
-		this.xiSWFPath = !path ? "expressinstall.swf" : path;
-		this.setAttribute('useExpressInstall', true);
-	},
-	setAttribute: function(name, value){
-		this.attributes[name] = value;
-	},
-	getAttribute: function(name){
-		return this.attributes[name];
-	},
-	addParam: function(name, value){
-		this.params[name] = value;
-	},
-	getParams: function(){
-		return this.params;
-	},
-	addVariable: function(name, value){
-		this.variables[name] = value;
-	},
-	getVariable: function(name){
-		return this.variables[name];
-	},
-	getVariables: function(){
-		return this.variables;
-	},
-	getVariablePairs: function(){
-		var variablePairs = new Array();
-		var key;
-		var variables = this.getVariables();
-		for(key in variables){
-			variablePairs[variablePairs.length] = key +"="+ variables[key];
-		}
-		return variablePairs;
-	},
-	getSWFHTML: function() {
-		var swfNode = "";
-		if (navigator.plugins && navigator.mimeTypes && navigator.mimeTypes.length) { // netscape plugin architecture
-			if (this.getAttribute("doExpressInstall")) {
-				this.addVariable("MMplayerType", "PlugIn");
-				this.setAttribute('swf', this.xiSWFPath);
-			}
-			swfNode = '<embed type="application/x-shockwave-flash" src="'+ this.getAttribute('swf') +'" width="'+ this.getAttribute('width') +'" height="'+ this.getAttribute('height') +'" style="'+ this.getAttribute('style') +'"';
-			swfNode += ' id="'+ this.getAttribute('id') +'" name="'+ this.getAttribute('id') +'" ';
-			var params = this.getParams();
-			 for(var key in params){ swfNode += [key] +'="'+ params[key] +'" '; }
-			var pairs = this.getVariablePairs().join("&");
-			 if (pairs.length > 0){ swfNode += 'flashvars="'+ pairs +'"'; }
-			swfNode += '/>';
-		} else { // PC IE
-			if (this.getAttribute("doExpressInstall")) {
-				this.addVariable("MMplayerType", "ActiveX");
-				this.setAttribute('swf', this.xiSWFPath);
-			}
-			swfNode = '<object id="'+ this.getAttribute('id') +'" classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" width="'+ this.getAttribute('width') +'" height="'+ this.getAttribute('height') +'" style="'+ this.getAttribute('style') +'">';
-			swfNode += '<param name="movie" value="'+ this.getAttribute('swf') +'" />';
-			var params = this.getParams();
-			for(var key in params) {
-			 swfNode += '<param name="'+ key +'" value="'+ params[key] +'" />';
-			}
-			var pairs = this.getVariablePairs().join("&");
-			if(pairs.length > 0) {swfNode += '<param name="flashvars" value="'+ pairs +'" />';}
-			swfNode += "</object>";
-		}
-		return swfNode;
-	},
-	write: function(elementId){
-		if(this.getAttribute('useExpressInstall')) {
-			// check to see if we need to do an express install
-			var expressInstallReqVer = new deconcept.PlayerVersion([6,0,65]);
-			if (this.installedVer.versionIsValid(expressInstallReqVer) && !this.installedVer.versionIsValid(this.getAttribute('version'))) {
-				this.setAttribute('doExpressInstall', true);
-				this.addVariable("MMredirectURL", escape(this.getAttribute('xiRedirectUrl')));
-				document.title = document.title.slice(0, 47) + " - Flash Player Installation";
-				this.addVariable("MMdoctitle", document.title);
-			}
-		}
-		if(this.skipDetect || this.getAttribute('doExpressInstall') || this.installedVer.versionIsValid(this.getAttribute('version'))){
-			var n = (typeof elementId == 'string') ? document.getElementById(elementId) : elementId;
-			n.innerHTML = this.getSWFHTML();
-			return true;
-		}else{
-			if(this.getAttribute('redirectUrl') != "") {
-				document.location.replace(this.getAttribute('redirectUrl'));
-			}
-		}
-		return false;
-	}
-}
-
-/* ---- detection functions ---- */
-deconcept.SWFObjectUtil.getPlayerVersion = function(){
-	var PlayerVersion = new deconcept.PlayerVersion([0,0,0]);
-	if(navigator.plugins && navigator.mimeTypes.length){
-		var x = navigator.plugins["Shockwave Flash"];
-		if(x && x.description) {
-			PlayerVersion = new deconcept.PlayerVersion(x.description.replace(/([a-zA-Z]|\s)+/, "").replace(/(\s+r|\s+b[0-9]+)/, ".").split("."));
-		}
-	}else if (navigator.userAgent && navigator.userAgent.indexOf("Windows CE") >= 0){ // if Windows CE
-		var axo = 1;
-		var counter = 3;
-		while(axo) {
-			try {
-				counter++;
-				axo = new ActiveXObject("ShockwaveFlash.ShockwaveFlash."+ counter);
-//				document.write("player v: "+ counter);
-				PlayerVersion = new deconcept.PlayerVersion([counter,0,0]);
-			} catch (e) {
-				axo = null;
-			}
-		}
-	} else { // Win IE (non mobile)
-		// do minor version lookup in IE, but avoid fp6 crashing issues
-		// see http://blog.deconcept.com/2006/01/11/getvariable-setvariable-crash-internet-explorer-flash-6/
-		try{
-			var axo = new ActiveXObject("ShockwaveFlash.ShockwaveFlash.7");
-		}catch(e){
-			try {
-				var axo = new ActiveXObject("ShockwaveFlash.ShockwaveFlash.6");
-				PlayerVersion = new deconcept.PlayerVersion([6,0,21]);
-				axo.AllowScriptAccess = "always"; // error if player version < 6.0.47 (thanks to Michael Williams @ Adobe for this code)
-			} catch(e) {
-				if (PlayerVersion.major == 6) {
-					return PlayerVersion;
-				}
-			}
-			try {
-				axo = new ActiveXObject("ShockwaveFlash.ShockwaveFlash");
-			} catch(e) {}
-		}
-		if (axo != null) {
-			PlayerVersion = new deconcept.PlayerVersion(axo.GetVariable("$version").split(" ")[1].split(","));
-		}
-	}
-	return PlayerVersion;
-}
-deconcept.PlayerVersion = function(arrVersion){
-	this.major = arrVersion[0] != null ? parseInt(arrVersion[0]) : 0;
-	this.minor = arrVersion[1] != null ? parseInt(arrVersion[1]) : 0;
-	this.rev = arrVersion[2] != null ? parseInt(arrVersion[2]) : 0;
-}
-deconcept.PlayerVersion.prototype.versionIsValid = function(fv){
-	if(this.major < fv.major) return false;
-	if(this.major > fv.major) return true;
-	if(this.minor < fv.minor) return false;
-	if(this.minor > fv.minor) return true;
-	if(this.rev < fv.rev) return false;
-	return true;
-}
-/* ---- get value of query string param ---- */
-deconcept.util = {
-	getRequestParameter: function(param) {
-		var q = document.location.search || document.location.hash;
-		if (param == null) { return q; }
-		if(q) {
-			var pairs = q.substring(1).split("&");
-			for (var i=0; i < pairs.length; i++) {
-				if (pairs[i].substring(0, pairs[i].indexOf("=")) == param) {
-					return pairs[i].substring((pairs[i].indexOf("=")+1));
-				}
-			}
-		}
-		return "";
-	}
-}
-/* fix for video streaming bug */
-deconcept.SWFObjectUtil.cleanupSWFs = function() {
-	var objects = document.getElementsByTagName("OBJECT");
-	for (var i = objects.length - 1; i >= 0; i--) {
-		objects[i].style.display = 'none';
-		for (var x in objects[i]) {
-			if (typeof objects[i][x] == 'function') {
-				objects[i][x] = function(){};
-			}
-		}
-	}
-}
-// fixes bug in some fp9 versions see http://blog.deconcept.com/2006/07/28/swfobject-143-released/
-if (deconcept.SWFObject.doPrepUnload) {
-	if (!deconcept.unloadSet) {
-		deconcept.SWFObjectUtil.prepUnload = function() {
-			__flash_unloadHandler = function(){};
-			__flash_savedUnloadHandler = function(){};
-			window.attachEvent("onunload", deconcept.SWFObjectUtil.cleanupSWFs);
-		}
-		window.attachEvent("onbeforeunload", deconcept.SWFObjectUtil.prepUnload);
-		deconcept.unloadSet = true;
-	}
-}
-/* add document.getElementById if needed (mobile IE < 5) */
-if (!document.getElementById && document.all) { document.getElementById = function(id) { return document.all[id]; }}
-
-/* add some aliases for ease of use/backwards compatibility */
-var getQueryParamValue = deconcept.util.getRequestParameter;
-var FlashObject = deconcept.SWFObject; // for legacy support
-var SWFObject = deconcept.SWFObject;
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ImageManager/thumbs.php b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ImageManager/thumbs.php
deleted file mode 100644
index 291986e..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ImageManager/thumbs.php
+++ /dev/null
@@ -1,100 +0,0 @@
-<?php
-/**
- * On the fly Thumbnail generation.
- * Creates thumbnails given by thumbs.php?img=/relative/path/to/image.jpg
- * relative to the base_dir given in config.inc.php
- * @author $Author:ray $
- * @version $Id:thumbs.php 677 2007-01-19 22:24:36Z ray $
- * @package ImageManager
- */
-
-require_once('config.inc.php');
-require_once('Classes/ImageManager.php');
-require_once('Classes/Thumbnail.php');
-
-//check for img parameter in the url
-if(!isset($_GET['img']))
-	{
-	exit();
-	}
-
-
-$manager = new ImageManager($IMConfig);
-
-//get the image and the full path to the image
-$image = rawurldecode($_GET['img']);
-
-// If the image is a URL, see if there is an x-thumbnail x-thumb or x-tn param on it
-//  probably best to use x-tn to save space on the URL
-if(preg_match('/^[a-z]+:\/\/.*[?&]x-(thumbnail|thumb|tn)=([^&]+)/i', $image, $Matches))
-{
-  // In which case, we will use the thumbnail
-  header('location: ' . rawurldecode($Matches[2]));
-  exit;
-}
-
-$fullpath = Files::makeFile($manager->getImagesDir(),$image);
-
-//not a file, so exit
-if(!is_file($fullpath))
-	{
-	exit();
-	}
-
-$imgInfo = @getImageSize($fullpath);
-
-//Not an image, send default thumbnail
-if(!is_array($imgInfo))
-{
-	//show the default image, otherwise we quit!
-	$default = $manager->getDefaultThumb();
-	if($default)
-	{
-		header('Location: '.$default);
-		exit();
-	}
-}
-//if the image is less than the thumbnail dimensions
-//send the original image as thumbnail
-
-if ($imgInfo[0] <= $IMConfig['thumbnail_width']
- && $imgInfo[1] <= $IMConfig['thumbnail_height'])
- {
-
-	 header('Location: '. $manager->getFileURL($image));
-	 exit();
- }
-
-//Check for thumbnails
-$thumbnail = $manager->getThumbName($fullpath);
-
-if(is_file($thumbnail))
-{
-	//if the thumbnail is newer, send it
-	if(filemtime($thumbnail) >= filemtime($fullpath))
-	{
-		header('Location: '.$manager->getThumbURL($image));
-		exit();
-	}
-}
-
-//creating thumbnails
-$thumbnailer = new Thumbnail($IMConfig['thumbnail_width'],$IMConfig['thumbnail_height']);
-$thumbnailer->createThumbnail($fullpath, $thumbnail);
-
-//Check for NEW thumbnails
-if(is_file($thumbnail))
-{
-	//send the new thumbnail
-	header('Location: '.$manager->getThumbURL($image));
-	exit();
-}
-else
-{
-	//show the default image, otherwise we quit!
-	$default = $manager->getDefaultThumb();
-
-	if($default)
-		header('Location: '.$default);
-}
-?>
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ImageManager/youtube.php b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ImageManager/youtube.php
deleted file mode 100644
index 0786869..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/ImageManager/youtube.php
+++ /dev/null
@@ -1,292 +0,0 @@
-<?php 
-/**
- * Show a list of images in a long horizontal table.
- * @author $Author: gogo $
- * @version $Id: images.php 877 2007-08-12 15:50:03Z gogo $
- * @package ImageManager
- */
-
-require_once('config.inc.php');
-require_once('ddt.php');
-require_once('Classes/ImageManager.php');
-
-// Compatability for PHP lt 5.2
-require_once('Classes/JSON_Compat.php');
-  
-// Search for youtube videos
-// ?vq=funny+dogs&start-index=20&max-results=15
-$youtube = "http://gdata.youtube.com/feeds/api/videos?max-results=50&format=5&alt=json&";
-
-if(@$_REQUEST['ytSearch'])
-{
-  $youtube .= 'vq='.rawurlencode($_REQUEST['ytSearch']) .'&';   
-}
-
-if(@$_REQUEST['ytUsername'])
-{
-  $youtube .= 'author='.rawurlencode($_REQUEST['ytUsername']);  
-}
-
-$feed = file_get_contents($youtube);
-$data = json_decode($feed, true);
-
-$numRows  = $data['feed']['openSearch$totalResults']['$t'];
-$firstRow = $data['feed']['openSearch$startIndex']['$t'];
-$perPage  = $data['feed']['openSearch$itemsPerPage']['$t'];
-$lastRow  = $startRow-1+$perPage;
-$records  = $data['feed']['entry'];
-
-
-
-//default path is /
-$relative = '/';
-$manager = new ImageManager($IMConfig);
-
-/* ================= OUTPUT/DRAW FUNCTIONS ======================= */
-
-function format_duration($duration)
-{
-  $hours = floor($duration / (60 * 60));
-  $duration = $duration - ($hours * 60 * 60);
-  
-  $minutes = floor($duration / 60);
-  $duration = $duration - ($minutes * 60);
-  
-  $seconds = $duration;
-  
-  if($hours)
-  {        
-    return $hours . '.' . floor(($minutes/60) * 100) . " hr" . ($minutes ? "s" : '');  
-  }
-  
-  if($minutes)
-  {
-    return $minutes . ' min' . ($minutes > 1 ? 's' : '');
-  }
-  
-  return $seconds . ' sec'  . ($seconds > 1 ? 's' : '');
-  
-}
- 
-function rip_youtube_data($record)
-{  
-  $media = $record['media$group'];
-  $title = $media['media$title']['$t'];
-  $description = substr($media['media$description']['$t'],0,100);
-  $duration = $media['yt$duration']['seconds'];
-    
-  $thumbs = array(); // w:h => array( file, file, file)
-  $largest = array(0,'', 0, 0);   
-  $smallest = array(3000*3000,'', 3000, 3000); // Ok, hacky, sosumi
-  foreach($media['media$thumbnail'] as $thumb) 
-  {
-    if(!isset($thumbs["{$thumb['width']}x{$thumb['height']}"]))
-    {
-      $thumbs["{$thumb['width']}x{$thumb['height']}"]  = array();
-      if(($thumb['width'] * $thumb['height']) > $largest[0])
-        $largest = array($thumb['width'] * $thumb['height'], $thumb['width'] . 'x' . $thumb['height'], $thumb['width'] , $thumb['height']);
-      if(($thumb['width'] * $thumb['height']) < $smallest[0])
-        $smallest = array($thumb['width'] * $thumb['height'], $thumb['width'] . 'x' . $thumb['height'], $thumb['width'] , $thumb['height']);
-    }
-    $thumbs["{$thumb['width']}x{$thumb['height']}"][$thumb['time']] = $thumb['url'];
-    
-  }
- 
-  // Find the main image link
-  $mainImage = $thumbs[$largest[1]];
-  $mainImage = array_pop($mainImage);
-  
-  // Find the thumb image link
-  $thumbImage = $thumbs[$smallest[1]];
-  $thumbImage = array_pop($thumbImage);
-  
-  $embed = NULL;
-  foreach($media['media$content'] as $vid)
-  {
-    if($vid['type'] == 'application/x-shockwave-flash')
-    {
-      $embed = $vid['url'];
-      break;
-    }
-  }
-  
-  // Final image to pass to manager (use query param to record the embed url)
-  $combinedImage = $mainImage . 
-  '?x-shockwave-flash='.rawurlencode($embed).
-  '&x-tn='.rawurlencode($thumbImage);
-  
-  
-  return array
-  (
-   'title'         => $title,
-   'description'   => $description,
-   'duration'      => format_duration($duration),
-   
-   'mainImage'     => $mainImage,
-   'thumbImage'    => $thumbImage,
-   'combinedImage' => $combinedImage,
-   
-   'smallest' => $smallest,
-   'largest'  => $largest,
-   'thumbs'   => $thumbs,
-   'embed'    => $embed,
-  );
-}
-                           
-function drawFiles($list, &$manager)
-{
-	global $relative;
-	global $IMConfig;
-//$IMConfig['ViewMode'] = 'thumbs';
-    switch($IMConfig['ViewMode'])
-    {
-      case 'details':
-      {
-        
-        ?>
-        <script language="Javascript">
-          <!--
-            function showPreview(f_url)
-            {              
-              window.parent.document.getElementById('f_preview').src = window.parent._backend_url + '__function=thumbs&img=' + encodeURIComponent(f_url);
-            }
-          //-->
-        </script>
-        <table class="listview">
-        <thead>
-        <tr><th>Title</th><th>Description</th><th>Duration</th></tr></thead>
-        <tbody>
-          <?php
-          foreach($list as $record)
-          {
-            
-            extract(rip_youtube_data($record));
-            
-            ?>
-            <tr>
-              <th><a href="#" class="thumb" style="cursor: pointer;" onclick="selectImage('<?php echo xinha_js_encode($combinedImage)?>', '<?php echo xinha_js_encode($title); ?>', <?php echo $largest[2];?>, <?php echo $largest[3]; ?>);return false;" title="<?php echo htmlspecialchars($title); ?> - <?php echo htmlspecialchars($duration); ?>" onmouseover="showPreview('<?php echo xinha_js_encode($combinedImage);?>')" onmouseout="showPreview(window.parent.document.getElementById('f_url').value)" ><?php echo htmlspecialchars($title) ?></a></th>
-              <td><?php echo htmlspecialchars($description); ?></td>
-              <td><?php echo htmlspecialchars($duration); ?>              
-            </tr>
-            <?php        
-          }
-          ?>
-        </tbody>
-        </table>
-        <?php
-      }      
-      break;
-      
-      case 'thumbs':
-      default      :
-      {
-        foreach($list as $record)
-        {
-          extract(rip_youtube_data($record));
-          ?>
-          <div class="thumb_holder" id="holder_<?php echo asc2hex($combinedImage) ?>">
-            <a href="#" class="thumb" style="cursor: pointer;" onclick="selectImage('<?php echo xinha_js_encode($combinedImage)?>', '<?php echo xinha_js_encode($title); ?>', <?php echo $largest[2];?>, <?php echo $largest[3]; ?>);return false;" title="<?php echo htmlspecialchars($title); ?> - <?php echo htmlspecialchars($duration); ?>">
-              <img src="<?php print $thumbImage ?>" alt="<?php echo $title; ?> - <?php echo htmlspecialchars($duration); ?>"/>
-            </a>
-          </div>
-          <?php
-        }
-      }
-    }	
-}//function drawFiles
-
-
-
-/**
- * No directories and no files.
- */
-function drawNoResults() 
-{
-?>
-<div class="noResult">No Videos Found</div>
-<?php 
-}
-
-/**
- * No directories and no files.
- */
-function drawErrorBase(&$manager) 
-{
-?>
-<div class="error"><span>Invalid base directory:</span> <?php echo $manager->config['images_dir']; ?></div>
-<?php 
-}
-
-/**
- * Utility to convert ascii string to hex
- */
-function asc2hex ($temp)
-{
-  $len = strlen($temp);
-  $data = "";
-  for ($i=0; $i<$len; $i++) $data.=sprintf("%02x",ord(substr($temp,$i,1)));
-  return $data;
-}
-
-?>
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-
-<html>
-<head>
-	<title>YouTube Video List</title>
-  <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
-	<link href="<?php print $IMConfig['base_url'];?>assets/imagelist.css" rel="stylesheet" type="text/css" />
-  <script type="text/javascript">
-   _backend_url = "<?php print $IMConfig['backend_url']; ?>";
-  </script>
-
-<script type="text/javascript" src="<?php print $IMConfig['base_url'];?>assets/dialog.js"></script>
-<script type="text/javascript">
-/*<![CDATA[*/
-
-	if(window.top)
-    HTMLArea = Xinha    = window.top.Xinha;
-
-	function hideMessage()
-	{
-		var topDoc = window.top.document;
-		var messages = topDoc.getElementById('messages');
-		if(messages)
-			messages.style.display = "none";
-	}
-
-	init = function()
-	{
-	  __dlg_translate('ImageManager');
-		hideMessage();
-		var topDoc = window.top.document;
-
-//    update_selected();
-	}	
-	
-/*]]>*/
-</script>
-<script type="text/javascript" src="<?php print $IMConfig['base_url'];?>assets/images.js"></script>
-<script type="text/javascript" src="../../popups/popup.js"></script>
-<script type="text/javascript" src="assets/popup.js"></script>
-<style type="text/css">
-.dir_holder, .thumb_holder
-{
-  width:140px; height:110px;
-  float:left;
-  margin:6px;
-  background-color:ButtonFace;
-  border: 1px outset;
-}
-</style>
-</head>
-
-<body>
-<?php if ($manager->isValidBase() == false) { drawErrorBase($manager); } 
-	elseif(count($records)) { ?>
-
-	<?php drawFiles($records, $manager); ?>
-
-<?php } else { drawNoResults(); } ?>
-</body>
-</html>
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/InsertMarquee/InsertMarquee.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/InsertMarquee/InsertMarquee.js
deleted file mode 100644
index 8e7e60a..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/InsertMarquee/InsertMarquee.js
+++ /dev/null
@@ -1,107 +0,0 @@
-// Marquee plugin for HTMLArea/Xinha

-// Implementation by Udo Schmal based on HTMLArea 3.0

-// Original Author - Udo Schmal, Schaffrath-NeueMedien

-//

-// (c) Udo Schmal.2004

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

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

-

-function InsertMarquee(editor) {

-	this.editor = editor;

-

-	var cfg = editor.config;

-	var self = this;

-

-	// register the toolbar buttons provided by this plugin

-	cfg.registerButton({

-	id       : "insertmarquee",

-	tooltip  : this._lc("Insert scrolling marquee"),

-	image    : editor.imgURL("ed_marquee.gif", "InsertMarquee"),

-	textMode : false,

-	action   : function(editor) {

-			self.buttonPress(editor);

-		}

-	})

-	cfg.addToolbarElement("insertmarquee", "inserthorizontalrule", -1);

-}

-

-InsertMarquee._pluginInfo = {

-	name          : "InsertMarquee",

-	version       : "1.0",

-	developer     : "Udo Schmal",

-	developer_url : "http://www.schaffrath-NeueMedien.de/",

-	c_owner       : "Udo Schmal & Schaffrath NeueMedien",

-	license       : "htmlArea"

-};

-

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

-    return Xinha._lc(string, "InsertMarquee");

-};

-

-InsertMarquee.prototype.buttonPress = function(editor, node) {

-  function setAttr(el, attr, value) {

-    if (value != "")

-      el.setAttribute(attr, value);

-    else

-      el.removeAttribute(attr);

-  }

-  var outparam = new Object();

-	if (typeof node == "undefined") {

-	  node = editor.getParentElement();

-	}

-  if ( node.tagName.toLowerCase() == "marquee") {

-    outparam.f_name         = node.name;

-		outparam.f_behavior     = node.behavior;

-		outparam.f_direction    = node.direction;

-		outparam.f_text         = node.innerHTML;

-		outparam.f_width	      = node.width;

-		outparam.f_height	      = node.height;

-		outparam.f_bgcolor      = node.bgColor;

-		outparam.f_scrollamount = node.scrollAmount;

-		outparam.f_scrolldelay  = node.scrollDelay;

-	} else {

-	outparam = {

-    f_name    : '',

-		f_behavior	: '',

-		f_direction	: '',

-		f_text		: '',

-		f_width		: '',

-		f_height	: '',

-		f_bgcolor	: '',

-		f_scrollamount	: '',

-		f_scrolldelay	: ''

-		};

-	}

-	editor._popupDialog( "plugin://InsertMarquee/insert_marquee", function( param )

-	{

-		if ( !param )

-		{ //user must have pressed Cancel

-			return false;

-		} else if ( node.tagName.toLowerCase() == "marquee") {

-        setAttr(node, "name", param["f_name"]);

-        setAttr(node, "id", param["f_name"]);

-				setAttr(node, "behavior",	param["f_behavior"]);

-				setAttr(node, "direction", param["f_direction"]);

-				setAttr(node, "width", param["f_width"]);

-				setAttr(node, "height", param["f_height"]);

-				setAttr(node, "bgColor", param["f_bgcolor"]);

-				setAttr(node, "scrollAmount", param["f_scrollamount"]);

-				setAttr(node, "scrollDelay", param["f_scrolldelay"]);

-        node.innerHTML = param["f_text"];

-		} else {

-			var text = '<marquee name="' + param["f_name"] + '" ' +

-          'id="' + param["f_name"] + '" ' + 

-          'behavior="' + param["f_behavior"] + '" ' +

-					'direction="' + param["f_direction"] + '" ' +

-					'width="' + param["f_width"] + '" ' +

-					'height="' + param["f_height"] + '" ' +

-					'bgcolor="' + param["f_bgcolor"] + '" ' +

-					'scrollamount="' + param["f_scrollamount"] + '" ' +

-					'scrolldelay="' + param["f_scrolldelay"] + '">\n';

-          alert(text);

-			text = text + param["f_text"];

-			text = text + '</marquee>';

-			editor.insertHTML( text );

-		}

-	}, outparam);

-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/InsertMarquee/img/ed_marquee.gif b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/InsertMarquee/img/ed_marquee.gif
deleted file mode 100644
index f3ef44b..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/InsertMarquee/img/ed_marquee.gif
+++ /dev/null
Binary files differ
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/InsertMarquee/lang/b5.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/InsertMarquee/lang/b5.js
deleted file mode 100644
index 98ad2ec..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/InsertMarquee/lang/b5.js
+++ /dev/null
@@ -1,15 +0,0 @@
-// I18N constants
-// LANG: "b5", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "__OBSOLETE__": {
-        "___ TRANSLATOR NOTE   ___": "*** INSERTMARQUEE IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***"
-    }
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/InsertMarquee/lang/ch.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/InsertMarquee/lang/ch.js
deleted file mode 100644
index 103de77..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/InsertMarquee/lang/ch.js
+++ /dev/null
@@ -1,17 +0,0 @@
-// I18N constants
-// LANG: "ch", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Cancel": "取消",
-    "OK": "好",
-    "__OBSOLETE__": {
-        "___ TRANSLATOR NOTE   ___": "*** INSERTMARQUEE IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***"
-    }
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/InsertMarquee/lang/cz.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/InsertMarquee/lang/cz.js
deleted file mode 100644
index df7f34e..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/InsertMarquee/lang/cz.js
+++ /dev/null
@@ -1,21 +0,0 @@
-// I18N constants
-// LANG: "cz", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Cancel": "Zrušit",
-    "Height:": "Výška",
-    "Left": "Vlevo",
-    "OK": "OK",
-    "Right": "Vpravo",
-    "Width:": "Šířka",
-    "__OBSOLETE__": {
-        "___ TRANSLATOR NOTE   ___": "*** INSERTMARQUEE IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***"
-    }
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/InsertMarquee/lang/da.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/InsertMarquee/lang/da.js
deleted file mode 100644
index 733314f..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/InsertMarquee/lang/da.js
+++ /dev/null
@@ -1,22 +0,0 @@
-// I18N constants
-// LANG: "da", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Cancel": "Annuller",
-    "Height:": "Højde:",
-    "Left": "Venstre",
-    "Name": "Navn",
-    "OK": "OK",
-    "Right": "Højre",
-    "Width:": "Bredde:",
-    "__OBSOLETE__": {
-        "___ TRANSLATOR NOTE   ___": "*** INSERTMARQUEE IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***"
-    }
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/InsertMarquee/lang/de.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/InsertMarquee/lang/de.js
deleted file mode 100644
index bee9d49..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/InsertMarquee/lang/de.js
+++ /dev/null
@@ -1,28 +0,0 @@
-// I18N constants
-// LANG: "de", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Background-Color:": "Hintergrundfarbe:",
-    "Behavior:": "Bewegung:",
-    "Cancel": "Abbrechen",
-    "Direction:": "Ausrichtung:",
-    "Height:": "Höhe:",
-    "Insert scrolling marquee": "Marquee einfügen",
-    "Left": "links",
-    "Name": "Name",
-    "OK": "OK",
-    "Right": "rechts",
-    "Speed Control": "Geschwindigkeitseinstellungen",
-    "Text:": "Text:",
-    "Width:": "Breite:",
-    "__OBSOLETE__": {
-        "Insert marquee": "Marquee einfügen"
-    }
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/InsertMarquee/lang/ee.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/InsertMarquee/lang/ee.js
deleted file mode 100644
index bdd46d6..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/InsertMarquee/lang/ee.js
+++ /dev/null
@@ -1,17 +0,0 @@
-// I18N constants
-// LANG: "ee", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Cancel": "Loobu",
-    "OK": "OK",
-    "__OBSOLETE__": {
-        "___ TRANSLATOR NOTE   ___": "*** INSERTMARQUEE IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***"
-    }
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/InsertMarquee/lang/el.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/InsertMarquee/lang/el.js
deleted file mode 100644
index f5caec7..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/InsertMarquee/lang/el.js
+++ /dev/null
@@ -1,21 +0,0 @@
-// I18N constants
-// LANG: "el", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Cancel": "Ακύρωση",
-    "Height:": "Ύψος",
-    "Left": "Αριστερά",
-    "OK": "Εντάξει",
-    "Right": "Δεξιά",
-    "Width:": "Πλάτος",
-    "__OBSOLETE__": {
-        "___ TRANSLATOR NOTE   ___": "*** INSERTMARQUEE IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***"
-    }
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/InsertMarquee/lang/es.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/InsertMarquee/lang/es.js
deleted file mode 100644
index cfe24f6..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/InsertMarquee/lang/es.js
+++ /dev/null
@@ -1,21 +0,0 @@
-// I18N constants
-// LANG: "es", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Cancel": "Cancelar",
-    "Height:": "Alto:",
-    "Left": "Izquierda",
-    "OK": "Aceptar",
-    "Right": "Derecha",
-    "Width:": "Ancho:",
-    "__OBSOLETE__": {
-        "___ TRANSLATOR NOTE   ___": "*** INSERTMARQUEE IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***"
-    }
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/InsertMarquee/lang/eu.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/InsertMarquee/lang/eu.js
deleted file mode 100644
index 5c27b20..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/InsertMarquee/lang/eu.js
+++ /dev/null
@@ -1,20 +0,0 @@
-// I18N constants
-// LANG: "eu", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Cancel": "Utzi",
-    "Left": "Ezkerretara",
-    "OK": "Ados",
-    "Right": "Eskuinetara",
-    "Width:": "Zabalera:",
-    "__OBSOLETE__": {
-        "___ TRANSLATOR NOTE   ___": "*** INSERTMARQUEE IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***"
-    }
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/InsertMarquee/lang/fa.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/InsertMarquee/lang/fa.js
deleted file mode 100644
index 6dc3f4d..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/InsertMarquee/lang/fa.js
+++ /dev/null
@@ -1,20 +0,0 @@
-// I18N constants
-// LANG: "fa", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Cancel": "انصراف",
-    "Left": "چپ",
-    "OK": "بله",
-    "Right": "راست",
-    "Width:": "طول",
-    "__OBSOLETE__": {
-        "___ TRANSLATOR NOTE   ___": "*** INSERTMARQUEE IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***"
-    }
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/InsertMarquee/lang/fi.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/InsertMarquee/lang/fi.js
deleted file mode 100644
index 0abb360..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/InsertMarquee/lang/fi.js
+++ /dev/null
@@ -1,20 +0,0 @@
-// I18N constants
-// LANG: "fi", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Cancel": "Peruuta",
-    "Left": "Vasen",
-    "OK": "Hyväksy",
-    "Right": "Oikea",
-    "Width:": "Leveys",
-    "__OBSOLETE__": {
-        "___ TRANSLATOR NOTE   ___": "*** INSERTMARQUEE IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***"
-    }
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/InsertMarquee/lang/fr.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/InsertMarquee/lang/fr.js
deleted file mode 100644
index 467e935..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/InsertMarquee/lang/fr.js
+++ /dev/null
@@ -1,31 +0,0 @@
-// I18N constants
-// LANG: "fr", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Background-Color:": "Couleur de fond",
-    "Behavior:": "Comportement",
-    "Cancel": "Annuler",
-    "Direction:": "Direction",
-    "Height:": "Hauteur",
-    "Insert scrolling marquee": "Insérer marquee défilant",
-    "Left": "Gauche",
-    "Name": "Nom",
-    "Name/ID:": "Nom/ID",
-    "OK": "OK",
-    "Right": "Droite",
-    "Scroll Amount:": "Quantité de défilement",
-    "Scroll Delay:": "Délai du défilement",
-    "Speed Control": "Controle de vitesse",
-    "Text:": "Texte",
-    "Width:": "Largeur",
-    "__OBSOLETE__": {
-        "Insert marquee": "Insérer marquee"
-    }
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/InsertMarquee/lang/fr_ca.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/InsertMarquee/lang/fr_ca.js
deleted file mode 100644
index ae08c21..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/InsertMarquee/lang/fr_ca.js
+++ /dev/null
@@ -1,15 +0,0 @@
-// I18N constants
-// LANG: "fr_ca", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "__OBSOLETE__": {
-        "___ TRANSLATOR NOTE   ___": "*** INSERTMARQUEE IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***"
-    }
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/InsertMarquee/lang/gb.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/InsertMarquee/lang/gb.js
deleted file mode 100644
index 7cdd2b7..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/InsertMarquee/lang/gb.js
+++ /dev/null
@@ -1,15 +0,0 @@
-// I18N constants
-// LANG: "gb", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "__OBSOLETE__": {
-        "___ TRANSLATOR NOTE   ___": "*** INSERTMARQUEE IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***"
-    }
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/InsertMarquee/lang/he.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/InsertMarquee/lang/he.js
deleted file mode 100644
index dacbf5b..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/InsertMarquee/lang/he.js
+++ /dev/null
@@ -1,21 +0,0 @@
-// I18N constants
-// LANG: "he", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Cancel": "ביטול",
-    "Height:": "גובה",
-    "Left": "שמאל",
-    "OK": "אישור",
-    "Right": "ימין",
-    "Width:": "רוחב",
-    "__OBSOLETE__": {
-        "___ TRANSLATOR NOTE   ___": "*** INSERTMARQUEE IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***"
-    }
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/InsertMarquee/lang/hu.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/InsertMarquee/lang/hu.js
deleted file mode 100644
index c55c51c..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/InsertMarquee/lang/hu.js
+++ /dev/null
@@ -1,17 +0,0 @@
-// I18N constants
-// LANG: "hu", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Cancel": "Mégsem",
-    "OK": "Rendben",
-    "__OBSOLETE__": {
-        "___ TRANSLATOR NOTE   ___": "*** INSERTMARQUEE IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***"
-    }
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/InsertMarquee/lang/it.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/InsertMarquee/lang/it.js
deleted file mode 100644
index 4b039e4..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/InsertMarquee/lang/it.js
+++ /dev/null
@@ -1,22 +0,0 @@
-// I18N constants
-// LANG: "it", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Cancel": "Annullamento",
-    "Height:": "Altezza",
-    "Insert scrolling marquee": "Inserisca marquee",
-    "Left": "Sinistra",
-    "OK": "OK",
-    "Right": "Destra",
-    "Width:": "Larghezza",
-    "__OBSOLETE__": {
-        "___ TRANSLATOR NOTE   ___": "*** INSERTMARQUEE IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***"
-    }
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/InsertMarquee/lang/ja.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/InsertMarquee/lang/ja.js
deleted file mode 100644
index 828525b..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/InsertMarquee/lang/ja.js
+++ /dev/null
@@ -1,36 +0,0 @@
-// I18N constants
-// LANG: "ja", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Alternate": "折り返し",
-    "Background-Color:": "背景色:",
-    "Behavior:": "動作:",
-    "Cancel": "中止",
-    "Continuous": "左右連続",
-    "Direction:": "方向:",
-    "Height:": "高さ:",
-    "Insert scrolling marquee": "スクロールマーキーの挿入",
-    "Left": "左",
-    "Marquee Editor": "マーキーエディタ",
-    "Name": "名前",
-    "Name/ID:": "名前/ID",
-    "OK": "OK",
-    "Right": "右",
-    "Scroll Amount:": "スクロール量:",
-    "Scroll Delay:": "スクロール遅延:",
-    "Slide": "スライド",
-    "Speed Control": "速度調整",
-    "Text:": "テキスト:",
-    "Width:": "幅:",
-    "__OBSOLETE__": {
-        "Insert marquee": "マーキーの挿入",
-        "You must enter the form name": "名前の入力が必要です"
-    }
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/InsertMarquee/lang/lc_base.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/InsertMarquee/lang/lc_base.js
deleted file mode 100644
index da71f76..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/InsertMarquee/lang/lc_base.js
+++ /dev/null
@@ -1,44 +0,0 @@
-// I18N constants
-//
-// LANG: "en", ENCODING: UTF-8
-// Author: Translator-Name, <email@example.com>
-//
-// Last revision: 2018-04-12
-// 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).
-//
-// (Please, remove information below)
-// 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.)
-
-{
-    "Alternate": "",
-    "Background-Color:": "",
-    "Behavior:": "",
-    "Cancel": "",
-    "Continuous": "",
-    "Direction:": "",
-    "Height:": "",
-    "Insert scrolling marquee": "",
-    "Left": "",
-    "Marquee Editor": "",
-    "Name": "",
-    "Name/ID:": "",
-    "OK": "",
-    "Right": "",
-    "Scroll Amount:": "",
-    "Scroll Delay:": "",
-    "Slide": "",
-    "Speed Control": "",
-    "Text:": "",
-    "Width:": ""
-}
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/InsertMarquee/lang/lt.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/InsertMarquee/lang/lt.js
deleted file mode 100644
index 3b37f63..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/InsertMarquee/lang/lt.js
+++ /dev/null
@@ -1,17 +0,0 @@
-// I18N constants
-// LANG: "lt", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Cancel": "Atšaukti",
-    "OK": "OK",
-    "__OBSOLETE__": {
-        "___ TRANSLATOR NOTE   ___": "*** INSERTMARQUEE IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***"
-    }
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/InsertMarquee/lang/lv.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/InsertMarquee/lang/lv.js
deleted file mode 100644
index 4149f7d..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/InsertMarquee/lang/lv.js
+++ /dev/null
@@ -1,17 +0,0 @@
-// I18N constants
-// LANG: "lv", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Cancel": "Atcelt",
-    "OK": "Labi",
-    "__OBSOLETE__": {
-        "___ TRANSLATOR NOTE   ___": "*** INSERTMARQUEE IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***"
-    }
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/InsertMarquee/lang/nb.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/InsertMarquee/lang/nb.js
deleted file mode 100644
index 4ab7187..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/InsertMarquee/lang/nb.js
+++ /dev/null
@@ -1,31 +0,0 @@
-// I18N constants
-// LANG: "nb", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Background-Color:": "Bakgrunnsfarge:",
-    "Behavior:": "Oppførsel:",
-    "Cancel": "Avbryt",
-    "Direction:": "Rettning:",
-    "Height:": "Høyde:",
-    "Insert scrolling marquee": "Sett inn rulletekst",
-    "Left": "Venstre",
-    "Name": "Navn",
-    "Name/ID:": "Navn/ID:",
-    "OK": "OK",
-    "Right": "Høyre",
-    "Scroll Amount:": "Hastighet:",
-    "Scroll Delay:": "Forsinkelse:",
-    "Speed Control": "Egenskaper for hastigheten til rulleteksten",
-    "Text:": "Tekst:",
-    "Width:": "Bredde:",
-    "__OBSOLETE__": {
-        "Insert marquee": "Sett inn rulletekst"
-    }
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/InsertMarquee/lang/nl.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/InsertMarquee/lang/nl.js
deleted file mode 100644
index 5f50da5..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/InsertMarquee/lang/nl.js
+++ /dev/null
@@ -1,31 +0,0 @@
-// I18N constants
-// LANG: "nl", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Background-Color:": "Achtergrondkleur:",
-    "Behavior:": "Gedrag:",
-    "Cancel": "Annuleren",
-    "Direction:": "Richting:",
-    "Height:": "Hoogte:",
-    "Insert scrolling marquee": "Scrollende tekst invoegen",
-    "Left": "Links",
-    "Name": "Naame",
-    "Name/ID:": "Naam/ID:",
-    "OK": "OK",
-    "Right": "Rechts",
-    "Scroll Amount:": "Snelheid:",
-    "Scroll Delay:": "Vertraging:",
-    "Speed Control": "Snelheidscontrole",
-    "Text:": "Tekst:",
-    "Width:": "Breedte:",
-    "__OBSOLETE__": {
-        "Insert marquee": "Tekst invoegen"
-    }
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/InsertMarquee/lang/pl.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/InsertMarquee/lang/pl.js
deleted file mode 100644
index c60f217..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/InsertMarquee/lang/pl.js
+++ /dev/null
@@ -1,22 +0,0 @@
-// I18N constants
-// LANG: "pl", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Cancel": "Anuluj",
-    "Height:": "Wysokość:",
-    "Left": "Do lewej",
-    "Name": "Nazwa",
-    "OK": "OK",
-    "Right": "Do prawej",
-    "Width:": "Szerokość:",
-    "__OBSOLETE__": {
-        "___ TRANSLATOR NOTE   ___": "*** INSERTMARQUEE IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***"
-    }
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/InsertMarquee/lang/pt_br.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/InsertMarquee/lang/pt_br.js
deleted file mode 100644
index 66581f3..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/InsertMarquee/lang/pt_br.js
+++ /dev/null
@@ -1,32 +0,0 @@
-// I18N constants
-// LANG: "pt_br", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Alternate": "Alternativo",
-    "Background-Color:": "Côr de Fundo:",
-    "Behavior:": "Comportamento:",
-    "Cancel": "Cancelar",
-    "Continuous": "Contínuo",
-    "Direction:": "Direção:",
-    "Height:": "Altura:",
-    "Insert scrolling marquee": "Inserir faixa rolante",
-    "Left": "Esquerda",
-    "Marquee Editor": "Editor de Faixas",
-    "Name": "Nome",
-    "Name/ID:": "Nome/ID:",
-    "OK": "OK",
-    "Right": "Direita",
-    "Scroll Amount:": "Quantidade de Rolagem:",
-    "Scroll Delay:": "Atrazo de Rolagem:",
-    "Slide": "Corrediço",
-    "Speed Control": "Controle de Velocidade",
-    "Text:": "Texto:",
-    "Width:": "Largura:"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/InsertMarquee/lang/ro.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/InsertMarquee/lang/ro.js
deleted file mode 100644
index 0e91b48..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/InsertMarquee/lang/ro.js
+++ /dev/null
@@ -1,21 +0,0 @@
-// I18N constants
-// LANG: "ro", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Cancel": "Renunţă",
-    "Height:": "Înălţimea",
-    "Left": "Stânga",
-    "OK": "Acceptă",
-    "Right": "Dreapta",
-    "Width:": "Lăţime",
-    "__OBSOLETE__": {
-        "___ TRANSLATOR NOTE   ___": "*** INSERTMARQUEE IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***"
-    }
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/InsertMarquee/lang/ru.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/InsertMarquee/lang/ru.js
deleted file mode 100644
index c2d1932..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/InsertMarquee/lang/ru.js
+++ /dev/null
@@ -1,21 +0,0 @@
-// I18N constants
-// LANG: "ru", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Cancel": "Отмена",
-    "Height:": "Высота",
-    "Left": "По левому краю",
-    "OK": "OK",
-    "Right": "По правому краю",
-    "Width:": "Ширина",
-    "__OBSOLETE__": {
-        "___ TRANSLATOR NOTE   ___": "*** INSERTMARQUEE IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***"
-    }
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/InsertMarquee/lang/sh.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/InsertMarquee/lang/sh.js
deleted file mode 100644
index 6e59fdf..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/InsertMarquee/lang/sh.js
+++ /dev/null
@@ -1,20 +0,0 @@
-// I18N constants
-// LANG: "sh", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Cancel": "Poništi",
-    "Left": "Levo",
-    "OK": "OK",
-    "Right": "Desno",
-    "Width:": "Širina",
-    "__OBSOLETE__": {
-        "___ TRANSLATOR NOTE   ___": "*** INSERTMARQUEE IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***"
-    }
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/InsertMarquee/lang/si.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/InsertMarquee/lang/si.js
deleted file mode 100644
index 2c5b1d2..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/InsertMarquee/lang/si.js
+++ /dev/null
@@ -1,17 +0,0 @@
-// I18N constants
-// LANG: "si", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Cancel": "Prekliči",
-    "OK": "V redu",
-    "__OBSOLETE__": {
-        "___ TRANSLATOR NOTE   ___": "*** INSERTMARQUEE IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***"
-    }
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/InsertMarquee/lang/sr.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/InsertMarquee/lang/sr.js
deleted file mode 100644
index d62b90a..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/InsertMarquee/lang/sr.js
+++ /dev/null
@@ -1,20 +0,0 @@
-// I18N constants
-// LANG: "sr", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Cancel": "Поништи",
-    "Left": "Лево",
-    "OK": "OK",
-    "Right": "Десно",
-    "Width:": "Ширина",
-    "__OBSOLETE__": {
-        "___ TRANSLATOR NOTE   ___": "*** INSERTMARQUEE IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***"
-    }
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/InsertMarquee/lang/sv.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/InsertMarquee/lang/sv.js
deleted file mode 100644
index 262aae9..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/InsertMarquee/lang/sv.js
+++ /dev/null
@@ -1,21 +0,0 @@
-// I18N constants
-// LANG: "sv", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Cancel": "Avbryt",
-    "Height:": "Höjd:",
-    "Left": "Venster",
-    "OK": "OK",
-    "Right": "Höger",
-    "Width:": "Bredd:",
-    "__OBSOLETE__": {
-        "___ TRANSLATOR NOTE   ___": "*** INSERTMARQUEE IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***"
-    }
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/InsertMarquee/lang/th.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/InsertMarquee/lang/th.js
deleted file mode 100644
index 0f012b2..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/InsertMarquee/lang/th.js
+++ /dev/null
@@ -1,17 +0,0 @@
-// I18N constants
-// LANG: "th", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Cancel": "ยกเลิก",
-    "OK": "ตกลง",
-    "__OBSOLETE__": {
-        "___ TRANSLATOR NOTE   ___": "*** INSERTMARQUEE IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***"
-    }
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/InsertMarquee/lang/tr.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/InsertMarquee/lang/tr.js
deleted file mode 100644
index da19635..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/InsertMarquee/lang/tr.js
+++ /dev/null
@@ -1,21 +0,0 @@
-// I18N constants
-// LANG: "tr", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Cancel": "İptal",
-    "Height:": "Yükseklik",
-    "Left": "Sola",
-    "OK": "Tamam",
-    "Right": "Sağa",
-    "Width:": "Genişlik:",
-    "__OBSOLETE__": {
-        "___ TRANSLATOR NOTE   ___": "*** INSERTMARQUEE IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***"
-    }
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/InsertMarquee/lang/vn.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/InsertMarquee/lang/vn.js
deleted file mode 100644
index fb613a1..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/InsertMarquee/lang/vn.js
+++ /dev/null
@@ -1,17 +0,0 @@
-// I18N constants
-// LANG: "vn", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Cancel": "Hủy",
-    "OK": "Đồng ý",
-    "__OBSOLETE__": {
-        "___ TRANSLATOR NOTE   ___": "*** INSERTMARQUEE IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***"
-    }
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/InsertMarquee/lang/zh_cn.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/InsertMarquee/lang/zh_cn.js
deleted file mode 100644
index 41913d3..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/InsertMarquee/lang/zh_cn.js
+++ /dev/null
@@ -1,15 +0,0 @@
-// I18N constants
-// LANG: "zh_cn", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "__OBSOLETE__": {
-        "___ TRANSLATOR NOTE   ___": "*** INSERTMARQUEE IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***"
-    }
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/InsertMarquee/popups/insert_marquee.html b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/InsertMarquee/popups/insert_marquee.html
deleted file mode 100644
index d787cf5..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/InsertMarquee/popups/insert_marquee.html
+++ /dev/null
@@ -1,99 +0,0 @@
-<html>

-<head>

-  <title>Marquee Editor</title>

-  <link rel="stylesheet" type="text/css" href="../../../popups/popup.css" />

-  <script type="text/javascript" src="../../../popups/popup.js"></script>

-

-<script type="text/javascript">

-

-var fields = ["f_name", "f_text", "f_direction", "f_behavior", "f_bgcolor", "f_width", "f_height", "f_scrollamount", "f_scrolldelay"];

-

-function Init() {

-  window.resizeTo(350, 380);

-  __dlg_translate('InsertMarquee');

-	__dlg_init();

-  var param = window.dialogArguments;

-  for (var i in fields) {

-    document.getElementById(fields[i]).value = param[fields[i]];

-  }

- 	document.getElementById("f_name").focus();

-}

-

-function onOK() {

-  var required = {

-    "f_name": "You must enter the form name"

-  };

-  for (var i in required) {

-	  var el = document.getElementById(i);

-	  if (!el.value) {

-		alert(HTMLArea._lc(required[i], 'InsertMarquee'));

-		el.focus();

-		return false;

-	  }

-  }

-  // pass data back to the calling window

-  var param = new Object();

-  for (var i in fields) {

-    param[fields[i]] = document.getElementById(fields[i]).value;

-  }

-  __dlg_close(param);

-  return false;

-}

-

-function onCancel() {

-  __dlg_close(null);

-  return false;

-}

-

-</script>

-<style type="text/css">

-.fr { width: 9em; float: left; padding: 2px 5px; text-align: right; }

-</style>

-</head>

-<body class="dialog" onload="Init()">

-<div class="title">Marquee Editor</div>

-<form>

-  <div class="fr">Name/ID:</div>

-  <input type="text" name="name" id="f_name" size="20" title="Name" value="" />

-  <p />

-  <div class="fr">Direction:</div>

-  <select id="f_direction" name="direction">

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

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

-  </select>

-  <p />

-  <div class="fr">Behavior:</div>

-  <select id="f_behavior" name="behavior">

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

-   	<option value="slide">Slide</option>

-   	<option value="alternate">Alternate</option>

-  </select>

-  <p />

-  <div class="fr">Text:</div>

-  <input type="text" id="f_text" name="text" value="" size="30" />

-  <p />

-  <div class="fr">Background-Color:</div>

-  <input type="text" id="f_bgcolor" name="bgcolor" value="" size="30" />

-  <p />

-  <div class="fr">Width:</div>

-  <input type="text" id="f_width" name="width" value="100" size="5" maxlength="4" />

-  <p />

-  <div class="fr">Height:</div>

-  <input type="text" id="f_height" name="height" value="100" size="5" maxlength="4" />

-  <p />

-  <fieldset>

-  <legend>Speed Control</legend>

-    <div class="fr">Scroll Amount:</div>

-    <input type="text" id="f_scrollamount" name="scrollamount" value="100" maxlength="4" />

-    <p />

-    <div class="fr">Scroll Delay:</div>

-    <input type="text" id="f_scrolldelay" name="scrolldelay" value="100" maxlength="4" />

-    <p />

-  </fieldset>  

-<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-1.5.1/unsupported_plugins/InsertPicture/InsertPicture.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/InsertPicture/InsertPicture.js
deleted file mode 100644
index 8324559..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/InsertPicture/InsertPicture.js
+++ /dev/null
@@ -1,25 +0,0 @@
-// Insert Image plugin for Xinha

-// Original Author - Udo Schmal

-//

-// (c) www.Schaffrath-NeueMedien.de  2004

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

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

-

-function InsertPicture(editor) {

-  if ( typeof _editor_picturePath !== "string" )

-    _editor_picturePath = Xinha.getPluginDir("InsertPicture") + "/demo_pictures/";

-  InsertPicture.Scripting = "php"; //else "asp"

-  editor.config.URIs.insert_image =  '../plugins/InsertPicture/InsertPicture.' + InsertPicture.Scripting + '?picturepath=' + _editor_picturePath;

-}

-

-InsertPicture._pluginInfo = {

-  name          : "InsertPicture",

-  version       : "1.0.2",

-  developer     : "Udo Schmal",

-  developer_url : "http://www.Schaffrath-NeueMedien.de/",

-  sponsor       : "L.N.Schaffrath NeueMedien",

-  sponsor_url   : "http://www.schaffrath-neuemedien.de/",

-  c_owner       : "Udo Schmal",

-  license       : "htmlArea"

-};

-

diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/InsertPicture/InsertPicture.php b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/InsertPicture/InsertPicture.php
deleted file mode 100644
index e2e3e5b..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/InsertPicture/InsertPicture.php
+++ /dev/null
@@ -1,317 +0,0 @@
-<?PHP
-  
-  
-  die('Developer, this plugin InsertPicture has been deprecated.  You are STRONGLY advised to use ImageManager plugin instead.  If you really must continue using this plugin, please edit xinha/unsupported_plugins/InsertPicture/InsertPicture.php to remove this notice.');
-  
-  /* DEVELOPER!
-   * 
-   * InsertPicture is probably insecure.  There havn't been reports of it being attacked, but 
-   * really it is not very good.  If you enable this plugin (by commenting out the die statement above)
-   * you are probably dicing with death.
-   *
-   * ImageManager is recommended to replace this plugin.  This plugin will be removed at a time
-   * in the future.
-   *
-   */
-  
-  //this plugin only use the relativ webpath to the picturefolder
-  //default ~  /Xinha/plugins/InsertPicture/demo_pictures/
-  strstr( PHP_OS, "WIN") ? $strPathSeparator = "\\" : $strPathSeparator = "/";
-  if (isset($_REQUEST['picturepath'])) {
-    $PicturePath = $_REQUEST['picturepath'];
-
-    $AInsertPicturePath = explode ('/', dirname($_SERVER['PHP_SELF']));
-    $ALocalInsertPicturePath = explode($strPathSeparator, dirname(__FILE__));
-    $AtheRootPath = array_values (array_diff ($ALocalInsertPicturePath, $AInsertPicturePath));
-    $RootPath = implode($strPathSeparator, $AtheRootPath);
-
-    $LocalPicturePath = str_replace('http://'.$_SERVER['HTTP_HOST'], "", $PicturePath);
-    $LocalPicturePath = str_replace('/', $strPathSeparator, $LocalPicturePath);
-    $LocalPicturePath = $RootPath.$LocalPicturePath;
-
-    $LocalPicturePath = dirname(__FILE__).$strPathSeparator.'demo_pictures'.$strPathSeparator;
-    //$LocalPicturePath = realpath('../../../../images/content/').$strPathSeparator;
-  }
-  $limitedext = array(".gif",".jpg",".png",".jpeg"); //Extensions you want files uploaded limited to.
-  $limitedsize = "1000000"; //size limit in bytes
-  $message = "";
-
-  function formatSize($size)
-  {
-    if($size < 1024)
-      return $size.' bytes';
-    else if($size >= 1024 && $size < 1024*1024)
-      return sprintf('%01.2f',$size/1024.0).' Kb';
-    else
-      return sprintf('%01.2f',$size/(1024.0*1024)).' Mb';
-  }
-  $DestFileName = "";
-  if (isset($_FILES['file'])) {
-    $file = $_FILES['file'];
-    $ext = strrchr($file['name'],'.');
-    if (!in_array($ext,$limitedext))
-      $message = "The file you are uploading doesn't have the correct extension.";
-    else if (file_exists($LocalPicturePath.$file['name']))
-      $message = "The file you are uploading already exists.";
-    else if ($file['size'] > $limitedsize)
-      $message = "The file you are uploading is to big. The max Filesize is</span><span> ".formatSize($limitedsize).".";
-    else
-      copy($file['tmp_name'], $LocalPicturePath.$file['name']);
-    $DestFileName = $file['name'];
-  }
-?>
-<html>
-<head>
-  <title>Insert Image</title>
-<link rel="stylesheet" type="text/css" href="../../popups/popup.css" />
-<script type="text/javascript" src="../../popups/popup.js"></script>
-
-<script type="text/javascript">
-  window.resizeTo(500, 490);
-var Xinha = window.opener.Xinha;
-function i18n(str) {
-  return (Xinha._lc(str, 'InsertPicture'));
-}
-
-function Init() {
-  __dlg_translate("InsertPicture");
-  __dlg_init();
-
-  // Make sure the translated string appears in the drop down. (for gecko)
-  document.getElementById("f_align").selectedIndex = 0;
-  document.getElementById("f_align").selectedIndex = document.getElementById("f_align").selectedIndex;
-  var param = window.dialogArguments;
-  if (param) {
-      document.getElementById("f_url").value = param["f_url"];
-      document.getElementById("f_alt").value = param["f_alt"];
-      document.getElementById("f_border").value = param["f_border"];
-      document.getElementById("f_align").value = param["f_align"];
-      document.getElementById("f_vert").value = (param["f_vert"]!="-1") ? param["f_vert"] : "";
-      document.getElementById("f_horiz").value = (param["f_horiz"]!="-1") ? param["f_horiz"] : "";
-      document.getElementById("f_height").value = param["f_height"];
-      document.getElementById("f_width").value = param["f_width"];
-      window.ipreview.location.replace(param.f_url);
-  }
-  document.getElementById("f_url").focus();
-  document.getElementById("filelist").selectedIndex = document.getElementById("filelist").selectedIndex;
-<?php If ($DestFileName<>"")
-  echo "CopyToURL(\"".$PicturePath.$DestFileName."\");"
-?>
-}
-
-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", "f_width", "f_height"];
-  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 onUpload() {
-  var required = {
-    "file": i18n("Please select a file to upload.")
-  };
-  for (var i in required) {
-    var el = document.getElementById(i);
-    if (!el.value) {
-      alert(required[i]);
-      el.focus();
-      return false;
-    }
-  }
-  return true;
-}
-
-function onCancel() {
-  __dlg_close(null);
-  return false;
-}
-
-function onPreview() {
-  var f_url = document.getElementById("f_url");
-  var url = f_url.value;
-  if (!url) {
-    alert(i18n("You must enter the URL"));
-    f_url.focus();
-    return false;
-  }
-  if (document.all) {
-    window.ipreview.location.replace('viewpicture.html?'+url);
-  } else {
-    window.ipreview.location.replace(url);
-  }
-  return false;
-}
-
-var img = new Image();
-function imgWait() {
-  waiting = window.setInterval("imgIsLoaded()", 1000)
-}
-function imgIsLoaded() {
-  if(img.width > 0) {
-    window.clearInterval(waiting)
-    document.getElementById("f_width").value = img.width;
-    document.getElementById("f_height").value = img.height;
-  }
-}
-
-function CopyToURL(imgName) {
-  document.getElementById("f_url").value = imgName;
-  onPreview();
-  img.src = imgName;
-  img.onLoad = imgWait()
-}
-
-function openFile() {
-  window.open(document.getElementById("f_url").value,'','');
-}
-</script>
-</head>
-<body class="dialog" onload="Init()">
-<div class="title">Insert Image</div>
-<table border="0" width="100%" style="padding: 0px; margin: 0px">
-  <tbody>
-  <tr>
-    <td>Images on the Server:<?php /*echo $LocalPicturePath*/ ?><br>
-    <select id="filelist" name="filelist" style="width:200" size="10" onClick="CopyToURL(this[this.selectedIndex].value);">
-<?php
-  $d = @dir($LocalPicturePath);
-  while (false !== ($entry = $d->read())) {
-    if(substr($entry,0,1) != '.') {  //not a dot file or directory
-      if ($entry == $DestFileName)
-        // Split to stop lc_parse_strings picking it up
-        echo '<OP'.'TION value="' . $PicturePath.$entry. '" selected="selected">' . $entry . '(' . formatSize(filesize($LocalPicturePath.'\\'.$entry)) .')</OPTION>';
-      else
-        echo '<OP'.'TION value="' . $PicturePath.$entry. '">' . $entry . '(' . formatSize(filesize($LocalPicturePath.'\\'.$entry)) .')</OPTION>';
-    }
-  }
-  $d->close();
-?>
-    </select>
-
-      <form method="post" action="" enctype="multipart/form-data">
-        <input type="hidden" name="localpicturepath" value="<?php echo $LocalPicturePath ?>">
-        <input type="hidden" name="picturepath" value="<?php echo $PicturePath ?>">
-        <input type="file" name="file" id="file" size="30"><br>
-        <button type="submit" name="ok" onclick="onUpload();">Upload file</button><br>
-        <span><?php echo $message ?></span>
-      </form>
-
-    </td>
-    <td style="vertical-align: middle;" width="200" height="230">
-    <span>Image Preview:</span>
-    <a href="#" onClick="javascript:openFile();"title=" Open file in new window"><img src="img/btn_open.gif"  width="18" height="18" border="0" title="Open file in new window" /></a><br />
-    <iframe name="ipreview" id="ipreview" frameborder="0" style="border : 1px solid gray;" height="200" width="200" src=""></iframe>
-    </td>
-  </tr>
-  </tbody>
-</table>
-
-<form action="" method="get">
-  <input type="hidden" name="localpicturepath" value="<?php echo $LocalPicturePath ?>">
-  <input type="hidden" name="picturepath" value="<?php echo $PicturePath ?>">
-<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"  value="<?php echo $PicturePath.$DestFileName ?>"/>
-      <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>
-
-<p />
-
-<fieldset style="float: left; margin-left: 5px;">
-<legend>Layout</legend>
-
-<div class="space"></div>
-
-<div class="fl" style="width: 6em;">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"                     >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" style="width: 6em;">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 style="float: left; margin-left: 5px;">
-<legend>Size</legend>
-
-<div class="space"></div>
-
-<div class="fl" style="width: 5em;">Width:</div>
-<input type="text" name="width" id="f_width" size="5" title="Leave empty for not defined" />
-<p />
-
-<div class="fl" style="width: 5em;">Height:</div>
-<input type="text" name="height" id="f_height" size="5" title="Leave empty for not defined" />
-<div class="space"></div>
-
-</fieldset>
-
-<fieldset style="float:right; margin-right: 5px;">
-<legend>Spacing</legend>
-
-<div class="space"></div>
-
-<div class="fr" style="width: 5em;">Horizontal:</div>
-<input type="text" name="horiz" id="f_horiz" size="5" title="Horizontal padding" />
-<p />
-
-<div class="fr" style="width: 5em;">Vertical:</div>
-<input type="text" name="vert" id="f_vert" size="5" title="Vertical padding" />
-
-<div class="space"></div>
-
-</fieldset>
-<br clear="all" />
-
-<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-1.5.1/unsupported_plugins/InsertPicture/demo_pictures/bikerpeep.jpg b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/InsertPicture/demo_pictures/bikerpeep.jpg
deleted file mode 100644
index a2e7028..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/InsertPicture/demo_pictures/bikerpeep.jpg
+++ /dev/null
Binary files differ
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/InsertPicture/demo_pictures/wesnoth078.jpg b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/InsertPicture/demo_pictures/wesnoth078.jpg
deleted file mode 100644
index ea37d1a..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/InsertPicture/demo_pictures/wesnoth078.jpg
+++ /dev/null
Binary files differ
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/InsertPicture/img/btn_open.gif b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/InsertPicture/img/btn_open.gif
deleted file mode 100644
index 2056f2c..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/InsertPicture/img/btn_open.gif
+++ /dev/null
Binary files differ
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/InsertPicture/img/nopic.gif b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/InsertPicture/img/nopic.gif
deleted file mode 100644
index d4e8a78..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/InsertPicture/img/nopic.gif
+++ /dev/null
Binary files differ
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/InsertPicture/lang/b5.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/InsertPicture/lang/b5.js
deleted file mode 100644
index e780fde..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/InsertPicture/lang/b5.js
+++ /dev/null
@@ -1,15 +0,0 @@
-// I18N constants
-// LANG: "b5", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "__OBSOLETE__": {
-        "___ TRANSLATOR NOTE   ___": "*** INSERTPICTURE IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***"
-    }
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/InsertPicture/lang/ch.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/InsertPicture/lang/ch.js
deleted file mode 100644
index a2a88ab..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/InsertPicture/lang/ch.js
+++ /dev/null
@@ -1,17 +0,0 @@
-// I18N constants
-// LANG: "ch", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Cancel": "取消",
-    "OK": "好",
-    "__OBSOLETE__": {
-        "___ TRANSLATOR NOTE   ___": "*** INSERTPICTURE IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***"
-    }
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/InsertPicture/lang/cz.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/InsertPicture/lang/cz.js
deleted file mode 100644
index 116f2f2..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/InsertPicture/lang/cz.js
+++ /dev/null
@@ -1,28 +0,0 @@
-// I18N constants
-// LANG: "cz", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Baseline": "Základní linka",
-    "Bottom": "Dolů",
-    "Cancel": "Zrušit",
-    "Height:": "Výška",
-    "Image URL:": "Adresa obrázku",
-    "Layout": "Rozložení",
-    "Left": "Vlevo",
-    "Middle": "Na střed",
-    "OK": "OK",
-    "Right": "Vpravo",
-    "Spacing": "Mezery",
-    "Top": "Nahoru",
-    "Width:": "Šířka",
-    "__OBSOLETE__": {
-        "___ TRANSLATOR NOTE   ___": "*** INSERTPICTURE IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***"
-    }
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/InsertPicture/lang/da.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/InsertPicture/lang/da.js
deleted file mode 100644
index 405fb49..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/InsertPicture/lang/da.js
+++ /dev/null
@@ -1,48 +0,0 @@
-// I18N constants
-// LANG: "da", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Absbottom": "Bund",
-    "Absmiddle": "Centreret",
-    "Alignment:": "Justering:",
-    "Alternate text:": "Alternativ text:",
-    "Baseline": "Grundlinje",
-    "Border thickness:": "Kantbredde:",
-    "Bottom": "Tekstbund",
-    "Cancel": "Annuller",
-    "Enter the image URL here": "Angiv billedets URL",
-    "For browsers that don't support images": "for browsere der ikke understøtter billeder",
-    "Height:": "Højde:",
-    "Horizontal padding": "Vandret fyld",
-    "Horizontal:": "vandret:",
-    "Image Preview:": "Billede smugkig:",
-    "Image URL:": "Billede URL:",
-    "Insert Image": "Indsæt billede",
-    "Layout": "Layout",
-    "Leave empty for no border": "Tom hvis ingen kant",
-    "Left": "Venstre",
-    "Middle": "Midt",
-    "Not set": "Ubestemt",
-    "OK": "OK",
-    "Positioning of this image": "Billedets position",
-    "Preview": "Smugkig",
-    "Preview the image in a new window": "Smugkig af billedet i et nyt vindue",
-    "Right": "Højre",
-    "Size": "Størrelse",
-    "Spacing": "Afstand",
-    "Texttop": "Teksttop",
-    "Top": "Top",
-    "Vertical padding": "Lodret fyld",
-    "Vertical:": "lodret:",
-    "Width:": "Bredde:",
-    "__OBSOLETE__": {
-        "___ TRANSLATOR NOTE   ___": "*** INSERTPICTURE IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***"
-    }
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/InsertPicture/lang/de.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/InsertPicture/lang/de.js
deleted file mode 100644
index 09160a3..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/InsertPicture/lang/de.js
+++ /dev/null
@@ -1,54 +0,0 @@
-// I18N constants
-// LANG: "de", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Absbottom": "unten bündig",
-    "Absmiddle": "mittig",
-    "Alignment:": "Ausrichtung:",
-    "Alternate text:": "Alternativer Text:",
-    "Baseline": "Grundlinie",
-    "Border thickness:": "Randstärke:",
-    "Bottom": "unten",
-    "Cancel": "Abbrechen",
-    "Enter the image URL here": "Bitte geben sie hier die Bild URL ein",
-    "For browsers that don't support images": "für Browser, die keine Bilder unterstützen",
-    "Height:": "Höhe",
-    "Horizontal padding": "horizontaler Inhaltsabstand",
-    "Horizontal:": "horizontal:",
-    "Image Preview:": "Bild Voransicht:",
-    "Image URL:": "Bild URL:",
-    "Insert Image": "Bild einfügen",
-    "Layout": "Gestaltung",
-    "Leave empty for no border": "leer lassen für keinen Rand",
-    "Left": "links",
-    "Middle": "zentriert",
-    "Not set": "nicht eingestellt",
-    "OK": "OK",
-    "Open file in new window": "Datei in neuen Fenster anzeigen",
-    "Positioning of this image": "Anordnung dieses Bildes",
-    "Preview": "Vorschau",
-    "Preview the image in a new window": "Voransicht des Bildes in einem neuen Fenster",
-    "Right": "rechts",
-    "Size": "Größe",
-    "Spacing": "Abstand",
-    "Texttop": "oben bündig",
-    "Top": "oben",
-    "Upload file": "Datei hochladen",
-    "Vertical padding": "vertikaler Inhaltsabstand",
-    "Vertical:": "vertikal:",
-    "Width:": "Breite",
-    "__OBSOLETE__": {
-        "Images on the Server:": "Bilder auf dem Server:",
-        "Please select a file to upload.": "Wählen Sie eine Datei zum hochladen aus.",
-        "The file you are uploading already exists.": "Eine Datei mit diesem Namen existiert schon.",
-        "The file you are uploading doesn't have the correct extension.": "Die hochgeladene Datei ist im falschen Format.",
-        "The file you are uploading is to big. The max Filesize is": "Die hochgeladene Datei ist zu groß. Die maximakle Dateigröße beträgt"
-    }
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/InsertPicture/lang/ee.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/InsertPicture/lang/ee.js
deleted file mode 100644
index e142000..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/InsertPicture/lang/ee.js
+++ /dev/null
@@ -1,17 +0,0 @@
-// I18N constants
-// LANG: "ee", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Cancel": "Loobu",
-    "OK": "OK",
-    "__OBSOLETE__": {
-        "___ TRANSLATOR NOTE   ___": "*** INSERTPICTURE IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***"
-    }
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/InsertPicture/lang/el.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/InsertPicture/lang/el.js
deleted file mode 100644
index 651d659..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/InsertPicture/lang/el.js
+++ /dev/null
@@ -1,28 +0,0 @@
-// I18N constants
-// LANG: "el", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Baseline": "Baseline",
-    "Bottom": "Κάτω μέρος",
-    "Cancel": "Ακύρωση",
-    "Height:": "Ύψος",
-    "Image URL:": "URL εικόνας",
-    "Layout": "Διάταξη",
-    "Left": "Αριστερά",
-    "Middle": "Κέντρο",
-    "OK": "Εντάξει",
-    "Right": "Δεξιά",
-    "Spacing": "Αποστάσεις",
-    "Top": "Πάνω",
-    "Width:": "Πλάτος",
-    "__OBSOLETE__": {
-        "___ TRANSLATOR NOTE   ___": "*** INSERTPICTURE IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***"
-    }
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/InsertPicture/lang/es.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/InsertPicture/lang/es.js
deleted file mode 100644
index dbe90a0..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/InsertPicture/lang/es.js
+++ /dev/null
@@ -1,46 +0,0 @@
-// I18N constants
-// LANG: "es", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Absbottom": "Inferior absoluto",
-    "Absmiddle": "Medio Absoluto",
-    "Alignment:": "Alineación:",
-    "Alternate text:": "Texto alternativo:",
-    "Baseline": "Línea base",
-    "Border thickness:": "Tamaño del borde:",
-    "Bottom": "Inferior",
-    "Cancel": "Cancelar",
-    "For browsers that don't support images": "Para navegadores que no soportan imágenes",
-    "Height:": "Alto:",
-    "Horizontal padding": "Relleno horizontal",
-    "Horizontal:": "horizontal:",
-    "Image Preview:": "Previsualización de la imagen:",
-    "Image URL:": "Imagen URL:",
-    "Insert Image": "insertar imagen",
-    "Layout": "Distribución",
-    "Leave empty for no border": "Vacío si no desea ningún borde",
-    "Left": "Izquierda",
-    "Middle": "Medio",
-    "Not set": "No definido",
-    "OK": "Aceptar",
-    "Positioning of this image": "Posición de la imagen",
-    "Preview": "Previsualizar",
-    "Preview the image in a new window": "Previsualizar en una nueva ventana",
-    "Right": "Derecha",
-    "Spacing": "Espaciado",
-    "Texttop": "Texto Superior",
-    "Top": "Superior",
-    "Vertical padding": "Relleno Vertical",
-    "Vertical:": "Vertical:",
-    "Width:": "Ancho:",
-    "__OBSOLETE__": {
-        "___ TRANSLATOR NOTE   ___": "*** INSERTPICTURE IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***"
-    }
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/InsertPicture/lang/eu.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/InsertPicture/lang/eu.js
deleted file mode 100644
index c20960d..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/InsertPicture/lang/eu.js
+++ /dev/null
@@ -1,46 +0,0 @@
-// I18N constants
-// LANG: "eu", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Absbottom": "Irudiaren behekaldean",
-    "Absmiddle": "Irudiaren erdian",
-    "Alignment:": "Lerrokatzea:",
-    "Alternate text:": "Testu alternatiboa:",
-    "Baseline": "Irudiaren oinean",
-    "Border thickness:": "Ertzaren lodiera:",
-    "Bottom": "Behean",
-    "Cancel": "Utzi",
-    "Enter the image URL here": "Idatz ezazu irudiaren URL-a hemen",
-    "For browsers that don't support images": "Irudirik onartzen ez duten nabigatzaileentzat",
-    "Horizontal padding": "Betegarri horizontala",
-    "Horizontal:": "Horizontala:",
-    "Image Preview:": "Irudiaren aurrebista:",
-    "Image URL:": "Irudiaren URL-a:",
-    "Insert Image": "Irudia txertatu",
-    "Layout": "Diseinua",
-    "Leave empty for no border": "Uztazu hutsik ertzik ez sortzeko",
-    "Left": "Ezkerretara",
-    "Middle": "Erdian",
-    "Not set": "Ez gaitua",
-    "OK": "Ados",
-    "Positioning of this image": "Irudiaren kokapena",
-    "Preview": "Aurrebista",
-    "Preview the image in a new window": "Aurreikusi irudia beste lehio batean",
-    "Right": "Eskuinetara",
-    "Spacing": "Tartea",
-    "Texttop": "Irudiaren goialdean",
-    "Top": "Goian",
-    "Vertical padding": "Betegarri bertikala",
-    "Vertical:": "Bertikala:",
-    "Width:": "Zabalera:",
-    "__OBSOLETE__": {
-        "___ TRANSLATOR NOTE   ___": "*** INSERTPICTURE IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***"
-    }
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/InsertPicture/lang/fa.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/InsertPicture/lang/fa.js
deleted file mode 100644
index 52e79e9..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/InsertPicture/lang/fa.js
+++ /dev/null
@@ -1,46 +0,0 @@
-// I18N constants
-// LANG: "fa", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Absbottom": "دقیقا پایین",
-    "Absmiddle": "دقیقا وسط",
-    "Alignment:": "تراز بندی",
-    "Alternate text:": "متن جایگزین",
-    "Baseline": "ابتدای خط",
-    "Border thickness:": "ضخامت لبه",
-    "Bottom": "پایین",
-    "Cancel": "انصراف",
-    "Enter the image URL here": "URL تصویر را اینجا وارد کنید",
-    "For browsers that don't support images": "برای مرورگرهایی که از تصاویر پشتیبانی نمی کنند",
-    "Horizontal padding": "پرکننده افقی",
-    "Horizontal:": "افقی",
-    "Image Preview:": "پیش نمایش تصویر",
-    "Image URL:": "URL تصویر",
-    "Insert Image": "افزودن تصویر",
-    "Layout": "لایه",
-    "Leave empty for no border": "برای بدون لبه خالی رها کن",
-    "Left": "چپ",
-    "Middle": "وسط",
-    "Not set": "تنظیم نشده",
-    "OK": "بله",
-    "Positioning of this image": "موقعیت یابی تصویر",
-    "Preview": "پیش نمایش",
-    "Preview the image in a new window": "پیش نمایش تصویر در پنجره ای جدید",
-    "Right": "راست",
-    "Spacing": "فاصله گذاری",
-    "Texttop": "بالای متن",
-    "Top": "بالا",
-    "Vertical padding": "پرکننده عمودی",
-    "Vertical:": "عمودی",
-    "Width:": "طول",
-    "__OBSOLETE__": {
-        "___ TRANSLATOR NOTE   ___": "*** INSERTPICTURE IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***"
-    }
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/InsertPicture/lang/fi.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/InsertPicture/lang/fi.js
deleted file mode 100644
index b758cc2..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/InsertPicture/lang/fi.js
+++ /dev/null
@@ -1,27 +0,0 @@
-// I18N constants
-// LANG: "fi", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Baseline": "Takaraja",
-    "Bottom": "Alle",
-    "Cancel": "Peruuta",
-    "Image URL:": "Kuvan osoite",
-    "Layout": "Sommittelu",
-    "Left": "Vasen",
-    "Middle": "Keskelle",
-    "OK": "Hyväksy",
-    "Right": "Oikea",
-    "Spacing": "Palstatila",
-    "Top": "Ylös",
-    "Width:": "Leveys",
-    "__OBSOLETE__": {
-        "___ TRANSLATOR NOTE   ___": "*** INSERTPICTURE IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***"
-    }
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/InsertPicture/lang/fr.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/InsertPicture/lang/fr.js
deleted file mode 100644
index 7d1cb4c..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/InsertPicture/lang/fr.js
+++ /dev/null
@@ -1,54 +0,0 @@
-// I18N constants
-// LANG: "fr", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Absbottom": "Absbottom",
-    "Absmiddle": "Absmiddle",
-    "Alignment:": "Alignement",
-    "Alternate text:": "Texte alternatif",
-    "Baseline": "Baseline",
-    "Border thickness:": "Epaisseur bordure",
-    "Bottom": "Bas",
-    "Cancel": "Annuler",
-    "Enter the image URL here": "Entrer l'URL de l'image ici",
-    "For browsers that don't support images": "Pour les navigateurs qui ne supportent pas les images",
-    "Height:": "Hauteur",
-    "Horizontal padding": "Marge horizontale interne",
-    "Horizontal:": "Horizontal",
-    "Image Preview:": "Prévisualisation",
-    "Image URL:": "URL",
-    "Insert Image": "Insérer une image",
-    "Layout": "Layout",
-    "Leave empty for no border": "Laisser vide pour pas de bordure",
-    "Left": "Gauche",
-    "Middle": "Milieu",
-    "Not set": "Indéfini",
-    "OK": "OK",
-    "Open file in new window": "Ouvrir le fichier dans une nouvelle fenêtre",
-    "Positioning of this image": "Position de cette image",
-    "Preview": "Prévisualisation",
-    "Preview the image in a new window": "Prévisualiser l'image dans une nouvelle fenêtre",
-    "Right": "Droite",
-    "Size": "Taille",
-    "Spacing": "Espacement",
-    "Texttop": "Texttop",
-    "Top": "Haut",
-    "Upload file": "Télécharger",
-    "Vertical padding": "Marge verticale interne",
-    "Vertical:": "Vertical",
-    "Width:": "Largeur",
-    "__OBSOLETE__": {
-        "Images on the Server:": "Images sur le serveur",
-        "Please select a file to upload.": "Veuillez sélectionner un fichier a télécharger",
-        "The file you are uploading already exists.": "Le fichier que vous téléchargez existe déjà.",
-        "The file you are uploading doesn't have the correct extension.": "Le fichier que vous téléchargez ne possède pas la bonne extension.",
-        "The file you are uploading is to big. The max Filesize is": "Le fichier que vous uploadez est trop gros. La taille maximum est"
-    }
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/InsertPicture/lang/fr_ca.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/InsertPicture/lang/fr_ca.js
deleted file mode 100644
index e784c06..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/InsertPicture/lang/fr_ca.js
+++ /dev/null
@@ -1,15 +0,0 @@
-// I18N constants
-// LANG: "fr_ca", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "__OBSOLETE__": {
-        "___ TRANSLATOR NOTE   ___": "*** INSERTPICTURE IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***"
-    }
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/InsertPicture/lang/gb.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/InsertPicture/lang/gb.js
deleted file mode 100644
index 059c714..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/InsertPicture/lang/gb.js
+++ /dev/null
@@ -1,15 +0,0 @@
-// I18N constants
-// LANG: "gb", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "__OBSOLETE__": {
-        "___ TRANSLATOR NOTE   ___": "*** INSERTPICTURE IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***"
-    }
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/InsertPicture/lang/he.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/InsertPicture/lang/he.js
deleted file mode 100644
index 7b5d575..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/InsertPicture/lang/he.js
+++ /dev/null
@@ -1,28 +0,0 @@
-// I18N constants
-// LANG: "he", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Baseline": "קו בסיס",
-    "Bottom": "תחתון",
-    "Cancel": "ביטול",
-    "Height:": "גובה",
-    "Image URL:": "URL התמונה",
-    "Layout": "פריסה",
-    "Left": "שמאל",
-    "Middle": "אמצע",
-    "OK": "אישור",
-    "Right": "ימין",
-    "Spacing": "ריווח",
-    "Top": "עליון",
-    "Width:": "רוחב",
-    "__OBSOLETE__": {
-        "___ TRANSLATOR NOTE   ___": "*** INSERTPICTURE IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***"
-    }
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/InsertPicture/lang/hu.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/InsertPicture/lang/hu.js
deleted file mode 100644
index c1b8a65..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/InsertPicture/lang/hu.js
+++ /dev/null
@@ -1,17 +0,0 @@
-// I18N constants
-// LANG: "hu", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Cancel": "Mégsem",
-    "OK": "Rendben",
-    "__OBSOLETE__": {
-        "___ TRANSLATOR NOTE   ___": "*** INSERTPICTURE IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***"
-    }
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/InsertPicture/lang/it.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/InsertPicture/lang/it.js
deleted file mode 100644
index 939671f..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/InsertPicture/lang/it.js
+++ /dev/null
@@ -1,28 +0,0 @@
-// I18N constants
-// LANG: "it", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Baseline": "Allineamento",
-    "Bottom": "Basso",
-    "Cancel": "Annullamento",
-    "Height:": "Altezza",
-    "Image URL:": "URL dell'Immagine",
-    "Layout": "Layout",
-    "Left": "Sinistra",
-    "Middle": "Centrale",
-    "OK": "OK",
-    "Right": "Destra",
-    "Spacing": "Spaziatura",
-    "Top": "Alto",
-    "Width:": "Larghezza",
-    "__OBSOLETE__": {
-        "___ TRANSLATOR NOTE   ___": "*** INSERTPICTURE IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***"
-    }
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/InsertPicture/lang/ja.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/InsertPicture/lang/ja.js
deleted file mode 100644
index 19a2eb6..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/InsertPicture/lang/ja.js
+++ /dev/null
@@ -1,54 +0,0 @@
-// I18N constants
-// LANG: "ja", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Absbottom": "下(絶対的)",
-    "Absmiddle": "中央(絶対的)",
-    "Alignment:": "行揃え:",
-    "Alternate text:": "代替テキスト:",
-    "Baseline": "ベースライン",
-    "Border thickness:": "境界線の幅:",
-    "Bottom": "下",
-    "Cancel": "中止",
-    "Enter the image URL here": "画像のURLをここに入力します",
-    "For browsers that don't support images": "画像表示をサポートしないブラウザに必要です",
-    "Height:": "高さ:",
-    "Horizontal padding": "水平余白",
-    "Horizontal:": "水平:",
-    "Image Preview:": "画像プレビュー:",
-    "Image URL:": "画像URL:",
-    "Insert Image": "画像の挿入",
-    "Layout": "レイアウト",
-    "Leave empty for no border": "境界線がない場合は空のままにする",
-    "Left": "左",
-    "Middle": "中央",
-    "Not set": "なし",
-    "OK": "OK",
-    "Open file in new window": "新しいウィンドウでファイルを開く",
-    "Positioning of this image": "この画像の配置",
-    "Preview": "表示",
-    "Preview the image in a new window": "ウィンドウで画像を表示",
-    "Right": "右",
-    "Size": "サイズ",
-    "Spacing": "間隔",
-    "Texttop": "テキスト上部",
-    "Top": "上",
-    "Upload file": "UPLOAD FILE",
-    "Vertical padding": "垂直余白",
-    "Vertical:": "垂直:",
-    "Width:": "幅:",
-    "__OBSOLETE__": {
-        "Images on the Server:": "サーバ上の画像:",
-        "Please select a file to upload.": "アップロードするファイルを選択してください。",
-        "The file you are uploading already exists.": "アップロード対象ファイルはすでに存在します。",
-        "The file you are uploading doesn't have the correct extension.": "アップロード対象ファイルに正しい拡張子がありません。",
-        "The file you are uploading is to big. The max Filesize is": "アップロード対象ファイルは大きすぎます。ファイルサイズの上限:"
-    }
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/InsertPicture/lang/lc_base.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/InsertPicture/lang/lc_base.js
deleted file mode 100644
index 9686912..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/InsertPicture/lang/lc_base.js
+++ /dev/null
@@ -1,61 +0,0 @@
-// I18N constants
-//
-// LANG: "en", ENCODING: UTF-8
-// Author: Translator-Name, <email@example.com>
-//
-// Last revision: 2018-04-12
-// 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).
-//
-// (Please, remove information below)
-// 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.)
-
-{
-    " Open file in new window": "",
-    "Absbottom": "",
-    "Absmiddle": "",
-    "Alignment:": "",
-    "Alternate text:": "",
-    "Baseline": "",
-    "Border thickness:": "",
-    "Bottom": "",
-    "Cancel": "",
-    "Enter the image URL here": "",
-    "For browsers that don't support images": "",
-    "Height:": "",
-    "Horizontal padding": "",
-    "Horizontal:": "",
-    "Image Preview:": "",
-    "Image URL:": "",
-    "Insert Image": "",
-    "Layout": "",
-    "Leave empty for no border": "",
-    "Leave empty for not defined": "",
-    "Left": "",
-    "Middle": "",
-    "Not set": "",
-    "OK": "",
-    "Open file in new window": "",
-    "Positioning of this image": "",
-    "Preview": "",
-    "Preview the image in a new window": "",
-    "Right": "",
-    "Size": "",
-    "Spacing": "",
-    "Texttop": "",
-    "Top": "",
-    "Upload file": "",
-    "Vertical padding": "",
-    "Vertical:": "",
-    "Width:": ""
-}
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/InsertPicture/lang/lt.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/InsertPicture/lang/lt.js
deleted file mode 100644
index e04e418..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/InsertPicture/lang/lt.js
+++ /dev/null
@@ -1,17 +0,0 @@
-// I18N constants
-// LANG: "lt", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Cancel": "Atšaukti",
-    "OK": "OK",
-    "__OBSOLETE__": {
-        "___ TRANSLATOR NOTE   ___": "*** INSERTPICTURE IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***"
-    }
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/InsertPicture/lang/lv.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/InsertPicture/lang/lv.js
deleted file mode 100644
index 370a27d..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/InsertPicture/lang/lv.js
+++ /dev/null
@@ -1,17 +0,0 @@
-// I18N constants
-// LANG: "lv", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Cancel": "Atcelt",
-    "OK": "Labi",
-    "__OBSOLETE__": {
-        "___ TRANSLATOR NOTE   ___": "*** INSERTPICTURE IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***"
-    }
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/InsertPicture/lang/nb.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/InsertPicture/lang/nb.js
deleted file mode 100644
index 7c95ecc..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/InsertPicture/lang/nb.js
+++ /dev/null
@@ -1,44 +0,0 @@
-// I18N constants
-// LANG: "nb", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Alignment:": "Plassering",
-    "Alternate text:": "Alternativ tekst",
-    "Baseline": "Grunnlinje",
-    "Border thickness:": "Rammetykkelse:",
-    "Bottom": "Bunn",
-    "Cancel": "Avbryt",
-    "Height:": "Høyde:",
-    "Horizontal:": "Horisontal:",
-    "Image Preview:": "Forhåndsvisning:",
-    "Image URL:": "Bildets URL:",
-    "Insert Image": "Sett inn bilde",
-    "Layout": "Oppsett",
-    "Left": "Venstre",
-    "Middle": "Midten",
-    "OK": "OK",
-    "Open file in new window": "Åpne bilde i nytt vindu",
-    "Positioning of this image": "Bildepossisjon",
-    "Preview": "Forhåndsvisning",
-    "Right": "Høyre",
-    "Size": "Størrelse",
-    "Spacing": "Luft rundt bildet",
-    "Top": "Overkant",
-    "Upload file": "Last opp bilde",
-    "Vertical:": "Vertikal:",
-    "Width:": "Bredde:",
-    "__OBSOLETE__": {
-        "Images on the Server:": "Bilder på serveren:",
-        "Please select a file to upload.": "Velg bilde du skal laste opp",
-        "The file you are uploading already exists.": "Bildet du prøver å laste opp eksisterer allerede på serveren",
-        "The file you are uploading doesn't have the correct extension.": "Bildet du laster opp har et ugyldig format, opplastning avbrutt",
-        "The file you are uploading is to big. The max Filesize is": "Bildet du laster opp er for stort, maks tillatt størrelse er"
-    }
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/InsertPicture/lang/nl.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/InsertPicture/lang/nl.js
deleted file mode 100644
index 498ddba..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/InsertPicture/lang/nl.js
+++ /dev/null
@@ -1,50 +0,0 @@
-// I18N constants
-// LANG: "nl", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Alignment:": "Positie:",
-    "Alternate text:": "Alternatieve tekst:",
-    "Baseline": "Basis",
-    "Border thickness:": "Rand dikte:",
-    "Bottom": "Onder",
-    "Cancel": "Annuleren",
-    "Enter the image URL here": "Afbeeldingslocatie (URL)",
-    "For browsers that don't support images": "Voor browsers welke geen afbeeldingen ondersteunen",
-    "Height:": "Hoogte:",
-    "Horizontal padding": "Horizontale ruimte",
-    "Horizontal:": "Horizontaal:",
-    "Image Preview:": "Afbeeldingsvoorbeeld:",
-    "Image URL:": "Afbeelding URL:",
-    "Insert Image": "Afbeelding invoegen",
-    "Layout": "Weergave",
-    "Leave empty for no border": "Leeg voor geen rand",
-    "Leave empty for not defined": "Leeg voor niet gedefinieerd",
-    "Left": "Links",
-    "Middle": "Midden",
-    "OK": "OK",
-    "Positioning of this image": "Positie van de afbeelding",
-    "Preview": "Voorbeeld",
-    "Preview the image in a new window": "Afbeelding bekijken in nieuw venster",
-    "Right": "Rechts",
-    "Size": "Grootte",
-    "Spacing": "Marge",
-    "Top": "Boven",
-    "Upload file": "Upload bestand",
-    "Vertical padding": "Verticale ruimte",
-    "Vertical:": "Verticaal:",
-    "Width:": "Breedte:",
-    "__OBSOLETE__": {
-        "Images on the Server:": "Afbeeldingen op de server:",
-        "Please select a file to upload.": "Selecteer een bestand om te uploaden",
-        "The file you are uploading already exists.": "Het bestand dat is geupload bestaat al.",
-        "The file you are uploading doesn't have the correct extension.": "Het bestand dat is geupload heeft niet de juiste extentie.",
-        "The file you are uploading is to big. The max Filesize is": "Het bestand dat is geupload is te groot. De maximaal toegestane grootte is:"
-    }
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/InsertPicture/lang/pl.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/InsertPicture/lang/pl.js
deleted file mode 100644
index ab851bd..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/InsertPicture/lang/pl.js
+++ /dev/null
@@ -1,48 +0,0 @@
-// I18N constants
-// LANG: "pl", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Absbottom": "Abs. dół",
-    "Absmiddle": "Abs. środek",
-    "Alignment:": "Wyrównanie:",
-    "Alternate text:": "Tekst alternatywny:",
-    "Baseline": "Linia bazowa",
-    "Border thickness:": "Grubość obramowania:",
-    "Bottom": "Dół",
-    "Cancel": "Anuluj",
-    "Enter the image URL here": "Podaj URL obrazka",
-    "For browsers that don't support images": "Dla przeglądarek, które nie obsługują obrazków",
-    "Height:": "Wysokość:",
-    "Horizontal padding": "Wcięcie poziome",
-    "Horizontal:": "Poziome:",
-    "Image Preview:": "Podgląd obrazka:",
-    "Image URL:": "URL obrazka:",
-    "Insert Image": "Wstaw obrazek",
-    "Layout": "Layout",
-    "Leave empty for no border": "Bez ramek - zostaw puste",
-    "Left": "Do lewej",
-    "Middle": "Środek",
-    "Not set": "Nie ustawione",
-    "OK": "OK",
-    "Positioning of this image": "Wyrównanie tego obrazka na stronie",
-    "Preview": "Podgląd",
-    "Preview the image in a new window": "Podgląd obrazka w nowym oknie",
-    "Right": "Do prawej",
-    "Size": "Rozmiar",
-    "Spacing": "Odstęp",
-    "Texttop": "Góra tekstu",
-    "Top": "Góra",
-    "Vertical padding": "Wcięcie pionowe",
-    "Vertical:": "Pionowe:",
-    "Width:": "Szerokość:",
-    "__OBSOLETE__": {
-        "___ TRANSLATOR NOTE   ___": "*** INSERTPICTURE IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***"
-    }
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/InsertPicture/lang/pt_br.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/InsertPicture/lang/pt_br.js
deleted file mode 100644
index 4b14760..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/InsertPicture/lang/pt_br.js
+++ /dev/null
@@ -1,56 +0,0 @@
-// I18N constants
-// LANG: "pt_br", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    " Open file in new window": " Abrir arquivo em um nova janela",
-    "Absbottom": "Inferior Absoluto",
-    "Absmiddle": "Meio Absoluto",
-    "Alignment:": "Alinhamento:",
-    "Alternate text:": "Texto Alternativo:",
-    "Baseline": "Linha de Base",
-    "Border thickness:": "Espessura da Borda",
-    "Bottom": "Inferior",
-    "Cancel": "Cancelar",
-    "Enter the image URL here": "Entre aqui com a URL da imagem",
-    "For browsers that don't support images": "Para navegadores que não suportam imagens",
-    "Height:": "Altura:",
-    "Horizontal padding": "Espaço horizontal",
-    "Horizontal:": "Horizontal:",
-    "Image Preview:": "Visualização da Imagem:",
-    "Image URL:": "URL da Imagem:",
-    "Insert Image": "Inserir Imagem",
-    "Layout": "Esquema",
-    "Leave empty for no border": "Deixe em branco para sem bordas",
-    "Leave empty for not defined": "Deixe em branco para não definido",
-    "Left": "Esquerda",
-    "Middle": "Meio",
-    "Not set": "Não definido",
-    "OK": "OK",
-    "Open file in new window": "Abrir arquivo em uma nova janela",
-    "Positioning of this image": "Posicionamento desta imagem",
-    "Preview": "Visualização",
-    "Preview the image in a new window": "Visualizar imagem em uma nova janela",
-    "Right": "Direita",
-    "Size": "Tamanho",
-    "Spacing": "Espaço",
-    "Texttop": "Texto no topo",
-    "Top": "Topo",
-    "Upload file": "Enviar arquivo",
-    "Vertical padding": "Espaço vertical",
-    "Vertical:": "Vertical:",
-    "Width:": "Largura:",
-    "__OBSOLETE__": {
-        "Images on the Server:": "Imagens no Servidor:",
-        "Please select a file to upload.": "Por favor, selecione um arquivo para enviar.",
-        "The file you are uploading already exists.": "Já existe o arquivo que você está enviando.",
-        "The file you are uploading doesn't have the correct extension.": "O arquivo que você está enviando não possuia a extensão correta.",
-        "The file you are uploading is to big. The max Filesize is": "O arquivo que você está enviando é muito grande. O tamanho máximo é"
-    }
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/InsertPicture/lang/ro.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/InsertPicture/lang/ro.js
deleted file mode 100644
index f26499c..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/InsertPicture/lang/ro.js
+++ /dev/null
@@ -1,28 +0,0 @@
-// I18N constants
-// LANG: "ro", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Baseline": "Baseline",
-    "Bottom": "Jos",
-    "Cancel": "Renunţă",
-    "Height:": "Înălţimea",
-    "Image URL:": "URL-ul imaginii",
-    "Layout": "Aranjament",
-    "Left": "Stânga",
-    "Middle": "Mijloc",
-    "OK": "Acceptă",
-    "Right": "Dreapta",
-    "Spacing": "Între celule",
-    "Top": "Sus",
-    "Width:": "Lăţime",
-    "__OBSOLETE__": {
-        "___ TRANSLATOR NOTE   ___": "*** INSERTPICTURE IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***"
-    }
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/InsertPicture/lang/ru.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/InsertPicture/lang/ru.js
deleted file mode 100644
index 5d0c57f..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/InsertPicture/lang/ru.js
+++ /dev/null
@@ -1,47 +0,0 @@
-// I18N constants
-// LANG: "ru", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Absbottom": "По нижней границе",
-    "Absmiddle": "По середине текста",
-    "Alignment:": "Выравнивание",
-    "Alternate text:": "Альтернативный текст",
-    "Baseline": "По нижней границе текста",
-    "Border thickness:": "Толщина рамки",
-    "Bottom": "По нижнему краю",
-    "Cancel": "Отмена",
-    "Enter the image URL here": "Вставьте адрес изображения",
-    "For browsers that don't support images": "Для браузеров, которые не отображают картинки",
-    "Height:": "Высота",
-    "Horizontal padding": "Горизонтальные поля",
-    "Horizontal:": "По горизонтали",
-    "Image Preview:": "Предварительный просмотр",
-    "Image URL:": "URL изображения",
-    "Insert Image": "Вставка картинки",
-    "Layout": "Расположение",
-    "Leave empty for no border": "Оставьте пустым, чтобы убрать рамку",
-    "Left": "По левому краю",
-    "Middle": "Посредине",
-    "Not set": "Не установлено",
-    "OK": "OK",
-    "Positioning of this image": "Расположение изображения",
-    "Preview": "Предварительный просмотр",
-    "Preview the image in a new window": "Предварительный просмотр в отдельном окне",
-    "Right": "По правому краю",
-    "Spacing": "Отступы",
-    "Texttop": "По верхней границе текста",
-    "Top": "По верхнему краю",
-    "Vertical padding": "Вертикальные поля",
-    "Vertical:": "По вертикали",
-    "Width:": "Ширина",
-    "__OBSOLETE__": {
-        "___ TRANSLATOR NOTE   ___": "*** INSERTPICTURE IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***"
-    }
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/InsertPicture/lang/sh.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/InsertPicture/lang/sh.js
deleted file mode 100644
index 1b6d6f9..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/InsertPicture/lang/sh.js
+++ /dev/null
@@ -1,46 +0,0 @@
-// I18N constants
-// LANG: "sh", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Absbottom": "Apsolutno dno",
-    "Absmiddle": "Apsolutna sredina",
-    "Alignment:": "Ravnanje",
-    "Alternate text:": "Alternativni tekst",
-    "Baseline": "Donja linija",
-    "Border thickness:": "Debljina okvira",
-    "Bottom": "Dno",
-    "Cancel": "Poništi",
-    "Enter the image URL here": "Unesite URL slike ovde",
-    "For browsers that don't support images": "Za pretraživače koji ne podržavaju slike",
-    "Horizontal padding": "Horizontalno odstojanje",
-    "Horizontal:": "Po horizontali",
-    "Image Preview:": "Pregled slike",
-    "Image URL:": "URL slike",
-    "Insert Image": "Ubaci sliku",
-    "Layout": "Prelom",
-    "Leave empty for no border": "Ostavi prazno kad nema okvira",
-    "Left": "Levo",
-    "Middle": "Sredina",
-    "Not set": "Nije postavljeno",
-    "OK": "OK",
-    "Positioning of this image": "Postavljanje ove slike",
-    "Preview": "Pregled",
-    "Preview the image in a new window": "Pregledaj sliku u novom prozoru",
-    "Right": "Desno",
-    "Spacing": "Razmak",
-    "Texttop": "Vrh teksta",
-    "Top": "Vrh",
-    "Vertical padding": "Vertikalno odstojanje",
-    "Vertical:": "Po vertikali",
-    "Width:": "Širina",
-    "__OBSOLETE__": {
-        "___ TRANSLATOR NOTE   ___": "*** INSERTPICTURE IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***"
-    }
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/InsertPicture/lang/si.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/InsertPicture/lang/si.js
deleted file mode 100644
index c0427e5..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/InsertPicture/lang/si.js
+++ /dev/null
@@ -1,17 +0,0 @@
-// I18N constants
-// LANG: "si", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Cancel": "Prekliči",
-    "OK": "V redu",
-    "__OBSOLETE__": {
-        "___ TRANSLATOR NOTE   ___": "*** INSERTPICTURE IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***"
-    }
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/InsertPicture/lang/sr.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/InsertPicture/lang/sr.js
deleted file mode 100644
index 0955966..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/InsertPicture/lang/sr.js
+++ /dev/null
@@ -1,46 +0,0 @@
-// I18N constants
-// LANG: "sr", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Absbottom": "Апсолутно дно",
-    "Absmiddle": "Апсолутна средина",
-    "Alignment:": "Равнање",
-    "Alternate text:": "алтернативни текст",
-    "Baseline": "Доња линија",
-    "Border thickness:": "Дебљина оквира",
-    "Bottom": "Дно",
-    "Cancel": "Поништи",
-    "Enter the image URL here": "Унесите УРЛ слике овде",
-    "For browsers that don't support images": "За претраживаче који не подржавају слике",
-    "Horizontal padding": "Хортизонтално одстојање",
-    "Horizontal:": "По хоризонтали",
-    "Image Preview:": "Преглед слике",
-    "Image URL:": "УРЛ слике",
-    "Insert Image": "Убаци слику",
-    "Layout": "Прелом",
-    "Leave empty for no border": "Остави празно кад нема оквира",
-    "Left": "Лево",
-    "Middle": "Средина",
-    "Not set": "Није постављено",
-    "OK": "OK",
-    "Positioning of this image": "Постављање ове слике",
-    "Preview": "Преглед",
-    "Preview the image in a new window": "Прегледај слику у новом прозору",
-    "Right": "Десно",
-    "Spacing": "Размак",
-    "Texttop": "Врх текста",
-    "Top": "Врх",
-    "Vertical padding": "Вертикално одстојање",
-    "Vertical:": "По вертикали",
-    "Width:": "Ширина",
-    "__OBSOLETE__": {
-        "___ TRANSLATOR NOTE   ___": "*** INSERTPICTURE IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***"
-    }
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/InsertPicture/lang/sv.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/InsertPicture/lang/sv.js
deleted file mode 100644
index 061a9d1..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/InsertPicture/lang/sv.js
+++ /dev/null
@@ -1,50 +0,0 @@
-// I18N constants
-// LANG: "sv", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Alignment:": "Placering:",
-    "Alternate text:": "Alternativ text:",
-    "Baseline": "Baslinje",
-    "Border thickness:": "Ramtjocklek:",
-    "Bottom": "Botten",
-    "Cancel": "Avbryt",
-    "Enter the image URL here": "Bildens sökväg (URL)",
-    "For browsers that don't support images": "Beskrivande text för webläsare som inte stödjer inbäddade bilder",
-    "Height:": "Höjd:",
-    "Horizontal padding": "Horizontellt indrag på bild",
-    "Horizontal:": "Horisontell:",
-    "Image Preview:": "Förhandsgranskning:",
-    "Image URL:": "Bildens URL:",
-    "Insert Image": "Infoga bild",
-    "Layout": "Layout",
-    "Leave empty for no border": "Lämna tomt för att undvika ram",
-    "Leave empty for not defined": "Lämna tomt för att låta webläsaren bestämma",
-    "Left": "Venster",
-    "Middle": "Mitten",
-    "OK": "OK",
-    "Positioning of this image": "Bildens positionering",
-    "Preview": "Förhandsgranska",
-    "Preview the image in a new window": "Öppna bild i nytt fönster",
-    "Right": "Höger",
-    "Size": "Storlek",
-    "Spacing": "Marginal",
-    "Top": "Överkant",
-    "Upload file": "Ladda upp bild",
-    "Vertical padding": "Vertikalt indrag på bild",
-    "Vertical:": "Vertikal:",
-    "Width:": "Bredd:",
-    "__OBSOLETE__": {
-        "Images on the Server:": "Bilder på servern:",
-        "Please select a file to upload.": "Välj bild att ladda upp",
-        "The file you are uploading already exists.": "En fil med detta namn finns redan",
-        "The file you are uploading doesn't have the correct extension.": "Uppladdat bild har en ogiltig filändelse, uppladdning avbruten",
-        "The file you are uploading is to big. The max Filesize is": "Filen är för stor, maximal filstorlek är"
-    }
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/InsertPicture/lang/th.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/InsertPicture/lang/th.js
deleted file mode 100644
index 180ca37..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/InsertPicture/lang/th.js
+++ /dev/null
@@ -1,17 +0,0 @@
-// I18N constants
-// LANG: "th", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Cancel": "ยกเลิก",
-    "OK": "ตกลง",
-    "__OBSOLETE__": {
-        "___ TRANSLATOR NOTE   ___": "*** INSERTPICTURE IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***"
-    }
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/InsertPicture/lang/tr.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/InsertPicture/lang/tr.js
deleted file mode 100644
index 92df502..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/InsertPicture/lang/tr.js
+++ /dev/null
@@ -1,47 +0,0 @@
-// I18N constants
-// LANG: "tr", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Absbottom": "Salt alta",
-    "Absmiddle": "Salt orta",
-    "Alignment:": "Hizalama:",
-    "Alternate text:": "Alternatif metin:",
-    "Baseline": "Taban hizası",
-    "Border thickness:": "Kenarlık kalınlığı:",
-    "Bottom": "Alta",
-    "Cancel": "İptal",
-    "Enter the image URL here": "Lütfen buraya resim URL'sini girin",
-    "For browsers that don't support images": "Resim desteklemeyen tarayıcılar için",
-    "Height:": "Yükseklik",
-    "Horizontal padding": "Yatay doldurma miktarı",
-    "Horizontal:": "Yatay:",
-    "Image Preview:": "Resim önizleme:",
-    "Image URL:": "Resim URL'si:",
-    "Insert Image": "Resim ekle",
-    "Layout": "Düzen",
-    "Leave empty for no border": "Kenarlık istemiyorsanız boş bırakın",
-    "Left": "Sola",
-    "Middle": "Ortala",
-    "Not set": "Ayarlanmamış",
-    "OK": "Tamam",
-    "Positioning of this image": "Resmi konumlandırma",
-    "Preview": "Önizleme",
-    "Preview the image in a new window": "Resmi yeni pencerede önizleme",
-    "Right": "Sağa",
-    "Spacing": "Aralık",
-    "Texttop": "Metin-üstte",
-    "Top": "Yukarı",
-    "Vertical padding": "Dikey doldurma miktarı",
-    "Vertical:": "Dikey:",
-    "Width:": "Genişlik:",
-    "__OBSOLETE__": {
-        "___ TRANSLATOR NOTE   ___": "*** INSERTPICTURE IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***"
-    }
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/InsertPicture/lang/vn.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/InsertPicture/lang/vn.js
deleted file mode 100644
index 29e2ec6..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/InsertPicture/lang/vn.js
+++ /dev/null
@@ -1,17 +0,0 @@
-// I18N constants
-// LANG: "vn", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Cancel": "Hủy",
-    "OK": "Đồng ý",
-    "__OBSOLETE__": {
-        "___ TRANSLATOR NOTE   ___": "*** INSERTPICTURE IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***"
-    }
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/InsertPicture/lang/zh_cn.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/InsertPicture/lang/zh_cn.js
deleted file mode 100644
index 4d2a33f..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/InsertPicture/lang/zh_cn.js
+++ /dev/null
@@ -1,15 +0,0 @@
-// I18N constants
-// LANG: "zh_cn", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "__OBSOLETE__": {
-        "___ TRANSLATOR NOTE   ___": "*** INSERTPICTURE IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***"
-    }
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/InsertPicture/viewpicture.html b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/InsertPicture/viewpicture.html
deleted file mode 100644
index 00823bf..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/InsertPicture/viewpicture.html
+++ /dev/null
@@ -1,46 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">

-<html>

-<head>

-	<title>Preview</title>

-<script language="JavaScript" type="text/javascript">

-<!--

-function imgWait() {

-	waiting = window.setInterval("imgIsLoaded()", 1000);

-}

-function imgIsLoaded() {

-	if(document.getElementById("myImg").width > 0) {

-	  window.clearInterval(waiting);

-	  imgShowWidth();

-	}

-}

-function imgShowWidth() {

-	var width    = document.getElementById("myImg").width;

-	var height   = document.getElementById("myImg").height;

-	if(width > 120) {

-	  var dx = (120 / width);

-	  var dy = (120 / height);

-	  ratio  = dx < dy ? dx : dy;

-	  // keep aspect ratio

-	  width  = width * ratio;

-	  height = height * ratio;

-	  document.getElementById("myImg").width  = width;

-	  document.getElementById("myImg").height = height;

-	}

-	document.getElementById("myImg").style.visibility = 'visible';

-}

-function showPreview() {

-	img = document.location.toString().split("?");

-    document.getElementById("myImg").src = img[1];

-	img.onLoad = imgWait();

-}

-//-->

-</script>

-</head>

-<body  marginwidth="5px" marginheight="5px" topmargin="5px" leftmargin="5px" rightmargin="5px">

-<img id="myImg" src="" Style="visibility:hidden">

-<script language="JavaScript" type="text/javascript">

-  showPreview();

-</script>

-

-</body>

-</html>
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/NoteServer/NoteServer.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/NoteServer/NoteServer.js
deleted file mode 100644
index c43a32a..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/NoteServer/NoteServer.js
+++ /dev/null
@@ -1,208 +0,0 @@
-// GUIDO Music Notation plugin for Xinha
-// Implementation by Richard Christophe
-// Original Author - Richard Christophe cvrichard@infonie.fr
-//
-// Distributed under the same terms as HTMLArea itself.
-// This notice MUST stay intact for use (see license.txt).
-
-// this is a collection of JavaScript routines that
-// facilitate accessing the GUIDO NoteServer.
-//
-// These Functions can be used within WEB-Pages
-// examples can be found at
-// www.noteserver.org/javascript/index.html
-//
-
-function NoteServer(editor) {
-  this.editor = editor;
-  var cfg = editor.config;
-  var self = this;
-
-  cfg.registerButton({
-                id       : "insertscore",
-                tooltip  : this._lc("Insert GUIDO Music Notation"),
-                image    : editor.imgURL("note.gif", "NoteServer"),
-                textMode : false,
-                action   : function(editor) {
-                                self.buttonPress(editor);
-                           }
-            });
-	cfg.addToolbarElement("insertscore", "insertimage", 1);
-}
-
-NoteServer._pluginInfo = {
-  name          : "NoteServer",
-  version       : "1.1",
-  developer     : "Richard Christophe",
-  developer_url : "http://piano-go.chez.tiscali.fr/guido.html",
-  c_owner       : "Richard Christophe",
-  sponsor       : "",
-  sponsor_url   : "",
-  license       : "htmlArea"
-};
-
-NoteServer.prototype._lc = function(string) {
-  return Xinha._lc(string, 'NoteServer');
-};
-
-NoteServer.prototype.buttonPress = function(editor) {
-  editor._popupDialog( "plugin://NoteServer/codenote", function(param) {
-    if (!param) {	// user must have pressed Cancel
-      return false;
-    } else IncludeGuido(editor,param);
-  }, null);
-};
-
-// this variable is the address of the noteserver
-// can be set to another address (local address if availalble) 
-
-// var noteserveraddress = "www.noteserver.org";
-// var htmlbase = "";
-
-// alternative: specify server-adress directly:
-var noteserveraddress = "clef.cs.ubc.ca"; //"www.noteserver.org"
-var htmlbase = "/salieri/nview";
-
-
-// this is the version of the NoteServer used.
-// one of "0_4", "0_5", "0_6", or "0_7", or ""
-// "" means: take the current version
-// var versionstring = "0_7";
-var versionstring = "";
-
-// this functions takes a GMN-string and returns the URL
-// that converts it into a GIF-file
-function GetGIFURL(gmnstring,zoom,pagenum) {
-  gmnstring = escape(gmnstring);
-  gmnstring = gmnstring.replace(/\//g,"%2F");
-
-  if (!zoom) {
-    zoom = "1.0";
-  }
-  if (!pagenum) {
-    pagenum = "1";
-  }
-
-  var string = "http://" + noteserveraddress +
-               "/scripts/salieri" + versionstring +
-               "/gifserv.pl?" +
-               "pagewidth=21" +
-               "&pageheight=29.7" +
-               "&zoomfactor=" + zoom +
-               "&pagesizeadjust=yes" +
-               "&outputformat=gif87" +
-               "&pagenum=" + pagenum +
-               "&gmndata=" + gmnstring;
-
-  //	document.write(string);
-  return string;
-}
-
-// this functions takes a GMN-string and returns the URL
-// that converts it into a MIDI-file
-function GetMIDIURL(gmnstring) {
-  gmnstring = escape(gmnstring);
-  gmnstring = gmnstring.replace(/\//g,"%2F");
-
-  var string = "http://" + noteserveraddress +
-               "/scripts/salieri" + versionstring + 
-               "/midserv.pl?" +
-               "gmndata=" + gmnstring;
-
-  return string;
-}
-
-// this functions takes a GMN-string and returns the URL
-// that insert Applet
-function GetAPPLETURL(gmnstring,zoom) {
-  gmnstring = escape(gmnstring);
-  gmnstring = gmnstring.replace(/\//g,"%2F");
-
-  var string = '<applet ' +
-               'code="NoteServerApplet" ' +
-               'codebase="http://' +
-               noteserveraddress + htmlbase + '/java" ' +
-               ' width=700 height=300>' +
-               '<param name=server value="' +
-               noteserveraddress + '">' +
-               '<param name=serverVersion value="' +
-               versionstring + '">' +
-               '<param name=zoomFactor value="' +
-               zoom + '">' +
-               '<param name=pageWidth value="21">' +
-               '<param name=pageHeight value="29.7">' +
-               '<param name=gmn value="' +
-               gmnstring + '">' +
-               '</applet>';
-
-  return string;
-}
-
-// This function takes a GUIDO string, accesses the
-// NoteServer (address specified as a constant above)
-// and then embeds the GIF-Image in the document.
-
-
-function IncludeGuido(editor,param) {
-  // this  holds the URL for retrieving the picture ...
-
-  if (!param["f_zoom"])
-    zoom = "";
-  //if (!pagenum)
-   // pagenum = "";
-
-  var string = GetGIFURL(param["f_code"],param["f_zoom"],"");
-  var stringmidi = GetMIDIURL(param["f_code"]);
-  var string2 = "<br>";
-
-if (param["f_applet"] == false ){
-  if (((navigator.userAgent.toLowerCase().indexOf("msie") != -1)
-    && (navigator.userAgent.toLowerCase().indexOf("opera") == -1))) {
-    editor.focusEditor();
-    editor.insertHTML("<img src=" + string + ">");
-  }	else {
-    img = new Image();
-    img.src = string;
-
-    var doc = editor._doc;
-    var sel = editor._getSelection();
-    var range = editor._createRange(sel);
-    editor._doc.execCommand("insertimage", false, img.src);
-  }
-} else {
-  var stringapplet = GetAPPLETURL(param["f_code"],param["f_zoom"]);
-  string2 = string2 + stringapplet + "<br>";
-}
-
-// To test code source in textarea
-//if (param["f_affcode"]) string2 = string2 + Xinha._lc("Source Code","NoteServer") + " :" + '<br> <textarea  cols=60 rows=10 style = "background: #FFFFE6">' +  param["f_code"] + '</textarea> <br>';
-
-if (param["f_affcode"]) string2 = string2 + Xinha._lc("GUIDO Code","NoteServer") + " : "  + param["f_code"] + "<br>";
-if (param["f_midi"]) string2 = string2 + "<a href=" + stringmidi + ">" + Xinha._lc("MIDI File","NoteServer") + "</a> <br>";
-
-  editor.focusEditor();
-  editor.insertHTML(string2);
-
-    //var html = linktext.link(stringmidi);
-    //editor.insertHTML(html);
-}
-
-// this routine includes the applet-definition 
-function IncludeGuidoStringAsApplet(editor, gmnstring, zoom) {
-  gmnstring = escape(gmnstring);
-  gmnstring = gmnstring.replace(/\//g,"%2F");
-
-  var string = '<applet ' + 
-               'codebase="http://' + noteserveraddress + htmlbase + '/java"\n' +
-               'code="NoteServerApplet" width=480 height=230>' +
-               "<PARAM NAME=server VALUE='" + noteserveraddress + "'>" +
-               "<PARAM NAME=serverVersion VALUE='" + versionstring + "'>" +
-               "<PARAM NAME=zoomFactor VALUE='"	+ zoom + "'>" +
-               '<param name=pageWidth value="21">' +
-               '<param name=pageHeight value="29.7">' +
-               "<PARAM NAME=gmn VALUE='" + gmnstring + "'>" +
-               "</applet>";
-  alert(string);
-  editor.focusEditor();
-  editor.insertHTML(string);
-}
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/NoteServer/img/note.gif b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/NoteServer/img/note.gif
deleted file mode 100644
index e3c117a..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/NoteServer/img/note.gif
+++ /dev/null
Binary files differ
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/NoteServer/lang/b5.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/NoteServer/lang/b5.js
deleted file mode 100644
index 7a406d9..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/NoteServer/lang/b5.js
+++ /dev/null
@@ -1,15 +0,0 @@
-// I18N constants
-// LANG: "b5", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "__OBSOLETE__": {
-        "___ TRANSLATOR NOTE   ___": "*** NOTESERVER IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***"
-    }
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/NoteServer/lang/ch.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/NoteServer/lang/ch.js
deleted file mode 100644
index 406d476..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/NoteServer/lang/ch.js
+++ /dev/null
@@ -1,17 +0,0 @@
-// I18N constants
-// LANG: "ch", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Cancel": "取消",
-    "OK": "好",
-    "__OBSOLETE__": {
-        "___ TRANSLATOR NOTE   ___": "*** NOTESERVER IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***"
-    }
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/NoteServer/lang/cz.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/NoteServer/lang/cz.js
deleted file mode 100644
index 5c1a759..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/NoteServer/lang/cz.js
+++ /dev/null
@@ -1,17 +0,0 @@
-// I18N constants
-// LANG: "cz", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Cancel": "Zrušit",
-    "OK": "OK",
-    "__OBSOLETE__": {
-        "___ TRANSLATOR NOTE   ___": "*** NOTESERVER IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***"
-    }
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/NoteServer/lang/da.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/NoteServer/lang/da.js
deleted file mode 100644
index af7626d..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/NoteServer/lang/da.js
+++ /dev/null
@@ -1,20 +0,0 @@
-// I18N constants
-// LANG: "da", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Cancel": "Annuller",
-    "Image Preview": "Billede smugkig:",
-    "OK": "OK",
-    "Preview": "Smugkig",
-    "Preview the image in a new window": "Smugkig af billedet i et nyt vindue",
-    "__OBSOLETE__": {
-        "___ TRANSLATOR NOTE   ___": "*** NOTESERVER IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***"
-    }
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/NoteServer/lang/de.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/NoteServer/lang/de.js
deleted file mode 100644
index b96d88f..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/NoteServer/lang/de.js
+++ /dev/null
@@ -1,30 +0,0 @@
-// I18N constants
-// LANG: "de", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Add GUIDO Code in a textbox on the page": "GUIDO Code in einer Textbox auf der Seite anzeigen",
-    "Add MIDI link to allow students to hear the music": "MIDI-Link hinzufügen um Studenten das hören der Musik zu ermöglichen",
-    "Cancel": "Abbrechen",
-    "Format": "Format",
-    "Guido code": "Guido code",
-    "Image Preview": "Bild Voransicht",
-    "Image in applet": "Bild im Applet",
-    "Insert GUIDO Music Notation": "Einfügung einer GUIDO Musik-Tonfolge",
-    "MIDI File": "MIDI Datei",
-    "OK": "OK",
-    "Options": "Einstellungen",
-    "Preview": "Voransicht",
-    "Preview the image in a new window": "Voransicht des Bildes in einem neuen Fenster",
-    "Source Code": "Quell-Code",
-    "Zoom": "Zoom",
-    "__OBSOLETE__": {
-        "___ TRANSLATOR NOTE   ___": "*** NOTESERVER IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***"
-    }
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/NoteServer/lang/ee.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/NoteServer/lang/ee.js
deleted file mode 100644
index c53d7ce..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/NoteServer/lang/ee.js
+++ /dev/null
@@ -1,17 +0,0 @@
-// I18N constants
-// LANG: "ee", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Cancel": "Loobu",
-    "OK": "OK",
-    "__OBSOLETE__": {
-        "___ TRANSLATOR NOTE   ___": "*** NOTESERVER IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***"
-    }
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/NoteServer/lang/el.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/NoteServer/lang/el.js
deleted file mode 100644
index 5dc6d9d..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/NoteServer/lang/el.js
+++ /dev/null
@@ -1,17 +0,0 @@
-// I18N constants
-// LANG: "el", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Cancel": "Ακύρωση",
-    "OK": "Εντάξει",
-    "__OBSOLETE__": {
-        "___ TRANSLATOR NOTE   ___": "*** NOTESERVER IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***"
-    }
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/NoteServer/lang/es.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/NoteServer/lang/es.js
deleted file mode 100644
index 66ba9ce..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/NoteServer/lang/es.js
+++ /dev/null
@@ -1,20 +0,0 @@
-// I18N constants
-// LANG: "es", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Cancel": "Cancelar",
-    "Image Preview": "Previsualización de la imagen:",
-    "OK": "Aceptar",
-    "Preview": "Previsualizar",
-    "Preview the image in a new window": "Previsualizar en una nueva ventana",
-    "__OBSOLETE__": {
-        "___ TRANSLATOR NOTE   ___": "*** NOTESERVER IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***"
-    }
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/NoteServer/lang/eu.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/NoteServer/lang/eu.js
deleted file mode 100644
index c14bfca..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/NoteServer/lang/eu.js
+++ /dev/null
@@ -1,20 +0,0 @@
-// I18N constants
-// LANG: "eu", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Cancel": "Utzi",
-    "Image Preview": "Irudiaren aurrebista:",
-    "OK": "Ados",
-    "Preview": "Aurrebista",
-    "Preview the image in a new window": "Aurreikusi irudia beste lehio batean",
-    "__OBSOLETE__": {
-        "___ TRANSLATOR NOTE   ___": "*** NOTESERVER IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***"
-    }
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/NoteServer/lang/fa.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/NoteServer/lang/fa.js
deleted file mode 100644
index 61893d0..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/NoteServer/lang/fa.js
+++ /dev/null
@@ -1,20 +0,0 @@
-// I18N constants
-// LANG: "fa", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Cancel": "انصراف",
-    "Image Preview": "پیش نمایش تصویر",
-    "OK": "بله",
-    "Preview": "پیش نمایش",
-    "Preview the image in a new window": "پیش نمایش تصویر در پنجره ای جدید",
-    "__OBSOLETE__": {
-        "___ TRANSLATOR NOTE   ___": "*** NOTESERVER IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***"
-    }
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/NoteServer/lang/fi.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/NoteServer/lang/fi.js
deleted file mode 100644
index 938da3d..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/NoteServer/lang/fi.js
+++ /dev/null
@@ -1,17 +0,0 @@
-// I18N constants
-// LANG: "fi", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Cancel": "Peruuta",
-    "OK": "Hyväksy",
-    "__OBSOLETE__": {
-        "___ TRANSLATOR NOTE   ___": "*** NOTESERVER IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***"
-    }
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/NoteServer/lang/fr.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/NoteServer/lang/fr.js
deleted file mode 100644
index d92802e..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/NoteServer/lang/fr.js
+++ /dev/null
@@ -1,30 +0,0 @@
-// I18N constants
-// LANG: "fr", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Add GUIDO Code in a textbox on the page": "Ajouter le code source GUIDO dans un cadre",
-    "Add MIDI link to allow students to hear the music": "Ajouter un lien MIDI pour permettre aux étudiants d'écouter la partition",
-    "Cancel": "Annuler",
-    "Format": "Format",
-    "Guido code": "Code Guido",
-    "Image Preview": "Aperçu de l'image",
-    "Image in applet": "Image dans une applet",
-    "Insert GUIDO Music Notation": "Insérer une partition musicale GUIDO",
-    "MIDI File": "Fichier MIDI",
-    "OK": "OK",
-    "Options": "Options",
-    "Preview": "Aperçu ",
-    "Preview the image in a new window": "Prévisualiser l'image dans une nouvelle fenêtre",
-    "Source Code": "Code source",
-    "Zoom": "Zoom",
-    "__OBSOLETE__": {
-        "___ TRANSLATOR NOTE   ___": "*** NOTESERVER IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***"
-    }
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/NoteServer/lang/fr_ca.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/NoteServer/lang/fr_ca.js
deleted file mode 100644
index cf98868..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/NoteServer/lang/fr_ca.js
+++ /dev/null
@@ -1,15 +0,0 @@
-// I18N constants
-// LANG: "fr_ca", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "__OBSOLETE__": {
-        "___ TRANSLATOR NOTE   ___": "*** NOTESERVER IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***"
-    }
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/NoteServer/lang/gb.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/NoteServer/lang/gb.js
deleted file mode 100644
index 77eaf9a..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/NoteServer/lang/gb.js
+++ /dev/null
@@ -1,15 +0,0 @@
-// I18N constants
-// LANG: "gb", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "__OBSOLETE__": {
-        "___ TRANSLATOR NOTE   ___": "*** NOTESERVER IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***"
-    }
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/NoteServer/lang/he.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/NoteServer/lang/he.js
deleted file mode 100644
index 3397bd1..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/NoteServer/lang/he.js
+++ /dev/null
@@ -1,17 +0,0 @@
-// I18N constants
-// LANG: "he", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Cancel": "ביטול",
-    "OK": "אישור",
-    "__OBSOLETE__": {
-        "___ TRANSLATOR NOTE   ___": "*** NOTESERVER IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***"
-    }
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/NoteServer/lang/hu.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/NoteServer/lang/hu.js
deleted file mode 100644
index 9b6a735..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/NoteServer/lang/hu.js
+++ /dev/null
@@ -1,17 +0,0 @@
-// I18N constants
-// LANG: "hu", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Cancel": "Mégsem",
-    "OK": "Rendben",
-    "__OBSOLETE__": {
-        "___ TRANSLATOR NOTE   ___": "*** NOTESERVER IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***"
-    }
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/NoteServer/lang/it.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/NoteServer/lang/it.js
deleted file mode 100644
index 57ec68e..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/NoteServer/lang/it.js
+++ /dev/null
@@ -1,17 +0,0 @@
-// I18N constants
-// LANG: "it", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Cancel": "Annullamento",
-    "OK": "OK",
-    "__OBSOLETE__": {
-        "___ TRANSLATOR NOTE   ___": "*** NOTESERVER IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***"
-    }
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/NoteServer/lang/ja.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/NoteServer/lang/ja.js
deleted file mode 100644
index 8a4a549..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/NoteServer/lang/ja.js
+++ /dev/null
@@ -1,31 +0,0 @@
-// I18N constants
-// LANG: "ja", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Add GUIDO Code in a textbox on the page": "ページ内のテキストボックスにGUIDOコードを追加",
-    "Add MIDI link to allow students to hear the music": "MIDIへのリンクを追加し、楽曲を聴かせてもよい",
-    "Cancel": "中止",
-    "Format": "フォーマット",
-    "Guido code": "GUIDOコード",
-    "Image Preview": "画像プレビュー",
-    "Image in applet": "アプレット画像",
-    "Insert GUIDO Music Notation": "GUIDO Music Notationの挿入",
-    "MIDI File": "MIDIファイル",
-    "OK": "OK",
-    "Options": "オプション",
-    "Preview": "表示",
-    "Preview the image in a new window": "ウィンドウで画像を表示",
-    "Source Code": "ソースコード",
-    "With Mozilla, the applet will not be visible in editor, but only in Web page after submitting.": "Mozillaではエディタ内にアプレットは表示されませんが、送信後のWebページ内では有効です。",
-    "Zoom": "拡大率:",
-    "__OBSOLETE__": {
-        "___ TRANSLATOR NOTE   ___": "*** NOTESERVER IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***"
-    }
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/NoteServer/lang/lc_base.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/NoteServer/lang/lc_base.js
deleted file mode 100644
index 7110203..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/NoteServer/lang/lc_base.js
+++ /dev/null
@@ -1,46 +0,0 @@
-// I18N constants
-//
-// LANG: "en", ENCODING: UTF-8
-// Author: Translator-Name, <email@example.com>
-//
-// Last revision: 2018-04-12
-// 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).
-//
-// (Please, remove information below)
-// 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.)
-
-{
-    "100%": "",
-    "120%": "",
-    "150%": "",
-    "80%": "",
-    "Add GUIDO Code in a textbox on the page": "",
-    "Add MIDI link to allow students to hear the music": "",
-    "Cancel": "",
-    "Format": "",
-    "GUIDO Code": "",
-    "Guido code": "",
-    "Image Preview": "",
-    "Image in applet": "",
-    "Insert GUIDO Music Notation": "",
-    "MIDI File": "",
-    "OK": "",
-    "Options": "",
-    "Preview": "",
-    "Preview the image in a new window": "",
-    "Source Code": "",
-    "With Mozilla, the applet will not be visible in editor, but only in Web page after submitting.": "",
-    "Zoom": "",
-    "Zoom :": ""
-}
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/NoteServer/lang/lt.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/NoteServer/lang/lt.js
deleted file mode 100644
index bb660b7..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/NoteServer/lang/lt.js
+++ /dev/null
@@ -1,17 +0,0 @@
-// I18N constants
-// LANG: "lt", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Cancel": "Atšaukti",
-    "OK": "OK",
-    "__OBSOLETE__": {
-        "___ TRANSLATOR NOTE   ___": "*** NOTESERVER IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***"
-    }
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/NoteServer/lang/lv.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/NoteServer/lang/lv.js
deleted file mode 100644
index 5de40aa..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/NoteServer/lang/lv.js
+++ /dev/null
@@ -1,17 +0,0 @@
-// I18N constants
-// LANG: "lv", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Cancel": "Atcelt",
-    "OK": "Labi",
-    "__OBSOLETE__": {
-        "___ TRANSLATOR NOTE   ___": "*** NOTESERVER IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***"
-    }
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/NoteServer/lang/nb.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/NoteServer/lang/nb.js
deleted file mode 100644
index 5432cd7..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/NoteServer/lang/nb.js
+++ /dev/null
@@ -1,29 +0,0 @@
-// I18N constants
-// LANG: "nb", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Add GUIDO Code in a textbox on the page": "Sett inn GUIDO-kode i et tekstfelt på siden",
-    "Add MIDI link to allow students to hear the music": "Legg til MIDI-link for at studenter kan høre musikken",
-    "Cancel": "Avbryt",
-    "Format": "Format",
-    "Guido code": "GUIDO-kode",
-    "Image Preview": "Bilde forhåndsvisning",
-    "Image in applet": "Bilde i applet",
-    "Insert GUIDO Music Notation": "Sett inn GUIDO-noter",
-    "MIDI File": "MIDIfil",
-    "OK": "OK",
-    "Options": "Muligheter",
-    "Preview": "Preview",
-    "Source Code": "Kildekode",
-    "Zoom": "Forstørr",
-    "__OBSOLETE__": {
-        "___ TRANSLATOR NOTE   ___": "*** NOTESERVER IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***"
-    }
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/NoteServer/lang/nl.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/NoteServer/lang/nl.js
deleted file mode 100644
index 0ef06d6..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/NoteServer/lang/nl.js
+++ /dev/null
@@ -1,30 +0,0 @@
-// I18N constants
-// LANG: "nl", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Add GUIDO Code in a textbox on the page": "GUIDO code in een tekstgebied op de pagina invoegen",
-    "Add MIDI link to allow students to hear the music": "MIDI link invoegen om de muziek te beluisteren",
-    "Cancel": "Annuleren",
-    "Format": "Indeling",
-    "Guido code": "GUIDO-code",
-    "Image Preview": "Afbeeldingsvoorbeeld",
-    "Image in applet": "Afbeelding in applet",
-    "Insert GUIDO Music Notation": "GUIDO muziek notatie invoegen",
-    "MIDI File": "MIDI bestand",
-    "OK": "OK",
-    "Options": "Opties",
-    "Preview": "Voorbeeld",
-    "Preview the image in a new window": "Afbeelding bekijken in nieuw venster",
-    "Source Code": "Broncode",
-    "Zoom": "Vergroot/verklein",
-    "__OBSOLETE__": {
-        "___ TRANSLATOR NOTE   ___": "*** NOTESERVER IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***"
-    }
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/NoteServer/lang/pl.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/NoteServer/lang/pl.js
deleted file mode 100644
index 8ec9c93..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/NoteServer/lang/pl.js
+++ /dev/null
@@ -1,21 +0,0 @@
-// I18N constants
-// LANG: "pl", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Cancel": "Anuluj",
-    "Image Preview": "Podgląd obrazka:",
-    "OK": "OK",
-    "Options": "Opcje",
-    "Preview": "Podgląd",
-    "Preview the image in a new window": "Podgląd obrazka w nowym oknie",
-    "__OBSOLETE__": {
-        "___ TRANSLATOR NOTE   ___": "*** NOTESERVER IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***"
-    }
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/NoteServer/lang/pt_br.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/NoteServer/lang/pt_br.js
deleted file mode 100644
index 4660ee7..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/NoteServer/lang/pt_br.js
+++ /dev/null
@@ -1,33 +0,0 @@
-// I18N constants
-// LANG: "pt_br", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Add GUIDO Code in a textbox on the page": "Adicionar código GUIDO em uma caixa de texto na página",
-    "Add MIDI link to allow students to hear the music": "Adicionar um link MIDI para permitir que os estudantes escutem a música",
-    "Cancel": "Cancelar",
-    "Format": "Formato",
-    "GUIDO Code": "Código GUIDO",
-    "Guido code": "Código Guido",
-    "Image Preview": "Visualização da Imagem",
-    "Image in applet": "Imagem em Applet",
-    "Insert GUIDO Music Notation": "Inserir Notação GUIDO de Música",
-    "MIDI File": "Arquivo MIDI",
-    "OK": "OK",
-    "Options": "Opções",
-    "Preview": "Visualização",
-    "Preview the image in a new window": "Visualizar imagem em uma nova janela",
-    "Source Code": "Codigo Fonte",
-    "With Mozilla, the applet will not be visible in editor, but only in Web page after submitting.": "Com Mozilla, o applet não estará visível no editor, somente na Página Web depois do envio.",
-    "Zoom": "Ampliação",
-    "Zoom :": "Ampliação :",
-    "__OBSOLETE__": {
-        "___ TRANSLATOR NOTE   ___": "*** NOTESERVER IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***"
-    }
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/NoteServer/lang/ro.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/NoteServer/lang/ro.js
deleted file mode 100644
index 2d09411..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/NoteServer/lang/ro.js
+++ /dev/null
@@ -1,17 +0,0 @@
-// I18N constants
-// LANG: "ro", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Cancel": "Renunţă",
-    "OK": "Acceptă",
-    "__OBSOLETE__": {
-        "___ TRANSLATOR NOTE   ___": "*** NOTESERVER IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***"
-    }
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/NoteServer/lang/ru.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/NoteServer/lang/ru.js
deleted file mode 100644
index d761ad9..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/NoteServer/lang/ru.js
+++ /dev/null
@@ -1,21 +0,0 @@
-// I18N constants
-// LANG: "ru", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Cancel": "Отмена",
-    "Image Preview": "Предварительный просмотр",
-    "OK": "OK",
-    "Options": "Опции",
-    "Preview": "Предварительный просмотр",
-    "Preview the image in a new window": "Предварительный просмотр в отдельном окне",
-    "__OBSOLETE__": {
-        "___ TRANSLATOR NOTE   ___": "*** NOTESERVER IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***"
-    }
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/NoteServer/lang/sh.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/NoteServer/lang/sh.js
deleted file mode 100644
index 4018039..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/NoteServer/lang/sh.js
+++ /dev/null
@@ -1,20 +0,0 @@
-// I18N constants
-// LANG: "sh", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Cancel": "Poništi",
-    "Image Preview": "Pregled slike",
-    "OK": "OK",
-    "Preview": "Pregled",
-    "Preview the image in a new window": "Pregledaj sliku u novom prozoru",
-    "__OBSOLETE__": {
-        "___ TRANSLATOR NOTE   ___": "*** NOTESERVER IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***"
-    }
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/NoteServer/lang/si.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/NoteServer/lang/si.js
deleted file mode 100644
index 09f9893..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/NoteServer/lang/si.js
+++ /dev/null
@@ -1,17 +0,0 @@
-// I18N constants
-// LANG: "si", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Cancel": "Prekliči",
-    "OK": "V redu",
-    "__OBSOLETE__": {
-        "___ TRANSLATOR NOTE   ___": "*** NOTESERVER IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***"
-    }
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/NoteServer/lang/sr.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/NoteServer/lang/sr.js
deleted file mode 100644
index 8e68152..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/NoteServer/lang/sr.js
+++ /dev/null
@@ -1,20 +0,0 @@
-// I18N constants
-// LANG: "sr", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Cancel": "Поништи",
-    "Image Preview": "Преглед слике",
-    "OK": "OK",
-    "Preview": "Преглед",
-    "Preview the image in a new window": "Прегледај слику у новом прозору",
-    "__OBSOLETE__": {
-        "___ TRANSLATOR NOTE   ___": "*** NOTESERVER IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***"
-    }
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/NoteServer/lang/sv.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/NoteServer/lang/sv.js
deleted file mode 100644
index c9de08d..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/NoteServer/lang/sv.js
+++ /dev/null
@@ -1,21 +0,0 @@
-// I18N constants
-// LANG: "sv", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Cancel": "Avbryt",
-    "Image Preview": "Förhandsgranskning:",
-    "OK": "OK",
-    "Options": "Välj",
-    "Preview": "Förhandsgranska",
-    "Preview the image in a new window": "Öppna bild i nytt fönster",
-    "__OBSOLETE__": {
-        "___ TRANSLATOR NOTE   ___": "*** NOTESERVER IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***"
-    }
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/NoteServer/lang/th.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/NoteServer/lang/th.js
deleted file mode 100644
index ef04db2..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/NoteServer/lang/th.js
+++ /dev/null
@@ -1,17 +0,0 @@
-// I18N constants
-// LANG: "th", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Cancel": "ยกเลิก",
-    "OK": "ตกลง",
-    "__OBSOLETE__": {
-        "___ TRANSLATOR NOTE   ___": "*** NOTESERVER IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***"
-    }
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/NoteServer/lang/tr.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/NoteServer/lang/tr.js
deleted file mode 100644
index e2d0c6e..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/NoteServer/lang/tr.js
+++ /dev/null
@@ -1,20 +0,0 @@
-// I18N constants
-// LANG: "tr", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Cancel": "İptal",
-    "Image Preview": "Resim önizleme:",
-    "OK": "Tamam",
-    "Preview": "Önizleme",
-    "Preview the image in a new window": "Resmi yeni pencerede önizleme",
-    "__OBSOLETE__": {
-        "___ TRANSLATOR NOTE   ___": "*** NOTESERVER IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***"
-    }
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/NoteServer/lang/vn.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/NoteServer/lang/vn.js
deleted file mode 100644
index 861fdfe..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/NoteServer/lang/vn.js
+++ /dev/null
@@ -1,17 +0,0 @@
-// I18N constants
-// LANG: "vn", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Cancel": "Hủy",
-    "OK": "Đồng ý",
-    "__OBSOLETE__": {
-        "___ TRANSLATOR NOTE   ___": "*** NOTESERVER IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***"
-    }
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/NoteServer/lang/zh_cn.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/NoteServer/lang/zh_cn.js
deleted file mode 100644
index 5d2e1c7..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/NoteServer/lang/zh_cn.js
+++ /dev/null
@@ -1,15 +0,0 @@
-// I18N constants
-// LANG: "zh_cn", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "__OBSOLETE__": {
-        "___ TRANSLATOR NOTE   ___": "*** NOTESERVER IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***"
-    }
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/NoteServer/popups/codenote.html b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/NoteServer/popups/codenote.html
deleted file mode 100644
index 3f1ba5f..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/NoteServer/popups/codenote.html
+++ /dev/null
@@ -1,162 +0,0 @@
-<html>
-
-<head>
-
-<title>Insert GUIDO Music Notation</title>
-<link rel="stylesheet" type="text/css" href="../../../popups/popup.css" />
-<script type="text/javascript"  src="../note-server.js"></script>
-<script type="text/javascript" src="../../../popups/popup.js"></script>
-
-<script type="text/javascript">
-
-window.resizeTo(500, 200);
-
-NoteServer = window.opener.NoteServer;
-
-var editor = null;
-function Init() {
-  __dlg_translate('NoteServer');
-  __dlg_init();
-
-//   var param = window.dialogArguments;
-//  if (param) {
-//    document.getElementById("f_midi").value = param["f_midi"];
-//    document.getElementById("f_code").value = param["f_code"];
-//    document.getElementById("f_zoom").value = param["f_zoom"];
-//    document.getElementById("f_affcode").value = param["f_affcode"];
-//    document.getElementById("f_applet").value = param["f_applet"];
-//  }
-//  editor = param.editor;
-  document.getElementById("f_code").focus();
-//  document.getElementById("f_code").select();
-}
-
-function onOK() {
-  var f_code = document.getElementById("f_code");
-  if (!f_code.value) {
-    alert("You have to enter GUIDO code");
-    f_code.focus();
-    return false;
-}
-
-  // pass data back to the calling window
-
-  var param = {};
-  param["f_code"] = f_code.value;
-  var f_zoom = document.getElementById("f_zoom");
-  var z = "1.0";
-  if (f_zoom.value == "1.0" || f_zoom.value == "100%") z = 1.0;
-  else if (f_zoom.value == "0.8" || f_zoom.value == "80%") z = 0.8;
-  else if (f_zoom.value == "1.2" || f_zoom.value == "120%") z = 1.2;
-  else if (f_zoom.value == "1.5" || f_zoom.value == "150%") z = 1.5;
-
-  param["f_zoom"] = z;
-
-  param["f_midi"] = document.getElementById("f_midi").checked;
-
-  param["f_affcode"] = document.getElementById("f_affcode").checked;
-  param["f_applet"] = document.getElementById("f_applet").checked;
-
-  __dlg_close(param);
-  return false;
-}
-
-function onCancel() {
-  __dlg_close(null);
-  return false;
-
-}
-
-
-function message(){
-if (document.getElementById("f_applet").checked)
-  if (!((navigator.userAgent.toLowerCase().indexOf("msie") != -1)
-    && (navigator.userAgent.toLowerCase().indexOf("opera") == -1))) {
-    alert(HTMLArea._lc("With Mozilla, the applet will not be visible in editor, but only in Web page after submitting.", 'NoteServer'));
-  }
-}
-
-function onPreview() {
-
-  var f_code = document.getElementById("f_code");
-  var f_zoom = document.getElementById("f_zoom");
-
-var z = "1.0";
-if (f_zoom.value == "1.0" || f_zoom.value == "100%") z = 1.0;
-else if (f_zoom.value == "0.8" || f_zoom.value == "80%") z = 0.8;
-else if (f_zoom.value == "1.2" || f_zoom.value == "120%") z = 1.2;
-else if (f_zoom.value == "1.5" || f_zoom.value == "150%") z = 1.5;
-
-  var url = GetGIFURL(f_code.value,z,"");
-  if (!f_code.value) {
-    alert("You have to enter GUIDO code");
-    f_code.focus();
-    return false;
- }
-
-
-  window.ipreview.location.replace(url);
-
-  return false;
-}
-
-</script>
-</head>
-
-<body class="Dialog" onload="Init()">
-<div class="title">Insert GUIDO Music Notation</div>
-
-<span>Guido code</span> :
-  <br><textarea rows="7" id="f_code" cols="55"></textarea><br>
-
-<div class="space"></div>
-<fieldset style="float: left; margin-left: 5px;">
-<legend>Options</legend>
-  <input type="checkbox" id="f_midi" value="ON"> <span>Add MIDI link to allow students to hear the music</span>
-  <div class="space"></div>
-  <input type="checkbox" id="f_affcode" value="ON"> <span>Add GUIDO Code in a textbox on the page</span>
-  <div class="space"></div>
-</fieldset>
-
-<fieldset style="float: right; margin-left: 5px;">
-<legend>Format</legend>
-  <input type="checkbox" id="f_applet" value="ON" onclick="message();" > <span>Image in applet</span>
-  <div class="space"></div>
-  <span>Zoom</span> :
-  <select size="1" id="f_zoom" title="Zoom :">
-    <option value="0.8">80%</option>
-    <option selected="selected">100%</option>
-    <option value="1.2">120%</option>
-    <option value="1.5">150%</option>
-  </select>
-  <div class="space"></div>
-</fieldset>
-
-<br clear="all" />
-
-<table width="100%" style="margin-bottom: 0.2em">
- <tr>
-  <td style="vertical-align: bottom;">
-    <span>Image Preview</span>:<br />
-    <iframe name="ipreview" id="ipreview" frameborder="0" style="border : 1px solid gray;" height="200" width="350" src=""></iframe>
-  </td>
-
-  <td style="vertical-align: bottom;" style="text-align: right">
-    <button type="button" name="preview" onclick="return onPreview();"
-      title="Preview the image in a new window">Preview</button><br>
-    <button type="button" name="ok" onclick="return onOK();"><span>OK</span></button><br>
-    <button type="button" name="cancel" onclick="return onCancel();"><span>Cancel</span></button>
-  </td>
- </tr>
- <tr>
-  <td colspan="2">
-   <p>Sample Guido Codes:</p>
-   <p><a href="http://piano-go.chez.tiscali.fr/rachmaninoff.gmn" onclick="window.open(this.href,'_blank');return false;">Code Sample 1</a> or type [ do re mi fa sol la si ] | <a href="http://www.informatik.tu-darmstadt.de/AFS/SALIERI/guido/demos.html" onclick="window.open(this.href,'_blank');return false;">Code Sample 2</a></p>
-   <p>Resources: </p>
-   <p>The Guido Specification (<a href="http://piano-go.chez.tiscali.fr/GUIDO-Music%20Notation%20Format.pdf" onclick="window.open(this.href,'_blank');return false;">PDF)</a> | <a href="http://www.salieri.org/guido/doc.html" onclick="window.open(this.href,'_blank');return false;">(HTML)</a></p>
-   <p><a href="http://www.salieri.org/guido/" onclick="window.open(this.href,'_blank');return false;">GUIDO Music Notation Format Site</a> | <a href="http://www.noteserver.org/" onclick="window.open(this.href,'_blank');return false;">Guido Note Server</a> | <a href="http://sourceforge.net/projects/guidolib/" onclick="window.open(this.href,'_blank');return false;">SourceForge Homepage</a></p>
-  </td>
- </tr>
-</table>
-</body>
-</html>
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/PSFixed/PSFixed.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/PSFixed/PSFixed.js
deleted file mode 100644
index ad41cf1..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/PSFixed/PSFixed.js
+++ /dev/null
@@ -1,147 +0,0 @@
-/**

- * PSFixed PSFixed.js file.

- * This plugin is a fake persistent storage backed.  It is configured with a

- * fixed list of stored objects and presents them to the user for insertion.

- * A sample config is below:

- *

- * PSFixed.config = {

- *     'xinha.png': {

- *         $type: 'image',

- *         URL: 'http://trac.xinha.org/chrome/common/trac_banner.png'

- *     },

- *     'browser': {

- *         $type: 'folder',

- *         'firefox.png': {

- *             $type: 'image',

- *             URL: 'http://www.mozilla.com/img/tignish/firefox/vs-firefox-logo.png'

- *         }

- *     }

- * }

- */

-(function() {

-var PSFixed = window.PSFixed = function PSFixed(editor) {

-  this.editor = editor;

-}

-

-PSFixed._pluginInfo = {

-    name          : "PSFixed",

-    version       : "2.0",

-    developer     : "Douglas Mayle",

-    developer_url : "http://xinha.org",

-    license       : "BSD"

-};

-

-PSFixed.prototype.onGenerateOnce = function () {

-  // We use _prepareDialog to asynchronously load the dialog markup and then

-  // perform necessary processing.

-  this._registerBackend();

-};

-

-PSFixed.prototype._registerBackend = function(timeWaited) {

-  var editor = this.editor;

-  var self = this;

-

-  if (!timeWaited) {

-    timeWaited = 0;

-  }

-

-  // Retry over a period of ten seconds to register.  We back off exponentially

-  // to limit resouce usage in the case of misconfiguration.

-  var registerTimeout = 10000;

-

-  if (timeWaited > registerTimeout) {

-    // This is most likely a configuration error.  We're loaded and

-    // PersistentStorage is not.

-    return;

-  }

-

-  if (!editor.plugins['PersistentStorage'] ||

-      !editor.plugins['PersistentStorage'].instance ||

-      !editor.plugins['PersistentStorage'].instance.ready) {

-

-    window.setTimeout(function() {self._registerBackend(timeWaited ? timeWaited*2 : 50);}, timeWaited ? timeWaited : 50);

-    return;

-  }

-  editor.plugins['PersistentStorage'].instance.registerBackend('PSFixed', this);

-}

-

-PSFixed.prototype.loadData = function (asyncCallback) {

-  // We don't expect the user to set the type on the root folder, so we set it

-  // ourselves.

-  if (!this.config.$type) {

-    this.config.$type = 'folder';

-  }

-  asyncCallback(this.config);

-}

-

-var treeRecurse = function treeRecurse(tree, callback, root) {

-  if (typeof root == 'undefined') {

-    root = '/';

-    callback('/', '', tree);

-  }

-

-  for (var key in tree) {

-    callback(root, key, tree[key]);

-

-    if (tree[key].$type == 'folder') {

-      treeRecurse(tree[key], callback, root + key + '/');

-    }

-  }

-};

-

-PSFixed.prototype.getFilters = function(dirTree) {

-  var filters = [];

-

-  treeRecurse(dirTree, function(path, key, value) {

-      if (value.$type != 'folder') {

-        return;

-      }

-

-      var filePath = key.length ? path + key + '/' : path;

-      filters.push({

-        value: filePath,

-        display: filePath

-      });

-  });

-

-  return filters;

-}

-

-PSFixed.prototype.getMetadata = function(dirTree, filterPath) {

-  var editor = this.editor;

-  var self = this;

-

-  var metadata = [];

-

-  treeRecurse(dirTree, function(path, key, value) {

-    if (!value.$type || !key) {

-      // This is a builtin property of objects, not one returned by the

-      // backend.

-      return;

-    }

-

-    if (path != filterPath) {

-      return;

-    }

-

-    if (value.$type == 'folder') {

-      metadata.push({

-        URL: self.editor.imgURL('folder.gif', 'PersistentStorage'),

-        name: key,

-        key: path + key,

-        $type: value.$type

-      });

-    } else {

-      metadata.push({

-        URL: value.URL,

-        name: key,

-        key: path + key,

-        $type: value.$type

-      });

-    }

-  });

-

-  return metadata;

-}

-

-})();

diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/PSLocal/PSLocal.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/PSLocal/PSLocal.js
deleted file mode 100644
index d9ebe53..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/PSLocal/PSLocal.js
+++ /dev/null
@@ -1,355 +0,0 @@
-/**

- * PSLocal PSLocal.js file.

- * This plugin is a Gears based local persistent storage backend.

- */

-(function() {

-var PSLocal = window.PSLocal = function PSLocal(editor) {

-  this.editor = editor;

-

-  this.config = {

-    capabilities: {

-      directory_operations: true,

-      file_operations: true,

-      image_operations: false,

-      upload_operations: true,

-      import_operations: false,

-      user_publish: false,

-      shared_publish: false,

-      user_storage: true

-    },

-    displayName: 'Local'

-  }

-}

-

-PSLocal._pluginInfo = {

-    name          : "PSLocal",

-    version       : "2.0",

-    developer     : "Douglas Mayle",

-    developer_url : "http://xinha.org",

-    license       : "BSD"

-};

-

-PSLocal.prototype.onGenerateOnce = function () {

-  // We use _prepareBackend to asynchronously load the Gears backend.

-  this._prepareBackend();

-};

-

-PSLocal.prototype._showGearsButton = function() {

-  var self = this;

-  var editor = this.editor;

-

-  editor.config.registerButton({

-      id       : 'localstorage',

-      tooltip  : Xinha._lc( 'Learn About Local Storage', 'PSLocal' ),

-      image    : [_editor_url + editor.config.imgURL + 'ed_buttons_main.png',2,8],

-      textMode : true,

-      action   : function() { self.learnDialog(); }

-    }

-  );

-  editor.config.addToolbarElement('localstorage', 'fullscreen', 1);

-

-  // Since this is after the editor load, we have to trigger an udate manually...

-  editor._rebuildToolbar();

-}

-

-PSLocal.prototype._prepareBackend = function() {

-  var self = this;

-  var editor = this.editor;

-

-  if (!this.gears_init) {

-    this.gears_init = true;

-    Xinha._loadback(Xinha.getPluginDir("PSLocal") + "/gears_init.js",

-                   function() { 

-                     self._prepareBackend();

-                   });

-    return;

-  }

-

-  if (!window.google || !google.gears) {

-    // No gears, so no need to register.  We'll register a button, however, to

-    // enable users to learn about the support we offer.

-    this._showGearsButton();

-    return;

-  }

-

-  if (!google.gears.factory.hasPermission) {

-    if (!google.gears.factory.getPermission('Xinha', editor.imgURL('/images/xinha-small-icon.gif'), Xinha._lc( 'Enable Gears in order to use local document storage and configuration.', 'PSLocal' ))) {

-      // The user has denied access to Gears.  We'll give them a UI to allow

-      // them to change their mind.

-      this._showGearsButton();

-      return;

-    }

-  }

-

-  this.workerPool = google.gears.factory.create('beta.workerpool', '1.0');  

-

-  this.remoteStorageWorker = this.workerPool.createWorkerFromUrl("http://xinhadocs.org/worker.js");

-

-  this._registerBackend();

-}

-

-PSLocal.prototype.learnDialog = function(timeWaited) {

-  var self = this;

-  var editor = this.editor;

-

-  if (!this.html) {

-    Xinha._getback(Xinha.getPluginDir("PSLocal") + "/dialog.html",

-                   function(getback) { 

-                     self.html = getback;

-                     self.learnDialog();

-                   });

-    return;

-  }

-

-  if (this.dialog) {

-    this.dialog.show();

-    return;

-  }

-

-  this.dialog = new Xinha.Dialog(editor, this.html, "PersistentStorage", 

-                                 {width: 700,

-                                  closeOnEscape: true,

-                                  resizable: true,

-                                  centered: true,

-                                  modal: true

-                                 });

-

-  var link = this.dialog.getElementById('GearsLink');

-

-  // Tack on our URL so that Google will return here after installation.

-  link.href += location.href;

-

-  var button = this.dialog.getElementById("confirm");

-  if (window.google && google.gears) {

-    Xinha._addClass(this.dialog.getElementById('InstallText'), 'hidden');

-    // The user has gears installed, but has denied us access to it, so we'll

-    // give them the option to change their mind.

-    button.value = Xinha._lc('Enable', 'PSLocal');

-

-    button.onclick = function() {

-      // The user gave us permission, so we'll reload the page.

-      if (confirm(Xinha._lc('This will reload the page, causing you to lose any unsaved work.  Press "OK" to reload.', 'PSLocal' ))) {

-        window.location.reload(true);

-      }

-    }

-  } else {

-    Xinha._addClass(this.dialog.getElementById('EnableText'), 'hidden');

-    // Gears isn't installed, so we'll build the dialog to prompt installation.

-    button.value = Xinha._lc('Install', 'PSLocal');

-

-    button.onclick = function() {

-      location.href = link.href;

-    }

-  }

-

-  var cancel = this.dialog.getElementById('cancel');

-  cancel.onclick = function() {

-    self.dialog.hide();

-  }

-

-  this.dialog.show();

-}

-

-PSLocal.prototype._registerBackend = function(timeWaited) {

-  var editor = this.editor;

-  var self = this;

-

-  if (!timeWaited) {

-    timeWaited = 0;

-  }

-

-  // Retry over a period of ten seconds to register.  We back off exponentially

-  // to limit resouce usage in the case of misconfiguration.

-  var registerTimeout = 10000;

-

-  if (timeWaited > registerTimeout) {

-    // This is most likely a configuration error.  We're loaded and

-    // PersistentStorage is not.

-    return;

-  }

-

-  if (!editor.plugins['PersistentStorage'] ||

-      !editor.plugins['PersistentStorage'].instance ||

-      !editor.plugins['PersistentStorage'].instance.ready) {

-

-    window.setTimeout(function() {self._registerBackend(timeWaited ? timeWaited*2 : 50);}, timeWaited ? timeWaited : 50);

-    return;

-  }

-  var PS = editor.plugins['PersistentStorage'].instance;

-  var self = this;

-  

-  this.config.thumbURL = this.editor.imgURL('images/tango/32x32/places/folder.png');

-  this.loadDocument({URL:'', name:'config.js', key:'/config.js'}, function(json) {

-                   var userconfig = json ? eval('(' + json + ')') : false;

-                   PS.registerBackend('PSLocal', self, self.config, userconfig);

-                   });

-}

-

-PSLocal.prototype.loadDocument = function(entry, asyncCallback) {

-

-  this.workerPool.onmessage = function(a, b, message) {

-    if (!message.body || !message.body.authorized) {

-      // Fail

-      asyncCallback('');

-    }

-

-    if (message.body.response) {

-      asyncCallback(message.body.response);

-    } else if (entry.URL) {

-      Xinha._getback(entry.URL,

-                 function(documentSource) { 

-                   asyncCallback(documentSource);

-                 });

-    } else {

-      // Oops, no data :-(

-      asyncCallback('');

-    }

-  }

-

-  this.workerPool.sendMessage({func: 'loadDocument', entry: entry}, this.remoteStorageWorker);

-}

-

-PSLocal.prototype.loadData = function (asyncCallback) {

-  this.workerPool.onmessage = function(a, b, message) {

-    if (!message.body || !message.body.authorized) {

-      // Fail

-      asyncCallback('');

-    }

-

-    asyncCallback({dirs: message.body.dirs, files: message.body.files});

-  }

-

-  this.workerPool.sendMessage({func: 'loadData'}, this.remoteStorageWorker);

-}

-

-PSLocal.prototype.getFilters = function(filedata) {

-  // Clear out the previous directory listing.

-  var filters = [], paths = {};

-  var dirList = filedata.dirs;

-

-  for (var index=0; index<dirList.length; ++index) {

-    filters.push({value:dirList[index],display:dirList[index]});

-  }

-

-  // We can't return an empty filter list.

-  if (!filters.length) {

-    filters.push({value:'/',display:'/'});

-  }

-

-  return filters;

-}

-

-PSLocal.prototype.getMetadata = function(filedata, filterPath) {

-  var editor = this.editor;

-  var self = this;

-

-  var metadata = [];

-  var fileList = filedata.files;

-

-  for (var index=0; index<fileList.length; ++index) {

-      // Gah perform file splitting here..

-    var pathpart = fileList[index].fullpath.split('/');

-    if (pathpart.length > 2) {

-      pathpart = pathpart.slice(0,pathpart.length-1).join('/');

-    } else {

-      pathpart = '/';

-    }

-

-    var filepart = fileList[index].fullpath.split('/').slice(-1)[0];

-    if (filterPath == pathpart) {

-      metadata.push({

-        URL: fileList[index].url,

-        thumbURL: editor.imgURL('images/tango/32x32/mimetypes/text-x-generic.png'),

-        name: filepart,

-        key: fileList[index].fullpath,

-        $type: fileList[index].filetype

-      });

-    }

-  }

-

-  var dirList = filedata.dirs;

-

-  for (var index=0; index<dirList.length; ++index) {

-    // We have to be careful to filter out when filterPath IS the current intry in dirList

-    if (1 == filterPath.length) {

-        // If the filter path is the root '/' (ie. length of one) then we

-        // select the directory if a) It is not also of length one (ie. '/')

-        // and b) has only one slash in it.  (We check the number of slashes by

-        // splitting the string by '/' and subtracting one from the length.)

-        var matches = dirList[index].length > 1 && dirList[index].split('/').length == 2;

-    } else {

-        // Chop the last component of the directory and compare against the filter.

-        var matches = dirList[index].split('/').slice(0,-1).join('/') == filterPath;

-    }

-    if (matches) {

-      metadata.push({

-        name: dirList[index].split('/').slice(-1),

-        key: dirList[index],

-        $type: 'folder'

-      });

-    }

-  }

-

-  return metadata;

-}

-

-PSLocal.prototype.saveDocument = function(parentpath, filename, documentSource, asyncCallback) {

-  this.workerPool.onmessage = function(a, b, message) {

-    if (!message.body || !message.body.authorized) {

-      // Fail

-      asyncCallback(false);

-    }

-

-    if (asyncCallback) {

-      asyncCallback(message.body.response);

-    }

-  }

-

-  this.workerPool.sendMessage({func: 'saveDocument', parentpath: parentpath, filename: filename, content:documentSource}, this.remoteStorageWorker);

-}

-PSLocal.prototype.deleteEntry = function(entry, asyncCallback) {

-  this.workerPool.onmessage = function(a, b, message) {

-    if (!message.body || !message.body.authorized) {

-      // Fail

-      asyncCallback(false);

-    }

-

-    if (asyncCallback) {

-      asyncCallback(message.body.response);

-    }

-  }

-

-  this.workerPool.sendMessage({func: 'deleteEntry', entry: entry}, this.remoteStorageWorker);

-}

-

-PSLocal.prototype.makeFolder = function(currentPath, folderName, asyncCallback) {

-  this.workerPool.onmessage = function(a, b, message) {

-    if (!message.body || !message.body.authorized) {

-      // Fail

-      asyncCallback(false);

-    }

-

-    if (asyncCallback) {

-      asyncCallback(true);

-    }

-  }

-

-  this.workerPool.sendMessage({func: 'makeFolder', parentpath: currentPath, dirname: folderName}, this.remoteStorageWorker);

-}

-

-PSLocal.prototype.copyEntry = function(entry, asyncCallback) {

-  this.workerPool.onmessage = function(a, b, message) {

-    if (!message.body || !message.body.authorized) {

-      // Fail

-      asyncCallback(false);

-    }

-

-    if (asyncCallback) {

-      asyncCallback(message.body.response, message.body.entry);

-    }

-  }

-

-  this.workerPool.sendMessage({func: 'copyEntry', entry: entry}, this.remoteStorageWorker);

-}

-

-})();

diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/PSLocal/dialog.html b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/PSLocal/dialog.html
deleted file mode 100644
index 8e81138..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/PSLocal/dialog.html
+++ /dev/null
@@ -1,6 +0,0 @@
-<h1><l10n>Enabling Local Storage</l10n></h1>
-<p><l10n>Xinha uses Google Gears to enable local document storage.  With Gears installed, you can save drafts of your documents on your hard drive, configure Xinha to look the way you want, and carry this information wherever you use Xinha on the web.</l10n></p>
-<p id="InstallText"><l10n>To learn more about Gears, and enable this functionality on your system, please see <a id="[GearsLink]" href="http://gears.google.com/?action=install&message=Enable local storage for Xinha&return=">http://gears.google.com</a> or click "Install" below.</l10n></p>
-<p id="EnableText"><l10n>To enable Gears for this website, click "Enable" to reload the page then enable Gears..  Since the page will be refreshed, please be sure to save any unfinished work.</l10n></p>
-<input type="button" id="[confirm]" value="_(Confirm)" />
-<input type="button" id="[cancel]" value="_(Cancel)" />
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/PSLocal/gears_init.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/PSLocal/gears_init.js
deleted file mode 100644
index 5f44f09..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/PSLocal/gears_init.js
+++ /dev/null
@@ -1,86 +0,0 @@
-// Copyright 2007, Google Inc.
-//
-// 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 Google 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 AUTHOR ``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 AUTHOR 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.
-//
-// Sets up google.gears.*, which is *the only* supported way to access Gears.
-//
-// Circumvent this file at your own risk!
-//
-// In the future, Gears may automatically define google.gears.* without this
-// file. Gears may use these objects to transparently fix bugs and compatibility
-// issues. Applications that use the code below will continue to work seamlessly
-// when that happens.
-
-(function() {
-  // We are already defined. Hooray!
-  if (window.google && google.gears) {
-    return;
-  }
-
-  var factory = null;
-
-  // Firefox
-  if (typeof GearsFactory != 'undefined') {
-    factory = new GearsFactory();
-  } else {
-    // IE
-    try {
-      factory = new ActiveXObject('Gears.Factory');
-      // privateSetGlobalObject is only required and supported on WinCE.
-      if (factory.getBuildInfo().indexOf('ie_mobile') != -1) {
-        factory.privateSetGlobalObject(this);
-      }
-    } catch (e) {
-      // Safari
-      if ((typeof navigator.mimeTypes != 'undefined')
-           && navigator.mimeTypes["application/x-googlegears"]) {
-        factory = document.createElement("object");
-        factory.style.display = "none";
-        factory.width = 0;
-        factory.height = 0;
-        factory.type = "application/x-googlegears";
-        document.documentElement.appendChild(factory);
-      }
-    }
-  }
-
-  // *Do not* define any objects if Gears is not installed. This mimics the
-  // behavior of Gears defining the objects in the future.
-  if (!factory) {
-    return;
-  }
-
-  // Now set up the objects, being careful not to overwrite anything.
-  //
-  // Note: In Internet Explorer for Windows Mobile, you can't add properties to
-  // the window object. However, global objects are automatically added as
-  // properties of the window object in all browsers.
-  if (!window.google) {
-    google = {};
-  }
-
-  if (!google.gears) {
-    google.gears = {factory: factory};
-  }
-})();
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/PSLocal/lang/b5.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/PSLocal/lang/b5.js
deleted file mode 100644
index 7c32fc5..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/PSLocal/lang/b5.js
+++ /dev/null
@@ -1,15 +0,0 @@
-// I18N constants
-// LANG: "b5", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "__OBSOLETE__": {
-        "___ TRANSLATOR NOTE   ___": "*** PSLOCAL IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***"
-    }
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/PSLocal/lang/ch.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/PSLocal/lang/ch.js
deleted file mode 100644
index 703496a..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/PSLocal/lang/ch.js
+++ /dev/null
@@ -1,16 +0,0 @@
-// I18N constants
-// LANG: "ch", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Cancel": "取消",
-    "__OBSOLETE__": {
-        "___ TRANSLATOR NOTE   ___": "*** PSLOCAL IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***"
-    }
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/PSLocal/lang/cz.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/PSLocal/lang/cz.js
deleted file mode 100644
index aa82d26..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/PSLocal/lang/cz.js
+++ /dev/null
@@ -1,16 +0,0 @@
-// I18N constants
-// LANG: "cz", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Cancel": "Zrušit",
-    "__OBSOLETE__": {
-        "___ TRANSLATOR NOTE   ___": "*** PSLOCAL IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***"
-    }
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/PSLocal/lang/da.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/PSLocal/lang/da.js
deleted file mode 100644
index c15b3b1..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/PSLocal/lang/da.js
+++ /dev/null
@@ -1,16 +0,0 @@
-// I18N constants
-// LANG: "da", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Cancel": "Annuller",
-    "__OBSOLETE__": {
-        "___ TRANSLATOR NOTE   ___": "*** PSLOCAL IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***"
-    }
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/PSLocal/lang/de.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/PSLocal/lang/de.js
deleted file mode 100644
index 3f0056e..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/PSLocal/lang/de.js
+++ /dev/null
@@ -1,16 +0,0 @@
-// I18N constants
-// LANG: "de", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Cancel": "Abbrechen",
-    "__OBSOLETE__": {
-        "___ TRANSLATOR NOTE   ___": "*** PSLOCAL IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***"
-    }
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/PSLocal/lang/ee.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/PSLocal/lang/ee.js
deleted file mode 100644
index c19679b..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/PSLocal/lang/ee.js
+++ /dev/null
@@ -1,16 +0,0 @@
-// I18N constants
-// LANG: "ee", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Cancel": "Loobu",
-    "__OBSOLETE__": {
-        "___ TRANSLATOR NOTE   ___": "*** PSLOCAL IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***"
-    }
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/PSLocal/lang/el.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/PSLocal/lang/el.js
deleted file mode 100644
index 4bb6eba..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/PSLocal/lang/el.js
+++ /dev/null
@@ -1,16 +0,0 @@
-// I18N constants
-// LANG: "el", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Cancel": "Ακύρωση",
-    "__OBSOLETE__": {
-        "___ TRANSLATOR NOTE   ___": "*** PSLOCAL IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***"
-    }
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/PSLocal/lang/es.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/PSLocal/lang/es.js
deleted file mode 100644
index f9f7603..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/PSLocal/lang/es.js
+++ /dev/null
@@ -1,16 +0,0 @@
-// I18N constants
-// LANG: "es", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Cancel": "Cancelar",
-    "__OBSOLETE__": {
-        "___ TRANSLATOR NOTE   ___": "*** PSLOCAL IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***"
-    }
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/PSLocal/lang/eu.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/PSLocal/lang/eu.js
deleted file mode 100644
index 676a5b2..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/PSLocal/lang/eu.js
+++ /dev/null
@@ -1,16 +0,0 @@
-// I18N constants
-// LANG: "eu", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Cancel": "Utzi",
-    "__OBSOLETE__": {
-        "___ TRANSLATOR NOTE   ___": "*** PSLOCAL IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***"
-    }
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/PSLocal/lang/fa.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/PSLocal/lang/fa.js
deleted file mode 100644
index f9e87f5..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/PSLocal/lang/fa.js
+++ /dev/null
@@ -1,16 +0,0 @@
-// I18N constants
-// LANG: "fa", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Cancel": "انصراف",
-    "__OBSOLETE__": {
-        "___ TRANSLATOR NOTE   ___": "*** PSLOCAL IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***"
-    }
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/PSLocal/lang/fi.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/PSLocal/lang/fi.js
deleted file mode 100644
index c1c68e9..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/PSLocal/lang/fi.js
+++ /dev/null
@@ -1,16 +0,0 @@
-// I18N constants
-// LANG: "fi", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Cancel": "Peruuta",
-    "__OBSOLETE__": {
-        "___ TRANSLATOR NOTE   ___": "*** PSLOCAL IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***"
-    }
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/PSLocal/lang/fr.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/PSLocal/lang/fr.js
deleted file mode 100644
index e38c488..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/PSLocal/lang/fr.js
+++ /dev/null
@@ -1,16 +0,0 @@
-// I18N constants
-// LANG: "fr", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Cancel": "Annuler",
-    "__OBSOLETE__": {
-        "___ TRANSLATOR NOTE   ___": "*** PSLOCAL IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***"
-    }
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/PSLocal/lang/fr_ca.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/PSLocal/lang/fr_ca.js
deleted file mode 100644
index 276d37b..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/PSLocal/lang/fr_ca.js
+++ /dev/null
@@ -1,15 +0,0 @@
-// I18N constants
-// LANG: "fr_ca", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "__OBSOLETE__": {
-        "___ TRANSLATOR NOTE   ___": "*** PSLOCAL IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***"
-    }
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/PSLocal/lang/gb.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/PSLocal/lang/gb.js
deleted file mode 100644
index dd1ba3f..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/PSLocal/lang/gb.js
+++ /dev/null
@@ -1,15 +0,0 @@
-// I18N constants
-// LANG: "gb", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "__OBSOLETE__": {
-        "___ TRANSLATOR NOTE   ___": "*** PSLOCAL IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***"
-    }
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/PSLocal/lang/he.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/PSLocal/lang/he.js
deleted file mode 100644
index 116dea6..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/PSLocal/lang/he.js
+++ /dev/null
@@ -1,16 +0,0 @@
-// I18N constants
-// LANG: "he", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Cancel": "ביטול",
-    "__OBSOLETE__": {
-        "___ TRANSLATOR NOTE   ___": "*** PSLOCAL IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***"
-    }
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/PSLocal/lang/hu.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/PSLocal/lang/hu.js
deleted file mode 100644
index 702caa6..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/PSLocal/lang/hu.js
+++ /dev/null
@@ -1,16 +0,0 @@
-// I18N constants
-// LANG: "hu", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Cancel": "Mégsem",
-    "__OBSOLETE__": {
-        "___ TRANSLATOR NOTE   ___": "*** PSLOCAL IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***"
-    }
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/PSLocal/lang/it.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/PSLocal/lang/it.js
deleted file mode 100644
index b2045d2..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/PSLocal/lang/it.js
+++ /dev/null
@@ -1,16 +0,0 @@
-// I18N constants
-// LANG: "it", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Cancel": "Annullamento",
-    "__OBSOLETE__": {
-        "___ TRANSLATOR NOTE   ___": "*** PSLOCAL IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***"
-    }
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/PSLocal/lang/ja.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/PSLocal/lang/ja.js
deleted file mode 100644
index 195b203..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/PSLocal/lang/ja.js
+++ /dev/null
@@ -1,16 +0,0 @@
-// I18N constants
-// LANG: "ja", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Cancel": "中止",
-    "__OBSOLETE__": {
-        "___ TRANSLATOR NOTE   ___": "*** PSLOCAL IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***"
-    }
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/PSLocal/lang/lc_base.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/PSLocal/lang/lc_base.js
deleted file mode 100644
index b84dc11..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/PSLocal/lang/lc_base.js
+++ /dev/null
@@ -1,33 +0,0 @@
-// I18N constants
-//
-// LANG: "en", ENCODING: UTF-8
-// Author: Translator-Name, <email@example.com>
-//
-// Last revision: 2018-04-12
-// 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).
-//
-// (Please, remove information below)
-// 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.)
-
-{
-    "Cancel": "",
-    "Confirm": "",
-    "Enable": "",
-    "Enable Gears in order to use local document storage and configuration.": "",
-    "Enabling Local Storage": "",
-    "Install": "",
-    "Learn About Local Storage": "",
-    "This will reload the page, causing you to lose any unsaved work.  Press \"OK\" to reload.": "",
-    "Xinha uses Google Gears to enable local document storage.  With Gears installed, you can save drafts of your documents on your hard drive, configure Xinha to look the way you want, and carry this information wherever you use Xinha on the web.": ""
-}
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/PSLocal/lang/lt.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/PSLocal/lang/lt.js
deleted file mode 100644
index 44fd02e..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/PSLocal/lang/lt.js
+++ /dev/null
@@ -1,16 +0,0 @@
-// I18N constants
-// LANG: "lt", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Cancel": "Atšaukti",
-    "__OBSOLETE__": {
-        "___ TRANSLATOR NOTE   ___": "*** PSLOCAL IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***"
-    }
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/PSLocal/lang/lv.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/PSLocal/lang/lv.js
deleted file mode 100644
index 162ace6..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/PSLocal/lang/lv.js
+++ /dev/null
@@ -1,16 +0,0 @@
-// I18N constants
-// LANG: "lv", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Cancel": "Atcelt",
-    "__OBSOLETE__": {
-        "___ TRANSLATOR NOTE   ___": "*** PSLOCAL IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***"
-    }
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/PSLocal/lang/nb.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/PSLocal/lang/nb.js
deleted file mode 100644
index c78e1e0..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/PSLocal/lang/nb.js
+++ /dev/null
@@ -1,16 +0,0 @@
-// I18N constants
-// LANG: "nb", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Cancel": "Avbryt",
-    "__OBSOLETE__": {
-        "___ TRANSLATOR NOTE   ___": "*** PSLOCAL IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***"
-    }
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/PSLocal/lang/nl.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/PSLocal/lang/nl.js
deleted file mode 100644
index 0f39f95..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/PSLocal/lang/nl.js
+++ /dev/null
@@ -1,16 +0,0 @@
-// I18N constants
-// LANG: "nl", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Cancel": "Annuleren",
-    "__OBSOLETE__": {
-        "___ TRANSLATOR NOTE   ___": "*** PSLOCAL IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***"
-    }
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/PSLocal/lang/pl.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/PSLocal/lang/pl.js
deleted file mode 100644
index efc8b84..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/PSLocal/lang/pl.js
+++ /dev/null
@@ -1,16 +0,0 @@
-// I18N constants
-// LANG: "pl", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Cancel": "Anuluj",
-    "__OBSOLETE__": {
-        "___ TRANSLATOR NOTE   ___": "*** PSLOCAL IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***"
-    }
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/PSLocal/lang/pt_br.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/PSLocal/lang/pt_br.js
deleted file mode 100644
index 675ac40..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/PSLocal/lang/pt_br.js
+++ /dev/null
@@ -1,16 +0,0 @@
-// I18N constants
-// LANG: "pt_br", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Cancel": "Cancelar",
-    "__OBSOLETE__": {
-        "___ TRANSLATOR NOTE   ___": "*** PSLOCAL IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***"
-    }
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/PSLocal/lang/ro.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/PSLocal/lang/ro.js
deleted file mode 100644
index a08bd65..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/PSLocal/lang/ro.js
+++ /dev/null
@@ -1,16 +0,0 @@
-// I18N constants
-// LANG: "ro", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Cancel": "Renunţă",
-    "__OBSOLETE__": {
-        "___ TRANSLATOR NOTE   ___": "*** PSLOCAL IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***"
-    }
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/PSLocal/lang/ru.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/PSLocal/lang/ru.js
deleted file mode 100644
index fc35cb1..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/PSLocal/lang/ru.js
+++ /dev/null
@@ -1,16 +0,0 @@
-// I18N constants
-// LANG: "ru", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Cancel": "Отмена",
-    "__OBSOLETE__": {
-        "___ TRANSLATOR NOTE   ___": "*** PSLOCAL IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***"
-    }
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/PSLocal/lang/sh.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/PSLocal/lang/sh.js
deleted file mode 100644
index da9ad44..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/PSLocal/lang/sh.js
+++ /dev/null
@@ -1,16 +0,0 @@
-// I18N constants
-// LANG: "sh", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Cancel": "Poništi",
-    "__OBSOLETE__": {
-        "___ TRANSLATOR NOTE   ___": "*** PSLOCAL IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***"
-    }
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/PSLocal/lang/si.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/PSLocal/lang/si.js
deleted file mode 100644
index da48413..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/PSLocal/lang/si.js
+++ /dev/null
@@ -1,16 +0,0 @@
-// I18N constants
-// LANG: "si", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Cancel": "Prekliči",
-    "__OBSOLETE__": {
-        "___ TRANSLATOR NOTE   ___": "*** PSLOCAL IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***"
-    }
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/PSLocal/lang/sr.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/PSLocal/lang/sr.js
deleted file mode 100644
index 3d02c61..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/PSLocal/lang/sr.js
+++ /dev/null
@@ -1,16 +0,0 @@
-// I18N constants
-// LANG: "sr", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Cancel": "Поништи",
-    "__OBSOLETE__": {
-        "___ TRANSLATOR NOTE   ___": "*** PSLOCAL IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***"
-    }
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/PSLocal/lang/sv.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/PSLocal/lang/sv.js
deleted file mode 100644
index 7fe72e3..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/PSLocal/lang/sv.js
+++ /dev/null
@@ -1,16 +0,0 @@
-// I18N constants
-// LANG: "sv", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Cancel": "Avbryt",
-    "__OBSOLETE__": {
-        "___ TRANSLATOR NOTE   ___": "*** PSLOCAL IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***"
-    }
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/PSLocal/lang/th.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/PSLocal/lang/th.js
deleted file mode 100644
index 83718c7..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/PSLocal/lang/th.js
+++ /dev/null
@@ -1,16 +0,0 @@
-// I18N constants
-// LANG: "th", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Cancel": "ยกเลิก",
-    "__OBSOLETE__": {
-        "___ TRANSLATOR NOTE   ___": "*** PSLOCAL IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***"
-    }
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/PSLocal/lang/tr.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/PSLocal/lang/tr.js
deleted file mode 100644
index cef4e03..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/PSLocal/lang/tr.js
+++ /dev/null
@@ -1,16 +0,0 @@
-// I18N constants
-// LANG: "tr", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Cancel": "İptal",
-    "__OBSOLETE__": {
-        "___ TRANSLATOR NOTE   ___": "*** PSLOCAL IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***"
-    }
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/PSLocal/lang/vn.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/PSLocal/lang/vn.js
deleted file mode 100644
index 0e4ced5..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/PSLocal/lang/vn.js
+++ /dev/null
@@ -1,16 +0,0 @@
-// I18N constants
-// LANG: "vn", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Cancel": "Hủy",
-    "__OBSOLETE__": {
-        "___ TRANSLATOR NOTE   ___": "*** PSLOCAL IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***"
-    }
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/PSLocal/lang/zh_cn.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/PSLocal/lang/zh_cn.js
deleted file mode 100644
index d307ffd..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/PSLocal/lang/zh_cn.js
+++ /dev/null
@@ -1,15 +0,0 @@
-// I18N constants
-// LANG: "zh_cn", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "__OBSOLETE__": {
-        "___ TRANSLATOR NOTE   ___": "*** PSLOCAL IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***"
-    }
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/PSServer/PSServer.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/PSServer/PSServer.js
deleted file mode 100644
index 639cec8..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/PSServer/PSServer.js
+++ /dev/null
@@ -1,282 +0,0 @@
-/**

- * PSServer PSServer.js file.

- * This plugin is a server based persistent storage backend.

- */

-(function() {

-var PSServer = window.PSServer = function PSServer(editor) {

-  this.editor = editor;

-}

-

-PSServer._pluginInfo = {

-    name          : "PSServer",

-    version       : "2.0",

-    developer     : "Douglas Mayle",

-    developer_url : "http://xinha.org",

-    license       : "MIT"

-};

-

-PSServer.prototype.onGenerateOnce = function () {

-  // We use _loadConfig to asynchronously load the config and then register the

-  // backend.

-  this._loadConfig();

-};

-

-PSServer.prototype._loadConfig = function() {

-  var self = this;

-  if (!this._serverConfig) {

-    Xinha._getback(Xinha.getPluginDir("PSServer") + "/config.inc.php",

-                   function(config) { 

-                     self._serverConfig = eval('(' + config + ')');

-                     self._serverConfig.user_affinity = 20;

-                     self._serverConfig.displayName = 'Server';

-                     self._loadConfig();

-                   });

-    return;

-  }

-

-  this._registerBackend();

-}

-

-PSServer.prototype._registerBackend = function(timeWaited) {

-  var editor = this.editor;

-  var self = this;

-

-  if (!timeWaited) {

-    timeWaited = 0;

-  }

-

-  // Retry over a period of ten seconds to register.  We back off exponentially

-  // to limit resouce usage in the case of misconfiguration.

-  var registerTimeout = 10000;

-

-  if (timeWaited > registerTimeout) {

-    // This is most likely a configuration error.  We're loaded and

-    // PersistentStorage is not.

-    return;

-  }

-

-  if (!editor.plugins['PersistentStorage'] ||

-      !editor.plugins['PersistentStorage'].instance ||

-      !editor.plugins['PersistentStorage'].instance.ready) {

-

-    window.setTimeout(function() {self._registerBackend(timeWaited ? timeWaited*2 : 50);}, timeWaited ? timeWaited : 50);

-    return;

-  }

-  editor.plugins['PersistentStorage'].instance.registerBackend('PSServer', this, this._serverConfig);

-}

-

-PSServer.prototype.loadData = function (asyncCallback) {

-  var self = this;

-  Xinha._getback(Xinha.getPluginDir("PSServer") + "/backend.php?directory&listing",

-                 function(json) { 

-                   self.dirTree = eval('(' + json + ')');

-                   asyncCallback(self.dirTree);

-                 });

-}

-

-var treeRecurse = function treeRecurse(tree, callback, root) {

-  if (typeof root == 'undefined') {

-    root = '/';

-    callback('/', '', tree);

-  }

-

-  for (var key in tree) {

-    callback(root, key, tree[key]);

-

-    if (tree[key].$type == 'folder') {

-      treeRecurse(tree[key], callback, root + key + '/');

-    }

-  }

-};

-

-PSServer.prototype.getFilters = function(dirTree) {

-  // Clear out the previous directory listing.

-  var filters = [];

-

-  treeRecurse(dirTree, function(path, key, value) {

-      if (value.$type != 'folder') {

-        return;

-      }

-

-      var filePath = key.length ? path + key + '/' : path;

-      var filePathDisplay = key.length ? path + key + '/' : path;

-      if (filePathDisplay.length > 1) {

-        filePathDisplay = filePathDisplay.substring(0, filePathDisplay.length-1);

-      }

-      filters.push({

-        value: filePath,

-        display: filePathDisplay

-      });

-  });

-

-  return filters;

-}

-

-PSServer.prototype.loadDocument = function(entry, asyncCallback) {

-

-  Xinha._getback(entry.URL,

-                 function(documentSource) { 

-                   asyncCallback(documentSource);

-                 });

-}

-PSServer.prototype.getMetadata = function(dirTree, pathFilter, typeFilter) {

-  var editor = this.editor;

-  var self = this;

-

-  var metadata = [];

-

-  var typeKeys = {};

-  for (var index=0; index<typeFilter.length; ++index) {

-    typeKeys[typeFilter[index]] = true;

-  }

-

-  treeRecurse(dirTree, function(path, key, value) {

-    if (!value.$type || !key) {

-      // This is a builtin property of objects, not one returned by the

-      // backend.

-      return;

-    }

-

-    if (path != pathFilter) {

-      return;

-    }

-

-    if (!(value.$type in typeKeys)) {

-      return;

-    }

-

-    if ((value.$type == 'folder') || (value.$type == 'html') || 

-        (value.$type == 'text') || (value.$type == 'document')) {

-      metadata.push({

-        name: key,

-        key: path + key,

-        $type: value.$type

-      });

-    } else {

-      metadata.push({

-        URL: Xinha.getPluginDir("PSServer") + '/demo_images' + path + key,

-        name: key,

-        key: path + key,

-        $type: value.$type

-      });

-    }

-  });

-

-  return metadata;

-}

-

-PSServer.prototype.loadDocument = function(entry, asyncCallback) {

-  var self = this;

-  Xinha._getback(Xinha.getPluginDir("PSServer") + '/demo_images' + entry.key,

-                 function(documentSource) { 

-                   asyncCallback(documentSource);

-                 });

-}

-

-PSServer.prototype.buildImportUI = function(dialog, element) {

-  // We receive an HTML element and are expected to build an HTML UI.  We'll

-  // model it off of this HTML fragment:

-  //  <form target="importFrame" action="../plugins/PSServer/backend.php?upload&amp;replace=false&amp;" id="importForm" method="post" enctype="multipart/form-data">

-  //    File: <input type="file" name="filedata" /><input type="submit" value="_(Import)" />

-  //  </form>

-  //  <iframe id="importFrame" name="importFrame" src="#" style="display:none;"></iframe>

-  var iframeID = dialog.createId('importFrame');

-

-  var form = document.createElement('form');

-  form.setAttribute('enctype', 'multipart/form-data');

-  form.setAttribute('method', 'post');

-  form.setAttribute('action', Xinha.getPluginDir("PSServer") + "/backend.php?upload&replace=true&");

-

-  var fileentry = document.createElement('input');

-  fileentry.setAttribute('type', 'file');

-  fileentry.setAttribute('name', 'filedata');

-

-  var submitbutton = document.createElement('input');

-  submitbutton.setAttribute('type', 'submit');

-  submitbutton.setAttribute('value',Xinha._lc('Import', 'PSServer'));

-

-  var filetext = document.createTextNode(Xinha._lc('File: ', 'PSServer'));

-  filetext = form.appendChild(filetext);

-

-  fileentry = form.appendChild(fileentry);

-

-  submitbutton = form.appendChild(submitbutton);

-

-  form = element.appendChild(form);

-  form.setAttribute('target', iframeID);

-

-  // The iframe must be added to the document after the form has been, or the targeting fails.

-  var iframe = document.createElement('iframe');

-  iframe.setAttribute('src', 'about:blank');

-  iframe.style.display = 'none';

-  iframe.id = iframe.name = iframeID;

-  iframe.onload = function() {

-    var docCheck = iframe.contentDocument || iframe.contentWindow;

-    if (docCheck.location.href == 'about:blank') {

-        return;

-    }

-    // What to do on import?  Add an entry to the UI, I guess...

-    alert('Add entry here');

-  }

-  iframe = element.appendChild(iframe);

-

-}

-

-PSServer.prototype.saveDocument = function(path, filename, documentSource, asyncCallback) {

-  Xinha._postback(Xinha.getPluginDir("PSServer") + "/backend.php?upload&replace=true&filedata=" + escape(documentSource)+"&filename="+escape(path + filename),

-                  null,

-                  function(response) { 

-                    asyncCallback(true);

-                  },

-                  function(response) { 

-                    asyncCallback(false);

-                  });

-}

-

-PSServer.prototype.makeFolder = function(currentPath, folderName, asyncCallback) {

-  Xinha._postback(Xinha.getPluginDir("PSServer") + "/backend.php?directory&create&dirname="+escape(currentPath + '/' + folderName),

-                  null,

-                  function(response) { 

-                    asyncCallback(true);

-                  },

-                  function(response) { 

-                    asyncCallback(false);

-                  });

-}

-

-PSServer.prototype.deleteEntry = function(entry, asyncCallback) {

-  Xinha._postback(Xinha.getPluginDir("PSServer") + "/backend.php?file&delete&filename="+escape(entry.key),

-                  null,

-                  function(response) { 

-                    asyncCallback(true);

-                  },

-                  function(response) { 

-                    asyncCallback(false);

-                  });

-}

-

-PSServer.prototype.moveEntry = function(entry, container, asyncCallback) {

-  Xinha._postback(Xinha.getPluginDir("PSServer") + "/backend.php?file&rename&filename="+escape(entry.key)+'&newname='+escape(container.key + '/' + entry.name),

-                  null,

-                  function(json) { 

-                    asyncCallback(true);

-                  },

-                  function(json) { 

-                    asyncCallback(false);

-                  });

-}

-

-PSServer.prototype.copyEntry = function(entry, asyncCallback) {

-  Xinha._postback(Xinha.getPluginDir("PSServer") + "/backend.php?file&copy&filename="+escape(entry.key),

-                  null,

-                  function(json) { 

-                    var newentry = eval('(' + json + ')');

-                    asyncCallback(true, newentry);

-                  },

-                  function(json) { 

-                    var newentry = eval('(' + json + ')');

-                    asyncCallback(false, newentry);

-                  });

-}

-

-})();

diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/PSServer/backend.php b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/PSServer/backend.php
deleted file mode 100644
index f78ed9f..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/PSServer/backend.php
+++ /dev/null
@@ -1,830 +0,0 @@
-<?php
-/**
- * File Operations API
- *
- * This file contains the new backend File Operations API used for Xinha File
- * Storage.  It will serve as the documentation for others wishing to implement
- * the backend in their own language, as well as the PHP implementation.  The
- * return data will come via the HTTP status in the case of an error, or JSON
- * data when call has succeeded.
- *
- * Some examples of the URLS associated with this API:
- * ** File Operations **
- * ?file&rename&filename=''&newname=''
- * ?file&copy&filename=''
- * ?file&delete&filename=''
- *
- * ** Directory Operations **
- * ?directory&listing
- * ?directory&create&dirname=''
- * ?directory&delete&dirname=''
- * ?directory&rename&dirname=''&newname=''
- *
- * ** Image Operations **
- * ?image&filename=''&[scale|rotate|convert]
- *
- * ** Upload **
- * ?upload&filedata=[binary|text]&filename=''&replace=[true|false]
- *
- * @author Douglas Mayle <douglas@openplans.org>
- * @version 1.0
- * @package PersistentStorage
- *
- */
-
-/**
- * Config file
- */
-require_once('config.inc.php');
-
-
-// Strip slashes if MQGPC is on
-set_magic_quotes_runtime(0);
-if(get_magic_quotes_gpc())
-{
-  $to_clean = array(&$_GET, &$_POST, &$_REQUEST, &$_COOKIE);
-  while(count($to_clean))
-  {
-    $cleaning =& $to_clean[array_pop($junk = array_keys($to_clean))];
-    unset($to_clean[array_pop($junk = array_keys($to_clean))]);
-    foreach(array_keys($cleaning) as $k)
-    {
-      if(is_array($cleaning[$k]))
-      {
-        $to_clean[] =& $cleaning[$k];
-      }
-      else
-      {
-        $cleaning[$k] = stripslashes($cleaning[$k]);
-      }
-    }
-  }
-}
-
-// Set the return headers for a JSON response.
-header('Cache-Control: no-cache, must-revalidate');
-header('Expires: Mon, 26 Jul 1997 05:00:00 GMT');
-//header('Content-type: application/json');
-
-
-/**#@+
- * Constants
- *
- * Since this is being used as part of a web interface, we'll set some rather
- * conservative limits to keep from overloading the user or the backend.
- */
-
-/**
- * This is the maximum folder depth to present to the user
- */
-define('MAX_DEPTH', 10);
-
-/**
- * This is the maximum number of file entries per folder to show to the user,
- */
-define('MAX_FILES_PER_FOLDER', 50);
-
-/**
- * This array contains the default HTTP Response messages
- *
- */
-$HTTP_ERRORS = array(
-	'HTTP_SUCCESS_OK' => array('code' => 200, 'message' => 'OK'),
-	'HTTP_SUCCESS_CREATED' => array('code' => 201, 'message' => 'Created'),
-	'HTTP_SUCCESS_ACCEPTED' => array('code' => 202, 'message' => 'Accepted'),
-	'HTTP_SUCCESS_NON_AUTHORITATIVE' => array('code' => 203, 'message' => 'Non-Authoritative Information'),
-	'HTTP_SUCCESS_NO_CONTENT' => array('code' => 204, 'message' => 'No Content'),
-	'HTTP_SUCCESS_RESET_CONTENT' => array('code' => 205, 'message' => 'Reset Content'),
-	'HTTP_SUCCESS_PARTIAL_CONTENT' => array('code' => 206, 'message' => 'Partial Content'),
-
-	'HTTP_REDIRECTION_MULTIPLE_CHOICES' => array('code' => 300, 'message' => 'Multiple Choices'),
-	'HTTP_REDIRECTION_PERMANENT' => array('code' => 301, 'message' => 'Moved Permanently'),
-	'HTTP_REDIRECTION_FOUND' => array('code' => 302, 'message' => 'Found'),
-	'HTTP_REDIRECTION_SEE_OTHER' => array('code' => 303, 'message' => 'See Other'),
-	'HTTP_REDIRECTION_NOT_MODIFIED' => array('code' => 304, 'message' => 'Not Modified'),
-	'HTTP_REDIRECTION_USE_PROXY' => array('code' => 305, 'message' => 'Use Proxy'),
-	'HTTP_REDIRECTION_UNUSED' => array('code' => 306, 'message' => '(Unused)'),
-	'HTTP_REDIRECTION_TEMPORARY' => array('code' => 307, 'message' => 'Temporary Redirect'),
-
-	'HTTP_CLIENT_BAD_REQUEST' => array('code' => 400, 'message' => 'Bad Request'),
-	'HTTP_CLIENT_UNAUTHORIZED' => array('code' => 401, 'message' => 'Unauthorized'),
-	'HTTP_CLIENT_PAYMENT_REQUIRED' => array('code' => 402, 'message' => 'Payment Required'),
-	'HTTP_CLIENT_FORBIDDEN' => array('code' => 403, 'message' => 'Forbidden'),
-	'HTTP_CLIENT_NOT_FOUND' => array('code' => 404, 'message' => 'Not Found'),
-	'HTTP_CLIENT_METHOD_NOT_ALLOWED' => array('code' => 405, 'message' => 'Method Not Allowed'),
-	'HTTP_CLIENT_NOT_ACCEPTABLE' => array('code' => 406, 'message' => 'Not Acceptable'),
-	'HTTP_CLIENT_PROXY_AUTH_REQUIRED' => array('code' => 407, 'message' => 'Proxy Authentication Required'),
-	'HTTP_CLIENT_REQUEST_TIMEOUT' => array('code' => 408, 'message' => 'Request Timeout'),
-	'HTTP_CLIENT_CONFLICT' => array('code' => 409, 'message' => 'Conflict'),
-	'HTTP_CLIENT_GONE' => array('code' => 410, 'message' => 'Gone'),
-	'HTTP_CLIENT_LENGTH_REQUIRED' => array('code' => 411, 'message' => 'Length Required'),
-	'HTTP_CLIENT_PRECONDITION_FAILED' => array('code' => 412, 'message' => 'Precondition Failed'),
-	'HTTP_CLIENT_REQUEST_TOO_LARGE' => array('code' => 413, 'message' => 'Request Entity Too Large'),
-	'HTTP_CLIENT_REQUEST_URI_TOO_LARGE' => array('code' => 414, 'message' => 'Request-URI Too Long'),
-	'HTTP_CLIENT_UNSUPPORTED_MEDIA_TYPE' => array('code' => 415, 'message' => 'Unsupported Media Type'),
-	'HTTP_CLIENT_REQUESTED_RANGE_NOT_POSSIBLE' => array('code' => 416, 'message' => 'Requested Range Not Satisfiable'),
-	'HTTP_CLIENT_EXPECTATION_FAILED' => array('code' => 417, 'message' => 'Expectation Failed'),
-
-	'HTTP_SERVER_INTERNAL' => array('code' => 500, 'message' => 'Internal Server Error'),
-	'HTTP_SERVER_NOT_IMPLEMENTED' => array('code' => 501, 'message' => 'Not Implemented'),
-	'HTTP_SERVER_BAD_GATEWAY' => array('code' => 502, 'message' => 'Bad Gateway'),
-	'HTTP_SERVER_SERVICE_UNAVAILABLE' => array('code' => 503, 'message' => 'Service Unavailable'),
-	'HTTP_SERVER_GATEWAY_TIMEOUT' => array('code' => 504, 'message' => 'Gateway Timeout'),
-	'HTTP_SERVER_UNSUPPORTED_VERSION' => array('code' => 505, 'message' => 'HTTP Version not supported')
-    );
-
-/**
- * This is a regular expression used to detect reserved or dangerous filenames.
- * Most NTFS special filenames begin with a dollar sign ('$'), and most Unix
- * special filenames begin with a period (.), so we'll keep them out of this
- * list and just prevent those two characters in the first position.  The rest
- * of the special filenames are included below.
- */
-define('RESERVED_FILE_NAMES', 'pagefile\.sys|a\.out|core');
-/**
- * This is a regular expression used to detect invalid file names.  It's more
- * strict than necessary, to be valid multi-platform, but not posix-strict
- * because we want to allow unicode filenames.  We do, however, allow path
- * seperators in the filename because the file could exist in a subdirectory.
- */
-define('INVALID_FILE_NAME','^[.$]|^(' . RESERVED_FILE_NAMES . ')$|[?%*:|"<>]');
-/**#@-*/
-
-function main($arguments) {
-    $config = get_config(true);
-
-    // Trigger authentication if it's configured.
-    if ($config['capabilities']['user_storage'] && empty($_SERVER['PHP_AUTH_USER'])) {
-        header('WWW-Authenticate: Basic realm="Xinha Persistent Storage"');
-        header('HTTP/1.0 401 Unauthorized');
-        echo "You must login in order to use Persistent Storage";
-        exit;
-    }
-    if (!input_valid($arguments, $config['capabilities'])) {
-        http_error_exit();
-    }
-    if (!method_valid($arguments)) {
-        http_error_exit('HTTP_CLIENT_METHOD_NOT_ALLOWED');
-    }
-    if (!dispatch($arguments)) {
-        http_error_exit();
-    }
-    exit();
-}
-
-main($_REQUEST + $_FILES);
-// ************************************************************
-// ************************************************************
-//                       Helper Functions               
-// ************************************************************
-// ************************************************************
-
-/**
- * Take the call and properly dispatch it to the methods below.  This method
- * assumes valid input.
- */
-function dispatch($arguments) {
-    if (array_key_exists('file', $arguments)) {
-        if (array_key_exists('rename', $arguments)) {
-            if (!file_directory_rename($arguments['filename'], $arguments['newname'], working_directory())) {
-                http_error_exit('HTTP_CLIENT_FORBIDDEN');
-            }
-            return true;
-        }
-        if (array_key_exists('copy', $arguments)) {
-            if (!$newentry = file_copy($arguments['filename'], working_directory())) {
-                http_error_exit('HTTP_CLIENT_FORBIDDEN');
-            }
-            echo json_encode($newentry);
-            return true;
-        }
-        if (array_key_exists('delete', $arguments)) {
-            if (!file_delete($arguments['filename'], working_directory())) {
-                http_error_exit('HTTP_CLIENT_FORBIDDEN');
-            }
-            return true;
-        }
-    }
-    if (array_key_exists('directory', $arguments)) {
-        if (array_key_exists('listing', $arguments)) {
-            echo json_encode(directory_listing());
-            return true;
-        }
-        if (array_key_exists('create', $arguments)) {
-            if (!directory_create($arguments['dirname'], working_directory())) {
-                http_error_exit('HTTP_CLIENT_FORBIDDEN');
-            }
-            return true;
-        }
-        if (array_key_exists('delete', $arguments)) {
-            if (!directory_delete($arguments['dirname'], working_directory())) {
-                http_error_exit('HTTP_CLIENT_FORBIDDEN');
-            }
-            return true;
-        }
-        if (array_key_exists('rename', $arguments)) {
-            if (!file_directory_rename($arguments['dirname'], $arguments['newname'], working_directory())) {
-                http_error_exit('HTTP_CLIENT_FORBIDDEN');
-            }
-            return true;
-        }
-    }
-    if (array_key_exists('image', $arguments)) {
-    }
-    if (array_key_exists('upload', $arguments)) {
-        store_uploaded_file($arguments['filename'], $arguments['filedata'], working_directory());
-        return true;
-    }
-
-    return false;
-}
-
-/**
- * Validation of the HTTP Method.  For operations that make changes we require
- * POST.  To err on the side of safety, we'll only allow GET for known safe
- * operations.  This way, if the API is extended, and the method is not
- * updated, we will not accidentally expose non-idempotent methods to GET.
- * This method can only correctly validate the operation if the input is
- * already known to be valid.
- *
- * @param array $arguments The arguments array received by the page.
- * @return boolean Whether or not the HTTP method is correct for the given input.
- */
-function method_valid($arguments) {
-    // We assume that the only
-    $method = $_SERVER['REQUEST_METHOD'];
-
-    if ($method == 'GET') {
-      if (array_key_exists('directory', $arguments) && array_key_exists('listing', $arguments)) {
-          return true;
-      }
-
-      return false;
-    }
-
-    if ($method == 'POST') {
-        return true;
-    }
-    return false;
-}
-
-/**
- * Validation of the user input.  We'll verify what we receive from the user,
- * and send an error in the case of malformed input.
- *
- * Some examples of the URLS associated with this API:
- * ** File Operations **
- * ?file&delete&filename=''
- * ?file&copy&filename=''
- * ?file&rename&filename=''&newname=''
- *
- * ** Directory Operations **
- * ?directory&listing
- * ?directory&create&dirname=''
- * ?directory&delete&dirname=''
- * ?directory&rename&dirname=''&newname=''
- *
- * ** Image Operations **
- * ?image&filename=''&[scale|rotate|convert]
- *
- * ** Upload **
- * ?upload&filedata=[binary|text]&filename=''&replace=[true|false]
- *
- * @param array $arguments The arguments array received by the page.
- * @param array $capabilities The capabilities config array used to limit operations.
- * @return boolean Whether or not the input received is valid.
- */
-function input_valid($arguments, $capabilities) {
-    // This is going to be really ugly code because it's basically a DFA for
-    // parsing arguments.  To make things a little clearer, I'll put a
-    // pseudo-BNF for each block to show the decision structure.
-    //
-    // file[empty] filename[valid] (delete[empty] | copy[empty] | (rename[empty] newname[valid]))
-    if ($capabilities['file_operations'] &&
-        array_key_exists('file', $arguments) &&
-        empty($arguments['file']) &&
-        array_key_exists('filename', $arguments) &&
-        !ereg(INVALID_FILE_NAME, $arguments['filename'])) {
-
-        if (array_key_exists('delete', $arguments) &&
-            empty($arguments['delete']) &&
-            3 == count($arguments)) {
-
-            return true;
-        }
-
-        if (array_key_exists('copy', $arguments) &&
-            empty($arguments['copy']) &&
-            3 == count($arguments)) {
-
-            return true;
-        }
-
-        if (array_key_exists('rename', $arguments) &&
-            empty($arguments['rename']) &&
-            4 == count($arguments)) {
-
-            if (array_key_exists('newname', $arguments) &&
-                !ereg(INVALID_FILE_NAME, $arguments['newname'])) {
-
-                return true;
-            }
-        }
-
-        return false;
-    } elseif (array_key_exists('file', $arguments)) {
-        // This isn't necessary because we'll fall through to false, but I'd
-        // rather return earlier than later.
-        return false;
-    }
-
-    // directory[empty] (listing[empty] | (dirname[valid] (create[empty] | delete[empty] | (rename[empty] newname[valid]))))
-    if ($capabilities['directory_operations'] &&
-        array_key_exists('directory', $arguments) &&
-        empty($arguments['directory'])) {
-
-        if (array_key_exists('listing', $arguments) &&
-            empty($arguments['listing']) &&
-            2 == count($arguments)) {
-
-            return true;
-        }
-
-        if (array_key_exists('dirname', $arguments) &&
-            !ereg(INVALID_FILE_NAME, $arguments['dirname'])) {
-
-            if (array_key_exists('create', $arguments) &&
-                empty($arguments['create']) &&
-                3 == count($arguments)) {
-
-                return true;
-            }
-
-            if (array_key_exists('delete', $arguments) &&
-                empty($arguments['delete']) &&
-                3 == count($arguments)) {
-
-                return true;
-            }
-
-            if (array_key_exists('rename', $arguments) &&
-                empty($arguments['rename']) &&
-                4 == count($arguments)) {
-
-                if (array_key_exists('newname', $arguments) &&
-                    !ereg(INVALID_FILE_NAME, $arguments['newname'])) {
-
-                    return true;
-                }
-            }
-        }
-
-        return false;
-    } elseif (array_key_exists('directory', $arguments)) {
-        // This isn't necessary because we'll fall through to false, but I'd
-        // rather return earlier than later.
-        return false;
-    }
-
-    // image[empty] filename[valid] ((scale[empty] dimensions[valid]) | (rotate[empty] angle[valid]) | (convert[empty] imagetype[valid]))
-    if ($capabilities['image_operations'] &&
-        array_key_exists('image', $arguments) &&
-        empty($arguments['image']) &&
-        array_key_exists('filename', $arguments) &&
-        !ereg(INVALID_FILE_NAME, $arguments['filename']) &&
-        4 == count($arguments)) {
-
-        if (array_key_exists('scale', $arguments) &&
-            empty($arguments['scale']) &&
-            !ereg(INVALID_FILE_NAME, $arguments['dimensions'])) {
-            // TODO: FIX REGEX
-            http_error_exit();
-
-            return true;
-        }
-
-        if (array_key_exists('rotate', $arguments) &&
-            empty($arguments['rotate']) &&
-            !ereg(INVALID_FILE_NAME, $arguments['angle'])) {
-            // TODO: FIX REGEX
-            http_error_exit();
-
-            return true;
-        }
-
-        if (array_key_exists('convert', $arguments) &&
-            empty($arguments['convert']) &&
-            !ereg(INVALID_FILE_NAME, $arguments['imagetype'])) {
-            // TODO: FIX REGEX
-            http_error_exit();
-
-            return true;
-        }
-
-        return false;
-    } elseif (array_key_exists('image', $arguments)) {
-        // This isn't necessary because we'll fall through to false, but I'd
-        // rather return earlier than later.
-        return false;
-    }
-
-    // upload[empty] filedata[binary|text] replace[true|false] filename[valid]?
-    if ($capabilities['upload_operations'] &&
-        array_key_exists('upload', $arguments) &&
-        empty($arguments['upload']) &&
-        array_key_exists('filedata', $arguments) &&
-        !empty($arguments['filedata']) &&
-        array_key_exists('replace', $arguments) &&
-        ereg('true|false', $arguments['replace'])) {
-
-        if (4 == count($arguments) &&
-            array_key_exists('filename', $arguments) &&
-            !ereg(INVALID_FILE_NAME, $arguments['filename'])) {
-
-            return true;
-        }
-
-        if (3 == count($arguments)) {
-
-            return true;
-        }
-
-        return false;
-    } elseif (array_key_exists('upload', $arguments)) {
-        // This isn't necessary because we'll fall through to false, but I'd
-        // rather return earlier than later.
-        return false;
-    }
-
-
-    return false;
-}
-
-/**
- * HTTP level error handling. 
- * @param integer $code The HTTP error code to return to the client.  This defaults to 400.
- * @param string $message Error message to send to the client.  This defaults to the standard HTTP error messages.
- */
-function http_error_exit($error = 'HTTP_CLIENT_BAD_REQUEST', $message='') {
-    global $HTTP_ERRORS;
-    $message = !empty($message) ? $message : "HTTP/1.0 {$HTTP_ERRORS[$error]['code']} {$HTTP_ERRORS[$error]['message']}";
-    header($message);
-    exit($message);
-}
-
-/**
- * Process the config and return the absolute directory we should be working with,
- * @return string contains the path of the directory all file operations are limited to.
- */
-function working_directory() {
-    $config = get_config(true);
-    return realpath(getcwd() . DIRECTORY_SEPARATOR . $config['storage_dir'] . DIRECTORY_SEPARATOR);
-}
-
-/**
- * Check to see if the supplied filename is inside
- */
-function directory_contains($container_directory, $checkfile) {
-
-    // Get the canonical directory and canonical filename.  We add a directory
-    // seperator to prevent the user from sidestepping into a sibling directory
-    // that starts with the same prefix. (e.g. from /home/john to
-    // /home/johnson)
-    $container_directory = realpath($container_directory) + DIRECTORY_SEPARATOR;
-    $checkfile = realpath($checkfile);
-
-    // Now that we have the canonical versions, we can do a string comparison
-    // to see if checkfile is inside of container_directory.
-    if (strlen($checkfile) <= strlen($container_directory)) {
-        // We don't consider the directory to be inside of itself.  This
-        // prevents users from trying to perform operations on the container
-        // directory itself.
-        return false;
-    }
-
-    // PHP equivalent of string.startswith()
-    return substr($checkfile, 0, strlen($container_directory)) == $container_directory;
-}
-
-/**#@+
- *                             Directory Operations
- * {@internal *****************************************************************
- * **************************************************************************}}
- */
-
-/**
- * Return a directory listing as a PHP array.
- * @param string $directory The directory to return a listing of.
- * @param integer $depth The private argument used to limit recursion depth.
- * @return array representing the directory structure. 
- */
-
-function directory_listing($directory='', $depth=1) {
-    // We return an empty array if the directory is empty
-    $result = array('$type'=>'folder');
-
-    // We won't recurse below MAX_DEPTH.
-    if ($depth > MAX_DEPTH) {
-        return $result;
-    }
-
-    $path = empty($directory) ? working_directory() : $directory;
-
-    // We'll open the directory to check each of the entries
-    if ($dir = opendir($path)) {
-
-        // We'll keep track of how many file we process.
-        $count = 0;
-
-        // For each entry in the file
-        while (($file = readdir($dir)) !== false) {
-
-            // Limit the number of files we process in this folder
-            $count += 1;
-            if ($count > MAX_FILES_PER_FOLDER) {
-                return $result;
-            }
-
-            // Ignore hidden files (this includes special files '.' and '..')
-            if (strlen($file) && ($file[0] == '.')) {
-                continue;
-            }
-
-            $filepath = $path . DIRECTORY_SEPARATOR . $file;
-
-            if (filetype($filepath) == 'dir') {
-                // We'll recurse and add those results
-                $result[$file] = directory_listing($filepath, $depth + 1);
-            } else {
-                // We'll check to see if we can read any image information from
-                // the file.  If so, we know it's an image, and we can return
-                // it's metadata.
-                $imageinfo = @getimagesize($filepath);
-                if ($imageinfo) {
-
-                  $result[$file] = array('$type'=>'image','metadata'=>array(
-                                  'width'=>$imageinfo[0],
-                                  'height'=>$imageinfo[1],
-                                  'mimetype'=>$imageinfo['mime']
-                              ));
-
-                } elseif ($extension = strrpos($file, '.')) {
-                     $extension = substr($file, $extension);
-                     if (($extension == '.htm') || ($extension == '.html')) {
-                         $result[$file] = array('$type'=>'html');
-                     } else {
-                         $result[$file] = array('$type'=>'text');
-                     }
-                } else {
-                    $result[$file] = array('$type'=>'document');
-                }
-            }
-        }
-        
-        closedir($dir);
-    }
-    return $result;
-}
-
-/**
- * Create a directory, limiting operations to the chroot directory.
- * @param string $dirname The path to the directory, relative to $chroot.
- * @param string $chroot Only directories inside this directory or its subdirectories can be affected.
- * @return boolean Returns TRUE if successful, and FALSE otherwise.
- */
-function directory_create($dirname, $chroot) {
-    // If chroot is empty, then we will not perform the operation.
-    if (empty($chroot)) {
-        return false;
-    }
-
-    // We have to take the dirname of the parent directory first, since
-    // realpath just returns false if the directory doesn't already exist on
-    // the filesystem.
-    $createparent = realpath(dirname($chroot . DIRECTORY_SEPARATOR . $dirname));
-    $createsub = basename($chroot . DIRECTORY_SEPARATOR . $dirname);
-
-    // The bailout rules for directories that don't exist are complicated
-    // because of having to work around realpath.  If the parent directory is
-    // the same as the chroot, it won't be contained.  For this case, we'll
-    // check to see if the chroot and the parent are the same and allow it only
-    // if the sub portion of dirname is not-empty.
-    if (!directory_contains($chroot, $createparent) &&
-        !(($chroot == $createparent) && !empty($createsub))) {
-        return false;
-    }
-
-    return @mkdir($createparent . DIRECTORY_SEPARATOR . $createsub);
-}
-
-/**
- * Delete a directory, limiting operations to the chroot directory.
- * @param string $dirname The path to the directory, relative to $chroot.
- * @param string $chroot Only directories inside this directory or its subdirectories can be affected.
- * @return boolean Returns TRUE if successful, and FALSE otherwise.
- */
-function directory_delete($dirname, $chroot) {
-    // If chroot is empty, then we will not perform the operation.
-    if (empty($chroot)) {
-        return false;
-    }
-
-    // $dirname is relative to $chroot.
-    $dirname = realpath($chroot . DIRECTORY_SEPARATOR . $dirname);
-
-    // Limit directory operations to the supplied directory.
-    if (!directory_contains($chroot, $dirname)) {
-        return false;
-    }
-
-    return @rmdir($dirname);
-}
-
-
-/**#@-*/
-/**#@+
- *                               File Operations
- * {@internal *****************************************************************
- * **************************************************************************}}
- */
-
-/**
- * Rename a file or directory, limiting operations to the chroot directory.
- * @param string $filename The path to the file or directory, relative to $chroot.
- * @param string $renameto The path to the renamed file or directory, relative to $chroot.
- * @param string $chroot Only files and directories inside this directory or its subdirectories can be affected.
- * @return boolean Returns TRUE if successful, and FALSE otherwise.
- */
-function file_directory_rename($filename, $renameto, $chroot) {
-    // If chroot is empty, then we will not perform the operation.
-    if (empty($chroot)) {
-        return false;
-    }
-
-    // $filename is relative to $chroot.
-    $filename = realpath($chroot . DIRECTORY_SEPARATOR . $filename);
-
-    // We have to take the dirname of the renamed file or directory first,
-    // since realpath just returns false if the file or direcotry doesn't
-    // already exist on the filesystem.
-    $renameparent = realpath(dirname($chroot . DIRECTORY_SEPARATOR . $renameto));
-    $renamefile = basename($chroot . DIRECTORY_SEPARATOR . $renameto);
-
-    // Limit file operations to the supplied directory.
-    if (!directory_contains($chroot, $filename)) {
-        return false;
-    }
-
-    // The bailout rules for the renamed file or directory are more complicated
-    // because of having to work around realpath.  If the renamed parent
-    // directory is the same as the chroot, it won't be contained.  For this
-    // case, we'll check to see if they're the same and allow it only if the
-    // file portion of renameto is not-empty.
-    if (!directory_contains($chroot, $renameparent) &&
-        !(($chroot == $renameparent) && !empty($renamefile))) {
-        return false;
-    }
-
-    return @rename($filename, $renameparent . DIRECTORY_SEPARATOR . $renamefile);
-}
-
-
-/**
- * Copy a file, limiting operations to the chroot directory.
- * @param string $filename The path to the file, relative to $chroot.
- * @param string $chroot Only files inside this directory or its subdirectories can be affected.
- * @return boolean Returns TRUE if successful, and FALSE otherwise.
- */
-function file_copy($filename, $chroot) {
-    // If chroot is empty, then we will not perform the operation.
-    if (empty($chroot)) {
-        return false;
-    }
-
-    // $filename is relative to $chroot.
-    $filename = realpath($chroot . DIRECTORY_SEPARATOR . $filename);
-
-    // Limit file operations to the supplied directory.
-    if (!directory_contains($chroot, $filename)) {
-        return false;
-    }
-
-    // The PHP copy function blindly copies over existing files.  We don't wish
-    // this to happen, so we have to perform the copy a bit differently.  If we
-    // do a check to make sure the file exists, there's always the chance of a
-    // race condition where someone else creates the file in between the check
-    // and the copy.  The only safe way to ensure we don't overwrite an
-    // existing file is to call fopen in create-only mode (mode 'x').  If it
-    // succeeds, the file did not exist before, and we've successfully created
-    // it, meaning we own the file.  After that, we can safely copy over our
-    // own file.
-    for ($count=1; $count<MAX_FILES_PER_FOLDER; ++$count) {
-        if (strpos(basename($filename), '.')) {
-            $extpos = strrpos($filename, '.');
-            $copyname = substr($filename, 0, $extpos) . '_' . $count . substr($filename, $extpos);
-        } else {
-            // There's no extension, we we'll just add our copy count.
-            $copyname = $filename . '_' . $count;
-        }
-        if ($file = @fopen($copyname, 'x')) {
-            // We've successfully created a file, so it's ours.  We'll close
-            // our handle.
-            if (!@fclose($file)) {
-                // There was some problem with our file handle.
-                return false;
-            }
-
-            // Now we copy over the file we created.
-            if (!@copy($filename, $copyname)) {
-                // The copy failed, even though we own the file, so we'll clean
-                // up by removing the file and report failure.
-                file_delete($filename, $chroot);
-                return false;
-            }
-
-            return array(basename($copyname)=>array('$type'=>'image'));
-        }
-    }
-
-    return false;
-}
-
-/**
- * Delete a file, limiting operations to the chroot directory.
- * @param string $filename The path to the file, relative to $chroot.
- * @param string $chroot Only files inside this directory or its subdirectories can be affected.
- * @return boolean Returns TRUE if successful, and FALSE otherwise.
- */
-function file_delete($filename, $chroot) {
-    // If chroot is empty, then we will not perform the operation.
-    if (empty($chroot)) {
-        return false;
-    }
-
-    // $filename is relative to $chroot.
-    $filename = realpath($chroot . DIRECTORY_SEPARATOR . $filename);
-
-    // Limit file operations to the supplied directory.
-    if (!directory_contains($chroot, $filename)) {
-        return false;
-    }
-
-    return @unlink($filename);
-}
-/**#@-*/
-/**#@+
- *                              Upload Operations
- * {@internal *****************************************************************
- * **************************************************************************}}
- */
-
-function store_uploaded_file($filename, $filedata, $chroot) {
-
-    // If chroot is empty, then we will not perform the operation.
-    if (empty($chroot)) {
-        return false;
-    }
-
-    // If the filename is empty, it was possibly supplied as part of the
-    // upload.
-    $filename = empty($filename) ? $filedata['name'] : $filename;
-
-    // We have to take the dirname of the parent directory first, since
-    // realpath just returns false if the directory doesn't already exist on
-    // the filesystem.
-    $uploadparent = realpath(dirname($chroot . DIRECTORY_SEPARATOR . $filename));
-    $uploadfile = basename($chroot . DIRECTORY_SEPARATOR . $filename);
-
-    // The bailout rules for directories that don't exist are complicated
-    // because of having to work around realpath.  If the parent directory is
-    // the same as the chroot, it won't be contained.  For this case, we'll
-    // check to see if the chroot and the parent are the same and allow it only
-    // if the sub portion of dirname is not-empty.
-    if (!directory_contains($chroot, $uploadparent) &&
-        !(($chroot == $uploadparent) && !empty($uploadfile))) {
-        return false;
-    }
- 
-    $target_path = $uploadparent . DIRECTORY_SEPARATOR . $uploadfile;
-
-    if (is_array($filedata)) {
-        // We've received the file as an upload, so it's been saved to a temp
-        // directory.  We'll move it to where it belongs.
-     
-        if(move_uploaded_file($filedata['tmp_name'], $target_path)) {
-            return true;
-        }
-    } elseif ($file = @fopen($target_path, 'w')) {
-        // We've received the file as data.  We'll create/open the file and
-        // save the data.
-        @fwrite($file, $filedata);
-        @fclose($file);
-        return true;
-    }
- 
-    return false;
-}
-
-/**#@-*/
-
-?>
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/PSServer/config.inc.php b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/PSServer/config.inc.php
deleted file mode 100644
index 11235e3..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/PSServer/config.inc.php
+++ /dev/null
@@ -1,194 +0,0 @@
-<?php

-/**

- * PersistentStorage Server backend configuration file.

- * @author Douglas Mayle <douglas@openplans.org>

- * @version 1.0

- * @package PersistentStorage

- */

-

-/**

- * If this file is being requested over the web, we display a JSON version of

- * the publicly viewable config info.

- */

-if (__FILE__ == $_SERVER['SCRIPT_FILENAME']) {

-    echo json_encode(get_config());

-}

-

-/**

- * Gets the configuration information used by this package.

- * {@source }

- * @param boolean $getprivates Return private configuration info merged with the public.

- * @returns array The configuration information for this package.

- */

-function get_config($getprivates=False) {

-

-    // We set up two different settings array, so that we can have settings

-    // that won't be shown to the public.

-    $Private = array();

-    $Public = array();

-

-    /**

-     * For demo purposes, we can lie to the frontend and pretend to have user

-     * storage.  Since we don't have a password mechanism, this simulation will

-     * accept any password.

-     */

-    $Private['simulate_user_auth'] = false;

-

-    /**

-     * The capabilities array contains directives about what major options to

-     * allow or disallow.

-     */

-    $Public['capabilities'] = array(

-        // Allow directory operations (e.g. rename, create, delete directories)

-        'directory_operations' => true,

-        // Allow file operations (e.g. copy, rename, delete files)

-        'file_operations' => true,

-        // Allow image operations (e.g. scale, rotate, convert images)

-        'image_operations' => true,

-        // Allow file uploads

-        'upload_operations' => true,

-        // Stored files have a published URL

-        'shared_publish' => true,

-        // By default, if the user is authenticated, we enable user storage.

-        // Set to false to disable.

-        'user_storage' => !empty($_SERVER['PHP_AUTH_USER']) || $Private['simulate_user_auth']

-    );

-

-    /**

-     * Directory exposed to user operations.  Be sure that the web server has

-     * read and write access to this directory.

-     */

-    $Private['storage_dir'] = 'demo_images';

-

-    /**

-     * The URL that the storage directory is exposed as.  By default, we try

-     * and guess based on the URL used to access this page.  Also, since we

-     * allow user upload, this directory should not be executable by the

-     * server.  A sample .htaccess file is included in demo_images.

-     */

-    $Private['storage_url'] = str_replace( array("backend.php","manager.php"),

-                          "", $_SERVER["PHP_SELF"] ) . $Private['storage_dir'];

-

-    /*

-      Possible values: true, false

-

-      TRUE - If PHP on the web server is in safe mode, set this to true.

-             SAFE MODE restrictions: directory creation will not be possible,

-    		 only the GD library can be used, other libraries require

-    		 Safe Mode to be off.

-

-      FALSE - Set to false if PHP on the web server is not in safe mode.

-    */

-    $Private['safe_mode'] = ini_get('safe_mode');

-

-    /**

-     * If PHP Safe Mode is on than only the GD image library will function, so

-     * we force the default

-     */

-    if ($Private['safe_mode']) {

-        @define('IMAGE_CLASS', 'GD');

-    } else {

-        /* 

-         Possible values: 'GD', 'IM', or 'NetPBM'

-

-         The image manipulation library to use, either GD or ImageMagick or NetPBM.

-        */

-        @define('IMAGE_CLASS', 'GD');

-

-        /*

-         After defining which library to use, if it is NetPBM or IM, you need to

-         specify where the binary for the selected library are. And of course

-         your server and PHP must be able to execute them (i.e. safe mode is OFF).

-         GD does not require the following definition.

-        */

-        @define('IMAGE_TRANSFORM_LIB_PATH', '/usr/bin/');

-    }

-

-    /*

-      The prefix for thumbnail files, something like .thumb will do. The

-      thumbnails files will be named as "prefix_imagefile.ext", that is,

-      prefix + orginal filename.

-    */

-    $Private['thumbnail_prefix'] = 't_';

-

-    /**

-     * The thumbnail array groups all of the configuration related to thumbnail

-     * operations.

-     */

-    $Private['thumbnails'] = array(

-        // The prefix to apply to all created thumbnails.

-        'prefix' => 't_',

-        // A subdirectory to keep thumbnails in.  If this is empty, thumbnails

-        // will be stored alongside the files.

-        'directory' => '',

-        // Whether or not to filter thumbnails from the directory listing.

-        'filter' => true,

-        // Filetypes which we restrict thumbnail operations to.

-        'filetypes' => array("jpg", "gif", "png", "bmp"),

-        // What pixel sizes to save the thumbnails as.

-        'width' => 84,

-        'height' => 84

-    );

-

-

-    /**

-    * Resized prefix

-    *

-    * The prefix for resized files, something like .resized will do.  The

-    * resized files will be named <prefix>_<width>x<height>_<original>

-    * resized files are created when one changes the dimensions of an image

-    * in the image manager selection dialog - the image is scaled when the

-    * user clicks the ok button.

-    */

-

-    $Private['resized_prefix'] = '.resized';

-

-    // -------------------------------------------------------------------------

-

-    /**

-    * Resized Directory

-    *

-    * Resized images may also be stored in a directory, except in safe mode.

-    */

-

-    $Private['resized_dir'] = '';

-

-    /* Maximum upload file size

-

-      Possible values: number, "max"

-

-      number - maximum size in Kilobytes.

-

-      "max"  - the maximum allowed by the server (the value is retrieved from the server configuration).

-    */

-    $Private['max_filesize_kb_image'] = 200;

-

-    $Private['max_filesize_kb_link'] = 5000;

-

-    /* Maximum upload folder size in Megabytes. Use 0 to disable limit */

-    $Private['max_foldersize_mb'] = 0;

-

-    /*

-    Allowed extensions that can be shown and allowed to upload.

-    Available icons are for "doc,fla,gif,gz,html,jpg,js,mov,pdf,php,png,ppt,rar,txt,xls,zip"

-    -Changed by AFRU.

-    */

-

-    $Private['allowed_image_extensions'] = array("jpg","gif","png","bmp");

-    $Private['allowed_link_extensions'] = array("jpg","gif","js","php","pdf","zip","txt","psd","png","html","swf","xml","xls","doc");

-

-

-    /*

-      Image Editor temporary filename prefix.

-    */

-    $Private['tmp_prefix'] = '.editor_';

-

-

-    // Config variables are finished, this returns our data to the caller.

-    if ($getprivates) {

-        return $Public+$Private;

-    }

-

-    return $Public;

-}

-?>

diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/PSServer/demo_images/.htaccess b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/PSServer/demo_images/.htaccess
deleted file mode 100644
index 0471132..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/PSServer/demo_images/.htaccess
+++ /dev/null
@@ -1,2 +0,0 @@
-php_flag engine off
-AddType text/html .html .htm .shtml .php .php3 .phtml .phtm .pl .py .cgi
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/PSServer/demo_images/bikerpeep.jpg b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/PSServer/demo_images/bikerpeep.jpg
deleted file mode 100644
index a2e7028..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/PSServer/demo_images/bikerpeep.jpg
+++ /dev/null
Binary files differ
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/PSServer/demo_images/linux/linux.gif b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/PSServer/demo_images/linux/linux.gif
deleted file mode 100644
index 3f42d2c..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/PSServer/demo_images/linux/linux.gif
+++ /dev/null
Binary files differ
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/PSServer/demo_images/wesnoth078.jpg b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/PSServer/demo_images/wesnoth078.jpg
deleted file mode 100644
index ea37d1a..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/PSServer/demo_images/wesnoth078.jpg
+++ /dev/null
Binary files differ
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/PSServer/lang/b5.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/PSServer/lang/b5.js
deleted file mode 100644
index b3281e5..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/PSServer/lang/b5.js
+++ /dev/null
@@ -1,15 +0,0 @@
-// I18N constants
-// LANG: "b5", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "__OBSOLETE__": {
-        "___ TRANSLATOR NOTE   ___": "*** PSSERVER IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***"
-    }
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/PSServer/lang/ch.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/PSServer/lang/ch.js
deleted file mode 100644
index c633174..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/PSServer/lang/ch.js
+++ /dev/null
@@ -1,15 +0,0 @@
-// I18N constants
-// LANG: "ch", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "__OBSOLETE__": {
-        "___ TRANSLATOR NOTE   ___": "*** PSSERVER IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***"
-    }
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/PSServer/lang/cz.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/PSServer/lang/cz.js
deleted file mode 100644
index ebcdfd0..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/PSServer/lang/cz.js
+++ /dev/null
@@ -1,15 +0,0 @@
-// I18N constants
-// LANG: "cz", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "__OBSOLETE__": {
-        "___ TRANSLATOR NOTE   ___": "*** PSSERVER IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***"
-    }
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/PSServer/lang/da.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/PSServer/lang/da.js
deleted file mode 100644
index 7fd158a..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/PSServer/lang/da.js
+++ /dev/null
@@ -1,15 +0,0 @@
-// I18N constants
-// LANG: "da", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "__OBSOLETE__": {
-        "___ TRANSLATOR NOTE   ___": "*** PSSERVER IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***"
-    }
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/PSServer/lang/de.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/PSServer/lang/de.js
deleted file mode 100644
index fd045b9..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/PSServer/lang/de.js
+++ /dev/null
@@ -1,15 +0,0 @@
-// I18N constants
-// LANG: "de", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "__OBSOLETE__": {
-        "___ TRANSLATOR NOTE   ___": "*** PSSERVER IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***"
-    }
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/PSServer/lang/ee.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/PSServer/lang/ee.js
deleted file mode 100644
index 90d4fcf..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/PSServer/lang/ee.js
+++ /dev/null
@@ -1,15 +0,0 @@
-// I18N constants
-// LANG: "ee", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "__OBSOLETE__": {
-        "___ TRANSLATOR NOTE   ___": "*** PSSERVER IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***"
-    }
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/PSServer/lang/el.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/PSServer/lang/el.js
deleted file mode 100644
index 0cc540b..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/PSServer/lang/el.js
+++ /dev/null
@@ -1,15 +0,0 @@
-// I18N constants
-// LANG: "el", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "__OBSOLETE__": {
-        "___ TRANSLATOR NOTE   ___": "*** PSSERVER IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***"
-    }
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/PSServer/lang/es.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/PSServer/lang/es.js
deleted file mode 100644
index 7900dfc..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/PSServer/lang/es.js
+++ /dev/null
@@ -1,15 +0,0 @@
-// I18N constants
-// LANG: "es", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "__OBSOLETE__": {
-        "___ TRANSLATOR NOTE   ___": "*** PSSERVER IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***"
-    }
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/PSServer/lang/eu.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/PSServer/lang/eu.js
deleted file mode 100644
index c0d23b3..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/PSServer/lang/eu.js
+++ /dev/null
@@ -1,15 +0,0 @@
-// I18N constants
-// LANG: "eu", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "__OBSOLETE__": {
-        "___ TRANSLATOR NOTE   ___": "*** PSSERVER IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***"
-    }
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/PSServer/lang/fa.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/PSServer/lang/fa.js
deleted file mode 100644
index 3054d7b..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/PSServer/lang/fa.js
+++ /dev/null
@@ -1,15 +0,0 @@
-// I18N constants
-// LANG: "fa", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "__OBSOLETE__": {
-        "___ TRANSLATOR NOTE   ___": "*** PSSERVER IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***"
-    }
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/PSServer/lang/fi.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/PSServer/lang/fi.js
deleted file mode 100644
index fa64689..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/PSServer/lang/fi.js
+++ /dev/null
@@ -1,15 +0,0 @@
-// I18N constants
-// LANG: "fi", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "__OBSOLETE__": {
-        "___ TRANSLATOR NOTE   ___": "*** PSSERVER IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***"
-    }
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/PSServer/lang/fr.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/PSServer/lang/fr.js
deleted file mode 100644
index 05624fa..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/PSServer/lang/fr.js
+++ /dev/null
@@ -1,15 +0,0 @@
-// I18N constants
-// LANG: "fr", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "__OBSOLETE__": {
-        "___ TRANSLATOR NOTE   ___": "*** PSSERVER IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***"
-    }
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/PSServer/lang/fr_ca.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/PSServer/lang/fr_ca.js
deleted file mode 100644
index f4fc2e2..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/PSServer/lang/fr_ca.js
+++ /dev/null
@@ -1,15 +0,0 @@
-// I18N constants
-// LANG: "fr_ca", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "__OBSOLETE__": {
-        "___ TRANSLATOR NOTE   ___": "*** PSSERVER IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***"
-    }
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/PSServer/lang/gb.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/PSServer/lang/gb.js
deleted file mode 100644
index 9633886..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/PSServer/lang/gb.js
+++ /dev/null
@@ -1,15 +0,0 @@
-// I18N constants
-// LANG: "gb", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "__OBSOLETE__": {
-        "___ TRANSLATOR NOTE   ___": "*** PSSERVER IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***"
-    }
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/PSServer/lang/he.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/PSServer/lang/he.js
deleted file mode 100644
index d7a08b5..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/PSServer/lang/he.js
+++ /dev/null
@@ -1,15 +0,0 @@
-// I18N constants
-// LANG: "he", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "__OBSOLETE__": {
-        "___ TRANSLATOR NOTE   ___": "*** PSSERVER IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***"
-    }
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/PSServer/lang/hu.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/PSServer/lang/hu.js
deleted file mode 100644
index 76c06f6..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/PSServer/lang/hu.js
+++ /dev/null
@@ -1,15 +0,0 @@
-// I18N constants
-// LANG: "hu", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "__OBSOLETE__": {
-        "___ TRANSLATOR NOTE   ___": "*** PSSERVER IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***"
-    }
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/PSServer/lang/it.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/PSServer/lang/it.js
deleted file mode 100644
index 0baad78..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/PSServer/lang/it.js
+++ /dev/null
@@ -1,15 +0,0 @@
-// I18N constants
-// LANG: "it", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "__OBSOLETE__": {
-        "___ TRANSLATOR NOTE   ___": "*** PSSERVER IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***"
-    }
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/PSServer/lang/ja.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/PSServer/lang/ja.js
deleted file mode 100644
index e7fa008..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/PSServer/lang/ja.js
+++ /dev/null
@@ -1,15 +0,0 @@
-// I18N constants
-// LANG: "ja", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "__OBSOLETE__": {
-        "___ TRANSLATOR NOTE   ___": "*** PSSERVER IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***"
-    }
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/PSServer/lang/lc_base.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/PSServer/lang/lc_base.js
deleted file mode 100644
index fde2a1b..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/PSServer/lang/lc_base.js
+++ /dev/null
@@ -1,26 +0,0 @@
-// I18N constants
-//
-// LANG: "en", ENCODING: UTF-8
-// Author: Translator-Name, <email@example.com>
-//
-// Last revision: 2018-04-12
-// 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).
-//
-// (Please, remove information below)
-// 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.)
-
-{
-    "File: ": "",
-    "Import": ""
-}
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/PSServer/lang/lt.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/PSServer/lang/lt.js
deleted file mode 100644
index 51a9113..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/PSServer/lang/lt.js
+++ /dev/null
@@ -1,15 +0,0 @@
-// I18N constants
-// LANG: "lt", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "__OBSOLETE__": {
-        "___ TRANSLATOR NOTE   ___": "*** PSSERVER IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***"
-    }
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/PSServer/lang/lv.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/PSServer/lang/lv.js
deleted file mode 100644
index a18c5ea..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/PSServer/lang/lv.js
+++ /dev/null
@@ -1,15 +0,0 @@
-// I18N constants
-// LANG: "lv", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "__OBSOLETE__": {
-        "___ TRANSLATOR NOTE   ___": "*** PSSERVER IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***"
-    }
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/PSServer/lang/nb.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/PSServer/lang/nb.js
deleted file mode 100644
index 8743ace..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/PSServer/lang/nb.js
+++ /dev/null
@@ -1,15 +0,0 @@
-// I18N constants
-// LANG: "nb", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "__OBSOLETE__": {
-        "___ TRANSLATOR NOTE   ___": "*** PSSERVER IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***"
-    }
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/PSServer/lang/nl.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/PSServer/lang/nl.js
deleted file mode 100644
index 3f0eaf2..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/PSServer/lang/nl.js
+++ /dev/null
@@ -1,15 +0,0 @@
-// I18N constants
-// LANG: "nl", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "__OBSOLETE__": {
-        "___ TRANSLATOR NOTE   ___": "*** PSSERVER IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***"
-    }
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/PSServer/lang/pl.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/PSServer/lang/pl.js
deleted file mode 100644
index b63a57d..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/PSServer/lang/pl.js
+++ /dev/null
@@ -1,15 +0,0 @@
-// I18N constants
-// LANG: "pl", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "__OBSOLETE__": {
-        "___ TRANSLATOR NOTE   ___": "*** PSSERVER IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***"
-    }
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/PSServer/lang/pt_br.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/PSServer/lang/pt_br.js
deleted file mode 100644
index 0c6ea8b..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/PSServer/lang/pt_br.js
+++ /dev/null
@@ -1,15 +0,0 @@
-// I18N constants
-// LANG: "pt_br", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "__OBSOLETE__": {
-        "___ TRANSLATOR NOTE   ___": "*** PSSERVER IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***"
-    }
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/PSServer/lang/ro.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/PSServer/lang/ro.js
deleted file mode 100644
index 40e9f93..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/PSServer/lang/ro.js
+++ /dev/null
@@ -1,15 +0,0 @@
-// I18N constants
-// LANG: "ro", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "__OBSOLETE__": {
-        "___ TRANSLATOR NOTE   ___": "*** PSSERVER IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***"
-    }
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/PSServer/lang/ru.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/PSServer/lang/ru.js
deleted file mode 100644
index 3484549..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/PSServer/lang/ru.js
+++ /dev/null
@@ -1,15 +0,0 @@
-// I18N constants
-// LANG: "ru", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "__OBSOLETE__": {
-        "___ TRANSLATOR NOTE   ___": "*** PSSERVER IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***"
-    }
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/PSServer/lang/sh.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/PSServer/lang/sh.js
deleted file mode 100644
index f2a566f..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/PSServer/lang/sh.js
+++ /dev/null
@@ -1,15 +0,0 @@
-// I18N constants
-// LANG: "sh", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "__OBSOLETE__": {
-        "___ TRANSLATOR NOTE   ___": "*** PSSERVER IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***"
-    }
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/PSServer/lang/si.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/PSServer/lang/si.js
deleted file mode 100644
index 53450f8..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/PSServer/lang/si.js
+++ /dev/null
@@ -1,15 +0,0 @@
-// I18N constants
-// LANG: "si", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "__OBSOLETE__": {
-        "___ TRANSLATOR NOTE   ___": "*** PSSERVER IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***"
-    }
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/PSServer/lang/sr.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/PSServer/lang/sr.js
deleted file mode 100644
index 10c14e4..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/PSServer/lang/sr.js
+++ /dev/null
@@ -1,15 +0,0 @@
-// I18N constants
-// LANG: "sr", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "__OBSOLETE__": {
-        "___ TRANSLATOR NOTE   ___": "*** PSSERVER IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***"
-    }
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/PSServer/lang/sv.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/PSServer/lang/sv.js
deleted file mode 100644
index 8c05863..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/PSServer/lang/sv.js
+++ /dev/null
@@ -1,15 +0,0 @@
-// I18N constants
-// LANG: "sv", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "__OBSOLETE__": {
-        "___ TRANSLATOR NOTE   ___": "*** PSSERVER IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***"
-    }
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/PSServer/lang/th.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/PSServer/lang/th.js
deleted file mode 100644
index 0986274..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/PSServer/lang/th.js
+++ /dev/null
@@ -1,15 +0,0 @@
-// I18N constants
-// LANG: "th", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "__OBSOLETE__": {
-        "___ TRANSLATOR NOTE   ___": "*** PSSERVER IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***"
-    }
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/PSServer/lang/tr.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/PSServer/lang/tr.js
deleted file mode 100644
index 90aa647..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/PSServer/lang/tr.js
+++ /dev/null
@@ -1,15 +0,0 @@
-// I18N constants
-// LANG: "tr", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "__OBSOLETE__": {
-        "___ TRANSLATOR NOTE   ___": "*** PSSERVER IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***"
-    }
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/PSServer/lang/vn.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/PSServer/lang/vn.js
deleted file mode 100644
index 38f7cc5..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/PSServer/lang/vn.js
+++ /dev/null
@@ -1,15 +0,0 @@
-// I18N constants
-// LANG: "vn", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "__OBSOLETE__": {
-        "___ TRANSLATOR NOTE   ___": "*** PSSERVER IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***"
-    }
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/PSServer/lang/zh_cn.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/PSServer/lang/zh_cn.js
deleted file mode 100644
index 1847d39..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/PSServer/lang/zh_cn.js
+++ /dev/null
@@ -1,15 +0,0 @@
-// I18N constants
-// LANG: "zh_cn", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "__OBSOLETE__": {
-        "___ TRANSLATOR NOTE   ___": "*** PSSERVER IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***"
-    }
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/PersistentStorage/PersistentStorage.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/PersistentStorage/PersistentStorage.js
deleted file mode 100644
index a3bfac7..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/PersistentStorage/PersistentStorage.js
+++ /dev/null
@@ -1,1142 +0,0 @@
-/**

- * @fileOverview PersistentStorage PersistentStorage.js file.

- * This plugin is a rethinking of the ExtendFileManager plugin written and

- * designed by Wei Zhuo, Afru, Krzysztof Kotowicz, Raimund Meyer.

- *

- * @author Douglas Mayle <douglas@openplans.org>

- * @version 1.0

- */

-

-/**

- * The global namespace

- * @name window

- */

-(function($) {

-/**

- * @name PersistentStorage

- * @class Provides an interface for persistant storage options to the user.

- * @param editor A reference to the Xinha Editor this plugin instance is attached to.

- */

-var PersistentStorage = window.PersistentStorage = function (editor) {

-  /**

-   * @memberOf Xinha

-   */

-  this.editor = editor;

-  var self = this;

-}

-

-/**

- * Plugin Metadata

- * @namespace

- * @static

- */

-PersistentStorage._pluginInfo = {

-    /** Plugin name */

-    name          : "PersistentStorage",

-    /** Plugin version */

-    version       : "1.0",

-    /** Plugin author */

-    developer     : "Douglas Mayle",

-    /** Plugin author's website */

-    developer_url : "http://douglas.mayle.org",

-    /** Plugin license */

-    license       : "BSD"

-};

-

-/**

- * The list of backend modules registered with this instance.

- */

-PersistentStorage.prototype._backends = {};

-

-/**

- * The list of user config files received from backends.

- */

-PersistentStorage.prototype._userconfigs = [];

-

-/**

- * The name of the currently active backend.

- */

-PersistentStorage.prototype._activeBackend = '';

-

-/**

- * The value of the type filter that's currently in effect.

- */

-PersistentStorage.prototype._typeFilter = '';

-

-/**

- * The currently displayed view type.

- */

-PersistentStorage.prototype._viewType = 'thumbnail';

-

-/**

- * On Xinha activation, this get's called so that we can prepare any resources

- * we need to function.

- */

-PersistentStorage.prototype.onGenerateOnce = function () {

-  // We use _prepareDialog to asynchronously load the dialog markup and then

-  // perform necessary processing.

-  this._prepareDialog();

-};

-

-function addClass(element, className) {

-  var classRegex = new RegExp(' ?' + className + ' ?');

-

-  if (!classRegex.test(element.className)) {

-    element.className += ' ' + className;

-  }

-}

-

-function removeClass(element, className) {

-  var classRegex = new RegExp(' ?' + className + ' ?');

-

-  if (classRegex.test(element.className)) {

-    element.className = element.className.replace(classRegex, ' ');

-  }

-}

-

-function toggleClass(element, className) {

-  var classRegex = new RegExp(' ?' + className + ' ?');

-

-  if (classRegex.test(element.className)) {

-    element.className = element.className.replace(classRegex, ' ');

-  } else {

-    element.className += ' ' + className;

-  }

-}

-

-/**

- * Once we're sure we have a backend that supports document functionality,

- * we'll load the interface that exposes it.

- */

-PersistentStorage.prototype._registerDocumentUI = function () {

-  if (this._documentEnabled) {

-    // No need to repeated rebuild the UI.

-    return;

-  }

-

-  this._documentEnabled = true;

-  var self = this;

-

-  var editor = this.editor;

-

-  editor.config.registerButton({

-      id       : 'newdocument',

-      tooltip  : Xinha._lc( 'New Document', 'PersistentStorage' ),

-      image    : [_editor_url + editor.config.imgURL + 'ed_buttons_main.png',0,5],

-      textMode : true,

-      action   : function() { self.newDocument(); }

-    }

-  );

-  editor.config.registerButton({

-      id       : 'opendocument',

-      tooltip  : Xinha._lc( 'Open Document', 'PersistentStorage' ),

-      image    : [_editor_url + editor.config.imgURL + 'ed_buttons_main.png',1,5],

-      textMode : true,

-      action   : function() { self.openDialog(); }

-    }

-  );

-  editor.config.registerButton({

-      id       : 'savedocument',

-      tooltip  : Xinha._lc( 'Save Document', 'PersistentStorage' ),

-      image    : [_editor_url + editor.config.imgURL + 'ed_buttons_main.png',9,1],

-      textMode : true,

-      action   : function() { self.saveDialog(); }

-    }

-  );

-  editor.config.addToolbarElement('newdocument', 'fullscreen', 1);

-  editor.config.addToolbarElement('opendocument', 'newdocument', 1);

-  editor.config.addToolbarElement('savedocument', 'opendocument', 1);

-

-  // Since this is after the editor load, we have to trigger an udate manually...

-  editor._rebuildToolbar();

-};

-

-/**

- * Backend storage plugins should call this method so that they can be exposed

- * to the user.  Because of possible quirks in plugin loading, you should use

- * the following example code when registering.

- * @param name The name of the module

- * @param module The module instance

- * @param config Configuration information that tells us about the module

- * @param user_config AN object representing the user configuration loaded from

- * this module.

- * @example

-

- * PSBackend.prototype.onGenerateOnce = function () {

- *   // Register with the Persistent Storage plugin.

- *   this._registerBackend();

- * };

- * PSBackend.prototype._registerBackend = function(timeWaited) {

- *   var editor = this.editor;

- *   var self = this;

- * 

- *   if (!timeWaited) {

- *     timeWaited = 0;

- *   }

- * 

- *   // Retry over a period of ten seconds to register.  We back off exponentially

- *   // to limit resouce usage in the case of misconfiguration.

- *   var registerTimeout = 10000;

- * 

- *   if (timeWaited > registerTimeout) {

- *     // This is most likely a configuration error.  We're loaded and

- *     // PersistentStorage is not.

- *     return;

- *   }

- * 

- *   if (!editor.plugins['PersistentStorage'] ||

- *       !editor.plugins['PersistentStorage'].instance ||

- *       !editor.plugins['PersistentStorage'].instance.ready) {

- * 

- *     window.setTimeout(function() {

- *       self._registerBackend(timeWaited ? timeWaited*2 : 50);

- *     }, timeWaited ? timeWaited : 50);

- *

- *     return;

- *   }

- *   var PS = editor.plugins['PersistentStorage'].instance;

- *   

- *   // Support user configuration. This loading should be moved into PersistentStorage...

- *   this.loadDocument({URL:'', name:'config.js', key:'/config.js'}, function(json) {

- *                    var userconfig = json ? eval('(' + json + ')') : false;

- *                    PS.registerBackend('PSLocal', self, self.config, userconfig);

- *                    });

- */

-PersistentStorage.prototype.registerBackend = function (name, module, config, user_config) {

-  this._backends[name] = {module: module, config: config, name: name};

-

-  // TODO I'd like something more than just whoever calls back first wins for ordering.

-  if (!this._activeBackend) {

-    this.setBackend(name);

-  }

-

-  if (config.capabilities.upload_operations &&

-      config.capabilities.file_operations) {

-    this._registerDocumentUI();

-  }

-

-  // Handle user configuration

-  if (user_config) {

-    this._userconfigs.push(user_config);

-    this.configureUser();

-  }

-

-  this.updatePlacesDisplay();

-}

-

-/**

- * Go through the list of user configs and reconfigure Xinha.

- */

-PersistentStorage.prototype.configureUser = function () {

-  // Temp code does not handle user affinity

-  var self = this;

-  for (var index=0; index<this._userconfigs.length; ++index) {

-    // A user config can have various options, we'll deal with each in turn.

-    var config = this._userconfigs[index];

-

-    for (var pluginName in (config.plugins || {})) {

-      // Try to load each of the plugins requested by the user.

-      Xinha.loadPlugin(pluginName, function() {

-                // On successful load, we'll register the plugin with this instance.

-                self.editor.registerPlugins([pluginName]);

-                Xinha.refreshPlugin(self.editor.plugins[pluginName].instance);

-                // Now that

-                self.editor._rebuildToolbar();

-              }, config.plugins[pluginName]);

-    }

-  }

-}

-

-/**

- * Present the user with a clean slate document.  Someday, we'll cycle through

- * a list of templates in storage.

- */

-PersistentStorage.prototype.newDocument = function () {

-  if (this.editor._doc.body.lastChild) {

-    // There's already some content, let's make sure.

-    if (!confirm(Xinha._lc('This will erase any unsaved content.  If you\'re certain, please click OK to continue.', 'PersistentStorage'))) {

-      return;

-    }

-  }

-  while (this.editor._doc.body.lastChild) {

-    this.editor._doc.body.removeChild(this.editor._doc.body.lastChild);

-  }

-}

-

-/**

- * Present a save dialog to the user.

- */

-PersistentStorage.prototype.saveDialog = function () {

-  var self = this;

-

-  // Setup the dialog title

-  var title = this.dialog.getElementById("h1");

-  title.innerHTML = Xinha._lc('Save Document', 'PersistentStorage');

-

-  // Setup the confirmation button and action.

-  var button = this.dialog.getElementById("confirm");

-  button.value = Xinha._lc('Save', 'PersistentStorage');

-  button.onclick = function() {

-    self.saveDocument();

-  };

-

-  // Enable and disable the buttons with filename input

-  var nameinput = this.dialog.getElementById("filename");

-

-  button.disabled = nameinput.value ? false : true;

-

-  nameinput.onkeyup = nameinput.onkeypress = nameinput.onchange = function() {

-

-    button.disabled = nameinput.value ? false : true;

-  }

-

-  this.showDialog({typeFilter:['document','html','text','folder'], styleFor:'documentsave'});

-}

-

-/**

- * Use the selected backend to save the current document.

- */

-PersistentStorage.prototype.saveDocument = function () {

-  var editor = this.editor;

-  var module = this._backends[this._activeBackend].module;

-

-  var filename = this.dialog.getElementById("filename");

-  module.saveDocument(module.viewFilter, filename.value, editor.getHTML(), function() {

-    module.cache = null;

-  });

-

-  this.dialog.hide();

-}

-

-/**

- * Present an open dialog to the user.

- */

-PersistentStorage.prototype.openDialog = function () {

-  var self = this;

-

-  // Setup the dialog title

-  var title = this.dialog.getElementById("h1");

-  title.innerHTML = Xinha._lc('Open Document', 'PersistentStorage');

-

-  // Setup the confirmation button and action.

-  var button = this.dialog.getElementById("confirm");

-  button.value = Xinha._lc('Open', 'PersistentStorage');

-  button.onclick = function() {

-    self.openDocument();

-  };

-

-  this.showDialog({typeFilter:['document','html','text','folder'], styleFor:'documentload'});

-}

-

-/**

- * Use the selected backend to load the selected entry into the editor.

- */

-PersistentStorage.prototype.openDocument = function () {

-  var editor = this.editor;

-

-  var module = this._backends[this._activeBackend].module;

-  module.loadDocument(this.selectedEntry[0], function(documentSource) {

-                   editor.setHTML(documentSource);

-                 });

-

-  this.dialog.hide();

-}

-

-/**

- * @param options Configuration options that tweak the display of the dialog.

- * @param options.typeFilter {String[]} Object types to allow in the display.

- * Possibilities are 'image', 'media', 'document', and 'folder'.

- * @param options.styleFor {String} Possible stylings of the dialog.  This can

- * be 'insertion', 'link', 'documentsave', or 'documentload'.

- * @example

- * Interface Mockup

- *

- * ****************************************************************************

- * *                                                                          *

- * * #Places## #File Browser################################################# *

- * * #       # # ______________          ________________ ________________  # *

- * * #  ===  # # |/subdir     |  ^(Up)   |*Create Folder| |View as Icons^|  # *

- * * #  |*|  # # --------------          ---------------- ----------------  # *

- * * #  |*|  # #                                                            # *

- * * #  ===  # # ***********  ***********  ***********  ***********         # *

- * * #Server # # *  Thumb  *  *  Thumb  *  *  Thumb  *  *  Thumb  *         # *

- * * #       # # *         *  *         *  *         *  *         *         # *

- * * #  /\   # # *(Edit)   *  *(Edit)   *  *(Edit)   *  *(Edit)   *         # *

- * * # <  >  # # *(Delete) *  *(Delete) *  *(Delete) *  *(Delete) *         # *

- * * #  \/   # # ***********  ***********  ***********  ***********         # *

- * * # Gears # #                                                            # *

- * * #       # ############################################################## *

- * * #       #                                                                *

- * * #       # *Import-(Collapsed)******************************************* *

- * * #       #                                                                *

- * * #       # #File Name -or- File Details################################## *

- * * #       # #                                                            # *

- * * #       # #                                                            # *

- * * #       # #                                                            # *

- * * #       # #                                                            # *

- * * ######### ############################################################## *

- * *                                                                          *

- * ****************************************************************************

- */

-

-PersistentStorage.prototype.showDialog = function (options) {

-  // Create a reference to this PS instance to allow for asynchronous

-  // continuation (if we're not ready.)

-  var self = this;

-

-  if (!this.ready) {

-    window.setTimeout(function() {self.showDialog(options);}, 80);

-    return;

-  }

-  

-  // We hide and show the various elements of the dialog depending on usage.

-  removeClass(this.dialog.getElementById("WWW"), 'hidden');

-  addClass(this.dialog.getElementById("namefield"), 'hidden');

-  addClass(this.dialog.getElementById("placeWww"), 'hidden');

-  addClass(this.dialog.getElementById("placeBackend"), 'hidden');

-

-  switch (options.styleFor) {

-    case 'link':

-      removeClass(this.dialog.getElementById("placeWww"), 'hidden');

-      this.updatePlacesDisplay('shared_publish');

-      break;

-    case 'insertion':

-      removeClass(this.dialog.getElementById("placeBackend"), 'hidden');

-      this.updatePlacesDisplay('shared_publish');

-      break;

-    case 'documentsave':

-      addClass(this.dialog.getElementById("WWW"), 'hidden');

-      removeClass(this.dialog.getElementById("namefield"), 'hidden');

-      removeClass(this.dialog.getElementById("placeBackend"), 'hidden');

-      this.updatePlacesDisplay('file_operations');

-      break;

-    case 'documentload':

-      addClass(this.dialog.getElementById("WWW"), 'hidden');

-      removeClass(this.dialog.getElementById("placeBackend"), 'hidden');

-      this.updatePlacesDisplay('file_operations');

-      break;

-  }

-

-  var directories = this.dialog.getElementById("filters");

-  var fileBrowser = this.dialog.getElementById("fileList");

-

-  // Store the type filter so that view updates will correctly filter the contents.

-  this._typeFilter = options.typeFilter;

-

-  var module = this._backends[this._activeBackend].module;

-

-  this.updateFileBrowser();

-}

-

-/**

- * Take the list of filters and build the contents of the select element.

- * @param filters {Filter[]} An array of filter choices to display to the user.

- * @param filters[n].value The unique key that represents this filter to the backend.

- * @param filters[n].display {String} A text string to display to the user to

- * represent the given filter.

- * @param select {HTMLElement} The select node to update.

- */

-PersistentStorage.prototype.displayFilters = function(filters, viewFilter) {

-  // Clear out the previous directory listing.

-  var select = this.dialog.getElementById("filters");

-  while (select.lastChild) {

-    select.removeChild(select.lastChild);

-  }

-

-  // For each element in the array, we extract out the display text and the

-  // value and put them into an option element to add to the select element.

-  for (var index=0; index<filters.length; ++index) {

-    var option = document.createElement('option');

-    option.setAttribute("value", filters[index].value);

-    if (filters[index].value == viewFilter) {

-      option.setAttribute("selected", 'selected');

-    }

-

-    var text = document.createTextNode(filters[index].display);

-    option.appendChild(text);

-

-    select.appendChild(option);

-  }

-}

-

-/**

- * Given an entry, build an html UI element.

- * @param entry An object representing a file entry.

- * @param entry.URL The URL where this entry is located, if available,

- * @param entry.thumbURL The URL of an image that represents a thumbnail

- * preview of this file.

- * @param entry.$type {String} The type of this entry.  This can be one of:

- * 'image', 'media', 'folder', 'document', 'html', or 'text'

- * @param entry.name The name of this entry to display to the user.

- */

-PersistentStorage.prototype.buildThumbnail = function(entry) {

-  var self = this;

-

-  // We store the active module so that any elements built with data from this

-  // module can call back to it.

-  var module = this._backends[this._activeBackend].module;

-

-  var fileBlock = document.createElement('div');

-  fileBlock.entry = entry;

-  fileBlock.className = 'file';

-

-

-  // Use a closure here to make sure that the onclick handler has the

-  // right binding,

-  Xinha._addEvent(fileBlock, "click", function(ev) {

-    ev = ev || window.event;

-    Xinha._stopEvent(ev);

-    if (self.selectedEntry) {

-      // Unselect

-      removeClass(self.selectedEntry[1], 'selected');

-      if (self.selectedEntry[1] == fileBlock) {

-        // Allow click to toggle.

-        self.selectedEntry = null;

-        return;

-      }

-    }

-    self.selectedEntry = [entry, fileBlock];

-    self.selectedEntry[1].className += ' selected';

-

-    var filename = self.dialog.getElementById('filename');

-    filename.value = entry.name;

-

-    var confirmbutton = self.dialog.getElementById('confirm');

-    confirmbutton.disabled = false;

-  });

-

-  var image = document.createElement('img');

-  image.className = 'icon';

-  if (entry.$type == 'image') {

-    image.className = 'thumb';

-    image.setAttribute('src', entry.URL);

-  } else if (entry.$type == 'folder') {

-    image.setAttribute('src', entry.thumbURL || entry.URL || this.editor.imgURL('images/tango/32x32/places/folder.png'));

-  } else if (entry.$type == 'document') {

-    image.setAttribute('src', entry.thumbURL || entry.URL || this.editor.imgURL('images/tango/32x32/mimetypes/text-html.png'));

-  } else if (entry.$type == 'html') {

-    image.setAttribute('src', entry.thumbURL || entry.URL || this.editor.imgURL('images/tango/32x32/mimetypes/text-html.png'));

-  } else if (entry.$type == 'txt') {

-    image.setAttribute('src', entry.thumbURL || entry.URL || this.editor.imgURL('images/tango/32x32/mimetypes/text-g-generic.png'));

-  } else {

-    image.setAttribute('src', entry.thumbURL || entry.URL || this.editor.imgURL('images/tango/32x32/mimetypes/x-office-document.png'));

-  }

-    image = fileBlock.appendChild(image);

-

-

-  var deleteIcon = document.createElement('img');

-  deleteIcon.className = 'action delete';

-  deleteIcon.setAttribute('alt', Xinha._lc('Delete', 'PersistentStorage'));

-  deleteIcon.setAttribute('title', Xinha._lc('Delete', 'PersistentStorage'));

-  deleteIcon.setAttribute('src', this.editor.imgURL('images/tango/16x16/places/user-trash.png'));

-  deleteIcon = fileBlock.appendChild(deleteIcon);

-

-  Xinha._addEvent(deleteIcon, "click", function(ev) {

-    ev = ev || window.event;

-    Xinha._stopEvent(ev);

-    module.deleteEntry(entry, function(success) {

-      module.cache = null;

-      if (success) {

-        fileBlock.parentNode.removeChild(fileBlock);

-      } else {

-        alert('Error deleting file ' + entry.name);

-      }

-    });

-  });

-

-

-  var fileName = document.createElement('p');

-  fileName.className = 'filename';

-  var fileNameText = document.createTextNode(entry.name);

-  fileNameText = fileName.appendChild(fileNameText);

-  fileName = fileBlock.appendChild(fileName);

-

-  // Use a closure here to make sure that the onclick handler has the

-  // right binding,

-  fileName.onclick = function(fileName) {

-    return function(ev) {

-      ev = ev || window.event;

-      Xinha._stopEvent(ev);

-      fileName.style.border = '1px solid red';

-      return false;

-    };

-  }(fileName);

-

-  var copyIcon = document.createElement('img');

-  copyIcon.className = 'action copy';

-  copyIcon.setAttribute('src', this.editor.imgURL('images/tango/16x16/actions/edit-copy.png'));

-  copyIcon.setAttribute('alt', Xinha._lc('Copy', 'PersistentStorage'));

-  copyIcon.setAttribute('title', Xinha._lc('Copy', 'PersistentStorage'));

-

-  Xinha._addEvent(copyIcon, "click", function(ev) {

-    ev = ev || window.event;

-    Xinha._stopEvent(ev);

-    module.copyEntry(entry, function(success, newentry) {

-      module.cache = null;

-      if (success) {

-        fileBlock.parentNode.appendChild(self.buildThumbnail(newentry));

-      } else {

-        alert('Error copying file ' + entry.name);

-      }

-    });

-  });

-

-  copyIcon = fileBlock.appendChild(copyIcon);

-

-  return fileBlock;

-}

-

-/**

- * Build up the file browser display in the element.

- * @param metadata {Entry[]} A list of entries to display in the file browser.

- * @param metadata[n].URL The URL where this entry is located, if available,

- * @param metadata[n].thumbURL The URL of an image that represents a thumbnail

- * preview of this file.

- * @param metadata[n].$type {String} The type of this entry.  This can be one of:

- * 'image', 'media', 'folder', 'document', 'html', or 'text'

- * @param metadata[n].name The name of this entry to display to the user.

- */

-PersistentStorage.prototype.displayBrowser = function(metadata) {

-

-  // The div element that contains the file browser.

-  var div = this.dialog.getElementById("fileList");

-

-  // Clear out the previous directory listing.

-  while (div.lastChild) {

-    div.removeChild(div.lastChild);

-  }

-

-  var editor = this.editor;

-  var self = this;

-

-  for (var index=0; index<metadata.length; ++index) {

-      switch (this._viewType) {

-        case 'listing':

-          break;

-        case 'thumbnail':

-        default:

-          var thumb = div.appendChild(this.buildThumbnail(metadata[index]));

-

-          // If jQuery is loaded with the draggable and droppable UI controls,

-          // we'll enhance our interface.

-          if ($ && $.ui && $.ui.draggable && $.ui.droppable) {

-            // Make the objects draggable, but don't allow them to just hang

-            // around.

-            $(thumb).draggable({revert:true});

-

-            // All folders become drop targets to allow for easier moving

-            // around.

-            if (metadata[index].$type == 'folder') {

-              // Just in case Xinha is used on a page with other draggables, we

-              // need to limit the targets we accept.

-              $(thumb).droppable({accept: '*',

-                drop: function(e, ui) {

-

-                  // Set up a reference to the drop target so that we can move

-                  // all dragged items into it.

-                  var target = this;

-

-                  ui.draggable.each(function() {

-                    // We extract the entry reference from the DOM node.

-                    var file = this;

-                    var entry = file.entry;

-

-                    // TODO: Whoagh... What if our backend is a drop target?

-                    var module = self._backends[self._activeBackend].module;

-

-                    // This only works intra-module...

-                    module.moveEntry(entry, target.entry, function(success) {

-                      module.cache = null;

-                      if (success) {

-                        file.parentNode.removeChild(file);

-                      } else {

-                        alert('Error deleting file ' + entry.name);

-                      }

-                    });

-                  });

-                }

-              });

-            }

-          }

-      }

-  }

-

-  // If the browser is empty, we'll display an empty message

-  if (!div.firstChild) {

-    var message = document.createTextNode('No files found');

-    div.appendChild(message);

-  }

-}

-

-/**

- * Update the file browser according to the latest criteria.

- */

-PersistentStorage.prototype.updateFileBrowser = function() {

-  var self = this;

-

-  var module = this._backends[this._activeBackend].module;

-

-  var buildDialog = function(cache) {

-    // We cache the module data to save server roundtrips.

-    module.cache = cache;

-

-    // The backends are expected to process their cached data to create

-    // two data structures for us.  The first one is a list of filters

-    // used to keep the amount of data manageable in the interface.

-    // (e.g. directories, or tags, etc.)

-    var filters = module.getFilters(module.cache);

-

-    // Now that we have valid filter data, we setup the initial filter.

-    var resetFilter = true;

-    if (module.viewFilter) {

-      for (var index=0; index<filters.length; ++index) {

-        if (filters[index].value == module.viewFilter) {

-          resetFilter = false;

-        }

-      }

-    }

-

-    if (resetFilter) {

-      module.viewFilter = filters[0].value;

-    }

-

-    // The second data structure we need is a list of metadata about

-    // each file so that we can generate the appropriate listing.

-    var metadata = module.getMetadata(module.cache, module.viewFilter, self._typeFilter);

-

-    self.dialog.show();

-

-    self.displayFilters(filters, module.viewFilter);

-    self.displayBrowser(metadata);

-  };

-

-  if (module.cache) {

-    buildDialog(module.cache);

-    return;

-  }

-

-  module.loadData(buildDialog);

-}

-

-/**

- * Prepare all external resources necessary to display the dialog.

- */

-PersistentStorage.prototype._prepareDialog = function() {

-  var self = this;

-  var editor = this.editor;

-

-  if (!this.html) {

-    Xinha._getback(Xinha.getPluginDir("PersistentStorage") + "/dialog.html",

-                   function(getback) { 

-                     self.html = getback;

-                     self._prepareDialog();

-                   });

-    return;

-  }

-

-  this.dialog = new Xinha.Dialog(editor, this.html, "PersistentStorage", 

-                                 {width: 800,

-                                  closeOnEscape: true,

-                                  resizable: true,

-                                  centered: true,

-                                  modal: true

-                                 });

-

-

-  // The cancel dialog just hides the dialog.

-  this.dialog.getElementById("cancel").onclick = function() {

-    self.dialog.hide();

-  };

-

-  // Directory creation prompts the user for a directory name.

-  this.dialog.getElementById("dirCreate").onclick = function() {

-    var dirname = prompt(Xinha._lc('Please enter the name of the directory you\'d like to create.', 'PersistentStorage'));

-    if (dirname) {

-      var module = self._backends[self._activeBackend].module;

-      module.makeFolder(module.viewFilter, dirname, function(success) {

-        if (success) {

-          module.cache = null;

-          self.updateFileBrowser();

-        }

-      });

-    }

-  };

-

-  // The import field is hidden by default, and clicking on it toggles that state.

-  var importLegend = this.dialog.getElementById("importlegend");

-  var importDiv = this.dialog.getElementById("import");

-  importLegend.onclick = function() {

-    toggleClass(importDiv, 'collapsed');

-  };

-

-  // Since the WWW icons is a static element, we hook up it's click handler

-  // here, rather than when showing the dialog

-  var iconWWW = this.dialog.getElementById("WWW");

-  Xinha._addEvent(iconWWW, "click", function(ev) {

-    ev = ev || window.event;

-    Xinha._stopEvent(ev);

-

-    for (var indexEl=iconWWW.parentNode.firstChild; indexEl; indexEl = indexEl.nextSibling) {

-      if (1 != indexEl.nodeType) {

-        // We only process HTML nodes.

-        continue;

-      }

-

-      removeClass(indexEl, 'selected');

-    }

-

-    addClass(iconWWW, 'selected');

-    addClass(self.dialog.getElementById("placeBackend"), 'hidden');

-    removeClass(self.dialog.getElementById("placeWww"), 'hidden');

-  });

-

-  // Clicking inside of the file browser will deselect all files.

-  var fileBrowser = this.dialog.getElementById("fileList");

-  Xinha._addEvent(fileBrowser, "click", function(ev) {

-    for (var file=fileBrowser.firstChild; file; file=file.nextSibling) {

-      removeClass(file, 'selected');

-    }

-  });

-

-  // Setup the filter control so that user selection will refilter the shown

-  // files.

-  var filterControl = this.dialog.getElementById("filters");

-  filterControl.onchange = function() {

-    var module = self._backends[self._activeBackend].module;

-    module.viewFilter = filterControl.options[filterControl.selectedIndex].value;

-    self.updateFileBrowser();

-  };

-

-  // Setup the viewtype control to change the internals of the file list.

-  var viewType = this.dialog.getElementById("viewType");

-  viewType.onchange = function() {

-    self._viewType = viewType.options[viewType.selectedIndex].value;

-    self.updateFileBrowser();

-  }

-

-  this.ready = true;

-};

-

-/**

- * Update the list of available backends.

- */

-PersistentStorage.prototype.updatePlacesDisplay = function(capability) {

-  var self = this;

-  var placesBrowser = this.dialog.getElementById("placesList");

-

-  // Clear out any empty text nodes in the places browser.

-  while (placesBrowser.firstChild && 3 == placesBrowser.firstChild.nodeType) {

-    placesBrowser.removeChild(placesBrowser.firstChild);

-  }

-

-  var WWW = placesBrowser.firstChild;

-  while (WWW.nextSibling) {

-    placesBrowser.removeChild(WWW.nextSibling);

-  }

-

-  for (var backendName in this._backends) {

-    if (capability && !this._backends[backendName].config.capabilities[capability]) {

-      continue;

-    }

-

-

-    var thumb = placesBrowser.appendChild(this.placesIcon(this._backends[backendName]));

-

-    if ($ && $.ui && $.ui.draggable && $.ui.droppable) {

-        // Just in case Xinha is used on a page with other draggables, we

-        // need to limit the targets we accept.

-        $(thumb).droppable({accept: '*',

-          drop: function(e, ui) {

-

-            // Set up a reference to the drop target so that we can move

-            // all dragged items into it.

-            var target = this;

-

-            ui.draggable.each(function() {

-              // We extract the entry reference from the DOM node.

-              var file = this;

-              var entry = file.entry;

-

-              // TODO: Whoagh... What if our backend is a drop target?

-              var module = self._backends[self._activeBackend].module;

-

-              module.loadDocument(entry, function(documentSource) {

-                target.backend.module.saveDocument(module.viewFilter, entry.name, documentSource, function() {

-                  target.backend.module.cache = null;

-                  module.deleteEntry(entry, function(success) {

-                    module.cache = null;

-                    if (success) {

-                      file.parentNode.removeChild(file);

-                    } else {

-                      alert('Error deleting file ' + entry.name);

-                    }

-                  });

-                });

-              });

-            });

-          }

-        });

-    }

-  }

-}

-

-/**

- * Set the currently active backend

- */

-PersistentStorage.prototype.setBackend = function(backendName) {

-  if (this._activeBackend == backendName) {

-    // Save ourselves some work.

-    return;

-  }

-  this._activeBackend = backendName;

-  var module = this._backends[this._activeBackend];

-  if (module.config.capabilities.import_operations) {

-    Xinha._removeClass(this.dialog.getElementById("import"),'hidden');

-

-    var importUI = this.dialog.getElementById("importui");

-    while (importUI.firstChild) {

-      // Clear out the import UI of any other backend.

-      importUI.removeChild(importUI.firstChild);

-    }

-

-    module.module.buildImportUI(this.dialog, importUI);

-  } else {

-    Xinha._addClass(this.dialog.getElementById("import"),'hidden');

-  }

-}

-

-/**

- * Build a UI representation of the backend.

- */

-PersistentStorage.prototype.placesIcon = function(backend) {

-  var self = this;

-

-  var placesBlock = document.createElement('div');

-  placesBlock.backend = backend;

-  placesBlock.className = 'file';

-  if (this._activeBackend == backend.name) {

-    placesBlock.className += ' selected';

-  }

-

-

-  // Use a closure here to make sure that the onclick handler has the

-  // right binding,

-  Xinha._addEvent(placesBlock, "click", function(ev) {

-    ev = ev || window.event;

-    Xinha._stopEvent(ev);

-

-    for (var indexEl=placesBlock.parentNode.firstChild; indexEl; indexEl = indexEl.nextSibling) {

-      if (1 != indexEl.nodeType) {

-        // We only process HTML nodes.

-        continue;

-      }

-

-      removeClass(indexEl, 'selected');

-    }

-

-    addClass(placesBlock, 'selected');

-    removeClass(self.dialog.getElementById("placeBackend"), 'hidden');

-    addClass(self.dialog.getElementById("placeWww"), 'hidden');

-    self.setBackend(backend.name);

-    self.updateFileBrowser();

-  });

-

-  var image = document.createElement('img');

-  image.className = 'icon';

-  image.setAttribute('src', backend.config.thumbURL || this.editor.imgURL('images/tango/32x32/places/network-server.png'));

-  image = placesBlock.appendChild(image);

-

-

-  var placesName = document.createElement('p');

-  placesName.className = 'filename';

-  var placesNameText = document.createTextNode(backend.config.displayName || backend.name);

-  placesNameText = placesName.appendChild(placesNameText);

-  placesName = placesBlock.appendChild(placesName);

-

-  return placesBlock;

-}

-/**

- * The Xinha text editor

- * @name Xinha

- */

-var Xinha = window.Xinha;

-/**

- * We override the native _insertImage function of Xinha.  We call the instance

- * version of the method in order to setup the proper context.

- * @param image TODO Figure out what this is :-D

- */

-Xinha.prototype._insertImage = function(image) {

-  var editor = this;

-  var PS = editor.plugins['PersistentStorage'].instance;

-

-  // Setup the dialog title

-  var title = PS.dialog.getElementById("h1");

-  title.innerHTML = Xinha._lc('Insert Image', 'PersistentStorage');

-

-  // Setup the confirmation button and action.

-  var button = PS.dialog.getElementById("confirm");

-  button.value = Xinha._lc('Insert', 'PersistentStorage');

-  button.onclick = function() {

-    PS.insertImage();

-  };

-

-  PS.showDialog({typeFilter:['image','folder'],styleFor:'insertion'});

-}

-

-/**

- * Take a selected image from the dialog and insert it into the document.

- */

-PersistentStorage.prototype.insertImage = function() {

-  var editor = this.editor;

-

-  this.dialog.hide();

-

-  var image = editor._doc.createElement('img');

-  if (this.selectedEntry) {

-    image.setAttribute('src', this.selectedEntry[0].URL);

-  } else {

-    image.setAttribute('src', this.dialog.getElementById("URL").value);

-  }

-  for (var prop in {width:'',height:'',margin:'',padding:'',border:'',borderColor:'',backgroundColor:''}) {

-    var val =  this.dialog.getElementById('image_' + prop).value.replace(/^\s+$/,'');

-    if (val) {

-      image.style[prop] = val;

-    }

-  }

-  editor.insertNodeAtSelection(image);

-

-  var range = editor.createRange(editor.getSelection());

-  range.collapse(false);

-

-}

-})(window.jQuery);

-//Xinha.prototype._linkFile = function(link) {

-//

-//    var editor = this;

-//    var outparam = {"editor" : this, param : null};

-//    if (typeof link == "undefined") {

-//        link = this.getParentElement();

-//        if (link) {

-//            if (/^img$/i.test(link.tagName))

-//                link = link.parentNode;

-//            if (!/^a$/i.test(link.tagName))

-//                link = null;

-//        }

-//    }

-//    if (!link) {

-//        var sel = editor.getSelection();

-//        var range = editor.createRange(sel);

-//        var compare = 0;

-//        if (Xinha.is_ie) {

-//            if ( sel.type == "Control" )

-//                compare = range.length;

-//            else

-//                compare = range.compareEndPoints("StartToEnd", range);

-//        } else {

-//            compare = range.compareBoundaryPoints(range.START_TO_END, range);

-//        }

-//        if (compare == 0) {

-//            alert(Xinha._lc("You must select some text before making a new link.", 'PersistentStorage'));

-//            return;

-//        }

-//        outparam.param = {

-//            f_href : '',

-//            f_title : '',

-//            f_target : '',

-//            f_usetarget : editor.config.makeLinkShowsTarget,

-//            baseHref: editor.config.baseHref

-//        };

-//    } else

-//        outparam.param = {

-//            f_href   : Xinha.is_ie ? link.href : link.getAttribute("href"),

-//            f_title  : link.title,

-//            f_target : link.target,

-//            f_usetarget : editor.config.makeLinkShowsTarget,

-//            baseHref: editor.config.baseHref

-//        };

-//

-//    Dialog(this.config.PersistentStorage.manager+'&mode=link', function(param){

-//        if (!param)

-//            return false;

-//        var a = link;

-//        if (!a) try {

-//            editor._doc.execCommand("createlink", false, param.f_href);

-//            a = editor.getParentElement();

-//            var sel = editor.getSelection();

-//            var range = editor.createRange(sel);

-//            if (!Xinha.is_ie) {

-//                a = range.startContainer;

-//                if (!/^a$/i.test(a.tagName)) {

-//                    a = a.nextSibling;

-//                    if (a == null)

-//                        a = range.startContainer.parentNode;

-//                }

-//            }

-//        } catch(e) {}

-//        else {

-//            var href = param.f_href.trim();

-//            editor.selectNodeContents(a);

-//            if (href == "") {

-//                editor._doc.execCommand("unlink", false, null);

-//                editor.updateToolbar();

-//                return false;

-//            }

-//            else {

-//                a.href = href;

-//            }

-//        }

-//        if (!(a && /^a$/i.test(a.tagName)))

-//            return false;

-//        a.target = param.f_target.trim();

-//        a.title = param.f_title.trim();

-//        editor.selectNodeContents(a);

-//        editor.updateToolbar();

-//    }, outparam);

-//};

-//

-//function shortSize(cssSize)

-//{

-//    if(/ /.test(cssSize))

-//    {

-//        var sizes = cssSize.split(' ');

-//        var useFirstSize = true;

-//        for(var i = 1; i < sizes.length; i++)

-//        {

-//            if(sizes[0] != sizes[i])

-//            {

-//                useFirstSize = false;

-//                break;

-//            }

-//        }

-//        if(useFirstSize) cssSize = sizes[0];

-//    }

-//

-//    return cssSize;

-//}

-//

-//function convertToHex(color) {

-//

-//    if (typeof color == "string" && /, /.test.color)

-//        color = color.replace(/, /, ','); // rgb(a, b) => rgb(a,b)

-//

-//    if (typeof color == "string" && / /.test.color) { // multiple values

-//        var colors = color.split(' ');

-//        var colorstring = '';

-//        for (var i = 0; i < colors.length; i++) {

-//            colorstring += Xinha._colorToRgb(colors[i]);

-//            if (i + 1 < colors.length)

-//                colorstring += " ";

-//        }

-//        return colorstring;

-//    }

-//

-//    return Xinha._colorToRgb(color);

-//}

-//});

-

-// Xinha._lc("Hello  There A ")

-// Xinha._lc("Hello \" There B \"")

-// Xinha._lc('Hello    There C ')

-// Xinha._lc('Hello \' There D \'')

-

-

diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/PersistentStorage/dialog.css b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/PersistentStorage/dialog.css
deleted file mode 100644
index 5d1a16d..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/PersistentStorage/dialog.css
+++ /dev/null
@@ -1,89 +0,0 @@
-
-.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-1.5.1/unsupported_plugins/PersistentStorage/dialog.html b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/PersistentStorage/dialog.html
deleted file mode 100644
index 2478fc2..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/PersistentStorage/dialog.html
+++ /dev/null
@@ -1,126 +0,0 @@
-<h1 id="[h1]"><l10n>File Browser</l10n></h1>
-<div style="width:95px; float:left; height:100%">
-  <fieldset><legend><l10n>Places</l10n></legend>
-    <div class="placesmanager" id="[placesList]" title="_(List of Places)">
-      <div class="file" id="[WWW]"><img class="icon" src="../images/tango/32x32/apps/internet-web-browser.png"/><p class="filename">WWW</p></div>
-    </div>
-  </fieldset>
-</div>
-<div style="margin-left:100px;">
-  <div id="[placeBackend]">
-    <fieldset><legend><l10n>File Manager</l10n></legend>
-      <table border="0" cellpadding="0" cellspacing="0" width="100%">
-      <tbody><tr>
-      <td style="padding: 10px;" nowrap="nowrap">
-
-        <label for="[filters]">Directory</label>
-        <select id="[filters]" class="dirWidth"></select>
-
-        <a href="#" id="[dirUp]" title="_(Directory Up)"><img src="../images/tango/16x16/actions/go-up.png" alt="_(Directory Up)" height="15" width="15"></a>
-
-
-        <a href="#" id="[dirCreate]" title="_(New Folder)"><img src="../images/tango/16x16/actions/folder-new.png" alt="_(New Folder)" height="15" width="15"></a>
-
-        <select id="[viewType]">
-            <option value="thumbnail" selected="selected">Thumbnail View</option>
-            <option value="listing">List View</option>
-        </select>
-      </td>
-      </tr>
-      <tr><td style="padding: 0px 10px 10px;">
-        <div class="filemanager" id="[fileList]" title="_(File List)"></div>
-      </td></tr>
-      </tbody></table>
-    </fieldset>
-    <fieldset id="[import]" class="collapsed">
-      <legend id="[importlegend]"><l10n>Import &#x2304;<!--&#x02c5;--></l10n></legend>
-      <div id="[importui]"></div>
-    </fieldset>
-  </div>
-  <div id="[placeWww]">
-    <fieldset><legend><l10n>Web URL</l10n></legend>
-      <label for="URL">Enter URL below:</label><br />
-      <input id="URL" type="text" size="50" />
-    </fieldset>
-  </div>
-
-  <fieldset id="[namefield]">
-    <legend><l10n>Filename</l10n></legend>
-    <input id="[filename]" type="text" />
-  </fieldset>
-
-  <fieldset id="[detailsfield]">
-    <legend><l10n>Details</l10n></legend>
-    <div id="[details_image]">
-      <table class="inputTable">
-        <tbody>
-          <tr>
-            <td style="text-align: right;"><label for="[image_alt]">Alt</label></td>
-            <td colspan="5"><input type="text" value="" id="[image_alt]"/></td>
-            <td style="vertical-align: top; text-align: center;" colspan="2" rowspan="5">
-              <div style="border: 1px inset ; padding: 4px; background-color: rgb(204, 204, 204); width: 100px; height: 100px;">
-                <img id="[image_preview]" alt="" src="img/1x1_transparent.gif"/>
-              </div>
-            </td>
-          </tr>
-          <tr>
-            <td style="text-align: right;"> <label for="[image_width]">Width</label></td>
-            <td><input type="text" value="" id="[image_width]"/></td>
-            <td rowspan="2" style="vertical-align:middle"><img width="25" height="32" alt="Constrained Proportions" id="[image_constrain_icon]" src="img/locked.gif"/>
-              <input type="checkbox" onclick="javascript:toggleConstrains(this);" checked="checked" id="[image_constrain]" value="on" />
-              <label for="[image_constrain]">Constrain Proportions</label>
-            </td>
-
-            <td style="text-align: right;" rowspan="3"/>
-
-            <td style="text-align: right;"><label for="[image_margin]">Margin</label></td>
-
-            <td><input type="text" value="" class="smallWidth" id="[image_margin]"/></td>
-</tr>
-<tr>
-            <td style="text-align: right;"><label for="[image_height]">Height</label></td>
-
-            <td class="smallWidth"><input type="text" value="" class="smallWidth" id="[image_height]"/></td>
-
-            <td style="text-align: right;"><label for="[image_padding]">Padding</label></td>
-
-            <td><input type="text" value="" class="smallWidth" id="[image_padding]"/>
-            </td>
-
-                               <td style="text-align: left;">Color</td>
-                  <td>
-                  <input type="text" size="7" id="[image_backgroundColor]" /><span class="buttonColor"><span class="chooser"> </span><span class="nocolor">×</span></span>
-                </td>
-              </tr>
-<tr>
-            <td style="text-align: right;"><label for="[image_align]">Align</label></td>
-
-            <td colspan="2">                <select title="Positioning of this image" id="[image_align]" size="1">
-                  <option selected="selected" 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">Baseline</option>
-                  <option value="absbottom">Absbottom</option>
-                  <option value="bottom">Bottom</option>
-                  <option value="middle">Middle</option>
-                  <option value="top">Top</option>
-                </select>            </td>
-
-            <td style="text-align: right;"><label for="[image_border]">Border</label></td>
-            <td><input type="text" value="" class="smallWidth" id="[image_border]"/></td>
-                          <td style="text-align: left;">Border Color</td>
-            <td><input type="text" size="7" id="[image_borderColor]" /><span class="buttonColor"><span class="chooser"> </span><span class="nocolor">×</span></span></td>
-            </tr>
-</tbody></table>
-
-<!--// image properties -->    
-</div>
-    
-  </fieldset>
-
-    <input type="button" id="[confirm]" value="_(Confirm)" />
-    <input type="button" id="[cancel]" value="_(Cancel)" />
-  </div>
-</div>
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/PersistentStorage/lang/b5.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/PersistentStorage/lang/b5.js
deleted file mode 100644
index cfb8054..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/PersistentStorage/lang/b5.js
+++ /dev/null
@@ -1,15 +0,0 @@
-// I18N constants
-// LANG: "b5", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "__OBSOLETE__": {
-        "___ TRANSLATOR NOTE   ___": "*** PERSISTENTSTORAGE IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***"
-    }
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/PersistentStorage/lang/ch.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/PersistentStorage/lang/ch.js
deleted file mode 100644
index 7ca0791..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/PersistentStorage/lang/ch.js
+++ /dev/null
@@ -1,16 +0,0 @@
-// I18N constants
-// LANG: "ch", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Cancel": "取消",
-    "__OBSOLETE__": {
-        "___ TRANSLATOR NOTE   ___": "*** PERSISTENTSTORAGE IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***"
-    }
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/PersistentStorage/lang/cz.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/PersistentStorage/lang/cz.js
deleted file mode 100644
index b30bcd3..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/PersistentStorage/lang/cz.js
+++ /dev/null
@@ -1,16 +0,0 @@
-// I18N constants
-// LANG: "cz", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Cancel": "Zrušit",
-    "__OBSOLETE__": {
-        "___ TRANSLATOR NOTE   ___": "*** PERSISTENTSTORAGE IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***"
-    }
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/PersistentStorage/lang/da.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/PersistentStorage/lang/da.js
deleted file mode 100644
index 4da6036..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/PersistentStorage/lang/da.js
+++ /dev/null
@@ -1,24 +0,0 @@
-// I18N constants
-// LANG: "da", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Cancel": "Annuller",
-    "Copy": "Kopier",
-    "Directory Up": "Mappe op",
-    "File Manager": "Fil Manager",
-    "Filename": "Filnavn:",
-    "Insert Image": "Indsæt billede",
-    "New Folder": "Ny mappe",
-    "Save": "Gem",
-    "You must select some text before making a new link.": "Vælg venligst noget tekst før du laver et nyt link.",
-    "__OBSOLETE__": {
-        "___ TRANSLATOR NOTE   ___": "*** PERSISTENTSTORAGE IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***"
-    }
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/PersistentStorage/lang/de.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/PersistentStorage/lang/de.js
deleted file mode 100644
index d2ba11b..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/PersistentStorage/lang/de.js
+++ /dev/null
@@ -1,25 +0,0 @@
-// I18N constants
-// LANG: "de", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Cancel": "Abbrechen",
-    "Copy": "Kopieren",
-    "Delete": "Löschen",
-    "Directory Up": "übergeordneter Ordner",
-    "File Manager": "Dateimanager",
-    "Filename": "Dateiname:",
-    "Insert Image": "Bild einfügen",
-    "New Folder": "Neuer Ordner",
-    "Save": "Speichern",
-    "You must select some text before making a new link.": "Sie müssen einen Text markieren um einen Link zu erstellen",
-    "__OBSOLETE__": {
-        "___ TRANSLATOR NOTE   ___": "*** PERSISTENTSTORAGE IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***"
-    }
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/PersistentStorage/lang/ee.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/PersistentStorage/lang/ee.js
deleted file mode 100644
index 6c7f1db..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/PersistentStorage/lang/ee.js
+++ /dev/null
@@ -1,16 +0,0 @@
-// I18N constants
-// LANG: "ee", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Cancel": "Loobu",
-    "__OBSOLETE__": {
-        "___ TRANSLATOR NOTE   ___": "*** PERSISTENTSTORAGE IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***"
-    }
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/PersistentStorage/lang/el.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/PersistentStorage/lang/el.js
deleted file mode 100644
index c510f55..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/PersistentStorage/lang/el.js
+++ /dev/null
@@ -1,17 +0,0 @@
-// I18N constants
-// LANG: "el", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Cancel": "Ακύρωση",
-    "Copy": "Αντιγραφή",
-    "__OBSOLETE__": {
-        "___ TRANSLATOR NOTE   ___": "*** PERSISTENTSTORAGE IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***"
-    }
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/PersistentStorage/lang/es.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/PersistentStorage/lang/es.js
deleted file mode 100644
index ca01a63..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/PersistentStorage/lang/es.js
+++ /dev/null
@@ -1,23 +0,0 @@
-// I18N constants
-// LANG: "es", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Cancel": "Cancelar",
-    "Copy": "Copiar",
-    "Delete": "Suprimir",
-    "Directory Up": "Directorio superior",
-    "Filename": "Nombre del fichero:",
-    "Insert Image": "insertar imagen",
-    "New Folder": "Crear directorio",
-    "Save": "Guardar",
-    "__OBSOLETE__": {
-        "___ TRANSLATOR NOTE   ___": "*** PERSISTENTSTORAGE IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***"
-    }
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/PersistentStorage/lang/eu.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/PersistentStorage/lang/eu.js
deleted file mode 100644
index 9e9156b..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/PersistentStorage/lang/eu.js
+++ /dev/null
@@ -1,17 +0,0 @@
-// I18N constants
-// LANG: "eu", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Cancel": "Utzi",
-    "Insert Image": "Irudia txertatu",
-    "__OBSOLETE__": {
-        "___ TRANSLATOR NOTE   ___": "*** PERSISTENTSTORAGE IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***"
-    }
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/PersistentStorage/lang/fa.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/PersistentStorage/lang/fa.js
deleted file mode 100644
index 40a9e28..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/PersistentStorage/lang/fa.js
+++ /dev/null
@@ -1,17 +0,0 @@
-// I18N constants
-// LANG: "fa", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Cancel": "انصراف",
-    "Insert Image": "افزودن تصویر",
-    "__OBSOLETE__": {
-        "___ TRANSLATOR NOTE   ___": "*** PERSISTENTSTORAGE IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***"
-    }
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/PersistentStorage/lang/fi.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/PersistentStorage/lang/fi.js
deleted file mode 100644
index aad2b0a..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/PersistentStorage/lang/fi.js
+++ /dev/null
@@ -1,16 +0,0 @@
-// I18N constants
-// LANG: "fi", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Cancel": "Peruuta",
-    "__OBSOLETE__": {
-        "___ TRANSLATOR NOTE   ___": "*** PERSISTENTSTORAGE IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***"
-    }
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/PersistentStorage/lang/fr.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/PersistentStorage/lang/fr.js
deleted file mode 100644
index b00c510..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/PersistentStorage/lang/fr.js
+++ /dev/null
@@ -1,25 +0,0 @@
-// I18N constants
-// LANG: "fr", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Cancel": "Annuler",
-    "Copy": "Copier",
-    "Delete": "Supprimer",
-    "Directory Up": "Remonter",
-    "File Manager": "Gestionnaire de fichiers",
-    "Filename": "Nom",
-    "Insert Image": "Insérer une image",
-    "New Folder": "Nouveau répertoire",
-    "Save": "Enregistrer",
-    "You must select some text before making a new link.": "Vous devez sélectionner un texte avant de créer un nouveau lien",
-    "__OBSOLETE__": {
-        "___ TRANSLATOR NOTE   ___": "*** PERSISTENTSTORAGE IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***"
-    }
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/PersistentStorage/lang/fr_ca.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/PersistentStorage/lang/fr_ca.js
deleted file mode 100644
index 5eba588..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/PersistentStorage/lang/fr_ca.js
+++ /dev/null
@@ -1,15 +0,0 @@
-// I18N constants
-// LANG: "fr_ca", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "__OBSOLETE__": {
-        "___ TRANSLATOR NOTE   ___": "*** PERSISTENTSTORAGE IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***"
-    }
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/PersistentStorage/lang/gb.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/PersistentStorage/lang/gb.js
deleted file mode 100644
index eb8298c..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/PersistentStorage/lang/gb.js
+++ /dev/null
@@ -1,15 +0,0 @@
-// I18N constants
-// LANG: "gb", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "__OBSOLETE__": {
-        "___ TRANSLATOR NOTE   ___": "*** PERSISTENTSTORAGE IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***"
-    }
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/PersistentStorage/lang/he.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/PersistentStorage/lang/he.js
deleted file mode 100644
index 73e9e96..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/PersistentStorage/lang/he.js
+++ /dev/null
@@ -1,17 +0,0 @@
-// I18N constants
-// LANG: "he", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Cancel": "ביטול",
-    "Copy": "העתק",
-    "__OBSOLETE__": {
-        "___ TRANSLATOR NOTE   ___": "*** PERSISTENTSTORAGE IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***"
-    }
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/PersistentStorage/lang/hu.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/PersistentStorage/lang/hu.js
deleted file mode 100644
index 7b00507..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/PersistentStorage/lang/hu.js
+++ /dev/null
@@ -1,16 +0,0 @@
-// I18N constants
-// LANG: "hu", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Cancel": "Mégsem",
-    "__OBSOLETE__": {
-        "___ TRANSLATOR NOTE   ___": "*** PERSISTENTSTORAGE IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***"
-    }
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/PersistentStorage/lang/it.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/PersistentStorage/lang/it.js
deleted file mode 100644
index d1f51af..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/PersistentStorage/lang/it.js
+++ /dev/null
@@ -1,16 +0,0 @@
-// I18N constants
-// LANG: "it", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Cancel": "Annullamento",
-    "__OBSOLETE__": {
-        "___ TRANSLATOR NOTE   ___": "*** PERSISTENTSTORAGE IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***"
-    }
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/PersistentStorage/lang/ja.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/PersistentStorage/lang/ja.js
deleted file mode 100644
index 21e9c50..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/PersistentStorage/lang/ja.js
+++ /dev/null
@@ -1,25 +0,0 @@
-// I18N constants
-// LANG: "ja", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Cancel": "中止",
-    "Copy": "コピー",
-    "Delete": "削除",
-    "Directory Up": "親ディレクトリへ",
-    "File Manager": "ファイルマネージャ",
-    "Filename": "ファイル名:",
-    "Insert Image": "画像の挿入",
-    "New Folder": "新規フォルダ",
-    "Save": "保存",
-    "You must select some text before making a new link.": "リンクを作成するにはテキストを選択する必要があります",
-    "__OBSOLETE__": {
-        "___ TRANSLATOR NOTE   ___": "*** PERSISTENTSTORAGE IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***"
-    }
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/PersistentStorage/lang/lc_base.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/PersistentStorage/lang/lc_base.js
deleted file mode 100644
index 06f40de..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/PersistentStorage/lang/lc_base.js
+++ /dev/null
@@ -1,52 +0,0 @@
-// I18N constants
-//
-// LANG: "en", ENCODING: UTF-8
-// Author: Translator-Name, <email@example.com>
-//
-// Last revision: 2018-04-12
-// 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).
-//
-// (Please, remove information below)
-// 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.)
-
-{
-    "Cancel": "",
-    "Confirm": "",
-    "Copy": "",
-    "Delete": "",
-    "Details": "",
-    "Directory Up": "",
-    "File Browser": "",
-    "File List": "",
-    "File Manager": "",
-    "Filename": "",
-    "Hello    There C ": "",
-    "Hello  There A ": "",
-    "Hello \" There B \"": "",
-    "Hello ' There D '": "",
-    "Insert": "",
-    "Insert Image": "",
-    "List of Places": "",
-    "New Document": "",
-    "New Folder": "",
-    "Open": "",
-    "Open Document": "",
-    "Places": "",
-    "Please enter the name of the directory you'd like to create.": "",
-    "Save": "",
-    "Save Document": "",
-    "This will erase any unsaved content.  If you're certain, please click OK to continue.": "",
-    "Web URL": "",
-    "You must select some text before making a new link.": ""
-}
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/PersistentStorage/lang/lt.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/PersistentStorage/lang/lt.js
deleted file mode 100644
index b66db89..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/PersistentStorage/lang/lt.js
+++ /dev/null
@@ -1,16 +0,0 @@
-// I18N constants
-// LANG: "lt", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Cancel": "Atšaukti",
-    "__OBSOLETE__": {
-        "___ TRANSLATOR NOTE   ___": "*** PERSISTENTSTORAGE IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***"
-    }
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/PersistentStorage/lang/lv.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/PersistentStorage/lang/lv.js
deleted file mode 100644
index 5739e7e..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/PersistentStorage/lang/lv.js
+++ /dev/null
@@ -1,16 +0,0 @@
-// I18N constants
-// LANG: "lv", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Cancel": "Atcelt",
-    "__OBSOLETE__": {
-        "___ TRANSLATOR NOTE   ___": "*** PERSISTENTSTORAGE IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***"
-    }
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/PersistentStorage/lang/nb.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/PersistentStorage/lang/nb.js
deleted file mode 100644
index 4f2c32d..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/PersistentStorage/lang/nb.js
+++ /dev/null
@@ -1,25 +0,0 @@
-// I18N constants
-// LANG: "nb", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Cancel": "Avbryt",
-    "Copy": "Kopier",
-    "Delete": "Fjerne",
-    "Directory Up": "Opp et nivå",
-    "File Manager": "Filbehandler",
-    "Filename": "Filnavn:",
-    "Insert Image": "Sett inn bilde",
-    "New Folder": "Ny mappe",
-    "Save": "Lagre",
-    "You must select some text before making a new link.": "Du må markere tekst eller et bilde før du kan lage en lenke.",
-    "__OBSOLETE__": {
-        "___ TRANSLATOR NOTE   ___": "*** PERSISTENTSTORAGE IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***"
-    }
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/PersistentStorage/lang/nl.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/PersistentStorage/lang/nl.js
deleted file mode 100644
index dc5be23..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/PersistentStorage/lang/nl.js
+++ /dev/null
@@ -1,25 +0,0 @@
-// I18N constants
-// LANG: "nl", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Cancel": "Annuleren",
-    "Copy": "Kopiëren",
-    "Delete": "Verwijderen",
-    "Directory Up": "Bovenliggende map",
-    "File Manager": "Bestandsbeheer",
-    "Filename": "Bestandsnaam:",
-    "Insert Image": "Afbeelding invoegen",
-    "New Folder": "Nieuw map",
-    "Save": "Opslaan",
-    "You must select some text before making a new link.": "Selecteer de tekst welke gelinkt moet worden.",
-    "__OBSOLETE__": {
-        "___ TRANSLATOR NOTE   ___": "*** PERSISTENTSTORAGE IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***"
-    }
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/PersistentStorage/lang/pl.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/PersistentStorage/lang/pl.js
deleted file mode 100644
index 4f0c6c9..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/PersistentStorage/lang/pl.js
+++ /dev/null
@@ -1,25 +0,0 @@
-// I18N constants
-// LANG: "pl", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Cancel": "Anuluj",
-    "Copy": "Kopiuj",
-    "Delete": "Usuń",
-    "Directory Up": "Katalog wyżej",
-    "File Manager": "Menedżer plików",
-    "Filename": "Nazwa pliku:",
-    "Insert Image": "Wstaw obrazek",
-    "New Folder": "Nowy katalog",
-    "Save": "Zapisz",
-    "You must select some text before making a new link.": "Zaznacz tekst przed dodaniem odnośnika.",
-    "__OBSOLETE__": {
-        "___ TRANSLATOR NOTE   ___": "*** PERSISTENTSTORAGE IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***"
-    }
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/PersistentStorage/lang/pt_br.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/PersistentStorage/lang/pt_br.js
deleted file mode 100644
index 3f0d6d2..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/PersistentStorage/lang/pt_br.js
+++ /dev/null
@@ -1,27 +0,0 @@
-// I18N constants
-// LANG: "pt_br", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Cancel": "Cancelar",
-    "Copy": "Copiar",
-    "Delete": "Deletar",
-    "Directory Up": "Diretório Acima",
-    "File List": "Lista de Arquivos",
-    "File Manager": "Gerenciador de Arquivos",
-    "Filename": "Nome do arquivo:",
-    "Insert": "Inserir",
-    "Insert Image": "Inserir Imagem",
-    "New Folder": "Nova Pasta",
-    "Save": "Salvar",
-    "You must select some text before making a new link.": "Você precisa selecionar algum texto antes de criar um novo link.",
-    "__OBSOLETE__": {
-        "___ TRANSLATOR NOTE   ___": "*** PERSISTENTSTORAGE IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***"
-    }
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/PersistentStorage/lang/ro.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/PersistentStorage/lang/ro.js
deleted file mode 100644
index 43e2910..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/PersistentStorage/lang/ro.js
+++ /dev/null
@@ -1,16 +0,0 @@
-// I18N constants
-// LANG: "ro", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Cancel": "Renunţă",
-    "__OBSOLETE__": {
-        "___ TRANSLATOR NOTE   ___": "*** PERSISTENTSTORAGE IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***"
-    }
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/PersistentStorage/lang/ru.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/PersistentStorage/lang/ru.js
deleted file mode 100644
index 2894700..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/PersistentStorage/lang/ru.js
+++ /dev/null
@@ -1,21 +0,0 @@
-// I18N constants
-// LANG: "ru", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Cancel": "Отмена",
-    "Directory Up": "Папка наверх",
-    "Filename": "Имя файла",
-    "Insert Image": "Вставка картинки",
-    "New Folder": "Новая папка",
-    "Save": "Сохранить",
-    "__OBSOLETE__": {
-        "___ TRANSLATOR NOTE   ___": "*** PERSISTENTSTORAGE IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***"
-    }
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/PersistentStorage/lang/sh.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/PersistentStorage/lang/sh.js
deleted file mode 100644
index 9953753..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/PersistentStorage/lang/sh.js
+++ /dev/null
@@ -1,17 +0,0 @@
-// I18N constants
-// LANG: "sh", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Cancel": "Poništi",
-    "Insert Image": "Ubaci sliku",
-    "__OBSOLETE__": {
-        "___ TRANSLATOR NOTE   ___": "*** PERSISTENTSTORAGE IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***"
-    }
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/PersistentStorage/lang/si.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/PersistentStorage/lang/si.js
deleted file mode 100644
index 67ecf28..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/PersistentStorage/lang/si.js
+++ /dev/null
@@ -1,16 +0,0 @@
-// I18N constants
-// LANG: "si", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Cancel": "Prekliči",
-    "__OBSOLETE__": {
-        "___ TRANSLATOR NOTE   ___": "*** PERSISTENTSTORAGE IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***"
-    }
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/PersistentStorage/lang/sr.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/PersistentStorage/lang/sr.js
deleted file mode 100644
index ca587a4..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/PersistentStorage/lang/sr.js
+++ /dev/null
@@ -1,17 +0,0 @@
-// I18N constants
-// LANG: "sr", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Cancel": "Поништи",
-    "Insert Image": "Убаци слику",
-    "__OBSOLETE__": {
-        "___ TRANSLATOR NOTE   ___": "*** PERSISTENTSTORAGE IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***"
-    }
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/PersistentStorage/lang/sv.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/PersistentStorage/lang/sv.js
deleted file mode 100644
index 2ce7218..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/PersistentStorage/lang/sv.js
+++ /dev/null
@@ -1,18 +0,0 @@
-// I18N constants
-// LANG: "sv", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Cancel": "Avbryt",
-    "Copy": "Kopiera",
-    "Insert Image": "Infoga bild",
-    "__OBSOLETE__": {
-        "___ TRANSLATOR NOTE   ___": "*** PERSISTENTSTORAGE IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***"
-    }
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/PersistentStorage/lang/th.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/PersistentStorage/lang/th.js
deleted file mode 100644
index fd7142a..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/PersistentStorage/lang/th.js
+++ /dev/null
@@ -1,16 +0,0 @@
-// I18N constants
-// LANG: "th", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Cancel": "ยกเลิก",
-    "__OBSOLETE__": {
-        "___ TRANSLATOR NOTE   ___": "*** PERSISTENTSTORAGE IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***"
-    }
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/PersistentStorage/lang/tr.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/PersistentStorage/lang/tr.js
deleted file mode 100644
index 015316f..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/PersistentStorage/lang/tr.js
+++ /dev/null
@@ -1,18 +0,0 @@
-// I18N constants
-// LANG: "tr", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Cancel": "İptal",
-    "Delete": "Sil",
-    "Insert Image": "Resim ekle",
-    "__OBSOLETE__": {
-        "___ TRANSLATOR NOTE   ___": "*** PERSISTENTSTORAGE IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***"
-    }
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/PersistentStorage/lang/vn.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/PersistentStorage/lang/vn.js
deleted file mode 100644
index baf3c43..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/PersistentStorage/lang/vn.js
+++ /dev/null
@@ -1,16 +0,0 @@
-// I18N constants
-// LANG: "vn", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Cancel": "Hủy",
-    "__OBSOLETE__": {
-        "___ TRANSLATOR NOTE   ___": "*** PERSISTENTSTORAGE IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***"
-    }
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/PersistentStorage/lang/zh_cn.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/PersistentStorage/lang/zh_cn.js
deleted file mode 100644
index a27eb16..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/PersistentStorage/lang/zh_cn.js
+++ /dev/null
@@ -1,15 +0,0 @@
-// I18N constants
-// LANG: "zh_cn", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "__OBSOLETE__": {
-        "___ TRANSLATOR NOTE   ___": "*** PERSISTENTSTORAGE IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***"
-    }
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/SpellChecker/README b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/SpellChecker/README
deleted file mode 100644
index 9b5a2c8..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/SpellChecker/README
+++ /dev/null
@@ -1,8 +0,0 @@
-ExecCGI Note:
-If you intend to use the perl (.cgi) backend then you will need to have the ExecCGI option enabled for this directory (if you are using Apache), you may be able to do this by adding a file called .htaccess in this directory, with the below contents.
-
-## EXAMPLE .htaccess
-Options +ExecCGI
-####################
-
-It is however recommended that you use the PHP backend where possible.
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/SpellChecker/SpellChecker.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/SpellChecker/SpellChecker.js
deleted file mode 100644
index f3f33c0..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/SpellChecker/SpellChecker.js
+++ /dev/null
@@ -1,73 +0,0 @@
-// Spell Checker Plugin for HTMLArea-3.0
-// Sponsored by www.americanbible.org
-// Implementation by Mihai Bazon, http://dynarch.com/mishoo/
-//
-// (c) dynarch.com 2003.
-// Distributed under the same terms as HTMLArea itself.
-// This notice MUST stay intact for use (see license.txt).
-//
-// $Id:spell-checker.js 856M 2007-06-13 18:34:34Z (local) $
-
-Xinha.Config.prototype.SpellChecker = { 'backend': 'php', 'personalFilesDir' : '', 'defaultDictionary' : 'en_GB', 'utf8_to_entities' : true };
-
-function SpellChecker(editor) {
-  this.editor = editor;
-
-  var cfg = editor.config;
-  var bl = SpellChecker.btnList;
-  var self = this;
-
-  // see if we can find the mode switch button, insert this before that
-  var id = "SC-spell-check";
-  cfg.registerButton(id, this._lc("Spell-check"), editor.imgURL("spell-check.gif", "SpellChecker"), false,
-             function(editor, id) {
-               // dispatch button press event
-               self.buttonPress(editor, id);
-             });
-
-  cfg.addToolbarElement("SC-spell-check", "htmlmode", 1);
-}
-
-SpellChecker._pluginInfo = {
-  name          : "SpellChecker",
-  version       : "1.0",
-  developer     : "Mihai Bazon",
-  developer_url : "http://dynarch.com/mishoo/",
-  c_owner       : "Mihai Bazon",
-  sponsor       : "American Bible Society",
-  sponsor_url   : "http://www.americanbible.org",
-  license       : "htmlArea"
-};
-
-SpellChecker.prototype._lc = function(string) {
-    return Xinha._lc(string, 'SpellChecker');
-};
-
-SpellChecker.btnList = [
-  null, // separator
-  ["spell-check"]
-  ];
-
-SpellChecker.prototype.buttonPress = function(editor, id) {
-  switch (id) {
-      case "SC-spell-check":
-    SpellChecker.editor = editor;
-    SpellChecker.init = true;
-    var uiurl = Xinha.getPluginDir("SpellChecker") + "/spell-check-ui.html";
-    var win;
-    if (Xinha.is_ie) {
-      win = window.open(uiurl, "SC_spell_checker",
-            "toolbar=no,location=no,directories=no,status=no,menubar=no," +
-            "scrollbars=no,resizable=yes,width=600,height=450");
-    } else {
-      win = window.open(uiurl, "SC_spell_checker",
-            "toolbar=no,menubar=no,personalbar=no,width=600,height=450," +
-            "scrollbars=no,resizable=yes");
-    }
-    win.focus();
-    break;
-  }
-};
-
-// this needs to be global, it's accessed from spell-check-ui.html
-SpellChecker.editor = null;
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/SpellChecker/aspell_setup.php b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/SpellChecker/aspell_setup.php
deleted file mode 100644
index c13a5af..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/SpellChecker/aspell_setup.php
+++ /dev/null
@@ -1,123 +0,0 @@
-<?php
-// REVISION HISTORY:
-//
-// 2005-08-17 YmL:
-//	.	security fix on unchecked variables. Original author missed quite a few
-//		holes.
-
-  umask(000);
-  $temptext = tempnam('/tmp', 'spell_');
-  if ((!isset($_POST['dictionary'])) || (strlen(trim($_POST['dictionary'])) < 1))
-  {
-      $lang = 'en_GB';
-  }
-  else
-  {
-      $lang = $_POST['dictionary'];
-  }  
-  $lang = preg_replace('/[^a-z0-9_]/i', '', $lang);
-  
-  $aspell      = 'aspell';
-  $aspell_args = '-a --lang=' . $lang;
-
-  if(DIRECTORY_SEPARATOR == '\\') //windows
-  {
-    $aspell         = 'C:\Progra~1\Aspell\bin\aspell.exe';
-  }
-  else //linux
-  {
-    // See if there is a local install of aspell here
-    if(file_exists(dirname(__FILE__) . '/aspell/bin/aspell'))
-    {
-      putenv('PATH=' . dirname(__FILE__) . '/aspell/bin:' . getenv('PATH'));
-      putenv('LD_LIBRARY_PATH=' . dirname(__FILE__) . '/aspell/lib:' . getenv('LD_LIBRARY_PATH'));
-      $dicfil = dirname(__FILE__) .'/aspell/lib/' . preg_replace('/^.*\/lib\/(aspell\S*)\n.*/s', '$1', `aspell config dict-dir`);
-      $aspell_args .= ' --dict-dir=' . $dicfil . ' --add-filter-path=' . $dicfil ;
-    }
-  }
-
-
-  // Old aspell doesn't know about encoding, which means that unicode will be broke, but
-  // we should at least let it try.
-  preg_match('/really aspell ([0-9]+)\.([0-9]+)(?:\.([0-9]+))?/i', `$aspell version`, $aVer);
-
-  $aVer = array('major' => (int)$aVer[1], 'minor' => (int)$aVer[2], 'release' => (int)@$aVer[3]);
-  if($aVer['major'] >= 0 && $aVer['minor'] >= 60)
-  {
-    $aspell_args   .= ' -H --encoding=utf-8';
-  }
-  elseif(preg_match('/--encoding/', shell_exec('aspell 2>&1')))
-  {
-    $aspell_args   .= ' --mode=none --add-filter=sgml --encoding=utf-8';
-  }
-  else
-  {
-    $aspell_args   .= ' --mode=none --add-filter=sgml';
-  }
-
-  // Personal dictionaries
-  $p_dicts_path = dirname(__FILE__) . DIRECTORY_SEPARATOR . 'personal_dicts';
-
-  if(isset($_REQUEST['p_dicts_path']) && file_exists($_REQUEST['p_dicts_path']) && is_writable($_REQUEST['p_dicts_path']))
-  {
-    if(!isset($_REQUEST['p_dicts_name']))
-    {
-      if(isset($_COOKIE['SpellChecker_p_dicts_name']))
-      {
-        $_REQUEST['p_dicts_name'] = $_COOKIE['SpellChecker_p_dicts_name'];
-      }
-      else
-      {
-        $_REQUEST['p_dicts_name'] = uniqid('dict');
-        setcookie('SpellChecker_p_dicts_name', $_REQUEST['p_dicts_name'], time() + 60*60*24*365*10);
-      }
-    }    
-    $p_dict_path = $_REQUEST['p_dicts_path'] . DIRECTORY_SEPARATOR . preg_replace('/[^a-z0-9_]/i', '', $_REQUEST['p_dicts_name']);
-
-    if(!file_exists($p_dict_path))
-    {
-	 	// since there is a single directory for all users this could end up containing
-		// quite a few subdirectories. To prevent a DOS situation we'll limit the 
-		// total directories created to 2000 (arbitrary). Adjust to suit your installation.
-
-		$count = 0;
-
-		if( $dir = @opendir( $p_dicts_path ) )
-			{
-
-			while( FALSE !== ($file = readdir($dir)) )
-				{
-				$count++;
-				}
-			}
-
-		// TODO: make this a config value.
-
-		if ( $count > 2000 )
-			{
-
-			// either very heavy use or a DOS attempt
-
-			die();
-
-			}
-
-      mkdir($p_dict_path);
-      chmod($p_dict_path, 02770);
-    }
-
-    if(file_exists($p_dict_path) && is_writable($p_dict_path))
-    {
-      // Good To Go!
-      $aspell_args .= ' --home-dir=' . $p_dict_path ;
-    }
-  }
-
-// as an additional precaution check the aspell_args for illegal 
-// characters
-  $aspell_args = preg_replace( "/[|><;\$]+/", '', $aspell_args );
-  $aspelldictionaries = "$aspell dump dicts";
-  $aspellcommand      = "$aspell $aspell_args < $temptext";
-
-
-?>
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/SpellChecker/img/he-spell-check.gif b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/SpellChecker/img/he-spell-check.gif
deleted file mode 100644
index 8015d2f..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/SpellChecker/img/he-spell-check.gif
+++ /dev/null
Binary files differ
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/SpellChecker/img/spell-check.gif b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/SpellChecker/img/spell-check.gif
deleted file mode 100644
index fce009a..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/SpellChecker/img/spell-check.gif
+++ /dev/null
Binary files differ
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/SpellChecker/lang/b5.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/SpellChecker/lang/b5.js
deleted file mode 100644
index ab763f7..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/SpellChecker/lang/b5.js
+++ /dev/null
@@ -1,15 +0,0 @@
-// I18N constants
-// LANG: "b5", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "__OBSOLETE__": {
-        "___ TRANSLATOR NOTE   ___": "*** SPELLCHECKER IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***"
-    }
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/SpellChecker/lang/ch.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/SpellChecker/lang/ch.js
deleted file mode 100644
index e3043da..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/SpellChecker/lang/ch.js
+++ /dev/null
@@ -1,17 +0,0 @@
-// I18N constants
-// LANG: "ch", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Cancel": "取消",
-    "OK": "好",
-    "__OBSOLETE__": {
-        "___ TRANSLATOR NOTE   ___": "*** SPELLCHECKER IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***"
-    }
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/SpellChecker/lang/cz.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/SpellChecker/lang/cz.js
deleted file mode 100644
index e79ad25..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/SpellChecker/lang/cz.js
+++ /dev/null
@@ -1,35 +0,0 @@
-// I18N constants
-// LANG: "cz", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Cancel": "Zrušit",
-    "Dictionary": "Slovník",
-    "Finished list of mispelled words": "Dokončen seznam chybných slov",
-    "I will open it in a new page.": "Bude otevřen jej v nové stránce.",
-    "Ignore": "Ignorovat",
-    "Ignore all": "Ignorovat vše",
-    "No mispelled words found with the selected dictionary.": "Podle zvoleného slovníku nebyla nalezena žádná chybná slova.",
-    "OK": "OK",
-    "Original word": "Původní slovo",
-    "Please confirm that you want to open this link": "Prosím potvrďte otevření tohoto odkazu",
-    "Please wait.  Calling spell checker.": "Prosím čekejte. Komunikuace s kontrolou správnosti slov.",
-    "Please wait: changing dictionary to": "Prosím čekejte: změna adresáře na",
-    "Re-check": "Překontrolovat",
-    "Replace": "Zaměnit",
-    "Replace all": "Zaměnit všechno",
-    "Replace with": "Zaměnit za",
-    "Spell-check": "Kontrola správnosti slov",
-    "Suggestions": "Doporučení",
-    "This will drop changes and quit spell checker.  Please confirm.": "Změny budou zrušeny a kontrola správnosti slov ukončena. Prosím potvrďte.",
-    "__OBSOLETE__": {
-        "One moment...": "strpení prosím ;-)",
-        "Spell check complete, didn't find any mispelled words.  Closing now...": "Kontrola správnosti slov dokončena, nebyla nalezena žádná chybná slova. Ukončování ..."
-    }
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/SpellChecker/lang/da.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/SpellChecker/lang/da.js
deleted file mode 100644
index a80419b..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/SpellChecker/lang/da.js
+++ /dev/null
@@ -1,35 +0,0 @@
-// I18N constants
-// LANG: "da", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Cancel": "Ann uler",
-    "Dictionary": "Ordbog",
-    "Finished list of mispelled words": "Listen med stavefejl er gennemgået",
-    "I will open it in a new page.": "Jeg vil åbne det i en ny side.",
-    "Ignore": "Ignorer",
-    "Ignore all": "Ignorer alle",
-    "No mispelled words found with the selected dictionary.": "Der blev ikke fundet nogle stavefejl med den valgte ordbog.",
-    "OK": "OK",
-    "Original word": "Oprindeligt ord",
-    "Please confirm that you want to open this link": "Vil du følge dette link?",
-    "Please wait.  Calling spell checker.": "Vent venligst.  Henter stavekontrol.",
-    "Please wait: changing dictionary to": "Vent venligst: skifter ordbog til",
-    "Re-check": "Tjek igen",
-    "Replace": "Erstat",
-    "Replace all": "Erstat alle",
-    "Replace with": "Erstat med",
-    "Spell-check": "Stavekontrol",
-    "Suggestions": "Forslag",
-    "This will drop changes and quit spell checker.  Please confirm.": "Alle dine ændringer vil gå tabt, vil du fortsætte?",
-    "__OBSOLETE__": {
-        "One moment...": "Vent venligst",
-        "Spell check complete, didn't find any mispelled words.  Closing now...": "Stavekontrollen er gennemført, der blev ikke fundet nogle stavefejl.  Lukker..."
-    }
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/SpellChecker/lang/de.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/SpellChecker/lang/de.js
deleted file mode 100644
index febf66e..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/SpellChecker/lang/de.js
+++ /dev/null
@@ -1,35 +0,0 @@
-// I18N constants
-// LANG: "de", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Cancel": "Abbrechen",
-    "Dictionary": "Woerterbuch",
-    "Finished list of mispelled words": "Liste der nicht bekannten Woerter",
-    "I will open it in a new page.": "Wird auf neuer Seite geoeffnet",
-    "Ignore": "Ignorieren",
-    "Ignore all": "Alle ignorieren",
-    "No mispelled words found with the selected dictionary.": "Keine falschen Woerter mit gewaehlten Woerterbuch gefunden",
-    "OK": "OK",
-    "Original word": "Original Wort",
-    "Please confirm that you want to open this link": "Wollen Sie diesen Link oeffnen",
-    "Please wait.  Calling spell checker.": "Bitte warten.  Woerterbuch wird durchsucht.",
-    "Please wait: changing dictionary to": "Bitte warten: Woerterbuch wechseln zu",
-    "Re-check": "Neuueberpruefung",
-    "Replace": "Ersetzen",
-    "Replace all": "Alle ersetzen",
-    "Replace with": "Ersetzen mit",
-    "Spell-check": "Ueberpruefung",
-    "Suggestions": "Vorschlag",
-    "This will drop changes and quit spell checker.  Please confirm.": "Aenderungen werden nicht uebernommen.  Bitte bestaettigen.",
-    "__OBSOLETE__": {
-        "One moment...": "Bitte warten...",
-        "Spell check complete, didn't find any mispelled words.  Closing now...": "Rechtsschreibpruefung wurde ohne Fehler fertiggestellt.  Wird nun geschlossen..."
-    }
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/SpellChecker/lang/ee.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/SpellChecker/lang/ee.js
deleted file mode 100644
index 926c748..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/SpellChecker/lang/ee.js
+++ /dev/null
@@ -1,17 +0,0 @@
-// I18N constants
-// LANG: "ee", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Cancel": "Loobu",
-    "OK": "OK",
-    "__OBSOLETE__": {
-        "___ TRANSLATOR NOTE   ___": "*** SPELLCHECKER IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***"
-    }
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/SpellChecker/lang/el.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/SpellChecker/lang/el.js
deleted file mode 100644
index 9a05a3e..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/SpellChecker/lang/el.js
+++ /dev/null
@@ -1,17 +0,0 @@
-// I18N constants
-// LANG: "el", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Cancel": "Ακύρωση",
-    "OK": "Εντάξει",
-    "__OBSOLETE__": {
-        "___ TRANSLATOR NOTE   ___": "*** SPELLCHECKER IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***"
-    }
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/SpellChecker/lang/es.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/SpellChecker/lang/es.js
deleted file mode 100644
index b83ead7..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/SpellChecker/lang/es.js
+++ /dev/null
@@ -1,17 +0,0 @@
-// I18N constants
-// LANG: "es", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Cancel": "Cancelar",
-    "OK": "Aceptar",
-    "__OBSOLETE__": {
-        "___ TRANSLATOR NOTE   ___": "*** SPELLCHECKER IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***"
-    }
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/SpellChecker/lang/eu.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/SpellChecker/lang/eu.js
deleted file mode 100644
index 8cb216c..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/SpellChecker/lang/eu.js
+++ /dev/null
@@ -1,17 +0,0 @@
-// I18N constants
-// LANG: "eu", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Cancel": "Utzi",
-    "OK": "Ados",
-    "__OBSOLETE__": {
-        "___ TRANSLATOR NOTE   ___": "*** SPELLCHECKER IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***"
-    }
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/SpellChecker/lang/fa.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/SpellChecker/lang/fa.js
deleted file mode 100644
index 8f7d577..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/SpellChecker/lang/fa.js
+++ /dev/null
@@ -1,17 +0,0 @@
-// I18N constants
-// LANG: "fa", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Cancel": "انصراف",
-    "OK": "بله",
-    "__OBSOLETE__": {
-        "___ TRANSLATOR NOTE   ___": "*** SPELLCHECKER IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***"
-    }
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/SpellChecker/lang/fi.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/SpellChecker/lang/fi.js
deleted file mode 100644
index 1978fa9..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/SpellChecker/lang/fi.js
+++ /dev/null
@@ -1,17 +0,0 @@
-// I18N constants
-// LANG: "fi", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Cancel": "Peruuta",
-    "OK": "Hyväksy",
-    "__OBSOLETE__": {
-        "___ TRANSLATOR NOTE   ___": "*** SPELLCHECKER IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***"
-    }
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/SpellChecker/lang/fr.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/SpellChecker/lang/fr.js
deleted file mode 100644
index f17da3f..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/SpellChecker/lang/fr.js
+++ /dev/null
@@ -1,36 +0,0 @@
-// I18N constants
-// LANG: "fr", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Cancel": "Annuler",
-    "Dictionary": "Dictionnaire",
-    "Finished list of mispelled words": "Liste des mots mal orthographiés",
-    "I will open it in a new page.": "Ouverture dans une nouvelle fenêtre",
-    "Ignore": "Ignorer",
-    "Ignore all": "Tout ignorer",
-    "No mispelled words found with the selected dictionary.": "Aucune erreur orthographique avec le dictionnaire sélectionné.",
-    "OK": "OK",
-    "Original word": "Mot original",
-    "Please confirm that you want to open this link": "Veuillez confirmer l'ouverture de ce lien",
-    "Please wait.  Calling spell checker.": "Veuillez patienter.  Appel du correcteur.",
-    "Please wait: changing dictionary to": "Veuillez patienter. Changement du dictionnaire vers",
-    "Re-check": "Vérifier encore",
-    "Replace": "Remplacer",
-    "Replace all": "Tout remplacer",
-    "Replace with": "Remplacer par",
-    "Revert": "Annuler",
-    "Spell-check": "Correction",
-    "Suggestions": "Suggestions",
-    "This will drop changes and quit spell checker.  Please confirm.": "Ceci fermera la fenêtre et annulera les modifications. Veuillez confirmer.",
-    "__OBSOLETE__": {
-        "One moment...": "Veuillez patienter",
-        "Spell check complete, didn't find any mispelled words.  Closing now...": "Vérification terminée, aucune erreur orthographique détectée.  Fermeture en cours..."
-    }
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/SpellChecker/lang/fr_ca.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/SpellChecker/lang/fr_ca.js
deleted file mode 100644
index 2cbe6bc..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/SpellChecker/lang/fr_ca.js
+++ /dev/null
@@ -1,15 +0,0 @@
-// I18N constants
-// LANG: "fr_ca", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "__OBSOLETE__": {
-        "___ TRANSLATOR NOTE   ___": "*** SPELLCHECKER IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***"
-    }
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/SpellChecker/lang/gb.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/SpellChecker/lang/gb.js
deleted file mode 100644
index f73dc94..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/SpellChecker/lang/gb.js
+++ /dev/null
@@ -1,15 +0,0 @@
-// I18N constants
-// LANG: "gb", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "__OBSOLETE__": {
-        "___ TRANSLATOR NOTE   ___": "*** SPELLCHECKER IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***"
-    }
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/SpellChecker/lang/he.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/SpellChecker/lang/he.js
deleted file mode 100644
index 47b99bd..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/SpellChecker/lang/he.js
+++ /dev/null
@@ -1,36 +0,0 @@
-// I18N constants
-// LANG: "he", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Cancel": "ביטול",
-    "Dictionary": "מילון",
-    "Finished list of mispelled words": "הסתיימה רשימת המילים המאויתות באופן שגוי",
-    "I will open it in a new page.": "אני אפתח את זה בחלון חדש.",
-    "Ignore": "התעלם",
-    "Ignore all": "התעלם מהכל",
-    "No mispelled words found with the selected dictionary.": "לא נמצאו מילים מאויתות באופן שגוי עם המילון הנבחר.",
-    "OK": "אישור",
-    "Original word": "המילה המקורית",
-    "Please confirm that you want to open this link": "אנא אשר שברצונך לפתוח קישור זה",
-    "Please wait.  Calling spell checker.": "אנא המתן.  קורא לבודק איות.",
-    "Please wait: changing dictionary to": "אנא המתן: מחליף מילון ל-",
-    "Re-check": "בדוק מחדש",
-    "Replace": "החלף",
-    "Replace all": "החלף הכל",
-    "Replace with": "החלף ב-",
-    "Revert": "החזר שינויים",
-    "Spell-check": "בדיקת איות",
-    "Suggestions": "הצעות",
-    "This will drop changes and quit spell checker.  Please confirm.": "זה יבטל את השינויים ויצא מבודק האיות.  אנא אשר.",
-    "__OBSOLETE__": {
-        "One moment...": "ענא המטן ;-)",
-        "Spell check complete, didn't find any mispelled words.  Closing now...": "בדיקת האיות נסתיימה, לא נמצאו מילים מאויתות באופן שגוי.  נסגר כעת..."
-    }
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/SpellChecker/lang/hu.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/SpellChecker/lang/hu.js
deleted file mode 100644
index f6f6a00..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/SpellChecker/lang/hu.js
+++ /dev/null
@@ -1,35 +0,0 @@
-// I18N constants
-// LANG: "hu", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Cancel": "Mégsem",
-    "Dictionary": "Szótár",
-    "Finished list of mispelled words": "A tévesztett szavak listájának vége",
-    "I will open it in a new page.": "Megnyitás új lapon",
-    "Ignore": "Elvetés",
-    "Ignore all": "Minden elvetése",
-    "No mispelled words found with the selected dictionary.": "A választott szótár szerint nincs tévesztett szó.",
-    "OK": "Rendben",
-    "Original word": "Eredeti szó",
-    "Please confirm that you want to open this link": "Megerősítés",
-    "Please wait.  Calling spell checker.": "Kis türelmet, a helyesírásellenőrző hívása folyamatban.",
-    "Please wait: changing dictionary to": "Kis türelmet, szótár cseréje",
-    "Re-check": "Újraellenőrzés",
-    "Replace": "Csere",
-    "Replace all": "Mind cseréje",
-    "Replace with": "Csere a következőre:",
-    "Spell-check": "Helyesírásellenőrzés",
-    "Suggestions": "Tippek",
-    "This will drop changes and quit spell checker.  Please confirm.": "Kilépés a változások eldobásával. Jóváhagyja?",
-    "__OBSOLETE__": {
-        "One moment...": "Kis türelmet ;-)",
-        "Spell check complete, didn't find any mispelled words.  Closing now...": "A helyesírásellenőrzés kész, tévesztett szó nem fordult elő. Bezárás..."
-    }
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/SpellChecker/lang/it.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/SpellChecker/lang/it.js
deleted file mode 100644
index c68f5a0..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/SpellChecker/lang/it.js
+++ /dev/null
@@ -1,17 +0,0 @@
-// I18N constants
-// LANG: "it", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Cancel": "Annullamento",
-    "OK": "OK",
-    "__OBSOLETE__": {
-        "___ TRANSLATOR NOTE   ___": "*** SPELLCHECKER IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***"
-    }
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/SpellChecker/lang/ja.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/SpellChecker/lang/ja.js
deleted file mode 100644
index d1f69ba..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/SpellChecker/lang/ja.js
+++ /dev/null
@@ -1,38 +0,0 @@
-// I18N constants
-// LANG: "ja", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Cancel": "中止",
-    "Dictionary": "辞書",
-    "Finished list of mispelled words": "つづり間違単語の一覧",
-    "I will open it in a new page.": "新しいページで開きます。",
-    "Ignore": "無視",
-    "Ignore all": "すべて無視",
-    "Info": "情報",
-    "Learn": "学習",
-    "No mispelled words found with the selected dictionary.": "選択された辞書にはつづり間違い単語がありません。",
-    "OK": "OK",
-    "Original word": "元の単語",
-    "Please confirm that you want to open this link": "本当にこのリンクを開きますか",
-    "Please wait.  Calling spell checker.": "しばらくお待ちください。スペルチェッカーを呼び出しています。",
-    "Please wait: changing dictionary to": "しばらくお待ちください: 辞書を切り替えています",
-    "Re-check": "再チェック",
-    "Replace": "置換",
-    "Replace all": "すべて置換",
-    "Replace with": "これに置換",
-    "Revert": "戻す",
-    "Spell-check": "スペルチェック",
-    "Suggestions": "候補",
-    "This will drop changes and quit spell checker.  Please confirm.": "変更を破棄してスペルチェッカーを終了します。よろしいいですか。",
-    "__OBSOLETE__": {
-        "One moment...": "あともう少し...",
-        "Spell check complete, didn't find any mispelled words.  Closing now...": "スペルチェックが完了しましたが、つづり間違い単語はありませんでした。すぐに閉じます..."
-    }
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/SpellChecker/lang/lc_base.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/SpellChecker/lang/lc_base.js
deleted file mode 100644
index dfc809a..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/SpellChecker/lang/lc_base.js
+++ /dev/null
@@ -1,49 +0,0 @@
-// I18N constants
-//
-// LANG: "en", ENCODING: UTF-8
-// Author: Translator-Name, <email@example.com>
-//
-// Last revision: 2018-04-12
-// 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).
-//
-// (Please, remove information below)
-// 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.)
-
-{
-    "Cancel": "",
-    "Dictionary": "",
-    "Finished list of mispelled words": "",
-    "HTMLArea Spell Checker": "",
-    "I will open it in a new page.": "",
-    "Ignore": "",
-    "Ignore all": "",
-    "Info": "",
-    "Learn": "",
-    "No mispelled words found with the selected dictionary.": "",
-    "OK": "",
-    "Original word": "",
-    "Please confirm that you want to open this link": "",
-    "Please wait.  Calling spell checker.": "",
-    "Please wait: changing dictionary to": "",
-    "Re-check": "",
-    "Replace": "",
-    "Replace all": "",
-    "Replace with": "",
-    "Revert": "",
-    "Spell Checker": "",
-    "Spell-check": "",
-    "Suggestions": "",
-    "This will drop changes and quit spell checker.  Please confirm.": "",
-    "pliz weit ;-)": ""
-}
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/SpellChecker/lang/lt.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/SpellChecker/lang/lt.js
deleted file mode 100644
index 854773d..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/SpellChecker/lang/lt.js
+++ /dev/null
@@ -1,17 +0,0 @@
-// I18N constants
-// LANG: "lt", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Cancel": "Atšaukti",
-    "OK": "OK",
-    "__OBSOLETE__": {
-        "___ TRANSLATOR NOTE   ___": "*** SPELLCHECKER IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***"
-    }
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/SpellChecker/lang/lv.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/SpellChecker/lang/lv.js
deleted file mode 100644
index cd0f5f5..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/SpellChecker/lang/lv.js
+++ /dev/null
@@ -1,17 +0,0 @@
-// I18N constants
-// LANG: "lv", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Cancel": "Atcelt",
-    "OK": "Labi",
-    "__OBSOLETE__": {
-        "___ TRANSLATOR NOTE   ___": "*** SPELLCHECKER IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***"
-    }
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/SpellChecker/lang/nb.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/SpellChecker/lang/nb.js
deleted file mode 100644
index 53c1f46..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/SpellChecker/lang/nb.js
+++ /dev/null
@@ -1,35 +0,0 @@
-// I18N constants
-// LANG: "nb", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Cancel": "Avbryt",
-    "Dictionary": "Ordliste",
-    "Finished list of mispelled words": "Ferdig med liste over feilstavede ord",
-    "I will open it in a new page.": "Åpnes i ny side",
-    "Ignore": "Ignorer",
-    "Ignore all": "Ignorer alle",
-    "No mispelled words found with the selected dictionary.": "Ingen feilstavede ord funnet med den valgte ordlisten",
-    "OK": "OK",
-    "Original word": "Opprinnelig ord",
-    "Please confirm that you want to open this link": "Ønsker du å åpne denne lenken",
-    "Please wait.  Calling spell checker.": "Vennligst vent, kaller opp stavekontrollprogrammet",
-    "Please wait: changing dictionary to": "Vennligst vent, endrer ordliste til",
-    "Re-check": "Kjør stavekontroll på nytt",
-    "Replace": "Erstatt",
-    "Replace all": "Erstatt alle",
-    "Replace with": "Erstatt med",
-    "Spell-check": "Stavekontroll",
-    "Suggestions": "Forslag",
-    "This will drop changes and quit spell checker.  Please confirm.": "Dette vil droppe endringene og avbryte stavekontrollen, vennligst bekreft.",
-    "__OBSOLETE__": {
-        "One moment...": "Et øyeblikk...",
-        "Spell check complete, didn't find any mispelled words.  Closing now...": "Stavekontroll fullført, ingen feilstavede ord ble funnet, stavekontroll avsluttes."
-    }
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/SpellChecker/lang/nl.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/SpellChecker/lang/nl.js
deleted file mode 100644
index 918a4ae..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/SpellChecker/lang/nl.js
+++ /dev/null
@@ -1,36 +0,0 @@
-// I18N constants
-// LANG: "nl", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Cancel": "Annuleer",
-    "Dictionary": "Woordenboek",
-    "Finished list of mispelled words": "klaar met de lijst van fouten woorden",
-    "I will open it in a new page.": "Ik zal het in een nieuwe pagina openen.",
-    "Ignore": "Overslaan",
-    "Ignore all": "alles overslaan",
-    "No mispelled words found with the selected dictionary.": "Geen fouten gevonden met dit woordenboek.",
-    "OK": "OK",
-    "Original word": "Originele woord",
-    "Please confirm that you want to open this link": "Weet u zeker dat u deze link wilt openen?",
-    "Please wait.  Calling spell checker.": "Even wachten. spell checker wordt geladen.",
-    "Please wait: changing dictionary to": "even wachten: woordenboek wordt veranderd naar",
-    "Re-check": "Opnieuw",
-    "Replace": "Vervangen",
-    "Replace all": "Alles vervangen",
-    "Replace with": "Vervangen met",
-    "Revert": "Omkeren",
-    "Spell-check": "Spell-check",
-    "Suggestions": "Suggestie",
-    "This will drop changes and quit spell checker.  Please confirm.": "Dit zal alle veranderingen annuleren en de spell checker sluiten.  Weet u het zeker?",
-    "__OBSOLETE__": {
-        "One moment...": "Even wachten ;-)",
-        "Spell check complete, didn't find any mispelled words.  Closing now...": "Spell checking is klaar, geen fouten gevonden.  spell checking word gesloten..."
-    }
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/SpellChecker/lang/pl.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/SpellChecker/lang/pl.js
deleted file mode 100644
index 53d773b..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/SpellChecker/lang/pl.js
+++ /dev/null
@@ -1,18 +0,0 @@
-// I18N constants
-// LANG: "pl", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Cancel": "Anuluj",
-    "OK": "OK",
-    "Replace with": "Zamień na:",
-    "__OBSOLETE__": {
-        "___ TRANSLATOR NOTE   ___": "*** SPELLCHECKER IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***"
-    }
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/SpellChecker/lang/pt_br.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/SpellChecker/lang/pt_br.js
deleted file mode 100644
index dcb03a3..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/SpellChecker/lang/pt_br.js
+++ /dev/null
@@ -1,40 +0,0 @@
-// I18N constants
-// LANG: "pt_br", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Cancel": "Cancelar",
-    "Dictionary": "Dicionário",
-    "Finished list of mispelled words": "Finalizada lista de palavras desconhecidas",
-    "HTMLArea Spell Checker": "Dicionário HTMLArea",
-    "I will open it in a new page.": "Será aberto em uma nova página",
-    "Ignore": "Ignorar",
-    "Ignore all": "Ignorar todas",
-    "Info": "Informação",
-    "Learn": "Aprender",
-    "No mispelled words found with the selected dictionary.": "Nenhuma palavra desconhecida foi encontrada no dicionário selecionado",
-    "OK": "OK",
-    "Original word": "Palavra Original",
-    "Please confirm that you want to open this link": "Por favor, confirme se deseja abrir este link",
-    "Please wait.  Calling spell checker.": "Por favor, aguarde. Chamando dicionário.",
-    "Please wait: changing dictionary to": "Por favor, aguarde: mudando dicionário para",
-    "Re-check": "Re-verificar",
-    "Replace": "Substituir",
-    "Replace all": "Substituir tudo",
-    "Replace with": "Substituir com",
-    "Revert": "Reverter",
-    "Spell Checker": "Dicionário",
-    "Spell-check": "Dicionário",
-    "Suggestions": "Sugestões",
-    "This will drop changes and quit spell checker.  Please confirm.": "Isso desfará as mudanças e finalizará o dicionário. Por favor, confirme.",
-    "pliz weit ;-)": "Por favor, aguarde...",
-    "__OBSOLETE__": {
-        "One moment...": "Um momento..."
-    }
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/SpellChecker/lang/ro.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/SpellChecker/lang/ro.js
deleted file mode 100644
index 6b802aa..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/SpellChecker/lang/ro.js
+++ /dev/null
@@ -1,35 +0,0 @@
-// I18N constants
-// LANG: "ro", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Cancel": "Anulează",
-    "Dictionary": "Dicţionar",
-    "Finished list of mispelled words": "Am terminat lista de cuvinte greşite",
-    "I will open it in a new page.": "O voi deschide într-o altă fereastră.",
-    "Ignore": "Ignoră",
-    "Ignore all": "Ignoră toate",
-    "No mispelled words found with the selected dictionary.": "Nu am găsit nici un cuvânt greşit cu acest dicţionar.",
-    "OK": "OK",
-    "Original word": "Cuvântul original",
-    "Please confirm that you want to open this link": "Vă rog confirmaţi că vreţi să deschideţi acest link",
-    "Please wait.  Calling spell checker.": "Vă rog aşteptaţi.  Apelez spell-checker-ul.",
-    "Please wait: changing dictionary to": "Vă rog aşteptaţi.  Schimb dicţionarul cu",
-    "Re-check": "Scanează",
-    "Replace": "Înlocuieşte",
-    "Replace all": "Înlocuieşte toate",
-    "Replace with": "Înlocuieşte cu",
-    "Spell-check": "Detectează greşeli",
-    "Suggestions": "Sugestii",
-    "This will drop changes and quit spell checker.  Please confirm.": "Doriţi să renunţaţi la modificări şi să închid spell-checker-ul?",
-    "__OBSOLETE__": {
-        "One moment...": "va rog ashteptatzi ;-)",
-        "Spell check complete, didn't find any mispelled words.  Closing now...": "Am terminat, nu am detectat nici o greşeală.  Acum închid fereastra..."
-    }
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/SpellChecker/lang/ru.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/SpellChecker/lang/ru.js
deleted file mode 100644
index 200bd1d..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/SpellChecker/lang/ru.js
+++ /dev/null
@@ -1,18 +0,0 @@
-// I18N constants
-// LANG: "ru", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Cancel": "Отмена",
-    "OK": "OK",
-    "Replace with": "Заменить с",
-    "__OBSOLETE__": {
-        "___ TRANSLATOR NOTE   ___": "*** SPELLCHECKER IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***"
-    }
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/SpellChecker/lang/sh.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/SpellChecker/lang/sh.js
deleted file mode 100644
index 1c71aa5..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/SpellChecker/lang/sh.js
+++ /dev/null
@@ -1,17 +0,0 @@
-// I18N constants
-// LANG: "sh", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Cancel": "Poništi",
-    "OK": "OK",
-    "__OBSOLETE__": {
-        "___ TRANSLATOR NOTE   ___": "*** SPELLCHECKER IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***"
-    }
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/SpellChecker/lang/si.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/SpellChecker/lang/si.js
deleted file mode 100644
index d09543a..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/SpellChecker/lang/si.js
+++ /dev/null
@@ -1,17 +0,0 @@
-// I18N constants
-// LANG: "si", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Cancel": "Prekliči",
-    "OK": "V redu",
-    "__OBSOLETE__": {
-        "___ TRANSLATOR NOTE   ___": "*** SPELLCHECKER IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***"
-    }
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/SpellChecker/lang/sr.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/SpellChecker/lang/sr.js
deleted file mode 100644
index 7bcf64f..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/SpellChecker/lang/sr.js
+++ /dev/null
@@ -1,17 +0,0 @@
-// I18N constants
-// LANG: "sr", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Cancel": "Поништи",
-    "OK": "OK",
-    "__OBSOLETE__": {
-        "___ TRANSLATOR NOTE   ___": "*** SPELLCHECKER IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***"
-    }
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/SpellChecker/lang/sv.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/SpellChecker/lang/sv.js
deleted file mode 100644
index 171553b..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/SpellChecker/lang/sv.js
+++ /dev/null
@@ -1,18 +0,0 @@
-// I18N constants
-// LANG: "sv", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Cancel": "Avbryt",
-    "OK": "OK",
-    "Replace with": "Ersätt med:",
-    "__OBSOLETE__": {
-        "___ TRANSLATOR NOTE   ___": "*** SPELLCHECKER IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***"
-    }
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/SpellChecker/lang/th.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/SpellChecker/lang/th.js
deleted file mode 100644
index e6bebfc..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/SpellChecker/lang/th.js
+++ /dev/null
@@ -1,17 +0,0 @@
-// I18N constants
-// LANG: "th", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Cancel": "ยกเลิก",
-    "OK": "ตกลง",
-    "__OBSOLETE__": {
-        "___ TRANSLATOR NOTE   ___": "*** SPELLCHECKER IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***"
-    }
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/SpellChecker/lang/tr.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/SpellChecker/lang/tr.js
deleted file mode 100644
index 895c17c..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/SpellChecker/lang/tr.js
+++ /dev/null
@@ -1,17 +0,0 @@
-// I18N constants
-// LANG: "tr", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Cancel": "İptal",
-    "OK": "Tamam",
-    "__OBSOLETE__": {
-        "___ TRANSLATOR NOTE   ___": "*** SPELLCHECKER IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***"
-    }
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/SpellChecker/lang/vn.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/SpellChecker/lang/vn.js
deleted file mode 100644
index 9f7614c..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/SpellChecker/lang/vn.js
+++ /dev/null
@@ -1,17 +0,0 @@
-// I18N constants
-// LANG: "vn", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Cancel": "Hủy",
-    "OK": "Đồng ý",
-    "__OBSOLETE__": {
-        "___ TRANSLATOR NOTE   ___": "*** SPELLCHECKER IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***"
-    }
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/SpellChecker/lang/zh_cn.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/SpellChecker/lang/zh_cn.js
deleted file mode 100644
index bd43da7..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/SpellChecker/lang/zh_cn.js
+++ /dev/null
@@ -1,15 +0,0 @@
-// I18N constants
-// LANG: "zh_cn", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "__OBSOLETE__": {
-        "___ TRANSLATOR NOTE   ___": "*** SPELLCHECKER IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***"
-    }
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/SpellChecker/readme-tech.html b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/SpellChecker/readme-tech.html
deleted file mode 100644
index 127d6ba..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/SpellChecker/readme-tech.html
+++ /dev/null
@@ -1,114 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 3.2//EN">
-<html>
-  <head>
-    <title>HTMLArea Spell Checker</title>
-  </head>
-
-  <body>
-    <h1>HTMLArea Spell Checker</h1>
-
-    <p>The HTMLArea Spell Checker subsystem consists of the following
-      files:</p>
-
-    <ul>
-
-      <li>spell-checker.js &mdash; the spell checker plugin interface for
-        HTMLArea</li>
-
-      <li>spell-checker-ui.html &mdash; the HTML code for the user
-        interface</li>
-
-      <li>spell-checker-ui.js &mdash; functionality of the user
-        interface</li>
-
-      <li>spell-checker-logic.cgi &mdash; Perl CGI script that checks a text
-        given through POST for spelling errors</li>
-
-      <li>spell-checker-style.css &mdash; style for mispelled words</li>
-
-      <li>lang/en.js &mdash; main language file (English).</li>
-
-    </ul>
-
-    <h2>Process overview</h2>
-
-    <p>
-      When an end-user clicks the "spell-check" button in the HTMLArea
-      editor, a new window is opened with the URL of "spell-check-ui.html".
-      This window initializes itself with the text found in the editor (uses
-      <tt>window.opener.SpellChecker.editor</tt> global variable) and it
-      submits the text to the server-side script "spell-check-logic.cgi".
-      The target of the FORM is an inline frame which is used both to
-      display the text and correcting.
-    </p>
-
-    <p>
-      Further, spell-check-logic.cgi calls Aspell for each portion of plain
-      text found in the given HTML.  It rebuilds an HTML file that contains
-      clear marks of which words are incorrect, along with suggestions for
-      each of them.  This file is then loaded in the inline frame.  Upon
-      loading, a JavaScript function from "spell-check-ui.js" is called.
-      This function will retrieve all mispelled words from the HTML of the
-      iframe and will setup the user interface so that it allows correction.
-    </p>
-
-    <h2>The server-side script (spell-check-logic.cgi)</h2>
-
-    <p>
-      <strong>Unicode safety</strong> &mdash; the program <em>is</em>
-      Unicode safe.  HTML entities are expanded into their corresponding
-      Unicode characters.  These characters will be matched as part of the
-      word passed to Aspell.  All texts passed to Aspell are in Unicode
-      (when appropriate).  <strike>However, Aspell seems to not support Unicode
-      yet (<a
-        href="http://mail.gnu.org/archive/html/aspell-user/2000-11/msg00007.html">thread concerning Aspell and Unicode</a>).
-      This mean that words containing Unicode
-      characters that are not in 0..255 are likely to be reported as "mispelled" by Aspell.</strike>
-    </p>
-
-    <p>
-      <strong style="font-variant: small-caps; color:
-      red;">Update:</strong> though I've never seen it mentioned
-      anywhere, it looks that Aspell <em>does</em>, in fact, speak
-      Unicode.  Or else, maybe <code>Text::Aspell</code> does
-      transparent conversion; anyway, this new version of our
-      SpellChecker plugin is, as tests show so far, fully
-      Unicode-safe... well, probably the <em>only</em> freeware
-      Web-based spell-checker which happens to have Unicode support.
-    </p>
-
-    <p>
-      The Perl Unicode manual (man perluniintro) states:
-    </p>
-
-    <blockquote>
-      <em>
-        Starting from Perl 5.6.0, Perl has had the capacity to handle Unicode
-        natively.  Perl 5.8.0, however, is the first recommended release for
-        serious Unicode work.  The maintenance release 5.6.1 fixed many of the
-        problems of the initial Unicode implementation, but for example regular
-        expressions still do not work with Unicode in 5.6.1.
-      </em>
-    </blockquote>
-
-    <p>In other words, do <em>not</em> assume that this script is
-      Unicode-safe on Perl interpreters older than 5.8.0.</p>
-
-    <p>The following Perl modules are required:</p>
-
-    <ul>
-      <li><a href="http://search.cpan.org/search?query=Text%3A%3AAspell&mode=all" onclick="window.open(this.href,'_blank');return false;">Text::Aspell</a></li>
-      <li><a href="http://search.cpan.org/search?query=XML%3A%3ADOM&mode=all" onclick="window.open(this.href,'_blank');return false;">XML::DOM</a></li>
-      <li><a href="http://search.cpan.org/search?query=CGI&mode=all" onclick="window.open(this.href,'_blank');return false;">CGI</a></li>
-    </ul>
-
-    <p>Of these, only Text::Aspell might need to be installed manually.  The
-      others are likely to be available by default in most Perl distributions.</p>
-
-    <hr />
-    <address><a href="http://dynarch.com/mishoo/">Mihai Bazon</a></address>
-<!-- Created: Thu Jul 17 13:22:27 EEST 2003 -->
-<!-- hhmts start --> Last modified: Fri Jan 30 19:14:11 EET 2004 <!-- hhmts end -->
-<!-- doc-lang: English -->
-  </body>
-</html>
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/SpellChecker/spell-check-logic.cgi b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/SpellChecker/spell-check-logic.cgi
deleted file mode 100755
index dbf40f8..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/SpellChecker/spell-check-logic.cgi
+++ /dev/null
@@ -1,210 +0,0 @@
-#! /usr/bin/perl -w
-
-# Spell Checker Plugin for HTMLArea-3.0
-# Sponsored by www.americanbible.org
-# Implementation by Mihai Bazon, http://dynarch.com/mishoo/
-#
-# (c) dynarch.com 2003.
-# Distributed under the same terms as HTMLArea itself.
-# This notice MUST stay intact for use (see license.txt).
-#
-# $Id:spell-check-logic.cgi 21 2005-02-19 05:23:56Z gogo $
-
-use strict;
-use utf8;
-use Encode;
-use Text::Aspell;
-use XML::DOM;
-use CGI;
-
-my $TIMER_start = undef;
-eval {
-    use Time::HiRes qw( gettimeofday tv_interval );
-    $TIMER_start = [gettimeofday()];
-};
-# use POSIX qw( locale_h );
-
-binmode STDIN, ':utf8';
-binmode STDOUT, ':utf8';
-
-my $debug = 0;
-
-my $speller = new Text::Aspell;
-my $cgi = new CGI;
-
-my $total_words = 0;
-my $total_mispelled = 0;
-my $total_suggestions = 0;
-my $total_words_suggested = 0;
-
-# FIXME: report a nice error...
-die "Can't create speller!" unless $speller;
-
-my $dict = $cgi->param('dictionary') || $cgi->cookie('dictionary') || 'en';
-
-# add configurable option for this
-$speller->set_option('lang', $dict);
-$speller->set_option('encoding', 'UTF-8');
-#setlocale(LC_CTYPE, $dict);
-
-# ultra, fast, normal, bad-spellers
-# bad-spellers seems to cause segmentation fault
-$speller->set_option('sug-mode', 'normal');
-
-my %suggested_words = ();
-keys %suggested_words = 128;
-
-my $file_content = decode('UTF-8', $cgi->param('content'));
-$file_content = parse_with_dom($file_content);
-
-my $ck_dictionary = $cgi->cookie(-name     => 'dictionary',
-                                 -value    => $dict,
-                                 -expires  => '+30d');
-
-print $cgi->header(-type    => 'text/html; charset: utf-8',
-                   -cookie  => $ck_dictionary);
-
-my $js_suggested_words = make_js_hash(\%suggested_words);
-my $js_spellcheck_info = make_js_hash_from_array
-  ([
-    [ 'Total words'           , $total_words ],
-    [ 'Mispelled words'       , $total_mispelled . ' in dictionary \"'.$dict.'\"' ],
-    [ 'Total suggestions'     , $total_suggestions ],
-    [ 'Total words suggested' , $total_words_suggested ],
-    [ 'Spell-checked in'      , defined $TIMER_start ? (tv_interval($TIMER_start) . ' seconds') : 'n/a' ]
-   ]);
-
-print qq^<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
-<html>
-<head>
-<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
-<link rel="stylesheet" type="text/css" media="all" href="spell-check-style.css" />
-<script type="text/javascript">
-  var suggested_words = { $js_suggested_words };
-  var spellcheck_info = { $js_spellcheck_info }; </script>
-</head>
-<body onload="window.parent.finishedSpellChecking();">^;
-
-print $file_content;
-if ($cgi->param('init') eq '1') {
-    my @dicts = $speller->dictionary_info();
-    my $dictionaries = '';
-    foreach my $i (@dicts) {
-        next if $i->{jargon};
-        my $name = $i->{name};
-        if ($name eq $dict) {
-            $name = '@'.$name;
-        }
-        $dictionaries .= ',' . $name;
-    }
-    $dictionaries =~ s/^,//;
-    print qq^<div id="HA-spellcheck-dictionaries">$dictionaries</div>^;
-}
-
-print '</body></html>';
-
-# Perl is beautiful.
-sub spellcheck {
-    my $node = shift;
-    my $doc = $node->getOwnerDocument;
-    my $check = sub {                 # called for each word in the text
-        # input is in UTF-8
-        my $word = shift;
-        my $already_suggested = defined $suggested_words{$word};
-        ++$total_words;
-        if (!$already_suggested && $speller->check($word)) {
-            return undef;
-        } else {
-            # we should have suggestions; give them back to browser in UTF-8
-            ++$total_mispelled;
-            if (!$already_suggested) {
-                # compute suggestions for this word
-                my @suggestions = $speller->suggest($word);
-                my $suggestions = decode($speller->get_option('encoding'), join(',', @suggestions));
-                $suggested_words{$word} = $suggestions;
-                ++$total_suggestions;
-                $total_words_suggested += scalar @suggestions;
-            }
-            # HA-spellcheck-error
-            my $err = $doc->createElement('span');
-            $err->setAttribute('class', 'HA-spellcheck-error');
-            my $tmp = $doc->createTextNode;
-            $tmp->setNodeValue($word);
-            $err->appendChild($tmp);
-            return $err;
-        }
-    };
-    while ($node->getNodeValue =~ /([\p{IsWord}']+)/) {
-        my $word = $1;
-        my $before = $`;
-        my $after = $';
-        my $df = &$check($word);
-        if (!$df) {
-            $before .= $word;
-        }
-        {
-            my $parent = $node->getParentNode;
-            my $n1 = $doc->createTextNode;
-            $n1->setNodeValue($before);
-            $parent->insertBefore($n1, $node);
-            $parent->insertBefore($df, $node) if $df;
-            $node->setNodeValue($after);
-        }
-    }
-};
-
-sub check_inner_text {
-    my $node = shift;
-    my $text = '';
-    for (my $i = $node->getFirstChild; defined $i; $i = $i->getNextSibling) {
-        if ($i->getNodeType == TEXT_NODE) {
-            spellcheck($i);
-        }
-    }
-};
-
-sub parse_with_dom {
-    my ($text) = @_;
-    $text = '<spellchecker>'.$text.'</spellchecker>';
-
-    my $parser = new XML::DOM::Parser;
-    if ($debug) {
-        open(FOO, '>:utf8', '/tmp/foo');
-        print FOO $text;
-        close FOO;
-    }
-    my $doc = $parser->parse($text);
-    my $nodes = $doc->getElementsByTagName('*');
-    my $n = $nodes->getLength;
-
-    for (my $i = 0; $i < $n; ++$i) {
-        my $node = $nodes->item($i);
-        if ($node->getNodeType == ELEMENT_NODE) {
-            check_inner_text($node);
-        }
-    }
-
-    my $ret = $doc->toString;
-    $ret =~ s{<spellchecker>(.*)</spellchecker>}{$1}sg;
-    return $ret;
-};
-
-sub make_js_hash {
-    my ($hash) = @_;
-    my $js_hash = '';
-    while (my ($key, $val) = each %$hash) {
-        $js_hash .= ',' if $js_hash;
-        $js_hash .= '"'.$key.'":"'.$val.'"';
-    }
-    return $js_hash;
-};
-
-sub make_js_hash_from_array {
-    my ($array) = @_;
-    my $js_hash = '';
-    foreach my $i (@$array) {
-        $js_hash .= ',' if $js_hash;
-        $js_hash .= '"'.$i->[0].'":"'.$i->[1].'"';
-    }
-    return $js_hash;
-};
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/SpellChecker/spell-check-logic.php b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/SpellChecker/spell-check-logic.php
deleted file mode 100644
index e1e5e60..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/SpellChecker/spell-check-logic.php
+++ /dev/null
@@ -1,171 +0,0 @@
-<?php
-  $text = stripslashes($_POST['content']);
-
-  // Convert UTF-8 multi-bytes into decimal character entities.  This is because
-  // aspell isn't fully utf8-aware - ticket:120 raises the possibility 
-  // that this is not required (any more) and so you can turn it off
-  // with editor.config.SpellChecker.utf8_to_entities = false 
-  if(!isset($_REQUEST['utf8_to_entitis']) || $_REQUEST['utf8_to_entities'])
-  {
-    $text = preg_replace('/([\xC0-\xDF][\x80-\xBF])/e', "'&#' . utf8_ord('\$1') . ';'", $text);
-    $text = preg_replace('/([\xE0-\xEF][\x80-\xBF][\x80-\xBF])/e',             "'&#' . utf8_ord('\$1') . ';'",  $text);
-    $text = preg_replace('/([\xF0-\xF7][\x80-\xBF][\x80-\xBF][\x80-\xBF])/e', "'&#' . utf8_ord('\$1') . ';'",   $text);
-  }
-  
-  function utf8_ord($chr)
-  {
-    switch(strlen($chr))
-    {
-      case 1 :
-        return ord($chr);
-
-      case 2 :
-        $ord = ord($chr{1}) & 63;
-        $ord = $ord | ((ord($chr{0}) & 31) << 6);
-        return $ord;
-
-      case 3 :
-        $ord = ord($chr{2}) & 63;
-        $ord = $ord | ((ord($chr{1}) & 63) << 6);
-        $ord = $ord | ((ord($chr{0}) & 15) << 12);
-        return $ord;
-
-      case 4 :
-        $ord = ord($chr{3}) & 63;
-        $ord = $ord | ((ord($chr{2}) & 63) << 6);
-        $ord = $ord | ((ord($chr{1}) & 63) << 12);
-        $ord = $ord | ((ord($chr{0}) & 7)  << 18);
-        return $ord;
-
-      default :
-        trigger_error('Character not utf-8', E_USER_ERROR);
-    }
-  }
-
-  require_once(dirname(__FILE__) . DIRECTORY_SEPARATOR . 'aspell_setup.php');
-
-##############################################################################
-header('Content-Type: text/html; charset=utf-8');
-  echo '<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
-<html>
-<head>
-<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
-<link rel="stylesheet" type="text/css" media="all" href="spell-check-style.css" />';
-
-// Lets define some values outside the condition below, in case we have an empty 
-// document.                                                                     
-$textarray = array();
-$varlines = '<script type="text/javascript">var suggested_words = { ';
-$infolines = 'var spellcheck_info = {';
-$counter = 0;
-$suggest_count = 0;
-
-if (trim($text) != "")
-{
-    if ($fd = fopen($temptext, 'w'))
-    {
-        $textarray = explode("\n", $text);
-        fwrite ($fd, "!\n");
-        foreach ($textarray as $key=>$value)
-        {
-            // adding the carat to each line prevents the use of aspell commands within the text...
-            fwrite($fd, "^$value\n");
-        }
-        fclose($fd);
-        chmod($temptext, 0777);
-        // next run aspell
-        $return = shell_exec($aspellcommand . ' 2>&1');
-        // echo $return;
-        unlink($temptext);
-        $returnarray = explode("\n", $return);
-        $returnlines = count($returnarray);
-//print_r(htmlentities($return));
-        $textlines = count($textarray);
-
-        $lineindex = -1;
-        $poscorrect = 0;
-        foreach ($returnarray as $key=>$value)
-        {
-            // if there is a correction here, processes it, else move the $textarray pointer to the next line
-            if (substr($value, 0, 1) == '&')
-            {
-               $counter=$counter+1;
-                $correction = explode(' ', $value);
-                $word = $correction[1];
-                $suggest_count += $correction[2];
-                $absposition = substr($correction[3], 0, -1) - 1;
-                $position = $absposition + $poscorrect;
-                $niceposition = $lineindex.','.$absposition;
-                $suggstart = strpos($value, ':') + 2;
-                $suggestions = substr($value, $suggstart);
-                $suggestionarray = explode(', ', $suggestions);
-
-                $beforeword = substr($textarray[$lineindex], 0, $position);
-                $afterword = substr($textarray[$lineindex], $position + strlen($word));
-                $textarray[$lineindex] = $beforeword.'<span class="HA-spellcheck-error">'.$word.'</span>'.$afterword;
-
-             $suggestion_list = '';
-                foreach ($suggestionarray as $key=>$value)
-                {
-                    $suggestion_list .= $value.',';
-                }
-                $suggestion_list = substr($suggestion_list, 0, strlen($suggestion_list) - 1);
-                $varlines .= '"'.$word.'":"'.$suggestion_list.'",';
-
-                $poscorrect = $poscorrect + 41;
-            }
-            elseif (substr($value, 0, 1) == '#')
-            {
-                $correction = explode(' ', $value);
-                $word = $correction[1];
-                $absposition = $correction[2] - 1;
-                $position = $absposition + $poscorrect;
-                $niceposition = $lineindex.','.$absposition;
-                $beforeword = substr($textarray[$lineindex], 0, $position);
-                $afterword = substr($textarray[$lineindex], $position + strlen($word));
-                $textarray[$lineindex] = $beforeword.$word.$afterword;
-                $textarray[$lineindex] = $beforeword.'<span class="HA-spellcheck-error">'.$word.'</span><span class="HA-spellcheck-suggestions">'.$word.'</span>'.$afterword;
-//                $poscorrect = $poscorrect;
-                $poscorrect = $poscorrect + 88 + strlen($word);
-            }
-            else
-            {
-                //print "Done with line $lineindex, next line...<br><br>";
-                $poscorrect = 0;
-                $lineindex = $lineindex + 1;
-            }
-         }
-     }
-     else
-     {
-       // This one isnt used for anything at the moment!
-       $return = 'failed to open!';
-     }
-} 
-else 
-{ 
-  $returnlines=0; 
-}
-$infolines .= '"Language Used":"'.$lang.'",';
-$infolines .= '"Mispelled words":"'.$counter.'",';
-$infolines .= '"Total words suggested":"'.$suggest_count.'",';
-$infolines .= '"Total Lines Checked":"'.$returnlines.'"';
-$infolines .= '};';
-$varlines = substr($varlines, 0, strlen($varlines) - 1);
-echo $varlines.'};'.$infolines.'</script>';
-
-echo '</head>
-<body onload="window.parent.finishedSpellChecking();">';
-
-foreach ($textarray as $key=>$value)
-{
-  echo $value;
-}
-
-$dictionaries = str_replace(chr(10),",", shell_exec($aspelldictionaries));
-if(ereg(",$",$dictionaries))
-  $dictionaries = ereg_replace(",$","",$dictionaries);
-echo '<div id="HA-spellcheck-dictionaries">'.$dictionaries.'</div>';
-
-echo '</body></html>';
-?>
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/SpellChecker/spell-check-savedicts.php b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/SpellChecker/spell-check-savedicts.php
deleted file mode 100644
index cb2d281..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/SpellChecker/spell-check-savedicts.php
+++ /dev/null
@@ -1,38 +0,0 @@
-<?php
-  require_once(dirname(__FILE__) . DIRECTORY_SEPARATOR . 'aspell_setup.php');
-
-
-  $to_p_dict = $_REQUEST['to_p_dict'] ? $_REQUEST['to_p_dict'] : array();
-  $to_r_list = $_REQUEST['to_r_list'] ? $_REQUEST['to_r_list'] : array();
-print_r($to_r_list);
-  if($to_p_dict || $to_r_list)
-  {
-    if($fh = fopen($temptext, 'w'))
-    {
-      foreach($to_p_dict as $personal_word)
-      {
-        $cmd = '&' . $personal_word . "\n";
-        echo $cmd;
-        fwrite($fh, $cmd, strlen($cmd));
-      }
-
-      foreach($to_r_list as $replace_pair)
-      {
-        $cmd = '$$ra ' . $replace_pair[0] . ' , ' . $replace_pair[1] . "\n";
-        echo $cmd;
-        fwrite($fh, $cmd, strlen($cmd));
-      }
-      $cmd = "#\n";
-      echo $cmd;
-      fwrite($fh, $cmd, strlen($cmd));
-      fclose($fh);
-    }
-    else
-    {
-      die("Can't Write");
-    }
-    echo $aspellcommand."\n";
-    echo shell_exec($aspellcommand . ' 2>&1');
-    unlink($temptext);
-  }
-?>
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/SpellChecker/spell-check-style.css b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/SpellChecker/spell-check-style.css
deleted file mode 100644
index 1408ba0..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/SpellChecker/spell-check-style.css
+++ /dev/null
@@ -1,10 +0,0 @@
-.HA-spellcheck-error { border-bottom: 1px dashed #f00; cursor: default; }
-.HA-spellcheck-same { background-color: #cef; color: #000; }
-.HA-spellcheck-hover { background-color: #433; color: white; }
-.HA-spellcheck-fixed { border-bottom: 1px dashed #0b8; }
-.HA-spellcheck-current { background-color: #9be; color: #000; }
-.HA-spellcheck-suggestions { display: none; }
-
-#HA-spellcheck-dictionaries { display: none; }
-
-a:link, a:visited { color: #55e; }
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/SpellChecker/spell-check-ui.html b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/SpellChecker/spell-check-ui.html
deleted file mode 100644
index 499da97..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/SpellChecker/spell-check-ui.html
+++ /dev/null
@@ -1,125 +0,0 @@
-<!--
-
-  Strangely, IE sucks with or without the DOCTYPE switch.
-  I thought it would only suck without it.
-
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN"
-    "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
-
-   Spell Checker Plugin for HTMLArea-3.0
-   Sponsored by www.americanbible.org
-   Implementation by Mihai Bazon, http://dynarch.com/mishoo/
-
-   (c) dynarch.com 2003.
-   Distributed under the same terms as HTMLArea itself.
-   This notice MUST stay intact for use (see license.txt).
-
-   $Id:spell-check-ui.html 987 2008-04-12 12:39:04Z ray $
-
--->
-<html>
-
-  <head>
-    <title>Spell Checker</title>
-    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
-    <script type="text/javascript" src="spell-check-ui.js"></script>
-
-    <style type="text/css">
-      html, body { height: 100%; margin: 0px; padding: 0px; background-color: #fff;
-      color: #000; }
-      a:link, a:visited { color: #00f; text-decoration: none; }
-      a:hover { color: #f00; text-decoration: underline; }
-
-      table { background-color: ButtonFace; color: ButtonText;
-      font-family: tahoma,verdana,sans-serif; font-size: 11px; }
-
-      iframe { background-color: #fff; color: #000; height: 100%; width: 100%; }
-
-      .controls { width: 13em; }
-      .controls .sectitle { /* background-color: #736c6c; color: #fff;
-      border-top: 1px solid #000; border-bottom: 1px solid #fff; */
-      text-align: center;
-      font-weight: bold; padding: 2px 4px; }
-      .controls .secbody { margin-bottom: 10px; }
-
-      button, select { font-family: tahoma,verdana,sans-serif; font-size: 11px; }
-      button { width: 6em; padding: 0px; }
-
-      input, select { font-family: fixed,"andale mono",monospace; }
-
-      #v_currentWord { color: #f00; font-weight: bold; }
-      #statusbar { padding: 7px 0px 0px 5px; }
-      #status { font-weight: bold; }
-    </style>
-
-  </head>
-
-  <body onload="initDocument()">
-
-    <form style="display: none;" action="spell-check-logic.cgi"
-          method="post" target="framecontent"
-          accept-charset="UTF-8"
-          ><input type="hidden" name="content" id="f_content"
-          /><input type="hidden" name="dictionary" id="f_dictionary"
-          /><input type="hidden" name="init" id="f_init" value="1"
-          /><input type="hidden" name="utf8_to_entities" id="utf8_to_entities" value="1"
-    /></form>
-
-    <table style="height: 100%; width: 100%; border-collapse: collapse;" cellspacing="0" cellpadding="0">
-      <tr>
-        <td colspan="2" style="height: 1em; padding: 2px;">
-          <div style="float: right; padding: 2px;"><span>Dictionary</span>
-            <select id="v_dictionaries" style="width: 10em"></select>
-            <button id="b_recheck">Re-check</button>
-          </div>
-          <span id="status">Please wait.  Calling spell checker.</span>
-        </td>
-      </tr>
-      <tr>
-        <td style="vertical-align: top;" class="controls">
-          <div class="secbody" style="text-align: center">
-            <button id="b_info">Info</button>
-          </div>
-          <div class="sectitle">Original word</div>
-          <div class="secbody" id="v_currentWord" style="text-align:
-          center; margin-bottom: 0px;">pliz weit ;-)</div>
-          <div class="secbody" style="text-align: center">
-            <button id="b_revert">Revert</button>
-          </div>
-          <div class="sectitle">Replace with</div>
-          <div class="secbody">
-            <input type="text" id="v_replacement" style="width: 94%; margin-left: 3%;" /><br />
-            <div style="text-align: center; margin-top: 2px;">
-              <button id="b_replace">Replace</button><button
-                id="b_replall">Replace all</button><br /><button
-                id="b_ignore">Ignore</button><button
-                id="b_ignall">Ignore all</button>
-                <button
-                id="b_learn">Learn</button>
-            </div>
-          </div>
-          <div class="sectitle">Suggestions</div>
-          <div class="secbody">
-            <select size="11" style="width: 94%; margin-left: 3%;" id="v_suggestions"></select>
-          </div>
-        </td>
-
-        <td>
-          <iframe src="../../popups/blank.html" width="100%" height="100%"
-            id="i_framecontent" name="framecontent"></iframe>
-        </td>
-      </tr>
-      <tr>
-        <td style="height: 1em;" colspan="2">
-          <div style="padding: 4px 2px 2px 2px; float: right;">
-            <button id="b_ok">OK</button>
-            <button id="b_cancel">Cancel</button>
-          </div>
-          <div id="statusbar"></div>
-        </td>
-      </tr>
-    </table>
-
-  </body>
-
-</html>
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/SpellChecker/spell-check-ui.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/SpellChecker/spell-check-ui.js
deleted file mode 100644
index f471c07..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/SpellChecker/spell-check-ui.js
+++ /dev/null
@@ -1,454 +0,0 @@
-// Spell Checker Plugin for HTMLArea-3.0
-// Sponsored by www.americanbible.org
-// Implementation by Mihai Bazon, http://dynarch.com/mishoo/
-//
-// (c) dynarch.com 2003.
-// Distributed under the same terms as HTMLArea itself.
-// This notice MUST stay intact for use (see license.txt).
-//
-// $Id:spell-check-ui.js 987M 2008-04-12 12:39:04Z (local) $
-
-// internationalization file was already loaded in parent ;-)
-var SpellChecker = window.opener.SpellChecker;
-
-var Xinha    = window.opener.Xinha;
-
-var _editor_url = window.opener._editor_url;
-
-var is_ie = Xinha.is_ie;
-var editor = SpellChecker.editor;
-var frame = null;
-var currentElement = null;
-var wrongWords = null;
-var modified = false;
-var allWords = {};
-var fixedWords = [];
-var suggested_words = {};
-
-var to_p_dict = []; // List of words to add to personal dictionary.
-var to_r_list = []; // List of words to add to replacement list.
-
-function _lc(string) {
-  return Xinha._lc(string, 'SpellChecker');
-}
-
-function makeCleanDoc(leaveFixed) {
-  // document.getElementById("status").innerHTML = 'Please wait: rendering valid HTML';
-  var words = wrongWords.concat(fixedWords);
-  for (var i = words.length; --i >= 0;) {
-    var el = words[i];
-    if (!(leaveFixed && /HA-spellcheck-fixed/.test(el.className))) {
-      if(el.firstChild)
-        el.parentNode.insertBefore(el.firstChild, el);
-      el.parentNode.removeChild(el);
-    } else
-      el.className = "HA-spellcheck-fixed";
-  }
-  // we should use innerHTML here, but IE6's implementation fucks up the
-  // HTML to such extent that our poor Perl parser doesn't understand it
-  // anymore.
-  return Xinha.getHTML(frame.contentWindow.document.body, true, editor);
-}
-
-function recheckClicked() {
-  document.getElementById("status").innerHTML = _lc("Please wait: changing dictionary to") + ': "' + document.getElementById("f_dictionary").value + '".';
-  var field = document.getElementById("f_content");
-  field.value = makeCleanDoc(true);
-  field.form.submit();
-}
-
-function saveClicked() {
-  if (modified) {
-    editor.setHTML(makeCleanDoc(false));
-  }
-
-  if(to_p_dict.length || to_r_list.length && editor.config.SpellChecker.backend == 'php')
-  {
-    var data = {};
-    for(var i = 0;i < to_p_dict.length;i++)
-    {
-      data['to_p_dict[' + i + ']'] = to_p_dict[i];
-    }
-    for(var i = 0;i < to_r_list.length;i++)
-    {
-      data['to_r_list[' + i + '][0]'] = to_r_list[i][0];
-      data['to_r_list[' + i + '][1]'] = to_r_list[i][1];
-    }
-    // var win = window;
-    window.opener.Xinha._postback(Xinha.getPluginDir("SpellChecker") + '/spell-check-savedicts.php', data);
-    window.close();
-  }
-  else
-  {
-    window.close();
-  }
-  return false;
-}
-
-function cancelClicked() {
-  var ok = true;
-  if (modified) {
-    ok = confirm(_lc("This will drop changes and quit spell checker.  Please confirm."));
-  }
-  if (ok) {
-    window.close();
-  }
-  return false;
-}
-
-function replaceWord(el) {
-  var replacement = document.getElementById("v_replacement").value;
-  var this_word_modified = (el.innerHTML != replacement);
-  if (this_word_modified)
-    modified = true;
-  if (el) {
-    el.className = el.className.replace(/\s*HA-spellcheck-(hover|fixed)\s*/g, " ");
-  }
-  el.className += " HA-spellcheck-fixed";
-  el.__msh_fixed = true;
-  if (!this_word_modified) {
-    return false;
-  }
-  to_r_list.push([el.innerHTML, replacement]);
-  el.innerHTML = replacement;
-}
-
-function replaceClicked() {
-  replaceWord(currentElement);
-  var start = currentElement.__msh_id;
-  var index = start;
-  do {
-    ++index;
-    if (index == wrongWords.length) {
-      index = 0;
-    }
-  } while ((index != start) && wrongWords[index].__msh_fixed);
-  if (index == start) {
-    index = 0;
-    alert(_lc("Finished list of mispelled words"));
-  }
-  wrongWords[index].__msh_wordClicked(true);
-  return false;
-}
-
-function revertClicked() {
-  document.getElementById("v_replacement").value = currentElement.__msh_origWord;
-  replaceWord(currentElement);
-  currentElement.className = "HA-spellcheck-error HA-spellcheck-current";
-  return false;
-}
-
-function replaceAllClicked() {
-  var replacement = document.getElementById("v_replacement").value;
-  var ok = true;
-  var spans = allWords[currentElement.__msh_origWord];
-  if (spans.length == 0) {
-    alert("An impossible condition just happened.  Call FBI.  ;-)");
-  } else if (spans.length == 1) {
-    replaceClicked();
-    return false;
-  }
-  /*
-  var message = "The word \"" + currentElement.__msh_origWord + "\" occurs " + spans.length + " times.\n";
-  if (replacement == currentElement.__msh_origWord) {
-    ok = confirm(message + "Ignore all occurrences?");
-  } else {
-    ok = confirm(message + "Replace all occurrences with \"" + replacement + "\"?");
-  }
-  */
-  if (ok) {
-    for (var i = 0; i < spans.length; ++i) {
-      if (spans[i] != currentElement) {
-        replaceWord(spans[i]);
-      }
-    }
-    // replace current element the last, so that we jump to the next word ;-)
-    replaceClicked();
-  }
-  return false;
-}
-
-function ignoreClicked() {
-  document.getElementById("v_replacement").value = currentElement.__msh_origWord;
-  replaceClicked();
-  return false;
-}
-
-function ignoreAllClicked() {
-  document.getElementById("v_replacement").value = currentElement.__msh_origWord;
-  replaceAllClicked();
-  return false;
-}
-
-function learnClicked() {
-  to_p_dict.push(currentElement.__msh_origWord);
-  return ignoreAllClicked();
-}
-
-function internationalizeWindow() {
-  var types = ["div", "span", "button"];
-  for (var i = 0; i < types.length; ++i) {
-    var tag = types[i];
-    var els = document.getElementsByTagName(tag);
-    for (var j = els.length; --j >= 0;) {
-      var el = els[j];
-      if (el.childNodes.length == 1 && /\S/.test(el.innerHTML)) {
-        var txt = el.innerHTML;
-        el.innerHTML = _lc(txt);
-      }
-    }
-  }
-}
-
-function initDocument() {
-  internationalizeWindow();
-  modified = false;
-  frame = document.getElementById("i_framecontent");
-  var field = document.getElementById("f_content");
-  field.value = Xinha.getHTML(editor._doc.body, false, editor);
-  var dict = document.getElementById("f_dictionary");
-  if(typeof editor.config.SpellChecker.defaultDictionary != "undefined"
-     && editor.config.SpellChecker.defaultDictionary != "") {
-    dict.value = editor.config.SpellChecker.defaultDictionary;
-  } else {
-    dict.value = "en_GB";
-  }
-  if(editor.config.SpellChecker.backend == 'php')
-  {
-    field.form.action = Xinha.getPluginDir("SpellChecker") + '/spell-check-logic.php';
-  }
-  if(editor.config.SpellChecker.utf8_to_entities)
-  {
-    document.getElementById('utf8_to_entities').value = 1;
-  }
-  else
-  {
-    document.getElementById('utf8_to_entities').value = 0;
-  }
-  field.form.submit();
-  document.getElementById("f_init").value = "0";
-
-  // assign some global event handlers
-
-  var select = document.getElementById("v_suggestions");
-  select.onchange = function() {
-    document.getElementById("v_replacement").value = this.value;
-  };
-  if (is_ie) {
-    select.attachEvent("ondblclick", replaceClicked);
-  } else {
-    select.addEventListener("dblclick", replaceClicked, true);
-  }
-
-  document.getElementById("b_replace").onclick = replaceClicked;
-  if(editor.config.SpellChecker.backend == 'php')
-  {
-    document.getElementById("b_learn").onclick = learnClicked;
-  }
-  else
-  {
-    document.getElementById("b_learn").parentNode.removeChild(document.getElementById("b_learn"));
-  }
-  document.getElementById("b_replall").onclick = replaceAllClicked;
-  document.getElementById("b_ignore").onclick = ignoreClicked;
-  document.getElementById("b_ignall").onclick = ignoreAllClicked;
-  document.getElementById("b_recheck").onclick = recheckClicked;
-  document.getElementById("b_revert").onclick = revertClicked;
-  document.getElementById("b_info").onclick = displayInfo;
-
-  document.getElementById("b_ok").onclick = saveClicked;
-  document.getElementById("b_cancel").onclick = cancelClicked;
-
-  select = document.getElementById("v_dictionaries");
-  select.onchange = function() {
-    document.getElementById("f_dictionary").value = this.value;
-  };
-}
-
-function getAbsolutePos(el) {
-  var r = { x: el.offsetLeft, y: el.offsetTop };
-  if (el.offsetParent) {
-    var tmp = getAbsolutePos(el.offsetParent);
-    r.x += tmp.x;
-    r.y += tmp.y;
-  }
-  return r;
-}
-
-function wordClicked(scroll) {
-  var self = this;
-  if (scroll) (function() {
-    var pos = getAbsolutePos(self);
-    var ws = { x: frame.offsetWidth - 4,
-         y: frame.offsetHeight - 4 };
-    var wp = { x: frame.contentWindow.document.body.scrollLeft,
-         y: frame.contentWindow.document.body.scrollTop };
-    pos.x -= Math.round(ws.x/2);
-    if (pos.x < 0) pos.x = 0;
-    pos.y -= Math.round(ws.y/2);
-    if (pos.y < 0) pos.y = 0;
-    frame.contentWindow.scrollTo(pos.x, pos.y);
-  })();
-  if (currentElement) {
-    var a = allWords[currentElement.__msh_origWord];
-    currentElement.className = currentElement.className.replace(/\s*HA-spellcheck-current\s*/g, " ");
-    for (var i = 0; i < a.length; ++i) {
-      var el = a[i];
-      if (el != currentElement) {
-        el.className = el.className.replace(/\s*HA-spellcheck-same\s*/g, " ");
-      }
-    }
-  }
-  currentElement = this;
-  this.className += " HA-spellcheck-current";
-  var a = allWords[currentElement.__msh_origWord];
-  for (var i = 0; i < a.length; ++i) {
-    var el = a[i];
-    if (el != currentElement) {
-      el.className += " HA-spellcheck-same";
-    }
-  }
-  // document.getElementById("b_replall").disabled = (a.length <= 1);
-  // document.getElementById("b_ignall").disabled = (a.length <= 1);
-  var txt;
-  if (a.length == 1) {
-    txt = "one occurrence";
-  } else if (a.length == 2) {
-    txt = "two occurrences";
-  } else {
-    txt = a.length + " occurrences";
-  }
-  var suggestions = suggested_words[this.__msh_origWord];
-  if (suggestions)
-    suggestions = suggestions.split(/,/);
-  else
-    suggestions = [];
-  var select = document.getElementById("v_suggestions");
-  document.getElementById("statusbar").innerHTML = "Found " + txt +
-    ' for word "<b>' + currentElement.__msh_origWord + '</b>"';
-  for (var i = select.length; --i >= 0;) {
-    select.remove(i);
-  }
-  for (var i = 0; i < suggestions.length; ++i) {
-    var txt = suggestions[i];
-    var option = document.createElement("option");
-    option.value = txt;
-    option.appendChild(document.createTextNode(txt));
-    select.appendChild(option);
-  }
-  document.getElementById("v_currentWord").innerHTML = this.__msh_origWord;
-  if (suggestions.length > 0) {
-    select.selectedIndex = 0;
-    select.onchange();
-  } else {
-    document.getElementById("v_replacement").value = this.innerHTML;
-  }
-  select.style.display = "none";
-  select.style.display = "block";
-  return false;
-}
-
-function wordMouseOver() {
-  this.className += " HA-spellcheck-hover";
-}
-
-function wordMouseOut() {
-  this.className = this.className.replace(/\s*HA-spellcheck-hover\s*/g, " ");
-}
-
-function displayInfo() {
-  var info = frame.contentWindow.spellcheck_info;
-  if (!info)
-    alert("No information available");
-  else {
-    var txt = "** Document information **";
-    for (var i in info) {
-      txt += "\n" + i + " : " + info[i];
-    }
-    alert(txt);
-  }
-  return false;
-}
-
-function finishedSpellChecking() {
-  // initialization of global variables
-  currentElement = null;
-  wrongWords = null;
-  allWords = {};
-  fixedWords = [];
-  suggested_words = frame.contentWindow.suggested_words;
-
-  document.getElementById("status").innerHTML = "Xinha Spell Checker (<a href=\"readme-tech.html\" onclick=\"window.open(this.href,'_blank');return false;\" title=\"Technical information\">info</a>)";
-  var doc = frame.contentWindow.document;
-        var spans = doc.getElementsByTagName("span");
-        var sps = [];
-  var id = 0;
-        for (var i = 0; i < spans.length; ++i) {
-                var el = spans[i];
-                if (/HA-spellcheck-error/.test(el.className)) {
-                        sps.push(el);
-      el.__msh_wordClicked = wordClicked;
-      el.onclick = function(ev) {
-        ev || (ev = window.event);
-        ev && Xinha._stopEvent(ev);
-        return this.__msh_wordClicked(false);
-      };
-      el.onmouseover = wordMouseOver;
-      el.onmouseout = wordMouseOut;
-      el.__msh_id = id++;
-      var txt = (el.__msh_origWord = el.firstChild.data);
-      el.__msh_fixed = false;
-      if (typeof allWords[txt] == "undefined") {
-        allWords[txt] = [el];
-      } else {
-        allWords[txt].push(el);
-      }
-                } else if (/HA-spellcheck-fixed/.test(el.className)) {
-      fixedWords.push(el);
-    }
-        }
-        
-  var dicts = doc.getElementById("HA-spellcheck-dictionaries");
-  if (dicts) {
-    dicts.parentNode.removeChild(dicts);
-    dicts = dicts.innerHTML.split(/,/);
-    var select = document.getElementById("v_dictionaries");
-    for (var i = select.length; --i >= 0;) {
-      select.remove(i);
-    }
-    var activeDictionary = document.getElementById("f_dictionary").value;
-    for (var i = 0; i < dicts.length; ++i) {
-      var txt = dicts[i];
-      var option = document.createElement("option");
-      if(txt == activeDictionary) {
-        option.selected = true;
-      }
-      option.value = txt;
-      option.appendChild(document.createTextNode(txt));
-      select.appendChild(option);
-    }
-  }
-        
-  wrongWords = sps;
-  if (sps.length == 0) {
-    if (!modified) {
-      alert(_lc("No mispelled words found with the selected dictionary."));
-      // window.close();
-    } else {
-      alert(_lc("No mispelled words found with the selected dictionary."));
-    }
-    return false;
-  }
-  (currentElement = sps[0]).__msh_wordClicked(true);
-  var as = doc.getElementsByTagName("a");
-  for (var i = as.length; --i >= 0;) {
-    var a = as[i];
-    a.onclick = function() {
-      if (confirm(_lc("Please confirm that you want to open this link") + ":\n" +
-            this.href + "\n" + _lc("I will open it in a new page."))) {
-        window.open(this.href);
-      }
-      return false;
-    };
-  }  
-}
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/Template/Template.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/Template/Template.js
deleted file mode 100644
index 92c5c2d..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/Template/Template.js
+++ /dev/null
@@ -1,107 +0,0 @@
-// Template plugin for Xinha

-// Implementation by Udo Schmal based on HTMLArea 3.0

-// Original Author - Udo Schmal www.Schaffrath-NeueMedien.de

-//

-// (c) Udo Schmal & Schaffrath NeueMedien 2004

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

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

-

-function Template(editor) {

-  this.editor = editor;

-  var cfg = editor.config;

-  var self = this;

-

-  // register the toolbar buttons provided by this plugin

-  cfg.registerButton({

-    id       : "template",

-    tooltip  : Xinha._lc("Insert template","Template"),

-    image    : editor.imgURL("ed_template.gif", "Template"),

-    textMode : false,

-    action   : function(editor) {

-                 self.buttonPress(editor);

-               }

-  });

-  cfg.addToolbarElement("template", "inserthorizontalrule", 1);

-}

-

-Template._pluginInfo = {

-  name          : "Template",

-  version       : "1.0",

-  developer     : "Udo Schmal",

-  developer_url : "http://www.schaffrath-neuemedien.de/",

-  c_owner       : "Udo Schmal & Schaffrath NeueMedien",

-  license       : "htmlArea"

-};

-

-Template.prototype.onGenerate = function() {

-  this.editor.addEditorStylesheet(Xinha.getPluginDir("Template") + '/template.css');

-};

-

-Template.prototype.buttonPress = function(editor) {

-  editor._popupDialog( "plugin://Template/template", function( obj ) {

-    if ( !obj ) {//user must have pressed Cancel

-      return false;

-    }

-

-    var bodys = editor._doc.getElementsByTagName("body");

-    var body = bodys[0];

-

-  function getElement(x) {

-    var result = editor._doc.getElementById(x);

-    if (!result) {

-      result = editor._doc.createElement("div");

-      result.id = x;

-      result.innerHTML = x;

-      body.appendChild(result);

-    }

-    if (result.style)

-      result.removeAttribute("style");

-    return result;

-  }

-

-    var content = getElement("content");

-    var menu1 = getElement("menu1");

-    var menu2 = getElement("menu2");

-    var menu3 = getElement("menu3");

-    switch (obj["templ"]) {

-      case "1": menu1.style.position = "absolute";

-                menu1.style.right = "0px";

-                menu1.style.width = "28%";

-                menu1.style.backgroundColor = "#e1ddd9";

-                menu1.style.padding = "2px 20px";

-                content.style.position = "absolute";

-                content.style.left = "0px";

-                content.style.width = "70%";

-                content.style.backgroundColor = "#fff";

-                menu2.style.visibility = "hidden";

-                menu3.style.visibility = "hidden";

-                break;

-      case "2": menu1.style.position = "absolute";

-                menu1.style.left = "0px";

-                menu1.style.width = "28%";

-                menu1.style.height = "100%";

-                menu1.style.backgroundColor = "#e1ddd9";

-                content.style.position = "absolute";

-                content.style.right = "0px";

-                content.style.width = "70%";

-                content.style.backgroundColor = "#fff";

-                menu2.style.visibility = "hidden";

-                menu3.style.visibility = "hidden";

-                break

-      case "3": menu1.style.position = "absolute";

-                menu1.style.left = "0px";

-                menu1.style.width = "28%";

-                menu1.style.backgroundColor = "#e1ddd9";

-                menu2.style.position = "absolute";

-                menu2.style.right = "0px";

-                menu2.style.width = "28%";

-                menu2.style.backgroundColor = "#e1ddd9";

-                content.style.position = "absolute";

-                content.style.right = "30%";

-                content.style.width = "60%";

-                content.style.backgroundColor = "#fff";

-                menu3.style.visibility = "hidden";

-                break

-    }

-  }, null);

-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/Template/img/ed_template.gif b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/Template/img/ed_template.gif
deleted file mode 100644
index 7715a50..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/Template/img/ed_template.gif
+++ /dev/null
Binary files differ
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/Template/img/layout_01.gif b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/Template/img/layout_01.gif
deleted file mode 100644
index d7133e5..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/Template/img/layout_01.gif
+++ /dev/null
Binary files differ
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/Template/img/layout_02.gif b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/Template/img/layout_02.gif
deleted file mode 100644
index e5e3d1e..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/Template/img/layout_02.gif
+++ /dev/null
Binary files differ
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/Template/img/layout_03.gif b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/Template/img/layout_03.gif
deleted file mode 100644
index 7757e26..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/Template/img/layout_03.gif
+++ /dev/null
Binary files differ
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/Template/lang/b5.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/Template/lang/b5.js
deleted file mode 100644
index 88d870b..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/Template/lang/b5.js
+++ /dev/null
@@ -1,15 +0,0 @@
-// I18N constants
-// LANG: "b5", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "__OBSOLETE__": {
-        "___ TRANSLATOR NOTE   ___": "*** TEMPLATE IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***"
-    }
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/Template/lang/ch.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/Template/lang/ch.js
deleted file mode 100644
index a0e7a30..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/Template/lang/ch.js
+++ /dev/null
@@ -1,16 +0,0 @@
-// I18N constants
-// LANG: "ch", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Cancel": "取消",
-    "__OBSOLETE__": {
-        "___ TRANSLATOR NOTE   ___": "*** TEMPLATE IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***"
-    }
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/Template/lang/cz.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/Template/lang/cz.js
deleted file mode 100644
index b81993b..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/Template/lang/cz.js
+++ /dev/null
@@ -1,16 +0,0 @@
-// I18N constants
-// LANG: "cz", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Cancel": "Zrušit",
-    "__OBSOLETE__": {
-        "___ TRANSLATOR NOTE   ___": "*** TEMPLATE IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***"
-    }
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/Template/lang/da.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/Template/lang/da.js
deleted file mode 100644
index 005e8af..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/Template/lang/da.js
+++ /dev/null
@@ -1,16 +0,0 @@
-// I18N constants
-// LANG: "da", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Cancel": "Annuller",
-    "__OBSOLETE__": {
-        "___ TRANSLATOR NOTE   ___": "*** TEMPLATE IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***"
-    }
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/Template/lang/de.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/Template/lang/de.js
deleted file mode 100644
index 74f90b0..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/Template/lang/de.js
+++ /dev/null
@@ -1,14 +0,0 @@
-// I18N constants
-// LANG: "de", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Cancel": "Abbrechen",
-    "Insert template": "Template einfügen"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/Template/lang/ee.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/Template/lang/ee.js
deleted file mode 100644
index 718fb72..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/Template/lang/ee.js
+++ /dev/null
@@ -1,16 +0,0 @@
-// I18N constants
-// LANG: "ee", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Cancel": "Loobu",
-    "__OBSOLETE__": {
-        "___ TRANSLATOR NOTE   ___": "*** TEMPLATE IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***"
-    }
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/Template/lang/el.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/Template/lang/el.js
deleted file mode 100644
index 9c52b87..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/Template/lang/el.js
+++ /dev/null
@@ -1,16 +0,0 @@
-// I18N constants
-// LANG: "el", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Cancel": "Ακύρωση",
-    "__OBSOLETE__": {
-        "___ TRANSLATOR NOTE   ___": "*** TEMPLATE IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***"
-    }
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/Template/lang/es.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/Template/lang/es.js
deleted file mode 100644
index 130965b..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/Template/lang/es.js
+++ /dev/null
@@ -1,16 +0,0 @@
-// I18N constants
-// LANG: "es", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Cancel": "Cancelar",
-    "__OBSOLETE__": {
-        "___ TRANSLATOR NOTE   ___": "*** TEMPLATE IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***"
-    }
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/Template/lang/eu.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/Template/lang/eu.js
deleted file mode 100644
index 72735a2..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/Template/lang/eu.js
+++ /dev/null
@@ -1,16 +0,0 @@
-// I18N constants
-// LANG: "eu", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Cancel": "Utzi",
-    "__OBSOLETE__": {
-        "___ TRANSLATOR NOTE   ___": "*** TEMPLATE IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***"
-    }
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/Template/lang/fa.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/Template/lang/fa.js
deleted file mode 100644
index f8cc613..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/Template/lang/fa.js
+++ /dev/null
@@ -1,16 +0,0 @@
-// I18N constants
-// LANG: "fa", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Cancel": "انصراف",
-    "__OBSOLETE__": {
-        "___ TRANSLATOR NOTE   ___": "*** TEMPLATE IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***"
-    }
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/Template/lang/fi.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/Template/lang/fi.js
deleted file mode 100644
index b3fd264..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/Template/lang/fi.js
+++ /dev/null
@@ -1,16 +0,0 @@
-// I18N constants
-// LANG: "fi", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Cancel": "Peruuta",
-    "__OBSOLETE__": {
-        "___ TRANSLATOR NOTE   ___": "*** TEMPLATE IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***"
-    }
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/Template/lang/fr.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/Template/lang/fr.js
deleted file mode 100644
index 054c18e..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/Template/lang/fr.js
+++ /dev/null
@@ -1,14 +0,0 @@
-// I18N constants
-// LANG: "fr", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Cancel": "Annulation",
-    "Insert template": "Insérer un template"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/Template/lang/fr_ca.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/Template/lang/fr_ca.js
deleted file mode 100644
index 74ef89a..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/Template/lang/fr_ca.js
+++ /dev/null
@@ -1,15 +0,0 @@
-// I18N constants
-// LANG: "fr_ca", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "__OBSOLETE__": {
-        "___ TRANSLATOR NOTE   ___": "*** TEMPLATE IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***"
-    }
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/Template/lang/gb.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/Template/lang/gb.js
deleted file mode 100644
index 3b54d43..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/Template/lang/gb.js
+++ /dev/null
@@ -1,15 +0,0 @@
-// I18N constants
-// LANG: "gb", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "__OBSOLETE__": {
-        "___ TRANSLATOR NOTE   ___": "*** TEMPLATE IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***"
-    }
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/Template/lang/he.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/Template/lang/he.js
deleted file mode 100644
index 68d336a..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/Template/lang/he.js
+++ /dev/null
@@ -1,16 +0,0 @@
-// I18N constants
-// LANG: "he", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Cancel": "ביטול",
-    "__OBSOLETE__": {
-        "___ TRANSLATOR NOTE   ___": "*** TEMPLATE IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***"
-    }
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/Template/lang/hu.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/Template/lang/hu.js
deleted file mode 100644
index b4e2c5d..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/Template/lang/hu.js
+++ /dev/null
@@ -1,16 +0,0 @@
-// I18N constants
-// LANG: "hu", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Cancel": "Mégsem",
-    "__OBSOLETE__": {
-        "___ TRANSLATOR NOTE   ___": "*** TEMPLATE IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***"
-    }
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/Template/lang/it.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/Template/lang/it.js
deleted file mode 100644
index b1c72c6..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/Template/lang/it.js
+++ /dev/null
@@ -1,14 +0,0 @@
-// I18N constants
-// LANG: "it", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Cancel": "Annullamento",
-    "Insert template": "Inserisca il template"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/Template/lang/ja.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/Template/lang/ja.js
deleted file mode 100644
index dade035..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/Template/lang/ja.js
+++ /dev/null
@@ -1,14 +0,0 @@
-// I18N constants
-// LANG: "ja", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Cancel": "中止",
-    "Insert template": "テンプレートの挿入"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/Template/lang/lc_base.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/Template/lang/lc_base.js
deleted file mode 100644
index 14fc527..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/Template/lang/lc_base.js
+++ /dev/null
@@ -1,26 +0,0 @@
-// I18N constants
-//
-// LANG: "en", ENCODING: UTF-8
-// Author: Translator-Name, <email@example.com>
-//
-// Last revision: 2018-04-12
-// 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).
-//
-// (Please, remove information below)
-// 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.)
-
-{
-    "Cancel": "",
-    "Insert template": ""
-}
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/Template/lang/lt.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/Template/lang/lt.js
deleted file mode 100644
index 55fbf99..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/Template/lang/lt.js
+++ /dev/null
@@ -1,16 +0,0 @@
-// I18N constants
-// LANG: "lt", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Cancel": "Atšaukti",
-    "__OBSOLETE__": {
-        "___ TRANSLATOR NOTE   ___": "*** TEMPLATE IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***"
-    }
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/Template/lang/lv.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/Template/lang/lv.js
deleted file mode 100644
index b44584c..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/Template/lang/lv.js
+++ /dev/null
@@ -1,16 +0,0 @@
-// I18N constants
-// LANG: "lv", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Cancel": "Atcelt",
-    "__OBSOLETE__": {
-        "___ TRANSLATOR NOTE   ___": "*** TEMPLATE IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***"
-    }
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/Template/lang/nb.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/Template/lang/nb.js
deleted file mode 100644
index ce2f9c0..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/Template/lang/nb.js
+++ /dev/null
@@ -1,14 +0,0 @@
-// I18N constants
-// LANG: "nb", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Cancel": "Avbryt",
-    "Insert template": "Sett inn template"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/Template/lang/nl.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/Template/lang/nl.js
deleted file mode 100644
index fe40a92..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/Template/lang/nl.js
+++ /dev/null
@@ -1,14 +0,0 @@
-// I18N constants
-// LANG: "nl", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Cancel": "Annuleren",
-    "Insert template": "Template invoegen"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/Template/lang/pl.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/Template/lang/pl.js
deleted file mode 100644
index cff991e..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/Template/lang/pl.js
+++ /dev/null
@@ -1,16 +0,0 @@
-// I18N constants
-// LANG: "pl", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Cancel": "Anuluj",
-    "__OBSOLETE__": {
-        "___ TRANSLATOR NOTE   ___": "*** TEMPLATE IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***"
-    }
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/Template/lang/pt_br.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/Template/lang/pt_br.js
deleted file mode 100644
index 01ea7e5..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/Template/lang/pt_br.js
+++ /dev/null
@@ -1,14 +0,0 @@
-// I18N constants
-// LANG: "pt_br", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Cancel": "Cancelar",
-    "Insert template": "Inserir modelo"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/Template/lang/ro.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/Template/lang/ro.js
deleted file mode 100644
index ac63572..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/Template/lang/ro.js
+++ /dev/null
@@ -1,16 +0,0 @@
-// I18N constants
-// LANG: "ro", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Cancel": "Renunţă",
-    "__OBSOLETE__": {
-        "___ TRANSLATOR NOTE   ___": "*** TEMPLATE IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***"
-    }
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/Template/lang/ru.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/Template/lang/ru.js
deleted file mode 100644
index 800bbbd..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/Template/lang/ru.js
+++ /dev/null
@@ -1,16 +0,0 @@
-// I18N constants
-// LANG: "ru", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Cancel": "Отмена",
-    "__OBSOLETE__": {
-        "___ TRANSLATOR NOTE   ___": "*** TEMPLATE IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***"
-    }
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/Template/lang/sh.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/Template/lang/sh.js
deleted file mode 100644
index bed992c..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/Template/lang/sh.js
+++ /dev/null
@@ -1,16 +0,0 @@
-// I18N constants
-// LANG: "sh", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Cancel": "Poništi",
-    "__OBSOLETE__": {
-        "___ TRANSLATOR NOTE   ___": "*** TEMPLATE IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***"
-    }
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/Template/lang/si.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/Template/lang/si.js
deleted file mode 100644
index ffc750f..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/Template/lang/si.js
+++ /dev/null
@@ -1,16 +0,0 @@
-// I18N constants
-// LANG: "si", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Cancel": "Prekliči",
-    "__OBSOLETE__": {
-        "___ TRANSLATOR NOTE   ___": "*** TEMPLATE IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***"
-    }
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/Template/lang/sr.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/Template/lang/sr.js
deleted file mode 100644
index d692480..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/Template/lang/sr.js
+++ /dev/null
@@ -1,16 +0,0 @@
-// I18N constants
-// LANG: "sr", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Cancel": "Поништи",
-    "__OBSOLETE__": {
-        "___ TRANSLATOR NOTE   ___": "*** TEMPLATE IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***"
-    }
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/Template/lang/sv.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/Template/lang/sv.js
deleted file mode 100644
index bf44edc..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/Template/lang/sv.js
+++ /dev/null
@@ -1,16 +0,0 @@
-// I18N constants
-// LANG: "sv", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Cancel": "Avbryt",
-    "__OBSOLETE__": {
-        "___ TRANSLATOR NOTE   ___": "*** TEMPLATE IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***"
-    }
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/Template/lang/th.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/Template/lang/th.js
deleted file mode 100644
index e624980..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/Template/lang/th.js
+++ /dev/null
@@ -1,16 +0,0 @@
-// I18N constants
-// LANG: "th", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Cancel": "ยกเลิก",
-    "__OBSOLETE__": {
-        "___ TRANSLATOR NOTE   ___": "*** TEMPLATE IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***"
-    }
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/Template/lang/tr.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/Template/lang/tr.js
deleted file mode 100644
index 1d28412..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/Template/lang/tr.js
+++ /dev/null
@@ -1,16 +0,0 @@
-// I18N constants
-// LANG: "tr", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Cancel": "İptal",
-    "__OBSOLETE__": {
-        "___ TRANSLATOR NOTE   ___": "*** TEMPLATE IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***"
-    }
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/Template/lang/vn.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/Template/lang/vn.js
deleted file mode 100644
index 8234968..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/Template/lang/vn.js
+++ /dev/null
@@ -1,16 +0,0 @@
-// I18N constants
-// LANG: "vn", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Cancel": "Hủy",
-    "__OBSOLETE__": {
-        "___ TRANSLATOR NOTE   ___": "*** TEMPLATE IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***"
-    }
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/Template/lang/zh_cn.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/Template/lang/zh_cn.js
deleted file mode 100644
index 28e7aa0..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/Template/lang/zh_cn.js
+++ /dev/null
@@ -1,15 +0,0 @@
-// I18N constants
-// LANG: "zh_cn", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "__OBSOLETE__": {
-        "___ TRANSLATOR NOTE   ___": "*** TEMPLATE IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***"
-    }
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/Template/popups/template.html b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/Template/popups/template.html
deleted file mode 100644
index 727f322..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/Template/popups/template.html
+++ /dev/null
@@ -1,52 +0,0 @@
-<html>
-<head>
-<title>Insert template</title>
-  <link rel="stylesheet" type="text/css" href="../../../popups/popup.css" />
-  <script type="text/javascript" src="../../../popups/popup.js"></script>
-
-<script type="text/javascript">
-function Init() {
-  __dlg_translate("Template");
-  __dlg_init();
-  window.resizeTo(400, 200);
-  document.getElementById("cancel").focus();
-}
-
-function onOK(sel) {
-  // pass data back to the calling window
-  var param = new Object();
-  param["templ"] = sel;
-  __dlg_close(param);
-  return false;
-}
-
-function onCancel() {
-  __dlg_close(null);
-  return false;
-}
-</script>
-</head>
-
-<body class="dialog" onload="Init()">
-<div class="title">Insert template</div>
-<form>
-  <table border="0" cellspacing="0" cellpadding="5">
-	<tr>
-      <td style="text-align: center; vertical-align: top;"><a href="javascript:;" onClick="onOK('1');">
-        <img src="../img/layout_01.gif" alt="" width="106" height="68" border="0" /></a>
-      </td>
-      <td style="text-align: center; vertical-align: top;"><a href="javascript:;" onClick="onOK('2');">
-        <img src="../img/layout_02.gif" alt="" width="106" height="68" border="0" /></a>
-      </td>  
-	  <td style="text-align: center; vertical-align: top;"><a href="javascript:;" onClick="onOK('3');">
-	    <img src="../img/layout_03.gif" alt="" width="106" height="68" border="0" /></a><br/>
-      </td>
- 	</tr>
-  </table>
-
-  <div id="buttons">
-    <button type="button" name="cancel" id="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-1.5.1/unsupported_plugins/Template/template.css b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/Template/template.css
deleted file mode 100644
index 86c359a..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/Template/template.css
+++ /dev/null
@@ -1,3 +0,0 @@
-div {

-	border: 1px dotted ActiveBorder;

-}
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/UnFormat/UnFormat.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/UnFormat/UnFormat.js
deleted file mode 100644
index 44dcfc0..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/UnFormat/UnFormat.js
+++ /dev/null
@@ -1,107 +0,0 @@
-// Unormat plugin for Xinha
-
-
-UnFormat._pluginInfo = {
-  name          : "UnFormat",
-  version       : "1.0",
-  license       : "htmlArea"
-};
-
-
-function UnFormat(editor) {
-  this.editor = editor;
-  var cfg = editor.config;
-  var self = this;
-
-  cfg.registerButton({
-    id       : "unformat",
-    tooltip  : Xinha._lc("Page Cleaner",'UnFormat'),
-    image    : editor.imgURL("unformat.gif", "UnFormat"),
-    textMode : false,
-    action   : function(editor) {
-                 self.show();
-               }
-  });
-
-  cfg.addToolbarElement("unformat", "killword", 1);
-}
-
-UnFormat.prototype.onGenerateOnce = function(editor){
-  // Load assets
-  var self = UnFormat;
-  if (self.loading) return;
-  self.loading = true;
-  self.methodsReady = true;
-  Xinha._getback(Xinha.getPluginDir('UnFormat') + '/dialog.html', function(getback) { self.html = getback; self.dialogReady = true; });
-}
-UnFormat.prototype.onUpdateToolbar = function(editor){
-  if (!(UnFormat.dialogReady && UnFormat.methodsReady))
-  {
-    this.editor._toolbarObjects.unformat.state("enabled", false);
-  }
-  else this.onUpdateToolbar = null;
-
-}
-UnFormat.prototype.prepareDialog = function(editor){
-  var self = this;
-  var editor = this.editor;
-
-  var dialog = this.dialog = new Xinha.Dialog(editor, UnFormat.html, 'Xinha',{width:400})
-  // Connect the OK and Cancel buttons
-  dialog.getElementById('ok').onclick = function() {self.apply();}
-  dialog.getElementById('cancel').onclick = function() { self.dialog.hide()};
-  
-  this.dialogReady = true;
-}
-UnFormat.prototype.show = function(editor){
- if (!this.dialog) this.prepareDialog();
-
-  var editor = this.editor;
-
-  var values = 
-  {
-    "cleaning_area"    : 'selection',
-    "formatting"       : '',
-    "html_all"         : ''
-  }
-  // now calling the show method of the Xinha.Dialog object to set the values and show the actual dialog
-  this.dialog.show(values);
-  this.dialog.onresize();
-}
-UnFormat.prototype.apply = function(editor){
-  var editor = this.editor;
-  var doc = editor._doc;
-  var param = this.dialog.getValues();
-  
-  // selection is only restored on dialog.hide()
-  this.dialog.hide();
-  // assign the given arguments
-  
-  if (param["cleaning_area"] == "all") {
-    var html = editor._doc.body.innerHTML;
-  } else {
-    var html = editor.getSelectedHTML();
-  }
-
-  if (param.html_all) {
-    html = html.replace(/<[\!]*?[^<>]*?>/g, "");
-  }
-
-  if (param.formatting) {
-    html = html.replace(/style="[^"]*"/gi, "");
-    html = html.replace(/<\/?font[^>]*>/gi,"");
-    html = html.replace(/<\/?b>/gi,"");
-    html = html.replace(/<\/?strong[^>]*>/gi,"");
-    html = html.replace(/<\/?i>/gi,"");
-    html = html.replace(/<\/?em[^>]*>/gi,"");
-    html = html.replace(/<\/?u[^>]*>/gi,"");
-    html = html.replace(/<\/?strike[^>]*>/gi,"");
-    html = html.replace(/ align=[^\s|>]*/gi,"");
-    html = html.replace(/ class=[^\s|>]*/gi,"");
-  }
-  if (param["cleaning_area"] == "all") {
-    editor._doc.body.innerHTML = html;
-  } else {
-    editor.insertHTML(html);
-  }
-};
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/UnFormat/dialog.html b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/UnFormat/dialog.html
deleted file mode 100644
index 5cbd89a..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/UnFormat/dialog.html
+++ /dev/null
@@ -1,28 +0,0 @@
-<h1 id="[h1]"><l10n>Page Cleaner</l10n></h1>
-
-<form action="" method="get" style="padding-top:10px" id="[inputs]">
-  <fieldset>
-  <legend><l10n>Cleaning Area</l10n></legend>
-    <span><l10n>Selection</l10n></span><input type="radio" name="[cleaning_area]" id="[clean_selection]" value="selection" checked="checked" />
-    <span><l10n>All</l10n></span><input type="radio" name="[cleaning_area]" id="[clean_page]" value="all" />
-  </fieldset>
-  <br />
-  <fieldset>
-  <legend><l10n>Cleaning options</l10n></legend>
-    <div class="space"></div>
-    <div class="fr"><l10n>Formatting:</l10n></div>
-    <input type="checkbox" name="[formatting]" id="[formatting]" checked value="on" />
-    <p />
-    <div class="fr"><l10n>All HTML:</l10n></div>
-    <input type="checkbox" name="[html_all]" id="[html_all]" value="on" />
-    <p />
-   </fieldset>
-   <br /><br />
-   <p style="text-align:center"><l10n>Select which types of formatting you would like to remove.</l10n></p>
-
-<div class="buttons" id="[buttons]">
-  <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-1.5.1/unsupported_plugins/UnFormat/img/unformat.gif b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/UnFormat/img/unformat.gif
deleted file mode 100644
index 606b902..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/UnFormat/img/unformat.gif
+++ /dev/null
Binary files differ
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/UnFormat/lang/b5.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/UnFormat/lang/b5.js
deleted file mode 100644
index 227f753..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/UnFormat/lang/b5.js
+++ /dev/null
@@ -1,15 +0,0 @@
-// I18N constants
-// LANG: "b5", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "__OBSOLETE__": {
-        "___ TRANSLATOR NOTE   ___": "*** UNFORMAT IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***"
-    }
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/UnFormat/lang/ch.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/UnFormat/lang/ch.js
deleted file mode 100644
index 251b0f8..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/UnFormat/lang/ch.js
+++ /dev/null
@@ -1,17 +0,0 @@
-// I18N constants
-// LANG: "ch", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Cancel": "取消",
-    "OK": "好",
-    "__OBSOLETE__": {
-        "___ TRANSLATOR NOTE   ___": "*** UNFORMAT IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***"
-    }
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/UnFormat/lang/cz.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/UnFormat/lang/cz.js
deleted file mode 100644
index a4067be..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/UnFormat/lang/cz.js
+++ /dev/null
@@ -1,17 +0,0 @@
-// I18N constants
-// LANG: "cz", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Cancel": "Zrušit",
-    "OK": "OK",
-    "__OBSOLETE__": {
-        "___ TRANSLATOR NOTE   ___": "*** UNFORMAT IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***"
-    }
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/UnFormat/lang/da.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/UnFormat/lang/da.js
deleted file mode 100644
index 0dbb851..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/UnFormat/lang/da.js
+++ /dev/null
@@ -1,17 +0,0 @@
-// I18N constants
-// LANG: "da", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Cancel": "Annuller",
-    "OK": "OK",
-    "__OBSOLETE__": {
-        "___ TRANSLATOR NOTE   ___": "*** UNFORMAT IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***"
-    }
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/UnFormat/lang/de.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/UnFormat/lang/de.js
deleted file mode 100644
index d123bcd..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/UnFormat/lang/de.js
+++ /dev/null
@@ -1,25 +0,0 @@
-// I18N constants
-// LANG: "de", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "All": "Alles",
-    "All HTML:": "Ganzes HTML:",
-    "Cancel": "Abbrechen",
-    "Cleaning Area": "Reinigungsbereich",
-    "Cleaning options": "Reinigungsoptionen",
-    "Formatting:": "Formatierung:",
-    "OK": "OK",
-    "Page Cleaner": "Seite bereinigen",
-    "Select which types of formatting you would like to remove.": "Wählen Sie aus welche Formatierungen Sie entfernen wollen.",
-    "Selection": "Ausgewählter Bereich",
-    "__OBSOLETE__": {
-        "___ TRANSLATOR NOTE   ___": "*** UNFORMAT IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***"
-    }
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/UnFormat/lang/ee.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/UnFormat/lang/ee.js
deleted file mode 100644
index 44546b2..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/UnFormat/lang/ee.js
+++ /dev/null
@@ -1,17 +0,0 @@
-// I18N constants
-// LANG: "ee", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Cancel": "Loobu",
-    "OK": "OK",
-    "__OBSOLETE__": {
-        "___ TRANSLATOR NOTE   ___": "*** UNFORMAT IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***"
-    }
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/UnFormat/lang/el.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/UnFormat/lang/el.js
deleted file mode 100644
index 985969f..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/UnFormat/lang/el.js
+++ /dev/null
@@ -1,17 +0,0 @@
-// I18N constants
-// LANG: "el", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Cancel": "Ακύρωση",
-    "OK": "Εντάξει",
-    "__OBSOLETE__": {
-        "___ TRANSLATOR NOTE   ___": "*** UNFORMAT IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***"
-    }
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/UnFormat/lang/es.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/UnFormat/lang/es.js
deleted file mode 100644
index e233f35..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/UnFormat/lang/es.js
+++ /dev/null
@@ -1,17 +0,0 @@
-// I18N constants
-// LANG: "es", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Cancel": "Cancelar",
-    "OK": "Aceptar",
-    "__OBSOLETE__": {
-        "___ TRANSLATOR NOTE   ___": "*** UNFORMAT IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***"
-    }
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/UnFormat/lang/eu.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/UnFormat/lang/eu.js
deleted file mode 100644
index 7a084a3..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/UnFormat/lang/eu.js
+++ /dev/null
@@ -1,17 +0,0 @@
-// I18N constants
-// LANG: "eu", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Cancel": "Utzi",
-    "OK": "Ados",
-    "__OBSOLETE__": {
-        "___ TRANSLATOR NOTE   ___": "*** UNFORMAT IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***"
-    }
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/UnFormat/lang/fa.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/UnFormat/lang/fa.js
deleted file mode 100644
index 526eb9e..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/UnFormat/lang/fa.js
+++ /dev/null
@@ -1,17 +0,0 @@
-// I18N constants
-// LANG: "fa", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Cancel": "انصراف",
-    "OK": "بله",
-    "__OBSOLETE__": {
-        "___ TRANSLATOR NOTE   ___": "*** UNFORMAT IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***"
-    }
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/UnFormat/lang/fi.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/UnFormat/lang/fi.js
deleted file mode 100644
index d403a2c..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/UnFormat/lang/fi.js
+++ /dev/null
@@ -1,17 +0,0 @@
-// I18N constants
-// LANG: "fi", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Cancel": "Peruuta",
-    "OK": "Hyväksy",
-    "__OBSOLETE__": {
-        "___ TRANSLATOR NOTE   ___": "*** UNFORMAT IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***"
-    }
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/UnFormat/lang/fr.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/UnFormat/lang/fr.js
deleted file mode 100644
index aeda9cb..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/UnFormat/lang/fr.js
+++ /dev/null
@@ -1,25 +0,0 @@
-// I18N constants
-// LANG: "fr", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "All": "Tout",
-    "All HTML:": "Tout le HTML",
-    "Cancel": "Annuler",
-    "Cleaning Area": "Zone de nettoyage",
-    "Cleaning options": "Options de nettoyage",
-    "Formatting:": "Format",
-    "OK": "OK",
-    "Page Cleaner": "Nettoyeur de page",
-    "Select which types of formatting you would like to remove.": "Sélectionnez quel type de formatage vous voulez supprimer.",
-    "Selection": "Sélection",
-    "__OBSOLETE__": {
-        "___ TRANSLATOR NOTE   ___": "*** UNFORMAT IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***"
-    }
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/UnFormat/lang/fr_ca.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/UnFormat/lang/fr_ca.js
deleted file mode 100644
index 0e7e9c1..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/UnFormat/lang/fr_ca.js
+++ /dev/null
@@ -1,15 +0,0 @@
-// I18N constants
-// LANG: "fr_ca", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "__OBSOLETE__": {
-        "___ TRANSLATOR NOTE   ___": "*** UNFORMAT IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***"
-    }
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/UnFormat/lang/gb.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/UnFormat/lang/gb.js
deleted file mode 100644
index 87566db..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/UnFormat/lang/gb.js
+++ /dev/null
@@ -1,15 +0,0 @@
-// I18N constants
-// LANG: "gb", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "__OBSOLETE__": {
-        "___ TRANSLATOR NOTE   ___": "*** UNFORMAT IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***"
-    }
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/UnFormat/lang/he.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/UnFormat/lang/he.js
deleted file mode 100644
index d2fa17f..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/UnFormat/lang/he.js
+++ /dev/null
@@ -1,17 +0,0 @@
-// I18N constants
-// LANG: "he", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Cancel": "ביטול",
-    "OK": "אישור",
-    "__OBSOLETE__": {
-        "___ TRANSLATOR NOTE   ___": "*** UNFORMAT IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***"
-    }
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/UnFormat/lang/hu.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/UnFormat/lang/hu.js
deleted file mode 100644
index b2a04ec..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/UnFormat/lang/hu.js
+++ /dev/null
@@ -1,17 +0,0 @@
-// I18N constants
-// LANG: "hu", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Cancel": "Mégsem",
-    "OK": "Rendben",
-    "__OBSOLETE__": {
-        "___ TRANSLATOR NOTE   ___": "*** UNFORMAT IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***"
-    }
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/UnFormat/lang/it.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/UnFormat/lang/it.js
deleted file mode 100644
index eb0f90e..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/UnFormat/lang/it.js
+++ /dev/null
@@ -1,17 +0,0 @@
-// I18N constants
-// LANG: "it", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Cancel": "Annullamento",
-    "OK": "OK",
-    "__OBSOLETE__": {
-        "___ TRANSLATOR NOTE   ___": "*** UNFORMAT IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***"
-    }
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/UnFormat/lang/ja.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/UnFormat/lang/ja.js
deleted file mode 100644
index 215291c..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/UnFormat/lang/ja.js
+++ /dev/null
@@ -1,25 +0,0 @@
-// I18N constants
-// LANG: "ja", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "All": "すべて",
-    "All HTML:": "全HTMLタグ:",
-    "Cancel": "中止",
-    "Cleaning Area": "クリーニング領域",
-    "Cleaning options": "クリーニングオプション",
-    "Formatting:": "書式指定タグ:",
-    "OK": "OK",
-    "Page Cleaner": "ページクリーナー",
-    "Select which types of formatting you would like to remove.": "削除する書式を選択してください。",
-    "Selection": "選択部分",
-    "__OBSOLETE__": {
-        "___ TRANSLATOR NOTE   ___": "*** UNFORMAT IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***"
-    }
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/UnFormat/lang/lc_base.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/UnFormat/lang/lc_base.js
deleted file mode 100644
index 9a42e4e..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/UnFormat/lang/lc_base.js
+++ /dev/null
@@ -1,34 +0,0 @@
-// I18N constants
-//
-// LANG: "en", ENCODING: UTF-8
-// Author: Translator-Name, <email@example.com>
-//
-// Last revision: 2018-04-12
-// 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).
-//
-// (Please, remove information below)
-// 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.)
-
-{
-    "All": "",
-    "All HTML:": "",
-    "Cancel": "",
-    "Cleaning Area": "",
-    "Cleaning options": "",
-    "Formatting:": "",
-    "OK": "",
-    "Page Cleaner": "",
-    "Select which types of formatting you would like to remove.": "",
-    "Selection": ""
-}
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/UnFormat/lang/lt.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/UnFormat/lang/lt.js
deleted file mode 100644
index 24e768d..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/UnFormat/lang/lt.js
+++ /dev/null
@@ -1,17 +0,0 @@
-// I18N constants
-// LANG: "lt", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Cancel": "Atšaukti",
-    "OK": "OK",
-    "__OBSOLETE__": {
-        "___ TRANSLATOR NOTE   ___": "*** UNFORMAT IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***"
-    }
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/UnFormat/lang/lv.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/UnFormat/lang/lv.js
deleted file mode 100644
index 7bd5607..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/UnFormat/lang/lv.js
+++ /dev/null
@@ -1,17 +0,0 @@
-// I18N constants
-// LANG: "lv", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Cancel": "Atcelt",
-    "OK": "Labi",
-    "__OBSOLETE__": {
-        "___ TRANSLATOR NOTE   ___": "*** UNFORMAT IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***"
-    }
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/UnFormat/lang/nb.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/UnFormat/lang/nb.js
deleted file mode 100644
index a424f31..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/UnFormat/lang/nb.js
+++ /dev/null
@@ -1,25 +0,0 @@
-// I18N constants
-// LANG: "nb", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "All": "Hele dokumentet",
-    "All HTML:": "All HTML-kode:",
-    "Cancel": "Avbryt",
-    "Cleaning Area": "Vaskeområde",
-    "Cleaning options": "Vaskemetoder",
-    "Formatting:": "Formattering:",
-    "OK": "OK",
-    "Page Cleaner": "Dokumentvasker",
-    "Select which types of formatting you would like to remove.": "Velg hva slags formattering du ønsker å fjerne.",
-    "Selection": "Markert område",
-    "__OBSOLETE__": {
-        "___ TRANSLATOR NOTE   ___": "*** UNFORMAT IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***"
-    }
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/UnFormat/lang/nl.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/UnFormat/lang/nl.js
deleted file mode 100644
index 406773e..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/UnFormat/lang/nl.js
+++ /dev/null
@@ -1,25 +0,0 @@
-// I18N constants
-// LANG: "nl", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "All": "Alles",
-    "All HTML:": "Alle html",
-    "Cancel": "Annuleren",
-    "Cleaning Area": "Schoonmaak gebied",
-    "Cleaning options": "Schoonmaak opties",
-    "Formatting:": "Format",
-    "OK": "OK",
-    "Page Cleaner": "Pagina Schoonmaker",
-    "Select which types of formatting you would like to remove.": "Selecteer welke types van Formatteren je wilt verwijderen",
-    "Selection": "Geselecteerde tekst",
-    "__OBSOLETE__": {
-        "___ TRANSLATOR NOTE   ___": "*** UNFORMAT IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***"
-    }
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/UnFormat/lang/pl.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/UnFormat/lang/pl.js
deleted file mode 100644
index 0b6c85c..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/UnFormat/lang/pl.js
+++ /dev/null
@@ -1,17 +0,0 @@
-// I18N constants
-// LANG: "pl", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Cancel": "Anuluj",
-    "OK": "OK",
-    "__OBSOLETE__": {
-        "___ TRANSLATOR NOTE   ___": "*** UNFORMAT IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***"
-    }
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/UnFormat/lang/pt_br.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/UnFormat/lang/pt_br.js
deleted file mode 100644
index 39f2c38..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/UnFormat/lang/pt_br.js
+++ /dev/null
@@ -1,22 +0,0 @@
-// I18N constants
-// LANG: "pt_br", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "All": "Tudo",
-    "All HTML:": "Todo HTML:",
-    "Cancel": "Cancelar",
-    "Cleaning Area": "Limpando Área",
-    "Cleaning options": "Opções de limpesa",
-    "Formatting:": "Formatação:",
-    "OK": "OK",
-    "Page Cleaner": "Limpesa de página",
-    "Select which types of formatting you would like to remove.": "Selecione o tipo de formatação que deseja remover.",
-    "Selection": "Seleção"
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/UnFormat/lang/ro.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/UnFormat/lang/ro.js
deleted file mode 100644
index 604b880..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/UnFormat/lang/ro.js
+++ /dev/null
@@ -1,17 +0,0 @@
-// I18N constants
-// LANG: "ro", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Cancel": "Renunţă",
-    "OK": "Acceptă",
-    "__OBSOLETE__": {
-        "___ TRANSLATOR NOTE   ___": "*** UNFORMAT IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***"
-    }
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/UnFormat/lang/ru.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/UnFormat/lang/ru.js
deleted file mode 100644
index 8c52f9a..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/UnFormat/lang/ru.js
+++ /dev/null
@@ -1,17 +0,0 @@
-// I18N constants
-// LANG: "ru", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Cancel": "Отмена",
-    "OK": "OK",
-    "__OBSOLETE__": {
-        "___ TRANSLATOR NOTE   ___": "*** UNFORMAT IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***"
-    }
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/UnFormat/lang/sh.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/UnFormat/lang/sh.js
deleted file mode 100644
index ee52b35..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/UnFormat/lang/sh.js
+++ /dev/null
@@ -1,17 +0,0 @@
-// I18N constants
-// LANG: "sh", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Cancel": "Poništi",
-    "OK": "OK",
-    "__OBSOLETE__": {
-        "___ TRANSLATOR NOTE   ___": "*** UNFORMAT IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***"
-    }
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/UnFormat/lang/si.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/UnFormat/lang/si.js
deleted file mode 100644
index b703e49..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/UnFormat/lang/si.js
+++ /dev/null
@@ -1,17 +0,0 @@
-// I18N constants
-// LANG: "si", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Cancel": "Prekliči",
-    "OK": "V redu",
-    "__OBSOLETE__": {
-        "___ TRANSLATOR NOTE   ___": "*** UNFORMAT IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***"
-    }
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/UnFormat/lang/sr.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/UnFormat/lang/sr.js
deleted file mode 100644
index d51f4d2..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/UnFormat/lang/sr.js
+++ /dev/null
@@ -1,17 +0,0 @@
-// I18N constants
-// LANG: "sr", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Cancel": "Поништи",
-    "OK": "OK",
-    "__OBSOLETE__": {
-        "___ TRANSLATOR NOTE   ___": "*** UNFORMAT IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***"
-    }
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/UnFormat/lang/sv.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/UnFormat/lang/sv.js
deleted file mode 100644
index bcf9a19..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/UnFormat/lang/sv.js
+++ /dev/null
@@ -1,17 +0,0 @@
-// I18N constants
-// LANG: "sv", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Cancel": "Avbryt",
-    "OK": "OK",
-    "__OBSOLETE__": {
-        "___ TRANSLATOR NOTE   ___": "*** UNFORMAT IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***"
-    }
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/UnFormat/lang/th.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/UnFormat/lang/th.js
deleted file mode 100644
index bdd1d3a..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/UnFormat/lang/th.js
+++ /dev/null
@@ -1,17 +0,0 @@
-// I18N constants
-// LANG: "th", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Cancel": "ยกเลิก",
-    "OK": "ตกลง",
-    "__OBSOLETE__": {
-        "___ TRANSLATOR NOTE   ___": "*** UNFORMAT IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***"
-    }
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/UnFormat/lang/tr.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/UnFormat/lang/tr.js
deleted file mode 100644
index 35fe04c..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/UnFormat/lang/tr.js
+++ /dev/null
@@ -1,17 +0,0 @@
-// I18N constants
-// LANG: "tr", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Cancel": "İptal",
-    "OK": "Tamam",
-    "__OBSOLETE__": {
-        "___ TRANSLATOR NOTE   ___": "*** UNFORMAT IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***"
-    }
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/UnFormat/lang/vn.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/UnFormat/lang/vn.js
deleted file mode 100644
index 80a68f7..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/UnFormat/lang/vn.js
+++ /dev/null
@@ -1,17 +0,0 @@
-// I18N constants
-// LANG: "vn", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "Cancel": "Hủy",
-    "OK": "Đồng ý",
-    "__OBSOLETE__": {
-        "___ TRANSLATOR NOTE   ___": "*** UNFORMAT IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***"
-    }
-};
\ No newline at end of file
diff --git a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/UnFormat/lang/zh_cn.js b/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/UnFormat/lang/zh_cn.js
deleted file mode 100644
index 2a481c9..0000000
--- a/app/src/main/webapp/roller-ui/authoring/editors/xinha-1.5.1/unsupported_plugins/UnFormat/lang/zh_cn.js
+++ /dev/null
@@ -1,15 +0,0 @@
-// I18N constants
-// LANG: "zh_cn", ENCODING: UTF-8
-//
-// IMPORTANT NOTICE FOR TRANSLATORS
-// ============================================================================
-//
-// Please be sure you read the README_TRANSLATORS.TXT in the Xinha Root 
-// Directory.  Unless you are making a new plugin or module it is unlikely 
-// that you want to be editing this file directly.
-//
-{
-    "__OBSOLETE__": {
-        "___ TRANSLATOR NOTE   ___": "*** UNFORMAT IS UNSUPPORTED (TRANSLATE AT YOUR DISCRETION) ***"
-    }
-};
\ No newline at end of file
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 e5bac79..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,45 +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.Ignore;
+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.
  */
-@Ignore("Until rollerweblogger.org sorts out SSL issues")
-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();
             
@@ -80,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 ca3f0e3..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,14 +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.Ignore;
+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.
  */
-@Ignore("Until rollerweblogger.org sorts out SSL issues")
-public class SingleThreadedFeedUpdaterTest extends TestCase {
+public class SingleThreadedFeedUpdaterTest  {
     
     public static Log log = LogFactory.getLog(SingleThreadedFeedUpdaterTest.class);
     
@@ -39,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();
         
@@ -54,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 a8bda59..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,42 +18,13 @@
 
 package org.apache.roller.weblogger.util;
 
-import junit.framework.Test;
-import junit.framework.TestCase;
-import junit.framework.TestSuite;
-import org.junit.Ignore;
+import static org.junit.jupiter.api.Assertions.assertEquals;
 
 /**
  * Test linkback extractor.
  */
-@Ignore("Until rollerweblogger.org sorts out SSL issues")
-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[][]
         {
@@ -76,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/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/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/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/pom.xml b/pom.xml
index 5653b9c..8a91432 100644
--- a/pom.xml
+++ b/pom.xml
@@ -98,9 +98,10 @@
     <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>